數(shù)據(jù)結(jié)構(gòu)中堆和二叉排序樹(shù)的區(qū)別 請(qǐng)問(wèn)棧和堆究竟有何區(qū)別?
請(qǐng)問(wèn)棧和堆究竟有何區(qū)別?棧,在負(fù)責(zé)執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以不在棧上創(chuàng)建角色,函數(shù)不能執(zhí)行結(jié)束了時(shí)這些存儲(chǔ)單元自動(dòng)出現(xiàn)被施放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,只不過(guò)分配
請(qǐng)問(wèn)棧和堆究竟有何區(qū)別?
棧,在負(fù)責(zé)執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以不在棧上創(chuàng)建角色,函數(shù)不能執(zhí)行結(jié)束了時(shí)這些存儲(chǔ)單元自動(dòng)出現(xiàn)被施放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,只不過(guò)分配的內(nèi)存容量有限。
堆,應(yīng)該是那些由fun分配的內(nèi)存塊,他們的釋放者編譯器不去管,由我們的應(yīng)用程序去壓制,好象一個(gè)new現(xiàn)在就要填寫(xiě)一個(gè)delete。如果程序員是沒(méi)有施放掉,那么在程序結(jié)束了后,操作系統(tǒng)會(huì)不自動(dòng)回收公司。
堆和棧通常的區(qū)別有100元以內(nèi)幾點(diǎn):
1、管理有所不同;
2、空間大小相同;
3、是否可以再產(chǎn)生碎片完全不同;
4、生長(zhǎng)方向相同;
5、分配差別;
6、怎么分配效率完全不同;
管理這對(duì)棧來(lái)講,是由編譯器不自動(dòng)管理,不需我們手工控制;對(duì)于堆來(lái)說(shuō),能量工作由程序員壓制,不容易再產(chǎn)生memoryleak。
空間大?。合袷莵?lái)講在32位系統(tǒng)下,堆內(nèi)存可以達(dá)到4G的空間,這個(gè)堆內(nèi)存簡(jiǎn)直是沒(méi)有什么限制的。但是對(duì)于棧來(lái)講,就像也是有是有的空間大小的,.例如,在VC6下面,設(shè)置的??臻g大小是1M(像是,記不很清楚了)。不過(guò),我們可以不可以修改:
可以打開(kāi)工程,左面不能操作菜單如下:Project-gtSetting-gtLink,在Category中左鍵單擊Output,然后把在Reserve中設(shè)置堆棧的的最值和commit。
再注意:reserve最小值為4Byte;commit是記錄在虛擬內(nèi)存的頁(yè)文件里面,它設(shè)置里的較高會(huì)使棧開(kāi)辟出來(lái)減小的值,肯定提高內(nèi)存的開(kāi)銷和正常啟動(dòng)時(shí)間。
碎片問(wèn)題:對(duì)于堆來(lái)講,很頻繁的new/delete必然會(huì)造成內(nèi)存空間的不在不,使照成大量的碎片,使程序效率降低。對(duì)于棧來(lái)講,則絕對(duì)不會(huì)必然這個(gè)問(wèn)題,畢竟棧是先進(jìn)后出的隊(duì)列,他們是極為的直接對(duì)應(yīng),使得永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出對(duì)話框,在他彈出之前,在他上面的后進(jìn)的棧內(nèi)容巳經(jīng)被自動(dòng)彈出,具體點(diǎn)的這個(gè)可以建議參考數(shù)據(jù)結(jié)構(gòu),這里我們就不再繼續(xù)一一繼續(xù)討論了。
生長(zhǎng)方向:這對(duì)堆來(lái)講,生長(zhǎng)方向是往上的,也就是朝內(nèi)存地址提高的方向;相對(duì)于棧來(lái)講,它的生長(zhǎng)方向是往上的,是朝著內(nèi)存地址會(huì)增大的方向增長(zhǎng)。
分配堆大都日志分配的,沒(méi)有支持靜態(tài)分配的堆。棧有2種分配動(dòng)態(tài)和靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)分配是編譯器成功的,例如局部變量的分配。代碼分配由alloca函數(shù)并且分配,只不過(guò)棧的閃圖分配和堆是有所不同的,他的代碼分配是由編譯器參與釋放,無(wú)需我們手工基于。
分配效率:棧是機(jī)器系統(tǒng)需要提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧需要提供支持:分區(qū)分配專門(mén)買(mǎi)的寄存器貯存棧的地址,壓棧出棧也有專門(mén)買(mǎi)的指令負(fù)責(zé)執(zhí)行,這就決定了棧的效率比較好高。堆則是C/C函數(shù)庫(kù)需要提供的,它的機(jī)制是很奇怪的,的或?yàn)榱朔峙湟淮髩K內(nèi)存,庫(kù)函數(shù)會(huì)聽(tīng)從當(dāng)然的算法(具體的算法是可以參考數(shù)據(jù)結(jié)構(gòu)/操作系統(tǒng))在堆內(nèi)存中直接搜索后用的加上大小的空間,假如沒(méi)有相當(dāng)大小的空間(可能會(huì)是的原因內(nèi)存碎片太大),就有可能全局函數(shù)系統(tǒng)功能去提高程序數(shù)據(jù)段的內(nèi)存空間,那樣的話就有機(jī)會(huì)分到相當(dāng)大小的內(nèi)存,然后把通過(guò)前往。想來(lái),堆的效率比棧要低得多。
從這里發(fā)現(xiàn),堆和棧而言,由于大量new/delete的使用,太容易倒致大量的內(nèi)存碎片;而沒(méi)有專業(yè)點(diǎn)的系統(tǒng)支持,效率很高;導(dǎo)致很可能直接導(dǎo)致用戶態(tài)和核心態(tài)的切換,內(nèi)存的申請(qǐng),代價(jià)變得異常更加價(jià)格不菲。所以我棧在程序中是最為廣泛的,即便是函數(shù)的動(dòng)態(tài)鏈接庫(kù)也用來(lái)?xiàng)Hコ晒?,函?shù)調(diào)用過(guò)程中的參數(shù),前往地址,EBP和局部變量都按結(jié)構(gòu)棧的能保存。所以才,我們推薦一下大家最好就是用棧,而不是什么用堆。
確實(shí)棧有極為不少的好處,但導(dǎo)致和堆兩者相比又不是那就靈活自如,有的時(shí)候分配大量的內(nèi)存空間,那就用堆好一些。
無(wú)論堆應(yīng)該棧,都要避兔越界現(xiàn)象的發(fā)生(即使你是故意使其跨越雷池),而且越界的結(jié)果不是的話是程序崩散,不是的話是徹底摧毀程序的堆、棧結(jié)構(gòu),再產(chǎn)生以想不到的結(jié)果,就算是在你的程序運(yùn)行過(guò)程中,是沒(méi)有發(fā)生上面的問(wèn)題,你那就要千萬(wàn)小心,沒(méi)準(zhǔn)什么時(shí)候就崩掉,那時(shí)候debug不過(guò)非常難辦的。
數(shù)據(jù)結(jié)構(gòu)名詞排序?
設(shè)有n個(gè)待排序的記錄關(guān)鍵字,則在堆排序中不需要1個(gè)輔助記錄單元。
堆排序(Heapsort)是指用來(lái)堆積樹(shù)(堆)這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)什么的一種排序算法,它是你選排序的一種??梢詰{借數(shù)組的特點(diǎn)急速定位指定你索引的元素。堆統(tǒng)稱大根堆和小根堆,是幾乎完全二叉樹(shù)。大根堆的要求是每個(gè)節(jié)點(diǎn)的值都不小于其父節(jié)點(diǎn)的值,即A[PARENT[i]]A[i]。在數(shù)組的非降序排序中,需要不使用的那是大根堆,是因?yàn)閰⒄沾蟾训囊箢}意,最大的值是有在堆頂。