日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法分析-第2章

發(fā)布時間:2025/7/14 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法分析-第2章 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
<?xml version="1.0" encoding="utf-8"?> 數(shù)據(jù)結(jié)構(gòu)與算法分析-第2章

數(shù)據(jù)結(jié)構(gòu)與算法分析-第2章

Table of Contents

  • 1. 第2章-算法分析
    • 1.1. 數(shù)學(xué)基礎(chǔ)
    • 1.2. 運(yùn)行時間
      • 1.2.1. 最大自序列和問題求解
      • 1.2.2. 運(yùn)行時間中的對數(shù)

1 第2章-算法分析

1.1 數(shù)學(xué)基礎(chǔ)

  • 四個定義
    • 如果存在正整數(shù) \(c\) 和 \(n_0\) 使得當(dāng) \(N\ge n_0\) 時 \(T(N) \le cf(N)\) , 則記為 \(T(N) = O(f(N))\).上界的定義,大O記法.\(T(N)\) 的增長率小于等于 \(f(N)\) 的增長率.
    • 如果存在正整數(shù) \(c\) 和 \(n_0\) 使得當(dāng) \(N\ge n_0\) 時 \(T(N) \ge cg(N)\) , 則記為 \(T(N) = \Omega(f(N))\).下界的定義,\(T(N)\) 的增長率大于等于 \(g(N)\) 的增長率.
    • \(T(N)=\Theta(h(N))\) 當(dāng)且僅當(dāng) \(T(N)=O(h(N))\) 且 \(T(N) = \Omega(h(N))\).\(T(N)\) 的增長率等于 \(h(N)\) 的增長率.
    • 如果 \(T(N)=O(p(N))\) 且 \(T(N)\neq\Theta(p(N))\) ,則 \(T(N)=o(p(N))\) .小o記法. \(T(N)\) 的增長率小于 \(p(N)\) 的增長率.大O包含增長率相同的可能性.
  • 法則1: 如果 \(T_1(N)=O(f(N))\) 且 \(T_2(N) = O(g(N))\) ,那么
    • \(T_1(N) + T_2(N) = max(O(f(N)), O(g(N)))\)
    • \(T_1(N) * T_2(N) = O(f(N) * g(N))\)
  • 法則2: 如果 \(T(N)\) 是一個k次多項式,則 \(T(N) = \Theta(N^k)\).
  • 法則3: 對于任意常數(shù)k, \(\log^kN=O(N)\). 它告訴我們對數(shù)增長得非常緩慢.
  • 典型的增長率
函數(shù)名稱
c常數(shù)
logN對數(shù)級
log2N對數(shù)平方根
N線性級
NlogN?
N2平方級
N3立方級
2N指數(shù)級
  • 可以通過計算極限 \(\lim_{n\to\infty}\frac{f(N)}{g(N)}\) 來確定兩個函數(shù) \(f(N)\) 和 \(g(N)\) 的相對增長率.
    • 洛必達(dá)法則: 若 \(\lim_{n\to\infty}f(N) = \infty\) 且 \(\lim_{n\to\infty}g(N) = \infty\) ,則 \(\lim_{n\to\infty}\frac{f(N)}{g(N)} = \lim_{n\to\infty}\frac{f'(N)}{g'(N)}\), \(f'(N)\) 和 \(g'(N)\) 分別是 \(f(N)\) 和 \(g(N)\) 的導(dǎo)數(shù).
    • 極限是 \(0\) : 說明 \(f(N)=o(g(N))\)
    • 極限是 \(c\neq0\) : 說明 \(f(N)=\Theta(g(N))\)
    • 極限是 \(\infty\) : 說明 \(g(N) = o(f(N))\), \(f(N)=O(g(N))\).
    • 極限擺動: 二者無關(guān).

1.2 運(yùn)行時間

  • 一般法則
    • 嵌套的for循環(huán)內(nèi)部的一條語句總的運(yùn)行時間為該語句的運(yùn)行時間乘以該組所有的for循環(huán)的大小的乘積.
    • 順序語句將各個語句的運(yùn)行時間求和即可.
    • 斐波那契函數(shù)遞歸求法最壞情況的增長率是 \(\frac{5}{3}^n\)

1.2.1 最大自序列和問題求解

  • 算法1: 時間復(fù)雜度為 \(O(N^3)\)
