我对了解人们认为在编程中最有用的数据结构感兴趣。你经常使用哪种数据结构?
回答此帖应该帮助有兴趣找到适用于其问题的有用数据结构的新程序员。回答应该包括数据结构,相关信息或链接,它所使用的情况以及为什么它是解决这个问题的好选择(例如,理想的计算复杂度,简单性和理解等)。
每个答案只应涉及一个数据结构。
感谢任何人能够分享的智慧和经验。
我对了解人们认为在编程中最有用的数据结构感兴趣。你经常使用哪种数据结构?
回答此帖应该帮助有兴趣找到适用于其问题的有用数据结构的新程序员。回答应该包括数据结构,相关信息或链接,它所使用的情况以及为什么它是解决这个问题的好选择(例如,理想的计算复杂度,简单性和理解等)。
每个答案只应涉及一个数据结构。
感谢任何人能够分享的智慧和经验。
在编程中,我最常使用的数据结构之一(除了向量)就是哈希表。 如果你需要能够在O(1)时间内搜索大量数据,那么哈希表几乎是唯一的选择,这意味着搜索时间不会随着集合大小的增长而增加。
问题在于,插入和删除的时间比其他数据结构要长,并且你需要有某种键来搜索集合。每个元素都必须有一个键。 算法会获取每个元素的键并计算出一个哈希码,该哈希码指示在哈希表中搜索的槽位。 然后,根据实现方式,它要么遍历落在该桶上的项目列表以找到你的项目,要么搜索附近的桶。 哈希表的大小对哈希的效率起决定性作用,而哈希码之间的碰撞数量会对其产生相当大的影响。
当你需要一个映射,并且预期的映射元素数量超过10个时,请使用哈希表。由于需要大量未使用的槽位才能提高效率,所以它比其他结构占用更多内存。
C#中有一个很好的实现,使用Dictionary<keytype, valuetype>
,甚至还有一个HybridDictionary,它会在内部决定何时使用哈希表或向量。
任何一本好的编程书都会描述它,但你也可以通过维基百科得到很好的服务:
http://en.wikipedia.org/wiki/Hashtable
我经常使用关联数组,基本上就是以字符串为索引的数组。
每个人都应该知道链表的优缺点,但由于完全不使用,似乎很多人忘记了它。
链表的优点是添加/删除节点非常便宜。与使用数组或数据结构的数组核心不同,它们在扩展时不需要重新分配更多内存。
缺点是它们对搜索的性能非常差。在数组中是O(1)查找,在链表中为O(n)。
像所有结构一样,链表只在特定条件下才是理想的。但在正确的时间使用它们,它们非常强大。
我喜欢二叉树。尤其是Splay-Tree变种。它与自平衡二叉树有些相似,但也适应了应用程序的使用模式。你几乎不会遇到最坏情况的O(n)行为。
一个好处是它们比其他自平衡二叉树更容易编写,需要的代码也更少。这是我最喜欢的数据结构之一,因为它在实践中表现出色。
我发现自己经常使用数组与“foreach”控制结构相结合来循环遍历项目。过去,我使用带有数字索引的数组和“for(i=1;i<n;i++)”。我发现使用“foreach”循环遍历数组而不是显式数字索引提供了更通用和可读的解决方案。
我认为没有一种数据结构是必须要了解的。每种数据结构都有其自身的特性,因此适用于特定的问题。