Algorithm 在a<;中查找密钥列表;关键、价值>;配对表

Algorithm 在a<;中查找密钥列表;关键、价值>;配对表,algorithm,Algorithm,我有一个元素列表,这些元素是成对的。这张单子很大。我还有另一个列表B,它是一个特定键的数组。我想读取与数组B中的键相关的值。最佳优化解决方案是什么?例如,我有以下配对列表: A = {<1, a>, <2, b>, <4, c>, <3, d>, <5, h>, <11, k>} 哪些是 V = {< 4, c>, <11, k>, <5, h>} V={,} 我使用C++,列表被存

我有一个元素列表,这些元素是成对的
。这张单子很大。我还有另一个列表B,它是一个特定键的数组。我想读取与数组B中的键相关的值。最佳优化解决方案是什么?例如,我有以下配对列表:

A = {<1, a>, <2, b>, <4, c>, <3, d>, <5, h>, <11, k>}
哪些是

V = {< 4, c>, <11, k>, <5, h>}
V={<4,c>,}

我使用C++,列表被存储为<代码> STD::向量< /代码>。< /P> < P>排序较大的数组。遍历较小的数组,并在较大的数组(现在已排序)上对每个项进行二进制搜索。


如果在键值对上定义了一个比较器,那么可以使用stl和函数,这将非常有效。

对较大的数组进行排序。遍历较小的数组,并在较大的数组(现在已排序)上对每个项进行二进制搜索。 您可以使用stl和函数,如果您在键值对上定义了一个比较器,这些函数将非常有效

最好的优化方案是什么

如果不了解你的具体情况,这是不可能的

如果列表A和列表B都很小,那么最好的选择可能是对每个元素的每个列表进行简单的遍历。这是
O(m*n)
,但是如果
m
n
足够小,那么就不值得尝试更复杂的东西

如果列表非常大,那么可以根据它们的值构造一个专门的数据结构,如HashMap或HashSet。这将涉及更多的前期工作,但总体复杂性是
O(m+n)
,因此从长远来看效果更好

根据您对密钥性质的了解(例如,它们是否唯一?它们的上限和下限是什么?),您可以使用更适合您需要的专用数据结构。“最佳”优化解决方案还取决于您试图优化的内容:内存使用、比较次数等

最后,如果性能在程序的这一部分中确实很重要,那么您需要尝试一些不同的技术,并使用探查器或基准测试来更好地了解什么最有效

最好的优化方案是什么

如果不了解你的具体情况,这是不可能的

如果列表A和列表B都很小,那么最好的选择可能是对每个元素的每个列表进行简单的遍历。这是
O(m*n)
,但是如果
m
n
足够小,那么就不值得尝试更复杂的东西

如果列表非常大,那么可以根据它们的值构造一个专门的数据结构,如HashMap或HashSet。这将涉及更多的前期工作,但总体复杂性是
O(m+n)
,因此从长远来看效果更好

根据您对密钥性质的了解(例如,它们是否唯一?它们的上限和下限是什么?),您可以使用更适合您需要的专用数据结构。“最佳”优化解决方案还取决于您试图优化的内容:内存使用、比较次数等


最终,如果性能在您的计划的这一部分中真的很重要,您需要尝试一些不同的技术,并使用探查器或基准测试来更好地了解什么最有效。

您可以从数组B中的项中创建
std::unordered_map
,其中键是数组B的项,值是表示尚未找到值的特殊值。然后,您可以逐项遍历数组A,查找从数组A中获取的键的
无序映射
,如果该键存在于
无序映射
,将
unordered_-map
中的值更改为取自数组A的值。

您可以从数组B中的项中创建
std::unordered_-map
,其中键是数组B的项,值是表示尚未找到值的特殊值。然后,您可以逐项遍历数组A,查找从数组A中获取的密钥的
unordered\u映射
,如果密钥存在于
unordered\u映射
,则将
unordered\u映射
中的值更改为从数组A获取的值。

如果您可以将对放入无序映射而不是向量中,这就是如何尽可能快地获得查找。否则,对向量进行合并排序或快速排序+二进制搜索是最好的选择。@Aurast使用无序_映射对我来说是可能的。然后,我应该把这些对放在无序映射中,然后得到特定键的值?无序映射将键映射到值,所以不必显式地处理对。在向量中,键是一个整数。例如,使用键“5”访问如下向量:vector[5]获取向量的第五个元素。对于无序映射,键不是整数,而是对的第一个值。因此,如果您将这一对放入无序的_映射,那么无序的_映射[“bob”]将返回“john”。“bob”将在你迭代的向量B中。更具体地说,您可以像这样将对插入到映射中:无序_映射[“bob”]=“john”。如果您可以将对放在无序_映射中而不是向量中,那么您就可以尽快获得查找。否则,对向量进行合并排序或快速排序+二进制搜索是最好的选择。@Aurast使用无序_映射对我来说是可能的。然后,我应该把这些对放在无序映射中,然后得到特定键的值?无序映射将键映射到值,所以不必显式地处理对。在向量中,键是一个整数。例如,使用键“5”访问如下向量:vector[5]获取向量的第五个元素。对于无序映射,键不是整数,而是对的第一个值。所以如果你把这对放进一个
V = {< 4, c>, <11, k>, <5, h>}