什么是算法?算法的发展历程?特征?什么是复杂度?

今天突发奇想,作为一个新人码农小白,想要写一写博客,记录一下自己在学习过程中遇到的一些问题和疑惑。顺便培养一下自己的学习习惯,也会记录一下小白的Java学习过程。

一、什么是算法?

​ 官方的概念呢,算法(algorithm)是解决一系列问题的清晰指令,也就是,能对一定规范的输入,在有限的时间内获得所要求的输出。

//我自身的理解呢,就是能够让我们编写程序代码更简洁,能够提升算法的运行效率。

二、算法的发展历程

   算法的发展历程可以追溯到古代的数学和逻辑研究,随着计算机科学的发展,算法逐渐成为现代技术的重要组成部分。以下是算法发展的一些关键阶段:

1.古代算法的起源

​ 公元前3000年:在古巴比伦和埃及的数学中,出现了最早的算法形式,用于解决算术问题,如加法、减法、乘法和除法。

欧几里得算法:公元前300年左右,希腊数学家欧几里得在其著作《几何原本》中提出了计算两个整数的最大公约数的算法,这被认为是最早的已知算法之一。

2.中世纪和文艺复兴时期

​ 阿拉伯数学:在公元9世纪,阿拉伯数学家穆罕默德·伊本·穆萨·花拉子米编写了一本书,介绍了用十进制数字表示和计算的方法。阿拉伯语“al-Khwarizmi”一词被译为“algorithm”,形成了“算法”一词的起源。

​ 费马和帕斯卡:在17世纪,费马和帕斯卡发展了概率论的基础算法,为统计和数值计算奠定了基础。

3.近代数学与计算

​ 莱布尼茨和牛顿:17世纪末,莱布尼茨和牛顿独立地发明了微积分,为连续变化的数学分析提供了基础算法。

​ 图灵机:1936年,英国数学家艾伦·图灵提出了“图灵机”的概念,这是一种数学模型,定义了算法的计算过程,是现代计算机科学的基础。

4.计算机科学的诞生

​ 香农的信息论:1948年,克劳德·香农发表了《通讯的数学理论》,为信息传递中的算法奠定了理论基础。

​ 算法的分类与发展:20世纪50年代,随着计算机的出现,算法得到了更广泛的研究与应用。计算机科学家开始开发和研究各种算法,如排序算法、搜索算法、图算法等。

5.现代算法的发展

​ 复杂性理论:20世纪60年代,计算复杂性理论逐渐形成,研究算法的时间和空间复杂度,定义了P类、NP类问题,以及NP完全性。

​ 分治算法和动态规划:20世纪70年代,分治算法和动态规划技术成为解决复杂问题的重要方法,如快速排序、归并排序、矩阵链乘法等。

​ 图论算法:20世纪80年代,图论算法得到了广泛的研究和应用,如最短路径算法(Dijkstra算法)、最小生成树算法(Kruskal和Prim算法)。

6.大数据和机器学习时代

​ 大数据算法:21世纪,随着数据量的爆炸式增长,处理海量数据的算法(如MapReduce、Hadoop等)得到了发展。
机器学习算法:算法发展进入了一个新的阶段,机器学习、深度学习等人工智能算法成为了热点,包括支持向量机、神经网络、决策树、随机森林等。

​ 分布式和并行算法:为了处理大规模计算任务,分布式计算和并行计算算法得到了广泛应用,如Spark和TensorFlow。

7.未来的发展

​ 量子算法:随着量子计算的发展,量子算法(如Shor算法和Grover算法)有望在解决某些计算问题上超越传统算法。

​ 人工智能与自动算法生成:自动生成和优化算法的技术正在发展,人工智能算法也在不断提升,实现了自适应、自学习的复杂系统。

//以上内容都是百度可以找到的,将他们整理到这里可以供大家阅读一下,作为一个了解内容 就好哦。

三、算法的特征

1. 有穷性(Finiteness)

