
算法(Algorithm)
文章平均质量分 54
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
香香家的臭臭
这个作者很懒,什么都没留下…
展开
-
树结构及其算法-线索二叉树
虽然我们把树转换为二叉树可减少空间的浪费——由2/3降低到1/2,但是如果仔细观察之前使用链表建立的n节点二叉树,那么会发现用来指向左右两个节点的指针只有n-1个链接,另外的n+1个指针都是空链接。所谓线索二叉树(Threaded Binary Tree),就是把这些空链接加以利用,再指到树的其他节点,这些链接就称为线索(Thread),而这棵树就称为线索二叉树。和链表所建立的二叉树不同之处在于。为了区别正常指针或线索而加入的两个字段:LBIT和RBIT。原创 2023-11-05 23:57:52 · 237 阅读 · 0 评论 -
树结构及其算法-二叉排序树
事实上,二叉树是一种很好的排序应用模式,因为在建立二叉树的同时,数据已经经过初步的比较,并按照二叉树的建立规则来存放数据原创 2023-11-05 05:57:22 · 209 阅读 · 0 评论 -
树结构及其算法-二叉运算树
二叉树的应用实际上相当广泛,例如表达式之间的转换。可以把中序表达式按运算符优先级的顺序建成一棵二叉运算树(Binary Expression Tree,或称为二叉表达式树)。原创 2023-11-05 05:04:34 · 363 阅读 · 0 评论 -
树结构及其算法-二叉树节点的删除
二叉树节点的删除操作稍为复杂,可分为以下3种情况。删除的节点为树叶,只要将其相连的父节点指向NULL即可。删除的节点只有一棵子树。删除的节点有两棵子树。要删除节点,方式有两种,虽然结果不同,但是都符合二叉树的特性。原创 2023-11-02 01:45:51 · 607 阅读 · 0 评论 -
树结构及其算法-二叉树节点的插入
二叉树节点插入的情况和查找相似,重点是插入后仍要保持二叉查找树的特性。如果插入的节点已经在二叉树中,就没有插入的必要了,如果插入的值不在二叉树中,就会出现查找失败的情况,相当于找到了要插入的位置。原创 2023-11-01 16:31:25 · 290 阅读 · 0 评论 -
树结构及其算法-二叉查找树
二叉树在建立的过程中是根据“左子树 < 树根 < 右子树”的原则建立的,因此只需从树根出发比较键值即可,如果比树根大就往右,否则往左而下,直到相等就找到了要查找的值,如果比较到nullptr,无法再前进,就代表查找不到此值。原创 2023-11-01 16:24:47 · 149 阅读 · 0 评论 -
树结构及其算法-二叉树遍历
我们知道线性数组或链表都只能单向从头至尾遍历或反向遍历。所谓二叉树的遍历(Binary Tree Traversal),简单的说法就是访问树中所有的节点各一次,并且在遍历后将树中的数据转化为线性关系。对于一棵简单的二叉树节点来说,每个节点都可分为左、右两个分支,可以有ABC、ACB、BAC、BCA、CAB和CBA六种遍历方法。如果按照二叉树的特性,一律从左向右遍历,就只剩下3种遍历方式,分别是BAC、ABC、BCA。对于这3种遍历方式,大家只需要记住树根的位置,就不会把前序、中序和后序搞混了。原创 2023-11-01 16:11:28 · 203 阅读 · 0 评论 -
树结构及其算法-用链表来实现二叉树
使用链表来表示二叉树的好处是节点的增加与删除操作相当容易,缺点是很难找到父节点,除非在每一个节点多增加一个指向父节点的指针。以链表实现二叉树就是使用链表来存储二叉树,也就是运用动态分配内存和指针的方式来建立二叉树。原创 2023-11-01 15:42:21 · 247 阅读 · 0 评论 -
树结构及其算法-用数组来实现二叉树
使用有序的一维数组来表示二叉树,首先可将此二叉树假想成一棵满二叉树,而且第层具有个节点,按序存放在一维数组中。首先来看看使用一维数组建立二叉树的表示方法以及数组索引值的设置。接着来看如何以一维数组建立二叉树的实例,实际上就是建立一棵二叉查找树。这是一种很好的排序应用模式,因为在建立二叉树的同时数据就经过了初步的比较判断,并按照二叉树的建立规则来存放数据。原创 2023-11-01 12:19:19 · 841 阅读 · 0 评论 -
堆栈和队列算法-双向队列
双向队列(Double Ended Queues,DEQue)为一个有序线性表,加入与删除操作可在队列的任意一端进行。具体来说,双向队列就是允许队列两端中的任意一端都具备删除和加入功能,而且无论是队列的左端还是右端,队首与队尾指针都是朝队列中央移动的。通常,双向队列的应用可以区分为两种:一种是数据只能从一端加入,但可以从两端取出;另一种是数据可以从两端加入,但只能从一端取出。原创 2023-10-31 14:17:31 · 80 阅读 · 0 评论 -
堆栈与队列算法-以链表来实现队列
队列除了能以数组的方式来实现外,也可以用链表来实现。在声明队列的类中,除了和队列相关的方法外,还必须有指向队列前端和队列末尾的指针,即front和rear。原创 2023-10-31 11:37:13 · 126 阅读 · 0 评论 -
堆栈与队列算法-用数组来实现队列
用数组结构来实现队列的好处是算法相当简单,不过与堆栈不同的是需要拥有两种基本操作:加入和删除,而且要使用front与rear两个指针来分别指向队列的前端与末尾,缺点是数组大小无法根据队列的实际需要来动态申请,只能声明固定的大小。原创 2023-10-31 10:29:05 · 345 阅读 · 0 评论 -
堆栈与队列算法-八皇后问题的求解算法
八皇后问题是一种常见的堆栈应用实例。在国际象棋中的皇后可以在没有限定一步走几格的前提下,对棋盘中的其他棋子直吃、横吃和对角斜吃(左斜吃或右斜吃均可)。现在要放入多个皇后到棋盘上,相互之间不能互相吃到对方。后放入的新皇后,放入前必须考虑所放位置的直线方向、横线方向或对角线方向是否已被放置了旧皇后,否则就会被先放入的旧皇后吃掉。利用这种概念,我们将其应用到4X4的棋盘上,就称为四皇后问题;应用在8X8的棋盘上,就称为八皇后问题;应用在NXN的棋盘上,就称为N皇后问题。原创 2023-10-30 16:30:47 · 168 阅读 · 0 评论 -
堆栈与队列算法-汉诺塔问题的求解算法
1883年法国数学家 Edouard Lucas曾提及这个故事,据说创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小 至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。原创 2023-10-09 05:17:12 · 195 阅读 · 0 评论 -
堆栈与队列算法-以链表来实现堆栈
虽然以数组结构来制作堆栈的好处是制作与设计的算法都相当简单,但若堆栈本身是变动的话,则数组大小无法事先规划声明。这时往往必须考虑使用最大可能性的数组空间,这样会造成内存空间的浪费。而用链表来制作堆栈的优点是随时可以动态改变链表的长度,不过缺点是设计时算法较为复杂。原创 2023-10-30 13:43:02 · 103 阅读 · 0 评论 -
堆栈与队列算法-以数组来实现堆栈
以数组结构来实现堆栈的好处是设计的算法都相当简单。不过,如果堆栈本身的大小是变动的,而数组大小只能事先规划和声明好,那么数组规划太大了浪费空间,规划太小了则不够用,这是以数组来实现堆栈的缺点。原创 2023-10-30 13:16:23 · 96 阅读 · 0 评论 -
数组与链表算法-链表与多项式
使用链表的最大好处就是减少内存的浪费,并且能增加使用上的弹性。例如数学上常用的多项式表示法,虽然可以使用数组方式来处理,但当数据内容变动时对数组结构的影响相当大,算法处理不易。另外,由于数组是静态数据结构,事先必须获取连续的且足够大的内存,容易造成存储空间上的浪费。原创 2023-10-29 15:21:40 · 104 阅读 · 0 评论 -
数组与链表算法-矩阵算法
矩阵的相加运算较为简单,前提是相加的两个矩阵对应的行数与列数必须相等,而相加后矩阵的行数与列数也是相同的。原创 2023-10-28 19:04:07 · 543 阅读 · 0 评论 -
数组与链表算法-数组与多项式
多项式是数学中相当重要的表达方式,如果使用计算机来处理多项式的各种相关运算,那么通常使用数组或链表来存储多项式。原创 2023-10-28 19:35:17 · 153 阅读 · 0 评论 -
数组与链表算法-单向链表算法
在C++中,若以动态分配产生链表节点的方式,则可以先行定义一个类数据类型,接着在类中定义一个指针变量,其数据类型与此类相同,作用是指向下一个链表节点,另外类中至少要有一个数据字段。例如,声明一个学生成绩链表节点的结构,并且包含两个数据字段:姓名(name)和成绩(score),以及一个指针(next)。接着就可以动态创建链表中的每个节点。遍历(Traverse)单向链表的过程,就是使用指针运算来访问链表中的每个节点。原创 2023-10-28 23:47:01 · 368 阅读 · 0 评论 -
查找算法-斐波那契查找法(Fibonacci Search)
斐波那契查找法又称为斐氏查找法,此查找法和二分法一样都是以分割范围来进行查找的,不同的是斐波那契查找法不是按对半方式来分割的,而是以斐波那契级数的方式来分割的。斐波那契级数的定义如下:斐波那契级数:0、1、1、2、3、5、8、13、21、34、55、89、...。也就是除了第0个和第1个元素外,级数中的每个元素值都是前两个元素值的和。斐波那契查找法的好处是只需要用到加减运算而不需要用到乘除运算,这从计算机运算的过程来看效率会高于前两种查找法。在尚未介绍斐波那契查找法之前,我们先来认识斐波那契树。原创 2023-10-26 00:17:07 · 761 阅读 · 2 评论 -
查找算法-插值查找法(Interpolation Search)
插值查找法又称为插补查找法,是二分查找法的改进版。它是按照数据位置的分布,利用公式预测数据所在的位置,再以二分法的方式渐渐逼近。使用插值查找法是假设数据平均分布在数组中,而每一项数据的差距相当接近或有一定的距离比例。其中,key是要查找的键值,data[high]、data[low]是剩余待查找记录中的最大值和最小值。原创 2023-10-25 23:47:55 · 237 阅读 · 0 评论 -
查找算法-顺序查找法(Sequential Search)
顺序查找法又称线性查找法,是一种比较简单的查找法。它是将数据一项一项地按顺序逐个查找,所以无论数据顺序如何,都得从头到尾遍历一遍,该方法的优点是文件在查找前不需要进行任何处理与排序;缺点是查找速度比较慢。如果数据没有重复,找到数据就可以中止查找,在最差情况下是未找到数据,需要进行n次比较,在最好情况下则是一次就找到数据,只需要1次比较。原创 2023-10-25 23:26:42 · 459 阅读 · 0 评论 -
查找算法-二分查找法(Binary Search)
如果要查找的数据已经事先排好序了,就可以使用二分查找法来进行查找。二分查找法是将数据分割成两等份,再比较键值与中间值的大小。如果键值小于中间值,就可以确定要查找的数据在前半部分,否则在后半部分,如此分割数次直到找到或确定不存在为止。原创 2023-10-25 23:36:54 · 136 阅读 · 0 评论 -
排序算法-堆积树排序法(HeapSort)
堆积树排序法是选择排序法的改进版,可以减少在选择排序法中的比较次数,进而减少排序时间。堆积排序法用到了二叉树的技巧,是利用堆积树来完成排序的。堆积树是一种特殊的二叉树,可分为最大堆积树和最小堆积树两种。原创 2023-10-25 23:16:24 · 774 阅读 · 0 评论 -
排序算法-基数排序法(RadixSort)
基数排序法与我们之前讨论的排序法不太一样,并不需要进行元素之间的比较操作,而是属于一种分配模式排序方式。基数排序法比较的方向可分为最高位优先(Most Significant Digit First,MSD)和最低位优先(Least Significant Digit First,LSD)两种。MSD是从最左边的位数开始比较的,而LSD则是从最右边的位数开始比较的。原创 2023-10-16 00:35:46 · 726 阅读 · 1 评论 -
排序算法-合并排序法(MergeSort)
合并排序法(MergeSort)是针对已排序好的两个或两个以上的数列(或数据文件),通过合并的方式将其组合成一个大的且已排好序的数列(或数据文件)原创 2023-10-15 18:00:37 · 2181 阅读 · 0 评论 -
排序算法-快速排序法(QuickSort)
快速排序法是由C.A.R.Hoare提出来的。快速排序法又称分割交换排序法,是目前公认的最佳排序法,也是使用分而治之(Divide and Conquer)的方式,会先在数据中找到一个虚拟的中间值,并按此中间值将所有打算排序的数据分为两部分。其中小于中间值的数据放在左边,而大于中间值的数据放在右边,再以同样的方式分别处理左右两边的数据,直到排序完为止。操作与分割步骤如下:假设有n项记录,其键值为。原创 2023-10-12 06:33:57 · 1025 阅读 · 0 评论 -
排序算法-希尔排序法(ShellSort)
我们知道当原始记录的键值大部分已排好序的情况下插入排序法非常有效,因为它不需要执行太多的数据搬移操作。希尔排序法是D.L.Shell在1959年7月发明的一种排序法,可以减少插入排序法中数据搬移的次数,以加速排序的进行。排序的原则是将数据区分成特定间隔的几个小区块,以插入排序法排完区块内的数据后再渐渐减少区间的距离。原创 2023-10-12 04:21:59 · 933 阅读 · 0 评论 -
排序算法-插入排序法(InsertSort)
插入排序法是将数组中的元素逐一与已排序好的数据进行比较,先将前两个元素排序好,再将第三个元素插入适当的位置,也就是说这三个元素仍然是已排序好的,接着将第四个元素加入,重复此步骤,直到排序完成为止。可以看作是在一串有序的记录R1,R2,...,Ri中插入新纪录R,使得i+1个记录排序妥当。原创 2023-10-12 03:40:48 · 1495 阅读 · 0 评论 -
排序算法-选择排序法(SelectionSort)
选择排序法也是枚举法的应用,就是反复从未排序的数列中取出最小的元素,加入另一个数列中,最后的结果即为已排序的数列。选择排序法可使用两种方式排序,即在所有的数据中,若从小到大排序,则将最大值放入第一个位置;若从小到大排序,则将最大值放入最后一个位置。例如,一开始在所有的数据中挑选一个最小项放在第一个位置(假设是从小到大排序),再从第二项开始挑选一个最小项放在第2个位置,以此重复,直到完成排序位置。原创 2023-10-12 02:55:48 · 811 阅读 · 0 评论 -
排序算法-冒泡排序法(BubbleSort)
冒泡排序法又称为交换排序法,是从观察水中的气泡变化构思而成的,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较,就仿佛气泡从水底逐渐冒升到水面上一样。如此扫描过一次之后就可以确保最后一个元素位于正确的顺序。接着逐步进行第二次扫描,直到完成所有元素的排序为止。原创 2023-10-12 02:23:41 · 981 阅读 · 1 评论 -
常见算法-双骰子游戏(Craps)
一个简单的双骰子游戏,游戏规则如下:玩家掷两个骰子,点数为1到6,如果第一次点数和为7或11,则玩家胜,如果点数和为2、3或12,则玩家输,如果和为其它点数,则记录第一次的点数和,然后继续掷骰,直至点数和等于第一次掷出的点数和,则玩家胜,如果在这之前掷出了点数和为7,则玩家输。规则看来有些复杂,但是其实只要使用switch配合if条件判断来撰写即可,小心不要弄错胜负顺序即可。原创 2023-10-09 05:45:58 · 1341 阅读 · 0 评论 -
常见算法-洗扑克牌(乱数排列)
洗扑克牌的原理其实与乱数排列是相同的,都是将一组数字(例如1∼N)打乱重新排列,只不过洗扑克牌多了一个花色判断的动作而已。初学者通常会直接想到,随机产生1∼N的乱数并将之存入阵列中,后来产生的乱数存入阵列前必须先检查阵列中是否已有重複的数字,如果有这个数就不存入,再重新产生下一个数,运气不好的话,重複的次数就会很多,程式的执行速度就很慢了,这不是一个好方法。原创 2023-10-09 05:12:36 · 343 阅读 · 0 评论 -
常见算法-三色棋(Gossip)
三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而多数的作者则使用Three-Color Flag来称之。假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子。原创 2023-10-09 04:08:02 · 241 阅读 · 0 评论 -
常见算法-巴斯卡三角形(Pascal)
巴斯卡(Pascal)三角形基本上就是在解 nCr,因为三角形上的每一个数字各对应一个nCr,其中 n 为 row,而 r 为 column,如下:0C01C0 1C1对应的数据如下图所示:11 1巴斯卡三角形中的 nCr 可以使用以下这个公式来计算,以避免阶乘运算时的数值溢位:nC0 = 1。原创 2023-10-09 02:31:42 · 354 阅读 · 0 评论 -
常见算法-费式数列(Fibonacci)
Fibonacci为1200年代的欧洲数学家,在他的着作中曾经提到:「若有一隻免子每个月生一隻小免子,一个月后小免子也开始生产。起初只有一隻免 子,一个月后就有两隻免子,二个月后有三隻免子,三个月后有五隻免子(小免子投入生产)……」。如果不太理解这个例子的话,举个图就知道了,注意新生的小免子需一个月成长期才会投入生产,类似的道理也可以用于植物的生长,这就是Fibonacci数 列,一般习惯称之为费氏数列,例如以下: 1、1 、2、3、5、8、13、21、34、55、89……原创 2023-10-09 01:40:54 · 381 阅读 · 2 评论