算法分析(課程筆記)
阿新 • • 發佈:2018-09-29
小問題 技術 其他 問題 swa pri urn 通過 目錄
目錄
- 遞歸與分治
- 全排列
希望通過寫博客 促進自己學習,都是課本上算法的實現,隨課程更新
遞歸與分治
全排列
基本思路就是分治,大問題化小問題。
假設 R={A B C D},對R進行全排列,會有24種結果。把R劃分為{A | B C D},假定A已經排列好了,只需要再排列{B C D}既可。這就可以通過遞歸來實現了。(第一個排列好的其他劃分:{B | A C D} {C | A B D} {D | A B C})
#include <iostream> #include <cstdio> #include <cstdlib> template <class T> void swap(T &a, T &b) //交換函數 { T temp; temp = a; a = b; b = temp; } void print(char e) //輸出函數 { printf("%c ", e); } //perm函數,k為開始位置,m為序列元素個數,void (*print)(T e)為輸出函數指針。 //perm函數會從k開始對m個元素進行全排列 template <class T> void perm(T list[], int k, int m, void (*print)(T e)) { if(k==m) { for(int i = 0; i < m; i++) print(list[i]); printf("\n"); } else { for(int i = k; i < m; i++) { swap(list[k], list[i]); //兩個swap在下面解釋 perm(list, k+1, m, print); swap(list[k], list[i]); } } } int main() { char list[]={‘A‘, ‘B‘, ‘C‘, ‘D‘}; perm(list, 0, 4, print); return 0; }
解釋一下兩個swap,比如上圖,第三行第一個是由ABCD的BC交換得來的,排列完成後,ACBD通過交換變回ABCD,再進行ADBC的排列
算法分析(課程筆記)