前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >《从入门到放弃》数据结构和算法 1- 算法的引入和算法时间复杂度

《从入门到放弃》数据结构和算法 1- 算法的引入和算法时间复杂度

作者头像
北京-宏哥
发布于 2020-02-11 10:32:34
发布于 2020-02-11 10:32:34
63700
代码可运行
举报
文章被收录于专栏:北京宏哥北京宏哥
运行总次数:0
代码可运行

1. 简介 

  最近由于快过年了,不是很忙碌了,人心浮动,很多都请假了,现在终于有时间来系统学习下和恶补一下常见数据结构和算法的知识,所以,还是通过记录笔记放在博客的方式来督促自己学习。同时和小伙伴们分享一下学习心得与体会。算法对于很多程序员都接触不到的,何况是一个测试人员。但是面试过程中,多多少少都有算法题的面试。所以,学习算法,短期来看是为了跳槽准备,长期来看,是锻炼一个人解决问题的思路的提升的一个途径。

2. 算法的引入

  来看一个问题:如果 a+b+c = 1000, 且 a^2 + b^2 = c^2(勾股定理),如何求出所有a b c的组合。

2.1 问题分析:

  上面告诉两个条件,从数学角度来说,上面有3个未知数,只有两个表达式条件,我们第一反应是转换成二元二次方程来解答。这里我们是计算机通过代码来解决问题。字面意思就是 a的取值范围是0到1000, b的取值范围是0到1000, c的取值范围是0到1000, 然后加上题目的两个表达式条件,利用for嵌套循环,计算机肯定能帮我们找出a b c的取值。

2.2 代码实现:

  根据上面的分析,python代码实现如下:

2.3 参考代码:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# coding=utf-8
# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2020-1-02
@author: 北京-宏哥
Project:《从入门到放弃》数据结构和算法 1- 算法的引入和算法时间复杂度
'''
# 3.导入模块

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: %d, %d, %d" % (a, b, c))
end_time = time.time()
print(end_time - start_time)
2.4 运行结果:

  其实上面代码思路也是用到了一个方法,叫枚举法,就是一个一个列出来去尝试,不行,换下一个值继续去匹配。

  运行代码后,控制台打印如下图的结果:

  也就是差不多花费三分钟(117秒多),找出了符合条件的a b c的四种取值组合。如果没有计算机,人也是可以根据这个思路,一步一步去算,只不过时间更是不知道有多慢。这个时间开销,我们很不满意,对用户来说,还是太慢了。有没有什么办法提升以下计算效率。

2.5 优化上面代码:

  根据数学知识,我们用代码实现二元二次方程的思路,c = 1000 - a - b; 来减少第三层嵌套for循环。

2.5.1 代码实现:
2.5.2 参考代码:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# coding=utf-8
# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2020-1-02
@author: 北京-宏哥
Project:《从入门到放弃》数据结构和算法 1- 算法的引入和算法时间复杂度
'''
# 3.导入模块

import time

start_time = time.time()
for a in range(0, 1001):
    for b in range(0, 1001):
        c = 1000-a-b
        if a**2 + b**2 == c**2:
            print("a, b, c: %d, %d, %d" % (a, b, c))
end_time = time.time()
print(end_time - start_time)
2.5.3 运行结果:

  运行代码后,控制台打印如下图的结果

  这么一看,发现时间缩短了不到2秒,这个计算效率大大提升。同样解决一个问题,由于我们第二种方法减少了一次for循环嵌套,导致计算效率提高了很多倍,这个就是算法的重要性。

3. 什么是算法

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

算法的五大特性: 1:输入:算法具有0个或多个输入 2:输出:算法至少有一个或多个输出 3:有穷性:算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成 4:确定性:算法内的每一步都有确定的含义,不会出现二义性。 5:可行性:算法的每一步都是可行的,也就是说每一步都能执行有限的次数完成。

