合集-数据结构与算法
摘要:前置知识 树是计算机中的一个抽象概念,形式上是递归的N个节点和N-1条边的集合,且每一条边都连接着一个相同的节点。这个特殊节点称为其他相连节点的父,其他相连节点是这个节点的子。特殊地,最开始的节点称为当前树的根节点,最终的没有子的节点称为叶。 从一个节点n1到另一个节点nk的路径定义为节点n1,n2
阅读全文
摘要:定义 一张图G是由顶点的集合V和边的集合E组成的。每条边连接了两个顶点v和w,其中v,w∈V。图分为有向图和无向图,无向图也可以理解成双向图,就是通过一条边连接的两点都可以到达对方,而有向图的话就规定了只能从一个顶点到达另一个顶点。另外,每条边还可以拥有自己的属性,称为权。 图中的一条路径就是从一个
阅读全文
摘要:加法 在二进制下,有异或操作、与操作、进位操作。异或操作是指两个数对应位置相同取0,不同取1;与操作是同为1取1,否则取0;进位就是各位置上的1或0左移若干位。 根据这些操作特性,加法可以分解成这样的过程,先是两个数异或,相当于得到了两个数没有进位的相加结果,然后两个数相与,相当于只有两个位置都是1
阅读全文
摘要:散列(hash)是一种能够以常数平均时间执行插入、删除和查找的技术。但是散列无法做到元素间的有序。 基本想法 散列的基本想法就是将元素按照一定的规则处理后,映射到散列表中的某个位置,比如是0到tablesize - 1的某个数,这样就可以保证能够快速的找到元素位置。这种映射就叫做散列函数(哈希函数)
阅读全文
摘要:冒泡排序 void bubble_sort(int arr[], int length) { for(int i = 0; i < length; ++i) //遍历数组,每次结束将最大元素依次放到最后 { for(int j = 0; j < length - i - 1; ++j) //开始冒泡
阅读全文
摘要:二分法体现了一种“分治”的思想。 二分查找 当需要在一个数组中查找某个元素的时候,我们自然而然地想到遍历整个数组,找到想要的元素就停止查找。这种方法的时间复杂度是O(n),那么有没有一种更高效一点的方法呢?这时候就轮到二分查找登场了,二分查找的时间复杂度是O(logn),显然是更高效的做法。不过使用
阅读全文
摘要:并查集 等价关系是满足下列3个性质的关系R: 自反性,对于所有的a∈S,有aRa。 对称性,aRb当且仅当bRa。 传递性,若aRb且bRc,则aRc。 如何判断a和b是否是等价的的呢?或者说如何将两个有等价关系的元素划入一个集合中? 一个满足a∈S的元素a,其等价类是S的这样一个子集:它包含了所有
阅读全文
摘要:manacher算法 manacher(马拉车)算法是用于快速查找最长回文子串的算法。 基本思想是在遍历查找的基础上维护一个当前回文字符串的位置,用于加速后续的查找。 记,left表示当前回文字符串的左边界;right表示当前回文字符串的右边界;idx表示当前索引的位置;mirror表示索引在回文字
阅读全文
摘要:KMP 算法 KMP算法是一种用于快速找出匹配的子字符串位置的算法。通过记录要匹配的字符串各位置前面子字符串最长相同前后缀的信息,达到加速匹配过程的效果。 前缀字符串是指从前向当前字符串位置数的字符串;后缀字符串是指从后向当前字符串数的字符串。这里是不包含自身位置的。例如字符串"aaabaa",其相
阅读全文