【发布时间】:2021-10-17 11:57:00
【问题描述】:
以一个使用哈希表实现关联数组(对象)的 JS Web 引擎为例。但正如我们所知,哈希表的情况更糟 O(n),因为冲突是不可避免的。
假设我开始使用 Javascript 开发一种新的数据结构,这种数据结构例如 LinkedList,插入/删除的情况更糟 O(1)。但是因为我用对象/数组来实现它。那么我的实现也至少是最坏的情况 O(n) 一定是真的。
我知道这个引擎优化得非常好,一个好的哈希函数平均会产生 O(1)。但是,我只是想确认我的认识,这并不像教科书所说的那么简单。是吗?
我想在所有数据结构的根部都用数组实现,因为访问总是 O(1),那么不应该用没有中间结构的数组来构建所有数据结构吗?另外,动态数组仍然有 delete O(n) 不能像我之前的例子一样可以滴下的问题吗?
这就是使用低级编程语言的好处比使用高级语言更好的地方吗?这么低的层次没有那么多抽象和教科书的复杂度数字居然能比得上?
如果我的想法到处都是,请道歉。
【问题讨论】:
-
请澄清段落“我想在所有数据结构的根部都使用数组实现,[…]”。传统的数组访问是不变的,因为每个元素都具有相同的大小,因此,给定一个索引,您只需要查找 index · itemSize 的内存位置。但是,当然,JavaScript“数组”不是传统的数组。它们更接近散列图,但已被现代引擎优化。与数组相比,hashmap 查找在算术上的方式不同(“green”·itemSize 没有意义)。删除 hashmap 键是 O(1),因为没有发生重新索引。
-
抱歉,这里的实际问题是什么?这似乎是对编译器的开放式讨论,因为它涉及数据结构的优化以及标准库中语言的灵活性。
-
我认为您过于强调一个指标:时间复杂度。时间复杂度只是您可以用来推理算法的众多工具之一。这不是所有数据结构和语言决策的最终目标。 TC 定义了操作的可扩展性,但它没有说明在现实世界中的实际使用,其中恒定(和许多其他)因素很重要,而这正是语言设计者最终关心的领域。投票结束时过于宽泛——请将讨论范围缩小到一个带有具体用例的具体问题。
-
即使在 TC 内部,如果最坏的情况很糟糕怎么办?这并不意味着它仍然不是解决问题的最佳方法。一些例子是快速排序、插入排序和单纯形。如果哈希表设计得很好以消除冲突,QS 中的枢轴选择得很好,并且插入排序在大多数排序的数组上运行等等,那么最坏情况的惩罚在实践中通常不是问题。哈希表必须设计得很糟糕才能达到 O(n) 访问。你可以(通常)信任那些研究这些语言的聪明人。不要过早优化。
标签: javascript object time-complexity computer-science implementation