每个程序员都应该收藏的算法复杂度速查表
2016-08-10 15:26
691 查看
算法复杂度这件事
这篇文章覆盖了计算机科学里面常见算法的时间和空间的大 OBig-O 复杂度。我之前在参加面试前,经常需要花费很多时间从互联网上查找各种搜索和排序算法的优劣,以便我在面试时不会被问住。最近这几年,我面试了几家硅谷的初创企业和一些更大一些的公司,如Yahoo、eBay、LinkedIn 和 Google,每次我都需要准备这个,我就在问自己,“为什么没有人创建一个漂亮的大 O 速查表呢?”所以,为了节省大家的时间,我就创建了这个,希望你喜欢!
--- Eric
图例
绝佳 | 不错 | 一般 | 不佳 | 糟糕 |
数据结构操作
数据结构 | 时间复杂度 | 空间复杂度 | |||||||
---|---|---|---|---|---|---|---|---|---|
平均 | 最差 | 最差 | |||||||
访问 | 搜索 | 插入 | 删除 | 访问 | 搜索 | 插入 | 删除 | ||
Array | O(1) | O(n) | O(n) | O(n) | O(1) | O(n) | O(n) | O(n) | O(n) |
Stack | O(n) | O(n) | O(1) | O(1) | O(n) | O(n) | O(1) | O(1) | O(n) |
Singly-Linked List | O(n) | O(n) | O(1) | O(1) | O(n) | O(n) | O(1) | O(1) | O(n) |
Doubly-Linked List | O(n) | O(n) | O(1) | O(1) | O(n) | O(n) | O(1) | O(1) | O(n) |
Skip List | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(n) | O(n) | O(n) | O(n) | O(n log(n)) |
Hash Table | - | O(1) | O(1) | O(1) | - | O(n) | O(n) | O(n) | O(n) |
Binary Search Tree | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(n) | O(n) | O(n) | O(n) | O(n) |
Cartesian Tree | - | O(log(n)) | O(log(n)) | O(log(n)) | - | O(n) | O(n) | O(n) | O(n) |
B-Tree | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(n) |
Red-Black Tree | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(n) |
Splay Tree | - | O(log(n)) | O(log(n)) | O(log(n)) | - | O(log(n)) | O(log(n)) | O(log(n)) | O(n) |
AVL Tree | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(n) |
数组排序算法
算法 | 时间复杂度 | 空间复杂度 | ||
---|---|---|---|---|
最佳 | 平均 | 最差 | 最差 | |
Quicksort | O(n log(n)) | O(n log(n)) | O(n^2) | O(log(n)) |
Mergesort | O(n log(n)) | O(n log(n)) | O(n log(n)) | O(n) |
Timsort | O(n) | O(n log(n)) | O(n log(n)) | O(n) |
Heapsort | O(n log(n)) | O(n log(n)) | O(n log(n)) | O(1) |
Bubble Sort | O(n) | O(n^2) | O(n^2) | O(1) |
Insertion Sort | O(n) | O(n^2) | O(n^2) | O(1) |
Selection Sort | O(n^2) | O(n^2) | O(n^2) | O(1) |
Shell Sort | O(n) | O((nlog(n))^2) | O((nlog(n))^2) | O(1) |
Bucket Sort | O(n+k) | O(n+k) | O(n^2) | O(n) |
Radix Sort | O(nk) | O(nk) | O(nk) | O(n+k) |
图操作
节点 / 边界管理 | 存储 | 增加顶点 | 增加边界 | 移除顶点 | 移除边界 | 查询 |
---|---|---|---|---|---|---|
Adjacency list | O(|V|+|E|) | O(1) | O(1) | O(|V| + |E|) | O(|E|) | O(|V|) |
Incidence list | O(|V|+|E|) | O(1) | O(1) | O(|E|) | O(|E|) | O(|E|) |
Adjacency matrix | O(|V|^2) | O(|V|^2) | O(1) | O(|V|^2) | O(1) | O(1) |
Incidence matrix | O(|V| ⋅ |E|) | O(|V| ⋅ |E|) | O(|V| ⋅ |E|) | O(|V| ⋅ |E|) | O(|V| ⋅ |E|) | O(|E|) |
堆操作
类型 | 时间复杂度 | ||||||
---|---|---|---|---|---|---|---|
Heapify | 查找最大值 | 分离最大值 | 提升键 | 插入 | 删除 | 合并 | |
Linked List (sorted) | - | O(1) | O(1) | O(n) | O(n) | O(1) | O(m+n) |
Linked List (unsorted) | - | O(n) | O(n) | O(1) | O(1) | O(1) | O(1) |
Binary Heap | O(n) | O(1) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(m+n) |
Binomial Heap | - | O(1) | O(log(n)) | O(log(n)) | O(1) | O(log(n)) | O(log(n)) |
Fibonacci Heap | - | O(1) | O(log(n)) | O(1) | O(1) | O(log(n)) | O(1) |
大 O 复杂度图表
Big
O Complexity Graph
推荐阅读
Crackingthe Coding Interview: 150 Programming Questions and Solutions
Introduction
to Algorithms, 3rd Edition
Data
Structures and Algorithms in Java (2nd Edition)
High
Performance JavaScript (Build Faster Web Application Interfaces)
贡献者
Eric Rowell, creator of Concrete.js,an HTML5 Canvas Framework
Quentin Pleple
Michael Abed
Nick Dizazzo
Adam Forsyth
David Dorfman
Jay Engineer
Jennifer Hamon
Josh Davis
Nodir Turakulov
Bart Massey
Vinnie Magro
Miguel Amigot
Drew Bailey
Aneel Nazareth
Rahul Chowdhury
Robert Burke
steven41292
Brandon Amos
Mike Davis
Casper Van Gheluwe
Joel Friedly
Oleg
Renfred Harper
Piper Chester
Eric Lefevre-Ardant
Jonathan McElroy
Si Pham
mcverry
Max Hoffmann
Alejandro Ramirez
Damon Davison
Alvin Wan
Alan Briolat
Drew Hannay
Andrew Rasmussen
Dennis Tsang
Bahador Saket
相关文章推荐
- 浏览器地址栏输入URL,回车......
- 10个值得深思的PHP面试问题
- 作为码农自己女票比自己强是什么感觉
- 每个程序员都应该收藏的算法复杂度速查表
- 50道Java线程面试题
- 《Android 开发工程师面试指南》
- 你绝对想不到年过40岁的程序员可以有多么牛X!,程序员出路
- 老毕整理的去年比较难的面试题目,供参考
- [置顶] Android面试题【高级工程师版】
- 合格程序员七大基本素质与五大必备能力
- PHP程序员的10个有用的技巧和教程
- PHP程序员的技术成长规划
- 遗留问题——sql面试篇(动态合并单表数据)
- 刘昕明:送给和我一样曾经浮躁过的PHP程序员
- 高效程序员的45个习惯 敏捷开发修炼之道 读书笔记 第四章 交付用户想要的软件
- 程序员最容易犯的错误总结
- php 面试题
- Java线程面试题 Top 50(转载)
- 程序员找工作时应该该考察公司的一些方面
- “金九银十”求职指南:这些城市和行业最热门!