当我尝试匹配长位模式中的短位模式时,我遇到了一个问题:我有一个长位模式,例如6k位,存储在char数组中,还有一个短位模式,比如150位,也存储在char数组中。现在我想检查短位模式是否在长位模式中。虽然不需要短比特模式来精确匹配长比特模式的某一部分,但我会定义一个阈值,如果误码率低于这个阈值,我将采用两个模式匹配。
考虑到错位问题,我想不出一个优雅的解决方案。我可以找到的一种方法是将位模式转换为字符模式,即将位1转换为“1”,将0转换为“0”,并应用一些字符串匹配算法。但我担心它可能会耗费内存7-8倍,给我的系统增加负担。我周围的人推荐Rabin Fingerprint,但它似乎不是为这种问题而设计的。
希望你能帮我一把。
谢谢并致以最良好的问候。
发布于 2011-04-16 00:51:00
您要查找的运算是人口计数或密切相关的汉明距离。
与其手动实现大量的逐位运算,不如尝试一下包含several bit-string functions的Gnu Multi-Precision Library。
mpz_tdiv_q_2exp一次右移长模式一位,使用mpz_tdiv_q_2exp查找在提取的位和短模式之间翻转的位数。应该足够快,而且写起来也很快!
作为初始优化,我建议将150位的模式以1位的增量移动到7位,这样您就有8个模式可供匹配,从150位到157位。然后,不是一次将长模式移位一位(这很慢,并且可能主导运行时),而是一次移位8位。请务必清除您不希望比较的位。
发布于 2011-04-16 00:24:30
让我们调用短位序列S和长位序列L。我心目中的算法如下:
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),因此在实践中它应该是有效的。
发布于 2011-04-16 02:20:49
沿着较长的比特模式移动的解决方案的复杂度为O (N *M) (N-短段大小,M-长段大小)。
如果大小将增长,您可以将其视为寻找两个信号之间的移位最大化(或超过阈值)相关性的问题,并使用快速傅立叶变换加快速度。如果我没记错的话,这可能会给出类似O(N*logN)的结果。
https://stackoverflow.com/questions/5679562
复制相似问题