亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

算法詳解之分治法具體實現

2020-01-26 15:36:45
字體:
來源:轉載
供稿:網友

分治算法的基本思想是將一個規模為N的問題分解為K個規模較小的子問題,這些子問題相互獨立且與原問題性質相同。求出子問題的解,就可得到原問題的解。

分治法解題的一般步驟:

(1)分解,將要解決的問題劃分成若干規模較小的同類問題;

(2)求解,當子問題劃分得足夠小時,用較簡單的方法解決;

(3)合并,按原問題的要求,將子問題的解逐層合并構成原問題的解。

一言以蔽之:分治法的設計思想是,將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。

在認識分治之前很有必要先了解一下遞歸,當然,遞歸也是最基本的編程問題,一般接觸過編程的人都會對遞歸有一些認識.為什么要先了解遞歸呢?你看,根據上面所說的,我們就要將一個問題分成若干個小問題,然后一一求解并且最后合并,這就是一個遞歸的問題,遞歸的去分解自身,遞歸的去解決每一個小問題,然后合并…

關于遞歸,這里舉一個最簡單的例子,求N!;

我們只需要定義函數

復制代碼 代碼如下:

int calculate(int n)

{

if(n==1)

return 1;

else

  return n*calculate(n-1);   //調用自身…

}

好了,有了遞歸的鋪墊,我們下來來看一看一個分治算法的問題,歸并排序問題…

基本思想:

將待排序元素分成大小大致相同的2個子集合(遞歸直到最小的排序單元),分別對2個子集合進行排序,最終將排好序的子集合合并成為所要求的排好序的集合。

下面我們用一張圖來展示整個流程,最下面的(姑且叫他第一層)是原始數組分成了8個最小排序問題,各自只有一個元素,故不需要排序,大家可以看到,我們通過分而治之的思想把對最初數組的排序分為了若干個只有一個元素的小數組的排序,然后第二層,我們進行了合并,將每兩個最小排序結果合并為有兩個元素的數組,然后逐層往上進行合并,就有了最后的結果…

下面我們來看一下這個算法的具體實現,下面的MERGE-SORT (A, p, r)表示對數組A[p->r]的排序過程.其中p->r代表從p到r.

MERGE-SORT (A, p, r)

1.     IF p < r                                                    // 進行A[p->r]的排序過程自然需要p<r的前提條件

2.         THEN q = [(p + r)/2]                           // 將當前的排序問題一分為二,分別進行處理

3.                 MERGE-SORT (A, p, q)                //繼續遞歸看能不能將問題繼續一分為二,處理A[p->q]的排序

4.                 MERGE-SORT (A, q + 1, r)          // 繼續遞歸看能不能將問題繼續一分為二處理A[q+1->r]的排序

5.                 MERGE (A, p, q, r)                       // 合并當前結果

到這里,分治算法的精髓已經出來了,我們通過遞歸將問題進行分解到足夠小…繼而進行結果計算…然后再將結果合并.

下面來處理一下邊角料的工作,呵呵,讓大家看到一個完整的歸并排序的例子,整個算法總結系列我都沒有很好的使用偽代碼,而是使用我認為廣泛使用的C語言代碼來進行代碼詮釋.實際上,描述算法最好還是使用偽代碼比較好,這里我對我前面的四篇文章沒有使用偽代碼而小小的鄙視一下自己,太不專業了..呵呵

以下算法MERGE (A, p, q, r )表示合并A[p->q]和A[q+1->r]這兩個已經排序好的數組

MERGE (A, p, q, r )

1.      n1 ← q − p + 1                                                          //計算A[p->q]的長度
2.      n2 ← r − q                                                                //計算A[q+1->r]的長度
3.      Create arrays L[1 . . n1 + 1] and R[1 . . n2 + 1]       //創建兩個數組
4.      FOR i ← 1 TO n1
5.            DO L[i] ← A[p + i − 1]
6.      FOR j ← 1 TO n2
7.            DO R[j] ← A[q + j ]        //4-7行是將原數組中A[p->r]的元素取出到新創建的數組,我們的操作是基于臨時數組的操作
8.      L[n1 + 1] ← ∞
9.      R[n2 + 1] ← ∞                   //8-9行設置界限..
10.    i ← 1
11.    j ← 1
12.    FOR k ← p TO r
13.         DO IF L[i ] ≤ R[ j]
14.                THEN A[k] ← L[i]
15.                        i ← i + 1
16.                ELSE A[k] ← R[j]
17.                        j ← j + 1                //12-17行進行排序合

