Python数据结构与算法(一)--算法和时间复杂度

最近下班一直在学习和总结Python,最近在整理数据结构和算法这方面的知识,虽然大学的时候也学过数据结构(c语言版本),但是工作这几年一直在做前端所以,这方面的知识也忘了差不多,所以就想整理一下,方便以后自己复习。

下面会说几段代码,是想说一下几个概念,1>大O表示法,它主要是用来表示算法效率的一个衡量方法,也叫时间复杂度的表示方法。2> 算法的特征。3>Python内置性能分析。

我们先看一道题 “如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?”

相信大家再看到这个题的时候一定有自己的思路,下面是第一种方法。

import timestart_time = time.time()
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("time: %d"%(end_time - start_time))
print("finished")

我们打印一下结果看计算出这个答案需要的时间。一共是 208秒

a, b, c : 0, 500, 500
a, b, c : 200, 375, 425
a, b, c : 375, 200, 425
a, b, c : 500, 0, 500
time: 208
finished

算法的概念是:算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个任务。简单来说算法是告诉计算机第一步干什么。第二步干什么....,然后就任务完成OK。

算法是独立存在的一种解决问题的方法和思想。

比如说上面这个问题,在JavaScript语言里面实现的语法就不一样了,但是解决这个问题的思路是一样的。对于算法而言,实现的语言并不重要,重要的是思想。
算法的五大特性:(了解)
    1、输入:算法具有0个或者多个输入。
    2、输出:算法至少有1个或者多个输出。(算法就是结果问题,解决问题后总要有个结果吧)
    3、又穷性:算法在有限的步骤之后会自动结束而不会无限循环。
    4、确定性:算法中的每一步都有确定的含义,不会出现二义性,
    5、可行性:算法的每一步都是可行的。

下面是另外一种方法实现上述问题。

import timestart_time = time.time()
for a in range(1001):for b in range(1001):c = 1000 - a - bif a**2 + b**2 == c**2:print("a, b, c: %d, %d, %d"%(a,b, c))end_time = time.time()print("time: %d"%(end_time - start_time))
print("finished")

我们来看一下结果和执行的时间。

a, b, c: 0, 500, 500
a, b, c: 200, 375, 425
a, b, c: 375, 200, 425
a, b, c: 500, 0, 500
time: 1
finished

可以看出算出来的答案和第一种方法一样,但是时间确实相差很大。第一次是208秒,第二次是1秒,相信大家一下就能看出两个算法的优劣了。

大家看到这个执行时间会有什么想法呢,我的想法是第二个算法的效率真高!这两个算法不同,那么算法的效率怎么衡量呢?

我们最直观的感觉是执行时间,比如上面两个算法,200多秒和1秒的差距还是挺大的。所以我们可以直观的得出一个结论“实现算法程序的执行时间可以反映出算法的效率,即算法的优劣“。

但是我们单看从执行时间来判断算法的优劣,这样可信吗?

假设我们将第二次尝试的算法程序运行在一台配置古老性能低下的计算机中,情况会如何?很可能运行的时间并不会比在我们的电脑中运行算法一的214.583347秒快多少。

单纯依靠运行的时间来比较算法的优劣并不一定是客观准确的!
程序的运行离不开计算机环境(包括硬件和操作系统),这些客观原因会影响程序运行的速度并反应在程序的执行时间上。
为了客观的反映出算法的优劣,提出了时间复杂度与“大O记法”。

我们先看一下 大O表示法的概念。

“大O记法:对于单调的整数函数f,如果存在一个整数函数g和实常数c>0,使得对于充分大的n总有f(n) < c*g(n),就是说函数g是f的一个渐进函数(忽略常数),记为f(n) = O(g(n))。也就是说,在趋向无穷的极限意义下,函数f的增长速度受到函数g的约束,亦即函数f与函数g的特征相似”

时间复杂度:假设存在函数g,使得算法A处理规模为n的问题示例所用时间为T(n)=O(g(n)),则称O(g(n))为算法A的渐近时间复杂度, 简称时间复杂度,记为T(n)

我们假定计算机执行算法每一个基本操作的时间是固定的一个时间单位,那么有多少个基本操作就会花费多少时间单位。虽然对于不同的机器环境而言,确切的单位时间是不同的,但是对于算法进行多少个基本操作(即花费的时间单位)在规模数量级却是相同的,由此可以忽略机器环境的影响而客观的反应算法的时间效率。
 简单来说 就是基本操作的数量。
