我想我需要一个带键的链表结构。有什么建议?

时间:2012-02-03 19:54:23

标签: c++ data-structures

我想将数据存储在map结构中,因为我需要使用密钥访问元素。我也将迭代连续元素,因此list结构将是我最好的选择。我认为我需要一种混合数据结构,提供两全其美的优势。

所以基本上我想随机访问 O(log(n))复杂性和迭代与 O(c)复杂性。来自cstdlib或Qt的内置结构是否值得考虑?在这种情况下,是否存在可能更合适的替代方法?

2 个答案:

答案 0 :(得分:1)

如果您关心迭代的顺序:

将迭代器从一个元素移动到下一个元素是list(multi)map中的O(c)操作,除了list的c略小,所以它结合这两者,你不可能获得多少收获。

仅仅使用map你可能是最好的。 map按键的顺序自然地对其元素进行排序(在您的情况下为约会开始时间),因此您可以轻松地以相同的顺序进行迭代。查找单个元素是O(log(n))。当收集需要变得可变时,这是适当的。

或者,您可以将元素存储在vector中,然后在需要迭代之前对其进行排序。排序后,您可以通过binary_search找到一个单独的元素(O(log(n)))并以优异的性能自然迭代(但仍然是O(c))。排序很昂贵,所以只有在(主要)不可变的集合时才适用。

如果您不关心迭代的顺序:

只需使用unordered_(multi)map - 通过适当的哈希,它往往会比map更快。

答案 1 :(得分:0)

新媒体可能是正确的。这个想法是一个约会的容器,可以通过一个关键的开始时间访问。

如果这确实是迭代连续多个元素的元素太慢的情况,一种替代方法是将数据保存在列表中,然后单独维护一个多图,其中可以使用键来查找shared_ptr或迭代器到名单。插入和删除的成本更高,但随机查找和连续迭代的优化访问。

除非您处理极其庞大的数据和严格的性能要求,否则单独的多图表可能表现得非常好。对于极端情况,将数据放入列表+使用地图或多图进行查找可以获得更好的性能,代价是额外的代码以及密钥未与数据保持同步的错误的可能性。