算法分析与设计
记笔记
ray_kong
这个作者很懒,什么都没留下…
展开
-
算法分析与设计——2.分治策略
分治法的基本思想就是:将一个规模为n的问题分解为规模为k的子问题(k<n)。子问题之间相互独立且与原问题相同,递归的求解这些子问题,然后将各个子问题的解合并得到原问题的解。简单概括就是:分——治——合分:将规模较大的问题分解为多个规模较小的子问题,子问题之间不存在公共子问题。治:求解子问题的解合:合并子问题的解从而得到原问题的解【注】采用分治法设计算法时,考虑平衡子问题的思想,最好使分解的多个子问题的规模大致相同。...原创 2021-10-13 20:00:19 · 141 阅读 · 0 评论 -
算法分析与设计——2.1二分搜索技术
问题描述:给定已排好序的n个元素a[0:n-1],在这n个元素中找出一特定元素x。例如:a[]={0,1,2,3,4,5,6},x=6,元素存在则输出。问题思索:如果采用顺序搜索方法,逐个比较数组中的元素,直到找到元素x或不在其中,最坏情况下的时间复杂度为O(n)。二分搜索技术的基本思想:将n个元素大致分为个数相等的两半,取a[n/2]与x比较,如果x大,则递归的在右半部继续搜索,如果x小,则递归的在左半部继续搜索。算法在最坏情况下的时间复杂度为O(logn)。代码如下:templat原创 2021-10-13 20:15:12 · 540 阅读 · 0 评论 -
算法分析与设计——2.1.1改写的二分搜索算法
问题描述:设a[0:n-1]是已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。代码实现:#include<iostream>using namespace std;int b[2] = { 0,0 };template <typename Type>int BinarySearch(Type a[], const Type x, int原创 2021-10-15 12:03:52 · 662 阅读 · 1 评论 -
算法分析与设计——2.2快速排序
问题描述:对一个无序的数组以从小到大的顺序进行排序。算法思想:快速排序算法的思想是 分解——递归求解——合并分解:以a[p]为基准元素将a[p:r]划分为3段a[p:q-1],a[q]和a[q+1:r],使a[p:q-1]中的元素都小于等于a[q],a[q+1:r]中的元素都大于等于a[q]。下标q在划分过程中确定。递归求解:递归调用快速排序算法分别对a[p:q-1]和a[q+1:r]这两段数据进行排序。合并:第二步完成后,不需要再执行任何计算,a[p:r]已排好序。正如第一步中所说的,原创 2021-10-13 21:06:51 · 786 阅读 · 0 评论 -
算法分析与设计——2.3线性时间选择
问题描述:给定线性序集中n个元素和一个整数k,1<=k<=n,要求找出这n个元素中第k小的元素。例如:a[]={0,2,1,3,4,5,8},k=1时,要找的元素就是最小元素a[0]=0。算法思想:利用随机划分算法。时间复杂度T(n)=O(n)。template<typename T>int Partition_new(T a[], int p, int r){ T x = a[r]; int i = p - 1; for (int j = p; j <原创 2021-10-13 21:15:20 · 211 阅读 · 0 评论 -
算法分析与设计——2.4众数问题
问题描述:给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。重数最大的元素为该集合的众数。要求使用Partition函数但不能排序。例如,S={1,2,2,2,3,5},众数是2,其重数是3。算法设计:对于给定的多重集S,计算S的众数与重数。算法思想:采用分治策略利用随机选取的划分基准使用划分算法把集合分成大于划分基准以及划分基准以及小于划分基准的三部分。进而划分为{小于划分基准}{划分基准}{大于划分基准}三个集合,并记录集合的边界下标。计算{划分基准}集合的长度.原创 2021-10-13 21:26:49 · 1762 阅读 · 0 评论 -
算法分析与设计——2.5 循环赛日程表
问题描述:设有n=个运动员要进行网球循环赛。现在要设计一个满足以下条件的比赛日程表。(1)每个选手必须要与其他n-1个选手各赛一次;(2) 每个选手一天只能赛一场;(3) 循环赛赛程是n-1天。算法设计:设计一张循环赛日程表。问题输入:输入k值。问题输出:输出n×n的赛程表。问题思路:可以采用分治递归解决,也可以采用非递归算法。A. 分治递归方案1 2 3 4 5 6 7 8 2 1 4 3 6 ..原创 2021-10-15 11:17:08 · 3687 阅读 · 0 评论 -
算法分析与设计——2.6 Strassen矩阵乘法
问题描述:给定两个大矩阵A和B,计算矩阵C=A*BStrassen算法思想:分治策略,定义7次乘法运算。具体实现:首先定义了矩阵乘法模板类//定义模板矩阵乘法类template<class T>class Strassen_Matrix_Mul{public: void ADD(T **Matrix_A, T **Matrix_B, T **Matrix_Result, int MatrixSize);//矩阵加法 void SUB(T **Matrix_A,原创 2021-10-18 11:46:08 · 349 阅读 · 0 评论 -
算法分析与设计——2.7 快速幂算法
问题描述:给定一个正整数n和一个实数a,快速计算a^n。输入:输入实数a 正整数n 。如(2,93)输出:2^93的值算法思想:分治:求a^n的问题可以划分为求a^(n/2)的子问题。并有如下几个条件。 a=0,return 0; n=0,return 1; n=2k,return (a^(n/2))^2; n=2k+1,return (a^(n/2))^2*a;代码如下template <typename T>T exp2(T a...原创 2021-10-20 19:54:37 · 189 阅读 · 0 评论 -
算法分析与设计——2.8 半数集问题
问题描述:给定一个自然数n,由自然数n开始可以依次产生半数集set(n)中的数如下: (1)n属于set(n) (2)在n的左边添加一个自然数,但该数不能超过最近添加的数的一半 (3)按此规则,直到不能添加为止 例如:set(6)={6,16,26,36,126,136}=6算法设计:对于给定的自然数n,计算set(n)中的元素个数输入:自然数n...原创 2021-10-23 13:47:16 · 2123 阅读 · 0 评论 -
算法分析与设计——2.9 棋盘覆盖
问题描述:使用四种形态的L型骨牌不加重叠的覆盖一个2^k x 2^k的棋盘。算法思想:当k>0时,可以将棋盘划分为4个小棋盘。特殊方格必定存在于这四个棋盘之一中。可以对其余三个小棋盘实施L型骨牌覆盖。之后,四个小棋盘都拥有了特殊方格。即一个大问题划分为了四个相同的小问题。依次递归即可得到每个小问题的解,从底向上可以得到大问题的解。满足分治策略。递归方程如下:分治法代码如下://分治法int num = 0;int Matrix[100][100];//存放L型骨牌号void原创 2021-10-24 21:13:52 · 226 阅读 · 0 评论 -
算法分析与设计——3 动态规划
动态规划的使用条件: (1)具有最优子结构性质 (2)具有重叠子问题性质动态规划的基本思想: 将待解问题划分成若干子问题,但是子问题不是相互独立的。若采用分治法,一个问题可能要被计算若干次。 为了避免大量的重复计算,可以用一张表来记录所有已经解决的子问题的答案,每次计算子问题前,先查表,若已经计算过,则不必计算。动态规划的基本步骤: (1)找出最优解的性质,并刻划其结构性质 (2)递归的定义最优值(自底向上递归) (3)自底向上的方式计算最优值...原创 2021-10-27 19:04:31 · 106 阅读 · 0 评论 -
算法分析与设计——3.1 最少费用购物问题
问题描述: 商店中每种商品都有标价。为了吸引顾客,商店提供了一组优惠商品价。优惠商品就是把一种或多种商品分成一组降价销售。//算法设计/* 设计算法计算出某一顾客所购商品应付的最少费用*///数据输入/*文件input中提供预购商品数据 第一行中有一个整数B(0<=B<=5),表示所购商品的种类数。 在接下来的B行中,每行有三个数C(商品编码,1<=C<=999)K(购买该种商品的数1<=K<=5) P(商品正常单价,1<=...原创 2021-10-27 19:21:42 · 3468 阅读 · 0 评论