簡單的時間複雜度分析
o(1) o(n) o(lgn) o(nlogn) o(n^2)
o讀大歐
o:大o描述的是演算法的執行時間和輸入資料之間的關係
n:元素個數
o(***) 是乙個漸進時間複雜度,描述n趨近於無窮的情況下演算法的快慢
o(n) 代表演算法的執行時間和輸入資料n的個數是呈線性關係的,是乙個線性的演算法
實際上線性方程是 t = c1*n + c2
但常熟都被忽略了
所以直接給出了o(n)
比如①t = 2n + 2 → o(n)
②t = 2000n + 10000 → o(n)
③t = 1nn + 0 → o(n^2)
④t = 2nn + 300n + 0 → o(n^2) 低階項被忽略掉
對於排序中的高階排序演算法 如歸併排序法 快速排序法,若n小!!!,可以使用插入排序法來優化
新增操作的分析:
addlast(e) → o(1)
addfirst(e) → o(n)
resize() → o(n)
add(index,e) → 當index size-1 時o(1) ;當index 0 時 是o(n)
嚴格計算需要概率論的知識,時間複雜度的期望 o(n/2) = o(n)
整體上面三個add方法而言,新增是o(n),要從最壞的情況來看
刪除操作的分析:
removelast(e) → o(1)
removefirst(3) → o(1)
remove(index,e) → o(n/2) = o(n)
resize() → o(n)
整體上刪除操作是o(n) 的
修改操作的分析:
set(index,e) → o(1)
修改已知所以是o(1) ,未知所以是o(n)
查詢操作的分析
get(index) → o(1)
contains(e) → o(n)
find(e) → o(n)
查詢已知所以是o(1) ,未知所以是o(n)
遺留問題:
增 o(n)
刪 o(n)
上述兩個如果只對最後乙個元素操作,碰上resize,依然是o(n)
resize看起來效能差,但對resize這樣的操作使用最壞情況下的分析是不合理的,下一節用新的分析方法:叫均攤複雜度分析
1 7針對封裝陣列的簡單複雜度分析
完成了陣列的封裝之後我們還需對其進行複雜度分析 此處的複雜度分析主要是指時間複雜度分析,演算法的時間複雜度反映了程式執行時間隨輸入規模增長而增長的量級,在很大程度上能很好反映出演算法的優劣與否。1.簡單概念 在各種不同演算法中,若演算法中語句執行次數為乙個常數,則時間複雜度為o 1 另外,在時間頻度...
動態陣列自增策略的複雜度分析
由於程式設計時很難準確預知需要多少空間。比如申請了乙個定長的陣列存放資料,但是突然發現陣列填滿了,因此需要乙個更大的陣列來填放資料,這就涉及了陣列的自增策略問題。定增策略 定增策略每次擴容將陣列長度增加定長。設我們需要乙個長為n nn的陣列,陣列初始長度為i ii,每次擴容的大小為i ii,則n m...
比較排序演算法的簡單介紹和複雜度分析
標題長坑,就拿最近有在用的來弄吧,先寫個大概,以後逐漸完善。對於以下 預設包含標頭檔案 include 1.氣泡排序 bubble sort 先從課本上最常見的氣泡排序說起吧,c 如下 個人習慣介紹演算法使用c 比偽 還通俗易懂.void bubblesort int a,int n 每輪迴圈後,都...