(十)、约束及索引类型约束的作用是为了防止可预见的错误的数据进入数据库中,是保障数据一致性的一种机制。 UNIQUE约束是列级约束,表示关系中的记录在该列上的取值不重复。索引是通过建立索引列上的索引表,索引表中的査找项是索引列上的所有值的排序或散列(目的是为了快速查找),索引表中的指针项指向取该值的物理记录。唯一值索引即UNIQU索引,表示其索引表中的指针项只能指向唯一的记录,这样记录在索引列的取
平衡二叉树(查找效率最高)平衡因子为其左子树的高度减去右子树高度的差。平衡二叉树中各个结点的平衡因子绝对值不大于1。若一棵二叉树的所有结点都是平衡的,称之为平衡二叉树。由于每个非叶子结点的平衡因子均为0,也即每个非终端结点都有左子树和右子树,且高度相等,因此这样的平衡二叉树为满二叉树,而高度为k的满二叉树的结点为2的k次-1。B_树每个结点最多有m个分支(子树);而最少分支数要看是否为根结点,如果
分块查找分块查找(block search)是一种性能介于顺序查找和折半查找之间的查找方法。它要求按如下的索引方式来存储线性表:将表 R[0..n-1]均分为b块,前b-1块中的元素个数为s=「n/b] 最后一块(即第b块)的元素数小于等于s;每一块中的关键字不一定是有序的,但前一块中的最大关键字必须小于后一块中的最小关键字,即要求整个表是“分块有序”(block order)的。whi
二分查找折半查找(binary search)又称二分查找,它是一种效率较高的查找方法。但是,折半查找要求线性表是有序表,即表中的元素按关键字有序。(只能以顺序方式存储)只要表中的关键字个数相同,就一定会生成形状相同的判定树,其平均查找长度都相同。折半查找法在查找不成功时和给定值进行比较的关键字个数最多为「log₂n]+1,即折半查找判定树的高度。(n为长度或关键字个数)折半查找过程可用二叉树来描
十八、查找查找(search)的定义是给定一个值k,在含有n个元素的表中找出关键字等于k的元素。若找到,则查找成功,返回该元素的信息或该元素在表中的位置;否则查找失败,返回相关的指示信息。若在查找的同时对表做修改操作(如插入和删除),则相应的查找表称为动态查找表(dynamic search table)。若在查找中不涉及表的修改操作,则相应的查找表称为静态查找表(static search ta
磁带排序磁带排序(tape sort)和磁盘排序的主要不同之处在于磁带排序需要充分考虑归并段的分布状况,因为磁带是顺序存取的,所以各归并段分布在不同磁带和同一磁带的不同位置对排序效率影响极大。多路平衡归并所谓二路平衡归并(2-way balanced me rge)就是每一趟从m个归段得到「m/2]个归并段,这样的归并树就有「log₂m]+1层,需要对初始数据进行「log2m]遍扫描。做类似的推广
(五)、基数排序前面所讨论的排序算法均是基于关键字之间的比较来实现的,而基数排序(radix sort)是通过“分配”和“收集”过程来实现排序,不需要进行关键字间的比较,是一种借助于多关键字排序的思想对单关键字排序的方法。基数排序有两种,即最低位优先(least sig gnificant digit first,LSD)和最高位优先(most significant digit first,MS
(四)、归并排序归并排序(merge sort)是多次将两个或两个以上的有序表合并成一个新的有序表。最简单的归并是直接将两个有序的子表合并成一个有序的表,即二路归并。二路归并排序(2-waymerge sort)的基本,思路是将R[0..n-1]看成是n个长度为1 的有序序列,然后进行两两归并,得到「n/2| 个长度为 2(最后一个有序序列的长度可能为2)的有序序列,再进行两两归并,得到「n/4|
在基于比较的排序算法中主要进行以下两种基本操作比较(compare):关键字之间的比较移动(move):元素从一个位置移动到另一个位置若待排序元素的关键字顺序正好和排序顺序相司,称此表中元素为正序;反之,若待排序元素的关键字顺序正好和排序顺序相反,称此表中元素为反序。直接插入排序void insertSort(int arr[], int n) { int temp, i, j; for(i=1;
当待排序元素的关键字均不相同时,显然排序结果是唯一的,否则排序的结果不一定唯一。如果待排序的表中存在有多个关键字相同的元素,经过排序后这些具有相同关键字的元素之间的相对次序保持不变,则称这种排序方法是稳定的(stable);反之,若具有相同关键字的元素之间的相对次序发生变化,则称这这种排序方法是不稳定的(unstable)。在所有可能的输入实例中,只要有一个实例使得算法不满足稳定性要求,则该排序算
3. 关键路径通常每个工程都只有一个开始事件和一个结束事件,因此表示工程的AOE网都只有一个入度为0的顶点,称为源点(source),和一个出度为0的顶点,称为汇点(converge)。如果图中存在多个入度为0的顶点,只要加一个虚拟源点,使这个虚拟源点到原来所有入度为0的点都有一条长度为0的边,从而变成只有一个源点。对存在多个出度为0的顶点的情况做类似的处理。 在AOE 网中,从源点到汇
(五)、排序1. 拓扑排序AOV网用顶点表示活动,用有向边表示活动之间优先关系的有向图称为顶点表示活动的AOV网。拓扑排序在一个有向图中找一个拓扑序列的过程称为拓扑排序。拓扑排序方法:1)从有向图中选择一个入度为0的顶点输出;2)删除1)中的顶点,并且删除从该顶点发出的全部边;3)重复上述两步,直到剩余的图中不存在入度为0的顶点为止。typedef struct { int data; int
克鲁斯卡尔算法(Kruskal算法)用并查集排除环相关存储结构typedef struct { int a,b; int w; }Road; Road road[maxSize]; int getRoot(int p) { while(p!=v[p]) p=v[p]; return p; } void Kruskal(Road road[],int n, int e, int &sum
由深度优先遍历得到的生成树称为深度优先生成树(DFS tree)。在深度优先遍历中,如果将每次“前进”(纵向)路过的(将被访问)顶点和边都记录录下来,就得到了一个子图,该子图为以出发点为根的树,就是深度优先生成树。相应地,由厂度优先遍历得到的生成树称为广度优先生成树(BFS tree)。这样的生成树由遍历时访问过的n个顶点和遍历时经历的(n-1)条边组成。对于非连通图,每个连通分量中的顶点集和遍历
(四)、算法1.生成树一个连通图的生成树(spanning tree)是一个极小连通子图,其中含有图中的全部顶点,和构成一棵树的(n-1)条边。如果在一棵生成树上添加任何一条边,必定构成一个环,因为添加的这条边使得它关联的那两个顶点之间有了第2条路径。一棵有n个顶点的生成树(连通无回路图)有且仅有(n-1)条边。如果一个图有n个顶点和小于(n-1)条边,则是非连通图。如果它多于(n-1)条边,则一
(三)、遍历从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。如果给定图是连通的无向图或者是强连通的有向图,则遍历过程一次就能完成,并可按访问的先后顺序得到由该图的所有有顶点组成的一个序列。深度优先遍历(DFS)void DFS(int v, AGraph *G)//树的顶点v { visit[v]
链式存储结构孩子存储结构(邻接表)图的邻接表是一种顺序与链式存储相结合的存储方法。邻接表的特点如下:(1)邻接表的表示不唯一,这是因为在每个顶点对应的单链表中各边结点的链接次序可以是任意的,取决于建立邻接表的算法以及边的输入次序。(2)对于有n个顶点和e条边的无向图,其邻接表有n个头结点和 2e 个边结点;对于有n个顶点和e条边的有向图,其邻接表有n个头结点和e个边结点。显然,对于边数目较少的稀疏
(二)、存储结构顺序存储结构图的邻接矩阵(adjacency matrix)是一种采用邻接矩阵数组表示顶点之间相邻关系的存储结构。行是起点,列是终点float MGraph[5][5]; for (int i= 0; i < 5; ++i) for (int j=0; j< 5; ++j) MGraph[i][j] = MAX;邻接矩阵的特点如下:(1)图的邻接矩阵表示是唯一的。(2)
无向图,即每条边都没有方向,顶点A1点的度为3;(是对称矩阵)有向图,即每条边(弧)都有方向,顶点A1点入度为1,出度为2,度为3。(度为每个行列数之和)在图中,若不存在某顶点到其自身的边,且不存在重复的边,则称之为简单图。在无向图中,若任意两顶点之间存在边,则称之为无向完全图,这种图边的个数位 n(n-1)/2,n为顶点数。在有向图中,若任意两顶点之间存在方向相反的两条边,则称之为有向完全图,这
十六、图(一)、图的基本术语图由顶点的有穷集合V和边的集合E组成;在一个无向图中,若存在一条边(i,j),则称顶点i和顶点j为该边的两个端点(endpoint),并称它们互为邻接点(adjacent),即顶点i是顶点j的一个邻接点,顶点j也是顶点i的一个邻接点,边(i,j)和顶点i、j关联。关联于相同两个端点的两条或者两条以上的边称为多重边,在数据结构中讨论的图都是指没有多重边的图。在一个有向图中
10. 二叉树的估计根据遍历序列估计二叉树前序遍历和后序遍历结果相同的二叉树为: TLR LRT 前序遍历和中序遍历结果相同的二叉树为: TLR LTR 中序遍历和后序遍历结果相同的二叉树为: LTR LRT
BTNode *CreateBT2 (char post[],char in[], int Ll, int Rl, int L2, int R2) if(L1 > R1) return NULL; BTNode *s = (BTNode *)malloc(sizeof(BTNode)); s->lChild = s->rChild = NULL; s->data = p
后序线索二叉树void postThread(TBTNode *p,TBTNode *&pre) { if(p != NULL) { postThread(p->lChild,pre); postThread(p->rChild, pre); if(p->lChild == NULL) { p->lChild = pre; p->lTag = 1; }
8. 线索二叉树规定:当某结点的左指针为空时,令该指针指向这个线性序列中该结点的前驱结点;当某结点的右指针为空时,令该指针指向这个线性序列中该结点的后继结点,这样的指向该线性序列中的“前驱结点”和“后继结点”的指针称为线索(thread)。创建线索的过程称为线索化。线索化的二叉树称为线索二叉树(threadedbinary-tree)。中序线索二叉树typedef struct TBTNode {
后序遍历非递归化只要在先序的时候把左右子树的位置颠倒一下即为逆后序void postorderNonrecursion(BTNode *bt) { if (bt!=NULL) { BTNode *Stack1[maxSize]; int top1=-1; BTNode *Stack2 [maxSize]; int top2=-1; BTNode *p =NULL; //遍历指针 stackl
对于已经转化成二叉树的树,如果想对其进行先序遍历,只需对这棵树直接进行先序遍历即可对于已经转化成二叉树的树,如果想对其进行中序遍历,只需对这棵树直接进行后序遍历即可6. 二叉树非递归遍历(用栈辅助)先序遍历非递归化用栈,根结点入栈再出栈一个元素,孩子结点入栈(左孩子后入栈)再出栈一个元素,并对该元素的孩子进行入栈操作,没有孩子就出栈,继续判断有无孩子,以此类推首先从根节点开始入栈一个节点然后不停地
二叉树还原为树、森林若某结点是其双亲的左孩子,则把该结点的右孩子、右孩子的右孩子等都与该结点的双亲结点用连线连起来。删除原二叉树中所有双亲结点与右孩子结点之间的连线。整理由前面两步得到的树,即以根结点为轴心,逆时针转动45°,使之结构层次分明。实际上,二叉树的还原就是将二叉树中的左分支保持不变,将二叉树中的右分支还原成兄弟关系。5. 二叉树的遍历(序指的根的顺序)深度优先遍历先序遍历(preord
链式存储结构用data 表示值域,用于存储对应的数据元素,lchild 和 rchild分别表示左指针域和右指针域,分别用于存储左孩子结点和右孩子结点的存储地址。这种链式存储结构通常简称为二叉链(binary linked list)。二叉链中通过根结点指针 b来唯一标识整个存储结构,称为二叉树b。typedef struct BTNode { int data; struct BTNode* l
2. 二叉树的性质性质1:非空二叉树上的叶子结点数等于双分支结点数加1。性质2:非空二叉树的第i层上最多有2的i-1次个结点(i≥1)。性质3:高度为h的二叉树最多有2的h次减1个结点(h≥1)性质4:完全二叉树中层序编号为i的结点(1≤i≤n,n≥1,n为结点数)有以下性质:若 i≤Ln/2 」,即 2i≤n,则编号为i的结点为分支结点,否则为叶子结点。若n为奇数,则每个分支结点都既有左孩子结点
在一棵二叉树中,如果所有分支结点都有左孩子结点和右孩子结点,并且叶子结点都集中在二叉树的最下一层,这样的二叉树称为满二叉树(full binary tree)。用户可以对满二叉树的结点进行层序编号(level coding),约定编号从树根为1开始,按照层数从小到大、同一层从左到右的次序进行,当然也可以从结点个数和树高度之间的关系来定义,即一棵高度为h且有2"-1个结点的二叉树称为满二叉树。非空满
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号