- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在开发一个必须创建最大堆的项目。我目前正在使用我的教科书版本的堆,它看起来像:
public MaxHeap(int initialCapacity) {
if (initialCapacity < DEFAULT_CAPACITY)
initialCapacity = DEFAULT_CAPACITY;
else
checkCapacity(initialCapacity);
@SuppressWarnings("unchecked")
T[] tempHeap = (T[]) new Comparable[initialCapacity + 1];
heap = tempHeap;
lastIndex = 0;
initialized = true;
}
public T getMax() {
checkInitialization();
T root = null;
if (!isEmpty())
root = heap[1];
return root;
}
public boolean isEmpty() {
return lastIndex < 1;
}
public int getSize() {
return lastIndex;
}
public void clear() {
checkInitialization();
while (lastIndex > -1) {
heap[lastIndex] = null;
lastIndex--;
}
lastIndex = 0;
}
public void add(T newEntry) {
checkInitialization();
int newIndex = lastIndex + 1;
int parentIndex = newIndex / 2;
while ((parentIndex > 0) && newEntry.compareTo(heap[parentIndex]) > 0) {
heap[newIndex] = heap[parentIndex];
newIndex = parentIndex;
parentIndex = newIndex / 2;
}
heap[newIndex] = newEntry;
lastIndex++;
ensureCapacity();
}
public int getSwaps()
{
return swaps;
}
public T removeMax() {
checkInitialization();
T root = null;
if (!isEmpty()) {
root = heap[1];
heap[1] = heap[lastIndex];
lastIndex--;
reheap(1);
}
return root;
}
private void reheap(int rootIndex) {
boolean done = false;
T orphan = heap[rootIndex];
int leftChildIndex = 2 * rootIndex;
while (!done && (leftChildIndex <= lastIndex)) {
int largerChildIndex = leftChildIndex;
int rightChildIndex = leftChildIndex + 1;
if ((rightChildIndex <= lastIndex) && heap[rightChildIndex].compareTo(heap[largerChildIndex]) > 0) {
largerChildIndex = rightChildIndex;
}
if (orphan.compareTo(heap[largerChildIndex]) < 0) {
heap[rootIndex] = heap[largerChildIndex];
rootIndex = largerChildIndex;
leftChildIndex = 2 * rootIndex;
} else
done = true;
}
heap[rootIndex] = orphan;
}
我是否应该在多个地方计算掉期并打印总金额,如果是的话我会在哪里计算它们?我之前曾尝试在 add 方法中枚举 swaps++,但我认为这不是正确的方法。
最佳答案
您必须计算 add(T newEntry)
方法和从 removeMax
方法调用的 reHeap
方法中的交换。
在reHeap
中,您从顶部开始,当您从removeMax调用它时,在删除最大值(在最大堆情况下)后,您将根替换为最后一个元素,然后您需要平衡堆。因此堆递归地下降到最后一层以达到平衡,这可能需要交换。
编辑:
在reHeap
的以下代码块中添加交换:
if (orphan.compareTo(heap[largerChildIndex]) < 0) {
heap[rootIndex] = heap[largerChildIndex];
rootIndex = largerChildIndex;
leftChildIndex = 2 * rootIndex;
// increment the swap here as inside this block of reHeap only swap takes place.
swap++
}
关于java - 需要帮助计算 MaxHeap 中的交换数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55797366/
我有一个最大堆和一个最小堆,其中最大堆的最大元素小于或等于最小堆的最小元素。 我现在想移动最小堆的最小元素成为最大堆的最大元素。 一种方法是弹出最小堆的顶部元素并将其插入最大堆。 有没有更有效的方法来
我将使用priorityQueue实现特定的java maxHeap,如下所示:假设我有一个“Customer”类,它有一个双变量名称“marginalGain”。 PriorityQueue mar
在优先队列的实现中,我必须使用递归来确定作为方法 IsMaxHeap 的参数接收的数组是否是最大堆。 我想确保我评估了所有可能使这项工作正常进行或不正常工作的情况。 static boolean is
我现在正在我的算法课上学习堆,但无法理解在实践中,最大堆如何优于仅将最大值存储在头指针处的链表。 让一个节点有两个比它小的 child 有什么意义,为什么它不能像链表那样只有一个?基本上,堆能做什么而
刚刚通过创建堆遇到了一些问题。我根据我正在使用的接口(interface)设置了限制,并且我正在尝试访问一个可以有效添加堆的构造函数,以证明与通过插入添加堆相比,时间复杂度有所降低。换句话说,我需要这
我目前正在开发一个必须创建最大堆的项目。我目前正在使用我的教科书版本的堆,它看起来像: public MaxHeap(int initialCapacity) { if (initialCap
我正在 Java 中实现一个 MaxHeap,它根据其键进行排序。每个键还与一个值相关联。当我尝试运行程序时,出现异常:Exception in thread "main"java.lang.Clas
#include #include #include #include typedef struct listNode { int id; struct listNode *next;
这是我的代码。我对 c 和指针很陌生,所以可能是指针上的错误。 #include #include typedef int (*comparatorPtr)(void*, void*); bool
假设我们要根据值对 HashMap 进行排序。我们实现了一个带有比较器的 priorityQueue 来做到这一点。因此,生成的 pq 从索引 0 到末尾从最大到最小排序。 代码如下: Priorit
此信息与树的类型有关。换句话说,你应该认识到这些信息金字塔的顶峰(Max Heap),或二叉搜索树或两者的组合或它们都没有。输入格式如下: (94,RR) (17,L) (36,RL) (51,R)
我通过扩展 ArrayList 实现了堆。然而,它似乎作为 minheap 工作得很好(与这段代码几乎没有区别),但它不能作为 maxheap 正常工作。我认为我有一部分或一部分使用不当。我想知道哪里
我在网上搜索了 MinHeap 和 Maxheap 的 Python 实现。 import heapq class MinHeap: def __init__(self): s
我在 Windows Server 2008 上运行 Redis 2.8.19。我收到一条错误消息,指出我的 Redis 堆的磁盘空间不足。 (内存映射文件而不是 fork())。 如果我在 cfg
我想知道java是否有任何集合可以帮助我实现minheap和maxheap。我知道我可以使用 PriortyQueue 数据结构来实现 maxheap。我们可以对 minheap 使用同样的方法吗?如
我正在使用 运行 Findbugs with Ant任务。我正在运行 Ant build.xml来自 Jenkins 。 我的构建卡在低堆大小上:Exception in thread "main"
我有这段 heapSort 的代码,它工作正常。我还了解当起始 index 为 1 而不是 0 时 algorithm 的工作原理。我的问题是下面的 maxheap 方法本身适用于所有大于零的索引,但
我是一名优秀的程序员,十分优秀!