邓公数据结构C++语言版学习笔记1
1. 對于計算冪2n2^n2n的算法優化
暴力算法時間復雜度O(n)O(n)O(n)
遞歸優化算法時間復雜度O(logn)O(logn)O(logn)
循環優化算法時間復雜度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)
線性遞歸版算法時間復雜度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版本的二分法查找
缺點:①有三個分支(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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑网速太慢了如何使电脑网速变慢
- 下一篇: 输棋后的计算机竟电死人类棋手电脑下棋把人