kmp 알고리즘에서 preprocessing(전처리) 과정에 관한 질문입니다.

canuyes의 이미지

안녕하세요?
현재 kmp알고리즘을 공부중에 있는 학생입니다.
kmp알고리즘을 공부중 전처리과정(preprocessing)의 구현에 관한 어려움믈 겪고 있어 질문남깁니다.

제가 공부중인 서적과 다수의 웹자료에 전처리과정은 아래와 같이 구현되어있습니다.

void preprocess(char* pattern,int* table){
     int len=strlen(pattern);
     int i=0,j=-1;
     table[0]=-1;
     while(i<len){
                  while(j>-1&&pattern[i]!=pattern[j]){
                                                      j=table[j];
                  }
                  i++;j++;
                  table[i]=j;
     }
     return;
}

3시간 가량 생각해보고 고민해보았는데 코드가 이해가 되질않네요..
자괴감만 커져 갑니다...ㅠㅠ
strcmp등을 이용하여 직접 접두부를 찾는 방법도 생각해보았지만
그런 방법을 선택시에 위의 코드보다 복잡도가 크게 증가한다고 하네요...

구글링중 다음 링크하단에서 꽤나 충실한 설명을 보았지만
http://211.228.163.31/30stair/KMP_DOC1/KMP_DOC1.php?pname=KMP_DOC1
부족한 능력 탓인지 이해가 잘 되지 않네요...

혹시 kmp 알고리즘의 전처리과정의 알고리즘에 대해 알려주실수 있으신가요?ㅜㅜ

이제 곧 점심시간이라 점심전에 올려봅니다 ㅠㅠ

익명 사용자의 이미지

제가 이해한걸 쓴 글입니다.
http://dol9.tistory.com/122

전처리 과정이라는게,
어느 위치에서 틀렸을때 어디로 이동할거냐를 정하는 건데,
뭉탱뭉탱 움직이기위해 prefix, suffix를 사용한다고 생각했습니다.

도움이 됐으면 좋겠네요

canuyes의 이미지

답변 감사드립니다.

그런데 전 kmp의 진행과정보다는 kmp의 preprocessing의 작동원리가 궁금합니다. ㅜㅜ
링크에는 preprocessing 자체에 초점이 맞추어져 있지는 않는것 같네요...
계속 구글링 하던중
http://www.iti.fh-flensburg.de/lang/algorithmen/pattern/kmpen.htm
에서 나름 만족할만한 설명을 찾았습니다.
하지만 아직 구현된 코드가 맞는 건 알겠으나, 머리속에서 정리되서 스스로 작성할 수 있을 정도로 이해한것은 아닌것같습니다.
추후에 혹시 preprocessing 함수에 대해 더 설명해주 실 수 있으시다면 설명해주세요..
답변 정말 감사드립니다. ㅠㅠ

익명 사용자의 이미지

asd

익명 사용자의 이미지

KMP 전처리 작업이 pattern mismatch 시 인덱스를 얼마만큼 조정할 것인가 라는 것만 이해하면
나머지는 스스로 생각해 보셔도 똑같은 알고리즘 나올 듯해요.
알고리즘은 스스로 생각해 보는 게 실력 향상법임.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.