算法(英語:),在數學(算學)和電腦科學之中,指一個被定義好的、計算機可施行其指示的有限步驟或次序,常用於計算、數據處理和自動推理。

本文主要是介绍算法(英語:),在數學(算學)和電腦科學之中,指一個被定義好的、計算機可施行其指示的有限步驟或次序,常用於計算、數據處理和自動推理。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

算法(英語:),在數學(算學)和電腦科學之中,指一個被定義好的、計算機可施行其指示的有限步驟或次序,常用於計算、數據處理和自動推理。算法是有效方法,包含一系列定义清晰的指令,并可于有限的时间及空间内清楚的表述出来。

算法中的指令描述的是一個計算,它執行時從一個初始狀態和初始輸入(可能爲空)開始,經過一系列有限而清晰定義的狀態最終產生輸出停止於一個終態。一個狀態到另一個狀態的轉移不一定是確定的。包括隨機化算法在内的一些算法,都包含了一些隨機輸入。

早在尝试解决希尔伯特提出的判定问题时,算法的不完整概念已经初步定型;在其后的正式化阶段中人們尝试去定义“有效可計算性”或者“有效方法”。这些尝试包括库尔特·哥德尔、雅克·埃尔布朗和斯蒂芬·科尔·克莱尼分别于1930年、1934年和1935年提出的遞歸函數,阿隆佐·邱奇於1936年提出的λ演算,1936年埃米爾·萊昂·珀斯特的Formulation 1和艾倫·圖靈1937年提出的圖靈機。即使在當下,依然常有符合直覺的想法難以定義爲形式化算法的情況。

历史

算法在中国古代文献中称为“术”,最早出现在《周髀算經》、《九章算术》。特别是《九章算术》,给出四则运算、最大公约数、最小公倍数、开平方根、开立方根、求素数的埃氏篩,线性方程组求解的高斯消元法。三国時代的刘徽给出求圆周率的算法:刘徽割圆术。

自唐代以来,历代更有许多专门论述“”的专著:

  • 唐代:《一位》 一卷,《》 一卷;
  • 宋代:《绪论》 一卷、《秘诀》 一卷;最著名的是杨辉的《杨辉》;
  • 元代:《》;
  • 明代:程大位 《统宗》
  • 清代:《开平》、《一得》、《全书》。

而英文名稱「algorithm」来自于9世纪波斯数学家花拉子米(比阿勒·霍瓦里松,波斯語:‎,拉丁轉寫:al-Khwarizmi),因為比阿勒·霍瓦里松在数学上提出了算法这个概念。「算法」原为「algorism」,即“al-Khwarizmi”的音转,意思是“花拉子米”的运算法则,在18世纪演变为「algorithm」。

欧几里得算法被人们认为是史上第一个算法。

第一次编写程序是愛達·勒芙蕾絲()于1842年为巴贝奇分析机编写求解解伯努利微分方程的程序,因此愛達·勒芙蕾絲被大多数人认为是世界上第一位程序员。因为查尔斯·巴贝奇()未能完成他的巴贝奇分析机,这个算法未能在巴贝奇分析机上执行。

因为「well-defined procedure」缺少数学上精确的定义,19世纪和20世纪早期的数学家、逻辑学家在定义算法上出现了困难。20世纪的英国数学家图灵提出了著名的图灵论题,并提出一种假想的计算机的抽象模型,这个模型被称为图灵机。图灵机的出现解决了算法定义的难题,图灵的思想对算法的发展起到了重要的作用。

特征

以下是高德纳在他的著作《计算机程序设计艺术》裡對演算法的特徵歸納:

  1. 输入:一个算法必须有零个或以上输入量。
  2. 输出:一个算法应有一个或以上输出量,输出量是算法计算的结果。
  3. 明確性:算法的描述必须无歧义,以保证算法的實際执行结果是精確地符合要求或期望,通常要求實際執行結果是确定的。
  4. 有限性:依據圖靈的定義,一個演算法是能夠被任何圖靈完備系統模擬的一串運算,而圖靈機有有限個狀態、有限個輸入符號和有限個轉移函數(指令)。而一些定義更規定演算法必须在有限個步骤内完成任務。
  5. 有效性:又称可行性。能够实现,算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。

基本要素

算法的核心是建立问题抽象的模型和明确求解目标,之后可以根据具体的问题选择不同的模式和方法完成算法的设计。

