2013-09-27 309 views
11

Tôi có một chuỗi rất dài các bit, được gọi là A và một chuỗi bit ngắn hơn, x. Hai chuỗi bit có cùng độ dài được kết hợp mờ khi sau khi căn chỉnh chúng, có k hoặc ít bit không khớp hơn. Tôi muốn tìm tất cả các lần xuất hiện mờ của x trong phạm vi A.Kết nối bit mờ

Cho đến giờ, tôi đã thử cách tiếp cận ngây thơ. Lặp qua A, sau đó cho mỗi bit, lặp qua chiều dài của x, đếm số bit không khớp bắt đầu từ vị trí đó trong A và nếu nó không vượt quá k, hãy báo cáo vị trí đó. Thuật toán này không hiệu quả. Nếu A có bit n_A và x có bit n_x, thời gian chạy là O(n_A * n_x).

Tôi được thông báo rằng điều này có thể được thực hiện trong O(n_A * log(n_A)) bất kể k. Gợi ý được cung cấp là sử dụng biến đổi Fourier nhanh. Hãy nhớ rằng cho hai đầu vào enter image description hereenter image description here, chập sản xuất enter image description here nơi

qqn

tương tự với phép nhân đa thức. Nó không rõ ràng với tôi làm thế nào để sử dụng gợi ý này. Bất kì sự trợ giúp nào đều được đánh giá cao.

Trả lời

4

Đảo ngược x, thay thế từng bit b bằng (-1) ** b và convolve. Tôi sẽ cho bạn giải thích về bài tập ở nhà của bạn phải làm gì tiếp theo.

+0

Tuyệt vời! Cảm ơn bạn. Nó làm cho rất nhiều ý nghĩa bây giờ :) – darksky

+0

Tôi nghĩ rằng những gì bạn có ý nghĩa ở đây chỉ là để thay thế 0 với -1's. Vì vậy, trong thực tế, chúng ta nên thay thế bit b bởi - (- 1)^b. Nhưng tôi đã giải quyết vấn đề bằng cách sử dụng thủ thuật này. Tôi sẽ đăng giải pháp của riêng mình trong vài ngày để giải thích lý do tại sao nó hoạt động nếu không có ai trả lời. – darksky

+0

Xin lỗi vì đã phá hủy số điểm tuyệt vời của bạn là '4444' nhưng đây là một gợi ý hay - và rõ ràng là làm việc cho OP. – Floris