在学校里,我们被教导了如何在插入或删除时平衡AVL树。
这种类型的知识实际上如何在现实世界中有用?有人可以举例说明这种知识何时真正有用吗?
据我所知,在工作场所几乎没有这样的细节……
我可以看到关于算法和某些数据结构的详细知识多么重要,但是对诸如AVL树旋转(以及类似的详细概念)之类的细节却不那么重要。
谢谢!
在学校里,我们被教导了如何在插入或删除时平衡AVL树。
这种类型的知识实际上如何在现实世界中有用?有人可以举例说明这种知识何时真正有用吗?
据我所知,在工作场所几乎没有这样的细节……
我可以看到关于算法和某些数据结构的详细知识多么重要,但是对诸如AVL树旋转(以及类似的详细概念)之类的细节却不那么重要。
谢谢!
Answers:
由于以下原因,对AVL树的研究可能会有所帮助:
这是推理抽象数据的好方法。您不必考虑一棵特定的树,而必须考虑所有可能性。使用这种推理的实践也可以帮助处理简单的案例。
了解谓词和合同是一种很好的做法。确保树是平衡的,并且用于证明每个操作保持平衡的工具可以例如应用于安全性问题和并行代码。
它使您能够编写自己的变体,甚至创建全新的数据结构类型。
您可能只需要为新的库或平台实现AVL树即可。
您可以讨论学习每种排序算法或每种平衡树的特殊优点。最终学习哪个主题并不重要,但是您应该确保完全覆盖最重要的主题。
如果您想了解了解算法在现实世界中的重要性,请阅读Inc中有关Friendster垮台的文章,以及最根本地应用基本原理来提高效率的文章对他们的帮助,即“ 如何杀死一个好主意! ”。
除了Macneils点...
红黑树可能更直接有用,因为存在一些有用的高效操作,而这些标准库实现(例如C ++)std::map
(至少AFAIK)并未广泛支持这些操作。红黑树可以支持“拆分”(将一棵树切成两棵,一棵包含比指定键少的键,一棵包含比指定键大的键)和“ join”(相反,将大键的树与小键的树结合在一起)键)都可以在O(log n)的时间内完成,但是如果标准容器库中支持这些键,这似乎是一个隐藏的东西。
但是,“增强”数据结构是常见的。一个简单的示例是将子树大小信息添加到几乎任何树数据结构中的节点上,以支持O(log n)下标。更复杂的示例包括间隔树。
一旦有了增加数据结构的想法,就会有很多变化可以用于特定的应用程序-很少有预打包为库的文件。在std::map
不复制源代码并直接对其进行修改的情况下,无法扩展现有的标准库数据结构(例如),您不能使用模板参数来对其进行扩展。
当然,要开发增强型数据结构,您需要了解底层的非增强型数据结构。
如果您执行的搜索量比插入/删除操作多(并且不需要进行拆分/联接操作),则AVL树的速度可能会比红黑树快。因此,根据应用程序的不同,它们可能是增强。