数据结构
数据结构
fftx_00
这个作者很懒,什么都没留下…
展开
-
【数据结构】树状数组(维护一个线性序列的前缀区间)
区间查询->前缀和->树结构维护(log_2(n))(x-lowbit(x)+1) ->若无子结点是自身,若有子结点是最底层第一个子结点单点修改、区间查询:t[x]初始化为add(x,a[x])返回的和,只修改t[x]不修改a[x]+lowbit(x) -> 父结点,上一层的(连续)前缀和-lowbit(x) ->上一层的(不连续)前缀和-lowbit(x)+1 ...原创 2022-01-27 21:09:59 · 324 阅读 · 0 评论 -
【MOOC】散列冲突处理方法
一、开放定址法一旦产生了冲突(该地址已有其它元素),就按某种规则去寻找另一空地址。原创 2021-09-04 00:49:56 · 353 阅读 · 1 评论 -
【MOOC】散列函数的构造
让数字被尽可能多的位数影响原创 2021-09-03 16:52:09 · 95 阅读 · 0 评论 -
【MOOC】散列
动态查找问题:插入、删除、查找如果使用平衡二叉树,必然涉及到“关键字的比较”;而对于关键字为字符串的比较,需要一个字符一个字符地比较,原创 2021-09-03 16:37:03 · 76 阅读 · 0 评论 -
【MOOC】基数排序
一、桶排序二、基数排序——次位优先LSD算法如果需要待排元素可取的值很多,需要建的桶也很多,这样不太合算从个位开始,按照该位的数(关键字)排序,结果串成链表;将新链表再按上一位的数(十位)排序;直到最后一位排序完成(题中最大3位),所得链表即为整体有序的结果。三、基数排序——主位优先MSD算法但是显然“主位优先”在该问题中不是最易基数排序是稳定的排序算法!!...原创 2021-08-31 22:28:33 · 84 阅读 · 0 评论 -
【MOOC】表排序
一、间接排序每个待排元素都是一个庞大的结构,不易移动只移动指针通过table间接排序对表插入排序举例:排序其实是排table序列A[当前]<A[前一个table],则前一个table往后挪排序结果:A[table[0]],A[table[1]]…A[table[n-1]]第二题:0 12 0 12 0 1 32 0 4 1 32 5 0 4 1 32 5 0 4 1 6 3二、物理排序因此,在环中,...原创 2021-08-31 21:59:01 · 62 阅读 · 0 评论 -
【MOOC】快速排序
一、算法概述主要就是两个方面影响速度:1.选主元2.分子集快速排序最好情况:每次选主元都正好中分子集,T(N)=O(NlogN)二、选主元三、子集划分1.先判定左边指针i,直到碰到不符合的位置,停下不动;2.再开始判定右边指针j,直到直到碰到不符合的位置,停下不动;3.交换左右指针元素重复新一轮直到最后,当两个指针都停下来,且此时i>j——i是要找的主元位置快速排序的主元选定后,会被一次性放到全局...原创 2021-08-31 17:18:51 · 110 阅读 · 0 评论 -
【MOOC】归并排序
一、递归算法二、非递归算法原创 2021-08-25 18:00:29 · 103 阅读 · 0 评论 -
【MOOC】选择排序、堆排序
先将数组调整成最大堆将最大堆第一个元素与最后一个元素交换最大堆中删除最后一个元素堆排序数组不存在哨兵,因此孩子节点得*2+1、*2+2原创 2021-08-25 16:33:35 · 74 阅读 · 0 评论 -
【MOOC】希尔排序
Dk-间隔有序的序列,在执行D(k-1)-间隔排序之后仍然是Dk-间隔有序的O:上界,Ω:下界,θ:准确界希尔排序是不稳定的。原创 2021-08-25 14:30:44 · 106 阅读 · 0 评论 -
【MOOC】简单排序——冒泡、插入
1万个数据以上的排序一、冒泡排序一趟排序:从上到下,交换相邻的元素一趟排序结束可以保证:最下面的元素一定是本趟中最大的下一趟排序从开头到倒数第二个元素为止共N-1趟当中途就有序了,之后的比较动作就很多余可以使用标记,当中途就有序就退出当所有元素放在一个单向链表里,冒泡排序仍然可行(单向的扫描和交换)只有当下一元素严格大于上一元素时,才做交换;冒泡排序是稳定的。二、插入排序1.摸新牌2.从最...原创 2021-08-24 22:43:48 · 206 阅读 · 0 评论 -
【图论】关键路径
一、AOV网和AOE网AOE网和AOV网都是有向无环图,如果给定AOV网中各顶点活动所需要的时间,那么就可以将AOV网转换为AOE网(比较简单的方法是:将AOV网中的每个顶点都拆成两个顶点,分别表示活动的起点和终点, 两个顶点通过有向边连接,该有向边表示原顶点的活动,边权为需要的时间 原AOV网中的边全部视为空活动,边权为0(因为AOE结点表示已完成)总花费时间=到达终点的多条路径中花费时间最长的那条关键路径(要达到最短花费时间,不能拖延的路径):AO...原创 2021-09-28 17:00:26 · 2606 阅读 · 0 评论 -
【图论】拓扑排序
时间复杂度为O(V+E)可用来检测是否DAG(有向无环图)如果要求多个入度为0的顶点,选择编号最小的顶点,把queue改成priority_queue,并保持堆顶元素是优先队列中最小的即可(set也可以)...原创 2021-09-28 15:39:54 · 156 阅读 · 0 评论 -
【图论】最小生成树——kruskal算法
“边贪心”策略按边权递增对边排序,两测试点是否在同一连通块中,不在则将当前边加入最小生成树 在则舍弃直到测试完所有边或者最小生成树生成完毕(边数=n-1)由于需要对边权排序,使用邻接表每次都要遍历就不太好了,故直接定义边。struct edge{ int u,v;//边的两端点 int cost;//边权}E[MAXN];将每个连通块当成一个集合判断两个端点是否在同一个集合中——查 合并集合——并使用“并查集”!#...原创 2021-09-27 14:56:44 · 179 阅读 · 0 评论 -
【图论】最小生成树——prim算法
一、什么是最小生成树最小生成树(Minimum Spanning Tree,MST):在一个给定的无向图G中求一棵树T,树T拥有图G的所有顶点, 所有边都来自图G, 使得整棵树的边权最小贪心策略:prim算法: 让小树长大kruskal算法:将森林合并成树二、prim算法与Dijkstra算法区别:思想几乎完全相同,Dijkstra算法的最短距离指到源点s的最短距离;prim算法的最短距离指到集合s的最短距离时间复...原创 2021-09-27 13:44:14 · 229 阅读 · 0 评论 -
【图论】图的最短路径问题——多源最短路算法(Floyd算法)
(不适用于存在负值圈的情况)原创 2021-08-09 15:33:41 · 120 阅读 · 0 评论 -
【图论】单源最短路径问题——三种算法比较(Dijkstra,Bellman_ford,SPFA)
算法名称 能否处理负权边 时间复杂性 Dijkstra 因为核心算法是贪心, 所以不能处理负边权 o(V^2) o(VlogV)Heap+邻接表 Bellman—Ford 能,只要不是负环即可 o(VE)邻接表 SPFA 能,本质是队列优化的 Bellman—Ford, 负环只会增加出入队列次数 o(km)~o(VE) k为常数,通常不超过2原创 2021-09-26 14:30:27 · 752 阅读 · 0 评论 -
【图论】图的最短路径问题——有权图的单源最短路(Dijkstra算法)
有权图的单源最短路与无权图的区别:1.有权图的最短路不一定是经过顶点数最少的那条路2.负值圈问题(negative-cost cycle)每次收录未收录顶点中dist最小者保证了->收录V只可能使V邻接点的路径变短=min{dist[W],dist[V]+E<V,W>}(反证法:如果收录V使非V邻接点K路径变短,原先 dist[K]=E<S,W>+E<W,K>收录后dist[K]=E<S,V>+...原创 2021-08-08 23:12:23 · 1138 阅读 · 0 评论 -
【图论】图的最短路径问题——无权图的单源最短路
最短路径问题:在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径第一个顶点:源点最后一个顶点:终点单源最短路径问题:(无权、有权)从某固定源点出发,求其到所有其他顶点的最短路径多源最短路径问题:求任意两顶点间的最短路径无权图的单源最短路只需要记录每个顶点最短路径上的前一个顶点;就可以递归打出每个顶点到源点的最短路径。dist[s]需要一开始被初始化为0,其他顶点的dist则应是明显无效值...原创 2021-08-07 21:47:34 · 513 阅读 · 0 评论 -
【数据结构】图的遍历——邻接表实现dfs\bfs
#include <bits/stdc++.h>using namespace std;int nv,ne;vector<int> v[100010];int flag_dfs=0;int visited_dfs[100010];void dfs(int root){ visited_dfs[root]=1; printf("%s%d",flag_dfs==0?"":" ",root); flag_dfs=1; for(int i=.原创 2022-02-04 19:38:12 · 611 阅读 · 0 评论 -
【图论】图的遍历
一、深度优先搜索(DFS,Depth First Search)从结点处看其邻接点,若有邻接点未被访问,则挑一个访问;直到没有邻接点未被访问,退回上一步;直至退回起点。邻接表: 访问邻接点,O(N+2E)~O(N+E)邻接矩阵:访问邻接点,O(N^2)二、广度优先搜索(BFS,Breadth First Search)三、图不连通...原创 2021-07-31 15:27:16 · 99 阅读 · 0 评论 -
【图论】图的建立——邻接表法
1.图的定义2.表头结点定义3.邻接点定义4.初始化一个有顶点但没有边的图5.插入一条边6.建立图 总函数原创 2021-08-01 22:00:23 · 265 阅读 · 0 评论 -
【图论】图的建立——邻接矩阵法
一、邻接矩阵法1.图顶点的定义2.初始化一个有顶点但没有边的图3.插入一条边4.建立图 总函数5.邻接矩阵建图 简单版二、邻接表法原创 2021-08-01 14:30:57 · 611 阅读 · 0 评论 -
【图论】图的表示
一、什么是图二、图的邻接矩阵表示使用一个一维数组存储无向图:G[i][j]=G[i*(i+1)/2+j](i>=j;行>=列)对于非网络:有边G[i]=1,无边G[i]=0对于网络 :有边G[i]=权重,无边?三、图的邻接表表示...原创 2021-07-31 13:18:43 · 83 阅读 · 0 评论 -
【MOOC】并查集
连接(关系)的传递性一、并查集二、集合的存储结构查(属于哪个集合):找其根结点并:把一个根连上另一个根三、集合运算为改善查找性能,可以采用小的集合合并到大的集合中(修改Union函数)要比较大小,需要知道每个集合的元素个数(利用根结点存储的负值)...原创 2021-07-29 14:45:17 · 133 阅读 · 0 评论 -
【MOOC】哈夫曼树和哈夫曼编码
字符出现频率不同,为了节约空间,使用不等长编码表示。根据结点不同的查找频率构造更有效的搜索树。一、哈夫曼树的定义哈夫曼树:叶结点到根节点的路径乘叶结点的频率最小。二、哈夫曼树的构造如何选取两个最小的?利用最小堆(效率高)排序效率不高三、哈夫曼编码当所有字符都在叶结点上时,就不会出现一个字符是另一个字符的前缀码。编码代价=路径长度*叶结点权(频率)构造一棵哈夫曼树...原创 2021-07-28 15:29:56 · 144 阅读 · 0 评论 -
【MOOC】堆
一、什么是堆如果使用普通的二叉搜索树,删除几次之后,树就歪掉了,由于结构的改变,查找效率也不再是log2(n)二、堆的完全二叉树表示堆:完全二叉树+最大or最小三、最大堆的创建H:堆的指针H->Elements:申请一块数组的空间:MAXSIZE+1,0号位置存储哨兵,1号位置开始存储元素从倒数第一个有儿子的结点开始考虑(没有儿子的已经是堆了)四、最大堆的插入因为在0号位置放了一个哨兵...原创 2021-07-26 15:33:10 · 153 阅读 · 0 评论 -
【MOOC】平衡二叉树
搜索树结点不同的插入顺序会导致不同的树结构;树结构不同会导致不同的深度和平均查找长度ASL;即会影响搜索树的查找效率。一、什么是平衡二叉树二、平衡二叉树的最少结点情况最少结点的平衡二叉树递推公式与斐波那契数列十分类似通过n_h和F_i的映射关系得出:n_h和F_i的关系式。由斐波那契数列的拟合函数,推出n_h的函数关系(n与h指数关系),因此树高h是对数函数关系。即平衡二叉树查找效率是log2(n)三、...原创 2021-07-24 14:30:53 · 243 阅读 · 0 评论 -
【MOOC】二叉搜索树
解决动态查找问题一、二叉搜索树二、查找Find()都是尾递归,效率不高//平衡二叉树三、插入Insert()//原树为空,返回修改后的下个BST;原树不为空,返回未修改的下个BST。四、删除delete()左子树的最大值或者右子树的最小值一定不是有两个儿子的结点。且替代其也不会破坏二叉搜索树的结构。1.找到右子树最小Tmp,填进要删除的结点2.在右子树中递归删除右子树最小...原创 2021-07-22 22:22:48 · 278 阅读 · 0 评论 -
【MOOC】二叉树的遍历
讨论区参考回答:因为右子树push进来的时候,根已经被pop了,所以没法后序,必须将根二次push才可以。原创 2021-07-19 16:37:14 · 163 阅读 · 0 评论 -
【MOOC】二叉树
一、二叉树的相关概念二、二叉树的存储课后习题设深度为d(只有一个根结点时,d为1)的二叉树只有度为0和2的结点,则此类二叉树的结点数至少为2d-1可以看到,该树每一级都只有一个节点有两个子节点。深度为d,即除了第一级,其余每一级都有2个节点,故总共2d-1个节点。参考:https://blog.csdn.net/tiao_god/article/details/104915698...原创 2021-07-18 20:22:46 · 294 阅读 · 0 评论 -
【MOOC】树与树的表示
树是边最少的一种连接方式。度:结点的子树个数,树的所有结点中最大的度。叶节点父节点、子节点、兄弟结点路径和路径长度:从结点n1到nk的路径,路径所包含的边的个数为路径长度祖先结点、子孙结点结点的层次、树的深度:根节点在1层,后一层树是父结点的层数+1。树的所有结点中的最大层次是树的深度。...原创 2021-07-18 19:11:48 · 86 阅读 · 0 评论 -
【MOOC】静态查找(顺序查找、二分查找)
查找静态查找、动态查找静态查找1.顺序查找技巧:建立哨兵(每次循环少判断一次,降低时间复杂度)2.二分查找有序存放 连续存放在二分查找的程序实现中,如果left和right的更新不是取mid+1和mid-1而是都取mid,则若未查找成功,也无法通过left,right相对位置关系退出循环。由于在数组中对要查找的元素进行有序化的组织,使得我们的查找过程是按照固定的(事先定义的)顺序进行,这个顺序是形成一个类似像树这样的一个结构。反过来说,能...原创 2021-07-17 14:56:34 · 139 阅读 · 0 评论 -
【MOOC】线性结构
1.线性表(顺序存储、链式存储、广义表、多重链表)带头结点方便操作2.栈顺序存储、链式存储、双栈、表达式求值(后缀、中缀)3.队列顺序存储、链式存储、双栈模拟队列现采用大小为10的数组实现一个循环队列。设在某一时刻,队列为空且此时front和rear值均为5。经过若干操作后,front为8,rear为2,问:此时队列中有多少个元素?rear:队尾,增加元素front:队首,删除元素共4个...原创 2021-07-15 14:57:20 · 405 阅读 · 0 评论 -
【MOOC】链表
#include <stdio.h>#include <stdlib.h>#define ElementType inttypedef struct LNode *List;struct LNode{ ElementType Data; List Next;};//求表长,返回表长int Length(List PtrL){ List p=PtrL; int i=0; while(p){ i++; .原创 2021-07-13 23:07:56 · 148 阅读 · 0 评论 -
【MOOC】最大子列问题-4法
//法1:每次都扫描整个序列 #include <cstdio>int MaxSebSum1(int A[],int len){ int Max_sum=0,current_sum=0; for(int i=0;i<len;i++){ for(int j=i;j<len;j++){ current_sum=0;//在计算新子列值时,先清空原值 for(int k=i;k<=j;k++){ //注意此处计算的是A[i]-A[j]间的和,计算子.原创 2021-07-13 22:04:58 · 67 阅读 · 0 评论