
数据结构
文章平均质量分 80
fuming0210sc
这个作者很懒,什么都没留下…
展开
-
红黑树的插入与删除
转载自: http://blog.youkuaiyun.com/very_2/article/details/5722682介绍另一种平衡二叉树:红黑树(Red Black Tree),红黑树由Rudolf Bayer于1972年发明,当时被称为平衡二叉B树(symmetric binary B-trees),1978年被Leonidas J. Guibas 和Robert Sedgewick转载 2016-04-04 18:02:48 · 458 阅读 · 0 评论 -
看数据结构写代码(53) 静态查找表(线性查找,二分查找,斐波那契查找,插值查找)
查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。查找表分类:静态查找表和动态查找表。静态查找表:只查找,而不进行插入,删除。动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。静态表的 查找 大致 四种 算法: 线性查找,二分查找,斐波那契查找和插值查找。 其中 在线性原创 2015-04-20 10:53:40 · 1142 阅读 · 0 评论 -
看数据结构写代码(44) 判断无向图是否有环路
在 看 严蔚敏的 数据结构 一书 7.5小节时,书上 说“ 判断有向图是否存在环要不无向图复杂。对于无向图来说,深度优先遍历过程中遇到回边(即指向已访问过的顶点的边),则必定存在环路”。 看的不明白,所以 网上 百度了一下。有了思路:故写下算法 和思路,以便以后 温故。思路:1.一个n个顶点,e条边的 无向图,若 e>= n,必有环路。2.若 e 如果 遇到 一个 节点 被访问过原创 2015-04-13 15:10:24 · 1759 阅读 · 0 评论 -
看数据结构写代码(35) 图的邻接矩阵表示法
杂谈:最近清明小长假,好好的放松了一下。节前 和 节后 都有点 松懈。不好,不好。贵在坚持。加油。图的邻接矩阵表示法是用 两个数组 来表示 图的数据结构。一个是顶点数组,另一个是邻接矩阵数组。邻接矩阵 里存放着 顶点的关系。用邻接矩阵表示图,在 看 顶点之间 是否有边,或者 求顶点的度等操作时比较简单。但空间浪费巨大,在插入,删除 顶点 和边 操作时 需要 移动大量数据,造成不便。所以在插原创 2015-04-08 12:54:39 · 1715 阅读 · 1 评论 -
看数据结构写代码(48) 弗洛伊德最短路径
迪杰斯特拉算法 适合 求 一个源点 到 其他 顶点的 最短路径问题,其时间 复杂度为O(n *n),n为 顶点数。 但是 若要求 任意顶点之间的最短路径问题,有两种方法:1,n次迪杰斯特拉算法 2. 弗洛伊德算法。两种算法 时间复杂度 都为 O(n * n * n)第二种算法 算法,只用 3重循环,算法及其 简洁。下面给出代码:完整代码工程文件网盘地址:点击打开链接//弗洛原创 2015-04-14 22:47:39 · 571 阅读 · 0 评论 -
看数据结构写代码(47)迪杰斯特拉最短路径算法
这个算法的 思想 根 求 最小生成树算法 普里姆(Prim)算法 极其相似。迪杰斯算法 是求 一个顶点 到其他 顶点的 最短路径算法。下面 上代码:(用的是 邻接矩阵 表示法)//迪杰斯特拉 最短路径。//从 vex顶点 到其他 顶点的 最短路径void shortestPath_Dij(MGraph g,char vex){ int loc = graphLocation(g,ve原创 2015-04-14 16:06:59 · 1088 阅读 · 0 评论 -
看数据结构写代码(46) 关键路径
首先介绍下 概念问题:与AOV网 相对应的 AOE网(Activity On Edge),边 表示 活动,顶点表示 事件,边的 权值表示 活动 所需的时间。AOE网 常用于求工程的 最短完成时间 以及哪些活动是影响工程进度的关键。例如下图: v1表示 工程的 开始事件,v9表示工程的结束事件。我们将v1(入度为0)叫做源点,v9(出度为0)叫做汇点。AOE网中只有一个源点,一个原创 2015-04-14 10:30:46 · 1026 阅读 · 0 评论 -
看数据结构写代码(45) 拓扑排序
用顶点表示活动,用弧 表示 活动 之间的优先关系的 有向图 称为 AOV网。 那么 怎么 合理 的 安排 活动的 先后顺序,以及 判断 活动 是否 不能完成(图中是否有环路),其实 就是 求 拓扑排序的问题。例如 计算机专业的 课程 图,需要 安排 一个合理的 授课顺序。需要说明的是 拓扑排序 不是 唯一的。解决拓扑排序的思路:1.找出 入度为0的 顶点,2.然后 删除 相原创 2015-04-13 18:13:12 · 629 阅读 · 0 评论 -
看数据结构写代码(43) 关节点
首先 说明一下 概念问题:关节点 :如果删除无向 图中的一个顶点,以及与顶点相关的边,把 图的 一个连通 分量 变成 两个 以上的 连通 分量。这样的顶点叫做关节点。没有 关节点的 无向图,叫做 重连通图。重连通图中 任意 两个顶点 至少 存在 两条以上的 通路。如果 删除 连通图上的 k个 节点,才能 破坏 他的连通性,那么 这个连通图的 连通度 为k。下面的算法 是 求 连通图原创 2015-04-13 12:07:56 · 1116 阅读 · 0 评论 -
看数据结构写代码(42)最小生成树
首先给出 一些 概念问题:1.生成树: 一个n个顶点的 连通图 的 极小连通子图。 它含有n个顶点,但只有 n-1条边,不存在回路。2.最小生成树:一个带权的 无向连通图,求出 各边权值相加 最小的 生成树,叫做最小生成树。所以 求最小生成树 首先 要满足: 1. 首先 是 无向图 2. 必须是 连通图(任意两个顶点可达)3.带权简单的说 就是 必须是 连通网。求原创 2015-04-12 16:08:35 · 683 阅读 · 0 评论 -
看数据结构写代码(41) 强连通分量
首先介绍概念问题,在有向图中,若 顶点v1 到 v2 存成路径,并且 v2 到 v1 存成 路径,则称 顶点 v1 和 v2 是强连通的。若 有向图 任意两个节点 都是 强连通的,则 称为强连通图。非强连通图的 极大强连通子图,为 强连通分量。特别说明,连通的概念 属于 无向图,强连通 属于 有向图。例如:无向图:连通图,连通分量,生成树; 有向图:强连通图,强连通分量。数据结构书上 简单原创 2015-04-12 12:10:09 · 1435 阅读 · 1 评论 -
看数据结构写代码(40) 无向图的深度优先生成树与广度优先生成树
图的深度优先遍历 和 广度 优先 遍历 算法中的 每一次 最外层 循环 都 产生 一个 无向图 的 连通分量,每一个连通分量,都可以产生一个生成树,将这些生成树合在 一起 就是 一个 森林。 用 树的 孩子 兄弟 链表 表示法 来 表示 这个 森林, 就是 这一节 算法的 内容。深度优先森林 代码 ://深度优先生成森林void dfsTree(AMLGraph g,int i,Tre原创 2015-04-11 23:50:57 · 7896 阅读 · 2 评论 -
看数据结构写代码(57) AVL树的删除
上一节 已经说了 AVL树的插入 操作,可是 只有 插入,没有删除,怎么能叫 动态 查找表呢。呵呵,博主 赶紧 去 研究了一番。下面 是成果:AVL树的删除 大致 分为 两大块: 1. 查找节点 并 删除 2. 保持 删除 后 平衡因子的 影响1. 首先 找到 这个 节点,如果 节点 不存在,直接 退出 函数if (*tree == NULL){//没找到原创 2015-04-22 11:46:08 · 882 阅读 · 0 评论 -
看数据结构写代码(51) 广义表的头尾链式存储
广义表是一种非线性的数据结构。但如果广义表的每个元素都是原子,它就变成了线性表。广义表广泛地用于人工智能等领域的LISP语言。广义表一般记作 LS = (a1, a2, ···, an), n是它的长度,ai可以是单个元素(原子),也可以是广义表(子表),当广义表非空时,称第一个元素a1为LS的表头,称其余元素组成的表为LS的表尾。注意:表头是元素(可以是原子,也可以是广表),表尾一定是广原创 2015-04-18 16:18:35 · 1780 阅读 · 0 评论 -
看数据结构写代码(52) 广义表的扩展线性链表存储表示
广义表 的另一种 存储结构是 扩展线性链表存储表示,这种 存储结构的 根 节点 必 存在,并且 根节点的 表尾 为空,将 根节点的 表尾 放 在 表头 的 表尾 指针上。这样 从 表头 一直 就可以 遍历 所有 同级 节点。具体j结构 如下:例如 下面的 广义表 ,用 扩展线性链表 表示为:而 头尾 存储表示,是 把 表头 和 表尾 都放在 根节点 的 指针上。原创 2015-04-18 21:24:34 · 2148 阅读 · 0 评论 -
看数据结构写代码(38) 图的邻接多重表表示法与实现
图的邻接多重表 是 无向图的 另一种表示法。其与 邻接表 的差别 仅仅 在于 ,邻接表 用 两个 顶点 来表示 一条边,而 邻接多重表 用一个 顶点来表示一条边。这样使得 邻接多重表 在 某些操作 要 来的 方便。例如 将 搜索过的边 做记号 或者 删除 一条边。下面是邻接多重表的结构:下面的 6条边 用 6个弧 节点表示,用12个指针指向,每个弧节点被 指向2次。这样使得我们 在 释放内原创 2015-04-09 22:59:47 · 3028 阅读 · 4 评论 -
看数据结构写代码(49)边界标识法
浅谈 内存:内存 两大问题:1. 如何 分配 内存 ? 2. 如何 回收 释放 的 内存系统 从 可利用 空间表中 寻找 合适 大小的 内存 分配给用户,并 将 释放的 内存 重新 插入 可利用空间表里,以便 下次 继续 分配给用户。可是 怎么 分配 和 回收呢?内存的分配与回收 有三种策略:1. 首次拟合法 2. 最佳拟合法 3.最差拟合法1.首次拟合法,内存分配:从 利用空间原创 2015-04-15 21:44:02 · 3659 阅读 · 0 评论 -
看数据结构写代码(58) B-树
B-树 一种 自平衡的 多路 查找树。它在文件系统里很有用。一个m阶的B-树,要么是空树,要么是满足这些特性的树。、1.树 最多 有 m个分支。2.树的根 最少 两个子树。3. 树的非终端叶子节点 最少 m/2 向上 取整 个 子树。4.所有叶子节点 都在 一层。它的节点 结构: (N,P0,K1,P1,K2,p2......Kn,Pn)其中 N 是 节原创 2015-04-24 12:16:55 · 902 阅读 · 0 评论 -
看数据结构写代码(56) 平衡二叉树(AVL树)
平衡二叉树的定义 (AVL—— 发明者为Adel'son-Vel'skii 和 Landis) 平衡二叉查找树,又称 AVL树。 它除了具备二叉查找树的基本特征之外,还具有一个非常重要的特点:它 的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值(平衡因子 ) 不超过1。 也就是说AVL树每个节点的平衡因子只可能是-1、0和1(左子树高度减去右子树高度)。这原创 2015-04-21 14:28:42 · 855 阅读 · 0 评论 -
看数据结构写代码(18) KMP算法
求 子串 的 位置 有两种方法,一种是暴力搜索法,另一种就是KMP 算法。他们的效率 在一般的情况下,区别不大。但是在 串的 变化 范围特别小的情况下,例如 只有 0 和 1,KMP 的时间复杂度是 O(m+n),而暴力搜索法定时间 复杂度 是 O(m*n),(m,n分别指 子串 和 母串的 长度)暴力搜索非常简单,下面给出代码:// KMP.cpp : 定义控制台应用程序的入口点。//原创 2015-03-12 10:37:20 · 1248 阅读 · 0 评论 -
看数据结构写代码(67) 置换 _ 选择排序(完结篇)
杂谈: 严蔚敏版《数据结构(C语言版)》 一书 终于看完了。这是 一个完结,也是 一个新的开端。《算法导论》 已到手。置换选择排序的思想 是 将 归并段 尽量 变的 更大,而不是根据 内存 大小 限制在 固定的 大小。 这样 可以 利用赫夫曼树 来 进行 最优归并树,从而 使 外存 读写次数 最少。下面给出 具体 代码:欢迎指出代码不足。// Replace_Selcetion.cpp原创 2015-05-06 08:58:17 · 1497 阅读 · 0 评论 -
看数据结构写代码(66) 败者树
计算机的 内存 是 有限的,无法 存入 庞大的数据。当 遇到 大数据需要排序时,我们 需要 将 这些 数据分段 从 硬盘里 读到 内存中,排好序,再 写入到 硬盘中,这些段 叫做 归并段。最后将 这些 分段 合并 成 一个 最终 完整 有序的 数据。 这里 操作的 时间 = 内部 排序 时间 + 外存读写时间 + 内部归并所需时间。其中 外存 读写时间 最耗时,外存读写时间 =原创 2015-05-05 08:56:17 · 1490 阅读 · 0 评论 -
看数据结构写代码(65) 基数排序
欢迎指出代码不足参考书本:严蔚敏《数据结构 .C语言版》// RadixSort.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#define MAX_SIZE 1000//最大空间#define RADIX 10//关键字基数#define KEY_NUM 3//关键字个数struct SLNode{//静态链表节点 int key原创 2015-05-04 09:53:55 · 1817 阅读 · 1 评论 -
看数据结构写代码(59) 键树的双链表示法
杂谈; 打败自己的 往往不是敌人,而是自己。坚持不易,且行且珍惜。键树 是一种 把 把 非叶子节点 当成索引,叶子节点保存具体信息的一种树。例如: 它的 键树形式如下:键树 有 两种 表示 方法:1. 双链表 表示法 ,就是 树的 孩子链表 表示法 2.多重链表表示法(Trie树)下面给出 键树的 双链表 表示法的 插入,删除,查找 等原创 2015-04-28 21:59:51 · 1147 阅读 · 0 评论 -
看数据结构写代码(64) 归并排序
参考网址:http://blog.youkuaiyun.com/morewindows/article/details/6678165// MergeSort.cpp : 定义控制台应用程序的入口点。//归并排序#include "stdafx.h"#include //合并两个有序数组void mergeArray(int * array,int first,int mid,int las原创 2015-05-03 12:12:04 · 603 阅读 · 0 评论 -
看数据结构写代码(61) 哈希表
前面说的 各种查找都是 基于 “比较” 的基础 来进行 查找的。查找的 效率 要 看 比较的 次数。那么 有没有 不需要 比较,就可以 找到 想要的数据的 方法呢?哈希表 就是 这样的 一种方法,它用 数组 作为 保存 关键字的 数据原型,通过 一个 哈希 函数f(k),来找到 关键字 存储的位置,从而 找到想要的信息。例如 我们 想要解决 这样的一个问题:假设这有一个各种字母组成的原创 2015-04-30 10:14:46 · 637 阅读 · 0 评论 -
看数据结构写代码(62) 插入排序
// InsertSort.cpp : 定义控制台应用程序的入口点。//插值排序#include "stdafx.h"#include static int testArray[] = {0,55,33,22,99,77,66,11,44,88,9};//11个//数组0号位置 作为 哨兵...//升序排序void insertSort(int * array,int num)原创 2015-05-02 13:40:13 · 701 阅读 · 0 评论 -
看数据结构写代码(63) 堆排序
// HeapSort.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #define LIST_MAX_SIZE 100//顺序表struct sqList{ int base[LIST_MAX_SIZE]; int len;};typedef sqList Heap;//顺序表作为堆排序的基本类型//初始化顺序表原创 2015-05-02 23:28:35 · 607 阅读 · 0 评论 -
看数据结构写代码(60 ) 键树的多重链表表示(Trie树)
trie树,是用 树的 多重链表来表示 树的。每个节点 有 d 个指针域。若从键树中的某个节点到叶子节点的路径上每个节点都只有一个孩子,则可以把 路径上的所有节点压缩成一个叶子节点,且在叶子节点中 存储 关键字 以及 根关键字相关的信息。当节点的度 比较大时,选择 Trie树,要比 双链表树更为合适。tire树的 数据 压缩 是 挺与众不同的。下面 给出 具体的 代码:源代码工程文原创 2015-04-29 12:35:06 · 2757 阅读 · 0 评论 -
看数据结构写代码(50)伙伴系统
伙伴系统 是一种 只 可以 分配 2的 幂次方 个 空间的 ,回收 内存 时 只 合并 “伙伴空间” 的一种 动态内存管理方式。例如 一个 空间 大小 为 64 的 内存,伙伴 系统 为 这 64 的内存 建立 一组 双向循环 链表,分别 管理着 2的 0 次方,2的1 次方幂,2的 2 次方幂。。。2的6次方幂的 可用空间。即使 我们 只想分配 一个 大小 为3的 空间,系统 却 只原创 2015-04-16 21:08:06 · 2226 阅读 · 0 评论 -
看数据结构写代码(36) 图的邻接表表示与实现
图的邻接表表示法,是为每一个顶点建立一个链表,链表里存放着相同弧尾的 弧的信息,这些链表顺序存放在数组中。下面是无向图g2的邻接表 邻接表 比 邻接矩阵 节省空间,同时 也带来一些操作上的 不便,例如 看 两个顶点是否 相邻,需要 遍历 链表,在 求 无向图顶点的度时,只需 遍历 顶点的链表,而 求 有向图 顶点的度 需要 遍历 整个图 查找 弧头 为这个顶点的 个数。 如果 不想这样原创 2015-04-09 11:08:52 · 1405 阅读 · 0 评论 -
看数据结构写代码(55) 二叉排序树
二叉排序树 是一种 动态 查找树,它的 创建 是在 查找中 生成的。 当 查找 失败时,它将 数 插入到 合适的 位置中去。 二叉查找树的 左子树上的值 父亲的 值 小,而 右子树上的值 总是 比 父节点 大。这样 查找 类似与 二分 查找,其 最多 查找 的 次数 等于 树的 深度。下面的代码 主要 是 两方面:插入 节点 和 删除 节点。下面 给出 代码, 欢迎 指出 代码 不原创 2015-04-20 20:44:56 · 778 阅读 · 0 评论 -
看数据结构写代码(54)次优查找树
查找顺序表时,若 每个元素的概率 都相等 用 二分查找 效率 最高。但是 如果 概率 不相等时,(SOST)静态最优查找表 效率 要高于 二分查找。静态最优查找表 是 使得 从 根 到 每个节点的路径 长度 和 权值 乘积 之和 最小。书上说的 静态最优 查找树的创建 时间 复杂度 较高,所以 用 次优 查找树(NOST) 代替。下面 上代码:// Nost.cpp : 定义控制台应用原创 2015-04-20 14:59:04 · 722 阅读 · 0 评论 -
看数据结构写代码(39) 图的遍历(深搜和广搜)
图的遍历算法 有两种 :深度优先搜索遍历 和 广度 优先搜索遍历。深度优先搜索遍历类似与 树的 先序遍历。广度优先搜索遍历类似与树的层序遍历。只不过 图 可以有 不连通的 节点,所以 得 遍历 整个顶点数组。深搜遍历 总是 先访问当前节点的邻接点,而 广搜算法 是 先访问顶点的邻接点 要 先于 后访问顶点的邻接点 被 访问。具体遍历顺序如下:以下代码 以 图的 邻接多重原创 2015-04-10 10:49:22 · 1249 阅读 · 1 评论 -
看数据结构写代码(37) 图的十字链表的表示与实现
图的邻接表在 查找 有向图的 出度 很 方便,但是 在 查找 入度 时,需要遍历整个图。如果想要 方便的 查找 入度,需要 建立 逆邻接表。十字链表 正好 就是 邻接表 和 逆邻接表的集合。具体结构图如下:感觉 十字链表 在 查找 入度时 方便 一些,其他 跟 邻接表没什么区别。代码如下:// CrossLinkGraph.cpp : 定义控制台应用程序的入口点。//有向图的原创 2015-04-09 16:07:04 · 1880 阅读 · 0 评论 -
看数据结构写代码(29) 树的双亲表示法
直接上代码:// ParentTree.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include "queue.h"#include "stack.h"#include #define TREE_INIT_SIZE 100//树的初识空间#define TREE_ADD_SIZE 20 //当空间不足时,增加原创 2015-03-26 14:54:49 · 728 阅读 · 0 评论 -
看数据结构写代码(15)链式队列的实现(总结篇)
队列 和 栈 是 一种 受限制的 线性表。所以 他们的 实现方式 都 相差 无几。之前有过 链栈 和 链式线性表 的 实现经验,自然 写 链队 ,也毫无问题。下面详细讲解每一段代码 的技术要点下面是队列节点的数据结构struct QueueNode{ ElementType data; QueueNode * next;};//生成一个节点QueueNode *原创 2015-03-06 10:46:46 · 924 阅读 · 0 评论 -
看数据结构写代码(13)栈的应用(四) 迷宫求解
这是一个 用 穷举法 解 迷宫问题 的一个示例,但在 效率 和 解的 最短路径上 就稍显不足了。这 两个问题,留在 以后 空闲 时刻 解答。欢迎指出代码不足下面上代码:// Maze.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include struct Postion{ int x; int y;};原创 2015-03-04 10:19:41 · 795 阅读 · 0 评论 -
看数据结构写代码(28) 线索二叉链表的实现
要说 线索二叉链表,不得 不说一说 二叉链表的遍历。二叉链表的 遍历 其实 就是 将 树型结构 转换 成 一种 线性结构。不过 这种 节点 前驱 后继的关系,只能 在 遍历的时候 动态 获得。拿有没有一种方法 可以 保存 这种 前驱 后继的关系呢? 总的来看 有 两种方法:1. 将二叉链表 加上 节点 加上 前驱 ,后继的 指针2. 一个n个节点的 二叉树,必定有 n+1 个空链域。(n个原创 2015-03-25 23:29:15 · 1146 阅读 · 0 评论 -
看数据结构写代码(10)栈的应用(一) 数值转换
首先 修正上一节 stackPop 代码的错误E_State stackPop(linkStack * stack,elelmentType * data){ if (stack->top != stack->bottom) { //首先指向第一个元素. lStackNode * next = stack->bottom; *data = stack->top->data;原创 2015-03-02 14:39:03 · 899 阅读 · 0 评论