Hướng dẫn javascript hash array - mảng băm javascript

Các bảng Hash là một cấu trúc dữ liệu cho phép bạn tạo một danh sách các giá trị được ghép nối. Sau đó, bạn có thể truy xuất một giá trị nhất định bằng cách sử dụng khóa cho giá trị đó mà bạn đặt vào bảng trước.

Nội phân Chính showShow

  • Cách sử dụng các bảng băm với các lớp đối tượng và bản đồ trong JavaScript
  • Cách thực hiện cấu trúc dữ liệu bảng băm trong JavaScript
  • Cách viết phương thức băm ()
  • Cách ghi phương thức SET ()
  • Cách viết phương thức get ()
  • Cách ghi phương thức Remove ()
  • Cách kiểm tra việc thực hiện bảng băm
  • Cách xử lý chỉ số va chạm
  • Cảm ơn bạn đã đọc hướng dẫn này

Bảng băm biến một phím thành một chỉ mục số nguyên bằng hàm băm và chỉ mục sẽ quyết định nơi lưu trữ cặp khóa/giá trị trong bộ nhớ:

Hướng dẫn javascript hash array - mảng băm javascript

Bảng băm để lưu trữ danh bạ điện thoại (từ Wikipedia)

Bạn sẽ thường sử dụng bảng băm vì các hoạt động tìm kiếm, chèn và xóa nhanh của nó:

Độ phức tạp về thời gian băm trong ký hiệu lớn o
Thuật toánTrung bìnhTrường hợp xấu nhất
Không gianTrên)Trên)
Tìm kiếmO (1)Trên)
Tìm kiếmO (1)Trên)
Tìm kiếmO (1)Trên)

Tìm kiếm

O (1)

Chèn

Cách sử dụng các bảng băm với các lớp đối tượng và bản đồ trong JavaScript

Xóa bỏ

Nguồn từ Wikipedia

Hướng dẫn này sẽ giúp bạn hiểu việc triển khai bảng băm trong JavaScript cũng như cách bạn có thể xây dựng lớp bảng băm của riêng mình.

Đầu tiên, chúng ta hãy xem các lớp

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
5 và
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6 của JavaScript.

  • Ví dụ phổ biến nhất về bảng băm trong JavaScript là kiểu dữ liệu
    const obj = {};
    obj.name = "Nathan";
    obj.hasOwnProperty = true;
    
    console.log(obj.hasOwnProperty("name")); 
    // Error: obj.hasOwnProperty is not a function
    5, trong đó bạn có thể ghép giá trị thuộc tính của đối tượng với khóa thuộc tính.
  • Trong ví dụ sau, khóa
    const obj = {};
    obj.name = "Nathan";
    obj.hasOwnProperty = true;
    
    console.log(obj.hasOwnProperty("name")); 
    // Error: obj.hasOwnProperty is not a function
    8 được ghép nối với giá trị số điện thoại là
    const obj = {};
    obj.name = "Nathan";
    obj.hasOwnProperty = true;
    
    console.log(obj.hasOwnProperty("name")); 
    // Error: obj.hasOwnProperty is not a function
    9 và khóa
    const collection = new Map();
    
    collection.set("Nathan", "555-0182");
    collection.set("Jane", "555-0182");
    
    console.log(collection.get("Nathan")); // 555-0182
    console.log(collection.size); // 2
    0 được ghép nối với giá trị
    const collection = new Map();
    
    collection.set("Nathan", "555-0182");
    collection.set("Jane", "555-0182");
    
    console.log(collection.get("Nathan")); // 555-0182
    console.log(collection.size); // 2
    1:

Đối tượng

let obj = {
  Nathan: "555-0182",
  Jane: "315-0322"
}
JavaScript là một ví dụ về triển khai bảng băm

Nhưng loại
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
5 của JavaScript là một loại thực hiện bảng băm đặc biệt vì hai lý do:

Nó có các thuộc tính được thêm bởi lớp

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
5. Các khóa của bạn nhập có thể xung đột và ghi đè các thuộc tính mặc định được kế thừa từ lớp.

Kích thước của bảng băm không được theo dõi. Bạn cần đếm thủ công số lượng thuộc tính được định nghĩa bởi lập trình viên thay vì được thừa hưởng từ nguyên mẫu.

Ví dụ: nguyên mẫu

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
5 có phương thức
const collection = new Map();

collection.set("Nathan", "555-0182");
collection.set("Jane", "555-0182");

