28_python数据结构——算法引入

一、算法的概念

算法(Algorithm):算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

二、算法的特性

1、输入输出
算法具有零个或多个输入;算法至少有一个或多个输出。
2、有穷性
指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。
3、确定性
算法的每一步骤都具有确定的含义,不会i出现二义性
4、可行性
算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。

三、算法设计的要求

1、正确性
算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性,能正确反映问题的需求、能够得到问题的正确答案

2、可读性
算法设计的另一目的是为了便于阅读、理解和交流。
3、健壮性
当输入数据不合法时,算法也能作出相关的处理,而不是产生异常或莫名奇妙的结果。
4、时间效率高和存储量低

四、算法的效率衡量

  1. 执行时间反应算法效率内容
    实现算法程序的执行时间可以反映出算法的效率,即算法的优劣。
  2. 单靠时间值绝对可信吗?
    程序的运行离不开计算机环境(包括硬件和操作系统), 单纯依靠运行的时间来比较算法的优劣并不一定是客观准确的!
    3、时间复杂度与大“O”算法
    时间复杂度:假设存在函数g,使得算法A处理规模为n的问题示例所用时间为T(n)=O(g(n)),则称O(g(n))为算法A的渐近时间复杂度,简称时间复杂度,记为T(n)
    假定计算机执行算法每一个基本操作的时间是固定的一个时间单位,那么有多少个基本操作就代表会花费多少时间单位。

“大O记法”: 计量算法基本操作数量的规模函数中那些常量因子可以忽略不计

最优时间复杂度, 最坏时间复杂度, 平均时间复杂度
在这里插入图片描述
没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度.

五、时间复杂度

在这里插入图片描述
在这里插入图片描述
timeiit 模块可以用来测试一小段Python代码的执行速度

六、性能分析

1、先来看一道题:
如果 a+b+c=1000,且 a2+b2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?
解法一:

import time
start_time =time.time()

for a in range(0,1001):
    for b in range(0,1001):
        for c in range(0,1001):
            if a+b+c == 1000 and a**2 +b**2 ==c**2:
                print(a,b,c)

end_time =time.time()
print('Run:%6.f'%(end_time-start_time))  #计算程序运行时间

在这里插入图片描述

解法二:

import time
start_time =time.time()

for a in range(0,1001):
    for b in range(0,1001-a):
        c = 1000-a-b
        if a**2 + b**2 == c**2:
            print(a, b, c)

end_time =time.time()
print('Run:%.6f'%(end_time-start_time))

在这里插入图片描述
对比两程序,虽然都能解决问题,但是两程序的运行时间相比,可以体现出算法的重要性

2、求素数对——给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))

def isPrime(num):
    """判断传入的是否为素数,返回bool类型"""
    if num < 2:
        return False
    else:
        for item in range(2,num):
            if num % item ==0:
                return False
        else:
            return True

if __name__ == '__main__':
    num = int(input("请输入一个正整数:"))
    #统计0-num 之间所有的素数
    prime_nums =[item for item in range(2,num+1) if isPrime(item)]

    #统计素数对的变量  默认为0
    prime_pair_count =0
    #依次遍历所有的素数
    for item in prime_nums:
        item2 =num -item
        if item2 in prime_nums and item<= item2:
            prime_pair_count +=1
            print(item,item2)
    print(prime_pair_count)

在这里插入图片描述

3、通过生成列表测试

def list_JionOperator():
    """通过连接操作符创建"""
    li =[]
    for i in range(1000):
        li = li + [i]

def list_Append():
    """通过append方法"""
    li =[]
    for i in range(1000):
        li.append(i)
def list_Generator():
    """通过列表生成式"""
    li =[i for i in range(1000)]
def list_Range():
    list(range(1000))

if __name__ == '__main__':
    import timeit
    t1 =timeit.Timer('list_JionOperator()',"from __main__ import list_JionOperator")
    print(t1.timeit(number=1000))
    t2 = timeit.Timer('list_Append()', "from __main__ import list_Append")
    print(t2.timeit(number=1000))
    t3 =timeit.Timer('list_Generator()',"from __main__ import list_Generator")
    print(t3.timeit(number=1000))
    t4 = timeit.Timer('list_Range()', "from __main__ import list_Range")
    print(t4.timeit(number=1000))

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值