算法学习指南:什么是算法?

news/2025/1/12 6:47:24/

解释算法的实现逻辑就像讲故事一样。算法会在普通的解决方案中引入新颖的思路或进行某种创新。在本文中,我们将讨论一个简单问题的几个解决方案,解释影响算法性能的一些因素。在这个过程中,我将介绍一些用于分析算法性能的技巧。这些技巧与算法的实现无关,尽管我在讨论中总是会提供实际实现的实验证据。

〓zwts〓

算法是一种逐步解决问题的方法,可实现为计算机程序的形式,能够在可预测的时间内返回正确的结果。算法的研究既要关注正确性(它对于所有的输入是否都能发挥作用?),也要关注性能(它是解决这个问题的最有效方法吗?)。

下面我们详细观察一个算法的例子,看看它实际上是怎么处理问题的。如果我们想在一个无序列表中查找最大值,应该怎么办?图1-1中的每个Python列表都是一个问题实例(problem instance),也就是算法(用圆柱体显示)所处理的输入。正确答案出现在算法的右边。这个算法是如何实现的?它在不同的问题实例上是如何执行的?我们能不能预测在一个包含1,000,000个值的列表中查找最大值所需要的时间?

 图1-1 一个算法所处理的3个不同的问题实例

算法不仅仅是一种问题解决方法。实现算法的程序还需要在可预测的时间内完成任务。Python的内置函数max()已经解决了上面这个问题。现在,对于包含随机数据的问题实例,预测算法的性能可能比较困难,因此找到精心构建的问题实例是极有价值的。

表1-1显示了在两种类型的规模为N的问题实例上执行max()需要的时间。一种是以升序排列的整数列表,另一种是以降序排列的整数列表。由于读者所使用的计算机系统的配置不同,得到的执行结果可能与表中的不同,但仍然符合下面这两个结论:

〓● 当N足够大时,在递增的值上执行max()需要的时间总是要多于递减的值需要的时间;

〓● 当后面每一行的N值都为前一行的10倍时,max()的对应时间尽管稍有偏差,但大致也是原来的10倍,这也与我们的生活经验相符。

上述问题实例中,max()返回最大值,输入并没有被修改。在有些情况下,算法会直接更新问题实例而不是计算一个新值,我们将在第5章学习的对一个值列表进行排序的算法就是这样的。在本书中,N表示问题实例的规模。

表1-1 在两种类型的规模为N的问题实例上执行max()需要的时间  单位:ms

N

递增的值执行max()需要的时间

递减的值执行max()需要的时间

100

0.001

0.001

1,000

0.013

0.013

10,000

0.135

0.125

100,000

1.367

1.276

1,000,000

14.278

13.419

关于执行算法所需要的时间:

〓● 我们无法事先预测T(100000)的值(即算法处理一个规模为100,000的问题实例所需要的时间)是多少,因为计算平台可能并不相同,实现算法所使用的编程语言也可能不同;

〓● 但是,一旦通过实验确定了T(10000)所需要的时间,就可以对T(100000),也就是解决一个10倍规模的问题实例所需要的时间进行预测,尽管这种预测不可避免地和准确时间有所出入。

在设计算法时,基本的挑战是保证它的正确性,使之适用于所有的输入。我将在第2章使用更多的篇幅解释如何对解决同一个问题的不同算法的行为进行分析和比较。算法分析这个领域与现实生活中发生的有趣的、重要的问题的研究息息相关。由于算法所蕴含的数学知识理解起来具有一定的难度,我将提供一些特定的例子,实现抽象的概念与现实世界的问题的关联。

计算算法效率的标准方法是对它所需要的计算操作进行计数,但这是极难做到的!计算机中执行机器指令的中央处理器(CPU),负责执行数学计算(例如加法和乘法)、CPU寄存器的赋值、两个值的比较等任务。有些现代的编程语言(例如C或C++)被编译为机器指令,还有一些编程语言(例如Python或Java)被编译为中间字节码表示形式。Python解释器(本身是C语言程序)执行字节码,而像min()和max()这样的内置函数是用C语言实现的,最终会被编译为机器指令而执行。

强大的数组

〓zwts〓数组是指在一块连续的内存中存储N个值的集合。它是程序员存储多个值时所使用的最“古老”也最可靠的数据结构之一。图1-2表示一个包含8个整数的数组。

 

图1-2 包含8个整数的数组

〓zwts〓数组A有8个值,可根据位置进行索引。例如,A[0]=31、A[7]=5。A中的值可以是任何类型,例如字符串或者更为复杂的对象。

〓zwts〓下面是与数组有关的一些重要知识:

〓● 第1个值A[0]的索引位置是0,最后一个值的索引位置是A[N–1],其中N表示数组的长度;

〓● 每个数组都具有固定的长度,Python和Java允许程序员在运行时确定数组的长度,但C语言不允许;

〓● 可以通过索引位置i读取或更新数组中的一个单独值A[i],i是一个0~N − 1范围内的整数;

