数据结构与算法分析学习思维总结第一章

第一章引论

引论中心思想

1、在合理的时间内能够处理较大的数据量,才是一个切合实际的算法。

2、写出一个可以工作的程序并不够,如果在巨大数据集上运行,那么运行时间也成了重要问题。


所以学习算法的目之一:对于大量的输入,估计程序的运行时间,在尚未 具体编码的情况下比较两个程序的运行时间。并且改进程序的速度,确定程序瓶颈的方法

补:后面还会看到,如果输入量不大,而过多设计也是得不偿失的,不过不在算法讨论范围内,那可能叫做过度设计


引论中提出的数学概念

几何级数:几何级数是一个数学上的概念,可以表示成

  
,即x的y次方的形式增长,又叫等比级数。

算术级数:又称等差级数

斐波那契数:F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*) 可证明F(K+1)< (5/3)^(K+1)

数学归纳法:......

如果N整除A-B,那么我们就说A与B模同余。无论A还是B被N去除,所得余数都是相同的。


递归简论

递归的定义:当一个函数用它自己来定义时就称为是递归的。


C提供的仅仅是遵循递归思想的一种企图,不是所有的数学递归函数都能有效的由C的递归模拟来实现。

对于数值计算使用递归通常不是好主意。


递归的基本法则:

1.基准情况

2.不断推进

3.设计法则

4.合成效益法则:在求解一个问题的同一实例,切勿在不同的递归调用中做重复性的工作。

mod操作花消很大:

N%10 = N - [N/10] * 10



引论中心思想原由:

设有一组N个数而要确定其中第K个最大者(选择问题)。


解法一:冒泡法

就是用冒泡法,把N个数排列起来,取第K个。

该算法就是:想象共有N个气泡,大的气泡要往上浮动,由于气泡是连续的,相临气泡做对比,大的气泡最终到达上面。

然后对剩下的气泡继续排序,最终完成了排序。

所以运行时间为n + (n-1) + (n-2) + .... + 1 = n*(n-1)/2

即时间复杂度O(N^2)

今天仔细写了一下这个程序,发现一些问题。


根据程序细节,发现一个为N次的for循环,实际执行次数是2N,判断N次,加上自增N-1,加上初始值共2N次,每个for循环,系数应该乘以2。

每次冒泡从N个泡,以等差数列递减,但是递减过程中是执行了交换操作,每次交换是要执行3次的,所以系数应该乘以3。

综上,实际计算出来的n*(n-1)/2实际是for循环直接取其执行的次数,而没有乘以实际的系数。


http://blog.csdn.net/yuzhihui_no1/article/details/44339711#t5有冒泡法详细说明,我是按照自己理解说明的,以前好象看过一个算法动态图,但是没找到。

解法二:

将前K个元素读入数组,并以递减的顺序排序。接着将剩下的元素读入,如果有比第K个元素小的,那么把该元素放在正确的位置上,并挤走第K个元素。

a)先把K个元素排序,假设排序时间为T1,也可以用冒泡法k*(k-1)/2

b)读入剩下一个元素,假设正确位置是第一个,则调整数组时间最长,即后面N-1个数整体后移一位,时间为K

c)继续插入剩余的元素,则数组整体调整最长时间为(N-K )*K

所以运行时间为 k*(k-1)/2 + (N-K )*K = NK-K^2/2-K/2

至于两个算法的好坏就应该看K/N的比值了。

实际上相对来说,如果K是有限值,而N是无限值,即K/N 约等于0

那么第二种算法时间常数接近N



解法三:

第七章有一种方法可以在1S左右给出问题的解。

待补充


虽然前两个算法能算出结果,但是对于大量数据下,如K=500000下,需要计算若干天才能解决,所以前两种算法是不切实际的。

这就证明了

对于大量的输入,估计程序的运行时间,在尚未 具体编码的情况下比较两个程序的运行时间。并且改进程序的速度,确定程序瓶颈是算法的考量。


问题2:方格字谜

解法:

可以从(行、列、方向)上逐一组合,并且与单词表相比较。

如果只给出迷板,单词表是一本英文字典,则上面的解决方法消耗的时间是可观的。不过,这样的问题有可能在数秒内解决的,即使单词表很大。

待补充(引论挖的坑还真多)


引论数学公式证明:

待补充


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章