演算法是一種解決某類問題、具體的、明確無歧義的計算過程。
十進位制的指數。
例如: 1500 = 1.5*(10**3)數量級是3,也可以是 「千」,kilo
150萬 = 1.5*(10**6) 數量級是6, 也可以是「百萬」, 『million』
150萬比1500大3個數量級
執行環境資源有限,需要根據輸入規模(數量級)準備資源,比預估的高乙個數量級就可以。
例如: react的virtualdom 應該支援[萬]數量級資料(預設頁面最大節點數在「千」級),在「毫秒」時間內完成一次計算。
因為:顯示器更新時間時間間隔10ms,演算法應該《這個數量級,為了顯示器顯示不卡
cpu包含:
短期記憶(暫存器-register)
推理計算(演算法邏輯單元-alu-arithmetic and logic unit)
系統將資料從記憶體讀取到暫存器,計算完成後再存回記憶體
記憶體:長期記憶(隨機儲存器-ram-資料空間位址+指令空間位址)
訪問每個位址時間相同
例如:5000*0.2=1000; 資料計算時都要在暫存器中,結果返回也返回到暫存器中
時間複雜度和空間複雜度都是對演算法的乙個分類
時間複雜度
在該演算法中執行次數最多的**行,執行的次數,表示時間複雜度。因為每個命令,代表固定的指令和cpu執行週期,代表固定的時間。
時間複雜度分類
示例
長度為n的一維陣列遍歷-----o(n)空間複雜度n*n的二維陣列巢狀遍歷 --------o(n^2)
n*n*n的三維陣列巢狀遍歷------o(n^3)
n*m的二維陣列巢狀遍歷-----------o(n*m)
長度n的陣列和m的陣列分別遍歷----o(n+m)
運算次數為常數---------------o(1)
空間複雜度是指演算法用了多少額外的空間,可以理解成新建立了多少空間。沒有額外建立的話o(1)
空間複雜度分類的表示方法和時間複雜度雷同。
例如:
//上面的方法如果想要實現空間複雜度o(1)。則只能在原來陣列實現長度為n的陣列的反轉
function
f(a)
return reversea; //
相當於建立了乙個長度為n的空間,複雜度o(n)
}
//⚠️對於遞迴演算法,函式引數所占用的空間會累計。實現長度為n的陣列的反轉
function
f(a)
}
複雜度是一種度量指標(消耗時間和空間)隨著輸入規模增長而增常的一種關係。根據不同的關係有不同的分類。
o(1)+o(1)=o(1);由上面可知,複雜度是以最大消耗作為計算。o(n)+o(n)=o(n);
o(lgn)+o(lgn)=o(lgn);
o(lgn)+o(n)=o(n);
o(n)+o(1)=o(n);
o(n^2)+o(n)=o(n^2);
o其實是複雜度的漸近上界(最壞的情況)。
ω是複雜度漸近下界(最好);
演算法 基礎知識
插入排序法示例 將想要插入的值搜尋找到合適的位置,之前的數值一一向後移動乙個位置,騰出乙個空位置給想要插入的數值。偽 instert sort a for j 2 to a.length key a j i j 1 while i 0 and a i key a i 1 a i i i 1 a i ...
演算法基礎知識
o 1 稱為不變複雜性 1項 1秒 10項 1秒 100個專案 1秒 專案的數量仍然增加10倍,但o 1 的比例因子總是1。o log n 稱為對數複雜度 1項 1秒 10項 2秒 100項 3秒 1000項 4秒 10000項 5秒 計算次數只會增加輸入值的對數。因此,在這種情況下,假定每個計算需...
演算法基礎知識
一 插入排序 撲克牌原理 n 2 原址 a 1,n 1 是排好序的,把第n個往前 二 分治法 歸併 nlgn 非原址 先分解 sort a,p,r if pa or b 三 分治法 最大子陣列問題 描述 尋找a的和最大的非空連續子陣列 解決 按中點分成兩段,遞迴找左右段各自的最大段,再找跨越中點的最...