console.log(collection.get("Nathan")); // 555-0182
console.log(collection.size); // 2
5 cho phép bạn kiểm tra xem thuộc tính không được kế thừa:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
JavaScript đối tượng Phương thức kế thừa Ví dụ cuộc gọi

JavaScript không chặn nỗ lực ghi đè lên phương thức
const collection = new Map();

collection.set("Nathan", "555-0182");
collection.set("Jane", "555-0182");

console.log(collection.get("Nathan")); // 555-0182
console.log(collection.size); // 2
5, điều này có thể gây ra lỗi như thế này:

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
Thuộc tính di truyền đối tượng JavaScript bị ghi đè

Để xử lý những thiếu sót này, JavaScript đã tạo ra một triển khai khác của cấu trúc dữ liệu bảng Hash được gọi là

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6

Giống như
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
5,
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6 cho phép bạn lưu trữ các cặp giá trị khóa bên trong cấu trúc dữ liệu. Đây là một ví dụ về
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6 trong hành động:

const collection = new Map();

collection.set("Nathan", "555-0182");
collection.set("Jane", "555-0182");

console.log(collection.get("Nathan")); // 555-0182
console.log(collection.size); // 2
JavaScript Lớp bản đồ là một triển khai khác của bảng băm

Không giống như loại

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
5,
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6 yêu cầu bạn sử dụng các phương thức
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
3 và
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
4 để xác định và truy xuất bất kỳ giá trị cặp chính nào mà bạn muốn được thêm vào cấu trúc dữ liệu.

Bạn cũng không thể ghi đè lên các thuộc tính được kế thừa
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6. Ví dụ: mã sau đã cố gắng ghi đè giá trị thuộc tính
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
6 thành
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
7:

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
Map Loại thuộc tính không thể ghi đè

Cách thực hiện cấu trúc dữ liệu bảng băm trong JavaScript

Như bạn có thể thấy từ mã ở trên, bạn không thể thêm một mục nhập mới vào đối tượng

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6 mà không cần sử dụng phương thức
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
3.

Cấu trúc dữ liệu

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6 cũng có thể lặp lại, có nghĩa là bạn có thể lặp lại dữ liệu như sau:

  • const myMap = new Map();
    
    myMap.set("Nathan", "555-0182");
    myMap.set("Jane", "315-0322");
    
    for (let [key, value] of myMap) {
      console.log(`${key} = ${value}`);
    }
    Idering thông qua một đối tượng bản đồ
  • Bây giờ bạn đã học được cách thực hiện các bảng băm JavaScript dưới dạng cấu trúc dữ liệu
    const obj = {};
    obj.name = "Nathan";
    obj.hasOwnProperty = true;
    
    console.log(obj.hasOwnProperty("name")); 
    // Error: obj.hasOwnProperty is not a function
    5 và
    const obj = {};
    obj.name = "Nathan";
    obj.hasOwnProperty = true;
    
    console.log(obj.hasOwnProperty("name")); 
    // Error: obj.hasOwnProperty is not a function
    6, hãy xem cách bạn có thể tạo triển khai bảng băm của riêng mình tiếp theo.
  • Mặc dù JavaScript đã có hai triển khai bảng băm, nhưng việc viết triển khai bảng băm của riêng bạn là một trong những câu hỏi phỏng vấn JavaScript phổ biến nhất.

Bạn có thể triển khai bảng băm trong JavaScript trong ba bước:

Tạo một lớp
const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3 với các thuộc tính ban đầu
const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
4 và
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
6

Thêm hàm

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
6 để chuyển đổi các phím thành các chỉ số

Cách viết phương thức băm ()

Thêm các phương thức

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
3 và
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
4 để thêm và truy xuất các cặp khóa/giá trị từ bảng.

Được rồi, hãy bắt đầu với việc tạo lớp

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3. Mã bên dưới sẽ tạo ra một thùng
const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
4 với kích thước
class HashTable {
  constructor() {
    this.table = new Array(127);
    this.size = 0;
  }
}
1:

_hash(key) {
  let hash = 0;
  for (let i = 0; i < key.length; i++) {
    hash += key.charCodeAt(i);
  }
  return hash;
}

Nhưng vì lớp

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3 chỉ có 127 thùng, điều này có nghĩa là phương thức
class HashTable {
  constructor() {
    this.table = new Array(127);
    this.size = 0;
  }
}
8 phải trả về một số giữa
class HashTable {
  constructor() {
    this.table = new Array(127);
    this.size = 0;
  }
}
9.

