2011-11-20 47 views
8

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

  1. 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

+1

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ế. –

Trả lời

3

Xử lý việc tìm kiếm không có khe trống và thay đổi kích thước bàn.

1

Bạn đang thiếu định nghĩa cho Elem. Đó không phải là tầm thường, vì nó phụ thuộc vào việc bạn muốn một chaining hoặc một bảng băm thăm dò.

+0

Xin lỗi, tôi có một định nghĩa mà tôi không cung cấp.Đó là danh sách được liên kết. – Joshua

+0

@Joshua: sau đó phát hiện xung đột, giả sử bạn không muốn lưu trữ các bản sao, chỉ là vấn đề đi bộ danh sách đó. –

0

Hàm băm tạo ra cùng một giá trị cho cùng một dữ liệu. Kiểm tra va chạm của bạn, tuy nhiên, sửa đổi giá trị đó, có nghĩa là giá trị băm không chỉ phụ thuộc vào đầu vào, mà còn trên sự hiện diện của các phần tử khác trong bản đồ băm. Điều này là xấu, vì bạn gần như không bao giờ có thể thực sự truy cập vào phần tử bạn đã đưa vào trước thông qua tên của nó, chỉ thông qua việc lặp qua bản đồ.

Thứ hai, kiểm tra va chạm của bạn dễ bị lỗi tràn/phạm vi, vì bạn chỉ tăng giá trị băm mà không kiểm tra kích thước bản đồ (mặc dù, như tôi đã nói trước đây, bạn thậm chí không nên làm điều này).

+0

Tôi đoán tôi đã không cung cấp đủ thông tin, xin lỗi. Đối tượng tôi băm có một tên riêng và id, vì vậy chúng đều có mặt trong đối tượng. – Joshua

+0

@Joshua: Đó không phải là ý tôi. Trong kiểm tra va chạm của bạn, bạn thay đổi giá trị băm nếu điểm được tính của bạn không phải là miễn phí (và miễn là vị trí tiếp theo không phải là miễn phí quá). Điều này có nghĩa là, tùy thuộc vào tải của bản đồ băm, với cùng kích thước mảng, phần tử có thể được chèn vào các vị trí khác nhau nếu phần tử khác được chèn vào trước khi nó tạo ra giá trị băm giống nhau (tức là, khi xảy ra va chạm). Điều này sẽ không cho phép bạn truy cập vào phần tử thông qua cùng một khóa mà bạn đã chèn nó vào. – Xeo

Các vấn đề liên quan