這里我還是提供一個具體的實現,請見下面的代碼

C語言代碼

關于代碼注釋,請見博客上面的偽代碼注釋..

復制代碼 代碼如下:

#include<stdio.h>
int L[100],R[100];
void merge(int numbers[],int left, int mid, int right)
        {
            int n1=mid-left+1;
            int n2=right-mid;
            int i,j,k;
            for(i=1;i<=n1;i++)
             L[i]=numbers[left+i-1];
            for( j=1;j<=n2;j++)
             R[j]=numbers[mid+j];
            L[n1+1]=99999;
            R[n2+1]=99999;

            i=1;
            j=1;

            for(k=left;k<=right;k++)
            if(L[i]<=R[j])
               {
                   numbers[k]=L[i];
                   i++;
                   }
                 else
                  {
                       numbers[k]=R[j];
                       j++;
                  }
        }


void mergeSort(int numbers[],int left, int right)


{
    if(left<right)
    {
                int mid;
            mid = (right + left) / 2;
            mergeSort(numbers, left, mid);
            mergeSort(numbers, mid+1, right);
            merge(numbers,left, mid, right);
        }


}


int main()
{
    int numbers[]={5,2,4,6,1,3,2,6};
    mergeSort(numbers,0,7);
    for(int i=0;i<8;i++)
    printf("%d",numbers[i]);
    }


歸并排序算法的時間復雜度是O(nlogn),對于冒泡排序的O(n*n),效率還有有比較好的提高..

其實本人原來在學習的時候好長一段時間不理解為什么時間復雜度會是O(nlogn),像冒泡排序就比較好理解,有兩個for循環,問題的規模隨著n變大而變大,算法時間復雜度自然就是O(n*n),后面花了一些時間來閱讀一些資料才明白其原理,這里我已經將資料地址放到了本文最后,有興趣的也可以去看看.簡單的描述一下為什么會是O(nlogn)

大家看看,我們的例子,解一個8個元素的數組,我們用到了幾層?是四層,假設我們這里有n個元素,我們會用到多少層?根據一定的歸納總結,我們知道我們會用到(lgn)+1層..(lgn)+1層需要用到lgn層次的合并算法.現在再看看MERGE (A, p, q, r )的復雜度是多少,毫無疑問O(n),故其歸并排序的算法時間復雜度是O(nlogn).當然這個結果還可以通過其他的方法計算出來,我這里是口語話最簡潔的一種..

