努力是为了不平庸
本文概要:
● 解读对算法本身的理解;
● 接触算法初级阶段;
名词定义
http://t.csdn.cn/cahCJ
算法是什么?
定义
官方定义:算法是对特定问题求解步骤的一种描述。
我的理解:求解问题的方法。
范例理解
问题:1到100,数字求和
如何解?
解1:
1+2+3等等,手动累加到100
解2:
高斯累加公式求解,n(n+1)/2
总结:
其实,不管是解1还是解2,都是求解问题的方法,也就是算法,区别是解题效率。而解题效率是算法的关键。
如何判断解题效率
- 复杂度求的是渐进复杂度
- 算法,通常考察最坏的情况
时间复杂度
简单概括,就是一个算法的运算次数
空间复杂度
所谓空间,落到实地,可以这么理解:
- 对于解决问题,需要演算
- 做数学题的演算,介质就是纸张;
- 对于程序来说,意思是存储演算过程中的数据信息到介质中:
- 具体介质是硬盘、内存等硬件设备;
- 数据信息,是指编程中的所有数据,如变量、临时变量、结果值等等;
- 可以理解为占位
特点
- 有穷性
- 确定性
- 可行性
- 输入输出
如何分析复杂度
时间复杂度
官方定义:算法运行需要的时间。
如何计算?
简单说,就是计算程序执行的次数。
执行一次,就是1,
执行2次就是2,
…
执行n次就是n
以上,可以用f(n)表示,n表示次数
demo:
时间复杂度O(n2)
int sum=0; //运行1次
int total=0; //运行1次
for(int i=1;i<=n;i++){ //运行n+1次,最后一次判断不满足循环条件
sum=sum+i; //运行n次
for(j=1;j<=n;j++) //运行n×(n+1)次
total=total+ij; //运行n×n次
}
将这个算法的所有运行次数加起来:1+1+n+1+n+n(n+1)+n*n
=>
此时,需要理解一个概念,就是所谓渐进上界和渐进下界。
总而言之,是将约等于 T(n)=
综上所述,这个demo的时间复杂度就是两个for循环,O()
时间复杂度O(log2 n)
i=1; //运行1次
while(i<=n){ //可假设运行x次
i=i*2; //可假设运行x次
}
渐进上界
渐进下界
空间复杂度
定义:算法占用的空间大小。
空间复杂度的本质是算法在运行空间中占用了多少存储空间。
算法占用的存储空间包括:
- 输入输出数据=>必须的
- 算法本身=>是指算法代码本身
- 额外需要的辅助空间=>也就是临时变量。
综上,第3项,辅助空间,是衡量算法空间复杂度的关键。
案例:
求5! 阶乘
空间复杂度O(n)
时间复杂度O(n)
计算机计算流程:
- 递推过程
- 回归过程
- 进栈过程
策略和算法的关系
策略是什么
我认为策略是一种解题思路,对问题进行归类,对特定的题目采用不同的策略进行解答。
举例:
递归策略
缺点:
- 递归算法解题相对常用的算法如普通循环等,运行效率较低。
- 应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。
- 递归次数过多容易造成栈溢出等:在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。
Fibonacci函数
斐波纳契数列
f(n) = f(n)+f(n-1)
汉诺塔问题
走楼梯问题
楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序计算共有多少种不同的走法.
n阶台阶的走法数为f(n)
f(1)=1 n=1
f(2)=2 n=2
f(n)=f(n-1)+f(n-2) n>2
快速排序
快速排序的思想是:先从数据序列中选一个元素,并将序列中所有比该元素小的元素都放到它的右边或左边,再对左右两边分别用同样的方法处之直到每一个待处理的序列的长度为1,处理结束.
其它题目
1.求数组中的最大数
2.1+2+3+…+n
3.求n个整数的积
4.求n个整数的平均值
5.求n个自然数的最大公约数与最小公倍数
6.有一对雌雄兔,每两个月就繁殖雌雄各一对兔子.问n个月后共有多少对兔子
7.已知:数列1, 1, 2, 4, 7, 13, 24, 44,…求数列的第 n项.
贪心算法
关系
仍在思考中。。