选择数据结构

时间:2010-12-20 19:11:51

标签: c

根据要求使用不同的数据结构,但我如何知道应该使用哪种数据结构?我只是想知道如何选择合适的数据结构?感谢

6 个答案:

答案 0 :(得分:8)

此流程图适用于C ++中的STL,但您可以实现C中STL容器支持的任何数据结构。

  • 列表是一个链表
  • Vector是一个动态数组
  • Deque就像一个动态数组列表 - 分裂差异。
  • 队列和优先级队列就像他们所说的那样(通常队列是以deque方式实现的,优先级队列通常是根据vector或deque中的堆来实现的)
  • Set / Map / Multiset / Multimap都是使用某种形式的平衡二叉树实现的。

更新2016:显然我以前链接到此处的图片已被链接腐烂,但您可以在此问题上看到几个等效图片:In which scenario do I use a particular STL container?

答案 1 :(得分:2)

您需要研究使用哪些数据结构来满足哪些要求(这里没有人会花时间为您详细说明每个选项,并告诉您何时使用它)。

一旦您了解了详细信息,您应该能够(确定无误)选择适合您需求的数据结构。

答案 2 :(得分:1)

每种数据结构对不同类型的操作都有不同的成本: 你应该问自己:

  1. 我是否需要能够找到一个特定元素(给我一个名为" bob")?
  2. 我是否关心订单(即定期找到第一个或最后一个)?
  3. 我是否需要能够有效删除最后一个以外的记录?
  4. 我是否需要随机访问(给我20日)?
  5. 我是否需要能够进行高效的多线程读写?
  6. 注意:列表中没有的问题是"我是否需要能够遍历商店中的所有内容"因为所有实际数据存储都能够在O(n)时间内访问所有数据

    同样,所有这些评论都是概括性的:

    如果答案是1.是"是"然后排除各种无序数组类型结构(向量,未排序数组,链表)

    如果2.的答案是"是"然后,它排除基于散列的存储(hashmap等),因为它们放弃了可预测的顺序,以帮助提高搜索效率。你可能需要一个树集或有序列表。

    如果对3.的回答是"是"然后排除基于列表(未排序的数组,链接列表),你可能需要一个树集,有序列表或哈希映射。

    如果4的回答是"是"然后排除了哈希映射和链表(请注意,这是一个不同的问题,因为哈希映射根据索引存储所有内容,它们不会以任何特定顺序存储它们)

    如果5的答案是"是"那么问一个具有你特定要求的问题可能是要走的路,因为这会使前面几点给出的每个答案复杂化(链表,散列图和缓慢增长的数组允许有效的并行实现,在parralel中很难对任何事情进行排序)。 / p>

    如果你想知道为什么树集在所有这些选项上,但通常不推荐;它是因为如果2的答案是" no",那么hashmap通常更好(随着集合的增长,添加和删除元素的时间比treeset慢得多)。同样,如果对任何其他问题的回答是“不”。那么有更好的建议。

    一般来说:如果你需要随机访问,hashmap。如果需要排序的树集,否则需要链表。 (与直接阵列相比,这些都带来了内存开销,因此我假设内存不是非常严格的限制)

答案 3 :(得分:0)

如果不知道决定的哪些部分会给你带来麻烦,就很难回答。

在大多数情况下,您需要最小,最简单的数据结构来存储您需要存储的数据。

是否有一个特定案例给你带来麻烦?

答案 4 :(得分:0)

不是您要找的,但取决于

这取决于您存储的数据,访问该数据的任何限制,您是否需要能够快速查找内容?是否需要对数据进行任何排序?你以后会把它分类吗?

即使您选择了数据结构(链接列表,地图,设置),其中还有许多变体可能会进一步推动您的决策。

我的经验法则是:

用最简单的方法去,直到你不知道你需要更复杂的东西。

答案 5 :(得分:0)

如果您的关注是快速有效的搜索,那么您将选择存储数据的数据结构?给出合理选择数据结构的理由。