Tôi có một số dữ liệu, lên đến một triệu và một tỷ bản ghi, mỗi bản ghi được biểu thị bằng bitfield, khoảng 64 bit cho mỗi khóa. Các bit độc lập, bạn có thể tưởng tượng chúng về cơ bản là các bit ngẫu nhiên.Cấu trúc dữ liệu để tìm các phím lân cận với các bit tương tự
Nếu tôi có khóa kiểm tra và tôi muốn tìm tất cả các giá trị trong dữ liệu của tôi bằng cùng một khóa, bảng băm sẽ nhổ ra các giá trị đó rất dễ dàng, trong O (1).
Cấu trúc thuật toán/dữ liệu nào sẽ tìm thấy tất cả các bản ghi hiệu quả nhất tương tự với khóa truy vấn? Ở đây có nghĩa là hầu hết các bit giống nhau, nhưng một số tối thiểu được phép sai. Điều này được đo theo truyền thống bởi Hamming distance., chỉ đếm số bit không khớp. Có hai cách truy vấn này có thể được thực hiện, có thể bằng cách chỉ định tỷ lệ không khớp như "cung cấp cho tôi danh sách tất cả các khóa hiện có có ít hơn 6 bit khác với truy vấn của tôi" hoặc đơn giản là các kết quả phù hợp nhất, như "cung cấp cho tôi danh sách 10.000 khóa có số bit khác nhau thấp nhất từ truy vấn của tôi".
Bạn có thể bị tạm thời chạy đến k-nearest-neighbor algorithms, nhưng ở đây chúng tôi đang nói về các bit độc lập, do đó, dường như các cấu trúc như quadtrees không hữu ích.
Sự cố có thể được giải quyết bằng cách thử nghiệm sức mạnh vũ phu đơn giản một bảng băm cho số lượng bit khác nhau thấp. Nếu chúng ta muốn tìm tất cả các khóa khác nhau một chút so với truy vấn của chúng ta, ví dụ, chúng ta có thể liệt kê tất cả 64 khóa có thể và kiểm tra tất cả chúng. Nhưng điều này phát nổ nhanh chóng, nếu chúng ta muốn cho phép hai bit khác biệt, thì chúng ta phải thăm dò 64 * 63 = 4032 lần. Nó trở nên tồi tệ hơn theo cấp số nhân cho số bit cao hơn.
Vậy có cấu trúc hoặc chiến lược dữ liệu nào khác làm cho loại truy vấn này hiệu quả hơn không? Cơ sở dữ liệu/cấu trúc có thể được xử lý nhiều như bạn muốn, đó là tốc độ truy vấn cần được tối ưu hóa.
Một câu hỏi khác: bạn đã đọc bao nhiêu lần và bạn viết bao nhiêu lần? Nếu bạn viết hiếm khi, bạn có thể muốn làm một số precalculation, nhưng nếu bạn đang đọc và viết liên tục này sẽ không phải là trường hợp. –
@ David, vâng, đó là một cân nhắc quan trọng. Đó là lý do tại sao tôi nói rằng precomputation, ngay cả precompute cường độ cao, là OK .. Tôi đang tìm kiếm để tối ưu hóa tốc độ tra cứu. – SPWorley