資料結構2

2021-10-10 23:28:31 字數 2903 閱讀 2030

// s是長文字,p是模式串,n是s的長度,m是p的長度

求模式串的next陣列:

for(

int i =

2, j =

0; i <= m; i ++

)// 匹配

for(

int i =

1, j =

0; i <= n; i ++

)}

int son[n][26

], cnt[n]

, idx;

// 0號點既是根節點,又是空節點

// son儲存樹中每個節點的子節點

// cnt儲存以每個節點結尾的單詞數量

// 插入乙個字串

void

insert

(char

*str)

cnt[p]++;

}// 查詢字串出現的次數

intquery

(char

*str)

return cnt[p]

;}

(

1)樸素並查集:

int p[n]

;//儲存每個點的祖宗節點

// 返回x的祖宗節點

intfind

(int x)

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

for(

int i =

1; i <= n; i ++

) p[i]

= i;

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

p[find

(a)]

=find

(b);(2

)維護size的並查集:

int p[n]

, size[n]

;//p儲存每個點的祖宗節點, size只有祖宗節點的有意義,表示祖宗節點所在集合中的點的數量

// 返回x的祖宗節點

intfind

(int x)

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

for(

int i =

1; i <= n; i ++

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

size[

find

(b)]

+= size[

find

(a)]

; p[

find

(a)]

=find

(b);(3

)維護到祖宗節點距離的並查集:

int p[n]

, d[n]

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

// 返回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)的偏移量

// h[n]儲存堆中的值, h[1]是堆頂,x的左兒子是2x, 右兒子是2x + 1

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

// hp[k]儲存堆中下標是k的點是第幾個插入的

int h[n]

, ph[n]

, hp[n]

, size;

// 交換兩個點,及其對映關係

void

heap_swap

(int a,

int b)

void

down

(int u)

}voidup(

int u)

}// o(n)建堆

for(

int i = n /

2; i; i --

)down

(i);

(

1) 拉鍊法

int h[n]

, e[n]

, ne[n]

, idx;

// 向雜湊表中插入乙個數

void

insert

(int x)

// 在雜湊表中查詢某個數是否存在

bool

find

(int x)(2

) 開放定址法

int h[n]

;// 如果x在雜湊表中,返回x的下標;如果x不在雜湊表中,返回x應該插入的位置

intfind

(int x)

return t;

}

核心思想:將字串看成p進製數,p的經驗值是131或13331,取這兩個值的衝突概率低

小技巧:取模的數用2

^64,這樣直接用unsigned

long

long儲存,溢位的結果就是取模的結果

typedef

unsigned

long

long ull;

ull h[n]

, p[n]

;// h[k]儲存字串前k個字母的雜湊值, p[k]儲存 p^k mod 2^64

// 初始化p[0

]=1;

for(

int i =

1; i <= n; i ++

)// 計算子串 str[l ~ r] 的雜湊值

ull get

(int l,

int r)

資料結構 2

2016 02 06 17 38 指標和陣列 指標和一維陣列 陣列名一維陣列名是個指標常量,它存放的是一維陣列第乙個元素的位址,它的值不能被改變 一維陣列名指向的是陣列的第乙個元素 下標和指標的關係 a i a i 假設指標變數的名字為p 則p i的值是p i p所指向的變數所佔的位元組數 指標變數...

資料結構2

定義 只允許在一端插入和刪除的線性表 允許插入和刪除的一端稱為棧頂 top 另一端稱為棧底 bottom 特點後進先出 lifo 棧的棧的主要操作 棧的主要操作主要操作 棧的主要操作 adtstack 棧的陣列表示 順序棧 define stacksize 100typedef char stack...

資料結構 2

class queue object 佇列 雙端佇列 def init self 私有化,封裝 self.queue def enqueue self item 從尾部往佇列中新增乙個元素 def enqueue start self item 從頭部新增元素 雙 self.queue.insert...