- vừa được xem lúc

[DSA] Hash table

0 0 2

Người đăng: Tri Lương

Theo Viblo Asia

Giới thiệu

Hash table được sử dụng để lưu cặp key-value, giống như array nhưng key không được sắp xếp. Cho phép truy xuất giá trị nhanh O(1)

Hash table sẽ dùng 1 hàm băm để chuyển đổi key thành một chỉ số trong mảng

Cấu trúc của hash table:

  • Hash function: chuyển key thành một số nguyên index .
  • Array (bucket array): Lưu trữ giá trị tại bị trí được hash.
  • Collision handling: Xử lý trường hợp nhiều key trả về một index :
    • Chaining: nếu hash bị trùng index thì ghi đè lên vị trí index đó, tại vị trí index đó lưu nhiều cặp [key, value]
    • Linear probing: nếu index bị trùng sẽ ghi ở vị trí trống kế tiếp.

Khởi tạo

class HashTable { buckets; size: number; constructor(size = 4) { this.buckets = new Array(size); this.size = size; } _hash(key) { let total = 0; const PRIME = 31; for (let i = 0; i < Math.min(key.length, 100); i++) { const char = key[i]; const value = char.charCodeAt(0) - 96; total = (total * PRIME + value) % this.size; } return total; }
}

Khởi tạo các method

set

 set(key, value) { const index = this._hash(key); if (!this.buckets[index]) { this.buckets[index] = []; } this.buckets[index].push([key, value]); }

get

get(key) { const index = this._hash(key); const bucket = this.buckets[index]; if (bucket) { for (let pair of bucket) { if (pair[0] === key) { return pair[1]; } } } return undefined; }

keys

 keys() { const keys = []; for (let bucket of this.buckets) { if (bucket) { for (let pair of bucket) { keys.push(pair[0]); } } } return keys; }

values

 values() { const values = []; for (let bucket of this.buckets) { if (bucket) { for (let pair of bucket) { values.push(pair[1]); } } } return values; }

Độ phức tạp

Method Big O
Insert O(1)
Deletion O(1)
Access O(1)

Bình luận

Bài viết tương tự

- vừa được xem lúc

[DSA] Linked list

Giới thiệu. Là một kiểu dữ liệu gồm đầu (head), đuôi (tail) và độ dài (length).

0 0 10

- vừa được xem lúc

[DSA] Trees Traversal

Giới thiệu. Trees Traversal (duyệt cây) là cách để lấy tất cả các node của cây.

0 0 7

- vừa được xem lúc

[DSA] Binary Heaps, Priority Queue

Binary Heaps. Giới thiệu.

0 0 7

- vừa được xem lúc

CTDL&GT dễ hiểu: 1. Các bước cơ bản khi tiến hành giải các bài toán tin học

Thức dậy lúc 7h sáng, Sanji bắt đầu công việc nấu ăn thường nhật của mình. Vừa vào bếp, nhìn thấy bãi chiến trường lộn xộn, Sanji biết ngay tối qua Luffy và Usopp đã xỉn quắc cần câu và lục tung tủ lạ

0 0 12

- vừa được xem lúc

CTDL & GT dễ hiểu: 2. Phân tích thời gian thực hiện giải thuật

2.1 Tại sao phải quan tâm thời gian chạy.

0 0 10

- vừa được xem lúc

"Hack" Não Số Lớn Với Digit DP!

Xin chào anh em, những chiến binh thuật toán kiên cường. Phản ứng đầu tiên của nhiều anh em (có cả tôi): "Ối dào, dễ! Quất cái for từ 1 đến 101810^{18}1018 rồi check thôi!".

0 0 13