劍指XX游戲(六)-輕松搞定面試中的紅黑樹問題-創(chuàng)新互聯(lián)

版權(quán)所有,轉(zhuǎn)載請注明出處,謝謝!
http://blog.csdn.net/silangquan/article/details/18655795

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供黎川網(wǎng)站建設(shè)、黎川做網(wǎng)站、黎川網(wǎng)站設(shè)計(jì)、黎川網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、黎川企業(yè)網(wǎng)站模板建站服務(wù),十載黎川做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

  連續(xù)兩次面試都問到了紅黑樹,關(guān)鍵兩次都沒有答好,這次就完整地來學(xué)習(xí)整理一下。

沒有學(xué)習(xí)過紅黑樹的同學(xué)請參考:

<<Introduction to Algorithms>> Chapter 13 Red-Black Trees Chapter 14 Augmenting Data Structures

教你透徹了解紅黑樹

1.stl中的set底層用的什么數(shù)據(jù)結(jié)構(gòu)?

2.紅黑樹的數(shù)據(jù)結(jié)構(gòu)怎么定義的?

3.紅黑樹有哪些性質(zhì)?

4.紅黑樹的各種操作的時(shí)間復(fù)雜度是多少?

5.紅黑樹相比于BST和AVL樹有什么優(yōu)點(diǎn)?

6.紅黑樹相對于哈希表,在選擇使用的時(shí)候有什么依據(jù)?

7.如何擴(kuò)展紅黑樹來獲得比某個(gè)結(jié)點(diǎn)小的元素有多少個(gè)?

8.擴(kuò)展數(shù)據(jù)結(jié)構(gòu)有什么步驟?

詳細(xì)解答

1.stl中的set底層用的什么數(shù)據(jù)結(jié)構(gòu)?

紅黑樹

2.紅黑樹的數(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.紅黑樹有哪些性質(zhì)?

一般的,紅黑樹,滿足以下性質(zhì),即只有滿足以下全部性質(zhì)的樹,我們才稱之為紅黑樹:
1)每個(gè)結(jié)點(diǎn)要么是紅的,要么是黑的。
2)根結(jié)點(diǎn)是黑的。
3)每個(gè)葉結(jié)點(diǎn)(葉結(jié)點(diǎn)即指樹尾端NIL指針或NULL結(jié)點(diǎn))是黑的。
4)如果一個(gè)結(jié)點(diǎn)是紅的,那么它的倆個(gè)兒子都是黑的。
5)對于任一結(jié)點(diǎn)而言,其到葉結(jié)點(diǎn)樹尾端NIL指針的每一條路徑都包含相同數(shù)目的黑結(jié)點(diǎn)。

4.紅黑樹的各種操作的時(shí)間復(fù)雜度是多少?

能保證在最壞情況下,基本的動(dòng)態(tài)幾何操作的時(shí)間均為O(lgn)

5.紅黑樹相比于BST和AVL樹有什么優(yōu)點(diǎn)?

紅黑樹是犧牲了嚴(yán)格的高度平衡的優(yōu)越條件為代價(jià),它只要求部分地達(dá)到平衡要求,降低了對旋轉(zhuǎn)的要求,從而提高了性能。紅黑樹能夠以O(shè)(log2 n)的時(shí)間復(fù)雜度進(jìn)行搜索、插入、刪除操作。此外,由于它的設(shè)計(jì),任何不平衡都會(huì)在三次旋轉(zhuǎn)之內(nèi)解決。當(dāng)然,還有一些更好的,但實(shí)現(xiàn)起來更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)能夠做到一步旋轉(zhuǎn)之內(nèi)達(dá)到平衡,但紅黑樹能夠給我們一個(gè)比較“便宜”的解決方案。

相比于BST,因?yàn)榧t黑樹可以能確保樹的最長路徑不大于兩倍的最短路徑的長度,所以可以看出它的查找效果是有最低保證的。在最壞的情況下也可以保證O(logN)的,這是要好于二叉查找樹的。因?yàn)槎娌檎覙渥顗那闆r可以讓查找達(dá)到O(N)。

