什么是算法程序?
算法程序通常指的是执行特定算法的计算机程序。要深入理解这个概念,我们可以将其分解为“算法”和“程序”两部分,并探究它们的基本含义。
简而言之:对特定问题求解过程的描述。
算法 (Algorithm):
定义:算法是解决问题的明确步骤序列,它是独立于任何编程语言的,可以用伪代码、流程图或者简单的自然语言来描述。
特点:
- 有穷性:算法在执行有限步骤之后会自动结束。
- 确定性:算法的每一个步骤都有明确的定义,不会产生二义性。
- 输入:算法有0个或多个输入。
- 输出:算法有一个或多个输出,是算法处理输入后的结果。
- 可行性:算法的每一步都必须足够基础,可以通过已有的基本运算步骤实现。
程序 (Program):
定义:程序是算法用某种编程语言的具体实现,它是指令的集合,计算机可以直接解释或编译后执行这些指令。
特点:
- 语言相关:程序必须用一种计算机可以理解的语言编写,如Python、C++、Java等。
- 可执行:程序可以在计算机上运行,对输入数据进行处理,输出结果。
- 交互性:程序可以与用户或其他系统交互,响应输入并提供相应的输出。
怎么检验算法程序的好坏?
去衡量算法效率的主要指标就是算法需要的步骤数。
怎么得到算法需要的步骤数?
使用大O表示法。
大O表示法
什么是大O表示法?
result = O(int n); 就类似一个函数,你输入数字进去,会得到一个数字结果。
下图是一个很好的记忆辅助工具图,展示了算法的相对速度。(如果有的选,就选更快的算法!)
希望下面的生日蛋糕能让大 O 表示法更好理解。
O(1) - 常数时间
对于常数时间,举例:不管多少人参加生日聚会,都只需要做一个蛋糕。因此制作蛋糕的时间是一个常量。
O(log n) - 对数时间
一个 O(log n) 操作的例子是有序数组的二分查找。
O(n) - 线性时间
一个 O(n) 操作的例子是用最粗暴的方式在数组里遍历找到指定元素。在 10 个元素的数组里,最坏情况下需要找十次才能找到指定元素。在 100 万个元素的数组里,可能需要找 100 万次。
O(n^2) - 二次时间
对于二次时间,举例来说,每个参会者都有属于自己的蛋糕,另外,每个蛋糕上的都会有所有人在上面签名。
O(n!) - 阶乘时间
如果我们只有一个乐高积木,很显然,我们只需要完成一次任务。如果有两个乐高积木,我们有两种选择的可能,:
- 可以是“先叠塔后建桥”
- 或者“先建桥后叠塔”; (所以我们得完成2次任务)
如果有三个乐高积木,可能性就更多了:
- “先叠塔、再建桥、最后造房子”,
- 或者“先造房子、再叠塔、最后建桥”
- ……一共有6种可能的顺序。
我们可以看到,每增加一个乐高积木,可能的任务完成顺序会急剧增加。
如果我们有4个乐高积木,可能的顺序就有24种(也就是4的阶乘,即4!);如果有5个,就有120种(5!);以此类推。
现在,我们用大O表示法来描述这个情况。我们说,如果游戏的规则要求我们探索每一种可能的顺序,那么这个游戏的难度(或者说我们完成任务所需要的时间)是“阶乘时间”的,用大O表示法就是O(n!),其中n是乐高积木的数量。这意味着,乐高积木数量的一个小小增加会让游戏变得极其困难,因为可能的顺序数量增加得非常快。
阶乘时间的例子在现实中比较少见,因为随着n的增长,时间复杂度会变得非常高,这样的算法通常不适用于大量数据的处理。
常见的阶乘时间算法包括:
- 解决旅行推销员问题(寻找最短可能路径访问一系列城市并返回出发点)的暴力搜索算法。
- 旅行商问题。
Reference:
图解大 O 表示法
https://www.freecodecamp.org/chinese/news/big-o-notation/