如何定义算法?10分钟带你弄懂算法的基本概念

news2024/11/24 5:20:03

算法是指完成一个任务所需要的具体步骤和方法。也就是说给定初始状态或输入数据,经过计算机程序的有限次运算,能够得出所要求或期望的终止状态或输出数据。

编程界的“Pascal之父”Nicklaus Wirth有一句人尽皆知的名言:“算法+数据结构=程序”。(Algorithm+Data Structures=Programs),可见算法对程序的重要性。

本文从算法的基本定义出发,详细解读了算法的发展历程、主要特征、衡量指标和算法设计的基本方法,供大家学习参考。

1. 算法的基本定义

百科百科对算法的定义是:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。

一句话概括一下,算法就是解决问题的操作步骤。

2. 算法的发展历程

在我国古代,算法被称为“演算法”,关于算法的起源最早可以追溯到我国古代公元前1世纪的《周髀算经》,是算经的十书之一,原名《周髀》,主要阐述古代中国的盖天说和四分历法。在唐朝的时候,此书被定为国子监算科的教材之一,并改名为《周髀算经》。《周髀算经》中记载了勾股定理、开平方问题、等差级数等问题,其中用到了相当复杂的分数算法和开平方算法等。在随后的发展中,出现了割圆术、秦九昭算法和剩余定理等一些经典算法。

在西方,算法(algorithm)一词最早来源于9世纪波斯数学家花拉子米(花拉子米是代数与算术的创立人,被誉为“代数之父”,所著《代数学》一书,最早给出了一次和二次方程的一般解法),花拉子米的拉丁文译名是“Algoritmi”,英文对“算法”原译为“algorism”,意思是花拉子米的运算法则,指的是用阿拉伯数字进行算术运算的过程,在18世纪演变为“algorithm”。
在这里插入图片描述

阿拉伯数学家花拉子米

世界上第一个算法

公元前300年,“几何之父”欧几里得提出了人类史上第一个算法——欧几里得算法,又称辗转相除法,是求最大公约数的一种方法。它的具体做法是: 用较大数除以较小数,再用出现的余数(第余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。

辗转相除法举例:

求10,25的最大公约数:

25/10=2……5

10/5=2……0

所以10,25的最大公约数为5

辗转相除法代码实现:

int gcd(a, b)
[ return b == 0 ? a : gcd(b, a % b); }
//当余数为0时,最大公约数就是a,否则继续往下递归

世界上第一个算法程序

"If I should see you,after long year.How should I greet, with tears, with silence. "这是英国著名诗人拜伦的诗句,而世界上第一位程序员阿达·洛芙莱斯(Ada Lovelace),就是这位著名诗人的女儿,她编写了世界上第一个算法程序。1842年,Ada为巴贝奇分析机编写求解伯努利方程的程序,写作了第一份“程序设计流程图”,被珍视为“第一位给计算机写程序的人”。因为查尔斯·巴贝奇(Charles Babbage)未能完成他的巴贝奇分析机,这个算法未能在巴贝奇分析机上执行。
在这里插入图片描述

这张写满数学算法的巨幅图表,被视为“第一个计算机程序”,由埃达·洛夫莱斯编写, 发表于 1843 年的一篇关于“分析机” 的文章中。埃达对此给出精准描述如下:“这张表显示了运算过程中,机器各部分的所有连续变化。”

虽然这个算法未能实现,但Ada对计算机科学的贡献毋庸置疑,1953年,阿达之前对查尔斯·巴贝奇的《分析机概论》所留下的笔记被重新公布,并被公认对现代计算机与软件工程造成了重大影响。
在这里插入图片描述

“软件之母”Ada Lovelace

图灵机

20世纪的英国数学家图灵提出了著名的图灵论题,并提出一种假想的计算机的抽象模型,这个模型被称为图灵机。

图灵机,又称图灵计算机,是指一个抽象的机器,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人类进行数学运算。

它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色。有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后结合自己的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换自己的内部状态,然后进行移动。

在这里插入图片描述

图灵机是可被视作任意解决有限数学逻辑过程的机器,可以用来模拟任何算法。图灵机的出现解决了算法定义的难题,图灵的思想对算法的发展起到了重要的作用。

3. 算法的重要特征

一个算法应该具有以下五个重要的特征:

·有穷性(Finiteness)

算法的有穷性是指算法必须能在执行有限个步骤之后终止;

·确切性(Definiteness)

算法的每一步骤必须有确切的定义;

·输入项(Input)

一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;

·输出项(Output)

一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;

·可行性(Effectiveness)

算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成(也称之为有效性)。

4.算法的评定

算法的复杂性是算法效率的度量,在评价算法性能时,复杂性是一个重要的依据。算法的复杂性的程度与运行该算法所需要的计算机资源的多少有关,所需要的资源越多,表明该算法的复杂性越高:所需要的资源越少,表明该算法的复杂性越低。

计算机的资源,最重要的是运算所需的时间和存储程序和数据所需的空间资源,算法的复杂性有时间复杂性和空间复杂性之分。

评定一个算法的优劣可以从以下5个方面进行衡量:

1)时间复杂度

