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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

算法-蛮力法

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

蠻力法的主要思想就是用最簡單的思路解決問題,一般性能不好,但仍然很重要。

  • 理論上蠻力法可以解決可計算領域的各種問題
  • 蠻力法解決較小規模問題是可接受的,如果設計一個更高效算法代價不值得
  • 蠻力法可以作為時間性能的底線,來衡量更高效的算法
  • 查找問題中的蠻力法

    順序查找

    按照順序進行查找,一般可以對算法進行適當優化,如設置哨兵等,能夠改進時間性能,但只能減少系數,而數量級不會改變。

  • 兩數之和 - 簡單 代碼
  • 劍指 Offer 53 - II. 0~n-1中缺失的數字 - 簡單 代碼
  • 串匹配問題

    串匹配定義:給定兩個串S=”s1s2s……n“和T=”t1t2t……m“,在主串S中查找子串T的過程稱為串匹配(也稱模式匹配),T稱為模式

    BF算法

    絕對的蠻力:從主串S的第一個字符開始和模式T的第一個字符進行比較,若相等,則繼續比較二者的后續字符;若不相等,則從主串S的第二個字符開始和模式T的第一個字符進行比較,重復上述過程,若T中的字符串全部比較完畢,則說明本趟匹配成功;若最后一輪匹配的其實位置是n-m,則主串S中剩下的字符不足夠匹配整個模式T,匹配失敗。

    KMP算法

    基本思想是:主串不進行回溯

    畫了一個簡圖,對于主串S和子串T,在叉號位置(即j)不一致了,此時T的子串1(abcd)和子串2(abcd)內容是一致的,將子串1的下一位(即星號所在位置k)移到叉號所在位置,就可以繼續進行比較。這個思路是不是就可以快速提高匹配效率。

    所以這個算法需要先計算出不匹配字符前面的字符串,即是真前綴又是真后綴的最長子串。將這個子串長度加一便是當前字符不匹配時,需要右移的到T的字符的位置。我們將這個值記錄到next數組中。

    next[j]的值意味著當j不匹配的時候,從T的第k個字符進行比較。

    計算next[j]的方法:假設next[j]的值是k

  • 如果t[k]=t[j],那么next[j+1]=k+1
  • 如果t[k]≠t[j],則需要查看t[next[k]]是否等于t[j],如果相等,則next[j+1]=next[k]+1,否則繼續往前追溯。這么做的原因是next里是算的真前綴和真后綴,所以t[j]必然是要參加比較的,而真前綴已經在前面的字符串里計算好了,直接使用即可。
  • 所以最終算法思路為,先計算T的next,然后將S和T進行比較,當在T的位置j不一致的時候,將T滑到next[j]的位置,繼續比較。

  • 686. 重復疊加字符串匹配 - 簡單 代碼
  • 排序問題中的蠻力法

    選擇排序

    掃描整個序列,找到整個序列的最小記錄和序列中的第一個記錄交換,從而將最小記錄放到它在有序區的最終位置上,然后再從第二個記錄開始掃描序列,重復這個過程。

  • 912. 排序數組- 中等 代碼
  • 起泡排序

    起泡排序開始的時候掃描整個序列,扎起掃描過程中兩兩比較相鄰記錄,如果反序則交換,最終,最大記錄就被沉到了序列的最后一個位置,第二趟掃描將第二大記錄沉到了導數第二個位置,重復操作,知道n-1趟掃描后,整個序列就排序好了。

    起泡排序有優化方案

    • 如果沒有交換,說明排序已經完成,無需繼續排序
    • 如果在某個位置之后,再也沒有交換,說明在該位置之后都是排序好的,該位置之后無需繼續排序
  • 劍指 Offer 21. 調整數組順序使奇數位于偶數前面 - 中等 代碼 代碼正確,但是超時了,這個算法就是慢
  • 組合問題中的蠻力法

    生成排列對象

    蠻力法生成{1,2,……,n}的n!排列。假設已經生成了(n-1)!個排列,可以把n插入到n-1個元素的每一種排列中的n個位置中去,來得到問題規模為n的所有排列。

  • 46. 全排列 - 中等 代碼
  • 生成子集

    n個元素的集合A={a1,a2,……,an}的所有2n的自己和長度為n的所有2n的比特串之間的一一對應關系

    核心就在于這個一一對應關系,比特串里的0與1代表集合中的單個元素存在與不存在。

  • 78. 子集 - 中等 代碼
  • 0/1背包問題

    0/1背包問題是給定n個重量為{w1,w2,……,wn}、價值{v1,v2,……,vn}的物品和一個容量為C的背包,求這些物品中的一個最有價值的子集,并且要能夠裝到背包中。

    這個問題使用蠻力法的話,就是計算出所有物品的子集,一個一個計算,看哪個價值最高。需要用到上面生成子集的方案。

    這個就不做題了,一是因為主要功能在生成子集里已經做了,二是在樂扣里沒有找到合適的題目,大家如果知道合適的題目可以推薦一下。

    任務分配問題

    假設有n個人物需要分配給n個人執行,每個任務只分配給一個人,每個人只分配一個任務,且第j個任務分配給第i個人的成本是C[i,j](1<=i,j<=n),任務分配問題要求找出總成本最小的分配方案。

    這個問題使用蠻力法的話,就是生成所有任務的全排列,總數為n!,然后一個一個計算哪個價值最高,需要用到上面生成排列對象的方案。

    這個同樣也不做題了,原因和0/1背包問題一樣,核心邏輯在生成排列對象里完成了。總體而言,蠻力法解決組合問題,除非問題規模非常小,否則蠻力法幾乎不實用。

    圖問題中的蠻力法

    哈密頓回路問題

    注明愛爾蘭數學家哈密頓提出注明的周游世界問題,他用正十二面體的20個訂單代表20個城市,要求從一個城市出發,經過每個城市恰好一次,然后回到出發城市。

    用蠻力法解哈密頓回路問題

  • 計算所有頂點的全排列,共有n!個
  • 每個排列需要滿足兩個條件
    • 相鄰頂點有存在邊
    • 第一個頂點和最后一個頂點存在邊
  • 這個不做題了,核心還是求全排列,然后判斷是否有邊。真用蠻力法做,想想肯定得超時。

  • 面試題 04.01. 節點間通路 - 中等
  • TSP問題

    TSP問題是指旅行家要旅行n個城市然后回到出發城市,要求各個城市經歷且僅經歷一次,要求所走的路程最短。

    這個問題和哈密頓回路的區別是加了路程最短的要求。

    用蠻力法解TSP問題

  • 計算所有頂點的全排列,共有(n-1)!個,這些排列中有一半是路徑完全相反,所以可能的解縮減到(n-1)!/2個
  • 遍歷這些排列,并計算路程,選擇路程最短的即可
  • 這個也不做了,核心還是求全排列,必然超時

  • LCP 16. 游樂園的游覽計劃 - 困難
  • 幾何問題中的蠻力法

    最近對問題

    最近對問題要求找出一個包含n個點的幾何中距離最近的兩個點。

    蠻力法求解最近對問題的過程是:分別計算每一對點之間的距離,然后找出距離最小的那一對,為了避免對同一對點計算兩次距離,只考慮i<j的哪些點對(Pi,Pj)。

  • 1512. 好數對的數目 - 簡單 代碼
  • 凸包問題

    凸集合:對于平面上的一個點的有限幾何,如果以集合中任意兩點P和Q為端點的線段上的點都屬于該集合,則稱該集合為凸集合。

    凸包:一個點集S的凸包是包含S的最小凸集合,其中,最小是指S的凸包一定是所有包含S的凸集合的子集。

    凸包人話版:凸包就是你畫了一個封閉的范圍,這個范圍包含了集合中所有的點。最小凸包就是利用集合S上的點構建封閉范圍,里面包含集合所有點

    使用蠻力法計算凸包:對于一個由n個點構成的集合S中的兩個點Pi和Pj,當且僅當該集合中的其他點都位于穿過這兩點的直線的同一邊時(假設不存在三點同線的情況),他們的連線是該集合凸包邊界的一部分。對每一對點都檢驗一遍后,滿足條件的線段構成了該凸包的邊界。這套方案時間復雜度O(n^3)。

    這個就不做了,做法和最近對問題差不多,主要區別是找到對后,需要和剩余的其他點再做一次運算。而且樂扣里沒有發現相關的題目。

    總結

    看了這么多類型的題后,感覺蠻力法對有些問題還是有用的,對有些問題規模較小也還是有些用處的,對規模較大的問題,就完全沒有辦法了。

    這里面的類型比較重要的有

    查找問題:順序查找,KMP

    排序問題:選擇排序、起泡排序。這兩個方法效率都不好,今后可以使用更高效的排序算法。但這兩種方法也提供了很不錯的思想。

    組合問題:生成排序對象生成子集。這兩個方法一個時間復雜度O(n!),一個為O(2^n),雖然效率不行,但是這是很多其他問題的基礎,如圖問題、0/1背包問題,任務分配問題等

    幾何問題:最近對問題、凸包問題,整體思路比較簡單,兩重循環可以解決。

    這些里面,尤其是KMP、生成排序對象、生成子集,有時間可以自己動手寫一下,還是有一定難度的。

    最后

    大家如果喜歡我的文章,可以關注我的公眾號(程序員麻辣燙)

    往期文章回顧:

    算法

  • 算法學習計劃
  • 蠻力法
  • 技術

  • 淺談微服務
  • TCP性能優化
  • 限流實現1
  • Redis實現分布式鎖
  • Golang源碼BUG追查
  • 事務原子性、一致性、持久性的實現原理
  • CDN請求過程詳解
  • 記博客服務被壓垮的歷程
  • 常用緩存技巧
  • 如何高效對接第三方支付
  • Gin框架簡潔版
  • InnoDB鎖與事務簡析
  • 讀書筆記

  • 敏捷革命
  • 如何鍛煉自己的記憶力
  • 簡單的邏輯學-讀后感
  • 熱風-讀后感
  • 論語-讀后感
  • 思考

  • 對項目管理的一些看法
  • 對產品經理的一些思考
  • 關于程序員職業發展的思考
  • 關于代碼review的思考
  • Markdown編輯器推薦-typora
  • 總結

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

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