第二章 資料結構 二

2021-10-24 01:38:51 字數 2180 閱讀 1407

知識點 : trie樹 ,並查集,堆的操作

高效地儲存和查詢字串集合的資料結構

const

int n =

100010

;int son[n][26

],cnt[n]

,idx;

//插入

void

insert

(char str)

cnt[p]++;

//以這個點結尾的字元數

}//查詢

intquery

(char str)

return cnt[p]

;}

實現兩個集合的合併,詢問兩個元素是否在乙個集合中.幾乎 o(1);

原理 : 每乙個集合用一棵樹表示,每個結點儲存它的父親結點,p[x] 表示x的父親結點.

1.判斷樹根 : p[x] = x;

2.求x的集合編號 : while(p[x] != x) x = p[x]; 此時進行優化,路徑壓縮

3.合併 :

注意題目要維護的是啥…

維護size

int p[n]

,size[n]

;//根結點的元素個數

void

init

(int n)

}//返回x的祖宗

intfind_set

(int x)

//合併

intmerge_set

(int x,

int y)

維護與根結點的距離

int p[n]

, d[n]

;//p儲存每個點的祖宗節點, d[x]儲存x到p[x]的距離

intfind

(int x)

return p[x];}

// 初始化,假定節點編號是1~n

for(

int i =

1; i <= n; i ++

)// 合併a和b所在的兩個集合:

p[find

(a)]

=find

(b);

d[find

(a)]

= distance;

// 根據具體問題,初始化find(a)的偏移量

插入:,求集合中的最小值,刪除最小值.

刪除任意乙個元素 … 修改任意乙個元素…

本質是二叉樹.

用陣列模擬 : a[1]表示根節點,x 的左兒子是 2x , 右兒子是 2x + 1.

up 操作 : 每次找到兩個兒子最小的,與父親交換,直到不用交換.

//插入乙個數

heap[++sizee] = x;up(sizee);

//刪除最小值

heap[1] = heap[sizee];sizee–;down(1);

//刪除任意乙個元素

heap[k] = heap[sizee];sizee–;;down(k), up(k);

//修改任意乙個元素

heap[k] = x;down(k), up(k);

int n,m;

int h[n]

,sizee;

int ph[n]

,hp[n]

;//ph儲存第k個插入的點在堆中的位置

//hp儲存下標是k的點是第幾個插入的

void

h_swap

(int a,

int b)

void

down

(int u)

}voidup(

int u)

}int

main()

sizee = n;

//將h按照小根堆排好

for(

int i = n/

2;i;i--

)return0;

}//刪除最小的數

//刪除第k個數

//修改第k個數為x

//插入乙個數

資料結構 第二章總結

線性表是由n 0 個資料元素組成的有限序列。我們學習了線性表上定義的基本運算 有構造空表 initlist l 求表長 listlength l 取結點 getnode l i 查詢 locatenode l x 插入 insertlist l x,i 刪除 delete l i 還學習了順序表 單...

資料結構第二章總結

線性表簡稱表,是n個具有相同型別的資料元素的有限序列。線性表中資料元素的個數稱為線性表的長度。長度為零時稱為空表。線性表中資料元素的型別是同一的。線性表的順序儲存結構稱為順序表。儲存結構是資料及其邏輯結構在計算機中的表示 訪問結構是在乙個資料結構上對查詢操作的時間效能的一種描述。順序表的類的宣告 c...

資料結構導論 第二章

第二章主要說的是線性表,那麼什麼是線性表呢?線性表是一種線性結構,在頭結點無直接前驅有乙個直接後繼,尾節點無直接後繼有乙個直接前驅。1.線性表的順序儲存結構 簡單的說就是把線性表的結點按照它的邏輯結構順序,依次的存放到計算機記憶體中一組連續的儲存單元中。用順序儲存來實現的線性表為順序表。這裡要注意,...