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

article/2025/9/15 13:23:54

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

〓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://chatgpt.dhexx.cn/article/EJHmgVSe.shtml

相关文章

算法学习基础(一)

作为一名普通的二本学校&#xff0c;我在很早之前就有一个目标&#xff0c;那就是大学之后好好找一个软件开发工作。因此学习了很多的编程基础&#xff0c;不过近几天面试发现&#xff0c;技术官总是喜欢问你算法知识。编程语言不断变化&#xff0c;但是很底层的知识与算法密切…

算法学习(一)

算法第四版学习笔记–1.3 Bags, Queues and Stacks 前面120页都是Java基础&#xff0c;建议有Java基础的同学可以直接从120页开始学习&#xff0c;但是这里面的例子有用到algs4这个jar&#xff0c;需要稍微了解一下&#xff0c;影响不大&#xff0c;都是对JDK的一些封装。 In…

算法学习入门

14天阅读挑战赛 *努力是为了不平庸~ 算法学习有些时候是枯燥的&#xff0c;这一次&#xff0c;让我们先人一步&#xff0c;趣学算法&#xff01;欢迎记录下你的那些努力时刻&#xff08;算法学习知识点/算法题解/遇到的算法bug/等等&#xff09;&#xff0c;在分享的同时加深对…

什么是算法?如何学习算法?算法入门的学习路径

何为算法 简单的说,算法就是:解决问题的手段,并且是批量化解决问题的手段。 比如,我们想要从成都去北京,起点就是成都,终点就是北京。如何去?我们就可以称为算法。 因此选择不同的算法,那么虽然终点都是一样,但是性能以及效率就根据算法的优劣而决定的。因此,我们…

如何学习算法?

今天在群里刚好看到有人在讨论算法的问题&#xff0c;刚好自己曾经也有一个算法大神的梦&#xff0c;来说说自己对算法的理解。 算法怎么学&#xff1f;什么样程度才算把算法学透&#xff1f;算法学会了有什么用&#xff1f; 算法的学习是非常重要的&#xff0c;那算法学到什么…

突发!大连理工大学研三学生自杀,遗书曝光,研究生的压力应该谁来化解?...

点击上方“码农突围”&#xff0c;马上关注 这里是码农充电第一站&#xff0c;回复“666”&#xff0c;获取一份专属大礼包真爱&#xff0c;请设置“星标”或点个“在看” 来源&#xff1a;科研干货 10月13日&#xff0c;微博上一个名为“红烧土豆叶”的网友引起广大网友关注&a…

英雄算法学习路线

文章目录 零、自我介绍一、关于拜师二、关于编程语言三、算法学习路线1、算法集训1&#xff09;九日集训2&#xff09;每月算法集训 2、算法专栏3、算法总包 四、英雄算法联盟1、英雄算法联盟是什么&#xff1f;2、如何加入英雄算法联盟&#xff1f;3、为何会有英雄算法联盟&am…

算法如何学习?别想太多,两个字

文章目录 前言一、语言基础1、「 光天化日学C语言 」 二、刷题必读1、「 LeetCode零基础指南 」2、「 九日集训每日打卡 」 三、语言入门1、「 C语言入门100例 」 四、算法入门1、「 算法零基础100讲 」 五、算法进阶1、「 画解数据结构 」2、「 LeetCode算法题集汇总 」3、「 …

YOLOv5剪枝✂️| 模型剪枝实战篇

本篇博文所用代码为开源项目修改得到,且不适合基础太差的同学。 本篇文章主要讲解代码的使用方式,手把手带你实现YOLOv5模型剪枝操作。 文章目录 0. 环境准备1. 使用YOLOv5训练自己的模型2. 对训练好的模型进行稀疏训练3. 对稀疏训练后的模型进行剪枝4. 对剪枝后的网络模型微…

决策树——预剪枝和后剪枝

目录 简析 为什么要剪枝&#xff1f; 剪枝的基本策略 预剪枝 后剪枝 剪枝的优缺点 预剪枝的优缺点 后剪枝的优缺点 实现 数据集 剪枝前 预剪枝 分析 代码 简析 为什么要剪枝&#xff1f; “剪枝”是决策树学习算法对付 “过拟合” 的主要手段 可通过“剪枝”来…