常用设计模式

完全遍歷法和不完全遍歷法:在问题的解是有限离散解空间,且可以验证正确性和最优性时,最简单的算法就是把解空间的所有元素完全遍历一遍,逐个检测元素是否是我们要的解。这是最直接的算法,实现往往最简单。但是当解空间特别庞大时,这种算法很可能导致工程上无法承受的计算量。这时候可以利用不完全遍历方法——例如各种搜索法和规划法——来减少计算量。

分治法:把一个问题分割成互相独立的多个部分分别求解的思路。这种求解思路带来的好处之一是便于进行并行计算。

动态规划法:当问题的整体最优解就是由局部最优解组成的时候,经常采用的一种方法。

贪婪算法:常见的近似求解思路。当问题的整体最优解不是(或无法证明是)由局部最优解组成,且对解的最优性没有要求的时候,可以采用的一种方法。

线性规划法:见条目。

简并法:把一个问题通过逻辑或数学推理,简化成与之等价或者近似的、相对简单的模型,进而求解的方法。

常用实现方法

递归方法与迭代方法

顺序计算、并行计算和分布式计算:顺序计算就是把形式化算法用编程语言进行单线程序列化后执行。

确定性算法和非确定性算法

精确求解和近似求解

形式化算法

算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务,如计算职工的薪水或打印学生的成绩单。一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。

复杂度

时间复杂度

算法的时间复杂度是指算法需要消耗的时间资源。一般来说,计算机算法是问题规模��n的函数�(�)�(�)f(n),算法的时间复杂度也因此记做

�(�)=�(�(�))�(�)=�(�(�))T(n)=O(f(n))

算法执行时间的增长率与�(�)�(�)f(n)的增长率正相关,称作渐近时间复杂度,简称时间复杂度。

常见的时间复杂度有:常数阶�(1)�(1)O(1),对数阶�(log⁡�)�(log⁡�)O(logn),线性阶�(�)�(�)O(n),线性对数阶�(�log⁡�)�(�log⁡�)O(nlogn),平方阶�(�2)�(�2)O(n2),立方阶�(�3)�(�3)O(n3),...,��k次方阶�(��)�(��)O(nk),指数阶�(2�)�(2�)O(2n)。随着问题规模��n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。

空间复杂度

算法的空间复杂度是指算法需要消耗的空间资源。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。

实现

算法不单单可以用计算机程序来实现,也可以在人工神经网络、电路或者机械设备上实现。

範例

求最大值演算法

这是算法的一个简单的例子。

我们有一串随机数列。我们的目的是找到这个数列中最大的数。如果将数列中的每一个数字看成是一颗豆子的大小,可以将下面的算法形象地称为「捡豆子」:

  1. 首先将第一颗豆子放入口袋中。
  2. 从第二颗豆子开始检查,如果正在检查的豆子比口袋中的还大,则将它捡起放入口袋中,同时丢掉原先口袋中的豆子。反之則繼續下一顆豆子。直到最后一颗豆子。
  3. 最后口袋中的豆子就是所有的豆子中最大的一颗。

以上算法在中国大陆的教科书中通常被叫做“打擂法”或者“循环打擂”:在一个for循环中,每轮循环都有新的挑战者。若挑战者胜的话,挑战者做新擂主,否则擂主卫冕。for循环结束后输出最后的擂主。

下面是一个形式算法,用ANSI C代码表示

int max(int *array, int size)
{int mval = *array;int i;for (i = 1; i < size; i++)if (array[i] > mval)mval = array[i];return mval;
}

求最大公約數演算法

求两个自然数的最大公约数 设两个变量��M和��N

  1. 如果�<��<�M<N,则交换��M和��N
  2. ��M除以��N,得到余数��R
  3. 判断�=0�=0R=0,正确则��N即为“最大公约数”,否则下一步
  4. 将��N赋值给��M,将��R赋值给��N,重做第一步。

用ANSI C代码表示

//交換2數
void swapi(int *x, int *y)
{int tmp = *x;*x = *y;*y = tmp;
}int gcd(int m, int n)
{int r;do{if (m < n)swapi(&m, &n);r = m % n;m = n;n = r;} while (r);return m;
}

利用if函式以及遞迴則能做出更為精簡的程式碼,更可省去交換的麻煩。(但是也因為遞迴呼叫,其空間複雜度提高)

