关于算法
问题1:算法基本概念/算法和程序:定义和区别是什么?
概念/定义和区别:
- 算法:指解决问题的方法或过程。
- 程序:是算法用某种程序设计语言的具体实现。
- 程序可以不满足算法性质的有限性。
问题2:算法的复杂性统计/复杂性分析和估算:简单分析与估算。
- 算法复杂性的高低体现在运行该算法所需要的计算机资源的多少,所以有时间复杂性和空间复杂性之分。
- 为简化算法复杂性的分析,引入渐进符号:O(上界)、Ω(下界)、Θ(同阶)、o、ω
递归与分治法基本概念
- 递归:直接或间接地调用自身的算法称为递归算法。
- 分治:大问题分解为小问题,对这k个子问题分别求解。将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。
递归经典例子
hanoi塔
有三根针a、b、c。a 针上有N个盘子,大的在下,小的在上,要求把这N个盘子从 a 针移到 b 针,在移动过程中可以借助 c 针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。
解决思路:
- 当 n=1 时,直接将圆盘从 a 移到 b。
- 当 n>1 时,需要利用 b,将 n-1 个圆盘移到 c 上,然后将剩下的最大圆盘移到 b
- 最后利用 a,将 n-1 个较小的圆盘从 c 移到 b 上(递归子问题 n-1)。
我们将n个圆盘的移动问题就分解成了两次 n-1 个圆盘的移动问题。
递归算法:
public static void hanoi(int n,int a,int b,int c){
if(n==1){
move(a,b);
}else{
hanoi(n-1,a,c,b);
move(a,b);
hanoi(n-1,c,b,a);
}
}
分治法经典例子
整数排列(全排列问题)
解决思路:
依次将待排列的数组的后n-1个元素与第一个元素交换,则每次递归处理的都是后n-1个元素的全排列。当数组元素仅有一个时为此递归算法的出口。
伪代码:
public void Perm(int[] a,int k,int n){
if(k==m){
for(int i=0;i<n;i++){
System.out.println(a[i]);
}
}else{
for(int i=k;i<n;i++){
swap(a,i,k);
perm(a,k+1,m);
swap(a,i,k);
}
}
}
整数划分
问题:将给定正整数n表示成一系列正整数之和
n=n1+n