半原創 核心中的資料結構 SplayTree

2021-06-07 16:41:19 字數 2294 閱讀 6901

核心中的資料結構:

splay tree

splay tree(伸展樹)是binary search tree(二叉搜尋樹), daniel sleator和robert e.tarjan發明。但此操作可能會花費o(n)時間,但m次操作的最壞情況為o(m*log2(n))。

splay tree是在節點訪問後,此節點將成為該樹的根。如此節點位置深,則根到該節點路徑上會有很多較深節點。旋轉後,這些節點的深度會減少。 

查詢頻率高的item經常在靠近樹根的位置。每次查詢後,對樹進行重構,把item挪倒離樹根近地方。splay tree是自調整形式的二叉查詢樹,會沿著某個節點到樹根間的路徑,通過一系列旋轉把此節點搬移到樹根。

rtlsplay  主要例程,完成節點到splay樹根的操作。

rtldelete 刪除節點,重新平衡。

rtlisroot 節點是否是splay樹根。

rtlrealpredecessor 返回節點的pre節點。

rtlinsertasleftchild

prtl_splay_links

rtlsplay( in prtl_splay_links links )

//  connect l & p

l->rightchild = p;

p->parent = l;

//  make l the root

l->parent = l;

} else if (rtlisleftchild(p)) 

//  connect g & c

g->leftchild = p->rightchild;

if (g->leftchild != null) 

//  connect l & great grandparent

if (rtlisroot(g))  else 

//  connect l & p

l->rightchild = p;

p->parent = l;

////  connect p & g

//p->rightchild = g;

g->parent = p;

} else 

////  connect p & c

//p->leftchild = l->rightchild;

if (p->leftchild != null) 

////  connect l & great grandparent

//if (rtlisroot(g))  else 

////  connect l & g

//l->leftchild = g;

g->parent = l;

////  connect l & p

//l->rightchild = p;

p->parent = l;

}} else 

////  connect p & l

//l->leftchild = p;

p->parent = l;

////  make l the root

//l->parent = l;

} else if (rtlisrightchild(p)) 

////  connect p & c

//p->rightchild = l->leftchild;

if (p->rightchild != null) 

////  connect l & great grandparent

//if (rtlisroot(g))  else 

////  connect l & p

//l->leftchild = p;

p->parent = l;

////  connect p & g

//p->leftchild = g;

g->parent = p;

} else 

////  connect g & c

//g->leftchild = l->rightchild;

if (g->leftchild != null) 

////  connect l & great grandparent

//if (rtlisroot(g))  else 

////  connect l & p

//l->leftchild = p;

p->parent = l;

////  connect l & g

//l->rightchild = g;

g->parent = l;}}

}return l;

}

核心中重要的資料結構

任務鍊錶 task list 流程排程程式為每個活動的流程維護乙個資料塊。這些資料塊儲存在稱為任務列表的鏈結列表中。程序排程程式始終維護乙個指示當前活動程序的當前指標。記憶體對映 memry map 記憶體管理器基於每個程序儲存虛擬位址到實體地址的對映,還儲存有關如何獲取和替換特定頁面的其他資訊。此...

Linux核心中的資料結構與演算法(一)

一,序言 其實想寫這個系列很久了,因為本人工作的關係,平時接觸linux核心很多,從業後很多時候在網上查詢的東西是片面或者不系統的,打算給自己的知識庫進行個整理吧,打算開筆寫這個系列,再加上自己想考研了,算是重新學習,也算鞏固自己的知識吧。如果有什麼錯誤和疏漏,也請看客們給出批評意見,比心比心比心 ...

Linux核心中的資料結構的一點認識

大家都知道linux核心是世界上優秀的軟體之一,作為一款優秀的軟體,其中的許多的設計都精妙之處,十分值得學習和借鑑。今天我們就帶大家看一下核心中的資料結構中一點設計。開啟核心原始碼中的 include linux list.h標頭檔案,就可以看到核心中宣告的一些與鍊錶操作相關的結構體定義和函式介面。...