4. 时间复杂度和大O表示法

  上面我们通过两个方法来求出a b c的取值组合,第二个方法比第一个方法,从时间效果来看,快很多,所以我们很容易得出结论,第二个算法比第一个算法效率要高。那么算法是通过时间来衡量,确实最直观地,我们从时间上来看到算法和算法之间的效率不同。但是,单靠时间是不可靠的,例如,同一个算法,在一个I7的CPU上运行和拿到一个1995年之前的个人PC电脑上运行,这种时间来比较就有点不合适了。所以,我们一般从算法的执行计算数量这个维度去考察算法的效率。执行数量可以这么理解,上面3个for循环嵌套的代码,每一行代码都有确定的执行步骤数量,所有代码行的执行步骤数量相加,就得到了这个算法的执行步骤数量。因为每台机器要执行这么多步骤数量大体相同,所以这个执行步骤数量就拿来衡量算法的效率。

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

对于算法的时间效率,我们可以用“大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)

5. 如何理解“大O记法”

  我们通过“大O记法”的定义,我们来计算下上面 a b c这题的第一种代码实现方式的时间复杂度的计算过程。

  我们根据上面这个图代码对应行来分析(第4到8行代码),先分析每行代码执行步骤数目。

  分析过程:

  第4行:a的取值范围是0到1000,所以这个for循环要执行1000次

  第5行:b的取值范围是0到1000,所以这个for循环要执行1000次

  第6行:c的取值范围是0到1000,所以这个for循环要执行1000次

  第7行:如果不细分步骤,第7和第八两行当作2个步骤,如果细分,a + b + c是一个步骤, 判断a + b + c ==1000是一个步骤,a**2是一个步骤,所以细分,第七行存在需要执行 8个步骤数目。

  这样,我们把每一行代码需要执行步骤次数计算出来是

  T = 1000 * 1000 * 1000 * 8   简写成 T = 8*1000^3   如果,这里把1000改成n, 把这个问题规模扩大,这个算法的时间复杂度可以写成

  T(n)= 8*n^3   我们在计算时间复杂度的时候,只关注大头部分,会去掉旁支末节部分,一般我们可以这样认为 n^3和1000*n^3是等价,所以我们上面文章开头写的第一种枚举法的时间复杂度是 O(n^3)。

  根据这个时间复杂度计算原则,我们计算第二种算法的时间复杂度为O(n^2),这个比第一个效率要高,当然如果时间复杂度为n^1,那么这个算法效率就更高。

6.小结

  好了,今天的分享就到这里吧!!!谢谢各位的耐心阅读。有问题加群交流讨论!!!

您的肯定就是我进步的动力。如果你感觉还不错,就请鼓励一下吧!记得随手点波 推荐 不要忘记哦!!!

