我需要编写一个d-heap数组来找到最小的有效方法,我已经编写了一个已找到它的算法,但我相信有人帮我找到最简单的方法找到它,有人可以请帮助我请找另一种方法吗?
我的代码:
Heap delMin(d, heap){
heap.array[0] := heap.array[idx];
heap.idx := heap.idx-1;
downHeap(heap.array, heap.idx, 0, d);
return heap;
}
//-------------------------------------------
downHeap(array[], n, k, d) {
int currentElement;
int firstSuccessorIndex;
currentElement := array[k];
smallestChildIndex = findSmallestChildIndex(array, n, currentElement, d);
if( smallestChildIndex == -1 || currentElement < array[smallestChildIndex] )
{
return;
} else {
swap(array, k, smallestChildIndex);
downHeap(array, n, smallestChildIndex, d);
}
}
//-------------------------------------------
int findSmallestChildIndex(array[], n, k, d) {
firstChildIndex = array[k*d + 1];
if(firstChildIndex > n){
return -1; //the element is a leaf
}
lastChildIndex = array[k*d + d];
if(lastChildIndex > n) {
lastChildIndex = n;
}
smallestChildIndex = firstChildIndex;
for(int i=firstChildIndex; i < lastChildIndex; i++)
{
if(array[i] < array[smallestChildIndex]) {
smallestChildIndex = array[i];
}
}
return smallestChildIndex;
}
答案 0 :(得分:0)
我认为在计算索引时,<script src="https://maps.googleapis.com/maps/api/js"></script>
<div id="map_canvas"></div>
函数中存在错误。例如,您有:
findSmallestChildIndex
没有获得第一个孩子的索引。相反,它获得第一个子索引的值。 索引等于firstChildIndex = array[k*d + 1];
。
该错误发生在函数的多个位置。
另外,我认为您希望确保k*d + 1
始终小于firstChildIndex
,不小于或等于n
。我也做出了这样的改变。
更正的代码是:
n