Коробки позиционирования в сетке


Маленький жадный алгоритм для установки коробки в сетке.

Версия

int lCurrentIndex = 0;
BoxInchesInterface lPreviousBbox = lSortedBboxes.iterator().next();
  double lEndPositionForCurrentIndex = pDimension.getEnd(lPreviousBbox);
for (BoxInchesInterface lBbox : lSortedBboxes)
{
    boolean lIsFirstIteration = lBbox == lPreviousBbox;
    if (!lIsFirstIteration && pDimension.getStart(lBbox) >= lEndPositionForCurrentIndex) {
        lCurrentIndex += 1;
        lEndPositionForCurrentIndex = pDimension.getEnd(lBbox);
    } else if (pDimension.getEnd(lBbox) < lEndPositionForCurrentIndex) {
        lEndPositionForCurrentIndex = pDimension.getEnd(lBbox);
    }
    lIndexFromBbox.put(lBbox, lCurrentIndex);
    lPreviousBbox = lBbox;
}
return lIndexFromBbox;

Версия B

int lCurrentIndex = 0;
Iterator<BoxInchesInterface> lItor = lSortedBboxes.iterator();
BoxInchesInterface lPreviousBbox = lItor.next();
double lEndPositionForCurrentIndex = pDimension.getEnd(lPreviousBbox);
lIndexFromBbox.put(lPreviousBbox, lCurrentIndex);
while (lItor.hasNext())
{        
    BoxInchesInterface lBbox = lItor.next();    
    if (pDimension.getStart(lBbox) >= lEndPositionForCurrentIndex)
    {
        lCurrentIndex += 1;
        lEndPositionForCurrentIndex = pDimension.getEnd(lBbox);
    } else if (pDimension.getEnd(lBbox) < lEndPositionForCurrentIndex) {
        lEndPositionForCurrentIndex = pDimension.getEnd(lBbox);
    }
    lIndexFromBbox.put(lBbox, lCurrentIndex);
    lPreviousBbox = lBbox;
}

Версия имеет преимущество меньшего числа переменных, но убедитесь, что для первого случая, когда lBbox равна lPreviousBox. Версия B имеет то преимущество, что lPreviousBox всегда отличается от lBbox, но имеет дело с итератора.

Что бы быть лучшей практики? Любые предложения по улучшению?

(и я должен добавить, что параллелизм не является проблемой в этом случае.)



200
5
задан 28 ноября 2011 в 11:11 Источник Поделиться
Комментарии
1 ответ

Версия однозначно лучше, так как он использует более привычной схеме, чтобы получить работу, и это делает использование бит тривиальный код (логическое lIsFirstIteration = lBbox == lPreviousBbox) избавит вас от дублирования нетривиальный код. (lIndexFromBbox.поставить(lPreviousBbox, lCurrentIndex))

Я бы опошлять банальным код еще больше, сказав типа bool IsFirstIteration = истина прямо перед входом в цикл, и IsFirstIteration = false в качестве последней инструкции цикла. Обратите внимание, что даже если это две строки кода вместо одного, его сложность меньше, потому что она имеет дело с константами, а не переменными.

Я мог бы, возможно, дать более советовать, если бы вы пояснили, что вы подразумеваете под 'алгоритм установки коробки в сетке. Сетки, как правило, думают как двумерную структуру, но я вижу только операции в одном измерении, на переменные, которые определяются вне фрагмента кода, который вы предоставили, так что... что этот код пытается достичь?

3
ответ дан 28 ноября 2011 в 01:11 Источник Поделиться