我很想知道在编程中人们会认为最有用的数据结构。您发现自己一直使用哪种数据结构?
这篇文章的答案应该有助于有兴趣为他们的问题找到有用的数据结构的新程序员。答案应该包括数据结构,有关它的信息或相关链接,它正在使用的情况以及为什么它是这个问题的一个好选择(例如理想的计算复杂性,简单性和理解等)。
每个答案应仅限于一个数据结构。
感谢任何人们可以分享的智慧和经验珍珠。
答案 0 :(得分:23)
我最常使用的数据结构之一(当然除了向量)是Hashtable。 如果您需要能够在O(1)时间内搜索大量数据,这是唯一的选择,这意味着搜索时间不会随着集合规模的增长而增长。
问题是插入和删除时间比其他数据结构大,并且您需要使用某种键来搜索集合。每个元素都必须有一个键。 该算法获取每个元素的密钥并计算散列码,该散列码指示要在其中搜索的散列表中的槽。 然后,根据实施情况,它会跟随一个项目列表,这些项目落在该存储桶上以查找您的项目,或者搜索附近的存储桶。 hastable的大小决定了哈希的效率,哈希受到密钥之间哈希码冲突的影响很大。
每当需要地图时使用它,并且地图的预期元素数量超过10个。它比其他结构的内存密集程度更高,因为它需要表中大量未使用的插槽才能有效。
C#与Dictionary<keytype, valuetype>
有很好的实现,甚至还有一个HybridDictionary,可以在内部决定何时使用哈希表或向量。
任何好的编程书都会描述它,但维基百科将为您提供良好的服务:
http://en.wikipedia.org/wiki/Hashtable
答案 1 :(得分:4)
我将不得不忽略您对每个帖子的一个数据结构的要求 - 这些是我使用最多的那些,我发现的大多数程序主要是这些或组合中的一个。
数组 - 最基本的并提供最快的访问权限。 向量是对普通旧数组的即兴创作,是目前常用的事实上的替代品。 dequeue 是此主题的另一种变体,并再次提供了时间/随机访问权限,但针对开头和结尾的快速插入和删除进行了优化。
链接列表 - 对于维护经常删除和插入但迭代/搜索速度非常慢的数据列表非常有用。例如内存页面中的空闲/使用列表
树 - 构成更复杂结构基础的基本结构。这种结构有很多种形式。在树保持排序时提供登录搜索时间。对于像字典这样的大型数据项非常有用。二元/ AVL和红黑树是最常见的。
地图和散列 - 不完全是数据结构,而是使用巧妙逻辑和上述数据结构相结合的复杂快速查找算法。
这些数据结构及其实现在C ++的STL库中是可用的。其他语言也有其原生实现。一旦你知道了这些基本数据结构和一些变量(队列,堆栈,优先级队列)和&amp;关于搜索算法的一些事情,我会说基础知识将被很好地覆盖。
答案 2 :(得分:2)
我发现自己使用了关联数组,基本上是以字符串作为索引的数组。
答案 3 :(得分:2)
每个人都应该知道链接列表的优缺点,并且由于完全没有使用,似乎许多人似乎忘记了这一点。
链表的优点是添加/删除节点非常便宜。与在核心使用数组的数组或数据结构不同,它们不需要在扩展时重新分配更多内存。
缺点是它们在搜索方面表现不佳。数组中的O(1)查找对于链表是O(n)。
与所有结构一样,链接列表仅在某些条件下才是理想选择。但是在合适的时间使用,它们非常强大。
答案 4 :(得分:1)
我喜欢二叉树。特别是Splay-Tree变种。它有点类似于自平衡二叉树,但也适应应用程序的使用模式。你几乎从不遇到最糟糕的O(n)行为。
一个很好的奖励是它们比其他自平衡二叉树更容易编写并且需要更少的代码。这是我最喜欢的数据结构之一,因为它在实践中表现非常出色。
答案 5 :(得分:1)
我发现自己经常与“foreach”控制结构结合使用数组来遍历项目。在过去,我使用带有数字索引的数组和“for(i = 1; i&lt; n; i ++)”。我发现使用“foreach”而不是显式数字索引循环遍历数组可以提供更通用和可读的解决方案。
答案 6 :(得分:1)
链表的优点是添加/删除节点非常便宜。与数组[...]不同,它们不需要在扩展时重新分配更多内存。
如果您有一个数组,并且每次填充时都将分配大小加倍,那么您将分摊O(1)追加。此外,由于缓存效应,循环遍历数组的所有元素可能比在链表上循环更快(在壁时间内)(除非您以大块分配链接并且不要过多地使用它们) )。
此外,数组较小:保存每个元素的字开销,加上每个分配的开销(可能至少有两个字:一个用于大小,一个用于下一个空闲列表指针)
答案 7 :(得分:1)
图形是一种非常强大的被忽视的数据结构。
通过构建对问题进行建模的图形,然后在图形上使用一个众所周知的算法,可以解决许多问题。 一些示例自然语言处理(边缘权重连接节点可以表示一个词跟随另一个词的可能性)视频游戏(使用图形来确定AI字符的最短路径)和网络拓扑。
我了解了The Algorithm Design Manual中的图表,这是Steve Yegge在blog post中推荐的。
答案 8 :(得分:0)
这篇文章太模糊了。有无数的数据结构:数组,字典等。每个数据结构都可以用来解决不同的问题。
要求DS解决特定问题会更有效率。
答案 9 :(得分:0)
这有点像询问木匠工具箱中哪些工具最好学会使用。他们每个人都适合某种类型的工作,你需要平等地学习基本的工作(地图,清单,包,套装等)。
答案 10 :(得分:0)
我不认为有一个必须知道的数据结构。每个数据结构都有自己的属性,因此适用于特定的问题。
答案 11 :(得分:0)
我总是发现堆栈有很多用途,尽管面向对象编程不太常见。实际上,所有数据结构都有其用途,并且它们并不复杂。尽你所能。
答案 12 :(得分:0)
我认为这里没有一般性答案。它应该与某些用例有关。 例如,在我作为程序员/经理的10年职业生涯中,我从未使用过二叉树。我怀疑这意味着二叉树没用,但在内核和嵌入式世界中,链表可能更合适 实际上,当我考虑删除一些例外情况时,我只使用了简单的链接列表 然后即使在嵌入式中,它可能不是唯一使用的结构我生活在低级硬件协议的世界中,可能“上山”使用更多的数据结构......
答案 13 :(得分:0)
要获得基本的评价,你应该知道一些抽象的数据类型(集合,字典,有序列表,队列,堆栈等)以及实现它们相关权衡的几种方法。
这可能需要您理解数组,链接列表(单链接和双链接),哈希表,二进制搜索树(对简单平衡启发式有一些了解)和二进制堆。从内到外了解这些内容,您将对理解更复杂和有趣的数据结构有很长的路要走。此外,如果你已经实现了所有这些,你将拥有一个你对编程项目有所了解的现成库(尽管显然更像是像Boost这样的经过强化攻击的库或者更适合生产代码的库)。
这提供了非常有用的数据结构词汇表,这可能会对您编写程序的方式产生重大影响。您可能会发现您一直在解决队列的许多部分实现的问题,例如,您现在可以用规范实现替换它。
答案 14 :(得分:-2)
Quicksort
Mergesort
Bubblesort
这些非常适合学习并了解它们的工作原理。排序很有趣,可以应用于很多领域:)