假设我们有m 个有序集合,我们想要找到它们的交集。
我们应该为有序集使用哪种数据结构,哪种算法最有效?
同一个问题: N 路合并算法
看来文献量很大。因此,一个更好的问题是:有哪些好的实现?
您可以创建链接到父节点的二叉树并实现经典的交集/联合算法:
iterA
为树的最左边(最小)节点(即从最左边的分支下降到叶子)。iterB
为有序集合的第一个(最小)节点(如果它是用有序数组实现的,或者如果是树,则设置为最左边的节点)。iterA
and指向的项目进行分支iterB
iterA
iterA
和itemB
iterB
二叉树迭代器的推进:
更新:
如果您知道您的有序集(经过iterB
)比树小得多,您可以使用更复杂的算法进行交集:
iterB
为有序集的开头(较低的值)。iterA
为 value 的最小上界的节点iterB
。iterA
and指向的项目进行分支iterB
itemB
到下一个值。iterA
到 value 的最小上限。itemB
itemA
itemB
通过有序集合的所有项目。从特定节点前进到最小上限的位置是:
搜索边界的主要思想是缩小上限和最小边界(“-”是忽略节点,“...”是新的搜索范围):
for B < X < A
U
/ \-
L
-/ \...
for A < X < B
L
-/ \
U
.../ \-
这只是一个草图:请帮助我改进它。
此解决方案将基于使用二分搜索将搜索限制为每个集合的 n/2^i 个元素,并且我将使用有效的数据结构来记住下一个数字的这些比较。
首先要注意的是平衡二叉树擅长执行二叉搜索,只有当搜索的间隔与(子)树的间隔紧密匹配时。
接受二分查找的另外2 个结构是数组和跳过列表。该数组对于插入和删除效率低下,因此跳过列表似乎是最佳选择。
我们将需要m 个大小为 64 的数组,其中将包含每个数组的每个集合的元素,这些元素在二进制搜索中进行比较,按照比较的执行顺序插入。
我们还需要一个双链表,其中将插入二进制搜索中使用的所有集合中的所有元素。 在此处使用跳过列表可以最大限度地减少所需的比较次数。
基本思路是这样的。