การจัดการข้อมูลแบบไดนามิคเป็นหนึ่งในความท้าทายสำคัญของการเขียนโปรแกรม และ JavaScript เป็นภาษาโปรแกรมที่มีความยืดหยุ่นสูง สามารถทำงานกับข้อมูลไดนามิคได้อย่างมีประสิทธิภาพ หนึ่งในเทคนิคที่ใช้ในการจัดการข้อมูลที่เปลี่ยนแปลงไปตามเวลาคือการ Hashing โดยเฉพาะการใช้ Seperate Chaining ซึ่งเป็นวิธีการแก้ปัญหาการชนของ key ที่เกิดขึ้นใน Hash Table
การสร้าง Hash Table ด้วยวิธี Separate Chaining ใน JavaScript สามารถทำได้โดยใช้ Array เพื่อเก็บข้อมูล และ Linked List เพื่อจัดการการชนของ key ดังนี้
// สร้างโครงสร้างข้อมูลสำหรับ Node ใน Linked List
class Node {
constructor(key, value, next = null) {
this.key = key;
this.value = value;
this.next = next;
}
}
// สร้างโครงสร้างข้อมูลสำหรับ Hash Table ด้วย Separate Chaining
class HashTable {
constructor(size) {
this.buckets = Array(size);
this.size = size;
}
// ฟังก์ชันหา index ผ่าน hash function
hash(key) {
const hash = [...key].reduce((acc, char) => acc + char.charCodeAt(0), 0);
return hash % this.size;
}
// ฟังก์ชันในการเพิ่มข้อมูลใน Hash Table
insert(key, value) {
const index = this.hash(key);
const newNode = new Node(key, value);
if (!this.buckets[index]) {
this.buckets[index] = newNode;
} else {
let current = this.buckets[index];
while(current.next) {
if (current.key === key) {
current.value = value; // Update existing key
return;
}
current = current.next;
}
current.next = newNode;
}
}
// ฟังก์ชันในการค้นหาข้อมูล
find(key) {
const index = this.hash(key);
let current = this.buckets[index];
while(current) {
if (current.key === key) {
return current.value;
}
current = current.next;
}
return undefined;
}
// ฟังก์ชันในการลบข้อมูล
delete(key) {
const index = this.hash(key);
let current = this.buckets[index];
let prev = null;
while(current) {
if (current.key === key) {
if (prev) {
prev.next = current.next;
} else {
this.buckets[index] = current.next;
}
return true;
}
prev = current;
current = current.next;
}
return false;
}
}
// การใช้งาน Hash Table ด้วย Separate Chaining
const hashTable = new HashTable(10);
hashTable.insert('name', 'John');
hashTable.insert('email', 'john@example.com');
console.log(hashTable.find('email')); // Output: john@example.com
hashTable.delete('name');
- `hash(key)`: เปลี่ยน key เป็น index โดยฟังก์ชัน hash
- `insert(key, value)`: เพิ่มข้อมูลใน Hash Table, หากช่องว่างปล่าวใส่ Node ใหม่, หากมีข้อมูลอยู่แล้วเพิ่มเป็น Linked List
- `find(key)`: ค้นหาข้อมูลโดยใช้ key หากพบคืนค่า value หากไม่พบคืนค่า `undefined`
- `delete(key)`: ลบข้อมูลจาก Hash Table หากข้อมูลชนกันจะไต่ไปเรื่อยๆ จนกว่าจะพบข้อมูลที่ต้องการลบ
ข้อดี
- จัดการกับการชนของ key ได้ดีเยี่ยม
- การเพิ่มหรือลบข้อมูลมีความซับซ้อน O(1) ถ้าไม่มีการชน
- เหมาะกับข้อมูลที่มีขนาดไม่ตายตัวหรืออาจเปลี่ยนแปลงได้
ข้อเสีย
- การใช้งาน memory อาจมากกว่าเนื่องจากต้องเก็บ pointer ใน Linked List
- หากมีการชนของ key สูง อาจทำให้ประสิทธิภาพการค้นหาแย่ลงกลายเป็น O(n)
การทำงานกับข้อมูลแบบไดนามิคใน JavaScript นั้น, การใช้ Separate Chaining Hashing สำหรับ Hash Table เป็นเทคนิคที่น่าสนใจ มันช่วยจัดการกับปัญหาการชนของ key ได้ดีและมีประสิทธิภาพการทำงานที่มั่นคงเมื่อใช้งานอย่างถูกต้อง
นอกจากนี้ที่ EPT (Expert-Programming-Tutor) เรามีหลักสูตรเข้มข้นที่จะส่งเสริมและช่วยให้คุณเข้าใจการใช้งาน JavaScript และโครงสร้างข้อมูลแบบลึกซึ้ง หากคุณสนใจที่จะพัฒนาทักษะการเขียนโค้ด รวมถึงการจัดการกับข้อมูลที่มีความซับซ้อน สมัครเรียนกับเราเพื่อเป็นนักพัฒนาที่เข้มแข็งและมีประสิทธิภาพในสนามการพัฒนาซอฟต์แวร์ในโลกแห่งความจริง.
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM