首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在长模式中模糊匹配短位模式?

如何在长模式中模糊匹配短位模式?
EN

Stack Overflow用户
提问于 2011-04-16 00:13:01
回答 3查看 795关注 0票数 1

当我尝试匹配长位模式中的短位模式时,我遇到了一个问题:我有一个长位模式,例如6k位,存储在char数组中,还有一个短位模式,比如150位,也存储在char数组中。现在我想检查短位模式是否在长位模式中。虽然不需要短比特模式来精确匹配长比特模式的某一部分,但我会定义一个阈值,如果误码率低于这个阈值,我将采用两个模式匹配。

考虑到错位问题,我想不出一个优雅的解决方案。我可以找到的一种方法是将位模式转换为字符模式,即将位1转换为“1”,将0转换为“0”,并应用一些字符串匹配算法。但我担心它可能会耗费内存7-8倍,给我的系统增加负担。我周围的人推荐Rabin Fingerprint,但它似乎不是为这种问题而设计的。

希望你能帮我一把。

谢谢并致以最良好的问候。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-16 00:51:00

您要查找的运算是人口计数或密切相关的汉明距离。

与其手动实现大量的逐位运算,不如尝试一下包含several bit-string functionsGnu Multi-Precision Library

  • 使用mpz_tdiv_q_2exp一次右移长模式一位,使用
    • 提取最后150位,使用mpz_tdiv_q_2exp查找在提取的位和短模式之间翻转的位数。

应该足够快,而且写起来也很快!

作为初始优化,我建议将150位的模式以1位的增量移动到7位,这样您就有8个模式可供匹配,从150位到157位。然后,不是一次将长模式移位一位(这很慢,并且可能主导运行时),而是一次移位8位。请务必清除您不希望比较的位。

票数 2
EN

Stack Overflow用户

发布于 2011-04-16 00:24:30

让我们调用短位序列S和长位序列L。我心目中的算法如下:

代码语言:javascript
复制
1- XOR S with size(S) rightmost bits of L. Say this is R
2- AND R with R-1 until zero, count how many times, if less than threshold 
   pattern is found
3- Shift right L and go to 1 if size(L) >= size(S)

在最坏的情况下,这应该会占用O(size(L)*size(S))时间。但由于在每次迭代中,1的数量远远小于size(S),因此在实践中它应该是有效的。

票数 1
EN

Stack Overflow用户

发布于 2011-04-16 02:20:49

沿着较长的比特模式移动的解决方案的复杂度为O (N *M) (N-短段大小,M-长段大小)。

如果大小将增长,您可以将其视为寻找两个信号之间的移位最大化(或超过阈值)相关性的问题,并使用快速傅立叶变换加快速度。如果我没记错的话,这可能会给出类似O(N*logN)的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5679562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档