一、单链表
head存储头结点,e[i]存储第i个结点的值,ne[i]存储第i个结点下一个结点的结点号
二、双链表
在单链表的基础上,把ne数组改为l和r数组,分别用来存储第i个结点上一个结点和下一个结点的结点号。
三、模拟栈
数组模拟栈:新建一个数组,用tt变量表示当前栈顶。
先进后出数据结构。用于表达式求值:采用两个栈,一个存放操作数,一个存放操作码,依次读入字符串,读入数字则压入操作数栈,读入字符若当前字符优先级比操作码栈顶字符小则进行计算(弹出两个操作数和一个操作符进行计算,将结果压入操作数栈)直到当前字符优先级比操作码栈顶大或栈空为止。
四、模拟队列
数组模拟队列:新建一个数组,用变量hh和tt分别表示队头和队尾,队尾入队,队头出队。
五、KMP算法
字符串匹配若采用暴力枚举的算法,则i指针需要回退,kmp提供了一种i指针不需要回退的优化算法,核心思想是通过一个while循环,保证了i之前的j个字符是与模式串的前j个字符相匹配的,仅需匹配当前的i和模式串j+1的值即可。
六、trie树
核心思想是将字符串转按位展开成一颗树(树用一个二维数组son[p] [u]表示,从根节点p=0开始遍历如字母就每一层最多有26个节点),插入时随着指针遍历逐层递进,用idx表示节点编号,若当前节点没被创建过,则son[p][u]= ++idx,后p= son[p][u](走到下一层)当走到字符串终点时,计数值cnt[p]++,查询时遍历操作相同,走到终点时返回cnt[p]的值即可。
七、并查集
若p[i] = i 则说明i节点是根节点,a插到b下面:p[a] = b。优化:扁平化,保证每个集合只有一层,在查找的时候,将所有非根节点的父节点都改成根节点。可方便查找两个点是否在一个集合中(图中节点是否连通)。
八、模拟堆
堆排序的两个操作:下坠和上升,建堆时只需从1/2 n(最后一个非叶节点)开始往前下坠即可,时间复杂度是On。修改或删除非根非叶节点时需要根据当前数与父子节点的大小关系来判断是否需要下坠或上升,每次修改或删除非根非叶节点只可能进行上升或下坠一种操作。若需要找到或修改第k个插入的数,则需维护第k个数在堆中哪个位置和堆中位置对应的是第几个插入的数这两个数组(交换操作中需要修改这两个数组的值,注意修改顺序)。
九、哈希表
分为拉链法和开放定址法。
字符串哈希核心思想是把字符串近似为几个p进制的数(p一般取131)将每一位近似后存入哈希表,则整个哈希表可看成一个字符串的前缀和,查询区间子串是否相同可用前缀和的思想处理。