![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和算法
文章平均质量分 66
介绍一些常用的数据结构和算法
无限飓风号
这个作者很懒,什么都没留下…
展开
-
【算法】字符串匹配算法
使用right[]记录字母表中的每个字符在模式中出现的最靠右的地方(如果字符在模式中不存在则表示为-1)。计算完right[]数组之后,我们用一个索引i在文本中从左向右移动,用另一个索引j在模式中从右往左移动。在查找过程的开始,从文本的开头进行查找,起始状态为0,它停留在0状态并扫描文本,直到找到一个和模式的首字母相同的字符。在这个过程的最后,当它找到一个匹配时,它会不断地匹配模式中的字符和文本,自动机的状态会不断前进直到状态M。每次匹配成功会将DFA带入下一个状态,匹配失败会使DFA回到较早之前的状态。原创 2023-08-02 23:38:55 · 229 阅读 · 0 评论 -
【数据结构】红黑树
红链接均为左链接没有任何一个结点同时和两条红链接相连该树是完美黑色平衡的,即任意空链接到根结点的路径上的黑链接数量相同如果将红链接画平,那么所有的空链接到根结点的距离都将是相同的。转载 2023-08-01 15:34:09 · 84 阅读 · 0 评论 -
【数据结构】优先队列
如果堆有序的状态因为某个节点变得比它的父节点更大而被打破,那么我们就需要通过交换它和它的父节点来修复堆。如果堆有序状态因为某个结点变得比它的两个子节点或是其中之一更小而被打破了,那么我们可以通过将它和它的两个子节点中的较大者交换来恢复堆。交换可能会在子节点处继续打破堆的有序状态,因此我们需要不断地用相同的方式将其修复,将节点下移直到它的子节点都比它更小或者到达了堆的底部。删除最大元素:我们将数组顶端删去最大的元素并将数组的最后一个元素放到顶端,减小堆的大小并让这个元素下沉到合适的位置。原创 2023-07-30 17:05:10 · 387 阅读 · 0 评论 -
【数据结构】线段树
线段树class NumArray {public interface Merger<E>{ E merge(E a, E b);}public class SegmentTree<E>{ /* 使用一个数组表示区间. 首先,用户可能要获取区间内某一个的元素,或者获取区间的某一个属性,我们在线段树中创建数组,作为区间数组的的副本,用于给出区间数组的某些属性; 其次,我们想将data数组内的元素(arr数组区间传递进来的)组织成为一个转载 2023-07-26 14:15:05 · 48 阅读 · 0 评论 -
【数据结构】差分数组
如果我们是对二维数组进行频繁修改,我们可以使用二维差分数组记录修改记录,对于arr[][] ,我们使用diff[][]标记二维数组,通过一维数组我们可以观察到一维数组的值是差分数组的前缀和,推广到二维数组,arr[i][j]也表示diff[i][j]的前缀和。假设我们存在数组arr[],我们使用另外一个数组diff表示arr数组中每个元素与前一个元素的差值,其中diff[i] = arr[i] - arr[i - 1]的值,对于diff[0] = arr[0],形式如下,其中diff就是我们的差分数组。原创 2023-07-20 16:26:06 · 310 阅读 · 0 评论 -
【算法】莫里斯遍历
Morris遍历转载 2022-01-23 15:27:53 · 521 阅读 · 0 评论 -
【算法】最小生成树
最小生成树什么是最小生成树Kruskal算法prim算法什么是最小生成树最小生成树是原图的最小连通子图,即包含原图的全部结点,且保持图连通的所有边代价和最小。一个连通图可能有多个最小生成树。生成最小生成树有两种经典解法:Kruskal算法和prim算法Kruskal算法按权值从大到小的边开始取,如果这条边的添加不会形成环,就取这条边,取到n-1条边就行,判断是否形成环,可以使用并查集。prim算法每次迭代选择代价最小的边对应的点,加入到最小生成树中,算法从某一个顶点s开始,逐渐长大覆盖整原创 2021-07-26 01:04:34 · 154 阅读 · 0 评论 -
【数据结构】并查集
并查集原创 2021-01-25 19:02:03 · 686 阅读 · 0 评论 -
【算法】快速幂算法
先从LeetCode一个题目开始:50.Pow(x, n)题目的要求是计算x的n次幂,注意n可能为负数,这道题比较直观的解法是模拟,即将x乘n次,最后将结果返回,时间复杂度是O(n),时间复杂度还是比较高的,如果n比较大的话要执行多次循环,我们可以将时间复杂度降低到O(log(n)),这就是快速幂思想。我们可以想象一下方法1的模拟思想为什么那么慢,这是因为乘以x的步骤执行了太多次,实际上我们可以这样运算,假设x ^ n = (x ^ (n / 2)) *( x ^ (n / 2)),这样我们就只需要原创 2021-08-23 00:58:45 · 94 阅读 · 0 评论 -
【算法】摩尔投票法
首先从一个leetcode问题开始:169. 多数元素题目要求就是统计一个数组中超过半数的元素,题目已经确保输入的元素中必然有一个符合要求。这个问题可以有很多解法,比如排序,使用map统计每一个元素的数量等,但是时间复杂度都超过O(n)。摩尔投票法的出现能使得时间复杂度将为O(n)。摩尔投票法(Boyer-Moore major vote algorithm)的具象理解我们已知一个数组中有一个元素的数量超过了其他元素数量的总和(大于一半),但是不知道是哪一个元素。那么我们可以这样想,把数组看成原创 2021-08-12 16:44:06 · 536 阅读 · 0 评论 -
【算法】常见排序算法
常见排序算法冒泡排序选择排序插入排序希尔排序归并排序快速排序首先抽象出以下算法常用的交换数组元素的操作swapprivate void swap(int arr[], int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;}冒泡排序算法模板@Testpublic void BubbleSort() { for (int i = 0; i < a.length; ++i) {原创 2021-06-30 13:23:32 · 67 阅读 · 0 评论 -
【算法】Fisher-Yates 洗牌算法
先从Leetcode一个问题 打乱数组 开始。题目的要求是构造一个类,用来,用来保存传入的数组,类提供两个方法,一个用来还原数组为传入时的状态,另一个用来打乱数组。类模板如下class Solution { public Solution(int[] nums) { } /** Resets the array to its original configuration and return it. */ public int[] reset() {.原创 2021-09-02 18:58:57 · 645 阅读 · 0 评论 -
【算法】判断一个元素是否是2的幂
判断一个元素是否是2的幂,这段代码也是Java HashMap中tableSizeFor方法的实现。boolean check(long x) { return getVal(x) == x;}//获取大于当前元素的最小的2的幂的元素int getVal(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n原创 2021-07-07 13:11:06 · 79 阅读 · 0 评论