繁体   English   中英

我的程序随着时间的推移而变慢,我不知道为什么。 Memory 泄漏?

[英]My program is slowing down over time and i have no idea why. Memory leak?

我正在开发一个程序,它充当一个非常简单的投票系统,它从文件中读取数字,将文件中的数字转换为 unsigned int 类型。

以下是 txt 文件中数据的示例:

1 34 2 50 23 12
1 30 5 17
5
30 2 3 22
23 45

每行是一个人的投票,每行上的数字是该人的候选人偏好,左边是第一偏好,右边是最后偏好。

一旦从文件中读取了所有数据,它就会进入一个无限循环,其中每一轮(迭代)它都会计算剩余的候选者(即淘汰得票最少的候选者)。 当找到具有多数票的候选人时,程序以代码 0 退出。

我的问题是使用 g++ 编译器,大约在第 40 轮左右,程序开始变慢,我假设这是因为 memory 泄漏但是我不知道它可能在程序中的哪个位置泄漏。

这是我通过Deleaker调试程序时得到的。

注:谢谢大家的帮助。 但是,尽管我不想这样做,但由于某些原因,我需要编辑此处发布的代码。 我不会删除帖子,以防有人能以某种方式找到答案。 希望你能理解,谢谢。

我在这里做一些猜测,但就算法的时间复杂度而言,

while (p != vote_collection.end())  {
    //...
    if (p->spent()) {
        p = vote_collection.erase(p);
    }
 }

是有问题的,因为vote_collection是一个向量。 假设N是该容器的大小,即投票数。 p->spent()为真时(在以后的迭代中更有可能发生),那么您将擦除p 在最坏的情况下,从向量中擦除元素在N中具有线性时间复杂度(在开始擦除时,您可能会在从头到尾迭代向量时这样做。)因为这将发生在他的许多投票中,这个循环在N中具有二次时间复杂度。 如果输入变量可能很大,您总是希望避免二次复杂性。

出现这种情况的原因是向量将元素连续存储在 memory 中。 当您擦除一个元素时,擦除后的所有其他元素必须移动一个元素以缩小间隙。 这需要在擦除元素接近开头时移动几乎整个向量。

您可以简单地将所有已用票留在向量中,并确保ranked_candidates跳过已用票,而不是使用当前方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM