文章目录
- 递归和迭代
- 软考常见算法思想
- 分治法
- 回溯法
- 贪心法
- 动态规划法
递归和迭代
递归:函数不断的调用自己,存在终止条件,分为递推和回归两部分;
迭代:不断用变量的旧值递推新值的过程,当前保存的结果作为下一次循环计算的初始值,是代码块的循环;
//这是递归
int funcA(int n)
{if(n > 1)return n+funcA(n-1);else return 1;
}
//这是迭代
int funcB(int n)
{int i,s=0;for(i=1;i<n;i++)s+=i;return s;
}
软考常见算法思想
分治法
基本思想:分而治之,把一个大的、复杂的问题拆分成若干小的、规模较小的子问题;子问题和原问题具有相同的逻辑结构;子问题可递归拆分;
实现(二分查找法):
//二分查找前,数组已经从小到达排好序public static int binarySearch (int[] arr,int begin,int end ,int target){int result = -1;if(begin>end){return result;}else {result = (begin+end)/2;if(arr[result]==target){return result;}else if(arr[result]<target){return binarySearch(arr,result+1,end,target);}else {return binarySearch(arr,begin,result-1,target);}}}
快速排序:
排序算法实现
回溯法
基本思想:深度优先的选优搜索法,按选优条件向前试探以达到目标,当搜索中发现无法达到目标或选择不优时,则退回一步重新试探搜索;搜索过程中动态产生问题的解空间;
实现(迷宫问题):
在这里插入代码片
贪心法
基本思想:不追求最优解,只希望得到较为满意的解。选择对于当前情况最好的抉择,而不考虑整体情况。得到的不一定是最优解;
例题:
//设有n个货物要装入若干个容量为C的集装箱,n个货物的体积分别为:{ },且每个货物的体积都小于等于C,求最少多少个集装箱可以装下n个货物//最先适宜法:首先所有集装箱都是空的,对于所有货物,按照所给的次序,每次将一个货物装入第一个能容纳它的集装箱//最优适宜法:每次把货物装入能够容纳它且目前剩余容量最小的集装箱,使得该货物装入箱子后闲置空间最小
贪心算法实现:
//最先适宜法:首先所有集装箱都是空的,对于所有货物,按照所给的次序,每次将一个货物装入第一个能容纳它的集装箱public static int firstFit() {//重置箱子容量for (int i = 0; i < box.length; i++) {box[i] = 0;}int sum = 0;//总计需要的 集装箱数量int tempNum = 0;//临时集装箱编号for (int i = 0; i < n; i++) {//对于每一个货物tempNum = 0;//临时集装箱编号重置为0(从第一个集装箱试探装入)while (C - box[tempNum] < goodWeight[i]) {//当前临时编号集装箱,不足以装入货物itempNum++;//换下一个编号的集装箱}box[tempNum] = box[tempNum] + goodWeight[i];//当前货物装入 第一个能容纳它的 集装箱sum = sum > ++tempNum ? sum : tempNum;//最终结果取最大值}return sum;}//最优适宜法:每次把货物装入能够容纳它且目前剩余容量最小的集装箱,使得该货物装入箱子后闲置空间最小public static int bestFit() {//重置箱子容量for (int i = 0; i < box.length; i++) {box[i] = 0;}int sum = 0;//总计需要的 集装箱数量int tempNum = 0;//临时集装箱编号int minCapacity = C; //最小容量for (int i = 0; i < n; i++) {//对于每一个货物minCapacity = C; //最小容量tempNum = 0;//临时集装箱编号重置为0(从第一个集装箱试探装入)for (int j = 0; j < sum + 1; j++) {//允许多扩展一个空的集装箱int temp = C - box[j] - goodWeight[i];//当前集装箱 装入货物后的剩余容量if (minCapacity > temp && temp > 0) {//当前集装箱装入货物后剩余容量 小于 当前最小容量minCapacity = temp;//更新最小容量tempNum = j;//存入货物的集装箱编号}}box[tempNum] = box[tempNum] + goodWeight[i];sum = sum > ++tempNum ? sum : tempNum;//最终结果取最大值}return sum;}
参数初始化:
//货物数量private static int n;//货物(编号从0开始)体积 数组private static int[] goodWeight;//每个集装箱容量private static int C;//集装箱(编号从0开始) 数组private static int[] box ;public static void main(String[] args) {n = 10;C = 10;goodWeight = new int[]{4, 2, 7, 3, 5, 4, 2, 3, 6, 2};box = new int[n];System.out.println("最先适宜法 : " + firstFit());System.out.println("最优适宜法 : " + bestFit());}
动态规划法
基本思想:与分治法类似,将求解问题分成若干子问题,求解子问题,从子问题得到原问题的解;(01背包最大价值问题):
与分治法区别:
分治法的子问题都具有相同的逻辑结构,相同的问题被求解多次,最后解决原问题的时间是指数级别;
动态规划常用于求解最优问题(固定容量背包最大价值),这类问题可能有很多解,希望找到最优值的解