หัวข้อ: เทคนิคการเขียนโค้ดเพื่อการจัดการข้อมูลในภาษา TypeScript โดยใช้ Linear Probing Hashing
เมื่อพูดถึงโครงสร้างข้อมูลที่สามารถเข้าถึงอย่างรวดเร็วผ่าน key-value pairs, hash tables ก็คือตัวเลือกที่หลายคนนึกถึงเป็นอันดับแรก และเมื่อมันมาถึงการจัดการการชนของค่า hash (collision), เทคนิค Linear Probing คือหนึ่งในวิธีที่ใช้งานได้ดีและเข้าใจง่าย ในบทความนี้ เราจะสำรวจเทคนิคการเขียนโค้ดโดยใช้เทคนิค Linear Probing Hashing ในภาษา TypeScript ซึ่งเป็นภาษาที่เป็นที่นิยมสำหรับการพัฒนาโปรแกรมที่มีโครงสร้างใหญ่และซับซ้อน
Linear Probing คือเทคนิคหนึ่งของ Open Addressing ซึ่งเป็นการจัดการกับ collision โดยการค้นหาช่องว่างถัดไปใน hash table เมื่อเกิดการชน หากข้อมูลใหม่มี hash key ที่ชนกับข้อมูลที่มีอยู่แล้วในตาราง เราจะทำการเลื่อนไปจุดถัดไปในลำดับจนกว่าจะพบช่องว่าง และนี่คือจุดเด่นของ Linear Probing คือง่ายต่อการเขียนโค้ดและเข้าใจการทำงาน
TypeScript เองก็มีอาร์เรย์และโครงสร้างข้อมูลที่ต้องการสำหรับการสร้าง hash table ได้อย่างง่ายดาย ในหัวข้อต่อไปนี้เราจะดูตัวอย่างโค้ดสำหรับการ insert, update, find และ delete:
Insert ข้อมูล
การ `insert` ข้อมูลใน hash table ที่ใช้ Linear Probing เริ่มต้นด้วยการคำนวณ hash key แล้วใส่ข้อมูลตามลำดับในช่องว่างแรกที่พบ:
class HashTable {
private table: (T | undefined)[] = [];
private size: number = 0;
constructor(private capacity: number = 10) {
this.table = new Array(this.capacity);
}
private hash(key: string): number {
// อธิบาย: ใช้ฟังก์ชัน hash ง่ายๆ ตามขนาดของตาราง
let hash = key.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0);
return hash % this.capacity;
}
public insert(key: string, value: T): void {
let index = this.hash(key);
while(this.table[index] !== undefined) {
index = (index + 1) % this.capacity;
}
this.table[index] = value;
this.size++;
}
// ... รอรหัสสำหรับ update, find และ delete ...
}
Update ข้อมูล
การ `update` ข้อมูลใน hash table คล้ายคลึงกับการ insert แต่เราจะต้องค้นหา key ที่มีอยู่ในตารางก่อน:
public update(key: string, value: T): void {
let index = this.hash(key);
while(this.table[index] !== undefined && this.table[index] !== value) {
index = (index + 1) % this.capacity;
}
if(this.table[index] === value) {
this.table[index] = value;
} else {
throw new Error('Key not found for update');
}
}
Find ข้อมูล
การ `find` หรือค้นหาข้อมูลก็คือการค้นหา hash key และทำการตรวจสอบข้อมูลภายในช่องที่อ้างอิงจาก key นั้น:
public find(key: string): T | undefined {
let index = this.hash(key);
while(this.table[index] !== undefined) {
if(this.table[index] === key) {
return this.table[index];
}
index = (index + 1) % this.capacity;
}
return undefined;
}
Delete ข้อมูล
การ `delete` หรือลบข้อมูลจะทำงานโดยการค้นหา key และเคลียร์ข้อมูลในช่องนั้น:
public delete(key: string): boolean {
let index = this.hash(key);
while(this.table[index] !== undefined) {
if(this.table[index] === key) {
delete this.table[index];
this.size--;
return true;
}
index = (index + 1) % this.capacity;
}
return false;
}
ข้อดี
ของการใช้ Linear Probing คือขั้นตอนการทำงานที่ง่ายต่อการปรับใช้และเข้าใจ นอกจากนี้ยังไม่ต้องใช้พื้นที่เพิ่มเติมสำหรับการจัดเก็บข้อมูลนอกจากตารางหลักข้อเสีย
คืออาจเกิดขึ้นที่เรียกว่า "clustering" คือหากมีการชนที่มีหลายๆ ครั้งติดต่อกัน การค้นหาและลบข้อมูลอาจใช้เวลานานขึ้น เนื่องจากต้อง scan ผ่านช่องว่างที่ถูกจองเป็นลำดับ เพื่อค้นหาช่องว่างที่ต้องการในการเขียนโค้ดด้านข้างต่างๆที่เชื่อมต่อกับเรื่องราวความรู้นี้ที่ EPT (Expert-Programming-Tutor), สถาบันการศึกษาทางด้านโปรแกรมมิ่งที่พวกเราพร้อมเสมอที่จะช่วยคุณเรียนรู้และพัฒนาให้ก้าวหน้าในจุดที่คุณอยากปรับปรุง ไม่ว่าจะเป็นการเรียนรู้หลักการพื้นฐาน, เทคนิคการเขียนโค้ดที่เจาะจง, หรือการสร้าง hash table ที่มีประสิทธิภาพ ที่ EPT เรามีหลักสูตรและผู้เชี่ยวชาญที่พร้อมจะนำพาคุณไปสู่ความเป็นมืออาชีพในโลกแห่งการเขียนโปรแกรม ติดต่อเราวันนี้เพื่อเริ่มต้นการเรียนรู้ที่ไม่มีขีดจำกัด!
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM