JS 中没有传统意义上的数组,数组其实是哈希表
那么问题来了。用 JS 实现的链表还有意义吗?
既然 JS 中数组本质是哈希表,那么用链表和数组进行插入删除效率对比,感觉应该没优势啊。
各位在 Code Review 时碰上自己动手用 JS 写链表的会怎么 Comment?
那么问题来了。用 JS 实现的链表还有意义吗?
既然 JS 中数组本质是哈希表,那么用链表和数组进行插入删除效率对比,感觉应该没优势啊。
各位在 Code Review 时碰上自己动手用 JS 写链表的会怎么 Comment?
@vision1900 优化 #3 从实例上说明了不再多言。
即使实现上保持一致的哈希,你觉得哈希表实现的数组,插入删除难道是 O(1) 的吗?不需要改 key 的吗?
虽然我给不出证明,但我直觉上认为:在不具有先验知识的情况下,不可能同时做到 O(1) 增删和 O(1) 定位。
因为见过 O(log n) 增删 O(log n) 定位的超复杂结构,并且这玩意儿还几乎每台电脑上都有。
Code Review 的话,首先封装成单独 module,复用 + 关注点分离 + 单测;既然封装了,那不如找一个现成的。
有理有据地不让别人自己写,也不用想方设法委婉地表达怀疑对方写的代码基础库会不会有 bug 。
很多语言 hash 分区下面还是要用链表的. 链表存的是地址, 保证一步到位. 我记得 React 里面有很多链表.
直到, 你开启上帝模式,arr[“key”]=value
arr 就变成了哈希表,而且所有数组访问失效,不能通过 arr[1]拿到 k
话说 React hook 底层就是链表啊
“`javascript
var array = [];
for(var i = 0;i< 1000000;i++){
array.push(i)
}
var start = new Date().getTime()
for(var i = 0; i< 100000; i++){
array.splice(1000000,0,1);
}
var end = new Date().getTime();
console.log(`Add 10^5 numbers to the head of array: ${end – start} ms`);
var array = [];
for(var i = 0;i< 1000000;i++){
array.push(i)
}
var start = new Date().getTime()
for(var i = 0; i< 100000; i++){
array.push(1000000,0,1);
}
var end = new Date().getTime();
console.log(`Add 10^5 numbers to the rear of array: ${end – start} ms`);
// Add 10^5 numbers to the head of array: 4555 ms
// Add 10^5 numbers to the rear of array: 56 ms
“`
另外,之前用 JS 做题测试 Set 和 Map 的时间查询复杂度是 O(n) 也是挺难受的。
https://tc39.es/ecma262/#sec-set.prototype.has
“`javascript
const friends = [“Mike”, “Peter”, “Jones”, “Alex”];
friends[“count”] = 4;
friends instanceof Array; // true
friends[0]; // Mike
friends[“0”] = “Kate”;
friends[0]; // “Kate”;
“`
@seth19960929 首先你要能够动态扩充数组,这个就杀掉一大批(手动分配内存的),但需求在,也会有相关设施的。JS 姑且是有 splice 可以做这事。
@charlie21 Python 的 [1,2,3] 形式就是 list,数组是另外的 import array (或者 import numpy,如果你高兴的话)。
这两个似乎一直分辨得很明确,但具体语言以 list 为主还是以 array 为主是设计思路的问题。
实际上放弃纠结细节,看看 #26 说的也挺清楚。
实际上数组和哈希表就是寻址算法分别为 x=>head+x 和 x=>head+hash(x) 罢了。
然而链表的寻址是 x=>x(p=>p.next)(head) 注意此处我顺手把 x 当邱奇数了。
JS 跑在引擎上,引擎给 JS 语言提供给的内存空间是抽象的,真实反映在操作系统内存管理上可能是连续的也可能是不连续的。像 JS 的 Array 底层引擎实现可能是多种模式动态切换的。
操作系统给引擎提供的内存也是抽象的,真实反映在物理内存上可能是连续的也可能是不连续的。
在如此高级抽象的语言上考虑算法性能是不可能有定论的,因为可能每次运行的时候情况都会不一样,控制器芯片、操作系统、引擎也都会对一些常见情况做优化,这个是在语言层面无法把控的。要是真的在项目上要考虑性能问题,可以做宏观的压力测试,有问题要解决大多也都是在系统架构上优化,语法算法上的优化余地不多。
用 JS 不看性能,看性能不用 JS 。WebAssembly 以及 Node.js 的 N-API 主要就是用来解决这个问题的。
MDN 是这么说的,可以这么认为吧。