1. 程式人生 > >遞迴式求解-主方法

遞迴式求解-主方法

http://pytlab.org/2017/09/10/%E9%80%92%E5%BD%92%E5%BC%8F%E6%B1%82%E8%A7%A3-%E4%B8%BB%E6%96%B9%E6%B3%95/

本文對遞迴式求解中很重要的主方法進行介紹總結。

主方法

主方法為如下形式的遞迴式提供了一種”菜譜式”的求解方法:

T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n)
其中 a1,b>1 a≥1,b>1是常數, f(n) f(n)是漸進正數。

上式描述了這樣的一個演算法執行時間: 他將原問題的規模為 n

n的問題劃分為 a a個小的子問題,每個子問題的規模為原來的 1b 1b a a個子問題遞迴的進行求解,每個花費時間為 T(n/b) T(n/b)。子問題合併的代價為 f(n) f(n)

主定理

這裡我將書上的定義直接貼上來了。

主方法依賴主定理:

a1 a≥1 b>1 b>1是常數, f(n) f(n)是一個函式, T(n)

T(n)是定義在非負整數上的遞迴式:

T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n)
其中我們將忽略舍入問題 n/b n/b解釋為 n/b ⌊n/b⌋ n/b ⌈n/b⌉, 那麼 T(n) T(n)有如下漸進界:

  1. 若對某個常數 ϵ>0 ϵ>0 f(n)=O(nlogbaϵ) f(n)=O(nlogb⁡a−ϵ) T(n)=Θ(nlog
    b
    a
    )
    T(n)=Θ(nlogb⁡a)
  2. f(n)=Θ(nlogba) f(n)=Θ(nlogb⁡a), 則 T(n)=Θ(n

    相關推薦

    求解-方法

    http://pytlab.org/2017/09/10/%E9%80%92%E5%BD%92%E5%BC%8F%E6%B1%82%E8%A7%A3-%E4%B8%BB%E6%96%B9%E6%B3%95/ 本文對遞迴式求解中很重要的主方法進行介紹總結。 主方法 主方法為如下

    [演算法導論] 求解的三種方法

           求解遞迴式,《演算法導論》上給出了三種方法,不過對我而言,遞迴樹法和主方法往往更加有效。給出的建議是,先用主方法求解,如果不能使用的情況嘗試用遞迴樹求解,如果還不行只有用代入法。代入法作為一種求解+證明的方法需要我們猜測解的形式,比較麻煩。 (一)代換法:  

    演算法導論 第四章: 筆記(代換法、方法方法定理的證明)

    三種解遞迴式的方法:代換法、遞迴樹方法、主方法。 代換法: 用代換法解遞迴式需要兩個步驟: 猜測解的形式; 用數學歸納法找出使解真正有效的常數。 如: T(n) = 2T(n/2) + n,這個是合併排序的執行時間的遞迴表示式。歸併排序法的執行時間是O(nlgn),那麼我

    C# 快速排序演算法

    1 static void Main(string[] args) 2 { 3 4 Console.WriteLine("************快速排序*****************"); 5 int[] lis

    資料結構——求解最大值和最小值

    【遞迴法求解最大值和最小值】 問題描述:若一個無序的線性表A[MaxSize]採用順序儲存方式,元素型別為整型數。試寫出遞迴演算法求出A中的最大元素和最小元素。 要求: 順序表的資料通過呼叫演算法initRandomize()隨機產生。 #include <stdio.h>

    動態規劃比快-LeetCode91-解碼方法

    題目 一條包含字母 A-Z 的訊息通過以下方式進行了編碼: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 給定一個只包含數字的非空字串,請計算解碼方法的總數。 示例 1: 輸入: "12" 輸出: 2 解釋: 它可以解碼為 "AB"(1 2)或者 "L

    一種計算的高效方法

    2013-03-05 周海漢/文 http://abloz.com 遞迴計算,有時能非常直觀的解決問題,但是非常耗資源,計算很慢,還可能導致堆疊耗盡,計算失敗。所以很多時候具體實現時不提倡採用遞迴,而是將遞迴轉為迴圈的方式來實現

    求解演算法的時間複雜度

      遞迴演算法時間複雜度的計算方程式一個遞迴方程:      在引入遞迴樹之前可以考慮一個例子:   T(n) = 2T(n/2) + n2   迭代2次可以得:   T(n) = n2 + 2(2T(n/4) + (n/2) 2)   還可以繼續迭代,將其完全

    Lua歸併排序

    -- region TestLua.lua -- 2019.1.2 m_TempTuple = { } --- <summary> --- Merge(tuple, leftIndex, rightIndex, midIndex, tempTuple) --- merge all e

    演算法求解問題-------階乘和的問題

    package Auto測試; /* * 題目:求1+2!+3!+...+20!的和 */ public class AutoTest { public static void main(String[] args) { //題目為求前20項的階乘和 int num = 20;

    演算法求解的小問題-------題目:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前20項之和。

    package Auto測試; /* * 題目:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前20項之和。 */ public class AutoTest { public static void main(String[] args){

    分解的一些方法 和 回溯 筆記

    分解方法: 1 當前處理第一個或最後一個,對其餘的遞迴 2 一分為二,對兩邊做遞迴 3 在一系列選擇中做一個選擇,對更新的狀態做遞迴 回溯問題: 1 Design recursion function to return success/failure 2 At each

    求解十進位制轉換成二進位制

    #include <iostream> using namespace std; void decimalToBinary(int number) { if (number =

    利用paramiko、tkinter、os等模組實現遠端連線sftp,並進行資料夾的定時傳輸

    from tkinter import * 製作GUI介面 import paramiko 用來遠端 import time from tqdm import tqdm 用來顯示程序 import os import thread

    求第n個斐波那契數(分別用和非兩種方法求解

    斐波那契數列指的是這樣一個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55……這個數列從第3項開始,每一項都等於前兩項之和。 這裡分別用遞迴和非遞迴的方法實現: 遞迴 #define _CRT_SECURE_NO_WARNINGS 1 #include&l

    藍橋杯 Java 搭積木規則問題 使用方法求解

    ** 搭積木規則: ** 每個積木放到其它兩個積木的上面,並且一定比下面的兩個積木數字小。 最後搭成4層的金字塔形,必須用完所有的積木。 下面是兩種合格的搭法: 0 1 2 3 4 5 6 7 8 9 0 3 1 7 5 2 9 8 6 4 請你計算這樣的搭法一

    合數的因式分解(求解,兩種方法

    #include <stdio.h> #include <math.h> //判斷一個數是不是素數 int isPrime(int n) {     if(n<2)return 0 ;else{int t = (int)sqrt(n);int

    方法求解猴子吃桃問題

    Input N Output 桃子總數 #include <STDIO.H> int fun(int n) { if(n==1) return 1; else { return 2 * ( fun(n-1)+1 ); } } int main(vo

    C語言用方法求解階乘

    一般我們求解階乘用的時迭代的方法,即使用迴圈語句來實現功能,這次我們用的是遞迴的方法: long int Factral( long int N ){ if( N > 1 ){ retur

    演算法複雜度分析-方法

    主方法        主方法是一個演算法複雜度分析的一個很好的方法,但是隻能用於特定的遞迴上,適合的遞迴形式為: T(n) = a*T(n/b)+f(n)        其中,a >=1 ; b >1 ; f(n) : 非遞迴函式,f(n)漸進趨正,漸