别忘了点 推荐 留下您来过的痕迹

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-01-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
怎么关闭135 445端口_高危端口关闭方法
1、打开“控制面板”→打开“系统和安全”→打开“系统和安全”→打开“windows防火墙”
全栈程序员站长
2022/11/19
21.4K0
怎么关闭135 445端口_高危端口关闭方法
关闭445端口最简单方法_电脑445端口关闭有什么影响
445端口怎么关闭,445端口关闭方法介绍。勒索病毒的来袭,不少小伙伴的电脑都被侵袭了,小伙伴们需要解决问题,其中就需要关闭445端口,445端口怎么关闭,西西小编来为大家介绍445端口关闭方法。
全栈程序员站长
2022/11/03
3.5K0
关闭445端口最简单方法_电脑445端口关闭有什么影响
计算机的139 135 445端口关闭_系统端口设置在哪里
近期永恒之蓝勒索病毒迅速传播,基本上都是通过135,137,138,139,445等端口入侵,关闭445 135 137 138 139端口是有效预防入侵的方式之一,同时更新微软最新补丁,及时备份重要数据,才能从容应对病毒侵袭,下面重点介绍关闭135,137,138,139,445端口方法。
全栈程序员站长
2022/09/27
2.9K0
计算机病毒445端口,关闭135 445端口_445端口关闭方法_怎么防止电脑中勒索病毒「建议收藏」
这几天,永恒之蓝勒索病毒迅速传播,让网友们都担惊受怕。而这种勒索病毒基本上都是通过135,137,138,139,445等端口入侵,关闭445 135 137 138 139端口是有效预防入侵的方式之一,同时更新微软最新补丁,及时备份重要数据,才能从容应对病毒侵袭,现在就快和小编一起来看看关闭135,137,138,139,445端口方法吧。
全栈程序员站长
2022/11/02
3.3K0
Windows系统安全|135、137、138、139和445端口
首先,这几个端口都是与文件共享和打印机共享有关的端口,而且在这几个端口上经常爆发很严重的漏洞。比如2017年危害全球的永恒之蓝,就是利用的445端口。
谢公子
2022/01/19
19K0
如何关闭139端口及445端口等危险端口_windows端口关闭工具
项目进行安全测试时,使用Nmap扫描端口,发现了几个未关的端口,容易受到黑客的攻击和病毒感染,所以需要关掉。
全栈程序员站长
2022/11/02
10.7K0
Win7如何简单的关闭445端口及445端口入侵详解
最近永恒之蓝病毒攻击了很多教育网的同学,然后我就搜集了如何关闭445端口的方法,下面分享出来一起学习。
全栈程序员站长
2022/07/02
4.5K0
Win7如何简单的关闭445端口及445端口入侵详解
​【收藏】感染勒索病毒处置办法
百度百科给勒索病毒的定义是一种新型电脑病毒,主要以邮件、程序木马、网页挂马的形式进行传播。该病毒性质恶劣、危害极大,一旦感染将给用户带来无法估量的损失。
释然IT杂谈
2022/10/27
1.6K0
​【收藏】感染勒索病毒处置办法
win10关闭135 139 445端口_windows中如何关闭端口
关闭445端口- 首先进入系统的”注册表编辑器“,步骤是:依次点击”开始“,”运行“,输入regedit进入”注册表编辑器“。
全栈程序员站长
2022/11/03
9.3K0
windows7如何关闭445端口_win10重装win7的后果
勒索病毒最新变种2.0已导致我国的很多行业遭受袭击。勒索病毒是通过入侵端口传播,主要是445端口,用户可以通过关闭445端口可以有效预防勒索病毒。下面重点介绍如何关闭445端口。
全栈程序员站长
2022/11/03
2.9K0
windows7如何关闭445端口_win10重装win7的后果
win10安装nfs服务器并实现liunx访问「建议收藏」
b.右键以管理员身份运行nfs server(若不以管理员身份打开,设置项均为灰色不可设),切换到“Exports”标签页,点击“Edit exports file”进行编辑,如下图所示。比如”E:\Video”为win10下要共享的路径,“-name:video”表示将文件夹命名为在nfs服务器上的名字。设置完成后点击“Restart Server”重启服务。
全栈程序员站长
2022/07/29
3.5K0
win10安装nfs服务器并实现liunx访问「建议收藏」
445端口如何正确的修改和关闭
我们都知道,有些专业的黑客可以通过开放端口对windows系统进行攻击,但是很多状况下我们忘了把用不到的端口关闭,特别是一些程序调用了该端口过后没有及时关闭。下面小编分享Win7系统关闭445方法及相关知识。我就搜集了如何关闭445端口的方法,下面分享出来一起学习。
it妹
2019/08/06
12.5K0
445端口如何正确的修改和关闭
windows关闭135,139端口_危险端口有哪些
我用nmap扫描自己的主机,发现自己的某些端口开启着的 139端口 这个端口比较危险 139端口是NetBIOS Session端口,用来文件和打印共享 如果你是单机,不是企业内部网里的成员,为了保护计算机的安全关闭这个端口比较好。 135 137 139 445 3389 这些端口都比较危险,开启这些端口对我们普通用户来说并没有什么用,所以关闭掉
全栈程序员站长
2022/11/03
2.4K0
windows关闭135,139端口_危险端口有哪些
windows关闭端口方法「建议收藏」
在介绍各种端口的作用前,这里先介绍一下在Windows中如何关闭/打开端口,因为默认的情况下,有很多不安全的或没有什么用的端口是开启的,比如Telnet服务的23端口、FTP服务的21端口、SMTP服务的25端口、RPC服务的135端口等等。为了保证系统的安全性,我们可以通过下面的方法来关闭/开启端口。
全栈程序员站长
2022/09/06
20K0
windows关闭端口方法「建议收藏」
"WannaCry"勒索蠕虫用户处置指南
前言 2017年5月12日晚,勒索软件"WannaCry"感染事件爆发,全球范围内99个国家遭到大规模网络攻击,被攻击者电脑中的文件被加密,被要求支付比特币以解密文件;众多行业受到影响,比如英国的NHS服务,导致至少40家医疗机构内网被攻陷,电脑被加密勒索;而我国众多行业的也是如此,其中又以教育网最为显著,导致部分教学系统无法正常运行,相关学子毕业论文被加密等。截止到北京时间5月15日09点,目前事件趋势已经蔓延到更多行业,包含金融、能源、医疗、交通等行业均受到影响。 今年4月14日黑客组织Shadow
云鼎实验室
2023/05/31
4260
"WannaCry"勒索蠕虫用户处置指南
速扩散 !敲诈勒索病毒入侵99个国家,这样做可以免遭勒索
5月12日,全球范围内99个国家遭到大规模网络攻击,被攻击者被要求支付比特币解锁。其中英国的 NHS 服务受到了大规模的网络攻击,至少 40 家医疗机构内网被黑客攻陷,电脑被勒索软件锁定,这些医疗机构被要求支付约 300 美元的比特币来解锁电脑,否则所有的资料将被删除。同时俄罗斯,意大利,整个欧洲都受到不同程度的威胁。 在12日晚,我国的多所高校,也遭遇了比特币敲诈者病毒攻击。用户电脑上的文件全部被锁,需要缴纳赎金才能解锁。目前中毒趋势正在全国蔓延,影响范围极大,同时当下处在高校毕业季,很多学子精心制作的毕
腾讯高校合作
2018/03/21
1.1K0
速扩散 !敲诈勒索病毒入侵99个国家,这样做可以免遭勒索
怎样关闭和复原135 、139 、445端口?
关于这几个端口,我跟微软工程师电话沟通过,微软不推荐关闭,建议从防火墙或安全组(尽量用云平台功能,即安全组)采取措施而不是关闭端口,把需要访问这些端口的IP段(内网段)在安全组入站规则放行,个别需要在外网访问这些端口的客户端IP段也放行,其余的客户端IP段全部禁止访问这些端口即可
Windows技术交流
2021/12/30
10.2K0
WannaCry 勒索病毒用户处置指南
云鼎实验室
2017/05/14
10.3K1
WannaCry 勒索病毒用户处置指南
h3c bios密码_日本服务器ip端口密码
NetBIOS File and Print Sharing 通过这个端口进入的连接试图获得NetBIOS/SMB服务。这个协议被用于Windows”文件和打印机共享”和SAMBA。
全栈程序员站长
2022/11/07
1.7K0
针对5.12大型比特币敲诈事件的漏洞分析及其预防方法
针对5.12大型比特币敲诈事件的漏洞分析及其预防方法 From ChaMd5安全团队核心成员 逍遥自在 2017年4年14日,NSA组织爆出了一份震惊世界的机密文档,其中包含了多个Windows远程漏洞利用工具,其中影响最大的就是ms17_010。在之后几天中,整个安全界都在疯狂的复现这个漏洞,各大公司也出台了相应的措施。时隔一个月之后,一场大型的onion软件敲诈出现在中国安全最脆弱的教育体系中,山东、辽宁、黑龙江均有高校中毒,勒索者要求受害人支付高昂的解密费用才给解开。 据初步了解,这个漏洞就
ChaMd5安全团队
2018/03/29
1.3K0
针对5.12大型比特币敲诈事件的漏洞分析及其预防方法
推荐阅读
相关推荐
怎么关闭135 445端口_高危端口关闭方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验