![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
hopegrace
取乎其上,得乎其中;取乎其中,得乎其下;取乎其下,则无所得矣!
展开
-
1、搜索算法的剪枝优化
搜索算法按搜索的方式分有两类,一类是深度优先搜索,一类是广度优先搜索。我们知道,深度搜索编程简单,程序简洁易懂,空间需求也比较低,但是这种方法的时间复杂度往往是指数级的,倘若不加优化,其时间效率简直无法忍受;而广度优先搜索虽然时间复杂度比前者低一些,但其庞大的空间需求量又往往让人望而却步。所以,对程序进行优化,就成为搜索算法编程中最关键的一环。本文所要讨论的便是搜索算法中优化程序...原创 2020-03-10 09:05:52 · 1356 阅读 · 0 评论 -
1、链表操作(加新的结点,排列),结构体的定义及相关操作
1、实现链表中添加新的结点,并按序排列#include"stdio.h"#include"stdlib.h"#defineN8typedefstructlist{intdata;structlist*next;}SLIST;voidfun(SLIST*h,intx)//生成链表,实现插入{SLIST*...原创 2020-03-09 09:05:06 · 448 阅读 · 0 评论 -
3、文件的操作,及相关函数
1、源程序#include"stdlib.h"#include"stdio.h"#defineN3typedefstructme{intnum;charname[10];chartell[11];}STYPE;voidinput(STYPE*std){inti;printf("Nowi'llinput:\n");for(i=0;i<N...原创 2020-03-09 09:02:22 · 188 阅读 · 0 评论 -
20、字符串操作常见函数
字符串与字符数组都是描述由多个字符构成的数据,字符串借用字符数组来完成处理。但请注意:(1)表示字符串数据用双引号表示,而字符数据用单引号。(2)字符串的长度可以根据串中字符个数临时确定,而字符数组的长度必须事先规定。(3)对字符串,系统在串尾加’\0’作为字符串的结束标志,而字符数组并不要求最后一个字符为’\0’。(4)用字符数组来处理字符串时,字符数组的长度应比要处理的字符串长...原创 2020-03-09 08:48:46 · 488 阅读 · 0 评论 -
21、连接字符串的方法
连接两个字符串:1、用sprintf函数,具体见sprintf部分。2、用strcat函数。char*strcat(char*dest,constchar*src),输出参数是连接后的字符串,返回值是dest的指针。3、自己编写程序a[i+(k++)]=b[k++]。...原创 2020-03-09 08:48:04 · 332 阅读 · 0 评论 -
23、迭代和递归
1.递归和迭代术语的定义是什么?一个函数可以同时采用这两种方法吗?答:递归的定义:将一个大问题分解成比较小的、有着相同形式的问题。迭代跟递归策略是相反的。它使用循环(一般情况下,使用for和while语句)的实现被称为迭代的。他们能够通过截然不同的方式来解决一个问题。然而,这些策略并不互相排斥。2.递归和逐步求精法的根本区别是什么?答:“相同形式”是这个定义...原创 2020-03-09 08:46:25 · 136 阅读 · 0 评论 -
26、最常用的两种排序:冒泡和选择
1、冒泡排序输入:数组名称(也就是数组首地址)、数组中元素个数。算法思想简单描述:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。下面是一种改进的冒泡算法,它记录了每一遍扫描后最后下沉数的位置k,这样可以减少外层循环扫描的次数。冒泡排...原创 2020-03-09 08:44:09 · 171 阅读 · 0 评论 -
6、求最小生成树,普里姆(Prim)算法
1、相关概念1)生成树一个连通图的生成树是它的极小连通子图,在n个顶点的情形下,有n-1条边。生成树是对连通图而言的,是连同图的极小连通子图,包含图中的所有顶点,有且仅有n-1条边。非连通图的生成树则组成一个生成森林;若图中有n个顶点,m个连通分量,则生成森林中有n-m条边。2)和树的遍历相似,若从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历,(Tra...原创 2020-03-08 10:26:16 · 2054 阅读 · 0 评论 -
7、最小生成树,克鲁斯卡尔(Kruskal)算法
1)算法的基本思想:前面我们学习过Prim算法,他是一种以某个节点出发,按权值递增的次序选择合适的边来构造最小生成树的方法,他的时间复杂度为O(n2),与顶点有关,而与边无边,所以适合求边稠密的图的生成树。算法构造一颗最小生成树的过程如下(母图基于Prim算法部分的无向图):2)算法的描述:在图中任取一个顶点K作为开始点,令U={k},W=V-U,其中V为图中所有顶点集,然...原创 2020-03-08 10:25:09 · 835 阅读 · 0 评论 -
27、return 语言与 exit 语句的异同
1)return语句从当前函数退出,并从那个函数返回一个值。return[()|[expression][]];可选项expression参数是要从函数返回的值。如果省略,则该函数不返回值。return()是当前函数返回,当然如果是在主函数main,自然也就结束当前进程了,如果不是,那就是退回上一层调用。换一种表示方法,也就是说:return返回语句有两种形式。...原创 2020-03-08 10:24:06 · 134 阅读 · 0 评论 -
8、每对顶点之间的最短路径,弗洛伊德(Floyd)算法
顶点对之间的最短路径是指:对于给定的有向网G=(V,E),要对G中任意一对顶点有序对V、W(V≠W),找出V到W的最短距离和W到V的最短距离。解决此问题的一个有效方法是:轮流以每一个顶点为源点,重复执行迪杰斯特拉算法n次,即可求得每一对顶点之间的最短路径,总的时间复杂度为O(n3)。弗洛伊德(Floyd)提出了另外一个求图中任意两顶点之间最短路径的算法,虽然其时间复杂度也是O(n...原创 2020-03-08 10:23:03 · 2143 阅读 · 0 评论 -
9、深度优先算法,图的遍历
和树的遍历相似,若从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(TraversingGraph)。图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。图的遍历顺序有两种:深度优先搜索(DFS)和广度优先搜索(BFS)。对每种搜索顺序,访问各顶点的顺序也不是唯一的。1、邻接表及逆邻接表的存储方法(1)定义邻接表是图的一种链式存储结构。类似于树...原创 2020-03-08 10:21:50 · 1020 阅读 · 0 评论 -
10、广度优先搜索,图的遍历
1、队列(1)定义队列也是一种运算受限的线性表。在这种线性表上,插入限定在表的某一端进行,删除限定在表的另一端进行。允许插入的一端称为队尾,允许删除的一端称为队头。特点:队列中数据元素的入队和出队过程是按照“先进先出”的原则进行的。因此,队列又称为“先进先出”的线性表,简称FIFO表。(2)实现-链队列队列的链式存储结构简称为链队。它...原创 2020-03-08 10:21:11 · 806 阅读 · 0 评论 -
29、指针,及其运算(注意点)
指针可以进行加法,减法,及比较大小的运算。1、指针加、减一个整形表达式pointer+/-n:是pointer地址值+/-n×sizeof(*pointer),即地址值实际增加或减少的字节数为n倍对象类型长度。2、两个对象类型相同的指针进行减法运算p-q=n:运算结果对象类型是一个整数,表示两个地址值相差的对象类型长度的倍数。3、指针比较大小,就是比较地址值的高低。4、首地...原创 2020-03-08 10:20:26 · 170 阅读 · 0 评论 -
11、 拓扑排序
1、堆栈栈是一种特殊的线性表,插入或删除栈元素的运算只能在表的一端进行,称运算的一端为栈顶,另一端称为栈底。队列也是一种特殊的线性表(基本操作都是线性操作的子集)。特点:后进先出栈又称为“后进先出”的线性表,简称LIFO表。栈的链式实现是以链表作为栈的存储结构,并在这种存储结构上实现栈的基本运算。栈的链式实现称为链栈。2、有向无环图描述含有公共子式的表达式的有效...原创 2020-03-08 10:19:37 · 426 阅读 · 0 评论 -
12、加权平均队列(WFQ-Weight Fair Queue)算法
1、队列调度算法总述WFQ,WF2Q,等均是基于时戳的持续调度算法。这类算法都使用了类似的“分组有序排队”机制(sortedpriorityqueuemechanism)。这种机制根据系统状态为每个到达分组计算一个时戳(timestamp),并以这个时戳作为分组调度优先顺序的度量指标。这些算法的区别在于如何计算时戳。WFQ和WF2Q算法通过参考理想的流体调度模型GPS(...原创 2020-03-08 10:18:50 · 3821 阅读 · 0 评论 -
31、堆栈和队列的常见操作
1、队列的常见操作#defineMATRIX_INIT_SIZE100#defineMATRIXINCREMENT10#defineOKtrue#defineERRORfalse#include<stdio.h>#include<stdlib.h>typedefintStatus;typedefstructQNode{...原创 2020-03-08 10:16:31 · 189 阅读 · 0 评论 -
13、弗罗莱(Fleury)算法,求欧拉(Euler)通路/回路
1、基本概念:(1)定义欧拉通路(欧拉迹)—通过图中每条边一次且仅一次,并且过每一顶点的通路。欧拉回路(欧拉闭迹)—通过图中每条边一次且仅一次,并且过每一顶点的回路。欧拉图—存在欧拉回路的图。欧拉图就是从一顶出发每条边恰通过一次又能回到出发顶点的那种图,即不重复的行遍所有的边再回到出发点。通路和回路-称vie1e2…envj为一条从vi到vj且长度为n的通路,其中长度...原创 2020-03-07 09:58:54 · 1112 阅读 · 0 评论 -
14、求关键路径
1、重要概念(1)AOE(ActivityOnEdges)网络如果在无有向环的带权有向图中用有向边表示一个工程中的各项活动(Activity),用边上的权值表示活动的持续时间(Duration),用顶点表示事件(Event),则这样的有向图叫做用边表示活动的网络,简称AOE(ActivityOnEdges)网络。AOE网是一个带权的有向无环图。AOE网络在某些工程估算方面非常有...原创 2020-03-07 09:57:55 · 1973 阅读 · 0 评论 -
15、构造最优二叉树-赫夫曼(Huffman)树算法
一、基本概念1、赫夫曼(Huffman)树又称最优二叉树或最优搜索树,是一种带权路径长度最短的二叉树。在许多应用中,常常赋给树中结点一个有某种意义的实数,称此实数为该结点的权。从树根结点到该结点之间的路径长度与该结点上权的乘积称为结点的带权路径长度(WPL),树中所有叶子结点的带权路径长度之和称为该树的带权路径长度,通常记为:2、两结点间的路径:从一结点到另一结点所经过的结点序列;路径...原创 2020-03-07 09:57:02 · 8789 阅读 · 0 评论 -
17、线索二叉树的生成和遍历
一、相关概念及思想介绍1、n个结点有n-1个前驱和n-1个后继;一共有2n个链域,其中:n+1个空链域,n-1个指针域;因此,可以用空链域来存放结点的前驱和后继。线索二叉树就是利用n+1个空链域来存放结点的前驱和后继结点的信息。2、线索:有效利用二叉链表中空的存储空间,指定原有的孩子指针为空的域来存放指向前驱和后继的信息,这样的指针被称为“线索”。加线索的过程称为线索化,由此得到的二叉树...原创 2020-03-07 09:55:13 · 560 阅读 · 0 评论 -
18、树和森林的存储结构、转换、遍历
一、树的存储结构1、双亲存储表示法一般采用顺序存储结构实现。用一组地址连续的存储单元来存放树的结点,每个结点有两个域: data域-----存放结点的信息; parent域-----存放该结点双亲结点的位置。特点:求结点的双亲很容易,但求结点的孩子需要遍历整个向量。存储结构描述为:#defineMaxTreeSize100//定义数组空间的大小...原创 2020-03-07 09:54:29 · 1120 阅读 · 0 评论 -
32、再论函数传值中指针和引用的区别
一、回忆前面我们谈到过指针和引用的区别及联系,认识到,指针是一个实体,而引用仅是个别名(绰号);对引用型变量进行除赋值以外的一切操作,相当于对被引用变量进行操作。但是,问题还没有结束,今天我想到一个问题,开始破灭我心中对前面引用的认识。对引用的介绍,见http://blog.163.com/zhoumhan_0351/blog/static/399542272009...原创 2020-03-07 09:53:41 · 174 阅读 · 0 评论 -
19、内部排序之快速排序
内部排序指排序记录存放在计算机随机存储器中进行的排序过程,外部排序指,由于待排序的记录数量太大,以致排序过程中尚需对外存进行访问的排序过程。一、快速排序的基本思想1、快速排序(QuickSorting)又称分区交换排序,是对冒泡排序算法的改进,是一种基于分组进行互换的排序方法。2、快速排序的基本思想是:从待排记录序列中任取一个记录Ri作为基准(通常取序列中的第一个记录),将所...原创 2020-03-07 09:53:01 · 422 阅读 · 0 评论 -
20、内部排序之插入排序(直接插入、折半插入、希尔排序)
一、相关概念1、增排序和减排序:如果排序的结果是按关键字从小到大的次序排列的,就是增排序,否则就是减排序。2、稳定排序和不稳定排序:假设Ki=Kj(1≤i≤n,1≤j≤n,i≠j),且在排序前的序列中Ri领先于Rj(即i<j)。若在排序后的排序中Ri仍领先于Rj,即那些具有相同关键字的记录,经过排序后它们的相对次序仍然保持不变,则称这种排序方法是稳定的;反之,若Rj领先于Ri,则称所...原创 2020-03-07 09:52:12 · 284 阅读 · 0 评论 -
36、C语言常用库函数-进程函数类
进程函数(原型声明所在头文件为stdlib.h、process.h)voidabort()此函数通过调用具有出口代码3的_exit写一个终止信息于stderr,并异常终止程序。无返回值intexec…装入和运行其它程序intexecl(char*pathname,char*arg0,char*arg1,…,char*argn,NULL)intexec...原创 2020-03-06 11:01:14 · 288 阅读 · 0 评论 -
37、C语言常用库函数-转换类型类
转换常用函数(函数原型所在头文件为math.h、stdlib.h、ctype.h、float.h)char*ecvt(doublevalue,intndigit,int*decpt,int*sign)将浮点数value转换成字符串并返回该字符串char*fcvt(doublevalue,intndigit,int*decpt,int*sign)将浮点数value...原创 2020-03-06 11:00:30 · 197 阅读 · 0 评论 -
21、内部排序之选择排序(简单选择排序、堆排序)
一、基本思想选择排序(SelectionSort)的基本思想是:不断从待排记录序列中选出关键字最小的记录插入已排序记录序列的后面,直到n个记录全部插入已排序记录序列中。1、简单选择排序第i趟排序开始时,有序区和无序区分别为R[1..i-1]和R[i..n](i=1,2,..n-1),该趟排序则是从n-i+1个记录选取关键字最小的记录R[k],并与第i(i=1,2,...,n)个记录交...原创 2020-03-06 10:59:48 · 355 阅读 · 0 评论 -
22、内部排序之归并排序
一、基本思想1、“归并”的含义:将两个或两个以上有序表组合成一个新的有序表。2、归并排序的基本思想:将待排序的n个记录,看作n个有序的子序列,每个子序列的长度为1。然后两两归并,得到n/2个长度为2或为1的子序列;再两两归并,...,如此重复,直到得到长度为n的子序列为止。这种排序的方法称为2-路归并排序。2-路归并排序的核心操作:将一维数组中前后两个有序序列归并为一个有序序列。在归并过程...原创 2020-03-06 10:58:47 · 156 阅读 · 0 评论 -
23、内部排序之基数排序
一、基本思想1、基数排序(RadixSort)是一种借助于多关键字排序的思想对单逻辑关键字进行排序的方法,即先将关键字分解成若干部分,然后通过对各部分关键字的分别排序,最终完成对全部记录的排序。对记录关键字进行定义时,总是要规定其长度和组成的字符。这样,可以把d位关键字看作d个关键字组成的一个多关键字。基数排序首先把每个关键字看作为一个d元组:...原创 2020-03-06 10:58:04 · 698 阅读 · 0 评论 -
39、链表(静态和动态)
1、链表的定义链表分为两种:动态链表和静态链表。链表中结点的分配和回收(即释放)是由系统提供的标准函数malloc和free动态实现的,称之为动态链表。而通过定义一个较大的结构体数组来作为备用结点空间(即存储池),每个结点应至少含有两个域:data域和cursor域;data域用来存放结点的数据信息,cursor域(我们有时也称之为指针,通常叫游标)...原创 2020-03-06 10:57:20 · 222 阅读 · 0 评论 -
27、动态查找树之平衡二叉树(Balanced Binary Tree,AVL树)
一、平衡二叉树的概念平衡二叉树(Balancedbinarytree)是由阿德尔森-维尔斯和兰迪斯(Adelson-VelskiiandLandis)于1962年首先提出的,所以又称为AVL树。定义:平衡二叉树或为空树,或为如下性质的二叉排序树:(1)左右子树深度之差的绝对值不超过1;(2)左右子树仍然为平衡二叉树.平...原创 2020-03-05 10:02:48 · 715 阅读 · 0 评论 -
29、B-树的插入、查找、删除
前面讨论的查找都是内查询算法,被查询的数据都在内存。当查询的数据放在外存,用平衡二叉树作磁盘文件的索引组织时,若以结点为内外存交换的单位,则找到需要的关键字之前,平均要进行lgn次磁盘读操作,而磁盘、光盘的读写时间要比随机存取的内存代价大得多。其二,外存的存取是以“页”为单位的,一页的大小通常是1024字节或2048字节。针对上述特点,1972年R.Bayer和E.M.Cright提出了一...原创 2020-03-03 09:18:31 · 445 阅读 · 0 评论 -
30、B-树与B+树的异同
前面已经介绍过B-树,接下来,我们主要介绍一下B+树。1、B+树的概念B+树是应文件系统所需而生的一种B-树和变形树。一棵m阶B+树和m阶的B-树的差异在于:(1)有n棵子树的结点中含有n个关键字。(2)所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身关键字的大小自小而大顺序链接。(3)所有的非终端节点可以看成是索引部分,结点中仅含有其子...原创 2020-03-03 09:17:41 · 218 阅读 · 0 评论 -
31、键树的插入、查找(孩子兄弟存储结构)
一、基本概念1、键树:如果一个关键字可以表示成字符的序号,即字符串,那么可以用键树(keywordtree),又称数字搜索树(digitalsearchtree)或字符树,来表示这样的字符串的集合。2、键树相关说明:键树是一棵多叉树(度>=2),树中每个结点并不代表一个关键字或元素,而只代表字符串中的一个字符。例如,它可以表示数字串中的一个数位,或单词中的一个字母等等。根结点不...原创 2020-03-03 09:15:38 · 309 阅读 · 0 评论 -
32、键树的插入、查找(多重链表存储)
一、基本概念在《键树的插入、查找(孩子兄弟存储)》一文中,已经讨论了基本概念,此不赘述。http://blog.163.com/zhoumhan_0351/blog/static/3995422720091024111855806以多重链表存储作存储结构时,此时的键树又称为Trie(retrieve检索)树。在叶子结点中存储关键字及指向记录的指针信息,在分支结点...原创 2020-03-03 09:13:47 · 578 阅读 · 0 评论 -
33、串的模式匹配-Brute-Force算法
一、与串相关的概念1、串(或字符串)是由零个或多个字符组成的有限序列。一般记作:s=〃c0c1c2…cn-1〃(n≥0)。零个字符的串称为空串,通常以两个相邻的双引号来表示空串,仅由空格组成的的串称为空格串,如:s=〃〃;2、串与线性表的异同。字符串一般简称为串,可以将它看作是一种特殊的线性表,这种线性表的数据元素的类型总是字符型的,字符串的数据对象约束为字符集。在线性表的基本操...原创 2020-03-03 09:12:42 · 1036 阅读 · 0 评论 -
34、串的模式匹配-KMP算法
一、KMP算法的思想由D.E.Knuth、J.H.Morris和V.R.Pratt共同提出了一个改进算法,消除了Brute-Force算法中串s指针的回溯,完成串的模式匹配。时间复杂度为O(s.curlen+t.curlen),这就是Knuth-Morris-Pratt算法,简称KMP算法。1、KMP算法形成过程:若S[i]≠P[j],为使主串指针i不回溯,可以从模式串的第k个字符...原创 2020-03-03 09:11:36 · 539 阅读 · 0 评论 -
4、字符串的比较
1、源程序#include"stdlib.h"#include"stdio.h"#include"string.h"#definemax30voidfun(char*pst[6]){inti,j;char*p;for(i=0;i<5;i++){for(j=i+1;j<6;j++)if(strcmp(*(pst+i),*(...原创 2020-03-02 09:53:41 · 499 阅读 · 0 评论 -
2、Dijkstra算法
1、算法描述在一个如图1的有向图中,如何求源点到到其它各点的最短路径呢?图1示Dijkstra提出了一个按路径长度递增的次序产生最路径的算法。首先,引进一个辅助向量D,它的每个分量D[j]表示当前所找到的从始点v到每个终点vi的最短路径的长度。它的初态为:若从v到vi有弧,则D[i]为弧上的权值;否则置D[i]为无穷。显然,长度为D[j]=Mi...原创 2020-03-01 11:38:03 · 620 阅读 · 0 评论