ในโลกของโปรแกรมมิ่ง การจัดการข้อมูลถือเป็นหัวใจสำคัญ ยิ่งโค้ดที่เขียนได้ดีและมีประสิทธิภาพ การเข้าถึงและการจัดการข้อมูลก็ยิ่งรวดเร็วและแม่นยำ เทคนิคการจัดการข้อมูลหนึ่งที่เป็นที่นิยมในภาษา C คือการใช้แฮช (Hash) เพื่อค้นหาข้อมูลให้เร็วที่สุด แฮชแมปนี้มักจะใช้ในการทำการค้นหา, การเพิ่ม, และการลบข้อมูลด้วยวิธีที่เรียกว่า Hashing ซึ่งจะทำให้เหล่านี้เกิดขึ้นในเวลาเฉลี่ยที่ค่อนข้างคงที่ O(1) ไม่ว่าจะมีขนาดของข้อมูลมากเพียงใด
โครงสร้างของ Hash Table ประกอบด้วยการใช้ค่าแฮชเพื่อกำหนด Index ที่เก็บข้อมูลในอาร์เรย์ นอกจากนี้ยังสามารถจัดการกับปัญหาที่เรียกว่า Collision ซึ่งเกิดจากการที่แฮชฟังก์ชันผลิตค่าแฮชเดียวกันสำหรับข้อมูลต่างๆ
ก่อนที่เราจะดำเนินการใดๆ เราต้องกำหนดโครงสร้างพื้นฐานของ Hash Table และ Node ที่ประกอบด้วยข้อมูลและตัวชี้ pointer:
#include
#include
// กำหนดโครงสร้าง node
typedef struct node {
int key;
struct node *next;
} Node;
// กำหนดขนาดของ Hash Table
#define TABLE_SIZE 10
// กำหนดโครงสร้าง Hash Table ที่มีฟังก์ชัน insert, insertAtFront, find และ delete
typedef struct hashTable {
Node *list[TABLE_SIZE];
} HashTable;
// ฟังก์ชันแฮชที่ค่อนข้างง่าย อาจจะมีการชนกัน (collision)
unsigned int hash(int key) {
return key % TABLE_SIZE;
}
// กำหนดฟังก์ชันต่างๆ ที่เกี่ยวข้องกับ Hash Table
void insert(HashTable *table, int key) {
// นี่คือฟังก์ชันสำหรับการเพิ่มข้อมูล
}
void insertAtFront(HashTable *table, int key) {
// นี่คือฟังก์ชันสำหรับการเพิ่มข้อมูลไปยังหน้าสุด
}
Node* find(HashTable *table, int key) {
// นี่คือฟังก์ชันสำหรับการค้นหา node
}
void delete(HashTable *table, int key) {
// นี่คือฟังก์ชันสำหรับการลบ node
}
การใช้งานฟังก์ชันแต่ละอย่างจะมีขั้นตอนดังนี้:
การเพิ่มข้อมูล (Insert)
การเพิ่มข้อมูลเข้าไปใน Hash Table ต้องใช้ฟังก์ชันแฮชเพื่อค้นหา Index ที่เหมาะสมแล้วเพิ่ม node ใหม่เข้าไปในรายการที่ Index นั้น:
void insert(HashTable *table, int key) {
unsigned int index = hash(key);
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->key = key;
newNode->next = table->list[index];
table->list[index] = newNode;
}
การเพิ่มข้อมูลที่หน้าสุด (InsertAtFront)
การเพิ่มข้อมูลที่หน้าสุดเป็นเทคนิคที่ใช้ในกรณีต้องการให้ข้อมูลล่าสุดเป็นข้อมูลแรกที่พบ วิธีการนี้คล้ายกับการเพิ่มข้อมูล แต่จะเพิ่ม node ใหม่ไว้ที่ตำแหน่งแรกของรายการที่ Index ที่ค้นหาได้:
void insertAtFront(HashTable *table, int key) {
unsigned int index = hash(key);
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->key = key;
// ไม่ต้องมีการเลื่อน node เดิม เพราะทำหน้าที่แทน
newNode->next = NULL;
if (table->list[index] == NULL) {
table->list[index] = newNode;
} else {
newNode->next = table->list[index];
table->list[index] = newNode;
}
}
การค้นหา (Find)
การค้นหาข้อมูลภายใน Hash Table จะใช้ฟังก์ชันแฮชเพื่อหา Index จากนั้นเริ่มค้นหาในรายการที่ Index เพื่อหา node ที่มี key ตรงกับที่ต้องการ:
Node* find(HashTable *table, int key) {
unsigned int index = hash(key);
Node *current = table->list[index];
while (current != NULL && current->key != key) {
current = current->next;
}
return current;
}
การลบ (Delete)
การลบข้อมูลจาก Hash Table ทำได้โดยการค้นหา node จาก key และปรับ pointer ของ node ก่อนหน้าเพื่อข้าม node ที่ต้องการลบออกไป:
void delete(HashTable *table, int key) {
unsigned int index = hash(key);
Node *current = table->list[index];
Node *prev = NULL;
while (current != NULL && current->key != key) {
prev = current;
current = current->next;
}
if (current != NULL) {
if (prev != NULL) prev->next = current->next;
else table->list[index] = current->next;
free(current);
}
}
การเรียนรู้การจัดการข้อมูลผ่าน Hash Table ในภาษา C ถือเป็นพื้นฐานที่สำคัญสำหรับนักพัฒนาทุกคน ที่ EPT, Expert-Programming-Tutor, เรามีหลักสูตรและเทคนิคที่ดีที่สุดเพื่อช่วยคุณฝึกฝนและพัฒนาทักษะการเขียนโค้ดของคุณให้เพิ่มศักยภาพ ด้วยการถ่ายทอดจากผู้เชี่ยวชาญและการใช้ตัวอย่างมากมาย เรารับประกันว่าคุณจะต่อยอดทักษะไปสู่ระดับต่อไปได้อย่างมั่นใจ สนใจเรียนรู้โปรแกรมมิ่ง? ติดต่อ EPT เพื่อเริ่มต้นการเดินทางของคุณในโลกแห่งการเขียนโค้ดที่ไม่มีข้อจำกัด!
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM