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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【算法】蛮力法

發布時間:2023/12/8 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【算法】蛮力法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

概念

蠻力法(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(0i<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(0i<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?]+10k<n
    最后,統計完畢后,輸出a

    算法設計與描述

    算法分析

    例題2

    解數字謎,如下

    問題分析

    一共可以采用三種方式

  • 枚舉測試:五位數的范圍為30000-99999。時間復雜度為99999-30000 + 1 = 70000次
  • 采用構造式的枚舉法:A取值從3-9,B-C取值0-9。時間復雜度為71010 = 700
  • 構造式的枚舉法——除法:D的值從1-9,而A的取值仍然從3-9。兩重循環,時間復雜度為7*9=63。
  • 計算模型

    主要針對第三種進行分析
    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?DAi??
    判斷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]可以采用兩種思路

  • iii代表圈數(從0開始),j代表圈內下標變化量:
    {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?kk+1kk+1kk+1kk+1?jj+1jj+1jj?1jj?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-10hc<2?i?1,前1/4圈是0≤hc<i0\leq hc<i0hc<i,后1/4圈是i≤hc<2?i?1i\leq hc<2*i-1ihc<2?i?1。
    其中iiinnn開始變換,每過半圈 i=i?1i = i-1i=i?1
  • 計算模型

    算法設計與描述

    算法分析

    窮舉查找

    有一些求最優解的問題經過抽象,可以轉換為組合優化問題,使用蠻力法來求解是一種簡單的方法,稱之為窮舉查找(exhaustive search)。

    例題4

    旅行商問題(traveling salesman problem,TSP) 有一個旅行商由某市出發,經過所有給定的n個城市后,再回到出發的城市。除了出發的城市外,其它城市只經過一回。這樣的回路可能有多個,求其中路徑成本最小的回路。

    問題分析

    給出一個問題實例,如下

    可以通過遍歷a - d的全排列來實現問題求解。

    計算模型

  • 存儲 利用圖G(V,E)。邊以臨界矩陣形式存儲,如下
  • 計算 列出所有路徑
    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=0n?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。
  • 算法設計與描述

    算法分析

  • 迷宮矩陣:maze[n][n]
  • 依據不同的行走方向,可知T(n,n)=T(n?1,n)+T(n+1,n)+T(n,n?1)+T(n,n+1)T(n, n)=T(n-1,n)+T(n+1,n)+T(n, n-1)+T(n,n+1)T(n,n)=T(n?1,n)+T(n+1,n)+T(n,n?1)+T(n,n+1)。然而,這公式并不準確,因為墻的布局對算法的影響很大,所以,最壞情況下,所有頂點都測試過,這時,時間復雜度為
    T(n)=O((n?n?1)?4)T(n)=O((n*n-1)*4)T(n)=O((n?n?1)?4)
  • 存儲空間中包括遞歸時的所用的棧,所以,空間復雜度至少為O(2?n2)O(2*n^2)O(2?n2)。
  • 參考資料:張小東老師ppt

    總結

    以上是生活随笔為你收集整理的【算法】蛮力法的全部內容,希望文章能夠幫你解決所遇到的問題。

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