制約される配列インデックスマッピング
-
21-08-2019 - |
質問
私は動作時間の最大値と最小値を導きを地図セットの配列が連続の整数です。
すべての配列は、原則として
A_0 = 1
A_n >= 1
A_n <= max(A_0 .. A_n-1) + 1
なんと、通常の溶液ることができるので、このようなシーケンスについて計算するための整数ているようなルックアップ、テーブルに与えなければならないインデックスにはテーブルのシーケンスです。
例:長さ3、5に有効なdnaの塩基配列を決定した。高速機能は、以下の地図(好ましくは両方向にするソリューション
1,1,1 0
1,1,2 1
1,2,1 2
1,2,2 3
1,2,3 4
- の点の運動が得満載の表1-1のマッピングを有効に配列および細胞
- サイズの設定に限定いただけるようになっ独自の配列が可能です。
- わからない現在の長さのシーケンスすることもできますが、 <12日には、一定の知られます。
- だこいつでもいいられているので注意が必要でコミュニティにおいて"楽しい"とを知ることができるからです。
これらの異なる有効な配列
1,1,2,3,2,1,4
1,1,2,3,1,2,4
1,2,3,4,5,6,7
1,1,1,1,2,3,2
これらせ
1,2,2,4
2,
1,1,2,3,5
関連 この
解決
あの配列インデックス指定がないが非常に簡単だという点を算出いたします。
もう探A_n n>0、A_0=1です。
割り出しを行い、2つのステップを踏みます。
第1部:
グループ配列による場A_n=max(A_0..A_n-1)+1.呼これらの場所 段.
- の手順に連番号(2,3,4,5,...).
- 非ステップの場所までの番号は1からステップの長さ未満のindexを持つ。
各グループを表すバイナリ文字列が1ステップと0非一歩です。E.g.001001010とグループ112aa3b4c、<=2,b<=3、c<=4.では、グループはインデックス化されてバイナリー数が自然数グループを作成できます。0から2^長さ1のとおりとする。ト呼び値のグループのバイナリ表現 グループの順.
第2部
指数は配列内のグループです。年団体の定義ステップ位置を、数字以外のステップ位置の変数は、変数を定義します。これはインデックス列の指定されたグループ内にグループは、辞書的序変数です。
で簡単に計算数の塩基配列、アミノ酸配列。これらの形1^i_1*2^i_2*3^i_3*....
組み合わせ:
これは、2部キー: <Steps, Group>
これらのニーズにマップされ整数です。いている多くのdna配列データのグループとして注以下です。ときに最初に見つかの多くのdna配列データのグループに与えられた長さです。ることを算出することが可能で通過すべてのグループと総括配列数または類似とを再確認しました。T(l,n)する配列数の長さl(A_0は省略)と最大値の最初の要素できるn+1.し:
T(l,n) = n*T(l-1,n) + T(l-1,n+1)
T(1,n) = n
ので l + n <= sequence length + 1
あ~sequence_length^2/2
T(l,n)値観を向上させることができる計算されます。
次を算出し、その影響を把握する配列数のグループの順に以下の指定された値にします。ることができるとの総括T(l,n)値です。E.g.配列数グループとめ <=1001010バイナリが等しい
T(7,1) + # for 1000000
2^2 * T(4,2) + # for 001000
2^2 * 3 * T(2,3) # for 010
最適化:
これによりマッピングでは、直接実装を組み合わせキーパーツ >O(1)
です。一方で、 Steps
一部のキーが小さく、計算の範囲 Groups
各 Steps
値は、ルックアップテーブルを低減できることを O(1)
.
い100%の確認上記式が、このようなものです。
これらの挨拶および再発することが可能で機能シーケンス>インデックス、インデックス>シーケンスです。でもそれだけではないので明:-)
他のヒント
私はソートとハッシュはものになるべきだと思います。
A0は常に0で開始すると、私たちはベース12との数と順序を考えるとルックアップのキーとしてそのベース10を使用することができると思うかもしれません。 (まだ、これについて確認してください)。
これは、あなたがこれらの値は、ファイルに保存されてしまったと仮定のために仕事をすることができますPythonの関数であり、あなたが関数に行を渡す。
def valid_lines(lines):
for line in lines:
line = line.split(",")
if line[0] == 1 and line[-1] and line[-1] <= max(line)+1:
yield line
lines = (line for line in open('/tmp/numbers.txt'))
for valid_line in valid_lines(lines):
print valid_line
のシーケンスを考えると、私は、テーブルのインデックスとしてソートされたシーケンスのハッシュを使用し、それを並べ替えます。