为什么更高级别的语言(Javascript,PHP等)不提供链接列表,队列,二叉树等数据结构作为其标准库的一部分?是出于历史/实践/文化原因,还是有一些我缺失的基础知识。
答案 0 :(得分:8)
链接列表
您可以在大多数动态语言中轻松实现链接列表,但它们并不那么有用。对于大多数情况,动态数组(大多数动态语言都内置支持)更适合:它们具有更好的使用和缓存一致性,索引查找的更好性能以及插入和删除方面的良好性能。在应用程序级别,您确实需要链接列表的用例并不多。
队列
使用动态数组轻松实现。
二叉树
二叉树很容易用大多数动态语言实现。二进制搜索树一如既往地是一件苦差事,但却很少需要。 Hashtables会为您提供相同的性能,并且通常对于许多用例更好。大多数动态语言都提供内置哈希表(或字典,映射,表或任何你想要调用的表)。
了解这些基础数据结构非常重要,如果您正在编写低级代码,您会发现自己正在使用它们。在使用大多数动态语言的应用程序级别,哈希表和动态数组确实覆盖了95%的数据结构需求。
答案 1 :(得分:3)
在语言方面有很多“高级别”的定义,但我会在此上下文中引用为特定域(4GL任何人?)而专门构建的语言。这样的“特定域”通常在范围上受到限制,例如:网页构建,报告编写,数据库查询等。在有限的范围内,除了最基本的数据结构之外,通常几乎不需要任何其他内容。
让我们考虑一下Javascript的情况。这种语言的范围最初非常有限,是一种脚本语言,而不是在Web浏览器的范围内运行。它主要关注的是在其他静态网页上提供少量动态行为。此外,该技术的局限性使得在该环境中编写大型组件(特别是性能和沙箱模型)变得不切实际。
由于Javascript仅限于解决“小问题”,因此几乎不需要丰富的数据结构。随着数据结构的发展,Javascript的地图非常灵活。你必须记住,Basic和FORTRAN在很长的路上只提供了数组 - 地图比这更灵活。 Javascript似乎正在进行转换,逃离沙箱。一些非常雄心勃勃的系统正在Javascript中构建,包括浏览器内部和外部。并且该技术正在推进以跟上它(见证新的Javascript引擎,持久性模型等)。我预计对更有趣的数据结构的需求将会增加,并且需求将得到满足。
图书馆功能通常在需求出现时出现。许多基本数据结构都很容易实现,因此很难将它们添加到库中 - 特别是如果该库需要经过某种标准化过程。这就是为什么这么多语言(所有级别)都没有开箱即用的原因。但我认为还有另一种力量可以改变所有......多道程序化的兴起。
不久前,大多数开发人员编写的代码都在单个线程的范围内运行。但现在,我们的系统充满了线程,Web工作者,代理,协同程序,集群,云和各种并发系统。这改变了从头开始实现数据结构的整个过程。
在单线程上下文中,几乎以任何语言实现链表都是微不足道的。但是要在混合中添加并发性,现在需要花费大量精力来实现它。一个人真的需要成为专家才能有机会。这就是为什么你会看到所有最新语言的丰富集合框架。正在实现跨线程边界(或更糟糕)共享数据结构的需求。
因此,总而言之,我认为丰富的数据结构在许多语言中明显缺失的原因在很大程度上是历史性的。需要不足以证明这项努力的合理性。但是,有一些新的力量正在以高度并发的系统的形式出现,迫使语言库提供更丰富的数据结构的工业实力。
答案 2 :(得分:0)
我的直观答案是,这些语言将更高级别的数据结构推迟给程序员实现他/她自己。这允许程序员定制特定数据结构以适应软件正在解决的问题。通常在组织中,许多这些DS都打包在库中,以便在大规模应用程序中重复使用。