筆記 1

數(shù)據(jù)結(jié)構(gòu)主要研究組織大量數(shù)據(jù)的方法,算法分析則是對(duì)算法運(yùn)行時(shí)間的評(píng)估。

用下列四個(gè)定義表示函數(shù)增長(zhǎng)率的大?。?/p>

  1. 如果存在正常數(shù) c 和 n0 使得當(dāng) N>=n0 時(shí) T(N)<=cf(N), 則記為 T(N) = O(f(N)).
  1. 如果存在正常數(shù) c 和 n0 使得當(dāng) N>=n0 時(shí) T(N)>=cg(N), 則記為 T(N) = Ω(g(N)).
  2. T(N) = θ(h(N)) 當(dāng)且僅當(dāng) T(N) = O(h(N)) 且 T(N) = Ω(h(N)).
  3. 如果 T(N) = O(p(N)) 且 T(N) ≠ θ(p(N)), 則 T(N) = o(p(N)).

例如,T(N) = 1000N, f(N) = N^2
用大 O 記法表述為:1000N = O(N^2)

即:

  1. T(N) 增長(zhǎng)率小于等于 f(N).
  1. T(N) 增長(zhǎng)率大于等于 g(N).
  2. T(N) 增長(zhǎng)率等于 h(N).
  3. T(N) 增長(zhǎng)率小于 p(N).

幾個(gè)法則:
若 T1(N) = O(f(n)), T2(N) = O(g(n)), 則:

  1. T1(N) + T2(N) = max(O(f(N)), O(g(N)))
  2. T1(N) × T2(N) = O(f(N) × g(N)).

幾個(gè)典型的函數(shù)增長(zhǎng)率:

函數(shù) 名稱
c 常數(shù)
logN 對(duì)數(shù)級(jí)
(logN)^2 對(duì)數(shù)平方
N 線性級(jí)
NlogN
N^2 平方級(jí)
N^3 立方級(jí)
2^N 指數(shù)級(jí)

PS: N 的增長(zhǎng)率要快于 logN 的任意次冪。

運(yùn)行時(shí)間計(jì)算

計(jì)算 3次冪之和 的示例代碼:

int Sum(int N)
{
         int i, PartialSum;

/* 1 */  PartialSum = 0;
/* 2 */  for (int i=1; i<=N; i++)
/* 3 */    PartialSum += i * i * i;
/* 4 */  return PartialSum;
}

運(yùn)行時(shí)間分析:

  1. 聲明不計(jì)時(shí)間;
  2. 第 1 行和第 4 行各占一個(gè)時(shí)間單元;
  3. 第 3 行每執(zhí)行一次占用 4 個(gè)時(shí)間單元(兩次乘法,一次加法,一次賦值),而執(zhí)行 N 次共占用 4N 個(gè)時(shí)間單元;
  4. 第 2 行在初始化 i, 測(cè)試 i<= N 和對(duì) i 的自增運(yùn)算中隱含著開銷(初始化1個(gè)時(shí)間單元,所有的測(cè)試 N+1 個(gè)時(shí)間單元,以及所有的自增運(yùn)算 N 個(gè)時(shí)間單元,共2N+2)。

我們忽略調(diào)用函數(shù)和返回值的開銷,得到總量是6N+4,因此我們說(shuō)該函數(shù)是 O(N).

計(jì)算運(yùn)行時(shí)間的一般法則

  • for 循環(huán)
    一次 for 循環(huán)的運(yùn)行時(shí)間至多是該 for 循環(huán)內(nèi)語(yǔ)句(包括測(cè)試語(yǔ)句)的運(yùn)行時(shí)間乘以迭代次數(shù)。

  • 嵌套的 for 循環(huán)
    從里向外分析。一組嵌套內(nèi)部的一條語(yǔ)句總的運(yùn)行時(shí)間為該語(yǔ)句的運(yùn)行時(shí)間乘以該組所有的 for 循環(huán)的大小的乘積。例如:

for (i=0; i<N; i++)
    for (j=0; j<N; j++)
      k++;

該程序片段為 O(N^2).

  • 順序語(yǔ)句
    將各個(gè)語(yǔ)句的運(yùn)行時(shí)間求和即可(即,其中的最大值)。例如,下述程序片段先用去 O(N), 再花費(fèi) O(N^2), 總開銷也是 O(N^2).
for (i=0; i<N; i++)
    a[i] = 0;
for (i=0; i<N; i++)
    for (j=0; j<N; j++)
      a[i] += a[j] + i + j;
  • if/else 語(yǔ)句
    對(duì)程序片段
if (condition)
    S1
else
    S2

一個(gè) if/else 語(yǔ)句的運(yùn)行時(shí)間不超過判斷再加上 S1 和 S2 中運(yùn)行時(shí)間長(zhǎng)者的總運(yùn)行時(shí)間。

《數(shù)據(jù)結(jié)構(gòu)與算法分析》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 個(gè)人學(xué)習(xí)批處理的初衷來(lái)源于實(shí)際工作;在某個(gè)迭代版本有個(gè)BS(安卓手游模擬器)大需求,從而在測(cè)試過程中就重復(fù)涉及到...
    Luckykailiu閱讀 4,974評(píng)論 0 11
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,625評(píng)論 18 399
  • 從女孩到女人,這一輩子,得歷經(jīng)多少磨難呢?如果只是聽了敦敦道理,就會(huì)變成自己希望的人生,那生命豈不是活在鏡花水月一...
    許之歡喜閱讀 1,049評(píng)論 1 2
  • 滿足是頭腦里的一種狀態(tài)而不是頭腦里裝有滿意的事件。滿意的事件總是一種依賴,依賴就意味著有一天依戀的對(duì)象不再時(shí),伴隨...
    赫明華閱讀 1,359評(píng)論 9 9
  • 霍元甲終其一生都在問一個(gè)問題,練武究竟為什么,為了平靜自己心緒,控制自己身體。偉大的拳王說(shuō),心中沒有了憤怒,你便成...
    閃閃惹人愛哦閱讀 104評(píng)論 0 0

友情鏈接更多精彩內(nèi)容