#linked-list #structure

unrolled-linked-list

Rust中未展开链表的实现

2个稳定版本

1.0.1 2021年6月8日

#1606 in 数据结构

自定义许可证

30KB
621

未展开链表

未展开链表是一种线性数据结构,是链表的变种。未展开链表在每个节点中存储的不是1个元素,而是一个完整的数组。

未展开链表结合了数组(较小的内存开销)和链表(快速的插入和删除)的优点,从而产生大幅提升的性能。通过在每个节点中存储多个元素,未展开链表有效地将链表的开销(指针)分散到多个元素上。所以,如果一个未展开链表在每个节点中存储了一个包含4个元素的数组,它就将链表的开销(指针)分散到这4个元素上。

未展开链表的真实好处体现在缓存上。未展开链表在索引方面利用了这一点。

如何使用

依赖项可以在以下位置找到:unrolled-linked-list = 1.0.1

示例


use unrolled_linked_list::UnrolledLinkedList;

fn main(){
  let mut list = UnrolledLinkedList::new();
  list.insert(0, 1);
  list.push(2);
  list.push(3);
  list.insert(3,4);
  if let Some(four) =  list.pop() { println!(" should be {}", four)}
  
  let one_opt = list.get(0);
  let one_mut_opt = list.get_mut(0);

  list.remove(0);  

  for el in list.iter(){
    println!("elem {}",el);
  }    
 
}

与链表和vec的比较

详细信息请参见bench文件夹。数字和结果符合库criterion的典型格式。

典型结果示例

Benchmarking push/unrolled_linked_list
Benchmarking push/unrolled_linked_list: Warming up for 3.0000 s
Benchmarking push/unrolled_linked_list: Collecting 100 samples in estimated 5.0358 s (364k iterations)
Benchmarking push/unrolled_linked_list: Analyzing
push/unrolled_linked_list
                        time:   [14.078 us 14.776 us 15.527 us]
                        change: [+3.9244% +7.5033% +11.271%] (p = 0.00 < 0.05)
                        Performance has regressed.
操作 描述 未展开链表 vec 链表
push 向末尾插入100个元素 14.7 12.3 25.8
pop 从末尾检索100个元素 20.6 12.1 20.6
insert 向开头插入100个元素 11.9 12.7 20.2
insert_middle 在中间插入100个元素 14.0 13.1 22.8(未使用,已替换为push)
get 在中间插入100个元素 16.6 13.1 27.7(未使用,已替换为push)
remove 删除第三个部分的元素 17.8 15.8 24.3
iter 遍历集合 17.9 12.8 24.8
iter_mut 可变遍历集合 22.6 30.4 33.2
into_iter 拥有遍历集合 21.6 12.9 25.8

无运行时依赖