int gcd(int a,int b)
{if(a%b)return gcd(b,a%b);return b;
}

分类

  • 基本算法
    • 枚举
    • 搜索
      • 深度优先搜索
      • 广度优先搜索
      • 遗传算法
  • 数据结构的算法
  • 数论与代数算法
  • 计算几何的算法
    • 凸包算法
  • 图论的算法
    • 哈夫曼编码
    • 树的遍历
    • 最短路径算法
    • 最小生成树算法
    • 最小树形图
    • 网络流算法
    • 匹配算法
    • 分團問題
  • 动态规划
  • 其他
    • 数值分析
    • 加密算法
    • 排序算法
    • 检索算法
    • 随机化算法
    • 关于并行算法,请参阅并行计算一文。

註釋

  1. ^  Thomas H. Cormen; Charles E. Leiserson; Ronald L. Rivest; Clifford Stein; 殷建平等译. . 原书第3版. 北京: 机械工业出版社. 2013年1月: 3[5] [2017-11-14]. ISBN 978-7-111-40701-0 (中文).
  2. ^  Well defined with respect to the agent that executes the algorithm: "There is a computing agent, usually human, which can react to the instructions and carry out the computations"(Rogers 1987:2).
  3. ^  "Any classical mathematical algorithm, for example, can be described in a finite number of English words"(Rogers 1987:2).
  4. ^  "An algorithm has zero or more inputs, i.e., quantities which are given to it initially before the algorithm begins"(Knuth 1973:5)
  5. ^  "A procedure which has all the characteristics of an algorithm except that it possibly lacks finiteness may be called a 'computational method'"(Knuth 1973:5)
  6. ^  "An algorithm has one or more outputs, i.e. quantities which have a specified relation to the inputs"(Knuth 1973:5)
  7. ^  Whether or not a process with random interior processes (not including the input) is an algorithm is debatable. Rogers opines that: "a computation is carried out in a discrete stepwise fashion, without use of continuous methods or analogue devices... carried forward deterministically, without resort to random methods or devices, e.g., dice" Rogers 1987:2).
  8. ^  Whether or not a process with random interior processes (not including the input) is an algorithm is debatable. Rogers opines that: "a computation is carried out in a discrete stepwise fashion, without use of continuous methods or analogue devices ... carried forward deterministically, without resort to random methods or devices, e.g., dice" Rogers 1987:2).
  9. ^  Kleene(斯蒂芬·科尔·克莱尼)1943 in Davis 1965:274
  10. ^  Rosser(巴克利·羅瑟)1939 in Davis 1965:225
  11. ^  Moschovakis, Yiannis N. . Engquist, B.; Schmid, W. (编). . Springer. 2001: 919–936 (Part II) [2012-09-27]. (原始内容存档于2021-04-24).
  12. ^  . The Guardian. 10 December 2012 [10 December 2012]. (原始内容存档于2018-12-25).
  13. ^  . 读书频道-IT技术图书-51CTO.COM. [2017-06-07]. (原始内容存档于2017-03-24).
  14. ^  . 湖南科技大学程序设计在线评测(Online Judge).
  15. ^  . 在点网. [2017-06-07]. (原始内容存档于2019-06-03).

参考文献

  • Rogers, Jr, Hartley. . The MIT Press. 1987. ISBN 0-262-68052-1.
  • Davis, Martin. . New York: Raven Press. 1965. ISBN 0-486-43228-9. Davis此書中有列出許多相關的論文,包括哥德尔、邱奇、图灵、巴克利·羅瑟、斯蒂芬·科尔·克莱尼及埃米爾·波斯特的論文。在參考文獻中也會列出原作者的姓名。

参閱

  • 抽象機器
  • 算法作曲
  • 高级综合
  • 垃圾进,垃圾出
  • 《算法导论》
  • 计算理论
    • 可计算性理论
    • 計算複雜性理論

延伸阅读

[编]

 《欽定古今圖書集成·曆象彙編·曆法典·算法部》,出自陈梦雷《古今圖書集成》

外部链接

  • 20世纪十大算法 (页面存档备份,存于)
  • 演算法笔记 (页面存档备份,存于)
  • 计算几何算法概览 (页面存档备份,存于)

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.

这篇关于算法(英語:),在數學(算學)和電腦科學之中,指一個被定義好的、計算機可施行其指示的有限步驟或次序,常用於計算、數據處理和自動推理。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/277499

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作