5算法设计技术1-蛮力法和分治法_823204234

合集下载

第15章 基本的算法设计技术

第15章  基本的算法设计技术

例15.1 设计程序计算an的值。要求用蛮力法。
解:由于an = a * a * …… * a,因此,最直接最简单的想法就是 设变量result保存计算结果并初始化为1,然后将result和a相乘n次。 程序如下:
程序设计基础
15.1
蛮力法
2 #include <stdio.h> 3 4 int main( ) 5 { 6 int a, n; 7 long int result = 1; 8 printf("请输入a的值和n的值:"); 9 scanf("%d%d", &a, &n); 10 for (int i = 1; i <= n; i++) 11 result = result * a; 12 printf("%d的%d次方等于%d\n", a, n, result); 13 return 0; 14 }
程序设计基础
第 12章 预处理
本章的基本内容是:
蛮力法 穷举法 递推法
分治法
动态规划法ຫໍສະໝຸດ 贪心法程序设计基础15.1
蛮力法
算法设计技术(也称算法设计策略)是设计算法的一般性方法,本 章讨论基本的算法设计技术,更深入的内容将在“算法设计与分析 ”课程中介绍。
15.1.1 设计思想
蛮力法采用一定的策略依次处理待求解问题的所有数据,从而找出 问题的解。蛮力法是一种简单直接地解决问题的方法,常常直接基 于问题的描述,所以,蛮力法也是最容易应用的方法
程序设计基础
15.2
15.2.1 设计思想
穷举法
穷举法本质上属于蛮力法,是将所有可能的解都列举出来,依次试探这些解是否满足 特定的条件或要求。前面的程序设计实例“鸡兔同笼问题”、“ 百元买百鸡问题”等都 属于穷举法。穷举法通常需要解决以下两个关键问题: (1)分析问题的解可能存在的范围,找出穷举范围; (2)分析问题的解所满足的条件,找出约束条件并用逻辑表达式表示

分治算法-最大子数组问题

分治算法-最大子数组问题

分治算法-最⼤⼦数组问题1.蛮⼒法求解总体思路: 蛮⼒法是最简单的实现⽅法,只要列出数组所有可能的组合,然后找出其中和最⼤的组合即可; 蛮⼒法分三层循环实现: 1)第⼀层循环⽤于固定⼦数组的起始位置; 2)第⼆层循环⽤于确定⼦数组的结束位置; 3)第三层循环⽤于⼦数组和的计算,从⼦数组的头开始遍历到其尾,累加起来就是该⼦数组的和。

