当前位置: 首页 > news >正文

计算机是怎么跑起来的第五章

在这里插入图片描述
“令人生畏且难以掌握”“和自己无缘”,诸位是不是会对算法留下这样的印象呢?诚然,有那种无法轻松理解、难以掌握的算法,但是并不是说只有把那种”
“由智慧超群的学者才能想出的算法全部牢记心中才能编写程序,简单的算法也是有的。而且诸位自己也不妨去思考一些原创的算法。只要理清在现实世界解决问题的步骤,再结合计算机的特性,就一定能想出算法。思考算法也可以是一件非常有趣的事。下面,笔者将介绍思考算法时的要点。请诸位务必以此为契机,和算法成为朋友,体味思考算法所带来的乐趣。”

要点1:算法中解决问题的步骤是明确且有限的

思考求解两个整数的最大公约数

解法1:直觉法

在这里插入图片描述

解法2:辗转相除法

在这里插入图片描述

哪种才真正算的上算法呢?

要点 2:计算机不靠直觉而是机械地解决问题

“计算机不能自发地思考。因此计算机所执行的由程序表示的算法必须是由机械的步骤所构成。所谓“机械的步骤”,就是不用动任何脑筋,只要按照这个步骤做就一定能完成的意思。众多的学者和前辈程序员们已经发明创造出了很多机械地解决问题的步骤,这些步骤并不依赖人类的直觉。由此所构成的算法被称为“典型算法”。”

“请诸位注意以下三点:1. 步骤是明确的、完全不依赖直觉的;2. 步骤是机械的、不需要动脑筋就能完成的;3. 使步骤终止的原因是明确的。”

要点 3:了解并应用典型算法

在这里插入图片描述
在这里插入图片描述
“这次请思考一下解决“求解 12 和 42 的最小公倍数”这个问题的算法。所谓最小公倍数就是指两个整数的公共倍数(是一个数几倍的数)中最小的那个数。最小公倍数的求解方法诸位在中学的数学课上也应该学过了,但是很可惜求解步骤是依赖人类的直觉的。请再思考一个适用于计算机的机械的算法。诸位说不定会想“反正会有典型算法的吧,比如‘某某氏的某某法’”,然后就纠结于是否还要自己思考。
但是即使查了算法辞典之类的书,也还是找不到求解最小公倍数的算法。为什么呢?因为我们可以通过以下方法求解最小公倍数——用两个整数的乘积除以这两个整数的最大公约数。因此 12 和 42 的最小公倍数就是 12×42÷6 = 84 了。如此简单的算法不能算作典型算法。这个例子说明先自己思考[…]”

要点 4:利用计算机的处理速度

“这次再请诸位思考求解“判定 91 是否是素数”这一问题的算法。在用于判定素数的典型算法中,有一个被称为“埃拉托斯特尼筛法”的算法。在学习这个算法之前,先请诸位思考如果是在数学考试中碰到了这道题,要如何解答呢?”

也许有人会这样想:用 91 分别除以比它小的所有正整数,如果没有找到能够整除的数,那么 91 就是素数。但是,如此繁琐的步骤可行吗?实际上这就是正确答案。埃拉托斯特尼筛法是一种用于把某个范围内的所有素数都筛选出来的算法,比如筛选 100 以内的所有素数,其基本思路就是用待判定的数除以比它小的所有正整数。例如要判定 91 是否是素数,只要分别除以 2~90 之间的每个数就可以了(因为 1 肯定能够整除任何数,所以从 2 开始检测)。

无论是多么冗长繁琐的步骤,只要明确并且机械就能构成优秀的算法。诸位把算法用程序表示出来让计算机去执行,而计算机会用令人吃惊的速度为我们执行。为了判定 91 是否是素数,用 91 除以 2~90 这 89 个数的操作一瞬间就可以完成。在思考算法时不防时刻记着,解决问题时是可以利用计算机的处理速度的。
作为利用计算机的处理速度解决问题的另一个例子,请试着求解以下联立方程组。题目是鸡兔同笼问题:鸡和兔子共计 10 只,把它们的脚加起来共计 32 只,问鸡和兔子分别有多少只?设有 x 只鸡,y 只兔子,那么就可以列出如下的联立方程组。

在这里插入图片描述
因为鸡和兔子的只数应该都在 0~10 这个范围内,所以就试着把 0~10 中的每个数依次代入 x 和 y,只要能够找到使这两个方程同时成立的数值也就求出了答案。利用计算机的处理速度,答案一瞬间就出来了

要点 5:使用编程技巧提升程序执行速度

解决一个问题的算法未必只有一种。在考量用于解决同一个问题的多种算法的优劣时,可以认为转化为程序后,执行时间较短的算法更为优秀。虽然计算机的处理速度快得惊人,但是当处理的数据数值巨大或是数量繁多时还是要花费大量的时间。例如,判定 91 是否是素数的过程一下子就有结果了,可是要去判定 999999937 的话,笔者的电脑就要花费大约 55 分钟之久(言外之意 999999937 是素数)。
有时稍微往算法中加入一些技巧,就能大幅度地缩短处理时间。在判定素数上,原先的过程是用待判定的数除以比它小的所有正整数,只要在此之上加入一些技巧,改成用待判定的数除以比它的 1/2 小的所有数,处理时间就会缩短。之所以改成这样是因为没有必要去除以比它的 1/2 还大的数。

在这里插入图片描述

