Javascript 如何提高“获取链接列表”的性能?
我试着自己实现一个链表,并面临这样一个问题:“我如何才能以O(1)复杂性获得节点?” 是否有机会(或良好实践)改进“get”方法?我需要在链表中添加另一个数据结构吗?我在一些文章中读到关于将哈希表用于链表的内容。这正常吗Javascript 如何提高“获取链接列表”的性能?,javascript,algorithm,linked-list,Javascript,Algorithm,Linked List,我试着自己实现一个链表,并面临这样一个问题:“我如何才能以O(1)复杂性获得节点?” 是否有机会(或良好实践)改进“get”方法?我需要在链表中添加另一个数据结构吗?我在一些文章中读到关于将哈希表用于链表的内容。这正常吗 类节点{ 构造函数(值){ 这个值=值; this.next=null; } } 类链接列表{ 构造函数(){ this.head=null; this.tail=null; } //O(1) addToTail(值){ 设newNode=newNode(值); if(thi
类节点{
构造函数(值){
这个值=值;
this.next=null;
}
}
类链接列表{
构造函数(){
this.head=null;
this.tail=null;
}
//O(1)
addToTail(值){
设newNode=newNode(值);
if(this.head==null){
this.head=newNode;
this.tail=newNode;
}否则{
this.tail.next=newNode;
this.tail=newNode;
}
}
//O(n)
获取(值){
让cur=this.head;
while(cur&&cur.value!==值){
cur=cur.next;
}
返回电流;
}
//O(n)
删除(值){
让cur=this.head;
设prev=null;
while(cur&&cur.value!==值){
prev=cur;
cur=cur.next;
}
如果(当前){
//第一节点
if(this.head==cur){
this.head=cur.next;
if(this.head==null){
this.tail=null;
}
}否则{
//不是第一个节点
上一个=当前下一个;
if(cur.next==null){
this.tail=prev;
}
}
返回true;
}
返回false;
}
打印(){
让cur=this.head;
while(cur!==null){
控制台日志(当前值);
cur=cur.next;
}
}
}
const cars=[‘音频’、‘宝马’、‘马自达’、‘丰田’];
const list=new LinkedList();
for(设i=0;i
…并面临这样一个问题:“我如何才能获得O(1)复杂度的节点?”
你不能。链表总是需要一定程度的扫描。纯单链表是O(n),IIRC
我在一些文章中读到关于将哈希表用于链表的内容。这正常吗
有一个映射结构对键进行散列以找到正确的“bucket”并不少见,其中“bucket”是一个链表或类似的线性搜索容器,用于所有键散列相同的条目。基本上,get是:
- 对密钥进行哈希运算
- 按哈希查找桶
- 在桶中搜索钥匙
不过,在这一点上,整个事情不再是一个链表,而是一个地图。即使是哈希表支持的映射也不是O(1),尽管它比O(n)好
(我知道您这样做是为了学习,但我必须指出JavaScript的本机Map
,它确实使用了散列或(引用)“……其他机制,平均而言,这些机制提供的访问时间与集合中的元素数呈次线性关系。”)O(n)获取链表元素的性能是预期的。获取元素的普通链表为O(n)。查看->