实现:///<summary>///暴⼒求解///</summary>///<param name="priceArray"></param>///<param name="priceFlutuationsArray"></param>public static void Violentsolution(int[] priceArray,int[] priceFlutuationsArray){int total = priceFlutuationsArray[0];//默认数组得第⼀个元素是最⼤⼦数组int StartIndex = 0;int EndIndex = 0;for (int i = 0; i < priceFlutuationsArray.Length; i++){//取得以i为⼦数组起点得所有⼦数组for (int j = i; j < priceFlutuationsArray.Length; j++){//由i j就确定了⼀个⼦数组int totalTemp = 0;//临时最⼤⼦数组得和for (int k = i; k < j + 1; k++){totalTemp += priceFlutuationsArray[k];}if (totalTemp > total){total = totalTemp;StartIndex = i;EndIndex = j;}}}Console.WriteLine("start:" + StartIndex);Console.WriteLine("End:" + EndIndex);Console.WriteLine("购买⽇期是第" + StartIndex + "天出售⽇期是第" + (EndIndex + 1) + "天");Console.WriteLine("total:" + total);}2.分治法求解总体思路: 分治法的精髓: 1)分--将问题分解为规模更⼩的⼦问题; 2)治--将这些规模更⼩的⼦问题逐个击破; 3)合--将已解决的⼦问题合并,最终得出“母”问题的解; 所以原数组的最⼤⼦数组求法: 1)分--将原数组拆分成两部分,每个部分再拆分成新的两部分......直到数组被分得只剩下⼀个元素; 2)治--每个⼩型的数组找最⼤⼦数组,只有⼀个元素的数组,解就是该元素; 3)合--将两个⼩型数组合并为⼀个数组,其中解有三种可能:左边的返回值⼤,右边的返回值⼤,中间存在⼀个更⼤的⼦数组和; 返回值应选最⼤的;实现:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace最⼤⼦数组问题{class Program{//最⼤⼦数组的结构体struct SubArray{public int startIndex;public int endIndex;public int total;}static void Main(string[] args){int[] priceArray = { 100, 113, 110, 85, 105, 102, 86, 63, 81, 101, 94, 106, 101, 79, 94, 90, 97 };int[] pf = new int[priceArray.Length - 1];//价格波动的数组for (int i = 1; i < priceArray.Length; i++){pf[i - 1] = priceArray[i] - priceArray[i - 1];}SubArray subArray = GetMaxSubArray(0, pf.Length - 1, pf);Console.WriteLine(subArray.startIndex);Console.WriteLine(subArray.endIndex);Console.WriteLine("我们在第" + subArray.startIndex + "天买⼊,在第" + (subArray.endIndex + 1) + "天卖出");Console.ReadKey();}///<summary>///这个⽅法⽤来取得array这个数组从low到high得最⼤⼦数组///</summary>///<param name="low"></param>///<param name="high"></param>///<param name="array"></param>static SubArray GetMaxSubArray(int low,int high,int[] array){if (low == high){SubArray subarray;subarray.startIndex = low;subarray.endIndex = high;subarray.total = array[low];return subarray;}int mid = (low + high)/2; //低区间[low,mid] ⾼区间[mid+1,high]SubArray subArray1= GetMaxSubArray(low, mid, array);SubArray subArray2=GetMaxSubArray(mid+1, high, array);SubArray subArray3 = GetMaxSub(low, mid, high, array);if (subArray1.total >= subArray2.total && subArray1.total >= subArray3.total){return subArray1;}else if (subArray2.total >= subArray1.total && subArray2.total >= subArray3.total){return subArray2;}else{return subArray3;}}static SubArray GetMaxSub(int low,int mid,int high,int[] array){//从【low,mid】找到最⼤⼦数组[i,mid]int total1 = array[mid];int startIndex = mid;int totalTemp = 0;for (int i = mid; i >= low; i--){totalTemp += array[i];if (totalTemp > total1){total1 = totalTemp;startIndex = i;}}//从【mid+1,high】找到最⼤⼦数组[mid+1,j]int total2 = array[mid + 1];int endIndex = mid + 1;totalTemp = 0;for (int j = mid + 1; j <= high; j++) {totalTemp += array[j];if (totalTemp > total2){total2 = totalTemp;endIndex = j;}}SubArray subArray3;subArray3.startIndex = startIndex; subArray3.endIndex = endIndex; subArray3.total = total1 + total2;return subArray3;}}}。

五大算法设计思想(转载)

五大算法设计思想(转载)

五⼤算法设计思想(转载)⼀分治法1.1 概念: 将⼀个难以直接解决的⼤问题,分割成⼀些规模较⼩的相同问题,以便各个击破,分⽽治之。

1.2 思想策略: 对于⼀个规模为n的问题,若该问题可以容易地解决(⽐如说规模n较⼩)则直接解决,否则将其分解为k个规模较⼩的⼦问题,这些⼦问题互相独⽴且与原问题形式相同,递归地解这些⼦问题,然后将各⼦问题的解合并得到原问题的解。

1.3 特征:1) 该问题的规模缩⼩到⼀定的程度就可以容易地解决2) 该问题可以分解为若⼲个规模较⼩的相同问题,即该问题具有最优⼦结构性质。

3) 利⽤该问题分解出的⼦问题的解可以合并为该问题的解;4) 该问题所分解出的各个⼦问题是相互独⽴的,即⼦问题之间不包含公共的⼦⼦问题。

1.4 对特征的解析:第⼀条特征是绝⼤多数问题都可以满⾜的,因为问题的计算复杂性⼀般是随着问题规模的增加⽽增加;第⼆条特征是应⽤分治法的前提它也是⼤多数问题可以满⾜的,此特征反映了递归思想的应⽤;第三条特征是关键,能否利⽤分治法完全取决于问题是否具有第三条特征,如果具备了第⼀条和第⼆条特征,⽽不具备第三条特征,则可以考虑⽤贪⼼法或动态规划法。

第四条特征涉及到分治法的效率,如果各⼦问题是不独⽴的则分治法要做许多不必要的⼯作,重复地解公共的⼦问题,此时虽然可⽤分治法,但⼀般⽤动态规划法较好。

