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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

算法小结 之 蛮力法

發(fā)布時(shí)間:2023/12/8 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法小结 之 蛮力法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1.1 蠻力法的定義
    • 1.2 蠻力法的優(yōu)缺點(diǎn)
    • 1.3 蠻力法的設(shè)計(jì)思想
    • 1.4 蠻力法的經(jīng)典使用
      • 1.4.1 排序
        • 1.4.1.1選擇排序
        • 1.4.1.2冒泡排序
      • 1.4.1.3 順序查找
      • 1.4.2 字符串匹配問(wèn)題
      • 1.4.3 最近點(diǎn)對(duì)的蠻力算法
      • 1.4.4 凸包問(wèn)題的蠻力算法
      • 1.4.5 窮舉法
        • 1.4.5.1 NP難問(wèn)題
          • 1.4.5.2 TSP問(wèn)題
          • 1.4.5.3 背包問(wèn)題
        • 1.4.5.4 分配問(wèn)題

1.1 蠻力法的定義

?蠻力法又稱為枚舉法,窮舉法,暴力法。蠻力算法是一種簡(jiǎn)單直接地解決問(wèn)題,但不一定是最高效的方法


1.2 蠻力法的優(yōu)缺點(diǎn)

蠻力法所具有的優(yōu)點(diǎn):

  • 應(yīng)用范圍廣,不受實(shí)列規(guī)模的限制
  • 當(dāng)要解決的問(wèn)題低頻率出現(xiàn),并且高效算法很難設(shè)計(jì)時(shí)可選用蠻力法
  • 對(duì)解決一些小規(guī)模的問(wèn)題實(shí)列仍然有效
  • 可作為衡量其他算法的參照物
  • 蠻力法所具有的缺點(diǎn):

  • 用蠻力法設(shè)計(jì)的算法其時(shí)間性能往往也是最低的, 典型的指數(shù)時(shí)間算法一般都是通過(guò)蠻力搜索而得到的

  • 1.3 蠻力法的設(shè)計(jì)思想

    蠻力法是指采用遍歷(掃描)技術(shù),即采用一定的策略將待求解問(wèn)題的所有元素依次處理一次,從而找出問(wèn)題的解。依次處理所有元素是蠻力法的關(guān)鍵,為了避免陷入重復(fù)試探,應(yīng)保證處理過(guò)的元素不再被處理。


    1.4 蠻力法的經(jīng)典使用

    1.4.1 排序

    1.4.1.1選擇排序

    問(wèn)題描述:

    ? 給定一個(gè)可排序的n元序列,將它們按照非降序方法重新排序

    使用蠻力法的思路(遞歸描述):

  • 掃描整個(gè)列表,找出n個(gè)元素中最小的元素,將其置于末端
  • 對(duì)剩余的n-1個(gè)元素執(zhí)行步驟一
  • 當(dāng)所剩元素為1時(shí),停止操作
  • 算法設(shè)計(jì)(偽代碼):

    //非遞歸 Algorithm SS(A[0..n-1]) //SelectionSort//輸入:n元數(shù)組//輸出:n元數(shù)組for i=0 to n-2 domin:=i;for j:=i+1 to n-1 doif A[j]<A[min] then min->j;swap A[i] and A[min]

    算法分析:

    • 輸入規(guī)模(空間復(fù)雜度)

      因?yàn)檩斎氲氖莕元數(shù)組,故空間復(fù)雜度是:O(n)

    • 算法的基本操作:

      比較A[j] < A[min],數(shù)據(jù)交換swap

    • 比較次數(shù)C(n)
      C(n)=∑i=0n?2∑j=i+1n?11=∑i=0n?2(n?1?i)=n(n?1)2C(n)={\sum_{i=0}^{n-2}\sum_{j=i+1}^{n-1}1}={\sum_{i=0}^{n-2}(n-1-i)}=\frac{n(n-1)}{2} C(n)=i=0n?2?j=i+1n?1?1=i=0n?2?(n?1?i)=2n(n?1)?
      于是C(n)屬于O(n2)


    1.4.1.2冒泡排序

    問(wèn)題描述:

    ? 給定一個(gè)可排序的n元序列,將它們按照非降序方法重新排序

    使用蠻力法的解決思路:

  • 比較相鄰的元素,將大的元素交換到右邊的位置,重復(fù)多次后,最大的元素交換到最右邊
  • 第二遍將第二大的元素沉下去,n-1次后結(jié)束
  • 算法設(shè)計(jì):

    Algorithm BS(A[0..n-1]) //BubbleSort//輸入:n元數(shù)組//輸出:n元數(shù)組for i:=0 to n-2 dofor j:=0 to n-2-i doif A[j+1]<A[j] then swap A[j] and A[j+1]

    算法分析:

    • 輸入規(guī)模(空間復(fù)雜度)

      因?yàn)檩斎氲氖莕元數(shù)組,故空間復(fù)雜度是:O(n)

    • 算法的基本操作:

      比較A[j] < A[j+1],數(shù)據(jù)交換swap

    • 比較次數(shù)C(n)
      C(n)=∑i=0n?2∑j=0n?2?i1=∑i=0n?2(n?1?i)=n(n?1)2C(n)={\sum_{i=0}^{n-2}\sum_{j=0}^{n-2-i}1}={\sum_{i=0}^{n-2}(n-1-i)}=\frac{n(n-1)}{2} C(n)=i=0n?2?j=0n?2?i?1=i=0n?2?(n?1?i)=2n(n?1)?
      于是C(n)屬于O(n2)


    1.4.1.3 順序查找

    問(wèn)題描述:

    ? 已知有n個(gè)元素的數(shù)組A[0…n],給定元素K,要求找出一個(gè)下標(biāo)i,,使得A[i]=K.。輸出第一個(gè)值等于K的元素的位置,找不到返回-1。

    使用蠻力法解決問(wèn)題的思路:

    ? 遍歷數(shù)組

    算法設(shè)計(jì):

    Algorithm SequentialSearch(A[0..n-1],K)//輸入:n元數(shù)組,給定元素k//輸出:所尋找到的元素k的下標(biāo)i:=0;while A[i]≠K and i<n do i:=i+1; if A[i]=K then return ielse return -1

    算法分析:

    • 輸入規(guī)模

      因?yàn)檩斎氲氖莕元數(shù)組,故空間復(fù)雜度是:O(n)

    • 算法的基本操作

      比較A[i]與k是否相同

    • 比較次數(shù)

      • 最壞情況:n
      • 最好情況:1

    1.4.2 字符串匹配問(wèn)題

    問(wèn)題描述:

    ? 從文本中尋找匹配模式的子串,即求出第一個(gè)匹配模式的子串在文本中的開(kāi)始位置(子串最左元素的下標(biāo))。

    使用蠻力法解決問(wèn)題的思路:

    ? 將模式對(duì)準(zhǔn)文本的前m個(gè)字符從左往右進(jìn)行比對(duì),如果其中有一個(gè)字符不匹配,模式往右移動(dòng)一位繼續(xù)下一個(gè)m個(gè)字符的比對(duì)。

    算法設(shè)計(jì):

    Algorithm BFSM (T[0..n-1], P[0..m-1])// Brute Force String Match//輸入:文本數(shù)組T[0..n-1],模式數(shù)組P[0..m-1] (n>m)//輸出:所尋找的的位置的下標(biāo),查找不成功時(shí)返回-1for i :=0 to n-m doj := 0while j<m and P[j]=T[i+j] doj := j+1if j=m return ireturn -1

    算法分析:

    • 輸入規(guī)模

      輸入了兩個(gè)數(shù)組,長(zhǎng)度分別為n和m,故空間復(fù)雜度是:O(n+m)

    • 算法的基本操作

      比較

    • 比較次數(shù)

      • 最壞情況:

        模式需要移動(dòng)n-m+1次,模塊每次移動(dòng)前,都要做m次對(duì)比,此時(shí)的時(shí)間復(fù)雜度屬于nm級(jí)別

      • 最好情況:

        模式不需要移動(dòng),只需要比較m次,時(shí)間復(fù)雜度屬于m級(jí)別

      • 平均時(shí)間復(fù)雜度屬于n級(jí)別的


    1.4.3 最近點(diǎn)對(duì)的蠻力算法

    問(wèn)題描述:

    ? 給定平面S上n個(gè)點(diǎn),找其中的一對(duì)點(diǎn),使得在n(n-1)/2個(gè)點(diǎn)對(duì)中,該點(diǎn)對(duì)的距離最小。

    使用蠻力法解決問(wèn)題的思路:

    ? 把所有的點(diǎn)兩兩組合,比較它們之間的距離即可以得到距離最小的一對(duì)

    算法設(shè)計(jì):

    Algorithm BFCP ( P ) // Brute Force Closest Points// 輸入:n個(gè)點(diǎn)的數(shù)組P,Pi(xi , yi), i=1, 2, …, n// 輸出:兩個(gè)最近點(diǎn)的下標(biāo)index1和index2dmin :=;for i := 1 to n-1 dofor j := i+1 to n dod := sqrt((xi-xj)2+(yi-yj)2);if d < dmin thendmin := d;index1 := i; index2 := j;return index1, index2

    算法分析:

    • 輸入規(guī)模

    • 算法的基本操作

      平方操作

    • 比較次數(shù)C(n)
      C(n)=∑i=1n?1∑j=i+1n2=2∑i=0n?2(n?i)=n(n?1)C(n)={\sum_{i=1}^{n-1}\sum_{j=i+1}^{n}2}=2{\sum_{i=0}^{n-2}(n-i)}=n(n-1) C(n)=i=1n?1?j=i+1n?2=2i=0n?2?(n?i)=n(n?1)
      于是C(n)屬于O(n2)


    1.4.4 凸包問(wèn)題的蠻力算法

    問(wèn)題描述:

    凸集定義:

    ? 設(shè)S是平面點(diǎn)集,如果S中任意兩點(diǎn)的連線都屬于該集合,則稱S是凸的

    凸包定義:

    ? 一個(gè)點(diǎn)集S的凸包是指包含S的最小凸集。顯然,如果S是凸的,則S的凸包就是S本身(橡皮筋圈解釋)。

    ? 給定一個(gè)n個(gè)點(diǎn)的點(diǎn)集S,求S的凸包。

    使用蠻力法解決問(wèn)題的思路:

    極點(diǎn):

    ? 凸集的極點(diǎn)是指不會(huì)出現(xiàn)在集合中任何線段的中間的點(diǎn)。

    ? 設(shè)點(diǎn)集大小為n,首先將其中的點(diǎn)兩兩配對(duì),得到直線段條。

    ? 然后對(duì)每一條直線段檢查其余的n-2個(gè)點(diǎn)的相對(duì)于該直線段的正負(fù)性,如果它們都有相同的正負(fù)性,那么這條直線段屬于凸多邊形的邊,其頂點(diǎn)是極點(diǎn)。


    1.4.5 窮舉法

    窮舉法是一種簡(jiǎn)單的蠻力方法,它要求生成所有可能的可行解,再?gòu)闹羞x擇最優(yōu)解。


    1.4.5.1 NP難問(wèn)題

    目前沒(méi)有已知的效率可以用多項(xiàng)式來(lái)表示的算法,需要通過(guò)窮舉法去解決,下面是兩個(gè)經(jīng)典問(wèn)題:

    1.4.5.2 TSP問(wèn)題

    給定n個(gè)城市相互之間的距離,求一條能走遍n個(gè)城市的最短路徑,使我們能從任一城市開(kāi)始,訪問(wèn)每個(gè)城市只一次后回到起點(diǎn)。


    1.4.5.3 背包問(wèn)題

    給定n個(gè)重量為w1、w2…wn,價(jià)值為v1、v2、…、vn的物品和一個(gè)承重為W的背包,如何將物品裝入背包使背包所獲的價(jià)值最大。


    1.4.5.4 分配問(wèn)題

    有n個(gè)任務(wù)需要分配給n個(gè)人執(zhí)行,一人一個(gè)任務(wù)。將第j個(gè)任務(wù)分配給第i個(gè)人的成本是C[i, j],求總成本最小的分配方案。

    可用窮舉法列出n的階乘個(gè)可能的解決方案

    總結(jié)

    以上是生活随笔為你收集整理的算法小结 之 蛮力法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。