gpt4 book ai didi

C++ 优先级队列作为二叉堆

转载 作者:行者123 更新时间:2023-11-30 04:33:37 25 4
gpt4 key购买 nike

一直在进步,但还是想不通我的死循环在哪里……

头文件:

#include <string>

class priority_queue_overflow{}; //if insert tries to exceed the size of A then throw priority_queue_overflow()
class priority_queue_underflow{}; //if extract_min tries is called on an empty heap then throw priority_queue_overflow()

class priority_queue {
private:

class pair {
public:
std::string object;
double key;
};

pair* A; //the array used to store the heap
int heapsize; //the current heap size
int size; //the current size of the array: does not change

void heapify(int k); //as described in Cormen et al

public:

priority_queue(int n); //don't forget to allocate the array of size n+1 as we don't use slot zero
~priority_queue(); //delete the array

bool empty(); //true/false depending upon whether the heap is empty
void insert(std::string s, double priority); //add s to the heap with the given priority as its key
std::string extract_min(); //remove the string of lowest key and return that string

operator std::string();
};

cpp文件:

/**
* implementing the priority queue as a binary heap
*
*/

#include <iostream>
#include <istream>
#include <ostream>
#include <sstream>
#include <map>
#include <algorithm>

#include "binary_heap.hpp"

/***********************
*** inline functions
***********************/
inline int left(int i) { return 2*1; } // ( i << 1 )

inline int right(int i) { return 2*i+1; } // (i << 1 | 1)

inline int parent(int i) { return i/2; } // ( i >> 1 )


/*********************
*** constructor
*********************/
priority_queue::priority_queue(int n) //don't forget to allocate the array of size n+1 as we don't use slot zero
:heapsize(0), size(n)
{
A = new pair[n+1];
}


/*********************
*** destructor
*********************/
priority_queue::~priority_queue() //delete the array
{
delete[] A; // iterrate through delete each elem
}


/*******************************************
*** heapify * finds max of three things
*******************************************/
void priority_queue::heapify(int k)
{
std::cout<<"HERE HEAP"<<'\n';
pair smallest = A[k];
int pos = k;

//only treat child as object if it's inside heap
if (left(k) <= heapsize and A[left(k)].key < A[pos].key) {

// update variables
smallest = A[left(k)];
pos = left(k);
}

// identical for right
if (right(k) <= heapsize and A[right(k)].key < A[pos].key) {

// update variables
smallest = A[right(k)];
pos = right(k);
}

// after both if's exectued: smallest and pos contain smallest key

// only need to do something if pos is !=i
std::cout<< pos <<" == "<< k<<'\n';

if (pos != k) {

// swap items
std::swap(A[k], A[pos]);

// go recursive
heapify(pos);
}
}


/****************
*** empty
****************/
bool priority_queue::empty()
{
return (heapsize == 0);
}


/****************
*** insert
****************/
void priority_queue::insert(std::string s, double priority) //add s to the heap with the given priority as its key
{
if (heapsize == size) {
throw priority_queue_overflow();
}

++heapsize;
A[heapsize].object = s;
A[heapsize].key = priority;

int i(heapsize);
while (i > 1 and A[parent(i)].key > A[i].key) {
std::swap(A[parent(i)], A[i]);
i = parent(i);
}
}


/*******************
*** extract_min
*******************/
std::string priority_queue::extract_min() //remove the string of lowest key and return that string
{
if (heapsize == 0) {
throw priority_queue_underflow();
}

std::string ans = A[1].object;
A[1] = A[heapsize];
--heapsize;
heapify(1);
return ans;
}


/**********************************
*** function operator overload
**********************************/
priority_queue::operator std::string()
{
std::stringstream text;
int i(1);

while (i <= size) {
text << A[i].object << std::endl;
++i;
}
return text.str();
}

最佳答案

您应该尝试提取遇到困难的最小问题。如果您能准确缩小问题的范围,会更容易提供帮助。

如果您在理解如何在数组上下文中使用示例中的 pair 类时遇到困难,以下小(独立)示例可能会有所帮助:

#include <iostream>
#include <string>

class pair {
public:
std::string object;
double key;
};

void print_pair(const pair& p) {
std::cout << p.object << " = " << p.key << std::endl;
}

int main() {

// allocated on the stack, dies at the end of the function
pair p;

p.object = "question";
p.key = 42;
print_pair(p);

pair* pp = new pair();
(*pp).object = "6 * 10"; // We need to dereference the pointer, kinda clumsy syntax
pp->key = 60; // Luckily there's a short hand! pp[0].key = 60; is the same thing
print_pair(*pp);
delete pp; // remember to clean up!

pair* ap = new pair[10]; // allocate 10 pairs
ap[0].object = "zero";
(*(ap + 0)).key = 0; // same thing, ap[N] is the same as *(ap + N)
print_pair(ap[0]);
delete []ap; // remember to use the [] syntax when you new'ed like that!
}

关于C++ 优先级队列作为二叉堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6697823/

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