【发布时间】:2019-11-17 03:23:14
【问题描述】:
我面临以下问题:给定一个相对较短的位模式,我想在一个相当长的位字符串中找到它“适合”的位置。我的意思是,对于按模式设置的每一位,目标位字符串的相应位置都有一个零。
例如,101101 的模式可以适合以下字符串:
-
...00000000....- “微不足道” 适合 -
...10100101....- “完全”匹配 -
...00000100....- 另一个有用的搭配
等等。
“适合”的质量无关紧要,按位顺序排列的第一个好就行了。
显然,一个简单的算法会起作用 - 通过迭代目标位字符串中的每个 0,我可以检查一个模式是否适合从该位置开始(调整模式中设置的前导位)。
但是,正如我们所知,更专业的搜索算法比简单的实现实现了巨大的加速。显然,“精确位模式搜索”算法不适用于这个问题,但考虑到收益,精确模式搜索算法提供的幼稚实现,我正在寻找是否有人已经投入了一些好的工作来设计更好的算法对于所描述的模式拟合问题。
【问题讨论】:
-
模式不是真的
0x00x0,其中每个0必须匹配字符串中的0,并且每个x匹配任何字符。如果是这样,可以应用KMP algorithm 的概念来实现性能的微小改进。我说“次要”,因为从发现不匹配中获得的信息很少。 -
它看起来确实像一个基本的通配符搜索(一位通配符)。但是,KMP 真的适用于这个问题吗?我见过的大多数通配符搜索算法都只使用嵌套循环/递归。
-
我认为您的问题可能更适合cs.stackexchange.com,因为您正在寻找一种理论方法及其时间复杂度,而不仅仅是一些工作代码。
-
我想知道您是否提出了您要解决的真正问题。具体来说,“相对短”和“合理长”的准确定义是什么?输入的格式是什么——换句话说,假设算法是作为函数实现的,那么函数的参数会是什么样子?最重要的是,完整的位串是否已经存储在内存中,还是从通信接口实时接收的?
-
@user3386109 该模式通常是长度很少的机器字,100-300 位。位串完全存储在内存中,被认为是“无限的”,但大约为几兆位。
标签: algorithm bit-manipulation