[英]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.