Tìm tất cả các cặp giá trị gần với khoảng cách Hamming


11

Tôi có một vài triệu giá trị 32 bit. Đối với mỗi giá trị, tôi muốn tìm tất cả các giá trị khác trong khoảng cách hãm là 5. Trong cách tiếp cận ngây thơ, điều này đòi hỏi so sánh , điều mà tôi muốn tránh.O(N2)

Tôi nhận ra rằng nếu tôi chỉ coi các giá trị 32 bit này là số nguyên và sắp xếp danh sách một lần, thì các giá trị chỉ khác nhau ở các bit có ý nghĩa nhỏ nhất đã kết thúc rất gần nhau. Điều này cho phép tôi có một "cửa sổ" ngắn hơn hoặc một dãy số trong đó tôi có thể thực hiện các so sánh cặp thực tế cho khoảng cách hãm chính xác. Tuy nhiên, khi 2 giá trị chỉ khác nhau ở các bit thứ tự cao hơn, thì chúng sẽ nằm ngoài "cửa sổ" này và xuất hiện ở hai đầu đối diện của danh sách được sắp xếp. Ví dụ

11010010101001110001111001010110

01010010101001110001111001010110

sẽ cách nhau rất xa, mặc dù khoảng cách hãm của chúng là 1. Vì, khoảng cách hãm giữa 2 giá trị được giữ nguyên khi cả hai được xoay, tôi nhận ra rằng bằng cách thực hiện 32 lần xoay trái và sau đó sắp xếp danh sách mỗi lần, có khả năng là 2 giá trị sẽ kết thúc đủ gần trong danh sách được sắp xếp trong ít nhất một trong số họ.

  1. Mặc dù phương pháp này mang lại cho tôi kết quả tốt, tôi đang đấu tranh để chính thức thiết lập tính đúng đắn của phương pháp này.

  2. Cho rằng tôi đang tìm kiếm các giá trị khớp có khoảng cách hoặc ít hơn, tôi có thực sự cần phải thực hiện tất cả các phép quay 32 bit không? Ví dụ: nếu và kích thước cửa sổ của tôi là 1000, tôi cần thực hiện ở mức xoay tối đa 24 bit vì ngay cả khi bit đi lạc xuất hiện ở bất kỳ 8 bit thứ tự thấp hơn, các số kết quả sẽ không khác nhau hơn 1000.k = 1kk=1


Chỉ là những ý tưởng từ 20 giây suy nghĩ: Thế còn một loại sắp xếp theo Gray-Code? Còn việc chia danh sách bitmap 32 bit thành bốn danh sách bitmap 8 bit và sau đó sử dụng kỹ thuật của bạn thì sao?
Karl Damgaard Asmussen

1
Bạn có thể chính xác hơn về số lượng bitmap rất lớn? Nó gần với , hay sao? 2 30220230
tối thiểu

@minar: Tôi có 3-4 triệu bitmap 32 bit như vậy.
karterk

Tôi không chắc chắn những gì bạn đang hỏi. Bạn có nói rằng bạn có một mảng gồm các chuỗi Boolean 32 chữ cái (lớn nhưng không chứa tất cả chuỗi có thể) và bạn muốn đánh dấu các cặp có khoảng cách Hamming nhiều nhất là 5 cách, có lẽ bằng cách tạo một danh sách liên kết các chỉ số của hàng xóm gần cho mỗi chuỗi ? 4 × 10 9 iA[i]4×109A[i].closei
András Salamon

nghĩ rằng có một khái niệm tương tự về "tứ giác" ngoại trừ với hypercubes được áp dụng. thuật toán định vị & đệ quy định vị các vectơ trong hypercubes, và sau đó khi bạn muốn tìm kiếm các bitvector "gần đó", bạn chỉ tìm kiếm các hypercub "gần đó". nghi ngờ nó có thể được nghiên cứu & trong một bài báo ở đâu đó .... không chắc chắn các điều khoản chính xác ....
vzn

Câu trả lời:


9

Như đã nêu, cách tiếp cận của bạn có vấn đề, bởi vì nếu 2 bitmap có sự khác biệt cách đều nhau thì trong bất kỳ vòng quay nào, sẽ có sự khác biệt trên một số bit thứ tự cao.

Bạn có thể khái quát cách tiếp cận của mình bằng cách hoán vị vị trí bit theo cách phức tạp hơn. Thật vậy, nếu bạn chọn một hoán vị bit ngẫu nhiên, thì tất cả sự khác biệt giữa 2 bitmap với khoảng cách sẽ xuất hiện trong 16 bit thứ tự thấp với xác suất tốt hơn . Vì vậy, lặp lại vài trăm lần bạn sẽ tìm thấy một tỷ lệ rất lớn của các cặp bitmap của bạn. Đối với mỗi thử nghiệm, số lượng cặp cần kiểm tra (có cùng 16 bit cao) gần bằng (đối với ).1 / 50 64 N N 2 2251/5064NN222

Tuy nhiên, tôi cũng sẽ thử cách tiếp cận sau. Xây dựng một danh sách các bitmap của bạn được sửa đổi ở tối đa 2 vị trí bit và sắp xếp danh sách này. Nếu có va chạm trong danh sách này, bạn có hai bitmap trong khoảng cách . Sau đó liệt kê tất cả các giá trị của bitmap ban đầu của bạn đã sửa đổi ba vị trí và tìm kiếm chúng trong danh sách để tìm các cặp bitmap ở khoảng cách . Chi phí bộ nhớ của phương pháp này đòi hỏi lưu trữ yếu tố và số lượng các yếu tố để tìm kiếm trong giai đoạn thứ hai là .5 529 N 4960 N45529N4960N


Thông tin thêm:

  1. Xác suất có khác biệt nằm ở bit thứ tự thấp sau khi hoán vị ngẫu nhiên các vị trí bit chỉ là thương số của hai nhị thức: 16 3251632
    (165)(325)0.0217
  2. Xây dựng danh sách, cho mỗi phần tử trong danh sách gốc, đưa vào danh sách tăng thêm: chính phần tử, tất cả các phần tử khác nhau ở một vị trí và tất cả các phần tử khác nhau ở hai vị trí (giữ thông tin về phần tử gốc). Số lượng bản sao cho mỗi phần tử làBất kỳ va chạm nào trong danh sách này (được phát hiện sau khi sắp xếp) tương ứng với hai phần tử gốc ở khoảng cách tối đa là . Lưu ý rằng mỗi cặp có thể được phát hiện nhiều lần, do đó bạn sẽ cần xóa các bản sao (nhưng điều này đã xảy ra với thuật toán ban đầu của bạn).1+32+(322)=529.4
  3. Đối với lần vượt qua cuối cùng, tốt hơn là nên cắt bớt danh sách các phần tử tăng thêm để chỉ giữ những phần tử ở khoảng cách chính xác từ phần tử ban đầu của chúng. Sau đó, với mỗi phần tử gốc, hãy tạo phần tử ở khoảng cách và tìm kiếm chúng trong danh sách tăng. Một lần nữa, bạn cần xóa các bản sao vì mỗi cặp sẽ được phát hiện lần. [Nếu được chăm sóc thêm, có lẽ bạn có thể dự đoán / tránh hầu hết các bản sao nhưng tôi không chắc liệu nó có đáng để nỗ lực hay không.]2(323)=49603(53)=10

Đối với cách tiếp cận đầu tiên, bạn có nói rằng tôi hoán vị bitmap trong một số đơn đặt hàng được xác định trước thay vì chỉ thực hiện các phép quay bit? Bạn có thể vui lòng giải thích làm thế nào bạn có xác suất 1/50? Ngoài ra, đối với cách tiếp cận thứ hai, tôi có cần xây dựng một chỉ mục của danh sách của mình trước và sau đó cho mọi kết hợp tạo phần tử (32C1 + 32C2) và kiểm tra chúng theo chỉ số này để xác định tất cả các bitmap khác nhau bởi khoảng cách 2 không? Sẽ thật tuyệt nếu bạn có thể giải thích điều này hơn nữa. Cảm ơn.
karterk

5

Câu trả lời của minar là tuyệt vời và có lẽ là cách tiếp cận đúng cho vấn đề cụ thể này. Tuy nhiên, tôi sẽ đề cập đến một cách tiếp cận khả thi hơn:

Bạn có thể sử dụng hàm băm nhạy cảm cục bộ (LSH). Hàm băm nhạy cảm cục bộ được thiết kế sao cho nếu ở gần khoảng cách Hamming thì . Nếu bạn có hàm băm như vậy , thì bạn có thể lưu trữ tất cả các giá trị của mình vào bảng băm (sử dụng hàm băm và băm mở), sau đó bạn sẽ nhanh chóng có thể tìm thấy tất cả các cặp giá trị ở gần khoảng cách Hamming . Có nhiều kỹ thuật khác nhau để xây dựng LSH; bạn có thể nhìn vào tài liệu tham khảo về chủ đề này để tìm một vài ứng cử viên.Hx,yH(x)=H(y)HH

Điều đó nói rằng, đối với vấn đề cụ thể của bạn (với các tham số cụ thể mà bạn đã đề cập), tôi hy vọng hai thuật toán của minar sẽ chứng minh là tốt hơn trong thực tế so với bất kỳ sơ đồ dựa trên LSH nào. Tôi chỉ đề cập đến vấn đề này trong trường hợp những độc giả khác đến đây với câu hỏi tương tự, nhưng với các thông số khác nhau, trong đó LSH có thể có ý nghĩa hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.