路由表的結構與演算法分析 trie插入

2021-08-25 01:23:54 字數 2096 閱讀 2418

static struct list_head * fib_insert_node(struct trie *t, int *err, u32 key, int plen)

int pos, newpos;

struct tnode *tp = null, *tn = null;

struct node *n;

struct leaf *l;

int missbit;

struct list_head *fa_head = null;

struct leaf_info *li;

t_key cindex;

pos = 0;

n = t->trie;

while (n != null && node_type(n) == t_tnode) else

break;

bug_on(tp && is_leaf(tp));

if (n != null & amp;& is_leaf(n) && tkey_equals(key, n->key)) else else //有上述可知,新建立的tnode的bits都是1,這個在tnode_new中有說明,那麼這不成了二叉樹了嗎?bits為1說明只有2個孩子,但是今後要resize,resize的時候bits就會慢慢擴大了

if (!tn) else //最後將這兩個新的節點作為孩子加入到tn,注意這裡加入的是tn,而不是oldnode,如果加入oldnode就晚了,原來的節點將被永久的覆蓋掉。

put_child(t, tn, 2*i, (struct node *) left);

put_child(t, tn, 2*i+1, (struct node *) right);

for (i = 0; i

struct node *node = tnode_get_child(oldtnode, i);

struct tnode *left, *right;

int size, j;

if (node == null)//如果沒有這個孩子,忽略繼續。

continue;

if (is_leaf(node) || ((struct tnode *) node)->pos >

tn->pos + tn->bits - 1) //以下將新的left和right加入到tn,作為tn的孩子,可是left和right也要經受滿孩子檢查和孩子數量的檢查,這樣才不至於平衡了父親孩子卻失衡了,於是遞規呼叫resize函式接受和oldnode一樣的一切。

put_child(t, tn, 2*i, resize(t, left));// 可能原來oldnde的孩子inode的孩子全部都加到right上去了,這時,risize left的結果就是null,這樣就遞減了tn的滿孩子數。

put_child(t, tn, 2*i+1, resize(t, right));

tnode_free(inode);

tnode_free(oldtnode);

return tn;

nomem://在任何操作失敗的情況之下,都會回滾,類似於事務,要麼做完,要麼什麼也不做。

int size = tnode_child_length(tn);

int j;

for (j = 0; j

if (tn->child[j])

tnode_free((struct tnode *)tn->child[j]);

tnode_free(tn);

return err_ptr(-enomem);

以上就是trie插入操作的全部內容了,比起查詢複雜多了,最複雜的就是那個平衡操作,事實證明非常地消耗記憶體,我一直在思考linux到底為何不用一種 更加確定的方式來實現trie樹類似於bsd,僅僅是為了在兩個極端之間遊走的哲學意義上的原因嗎?我看它就像個小孩子來回跑,**設計的如果精妙卻丟失 了一種輝煌,類似於unix的那種輝煌,當你讀unix的時候,會不禁感覺到一種大氣在裡面,而linux卻沒有這種大氣,更多的是令人嘆為觀止的技巧, 讓人驚嘆的是這麼多的小小技巧結合起來看似沒有關係的**竟然能協同的那麼好,最終的結果就是可以勝任很多unix可以勝任的工作,這是乙個秘密,同時我 相信,哪怕用linux的人越來越多,其越來越被攻擊者重視,那麼它還是無懈可擊的,這也許也是乙個秘密吧。

路由表的結構與演算法分析 trie插入

2010 02 09 17 16 588人閱讀收藏 舉報static struct list head fib insert node struct trie t,int err,u32 key,int plen int pos,newpos struct tnode tp null,tn null...

路由表選擇演算法

一張路由表的建立和重新整理有兩種不同的方式 靜態路由與動態路由 1.靜態路由 配置方便,對系統要求較低,適用於拓撲結構簡單並且穩定的小型 網路。缺點是需人工配置。2.動態路由 有自己的演算法,能過自動適應網路拖布的變化,適用於具有一定數 量三層裝置的網路。缺點是 配置比較複雜,對系統要求較高,占用一...

路由表建立演算法

路由器 使用路由 演算法來找到到達目的地的最佳路由。當說 最佳路由 時,考慮的引數包括諸如跳躍數 分組 資料報在 網路中從乙個 路由器或中間 節點到另外的 節點的行程 延時以及分組資料報 傳輸通訊耗時。關於 路由器如何收集 網路的結構 資訊以及對之進行分析來確定最佳路由,有兩種主要的路由演算法 總體...