什麼是資料結構?什麼是演算法
狹義重點:複雜度分析
方法:邊學邊練,適度刷題
複雜度分析
時間複雜度
常見時間複雜度
非多項式量級:非常低效的演算法
空間複雜度:漸進空間複雜度,表示演算法的儲存空間和資料規模的增長關係
最好情況時間複雜度:理想情況的時間複雜度
最壞情況時間複雜度:最糟糕的情況下的時間複雜度
平均情況時間複雜度:所有出現的情況累加除以可能性出現的情況,加權平均複雜度,期望時間複雜度
均攤時間複雜度:把最壞的情況的時間複雜度均攤到所有耗時少的情況下---使用很少
陣列線性表:資料排成像一條線一樣的結構
jvm清楚垃圾**:標記已經刪除的位置,當沒有更多的儲存空間的時候在執行刪除操作
煉表單鍊錶
迴圈鍊錶
雙向鍊錶
插入操作也同理
隨機查詢也比單鏈表更加高效
空間換時間的設計思想:快取
**的書寫
技巧二:警惕指標丟失和記憶體洩露
技巧三:利用哨兵簡化實現難度
技巧四:重點留意邊界條件的處理
技巧五:舉例畫圖,輔助思考
技巧六:多寫多練,沒有捷徑
常見的操作
棧理解:一摞疊在一起的盤子,只能後進先出,先進後出
操作棧在函式呼叫中的應用
棧在表示式求值中的應用
佇列理解:排隊買票,先進先出
操作:只支援入隊,出隊
迴圈佇列
阻塞佇列
併發佇列
遞迴編寫遞迴**的關鍵是,只要遇到遞迴,我們就把它抽象成乙個遞推公式,不用想一層層的呼叫關係,不要試圖用人腦去分解遞迴的每個步驟
遞迴**限制最大深度,避免堆疊溢位
優點:寫起來簡潔
缺點:空間複雜度高,有堆疊溢位風險、存在重複計算、過多的函式呼叫會耗時較多等問題。
排序基於比較的排序演算法。
氣泡排序是穩定的排序演算法嗎?
氣泡排序的時間複雜度是多少?
插入排序---這個用的還是挺多的
插入排序的時間複雜度是多少?
選擇排序
快速排序
o(n)時間複雜度內求無序陣列中的第k大元素?
'''
快速排序:分而治之,一分為二進行排序
'''
import
cprofile
import
random
def
quick_sort(nums):
if
len
(nums) <
=
1
:
return
nums
s_nums
=
l_nums
=
#小於nums[0]放左邊
for
i
in
nums[
1
:]:
if
i < nums[
0
]:
else
:
# #大於nums[0]放右邊
#nums[0:1]是列表,nums[0]是int數字
#連線左右列表加num[0:1]
return
quick_sort(s_nums)
+
nums[
0
:
1
]
+
quick_sort(l_nums)
資料結構與演算法之美 開篇
資料結構與演算法,是計算機的核心課程之一,是程式設計師武功體系的內功,想成為武林高手必須內功過硬,作為乙個非科班碼農,面試時因為內功不強而碰壁數次,使我真實的體驗到學好資料結構與演算法的重要性,為了不在這個方面繼續碰壁,也為了能在軟體開發工程師的道路上走的更遠更快,我決心集中精力學習突破這道關口 以...
資料結構與演算法之美06
個人學習筆記總結,詳見資料結構與演算法之美 度娘 線性表 非線性表 陣列 1 儲存結構 鏈式儲存,前驅後繼關聯 2 操作 crud 前後索引關聯,涉及最優最糟問題 特點 非常低效 查詢操作 了解其儲存方式,即查詢就是通過陣列下標進行。插入操作 假設陣列的長度為n,現在,如果我們需要將乙個資料插入到陣...
資料結構與演算法之美 8 遞迴演算法
遞迴嚴格說起來不算一種演算法,只能說是一種問題處理思想或者問題處理技巧。只要問題同時滿足以下三個條件,就可以考慮用遞迴來解決 乙個問題的解可以分解為幾個子問題的解 這個問題與分解之後的子問題,除了資料規模不同,求解思路完全一樣 存在遞迴終止條件 個人覺得,寫遞迴 最關鍵的是寫出遞推公式,找到終止條件...