【算法】蛮力法
前言
概念
蠻力法(brute force):直接基于問題的描述和所涉及的概念定義的進行算法設計,簡單而直接。
蠻力法應用特點
枚舉法
算法框架
例題1
輸入n個數字(在0與9之間),然后統計出這組數中相鄰兩個數字組成的鏈環數字對出現的次數。如:n=20,輸入為0 1 5 9 8 7 2 2 2 3 2 7 8 7 8 7 9 6 5 9,則輸出為(7,8)=2,(8,7)=3,(7,2)=1,(2,7)=1,(2,2)=2,(2,3)=1,(3,2)=1。
問題分析
可以利用一個二維數組a[10][10]a[10][10]a[10][10]存儲出現的數字隊。
首先,將二維數組初始化a[i][j]=0(0≤i<10,≤j<10)a[i][j] = 0 \quad(0\leq i<10,\leq j<10)a[i][j]=0(0≤i<10,≤j<10)
然后,每輸入一個數字對,則把對應下標的數組元素加1,如數據輸入的序列為xxx,則a[xk][xk+1]=a[xk][xk+1]+1a[x_k][x_{k+1}] = a[x_k][x_{k+1}]+1a[xk?][xk+1?]=a[xk?][xk+1?]+1
如題目中的例子可以構建出如下的二維數組:
計算模型
輸入序列:xxx
初始化:a[i][j]=0(0≤i<10,≤j<10)a[i][j] = 0 \quad(0\leq i<10,\leq j<10)a[i][j]=0(0≤i<10,≤j<10)
a[xk][xk+1]=a[xk][xk+1]+10≤k<na[x_k][x_{k+1}] = a[x_k][x_{k+1}] +1 \quad 0 \leq k <na[xk?][xk+1?]=a[xk?][xk+1?]+10≤k<n
最后,統計完畢后,輸出a
算法設計與描述
算法分析
例題2
解數字謎,如下
問題分析
一共可以采用三種方式
計算模型
主要針對第三種進行分析
設Ai∈[3,9],Dj∈[1,9]A_i\in [3,9],D_j \in [1,9]Ai?∈[3,9],Dj?∈[1,9]
{D=Dj?105+?+DjDmodAi==0上一步算得的D可以被Ai整除Si=D/AiB1=Simod10A1=(Si/10)mod10C=(Si/102)mod10B2=(Si/103)mod10A2=(Si/104)mod10\left\{ \begin{array}{lr} D = D_j*10^5 +\dots +D_j & \\ D \;mod\; A_i == 0&上一步算得的D可以被A_i整除\\ S_i = D/A_i & \\ B_1 = S_i\; mod\; 10& \\ A_1 = (S_i/10) \; mod \;10\\ C = (S_i/10^2) \; mod \;10\\ B_2 = (S_i/10^3)\; mod\; 10& \\ A_2 = (S_i/10^4) \; mod \;10\\ \end{array} \right. ????????????????????????D=Dj??105+?+Dj?DmodAi?==0Si?=D/Ai?B1?=Si?mod10A1?=(Si?/10)mod10C=(Si?/102)mod10B2?=(Si?/103)mod10A2?=(Si?/104)mod10?上一步算得的D可以被Ai?整除?
判斷DDD是否可以被AiA_iAi?整除,A1A_1A1?與A2A_2A2?是否相等,B1B_1B1?和B2B_2B2?是否相等,上述條件均成立,則找到一個解。
算法設計與描述
輸出:五位數ABCAB,六位數DDDDDD
例題3
輸出玫瑰矩陣,其為n*n的方陣,特征如下所示對應下標的數組元素加1
問題分析
設矩陣為a[n,n]a[n,n]a[n,n]可以采用兩種思路
{a[j,i]←kk←k+1j←j+1左側a[n?i?1,j]←kk←k+1j←j+1底側a[j,n?i?1]←kk←k+1j←j?1右側a[i,j]←kk←k+1j←j?1頂側\left\{ \begin{array}{lr} a[j,i]\gets k & k\gets k+1& j\gets j+1&左側\\ a[n-i-1,j]\gets k & k\gets k+1& j\gets j+1&底側\\ a[j,n-i-1]\gets k & k\gets k+1& j\gets j-1&右側\\ a[i,j]\gets k & k\gets k+1& j\gets j-1&頂側\\ \end{array} \right. ????????a[j,i]←ka[n?i?1,j]←ka[j,n?i?1]←ka[i,j]←k?k←k+1k←k+1k←k+1k←k+1?j←j+1j←j+1j←j?1j←j?1?左側底側右側頂側?
若n為奇數,還需要最后處理,令a[(n?1)/2,(n?1)/2]=n2a[(n-1)/2,(n-1)/2] = n^2a[(n?1)/2,(n?1)/2]=n2
設增量t=1t = 1t=1,每半圈變換一次t←?tt \gets -tt←?t
設矩陣邊長為i,每半圈的元素就是2?i?12*i-12?i?1個,hchchc為半圈內計數變量,0≤hc<2?i?10\leq hc<2*i-10≤hc<2?i?1,前1/4圈是0≤hc<i0\leq hc<i0≤hc<i,后1/4圈是i≤hc<2?i?1i\leq hc<2*i-1i≤hc<2?i?1。
其中iii從nnn開始變換,每過半圈 i=i?1i = i-1i=i?1
計算模型
算法設計與描述
算法分析
窮舉查找
有一些求最優解的問題經過抽象,可以轉換為組合優化問題,使用蠻力法來求解是一種簡單的方法,稱之為窮舉查找(exhaustive search)。
例題4
旅行商問題(traveling salesman problem,TSP) 有一個旅行商由某市出發,經過所有給定的n個城市后,再回到出發的城市。除了出發的城市外,其它城市只經過一回。這樣的回路可能有多個,求其中路徑成本最小的回路。
問題分析
給出一個問題實例,如下
可以通過遍歷a - d的全排列來實現問題求解。
計算模型
a - b - c - d - a
a - b - d - c - a
a - c - b - d - a
a - c - d - b - a
a - d - b - c - a
a - d - c - b - a
算法設計與描述
算法分析
T(n)=∑i=0n?1T(i+1)+CT(n)=\sum_{i=0}^{n-1}T(i+1)+CT(n)=i=0∑n?1?T(i+1)+C
例題5
背包問題。給定nnn個重量為w1,w2,…wnw_1, w_2,…w_nw1?,w2?,…wn?,價值為v1,v2,…vnv_1, v_2,…v_nv1?,v2?,…vn?的物品和一個承重為WWW的背包,求將這些物品中的某些裝入背包中,在不超出重量WWW的情況下,價值最高的裝法。
問題分析
計算模型
算法設計與描述
圖的搜索
圖的兩個重要的遍歷算法:深度優先查找(depth-first search, DFS)和廣度優先查找(breadth-frist search, BFS),是窮舉查找的重要應用之一。
深度優先查找
廣度優先查找
例題6
迷宮問題。如圖所示,圖中方格內標為0的為通路,標為1墻。(0,0)為迷宮入口,(7,7)為迷宮出口,請查出由(0,0)到(7,7)的路徑。
問題分析
計算模型
采用二維矩陣maze[n][n],進行存儲
其中maze[x][y] = 0表示通路,maze[x][y]=1表示墻,maze[x][y]=2表示死路,maze[x][y] = 3表示已經走過。
行走方向:fx[]={-1,1,0,0 },fy[]={0,0, -1,1}
行走過程:nextx=x+fx[i],nexty=y+fy[i]
其中,i=0, 1, 2, 3。
算法設計與描述
算法分析
T(n)=O((n?n?1)?4)T(n)=O((n*n-1)*4)T(n)=O((n?n?1)?4)
參考資料:張小東老師ppt
總結
- 上一篇: 从服务业突然决定转行进入IT界
- 下一篇: jquery传输文件到后端,后端处理数据