演算法問題基礎

2021-10-08 23:39:20 字數 1255 閱讀 6049

演算法的特性:輸入,輸出,確定性,能行性,有窮性。

如果去除有窮性稱計算方法。

遞迴方法:遞迴主要是通過系統棧來實現的,很多計算工作是重複的所以比較耗時。

#include

using namespace std;

long

fid(

int n)

intmain()

費不那切數列的遞迴形式

其實真的挺耗時的,遞迴這個東西真的很難說,很難想有點煩。

時間複雜度:表示演算法執行所需要的時間

漸進表示法:大o記號 表示有兩個非負函式,存在常數c>0且當n>n0時,滿足有f(n)<=cg(n),則記為f(n)=o(g(n))

大o標記可以表示增長階數都不超過g(n)的函式的集合,表示乙個演算法執行的上界,

定理1:執行次數如果是n^m

次方,那麼其漸進時間複雜度一定是o(n^3)

ω記號 若存在c和n0保證f(n)>=g(n),那麼記為f(n)=ω(g(n))

執行次數如果是n^m

次方,那麼其漸進時間複雜度一定是ω(n^3)

求演算法的時間下界,也是演算法的最優性問題的求解方法。

summer記號,對八七,我實在不知道那個記號怎麼讀

設非負函式f(n)和g(n),若存在常數c1>0,c2>0和n0,使得當n>=n0時,有c1g(n)<=f(n)<=c2g(n)

則成為f(n)=xxg(n)

執行次數如果是n^m

次方,那麼其漸進時間複雜度一定是x(n^3)

小o記號

f(n)=o(g(n))當且僅當f(n)=o(g(n)),且f(n)!=ω(g(n))

計算遞推式的三種方法:迭代法,替代方法(就是假設證明方法),主方法。

主方法:通常用於解決t(n)=at(n/b)+f(n)的式子。

求解這類遞推式的辦法叫做主方法

(主定理)

見書p25頁

分攤分析主要是執行n個運算所需要的總時間是t(n),那麼t(n)/n就是平均代價,對其進行分析,就是分攤分析。

分攤分析的方法:聚焦方法,會計方法,勢能方法。

1)聚焦方法,就是計算n個運算序列在最壞情況下,總的執行時間t(n),所以每乙個運算的平均代價就是t(n)/n了,聚焦方法保證每個運算都有相同的分攤代價。

會計方法:對每個運算預先賦予不同的費值,有的費值可能會超過其實際代價,有的可能會低於他的實際代價,所以可以進行補償。

勢能方法:執行資料結構上的乙個運算將使該資料結構改變狀態。

基礎演算法 組合問題

import numpy as np from numpy.core.fromnumeric import size from numpy.ma.core import arange 元素集合 sample a b c d e f g h 對應的int陣列 book np.random.randin...

演算法基礎 數字存在問題

小明對數字中含有 2 0 1 9 的數字很感興趣,在 1 到 40 中這樣的數包 括 1 2 9 10 至 32 39 和 40,共 28 個,他們的和是 574。請問,在 1 到 2019 中,所有這樣的數的和是多少?看到題目首先會想到用迴圈遍歷1到2019中所有的數字乙個乙個匹配判斷 兩種方式 ...

演算法基礎 全排列問題

全排列是常見的一種場景,對於缺乏更好技巧的時候,作為暴力破解的思路,結合深度遍歷使用對初入門者非常有效,代價就是時間複雜度很高。這篇文章介紹一下使用臨位對換法來解決全排列的思路和方法。通常存在如下幾種方法解決此此類問題,本文示例主要使用臨位對換法進行模擬的實現。本系列基礎文章基本使用c c 進行,都...