定义:算法必须在有限的步骤内完成,也就是说,算法不能是无限循环的,必须保证在执行有限步骤后得出结果。

解释:任何一个算法的每个步骤都应该能够在有限的时间内完成,并且算法必须在有限的步骤后终止,给出结果或者得出问题无解的结论。

2. 确定性(Definiteness)

定义:算法的每一个步骤都应该是明确的、无歧义的,也就是说,在相同的输入条件下,算法必须产生相同的输出。

解释:算法的每一个步骤都应该清楚地描述出来,以确保在每次执行时,不管是谁执行,都会得出相同的结果。例如,计算两个数的和,这个过程是确定的,而没有模糊性。

3. 输入(Input)

定义:算法应该有零个或多个输入。

解释:一个算法可以接收外部提供的数据作为输入。如果没有输入,算法的行为可能会基于某些初始条件或者预设值来完成。

4. 输出(Output)

定义:算法应当至少有一个输出结果。

解释:算法在处理输入数据后,应产生一个或多个输出结果,这个输出可以是算法问题的解,也可以是中间计算的值。

5. 可行性(Feasibility)

定义:算法的每一步操作都应该是可行的,也就是能够通过有限的资源(如时间、内存)来实现。

解释:算法必须在合理的时间和资源范围内执行每一步操作。例如,计算机能够通过基本的算术操作和逻辑操作来实现算法的每一步。

6. 有效性(Effectiveness)

定义:算法的每一步都应该简单且容易执行,并且这些步骤应当是清楚且有效的。

解释:每一个算法步骤都必须是具体的、可以执行的基本操作,不能有模糊的、抽象的指令。有效性保证了算法在实际中是可实现的。

7. 独立性(Independence)

定义:算法的设计与实现应独立于具体的编程语言、机器或实现环境。

解释:算法应该是一种普遍的解决问题的方法,而不是特定于某一编程语言或硬件环境。不同的编程语言和计算机系统可以用不同的方式实现相同的算法。

四、算法的复杂度

算法的复杂度就是算法在执行过程中所需的资源量,包括时间复杂度空间复杂度。

1.时间复杂度(TimeComplexity)

**定义: **时间复杂度是指算法执行所需的时间随输入规模的变化而变化的规律,通常使用大O符号(O-notation)来表示。

目的:**通过时间复杂度,可以预测算法在处理不同规模的输入时需要多长时间,帮助选择效率更高的算法。 **

常见的时间复杂度表示:

O(1):常数时间复杂度,算法的执行时间不随输入规模变化。

O(log n):对数时间复杂度,常见于二分查找。

O(n):线性时间复杂度,常见于简单的遍历算法。

O(n log n):线性对数时间复杂度,常见于高效的排序算法(如快速排序、归并排序)。

O(n^2):平方时间复杂度,常见于简单的排序算法(如冒泡排序、选择排序)。

O(2^n):指数时间复杂度,常见于解决NP问题的递归算法。

O(n!):阶乘时间复杂度,常见于排列组合问题的暴力解决算法。

2.空间复杂度(Space Complexity)

定义:空间复杂度是指算法执行过程中占用的内存空间随输入规模的变化而变化的规律,通常也使用大O符号表示。

目的:通过空间复杂度,可以评估算法在处理不同规模的输入时需要多少内存,帮助选择节省空间的算法。

常见空间复杂度表示

O(1):常数空间复杂度,算法所需的额外空间不随输入规模变化。

O(n):线性空间复杂度,常见于需要存储额外数据的算法(如递归中使用的栈空间)。

O(n^2):平方空间复杂度,常见于需要存储二维数组或矩阵的算法。

ps:以上内容大部分整合自网络,主要就是想先有个印象,然后进行算法的学习,不然什么都不知道,实在是“男”上加“男”啊。

下一篇内容呢,会介绍一下今天学到的算法,浅浅记录一下,不喜勿喷哈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值