我有一个自定义迭代器(准确的TokenIterator,迭代,好,标记化的PHP代码)。项目是简单的对象(添加了一些规范化方法的“属性包”)
我必须实现搜索功能,必须查找是否 1.一个迭代器包含另一个或 2.两个(或更多)迭代器重叠(有一些参数化)。
目前我使用天真的方法进行(1) - O(NxM)双循环搜索,(2)尚未实现。
在开始重新实现真正的智能字符串搜索算法之前,我想知道是否存在一些有效的实现方法?也许深埋在某些框架或通用库中的东西可以重用?哪种算法最合适?
答案 0 :(得分:3)
首先想到的是你在谈论集合操作,迭代器可能不是最好的解决方案。
我不知道你的问题是否有任何现有的解决方案,但是,作为一般解决方案,我会使用哈希表。例如,使用第一组的标记构造一个哈希表(我将从现在开始调用它,因为我觉得Iterator不是最好的词),你可以在Theta(N)中进行,然后尝试将另一组插入同一个哈希表中。第一次碰撞时,你会发现有重叠。当然,如果哈希空间很宽并且哈希函数保证可忽略不计的冲突量,这种方法很有效,但是总是可以编写某种解决方法。
鉴于PHP具有关联数组(它是一种散列表的形式),您还可以创建一个以令牌作为键的数组,这也可以在Theta(N)中完成,然后使用array_key_exists。 array_key_exists绝对有可能只是对键列表的线性扫描,因为我不熟悉PHP的内部结构,但我非常有信心,如果将关联数组实现为哈希表,它应该实现得更多比线性扫描有效。
答案 1 :(得分:1)
如果您的迭代器可以转换为数组,则可以使用array_diff
和array_intersect
。否则你必须实现这些功能在引擎盖下的功能 - 遍历你的结构并进行比较。
因为你迭代的数据没有排序,你也不知道其他任何事情,你别无选择。