紅黑樹的算法時(shí)間復(fù)雜度和AVL相同,但統(tǒng)計(jì)性能比AVL樹更高,所以在插入和刪除中所做的后期維護(hù)操作肯定會(huì)比紅黑樹要耗時(shí)好多,但是他們的查找效率都是O(logN),所以紅黑樹應(yīng)用還是高于AVL樹的. 實(shí)際上插入 AVL 樹和紅黑樹的速度取決于你所插入的數(shù)據(jù).如果你的數(shù)據(jù)分布較好,則比較宜于采用 AVL樹(例如隨機(jī)產(chǎn)生系列數(shù)),但是如果你想處理比較雜亂的情況,則紅黑樹是比較快的

6.紅黑樹相對于哈希表,在選擇使用的時(shí)候有什么依據(jù)?

權(quán)衡三個(gè)因素: 查找速度, 數(shù)據(jù)量, 內(nèi)存使用,可擴(kuò)展性。
總體來說,hash查找速度會(huì)比map快,而且查找速度基本和數(shù)據(jù)量大小無關(guān),屬于常數(shù)級(jí)別;而map的查找速度是log(n)級(jí)別。并不一定常數(shù)就比log(n) 小,hash還有hash函數(shù)的耗時(shí),明白了吧,如果你考慮效率,特別是在元素達(dá)到一定數(shù)量級(jí)時(shí),考慮考慮hash。但若你對內(nèi)存使用特別嚴(yán)格, 希望程序盡可能少消耗內(nèi)存,那么一定要小心,hash可能會(huì)讓你陷入尷尬,特別是當(dāng)你的hash對象特別多時(shí),你就更無法控制了,而且 hash的構(gòu)造速度較慢。

紅黑樹并不適應(yīng)所有應(yīng)用樹的領(lǐng)域。如果數(shù)據(jù)基本上是靜態(tài)的,那么讓他們待在他們能夠插入,并且不影響平衡的地方會(huì)具有更好的性能。如果數(shù)據(jù)完全是靜態(tài)的,例如,做一個(gè)哈希表,性能可能會(huì)更好一些。

在實(shí)際的系統(tǒng)中,例如,需要使用動(dòng)態(tài)規(guī)則的防火墻系統(tǒng),使用紅黑樹而不是散列表被實(shí)踐證明具有更好的伸縮性。Linux內(nèi)核在管理vm_area_struct時(shí)就是采用了紅黑樹來維護(hù)內(nèi)存塊的。

紅黑樹通過擴(kuò)展節(jié)點(diǎn)域可以在不改變時(shí)間復(fù)雜度的情況下得到結(jié)點(diǎn)的秩。

7.如何擴(kuò)展紅黑樹來獲得比某個(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 為根的子樹的結(jié)點(diǎn)樹的大小,則有

size[x] = size[[left[x]] + size [right[x]] + 1;

這時(shí)候紅黑樹就變成了一棵順序統(tǒng)計(jì)樹。

利用size域可以做兩件事:

1). 找到樹中第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)

思路:size[left[x]]表示在對x為根的子樹進(jìn)行中序遍歷時(shí)排在x之前的個(gè)數(shù),遞歸調(diào)用的深度不會(huì)超過O(lgn);

2).確定某個(gè)結(jié)點(diǎn)之前有多少個(gè)結(jié)點(diǎ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的秩可以視為在對樹的中序遍歷種,排在x之前的結(jié)點(diǎn)個(gè)數(shù)加上一。最壞情況下,OS-RANK運(yùn)行時(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)上的基本修改操作來維護(hù)這些新添加的信息;

4).設(shè)計(jì)新的操作。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站欄目:劍指XX游戲(六)-輕松搞定面試中的紅黑樹問題-創(chuàng)新互聯(lián)
本文鏈接:http://muchs.cn/article44/deocee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(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)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化