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