9

私は現在、2 つのビット配列の連結がボトルネックであることを特定したコードを作成しており、それをより効率的にする方法について議論しています。

私のビット配列は次のようにモデル化されています

public BitArray(int size) { 
    int sizeBytes = size / 8 ;
    if (size % 8 !=0) sizeBytes++;
    this.array = new byte[sizeBytes];
    this.size = size ; 
}

size はビット単位のサイズです。

2 つのビット配列を効率的に連結する際の課題は、たとえばサイズ 7 のビット配列をサイズ 6 のビット配列と連結するときに発生する必要があるストラドリングです。そのため、単純に 2 つの配列コピーを行うことはできません。

私が現在実装しているものに加えて、私が調査しているソリューションは次のとおりです。「ストラドル領域」(たとえば、5 ビット配列の最後の 3 ビット) を計算します。system.array.copy を使用して最初の配列をコピーし、setBit 関数を使用して 2 番目の配列から 3 つの「またがるビット」を手動で設定します。2 番目の配列を 3 だけ左にシフトします。System.arraycopy()

現在、以下に示すように、2 番目の配列の個々のビットを手動で設定しています。

問題は、ビットシフトでは、バイトごとに実行する必要があるため、実際には操作に非常にコストがかかり、再度またぐ必要があることです。

上記のテクニックを改善する方法について考えていますか?

パフォーマンスが悪い現在のコードは次のとおりです。

public static BitArray concatenate(BitArray x1_, BitArray x2_) {
    if (x1_ == null) {
        System.out.println("x1 is null");
        int b = x2_.getArray().length;
        byte[] array = new byte[b];
        System.arraycopy(x2_.getArray(), 0, array, 0, b);
        BitArray res = new BitArray(array);
        res.setSize(x2_.getSize());
        return res;
    } else if (x2_ == null) { 
        System.out.println("x2 is null");
        int b = x1_.getArray().length;
        byte[] array = new byte[b];
        System.arraycopy(x1_.getArray(), 0, array, 0, b);
        BitArray res = new BitArray(array);
        res.setSize(x1_.getSize());
        return res;
    }

    int size1 = x1_.getSize();
    int size2 = x2_.getSize();
    int size = (x1_.getSize() + x2_.getSize()) / 8 ;
    if ((size1 + size2)%8!=0) size++;
    byte[] result = new byte[size];
    System.arraycopy(x1, 0, result, 0, x1.length);
    BitArray res = new BitArray(result);
    res.setSize(size1 + size2);
    for (int i = 0 ; i<size2 ; i++) {
        res.setBit(size1 + i, x2_.getBit(i) );
    }
    return res; 
}
4

2 に答える 2

1

あなたのコードは非常に複雑で読みにくいです。ただし、時間がかかる可能性があることがいくつかあります。

  • %演算子の使用
  • メソッドで複数回呼び出す-ビット配列getSize()のプロパティを使用しないのはなぜですか?size

バイト/ロングのリンクされたリストを使用して表現するBitArrayと、ポインターを更新するだけで何もコピーするのを避けることができるため、連結がはるかに高速になると思います。

concatenateアレイに対して頻繁に実行する操作はありますか? もしそうなら、ビット配列を表すために long のリンクされたリストを使用したと思います。ビット配列の大きさは?

于 2013-10-03T09:29:07.930 に答える