基础算法
0110_
这个作者很懒,什么都没留下…
展开
-
分治-最大子数组
问题引入:原创 2019-11-09 09:20:50 · 129 阅读 · 0 评论 -
动态规划-钢条切割
问题描述:给定一段长度为n的钢条和一个价格表Pi(i=1, 2, ……n),求钢条切割方案,使得销售收益r最大。注意,如果长度为n英寸的钢条的价格Pn足够大,最优解可能完全不需要切割。问题分析:根据问题描述可以得知,每段钢条的最大收益来自两种情况,切割和不切割。长度12345678910价格1589101717202430...原创 2019-10-13 13:58:26 · 380 阅读 · 0 评论 -
排序算法-选择排序
选择排序:选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。算法步骤:遍历整个序列,找出最小者将最小者与序列首元素交换剩余序列...原创 2019-09-28 20:35:11 · 103 阅读 · 0 评论 -
排序算法-希尔排序
简介:希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。算法思想:倘若待排序列基本有序以及序列个数较少,则可以减少插入排序的比较次数,从而从整体上提高排序的效率。希尔排序就是基于这两点(待排序列元...原创 2019-09-29 17:04:25 · 128 阅读 · 0 评论 -
最小生成树-prim
最小生成树首先明白两个概念,什么是生成树以及最小生成树?相关概念引入:连通:如果顶点v和v’之间由路径,则称v和v’是连通的连通图:如果图中任意两个顶点都是连通的,则称其为连通图连通子图:子图中的顶点为原图的子集,且子图是连通的生成树: 一个极小连通子图,它包含图中所有顶点,但是仅包含n-1条边(n为顶点个数)最小生成树: 在生成树的基础上,其各边权值之和最小如何构建生成树?...原创 2019-10-03 16:24:12 · 165 阅读 · 0 评论 -
最小生成树-kruskal
kruskal原创 2019-10-03 16:24:25 · 266 阅读 · 0 评论 -
拓扑排序-AOV网
简介:对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排...原创 2019-10-03 16:24:40 · 345 阅读 · 0 评论 -
最短路径-Floyd
简介:Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。算法步骤:代码示例:#include<iostream>#include<algorithm>using namespace std;...原创 2019-10-04 11:18:15 · 96 阅读 · 0 评论 -
动态规划-斐波那契数列
简介斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……数学方式表示如下:对于问题的求解代码想必大家早已耳熟能详,但这里只是借助斐波那契数列作为学习动态规划的例子。通过例子了解动态规划的一些...原创 2019-10-04 14:58:29 · 13453 阅读 · 3 评论 -
字符串匹配(蛮力)
串匹配对基于同一字符表的任何文本串T(|T| = n)和模式串P(|P| = m);判定T中是否存在某一子串与P相同若存在,则返回子串P在T中的起始位置。版本A:int match_A(string T, string P){ int i = 0, j = 0; int n = T.length(), m = P.length(); while(i < n &&...原创 2019-10-05 19:03:43 · 1098 阅读 · 0 评论 -
贪心-任务调度问题
问题描述:假设给定n个任务的集合T,每个任务i有启动时间si和完成时间fi(si<fi)。任务i必须在si时刻启动,并在fi时刻结束。每个任务都必须在一台机器上执行,每台机器同时只能执行一个任务。如果两个任务i和j的实行时间不重叠,即fi<= sj或fi<=si,则称这两个任务不冲突。显然,只有两个任务不冲突时才可以安排它们在同一台机器上执行。如何安排T中所有任务在不冲突的条...原创 2019-10-07 20:30:05 · 2271 阅读 · 0 评论 -
图-广度优先搜索
简介:广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。算法思想:首先访问起始顶点S,在一次...原创 2019-09-28 20:03:36 · 117 阅读 · 0 评论 -
贪心-哈夫曼编码
哈夫曼编码:所谓编码就是对于任意给定的文本,通过查阅编码表逐一将其中的字符转译为二进制编码,这些编码依次串接起来即得到了全文的编码。编码方案确定后,尽管编码结果必然确定,但解码过程和结果却不见得唯一。例如,字符a的编码为01,b的编码为011,c的编码为11,d的编码为101。当给定一串字符011101,结果可以编译为aca,也可以编译为bd。从而导致歧义。分析不难发现,出现歧义的原因是a的编...原创 2019-09-28 11:13:55 · 828 阅读 · 0 评论 -
贪心-最短路径问题
Dijkstra简介:用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。问题简介:...原创 2019-09-22 18:58:15 · 765 阅读 · 0 评论 -
排序算法-冒泡排序
简介:通过不断迭代,逐渐将较小数值前移。代码:#include<bits/stdc++.h>using namespace std;void sort_bubble(int *n, int len){ for(int i = 0; i < len; i++){ cout << "第 " << i+1 << " 次排序: ...原创 2019-09-07 14:58:36 · 78 阅读 · 0 评论 -
排序算法-计数排序
简介:算法步骤:通过桶排序获得数组分布情况。辅助数组记录对应下标前数值的分布情况(计数)通过辅助数组的计数作为下标打印输出详解:通过分布情况,可以构建辅助数组,用来记录对应下标前待排序内容出现的次数。1235举个例子:如上所述,对应下标2之前有两个待排序数组,算上自己就有了3个待排数字。则如果打印数组,则下标2则需要在输出数组的第三个位置打印。该算法的关键...原创 2019-09-07 15:43:27 · 119 阅读 · 0 评论 -
排序算法-归并排序
简介:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。算法步骤:因为单个数值是有序的,因此我们先将数组划分为单个数值得到单个数值后,进行比对,从而合并成一个...原创 2019-09-08 19:58:19 · 133 阅读 · 0 评论 -
排序算法-快速排序
简介:快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快排同冒泡都属于交换排序。不同的是,冒泡排序一次只能消除一个逆序对,而快排一次可以消除多个。图解:解法A:思路...原创 2019-09-11 21:33:54 · 140 阅读 · 0 评论 -
贪心-最优装载问题
问题描述:在北美洲东南部,有一片神秘的海域,那里碧海蓝天、阳光明媚,这正是传说中海盗最活跃的加勒比海(Caribbean Sea)。17世纪时,这里更是欧洲大陆的商旅舰队到达美洲的必经之地,所以当时的海盗活动非常猖獗,海盗不仅攻击过往商人,甚至攻击英国皇家舰……有一天,海盗们截获了一艘装满各种各样古董的货船,每一件古董都价值连城,一旦打碎就失去了它的价值。虽然海盗船足够大,但载重量为c,每件古...原创 2019-09-15 17:07:19 · 432 阅读 · 0 评论 -
关于快速排序的问题分析
问题1:递归基分析问题描述:void quick_sort(int *n, int lo, int hi){ if(lo >= hi) return; int mi = partition(n, lo, hi); quick_sort(n, lo, mi); quick_sort(n, mi + 1, hi); }如上述代码所示,如将lo >= hi 改为lo ...原创 2019-09-15 20:42:22 · 568 阅读 · 0 评论 -
贪心-背包问题
问题描述:有一天,阿里巴巴赶着一头毛驴上山砍柴。砍好柴准备下山时,远处突然出现一股烟尘,弥漫着直向上空飞扬,朝他这儿卷过来,而且越来越近。靠近以后,他才看清原来是一支马队,他们共有四十人,一个个年轻力壮、行动敏捷。一个首领模样的人背负沉重的鞍袋,从丛林中一直来到那个大石头跟前,喃喃地说道:“芝麻,开门吧!”随着那个头目的喊声,大石头前突然出现一道宽阔的门路,于是强盗们鱼贯而入。阿里巴巴待在树上观...原创 2019-09-21 14:54:36 · 261 阅读 · 0 评论 -
排序算法-直接插入
简介:插入排序(Insertion sort)是一种简单直观且稳定的排序算法。基本思想是:每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止。图示:类似玩扑克牌游戏时,按序排列纸牌。代码示例:#include<bits/stdc++.h>using namespace std;void insert_sor...原创 2019-09-21 19:16:36 · 92 阅读 · 0 评论 -
插入排序-折半插入
简介:折半插入的本质同直接插入并没有不同。只不过在查找合适位置的过程中,不再采用顺序查找的方法,而是采用折半(二分)查找。二分图示:代码示例:#include<bits/stdc++.h>using namespace std;void insert_sort(int *ars, int n){ for(int i = 1, j; i < n; i++){ ...原创 2019-09-21 19:54:24 · 346 阅读 · 0 评论 -
贪心-会议安排问题
问题描述:学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。问题分析:根据描述可知这是一道典型的贪心算法求最优解的问题。问题的求解在于选择最优贪心策略。通过分析,可以得出以下几种策略。尽量选择开始时间早的...原创 2019-09-22 14:26:05 · 979 阅读 · 0 评论 -
排序算法-桶排序
简介:如图所示,桶的位置是有序的。借助有序的桶,我们便可以把乱序内容有序放置。但是这种排序算法问题也很明显,即有序桶的个数要足够多,倘若待排序内容比较集中便会浪费大量的内存空间。复杂度分析:设待排序内容为n个,桶个数为k个。则算法复杂度为O(n+k)。代码:#include<iostream>using namespace std;#define Len ...原创 2019-08-31 10:26:15 · 114 阅读 · 0 评论