日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

软件设计师 - 算法思想

發布時間:2024/9/27 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 软件设计师 - 算法思想 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 遞歸和迭代
  • 軟考常見算法思想
  • 分治法
  • 回溯法
  • 貪心法
  • 動態規劃法

遞歸和迭代

遞歸:函數不斷的調用自己,存在終止條件,分為遞推和回歸兩部分;
迭代:不斷用變量的舊值遞推新值的過程,當前保存的結果作為下一次循環計算的初始值,是代碼塊的循環;

//這是遞歸 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背包最大價值問題):

與分治法區別:
分治法的子問題都具有相同的邏輯結構,相同的問題被求解多次,最后解決原問題的時間是指數級別;
動態規劃常用于求解最優問題(固定容量背包最大價值),這類問題可能有很多解,希望找到最優值的解

總結

以上是生活随笔為你收集整理的软件设计师 - 算法思想的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。