摘要:
链表 当平时使用数组时,有时会遇到一些问题: 在删除一个数据时,为了保证数据的连续性, 需要将删除点右边的数据、全部往左移一格。 在插入一个数据时,为了保证数据的连续性, 需要将插入点右边的数据、全部往右移一格。 每次移动的时间复杂度为O(N),如果元素较多时会时间超限。 链表一个位置包括了自己位置 阅读全文
摘要:
量产数据结构 概念:给一个序列,用树维护信息。 偏序类 树分治类 小Z的袜子类 一. 偏序类 1.偏序的概念 设 A 是一个非空集,P 是 A 上的一个关系, 若关系P是自反的、反对称的、和传递的,则称P是集合A上的偏序关系。 即P适合下列条件: (1)对任意的 a∈A , (a,a)∈P ; (2 阅读全文
摘要:
一. 算法基础 复杂度 时间复杂度用来衡量程序的运行速度。 运行速度 程序运行一个在内存中寻址、赋值、加法、减法、乘法、除法、开方, 都认为可以在常数的时间内进行,这样的操作都被认为是基本操作。 基于对程序基本操作的说明,一个程序的运行时间不仅跟问题本身有关, 还跟硬件速度、问题规模有关。一般来说, 阅读全文
摘要:
一、构建步骤 1.将所有模式串构建成 Trie 树 2.对 Trie 上所有节点构建前缀指针(类似kmp中的next数组) 3.利用前缀指针对主串进行匹配 AC自动机关键点一:trie字典树的构建过程 字典树的构建过程是这样的,当要插入许多单词的时候,我们要从前往后遍历整个字符串, 当我们发现当前要 阅读全文
摘要:
【一. 时间戳(dfn)】 什么是时间戳? 就是每个位置被访问到的次序。 比如说我们对一棵树进行深搜,在深搜中访问的相应次序就被我们称为时间戳。 【二. 树的dfs序】 1.dfs序的作用 维护一系列树上的问题,解决一棵树上的所有后代结点信息的更改和祖先结点有关改变, 通过dfs来记录树的每个顶点的 阅读全文
摘要:
一、二叉堆的定义 二叉堆使用完全二叉树(其前n-1层必须被填满,第n层也要从左到右顺序填满)来实现。 在二叉堆中,所有非终端结点的值均不大于(或不小于)其左右孩子的值。 若非终端结点的值均不大于其左右孩子结点的值,这样的二叉堆叫做小根堆(下图b), 小根堆根结点的值是该堆中所有结点的最小值; 同样的 阅读全文
摘要:
Trie,又称字典树 是一种用于实现字符串快速检索的多叉树结构。 每个节点都拥有若干个字符指针,若在插入或检索字符串时扫描到一个字符c , 就沿着当前节点的c这个字符指针,走向该指针指的节点。 下面我们来详细讨论Trie的基本操作过程。 初始化 一棵空Trie仅包含一个根节点,该点的字符指针均指向空 阅读全文
摘要:
循环字符串的最小表示法,即: 对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个。 思路:首先把S复制一份接在它的结尾,得到新串SS。 那么每个循环串可以表示为SS[ i ~ i+n-1 ](记为b[ i ])。 比较 b[ i ] 和 b[ j ] 。如果 i+k位 > j+k位,则 阅读全文
摘要:
1.求解类型 字符串匹配。给你两个字符串,寻找其中一个字符串是否包含另一个字符串。 如果包含,返回包含的起始位置。如下面两个字符串: str有两处包含ptr。分别在str的下标10,26处。 2.算法说明 我们从原始字符串str(假设长度为n)的第一个下标、 选取和ptr长度(长度为m)一样的子字符 阅读全文
摘要:
【字符串Hash】 1.特征与理解 用于寻找字符组出现的位置或次数的问题,即【字符串匹配问题】。 2.滚动哈希的优化技巧 选取两个合适的互质数b,h(b<h),假设字符串C=c1c2...cm, 定义哈希函数为:H(C)=(c1*b^(m-1)+c2*b^(m-2)+....+cm*b^0) mod 阅读全文