1. 程式人生 > >演算法之漢諾塔時間複雜度計算

演算法之漢諾塔時間複雜度計算

 a, b, c3個塔座:開始時,塔座a上有n個自上而下、由小到大地疊在一起圓盤,各圓盤從小到大編號為1, 2, , n,現要求將塔座a上的這一疊圓盤移到塔座b上,並仍按同樣順序疊置,移動圓盤時遵守以下移動規則:

 規則1:每次只能移動1個圓盤;

 規則2:不允許將較大的圓盤壓在較小的圓盤之上;

 規則3:在滿足移動規則12的前提下,可將圓盤移至a, b, c中任一塔座上。

 演算法設計思路

由於移動規則為大的在下,下的在上,所以可以採用捆綁的思想來移動圓盤。具體是:起始塔座為a,目標塔座是b,所以首先借助b塔座,把前面n-1個圓盤移動到c塔座,剩下第n個圓盤則移動b塔座,最後再借助a塔座,把n-1

個圓盤移動到b塔座上。

 演算法實現的虛擬碼

說明functionA自定義的函式名,input 1, input 2, …, input nfunctionA輸入形參;在輸入中描述各輸入形參的含義;在輸出中描述functionA的輸出或作用效果;在S1Sk採用虛擬碼描述語言簡要表達functionA的核心步驟。

演算法functionA(input 1, input 2, …, input n)

輸入:起始塔座a,目標塔座b,中介塔座c,以及圓盤的個數。

輸出:圓盤實現從a塔座到塔座b的具體路徑。

S1:'A'a; 'B'b'C'c; nn

S2:void han(a,b,c,n)

S3:if n=1 then move(a,b)

S4:else then han(a,b,c,n-1)

S5:move(a,b)

S6:han(c,a,b,n-1)

 實現程式碼

說明貼上functionAJava或C++實現程式碼即可對演算法實現的關鍵語句進行註釋

public void han(char a,char c,char b,int n){

if(n==1){//邊界條件

move(a,b);//n=1時,直接移到目標塔座即可。

}

else{

han(a,b,c,n-1);//採用捆綁的方法,把上面n-1個圓盤從a塔移動到c

move(a,b);//把剩下的最後一個圓盤移動到

b塔座

han(c,a,b,n-1);//採用捆綁法,把c塔座上的n-1個圓盤移到b塔座

}

}

 演算法執行結果計算時間複雜度分析

說明通過計算迭代次數、基本運算語句的頻度,或利用遞推關係估算functionA的計算時間複雜度,要求給出具體的演算法分析思路與過程,不能僅列出一個結果

 

具體運算過程:

由遞推可算出:

    T(n)=2T(n-1)+1;

    T(n-1)=2T(n-2)+1;

         .....

    T(2)=2T(1)+1;

根據觀察可以發現,右邊式子中的T函式與下一式左邊的式子存在著2倍的關係,所以每個式子兩邊同時乘以2^(n-1),得:

    T(n)=2T(n-1)+1;

    2*T(n-1)=2*2T(n-2)+2*1;

         .....

    2^(n-1)*T(2)=2^(n-1)*2T(1)+2^(n-1)*1;

所有式子相加,可得:

   T(n)=2^(n-1)*2T(1)+1*(1+2+2^2+……+2^(n-1))

       =2^n+2^n-1

       =2^(n+1)-1

所以O(n)=O(T(n))=O(O(1)+O(2^(n+1)-1))=O(2^(n+1)+1-1)=O(2^(n+1))=O(2^n).

執行結果:

 

 該文為原創,有什麼錯誤的地方,可以在評論區留言。

相關推薦

演算法時間複雜計算

 設a, b, c是3個塔座:開始時,塔座a上有n個自上而下、由小到大地疊在一起圓盤,各圓盤從小到大編號為1, 2, …, n,現要求將塔座a上的這一疊圓盤移到塔座b上,並仍按同樣順序疊置,移動圓盤時遵守以下移動規則: 規則1:每次只能移動1個圓盤; 規則2:不允許將較大的圓

演算法

