在这里插入代码片常见算法运行时间:
- O(n!),后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量;旅行商解决方案;
- O(n),代表数据量增大几倍,耗时也增大几倍。遍历算法
- O(n^2),代表数据量增大n倍时,耗时增大n的平方倍,冒泡排序
- O(logn),当数据增大n倍时,耗时增大logn倍;二分查找
- O(n * logn),当数据增加N倍,数据增加256,耗时*8。快速排序算法;
- 数组的元素都在一起,在内存中是连续的;
链表的元素都是分开的,其中每个元素都存储下一个元素的地址;
每个递归函数都有两部分:基线条件(base case)和递归条件(recursive base)
总结:
- 递归指的是调用自己的函数;
- 每个递归函数都有两个条件:基线条件和递归条件。
- 栈有两种操作:压入和弹出。
- 所有函数调用都进入调用栈。
- 调用栈可能很长,这将占用大量的内存。
排序
十种常见排序算法可以分为两大类:
非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。
- 冒泡排序:重复地走访过要排序的元素,依次比较相邻两个元素,如果他们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。时间复杂度: O(n^2)
- 选择排序:初始时在序列中找到最小(大)元素,放到序列的起始位置作为已排序序列;然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 时间复杂度:O(n^2)
- 插入排序
- 希尔排序
- 归并排序
- 快速排序
- 堆排序
二叉树:
- 树的定义: 是一种非线性数据结构,相当于线性数据而言,树的运行时间更短。
树是N (N≥1 N\geq1N≥1) 个结点的有限集合
树的分类:
-
定义:二叉树是有序的节点集合
-
普通二叉树、完全二叉树、满二叉树
-
二叉树:最多有两棵子树的树被称为二叉树
-
斜树:都斜向一边的树,左(右)子树
-
满二叉树:二叉树中所有非叶子结点的度都是2,且叶子结点都在同一层次上
-
完全二叉树:如果一个二叉树与满二叉树前m个节点的结构相同,这样的二叉树被称为完全二叉树
-
也就是说,如果把满二叉树从右至左、从下往上删除一些节点,剩余的结构就构成完全二叉树
-
二叉树的性质:
- 二叉树第i层的节点数最多为2{i-1} (i≥1)。
- 深度为K的二叉树至多有2{k}-1个节点(k≥1)。
- 包含n个节点的二叉树的高度至少为log2(n+1)。
- 在任意一颗二叉树中,诺终端节点的个数为n0,度为2的结点数为n2,则n0=n2+1。
- 前序,中序,倒序:—
- 前序:根在前,同级先左后右 (ABCDEFGHK)
- 中序:先左后根右最后(BDCAEHGKF)
- 倒序:先左后右根最后(DCBHKGFEA)
红黑树:
每个节点或是红色的,或是黑色的,根节点是黑色的,每个叶节点(NIL)是黑色的,如果一个节点是红色的,则它的两个子节点都是黑色的,对于每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。时间复杂度为O(logn)
跳表:
跳表是平衡树的一种替代的数据结构,他的时间复杂度为O(logn),而普通单链表查询一个元素的时间复杂度为O(n)
动态分析:
动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。