C 选择数据结构

C 选择数据结构,c,C,根据需求使用不同的数据结构,但我如何知道应该使用哪种数据结构?我只是想知道如何选择合适的数据结构?谢谢您需要研究使用哪些数据结构来满足哪些需求(这里没有人会花时间为您详细说明每个选项,并告诉您确切的使用时间) 一旦你知道了细节,你应该能够(相当确定地)根据你的需要选择合适的数据结构。如果不知道决策的哪些部分会给你带来麻烦,你很难回答 在大多数情况下,您需要最小、最简单的数据结构来保存需要存储的数据 有一个特殊的案例给您带来麻烦吗?< /P> < P>此流程图是C++中的STL,但您可以在C.中实

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

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


一旦你知道了细节,你应该能够(相当确定地)根据你的需要选择合适的数据结构。

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

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


有一个特殊的案例给您带来麻烦吗?< /P> < P>此流程图是C++中的STL,但您可以在C.</P>中实现STL容器支持的任何数据结构。

  • 列表是一个链接列表
  • 向量是一个动态数组
  • Deque类似于一个动态数组的列表——某种程度上可以分割差异
  • Queue和Priority Queue就像他们说的那样(通常Queue是根据deque实现的,优先级Queue通常是根据向量或deque中的堆实现的)
  • Set/Map/Multiset/Multimap都是使用某种形式的平衡二叉树实现的

2016年更新:显然,我用来链接到这里的图像已经被链接损坏,但在这个问题上,你可以看到几个相同的图像:

不是你要找的,但它取决于你的需要

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

即使您选择了一种数据结构(链表、地图、集合),其中也有许多变体可能会进一步推动您的决策

我的经验是:


尽可能使用最简单的方法,直到您知道您需要更复杂的东西。

如果您关心的是快速高效的搜索,那么您将选择哪种数据结构来存储数据?给出理由来证明所选数据结构的合理性。

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

  • 我是否需要能够找到一个特定的元素(给我一个叫“bob”的人)
  • 我是否关心订单(定期查找第一个或最后一个)
  • 我是否需要能够高效地删除除上一条记录以外的其他记录
  • 我需要随机访问吗(给我20号)
  • 我是否需要能够进行高效的多线程读写
  • 注意:列表中没有的问题是“我是否需要能够遍历存储中的所有内容”,因为所有实际数据存储都能够在O(N)时间内访问所有N个元素

    此外,所有这些评论都是概括:

    如果答案是1。如果为“是”,则排除了各种未排序的数组类型结构(向量、未排序的数组、链表)

    如果答案是2。如果是“是”,那么就排除了基于散列的存储(hashmap等),因为它们为了提高搜索效率而放弃了可预测的顺序。您可能需要一个树集或有序列表

    如果答案是3。如果是“是”,则排除了基于列表(未排序的数组、链表)的情况,您可能需要一个树集、有序列表或哈希映射

    如果对4的回答是“是”,那么就排除了hashmaps和链表(注意,这与1的问题不同,因为hashmaps基于索引存储所有内容,它们不按任何特定顺序存储)

    如果对5的回答是“是”,那么询问您的具体需求可能是最好的选择,因为这会使前面几点给出的每个答案变得复杂(链表、哈希图和缓慢增长的数组允许高效的并行实现,在parralel中排序任何事情都很难做到)

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

    一般来说:如果需要随机访问,可以使用hashmap。如果您需要排序树集,否则将创建一个链接列表。
    (与直接数组相比,这些数组都会带来内存开销,因此我假设内存没有太大限制)

    这取决于您将解决什么问题。。。给我们更多的细节…你回答说,“根据需求使用不同的数据结构”。我不知道这个问题的简单答案。这是学习过程的一部分,也是成为一名程序员的必经之路。这也是让它变得有趣的原因之一。在一个问题中通常会用到不同的数据结构、模式、算法等。但是,要找到“最佳”的方法需要时间、设计、经验、团队合作和许多其他因素。像二叉树这样的东西很少是存储东西的最小和最简单的方法,但它通常是最有效的方法。嗯,我更多考虑的是数据结构本身,而不是算法。但这肯定是问题的一部分,当问题不完全清楚时。+1哈哈。这非常方便。但愿我能想到把它寄出去。@SoapBox:当无序的容器实际上是标准的时候,它很可能是标准的(虽然我不是作者,所以我不能说)。非常整洁它将有助于加速(与反对者)关于数据结构的讨论。你能确定来源吗?也许这幅插图中的矢量图会有帮助——可以进行更改/添加。@Abhi:我不知道具体的位置