在二进制堆中插入“双”变量时遇到问题

Posted

技术标签:

【中文标题】在二进制堆中插入“双”变量时遇到问题【英文标题】:Having problems inserting "double" variables inside of a binary heap 【发布时间】:2019-06-01 11:21:14 【问题描述】:

这是我创建二进制堆的方式:

int *heapArray; // pointer to array of elements in heap
int capacity = 0; // maximum possible size of min heap
int heap_size; // Current number of elements in min heap
int d = 2;

int parent(int i)

    return (i/d);


void swap(double *x, double *y)

    double temp = *x;
    *x = *y;
    *y = temp;


double returnHeapValue(int key)

    return heapArray[key];


void initialize(int cap)

    heap_size = 0;
    capacity = cap;
    heapArray = (double*)malloc(cap*sizeof(double));


void insertJob(double x)

    if(capacity < 10)
    
        capacity = 10;
        heapArray = (double*)realloc(heapArray,capacity*sizeof(double));
    
    if(heap_size == capacity/2)
    
        capacity += 10;
        heapArray = (double*)realloc(heapArray,capacity*sizeof(double));
    

    heap_size = heap_size + 1;
    heapArray[heap_size] = x;
    maxHeapSwim(heap_size);


void maxHeapSwim(int k)

    while(k > 1 && heapArray[parent(k)] < heapArray[k] && k!=1)
    
        swap(&heapArray[k],&heapArray[parent(k)]);
        k = parent(k);
    

这是我在 main 方法中插入一堆双精度然后打印出来的方法:

int main()


  // test
  initialize(20);

  insertJob(2.0);
  insertJob(3.0);
  insertJob(1.0);
  insertJob(6.0);
  insertJob(4.0);
  insertJob(14.0);
  insertJob(7.0);
  insertJob(9.0);
  insertJob(8.0);
  insertJob(11.0);

  printf("\n");
  printf("%f", returnHeapValue(1));
  printf("\n");
  printf("%f", returnHeapValue(2));
  printf("\n");
  printf("%f", returnHeapValue(3));
  printf("\n");
  printf("%f", returnHeapValue(4));
  printf("\n");
  printf("%f", returnHeapValue(5));
  printf("\n");
  printf("%f", returnHeapValue(6));
  printf("\n");
  printf("%f", returnHeapValue(7));
  printf("\n");
  printf("%f", returnHeapValue(8));
  printf("\n");
  printf("%f", returnHeapValue(9));
  printf("\n");
  printf("%f", returnHeapValue(10));
  printf("\n");

  return 0;

但是,输出是这样的:

0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000

为什么不能正确打印数字?有什么我做错了吗?当我用整数值测试它时,一切正常。但是当我尝试插入“双”数据类型的值时它不起作用。

编辑:

我还尝试将 heapArray 的类型从 int 更改为 double,如下所示:

double *heapArray;

很遗憾,这导致我创建的另一个函数出现错误:

double delMaxPriorityJob() //This function deletes the largest value (in the root)

    double max = heapArray[1];
    swap(&heapArray[1],&heapArray[heap_size]);
    heap_size = heap_size - 1;
    maxHeapSink(1);
    heapArray[heap_size + 1] = NULL; //The error is in this line
    return max;

错误提示:

“从类型'void *'分配给类型'double'时不兼容的类型”

【问题讨论】:

int *heapArray; 可能你想要double* heapArray; @IłyaBursov 检查我的编辑 NULL 不是double。为什么你觉得这个错误令人惊讶? 所有发布的代码都无法编译。除其他问题外,它们缺少所需头文件所需的 #include 语句。请发帖minimal reproducible example 您将数组视为从 1 开始的索引,但 C 数组是从 0 开始的。例如,您应该在插入函数的最后一件事上增加heap_size,否则您在活动数组之外写入一个并且永远不会设置heapArray[0]。鉴于此,您的 parent(k) 函数也很可能是错误的。对于从零开始的索引,它应该返回 (k - 1) / 2 【参考方案1】:

我修好了。问题是,我正在尝试从不同的类运行 main() 函数。之前不起作用的原因是我没有在二进制堆的头文件中正确指定函数。这是头文件现在的样子:

extern void initialize(int cap);
extern void resetHeap();
extern int count_heap_elements();
extern int returnHeapCapacity();
extern double returnHeapValue(int key);
extern void insertJob(double x);
extern void insertEvent(double x);
extern double delMaxPriorityJob();
extern double delMaxPriorityEvent();
extern void maxHeapSink(int k);
extern void maxHeapSwim(int k);
extern void minHeapSwim(int k);
extern void minHeapSink(int k);

现在,当我从不同的类运行 main() 函数时,我得到了正确的输出。

【讨论】:

以上是关于在二进制堆中插入“双”变量时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

关于js生成的字符串带有单双引号嵌套的问题

Jmeter遇到的问题

在 R 中使用 SVM 获取概率值时遇到问题

制作双插入的最佳方法

Excel 2010 双变量运行时错误 16

springboot jpa junit测试遇到的问题