算法(3)
1.算法的四个特性:
(1)有穷性; (2)确定性; (3)可行性; (4)输入和输出;
2.
(1)穷举法(万能算法):如求N个数的全排列
8皇后问题
(2)分而治之(建而治之):
二分查找:减为治之
归并排序:分而治之
(3)贪心
最小生成树Prim Kruskal
单源最短路径 Dijkstra
(4)动态规划
背包(最大价值的背包)
士兵路径
3.复杂度
(1)时间复杂度
(2)空间复杂度
(3)时空复杂度
使用O记号来表示
时间:基本操作次数(汇编指令条数)
空间:占用内存字节数
区别:空间可以再利用
时空互换(Hash表),将时空互换的技术,利用硬件的性能来做这件事
(4)在实现之前,我们要预估算法所需要的资源
(5)常见的时间复杂度分析方法
循环次数
均摊分析
递归式---主定理
(6)常见的时间复杂度:
O(1)
基本运算,+,-,*,/,%,寻址
O(logn)
二分查找,分治
O(n^1/2)
枚举约数
O(n)
线性查找
O(n^2)
朴素最近点对,冒泡排序,
O(n^3)
Floyd最短路径,求任意两点间的最短路径
普通矩阵的乘法
O(nlogn)
归并排序
快速排序的期望复杂度
基于比较排序的算法下界(每次对比两个元素,如果需要交换的话,那么最小的时间复杂度就是nlogn)
O(2^n)
枚举全部的子集
O(n!)
枚举全排列
总结:
优秀O(1)<O(logn)<O(n^1/2)<O(n)<O(nlogn)
可能可以优化O(n^2)<O(n^3)<O(2^n)<O(n!)
4.均摊分析:
(1)多个操作一起算时间复杂度
(2)Multipop的队列,可以一次性出k个元素,每个元素只出入队列一 次
(3)动态数组尾部插入操作:一旦元素超过容量限制,则扩大一倍,在复制
5.例题:
给定数组a[1.......n],求最大子数组和,即找出1<=i<=j<=n,使a[i]+a[i+1]+...+a[j]最大
介绍三种算法
(1)暴力枚举O(n^3)
三重循环
先找子数组的左端点,然后找子数组的右端点,然后求和,找到最大的和来更新这个答案
(2)优化枚举O(n^2)
(3)贪心算法O(n)