软件设计师 - 算法思想
生活随笔
收集整理的這篇文章主要介紹了
软件设计师 - 算法思想
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 遞歸和迭代
- 軟考常見算法思想
- 分治法
- 回溯法
- 貪心法
- 動態規劃法
遞歸和迭代
遞歸:函數不斷的調用自己,存在終止條件,分為遞推和回歸兩部分;
迭代:不斷用變量的舊值遞推新值的過程,當前保存的結果作為下一次循環計算的初始值,是代碼塊的循環;
軟考常見算法思想
分治法
基本思想:分而治之,把一個大的、復雜的問題拆分成若干小的、規模較小的子問題;子問題和原問題具有相同的邏輯結構;子問題可遞歸拆分;
實現(二分查找法):
//二分查找前,數組已經從小到達排好序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背包最大價值問題):
與分治法區別:
分治法的子問題都具有相同的邏輯結構,相同的問題被求解多次,最后解決原問題的時間是指數級別;
動態規劃常用于求解最優問題(固定容量背包最大價值),這類問題可能有很多解,希望找到最優值的解
總結
以上是生活随笔為你收集整理的软件设计师 - 算法思想的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyBatis-Plus_Conditi
- 下一篇: 基于zookeeper(集群)+Leve