《计算机是怎样跑起来的》 || 第五章 • 与算法成为好朋友的七个要点

在这里插入图片描述
作者:矢泽久雄

——————————————————————————————————————

第五章 • 与算法成为好朋友的七个要点

——————————————————————————————————————

【01】算法中解决问题的步骤是明确且有限的

什么是算法(Algorithm)?

定义:被明确定义的有限个规则的集合,用于根据有限的步骤解决问题。例如在既定的精度下,把求解sinx的计算步骤无一遗漏地记录下来的文字或图示。

根据我个人的学习理解,所谓的的算法就是说哪怕是一个什么也不会的傻瓜,只需要按照流程步骤一步一步操作都能解决最终问题的流程步骤的总和,并且这些流程步骤一定是有限且明确的,不需要额外直觉分析的。

——

【02】计算机不靠直觉而是机械地解决问题

  • 步骤是明确的、完全不依赖直觉的
  • 步骤是机械的、不需要动脑筋就能完成的
  • 使步骤终止的原因是明确的

计算机是无法实现自主思考的,也正式因为算法的存在,才能使得计算机能够解决很多各种各样的问题。

——

【03】了解并应用典型算法

对于一些典型且常用的算法,我们还是要学会了解并掌握:

  • 辗转相除法(求解最大公约数)
  • 埃拉托斯特尼筛法(判定素数)
  • 顺序查找(检索数据)
  • 二分查找(检索数据)
  • 哈希查找(检索数据)
  • 冒泡排序(数据排序)
  • 快速排序(数据排序)

书中推荐了两本关于算法的辞典书籍

《算法技术手册》
在这里插入图片描述
《算法精解:C语言描述》
在这里插入图片描述
一看就是两本难啃的硬骨头
在这里插入图片描述
——

【04】利用计算机的处理速度

计算机与人最大的不同,虽然它无法独立进行思考,但是它拥有着人类无法比拟的运算速度。

所以,好好利用计算机的优势,我们可以实现一些大量机械重复却实用的算法。

比如 “判定91是否是素数”

我们可以采用埃拉托斯特尼筛法来判定素数,而埃拉托斯特尼筛法正是通过除以比它小的所有正整数来判定此数是不是素数。

如果人来计算得花多长时间?而利用计算机秒秒钟就搞定!

——

【05】使用编程技巧提升程序执行速度

虽然计算机具有强大的运算能力,但是一旦处理一些非常巨大的数字的时候,依旧会花费不少的时间。

所以我们可以采用一些编程技巧来提升程序的执行速度。

比如同样判定一个特定数字是不是素数,其实我们并不用除以所有比它小的正整数,只需要除以比它的1/2小的所有数即可,这样处理的时间就会大大缩短。

在算法技巧中有个著名的技巧叫作 “哨兵”。

哨兵:含有特殊值的数据,可用于标识数据的结尾。

举例:假设有100个箱子,里面分别装有一个写有任意数字的纸条,箱子上面标有1-100的序号。现在要从这100个箱子中查找是否有箱子装有写着要查找数字的纸条。
在这里插入图片描述
我们可以看见了使用了“哨兵”的算法,只需在最后判定一次(N>100)即可,大大提高了程序执行的效率。

——

【06】找出数字间的规律

以“判断石头剪刀布输赢”程序为例
在这里插入图片描述
如果要单纯把上面图示翻译成程序,我们可能需要写很多个if…elseif语句

If (A = 0) And (B = 0) Then
    MsgBox "平局"
ElseIf (A = 0) And (B = 1) Then
    MsgBox "玩家A获胜"
ElseIf (A = 0) And (B = 2) Then
    MsgBox "玩家B获胜"
ElseIf (A = 1) And (B = 0) Then
    MsgBox "玩家B获胜"
ElseIf (A = 1) And (B = 1) Then
    MsgBox "平局"
ElseIf (A = 1) And (B = 2) Then
    MsgBox "玩家A获胜"
ElseIf (A = 2) And (B = 0) Then
    MsgBox "玩家A获胜"
ElseIf (A = 2) And (B = 1) Then
    MsgBox "玩家B获胜"
ElseIf (A = 2) And (B = 2) Then
    MsgBox "平局"
End If

但是只要我们仔细探寻下其中的规律,会发现

  • 变量A和B相等就是平局
  • B+1除以3得到的余数与变量A相等就是玩家B获胜
  • 其余情况就是玩家A获胜

所以,我们的代码就可以优化为

If A = B Then
    MsgBox "平局"
ElseIf A = (B + 1) Mod 3 Then
    MsgBox "玩家B获胜"
Else
    MsgBox "玩家A获胜"
End If

这样代码不仅缩短了很多,而且程序效率也提高了不少。

——

【07】先在纸上考虑算法

思考算法的时候,要先在纸上用文字或图标描述出解决问题的步骤,而不要立即开始写代码。

其中,画流程图(Flow Chart)就是最好的方式。

所以一定养成良好的思考算法、画流程图的习惯。

——
在这里插入图片描述

发布了35 篇原创文章 · 获赞 35 · 访问量 2756

猜你喜欢

转载自blog.csdn.net/nilvya/article/details/103800549
今日推荐