跳表

作者: weiee | 来源:发表于2020-05-24 12:05 被阅读0次

跳表:一种动态数据结构,支持快速插入、删除、查找操作。

const MAX_LEVEL = 16;

class Node {

    constructor({
        data = 0,
        level = 1
    } = {}) {
        this.data = data;
        this.level = level;
        this.refer = new Array(this.level);
    }
}

class SkipList {

    constructor() {
        this.head = new Node();
        this.maxLevel = 1;
    }

    randomLevel() {
        let level = 1;
        while(Math.random() < 0.5 && level < MAX_LEVEL) {
            level++;
        }
        return level;
    }

    insert(value) {
        let level = this.randomLevel();
        let p = this.head;
        let path = new Array(level);
        for (let i = level-1; i >= 0; i--) {
            while(p.refer[i] && p.refer[i].data < value) {
                p = p.refer[i];
            }
            path[i] = p;
        }
        let newNode = new Node({data: value, level});
        for (let i = 0; i < level; i++) {
            newNode.refer[i] = path[i].refer[i];
            path[i].refer[i] = newNode;
        }
        if (level > this.maxLevel) {
            this.maxLevel = level;
        }
    }

    find(value) {
        let p = this.head;
        for (let i = this.maxLevel-1; i >= 0; i--) {
            while(p.refer[i] && p.refer[i].data < value) {
                p = p.refer[i];
            }
        }
        if (p.refer[0] && p.refer[0].data === value) {
            return p.refer[0];
        } 
        return null;
    }

    remove(value) {
        let p = this.head;
        let path = new Array(this.maxLevel);
        for(let i = this.maxLevel-1; i >= 0; i--) {
            while(p.refer[i] && p.refer[i].data < value) {
                p = p.refer[i];
            }
            path[i] = p;
        }
        if (p.refer[0] && p.refer[0].data === value) {
            let node = p.refer[0];
            for (let i = 0; i < p.refer[0].level; i++) {
                if (path[i].refer[i] && path[i].refer[i].data === value) {
                    path[i].refer[i] = node.refer[i];
                }
            }
            return node;
        }
        return null;
    }

    printAll() {
        let p = this.head;
        while(p.refer[0]) {
            console.log(p.refer[0].data)
            p = p.refer[0];
        }
    }
}

相关文章

  • 跳表

    跳表的定义 跳表(SkipList):增加了向前指针的链表叫做跳表。跳表全称叫做跳跃表,简称跳表。跳表是一个随机化...

  • 跳表

    跳表的定义 跳表(SkipList):增加了向前指针的链表叫做跳表。跳表全称叫做跳跃表,简称跳表。跳表是一个随机化...

  • HBase内存管理之MemStore

    基于跳表实现的MemStore基础模型 实现MemStore模型的数据结构是SkipList(跳表),跳表可以实现...

  • 2.跳表的基本实现和特性

    一、跳表 跳表的设计与实现为啥 redis 使用跳表(skiplist)而不是使用 red-black redis...

  • 有关跳跃表的干货都在这里

    跳表的数据结构 跳表全称叫做跳跃表,简称跳表。跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。...

  • [AlgoGo]跳表SkipList

    跳表是什么 跳表的实现基于链表,弥补了链表不便于查找的缺点,所以跳表其实不是表(table)而是链(list)。跳...

  • 知识快速回顾(数据结构+算法)

    打卡时间:2020-2-23 19:46 ~ 20:30 跳表 什么是跳表 ? 跳表是一种高效的链表结构,它通过增...

  • 跳表skiplist

    增加了向前指针的链表叫作跳表。跳表全称叫做跳跃表,简称跳表。跳表是一个随机化的数据结构,实质就是一种可以进行二分查...

  • 03、数组、链表、跳表

    数组 链表 跳表 ![ 跳表在工程中的应用LRU Cache - Linked listhttps://www.j...

  • 【算法打卡60天】Day15跳表:为什么Redis一定要用跳表来

    Day15学习内容主要为以下三点:1.如何理解“跳表”?跳表:链表加多级索引的结构。跳表使用空间换时间的设计思路,...

网友评论

      本文标题:跳表

      本文链接:https://www.haomeiwen.com/subject/cywdahtx.html