是对一个算法在运行过程中临时占用存储空间大小量度。

2)空间复杂度

程序运行时基本操作所执行的次数。

3)正确性

算法的正确性是评价一个算法优劣的最重要的标准。

4)可读性

算法的可读性是指一个算法可供人们阅读的容易程度。

5)鲁棒性

鲁棒性是指一个算法对不合理数据输入的反应能力和处理能力,也称为容错性。

5.算法设计和分析的基本方法:

1)递归和递推。递归和递推是学习算法设计的第一步。递归算法是把大问题分解成相对较小的问题的过程,而递推就是从小问题逐步推导出大问题的过程。无论递归还是递推,都应该有初始状态。

2)搜索、枚举及优化剪枝。搜索在所有算法中既是最简单也是最复杂的算法。说它简单,是因为算法本身并不复杂,实现容易:说它最复杂,是因为要对搜索的范围进行一定的控制,不然就会出现超时等问题。搜索技术主要包括广度优先搜索和深度优先搜索。当其余算法都无法对问题进行求解时,搜索或许是唯一可用的方法。搜索是对问题的解空间进行遍历的过程。有时问题解空间相当庞大,完全遍历解空间是不现实的,此时就必须充分发掘问题所包含的约束条件,在搜索过程中应用这些条件进行剪枝,从而减少搜索量。

3)分治法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题…直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…

4)动态规划法。动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。

5)贪心算法(亦作饕餮法)。就是一种在每一步选择中都采取在当前状态下最好/优的选择,从而希望导致结果是最好!优的算法。贪心法可以解决一些最优性问题,如:求图中的最小生成树、求哈夫曼编码…对于其他问题,贪心法般不能得到我们所要求的答案。一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法。由于贪心法的高效性以及其所求得的答案比较接近最优结果,贪心法也可以用作辅助算法或者直接解决一些要求结果不特别精确的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/144337.html

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

相关文章

【目标检测】G-GhostNet

1、论文 论文题目:《GhostNets on Heterogeneous Devices via Cheap Operations》 论文地址: https://arxiv.org/pdf/2201.03297.pdf 代码地址: https://github.com/huawei-noah/CV-Backbones 2、引言 本文针对网络部署时面临的内存和资源…

python提取excel文本框内容

就提取excel文本框的内容,提供两种方法 一、 转成pdf,识别pdf文字 该方法需要注意两点: 1.似乎只能识别选中的文字(图片不行) 2.会受到精度影响(即有可能识别出错字) 以下是代码 先转存为pdf格…

IB中文解析,助力冲7分

我们知道,IB、AP、A Level三大国际课程体系都有中文,尤其IB学生,由于必选一门母语与语言,中文成了必选项。IB中文可以说是很多IB学子的心头大患了,引发焦虑的文章比比皆是。 不少家长看到这可能会问,中国学…

【Linux 进程地址空间】

1.程序地址空间的概率&#xff08;C/C的说法不够准确&#xff09;写一段代码来来证明C/C程序地址空间是按上图分布的&#xff1a;#include<stdio.h> #include<string.h> #include<stdlib.h> int uninit; int init100; int main() {printf("code addr:%p…

Anaconda中安装CUDA版本的PyTorch

Question: GPU是一种擅长处理专业计算的处理器。这与中央处理器&#xff08;CPU&#xff09;形成鲜明对比&#xff0c;中央处理器是一种擅长处理一般计算的处理器。CPU是为我们电子设备上大多数典型计算提供动力的处理器。GPU的计算速度比CPU快得多。但是&#xff0c;情况并非…

经验证短视频账号每天最多发3个视频,超过的不予推荐

经验证短视频账号每天最多发3个视频&#xff0c;超过的不予推荐 前两天我在刷短视频的时候&#xff0c;看到一个博主推荐一天可以发几十个视频&#xff0c;感觉有点不对&#xff0c;决定还是自己试一下。 于是&#xff0c;在死亡边缘疯狂试探了好几天&#xff0c;终于得到想要…

在ESXi系统上安装pve

pve是基于debian的&#xff0c;在ESXi上选择系统时建议选择debian并开启虚拟化一、下载下载&#xff1a;https://www.proxmox.com/en/downloads点进下载网站后选择 Proxmox Virtual Environment-->ISO Images-->Proxmox VE 7.3 ISO Installer 下的download按钮二、安装系…

React组件

