原创算法: 字符串查找匹配

从来没想过枯燥的算法居然也能上瘾。 字符串匹配是不是可以这么做,类似于hash, 但是更快

1. hash算法简化,比如取每个字符相加,
2. key长度len, 从0开始,取前len个字符hash
3. while (hash不一致 || 逐个字符比较不一致) && 没到字符串末尾
5. hash减掉当前字符,加上len+1位置字符

---------------------
3/20/2017
又想了一下,还可以改进:
相加的方法比较粗糙,基本上只有一个有效byte, 对于ab, ba很容易误判
我们可以利用寄存器长度多放几个字符,比如64位cpu, 一次可以放8个字符。
还有,hash一样对于海量数据来说是很容易发生的事情,可以引入两个或者更多的hash,计算量+1, 而冲突概率则减少了N倍。

Hash1: for(i=0;i<len;i++) hash1=hash1<<8+pattern[i]; 加减法是可逆的
Hash2: for(i=0;i<len;i++) hash2=hash1<<8^pattern[i]; 异或是可逆的


匹配的时候:
临时t_hash1=t_hash1>>>8+str[j]<<<SHIFT; 挤掉最低字符,hash上新的末尾字符
临时t_hash2=((t_hash1^str[i-1])>>>8+t_hash2<<<56) str[j]<<<SHIFT; 异或掉原来的首字符,循环左移,新的尾字符在该出现的位置上异或

这里用一个整型比较替代字符串比较,复杂度O(M+N), 需要遍历

对于长样本字符串,KMP也是个不错选择,可以根据样本尽量长的往前跳
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程序接收用户键入的一个关键字以及一个句子。如果句子中不包含关键字则显示’no match’;如果句子中包含关键字则显示‘match’,且把该字在句子中的位置用十六进制数显示出来,要求程序的执行过程如下: enter keyword :abc enter sentence :we are studying abc match at location :11H of the sentence enter sentence: xyz ,ok? no match enter sentence :^c 四. 方法说明: 程序可由三部分组成: (1 ) 输入关键字和一个句子,分别存入相应的缓冲区中,可用功能调用0AH。 (2) 在句子中查找关键字。 1. 关键字和一个句子中相应字段的比较可使用比较指令,为此必须定义附加段,但附加段和数据段可以定义为同一段,以便于指令的使用,这样,相应的寄存器内容也有了确定的含义,如下: SI 寄存器为关键字的指针 DI 寄存器为句子中正相比较的字段的指针 CX寄存器存放关键字的字母个数(长度) 2. 整个句子和关键字的比较过程可以用一个循环结构来完成。循环次数为: (句子长度--关键字长度)+1在计算循环次数时,如遇到句子长度小于关键字长度的情况则应转向显示“no match”,循环中还需要用到BX寄存器,它用来保存句子中当前正在比较字段的首地址。 (3) 输出信息: 用功能调用09h分“找到”或“找不到”两种情况分别显示不同的信息。在“找到”时,还要求显示出匹配字符串在句子中的位置,在“找到”时BX寄存器的内容为匹配字符串的首地址,将此值减到句子的首地址,再将差值加1 即是所要的匹配字符串在句子中的位置,可将位置转换为十六进制数从屏幕上显示出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值