数据结构学习笔记0——算法分析

种一棵树最好的时间是十年前,其次是现在。

如果说数学是一切工程研究的基础,那么数据结构就是一切计算机编程研究的基础。如果说计算机编程中各种编程语言是武功招式的话,那么数据结构可以说是内功心法了,数据结构在计算机编程中的重要性是不言而喻的。所以一定要打下坚实的数据结构基础。所以把学习过程中的总结记录下来,一来自己巩固一下知识,二来也可以跟大家交流一下。

一般来说,在学习数据结构之前,需要有一定的数学基础铺垫,当然都是非常基础的,都是高等数序和离散数学里面的基础内容。比如指数对数运算、级数运算、逻辑运算、排列组合和证明方法等等。这些基础知识也没必要在这里赘述。

最先我们接触到的就是算法分析,一般来说,算法是求解一个问题需要遵循的、被清除的指定的简单指令的集合。这里可以看出算法需要具有确定性、正确性和有穷性,但是我们需要清楚的认识到算法还必须具有可行性,算法执行所需要的时间和空间都需要在合理的范围内,想象一下一个程序执行一下需要一年的时间,或者需要100T的内存,这些都是不符合算法设计要求的。

那么问题来了,如何去度量一个算法或者一个程序执行需要的时间和空间,这里我们有了复杂度的概念,包括时间复杂度和空间复杂度。我们这里先来讨论一下时间复杂度。

这里迷(wan)人(e)的数学又来了,我们有了大Ο、大Ω、大Θ的概念,简单理解一下,大Ο就是上界的意思,大Ω就是下界的意思,那大Θ就是差不多增长一样快咯。如果非要给一个准确的定义的话,那就是,如果存在正常数c和n使得当N≥n时T(N)≤cf(N),则记为T(N)=O(f(N));T(N)≥cf(N),则记为T(N)=Ω(f(N));当且仅当T(N)=O(f(N))且T(N)=Ω(f(N)),T(N)=Θ(f(N))。还有一个小o,如果T(N)=O(f(N))且T(N)≠Θ(f(N)),T(N)=o(f(N))。

知道了这些之后,我们还需要一个模型,一个统一化的计算机,他执行简单的指令,而且只存在这些指令,而且执行每个简单指令的时间是一样的,还假设这个标准的计算机有无限的内存。当然这存在一些不当之处,但是用来衡量算法的性能还是合适的。在计算时,还要考虑不同的输入带来的影响,一般情况下,我们去考虑最坏的情况,因为这表示了问题的上界。

下面就可以开始计算一个算法的时间复杂度了,这里我们需要把握几个法则:
1. 顺序执行语句
简单的把各个语句加起来就可以了。。。
2. 判断(if/else)语句
不超过一个判断的执行时间加上判断体里面执行时间长的那个的时间长度。
3. 简单for循环
循环体里面的语句执行时间长度乘以循环的大小即可。
4. 嵌套for循环
循环体里面的语句执行时间长度与所有循环的大小的乘积。
5. while循环
这个就要具体分析了,我还不知道有固定的计算方法,虽说上面的各种情况也需要具体问题具体分析,但是一般情况下是可以用上述方法计算的。对于while循环就举个栗子来说吧。

i=n^n;
while(i!=1)
    i=i/2;

对于这个来说,时间复杂度:T(n)=O(logn)。

最后还有一种特殊的情况,就是递归的情形,如果递归的实质只是循环的话,这样的递归分析起来是比较简单的,另外还有一种递归实质是真的递归,这个分析起来就比较复杂了,有时候看起来简单的递归可能效率低到没朋友,所以不是看起来越简单的代码就是越好的。

对了,还有一个规律,就是如果一个算法用O(1)时间把一个问题的大小减少到其一部分,那么这个算法就是O(logN)的,如果用O(1)时间把一个问题的大小减少常数大小,那么就是O(N)的。

好了,这部分就写到这了,好像还没涉及到空间复杂度,还没学习到。。。学习到了再写吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值