python数据结构与算法(一)-概念引入

1.为什么需要数据结构与算法?

我们举一个可能不太恰当的例子:

  • 如果将最终写好运行的程序比作战场,我们码农便是指挥作战的将军,而我们所写的代码便是士兵和武器。
  • 那么数据结构与算法是什么?答曰:兵法!
  • 我们可以不看兵法在战场上肉搏,如此,可能会胜利,可能会失败。即使胜利,可能也会付出巨大的代价。

我们写程序亦然:没有看过数据结构和算法,有时面对问题可能会没有任何思路,不知如何下手去解决;大部分时间可能解决了问题,可是对程序运行的效率和开销没有意识,性能低下;有时会借助别人开发的利器暂时解决了问题,可是遇到性能瓶颈的时候,又不知该如何进行针对性的优化。

如果我们常看兵法,便可做到胸有成竹,有时会事半功倍!同样,如果我们常看数据结构与算法,我们写程序时也能游刃有余、明察秋毫,遇到问题时亦能入木三分、迎刃而解。
故,数据结构和算法是一名程序开发人员的必备基本功,不是一朝一夕就能练成绝世高手的。冰冻三尺非一日之寒,需要我们平时不断的主动去学习积累。

2.案例引入

2-1. 题目需求:

如果 a+b+c=1000,且 a2+b2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?

2-2. 解决思路: 枚举法;

a可能为数字0~1000, b可能为数字0~1000, c可能为数字0~1000, 那么当a=0, b=0时, 让变量c变化,找出符合条件的; 当a=0时, 让变量b和c变化, 找出符合条件的b和c; 然后让c变化, 找出符合条件的。 这里需要for循环的嵌套来实现。

  • 枚举法总结:
    将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,合适就保留,不合适就丢弃。

  • 代码实现



import time

# 计算程序开始的时间戳(从1970年到现在经历的秒数)
start_time = time.time()

# 枚举法,找到符合条件的a,b,c并打印;
for a in range(1001):
    for b in range(1001):
        for c in range(1001):
            if a + b + c == 1000 and a ** 2 + b ** 2 == c ** 2:
                print("a,b,c:%d %d %d" % (a, b, c))

# 计算程序结束的时间戳
end_time = time.time()

# 打印程序的总运行时间;
print("run time:", end_time - start_time)

2-3. 代码执行效果图

在这里插入图片描述

  • 运行时间很久, 显然是一个失败的算法,将近用了4分钟,那么有没有更好的解决方法?
    我们先明确一下这道题的一些要求和规律,当中的 A,B,C 其当中的一个数和另外的两个数是有关系的,当我们知道 A,B的时候 C的结果其实已经被确定了,我们可以把结果抽象成算式 C = 1000 - B - A

3.算法

3-1. 算法的概念

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

3-2. 算法的五大特性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值