我们先看第一个算法这个算法的操作的基本数量,对于一些加减乘除赋值来说,每一都算一个 步骤
    1000 * 1000 * 1000 * 9
    如果有 n 个话
    n * n *n *9 = n^3 * 9
我们看 第二个算法 这个算法的步骤
    1000 * 1000 * 9
    如果有n 个的话
    n *n * 9 = n^2 * 9

我们主要关注算法的最坏情况,亦即最坏时间复杂度

算法分析

01-demo.py 的T(n) = O(n*n*n) = O(N^3)

02-demo.py 的T(n) = O(n*n) = O(N^2)

由此可见,第二种算法要比第一种算法的时间复杂度好多了。

常见时间复杂度之间的关系

O(1) < O(log*n) < O(n) < O(n*log*n) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

via浏览器如何拦截广告

1、用户们需要先在主页的右上角点击横杠选项&#xff0c;打开列表选择“设置”功能。 via浏览器如何拦截广告 Via浏览器屏蔽广告方法介绍 2、而当大家进入设置页面后&#xff0c;就可以从中选择“通用”功能&#xff0c;找到其中的广告拦截功能进行开启。 via浏览器如何拦截…

win7系统出现0x0000001a蓝屏代码的解决教程

当我们在使用win7的时候&#xff0c;遇到了开机时蓝屏卡死并且出现0x0000001a蓝屏代码的情况时&#xff0c;小编觉得这种问题不是驱动除就是系统服务出错&#xff0c;可以尝试在运行中输入Chkdsk /r代码进行修复。或者是通过我们电脑上安装的第三方杀毒软件进行处理。想要了解详…

Python数据结构与算法(二)--timeit模块

Python内置性能分析&#xff0c;timeit模块 timeit模块可以用来测试一小段Python代码的执行速度。 class timeit.Timer(stmtpass, setuppass, timer<timer function>) Timer是测量小段代码执行速度的类。 stmt参数是要测试的代码语句&#xff08;statment&#xff09…

QQ浏览器怎么关闭云加速 QQ浏览器云加速关闭方法

QQ浏览器里面有个功能叫做云加速&#xff0c;这个功能能够让QQ浏览器的性能大幅度提高&#xff0c;但是鱼与熊掌不能兼得&#xff0c;有些网页因为不兼容云加速从而导致页面显示不正常。今天&#xff0c;小编为大家带来了QQ浏览器云加速关闭方法。感兴趣的朋友快来了解一下吧。…

Python数据结构与算法(三)--数据结构的概念

上一章我们看Python内置的模块可以测试代码的时间&#xff0c;有的代码执行时间短有的执行时间长&#xff0c;就是说效率不一样。 如果上面不明显的话&#xff0c;大家看下面两个方法。append() 和 insert(0) import timeit def t6():li []for i in range(10000):li.append(…

Win11开始菜单恢复Win10样式的方法

许多用户夹紧器都已经抢先体验升级了Windows11系统&#xff0c;但是对于一些用户来说&#xff0c;Windows11开始菜单的界面不是非常好用&#xff0c;想要将开始菜单改成Win10的样子。那么我们要怎么调整呢?下面小编就为大家具体讲解一下吧! Win11开始菜单恢复Win10样式的方法…

Python数据结构与算法(四)--顺序表

顺序表 在程序中&#xff0c;经常需要将一组&#xff08;通常是同为某个类型的&#xff09;数据元素作为整体管理和使用&#xff0c;需要创建这种元素组&#xff0c;用变量记录它们&#xff0c;传进传出函数等。一组数据中包含的元素个数可能发生变化&#xff08;可以增加或删…

怎么修改腾讯视频的昵称

1、打开腾讯视频&#xff0c;点击打开个人中心。 如何在腾讯视频下载视频_怎么修改腾讯视频的昵称 2、然后此时选择箭头指向位置&#xff0c;打开头像。 如何在腾讯视频下载视频_怎么修改腾讯视频的昵称 3、此时点击上方的编辑个人资料&#xff0c;进入其中。 如何在腾讯视…

Python数据结构与算法(五)--链表

链表 链表的定义: 链表&#xff08;Linked list&#xff09;是一种常见的基础数据结构&#xff0c;是一种线性表&#xff0c;但是不像顺序表一样连续存储数据&#xff0c;而是在每一个节点&#xff08;数据存储单元&#xff09;里存放下一个节点的位置信息&#xff08;即地址…

