🔴 平均差不多,最坏差很多
两组对照:一组是 n02 那段普通文本 abababcababcabababc 配 ababc,一组是最坏情况(24 个 a 配 6 个 a)。四个数一起输出:普通暴力、普通 KMP、最坏暴力、最坏 KMP。
⚠️ 需求没说清时,该回答什么
把选型写成从需求描述里认关键词。认不出来就老实说先问清楚。
🔴 预处理的成本,摊到十段文本上还剩多少
模式固定是 ababc,文本一段接一段地来,每段都长 abababcababcabababc 那样。next 表只需要算一次。算出「1 段」和「10 段」时两种做法各要比多少次,按 暴力1 / 暴力10 / KMP1 / KMP10 的顺序
交付一个匹配实现,先验哪一样
写完一个匹配算法就交付,最该先验的是【0】。
⚠️ 拿什么当验收条款
匹配的结果可能有好几个位置,代价又随算法变。验收该钉在【0】。
⚠️ 少了确认那一步,多出来几个
一段文本 abababcababcabababc(19 个字符,下标从 0 起)和一个模式 ababc:左边是老老实实逐字符比出来的个数,右边是只比哈希、不做确认的个数: T = "abababcababcabababc"
第一步:先有一条一定对的基准线
一段文本 abababcababcabababc(19 个字符,下标从 0 起)和一个模式 ababc:交付流程第一步:写一个慢但一定对的暴力版,后面所有算法都拿它对账。
第二步:哈希版,别忘了确认
一段文本 abababcababcabababc(19 个字符,下标从 0 起)和一个模式 ababc:第二步:写哈希版,并且和第一步的基准线对账。
第三步:KMP 版,连 next 表一起验
一段文本 abababcababcabababc(19 个字符,下标从 0 起)和一个模式 ababc:第三步:KMP 已经写好了。输出 next 表里最大的那个值、KMP 找到的位置个数、以及它和暴力对不对得上(1 或 0)。
第四步:多模式那一路也要对账
四个要找的词 he、she、his、hers,一段文本 ushershishe(11 个字符,下标从 0 起):第四步:Trie 一次扫过、和四个词各扫一遍,两条路的命中必须一样。