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

2021-06-07 14:24:23 字數 1905 閱讀 4347

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;

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 < olen; i++) //以下將新的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 < size; 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插入

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...

路由表選擇演算法

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

路由表建立演算法

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