当前位置:首页 > JavaScript

js实现treemap

2026-04-06 15:45:20JavaScript

实现 TreeMap 的基本思路

TreeMap 是一种基于红黑树实现的有序映射结构,JavaScript 本身不提供原生 TreeMap,但可以通过对象或 Map 结合自定义排序逻辑模拟。

使用对象实现简单 TreeMap

通过对象存储键值对,并维护一个排序数组来保证键的顺序:

class TreeMap {
  constructor() {
    this.items = {};
    this.sortedKeys = [];
  }

  set(key, value) {
    if (!(key in this.items)) {
      const index = this._findInsertIndex(key);
      this.sortedKeys.splice(index, 0, key);
    }
    this.items[key] = value;
  }

  get(key) {
    return this.items[key];
  }

  _findInsertIndex(key) {
    let low = 0;
    let high = this.sortedKeys.length;

    while (low < high) {
      const mid = Math.floor((low + high) / 2);
      if (this.sortedKeys[mid] < key) {
        low = mid + 1;
      } else {
        high = mid;
      }
    }
    return low;
  }
}

基于数组实现完整功能

更完整的实现包括遍历、删除等操作:

class AdvancedTreeMap {
  constructor(comparator = (a, b) => a - b) {
    this.keys = [];
    this.values = [];
    this.comparator = comparator;
  }

  set(key, value) {
    const index = this._findIndex(key);
    if (index < this.keys.length && this.comparator(this.keys[index], key) === 0) {
      this.values[index] = value;
    } else {
      this.keys.splice(index, 0, key);
      this.values.splice(index, 0, value);
    }
  }

  get(key) {
    const index = this._findIndex(key);
    if (index < this.keys.length && this.comparator(this.keys[index], key) === 0) {
      return this.values[index];
    }
    return undefined;
  }

  _findIndex(key) {
    let low = 0;
    let high = this.keys.length;
    while (low < high) {
      const mid = Math.floor((low + high) / 2);
      if (this.comparator(this.keys[mid], key) < 0) {
        low = mid + 1;
      } else {
        high = mid;
      }
    }
    return low;
  }
}

使用 ECMAScript 6 的 Map

对于需要更复杂功能的场景,可以扩展 ES6 的 Map 类:

class TreeMap extends Map {
  constructor(iterable, comparator = (a, b) => a - b) {
    super();
    this.comparator = comparator;
    this._keys = [];
    if (iterable) {
      for (const [key, value] of iterable) {
        this.set(key, value);
      }
    }
  }

  set(key, value) {
    if (!this.has(key)) {
      const index = this._findIndex(key);
      this._keys.splice(index, 0, key);
    }
    super.set(key, value);
    return this;
  }

  _findIndex(key) {
    let low = 0;
    let high = this._keys.length;
    while (low < high) {
      const mid = Math.floor((low + high) / 2);
      if (this.comparator(this._keys[mid], key) < 0) {
        low = mid + 1;
      } else {
        high = mid;
      }
    }
    return low;
  }
}

性能优化建议

对于大型数据集,纯 JavaScript 实现的 TreeMap 性能可能不足。这种情况下可以考虑:

js实现treemap

  • 使用 TypedArray 处理数值键
  • 采用更高效的数据结构如跳表(Skip List)
  • 对于生产环境,推荐使用专门的库如 bintreeststl

标签: jstreemap
分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…