1.5 基本步骤:1 分解:将原问题分解为若⼲个规模较⼩,相互独⽴,与原问题形式相同的⼦问题;2 解决:若⼦问题规模较⼩⽽容易被解决则直接解,否则递归地解各个⼦问题3 合并:将各个⼦问题的解合并为原问题的解。

1.6 适⽤分治法求解的经典问题:1)⼆分搜索2)⼤整数乘法3)Strassen矩阵乘法4)棋盘覆盖5)合并排序6)快速排序7)线性时间选择8)最接近点对问题9)循环赛⽇程表10)汉诺塔⼆动态规划2.1 概念 每次决策依赖于当前状态,⼜随即引起状态的转移。

⼀个决策序列就是在变化的状态中产⽣出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。

五大经典算法介绍

五大经典算法介绍

1分治法1.1基本概念在计算机科学中,分治法是一种很重要的算法。

字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。

问题的规模越小,越容易直接求解,解题所需的计算时间也越少。

例如,对于n个元素的排序问题,当n=1时,不需任何计算。

n=2时,只要作一次比较即可排好序。

n=3时只要作3次比较即可,…。

而当n较大时,问题就不那么容易处理了。

要想直接解决一个规模较大的问题,有时是相当困难的。

1.2基本思想及策略分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。

这种算法设计策略叫做分治法。

如果原问题可分割成k个子问题,1<k≤n,且这些子问题都可解并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。

由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。

在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。

这自然导致递归过程的产生。

分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。

1.3分治法适用的情况分治法所能解决的问题一般具有以下几个特征:1) 该问题的规模缩小到一定的程度就可以容易地解决2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。

蛮力算法

