根据要求使用不同的数据结构,但我如何知道应该使用哪种数据结构?我只是想知道如何选择合适的数据结构?感谢
答案 0 :(得分:8)
此流程图适用于C ++中的STL,但您可以实现C中STL容器支持的任何数据结构。
更新2016:显然我以前链接到此处的图片已被链接腐烂,但您可以在此问题上看到几个等效图片:In which scenario do I use a particular STL container?
答案 1 :(得分:2)
您需要研究使用哪些数据结构来满足哪些要求(这里没有人会花时间为您详细说明每个选项,并告诉您何时使用它)。
一旦您了解了详细信息,您应该能够(确定无误)选择适合您需求的数据结构。
答案 2 :(得分:1)
每种数据结构对不同类型的操作都有不同的成本: 你应该问自己:
注意:列表中没有的问题是"我是否需要能够遍历商店中的所有内容"因为所有实际数据存储都能够在O(n)时间内访问所有数据
同样,所有这些评论都是概括性的:
如果答案是1.是"是"然后排除各种无序数组类型结构(向量,未排序数组,链表)
如果2.的答案是"是"然后,它排除基于散列的存储(hashmap等),因为它们放弃了可预测的顺序,以帮助提高搜索效率。你可能需要一个树集或有序列表。
如果对3.的回答是"是"然后排除基于列表(未排序的数组,链接列表),你可能需要一个树集,有序列表或哈希映射。
如果4的回答是"是"然后排除了哈希映射和链表(请注意,这是一个不同的问题,因为哈希映射根据索引存储所有内容,它们不会以任何特定顺序存储它们)
如果5的答案是"是"那么问一个具有你特定要求的问题可能是要走的路,因为这会使前面几点给出的每个答案复杂化(链表,散列图和缓慢增长的数组允许有效的并行实现,在parralel中很难对任何事情进行排序)。 / p>
如果你想知道为什么树集在所有这些选项上,但通常不推荐;它是因为如果2的答案是" no",那么hashmap通常更好(随着集合的增长,添加和删除元素的时间比treeset慢得多)。同样,如果对任何其他问题的回答是“不”。那么有更好的建议。
一般来说:如果你需要随机访问,hashmap。如果需要排序的树集,否则需要链表。 (与直接阵列相比,这些都带来了内存开销,因此我假设内存不是非常严格的限制)
答案 3 :(得分:0)
如果不知道决定的哪些部分会给你带来麻烦,就很难回答。
在大多数情况下,您需要最小,最简单的数据结构来存储您需要存储的数据。
是否有一个特定案例给你带来麻烦?
答案 4 :(得分:0)
不是您要找的,但取决于。
这取决于您存储的数据,访问该数据的任何限制,您是否需要能够快速查找内容?是否需要对数据进行任何排序?你以后会把它分类吗?
即使您选择了数据结构(链接列表,地图,设置),其中还有许多变体可能会进一步推动您的决策。
我的经验法则是:
用最简单的方法去,直到你不知道你需要更复杂的东西。
答案 5 :(得分:0)
如果您的关注是快速有效的搜索,那么您将选择存储数据的数据结构?给出合理选择数据结构的理由。