via浏览器如何使用插件 Via浏览器添加使用插件教程

1、尽管Via浏览器的体积小巧&#xff0c;但其中提供的功能可谓是五脏俱全&#xff0c;而想要体验更多服务的话&#xff0c;就需要去安装插件了&#xff0c;这需要大家点击右上角的横杠选项&#xff0c;并且从列表里选择“设置”功能。 via浏览器如何使用插件 Via浏览器添加使用…

Python数据结构与算法(六)--栈和队列

栈和队列 栈&#xff08;stack&#xff09;&#xff0c;有些地方称为堆栈&#xff0c;是一种容器&#xff0c;可存入数据元素、访问元素、删除元素&#xff0c;它的特点在于只能允许在容器的一端&#xff08;称为栈顶端指标&#xff0c;英语&#xff1a;top&#xff09;进行加…

win7系统如何提高电脑运行速度

win7系统是一款被大多数用户们认可的好用系统&#xff0c;在不断的对win7系统的使用中很多用户们都在寻找win7提高电脑运行速度的方法?今天小编就为大家带来了win7老电脑提升速度的解决办法让我们一起来看一下win7系统提高电脑运行速度的解决方法吧。 win7系统如何提高电脑运…

Python排序算法(一)冒泡排序、选择排序、插入排序

今天总结一下Python中的排序算法。这篇文章有的排序算法是&#xff1a;冒泡排序、选择排序、插入排序。 冒泡排序 先看一下代码。 冒泡排序 def bubble_sort(aList):n len(aList)for i in range(0, n - 1):for j in range(0, n - i - 1):if aList[j] > aList[j 1]:aList…

Win7系统虚拟键盘打开的方法

有时候自己的键盘使用久了以后经常会突然坏掉&#xff0c;这个时候我们可以开启电脑自带虚拟键盘来解燃眉之急。那么Win7的虚拟键盘该怎么打开?今天就和小编一起来看看Win7系统虚拟键盘打开的方法吧。 Win7系统虚拟键盘打开的方法 1、打开电脑左下角的“开始”&#xff0c;然…

Python排序算法(二) 快速排序、希尔排序、归并排序

这篇文章有的排序算法是&#xff1a;快速排序、希尔排序、归并排序。 快速排序 快速排序 def quick_sort(aList, first, last):if first > last:returnmin_val aList[first]low_index firsthight_index lastwhile low_index < hight_index:# hight 左移动while low_i…

怎么开启搜狗高速浏览器的手动升级?

搜狗高速浏览器是一款很好用的浏览器软件&#xff0c;随着软件的完善&#xff0c;我们也要对软件进行升级&#xff0c;才能享受更多更优质的功能&#xff0c;我们可以用手动升级来代替提示升级和自动升级所带来的不便&#xff0c;那么&#xff0c;怎么操作呢?下面就由小编来教…

Vue里引入three.js

最近因为three.js的项目要用Vue.js 来重构&#xff0c;所以不太清楚在Vue里面怎么引入。找了很多方法都是一直报错&#xff0c;最后在Stack Overflow找到了。 首先是下载包&#xff0c;直接用 npm install three --save 就行了。 然后就是在component里面引入。 <templat…

正则总结(Python)

正则大家都不陌生&#xff0c;工作中一定会接触到。最近在Python中用的了正则&#xff0c;所以顺便整理一下。 一、re模块的使用 #导入 re模块 import re# 使用match方法进行匹配操作 result re.match(正则表达式, 要匹配的字符串)# 如果上一步匹配到数据的话&#xff0c;可…

怎样查看优酷视频播放记录?

当我们在优酷上观看视频时&#xff0c;有时可能由于没空并不能一次性看完;或者&#xff0c;对于一些视频合集&#xff0c;也可能没有兴趣将其中的所有剧集挨个看遍&#xff0c;通常只是挑了那么一两个尝了尝鲜……这样一来&#xff0c;当下次来到优酷想接着播放时&#xff0c;对…

python二分法查找

常见的搜索方法&#xff1a;顺序查找、二分法查找、二叉树查找、哈希查找。 二分法查找 二分查找又称折半查找&#xff0c;优点是比较次数少&#xff0c;查找速度快&#xff0c;平均性能好&#xff1b;其缺点是要求待查表为有序表&#xff0c;且插入删除困难。因此&#xff0…