蛮力算法
维数组a[n],每个元素记录一个锁的状 态,1为被锁上,0为被打开。 2)用数学运算方便模拟开关锁的技巧,对i号锁的一次开 关锁可以转化为算术运算:a[i]=1-a[i]。 3)第一次转动的是1,2,3,„„n号牢房; 第二次转动的是2,4,6,„„号牢房; 第三次转动的是3,6,9,„„号牢房; „„ 第 i 次转动的是 i , 2i , 3i , 4i ,„„号牢房,是起点 为i,公差为i的等差数列。 4)不做其它的优化,用蛮力法通过循环模拟狱吏的开关 锁过程,最后当第i号牢房对应的数组元素a[i]为0 时,该牢房的囚犯得到大赦。
17
main1( ) { int *a,i,j,n; input(n); a=calloc(n+1,sizeof(int)); //申请存储空间 for (i=1; i<=n;i++) a[i]=1; for (i=1; i<=n;i++) for (j=i; j<=n;j=j+i) a[i]=1-a[i]; for (i=1; i<=n;i++) if (a[i]=0) print(i,”is free.”); } 算法分析1:以一次开关锁计算,算法的时间复杂度为 n(1+1/2+1/3+……+1/n)=O(nlogn)。
3
【例3.1】百钱百鸡问题。中国古代数学家张丘建在《算经》 中提出了著名的“百钱百鸡问题”:鸡翁一,值钱五;鸡母一, 值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何? 算法设计1: 通过对问题的理解,可能会想到列出两个三元一次方程, 去解这个不定解方程,就能找出问题的解。这确实是一种办法, 但这里我们要用“懒惰”的枚举策略进行算法设计: 设x,y,z分别为公鸡、母鸡、小鸡的数量。 尝试范围:由题意给定共100钱要买百鸡,若全买公鸡最多 买100/5=20只,显然x的取值范围1~20之间;同理,y的取值范 围在1~33之间,z的取值范围在1~100之间。 约束条件: x+y+z=100 且 5*x+3*y+z/3=100

实验项目1:蛮力法与分治法应用

实验项目1:蛮力法与分治法应用

实验项目1:蛮力法与分治法应用1、目的与要求:实验目的:了解蛮力法和分治法的基本思想,学会运用蛮力法和分治法解决实际系统设计应用中碰到的问题。

实验要求:用蛮力法实现选择、冒泡排序,或旅行商问题、背包问题等问题(任选其中之一)。

用分治法实现合并排序或快速排序。

要求写出算法的伪代码描述,并编写程序实现之,相关算法放在函数内实现,主程序给出测试用例,要设计足够多的相关测试用例,验证程序的正确性。

注意观察程序执行结果和运行的时间。

实验报告要求给出问题定义及算法的伪代码描述,程序设计的代码,算法的测试用例及结果,并分析算法的时间效率,回答指导书中的思考题。

2、实验内容:(2)用分治法实现快速排序、合并排序算法。

本实验主要是用分治法实现合并排序,快速排序程序等。

合并排序算法描述:MergeSort ( A[0...p-1] )// input 待排序数组A[0..n-1]// output 非降序排列的数组A[0..n-1]if ( n>1 ) {//至少有2个元素Copy A[0.. n/2-1 ] to B[0.. n/2-1 ];Copy A[n/2..n-1 ] to C[0.. n/2-1 ];MergeSort ( B[0.. n/2-1 ] );MergeSort (C[0.. n/2-1 ]t);Merge (B, C, A); //复制回数组a快速排序算法描述:QuickSort ( A[1.. r ] ){if (l<r) s=Partition( A[l,r] ); // s 是分裂位置QuickSort ( A[l..s-1] ); //对左半段排序QuickSort ( A[s+1,r); //对右半段排序}Partition ( A[l..r] ){p=A[[l] ;i = l; j = r + 1;repeatedrepeated i=i+1; until A[i]> p // 将>= x的元素交换到左边区域repeated i=i+1; until A[i]> p // <= x的元素交换到右边区域Swap( A[i], A[j] )Until i>jSwap( A[i] = a[j] );Swap( A[l], A[j] )return j;要求先给出算法的伪代码,然后用C++或其他程序设计语言编写程序实现之,并设计相关的测试用例,验证程序的正确性。

《算法设计与分析基础》课件-3.蛮力法

《算法设计与分析基础》课件-3.蛮力法

if A[j] < A[min] min j
swap A[i] and A[min]
7
2017/12/31
例题:对序列 {89,45,68,90,29,34,17}用选择排序 算法进行排序
• 第1遍: {89,45,68,90,29,34,17} //求最小元素 {17,45,68,90,29,34,89} //交换
• 第5遍: {17,29,34,45,90,68,89} {17,29,34,45,68,90,89}
• 第6遍: {17,29,34,45,68,90,89} {17,29,34,45,68,89,90} //排序结束
8
CHD
(本动画中,参与排序的是R[1]到R[n],R[0]作为交换中转的空 间;变量j对应前面算法中的变量min)
2017/12/31
ALGORITHM BubbleSort(A[0,…,n – 1]) // 冒泡排序算法在数组上的应用 // 输入:数组A,数组中的元素属于某偏序集 // 输出:按升序排列的数组A for i 0 to n – 2 do
for j 0 to n – 2 – i do if A[j+1] < A[j] swap(A[j], A[j+1])
CHD
(4)对解决一些小规模的问题实例仍然有效
(5)可作为衡量其他算法的参照。
2
2017/12/31
Brute Force Examples:
1. Computing an (a > 0, n a nonnegative integer)
2. Computing n!
3. Multiplying two matrices

最新《算法设计与分析》蛮力法

最新《算法设计与分析》蛮力法
x2+y2+z2≤10, 从而1≤x≤3,0≤y≤3,0≤z≤3。所求三位数必在 以下数中:
100,101,102,103,110,111,112, 120,121,122,130,200,201,202, 211,212,220,221,300,301,310。 不难验证只有100,101两个数符合要求。
算法设计1: 1)一维数组a[n]记录n个锁的状态
1:被锁上 0:被打开
2)对i号锁的一次开关锁可以转化为算术运算: a[i]=1-a[i]。
3)第一次转动的是1,2,3,……,n号牢房; 第二次转动的是2,4,6,……号牢房; 第i次转动的是i,2i,3i,4i,……号牢 房,是起点为i,公差为i的等差数列。
《算法设计与分析》蛮力法
蛮力法 Brute Force
• 蛮力法不是一个最好的算法(巧妙和高效的算法 很少出自蛮力),但当我们想不出更好的办法时, 它也是一种有效的解决问题的方法。
• 它可能是惟一一种几乎什么问题都能解决的一般 性方法,常用于一些非常基本、但又十分重要的 算法,比如计算n个数字的和,求一个列表的最 大元素等等。
约束条件: x+y+z=100 且 5*x+3*y+z/3=100
算法1如下: main( ) 枚举尝试20*34*100=68000次 { int x,y,z; for(x=1;x<=20;x=x+1) for(y=1;y<=34;y=y+1)
for(z=1;z<=100;z=z+1) if(100==x+y+z&&100==5*x+3*y+z/3) {print("the cock number is",x); print("the hen number is", y);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3
4
5
6
先序遍历 V-L-R 中序遍历 L-V-R
7 8 9 10 11
后序遍历 L-R-V
数据结构 (30230594)
14
吴及 电子工程系
分治算法的效率估计
设对于规模为n的问题,算法的时间复杂度为T(n) 采用分治法求解,设每次可以将一个实例分解成为若干个规模为
n/b的实例,其中a个实例需要求解 为简单起见,假设n=bk,则有:
持续这样处理,直至残差满足 f (c) <ε
数据结构
27
(30230594)
x1 x* x2 b
2 1
吴及 电子工程系
小球重量
如果有n个外表完全一样的小球,其中有一个小球比其它小球轻, 如何有一架天平把这个小球找出来?
采用减治法
把小球分为两堆,每堆有n/2个小球,n为奇数则多一小球
用天平比较两堆小球的重量,如果相等,多余的小球为所求
否则取较轻的一堆,继续分解
时间复杂度:T(n) = T(n/2)+ 1, 则T(n) = log2n
有无更好的方法?
数据结构 (30230594)
28
吴及 电子工程系
减治法
减一个常量: 选择排序 建一个常因子:折半查找,二分法求解非线性方程 减可变规模: 辗转相除法
数据结构 (30230594)
29
吴及 电子工程系
变治法
基本思想
是把一个求解困难的问题转换成为一个有已知解法的问题,并 且这种转换的复杂度不超过求解目标问题的算法复杂度
顺序查找
64
88
0,1,0 3,4,3 6,7,6 9,10,9
13 37
75
92
1,1,1 4,4,4 7,7,7 10,10,10
24
吴及 电子工程系
选择排序
ASORT I NGEXAMP L E 1 ASORT I NGEXAMP L E 2 AAORT I NGEXSMP L E 3 A A ER T I NGOX SMP L E 4 A A E E T I NGOX SMP L R 5 AAEEG I NTOXSMP L R 6 AAEEG I NTOXSMP L R 7 AAEEG I L TOXSMPNR 8 A A E EG I L MOX S T P NR 9 A A E EG I LMNX S T POR 10 A A E E G I L M N O S T P X R 11 A A E E G I L M N O P T S X R 12 A A E E G I L M N O P R S X T 13 A A E E G I L M N O P R S X T 14 A A E E G I L M N O P R S T X
A A E EG I LMNOPRS T X
数据结构 (30230594)
25
吴及 电子工程系
辗转相除法
求两个整数m 和n 的最大公因子
欧几里得算法,也称辗转相除法
1. 用n 去除m,将余数赋给r; 2. 将n 的值赋给m,将r 的值赋给n, 3. 如果n=0;返回m 的值作为结果,过程结束;否则,返回第一步;
e d ge
e d ge
e d ge
e d ge
e d ge
最坏时间复杂度:O(m*n),与KMP算法比较
数据结构
6
(30230594)
吴及 电子工程系
最大公因子
蛮力法求两个整数m和n的最大公因子
比较两个整数m和n的大小,不失一般性,设有m<n成立 则从2到m,逐个判断每个整数是否可以同时整除m和n,可以得到m和n的
的正确性和效率
数据结构 (30230594)
10
吴及 电子工程系
内容提要
算法设计技术
蛮力法 分治法 贪心算法 动态规划 搜索算法
数据结构
11
(30230594)
吴及 电子工程系
分治法
基本思想
把问题的一个实例分解成为属于同一问题的若干个较小规模的实例 重复这个过程直到规模较小的实例很容易求解, 求解这些规模较小的实例, 合并较小问题的解,以得到原始问题的解。
蛮力法
不采用任何技巧,基于问题的描述直接地解决问题的方法 思路直接,不考虑代价 蛮力法举例
蛮力字符串匹配 求两个整数的最大公因子 查找元素 百元买百鸡问题
数据结构 (30230594)
5
吴及 电子工程系
蛮力字符串匹配
Kn o w l e d ge i s po we r
e d ge
数据结构 (30230594)
23
吴及 电子工程系
折半查找
折半查找也称二分查找
0 1 2 3 4 5 6 7 8 9 10 5 13 19 21 37 56 64 75 80 88 92
56 l=0, r =10, m = 5
数据结构 (30230594)
19 0,4,2
80 6,10,8
5
21
握某个特定算法更重要
数据结构 (30230594)
2
吴及 电子工程系
内容提要
算法设计技术 算法优化技术 计算复杂性理论简介
数据结构 (30230594)
3
吴及 电子工程系
内容提要
算法设计技术
蛮力法 分治法 贪心算法 动态规划 搜索算法
数据结构
4
(30230594)
吴及 电子工程系
二叉树遍历是线性时间复杂度O(n) 对一个序列求和采用分治法
在很多情形下,分治法确实有效,关键在于递推式中的参数
数据结构 (30230594)
16
吴及 电子工程系
大整数乘法
两个n位整数a和b的乘法如何进行? 蛮力法:传统的计算方式
a = an an-1 …a2 a1, b = bn bn-1 …b2 b1
假设每个元素的查找概率相
等,则平均查找长度为:
n1
n1 1
n 1
ASL i0 PiCi i0 n (i 1) 2
对于规模为N的集合,平均
来说需要进行N/2次比较
数据结构 (30230594)
序号 1 2 3 4 5 6
204 205 206 207
8
学号 2002010972 2003010141 2003010142 2003010340 2003010415 2003010532
全部公因子cf1, cf2, cf13…… 这个公因子序列中最大的cfk,即为m和n的最大公因子 或者从m到2,逐个判断每个整数是否可以同时整除m和n,找到的第一个
能够同时整除m和n的整数就是最大公因子
针对蛮力法的优化 其它方法
数据结构 (30230594)
7
吴及 电子工程系
查找元素
按照蛮力法的思想,采用逐 个比较的方式
2003011327 2003080085 2003080086 2003080087
姓名 班级
林凌南 无37
姚泓毅 无34
秦文 无31
蓝青 无31
高天石 无32
陈树卫 无35
曾波 无311
阮玄清 无33
阮孟贵 无33
李炅敏 无33
吴及 电子工程系
百元买百鸡问题
百元买百鸡问题:公鸡每只5元、母鸡每只3元、小鸡3只1元,百元买百 鸡,问共有多少种买法?
分治法
子集S1和S2的划分, 时间复杂度:T(n) = 2T(n/2)+ M(n),
由于M(n)∈O(n), 因此:T(n)∈O(nlogn)
数据结构
22
(30230594)
吴及 电子工程系
减治法
减治法是把问题转化为规模较小的子问题,通过求解子问题来得 到原问题的解
对于有些问题,减治法与分治法存在一定的相关性
GI L
N PO
TX
IL
OP
T
I
P
A A E EG I LMNOPR S T X
数据结构 (30230594)
13
吴及 电子工程系
二叉树的遍历
树的遍历就是按某种次序访问树中的结点,
要求每个结点访问一次且仅访问一次。
0
设访问根结点记作 V 遍历根的左子树记作 L
1
2
遍历根的右子树记作 R
遍历方式
2010-2011春季学期数据与算法课程讲义
算法设计技术
吴及 wuji_ee@
清华大学电子工程系 2011年5月
科学研究的一般方法
客观 观察认识 数学 算法设计 算法 实验测试 结果
事物 和猜想 模型
求解
分析
反馈验证
从特定算法到算法设计的一般性技术 知道求解的方法比知道解更重要,掌握算法设计和优化技术比掌
c = a*b = a*bn* 10n-1+a*bn-1* 10n-1…a*b2* 10 +a*b1 考虑乘法的复杂度:n2次乘法
数据结构 (30230594)
17
吴及 电子工程系
大整数乘法
采用分治法
设a和b都为n位整数,则可表示为:
a = af10n/2+al,b = bf10n/2+bl af和bf分别为a和b的前半部分,al和bl分别为a和b的后半部分 c = a*b = (af * bf) 10n + (af * bl + al * bf ) 10n/2 + (al * bl)
Strassen矩阵乘法
矩阵乘法
蛮力法:需要8次乘法和4次加法
Strassen矩阵乘法
其中:
数据结构 (30230594)
20
吴及 电子工程系
Strassen矩阵乘法
Strassen矩阵乘法需要7次乘法和18次加减法 对于高维矩阵,可以引入分治法
相关文档
最新文档