本文是基于极客时间-算法面试通关40讲的学习笔记
数据结构:
- Array ------------------------------------数组
- Stack/Queue---------------------------栈/队列
- PriorityQueue(heap)-----------------优先队列(堆)
- LinkedList(single/double)-----------链表(单向/双向)
- Tree/Binary Tree----------------------树/二叉树
- Binary Search Tree-------------------二叉搜索树
- HashTable ------------------------------哈希表
- Disjoint Set------------------------------并查集
- Trie----------------------------------------字典树
- BloomFilter------------------------------布隆过滤器,简称BF,空间效率很高的随机数据结构
- LRU Cache------------------------------Least Recently Used,利用Cache告诉缓存的数据结构
算法(时间复杂度):
- General Coding--------------------------------------普通编码
- In-Order/Pre-Order/Post-Order traversal------中序/前序/后序遍历
- Greedy-------------------------------------------------贪心算法
- Recursion/Backtrace-------------------------------回数/递归算法
- Breadth-first Search--------------------------------广度优先算法
- Depth-first Search-----------------------------------深度优先算法
- Divide and Conquar--------------------------------分治算法
- Dynamic Programming----------------------------动态规划
- Binary Search----------------------------------------二分查找算法
- Graph--------------------------------------------------图表
了解数据结构和算法之前,需要了解时间复杂度和空间复杂度两个衡量标准
时间复杂度:简而言之就是根据一个变量的值引起程序运行的次数,常见的用for循环去理解,n为常量时,循环次数不变,此时的时间复杂度称之为O(1).
否则,会根据n的递增而递增,被称之为O(n)。
常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)
空间复杂度:简而言之就是程序运行时占用内存空间的大小变化。
注意:
一个经验规则:其中c是一个常量,如果一个算法的复杂度为c 、 log2n 、n 、 n*log2n ,那么这个算法时间效率比较高 ,如果是2n ,3n ,n!,那么稍微大一些的n就会令这个算法不能动了,居于中间的几个则差强人意。
算法时间复杂度分析是一个很重要的问题,任何一个程序员都应该熟练掌握其概念和基本方法,而且要善于从数学层面上探寻其本质,才能准确理解其内涵。
多个算法结合只需要计算最大的时间复杂度即可!
几种常见的算法时间复杂度:
二分查找---------------O(log n)
二叉树遍历------------O(n)
二维排序算法---------O(n)
归并排序(快速排序)-O(n log n)----------------------适用于n比较大的时候