Tìm kiếm phần tử trong bảng băm là một thao tác quan trọng trong nhiều ứng dụng lập trình, bao gồm cả việc quản lý cơ sở dữ liệu, hệ thống caching, và nhiều hơn nữa. Trong ngôn ngữ C, thư viện chuẩn cung cấp nhiều hàm hữu ích cho việc này và một trong số đó là hsearch(), được định nghĩa trong <search.h>
. Bài viết này sẽ hướng dẫn bạn cách sử dụng hsearch() để tìm kiếm phần tử trong bảng băm đã tạo.
Khởi tạo bảng băm
Trước khi tìm hiểu cách tìm kiếm, chúng ta cần khởi tạo bảng băm. Việc này đã được thực hiện bởi hàm hcreate(size_t nel)
, nơi nel
là số lượng phần tử dự kiến. Ví dụ:
#include <search.h>
#include <stdio.h>
int main() {
if (hcreate(30) == 0) {
fprintf(stderr, "Couldn't create hash table\n");
return 1;
}
return 0;
}
Thêm phần tử vào bảng băm
Sau khi khởi tạo, chúng ta cần thêm các phần tử vào bảng băm. Để làm việc này, ta dùng hàm hsearch(ENTRY item, ACTION action)
. ENTRY
là một cấu trúc bao gồm một con trỏ ký tự tới khoá và một con trỏ chung tới dữ liệu. ACTION
là một liệt kê với hai giá trị có thể là ENTER
(thêm phần tử) hoặc FIND
(tìm kiếm phần tử).
Dưới đây là ví dụ về việc thêm phần tử:
#include <search.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
hcreate(30);
ENTRY e;
ENTRY *ep;
e.key = "name";
e.data = "John Doe";
hsearch(e, ENTER);
e.key = "age";
e.data = "30";
hsearch(e, ENTER);
e.key = "city";
e.data = "New York";
hsearch(e, ENTER);
// Tiếp tục với hsearch FIND bên dưới...
}
Tìm kiếm phần tử
Khi đã có các phần tử trong bảng băm, ta có thể tìm kiếm bất kỳ phần tử nào thông qua hsearch() với hành động FIND
. Chẳng hạn:
// Tiếp theo đoạn mã trên...
e.key = "name";
ep = hsearch(e, FIND);
if (ep != NULL) {
printf("Found %s: %s\n", ep->key, (char *)ep->data);
} else {
printf("Key not found\n");
}
e.key = "city";
ep = hsearch(e, FIND);
if (ep != NULL) {
printf("Found %s: %s\n", ep->key, (char *)ep->data);
} else {
printf("Key not found\n");
}
hdestroy(); // Hủy bảng băm
return 0;
}
Giải thích
Trong đoạn mã trên, chúng ta đã khởi tạo bảng băm, thêm các phần tử bằng cách sử dụng hsearch với hành động ENTER
. Sau đó, để tìm kiếm các phần tử, ta tạo một ENTRY
chứa khoá cần tìm và gọi hsearch với hành động FIND
.
Hàm hsearch trả về con trỏ tới phần tử tìm thấy. Nếu không tìm thấy, nó trả về NULL. Ngoài ra, đừng quên gọi hàm hdestroy()
để giải phóng bộ nhớ mà bảng băm đã sử dụng sau khi hoàn tất các thao tác.
Kết luận
Trong bài viết này, chúng ta đã tìm hiểu cách tạo bảng băm, thêm các phần tử và tìm kiếm các phần tử này bằng hàm hsearch trong ngôn ngữ C. Việc sử dụng đúng cách các hàm này sẽ giúp quản lý dữ liệu của bạn hiệu quả hơn, đặc biệt trong các ứng dụng yêu cầu truy cập nhanh đến các phần tử dữ liệu.
Comments