第一章 算法设计基础
- 算法的五大特性:输入、输出、可行性、有穷性、确定性
(1)输入:一个算法有零个或多个输入。
(2)输出:一个算法有一个或多个输出。
(3)可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现(每步可执行)。
(4)有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。算法的有穷性 意味着不是所有的计算机程序都是算法。
(5)确定性:算法中的每一条指令必须有确切的含义,对于相同的输入只能得到相同的输出。 - 算法的复杂性:时间复杂性和空间复杂性
第二章 算法分析基础
大O符号:
[例] T(n)=3n-1
当n≥1时, T(n)= 3n-1≤3n= O(n)
[例] T(n)=5n2+8n+1
当n≥1时,5n2+8n+1≤5n2+8n+n=5n2+9n≤5n2+9n2≤14n2=O(n2)
公式推导递推问题:
常用的时间复杂度:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3) <…<Ο(2n)<Ο(n!) <Ο(nn)
第三章 蛮力法
- 蛮力法的基本思想:蛮力法依赖的基本技术——遍历技术,即采用一定的策略将待求解问题的所有元素依次处理一次,从而找出问题的解。
熟记以下问题使用蛮力法的时间复杂度:
- 冒泡排序:O(n2)
- 0/1背包:典型子集问题, O(2n)
- 任务分配:典型排列问题,O(n!)
其它蛮力法的算法时间复杂度:
- 串匹配:BF算法:O(n*m)、KMP算法:O(n)
- 选择排序:O(n2)
- 最近对问题:O(n3)
第四章 分治法
分治法求解三个阶段:1.划分;2.求解子问题;3.合并;
分治法经典算法问题:
- 数字旋转方阵
- 归并排序
- 快速排序
- 最大字段和
快速排序
#include<iostream>
using namespace std;
void Quick(int r[],int first,int end);
int part(int r[],int first,int end);
int part(int r[],int first,int end)
{
int i=first,j=end;
while(i<j)
{
while(i<j&&r[i]<=r[j])
j--; //右侧扫描
if(i<j) //将较小记录交换到前面
{
int temp=r[i];
r[i]