Tôi muốn đề cập trước khi tiếp tục rằng tôi đã xem xét các câu hỏi khác yêu cầu cùng một điều trên trang web này cũng như trên các trang web khác. Tôi hy vọng rằng tôi có thể nhận được câu trả lời hay, vì mục tiêu của tôi là gấp đôi:Cách tạo bảng băm
- Quan trọng nhất, tôi muốn tìm hiểu cách tạo bảng băm. Thứ hai, tôi thấy rằng rất nhiều câu trả lời trên Stack Overflow có xu hướng giả định một mức độ kiến thức nhất định về một chủ đề mà thường không có, đặc biệt là cho các loại mới hơn. Điều đó đang được nói, tôi hy vọng sẽ chỉnh sửa thông điệp chính của tôi để bao gồm một lời giải thích về quá trình này sâu hơn một chút khi tôi tự tìm ra nó.
Onto quá trình chính:
Như tôi hiểu họ cho đến nay, một bảng băm là một mảng các danh sách (hoặc một cấu trúc dữ liệu tương tự) mà hy vọng sẽ, tối ưu, có càng ít va chạm nhất có thể để bảo toàn sự phức tạp của O (1). Sau đây là quá trình hiện tại của tôi:
Vì vậy, bước đầu tiên của tôi là tạo ra một mảng các con trỏ:
Elem ** table;
table = new Elem*[size];//size is the desired size of the array
bước thứ hai của tôi là tạo ra một hàm băm (một rất đơn giản).
int hashed = 0;
hashed = (atoi(name.c_str()) + id) % size;
//name is a std string, and id is a large integer. Size is the size of the array.
bước thứ ba của tôi sẽ là để tạo ra một cái gì đó để phát hiện va chạm, đó là một phần Tôi hiện tại là.
Dưới đây là một số mã giả:
while(table[hashedValue] != empty)
hashedValue++
else
put in the list at that index.
Đó là tương đối thanh nha, nhưng tôi vẫn còn ở "những gì là thế này" sân khấu. Chịu với tôi.
Còn gì khác không? Tôi đã bỏ lỡ điều gì đó hoặc làm điều gì đó không chính xác?
Cảm ơn
Có vẻ OK, sắp xếp. Giá trị băm chỉ mục vào một mảng cố định, và mỗi phần tử mảng là một danh sách các giá trị thực tế. –