通过间接ID搜索多个列表

时间:2015-05-30 01:59:26

标签: performance

There are x (x=3 in this example) unsorted lists with identificators:

list1        list2             list3
array1[id3], array2[id4,id4a], array3[id1a,id1b]
array1[id4], array2[id3,id3a], array3[id4a,id4b]
array1[id1], array2[id2,id2a], array3[id3a,id3b]
array1[id2], array2[id1,id1a], array3[id2a,id2b]
...
array1[idn], array2[idn,idna], array3[idn,idnb]

我想成对:{id1,id1b},{id2,id2b}等等。可悲的是,我无法直接做到这一点。它是如何工作的:从list1中获取id3然后在list2中找到id3然后从list2中获取id3a然后在list3中找到id3a,最后我们得到了id3b。 它可以用嵌套循环完成,但如果有更多列表呢?似乎效率低下。有更好的解决方案吗?

2 个答案:

答案 0 :(得分:0)

算法上唯一更好的解决方案需要不同的表示。例如,如果可以对列表进行排序,那么从key1->key2->key3->value获取的搜索都可以是二进制搜索。如果您可以稍微更改要排序的数据表示,那么这可能是最容易实现且最不具侵入性的解决方案。

如果您像多个哈希表一样使用不同的数据结构,那么每次搜索都可以是常量时间(假设没有冲突)。您甚至可以将此全部合并到一个哈希表中,该表包含一个3部分密钥,该密钥映射到存储该值的单个哈希索引。

您也可以使用BST,可能还有尝试等,但所有这些算法改进都取决于不同的数据表示。

通过未排序列表进行的任何搜索通常都必须是O(N),因为我们无法做出任何假设并且无助于搜索整个列表。有了三个列表和三个嵌套搜索,我们最终会看到一个立方复杂度的O(N ^ 3)算法(不能很好地扩展)。

在不改变数据表示的情况下,我认为每个未排序列表的线性时间搜索都是你能得到的(并且是的,这可能非常糟糕),你可能正在寻找多线程或微线程等微优化SIMD。

答案 1 :(得分:0)

我忘了提到每次迭代后我都会得到一组新的列表。 例如,在第一次迭代中:

array1[id1], array2[id2,id2a], array3[id3a,id3b]
array1[id2], array2[id1,id1a], array3[id2a,id2b]` 

在第二个:

array1[id3], array2[id4,id4a], array3[id1a,id1b]
array1[id4], array2[id3,id3a], array3[id4a,id4b] 

等。因此,如果我在一次迭代中触摸键将它们链接在一起,我将不得不在下一个中使用新的集合执行相同的操作。看起来每个辅助结构都必须重建。那么值得吗?毫无疑问,这取决于。但或多或少?