如何检查排序算法的空间复杂度?

时间:2019-05-25 12:56:20

标签: c++ sorting space-complexity

如果我要在c ++中实现三种排序算法,然后想检查它们的空间复杂性/ RAM量,则会占用它们。我该怎么办?我可以使用任何标准库或第三方库吗?

2 个答案:

答案 0 :(得分:1)

这是在Unix / Linux下吗? 如果是这样,您可以在程序的开头和结尾计算 sbrk (0)返回的值之间的差。这样可以得出运行期间的堆内存总量。

请参见sbrk(2)上的手册页。 “ 以0增量调用sbrk()可用于查找程序中断的当前位置。

(附录) 使用仅分配一个大向量的玩具C ++程序,事实证明GNU C ++运行时倾向于使用mmap()而不是sbrk()来分配非常大的对象。

使用strace:

$ strace ./vec1.x |& grep map
...
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4ac2b42000
mmap(NULL, 800002048, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4a93051000
...
$

您也可以使用 brk 代替 map 使用grep。

使用Valgrind:

$ valgrind ./sbrk1.x
...
==22223==   total heap usage: 3 allocs, 3 frees, 800,073,728 bytes allocated
....
$

希望有帮助!

答案 1 :(得分:0)

如果您想检查它们的复杂性-作为一种渐近函数-您实际上将无法凭经验做到这一点,例如通过挂钩分配和取消分配。您需要通过仔细分析代码来得出最大分配空间的渐近边界。从理论上讲,一般情况下不可能自动执行此任务,因为您的程序可能会非常复杂。

在实践中,我建议您尝试组织分配和取消分配,以免它们在整个地方自发发生。这应该可以帮助您限制最大分配量。

在某种程度上,您需要一个软件工具来衡量运行期间分配的数量-对于StackOverflow来说是不合时宜的,您应该在softwarerecs.stackexchange.com上询问。