2020-4-28時間複雜度與空間複雜度
我盡量用 最少的文字,最少的**。來講明白資料結構與演算法。
const
findcat
=(n)
=>
console.
log(`$
有 $只貓`)
}findcat(1
)// 石興龍 有 1 只貓
findcat(10
)// 石興龍 有 10 只貓
findcat
(n)// 石興龍 有 n 只貓
先來看看執行過程。先定義了 3 個變數、其次 for 迴圈、最後一行列印。假設每一行的執行時間為 x 。那麼總的執行時間為:
t(n) = 3x + for(n) + x
其中 3x 和 x 的執行時間是不會變的,和 n 沒有關係,我們忽略不計。那麼現在的執行時間是:
t(n) = for(n) = o(n)
find 函式的複雜度完全依賴變數 n 的大小,所以就是 o(n)
| 複雜度 | 執行速度 |
| -- | --|
| o(1) | 最快 |
| o(logn) | 快 |
| o(n) | 慢 |
| o(nlong) | 很慢 |
| o(n次方) | 最慢 |
// 最快的** o(1)
letfindcat=(
)=>
console.
log(`$
有 $只貓`)
}findcat()
// 石興龍 有 10 只貓
// 雖然也有 for 迴圈,但是執行時間是固定的
// 快的** o(logn)
findcat
=(n)
=>
} console.
log(`$
有 $只貓`)
}findcat(10
)// 石興龍 有 5 只貓
// logn 函式產生的值 < n
// 慢的** o(n)
findcat
=(n)
=>
console.
log(`$
有 $只貓`)
}findcat(10
)// 石興龍 有 10 只貓
// 執行的時間 和 n 成正比
// 很慢的** o(nlong)
findcat
=(n)
=>
console.
log(`$
有 $只貓`)
}findcat(10
)// 石興龍 有 20 只貓
// logn 函式產生的值 > n
// 最慢的** o(n次方)
findcat
=(n)
=>
} console.
log(`$
有 $只貓`)
}findcat(10
)// 石興龍 有 100 只貓
// for 迴圈的執行次數是 n 的平方,甚至更大
let cats =
['鋼蛋兒'
,'灰灰'
,'三花'
,'豆芽'
]findcat
=(catname)
=>
排行第 $`
)break;}
} console.
log(`$
不是你的貓`)}
findcat
('鋼蛋兒'
)// 鋼蛋兒 排行第 1
// 執行效率最快 o(1)
findcat
('豆芽'
)// 豆芽 排行第 4
// 執行效率最慢 o(n)
findcat
(parseint
(math.
random()
* cats.length)
)// 平均執行效率為 o(n),因為是隨機的
// 插入貓,擴容陣列
let index =
4let
insertcat
=(newcatname)
=>
cats = newcats
}index++
; cats.
push
(newcatname)
}insertcat
('金漸層'
)// 複雜度:o(n)
insertcat
('海雙布偶'
)// 複雜度:o(1)
insertcat
('藍白高地'
)// 複雜度:o(1)
/* 均攤:雖然有迴圈,但是迴圈是有規律的。
每一次 o(n) 的後面都跟著 n - 1 次 o(1)
極簡教程 資料結構與演算法(二)
2020 4 29 陣列篇 我盡量用 最少的文字,最少的 來講明白資料結構與演算法。定址演算法 a i 陣列開始的位置 i 固定大小動作 複雜度array 增 o n array 刪 o n array 改 o 1 array 查 根據下標 o 1 array 查 迴圈查 o logn 如果不需要排...
極客幫資料結構與演算法總結
1 工具 1 時間和空間複雜度 2 常見時間複雜度表示 由低到高 4 思考題 二叉樹遍歷 前序 中序 後序 時間複雜度是?o n 圖的遍歷 時間複雜度?o n 搜尋演算法 深度優先 dfs 廣度優先 bfs 時間複雜度?o n 二分查詢 時間複雜度?log n 排好序的二維矩陣中查詢 o n 歸併排...
資料結構與演算法教程彙總
一 演算法 1.二分法 2.遞推演算法 分為順推法 又叫 斐波那契數列 和倒推法 兩種 演算法思想 3.列舉 窮舉 演算法 4.遞迴演算法 5.分治演算法 演算法思想 把大問題分解成n個小問題 6.貪婪演算法 7.試探法演算法 8.模擬演算法 二 資料結構 1.線性結構 資料元素之間是一對一的關係 ...