Các khoảng cách Hamming giữa hai chuỗi chiều dài bằng nhau là số vị trí mà tại đó những biểu tượng tương ứng là khác nhau.
Hãy P
là một chuỗi nhị phân có độ dài n
và T
là một chuỗi nhị phân có độ dài 2n-1
. Chúng ta có thể tính n
khoảng cách Hamming giữa P
và mọi n
chuỗi con T
thứ cấp theo thứ tự từ trái sang phải và đặt chúng vào một mảng (hoặc danh sách).
Ví dụ trình tự khoảng cách Hamming
Hãy để P = 101
và T = 01100
. Trình tự khoảng cách Hamming bạn nhận được từ cặp này là 2,2,1
.
Định nghĩa về sự gần gũi
Bây giờ hãy xem xét hai chuỗi khoảng cách Hamming như vậy. Nói x = (0, 2, 2, 3, 0)
và y = (2, 1, 4, 4, 2)
làm ví dụ. Chúng tôi nói rằng x
và y
là close
nếu y <= x <= 2*y
hoặc nếu x <= y <= 2*x
. Ở đây phép nhân vô hướng và bất đẳng thức được lấy theo nguyên tố. Đó là để nói, cho hai chuỗi A
và B
, A <= B iff A[i] <= B[i]
cho tất cả các chỉ số i
.
Lưu ý rằng các chuỗi khoảng cách Hamming tạo thành một thứ tự từng phần theo cách so sánh chúng. Nói cách khác, nhiều cặp trình tự không lớn hơn hoặc bằng hoặc không nhỏ hơn hoặc bằng nhau. Ví dụ (1,2)
và (2,1)
.
Vì vậy, sử dụng ví dụ trên, (0, 2, 2, 3, 0) <= 2*(2, 1, 4, 4, 2) = (4, 2, 8, 8, 4)
nhưng (0, 2, 2, 3, 0)
không lớn hơn (2, 1, 4, 4, 2)
. Cũng (2, 1, 4, 4, 2)
không nhỏ hơn hoặc bằng 2*(0, 2, 2, 3, 0) = (0, 4, 4, 6, 0)
. Kết quả là x
và y
không gần nhau.
Bài tập
Để tăng n
bắt đầu từ n=1
, hãy xem xét tất cả các cặp chuỗi nhị phân có thể có P
độ dài n
và T
độ dài 2n-1
. Có 2^(n+2n-1)
những cặp như vậy và do đó có nhiều chuỗi khoảng cách Hamming. Tuy nhiên, nhiều trong số các chuỗi đó sẽ giống hệt nhau. Nhiệm vụ là tìm kích thước của tập hợp khoảng cách Hamming lớn nhất để không có hai chuỗi gần nhau.
Mã của bạn sẽ xuất ra một số cho mỗi giá trị n
.
Ghi bàn
Điểm của bạn nói rộng nhất là n
mã của bạn đạt được trên máy của tôi sau 5 phút (nhưng hãy đọc tiếp). Thời gian là cho tổng thời gian chạy, không phải thời gian cho việc đó n
.
Để đưa ra điểm số cho câu trả lời không tối ưu, vì việc tìm câu trả lời tối ưu có thể khó, chúng tôi sẽ cần một hệ thống tính điểm hơi tinh tế. Điểm của bạn là giá trị cao nhất n
mà không ai khác đã đăng câu trả lời đúng cao hơn cho bất kỳ kích thước nào nhỏ hơn bằng với điều này. Ví dụ: nếu bạn xuất 2, 4, 21
và người khác xuất 2, 5, 15
thì bạn sẽ chỉ ghi điểm 1
vì người khác có câu trả lời tốt hơn n = 2
. Nếu bạn xuất ra 2, 5, 21
thì bạn sẽ ghi điểm 3
bất kể ai khác xuất ra vì những câu trả lời đó đều tối ưu. Rõ ràng nếu bạn có tất cả các câu trả lời tối ưu thì bạn sẽ nhận được điểm cho bài cao nhất n
bạn đăng. Tuy nhiên, ngay cả khi câu trả lời của bạn không phải là tối ưu, bạn vẫn có thể đạt được điểm nếu không ai khác có thể đánh bại nó.
Ví dụ câu trả lời và ví dụ làm việc
(Câu trả lời này vẫn chưa được kiểm tra. Xác minh độc lập sẽ được nhận một cách biết ơn.)
Nhờ các sản phẩm ETH:
- n = 1 cho 2.
- n = 2 cho 5.
- n = 3 cho 21.
Hãy xem xét n = 2
chi tiết hơn. Trong trường hợp này, danh sách đầy đủ các chuỗi khoảng cách Hamming (được biểu thị bằng các bộ dữ liệu ở đây) là:
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
Chúng ta có thể thấy rằng (0,0)
nó không gần với bất kỳ bộ dữ liệu nào khác. Trong thực tế, nếu chúng ta lấy (0, 0)
, (0, 1)
, (1, 0)
, (2, 1)
, (1,2)
sau đó không ai trong số những bộ dữ liệu gần gũi với bất kỳ của những người khác. Điều này cho một số điểm 5
cho n = 2
.
Đối với n = 3
danh sách đầy đủ các chuỗi khoảng cách Hamming khác biệt là:
[(0, 0, 0), (0, 0, 1), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 1), (0, 2, 2), (0, 2, 3), (0, 3, 0), (0, 3, 1), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 0), (1, 3, 1), (1, 3, 2), (2, 0, 1), (2, 0, 2), (2, 0, 3), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 0), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 0, 2), (3, 0, 3), (3, 1, 0), (3, 1, 1), (3, 1, 2), (3, 2, 0), (3, 2, 1), (3, 2, 2), (3, 3, 2), (3, 3, 3)]
Trong các 48
chuỗi đó, chúng ta có thể chọn ra một bộ kích thước 21
sao cho không có cặp nào trong bộ đó gần nhau.
Ngôn ngữ và thư viện
Bạn có thể sử dụng bất kỳ ngôn ngữ và thư viện có sẵn mà bạn thích. Nếu khả thi, sẽ tốt khi có thể chạy mã của bạn, vì vậy vui lòng bao gồm một lời giải thích đầy đủ về cách chạy / biên dịch mã của bạn trong Linux nếu có thể.
Máy của tôi Thời gian sẽ được chạy trên máy 64 bit của tôi. Đây là bản cài đặt Ubuntu tiêu chuẩn với RAM 8GB, Bộ xử lý tám lõi AMD FX-8350 và Radeon HD 4250. Điều này cũng có nghĩa là tôi cần có khả năng chạy mã của bạn.
Câu trả lời hàng đầu
- Điểm 4 cho 2, 5, 21, 83, 361 của Christian Sievers. C ++
- Điểm 5 cho 2, 5, 21, 83, 372 bởi fəˈnɛtɪk. Javascript