版權(quán)所有,轉(zhuǎn)載請(qǐng)注明出處,謝謝!
http://blog.csdn.net/silangquan/article/details/18655795
連續(xù)兩次面試都問(wèn)到了紅黑樹(shù),關(guān)鍵兩次都沒(méi)有答好,這次就完整地來(lái)學(xué)習(xí)整理一下。
沒(méi)有學(xué)習(xí)過(guò)紅黑樹(shù)的同學(xué)請(qǐng)參考:
<<Introduction to Algorithms>> Chapter 13 Red-Black Trees Chapter 14 Augmenting Data Structures
教你透徹了解紅黑樹(shù)
1.stl中的set底層用的什么數(shù)據(jù)結(jié)構(gòu)?
2.紅黑樹(shù)的數(shù)據(jù)結(jié)構(gòu)怎么定義的?
3.紅黑樹(shù)有哪些性質(zhì)?
4.紅黑樹(shù)的各種操作的時(shí)間復(fù)雜度是多少?
5.紅黑樹(shù)相比于BST和AVL樹(shù)有什么優(yōu)點(diǎn)?
6.紅黑樹(shù)相對(duì)于哈希表,在選擇使用的時(shí)候有什么依據(jù)?
7.如何擴(kuò)展紅黑樹(shù)來(lái)獲得比某個(gè)結(jié)點(diǎn)小的元素有多少個(gè)?
8.擴(kuò)展數(shù)據(jù)結(jié)構(gòu)有什么步驟?
詳細(xì)解答
1.stl中的set底層用的什么數(shù)據(jù)結(jié)構(gòu)?
紅黑樹(shù)
2.紅黑樹(shù)的數(shù)據(jù)結(jié)構(gòu)怎么定義?
enum Color { RED = 0, BLACK = 1 }; struct RBTreeNode { struct RBTreeNode*left, *right, *parent; int key; int data; Color color; };
3.紅黑樹(shù)有哪些性質(zhì)?
一般的,紅黑樹(shù),滿足以下性質(zhì),即只有滿足以下全部性質(zhì)的樹(shù),我們才稱(chēng)之為紅黑樹(shù):
1)每個(gè)結(jié)點(diǎn)要么是紅的,要么是黑的。
2)根結(jié)點(diǎn)是黑的。
3)每個(gè)葉結(jié)點(diǎn)(葉結(jié)點(diǎn)即指樹(shù)尾端NIL指針或NULL結(jié)點(diǎn))是黑的。
4)如果一個(gè)結(jié)點(diǎn)是紅的,那么它的倆個(gè)兒子都是黑的。
5)對(duì)于任一結(jié)點(diǎn)而言,其到葉結(jié)點(diǎn)樹(shù)尾端NIL指針的每一條路徑都包含相同數(shù)目的黑結(jié)點(diǎn)。
4.紅黑樹(shù)的各種操作的時(shí)間復(fù)雜度是多少?
能保證在最壞情況下,基本的動(dòng)態(tài)幾何操作的時(shí)間均為O(lgn)
5.紅黑樹(shù)相比于BST和AVL樹(shù)有什么優(yōu)點(diǎn)?
紅黑樹(shù)是犧牲了嚴(yán)格的高度平衡的優(yōu)越條件為代價(jià),它只要求部分地達(dá)到平衡要求,降低了對(duì)旋轉(zhuǎn)的要求,從而提高了性能。紅黑樹(shù)能夠以O(shè)(log2 n)的時(shí)間復(fù)雜度進(jìn)行搜索、插入、刪除操作。此外,由于它的設(shè)計(jì),任何不平衡都會(huì)在三次旋轉(zhuǎn)之內(nèi)解決。當(dāng)然,還有一些更好的,但實(shí)現(xiàn)起來(lái)更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)能夠做到一步旋轉(zhuǎn)之內(nèi)達(dá)到平衡,但紅黑樹(shù)能夠給我們一個(gè)比較“便宜”的解決方案。
相比于BST,因?yàn)榧t黑樹(shù)可以能確保樹(shù)的最長(zhǎng)路徑不大于兩倍的最短路徑的長(zhǎng)度,所以可以看出它的查找效果是有最低保證的。在最壞的情況下也可以保證O(logN)的,這是要好于二叉查找樹(shù)的。因?yàn)槎娌檎覙?shù)最壞情況可以讓查找達(dá)到O(N)。
紅黑樹(shù)的算法時(shí)間復(fù)雜度和AVL相同,但統(tǒng)計(jì)性能比AVL樹(shù)更高,所以在插入和刪除中所做的后期維護(hù)操作肯定會(huì)比紅黑樹(shù)要耗時(shí)好多,但是他們的查找效率都是O(logN),所以紅黑樹(shù)應(yīng)用還是高于AVL樹(shù)的. 實(shí)際上插入 AVL 樹(shù)和紅黑樹(shù)的速度取決于你所插入的數(shù)據(jù).如果你的數(shù)據(jù)分布較好,則比較宜于采用 AVL樹(shù)(例如隨機(jī)產(chǎn)生系列數(shù)),但是如果你想處理比較雜亂的情況,則紅黑樹(shù)是比較快的
6.紅黑樹(shù)相對(duì)于哈希表,在選擇使用的時(shí)候有什么依據(jù)?
權(quán)衡三個(gè)因素: 查找速度, 數(shù)據(jù)量, 內(nèi)存使用,可擴(kuò)展性。
總體來(lái)說(shuō),hash查找速度會(huì)比map快,而且查找速度基本和數(shù)據(jù)量大小無(wú)關(guān),屬于常數(shù)級(jí)別;而map的查找速度是log(n)級(jí)別。并不一定常數(shù)就比log(n) 小,hash還有hash函數(shù)的耗時(shí),明白了吧,如果你考慮效率,特別是在元素達(dá)到一定數(shù)量級(jí)時(shí),考慮考慮hash。但若你對(duì)內(nèi)存使用特別嚴(yán)格, 希望程序盡可能少消耗內(nèi)存,那么一定要小心,hash可能會(huì)讓你陷入尷尬,特別是當(dāng)你的hash對(duì)象特別多時(shí),你就更無(wú)法控制了,而且 hash的構(gòu)造速度較慢。
紅黑樹(shù)并不適應(yīng)所有應(yīng)用樹(shù)的領(lǐng)域。如果數(shù)據(jù)基本上是靜態(tài)的,那么讓他們待在他們能夠插入,并且不影響平衡的地方會(huì)具有更好的性能。如果數(shù)據(jù)完全是靜態(tài)的,例如,做一個(gè)哈希表,性能可能會(huì)更好一些。
在實(shí)際的系統(tǒng)中,例如,需要使用動(dòng)態(tài)規(guī)則的防火墻系統(tǒng),使用紅黑樹(shù)而不是散列表被實(shí)踐證明具有更好的伸縮性。Linux內(nèi)核在管理vm_area_struct時(shí)就是采用了紅黑樹(shù)來(lái)維護(hù)內(nèi)存塊的。
紅黑樹(shù)通過(guò)擴(kuò)展節(jié)點(diǎn)域可以在不改變時(shí)間復(fù)雜度的情況下得到結(jié)點(diǎn)的秩。
7.如何擴(kuò)展紅黑樹(shù)來(lái)獲得比某個(gè)結(jié)點(diǎn)小的元素有多少個(gè)?
這其實(shí)就是求節(jié)點(diǎn)元素的順序統(tǒng)計(jì)量,當(dāng)然任意的順序統(tǒng)計(jì)量都可以需要在O(lgn)時(shí)間內(nèi)確定。
在每個(gè)節(jié)點(diǎn)添加一個(gè)size域,表示以結(jié)點(diǎn) x 為根的子樹(shù)的結(jié)點(diǎn)樹(shù)的大小,則有
size[x] = size[[left[x]] + size [right[x]] + 1;
這時(shí)候紅黑樹(shù)就變成了一棵順序統(tǒng)計(jì)樹(shù)。
利用size域可以做兩件事:
1). 找到樹(shù)中第i小的結(jié)點(diǎn);
OS-SELECT(x;,i) r = size[left[x]] + 1; if i == r return x elseif i < r return OS-SELECT(left[x], i) else return OS-SELECT(right[x], i)
2).確定某個(gè)結(jié)點(diǎn)之前有多少個(gè)結(jié)點(diǎn),也就是我們要解決的問(wèn)題;
OS-RANK(T,x) r = x.left.size + 1; y = x; while y != T.root if y == y.p.right r = r + y.p.left.size +1 y = y.p return r
思路:x的秩可以視為在對(duì)樹(shù)的中序遍歷種,排在x之前的結(jié)點(diǎn)個(gè)數(shù)加上一。最壞情況下,OS-RANK運(yùn)行時(shí)間與樹(shù)高成正比,所以為O (lgn).
8.擴(kuò)展數(shù)據(jù)結(jié)構(gòu)有什么步驟?
1).選擇基礎(chǔ)數(shù)據(jù)結(jié)構(gòu);
2).確定要在基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)種添加哪些信息;
3).驗(yàn)證可用基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)上的基本修改操作來(lái)維護(hù)這些新添加的信息;
4).設(shè)計(jì)新的操作。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)站欄目:劍指XX游戲(六)-輕松搞定面試中的紅黑樹(shù)問(wèn)題-創(chuàng)新互聯(lián)
本文鏈接:http://aaarwkj.com/article44/deocee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、企業(yè)建站、品牌網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、動(dòng)態(tài)網(wǎng)站、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容