javascript - Javascript 的引擎设计在更坏的情况下如何影响用户数据结构的实现?
问题描述
举个例子,一个使用哈希表实现关联数组(对象)的 JS Web 引擎。但正如我们所知,哈希表的情况更糟 O(n) 因为冲突是不可避免的。
假设我开始使用 Javascript 开发一种新的数据结构,这种数据结构如 LinkedList,插入/删除的情况更糟 O(1)。但是因为我用对象/数组来实现它。那么我的实现也至少是最坏的情况 O(n) 一定是真的。
我知道这个引擎优化得很好,一个好的哈希函数平均会产生 O(1)。但是,我只是想确认我的认识,这并不像教科书所说的那么简单。或者是吗?
我想在所有数据结构的根部都用数组实现,因为访问总是O(1),那么不应该用没有中间结构的数组来构建所有数据结构吗?此外,动态数组仍然有 delete O(n) 不能像我之前的例子一样会出现同样的问题吗?
这是使用低级编程语言的好处比使用高级语言更好的地方吗?这样的低层次没有那么多抽象,教科书的复杂性数字实际上可以匹配吗?
如果我的想法到处都是,请道歉。
解决方案
但是因为我用对象/数组实现了[我的自定义数据结构]。那么我的实现也至少是最坏的情况 O(n) 一定是真的。
不,您的链接列表不会在n
任何地方使用带有键的对象。你会有一个
const linkedListNode = {
value: …,
next: null,
};
但即使这是使用具有O(n)
最坏情况成员访问权限的 HashTable 实现的,在您的情况下也是如此n=2
。您的对象中没有任意多个属性,只有两个。这就是你如何回到O(1)
.
这是使用低级编程语言的好处比使用高级语言更好的地方吗?这样的低层次没有那么多抽象,教科书的复杂性数字实际上可以匹配吗?
不会。即使在较低级别的编程语言中,您也可以开始质疑底层抽象。您认为在 C 中,内存中的索引数组访问是常数时间吗?不,因为页面错误和其他缓存恶作剧开始发挥作用。
这就是为什么教科书的复杂性总是根据机器模型来定义的。只要您将 JavaScript 执行模型中的对象属性访问定义为常量时间(这是一个非常合理的假设!它与现实世界非常相似),您的数字也确实适用于 JavaScript 代码。当然,您可以尝试解开抽象并根据较低级别的原语分析您的高级算法,但这样做没有意义。这正是我们首先拥有这些抽象的原因。
推荐阅读
- ios - NotificationService Extension 返回与 App 目标不同的语言环境
- python - 如何在 Tkinter Canvas 上配置动态创建的矩形?
- asp.net-mvc - Asp Net Mvc:可以从Partial View返回JSON数据吗?
- python - pandas 通过将列表中的每个元素与其他所有元素相乘来创建一个 DataFrame
- crystal-reports - Crystal Reports 在节中重复组标题
- visual-studio - Visual Studio SSRS 项目文件错误:该项目需要用户输入。重新加载项目以获取更多信息
- sql - 如何在 BigQuery(标准 SQL)中获取表的前 N%(例如,50%)?
- java - 正则表达式java:replaceAll空格,连字符之间除外
- javascript - Firebase:初始化由集合组成的树
- kubernetes - 如何跨多个 Kubernetes 集群扩展 RabbitMQ