等しい長さの2つのストリング間のハミング距離は、対応するシンボルが異なる位置の数です。
してみましょうP
長さのバイナリ文字列にするn
とT
長さのバイナリ文字列です2n-1
。のすべての長さの部分文字列のn
間のハミング距離を左から右に順番に計算し、それらを配列(またはリスト)に入れることができます。P
n
T
ハミング距離シーケンスの例
させP = 101
てくださいT = 01100
。このペアから得られるハミング距離のシーケンスは2,2,1
です。
近さの定義
次に、このようなハミング距離のシーケンスを2つ考えてみましょう。と言うx = (0, 2, 2, 3, 0)
とy = (2, 1, 4, 4, 2)
例として。私たちはそれを言ってx
おりy
、close
もしy <= x <= 2*y
そうならx <= y <= 2*x
。ここで、スカラー乗算と不等式は要素ごとに取られています。つまり、2つのシーケンスA
とB
、A <= B iff A[i] <= B[i]
すべてのインデックスに対してi
。
ハミング距離のシーケンスは、これらの比較方法では半順序を形成することに注意してください。言い換えれば、シーケンスの多くのペアは、互いに大きくも等しくも小さくも等しくありません。たとえば(1,2)
と(2,1)
。
したがって、上記の例を使用して、(0, 2, 2, 3, 0) <= 2*(2, 1, 4, 4, 2) = (4, 2, 8, 8, 4)
しかし(0, 2, 2, 3, 0)
より大きくありません(2, 1, 4, 4, 2)
。また、以下で(2, 1, 4, 4, 2)
はありません2*(0, 2, 2, 3, 0) = (0, 4, 4, 6, 0)
。その結果x
とy
互いに近接ではありません。
仕事
増加のためn
で始まるn=1
、バイナリ文字列のすべての可能なペアを検討P
長さのn
とT
長さのを2n-1
。その2^(n+2n-1)
ようなペアがあるため、ハミング距離の多くのシーケンスがあります。ただし、これらのシーケンスの多くは同一になります。タスクは、2つのシーケンスが互いに近接しないように、ハミング距離シーケンスの最大セットのサイズを見つけることです。
コードはの値ごとに1つの数値を出力する必要がありますn
。
スコア
あなたのスコアは大まかに言って、n
あなたのコードが私のマシン上で5分以内に到達する最高のものです(しかし、読んでください)。タイミングは、それだけの時間ではなく、総実行時間の時間ですn
。
最適な回答を見つけるのは難しいと思われるため、非最適な回答のスコアを与えるには、わずかに微妙なスコアリングシステムが必要になります。あなたのスコアは、n
これよりも小さいサイズに対して他の誰もより高い正解を投稿していない最高値です。たとえば、あなたが出力し2, 4, 21
、他の誰かが出力した場合2, 5, 15
、あなたは1
他の誰かがより良い答えを持っているとしてのみスコアリングしますn = 2
。出力する場合、他の誰かが何を出力しても、それらの答えはすべて最適であるため、2, 5, 21
スコアが付け3
られます。明らかに、すべての最適な回答があれば、n
投稿した最高のスコアが得られます。しかし、たとえあなたの答えが最適でなくても、他の誰もそれを打つことができないなら、あなたはまだスコアを得ることができます。
回答例と実施例
(この回答はまだチェックされていません。独立した検証はありがたいことに受信されます。)
ETHproductionsのおかげで:
- n = 1は2を与えます。
- n = 2は5を与えます。
- n = 3は21を与えます。
n = 2
もっと詳しく見てみましょう。この場合、ハミング距離シーケンスの完全なリスト(ここではタプルで表されます)は次のとおりです。
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
(0,0)
他のタプルの近くにないことがわかります。我々が取る場合、実際には(0, 0)
、(0, 1)
、(1, 0)
、(2, 1)
、(1,2)
その後、それらのタプルのどれもが他の人のいずれかに近いではありません。これによりのスコアが得5
られn = 2
ます。
以下のためにn = 3
個別のハミング距離シーケンスの完全なリストであります:
[(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)]
これらの48
シーケンスのうち、サイズのセットを選択して、21
そのセット内のペアが互いに近接しないようにすることができます。
言語とライブラリ
使用可能な任意の言語とライブラリを使用できます。可能であれば、コードを実行できるとよいので、可能な限りLinuxでコードを実行/コンパイルする方法の完全な説明を含めてください。
マイマシンタイミングは64ビットマシンで実行されます。これは、8GB RAM、AMD FX-8350 8コアプロセッサ、およびRadeon HD 4250を備えた標準のUbuntuインストールです。これは、コードを実行できる必要があることも意味します。
一流の答え
- Christian Sieversによる2、5、21、83、361のスコア4。C ++
- fəˈnɛtɪkによる2、5、21、83、372のスコア5。Javascript