检验算法程序的好坏标准

发布时间 2024-01-08 14:06:23作者: Mysticbinary

什么是算法程序?

算法程序通常指的是执行特定算法的计算机程序。要深入理解这个概念,我们可以将其分解为“算法”和“程序”两部分,并探究它们的基本含义。
简而言之:对特定问题求解过程的描述。

算法 (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/