红黑树相关的信息
轉(zhuǎn)載:https://www.cnblogs.com/wuchanming/p/4444961.html? ?
紅黑樹(shù)相關(guān)的知識(shí)點(diǎn),提高自己和面試應(yīng)該用的到
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)有什么步驟?
9?為什么一般hashtable的桶數(shù)會(huì)取一個(gè)素?cái)?shù)
詳細(xì)解答
1.stl中的set底層用的什么數(shù)據(jù)結(jié)構(gòu)?
紅黑樹(shù)
?
2.紅黑樹(shù)的數(shù)據(jù)結(jié)構(gòu)怎么定義?
?
3.紅黑樹(shù)有哪些性質(zhì)?
一般的,紅黑樹(shù),滿足以下性質(zhì),即只有滿足以下全部性質(zhì)的樹(shù),我們才稱之為紅黑樹(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);
?
思路:size[left[x]]表示在對(duì)x為根的子樹(shù)進(jìn)行中序遍歷時(shí)排在x之前的個(gè)數(shù),遞歸調(diào)用的深度不會(huì)超過(guò)O(lgn);
?
?
2).確定某個(gè)結(jié)點(diǎn)之前有多少個(gè)結(jié)點(diǎn),也就是我們要解決的問(wèn)題;
?
?
思路: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ì)新的操作。
9?為什么一般hashtable的桶數(shù)會(huì)取一個(gè)素?cái)?shù)
設(shè)有一個(gè)哈希函數(shù)
H( c ) = c % N;
當(dāng)N取一個(gè)合數(shù)時(shí),最簡(jiǎn)單的例子是取2^n,比如說(shuō)取2^3=8,這時(shí)候
H( 11100(二進(jìn)制)?) = H( 28 ) = 4
H( 10100(二進(jìn)制) ) = H( 20?)= 4
這時(shí)候c的二進(jìn)制第4位(從右向左數(shù))就”失效”了,也就是說(shuō),無(wú)論第c的4位取什么值,都會(huì)導(dǎo)致H( c )的值一樣.這時(shí)候c的第四位就根本不參與H( c )的運(yùn)算,這樣H( c )就無(wú)法完整地反映c的特性,增大了導(dǎo)致沖突的幾率.
取其他合數(shù)時(shí),都會(huì)不同程度的導(dǎo)致c的某些位”失效”,從而在一些常見(jiàn)應(yīng)用中導(dǎo)致沖突.
但是取質(zhì)數(shù),基本可以保證c的每一位都參與H( c )的運(yùn)算,從而在常見(jiàn)應(yīng)用中減小沖突幾率..
(個(gè)人意見(jiàn):有時(shí)候不取質(zhì)數(shù)效率也不會(huì)太差公司代碼中的值為1<<16,但是無(wú)疑取質(zhì)數(shù)之比較保險(xiǎn)的..)
總結(jié)
- 上一篇: QQ 音乐竟然可以免费听歌了,白嫖党的春
- 下一篇: 行存和列存的区别