生活有点无聊,就用erlang写写一些算法吧.闲着也闲着
首先是KMP 介绍:
http://zh.wikipedia.org/wiki/%E5%85%8B%E5%8A%AA%E6%96%AF-%E8%8E%AB%E9%87%8C%E6%96%AF-%E6%99%AE%E6%8B%89%E7%89%B9%E7%AE%97%E6%B3%95
关于字符串匹配的 原理蛮简单的:
被匹配字符串MWord 匹配字符串SWord M表示MWord的下标 S表示SWord的下标
1,初始化M=1,
2,如果M大于MWord的长度,返回没找到。如果lists:nth(M, MWord) == lists:nth(1, SWord) 那么继续搜索到3 否则M+1 继续2
3,如果匹配 返回{found,begin,length} 如果没有匹配M+1返回 2.
代码也很简单:(erlang中lists:nth/1是从下标1开始的)
%% @author cc fairjm %% @doc @todo kmp算法实现. -module(kmp). %% ==================================================================== %% API functions %% ==================================================================== -export([find/2]). %% ==================================================================== %% Internal functions %% ==================================================================== find(MWord,SWord) when is_list(MWord),is_list(SWord) -> search(MWord, SWord,1) . search(MWord,SWord,M) when M=<length(MWord)-> %TempM=M, case lists:nth(M, MWord) == lists:nth(1, SWord) of true -> case doSearch(MWord, SWord, M+1, 2) of {not_found} ->search(MWord, SWord, M+1); Found -> Found end; false -> search(MWord, SWord,M+1) end; search(MWord,SWord,M) -> {not_found}. doSearch(MWord,SWord,M,I) when I==length(SWord)+1 -> {found,M-I+1,I-1} ; doSearch(MWord,SWord,M,I) when M>length(MWord) -> {not_found}; doSearch(MWord,SWord,M,I) -> case lists:nth(M, MWord)==lists:nth(I, SWord) of false -> {not_found}; true -> doSearch(MWord, SWord, M+1, I+1) end.
没有高亮不太舒服 放章截图吧:
测试:
Eshell V5.10.2 (a@dell-PC)1> kmp:find("vvvvvvvvv", "c"). {not_found} (a@dell-PC)2> kmp:find("vvvvvvvvv", "v"). {found,1,1} (a@dell-PC)3> kmp:find("avcvc", "cv"). {found,3,2} (a@dell-PC)4> kmp:find("ABC ABCDAB ABCDABCDABDE", "ABCDABD"). {found,16,7} (a@dell-PC)5>
相关推荐
- 使用yum安装Erlang:`sudo yum install erlang-23.3.4.3-1.el7.x86_64.rpm` 2. **安装RabbitMQ**: - 下载RabbitMQ RPM包:`wget https://your_download_link/rabbitmq-server-3.8.17-1.el7.noarch.rpm` - ...
erlang-20.3.8.17-1.el7.centos.x86_64
erlang-xmerl-22.3-1.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
erlang-sd_notify-1.0-2.el7.x86_64.rpm
erlang-21.3.8.11-1.el6.x86_64.rpm
erlang-xmerl-23.0.2-2.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
erlang-19.3.6.4-1.el
https://blog.51cto.com/7794482/2436678 可根据文档进行部署,redis+mysql+mq的插件 rabbitmq 安装时需要该插件
erlang-21.3.8.15-1.el7.x86_64.rpm
erlang-20.3.6-1.el7.centos.x86_64.rpm erlang-20.3.6-1.el7.centos.x86_64.rpm erlang-20.3.6-1.el7.centos.x86_64.rpm erlang-20.3.6-1.el7.centos.x86_64.rpm erlang-20.3.6-1.el7.centos.x86_64.rpm
erlang-21.3.7.1-1.el7.x86_64.rpm rabbitmq基础语言环境。
对应rabbitmq 3.12.4,亲测可用
erlang-23.2.7-1.el7.x86_64 .rpm
linux基于centos7.x,erlang21.3.8.16资源适配rabbitmq3.8.5。欢迎大家下载!!!!
配套rabbitmq-server-3.8.17-1.el8.noarch.rpm
erlang-23.2.6-1.el7.x86_64
erlang-erl_interface-19.3.6.4-1.el7.x86_64.rpm
rabbitmq安装前需要安装erlang包,如果没有erlang包,rabbitmp则无法下载成功
由于不同版本的rabbitmq需要的erlang版本不一样,但是官网已经无法下载,此版本的erlang适用于rabbitmq3.7.4-3.7.8,其余版本自查是否可用
esl-erlang_24.2.1-1_centos_7_amd64.rpm