在算法技巧中有个著名的技巧叫作“哨兵”。这个技巧多用在线性搜索(从若干个数据中查找目标数据)等算法中。线性搜索的基本过程是将若干个数据从头到尾,依次逐个比对,直到找到目标数据。

下面还是通过例题来思考吧。假设有 100 个箱子,里面分别装有一个写有任意数字的纸条,箱子上面标有 1~100 的序号。现在要从这 100 个箱子当中查找是否有箱子装有写着要查找数字的纸条。

首先看看不使用哨兵的方法。从第一个箱子开始依次检查每个箱子中的纸条。每检查完一个纸条,还要再检查箱子的编号(用变量 N 表示),并进一步确认编号是否已超过最后一个编号了。
在这里插入图片描述

“所示的过程,虽然看起来似乎没什么问题,但是实际上含有不必要的处理——每回都要检查箱子的编号有没有到 100。”

为了消除这种不必要的处理,于是添加了一个 101 号箱子,其中预先放入的纸条上写有正要查找的数字。这种数据就被称为“哨兵”。通过放入哨兵,就一定能找到要找的数据了。找到要找的数据后,如果该箱子的编号还没有到 101 就意味着找到了实际的数据;如果该箱子的编号是 101,则意味着找到的是哨兵,“而没有找到实际的数据。使用了哨兵的流程图如图 5.7 所示。需要多次反复检查的就只剩下“第 N 个箱子中包含要找的数字吗?”这一点了,程序的执行时间也因此大幅度地缩减了。
在这里插入图片描述
讲一个故事来解释哨兵的概念吧。假设某个漆黑的夜晚,诸位在海岸的悬崖边上玩一个游戏(请勿亲身尝试)。诸位“站在距悬崖边缘 100 米的地方,地上每隔 1 米就任意放 1 件物品。请找出这些物品中有没有苹果。
诸位每前进 1 米就要捡起地上的物品,检查是否拿到了苹果,同时还要检查有没有到达悬崖的边缘(不检查的话就有可能掉到海里)。也就是说要对这两种检查反复若干次。
使用了哨兵以后,就要先把起点挪到距悬崖边缘 101 米的地方,再在悬崖的边缘放置一个苹果(如图所示)。这个苹果就是哨兵。通过放置哨兵,诸位就一定能找到苹果了。每前进 1 米时只需检查捡到的物品是不是苹果就可以了。发现是苹果以后,只需站在原地再检查一步开外的情况。如果还没有到达悬崖边缘,就意味着找到了真正要找的苹果。已经达到了悬崖边缘,则说明现在手中的[…]
在这里插入图片描述

要点 6:找出数字间的规律

“所有的信息都可以用数字表示——这是计算机的特性之一。因此为了构造算法,经常会利用到存在于数字间的规律。例如,请思考一下判定石头剪刀布游戏胜负的算法。如果把石头、剪刀、布分别用数字 0、1、2 表示,把玩家 A 做出的手势用变量 A 表示,玩家 B 做出的手势用变量 B 表示,那么变量 A 和 B 中所存储的值就是这三个数中的某一个。请以此判断玩家 A 和 B 的输赢。”

“如果能够发现“工资 = 底薪+加班补贴+交通补贴-预扣税款”这样的规律,那么解决问题的步骤就是明确的,步骤数也是有限的,因此构造出的算法也就是优秀的了。”

要点 7:先在纸上考虑算法

“最后介绍最为重要的一点,那就是思考算法的时候,要先在纸上用文字或图表描述出解决问题的步骤,而不要立刻开始编写代码。
画流程图就可以方便地把算法用图表示出来,因此请诸位大量地、灵活地运用它。如果不想画流程图,也可以用语言把算法描述出来,写成文书。总之先写到纸上这一点很重要。”

相关文章:

  • 【医疗电子技术-7.1】动态血压测量技术
  • 人工智能学习18-Pandas-按标签选择
  • 人工智能学习17-Pandas-查看数据
  • 【Linux】Linux多路复用-poll
  • 【LLM Tool Learning】论文分享: Chain-of-Tools
  • 【Python-Day 26】解锁时间魔法:深入解析 time 与 datetime 模块
  • Java-String
  • Python惰性函数与技术总结-由Deepseek产生
  • 【软测】脚本实现 - 网页自动化测试
  • 搜索问答技术概述:基于知识图谱与MRC的创新应用
  • rt-thread的定时器驱动(裸机版本)记录.
  • Ubuntu中Chromium无法使用Fcitx输入中文的问题
  • 设计师灵感仓库!IconViewer 右键一键提取系统图标,PNG 透明背景素材随取随用
  • AORSA关键文件及参数解释
  • 「AI投资」| 国元证券: 《国产Agent不断演进,通用协议推进系统性应用-AI行业专题报告》
  • App跨平台技术2025年深度解析:核心原理与最佳实践
  • linux-压缩类命令
  • MySQL 究极奥义·动态乾坤大挪移·无敌行列转换术
  • 二维码识别深度解析
  • Python爬虫实战:研究RQ库相关技术
  • 那种广告式网站怎么做/唐山seo优化
  • 玉树营销网站建设服务/小程序开发流程详细
  • 建网站和建网页的区别/软文广告经典案例800字
  • 微管家里的微网站怎么建设/chrome谷歌浏览器官方下载
  • 天津高端网站制作/襄阳网站seo
  • 淘宝客论坛响应式php网站下载/海南seo代理加盟供应商