java - 解释这个 for 循环片段

标签 java

这里我们有一个二进制堆的数组实现的片段。我需要一些帮助来了解这个 for 循环在伪代码中的含义:

public void insert (Anytype x) { 
    int hole = ++currentSize; //currentSize is the size of the array
    for (array[0] = x; x.compareTO(array[hole / 2]) < 0; hole /= 2)
        array[hole] = array[hole / 2];
    array[hole] = x;
}

我似乎无法理解这个 for 循环是如何工作的。谢谢。

编辑填补了这个漏洞

最佳答案

数组转换成二叉堆可以看到如下

         [elem 0] <-- put the inserted element here? (why? a precaution perhaps?)

         [element 1]...
    [element2] [ element3 ]  
[elem4][elem5] [elem6][elem7]  
[x][x] [x][x]  [x][XX] ... <-- unoccupied

代码通过将索引孔除以 2 来移动到每个节点的父节点。 然后,如果父节点 > 当前节点,它将父节点向上移动到当前节点。

我认为有一个错误......至少这不是典型的解决方案,其中将插入的元素作为最后一个未占用的“洞”并从该位置向上移动......

正确的方法是开始比较最后一个元素的父元素并向根迭代。不需要交换,但是索引“洞”结束的地方就是最终放置新元素的正确位置。 (典型的解决方案将“X”放在最后一个位置并交换,但这效率很低。)而且 for 循环中的第一次初始化是不必要的。

无论如何,当索引 0 被省略时,索引算术才有效。

关于java - 解释这个 for 循环片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13063216/

相关文章:

java - 如何将 Double 值从一个 ActionListener 方法引入到另一个方法中以执行计算? java

java - jbutton.doClick() 单击按钮但不执行功能

java - 在不改变类头的情况下使用泛型

java - log4j2 配置 XML 文件,用于 2 个日志文件,每次运行都有新文件夹

java - JPA 存储库 Lob 列

java - 从 firestore 中检索所有文档作为自定义对象

java - 如何在java中的二维数组中找到元素后计算X次

java - 如何编写多行HQL代码?

java - 如何以编程方式验证 log4j 2 是否已正确配置?

java - 如何使用 thymeleaf 传递两个对象以在表单中使用?