〓● 数组无法直接被扩展(或收缩),但是我们可以分配一个目标大小的新数组,并把旧数组中应该保留的值复制到这个新数组。

〓zwts〓数组非常简单,它在组织数据时具有极广的用途和极高的效率。在Python中,list(列表)对象可以看成数组,它的功能更加强大,因为它能够随时扩展和收缩。

要对一个算法所执行的机器指令的总数进行统计几乎是不可能的,何况现代的CPU每秒可以执行数十亿条指令!我将改而对每个算法所调用的关键操作的数量进行统计,这可能是“数组中两个值的比较次数”或“一个函数的调用次数”。在max()函数的讨论中,关键操作是“小于操作(<)被调用了多少次”。我将在第2章中解释这个计数原则。

现在,是时候揭开max()算法的面纱了。

本文摘自《算法学习指南》

深入阐述关键算法、数据结构、数据类型基本原理,大量插图、实验数据帮助理解算法本质,用Python描述并提供真实的开源代码,助力编写精华代码!

本书对一些算法进行了通俗易懂的介绍,使读者可以提高自己的代码运行效率。本书所有的算法是用Python 描述的,它是特别流行的也是对用户特别友好的编程语言之一,其运用的范围涵盖了数据科学、生物信息和工程学等。本书对每个算法进行了详细的解释,并用大量的插图帮助读者理解算法本质。本书的代码是开源的,可以免费从所提供的代码库中获取。

本书将会讲述计算机科学中的基本算法和数据结构,帮助读者编写精华代码。如果读者正在寻找一份需要编程技巧的技术型工作,本书有可能帮助其在面试中表现优异。我希望本书能够激发读者进一步学习算法的兴趣。


http://www.ppmy.cn/news/6167.html

相关文章

RK3568平台开发系列讲解(工具命令篇)vim 编辑器的使用

🚀返回专栏总目录 文章目录 一、vim 编辑器有三种模式二、vim 编辑器移动光标三、vim 编辑器支持快速定位四、vim 编辑器的文本的复制和粘贴五、vim 编辑器使用快捷键来复制六、vim 编辑器的删除七、vim 编辑器的撤销八、vim 编辑器的查找九、vim 编辑器的替换十、vim 编辑器…

插值算法基本原理

插值&#xff1a;数据处理的手段 将缺失数据补全处理 线性内插 拉格朗日插值法 牛顿插值 拟合&#xff1a;预测&#xff0c;寻找规律的手段 是插值的外延 插值算法&#xff1a;使用在现有的数据极少&#xff0c;不足以支撑分析的进行&#xff0c;这时就需要使用一些数学方法…

SimpleFOC移植STM32(七)—— 移植STM32F405RGT6

目录说明一、点亮LED1.1、原理图1.2、硬件准备1.3、烧写二、开环控制2.1、硬件准备2.2、硬件连接2.3、打开工程2.4、修改参数2.5、编译下载&#xff0c;观察运行三、角度读取3.1、硬件准备3.2、硬件连接3.3、接线说明3.4、打开工程3.5、修改代码3.6、编译下载&#xff0c;观察运…

【关于eps8266自动重启 Soft WDT reset】

【关于eps8266自动重启 Soft WDT reset】1. 前言2. 分析问题2.1 长时间没有喂狗2.2 delayMicroseconds 函数触发3. 解决问题3.1 解决长时间没有喂狗3.2 解决delayMicroseconds 函数触发5. 小结1. 前言 最近使用esp8266进行远程遥控时, 但是在驱动舵机servo库的过程中出现了esp…

XXE漏洞挖掘和防护

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是XXE漏洞挖掘和防护。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授权设…

【图神经网络】Pytorch图神经网络库——PyG创建消息传递网络

PyG创建消息传递网络消息传递基类&#xff1a;MessagePassingGCN层的实现实现Edge Convolution内容来源&#xff1a;将卷积算子推广到不规则域通常表示为邻域聚合或消息传递方案。在第(k−1)(k-1)(k−1)层中节点iii的节点特征用xi(k−1)∈RF\mathrm{x}_{i}^{(k-1)}\in \mathbb{…

300行HTML+CSS+JS代码实现动态圣诞树

文章目录1. 前言2. 效果展示3. 准备&#x1f351; 下载编译器&#x1f351; 下载插件4. 源码&#x1f351; HTML&#x1f351; JS&#x1f351; CSS5. 结语1. 前言 一年一度的圣诞节和考研即将来临&#xff0c;那么这篇文章将用到前端三大剑客 HTML CSS JS 来实现动态圣诞树…

前端(htmlCSSJavaScript)基础

关于前端更多知识请关注官网&#xff1a;w3school 在线教程全球最大的中文 Web 技术教程。https://www.w3school.com.cn/ 1.HTML HTML(HyperText Markup Language)&#xff1a;超文本标记语言 超文本&#xff1a;超越了文本的限制&#xff0c;比普通文本更强大。除了文字信息…