数据结构与算法
SSSxCCC
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
KMP字符串匹配
KMP(KnuthMorrisPratt)字符串匹配算法是一种时间复杂度很低的字符串匹配算法。字符串匹配的任务是:对于长度为n的字符串string,寻找长度为m的子串pattern,若找到则返回string中第一次出现子串pattern的第一个字符的下标,否则返回-1。时间复杂度:O(n + m)空间复杂度:O(m)相比于暴力匹配字符串需要O(nm)的时间复杂度,KMP算法只要O(n + m)的时间复杂度。KMP字符串匹配方法:现以string = "abababc",pattern =原创 2021-04-25 00:58:29 · 199 阅读 · 0 评论 -
zkw线段树
zkw线段树(ZkwSegment Tree)是线段树的升级版,其功能与传统的线段树相同,可以维护一个长度为 n 的数组,用O(log n) 的时间复杂度更新元素,用O(log n) 的时间复杂得到区间和。相比于传统线段树的递归实现,zkw线段树只要使用循环即可实现,并且代码行数更少,执行效率更好。线段树有两个操作:1voidupdate(int i, int delta):更新数组中下标为 i 的元素的值,将其值加 delta2intget(int min, int max)...原创 2021-03-02 10:09:36 · 1039 阅读 · 1 评论 -
线段树
线段树(Segment Tree)是一种可以对区间进行快速查询与快速更新的数据结构。线段树有两个操作:1voidupdate(int i, int delta):更新数组中下标为 i 的元素的值,将其值加 delta2int get(int min, int max):得到区间 [min, max] 和线段树与树状数组非常相似,都是在长度为 n 的数组中,以 O(log n) 的时间复杂度更新数组元素,以O(log n) 的时间复杂度得到区间和/前缀和。时间复杂度:更新和求区...原创 2021-03-02 10:08:58 · 206 阅读 · 0 评论 -
树状数组
树状数组(Binary Indexed Tree)是一种可以同时快速得到数组的前缀和和快速更新数组的数据结构。树状数组有两个操作:1void update(int i, int delta):更新数组中下标为 i 的元素的值,将其值加 delta2int prefixSum(int i):计算数组到下标为 i 的元素的前缀和通常对于求长度为 n 的数组的前缀和的任务,我们可以将数组的前缀和提前计算出来保存到一个新的数组,此时求前缀和只有 O(1) 的时间复杂度,但是此时对数组中元素进...原创 2021-03-01 20:40:55 · 205 阅读 · 0 评论 -
字典树
字典树(Trie)是一种可以高效存储与查询字符串的数据结构,在字典树上每个边是一个字符,子结点比父结点多了一个其边上的字符。一个字典树如上图所示,这个字典树中存了单词:at, tea, ten, to。java代码实现:import java.util.*;public class Trie { private static class Node { String word = null; Map<Character, Node>原创 2021-03-01 18:01:19 · 185 阅读 · 0 评论 -
分数的java实现
由于程序中的浮点数不能准确表示一些实数,经过多次运算后会存在精度丢失导致计算结果越来越不准确的问题,这时可以考虑使用分数来进行数据的存储与运算,使用分数可以保证经过多次运算最终可以得到准确的结果。实现 classFraction ,保存分子 numerator 与分母 denominator 的值(保存前完成化简),并依次实现以下方法:add:分数相加subtract:分数相减multiply:分数相乘divide:分数相除opposite:得到相反数reciprocal:得到.原创 2021-03-01 17:35:20 · 1079 阅读 · 0 评论 -
并查集
并查集(Union-Find)是一种用来对元素进行分类与查找所在类的数据结构。并查集主要有两个操作:1.int find(int i):查找元素 i 所在的集合2.void union(int i, int j):将元素 i 所在的集合和元素 j 所在的集合合并为一个集合并查集最基本的思想是使用森林的数据结构来实现,在一开始所有元素都是一颗单独的树。当进行find 查找操作时,返回这个元素所在树的根结点。当进行union 合并操作时,将某个元素所在的树的根结点作为子结点连接到另一个元...原创 2021-03-01 17:13:43 · 153 阅读 · 0 评论 -
Floyd最短路径算法
Floyd最短路径算法是一种使用动态规划的思想求出图中任意两点之间最短路径的算法。时间复杂度:空间复杂度:其中 V 是图的顶点数。算法步骤:对于图中的每个顶点 k ,对于每对顶点 i 和j ,计算从 i 到 j 经过 k 的距离, 如果比之前计算的 i 到 j 之间的距离更短,则更新 i 到 j 的最短距离。这是一个三重循环,遍历完成后即得到了图中每对顶点之间的最短距离。java代码实现:public class Floyd { public static vo.原创 2021-03-01 16:27:56 · 438 阅读 · 0 评论 -
Dijsktra最短路径算法
Dijsktra最短路径算法是一种贪心算法。从图中某个起点开始向外逐步扩张,得到到达所有点的最短路径(如果有目标终点那么可以提前结束)。算法步骤:1 初始化一个 open 表和一个 closed 表,open 表中存放顶点和此点到起点的距离,closed 表中存放顶点2 将起点加入 open 表,其到起点的距离为 03 从 open 表中拿出一个到起点距离最小的顶点 v,其到起点的距离为 d ,如果 open 表是空的则结束4 如果 closed 表中存在顶点 v ,则回到步骤35原创 2021-03-01 16:10:37 · 430 阅读 · 2 评论 -
LruCache的原理与实现
LruCache(Least Recently Used Cache)是最近最少使用缓存。这种缓存能按照每个元素最近的使用情况维护元素的顺序,有一定的容量限制,并能在容量超出限制时自动删除最少使用的元素。java中的LinkedHashMap是一种能实现LruCache的数据结构。LinkedHashMap也像一般的Map一样其元素是以键值对<K, V>的形式按照哈希算法存储的,但是不同于一般的HashMap,其元素也是链表中的一个结点,而元素的值是存在这个结点中的。基于LinkedHa原创 2021-03-01 15:30:15 · 248 阅读 · 0 评论 -
拓扑排序
拓扑排序(Toplogical Sort)从一组有依赖关系的任务中得到一个能完成所有任务的序列。如图所示,有5个任务:0、1、2、3、4。其中有依赖关系:0必须在1和2之前完成;1必须在2之前完成;2必须在3和4之前完成;3必须在4之前完成。这样一组有依赖关系的任务可以看成是一个有向图,其中图的顶点是任务,有向边是依赖关系。顶点的入度是指在图中终点为该顶点的边的数量。排序算法步骤:1 初始化排序结果为一个空的列表2 选取入度为0的顶点加到排序结果列表的最后3原创 2021-03-01 15:07:13 · 336 阅读 · 3 评论 -
基数排序
基数排序(Radix Sort)是一种速度很快的按位排序算法。不同于常见的时间复杂度的快速排序算法和归并排序算法,基数排序的时间复杂度只有。时间复杂度:空间复杂度:其中n是数组的长度,k是所有元素的最大位数。排序方法:首先对个位排序,然后是十位、百位等,直到数组中最大的元素的最高位也排序过即可。每次排序时使用桶排序的思想,创建10个桶按顺序存储每个元素,在所有元素都装入桶后,再将所有元素按顺序复制回原数组中。java代码实现:import java.util.A...原创 2021-03-01 14:38:22 · 156 阅读 · 0 评论 -
归并排序算法
归并排序(Merge Sort)算法是一种分治思想的递归算法。与快速排序算法不同的是,归并排序是先排序小数组再排序大数组,而快速排序是先处理大数组再处理小数组。时间复杂度:空间复杂度:其中 n 是数组的长度。排序算法步骤:1要排序的数组是 a ,其元素数量为 n ,设当前处理的数组长度m = 22对所有长度为 m 的子数组进行归并(注意此时数组m的左半数组和右半数组是有序的) 2.1 申请长度为 m 的数组 t 作为额外空间 2.2 将左右两边的有序数组从小到大...原创 2021-03-01 11:13:21 · 515 阅读 · 3 评论 -
快速排序算法
快速排序算法是一种分治思想的递归算法。n是要排序的数组的长度时间复杂度:最好和平均:,最坏:空间复杂度:最好和平均:,最坏:排序算法步骤:1. 令 left = 0, right = n - 12. 对区间 [left, right] 进行排序,若 left >= right 则直接结束2.1. 设 m = a[left]2.2. 将区间中所有小于m的元素移到m的左边,所有大于m的元素移到m的右边2.3. 此时m元素的下标为middle3. 分别对区间 [lef原创 2021-02-26 19:02:40 · 184 阅读 · 0 评论
分享