数据结构
文章平均质量分 50
数据结构
AcTarjan
冲冲冲!!!
展开
-
查找树简介
二叉搜索树,平衡二叉树、红黑树、B树、B+树原创 2022-09-23 11:01:32 · 332 阅读 · 0 评论 -
排序——归并排序
归并排序原创 2022-06-08 15:33:17 · 86 阅读 · 0 评论 -
排序——选择排序
简单选择排序,堆排序原创 2022-06-06 16:15:27 · 92 阅读 · 0 评论 -
排序——交换排序
冒泡排序,快速排序原创 2022-06-06 10:40:30 · 131 阅读 · 0 评论 -
查找——二分查找
查找给定值(两种写法)查找大于给定值的第一个元素查找小于给定值的最后一个元素原创 2022-06-02 09:40:59 · 78 阅读 · 0 评论 -
排序——插入排序
直接插入排序,二分插入排序,希尔排序原创 2022-06-01 17:48:40 · 113 阅读 · 0 评论 -
树——红黑树
什么是红黑树红黑树具有以下特征:结点为黑色或红色根结点和叶结点为黑色(叶结点是NULL结点,虚拟出来的,如果结点A的左孩子B为空,则B就是一个叶结点)不能出现连续的红结点任一结点到其叶子结点的路径中有相同的黑高(这个路径不包括源结点,黑高即黑色结点的数量)由红黑树的特征可以推出如下结论:红黑树的任一结点的平衡因子不超过子树的高度,即abs(HL - HR) <= min(HL,HR)证明:当子树最矮时,路径中必全为黑结点;当子树最高时,路径必是黑结点与红结点交替。由于特征4,两个原创 2022-05-16 14:50:34 · 202 阅读 · 0 评论 -
树——线索二叉树
什么是线索二叉树?通过链表存储具有n个结点的二叉树时,会有n+1个空指针。(证明:n个结点共有2n个指针,除根结点外,每个结点有唯一的父节点,即占用父节点的指针,这样就占用n-1个指针,即有n+1个空指针)引入线索二叉树(Threaded Binary Tree)的目的是为了利用这n+1个空指针,使其能存储更多信息,这些信息就是线索。我们知道二叉树通过(前序、中序或后序)遍历后能得到一个序列,我们想要知道这个序列中某个结点的前驱和后继,就想到利用这些空指针存储结点的前驱结点或后继结点。不同的序列就会有原创 2022-05-09 11:13:46 · 640 阅读 · 0 评论 -
KMP算法
应用串的模式匹配:在主串中确定模式串的位置主串S:S[0]、S[1]、……、S[n-1],长度为n模式串P:P[0]、P[1]、……、P[m-1],长度为mnext数组:根据模式串的性质生成的,next[i]=k 表示:当模式串中位置i处的字符不匹配时,需要跳转至位置k处进行比较如何确定next数组?若next[i] = k,则有:P[0]P[1]……P[k-1] = P[i-k]P[i-k+1]……P[i-1]我们从前向后推,next[0] = -1,表示当与模式串的位置0处的原创 2020-08-28 17:00:55 · 125 阅读 · 0 评论 -
并查集
使用数组root存储父节点的值。root[i]=x,如果x<0,表示i是一个集合的根结点,且这个集合有abs(x)个结点;如果x>=0,则表示x是结点i的父节点int[] root = new int[1005];int findRoot(int x){ if(root[x]<0) return x; return root[x]=findRoot(root[x]);//compressed path}void union(int x,int原创 2020-06-11 20:49:19 · 168 阅读 · 0 评论 -
平衡二叉树(AVL树)
平衡二叉树:又叫AVL树,是一种特殊的二叉查找树特点1、是一棵二叉查找树2、每一个结点的左子树和右子树的深度之差的绝对值不超过1原创 2020-06-03 11:31:14 · 664 阅读 · 0 评论 -
二叉搜索树
二叉搜索树:又叫二叉查找树、二叉排序树,类似二分查找特点1、结点的左儿子值小于结点的值,结点的右儿子值大于结点值2、树中结点的值都不相同3、一个结点的左子树必小于该结点右子树中的任何结点4、不是一棵完全二叉树,常用链表来实现操作1、查找从根结点开始,判断查找值与当前结点值的大小。若查找值大于当前结点值,则搜索当前结点的右儿子;若查找值小于当前结点值,则搜索当前结点的左儿子;若查找值等于当前结点值,则查找结束。2、插入从根结点开始,判断插入值与当前结点值的大小。若插入值原创 2020-06-01 11:09:06 · 988 阅读 · 0 评论 -
栈的应用——表达式求值
中缀表达式:后缀表达式:1、后缀表达式求值算法:遇到操作数将操作数入栈,遇到操作符号则取出栈顶的两个元素进行运算,并将运算结果入栈输入格式:每个操作数、操作符号用空格隔开例:6 2 / 3 - 4 2 * +package com.company;import java.util.Scanner;import java.util.Stack;public class Main { public static void main(String[] args) {原创 2020-05-28 16:44:43 · 572 阅读 · 0 评论 -
线段树——求逆序数
题目:hdu1394 Minimum Inversion Number逆序数:在数组a中,满足 且 的两个数个人感觉求逆序数用树状数组更方便一些,不过使用线段树也是可以的使用线段树求一个数组中逆序数的组数方法:(注:和树状数组求逆序数的方法很像,数组中元素互不相同)1、对于数组中元素很大而数组元素个数不多的情况下,可以先进行离散化2、按照数组从1到n逐个插入到线段树中,线段树...原创 2018-10-08 22:28:18 · 1287 阅读 · 0 评论 -
后缀数组的快速排序实现
快速排序更容易理解,直接写一个二元组的比较函数,用sort排序就可以了,每次排序时间复杂度,总的时间复杂度是,一般这个复杂度是可以接受的题目:落谷P3809【模板】后缀数组C++代码实现:#include <bits/stdc++.h>using namespace std;#define maxn 1000009typedef long long int ll...原创 2018-09-23 19:17:04 · 574 阅读 · 0 评论 -
后缀数组的基数排序实现
注:不懂基数排序的看这里-->基数排序基数排序的时间复杂度是,所以总的时间复杂度是题目:落谷P3809【模板】后缀数组C++代码实现:#include <bits/stdc++.h>using namespace std;#define infy 0x3f3f3f3f#define lowbit(x) (x&(-x))#define e ex...原创 2018-09-23 19:21:32 · 574 阅读 · 0 评论 -
后缀数组——height数组
说明:本文主要讲述后缀数组中的height数组,写后缀数组的一些题目时,发现大部分都要用到height数组,最长公共前缀就是height数组能求解的众多问题之一,本文通过对最长公共前缀的求解来讲述height数组,关于后缀数组的构造问题看这里:后缀数组的构造最长公共前缀(Longest Common Prefix)题目描述:给定一个字符串,求该字符串后缀a和后缀b的最长公共前缀定义he...原创 2018-09-19 22:18:29 · 2738 阅读 · 0 评论 -
堆(heap)
堆(heap):计算机科学中一类特殊的数据结构的统称,堆通常是一个可以被看做一棵树的数组对象。堆的性质:1、堆中某个节点的值总是不大于或不小于其父节点的值2、堆总是一棵完全二叉树根据父节点与子节点的大小关系将堆分为:最大堆:父节点大于子节点最小堆:父节点小于子节点堆的操作:siftdown(int i): 向下调整使结点i的元素满足堆的性质siftup(int ...原创 2018-09-25 21:17:43 · 299 阅读 · 0 评论 -
哈希表(Hash Table)
哈希表(Hash table,也叫散列表)根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。例如:给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希...原创 2018-09-25 21:34:33 · 324 阅读 · 0 评论 -
后缀数组的应用一
1、可重叠的最长连续子串题意:给一个字符串,问重复出现的连续的子串中最长的,重复的子串可以有重叠的部分,若结果不止一个则输出字典序最小的例:对于字符串"abcabcabc",结果为"abcabc";对于字符串"abcdggabc",结果为"abc"解法:找到height数组中最大的,假设height[i]是最大的,其值为s,则后缀Sa[i]的前s个字符就是结果2、不可重叠的最长连续...原创 2018-09-20 19:21:53 · 289 阅读 · 0 评论 -
后缀自动机应用及题目
1、最长公共子串问题(LCS问题)题目:SPOJ-LCS SPOJ-LCS22、最长不公共子串问题题目:40323、最小表示法问题题目:落谷P13684、第k小子串问题题目:bzoj-39985、后缀自动机+dp题目:SPOJ-Substring 落谷P3804 4516 45666、后缀自动机+维护题目:2555...原创 2018-09-26 20:09:45 · 429 阅读 · 0 评论 -
后缀自动机(Suffix automaton)
这玩意真的是坑啊,看了很多博客都没弄懂,课业繁忙,断断续续搞了三天才刚明白大意。。。定义介绍:给定字符串str,建立后缀自动机后缀自动机是什么?其实就是前缀树的压缩,存一个图的前缀树所耗费的空间太大了,我们利用字符串各个子串之间的关系去掉一些没必要出现的结点,后缀自动机有一个根节点,每次从根结点出发,到任意一个结点结束所形成的一个字符串都是str的子串sam(str):表示字符串s...原创 2018-09-26 22:52:19 · 535 阅读 · 0 评论 -
线段树——区间平方和
题目:牛客练习赛28:B-数据结构代码实现:#include <bits/stdc++.h>using namespace std;typedef long long int ll;struct node{ ll sum;//当前节点所表示的区间的和 ll asign;//加法延迟标记 ll msign;//乘法延迟标记 ll sq...原创 2018-10-07 16:00:27 · 2464 阅读 · 0 评论 -
线段树——区间最值
题目:hdu1754 I Hate It题目大意:1、询问区间最大值2、单点更新代码实现:#include <bits/stdc++.h>using namespace std;typedef long long int ll;int a[200009];int t[4*200009];int n,m;void build(int rt,int l,i...原创 2018-10-07 20:04:42 · 551 阅读 · 0 评论 -
线段树——将区间中的所有数修改为某个值
题目:hdu1698 Just a Hook题目大意:每次操作给出三个数x,y,z:表示将区间[x,y]中的所有值变为z查询某个区间的所有数的和(注:本题没有这一要求,但此代码可以实现这个操作)输出m次操作后,所有数的和代码实现:#include <bits/stdc++.h>using namespace std;typedef long long in...原创 2018-10-07 20:51:28 · 3252 阅读 · 1 评论 -
后缀数组(Suffix Array )
定义说明:后缀:从字符串的任意一个字符开始一直到最后一个字符所构成的一个字符串例如:对于字符串"abcdefg","cdefg"、"efg"、"g"都是后缀,"cde"则不是后缀 在学习后缀数组之前,我们首先要知道后缀数组是什么?后缀数组:将一个字符串的所有后缀按照字典序从小到大进行排序得到的一个数组给定字符串str,长度为n,位置编号从1到nSuffix数组(string...原创 2018-09-19 00:29:00 · 2529 阅读 · 0 评论