немного вертелся в java - силовой набор, упорядоченный по размеру - PullRequest
2 голосов
/ 19 октября 2010

В ответ на мой предыдущий вопрос о перевороте , теперь я собираюсь урезать метод, который использует этот (хотя, небуферизованная версия, поскольку жизнь массива - только этот объект) , Это метод итератора для набора мощности некоторого long base; фактическое содержимое набора не сохраняется - это может быть проблема с памятью, а отдельные члены интересны только тогда, когда требуется выполнить итерацию по набору - поэтому элементы генерируются итератором.

Однако эти элементы должны быть возвращены в порядке по размеру (вместо лексикографического порядка), т. Е. «Отсортированы» по количеству бит.

Ниже мой (рабочий) первый разрез; какие-либо предложения от оптимизации наркоманов? У этого, я уверен, есть более очевидные сокращения.

public Iterator<Long> iterator() { return new Iterator<Long>(){

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<size; i++) positions[i] = i;

  } else {
    if (positions[size-1] == split.length-1) {
      int index = size-1;
      int ref = split.length - 1;
      while (positions[index] == ref) { index--; next ^= split[ref--]; }
      next ^= split[positions[index]++];
      next |= split[positions[index++]];
      do {
        next |= split[positions[index] = positions[index-1]+1];
      } while (++index < size);
    } else {
      next ^= split[positions[size-1]++];
      next |= split[positions[size-1]];
    }
  }
return result;
}

1 Ответ

0 голосов
/ 31 января 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...