gpt4 book ai didi

c++ - 使用堆的优先级队列

转载 作者:行者123 更新时间:2023-11-30 02:23:36 26 4
gpt4 key购买 nike

我在学习了算法导论之后写了这段代码。我无法找出代码的问题所在。我已经为 heapsort 编写了代码并且它运行良好。 heap_extract_max() 将返回最大值。 heap_increase_key() 增加元素的优先级。 Here我已经使用运行良好的单链表编写了优先级队列程序。

#include <iostream>
#include <vector>
#include <algorithm>

template<typename T>
void max_heapify(std::vector<T>& array, size_t index)
{
size_t largest;
size_t left = (2*index) + 1;
size_t right = left + 1;

if(left < array.size() && array[left] > array[index])
largest = left;
else
largest = index;

if(right < array.size() && array[right] > array[largest])
largest = right;

if(largest != index)
{
int tmp = array[index];
array[index] = array[largest];
array[largest] = tmp;
max_heapify(array, largest);
}
}

template<typename T>
void build_max_heap(std::vector<T>& array)
{
for(size_t i = (array.size()/2) - 1; i >= 0; i--)
max_heapify(array, i);
}

template<typename T>
T heap_maximum(std::vector<T>& array)
{
return array[0];
}

template<typename T>
T heap_extract_max(std::vector<T>& array)
{
if(array.size() < 0)
{
std::cerr << "Heap Underflow \n";
}
else
{
T max = array[0];
array[0] = array[array.size() - 1];
//array.size() = array.size() - 1;
max_heapify(array, 1);
return max;
}
}

template<typename T>
void heap_increase_key(std::vector<T>& array, size_t index, T value)
{
if(value < array[index])
{
std::cerr <<"New value is smaller than the current value\n";
return;
}
else
{
array[index] = value;
while(index > 0 && array[(index/2) - 1] < array[index])
{
std::swap(array[index], array[(index/2) - 1]);
index = (index/2) - 1;
}
}
}

template<typename T>
void max_heap_insert(std::vector<T>& array, T value)
{
array[array.size()] = -1;
heap_increase_key(array, array.size(), value);
}

int main()
{
std::vector<int> v({1, 2, 6, 3, 7});
build_max_heap(v);
std::cout << heap_extract_max(v)<<"\n";
for(size_t i = 0; i < v.size(); i++)
{
std::cout << v[i] << " ";
}
std::cout << "\n";
}

它没有显示任何输出。我在写命令

$ g++ -std=c++11 priorityqueue.cpp -o priorityqueue
$ ./priorityqueue

最佳答案

问题出在下面的函数中,if case 将返回什么正因为如此

Control may reach end of non-void function

template<typename T>
T heap_extract_max(std::vector<T>& array)
{
if(array.size() < 0)
{
std::cerr << "Heap Underflow \n";
}
else
{
T max = array[0];
array[0] = array[array.size() - 1];
//array.size() = array.size() - 1;
max_heapify(array, 1);
return max;
}
}

为 if 情况添加 return -1 或任何其他内容

if(array.size() < 0)
{
std::cerr << "Heap Underflow \n";
return -1;
}

第二个问题

for(size_t i = (array.size()/2) - 1; i >= 0; i--)

Comparison of unsigned expression >= 0 is always true

尝试更改为:(按照 Serge Rogatch 的建议)

for(int64_t i = (int64_t(array.size())/2) - 1; i >= 0; i--)

解压也有问题更改结果之前是

7
2 3 6 1 2
Program ended with exit code: 0

由于 remove 的错误处理。在下面的代码中正确处理了 remove

template<typename T>
T heap_extract_max(std::vector<T>& array)
{
if(array.size() < 0)
{
std::cerr << "Heap Underflow \n";
return -1;
}
else
{
T max = array[0];
array[0] = array[array.size() - 1];
array.erase(std::remove(array.begin(), array.end(), array[0]),
array.end());
array.shrink_to_fit();
max_heapify(array, 0);
return max;
}
}

改变后

7
6 3 1 2
Program ended with exit code: 0

关于c++ - 使用堆的优先级队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46016497/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com