
算法设计与分析
dms2017
这个作者很懒,什么都没留下…
展开
-
排序算法优劣势总结
插入类直接插入排序思想:将数组分为有序区和无序区,有序区开始只有一个元素,从第二个元素(无序区的第一个元素)arr[i]开始,由于arr[1]-arr[i-1]已经有序,所以从后面往前判断,若大于当前值r[j],则将r[j]-r[i-1]向后挪一位,随后插入。空间复杂度:O(1)时间复杂度:O(n^2)优势:小规模输入、有序劣势:刚好反序的、大规模输入稳定性:稳定折半插入排序思想:在直接插入的基础上,在r[1]-r[i-1]中确定r[i]的插入顺序使用二分查找。空间复原创 2020-09-26 23:09:04 · 1688 阅读 · 0 评论 -
分治法求众数问题
问题描述:给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。要求对给定的又n个自然数的组成的多重集S,计算S的众数及其重数。读完问题我们发现起始求众数就是求一个数组里面出现最多的数及其出现的次数,那么我们与其从左往右依次寻找还不如直接从中间往左右寻找更轻松,假设我们先求出中位数的重数,如果发现左边的数的个数小于这个重数那么我们就不用再往左...原创 2019-03-26 21:51:37 · 17050 阅读 · 13 评论 -
归并排序以及基于ForkJoin框架实现的并行归并排序(使用RecursiveAction)
1. 首先理解归并排序的实现过程:我想大家肯定都了解过归并排序,那些文字描述包括分治法我就不复制粘贴了,我这里以图的方式给出它的原理:重要点:(1):假设a数组存储待排序数组,在合并数组时避免不了改变数组内的值,所以需要一个t数组暂时保存中间结果,举个例子:在合并数组为【5,4】时,合并的结果应该是【4,5】,先将结果保存在t里面(因为中间不是简单的交换,可能还包含多个步骤),最后...原创 2020-03-13 12:40:52 · 589 阅读 · 2 评论 -
排序算法汇总
说明:从大一的实验室纳新需要了解排序算法到现在大三,期间还学了数据结构,详细讲了排序算法,但到了现在大三一提起排序,唯一有印象的还是冒泡排序,所以想抽点时间整合一下各类排序算法,差不多有14种算法,我用了比较粗略的方法计算每种排序算法分别在大数组和小数组的情况下的运行时间,并且给出了每种排序算法的时空复杂度。代码放在最下面1:插入类排序 a:直接插入排序:public ...原创 2019-10-26 20:41:51 · 191 阅读 · 0 评论 -
prim算法
这几个概念清楚就别看了完全图:任意两个顶点间都有直达的边相连的无向图。连通图:任意两个顶点间都有路径相通的无向图。 生成树:一个连通图的生成树是指一个极小连通子图,含有图中的全部n个顶点,但只有足以构成一棵树的n-1条边。为什么是n个顶点和n-1条边呢?我们知道树的结构,一个节点可以通过一根树支访问它的父节点,所以一个节点对应一根树枝,但树的根是没有父...原创 2019-10-10 21:14:34 · 1055 阅读 · 0 评论 -
编辑距离问题(动态规划)
问题描述:设A和B是两个字符串,要用最少的字符操作将字符串A转换为字符串B,这里所说的字符操作包括(1):删除一个字符;(2):插入一个字符;(3):修改一个字符。将A转换为B所用的最少字符操作数称为A到B的编辑距离,记为d[A][B],d[][]中的A,B指的是A和B的长度,设计一个算法对任给的A,B,计算出d[A][B]。问题举例:假设A = "fxpimu", B = "xwrs",则d...原创 2019-05-16 13:03:54 · 14444 阅读 · 8 评论 -
01背包问题(动态规划)
问题描述:给定n种物品和一个背包,物品i的重量是wi,其价值为vi,背包容量是c,问应如何选择装入背包中的中的物品,使得装入物品的总价值最大?问题分析:我们用m[i][j]表示i~n的物品放入容量为j的背包里可以取得的最大价值,cw表示当前背包容量。在判断一个物品是否可以被放入时,若cw比wi小,说明wi放不下了,此时m[i][j] = m[i+1][j],若cw比wi大,那么有可放可不放两种...原创 2019-05-15 17:39:24 · 6214 阅读 · 2 评论 -
自然合并排序(详细代码注释)
由于解释都在代码里,我就直接放代码了。#include <stdio.h>int t[100] ;int a_index[100] ; //存储有序的数组段的下标int a_lenth ; //a_index[]的长度void Merge(int c[], int d[], int l, int m, int r){ /*合并两个连续的子数...原创 2019-05-07 23:05:06 · 1704 阅读 · 2 评论 -
删数问题(贪心算法)
问题描述:给定n位正整数a,去掉其中任意k<=n个数后,剩下的数按原次序重新排列成一个新的正整数。对于给定的n位正整数a和正整数k,设计一个算法使这个新的正整数达到最小。问题说明:给定一个正整数a为 785314,经过删数后得到的最小的正整数应该是 14。问题解析:这道题乍一看好象挺简单,我排个序,删4个最大值不就解决了吗?但仔细一看,好像又不太对,上面例子删4个最大值后的值是31,...原创 2019-05-07 16:57:48 · 3026 阅读 · 0 评论 -
最小m段和问题(动态规划)
问题描述:给定n个整数组成的序列,现在要求将序列分割为m段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小?问题说明:给定序列:5 4 3 2 1 n=5, m=2 可分为 5 | 4 | 3 2 1 其子序列和的最大值的最小值为1+2+3=6。问题解析:用dp[i][j]存储长度为i,分j段后其子序列和的最大值的最小值,那么它由两部分构...原创 2019-04-27 21:22:26 · 14610 阅读 · 2 评论