算法学习

数据结构

并查集

主要功能

查询是否为一个集合

主要变量

pre[]:表示某个点的祖先

主要函数

find(int index)

merge(int a,int b)

树状数组

主要功能

区间求和

单点更新

主要变量

V[]:表示往左lowbit长度的区间的内值的总和

主要函数

lowbit(int index):x&-x得到最低位的1的值,表示区间长度

add(int index):往上+lowbit

sum(int index):往下-lowbit

线段树

基于分治思想的二叉树结构。

主要功能

区间求和

区间更新

主要变量

STree{

int l,r;

int dat;

}t[n*4]

主要函数

build(int l,int r,int p):给结构体赋值区间和值。递归build,当l==r时,赋值。不相等时,从p*2,p*2+1取值。

change(int p,int x,int v):从根节点出发,根据x与mid的大小关系选择左右分支,找到x==x,则更新,然后往上更新。

ask(int p,int l,int r):根据情况分为左重叠,右重叠和完全重叠。

字典树

主要功能

实现字符串快速检索

主要变量

int pos = 1;//每新增一个前缀字符(树上多一个节点),则+1

int trie[1000010][26];//存储下一个字符的位置

int num[1000010];//以此为前缀的单词的数量

bool tail[1000010]; 标记某个字符是否为单词结尾

int p = 0;局部变量,表示该前缀字符在num中的位置

主要函数

void insert(char str[]){

int p = 0;

for(int i = 0; str[i]; ++i){

int n = str[i] - 'a';

        //该位置为0。则为他在num中新开辟一个空间,以记录数量

if(trie[p][n] == 0){

trie[p][n] = pos++;

}

p = trie[p][n];

num[p]++;

//根据需要打上标记

if(!str[i + 1]){

tail[p] = true;

}

}

}

int find(char str[]){//查找以某个字符串为前缀的单词数量

int p = 0;

for(int i = 0; str[i]; ++i){

int n = str[i] - 'a';

if(trie[p][n] == 0){

return 0;

}

p = trie[p][n];

}

return num[p];

}

二叉堆

主要功能

查询最值

主要变量

树的数组实现

主要函数

insert,最后一个节点插入,进行up操作

extract,最后一个节点替代顶点,进行down操作

removed,最后一个节点替代,进行up或down操作。

up

down

 

 

 

算法

dijkstra

每次优先队列pop,即最短路点集,flag【i】=1,队列存储的是节点。每次pop之后都要根据dist【i】+map[i][j]更新dist[j]

主要变量

dist【】,源点到某点的最短距离

map【】【】,点到点之间的距离

flag【】,是否已经在最短路点集中

主要函数

struct Node

{

int u, step;

Node() {};

Node(int a, int sp)

{

u = a, step = sp;

}

bool operator<(const Node& a)const {//重载 <

return step > a.step;

}

}

 

技巧

差分

给定一个数列A,差分数列为B

B[1]=A[1],B[i]=A[i]-A[i-1] (2<=i<=n)

实际上与前缀和序列为互逆运算,前缀和的差分即原序列,差分的前缀和即原序列

主要功能

区间更新:当区间[l,r]想要加1时,只需差分序列a[l]-1,a[r]+1,得到前缀和运算时,原序列该区间就会加1。

 

 

哈希打表

查看不同start的ans是否会重复,超时考虑打表。

主要变量

head[val]=tot;表示以某个哈希值为参数的第一个节点

next[tot]=tot;表示以雪花下标为参数的下一个节点的下标

snow[val];存储每个雪花的数据

主要函数

insert

hash

equal

 

posted @ 2022-07-14 17:29  Miraculous_B  阅读(43)  评论(0)    收藏  举报