不同数据结构的实际使用


102

关于数据结构的讨论很多,但是我找不到一个简单的数据结构列表及其实际用途。我正在尝试学习面试,我认为这会和其他许多人一起帮助我。我正在寻找这样的东西:

数据结构-示例/用于

哈希表-快速数据查找...然后举一个例子

数组-...

二叉树-...

如果某处有这样的资源,请告诉我。

谢谢!

编辑:我的意思是维基百科全都不错,但是在大多数页面上,它们实际上并未列出实际用途。我在寻找更多的东西。

Answers:


96

在以前的StackOverflow上的类似问题中找到了列表:

哈希表-用于快速数据查找-用于编译器,数据库索引,高速缓存,唯一数据表示的符号表。

Trie-字典,例如在手机上可以自动完成和拼写检查的字典。

后缀树-大多数文字处理器中使用的快速全文本搜索。

堆栈-文字处理器中的撤消/重做操作,表达式评估和语法分析,许多虚拟机(如JVM)都是面向堆栈的。

队列-运输和运筹学,存储并保存各种实体以便以后处理,即队列执行缓冲区的功能。

优先级队列-内核中的进程调度

树-解析器,文件系统

基数树-IP路由表

BSP树-3D计算机图形学

图表-社交网站中的连接/关系,路由,通信网络,数据组织等。

堆-Lisp中的动态内存分配

这是RV Pradeep最初发布的答案

其他一些不太有用的链接:

仅针对某些数据结构列出了应用程序

不以应用程序为重点,通过良好的总结和相关性


1
您的第一个链接已断开
Dan Beaulieu

谢谢@DanBeaulieu。我删除了死链接。
MXMLLN 2015年

1
非常好的总结。用法的列表可能永无止境,但有一个要点。
尼克·

1
撤消/重做真的是堆栈吗?如果撤消从堆栈顶部弹出,那么您将无法重做。
Tony L.

5
@TonyL。我知道这是一个较旧的问题,但我相信使用了2个堆栈或撤消/重做。撤消操作时,该操作将从操作堆栈中弹出并放置在“重做堆栈”中。如果重做,则将其从“重做堆栈”中弹出并将其推入操作堆栈。我可能用错了术语,但是应该有一些例子。
瑞克·亨德森

14

我和你在同一条船上。我需要学习技术面试,但是记住一份清单并没有真正的帮助。如果您有3-4个小时的空闲时间,并且想进行更深的潜水,建议您退房

mycodeschool
我研究过Coursera和其他资源(例如博客和教科书),但是我发现它们要么不够全面,要么处于另一端,对先决条件的计算机科学术语过于密集。

视频中的家伙花了很多关于数据结构的演讲。不要介意那些愚蠢的图画,或一点点口音。您不仅需要了解选择哪种数据结构,还需要了解人们在考虑数据结构时要考虑的其他几点:

  • 通用数据结构的优缺点
  • 为什么每个数据结构都存在
  • 它实际上如何在内存中工作
  • 特定问题/练习,并决定使用哪种结构以实现最大效率
  • 清醒大0解释

如果您有兴趣,我还会在github上发布笔记。


7

根据我的理解,数据结构是指任何可以有效管理的电子系统内存中的数据。很多时候,这是一种内存游戏或更快的数据访问性。再次在内存方面,需要根据最终产品公司的成本对数据进行管理。有效管理告诉我们如何根据最终产品的主要需求来最好地访问数据。这是一个非常高级的解释,但是数据结构是一个广泛的主题。大多数访问者会深入研究他们可以根据自己的时间在访问中讨论的数据结构,这些结构是链接列表和相关主题。

现在,根据这些数据的逻辑构造和访问方式,它们可以分为原始,抽象,复合。

  • 原始数据结构是所有数据结构的基本构建块,它们具有一个连续的存储器:布尔值,char,int,float,double,string。
  • 复合数据结构是由不止一种原始数据类型组成的数据结构。类,结构,联合,数组/记录。
  • 抽象数据类型是复合数据类型,可以有效地访问它们,这被称为算法。根据数据访问的方式,数据结构分为线性和非线性数据类型。链接列表,堆栈,队列等是线性数据类型。堆,二叉树和哈希表等是非线性数据类型。

我希望这可以帮助您潜水。


6

Skienna撰写的出色的“ 算法设计手册”一书包含了大量的算法和数据结构。

对于大量问题,描述,比较了数据结构和算法,并讨论了实际用法。作者还提供了对实现和原始研究论文的参考。

如果您搜索最佳数据结构来解决问题,那本书很适合将其放在您的办公桌上。这对面试准备也很有帮助。

另一个很棒的资源是《NIST数据结构和算法词典》


4

很少有数据结构的实际应用

红黑树(用于频繁的插入/删除和少量搜索时使用)-使用红黑树,数据库,思维简单的数据库,在词典中搜索单词,在网络上搜索的K均值聚类

AVL树(更多搜索,更少插入/删除)-数据分析和数据挖掘以及涉及更多搜索的应用程序

最小堆-聚类算法


3

各种数据结构的任何排名将至少部分地与问题上下文相关。这将有助于学习如何分析算法的时空性能。通常,使用“大O表示法”,例如,二进制搜索的时间为O(log n),这意味着搜索元素的时间为元素数量的对数(隐式以2为底)。直观地讲,由于每个步骤都将无关紧要的剩余数据丢弃了一半,因此,将元素数量加倍会使时间增加1步。(二进制搜索的扩展性很好。)空间性能关系到较大数据集的内存量如何增长。另外,请注意big-O表示法会忽略常数因子-对于较小的数据集,O(n ^ 2)算法可能仍然比常数因子更高的O(n * log n)算法更快。

除了时间和空间外,其他特征还包括是否对数据结构进行排序(对树和跳过列表进行排序,对哈希表不进行排序),持久性(二进制树可以重用旧版本的指针,而对哈希表进行适当修改)等。

虽然您需要学习几种数据结构的行为以进行比较,但是要弄清它们在性能上为何不同的一种方法是仔细研究其中的几种。我建议比较单链接列表,二进制搜索树和跳过列表,所有这些都相对简单,但是具有非常不同的特征。考虑一下查找值,添加新值,按顺序查找所有值等工作量。

人们推荐有关分析算法/数据结构性能的各种文章,但是真正使它们有意义的是学习OCaml。处理复杂的数据结构是ML的强项,当您可以避免像C那样避免使用指针和内存管理时,它们的行为就更加清晰了。(虽然学习OCaml只是为了理解数据结构是很长的路要走:。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.