在linux操作系統內核實現里經常使用的紅黑樹如下:
二叉樹,按中序遍歷後為一遞增數組,自平衡意味著樹的高度有一個上限,對於紅黑樹,其為2log(n+1),所以時間復雜度為最差為Olog(n)。
賦予二叉搜索樹自平衡特性的方法有多種,紅黑樹通過一下4條約束實現自平衡:
Every node is either red or black.
All NIL nodes (figure 1) are considered black.
A red node does not have a red child.
Everypathfrom a given node to any of its descendant NIL nodes goes through the same number of black nodes.
其中根節點為黑色。
紅黑樹的搜索與二叉搜索樹無異,但是插入和刪除可能會違背上述四條原則。需要用到左旋右旋操作。左旋右旋上圖,可以看到左旋右旋本身不改變二叉搜索樹的特性,旋轉後必要時改變節點的顏色可消除插入或者刪除帶來的紅沖突和黑沖突,有時紅黑樹的重新平衡需要迭代進行。
紅黑樹比較適合的應用場景:
需要動態插入、刪除、查找的場景,包括但不限於:
某些資料庫的增刪改查,比如select * from xxx where 這類條件檢索。
linux內核中進程通過紅黑樹組織管理,便於快速插入、刪除、查找進程的task_struct。
linux內存中內存的管理:分配和回收。用紅黑樹組織已經分配的內存塊,當應用程序調用free釋放內存的時候,可以根據內存地址在紅黑樹中快速找到目標內存塊。
hashmap中(key,value)增、刪、改查的實現;java 8就採用了RBTree替代鏈表。
Ext3文件系統,通過紅黑樹組織目錄項。
B. 如何使用arm-linux-gcc交叉編譯器生成map文件
方法/步驟
從網上下載arm-linux-gcc 4.4.3的源碼
進入Linux的終端,將當前目錄設為arm-linux-gcc的下載目錄,輸入tar -xzf arm-linux-gcc-4.4.3.tar.gz,將文件解壓,解壓後會有一個opt的文件夾。
在/usr/local/下建立一個名為arm的文件夾,在終端中輸入命令:cd /usr/local/,回車,然後再輸入命令:mkdir arm,建立arm目錄,並修改該文件夾的屬性為rwx,輸入命令:chmod 777 arm
將之前解壓得到的opt文件壓下的源碼,復制到上一步中創建的arm文件夾下,在終端中輸入命令:sudo cp -r /opt/FriendlyARM/toolschain/4.4.3 /usr/local/arm
到這里已經基本安裝好了,到為了避免每次使用arm-linux-gcc時都要輸入它所在的完整路徑,所以這里我們要修改一下環境變數$PATH。在終端中輸入:sudo gedit /etc/profile,打開profile文件,在最後一行加上「export PATH=$PATH:/usr/local/arm/4.4.3/bin」然後保存文件。
立即使新的環境變數生效,輸入:source /etc/profile。再輸入:echo $PATH查看環境變數,如圖。如果不成功,則直接重新啟動系統,再查看。因為之前我已經安裝過了,為了演示,所以圖中會有兩個/usr/local/arm/4.4.3/bin。
最後檢查是否安裝完成,輸入:arm-linux-gcc -v查看版本信息,如果出現以下信息,則說明安裝成功。
C. java 8 為什麼要採用紅黑樹來管理hashmap
java8不是用紅黑樹來管理hashmap,而是在hash值相同的情況下(且重復數量大於8),用紅黑樹來管理數據。 紅黑樹相當於排序數據。可以自動的使用二分法進行定位。性能較高。
一般情況下,hash值做的比較好的話基本上用不到紅黑樹。