网络剪枝通俗解释

论文链接&#xff1a;Learning Efficient Convolutional Networks through Network Slimming 视频链接&#xff1a;唐宇迪 基本思想 我们在模型生成通道数为[64,128,256,512]的特征图&#xff0c;但是这些特征图不一定都重要&#xff0c;我们希望能够体现特征图的主次之分&…

α、β剪枝法

在讲α、β剪枝法之前&#xff0c;我们先了解一下极大极小值算法&#xff1b;因为α、β剪枝法是为了简化极大极小值的计算而提出的。 极大极小值法 Minimax算法 又名极小化极大算法&#xff0c;是一种找出失败的最大可能性中的最小值的算法&#xff08;即最小化对手的最大得益…

决策树的剪枝

目录 一、为什么要剪枝 二、剪枝的策略 1、预剪枝&#xff08;pre-pruning&#xff09; 2、后剪枝&#xff08;post-pruning&#xff09; 三、代码实现 1、收集、准备数据&#xff1a; 2、分析数据&#xff1a; 3、预剪枝及测试&#xff1a; 4、后剪枝及测试&#xff1…

决策树算法和剪枝原理

决策树算法和剪枝原理 本节我们对决策算法原理做简单的解析&#xff0c;帮助您理清算法思路&#xff0c;温故而知新。 我们知道&#xff0c;决策树算法是一种树形分类结构&#xff0c;要通过这棵树实现样本分类&#xff0c;就要根据 if -else 原理设置判别条件。因此您可以这…

决策树(decision tree)(二)——剪枝

决策树&#xff08;decision tree&#xff09;(二)——剪枝 **注&#xff1a;本博客为周志华《机器学习》读书笔记&#xff0c;虽然有一些自己的理解&#xff0c;但是其中仍然有大量文字摘自周老师的《机器学习》书。 决策树系列博客&#xff1a; 决策树&#xff08;一&#x…

机器学习--决策树二(预剪枝和后剪枝)

一、什么是决策树的剪枝 对比日常生活中&#xff0c;环卫工人在大街上给生长茂密的树进行枝叶的修剪。在机器学习的决策树算法中&#xff0c;有对应的剪枝算法。将比较复杂的决策树&#xff0c;化简为较为简单的版本&#xff0c;并且不损失算法的性能。 二、为什么要剪枝 剪枝…

关于剪枝对象的分类(weights剪枝、神经元剪枝、filters剪枝、layers剪枝、channel剪枝、对channel分组剪枝、Stripe剪枝)

文章目录 剪枝对象分析&#xff1a;1.weights剪枝&#xff1a;2.神经元剪枝&#xff1a;3.Filters剪枝&#xff1a;4.通道剪枝5.Group-wise剪枝6.Stripe剪枝 剪枝对象分析&#xff1a; 剪枝分为结构化剪枝和非结构化剪枝&#xff0c;细化可分为weights剪枝、神经元剪枝、filte…

决策树——剪枝处理

剪枝处理 1&#xff1a;剪枝处理的原因 “剪枝”是决策树学习算法对付“过拟合”的主要手段&#xff0c;因此&#xff0c;可通过“剪枝”来一定程度避免因决策分支过多&#xff0c;以致于把训练集自身的一些特点当做所有数据都具有的一般性质而导致的过拟合 2&#xff1a;剪…

【ML】决策树--剪枝处理(预剪枝、后剪枝)

1. 剪枝&#xff08;pruning&#xff09;处理 首先&#xff0c;我们先说一下剪枝的目的——防止“过拟合”。 在决策树的学习过程中&#xff0c;为了保证正确性&#xff0c;会不断的进行划分&#xff0c;这样可能会导致对于训练样本能够达到一个很好的准确性&#xff0c;但是…

深度学习剪枝

一般来说&#xff0c;神经网络层数越深、参数越多&#xff0c;所得出的结果就越精细。但与此同时&#xff0c;问题也来了&#xff1a;越精细&#xff0c;意味着所消耗的计算资源也就越多。这个问题怎么破&#xff1f;这就要靠剪枝技术了。言下之意&#xff0c;把那些对输出结果…