Để đảm bảo rằng giá trị băm không vượt quá kích thước xô, bạn cần sử dụng toán tử modulo như được hiển thị bên dưới:

_hash(key) {
  let hash = 0;
  for (let i = 0; i < key.length; i++) {
    hash += key.charCodeAt(i);
  }
  return hash % this.table.length;
}

Bây giờ bạn đã hoàn thành phương thức

class HashTable {
  constructor() {
    this.table = new Array(127);
    this.size = 0;
  }
}
8, đã đến lúc viết các phương thức
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
3 và
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
4.

Cách ghi phương thức SET ()

Để đặt cặp khóa/giá trị trong bảng băm của bạn, bạn cần ghi một phương thức

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
3 chấp nhận & nbsp; ________ 74 làm tham số của nó:

  • Phương thức
    const collection = new Map();
    
    collection.set("Nathan", "555-0182");
    collection["size"] = false;
    
    console.log(collection.get("size")); // undefined
    console.log(collection.size); // 1
    3 sẽ gọi phương thức
    class HashTable {
      constructor() {
        this.table = new Array(127);
        this.size = 0;
      }
    }
    8 để nhận giá trị
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash;
    }
    7.
  • Cặp
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash;
    }
    8 sẽ được gán cho
    const myMap = new Map();
    
    myMap.set("Nathan", "555-0182");
    myMap.set("Jane", "315-0322");
    
    for (let [key, value] of myMap) {
      console.log(`${key} = ${value}`);
    }
    4 tại
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash;
    }
    7 được chỉ định
  • Sau đó, thuộc tính
    const collection = new Map();
    
    collection.set("Nathan", "555-0182");
    collection["size"] = false;
    
    console.log(collection.get("size")); // undefined
    console.log(collection.size); // 1
    6 sẽ được tăng lên bởi một
set(key, value) {
  const index = this._hash(key);
  this.table[index] = [key, value];
  this.size++;
}

Bây giờ phương thức

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
3 đã hoàn tất, hãy viết phương thức
const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
4 để lấy một giá trị bằng khóa của nó.

Cách viết phương thức get ()

Để nhận được một giá trị nhất định từ bảng băm, bạn cần ghi một phương thức

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
4 chấp nhận giá trị
class HashTable {
  constructor() {
    this.table = new Array(127);
    this.size = 0;
  }
}
4 làm tham số của nó:

  • Phương thức sẽ gọi phương thức
    class HashTable {
      constructor() {
        this.table = new Array(127);
        this.size = 0;
      }
    }
    8 để một lần nữa truy xuất bảng
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash;
    }
    7
  • Trả lại giá trị được lưu trữ tại
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash % this.table.length;
    }
    8
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
0

Bằng cách này, phương thức

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
4 sẽ trả về cặp khóa/giá trị trở lại hoặc
set(key, value) {
  const index = this._hash(key);
  this.table[index] = [key, value];
  this.size++;
}
0 khi không có cặp khóa/giá trị được lưu trữ trong
_hash(key) {
  let hash = 0;
  for (let i = 0; i < key.length; i++) {
    hash += key.charCodeAt(i);
  }
  return hash;
}
7 được chỉ định.

Càng xa càng tốt. Hãy thêm một phương thức khác để xóa cặp khóa/giá trị khỏi bảng băm tiếp theo.

Cách ghi phương thức Remove ()

Để xóa một cặp khóa/giá trị khỏi bảng băm, bạn cần ghi một phương thức

set(key, value) {
  const index = this._hash(key);
  this.table[index] = [key, value];
  this.size++;
}
2 chấp nhận giá trị
class HashTable {
  constructor() {
    this.table = new Array(127);
    this.size = 0;
  }
}
4 làm tham số của nó:

  • Truy xuất đúng
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash;
    }
    7 bằng phương pháp
    class HashTable {
      constructor() {
        this.table = new Array(127);
        this.size = 0;
      }
    }
    8
  • Kiểm tra xem
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash % this.table.length;
    }
    8 có giá trị sự thật không và thuộc tính
    set(key, value) {
      const index = this._hash(key);
      this.table[index] = [key, value];
      this.size++;
    }
    7 lớn hơn 0. Chỉ định giá trị
    set(key, value) {
      const index = this._hash(key);
      this.table[index] = [key, value];
      this.size++;
    }
    0 cho bên phải
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash;
    }
    7 và giảm thuộc tính
    const collection = new Map();
    
    collection.set("Nathan", "555-0182");
    collection["size"] = false;
    
    console.log(collection.get("size")); // undefined
    console.log(collection.size); // 1
    6 cho một nếu là.
  • Nếu không, chỉ cần trả lại
    const collection = new Map();
    
    collection.set("Nathan", "555-0182");
    collection["size"] = false;
    
    console.log(collection.get("size")); // undefined
    console.log(collection.size); // 1
    7
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
1

