D堆的实现

实现上一篇博客(http://blog.csdn.net/buleriver/article/details/38469977)说的D堆。假设把mD设置成2。D堆就退化成二叉堆,也就是说。二叉堆是D堆的一种情况。

public class DHeap {  
    public static final int INIT_CAPACITY = 10;  
    private int[] mArray;  
    private int mLength;  
    private final int mD;  
      
    public DHeap(int d) {  
        mArray = new int[INIT_CAPACITY + 1];  
        mLength = 0;  
        mD = d;  
    }  
      
    public int getParentIndex(int index) {  
        return (index - 2 + mD) / mD;  
    }  
      
    public int getChildIndex(int pIndex, int childIndex) {  
        return mD * (pIndex - 1) + 2 + childIndex;  
    }  
      
    private void expandArray(int length) {  
        int[] arr = new int[length];  
        System.arraycopy(mArray, 1, arr, 1, mLength);  
        mArray = arr;  
    }  
      
    /** 
     * 自下而上,把value放到最后一个,然后一直和其父节点交换,找到合适的位置 
     */  
    public void insert(int value) {  
        if (mLength >= mArray.length - 1) {  
            expandArray(mArray.length * 2);  
        }  
        mArray[++mLength] = value;  
        int index = mLength;  
        int parentIndex = getParentIndex(index);  
        while (parentIndex > 0) {  
            int currentValue = mArray[index];  
            int parentValue = mArray[parentIndex];  
            if (currentValue < parentValue) {  
                mArray[parentIndex] = currentValue;  
                mArray[index] = parentValue;  
                index = parentIndex;  
                parentIndex = getParentIndex(index);  
            } else {  
                break;  
            }  
        }  
    }  
      
    public void deleteMin() {  
        if (mLength <= 0) {  
            return;  
        } else if (mLength == 1) {  
            mLength--;  
        } else {  
            mArray[1] = mArray[mLength];  
            int index = 1;  
            mLength--;  
            while (true) {  
                int value = mArray[index];  
                int minIndex = -1;  // 最小孩子的数组索引  
                boolean lastLevel = false;  // 是否已经到了最底层  
                int firstChildIndex = getChildIndex(index, 0);  
                int lastChildIndex = firstChildIndex + mD;  
                for (int childIndex = firstChildIndex; childIndex < lastChildIndex; childIndex++) {  // 找到最小的孩子  
                    if (childIndex > mLength) {  // 已经到了最后一个  
                        lastLevel = true;  
                        break;  
                    }  
                    int childValue = mArray[childIndex];  
                    if (value > childValue) {  
                        value = childValue;  
                        minIndex = childIndex;  
                    }  
                }  
                if (minIndex < 0) {  // 已经符合d堆的性质,不须要置换了  
                    break;  
                } else { // 须要置换  
                    mArray[minIndex] = mArray[index];  
                    mArray[index] = value;  
                    index = minIndex;  
                }  
                if (lastLevel) {    // 已经到了最底层  
                    break;  
                }  
            }  
        }  
    }  
}  


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用和引用提供了两种不同的Dijkstra算法的实现方式。引用中的代码使用了Floyd算法来计算最短路径,而引用中的代码则使用了朴素版的Dijkstra算法。 Floyd算法是一种通过动态规划的方式计算最短路径的算法。它使用了三个嵌套的for循环来更新每对节点之间的最短路径。算法首先将所有节点之间的距离初始化为无穷大,然后通过遍历每个节点对及中间节点,更新节点之间的距离。最后,如果起始节点和终止节点之间存在路径,则输出最短路径的长度;否则,输出-1表示没有路径存在。 朴素版的Dijkstra算法也是一种计算最短路径的算法。它使用了一维数组来记录起始节点到每个节点的最短距离,并使用另一个数组来记录节点是否已经被访问过。算法首先将起始节点到所有其他节点的距离初始化为无穷大,并将起始节点标记为已访问。然后,遍历N次,每次选择距离起始节点最近且未被访问过的节点,并更新该节点相邻节点的最短距离。最后,如果终止节点的最短距离为无穷大,则输出-1表示没有路径存在;否则,输出终止节点的最短距离。 由于问题中没有明确指定使用哪种算法来实现Dijkstra算法,你可以根据具体的需求选择合适的算法来实现实现的Dijkstra算法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [优化dijkstra算法](https://blog.csdn.net/qq_46188283/article/details/107707615)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值