算法
rens111
这个作者很懒,什么都没留下…
展开
-
随机函数生成器(rand5()与rand7()的转化)
一、C语言中随机函数rand() 和 srand()1) rand函数和srand函数介绍随机函数rand() 会随机生成一个位于0-RAND_MAX之间的整数;#include <stdio.h>#include <stdlib.h>int main(){ for (int i = 0; i < 10; i++) printf("%d ", rand()); printf("\n"); return 0;}使用rand()函数的缺点是, 对于同原创 2020-07-03 15:30:35 · 906 阅读 · 0 评论 -
回溯算法(收费公路重建问题)
一、问题描述给出一个距离的集合D, 求出在x轴,存在哪些点能够组合成这样的距离集合;假设第一个点在0处:path[1] = 0;最后一个点是距离集合中最大的距离:path[N] = max(D);使用堆或是红黑树存放距离集合D;二、具体的代码如下#include <iostream>#include <vector>#include <set>using namespace std;bool place(vector<int>&原创 2020-07-02 15:13:31 · 692 阅读 · 0 评论 -
回溯算法(井字游戏)
一、问题描述三连棋双方都是智力卓越的话,很容易完成平局;在人机对战情况下, 计算机的策略是保证自己不输,并等待玩家失误的机会,当玩家失误时候, 计算机抓住这个失误并取得胜利;** 极大极小策略**使用一个求值函数来对一个位置的好坏量化;能使得计算机获胜的位置,其值+1; 平局为0; 计算机输的-1;通过考察盘面能够确定这局棋输赢的位置叫做终端位置(终端位置:有时候只下到一半,计算机发现玩家失误了,计算机一定能赢了,不用等到完全落完棋子);终端位置是使用immediateHumanWin函数或是imm原创 2020-07-01 17:26:36 · 907 阅读 · 0 评论 -
回溯算法(八皇后问题)
一、回溯法介绍回溯算法相当于穷举搜索的巧妙实现,穷举算法是每一种可能都去尝试, 回溯法会在尝试的过程中做出判断,当发现一些不符合标准的组合方案,直接跳过不去尝试。因此, 回溯算法能节省时间代价;回溯算法实质上还是暴力算法,但是回溯算法并不直接尝试所有的可能,会删除不可能的方案;在一步内删除一大组可能性的做法叫做裁剪;在尝试解决问题时候, 每进行一步, 都是抱着试试看的态度;如果发现当前选择并不是最好的,或者这样继续下去可定达不到目标时候, 就放弃本次操作,返回上一层操作,重新做选择;(走不通就回退原创 2020-07-01 00:46:04 · 387 阅读 · 0 评论 -
分治算法的运行时间
分治算法的递推公式与时间复杂度的关系根据分治算法的递推公式,可以得出分治算法的时间复杂度;并且, 对分治算法递推公式的优化, 可以使得时间复杂度得以优化;原创 2020-06-30 19:03:11 · 346 阅读 · 0 评论 -
连续子数组的最大和
一、问题描述给定一个数组, 找出数组的一个连续子数组, 这个子数组的和最大;遍历数组,将数组的值加入到sum中, 如果sum大于0, 继续遍历下一个数据, 如果sum小于等于0,说明前面的子数组是无用的,丢弃前面的数组,从下一个数组开始继续遍历;二、连续子数组的最大和代码实现#include <stdio.h>#include <stdlib.h>int FindBiggestSum(int* arr, int len) { int curSum = 0; int原创 2020-06-30 18:02:41 · 143 阅读 · 0 评论 -
数组中出现次数超过一半的数字
一、问题描述给出一个数组, 数组中存在一个数据,其出现次数超过一半的的数组长度,求出这个数据;可以使用快速排序方法, 然后中位数就是要求的数据,其时间复杂度是O(nlogn);二、基于partition的算法1) 在数组中随机寻找一个数据pivot,然后调整数组使得pivot 左边的数据都小于pivot, pivot右边的数据都大于pivot, 返回数据pivot的下标索引index;如果index == mid,即找到了问题的解;如果index > mid, 在左边集合中继续寻找inde原创 2020-06-30 16:13:26 · 112 阅读 · 0 评论 -
最近点问题(分治算法)
一、问题描述对于平面上的一些点对:p1, p2, …,pn, 找出两个点,使得这两个点之间的距离最小;解题思路:首先对所有的点按照x坐标排序, 然后按x坐标在pivot处将点集二分为坐标点集S1和右边点集S2;先递归求得左边点集的最小距离min_left, 然后递归求得右边点集的最小距离min_right; 比较左右点集的最小距离min = min(min_left, min_right);此外, 靠近pivot左右min的区域(pivot-min, pivot+min)的区域,存在点对距离小于原创 2020-06-30 14:59:31 · 809 阅读 · 0 评论 -
快速选择问题(top k问题)
一、问题描述找到一个数组中第k大的数据;使用分治法,参考快速排序的思想, 找原数组中找到一个枢纽元pivot, 将数组分为S1, pivot, S2; S1中的数据都是小于pivot, S2中的数据都是大于pivot;如果pivot 就是第k个数组,直接返回;如果S1中数据多于k, 第k个数据存在于S1, 递归调用S1;如果k存在于S2, 第(k-pivot-S1)个数据就是解, 递归调用S2;二、代码快速选择问题的具体代码如下;该算法时间复杂度是O(n), 因为每一次分治实际上只有一次递归原创 2020-06-30 13:36:05 · 331 阅读 · 0 评论 -
近似装箱问题
一、问题描述设给定N项物品, 大小为s1, s2, s3, …, sn, 每个物品的都不超过1; 现有大小为1的箱子若干个, 将物品装入箱子中, 尽量使用少的箱子装满所有物品;实例:现有一列物品:0.2, 0.5, 0.4, 0.7, 0.1, 0.3, 0.8;其中一种装箱方案如下所示:装箱问题是一个NP完全问题, NP完全问题的最优解的时间复杂度不能是一个二项式的(通常NP问题的时间复杂度是指数型的);因此, 当获知这是一个NP完全问题, 就要考虑不纠结于求解其最优解,通常求解器近似解,并且近原创 2020-06-29 21:09:49 · 1850 阅读 · 1 评论 -
算法导论_17.1-17.3平摊分析
平摊分析:执行一系列数据结构操作所需要的时间是通过对执行的所有单个操作求平均得出的;即单个操作所需的时间 = 所有操作消耗的时间/操作次数;即便单个操作的代价很大, 但是平均代价很小;平摊分析与平均情况分析的不同之处是平摊分析不涉及概率, 即使在最坏的情况下, 每个操作都具有平均性能;举例说明平摊分析与平均情况分析的区别:例如有三个操作,耗时是1, 2, 3; 三个操作被执行的频率是0.5, 0.2, 0.3;平摊分析不考虑频率:(1+2+3)/3 = 2;平均情况分析:1×0.5 + 2×0.原创 2020-06-28 13:06:33 · 2029 阅读 · 1 评论 -
算法导论_16.5一个任务调度问题
一、任务调度问题描述单个处理器对若干个单位时间任务进行最优调度, 其中每个任务都有一个截止期限和超时惩罚。单个处理器上具有期限和惩罚的单位时间任务调度的输入如下,有三个数组:1) 包含有n个单位时间任务的集合S = {a1, a2, a3, …, an};2) n个整数值的期限d1, d2, …, dn, 即任务ai要求在di之前完成;3) n个非负的权值(惩罚代价)w1, w2, w3,…, wn;如果ai在di之前没有被调度,就会有惩罚wi;目标:找出一个S的调度,使得总的惩罚最小;考虑一原创 2020-06-27 22:54:43 · 2527 阅读 · 0 评论 -
算法导论_16.4 贪心法的理论基础(拟阵)
一、贪心算法的理论基础贪心算法的理论,在确定何时能够产生最优解的时候非常有用,其实用到一种叫做拟阵的组合结构。1) 拟阵:一个拟阵是满足下列条件的一个序对M= (S,e);1)S 是一个有穷非空集合;2) e是S的一个非空子集族,称为S的独立子集;具有遗传性质, 如果A是B的子集, 并且B是e的一个成员,则A是e的一个成员;3) 拟阵具有交换性:如果A是e的成员, B是e的成员, |A|<|B|, 则有某个元素x 是(B-A), 使得A+{x} 是e的成员;拟阵的一个实例,图的拟阵MG原创 2020-06-27 17:15:31 · 1534 阅读 · 0 评论 -
算法_哈夫曼编码
一、 什么是哈夫曼编码计算机中使用二进制编码字符;哈夫曼编码是通过构造哈夫曼树得到的, 哈夫曼树是通过贪心算法得到的;贪心算法构造哈夫曼树:将字符出现的次数作为哈夫曼树的权值,按照贪心算法,选择权值最小的两个结点,成为一个数的左右结点;左右子结点的权值变为子树根的权值;然后在余下的结点中递归选用最小的两个结点;根据哈夫曼树得到哈夫曼编码:从根开始, 遇到左分支编码为0, 遇到右分支编码为1;对于同一个编码, 哈夫曼编码不唯一,但是都能正常工作;哈夫曼编码是一种变长编码,权值越大的字符,其编原创 2020-06-27 14:47:08 · 2689 阅读 · 0 评论 -
算法导论_15.2矩阵链乘法
一、问题描述对于矩阵A(2, 3) 和矩阵A(3, 4)相乘,总共需要做2×3×4 = 24次乘法;因此对于三个矩阵A1,A2,A3做乘法, 不同的乘法次序会得到不同次数的乘法运算;例如, 三个矩阵维数是:10×100, 100×5, 5×50((A1, A2), A3): 需要的乘法次数是:(10×100×5)+(10×5×50) = 7500次乘法运算;(A1, (A2, A3)):需要的乘法次数是:(10 ×100×50) + (100×5×50) = 75000次乘法运算;从上面可知,原创 2020-06-25 17:11:38 · 1327 阅读 · 0 评论 -
算法导论_15.1装配线调度
一、装配线调度问题描述总共有n个装配站;底盘进入到装配线1和装配线2的时间记录在二元数组e[2]上;底盘在装配线1和装配线2上每个站的时间记录在数组a1[n] 和a2[n]上;底盘在每个站上换装配线的时间记录在t1[n-1], t2[n-2]上;(在最后一个站时候, 不需要换装配线了,所以数组只有n-1个数据)底盘离开装配线的时间存放在二元数组x[2]上面;求得的最优解记录在数组f1[n] 和f2[n]上;每次做出的选择记录在数组l1[n-1], l2[n-1]上;(在最后一个站的时候, 不需原创 2020-06-25 14:00:58 · 1130 阅读 · 0 评论 -
算法导论_16.2贪心策略的基本内容
一、 贪心算法的步骤使用贪心算法的步骤:1) 找出问题的最优子结构;(简化动态规划的最优子结构可以得到贪心算法的最优子结构)2) 设计一个递归解;3) 证明在递归的任一阶段,最优选择之一总是贪心选择。这样,做出的贪心选择才是安全的;4) 证明通过贪心选择,只有一个子问题存在,其他子问题都是空;5) 设计出一个实现贪心算法的递归实现;6)将递归算法转换成迭代算法;动态规划是贪心算法的基础;活动选择中,可以直接做出贪心选择构造子结构:1) 先后定义子问题S(i, j),2)做出贪心选择am原创 2020-05-28 16:33:59 · 628 阅读 · 0 评论 -
算法_0-1背包问题理解
一、 0-1背包问题给定n种物品:物品i的重量是w[i], 物品的价值是v[i];给定一个背包, 背包最大能装重量为capacity的物品;(物品不可分割)输入数据:n = 5;w[n] = { 0, 2, 2, 6, 5, 4}; //0是占位,可忽略v[i] = {0, 6, 3, 5, 4, 6};动态规划与贪心算法的区别:动态规划时候,做选择时候要考虑子问题的最优解;贪心算法时候, 只要做出相对于当前局部的最优解就可以, 不考虑子问题的解;问题分析:找出子问题空间和子问题的选择;原创 2020-05-28 16:25:30 · 929 阅读 · 0 评论 -
算法导论_16.1 活动选择(贪心算法)
贪心算法:最优化问题的算法往往都包含一系列的步骤,每个步骤都要做出最优化的选择(相对全局来说也是最优的);贪心算法所做的选择看起来是当前最佳的,(相对于局部来讲是最佳的, 相对于全局来讲并不是最佳的),贪心算法希望通过局部的最优解得到一个全局最优解;注意:贪心算法有时候你能够产生全局最优解,有时候并不能产生全局最优解;一种称为拟阵的组合结构, 对于这种结构, 贪心算法总是能够给出最优解;一、活动选择问题n个活动, S = {a1, a2, …, an};每个活动有,开始时间: s1, s2,原创 2020-05-27 21:26:29 · 2832 阅读 · 0 评论 -
算法导论_15.4最长公共子序列
一、 问题已知有字符串str1 = “ABCBDAB”; 字符串str2 = “BDCABA”; 求字符串str1 和字符串str2的最长公共子序列。 上述两个字符串的最长公共子序列是BCBA;将问题转化为一般问题:字符串1:str[0], str[1], str[2], …,str[m-2], str[m-1];字符串2:str[0], str[1], str[2], …, str[n-2], str[n-1];从后面开始比较两个字符串:1) 如果str[m-1] == str[n-1];原创 2020-05-27 18:20:46 · 564 阅读 · 0 评论 -
算法导论_15.5 最优二叉查找树
一、问题将英文翻译成法语,使用平衡二叉树建立英语-法语单词的键值对,便于搜索;文章中单词出现次数有频率,有些单词出现频繁, 有些单词出现概率很小;应当将频繁出现的单词放在距离根较近的地方;此外,注意到有部分英语单词没有对应的法语翻译访问一个结点的代价是:结点的深度+1;我们已知英语文章中各类单词出现的频率,试图构造一棵最优二叉查找树,使得翻译文章的速度最快(访问的结点数最小);翻译整篇英语文章,搜索单词的代价是:我们已知pi, qi; 对于不同的depth(ki) 和depth(di), 求原创 2020-05-27 14:48:40 · 1512 阅读 · 0 评论 -
算法导论_15.3 动态规划基础
15.3 动态规划基础什么样的最优化问题适合采用动态规划方法求解:这个最优化问题应该具有以下两个要素,适合使用动态规划求解:1) 最优子结构。具有最优子结构的性质,是采用动态规划求解的前提;2) 重叠子问题。 不具有重叠子问题性质,那么这个最优化问题可以使用自顶向下的递归方法求解; 具有重叠子问题性质, 采用自顶向下的递归求解,会重复计算相同的子问题,这时候应该选用自底向上的动态规划求解;一、最优化结构动态规划的第一步:描述最优解的结构定义:一个问题的最优解中包含了子问题的最优解,则该问题具有原创 2020-05-26 09:11:45 · 1938 阅读 · 0 评论