q312102408 发表于 2015-2-1 18:58:19

KMP我的思路

我是学易语言的,我呢,曾经做一个找图的算法,我觉得那个算法比kmp算法要好些。

我的口才不好,怕讲的你們听不懂,就上易语言的程序了


.版本 2
.支持库 spec
.子程序 _按钮1_被单击
调试输出 (寻找_字节集 (到字节集 (“000000000000000000000000000001”), 到字节集 (“01”)))

.子程序 寻找_字节集, 整数型
.参数 主字节集, 字节集
.参数 子字节集, 字节集
.局部变量 起点, 整数型
.局部变量 出错点, 整数型
.局部变量 n, 整数型
.局部变量 n1, 整数型


.判断循环首 (真)
    .计次循环首 (取字节集长度 (子字节集), n1)' 匹配循环
      .如果 (主字节集 [起点 + n1] ≠ 子字节集 )
            出错点 = 起点 + n1
            跳出循环 ()
      .否则
      .如果结束
    .计次循环尾 ()
    .如果真 (n1 > 取字节集长度 (子字节集))' 这个判断是判断上个循环是不是完全找到了,找到了就返回
      返回 (起点)
    .如果真结束
    .计次循环首 (取字节集长度 (主字节集) - 起点 - 取字节集长度 (子字节集), n)' 这个是直接从判断出错点开始判断,找出和出错点相同的
      .如果 (主字节集 [出错点 + n] = 子字节集 )
            ' 找到后直接重置起点,跳出循环
            跳出循环 ()
      .否则
      .如果结束
    .计次循环尾 ()
    .如果 (n > 取字节集长度 (主字节集) - 起点 - 取字节集长度 (子字节集))' 这个判断是看有没有找到,没找到说明没了
      返回 (0)
    .否则
      起点 = 出错点 + n - n1' 原来是放在跳出循环上呢,,但是不好判断是否找到尾部了,就放这里了;
    .如果结束
.判断循环尾 ()
返回 (0)



如果谁有更好的方式评论下。
我看到第36讲写的,不知道下面的优化是如何

当然这个算法不快,比起内部寻找字节集还差远了

页: [1]
查看完整版本: KMP我的思路