q1.c++中map底層的資料結構
a:map底層資料結構是紅黑樹,紅黑樹是一種自平衡二叉樹,能夠保證查詢、插入、刪除操作在o(logn)時間複雜度內完成,每個節點用1bit儲存顏色,記憶體開銷和一般的二叉搜尋樹基本一樣;
總結一下紅黑樹的特性:
1.每個節點都有顏色,紅色或者黑色;
2.根節點是黑色;
3.每個葉子節點都是黑色的;
4.任一紅色節點,其子節點只能是黑色;
5.從任一節點到該節點每個葉子節點的所有路徑上包含相同數目的黑色節點。
在新增或刪除紅黑樹中的節點之後,紅黑樹的結構就發生了變化,可能就不滿足紅黑樹的5條性質了。這時候就需要採用旋轉和變色兩種操作使其保持特性。
紅黑樹的插入操作:
1.按照二叉搜尋樹的節點插入過程,將節點插入;
2.將插入的節點著色為紅色(為什麼著色為紅色,而不是黑色呢?);
3.通過一系列的旋轉和變色操作,使之重新成為一顆紅黑樹。
根據被插入節點的父節點的情況,分三種情況處理:
3.1 被插入的節點是根節點,即當前紅黑樹只有乙個根節點,直接將此節點塗為黑色;
3.2 被插入的節點的父節點是黑色,直接插入,無需處理;
3.3 被插入的節點的父節點是紅色,此時節點插入後,存在連續的紅色節點,違背了上述紅黑樹的特性4。這種情況下,當前插入節點必然存在非空祖父節點,也一定存在叔父節點(即使叔父節點為空,我們也視之存在,空節點本身就是黑色節點)。我們依據叔父節點的情況,進一步劃分為3種情況處理。
3.3.1 當前插入節點的父節點是紅色,叔父節點也是紅色
將當前節點的父節點和叔父節點變為黑色,祖父節點變為紅色,再將祖父節點設為當前節點(即把祖父節點看作新插入節點),對其進行操作。如果祖父節點此時為根節點,則將其變為黑色;若不是根節點且符合3.3.1的情況,可繼續執行上述操作。
3.3.2 當前插入節點的父節點(是祖父節點的左孩子)是紅色,叔父節點是黑色,且當前節點是其父節點的右孩子
將當前節點的父節點作為新的插入節點,並對其進行左旋,再判斷其情況進行操作。
若父節點是祖父節點的右孩子,將父節點變為黑色,祖父節點變為紅色,並對祖父節點進行左旋。
3.3.3 當前插入節點的父節點(是祖父節點的左孩子)是紅色,叔父節點是黑色,且當前節點是其父節點的左孩子
將父節點變為黑色,祖父節點變為紅色,並對祖父節點進行右旋。
若父節點是祖父節點的右孩子,則將當前節點的父節點作為新的插入節點,並對其進行右旋,再判斷其情況進行操作。
紅黑樹的刪除操作:
轉知乎詳細講解
a:(不知道,其實是斷點續傳)
q3.說一下氣泡排序…
a:氣泡排序的本質在於交換。
假設有無序序列a[n],首先將a[0]和a[1]比較,若a[0]>a[1],將二者交換位置,否則只比較不交換;之後再將a[1]和a[2]比較,執行同樣的操作,直到a[n-2]和a[n-1]比較完為一趟。總共進行n-1趟。
q4:作業系統中同步和非同步
a:(沒有說出來,對同步和非同步的理解還是不到位)
作業系統中同步與非同步和我們現實生活理解的不太一樣,一般我們對同步的理解是同時做很多事情,但程式中的同步是按照任務的順序執行,前乙個任務沒有執行結束,下乙個任務便不會執行,要等待上乙個任務執行結束。非同步是指同一時間內可以做很多事。
q5:vector是如何擴容的
a:vector為空時沒有預分配空間,每次新增元素時,判斷當前是否還有可用剩餘空間,若沒有則進行試探性擴容,並且把內容拷貝到新申請的記憶體中,釋放掉原先的記憶體。
記錄一次由br引起的亂碼問題
一 先上原始 import requests,time,json import urllib3 urllib3.disable warnings urllib3.exceptions.insecurerequestwarning headers data response requests.post...
由去中興的一次一次面試想到的
話題還是那天的中興的面試和中興計算機培訓,我今天早上突然之間明白了一些事情 於是不敢獨享,和大家一起 這還要從乙個故事說起 以前有乙個很成功的商人,有一次應邀參加乙個演講,他上台後馬上提了乙個問題 如果在座的各位被告知某地有 而這個地方的四周都是海,那你會怎麼做呢?下面的人紛紛議論,當然要馬上僱一艘...
關於實現紅黑樹的一些總結
一開始是打算照著 stl 寫的,結果發現乙個尷尬的情況 沒有allocator,std config.h,iterator,所以這個 rbtree1 就擱置了。後來 開始搞 rbtree2 又碰到了乙個很麻煩的問題。stl 原始碼裡面有乙個實現技巧 紅黑樹結點的結構是這樣的,還有乙個 templat...