Algorithm——何为算法?
摘自:https://zh.wikipedia.org/wiki/算法
在数学和计算机科学/算学之中,算法/演算法/算则法(Algorithm)为一个计算的具体步骤,常用于计算、数据处理和自动推理。精确而言,算法是一个表示为有限长列表的有效方法。算法应包含清晰定义的指令用于计算函数。
算法中的指令描述的是一个计算,当其运行时能从一个初始状态和初始输入(可能为空)开始,经过一系列有限而清晰定义的状态最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。
算法的核心是创建问题抽象的模型和明确求解目标,之后可以根据具体的问题选择不同的模式和方法完成算法的设计。
简而言之,算法就是用来解决一个特定任务的一系列步骤.
一个有效的算法包含五个重要特性:
- 输入项(Input):必须有零个或以上的输入
- 输出项(Output):应有一个或以上输出量,输出量是算法计算的结果。
- 有限性(Finiteness):如果你设计的算法永无休止地尝试解决问题,那么它是无用的。
- 明确性(Definiteness):算法的每一步都必须准确定义,在任何场景下指令都应当没有歧义。
- 有效性(Effectiveness):又称可行性。一个算法被设计用以解决某个问题,那么它就应当能解决这个问题,并且仅仅使用纸和笔就能证明该算法是收敛的。
还有一个要点需要知道,算法不仅仅应用在计算机科学,同时也在数学领域中使用。实际上,计算机科学中的算法是由数学模型推导而成的,
算法在中国古代文献中称为“术”,最早出现在《周髀算经》、《九章算术》。要说到最早的算法,就要追朔到公元前300年欧几里得《几何原本》中的辗转相除法。
算法的评定
同一个问题有多种解法,而一个算法的质量的优劣将影响算法的速度,算法评定用于选择最优算法。一个算法的评定主要有时间复杂度和空间复杂度去考虑。
时间复杂度
算法的时间复杂度就是指算法完成所需要消耗的时间。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做
算法执行时间的增长率与f(n) 的增长率正相关,称作渐近时间复杂度(Asymptotic Time Complexity),简称时间复杂度。
常见的时间复杂度有:常数阶O(1),线性阶O(n),对数阶O(logn),线性对数阶O(n logn),指数阶O(nk)……随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
也有一种特殊的时间复杂度,叫做非确定性多项式时间(NP),所谓的非确定性是指:用极大的数量去解决来达成多项式时间解决的问题。有一个典型的例子,就是输出n个元素的全排列,是一个NP-hard问题(有兴趣的可以查看NP(复杂度))。
空间复杂度
算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。
个人见解
个人认为,算法的核心它的思想。从问题中寻找关键点,制定解决方案,最后到优化这一系列步骤中都是有选择的。大部分刚开始学算法的技术人员,似乎都觉得在实际中没有什么用处。但实际上,大部分算法之间是有关联的。
例如堆排序与二分查找,都是由一次判断而排除了一些的不可能成立或不需要的判断。举个例子,当TestA()成立时TestB()和TestC()才有可能成立,那么当TestA()不成立时,TestB()和TestC()就可以跳过不判断了,这就是减少了赘余的判断了。
所以遇见毫无思路的题目,不是把每一种算法都想一遍,看看是否适用,而是用纸把常规的解题方法写下,或者暴力的方法,寻找其中的规律,再套用算法,才是学会算法。
转载于:https://www.cnblogs.com/Bita/p/6501454.html
Algorithm——何为算法?相关推荐
- 萤火虫算法以及避障算法path planning in uncertain environment by using firefly algorithm(萤火虫算法在实际中的应用)
萤火虫算法以及避障算法path planning in uncertain environment by using firefly algorithm(萤火虫算法在实际中的应用) 萤火虫算法介绍 2 ...
- Manacher Algorithm马拉车算法详解
Manacher Algorithm马拉车算法详解 链接:https://www.zhihu.com/question/37289584/answer/465656849 中心扩展算法 我们先来看一个 ...
- C#,人工智能,机器人,路径规划,A*(AStar Algorithm)算法、源代码及计算数据可视化
Peter Hart Nils Nilsson Bertram Raphael 参考: C#,人工智能(AI)机器人路径规划(Path Planning)的ARA*(Anytime Replannin ...
- MSA(Method of Successive Algorithm)算法逻辑及实例
文章目录 前言 一.MSA算法是什么? 二.求解优化问题 1.典型优化问题 2.求解步骤 三.简单案例 总结 前言 在城市交通网络配流问题的求解中,MSA(Method of Successive A ...
- Manacher's Algorithm 马拉车算法(最长回文串)
这个马拉车算法Manacher's Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这 ...
- Algorithm: 匈牙利算法
例子: poj3041 解法: 摘自http://blog.csdn.net/lyy289065406/article/details/6647040 把方阵看做一个特殊的二分图(以行列分别作为两个顶 ...
- C#,骑士游历问题(Knight‘s Tour Problem)的恩斯多夫(Warnsdorff‘s Algorithm)算法与源代码
古往今来,对国际象棋及其战略游戏的迷恋鼓励了许多类型的复杂和分析性谜题.其中之一是<骑士之旅>,在过去的两个世纪里,它吸引了数学和游戏解决方案领域的一些最伟大的头脑. 问题涉及在标准大小的 ...
- HBA-蜜獾算法(Honey Badger Algorithm,HBA)(算法源码可复制)
蜜獾算法(Honey Badger Algorithm,HBA)是于2021年提出的一种新型智能优化算法,该算法主要通过模拟蜜獾智能觅食行为来进行寻优,具有寻优能力强,收敛速度快等特点 论文题目:Ho ...
- C#,图论与图算法,寻找图强连通单元(Strongly Connected Components)的罗伯特·塔扬(Robert Tarjan‘s Algorithm)算法与源程序
Tarjan算法是一种高效的图算法,它利用图的深度优先搜索遍历,在线性时间内找到有向图中的强连通分量.使用的关键思想是,强连通组件的节点在图的DFS生成树中形成子树. 将有向图划分为强连通分量的任务非 ...
- Peterson‘s Algorithm皮特森算法详解
Peterson算法是实现进程互斥访问临界区的一种方法,避免了单标志法必须交替访问的限制,以及双标志法后检验的"饥饿"问题. Peterson算法实现如下: //操作系统 临界区互 ...
最新文章
- 基于注意力机制的图卷积网络预测药物-疾病关联
- Cisco防火墙技术汇总[转贴]
- ELK 日志管理系统,再次尝试记录
- javascript中的replace方法
- ABAP内表在ABAP 740后支持的filter操作
- python——学习笔记3
- VIM自动格式化C代码
- c语言math函数 sgn,常用矩阵计算C语言代码
- java怎么写事件listener_java 事件监听器ActionListener
- linux tcp 阻塞时间,TCP的阻塞和重传机制
- 调查了 2 万多名 Python 开发者,有了这些发现!
- android根据ip获取查询省份,通过IP地址获取省份城市位置信息
- 【Unity】6.2 在VS2015中调试 C# 脚本
- oracle临时表怎么删除吗,删除Oracle临时表
- 微软账号登陆不上_微软待办(todo)如何跟Outlook任务同步?
- 「JCVI教程」使用JCVI进行基因组共线性分析(上)
- 面试-数据知识点准备
- 使用c#建立奥运奖牌榜
- html 93c,对93c46编程
- 计算图像每行占用的字节数
热门文章
- 权力的游戏登录显示服务器上限,权力与纷争登录不上怎么办 登录不上解决方案...
- 关于umask函数和creat函数
- nyoj1086是否被整除(数学小技巧)
- c-free显示运行程序错误怎么办_Mac电脑没声音了怎么办?解决Mac上声音问题
- 统计123出现次数_Java字符串03-统计大小写字母出现的次数
- teablue数据分析_Bluetea蓝茶的品牌该如何分析,你知道吗
- C/C++[codeup 1931]打印日期,一年的第n天是几月几号
- fine-tune 微调 Transfer learning 迁移学习 动手学深度学习v2
- TensorFlow by Google过拟合优化 Machine Learning Foundations: Ep #7 - Image augmentation and overfitting
- linux中fb0和fb1同时显示数据,Linux frame buffer驱动设计与实现