数据结构
文章平均质量分 75
Unique-You
这个作者很懒,什么都没留下…
展开
-
线性索引(稠密索引、稀疏索引即分块索引、多重表、倒排表)
索引是把一个数据文件的关键码和它对应的数据记录相关联的过程。每一个关联构成一个索引项,每个索引项至少应包含关键字和其对应的记录在存储器中的位置等信息。所有索引项的集合构成该文件的索引表。保存在磁盘上的索引表又称索引文件。索引技术是组织大型数据库以及磁盘文件的一种重要技术。索引按照结构可以分为线性索引,树形索引和多级索引。所谓线性索引就是将索引项集合组织为线性结构,也称为索引表。重点了解三种线性索引...原创 2017-10-17 16:07:06 · 3212 阅读 · 0 评论 -
交换排序(冒泡排序--快速排序)
1、冒泡排序(1)基本思想:(2)排序过程:示例:(3)算法分析:代码1:高效的冒泡排序算法代码2:不高效冒泡排序算法之一代码3:不高效的冒泡排序算法之二2、快速排序(1)基本思想:(2)步骤:示例:(3)算法分析:原创 2017-10-10 21:30:50 · 588 阅读 · 0 评论 -
选择排序(简单选择排序--改进的简单选择排序--堆排序)
选择排序:每一趟从待排序序列中选一个按序所需要的记录,放在已排好序的子序列之前或之后,保持有序,这样,有序子序列每次增加一个记录,直到全部记录排完为止。1、简单选择排序基本思想:每一趟从待排记录序列中选具有最小关键字值的记录,顺序放在已排好序的子序列后,直到全部记录排完。步骤:(1)在第i(i=1,2,3,......,n-1)次挑选步骤中,在记录r[i],r[i+1],r[n]中挑出最小值r(2...原创 2017-10-10 17:08:09 · 653 阅读 · 0 评论 -
顺序查找--二分查找--静态树表的查找--分块查找
一、顺序表的顺序查找1、顺序查找由表的一端开始,逐个检测每个记录是不是要查的记录。找到则查找成功,一直找到另一端还没找到则失败。1)顺序存储结构下的顺序查找#include using namespace std;typedef int KeyType;struct RecType{ KeyType key;//关键字域};//岗哨设在r[0]int Seq原创 2017-10-13 13:46:22 · 1454 阅读 · 0 评论 -
树形结构的查找(二叉排序树-创建、查找、插入、删除)
一、二叉排序树1、定义:对于根节点,若左子树不空,则左子树上所有节点值小于根节点,若右子树不空,则右子树所有节点值大于等于根节点,左右子树也是二叉排序树。2、构造:按关键字读入次序构造。第一个关键字作为根节点,然后每读入一个关键字,就与根节点比较,若较小,则当左子树为空时,把它作为根的左孩子,若左子树非空,则把它插入根的左子树上;若较大,则当右子树为空时,把它作为根的右孩子,若右子树非空,原创 2017-10-14 15:19:06 · 1748 阅读 · 0 评论 -
树形结构的查找(平衡二叉树--插入时调整)
一、平衡二叉树的定义1、二叉树高度定义空二叉树高度为0,仅含1个根节点高度为1;二叉树中所有叶子节点的最大路径长度,即根节点到叶子节点的最大长度为二叉树高度。2、平衡二叉树定义任一节点的左右子树的高度相差不超过1的二叉树为平衡二叉树。即对任一节点,设左子树高度L,右子树高度H,则|L-H|3、平衡二叉排序树AVL既是平衡二叉树,又是二叉排序树的二叉树,简称平衡二叉树,即一般原创 2017-10-15 16:34:39 · 686 阅读 · 0 评论 -
散列表(哈希表)(散列函数构造、处理冲突、查找)
前面介绍的查找是建立在比较的基础上,查找效率由比较次数决定,不仅与被查数据整体的存储结构有关,还与逻辑上可被查找的数据集合所含的数据个数有关,同时与待查记录在查找表中位置以及查找策略如查找方向有关。理想的查找是不经过任何比较就能根据所查关键吗直接得到待查记录所在的存储位置。散列查找技术就是朝该方向努力,它在关键码和存储位置之间建立一种对应关系,散列函数,由该函数可计算出关键码唯一的地址。在存储...原创 2017-10-17 11:28:53 · 23474 阅读 · 1 评论 -
最小生成树
关于图的几个概念定义:连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图。强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图。连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但...原创 2018-03-09 09:28:45 · 1211 阅读 · 0 评论 -
单源最短路径(迪杰斯特拉Dijkstra算法)
求某个源点到其余各顶点的最短路径。顶点集V分为子集S和子集V-S。S:包含已确定最短路径的顶点(初始只含源点v)V-S:包含尚未确定最短路径的顶点(初始含除v外的其他顶点)数组dist,dist[i]:当前找到的从源点v到vi的“当前最短路径”。初值,v到vi的边的权值(无边为无穷大)在V-S中选从源点到该顶点具有“当前最短路径长度”最小的vk加入S。从V-S中删除顶点vk。原创 2018-03-09 10:36:05 · 2075 阅读 · 0 评论 -
最短路径问题 弗洛依德Floyd算法:带权图中每一对顶点间最短路径
A为存放图中所有顶点对之间的最短路径长度的n阶方阵。初始A为邻接矩阵,A=w。取k=0,1,...,n-1,计算A[i][j]=min{A[i][j],A[i][k]+A[k][j]},(即vi到vj依次加入v0,v1,...vn-1,找最短路径)P[n][n],P[i][j]保存顶点i到j的最短路径中i的直接后继例子,如下图,求下图的每个点对之间的最短路径的过程如下:原创 2018-03-09 13:27:20 · 7581 阅读 · 1 评论 -
拓扑排序
DAG有向无环图AOV网:顶点表示活动,弧表示活动间先后关系的有向图,即活动在顶点上的网络拓扑序列:将AOV所有顶点v0,v1,...vn-1排成线性序列vi0,vi1,...vin-1,满足:若vi到vj有一条路径,则vi排在vj前面。vi0,vi1,...vin-1就是一个拓扑序列(不一定唯一)拓扑排序步骤:在有向图中选一个入度为0的顶点,且输出;在图中删除该顶点和以它为尾的弧;重复这两部,直...原创 2018-03-10 10:52:21 · 6165 阅读 · 0 评论 -
关键路径
AOE网 无环赋权有向图:顶点表示事件,弧表示活动关键活动按时开始和完成,不会影响整个工程的进度。只有缩短关键活动的完成时间才有可能缩短整个工程完成时间。非关键活动,即使缩短完成时长也不一定能缩短整个工程完成时间。关键路径(不一定唯一,但长度相等):源点到终点的最长路径关键活动:关键路径上的活动事件vj的最早发生时间ve(j)、事件vi的最迟发生时间vl(i)v原创 2018-03-10 13:05:56 · 6402 阅读 · 0 评论 -
总时差 自由时差
在工程网络计划中,工作 M 的最早开始时间为第 16 天,其持续时间为 5 天。该工作有三项紧后工作,他们的最早开始时间分别为第 25 天、第 27 天和第 30 天,最迟开始时间分别为第 28 天、第 29 天和第 30 天。则工作 M 的总时差为(7)天。对于有紧后工作的工作,其自由时差等于本工作之紧后工作最迟开始时间减本工作最早完成时间所得之差的最小值,即:自由时差=25-(16+5)=4天...原创 2018-03-26 16:47:26 · 4336 阅读 · 0 评论 -
后台研发常见问题(数据结构与算法)
一、Hash表Hash表实现(拉链和分散地址)点击打开链接 Hash策略常见的有哪些? STL中hash_map扩容发生什么?(1) 创建一个新桶,该桶是原来桶两倍大最接近的质数(判断n是不是质数的方法:用n除2到$sqrt(n)$范围内的数) ;(2) 将原来桶里的数通过指针的转换,插入到新桶中(注意STL这里做的很精细,没有直接将数据从旧桶遍历拷贝数据插入到新桶,而是通过指针转换)(3) 通过...原创 2018-04-03 11:19:13 · 2741 阅读 · 0 评论 -
若度为m的哈夫曼树中,其叶结点个数为n,则非叶结点的个数为()
首先说明一点,我们平时一般所说的哈夫曼树是指最优二叉树,也叫做严格二叉树(注意不是完全二叉树),但是哈夫曼树完全不局限于二叉树,也存在于多叉树中,即度为m的哈夫曼树,也叫最优m叉树,严格m叉树(注意不是完全m叉树).这题表示哈夫曼树的节点 的度要么是0要么是m设度不为0(即非叶结点)的个数为X则总的结点数为:X+n除根结点外,其余的每一个结点都有一个分支连向一个结点,对于度为m的每个结点都有m个分...转载 2018-07-03 19:49:52 · 9409 阅读 · 4 评论 -
插入排序(直接插入排序--折半插入排序--谢尔排序)
插入排序分为直接插入排序,折半插入排序,谢尔排序等。1.直接插入排序基本思想:以排好序的记录子序列(简称子序列)开始,每次将待排序的一个记录,按照其关键字大小插入到前面已经排好序的子序列中的适当位置,即保持关键字大小有序,排好序的记录子序列每次增加一条记录,直到所有的记录都排好序为止。即:第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数...原创 2017-10-10 10:36:07 · 620 阅读 · 0 评论 -
桶排序
桶排序是计数排序的变种, 对待排序列A,若其中最大元素为k,则需要k+1个桶(数组C[0~k]),初始时,对每个桶赋值为0。对于元素A[i]=x,则相应的桶x中元素个数加1,即C[[A[i]]++=C[x]++。也就是,对元素x,桶x记录元素x的个数。然后遍历桶数组,把桶数组中元素大于0的下标作为值按次序依次填入待排序数组,元素的值作为重复填入该下标的次数,遍历完成则排序结束序列有序。原创 2017-10-12 20:07:06 · 1598 阅读 · 0 评论 -
计数排序
计数排序原创 2017-10-12 15:03:56 · 824 阅读 · 0 评论 -
树形索引(B-树查找、插入、删除)
一、B-树定义B-树上每个节点包含多个关键码从小到大排序,是一种平衡的多路查找树。最底层节点称为外节点或叶结点,一般可省略。除了外结点,B-树上的节点还有终端结点(叶结点的上一层)和非终端结点(终端结点层以上的结点)。一颗m阶B-树,或为空树,或为满足下列特性的m叉树:(1)树中每个结点最多有m颗子树(2)若根节点不是空节点(或根节点不是叶结点),子树个数2~m(3)除根节点和外节点之外的每个结点...原创 2017-10-17 17:27:02 · 9696 阅读 · 2 评论 -
树形索引(B+树)
一棵m阶的B+树和m阶的B-树的异同点在于: 1.有n棵子树的结点中含有n 个关键字,即每个关键码对应一颗子树 2.所有的终端结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且终端结点本身依关键字的大小自小而大的顺序链接。 (而B- 树的叶子节点并没有包括全部需要查找的信息) 3.所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小...原创 2017-10-17 21:43:50 · 3163 阅读 · 0 评论 -
树形索引(键树)
一、键树键树又称为数字查找树,它是一颗度大于等于2的树,树中的每个结点中不是包含一个或几个关键字,而是只含有组成关键字的符号。例如,若关键字为数值,则结点中只包含一个数位;若关键字为单词,则结点中只包含一个字母字符。这种树会给某种类型关键字的表的查找带来方便。 我们来举一个例子吧,下面有一个集合:{CAI,CAO,LI,LAN,CHA,CHANG,WEN,CHAO,YUN,YANG,...原创 2017-10-18 14:49:22 · 3145 阅读 · 1 评论 -
生成树和生成森林
1、无向图的生成树和生成森林对于无向连通图,在图的深度优先遍历或广度优先遍历过程中经历的边的集合和 图中的所有顶点一起构成图的极小连通子图,就是一颗生成树(深度优先生成树、广度优先生成树)。对非连通无向图,深度优先搜索遍历或广度优先搜索遍历,每个连通分量中的顶点集合遍历时走过的边一起构成若干颗生成树,这些连通分量的生成树组成非连通图的生成森林(深度优先生成森林、广度优先生成森林)。深度原创 2017-10-20 13:44:49 · 11899 阅读 · 1 评论 -
图的存储结构(邻接矩阵、边数组、邻接表、十字链表、邻接多重表)
一、邻接矩阵有向图的邻接矩阵:无向图的邻接矩阵:网的邻接矩阵:#include <iostream>using namespace std;#define INFINITY 65535 /* 表示权值的无穷*/typedef int EdgeType;//边上的权值类型typedef char VertexType;//顶点类型const int MaxSize=100;...原创 2017-10-19 10:49:43 · 5514 阅读 · 0 评论 -
图的定义、基本术语
1、图的定义G=(V,E),V为顶点集,E为边集。设图有n个顶点,V={v1,v2,v3,......,vn}2、图的基本术语原创 2017-10-18 19:04:12 · 8311 阅读 · 0 评论 -
图的遍历(广度优先搜索遍历)
1、广度优先搜索遍历过程(1)从某个顶点V出发,访问该顶点的所有邻接点V1,V2..VN(2)从邻接点V1,V2...VN出发,再访问他们各自的所有邻接点(3)重复上述步骤,直到所有的顶点都被访问过若此时图中还有顶点未被访问,则在外控算法的控制下,另选一个未曾被访问的顶点作为起始点,重复上述过程,直到图中所有顶点都被访问完为止。2、示例对图7-2原创 2017-10-20 09:48:25 · 41329 阅读 · 3 评论 -
图的连通性和连通分量
1、无向图的连通性运用深度优先搜索或广度优先搜索遍历无向图可以分析图的连通性。可通过额外设置计数器count(初始值0)统计出图的连通分量,每调用一次,计数器count增1。当遍历完无向图时,若count=1,则图连通,若count>1,图非连通,count的值就是该图的连通分量数。#include using namespace std;#define INFINITY 6原创 2017-10-20 11:26:05 · 14644 阅读 · 0 评论 -
归并排序
1、基本思想假定,排序前待排序列分为若干子序列,各个子序列已经拍好序,把已排好序的子序列视为归并段,将这些有序子序列合并为较大的拍好序的归并段,直到只剩下一个归并段为止。2、二路归并排序每次只合并两个(k个)归并段的归并排序为二(k)路归并排序:将含n个记录的待排序列看成n个长度为1的有序序列,然后进行两两合并,得到n/2个长度为2的有序序列;再进行两两合并,得到n/4个有序段....原创 2017-10-11 14:47:01 · 607 阅读 · 0 评论 -
图的遍历(深度优先搜索)
1、深度优先搜索遍历过程图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有原创 2017-10-19 16:52:01 · 131044 阅读 · 14 评论 -
基数排序
1、基数排序按组成关键字的各位值进行排序。以r为基数按LSD排序的实现问题。若关键字是数字,则可以把每个十进位数字作为一个关键字位。关键字为十(二)进制的排序为以10(2)为基数的基数排序。下面以十进制数为例(r=10),介绍基数排序。2、排序过程首先按最低位数值(个位)依次把各个元素分配到相应桶中,然后按桶号从小到大和进入桶中数据元素的先后顺序收集在各队列中的数据元素,形成数据元原创 2017-10-11 17:44:42 · 364 阅读 · 0 评论 -
排序算法总结
排序算法总览排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。内排序有可以分为以下几类:(1)、插入排序:直接插入排序、二分法插入排序、希尔排序。(2)、交换排序:冒泡排序、快速排序。(3)、选择排序:简单选择排序、改进的简单选择排序、堆排序。(4)、归原创 2017-10-12 10:41:27 · 279 阅读 · 0 评论 -
n个元素进栈,共有多少种出栈顺序?
1.基于栈的问题分析我们把n个元素的出栈个数的记为f(n), 那么对于1,2,3, 我们很容易得出: f(1) = 1 //即 1 f(2) = 2 //即 12、21 f(3) = 5...转载 2018-07-03 19:52:14 · 28293 阅读 · 5 评论