黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

算法分析之分治法學(xué)習(xí)總結(jié)(一)

系統(tǒng) 1899 0

算法分析之分治法學(xué)習(xí)總結(jié)(一)
一)解決問題的類型:當(dāng)我們要解決一個(gè)輸入規(guī)模(n)很大的問題時(shí),直接處理往往比較困難或者根本無法
求解,我們希望把輸入規(guī)模縮小,即分成很多份,分別解決了,并且這些小問題容易合起來從而解決整個(gè)問
題。
二)解題關(guān)鍵:
1)如何分:我們往往先把輸入分成兩個(gè)與原來相同的子問題,如果規(guī)模還太大,我們
對(duì)這些子問題再做上述處理,直到這些子問題容易解決為止.
2)合并子問題:往往分治法的難點(diǎn)在于分完之后怎么合并.合并策略決定了算法的優(yōu)劣,合并問題根據(jù)具體問題而
定,沒有固定的方法
3)分治問題往往用到遞歸算法.
三)幾種類型的分治問題:
1)把問題分成字問題后,如果某個(gè)子問題解決了則整個(gè)問題也就解決了,無須合并.
典型事例:二分檢索問題(前提是一組按照關(guān)鍵碼排好順序?qū)ο?不妨設(shè)按升序排列)
二分檢索的解題思路是先看看中間那個(gè)數(shù),如果這個(gè)數(shù)是要查找的,那么ok,問題解決,否則如果比key大,那么
在前一半繼續(xù)上述過程,否則在后一半繼續(xù)上述過程,直到找到或者查找失敗.
程序代碼:(設(shè)為int型數(shù))
Java代碼
  1. void BinarySearch( int a[], int low, int high, int key)
  2. {
  3. if (low>=high) return ;
  4. int mid=(low+hight)/ 2 ;
  5. if (a[mid]==key) return mid;
  6. else if (a[mid]>key)
  7. return BinarySearch(a[],low,mid,key);
  8. else if (a[mid]<key)
  9. return BinarySearch(a[],mid,low,key);
  10. }

2)把問題分了之后,再經(jīng)過合并最終解決問題.
典型事例:歸并排序問題:
這個(gè)問題就象我們在一個(gè)很長的隊(duì),現(xiàn)在要按大小個(gè)排好,我們把這個(gè)隊(duì)分成兩個(gè)(如果還是太長,可以再分,
先看分成兩個(gè)的問題,這樣容易看清合并過程),我們把這兩隊(duì)分別排好,然后合成一隊(duì),合并的過程很簡單,就
是弄一個(gè)新的隊(duì),從那兩個(gè)個(gè)隊(duì)的排頭分別出列,比一下矮的站在第一個(gè)位置,高的在一邊等著,等另一個(gè)隊(duì)現(xiàn)
在的排頭出列,再比一下,矮的排在第二個(gè)位置,高的站在一邊,重復(fù)上述過程,直到有一個(gè)隊(duì)變空,然后把另一個(gè)
隊(duì)拉過來接在新隊(duì)的隊(duì)尾,這就排好了整個(gè)隊(duì)了.
歸并排序,就是把一組待排的關(guān)鍵值可比的東西,我們把他分成兩個(gè)小組,如果問題規(guī)模還不夠小,我們繼續(xù)
分,直到容易解決為止,然后把小的組排好續(xù),然后合并成一組.
算法過程:
Java代碼
  1. void mergeSort( int a[], int low, int high)
  2. {
  3. if (low>=high)
  4. return ;
  5. int mid=(low+high)/ 2 ;
  6. mergeSort(a,low,mid);
  7. mergeSort(a,mid+ 1 ,high);
  8. merge(a,low,mid,high);
  9. }
  10. void merge( int a[], int low, int mid, int high) //合并過程
  11. {
  12. int []b= new int [high-low+ 1 ];
  13. int i=low,j=mid+ 1 ,k= 0 ;
  14. while (i<=mid&&j<=high)
  15. {
  16. if (a[i]<a[j])
  17. {
  18. b[k++]=a[i];
  19. i++;
  20. }
  21. else
  22. {
  23. b[k++]=b[j];
  24. j++;
  25. }
  26. }
  27. if (i>mid)
  28. for ( int m=j;m<=high;m++)
  29. b[k++]=a[m];
  30. else
  31. for (m=i;m=mid;m++)
  32. b[k++]=a[m];
  33. for (m=low, int n= 0 ;m<=high;m++)
  34. {
  35. a[m]=b[n++]; //排好的元素再拷貝到a中
  36. }
  37. }

算法分析之分治法學(xué)習(xí)總結(jié)(一)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論