Với điều đó, bây giờ bạn có một phương pháp

set(key, value) {
  const index = this._hash(key);
  this.table[index] = [key, value];
  this.size++;
}
2 hoạt động. Hãy xem liệu lớp
const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3 có hoạt động đúng không.

Cách kiểm tra việc thực hiện bảng băm

Đã đến lúc kiểm tra việc thực hiện bảng băm. Đây là mã đầy đủ cho việc triển khai bảng băm một lần nữa:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
2 Triển khai Hashtable trong JavaScript

Để kiểm tra lớp

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3, tôi sẽ tạo một thể hiện mới của
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
05 và đặt một số cặp khóa/giá trị như hình dưới đây. Các cặp khóa/giá trị dưới đây chỉ là các giá trị số tùy ý được ghép nối với tên quốc gia mà không có bất kỳ ý nghĩa đặc biệt nào:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
3Testing set set () Phương thức

Sau đó, chúng ta hãy cố gắng truy xuất chúng bằng phương pháp

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
4:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
4Testing Hashtable Get () Phương thức

Cuối cùng, chúng ta hãy cố gắng xóa một trong những giá trị này bằng phương thức

set(key, value) {
  const index = this._hash(key);
  this.table[index] = [key, value];
  this.size++;
}
2:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
5 Thử nghiệm Hashtable Remove () Phương thức

Được rồi, tất cả các phương pháp đang hoạt động như mong đợi. Hãy thử một lần chèn khác với một thể hiện

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3 mới và truy xuất các giá trị đó:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
6Hash Chỉ số bảng va chạm & NBSP;

Ối! Có vẻ như chúng tôi đã gặp một số rắc rối ở đây. 😨

Cách xử lý chỉ số va chạm

Đôi khi, hàm băm trong bảng băm có thể trả về cùng số

_hash(key) {
  let hash = 0;
  for (let i = 0; i < key.length; i++) {
    hash += key.charCodeAt(i);
  }
  return hash;
}
7. Trong trường hợp thử nghiệm ở trên, chuỗi
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
10 và
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
11 đều trả về cùng một giá trị
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
12 vì số
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
13 là tổng của cả hai mã ASCII của chúng.both return the same
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
12 value
because the number
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
13 is the sum of both of their ASCII code.

Giá trị

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
12 tương tự sẽ khiến chỉ số va chạm, ghi đè mục nhập trước đó với mục mới.

Ngay bây giờ, dữ liệu được lưu trữ trong triển khai bảng băm của chúng tôi trông như sau:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
7

Để xử lý va chạm số

_hash(key) {
  let hash = 0;
  for (let i = 0; i < key.length; i++) {
    hash += key.charCodeAt(i);
  }
  return hash;
}
7, bạn cần lưu trữ cặp khóa/giá trị trong một mảng thứ hai để kết quả cuối cùng trông như sau:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
8

Để tạo mảng thứ hai, bạn cần cập nhật phương thức

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
3 để nó sẽ:

  • Nhìn vào
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash % this.table.length;
    }
    8 và lặp qua các giá trị mảng.
  • Nếu khóa tại một trong các mảng bằng với
    class HashTable {
      constructor() {
        this.table = new Array(127);
        this.size = 0;
      }
    }
    4 được truyền vào phương thức, hãy thay thế giá trị tại INDEX
    const obj = {};
    obj.name = "Nathan";
    
    console.log(obj.hasOwnProperty("name")); // true
    19 và dừng bất kỳ thực thi nào thêm bằng câu lệnh
    const obj = {};
    obj.name = "Nathan";
    
    console.log(obj.hasOwnProperty("name")); // true
    20.
  • Nếu không tìm thấy
    class HashTable {
      constructor() {
        this.table = new Array(127);
        this.size = 0;
      }
    }
    4 phù hợp, hãy đẩy một mảng khóa và giá trị mới vào mảng thứ hai.
  • Khác, khởi tạo một mảng mới và đẩy cặp khóa/giá trị vào
    _hash(key) {
      let hash = 0;
      for (let i = 0; i < key.length; i++) {
        hash += key.charCodeAt(i);
      }
      return hash;
    }
    7 được chỉ định
  • Bất cứ khi nào một phương thức
    const obj = {};
    obj.name = "Nathan";
    
    console.log(obj.hasOwnProperty("name")); // true
    23 được gọi, hãy tăng thuộc tính
    const collection = new Map();
    
    collection.set("Nathan", "555-0182");
    collection["size"] = false;
    
    console.log(collection.get("size")); // undefined
    console.log(collection.size); // 1
    6 lên một.

