演算法設計流程
Ⅰ 制定一個演算法一般要經歷哪幾個階段
設計,確認,編碼,檢查,調試,計時等過程
Ⅱ 演算法設計的過程一般是什麼樣子
和你做數學題目的過程一樣,已知條件是什麼?已知量是什麼?要求什麼?需要輸出一個什麼結果?
演算法設計就是把問題解決步驟用計算機編程語言來表示出來
Ⅲ 其中演算法設計所屬的步驟是( ). A、① B、② C、③ D、①②
一般來說,用計算機解決一個具體問題時,大致經過以下幾個步驟:首先要從具體問題抽象出一個適當的數學模型,然後設計一個解此數學模型的演算法,最後編出程序進行測試調整知道的到最終解答。尋求數學模型的實質就是分析問題,從中提取操作的對象,並找出這些操作對象之間含有的關系,然後用數學的語言加以描述。
你自己看吧。
Ⅳ 請問程序設計的基本過程是怎樣的
(1)分析需求:了解清楚程序應有的功能。
(2)設計演算法:根據所需的功能,理清思路,排出完成功能的具體步驟,其中每一步都應當是簡單的、確定的。這一步也被稱為「邏輯編程」。
(3)編寫程序:根據前一步設計的演算法,編寫符合C++語言規則的程序文本。
(4)輸入與編輯程序:將程序文本輸入到計算機內,並保存為文件,文件名後綴為「.cpp」。
至此,產生了完整的程序文本,被稱為源程序或源代碼。保存源程序的文件(例如前面的c:\student\ch1_01.cpp)稱為源程序文件,簡稱源文件,文件名的後綴是「.cpp」。
(5)編譯(Compile):把C++程序編譯成機器語言程序。
編譯產生的程序稱為目標程序,目標程序被自動保存為文件,這一文件稱為目標文件,文件名的後綴是「.obj」。
VC++進行編譯的依據是源程序,如果源程序中的符號、詞語、整體結構等有差錯,超出了VC++的「理解能力」,VC++就無法完成編譯,這樣的差錯稱為語法錯誤。一旦發現語法錯誤,VC++就不生成目標文件,並在窗口下方列出錯誤;如果沒有語法錯誤,則顯示「0 error(s)」,並生成目標文件,允許繼續進行後面的步驟。
編譯沒有出現錯誤,僅僅說明程序中沒有語法錯誤。
(6)生成執行程序:從目標文件進一步連接生成Windows環境下的可執行文件,即文件名後綴為「.exe」的文件。
由於可執行文件是由若干個文件拼接而成的,其中不但有目標文件,還有另一些標準的庫文件,一些規模較大的程序還會有多個目標文件,所以這一步驟又被稱為連接(Link)。
(7)運行:在Windows環境中使用可執行文件。這是程序設計的最終目的。這一步也常被稱為「Run」。
邏輯錯誤:演算法錯,或演算法在轉變為程序時走樣了,導致程序能夠運行,卻不能實現預想的功能。這種錯誤被稱為「邏輯錯誤」。
在運行這一步,必須核對程序是否正確實現了預定的功能,如果功能不對,還必須到程序中尋找錯誤,糾正後再次經歷(5)、(6)、(7)各步,直到看不出錯誤為止。
Ⅳ 演算法設計與分析過程典型步驟包括哪些
- 分解:將問題分為若干個子問題。 - 解決:遞歸地求解每個子問題。 - 合並:將每個子問題的解合並成為整個問題的解。
Ⅵ 程序設計的基本過程是怎樣的
從分析需求開始
Ⅶ 演算法設計的過程一般是什麼樣子 演算法設計的過程一般是那幾步
和你做數學題目的過程一樣,已知條件是什麼?已知量是什麼?要求什麼?需要輸出一個什麼結果?
演算法設計就是把問題解決步驟用計算機編程語言來表示出來
Ⅷ python演算法設計的步驟有三步分別是
1. 弄清楚題目的意思,列出題目的輸入、輸出、約束條件
其中又一道題目是這樣的:「有一個mxn的矩陣,每一行從左到右是升序的,每一列從上到下是升序的。請實現一個函數,在矩陣中查找元素elem,找到則返回elem的位置。」題設只說了行和列是升序的,我在草稿紙上畫了一個3x4的矩陣,裡面的元素是1~12,於是我就想當然的認為矩陣的左上角是最小的元素,右下角是最大的元素。於是整個題目的思考方向就錯了。
2. 思考怎樣讓演算法的時間復雜度盡可能的小
繼續以上面的題目為例子。可以有如下幾種演算法:
a. 遍歷整個矩陣進行查找,那麼復雜度為O(m*n);
b. 因為每一行是有序的,所以可以對每一行進行二分查找,復雜度為O(m*logn)。但是這樣只用到了行有序的性質。
c. 網上查了一下,最優的演算法是從矩陣的左下角開始,比較左下角的元素(假設為X)與elem的大小,如果elem比X大,那麼X所在的那一列元素就都被排除了,因為X是該列中最大的了,比X還大,那麼肯定比X上面的都大;如果elem比X小,那麼X所在的那一行就可以排除了,因為X是這一行里最小的了,比X還小那麼肯定比X右邊的都小。每迭代一次,矩陣的尺寸就縮小一行或一列。復雜度為O(max(m,n))。
可以先從復雜度較高的實現方法入手,然後再考慮如何利用題目的特定條件來降低復雜度。
3. 編寫偽代碼或代碼
Ⅸ 演算法設計-流程製作
我覺得這樣可能比較好理解一點 有三根柱子,標記為A, B, C 先要理解函數hanoi(n,A,B,C) 的意思是藉助於B柱子將A上面的n個盤子移到C上面,必須充分對應到各個參數。 如果想將n個盤子從A柱子移動到C柱子 可以分為這樣幾個步驟 (1)必須將A最下面也就是最大的那個盤子移動到C最下面 首先需要藉助C柱子將A上面的n-1個盤子移動到B上面 就是hanoi(n-1,A,C,B) 。 此時A上面只有一個最大的盤子,B上面按序放著n-1個盤子,C上面有0個盤子。 (2)將A上面的盤子移動到C上面,只需要1步。 此時A上面有0個盤子,B上面按序放著n-1個盤子,C上面只有一個最大的盤子。 (3)最後藉助於A柱子將B上面n-1個盤子移到C上面即可 就是hanoi(n-1,B,A,C) 。 所以實際上數學推導公式為f(n)=2f(n-1)+1,其中f(1)=1,f(n)表示將n個盤子從A柱子移到C柱子的步數
Ⅹ 演算法設計的步驟不包含什麼
一、學習內容
1. 演算法設計中五大常用演算法
1) 分治法
設計思想:將一個難以直接解決的大問題分解成規模較小的相同問題,以便分而治之。
實際的應用:快速排序、歸並排序
分治法在每一層遞歸上的基本步驟:
①分解:將原問題分解為若干個規模較小、相互獨立、與原問題形式相同的子問題。
②解決:若子問題規模較小就直接解決,不然就遞歸解決各個子問題
③合並:將各個子問題的解合並為原問題的解
以快速排序為例理解分治法:
快速排序代碼:
public static void quickSort(int a[],int low,int high){
if(low < high){
int pivotpos = partition(a,low,high);
quickSort(a,low,pivotpos-1);
quickSort(a,pivotpos+1,high);
}
}
public static int partition(int a[],int low,int high){
int pivot = a[low];
while (low < high){
while (low < high && a[high] >= pivot){
--high;
}
a[low] = a[high];
while (low < high && a[low] <= pivot){
++low;
}
a[high] = a[low];
}
a[low] = pivot;
return low;
}
①分解:選取基準元素,將左右兩側進行劃分
②解決:分別將兩個子序列進行快速排序
③合並:將排好的子序列合並
以兩路合並排序為例理解分治法:(分治法中的合並在歸並排序中體現得更加清楚)
歸並排序代碼:
public static void merge(int a[],int low,int mid,int high){
int[] temp = new int[high-low+1];
int i = low;
int j = mid+1;
int k = 0;
while (i <= mid && j <= high){
if(a[i] < a[j]){
temp[k++] = a[i++];
}else {
temp[k++] = a[j++];
}
}
//把左邊剩下的移到數組中
while (i <= mid){
temp[k++] = a[i++];
}
//把右邊剩下的移到數組中
while (j <= high){
temp[k++] = a[j++];
}
//更新原數組
for (int x = 0;x <temp.length;x++){
a[x+low] = temp[x];
}
}
public static int[] mergeSort(int a[],int low,int high){
int mid = (low+high)/2;
if(low < high){
mergeSort(a,low,mid);
mergeSort(a,mid+1,high);
//左右合並
merge(a,low,mid,high);
}
return a;
}
①分解:將一個數組一刀切兩半,遞歸切,直到切成單個元素
②解決:單個元素合並成有序的小數組
③合並:小數組合並成大數組,最終合並完成
2) 動態規劃法
設計思想:最優化原理,即一個過程的最優決策具有這樣的性質:即無論其初始狀態和初始決策如何,其今後諸策略對以第一個決策所形成的狀態作為初始狀態的過程而言,必須構成最優策略
動態規劃法所要滿足的條件:
①問題中的狀態滿足最優化原理
②問題中的狀態必須滿足無後效性,無後效性指的是下一時刻的狀態只與當前的狀態 有關而與當前狀態的之前狀態無關。
動態規劃三要素:
①問題的階段
②每個階段的狀態
③從前一個階段轉換到後一個階段的遞推關系
實際的應用:0/1背包問題 最長公共子串問題
以最長公共子串問題為例理解動態規劃法:
定義dp[i][j]表示以A中第i個字元結尾的子串和B中第j個字元結尾的子串的最大公共子串,dp 的大小也為 (n + 1) x (m + 1) ,這多出來的一行和一列是第 0 行和第 0 列,初始化為 0,表示空字元串和另一字元串的子串的最長公共子串。
當我們要求dp[i][j]時,我們要先判斷A的第i個元素B的第j個元素是否相同即判斷A[i - 1]和 B[j -1]是否相同,如果相同它就是dp[i - 1][j- 1] + 1,相當於在兩個字元串都去掉一個字元時的最長公共子串再加 1;否則最長公共子串取0。所以整個問題的初始狀態為:
dp[i][0]=0,dp[0][j]=0
相應的狀態轉移方程為:
實現代碼:
public static int findLongest(String A,String B){
int n = A.length();
int m = B.length();
if(m == 0 || n == 0){
return 0;
}
int result = 0;
int[][] dp = new int[n+1][m+1];
//初始狀態
for(int i = 0; i <= n;i++){
dp[i][0] = 0;
}
for(int i = 0; i <= m;i++){
dp[0][i] = 0;
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
if(A.charAt(i-1) == B.charAt(j-1)){
dp[i][j] = dp[i-1][j-1]+1;
result = Math.max(result,dp[i][j]);
}else {
dp[i][j] = 0;
}
}
}
return result;
}