所有笔记PDF版本,外加一些习题和基本答案,已经上传至http://ishare.iask.sina.com.cn/f/25611722.html
-----------------------------------------------------------------------------------------
1. Introduction
算法作为计算机科学的一个重要分支,扮演者基础性的角色;此外,虽然摩尔定律中硬件制造和软件升级联动形成intel-win模式,但是算法改进获得的性能提升也是十分出色的;很多算法不仅仅适用于计算机领域,还推动了其它领域的发展;算法其实是一个很有趣的东西。
1.1 归并排序(MergeSort)
排序问题:
Input:由n个不重复数字组成的无序数组
Output:按升序将n个数字排列
对上面描述的排序问题,归并排序采用了分而治之的思想。
1.2 归并排序的伪代码
Merge_Sort(InputArray):
1.对输入数组分为两部分A和B
2.Merge_Sort(A)
3.Merge_Sort(B)
4.Merge(A,B)
end
Merge(A,B):
1.C=output[length=n] A=First sorted array [n/2] B=Second sorted array [n/2]
i=1 j=1
2.for k=1 to n:
If A(i)<B(j)
C(k)=A(i)
i=i++
else B[j]<A[i]
C[k]=B[j]
j=j+1
return C
end

1.4 算法分析
1.主要是分析最坏情况和平均情况
2.只关注算法本身而忽略其它因素(例如:编译器、编程语言等)
3.渐进分析,而不是精确分析
作为一个好的或者说快的算法,应该是运行时间(时间复杂度)在最坏情况下随着输入数据量的增加增长缓慢,通常认为线性增长是比较好的算法。
1.6 算法分析举例

1.7分而治之的应用
计算逆序数
问题描述:输入数组A含有n个数字(无序),需要计算其中的逆序数=对于任意的i小于j,若i处的元素比j处的大,则逆序数加1
例如对于数据A=1,3,5,2,4,6逆序对有(3,2)(5,2)(5,4)共3个。
对于含有n个元素的数组A来说,其逆序数最大为n(n-1)/2.
解决方案:如果进行遍历解决,需要,但利用分而治之的思想。
利用之前的归并排序,对于已经排好序的A和B来说(在Merge之前),A中任意的序号小于B,如果没有逆序数,即A中所有元素应该是小于B的,这样在Merge的时候加入小小操作,就能计算逆序数,总的运行时间和归并排序一样都为O(nlogn)。
本文介绍了归并排序的基本概念及实现方式,并通过实例详细解释了如何使用分而治之的方法来解决逆序数计算问题。同时,文章还探讨了算法分析的重要性,包括最坏情况与平均情况分析。
3744

被折叠的 条评论
为什么被折叠?



