构建 MaxHeap 最大没有被发送到顶部

Posted

技术标签:

【中文标题】构建 MaxHeap 最大没有被发送到顶部【英文标题】:Building MaxHeap Largest Not Being Sent To Top 【发布时间】:2017-01-22 22:41:11 【问题描述】:

我正在尝试从大小为 10 的向量中构建一个最大堆。它包含数字 1-10。但是我的程序不会将最大值 10 设置为最大变量,因为在比较时它超出了我的向量范围。

if ((l <= v.size()) && (v.at(l) > v.at(i)))
    largest = l;
    else  largest = i; 

    if ((r <= v.size()) && (v.at(r) > v.at(largest))) // r at some point is 10. which exceeds v.
    largest = r;

我尝试在上面的代码周围设置一个 if 语句来捕获错误,但后来我得到了这个:

INPUT:  1 2 3 4 5 6 7 8 9 10
OUTPUT: 9 8 7 4 5 6 3 2 1 10

这几乎是正确的,但 10 应该是第一个。我可以做些什么来确保堆正确构建?这是我的完整代码:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;


vector<string> readFile(string fileName)  /* read in file. Works Fine.*/
void display(vector<string>& v)  /*displays vector. works fine. */  

inline int parent(int i)return i / 2; 
inline int left(int i)  return 2*i;
inline int right(int i) return 2*i + 1;

void Max_Heapify(vector<string>& v, int i)

    int largest;
    int l = left(i);
    int r = right(i);
    i--;

    if ((l <= v.size()) && (v.at(l) > v.at(i)))  
    largest = l;
    else  largest = i; 

    if ((r <= v.size()) && (v.at(r) > v.at(largest)))
    
        largest = r;
    

    if (largest != i)
    
        string temp = v.at(i);
        v.at(i) = v.at(largest);
        v.at(largest) = temp;

        Max_Heapify(v, largest);
    


void Build_Max_Heap(vector<string>& v, int length) 

    for (int i = (length / 2); i > 0; i--)
    
        Max_Heapify(v, i);
    


int main() 
    vector<string> vectorReadIn;
    vector<string> sortedVector;
    int x = 0;

    string fileName = "C:/Users/user/Downloads/Algorithims/Perm Words/perm15k.txt";

    vectorReadIn = readFile(fileName);

    cout << "Unsorted file:" << endl;
    display(vectorReadIn);
    vectorReadIn.resize(vectorReadIn.size());
    Build_Max_Heap(vectorReadIn, vectorReadIn.size());

    display(vectorReadIn);  

【问题讨论】:

大小为N 的向量的有效索引为0 到N-1。因此,当l == v.size() 时,那么v.at(l) 将抛出超出范围的异常。鉴于此,条件((l &lt;= v.size()) &amp;&amp; (v.at(l) &gt; v.at(i))) 看起来是错误的——v.at(l) 仅在l 严格小于v.size() 时才有效。 【参考方案1】:

除了 Igor Tandetnik 的评论之外,您对左右孩子的计算是错误的。在索引 0 为第一项的向量中,堆的根位于索引 0。因此,左右子节点的计算为:

left child: (2*x) + 1
right child: (2*x) + 2

您的计算是针对根在索引 1 处的堆。

另外,Build_Max_Heap 函数中的循环必须是:

for (int i = (length / 2); i >= 0; i--)

也就是说,你必须检查向量中的第一项是否需要重新排列。

【讨论】:

以上是关于构建 MaxHeap 最大没有被发送到顶部的主要内容,如果未能解决你的问题,请参考以下文章

xcode / storyboard:无法将栏按钮拖动到顶部的工具栏

GLSL将颜色数据从片段着色器发送到顶点着色器似乎总是等于0

滚动视图不滚动到顶部

js所有的变量声明都会被提升到顶部吗?

将自定义 BarButtonItem 添加到顶部导航栏

单击时手风琴滚动到顶部?