当前位置:首页 > JavaScript

跳表js实现

2026-01-31 23:59:52JavaScript

跳表(Skip List)的 JavaScript 实现

跳表是一种概率性的数据结构,允许快速查找、插入和删除操作,时间复杂度接近平衡树(O(log n))。以下是跳表的 JavaScript 实现。

跳表js实现

跳表节点类

跳表节点包含值、指向右侧节点的指针数组和指向下方节点的指针数组。

跳表js实现

class SkipListNode {
  constructor(value, level) {
    this.value = value;
    this.next = new Array(level).fill(null);
  }
}

跳表类

跳表类包含初始化、随机层数生成、插入、查找和删除等方法。

class SkipList {
  constructor() {
    this.maxLevel = 16; // 最大层数
    this.head = new SkipListNode(null, this.maxLevel);
    this.level = 1; // 当前层数
    this.probability = 0.5; // 层数增长概率
  }

  // 随机生成层数
  _randomLevel() {
    let level = 1;
    while (Math.random() < this.probability && level < this.maxLevel) {
      level++;
    }
    return level;
  }

  // 查找节点
  search(value) {
    let current = this.head;
    for (let i = this.level - 1; i >= 0; i--) {
      while (current.next[i] !== null && current.next[i].value < value) {
        current = current.next[i];
      }
    }
    current = current.next[0];
    return current !== null && current.value === value ? current : null;
  }

  // 插入节点
  insert(value) {
    const update = new Array(this.maxLevel).fill(null);
    let current = this.head;

    for (let i = this.level - 1; i >= 0; i--) {
      while (current.next[i] !== null && current.next[i].value < value) {
        current = current.next[i];
      }
      update[i] = current;
    }

    current = current.next[0];
    if (current === null || current.value !== value) {
      const newLevel = this._randomLevel();
      if (newLevel > this.level) {
        for (let i = this.level; i < newLevel; i++) {
          update[i] = this.head;
        }
        this.level = newLevel;
      }

      const newNode = new SkipListNode(value, newLevel);
      for (let i = 0; i < newLevel; i++) {
        newNode.next[i] = update[i].next[i];
        update[i].next[i] = newNode;
      }
      return true;
    }
    return false;
  }

  // 删除节点
  delete(value) {
    const update = new Array(this.maxLevel).fill(null);
    let current = this.head;

    for (let i = this.level - 1; i >= 0; i--) {
      while (current.next[i] !== null && current.next[i].value < value) {
        current = current.next[i];
      }
      update[i] = current;
    }

    current = current.next[0];
    if (current !== null && current.value === value) {
      for (let i = 0; i < this.level; i++) {
        if (update[i].next[i] !== current) {
          break;
        }
        update[i].next[i] = current.next[i];
      }

      while (this.level > 1 && this.head.next[this.level - 1] === null) {
        this.level--;
      }
      return true;
    }
    return false;
  }
}

使用示例

以下是如何使用跳表进行插入、查找和删除操作的示例。

const skipList = new SkipList();
skipList.insert(3);
skipList.insert(6);
skipList.insert(7);
skipList.insert(9);
skipList.insert(12);

console.log(skipList.search(6)); // 返回节点
console.log(skipList.search(10)); // 返回 null

skipList.delete(6);
console.log(skipList.search(6)); // 返回 null

时间复杂度分析

  • 查找:平均时间复杂度为 O(log n),最坏情况下为 O(n)。
  • 插入:平均时间复杂度为 O(log n),最坏情况下为 O(n)。
  • 删除:平均时间复杂度为 O(log n),最坏情况下为 O(n)。

注意事项

  • 跳表的性能依赖于随机层数生成的概率,通常设置为 0.5。
  • 最大层数应根据数据规模调整,过大会浪费空间,过小会影响性能。
  • 跳表适用于需要频繁插入、删除和查找的场景,如 Redis 的有序集合实现。

标签: 跳表js
分享给朋友:

相关文章

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let currentY…

js 实现日历

js 实现日历

实现日历的基本思路 日历的核心功能是展示日期,并允许用户进行日期选择或导航。JavaScript 可以动态生成日历的 HTML 结构,并处理用户交互逻辑。 基础日历结构 日历通常包含头部(显示月份和…