[Erlang 학습 노트] Erlang 단순 구현 KMP - 문자열 일치 알고리즘
쓸데없는 말 말고 코드 를 달 아 라. =。=
%%%-------------------------------------------------------------------
%%% @author lqg <>
%%% @copyright (C) 2012, lqg
%%% @doc
%%%
%%% @end
%%% Created : 26 Jul 2012 by lqg <>
%%%-------------------------------------------------------------------
-module(kmp).
%% API
-export([patch/2]).
-define(Len(X),array:size(X)).
-define(Get(X,Y),array:get(X,Y)).
-define(Same(X,Y),string:equal(X,Y)).
-define(Set(X,Y,Z),array:set(X,Y,Z)).
%%% I,Content
%%% J,Keyword
%%% Next,Keyword
patch(Content,Keyword) ->
I=0,J=0,
Next = get_next(Keyword),
compare(I,J,Content,Keyword,Next).
%%% C,Content
%%% K,Keyword
%%% N,Next
compare(I,J,C,K,N)->
case I < ?Len(C) of
true ->
case J== -1 of
true -> I1=I+1,
J1=J+1,
compare(I1,J1,C,K,N);
false ->
case ?Same(?Get(I,C),?Get(J,K)) of
true -> I1=I+1,
J1=J+1,
case J1==?Len(K) of
true ->
{true,{I-J,I}}; %% ,
false ->
compare(I1,J1,C,K,N)
end;
false ->
J1=?Get(J,N),
compare(I,J1,C,K,N)
end
end;
false ->
false %%
end.
%%% K,Keyword
%%% H J ,Next ,H<J
%%% N, Next
get_next(K)->
H=-1,J=0,
N=array:new(array:size(K)),
N1=?Set(0,-1,N),
get_next(K,N1,H,J).
%%% K,Keyword
%%% H J ,Next ,H<J
%%% N, Next
get_next(K,N,H,J)->
case J < ?Len(K)-1 of
true->
case H ==-1 of
true -> J1=J+1,
H1=H+1,
N1=?Set(J1,H1,N),
get_next(K,N1,H1,J1);
false ->
case ?Same(?Get(J,K),?Get(H,K)) of
true->J1=J+1,
H1=H+1,
N1=?Set(J1,H1,N),
get_next(K,N1,H1,J1);
false->
H1=?Get(H,N),
get_next(K,N,H1,J)
end
end;
false ->
N
end.
코드 는 KMP 알고리즘 을 간단하게 실 현 했 지만 Next [] 가 생 성 될 때 너무 많은 메모리 소모 가 발생 할 까 봐 걱정 입 니 다. 바로 N1 =?Set (J1, H1, N) 이 떨 어 졌 지만 erlang 의 작업 장 소 는 메모리 가 아니 라 코드 입 니 다. 아 톰 만 아니면 문제 없습니다...
erlang 함수 에 많이 사용 되 지 않 기 때문에 n 줄 코드 는 하나의 함수 로 대체 할 수 있 습 니 다.
시간 문제 로 인해 저 는 깊이 연구 하지 않 았 습 니 다. 만약 에 어떤 인형 이 또 발견 하면 저 를 불 러 주 셔 도 됩 니 다. 감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.