AVL树与现实世界


14

在学校里,我们被教导了如何在插入或删除时平衡AVL树。

这种类型的知识实际上如何在现实世界中有用?有人可以举例说明这种知识何时真正有用吗?

据我所知,在工作场所几乎没有这样的细节……

我可以看到关于算法和某些数据结构的详细知识多么重要,但是对诸如AVL树旋转(以及类似的详细概念)之类的细节却不那么重要。

谢谢!


7
如果可以算作现实世界,这对采访很有帮助。
凯文

这与有些人在学校“学习三角学!在现实生活中我什么时候会使用它?”的观点相同,答案是“它以为您如何分析和解决一整类问题”。 。那天和某天,您想砍伐一棵树,您的伴侣问:“您确定那不会撞到房子吗?” 抢救!
Binary Worrier 2012年

Answers:


13

由于以下原因,对AVL树的研究可能会有所帮助:

  • 这是推理抽象数据的好方法。您不必考虑一棵特定的树,而必须考虑所有可能性。使用这种推理的实践也可以帮助处理简单的案例。

  • 了解谓词和合同是一种很好的做法。确保树是平衡的,并且用于证明每个操作保持平衡的工具可以例如应用于安全性问题和并行代码。

  • 它使您能够编写自己的变体,甚至创建全新的数据结构类型。

  • 您可能只需要为新的库或平台实现AVL树即可。

您可以讨论学习每种排序算法或每种平衡树的特殊优点。最终学习哪个主题并不重要,但是您应该确保完全覆盖最重要的主题。

如果您想了解了解算法在现实世界中的重要性,请阅读Inc中有关Friendster垮台的文章,以及最根本地应用基本原理来提高效率的文章对他们的帮助,即“ 如何杀死一个好主意! ”。


有趣的文章,但我看不到AVL树如何帮助交友。
Eratosthenes

我希望看到一个示例,例如B + -Trees用于数据库索引。
卡·富比尔(LucaFülbier)'16

5

除了Macneils点...

红黑树可能更直接有用,因为存在一些有用的高效操作,而这些标准库实现(例如C ++)std::map(至少AFAIK)并未广泛支持这些操作。红黑树可以支持“拆分”(将一棵树切成两棵,一棵包含比指定键少的键,一棵包含比指定键大的键)和“ join”(相反,将大键的树与小键的树结合在一起)键)都可以在O(log n)的时间内完成,但是如果标准容器库中支持这些键,这似乎是一个隐藏的东西。

但是,“增强”数据结构是常见的。一个简单的示例是将子树大小信息添加到几乎任何树数据结构中的节点上,以支持O(log n)下标。更复杂的示例包括间隔树。

一旦有了增加数据结构的想法,就会有很多变化可以用于特定的应用程序-很少有预打包为库的文件。在std::map不复制源代码并直接对其进行修改的情况下,无法扩展现有的标准库数据结构(例如),您不能使用模板参数来对其进行扩展。

当然,要开发增强型数据结构,您需要了解底层的非增强型数据结构。

如果您执行的搜索量比插入/删除操作多(并且不需要进行拆分/联接操作),则AVL树的速度可能会比红黑树快。因此,根据应用程序的不同,它们可能是增强。


1
+1用于增强数据结构,尽管这是非常难得的事情。大多数程序员不必为提高性能而努力(否则,我们所有人都将使用C ++ / C / Fortran / Assembly)。
Matthieu M.

@Matthieu-我相信这很普遍,但仅在某些类型的开发环境中有效。老实说,这不是矛盾,因为……嗯,嗯……
Steve314 2011年

我完全同意!:D
Matthieu M.

5

没有

在现实世界中真的没有用...

除了让你思考

现实世界中有许多困难的问题,其中许多还没有众所周知的解决方案。

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.