我有一对<key, value>
对的元素列表A.这个清单非常大。我有另一个列表,B,这是一个特定键的数组。我想读取与数组B中的键相关的值。什么是最佳优化的可能解决方案?例如,我有以下对列表:
A = {<1, a>, <2, b>, <4, c>, <3, d>, <5, h>, <11, k>}
我想找到
的值B = {4, 11, 5}
是
V = {< 4, c>, <11, k>, <5, h>}
我使用的是C ++,列表存储为std::vector
。
答案 0 :(得分:3)
您可以从数组B中的项目中创建std::unordered_map
,其中键是数组B的项目,值是特殊的,表示尚未找到任何值。然后,您可以逐项遍历数组A,查找unordered_map
以获取从数组A获取的密钥,如果密钥存在于unordered_map
中,则在unordered_map
中更改其值从阵列A中取出的那个。
答案 1 :(得分:2)
对较大的数组进行排序。遍历较小的数组并对每个项目的较大数组(现在已排序)进行二进制搜索。 您可以使用stl的sort和binary_search函数,如果您在键值对上定义了比较器,这些函数会很好用。
答案 2 :(得分:2)
什么是最佳的优化解决方案?
如果不了解更多有关您的具体情况,这是不可能的。
如果列表A和列表B都非常小,那么最好的选择可能是每个元素的每个列表都是天真的步行。这是O(m * n)
,但如果m
和n
足够小,那么就不值得尝试更复杂的事情了。
如果列表非常大,那么从它们的值构造一个专门的数据结构(如HashMap或HashSet)可能是值得的。这将涉及更多的前期工作,但整体复杂性为O(m + n)
,因此从长远来看效果会更好。
根据您对密钥性质的了解(例如,它们是否唯一?它们的上限和下限是多少?)您可以使用更适合您需求的专用数据结构。 “最佳”优化解决方案还取决于您要优化的内容:内存使用情况,比较次数等。
最终,如果性能在您的程序的这一部分中非常重要,那么您将需要尝试一些不同的技术并使用分析器或基准测试来更好地了解哪种方法最有效。