2


0

Javaで少しいじる-パワーセット、サイズ順

私のhttps://stackoverflow.com/questions/3961443/bit-twiddling-in-java-decomposing-long-into-long-of-bitmasks [以前のbit-twiddlingの質問]をフォローアップし、今私は切り詰めようとしていますその1つを使用するメソッド(ただし、配列の寿命はこのオブジェクトのみであるため、バッファなしバージョンです)。 これは、いくつかの「ロングベース」のhttp://en.wikipedia.org/wiki/Power_set[power set]のイテレータメソッドです。セットの実際の内容は保存されません-それはメモリホグであり、個々のメンバーはセットを反復処理する場合にのみ興味深いので、メンバーは反復子によって生成されます。

ただし、これらのメンバーは、(辞書順ではなく)サイズ順で返される必要があります。つまり、ビット数で「ソート」されます。

以下は私の(作業中の)最初のカットです。最適化中毒者からの提案はありますか? これはもっと明らかなカットがあると確信しています。

public Iterator iterator() { return new Iterator(){

private boolean hasNext = true;
@Override public boolean hasNext() { return hasNext; }

private final long[] split = BitTwiddling.decompose(base);
int size = 0;
private long next = 0;
private long lastOfSize = 0;
private long firstOfSize = 0;

int[] positions = new int[split.length];

@Override
public Long next() {
  long result = next;
  if (next == lastOfSize) {
    if (size == split.length) {
      hasNext = false;
      return result;
    }

    next = (firstOfSize |= split[size]);
    lastOfSize |= split[split.length - ++size];

    for(int i=0; i

1 Answer


0


質問を正しく理解できたら、http://graphics.stanford.edu/~seander/bithacks.html#NextBitPermutation [辞書式の次のビット順列を計算する]