演算法的概念 計算過程,解決問題的方法 Niklaus Wirth: '程式=資料結構+演算法' 時間複雜度 看下面四組程式碼時間執行最短的是哪個? print('hello world') O(1) for i in range(n): O(n) print('hello

排序演算法 歸併排序 及其時間複雜和空間複雜

        在排序演算法中快速排序的效率是非常高的,但是還有種排序演算法的效率可以與之媲美,那就是歸併排序;歸併排序和快速排序有那麼點異曲同工之妙,快速排序:是先把陣列粗略的排序成兩個子陣列,然後遞迴再粗略分兩個子陣列,直到子數組裡面只有一個元素,那麼就自然排好序了,可

排序演算法 基數排序 及其時間複雜和空間複雜

        基數排序(radix sort)屬於“分配式排序”(distribution sort),又稱“桶子法”(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用,基數排序法是屬於穩定

排序演算法 選擇排序 及其時間複雜和空間複雜

        選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法(比如序列[5, 5, 3]第一次就將第

排序演算法 氣泡排序 及其時間複雜和空間複雜

        氣泡排序(Bubble Sort),是一種電腦科學領域的較簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因

排序演算法 堆排序 及其時間複雜和空間複雜

        堆排序是由1991年的計算機先驅獎獲得者、斯坦福大學計算機科學系教授羅伯特.弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同發明了的一種排序演算法( Heap Sort );         堆排序(Heapsort

排序演算法 快速排序 及其時間複雜和空間複雜

原文:http://blog.csdn.net/yuzhihui_no1/article/details/44198701 總結: 最好的情況是樞紐元選取得當,每次都能均勻的劃分序列。 時間複雜度O(nlogn)最壞情況是樞紐元為最大或者最小數字,那麼所有數都劃分到一個序

排序演算法 計數排序 及其時間複雜和空間複雜

       計數排序是一個非基於比較的排序演算法,該演算法於1954年由 Harold H. Seward 提出。它的優勢在於在對一定範圍內的整數排序時,它的複雜度為Ο(n+k)(其中k是整數的範圍),快於任何比較排序演算法。 演算法分析         主要思想:根據

資料結構與演算法--蠻力法氣泡排序與時間複雜分析(java)

蠻力法         蠻力法又稱窮舉法和列舉法,是一種簡單直接地解決問題的方法,常常直接基於問題的描述,所以蠻力法也是最容易應用的方法。但是蠻力法所設計的演算法時間特性往往是比較低的,典型的指數時間演算法一般都是通過蠻力

《資料結構和演算法

一,問題描述:        法國數學家愛德華·盧卡斯曾編寫過一個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總

腳本進擊tatatata……

linux操作環境依舊是centos7與centos6。阿拉的腳本都是放在7上了,6裏的通用性大概有0.5%左右的誤差,錯誤和可完善之處盡請指正。請忽略中二的標題>_<。嘛,某種意義上,這個標題還算貼切。因為這個問題咋一看到就是會給人一種頭大的感覺,踏踏踏踏踏,塔塔塔塔塔塔……哦急死尅。先看過題目

遞歸

pos class 輸入 能力 else print adding -c 必須 遞歸的定義:一個函數自己直接或間接調用自己(一個函數調用另外一個函數和他調用自己是一模一樣的,都是那三步,只不過在人看來有點詭異。)遞歸滿足的三個條件:1、遞歸必須得有一個明確的終止條件2、該函

Python函數遞歸

info int code 大小 只需要 重新 個數 p s tar 漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子, 在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重

遞歸算法

遞歸算法 println top 出口 rom 一個 解決問題 ati 表示 遞歸定義: 遞歸算法是把問題轉化為規模縮小了的同類問題的子問題。然後 遞歸調用函數(或過程)來表示問題的解。 一個過程(或函數)直接或間接調用自己本身,這種過程(或函數)叫遞歸過程(或函數). 遞

資料結構與演算法美專欄學習筆記-複雜分析

複雜度分析 什麼是複雜度分析 資料結構和演算法解決是“如何讓計算機更快時間、更省空間的解決問題”。 因此需從執行時間和佔用空間兩個維度來評估資料結構和演算法的效能。 分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。 複雜度描述的是演算法執行時間(或佔用空間)與資料規模的增長關係

遞迴演算法處理

package com.cn.ygm.hanoiTower; public class HanoiTower { /** * 移動盤子 * topN:移動的盤子數 * from:起始塔座 * inter:中間塔座 * to:目標塔座

資料結構與演算法美 課程筆記二 複雜分析(上)

資料結構和演算法本身解決的是“快”和“省”的問題,即如何讓程式碼執行得更快,如何讓程式碼更省空間。所以,執行效率是演算法一個非常重要的考量指標。衡量演算法的執行效率最常用的就是時間和空間複雜度分析。 一、為什麼需要複雜度分析? 把程式碼跑一遍,通過統計、監控來得到演算法執行的時間和佔用的記憶

java遞迴問題

原始碼的github地址,可以下載到本地執行 package stack.demo; /** * 漢諾塔問題: * 假設有三根柱子,x y z * x上有3個圓盤,從底部開始從大到小編號為n 到 1 * 若每次只能移動一個圓盤,且大圓盤不能在小圓盤上面 * 現在需要將3個

演算法問題 Hanoi Tower

題目內容    漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大