0

000, 001, 010, 000バイナリ出力の文字列をランダムに生成するソースがあります。

入力000、001、および010のストリームなど、他の入力とは異なるビット数に応じて入力をグループに入れるハッシュまたはクラスタリングプログラムが必要です。それらはすべて同じバケット/クラスターに移動する必要があります1ビット違います。

私の最初の考えは、入力の最初の連続ビットを 1 つにグループ化することでした。

000
001
010

1つに。それから次のものとして:

011
100
101

しかし、私はすぐに、 と は同じバケットに属すべきであるのに対し、 とは異なるバケットに属すべきであるなど000、境界間に類似点があることに気付きました。1000011000

どうすればこれにアプローチできますか?ヒント?

ジェームズ

4

2 に答える 2

0

申し訳ありませんが、あなたの特別なケースでは関数を理解できませんでしたが、ここでいくつかのインスピレーションを得ることができます:

1 つの数値に依存するバケット関数が必要な場合は、次のようにすることができます。

def bucket(i):
    bucket = 0
    bit = 1
    while bit <= i:
        if bit & i > 0:
            bucket += 1
        bit <<= 1 # shift the bit 1 higher
    return bucket

依存する 2 つの数値がある場合:

def bucket(i, x):
    # perform some operation, store it in i
    bucket = 0
    bit = 1
    while bit <= i:
        # you can compare bits here
        if bit & i > 0:
            bucket += 1
    bit <<= 1
    return bucket

これは、ビットごとのバケット化を行う方法です

buckets = {}
for number in numbers:
    numberBucket = bucket(number)
    buckets.setdefault(numberBucket, [])
    buckets[numberBucket].append(number)
于 2012-12-17T16:32:56.020 に答える
0

グレーコードを使用してください。

https://en.wikipedia.org/wiki/Gray_code

反映された 2 進コード (フランク グレイにちなんでグレイ コードとも呼ばれる) は、2 つの連続する値が 1 ビットだけ異なる 2 進数システムです。

これにより、3 ビット (および関連する整数 - これはデフォルトのバイナリ エンコーディングではありません!) の順序は次のようになります。

000  = 0
001  = 1
011  = 2
010  = 3
110  = 4
111  = 5
101  = 6
100  = 7

次に、必要な数のバケットにデータを線形に分割します。

または、チェックサムとエラー修正コードも確認することをお勧めします。

于 2012-12-17T16:18:29.347 に答える