跳表的结构学习

一、简介

跳表是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树,其功能
与性能相当,并且跳表的代码长度更短,其设计思想与链表相似。

  • Skip List,跳跃表,简称跳表
  • 实质是一种可以进行二分查找的链表
  • 在原有的有序链表上面增加了多级索引,通
  • 过索引来实现快速查找,以空间换时间
    跳表的结构学习_第1张图片

二、跳表的特点

  • 多层结构,每一层随机概率产生
  • 每一层都是有序链表,默认升序,最底层包含所有元素,即原链表
  • 每个节点包含两个指针:向右(right,同级链表)、向下(down,下级链表)

三、跳表的组成

跳表的结构学习_第2张图片
跳表由很多层有序的链表结构组成:
• 最底层(Level 1)称为原链表,包含所有元素
• 上面每一层(Level i)链表都叫索引层,上级索引是下一级的子集
• 如果一个元素出现在 Level i 的链表中,则它在 Level i 之下的链表也都会出现
• 每个节点包含两个指针,一个指向同一链表中的后一个元素,一个指向下面一层的元素
• 跳表的每一个操作都是从最高层链表的头节点开始,从左往右,从上往下

四、基础操作

  • void add(int num): 插入一个元素到跳表
  • bool search(int target) : 返回target是否存在于跳表中。
  • bool erase(int num): 在跳表中删除一个值,如果 num 不存在,直接返回false。如果存在多个 num ,
    删除其中任意一个即可

五、代码实现

class Skiplist {
   
	final int HEAD_VALUE = -1; // 链表头节点的值
	final Node HEAD = new Node(HEAD_VALUE);
	Node head; // 最左上角的头节点,所有操作的开始位置
	int levels; // 当前层级,即 head 节点所在的最高层数
	int length; // 跳表长度,即原链表节点个数

	public Skiplist() {
   
		head = HEAD;
		levels = 1;
		length = 1; // 仅包含头节点
	}
	
	class Node {
   
		int val;
		Node right, down;
		
		Node(int val) {
   
			this(val, null, null);
		}
		
		Node

你可能感兴趣的:(#,数据结构与算法,链表,数据结构)