日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

红黑树相关的信息

發(fā)布時(shí)間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 红黑树相关的信息 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(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)怎么定義?

  • 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ù),我們才稱之為紅黑樹(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)??

  • 思路: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)題;

    ?

  • 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ì)新的操作。

    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é)

    以上是生活随笔為你收集整理的红黑树相关的信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。