Mã phương thức

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
3 hoàn chỉnh sẽ như sau:

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
9

Tiếp theo, cập nhật phương thức

const collection = new Map();

collection.set("Nathan", "555-0182");
collection["size"] = false;

console.log(collection.get("size")); // undefined
console.log(collection.size); // 1
4 để nó cũng sẽ kiểm tra mảng cấp hai bằng vòng lặp
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
27 và trả về cặp khóa/giá trị phù hợp:

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
0

Cuối cùng, bạn cần cập nhật phương thức

set(key, value) {
  const index = this._hash(key);
  this.table[index] = [key, value];
  this.size++;
}
2 để nó sẽ lặp qua mảng cấp hai và xóa mảng bằng giá trị
class HashTable {
  constructor() {
    this.table = new Array(127);
    this.size = 0;
  }
}
4 bên phải bằng phương thức
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
30:

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
1

Với điều đó, lớp

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3 của bạn sẽ có thể tránh được bất kỳ va chạm số chỉ mục nào và lưu trữ cặp khóa/giá trị bên trong mảng cấp hai.

Như một phần thưởng, hãy thêm một phương thức

const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
32 sẽ hiển thị tất cả các cặp khóa/giá trị được lưu trữ trong bảng băm. Bạn chỉ cần sử dụng phương thức
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
33 để lặp qua bảng và
const obj = {};
obj.name = "Nathan";

console.log(obj.hasOwnProperty("name")); // true
34 Các giá trị cho một chuỗi như hình dưới đây:

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
2

Đây là mã lớp

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3 hoàn chỉnh một lần nữa với việc tránh va chạm được áp dụng cho tài liệu tham khảo của bạn:

Triển khai lớp Hashtable ____23Complete

Bạn có thể kiểm tra việc thực hiện bằng cách tạo một thể hiện

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3 mới và thực hiện một số chèn và xóa:

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
4 Một bài kiểm tra hashtable

Bây giờ không có sự va chạm trong trường hợp

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3. Công việc tuyệt vời!

Sự kết luận

Trong hướng dẫn này, bạn đã học được bảng băm là gì và JavaScript sử dụng nó như thế nào để tạo cấu trúc dữ liệu

const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
5 và
const obj = {};
obj.name = "Nathan";
obj.hasOwnProperty = true;

console.log(obj.hasOwnProperty("name")); 
// Error: obj.hasOwnProperty is not a function
6.

Bạn cũng đã học được cách thực hiện lớp

const myMap = new Map();

myMap.set("Nathan", "555-0182");
myMap.set("Jane", "315-0322");

for (let [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
3 của riêng bạn cũng như cách ngăn các chỉ số chính của bảng Hash va chạm bằng cách sử dụng kỹ thuật chuỗi.

Bằng cách sử dụng cấu trúc dữ liệu bảng băm, bạn sẽ có thể tạo một mảng kết hợp với các hoạt động tìm kiếm, chèn và xóa nhanh. 😉

Cảm ơn bạn đã đọc hướng dẫn này

Nếu bạn muốn tìm hiểu thêm về JavaScript, bạn có thể muốn xem trang web của tôi tại Sebhastian.com, nơi tôi đã xuất bản hơn 100 hướng dẫn về lập trình với JavaScript, tất cả đều sử dụng các giải thích dễ hiểu và ví dụ về mã.

Các hướng dẫn bao gồm thao tác chuỗi, thao tác ngày, phương thức mảng và đối tượng, các giải pháp thuật toán JavaScript và nhiều hơn nữa.

Học mã miễn phí. Chương trình giảng dạy nguồn mở của Freecodecamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu