数据结构与算法
&动感超人
读书笔记,不求甚解!
展开
-
数据结构与算法——希尔排序与归并排序
希尔排序希尔排序(shell sort),对插入算法进行了有效的改进,是一种递减增量的排序算法。希尔排序算法是不稳定的,他是是基于插入排序提出改进方法的: 插入排序在对已经排好序的数据操作时,效率高,即可以达到线性排序的效率 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。演示:描述:选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1; 按增量序列个数k,对序列进行k 趟排序; 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分原创 2020-10-23 22:50:14 · 453 阅读 · 0 评论 -
数据结构与算法——冒泡排序,选择排序和插入排序
冒泡排序冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。演示:描述:比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复步骤1~.原创 2020-10-22 15:09:20 · 218 阅读 · 0 评论 -
C++进阶——STL源码之红黑树(_Rb_tree)
STL源码之红黑树STL中Red-black tree(红黑树)class,用来当做STL关系式容器(如set,multiset,map, multimap).里面所用的insertion和deletion方法以 《Introduction to Algorithms》一书为基础,但是有以下两点不同:header不仅指向root,也指向红黑树的最左节点,以便用常数时间实现begin(),并且也指向红黑树的最右边节点,以便 set相关泛型算法(如set_union等等)可以有线性时间表现. 当要删除原创 2020-08-30 20:56:32 · 3426 阅读 · 3 评论 -
数据结构与算法——红黑树(Red Black Tree)
数据结构与算法——红黑树(Red Black Tree)红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组;红黑树是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作原创 2020-08-30 16:46:46 · 319 阅读 · 0 评论 -
数据结构与算法——平衡二叉树(AVL Tree)
数据结构与算法——平衡二叉树(AVL Tree)构建一个二叉排序树时,如果构建序列是完全有序的,则会出现这样的情况:显然这种情况会使得二叉搜索树退化成链表。当出现这样的情况,二叉排序树的查找也就退化成了线性查找,所以我们需要合理调整二叉排序树的形态,使得树上的每个结点都尽量有两个子结点,这样整个二叉树的高度就会大约在log(n)log(n)左右,其中nn为结点个数。基本性质AVL树也称为平衡二叉树,是一种自平衡的二叉排序树,本质上仍然是一颗二叉排序树,只是增加了“平衡”的...原创 2020-08-20 23:47:52 · 254 阅读 · 0 评论 -
数据结构与算法——二叉排序树(二叉查找树)
二叉排序树二叉排序树(Binary Sort Tree),又称为二叉查找树;它是一棵空树或着是具有下列性质的二叉树:若左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若右子树不空,则右子树上所有结点的值均大于它的根结点的值; 左、右子树也分别为二叉排序树。 不允许有键值相同结点当我们对上图的二叉排序树进行中序遍历时,便可以得到有序的序列;但构造一个排序二叉树的目的,其实并不是为了排序,而是为了提高查找和插入删除关键字的速度。二叉排序树的操作首先提供下二叉树的结构:原创 2020-08-20 00:02:11 · 593 阅读 · 0 评论 -
数据结构与算法——二分查找和插值查找的算法
二分查找算法描述:如果待查序列不为空,则将它的中间元素与要查找的目标元素进行匹配,看它们是否相等; 如果相等,则返回该中间元素的索引,并退出算法;此时就查找成功了;如果不相等,就比较这两个元素的大小; a. 如果该中间元素大于目标元素,那么就将当前序列的前半部分作为新的待查序列;这是因为后半部分的所有元素都大于目标元素,它们全都被排除了。 b.如果该中间元素小于目标元素,那么就将当前序列的后半部分作为新的待查序列;这是因为前半部分的所有元素都小于目标元素,它们全都被排除了。 在新的待查序列.原创 2020-08-19 22:24:11 · 163 阅读 · 0 评论 -
数据结构与算法——AOE网的关键路径
数据结构与算法——AOE网的关键路径AOE是带权值的有向图,以顶点表示事件,以边表示活动,边上的权值表示活动的开销(如项目工期)。AOE 是建立在子过程之间的制约关系没有矛盾的基础之上,再来分析整个过程需要的开销。所以如果给定AOV网中各顶点活动所需要的时间,则可以转换为AOE网,较为简单的方法就是把每个顶点都拆分成两个顶点,分别表示活动的起点和终点事件和活动 把上图转换成一般的AOE图如下实现源码:#include <iostream>using nam.原创 2020-08-17 23:32:58 · 1720 阅读 · 0 评论 -
数据结构与算法——有向图的拓扑排序
数据结构与算法——拓扑排序在有向图中,用顶点表示活动,用有向边<Vi,Vj>表示活动i是活动j的必须条件,这种有向图为顶点表示活动的网简称为AOV网络。在AOV网络中,如果活动Vi 必须在Vj 之前进行,则存在有向边<Vi,Vj>,并称Vi是Vj的直接前驱,Vj是Vi的直接后继;这种前驱与后继的关系具有传递性和反自反性,这要求AOV网络中不能出现回路,即有向环;因此,对于给定的AOV网络,必须判断它是否存在有向环。拓扑排序描述 检测有向环可以通过对AOV网络进行拓扑原创 2020-08-17 19:27:38 · 4719 阅读 · 0 评论 -
数据结构与算法——图的最小路径之弗洛伊德算法
图的最小路径之弗洛伊德算法实现源码:typedef int Pathmatirx[MAXVER][MAXVER];typedef int ShortPathTable[MAXVER][MAXVER];void ShortestPath_Floyd(MGraph G, Pathmatirx *P, ShortPathTable *D){ int v, w, k; for (v = 0; v < G.numVertexes; v++) { fo...原创 2020-08-16 19:27:13 · 164 阅读 · 0 评论 -
数据结构与算法——图的最短路径之迪杰斯特拉(Dijkstra)算法
图的最短路径之迪杰斯特拉(Dijkstra)算法看图分析:1. 迪杰斯特拉算法的思想:是从起点开始,根据边的权值信息逐步推出到各个顶点的最小值,然后利用推导出来的最小权值顶点不断迭代更新到顶点的最小路径;2. 结合上图来看下推导过程: a. 默认v0到v1、v2...v8各个顶点的最小路径为不可能的最大值记缓存信息为buffer[numVertex](即未知) b. 从v0开始,遍历v0的所有边权值,取最小权值为1,为此时的最小路径; ...原创 2020-08-16 15:16:02 · 381 阅读 · 0 评论 -
数据结构与算法——图的最小生成树之克鲁斯卡尔算法
图的最小生成树之克鲁斯卡尔算法克鲁斯卡尔算法是以某个顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树。克鲁斯卡尔算法需要将边集数组按照权值从小到大排序,如下所示:看图分析:1.克鲁斯卡尔算法它的基本思想有别于普利姆算法,它是按顺序利用具有最优权值边去构建最小生成树,这个过程的关键是在逐一利用最优边时,保证生成的是一个树,而不是闭环的图,如果要使生成树的过程中不会闭环,我们要保证,从已选择边的任何一个点起,都不会形成一个闭环;2. 结合图来看:选择前6个边之后的图示如下,从任何一.原创 2020-08-16 00:15:12 · 310 阅读 · 0 评论 -
数据结构与算法——图的最小生成树之普里姆算法
图的最小生成树之普里姆算法看图分析(我们将图中的权当作距离来看待):1. 从任一点出发(这里从0出发),0到下个最近顶点2的距离最小为1,这一步简单直接;2. 对于从顶点2出发,去寻找最小距离的下一个顶点,我们需要考虑下面的情况:经过第一步,现在我们拥有了两个顶点(即 顶点0 和 顶点2)可以出发,去往相同的地方(这里的 顶点1 和 顶点3);来分析顶点2选择最优距离的过程: a. 顶点2——> 顶点1 的距离为 5;(这个时候要考虑顶点0——>...原创 2020-08-15 22:32:57 · 304 阅读 · 0 评论 -
数据结构与算法——图的基本概念
图的基本概念图(graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。图中的数据称为顶点,有别于线性表的元素,树中的结点; 在图结构中,不允许没有顶点,v为有穷非空; 在图中任意两个顶点之间都可能有关系,顶点之间的逻辑关系用 边 来表示;边集可以是空集。图的相关定义无向边:若顶点v1和v2之间的边没有方向,则称这条边为无向边(Edge),用无序偶对(v0,v1)来表示。无向图:图中任意两个顶点之原创 2020-08-13 23:51:44 · 741 阅读 · 0 评论 -
数据结构与算法——线索二叉树
线索二叉树二叉树常用二叉链表的形式存储,链表中的每个结点形式如下:二叉链表存储的示意图如下,可以发现在二叉链表中如果一个结点没有左或右孩子结点,就会出现空指针域(^)的问题,如下:当我们中序遍历二叉树时,得到的结果为:H D I B J E A F C G (粗体是包含空指针域的结点)通过中序遍历的结果,可以发现每个同时有左右孩子的结点的边上都有一个存在空指针域的结点,通过利用这个空指针域来指向中序遍历的前驱后续来实现“双向”访问,这就是线索二叉树。基本实现思想通过上述的..原创 2020-08-13 00:44:14 · 518 阅读 · 0 评论 -
数据结构与算法——树和二叉树简介
树和二叉树基本术语结点:树的数据元素;结点的度:结点上分支出的子树个数;一个树中最大的结点的度称为树的度。叶子:度为0的结点,又称为终端结点孩子:结点的子树的根,称为该结点的孩子双亲:对应于孩子结点的上层结点称为这个结点的双亲兄弟:同一双亲的孩子之间互称为兄弟结点的层次:从根结点算起,根为第一层,其他结点的层次等于它的双亲的层次加1深度:或称为高度,是树中结点的最大层次,森林:是n(大于等于0)棵互不相交的树的集合。树树(Tree)是一种由多个节点组成的有限集原创 2020-08-07 00:01:46 · 292 阅读 · 0 评论 -
数据结构与算法——算法的复杂度
时间复杂度:一个算法的时间复杂度反映了程序运行从开始时间到结束所需的时间,把算法中基本操作重复执行的次数(频度)作为算法的时间复杂度。时间复杂度只关注最高数量级,且与之系数也没有关系。评估算法时间复杂度的具体步骤是:(1)找出算法中重复执行次数最多的语句的频度来估算算法的时间复杂度;(2)保留算法的最高次幂,忽略所有低次幂和高次幂的系数;(3)将算法执行次数的数量级放入大Ο记号中。时间复杂度度量实例:#include <iostream>using namespa转载 2020-07-22 00:28:09 · 200 阅读 · 0 评论