int MaxSubsequenceSum1(const int A[], int N) {int ThisSum, MaxSum, i, j, k;/* 總開銷: O(1*N*N*N)=O(3) *//* 賦值開銷是O(1) */MaxSum = 0;/* N次的循環(huán) */for (i = 0; i < N; i++) {/* N-i次循環(huán) */for(j = i; j < N; j++) {ThisSum = 0;/* j-i+1次循環(huán),假設(shè)為N次 */for (k = i; k <= j; k++) {ThisSum += A[k];}if (ThisSum > MaxSum) {MaxSum = ThisSum;}}}return MaxSum; }
  • 算法2: 時間復(fù)雜度為 \(O(N^2)\)
int MaxSubsequnceSum2(const int A[], int N) {int ThisSum, MaxSum, i, j;MaxSum = 0;/* N次循環(huán) */for(i = 0; i < N; i++) {ThisSum = 0;/* N-i次循環(huán) */for(j = i; j < N; j++) {ThisSum += A[j];if (ThisSum > MaxSum) {MaxSum = ThisSum;}}}return MaxSum; }
  • 算法3: 時間復(fù)雜度為 \(O(NlogN)\)
static int MaxSubsequenceSum3(const int A[], int Left, int Right) {int MaxLeftSum, MaxRightSum;int MaxLeftBorderSum, MaxRightBorderSum;int LeftBorderSum, RightBorderSum;int Center, i;/* Base Case */if (Left == Right) {if (A[Left] > 0) {return A[Left];} else {return 0;}}Center = (Left + Right) / 2;MaxLeftSum = MaxSubsequenceSum3(A, Left, Right);MaxRightSum = MaxSubsequenceSum3(A, Left, Right);MaxLeftBorderSum = 0;LeftBorderSum = 0;for (i = Center; i >= Left; i--) {LeftBorderSum += A[i];if (LeftBorderSum > MaxLeftBorderSum) {MaxLeftBorderSum = LeftBorderSum;}}MaxRightBorderSum = 0;RightBorderSum = 0;for (i = Center + 1; i <= Right; i++) {RightBorderSum += A[i];if (RightBorderSum > MaxRightBorderSum) {MaxRightBorderSum = RightBorderSum;}}return Max3(MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum); }int Max(int first, int second, int third) {return first > second ?(first > third ? first : third) :(second > third ? second : third); }
  • 算法4: 時間復(fù)雜度為 \(O(N)\)
int MaxSubsequenceSum(const int A[], int N) {int ThisSum, MaxSum, j;ThisSum = MaxSum = 0;for (j = 0; j < N; j++) {ThisSum += A[j];if (ThisSum > MaxSum) {MaxSum = ThisSum;} else if (ThisSum < 0) {ThisSum = 0;}}return MaxSum; }

1.2.2 運(yùn)行時間中的對數(shù)

  • 對數(shù)最常出現(xiàn)的規(guī)律的一般法則:
    • 如果一個算法用常數(shù)時間 \(O(1)\) 將問題的大小削減為其一部分(通常是 \(\frac{1}{2}\) ), 那么該算法就是 \(O(\log{N})\) .
    • 另一方面,使用常數(shù)時間只是把問題減少一個時間常數(shù)(如將問題減少 \(1\) ), 那么該算法就是 \(O(N)\) 的.
  • 對分查找: 時間復(fù)雜度為 \(O(N)\)
int BinarySearch(const int A[], int X, int N) {int Low, Mid, High;Low = 0;High = N - 1;while (Low <= High) {Mid = (Low + High) / 2;if (A[Mid] < X) {Low = Mid + 1;} else if (A[Mid] > X){High = Mid - 1;} else {return Mid;}}return -1; }
  • 最大公因數(shù)的歐幾里得算法: 時間復(fù)雜度為 \(O(\log{N})\)
unsigned int Gcd(unsigned int M, unsigned int N) {unsigned int Rem;while (N > 0) {Rem = M % N;M = N;N = Rem;}return M; }
  • 定理: 如果 \(M > N\) ,則 \(M mod N < \frac{M}{2}\)
  • 冪運(yùn)算: 時間復(fù)雜度為 \(O(\log{N})\)
long int Pow(long int X, unsigned int N) {if (N == 0)return 1;if (N == 1)return X;if (IsEven(N))return Pow(X * X, N / 2);elsereturn Pow(X * X, N/2) * X; }

Date: 2018-11-11 16:45

Author: devinkin

Created: 2018-11-11 日 22:24

Validate

轉(zhuǎn)載于:https://www.cnblogs.com/devinkin/p/9942539.html

總結(jié)

以上是生活随笔為你收集整理的数据结构与算法分析-第2章的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。