下面來一張算法時間復雜度的與n規模的關系圖..

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美裸体xxxx| 国产啪精品视频| 亚洲第一二三四五区| 国内精品美女av在线播放| 久久久精品2019中文字幕神马| 欧美日韩一区二区精品| 亚洲国产成人久久综合| 欧美大片免费看| 色老头一区二区三区| 成人午夜在线观看| 日韩中文字幕在线观看| 狠狠做深爱婷婷久久综合一区| 亚洲va码欧洲m码| 91精品国产精品| 亚洲美女福利视频网站| 91九色国产社区在线观看| 国产精品日日摸夜夜添夜夜av| 欧美理论片在线观看| 亚洲天堂av在线免费| www.午夜精品| 亚洲精品国产精品国自产观看浪潮| 亚洲va男人天堂| 日韩欧美aaa| www国产精品com| 国产精品扒开腿做| 中文一区二区视频| 国产午夜精品一区理论片飘花| 欧美日韩一区二区免费在线观看| 久久99久久99精品免观看粉嫩| 97国产真实伦对白精彩视频8| 国产精品一区二区三区久久久| 国产精品久久久久免费a∨大胸| 欧美裸体男粗大视频在线观看| 日av在线播放中文不卡| 日韩美女中文字幕| 国产精品欧美一区二区三区奶水| 日韩欧美亚洲国产一区| 国产精品揄拍一区二区| 日韩在线视频一区| 成人在线中文字幕| 亚洲第一av网| 国模精品系列视频| 欧美亚洲成人精品| 久久精品国产欧美亚洲人人爽| 国产不卡视频在线| 免费成人高清视频| 久久天天躁狠狠躁夜夜躁| 91夜夜揉人人捏人人添红杏| 亚洲天堂av综合网| 久久精品国产91精品亚洲| 国产福利视频一区二区| 国产一区二区日韩精品欧美精品| 国产极品jizzhd欧美| 日本免费久久高清视频| 国产精品日韩精品| 97国产一区二区精品久久呦| 日韩美女av在线| 国产亚洲精品久久久| 国产欧美日韩亚洲精品| 久久精品国产亚洲精品| 欧美一区在线直播| 影音先锋日韩有码| 久久久久久久久久久久久久久久久久av| 欧美—级高清免费播放| 欧美久久精品午夜青青大伊人| 欧美午夜性色大片在线观看| 亚洲精品永久免费精品| 亚洲91精品在线观看| 欧美高清视频免费观看| 欧美成人精品在线播放| 亚洲国产成人精品电影| 久久久精品国产| 日韩精品极品在线观看播放免费视频| 国产日韩欧美视频在线| 欧美日韩美女在线| 最近2019中文字幕大全第二页| 日韩黄色av网站| 久久精品最新地址| 亚洲精品国产品国语在线| 久久久久久国产精品三级玉女聊斋| 久热精品视频在线免费观看| 成人免费视频在线观看超级碰| 精品亚洲aⅴ在线观看| 成人免费看黄网站| 97精品视频在线观看| 一区二区三区视频在线| 午夜精品久久久久久久久久久久久| 国产精品人成电影在线观看| 欧美在线视频在线播放完整版免费观看| 成人国产精品av| 国产精品网红福利| 91精品国产91| 亚洲国产欧美自拍| 中日韩美女免费视频网址在线观看| 欧美高清在线播放| 日韩在线免费视频观看| 亚洲欧美日韩在线一区| 中文字幕亚洲一区二区三区五十路| 日韩电影大片中文字幕| 日韩一区二区精品视频| 国内成人精品视频| 国产高清在线不卡| 国产精品久久久久久亚洲调教| 9.1国产丝袜在线观看| 亚洲另类图片色| 国产福利成人在线| 国内揄拍国内精品| 欧美日韩午夜激情| 成人福利视频在线观看| 久久久久久一区二区三区| 一区二区三区国产视频| 少妇高潮久久77777| 91精品视频网站| 九色精品免费永久在线| 国产欧美va欧美va香蕉在线| 亚洲女人天堂视频| 日韩中文有码在线视频| 55夜色66夜色国产精品视频| 97超碰国产精品女人人人爽| 日韩欧美在线第一页| 午夜剧场成人观在线视频免费观看| 亚洲va欧美va在线观看| 久久久久久久国产精品| 中文字幕综合在线| 亚洲欧美国产精品久久久久久久| 55夜色66夜色国产精品视频| 91日本在线观看| 黄色成人在线播放| 欧洲成人免费aa| 日本一区二区在线免费播放| 国产精品免费久久久久影院| 91精品国产色综合久久不卡98| 97av在线视频免费播放| 久久久久久国产精品美女| 91免费的视频在线播放| 亚洲国产天堂网精品网站| 成人中文字幕+乱码+中文字幕| 国产成人精品优优av| 午夜精品久久久99热福利| 伊人精品在线观看| 久久久久久久久久久网站| 日本成人免费在线| 亚洲国产欧美一区二区三区同亚洲| 亚洲区中文字幕| 亚洲男女自偷自拍图片另类| 一区二区在线视频| 欧美日韩一区二区免费在线观看| 亚洲一区二区三区777| 97久久伊人激情网| 懂色aⅴ精品一区二区三区蜜月| 国产精品扒开腿做爽爽爽的视频| 亚洲最大成人网色| 91精品国产自产91精品| 国产精品日日做人人爱| 国产日本欧美一区二区三区在线| 欧美精品免费在线| 51视频国产精品一区二区| 国产成人综合久久| 2021久久精品国产99国产精品| 亚洲欧美日韩中文在线| 国产成人激情视频| 亚洲国产精品久久精品怡红院| 亚洲精品网址在线观看| 色中色综合影院手机版在线观看|