首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

哪位高手能深入浅出的讲讲KMP算法?好难懂

2012-03-24 
谁能深入浅出的讲讲KMP算法?好难懂啊几个月了,我好没搞懂![解决办法]是不是next数组的初始化看不太明白?其

谁能深入浅出的讲讲KMP算法?好难懂啊
几个月了,我好没搞懂!

[解决办法]
是不是next数组的初始化看不太明白?
其实next数组的初始化和后边的模式串与目标串的比对方式是一样的
在初始化next的时候可以把已初始化的看成是模式串,把未初始化的看成是目标串
貌似我越说越乱了

[解决办法]
鄙人语言能力很差,还是给个代码算了

C# code
        public static int kmp(String tarStr, String matStr)        {            char[] tar = tarStr.ToCharArray();            char[] mat = matStr.ToCharArray();            int[] arr = new int[matStr.Length];            arr[0] = -1;            int i_arr = 0;            int j_arr = -1;            while (i_arr < arr.Length - 1)            {                if (j_arr == -1 || mat[i_arr] == mat[j_arr])                {                    if (mat[++i_arr] != mat[++j_arr])                    {                        arr[i_arr] = j_arr;                    }                    else                    {                        arr[i_arr] = arr[j_arr];                    }                }                else                {                    j_arr = arr[j_arr];                }            }            int i = 0;            int j = 0;            while (i < tar.Length && j < mat.Length)            {                if (j == -1 || tar[i] == mat[j])                {                    i++;                    j++;                }                else                {                    j = arr[j];                }            }            if (j == mat.Length)                return i - mat.Length;            return -1;        }
[解决办法]
next为当前不匹配时,
移动的最大距离!
[解决办法]
希望这个对你有用:六之再续:KMP算法之总结篇(必懂KMP)
http://blog.csdn.net/v_july_v/article/details/7041827

探讨
几个月了,我好没搞懂!

[解决办法]
谷歌一下“Matrix67“的博客,那个很好懂。
[解决办法]
http://blog.csdn.net/g_idea/article/details/4518410
[解决办法]
KMP实际上是状态机的一种简化,拿一个例子来说吧:
有一个匹配字符串"nano",则在和其余字符串匹配时可能有如下状态转换表
C/C++ code
/*         "n"      "a"      "o"      other""       "n"      ""       ""         """n"      "n"      "na"     ""         """na"     "nan"    ""       ""         """nan"    "n"      "na"    "nano"     """nano"   "nano"   "nano"  "nano"    "nano"*/
[解决办法]
我的注释我能看懂,至于你能不能看懂,就不得而知了
Java code
// 设置next数组的值    private void setNextSequence() {        int len = this.strMode.length();        this.next = new int[len];// 初始化next数组        // 当模式串的首字符失配时,是一种特殊情况,主串此时需要右移一个位置,此处用-1标记这一特殊情况        this.next[0] = -1;        this.next[1] = 0;        for (int i = 1, j = 0; i < len - 1;) {// 每轮循环计算的是next[i+1]的值            if (j == -1) {// 没找到与next[i]相等的 前缀,连首字符都失配了                this.next[++i] = 0;                j = 0;            } else if (this.strMode.charAt(i) == this.strMode.charAt(j)) {                this.next[++i] = ++j;            } else {                j = this.next[j];// 始终记录着next[i]的值            }        }    } 

热点排行