簡體   English   中英

如何檢查排序算法的空間復雜度?

[英]How to examine the space complexity of sorting algorithms?

如果我要用c ++實現三種排序算法,然后想檢查它們的空間復雜性/ RAM量,那么它們會占用很多空間。 我該怎么辦? 我可以使用任何標准庫或第三方庫嗎?

這是在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
...
$

您也可以grep與BRK而不是地圖

使用Valgrind:

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

希望能幫助到你 !

如果要檢查它們的復雜性(作為漸近函數),則實際上將無法憑經驗做到這一點,例如通過掛鈎分配和取消分配。 您需要通過仔細分析代碼來得出最大分配空間的漸近邊界。 在一般情況下,理論上不可能自動執行此任務,因為您的程序可能會非常復雜。

在實踐中,我建議您嘗試組織分配和取消分配,以免它們在整個地方自發發生。 這應該可以幫助您限制最大分配量。

在某種程度上,您需要一個軟件工具來衡量運行期間分配的數量-這對於StackOverflow來說是不合時宜的,您應該在softwarerecs.stackexchange.com上詢問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM