一. Python数据结构与算法(1概念引入)

提示:数据结构与算法(Python语言描述)——完整顺序版_哔哩哔哩_bilibili

目录

前言

0 为什么要学习数据结构与算法

1. 引入

1.1 算法的概念:

1.2 算法的五大特性

1.3 算法效率的二次改进

1.4 算法效率的衡量


前言

本节主要引入复杂度这个概念,通过一个例子不同的解法来解释算法复杂度的重要性。


0 为什么要学习数据结构与算法

如果将最终写好运行的程序代码比作战场,我们码农便是指挥作战的将军,而我们所写的代码便是士兵和武器
那么数据结构和算法是什么? 答曰:兵法!
我们可以不看兵法在战场上肉搏,如此,可能会胜利,可能会失败。即使胜利,可能也会付出巨大的代价。
我们写程序亦然:没有看过数据结构和算法,有时面对问题可能会没有任何思路,不知如何下手去解决;大部分时间可能解决了问题,可是对程序运行的效率和开销没有意识,性能低下;有时会借助别人开发的利器暂时解决了问题,可是遇到性能瓶颈的时候,又不知该如何进行针对性的优化。
如果我们常看兵法,便可做到胸有成竹,有时会事半功倍!同样,如果我们常看数据结构与算法,我们写程序时也能游刃有余、明察秋毫,遇到问题时亦能入木三分、迎刃而解。故,数据结构和算法是一名程序开发人员的必备基本功,不是一朝一夕就能练成绝世高手的。冰冻三尺非一日之寒,需要我们平时不断的主动去学习积累。通过接下来的学习,我们希望让大家能理解其概念,掌握常用的数据结构和算法

1. 引入

首先先来看下面这一道题

针对这一道题,我们首先可能想到的就是一个非常笨的方法就是一个一个去试。这个是我们首先想到的第一个笨方法,那么这个东西其实是有一个方法在里边的——枚举法(顾名思义,“一枚一枚”去试)

那么一个整体的思路如下:我们首先就是a,b,c都从0开始,然后以c从0加到1000;如果c加到1000以后,就让b+1,再让c加到1000就这样不停地试。其实,我们人为就可以试出来,但是过于费时,因此我们不如让计算机来帮我们实现这样的一个功能。这就是枚举法的一个整体思想。

那么根据穷举法写出的Python代码及打印内容如下:

知识点1time.time()可以输出时间戳,用end_time-start_time并打印出来刚好可以看到运行时间。

因此,同样的,如果我们将1000换成了2000,我们也一样可以通过枚举法来获得我们想要的答案。

1.1 算法的概念:

算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务。一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。算法是独立存在的一种解决问题的方法和思想。对于算法而言,实现的语言并不重要,重要的是思想。例如,面对刚才的问题,我们有了思路,也完全可以用其它语言来实现。

1.2 算法的五大特性

1.输入:算法具有0个或多个输入;
2.输出:算法至少有1个或多个输出;
3.有穷性: 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成(如果你写个算法需要运行一万年,没有意义);
4.确定性: 算法中的每一步都有确定的含义,不会出现二义性;
5.可行性: 算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成;

1.3 算法效率的二次改进

就像刚才那个问题,我们使用了三个for循环来输出我们想要的数据,但是效率很低,用了144秒才完成这个任务。为了提升算法的效率,我们应该对代码进行改进,利用其它一些信息来简化代码以此来提高我们的效率。

例如:如果我们确定了a和b,那么c完全可以通过a+b+c=1000这个公式来确定。因此,我们就没有必要将c也来一个for循环。所以,简化后的代码以及打印结果如下所示:

可以看到相对于刚才的代码,这个算法只用1秒就可以输出我们想要的结果。

1.4 算法效率的衡量

对于同一问题,我们给出了两种解决算法,在两种算法的实现中,我们对程序执行的时间进行了测算,发现两段程序执行的时间相差悬殊(214.583347秒相比于0.182897秒),由此我们可以得出结论: 实现算法程序的执行时间可以反应出算法的效率,即算法的优劣

单靠时间绝对可信吗?

假设我们将第二次尝试的算法程序运行在一台配置古老性能低下的计算机中,情况会如何? 很可能运行的时间并不会比在我们的电脑中运行算法一的214.583347秒快多少。(也就是一个很可能甚至需要花1天,另外一个可能需要花几个小时,但其实两者花的时间都不短)
因此单纯依靠运行的时间来比较算法的优劣并不一定是客观准确的! 程序的运行离不开计算机环境(包括硬件和操作系统),这些客观原因会影响程序运行的速度并反应在程序的执行时间上。那么如何才能客观的评判一个算法的优劣呢?

时间复杂度和大"O"计法:

我们假定计算机执行算法每一个基本操作的时间是固定的一个时间单位,那么有多少个基本操作就代表会花费多少时间单位。算然对于不同的机器环境而言,确切的单位时间是不同的,但是对于算法进行多少个基本操作(即花费多少时间单位)在规模数量级上却是相同的,由此可以忽略机器环境的影响而客观的反应算法。因此时间复杂度可以狭义定义为基本数量总和就是时间复杂度。

如上图,我们一共需要做1000*1000*1000*2次操作。那么如果问题变为2000或者是N,我们就可以称时间复杂度为:T(N)=N*N*N*2

但是对于算法进行特别具体的细致分析虽然很好,但在实践中的实际价值有限。对于算法的时间性质和空间性质,最重要的是其数量级和趋势,这些是分析算法效率的主要部分。而计量算法基本操作数量的规模函数中那些常量因子可以忽略不计。例如,可以认为3n“和100n“属于同一个量级,如果两个算法处理同样规模实例的代价分别为这两个函数,就认为它们的效率“差不多”,都为n级。也就是基本可以这样认为T(N)=N**3。因此就可以认为100n^2=n^2是同一数量级。

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值