堆中子节点在堆的数组表示中的索引是什么。
在我的讲义和这篇文章中
它被给出为2k和/或2k+1
但是在数组中索引是从 0 开始的,而不是从 1 开始,对吗?
因此,节点 k 的子节点不应该是2k+1和/或2k+2
我是 C++ 新手,想知道什么时候应该使用 new,什么时候不应该使用,例如“int x = 5”或“int * x = new int(5)”。我知道新在堆中保留内存,因此在块结束时不会被删除,但由于保存地址的变量将在块之外变得不可访问,我看不到任何好处。
例子:
if(x) {
int * z = new int(5);
// Do something
}
// At this point the 5 is saved somewhere but since z is unaccessible I can't use it.
Run Code Online (Sandbox Code Playgroud)
补充:这个问题没有重复,因为其他问题只解释了什么是堆,而没有描述它的好处。
在阅读了诸如为什么在 heapify 中 siftDown 比 siftUp 更好?我有印象
为什么很多堆结构实现都有在 insert() 上调用的 siftUp()?维基百科的文章有它。
我正在阅读一些算法书籍并遇到这一行,
Heaps are well suited for algorithms that merge sorted data streams.
Run Code Online (Sandbox Code Playgroud)
没有给出任何解释为什么会出现这种情况。有人可以帮我解释一下这是为什么吗?
有人可以解释为什么以下代码会导致 ValueError 吗?
import heapq
import numpy as np
a = np.ones((2, 2), dtype=int)
states = []
heapq.heappush(states, (0, a))
heapq.heappush(states, (0, a.copy()))
Run Code Online (Sandbox Code Playgroud)
错误信息是:
Traceback (most recent call last):
File "x.py", line 8, in <module>
heapq.heappush(states, (0, a.copy()))
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Run Code Online (Sandbox Code Playgroud)
运行它而不将它添加a.copy()到堆中可以正常工作,第二个/后续的由于某种原因是一个问题。我确实理解数组有一个未知的真值方面,[True, False, True]并且不可能确定单个True或False从中确定,但为什么heapq需要这样做?尤其是仅在第二种情况下?
我必须使用 C 语言中的二进制堆为大学作业实现一个优先级队列。程序应该从输入中获取 n 个值,当值为 0 时,它应该打印 ID 号(因此,如果作为第 5 个元素添加的任务具有最高优先级 7,则打印“5”)并从中删除最高优先级的任务队列,当 value>0 时,它应该添加新节点。为了实现 ID 和优先级,我使用了结构数组。
任务将非常简单,如果元素的优先级相同,它也应该打印较低的 ID 的事实......我已经完成了我的研究,但我设法找到的唯一建议是修改典型的堆函数(insertkey、heapify)的片段也用于查找元素的 ID。我试过这样做,但我不知道出了什么问题 - 元素仍然没有按照我想要的方式排序。我将不胜感激任何建议和提示!
代码:
#include <stdio.h>
#define SIZE 99999
int heapsize = 0;
int count = 0;
struct pqueue
{
int priority;
int id;
};
struct pqueue A[SIZE];
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
void initializearray()
{
for(int i=0; i<SIZE; i++)
{
A[i].priority = 0;
A[i].id = 0;
}
} …Run Code Online (Sandbox Code Playgroud) 堆数据结构的新手。
尝试从列表创建堆。
li = [5, 7, 9, 1, 3]
heapq.heapify(li)
Run Code Online (Sandbox Code Playgroud)
经过 heapity 后,输出为
[1, 3, 9, 7, 5]
Run Code Online (Sandbox Code Playgroud)
为什么有这个命令?
我认为对于最小优先级堆,元素应该从最小到最大排序,即
heapq.heapify(li)应该与li.sort()
有人可以帮我理解吗?
如果你有一个包含 n 个整数的最大堆,那么找到第二大元素的最有效方法是什么?堆可以包含重复项,因此具有n-1最大值和1其他值的堆将返回另一个值
例如,包含数字的堆:
4,4,4,4,4,4,4,3,4
Run Code Online (Sandbox Code Playgroud)
将返回值3。
有没有办法比O(n)运行时更快地做到这一点?
为了构建堆,我们使用 java 中的 PriorityQueue 类。有没有办法使用内置库/类直接从 O(N) 中的数组构建堆,而不是单独推送每个元素以在 O(NlogN) 中构建堆?
这是最小堆的插入函数。我不明白为什么它不起作用。
void insertHeapMin(Heap* h, int x){
if(isFull(h)){
printf("heap is full\n");
return;
}
for(i=0; i<h->size;i++) //I don't wan't to insert one number more than once;
{
if(x==h->data[i]) return;
}
int pos = h->size;
h->data[pos]=x;
while(pos>0){
int parentPos = (pos-1)/2;
if (h->data[pos] < h->data[parentPos]){
int temp = h->data[pos];
h->data[pos] = h->data[parentPos];
h->data[parentPos] = temp;
pos = parentPos;
} else
break;
}
h->size++;
}
Run Code Online (Sandbox Code Playgroud)
主要的:
int a[] ={4,3,6,4,5};
size_t n = sizeof(a)/sizeof(a[0]);
Heap h;
initHeap(&h,100);
int i;
for(i=0;i<n;i++){
insertHeapMin(&h, a[i]);
}
for(i=0;i<n;i++){
printf("%d …Run Code Online (Sandbox Code Playgroud)