数据结构
Wonder233
这个作者很懒,什么都没留下…
展开
-
【数据结构】基本术语与概念
数据:对客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。数据元素:数据的基本单位。由若干数据项组成。数据项:数据不可分割的最小单位。数据对象:性质相同的数据元素的集合。数据结构:相互之间存在的一种或多种特定关系的数据元素的集合。4类基本结构: 集合线性结构:一对一关系树形结构:一对多关系图形结构或网状结构:多对多关系逻辑结构:数据元素之间的逻辑关系物理原创 2017-10-28 11:59:24 · 370 阅读 · 0 评论 -
【排序】选择排序
大顶堆:每个节点的值都大于或等于其左右孩子结点的值。 小顶堆:每个节点的值都小于或等于其左右孩子结点的值。 堆是完全二叉树。 若按照层序遍历的方式给结点从 1 开始编号,则结点之间满足如下关系: {ki≥k2iki≥k2i+1或{ki≤k2iki≤k2i+1,1≤i≤⌊n2⌋\begin{cases}k_i\ge k_{2i}\\k_i\ge k_{2i+1}\end{case原创 2018-01-26 17:02:04 · 233 阅读 · 0 评论 -
【排序】插入排序
基本思想将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序列“基本有序”后,最后在对所有元素进行一次直接插入排序。 希尔排序是对直接插入排序算法的优化和升级。关键采用跳跃分割的策略:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。基本原创 2018-01-25 15:35:51 · 283 阅读 · 0 评论 -
【图】最小生成树(最小成本):克鲁斯卡尔(Kruskal)算法
给出一个连通网: 克鲁斯卡尔(Kruskal)算法基本思想假设 N=(V,{E})N=(V,\{E\}) 是连通网:令最小生成树的初始状态为只有 nn 个顶点并且没有边的非连通图 T={V,{}}T=\{V,\{\}\} ,图中每个顶点自成一个连通分量。在 EE 中选择代价最小的边,若该边的两个顶点落在 TT 中不同的连通分量上,则将此边加入到 TT 中,否则就舍去此边而选择下一条代价最小的边原创 2018-01-19 11:09:40 · 6443 阅读 · 3 评论 -
【图】最小生成树(最小成本):Prim算法
最小成本:nn 个顶点,用 n−1n-1 条边把一个连通图连接起来,并且使得权值的和最小。 最小生成树:构造连通网的最小代价生成树。 根据原来写的博客:【图】图的定义,里面提到一个连通图的生成树是一个极小连通子图,它含有图中全部的顶点,但只有足以构成一棵树的 n−1n-1 条边。找连通网的最小生成树,经典的有两种算法:普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法。先给出一个连通网原创 2018-01-18 21:53:01 · 8096 阅读 · 2 评论 -
【图】最短路径:迪杰斯特拉(Dijkstra)算法
网图和非网图中,最短路径的含义不同:非网图中,因为没有边上的权值,最短路径指的是两顶点之间经过的边数最少的路径;网图中,最短路径指的是两顶点之间经过的边上权值之和最少的路径,并且称路径上的第一个顶点是源点,最后一个顶点是终点。迪杰斯特拉(Dijkstra)算法定义Dijkstra(迪杰斯特拉)算法是单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。特原创 2018-01-19 22:10:55 · 1875 阅读 · 0 评论 -
【排序】归并排序
归并的思想就是将本是无序的数组序列{16,7,13,10,9,15,3,2,5,8,12,1,11,4,6,14}\{16,7,13,10,9,15,3,2,5,8,12,1,11,4,6,14\}通过两两合并排序后再合并,最终获得一个有序的数组。如下图。基本思想二路归并排序: 假设初始序列含有 nn 个记录,则可以看成是 nn 个有序的子序列,每个子序列的长度为 11 ,然后两两归并,得到 ⌈n原创 2018-01-28 13:21:44 · 342 阅读 · 0 评论 -
【排序】交换排序
定义排序要用到的结构:function List(array){ this.L = array; this.length = array.length;}冒泡排序基本思想两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。算法实现/* 冒泡排序 */List.prototype.BubbleSort = function () { var i, j, tmp原创 2018-01-25 09:36:18 · 791 阅读 · 0 评论 -
【查找】基本概念与分类
基本概念查找:在数据元素集合中查找是否存在关键字等于某个给定关键字数据元素的过程。 关键字有:主关键字:能够唯一区分各个不同数据元素的关键字。次关键字:通常不能唯一区分各个不同数据元素。分类查找可分为:静态查找:只在数据元素集合中查找是否存在关键字等于某个给定关键字的数据元素。动态查找:除包括静态查找的要求外,还包括在查找过程中同时插入数据元素集合中不存在的数据元素,或者从数据元素集合中原创 2018-01-29 15:59:51 · 497 阅读 · 0 评论 -
【查找】顺序表(线性表)查找
最基本的查找技术。算法思想从表中第一个(最后一个)记录开始,逐个进行记录的关键字和给定值比较:若某个记录的关键字和给定值相等,则查找成功,找到所查记录;若直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功。算法实现function Sequential_Search(a,key){ var i; for(i=0;i< a.length原创 2018-01-29 16:21:27 · 782 阅读 · 0 评论 -
【查找】有序表查找
折半查找:原创 2018-01-29 17:22:45 · 492 阅读 · 0 评论 -
【二叉树】哈夫曼定理与原理
1、从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径的长度。 2、树的路径长度是从树根到每一结点的路径长度之和。 3、树的带权路径长度(WPL)是树中所有叶子结点的带权路径长度之和。 4、带权路径长度 WPL 最小的二叉树称作哈夫曼树。哈夫曼算法描述根据给定的 nn 个权值 {w1,w2,...,wn}\{w_1,w_2,...,w_n\}原创 2018-01-16 09:38:54 · 746 阅读 · 0 评论 -
【图】深度优先遍历&广度优先遍历
图的遍历:从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次。因此,为了避免多次访问某一个定点,需要在遍历过程中把访问过得顶点打上标记。具体办法是设置一个访问数组 visited[n]visited[n],初值为 0,访问过后设置为 1。深度优先遍历(Depth_First_Search)类似树的前序遍历。 步骤:从图中某个顶点 vv 出发,访问此顶点;然后从 vv 的未被访问的邻原创 2018-01-18 17:09:33 · 3169 阅读 · 0 评论 -
【图】抽象数据类型及存储结构
抽象数据类型ADT:图(Graph) Data:顶点的有穷非空集合和边集合 Operation:Graph(V):按照顶点集 VV 初始化图。addVex(v):在图 G 中添加新顶点 vv。deleteVex(v):删除图 G 中顶点 vv 及其相关弧。addEdge(v1,v2):在图 G 中添加弧<v1,v2><v_1,v_2>,若 G 是无向图,则还需要增添对称弧 <v2,v1>原创 2018-01-17 21:23:00 · 2780 阅读 · 0 评论 -
【数据结构】AVL树(未完)
平衡因子 δ(T)\delta(T)为了度量一颗二叉树的平衡,可以比较左右分支的高度差,如果差很大,则说明树不平衡。 定义一棵树的高度差如下: δ(T)=|R|−|L|\delta(T)=|R|-|L| 其中,|T||T| 代表树 T 的高度,L 和 R 分别代表左右分支。 若 δ(T)=0\delta(T)=0 ,说明树是平衡的。通常 δ(T)\delta(T) 的绝对值越小,说明树越平衡原创 2017-11-13 11:13:36 · 266 阅读 · 0 评论 -
【二叉树】红黑树——自平衡二叉搜索树
树的旋转树的旋转是一种特殊操作,保持中序遍历结果不变的情况下,改变树的结构。 上图中a所示二叉搜索树经过左旋变换为b所示的树。(右旋操作是左旋的逆变换)函数定义 将非空二叉树记为三元组T=(Tl,k,Tr)T=(T_l,k,T_r),则: rotateL(T)={((a,X,b),Y,c)T:T=(a,x,(b,Y,c)):其他rotateL(T)=\begin{cases}原创 2017-11-13 09:51:27 · 359 阅读 · 0 评论 -
【二叉树】特殊二叉树及二叉树的性质
特殊的二叉树满二叉树定义所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上。 特点叶子只能出现在最下一层。出现在其它层就不可能达成平衡。非叶子结点的度一定是2.在同样深度的二叉树中,满二叉树的结点个数最多,叶子数最多。完全二叉树定义对一棵具有 nn 个结点的二叉树按层序编号,编号为 i(1≤i≤n)i (1 \le i \le n) 的结点与同样深度的满二叉树中编号为 ii 的原创 2018-01-14 15:35:12 · 852 阅读 · 0 评论 -
【树】定义
节点分类1、结点拥有的子树数称为结点的度(Degree)。 2、度为 0 的结点称为叶节点(Leaf)或终端节点;度不为 0 的结点称为分支节点或非终端节点。 3、树的度是树内各结点的度的最大值。节点间关系1、结点的子树的根称为该结点的孩子(Child),该结点称为孩子的双亲(Parent)。 2、同一个双亲的孩子之间互称兄弟(Sibling)。 3、结点的祖先是从根到 该结点所经分支上的所原创 2018-01-12 10:59:01 · 229 阅读 · 0 评论 -
线性表
线性表定义线性结构的特点: 除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素。 主要操作特点: 可以在任意位置插入和删除一个数据元素。抽象数据类型数据集合[a0,a1,a2,...,an−1][a_0,a_1,a_2,...,a_{n-1}]方法集合初始化ListInitial(L)求当前数据元素个数ListLeng原创 2018-01-10 16:08:52 · 188 阅读 · 0 评论 -
栈Stack
1、栈(Stack)是限定仅在表尾进行插入或删除操作的线性表。 2、表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈。 3、栈又称为后进先出(last in first out)的线性表。栈的顺序存储结构结构1、用数组下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小。 2、定义一个top变量来指示栈顶元素在数组中的位置。 3、若存储栈的长度为 StackSi原创 2018-01-05 14:50:07 · 272 阅读 · 0 评论 -
【图】最短路径:弗洛伊德(Floyd)算法
特点弗洛伊德算法是解决任意两点间的最短路径的一种算法,可以正确处理无向图或有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包。基本思想通过 Floyd 算法计算图 G=(V,{E})G=(V,\{E\}) 中各个顶点的最短路径时,需要引入两个矩阵:矩阵 DD 中的元素 a[i][j]a[i][j] ,表示顶点 ii 到顶点 jj 的最短路径权值和。矩阵 PP 中原创 2018-01-24 09:56:06 · 864 阅读 · 0 评论 -
【图】拓扑排序
定义设 G=(V,{E})G=(V,\{E\}) 是一个具有 nn 个顶点的有向图,VV中的顶点序列 v1,v2,...,vnv_1,v_2,...,v_n 满足若从顶点 viv_i 到 vjv_j 有一条路径,则在顶点序列中顶点 viv_i 必在顶点 vjv_j 之前。则称这样的顶点序列为一个拓扑序列。拓扑排序:对一个有向图构造拓扑序列的过程。 AOV网:在一个表示工程的有向图中,用顶点表示活动原创 2018-01-24 11:13:49 · 271 阅读 · 0 评论 -
【排序】基本概念与分类
定义假设含有 n" role="presentation" style="position: relative;">nnn 个记录的序列为 {r1,r2,...,rn}" role="presentation" style="position: relative;">{r1,r2,...,rn}{r1,r2,...,rn}\{r_1,r_2,...,r_n\},其相应的关键字分别为 {k1,k原创 2018-01-24 15:27:21 · 350 阅读 · 0 评论 -
【图】图的定义
图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成。 通常表示为:G(V,{E})G(V,\{E\}),其中,G 表示一个图,V 是图 G 中顶点的结合,E 是图 G 中边的集合。各种图定义无向边:若顶点 viv_i 到 vjv_j 之间的边没有方向,则称这条边为无向边(Edge)。用无序偶对 (vi,vj)(v_i,v_j) 来表示。 无向图:图中任意两个顶点之间的边都原创 2018-01-17 09:48:53 · 542 阅读 · 0 评论 -
【二叉树】二叉搜索树(BST)
定义1、一棵二叉树:或者为空;或者包含三部分——一个值、一个左分支和一个右分支,并且这两个分支也都是二叉树。2、一颗二叉搜索树是满足下面条件的二叉树:若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。3、二叉搜索树的定义要求它的值必须能比较大小。为了强调原创 2017-11-06 11:04:21 · 508 阅读 · 0 评论