React组件1.组件基本介绍2.React创建组件的两种方式2.1 函数组件2.2 类与继承2.2.1 class 基本语法2.2.2 extends 实现继承1.组件基本介绍 组件是React中最基本的内容&#xff0c;使用React就是在使用组件组件表示页面中的部分功能多个组件可以实现完整的页面功能组件特点&…

【无人机路径规划】基于IRM和RRTstar进行无人机路径规划(Matlab代码实现)

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

java后端第二阶段:JavaWeb

一、Mysql 定义&#xff1a;关系型数据库&#xff0c;存储在硬盘数据安全。 1.SQL通用语法 注释&#xff1a; 单行注释 -- 注释内容 或 #注释内容&#xff08;MySQL特有&#xff09; 多行注释 /* 注释 */ DDL&#xff1a;操作数据库&#xff0c;表等 DML&#xff1…

PCB设计如何防止阻焊漏开窗

PCB的阻焊层&#xff08;solder mask&#xff09;&#xff0c;是指印刷电路板子上要上绿油的部分。阻焊开窗的位置是不上油墨的&#xff0c;露出来的铜做表面处理后焊接元器件的位置&#xff0c;不开窗的位置都是印上油墨的防止线路氧化、漏电。 PCB阻焊层开窗的三个原因 1.孔…

【架构设计】如何让你的应用做到高内聚、低耦合?

前言 最近review公司的代码&#xff0c;发现代码耦合程度特别高&#xff0c;修改一处&#xff0c;不知不觉就把其他地方影响到了&#xff0c;这就让我思考该如何让我们写的代码足够内聚&#xff0c;减少耦合呢&#xff1f; "高内聚、松耦合"是一个非常重要的设计思…

Idea插件之日志管理神器(Grep Console)

1.简介Grep Console是一款方便开发者对idea控制台输出日志进行个性化管理的插件。2.功能特性Grep Console的主要功能特性&#xff1a;支持自定义规则来过滤日志信息&#xff1b;支持不同级别的日志的输出样式的个性化配置&#xff1b;总结&#xff1a;通过过滤功能、输出日志样…

经典卷积神经网络-AlexNet

AlexNet 学习目标 知道AlexNet网络结构能够利用AlexNet完成图像分类2012年&#xff0c;AlexNet横空出世&#xff0c;该模型的名字源于论文第一作者的姓名Alex Krizhevsky 。AlexNet使用了8层卷积神经网络&#xff0c;以很大的优势赢得了ImageNet 2012图像识别挑战赛。它首次证…

为何瑞达利欧的《原则一》这么难读懂?

开始搞不懂&#xff0c;为何一个桥水基金创始人&#xff0c;一位投资人&#xff0c;却写了一本这样的书&#xff0c;书中的内容初看时觉得与他从事的投资事业几乎毫无关系&#xff1f; 《原则》其副标题为《生活和工作的原则》 乍看&#xff0c;此书黑色的封皮&#xff0c;让我…

【自学C++】C++ std命名空间

C std命名空间 C std命名空间教程 在 C 中 std 命名空间 是 C 中标准库类型对象的命名空间。我们常用的输入和输出 函数 都是定义在 std 命名空间中的&#xff0c;因此&#xff0c;我们需要使用输入和输出&#xff0c;必须要引入 std 命名空间。 要引用一个命名空间中的内容…

电脑自动删除文件怎么恢复?分享4种方法

电脑出现文件丢失的情况常有发生&#xff0c;但是出现电脑自动删除文件的情况是怎么回事呢&#xff1f;电脑自动删除的文件怎么恢复呢&#xff1f;本文将详细阐述电脑自动删除文件原因和文件恢复方法。一、电脑自动删除文件是什么原因1.可能不是删除而是电脑开机用户名更改后导…

Java真的不难(五十三)Docker的快速入门及使用

Docker的入门及使用 这篇文章将不全面介绍理论&#xff0c;Docker对于我们后端开发来说会用就行&#xff0c;能使用Docker去安装一些镜像运行&#xff0c;为简化配置节省时间和错误率&#xff0c;所以这篇文章实用性很高&#xff0c;可以直接上手&#xff01; 一、什么是Docke…

生产制造业ERP管理系统财务管理解决方案

对于生产制造型企业来说&#xff0c;良好的资金运营管理机制是企业长期、稳定、健康发展的保证。因此&#xff0c;企业急需借助生产制造业ERP管理系统&#xff0c;不断加强企业财务管理&#xff0c;从而有效提升企业的经营效率&#xff0c;降低财务风险&#xff0c;缓解资金成本…

云渲染答疑:动画渲染价格一般多少?

云渲染是什么&#xff1f;云渲染就是通过互联网将用户本地需要渲染的文件上传到云端服务器中&#xff0c;再通过云端庞大的计算机集群资源进行运算操作&#xff0c;帮助用户在云端完成渲染工作后&#xff0c;用户再下载到本地的过程&#xff0c;整个过程操作十分简便。云渲染动…