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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

邓公数据结构C++语言版学习笔记1

發布時間:2023/12/3 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 邓公数据结构C++语言版学习笔记1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 對于計算冪2n2^n2n的算法優化

暴力算法時間復雜度O(n)O(n)O(n)

__int64 power2BF_I(int n) //冪函數2^n算法(蠻力迭代版),n >= 0{ __int64 pow = 1; //O(1):累積器刜始化為2^0while (0 < n --) //O(n):迭代n輪,每輪都pow <<= 1; //O(1):將累積器翻倍return pow; //O(1):返回累積器 } //O(n) = O(2^r),r為輸入指數n的比特位數


遞歸優化算法時間復雜度O(logn)O(logn)O(logn)

//優化算法時間復雜度O(logn)inline __int64 sqr(__int64 a) {return a * a; } __int64 power2(int n) //冪函數2^n算法(優化遞歸版),n >= 0 { if (0 == n) return 1; //遞歸基return (n & 1) ? sqr(power2(n >> 1)) << 1 : sqr(power2(n >> 1)); //視n的奇偶分別遞歸 } //O(logn) = O(r),r為輸入指數n的比特位數

循環優化算法時間復雜度O(logn)O(logn)O(logn)

int quickpower(int a,int b) {ans = 1,base = a;while (b > 0){if (b & 1)ans *= base; //記錄當b為奇數時少乘的一個abase *= base; b >>= 1;}return ans; }

2. 對于Fibonacci數列的算法優化
簡單遞歸算法時間復雜度O(2n)O(2^n)O(2n),空間復雜度O(n)O(n)O(n)

__int64 fib(int n) {return(2 > n) ? (__int64)n : fib(n - 1) + fib(n - 2); }

線性遞歸版算法時間復雜度O(n)O(n)O(n),空間復雜度O(n)O(n)O(n)

__int64 fib(int n, __int64& prev) {if (0 == n){prev = 1;return 0;}else{__int64 prePrev;prev = fib(n - 1, prePrev);return prePrev + prev;} }

基于動態規劃優化時間復雜度O(n)O(n)O(n),空間復雜度O(1)O(1)O(1)

}*/ __int64 fib(int n) {__int64 f = 0, g = 1;while (0 < n--){g += f; //第k+1項f = g - f; //第k項}return f; }

3. 對于二分法查找算法的進一步思考
<1>.A版本的二分法查找

int BinarySearch_A(int arr[], int num, int low, int high) {while (low < high){int mid = (low + high) >> 1;//右移運算符 相當于除以2if (num < arr[mid])high = mid;else if (num > arr[mid])low = mid;elsereturn mid; //成功查找提前終止}return -1; //查找失敗 }

缺點:①有三個分支(if elseif else)每個分支的比較運算占用一定的時間可以優化
②有多個命中元素時,不能保證返回秩最大者(即序號最大)
③失敗時,簡單地返回-1,而不能指示失敗位置

<2>.B版本的二分法查找——從三分支到兩分支

int BinarySearch_B(int arr[], int num, int low, int high) {while (1 < high - low)//每次迭代僅需要一次比較判斷,有兩個分支;成功查找不能提前終止{int mid = (low + high) >> 1;(num < arr[mid]) ? high = mid : low = mid;//經比較后確定深入[low,mid)或[mid,high)}return(num == arr[low]) ? low : -1; }

優點:相比于A版本的二分法由三分支到兩分支,優化了時間
缺點:①有多個命中元素時,不能保證返回秩最大者(即序號最大)②失敗時,簡單地返回-1,而不能指示失敗位置 ③成功查找不能提前終止

<3>.C版本的二分法查找——解決A版本的所有缺點

int BinarySearch_C(int arr[], int num, int low, int high) {while (low < high){int mid = (low + high) >> 1;(num < arr[mid]) ? high = mid : low = mid + 1; //比較后深入[low,mid)或(mid,high)}return --low;//返回low-1的目的對于[0,low)內的數不大于num而low可能大于num但是low-1一定為num(如果能夠查找成功)而且保證返回秩最大者(即序號最大) }

優點:①三分支到兩分支優化了時間②有多個命中元素時,保證返回秩最大者(即序號最大)③查找失敗時,能夠返回失敗位置
缺點:成功查找不能提前終止

對二分法進一步的優化可能引出了一個問題——我們為什么要求有多個命中元素時,保證返回秩最大者(即序號最大)?這到底能帶給我們什么好處?
以有序向量的插入操作為例,若通過查找操作不僅能夠確定可行的插入位置,而且能夠在同時存在多個可行位置時保證返回其中的秩最大者,則不僅可以盡可能低減少需移動的后繼元素,(插入元素的原理:①先保證數組空間不能夠overflow②將插入位置的后繼元素向后移動一個一個賦值③將元素插入)更可保證重復的元素按其插入的相對次序排列。對于向量的插入排序等算法的穩定性而言,這一性質更是至關重要。

4. Stack中的逆波蘭表達式(RPN)
<1> RPN特點:既不必在事先做任何約定,更無需借助括號強制改變優先級
<2> 如何計算RPN?
簡單總結一下:將所有操作數一一壓入棧中,如果遇到操作符xxx則就從棧中彈出運算符xxx所需數目的操作數,然后實時對xxx操作符的運算,最終將新結果重新壓棧(!!階乘運算符需要一個操作數,其他+?×÷+-×÷+?×÷運算符一般需要兩個操作數)

<3> 如何手工將中綴表達式(infix)轉化為RPN表達式亦稱作后綴表達式(postfix)?
①用括號顯示地表示優先級 ②將運算符移到對應右括號后(表示該運算符優先級的括號)③抹去所有括號 ④稍加整理

2020/2/20學習清華大學鄧俊輝老師的《數據結構C++語言版》筆記,方便復習也供大家參考,如果有錯誤麻煩在評論指出,互相學習進步!本文代碼全部來源于《數據結構C++語言版》

總結

以上是生活随笔為你收集整理的邓公数据结构C++语言版学习笔记1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。