数据结构之 - hash

38 阅读1分钟
let HashTable1 = function () {
  let items = [];

  // 通过ascII码转换
  let loseloseHashCode = function (key) {
    let hash = 0;
    for (let i = 0; i < key.length; i++) {
      hash += key[i].charCodeAt();
    }
    return hash % 37;
  };

  // 添加
  this.put = function (key, value) {
    let position = loseloseHashCode(key);
    items[position] = value;
  };

  // 获取
  this.getItems = function () {
    return items;
  };

  // 移除
  this.rmove = function (key) {
    items[loseloseHashCode(key)] = undefined;
  };

  // 获取
  this.get = function (key) {
    return items[loseloseHashCode(key)];
  };

  // djb2HashCode
};

// 这里会出现hash冲突
// 分离链接法
// 线性探查法

let HashTable = function () {
  let items = [];

  // 通过ascII码转换
  let loseloseHashCode = function (key) {
    let hash = 0;
    for (let i = 0; i < key.length; i++) {
      hash += key[i].charCodeAt();
    }
    return hash % 37;
  };

  let Node = function (key, value) {
    this.key = key;
    this.value = value;
  };

  // 添加
  this.put = function (key, value) {
    let position = loseloseHashCode(key);
    if (items[position]) {
      items[position].append(new Node(key, value));
    } else {
      let l = new LikedList();
      items[position] = l;
      items[position].append(new Node(key, value));
    }
  };

  // 获取
  this.getItems = function () {
    return items;
  };

  // 获取
  this.get = function (key) {
    let position = loseloseHashCode(key);
    if (items[position]) {
      // 链表线性查找
      let current = items[position].getHead();
      while (current) {
        if (current.element.key == key) {
          return current.element.value;
        }
        current = current.next;
      }
    } else {
      return undefined;
    }
  };

  this.rmove = function (key) {
    let position = loseloseHashCode(key);
    if (items[position]) {
      let current = items[position].getHead();
      while (current) {
        if (current.element.key == key) {
          items[position].rmove(current.element);
          if (items[position].isEmpty()) {
            items[position] = undefined;
          }
          return true;
        }
        current = current.next;
      }
    } else {
      return false;
    }
  };

  // djb2HashCode
};

// 线性探查法

let HashTable3 = function () {
  let table = [];

  // 通过ascII码转换
  let loseloseHashCode = function (key) {
    let hash = 0;
    for (let i = 0; i < key.length; i++) {
      hash += key[i].charCodeAt();
    }
    return hash % 37;
  };

  let Node = function (key, value) {
    this.key = key;
    this.value = value;
  };

  this.put = function (key, value) {
    let position = loseloseHashCode(key);
    if (table[position] == undefined) {
      table[position] = new Node(key, value);
    } else {
      // 如果当前值已经存有值了,则接着往下存储
      let index = position + 1;
      while (table[index] !== undefined) {
        index++;
      }
      table[index] = new Node(key, value);
    }
  };
  this.get = function () {};
  this.rmove = function () {};
};

function djb2HashCode(key) {
  let hash = 5381;
  for (let i = 0; i < key.length; i++) {
    hash = hash * 33 + key[i].charCodeAt();
  }
  return hash % 1013;
}