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

news2024/11/19 23:23:38

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

〓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.coloradmin.cn/o/110687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring data JPA--02

Spring data JPA spirng data jpa是spring提供的一套简化JPA开发的框架&#xff0c;按照约定好的规则进行**【方法命名】去写dao层接口&#xff0c;就可以在不写接口实现的情况下&#xff0c;实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能&#xff0c;如分页、…

Kubectl 使用详解——k8s陈述式资源管理

目录 一、kubectl 简介 二、kubectl 的使用 1.基础用法 &#xff08;1&#xff09;配置kubectl自动补全 &#xff08;2&#xff09;查看版本信息 &#xff08;3&#xff09;查看资源对象信息 &#xff08;4&#xff09;查看集群信息 &#xff08;5&#xff09;查看日…

刷爆力扣之 Z 字形变换

刷爆力扣之 Z 字形变换 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&#xff0c…

为什么我建议线上高并发量的代码,一定要注意数据可能会不一致?

V-xin&#xff1a;ruyuan0330 获得600页原创精品文章汇总PDF 目录 前情提示什么是数据一致性&#xff1f;一个数据计算链路的梳理数据计算链路的bug电商库存数据的不一致问题大型系统的数据不一致排查有多困难 一、前情提示 这篇文章&#xff0c;咱们继续来聊聊之前的亿级流…

06-Redis缓存设计与性能优化

多级缓存架构 缓存设计 缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c; 缓存层和存储层都不会命中&#xff0c; 通常出于容错的考虑&#xff0c; 如果从存储层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c; 失…

基于多级适应方法的无人机(UAV)在发动机输出情况下的导航和路径规划(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【SwinTransformer】GitHub源码,main.py,swin_transformer.py...

声明:仅学习使用~ “我们抬头便看到星光,星星却穿越了万年”。 Contents 数据与环境配置解读main.pyswin_transformer.py数据与环境配置解读 来看 SwinTransformer 的github官网。已经开源了。(想不到在家里居然可以直接上GItHub,真好啊!) 进去后可以看到如下界面: I…

Windows tensorflow、keras虚拟环境搭建记录(使用conda和mamba)

Windows tensorflow、keras虚拟环境搭建记录 过程记录 首先创建虚拟环境 注意如果之前把conda镜像源配置到了国内&#xff0c;那这一步就不要挂梯子&#xff0c;否则会报出这种错误 conda create --name TF python3.5.2TF那里是给虚拟环境取个名字python后面指定版本号&#x…

103.(leaflet之家)leaflet态势标绘-聚集地绘制

地图之家总目录(订阅之前请先查看该博客) 地图之家:cesium+leaflet+echart+地图数据+地图工具等相关内容的介绍 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html>…

一文带你看透空气质量

空气质量的好坏反映了空气污染程度&#xff0c;它是依据空气中污染物浓度的高低来判断的。空气污染是一个复杂的现象&#xff0c;在特定时间和地点空气污染物浓度受到许多因素影响。来自固定和流动污染源的人为污染物排放大小是影响空气质量的最主要因素之一&#xff0c;其中包…

【MySQL入门实战3】-存储引擎

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&#x1f61…

【K8S系列】第十三讲:Ingress详解

目录 序言 1.Ingress基本介绍 1.1 暴露服务问题 1.2 什么是Ingress 1.2 Ingress的核心组件 1.2.1 ingress 1.2.2 ingress-controller 1.2.3 反向代理负载均衡器 2.安装 2.1 下载/修改配置文件 2.2 安装资源 2.3 结果 2.4 项目示例 2.4.1 创建service及deploymen…

博德宝闪耀回归,九牧国际化提速

文|螳螂观察 作者|陈小江 怎样让厨房变得更好&#xff1f; 这是德国百年奢华橱柜品牌博德宝1892年创立之初&#xff0c;就在思考的问题&#xff0c;也是其品牌主张。 130年来&#xff0c;关于该问题的答案&#xff0c;随着博德宝不断创新在时刻刷新&#xff0c;并在全球引领…

Sentinel

Sentinel—高可用流量管理框架/服务容错组件 一.为什么要用Sentinel? 1.微服务架构中当某服务挂掉的时候常见的原因有哪些&#xff1f; 1.异常没处理 比如DB连接失败&#xff0c;文件读取失败等 2.突然的流量激增 比如&#xff1a;用户经常会在京东、淘宝、天猫、拼多多…

java 三级缓存

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;java 三级缓存 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林在闪闪发光…

五问补盲(四)| 好用的补盲激光雷达,得满足哪些条件?

作者 | 爱LiDAR的小飞哥 编辑 | 王博上一期&#xff0c;我们聊了补盲激光雷达上车的重要前提——安全。本期我们来聊聊&#xff0c;满足功能安全、网络安全等领域的关键设计要求之后&#xff0c;补盲激光雷达怎么做到好用&#xff0c;更贴近工程化的表述是「易用」。在之前的文…

利器 | 接口自动化测试框架 RESTAssured 实践(三):对 Response 结果导出

上一篇文章中介绍了rest-assured对返回结果的断言&#xff0c;最后说明了对于Response结果导出的需求。可查看往期文章进行查看。 HTTP/1.1 200 OK Server: nginx/1.12.2 Date: Mon, 13 Jan 2020 02:15:11 GMT Content-Type: application/json;charsetUTF-8 Transfer-Encoding…

产险精算GLM案例

这是对北美产险精算学会CAS北美产险精算师考试教材《广义线性模型实践者指南》的第一章中的实例的结果验证&#xff0c;教材中使用的是纯数学理论推导&#xff0c;这里使用python进行结果验证。 原始数据是一个简单的分组数据&#xff1a; 这个原始数据表需要进行结构化后&…

前端基础(十七)_HTML5新特性

HTML5新特性 1、在网页上绘制图形的canvas元素 原生JavaScriptcanvas实现五子棋游戏_值得一看 鼠标移动淡入淡出Canvas小球效果_TS版本 JS配合canvas实现贪吃蛇小游戏 canvas基础及太极图案例 2、多媒体相关video和audio元素 html5 video 音频标签: audio 标签 在IE8及更早版本…

LVGL学习笔记1 - 准备

目录 1. 下载LVGL源代码 2. 平台 3. 导入到工程 3.1 配置头文件 3.2 src文件夹 4. 移植 4.1 显示接口部分 4.1.1 disp_init 4.1.2 lv_port_disp_init 4.1.3 disp_flush 4.2 IPA部分 4.2.1 lv_draw_gd32_ipa_init 4.2.2 lv_draw_gd32_ipa_blend_fill 4.2.3 lv_dra…