У меня возникли некоторые проблемы с кодом для перколяции вверх и вниз в минимальной куче (самый маленький ключ сверху). Моя самая большая претензия связана с циклами for этих двух фрагментов кода, из-за которых я не понимаю остальную часть кода...
int hole = ++currentSize;
Comparable copy = x;
array[ 0 ] = std::move( copy ); //in the books implementation the zero
//index is kept empty, is this to create a temporary place for the added element?
for( ; x < array[ hole / 2 ]; hole /= 2 ) //my biggest problem is understanding this for loop!!!
array[ hole ] = std::move( array[ hole / 2 ] ); //what does this do?
array[ hole ] = std::move( array[ 0 ] );
Я не понимаю цикл for здесь. Это может быть связано с такими отношениями, как родитель i-го индекса в i/2 и т. д., но я ничего не знаю об этом. Это для вставки элемента в кучу. Приветствуется любая помощь в разъяснении значения кода.
Затем есть просачивание для метода findMin, для которого я снова не понимаю код.
/**
* Internal method to percolate down in the heap.
* hole is the index at which the percolate begins.
*/
void percolateDown( int hole )
{
int child;
Comparable tmp = std::move( array[ hole ] );
for( ; hole * 2 <= currentSize; hole = child ) //not clear with this for loop!!!
{
child = hole * 2;
if( child != currentSize && array[ child + 1 ] < array[ child ] )
++child;
if( array[ child ] < tmp )
array[ hole ] = std::move( array[ child ] );
else
break;
}
array[ hole ] = std::move( tmp );
} //somewhat understood, except the for loop...
В основном цикл for, но также какая часть кода что делает? Извиняюсь, если в вопросе есть дилетантство.