什么是数据结构?
数据结构是指一组数据的存储结构。
什么是算法?
算法是操作一组数据的方法。
10个常用的数据结构
数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树
10个算法
递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
时间复杂度
大O时间复杂度表示法
所有代码的执行时间T(n)与每行代码的执行次数n成正比;
T(n) = O(f(n)
T(n)代表代码的执行时间;n表示数据规模;f(n)表示每行代码执行的次数总和;
O表示代码的执行时间T(n)与表达式f(n)成正比;
公式中的低阶、常量、系数都可以忽略;
大O时间复杂度(简称时间复杂度)
大O时间复杂度实际上并不是具体表示代码真正的执行时间,而是表示代码的执行时间随数据规模增长的变化趋势,所以也叫渐进时间复杂度。、
时间复杂度分析
* 只关注循环执行次数最多的那段代码;
* 加法法则:总复杂度等于量级最大的那段代码的复杂度;
* 乘法法则:嵌套代码复杂度等于嵌套内外代码复杂度的乘积;
几种常见的时间复杂度分析
常量阶:O(1) 指数阶:O(2n)#2的n次方
对数阶:O(logn) 阶乘阶:O(n!)
线性阶:O(n)
线性对数阶:O(nlogn)
平方阶:O(n²)、立方阶:O(n³)、k次方阶:O(nk)
对于上面罗列的复杂度量级,可以粗略的分为两类,多项式量级和非多项式量级。非多项式量级只有两个:指数阶和阶乘阶;
把时间复杂度为多项式量级的算法问题叫做NP(Non-Deterministic Polyomial,非确定多项式)问题;
O(1)
只要代码的执行时间不随着n的增大而增长,这样的时间复杂度都计作O(1)。或者说:一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是O(1);
O(logn)、O(nlogn)
对数阶时间复杂度非常常见,同时也是最难分析的一种。如常用的归并排序、快速排序的时间复杂度都是O(nlogn);
空间复杂度分析
时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系;空间复杂度全称就是渐进空间复杂度,表示算法的存储空间与数据规模之间的增长关系;
我们常用的空间复杂度就是O(1)、O(n)、O(n²),像O(logn)、O(nlogn)这样的对数阶复杂度平时用不到;
浅析最好、最坏、平均、均摊时间复杂度
最好情况时间复杂度
在最理想的情况下,执行这段代码的时间复杂度;
最坏情况时间复杂度
在最糟糕的情况下,执行这段代码的时间复杂度;
平均情况时间复杂度
平均时间复杂度的全称应该叫做加权平均时间复杂度或者期望时间复杂度;
均摊时间复杂度以及它对应的分析方法,摊还分析(或者叫平摊分析)
对于一个数据结构进行一组连续操作中,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,而且这些操作之间存在前后连贯的时序关系,这个时候,我们就可以将这一组操作放在一块分析,看是否能将较高时间复杂度那次操作的耗时,平摊到其他那些时间复杂度比较低的操作上。而且,再能够应用均摊时间复杂度分析的场合,一般均摊时间复杂度就等于最好情况时间复杂度;均摊时间复杂度是一种特殊的平均时间复杂度;