- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我和一位同学现在在一项任务上坐了几个小时,但没有从我们的程序中找出(小?)错误。
任务是实现一个 MinHeap,可以更新元素并使用 heapDown 函数在 MinHeap 中对它们进行新排序。现在我们将其全部投入工作,但堆数组的某些元素未就位,并且提取后的列表(最小元素)未按应有的方式排序。希望您能帮助我们。
import java.util.Random;
public class MinPQ2 {
private PQElement Elemente[];
private int maxsize;
private int currentsize;
public MinPQ2(int max) {
this.maxsize = max;
this.currentsize = 0;
Elemente = new PQElement[this.maxsize];
}
private void swap(int eins, int zwei) {//tauscht Elemente innerhalb des Arrays
PQElement tmp = Elemente[eins];
Elemente[eins] = Elemente[zwei];
Elemente[zwei] = tmp;
}
public PQElement getLeftChild(int position) {
return Elemente[position * 2 + 1];
}
public PQElement getRightChild(int position) {
return Elemente[position * 2 + 2];
}
public PQElement getQuestioner(int position){
return Elemente[position];
}
public PQElement getParent(int position) {
return Elemente[position / 2 - ((position > 0 && position % 2 == 0) ? 1 : 0)];
}
private void heapUp(int position) {
while (getParent(position).getPriority() > Elemente[position].getPriority()) {
int temppos = position / 2 - ((position % 2 == 0) ? 1 : 0);
swap(position, temppos);
position = temppos;
}
}
private void heapDown(int position) {
int tmp;
if (position * 2 + 2 < maxsize && getLeftChild(position) != null){
if (getRightChild(position) != null){
if (getLeftChild(position).getPriority() < getRightChild(position).getPriority()){
tmp = position *2+1;
swap(position,tmp);
position = tmp;
heapDown(position);
}
else {
tmp = position *2+2;
swap(position,tmp);
position = tmp;
heapDown(position);
}
}
else if (getLeftChild(position).getPriority() < getQuestioner(position).getPriority()){
tmp = position *2+1;
swap(position,tmp);
position = tmp;
heapDown(position);
}
}
}
public boolean insert(PQElement n) {
if (currentsize >= maxsize)
return false;
Elemente[currentsize] = n;
currentsize++;
if (currentsize > 1)
heapUp(currentsize - 1);
return true;
}
public boolean insert(String s, double d) {
return insert(new PQElement(s, d));
}
public PQElement extractElement() {
if(isEmpty())
return null;
PQElement result = Elemente[0];
swap(0, currentsize-1);
Elemente[currentsize - 1] = null;
heapDown(0);
currentsize--;
return result;
}
public String extractData() {
return extractElement().getData();
}
public boolean isEmpty() {
return currentsize == 0;
}
public void update(String s, double n) {
int position = currentsize - 1;
for (int i = 0; i <= currentsize; i++) {
if (i == currentsize)
return;
if (Elemente[i].getData().equals(s)) {
position = i;
break;
}
}
Elemente[position].setPriority(n);
heapUp(position);
heapDown(position);
}
}
public class PQElement {
private String data;
private double Priority;
public PQElement(String s, double d){
this.data = s;
this.Priority = d;
}
public String getData(){
return data;
}
public double getPriority(){
return Priority;
}
public void setPriority(double d){
Priority = d;
}
public void setData(String s){
data = s;
}
}
import java.util.Arrays;
import java.util.Random;
public class testclass {
public static void main(String[] args) {
Random zufall = new Random();
int max = 11;
MinPQ2 test = new MinPQ2(max);
for (int i = 0; i < max; i++) {
test.insert(i + " Element", zufall.nextDouble());
}
System.out.println(test(test, max));
System.out.println("_____________");
//test2(test,max);
System.out.println("_____________");
test3(test,max,zufall);
}
private static boolean test(MinPQ2 test, int max) {
for (int i = 1; i < max; i++) {
if (test.getParent(i).getPriority() < test.getQuestioner(i).getPriority()) {
System.out.println(test.getParent(i).getPriority() + " : " + test.getQuestioner(i).getPriority());
} else return false;
}
return true;
}
private static void test2(MinPQ2 test, int max) {
for (int i = 0; i < max; i++) {
System.out.println(test.extractElement().getPriority());
}
}
private static void test3(MinPQ2 test, int max, Random zufall){
for (int i = 1; i < max;i++){
if (i%2 == 0){
test.update(i + " Element", zufall.nextDouble());
}
}
test2(test,max);
}
}
这是我们的准则。在测试类(第三个代码片段)中使用 test()
我们只显示堆,此时一切正常。但现在在 test3() 中我们更新了一些数据,使用 heapDown() 重新排序(第一个代码片段)并将它们打印在屏幕上。现在我们看到提取的数据没有排序。因此错误可能出现在 heapDown()
或 update()
中。但我们尝试了很多,但没有找到解决方案:(
最佳答案
您的 heapDown
方法存在多个问题。我已添加评论。
private void heapDown(int position) {
int tmp;
// You need to check against `currentsize`, rather than maxsize.
if (position * 2 + 2 < maxsize && getLeftChild(position) != null){
// In this code, you always move the parent down, because
// you never compare the parent with its children.
if (getRightChild(position) != null){
if (getLeftChild(position).getPriority() < getRightChild(position).getPriority()){
tmp = position *2+1;
swap(position,tmp);
position = tmp;
heapDown(position);
}
else {
tmp = position *2+2;
swap(position,tmp);
position = tmp;
heapDown(position);
}
}
else if (getLeftChild(position).getPriority() < getQuesttioner(position).getPriority()){
tmp = position *2+1;
swap(position,tmp);
position = tmp;
heapDown(position);
}
}
}
您的代码过于复杂。您可以像这样简化它:
// first find the smallest child
leftChildIndex = position * 2 + 1;
if (leftChildIndex >= currentSize) return;
smallestChildIndex = leftChildIndex;
rightChildIndex = position * 2 + 2;
if (rightChildIndex < currentSize) {
if (getRightChild(position).getPriority() < getLeftChild(position).getPriority()) {
smallestChildIndex = rightChildIndex;
}
}
// if the parent is larger than the smallest child,
// then swap and repeat.
if (getQuestioner(smallestChildIndex).getPriority() < getQuestioner(position).getPriority()) {
swap(position, smallestChildIndex);
position = smallestChildIndex;
heapDown(position);
}
关于java - MinHeap 提取/heapDown() 失败 : incorrect order of elements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58718011/
我正在使用带有 64 位插件的 64 位操作系统 Windows 7 终极机器 VS2008。 我已经在 32 位和 64 位、调试和发布配置中成功构建了我的项目。64 位调试未启动;它给出了错误:
我遇到了一个我不理解的 java 泛型编译时错误。 我有两种方法: public static final T doStuff(List list, int k, Comparator compar
在下面的类(class)中,我尝试打印工资系统中员工的详细信息。请注意,Porter、Pharmacist 和 Surgeon 均继承自 Employee。 但是,它只是重复打印添加到数组中的第一个员
package chapter5; import java.util.Scanner; public class Exercise5 { public static void main(Str
WITH list_dedup (Company, duplicate_count) AS ( SELECT *, ROW_NUMBER() OVER (
我有一些 base64 编码的数据,即使其中存在填充错误,我也想将其转换回二进制。如果我使用 base64.decodestring(b64_string) 它会引发“不正确的填充”错误。还有其他方法
我正在致力于将大型 Delphi 代码库调整为 64 位。在许多情况下,有些行将指针转换为 32 位值或从 32 位值转换为类似于以下内容的行: var p1,p2 : pointer; begi
我正在尝试在 rtaudio 中生成一个简单的正弦波,以验证我了解发生了什么。但是,结果是错误的。 我有一个全局float timec ,以及使用 openStream 调用的回调它应该用样本填充缓冲
将我们的 Jenkins 主安装更新到最新的 LTS 版本 2.46.3 后,其从属设备之一(Windows 7 计算机,32 位)无法与主设备连接。 我们收到的错误是: java -jar slav
实现ROCR曲线,kNN,K进行10倍交叉验证。 我正在使用电离层数据集。 这是属性信息,供您引用: -如上所述,所有34个都是连续的 -根据定义,第35个属性为“好”或“坏” 以上总结。这是一个二进
我正在阅读有关“Servlet 3.0 中的异步处理支持”的专家(?)教程(http://www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.h
我目前正在为我即将开展的项目制作自己的关卡创建器(图 block map )。一切都很顺利,只是当我添加放大和缩小选项时遇到了问题。我有一个类正在处理当前的所有输入和渲染,因为我刚刚开始。 Level
我在 Eclipse mars 2.0 中使用 Mockito(1.10.19) 进行 Java EE 测试来测试离线存储库。此类依赖于 InitialData 类来检索信息。 我的第一个任务是将地址
我正在尝试实现“算法简介”一书中所述的合并排序算法。尽管实现是按照书中指定的,但输出不正确。很有可能出现相差一的错误,但我无法指出它。有什么指点吗? #include #include #defi
我正在尝试确定 Windows 任务栏(系统托盘?)停靠在哪一侧 - 这样我就可以将弹出窗口定位在任务栏的上方/下方/左侧/右侧。 我正在使用 SHAppBarMessage(ABM_QUERYPOS
我正在使用以下公式实现 DCT 变换: 但是结果不正确。对于一些 8 × 8 矩阵, 0 0 0 0 0 0 0 0 210 210 210 210 210 210 21
我正在尝试编写将内存流转换为 png 图像的代码,但在 using(Image img = Image.从流(毫秒))。它没有进一步指定它,所以我不知道为什么会收到错误以及我应该怎么做。 此外,如何将
这个语句工作正常: SELECT * FROM table_name WHERE DATE(date_event) < DATE(NOW() - INTERVAL 90 DAY); 在 DELETE
当我删除图像并尝试保存配置文件时,它显示错误“incorect padding” 我的代码是 模型.py import webcam.admin from webcam import widgets
我正在尝试创建一个函数来计算两个字符串之间的汉明距离。当我调用这个函数时,它应该告诉我两个字符串之间不匹配的字符数。 我的输出不正确。我不断得到随机数结果。下面是我的代码: using namespa
我是一名优秀的程序员,十分优秀!