当前位置:首页 > JavaScript

跳表实现 js

2026-01-31 16:25:31JavaScript

跳表实现 js

跳表实现 js

跳表(Skip List)实现

跳表是一种概率性数据结构,允许快速查找、插入和删除操作,时间复杂度为O(log n)。以下是JavaScript实现跳表的基本代码框架:

节点类定义

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

跳表类定义

class SkipList {
  constructor(maxLevel, p) {
    this.maxLevel = maxLevel;
    this.p = p;
    this.level = 0;
    this.header = new SkipListNode(null, maxLevel);
  }

  randomLevel() {
    let level = 0;
    while (Math.random() < this.p && level < this.maxLevel) {
      level++;
    }
    return level;
  }
}

插入操作

insert(value) {
  const update = new Array(this.maxLevel + 1).fill(null);
  let current = this.header;

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

  current = current.forward[0];
  if (current === null || current.value !== value) {
    const newLevel = this.randomLevel();
    if (newLevel > this.level) {
      for (let i = this.level + 1; i <= newLevel; i++) {
        update[i] = this.header;
      }
      this.level = newLevel;
    }

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

搜索操作

search(value) {
  let current = this.header;
  for (let i = this.level; i >= 0; i--) {
    while (current.forward[i] !== null && current.forward[i].value < value) {
      current = current.forward[i];
    }
  }
  current = current.forward[0];
  return current !== null && current.value === value;
}

删除操作

delete(value) {
  const update = new Array(this.maxLevel + 1).fill(null);
  let current = this.header;

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

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

    while (this.level > 0 && this.header.forward[this.level] === null) {
      this.level--;
    }
    return true;
  }
  return false;
}

使用示例

const skipList = new SkipList(16, 0.5);
skipList.insert(3);
skipList.insert(6);
skipList.insert(7);
console.log(skipList.search(6)); // true
skipList.delete(6);
console.log(skipList.search(6)); // false

实现要点

  • 跳表通过多级索引加速查找
  • 随机层级生成决定节点高度
  • 插入时需要更新各层的前驱指针
  • 删除时需要调整各层的链接关系
  • 典型参数:最大层级16,概率因子0.5

该实现提供了跳表的核心功能,可根据实际需求扩展更多方法或优化性能。

标签: js
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…