算法的属性

2025年1月11日 | 阅读时间10分钟

描述算法

"在计算或其他问题解决方法中需要遵循的一组规则" 或 "一个在有限步内解决数学问题的过程,通常涉及递归操作" 这两个是对算法一词的定义。

因此,算法是一套有限的过程,用于解决特定问题。根据您想做的事情,算法可以从简单到复杂。

算法类型

有几种不同类型的算法。几种重要的算法包括

  1. 蛮力算法: 解决问题的第一个尝试是蛮力算法。当我们遇到一个问题时,第一个想到的方法就是蛮力算法。
  2. 递归算法: 递归是递归算法的基础。在这种情况下,一个问题被分成多个较小的部分,并由同一个函数反复调用。
  3. 回溯算法: 回溯方法基本上是通过搜索所有可能的解决方案来构建答案。使用这种方法,我们继续根据标准构建答案。每当一个解决方案失败时,我们就会回到失败点,继续下一个解决方案,并重复这个过程,直到找到答案或检查完所有可能的解决方案。
  4. 搜索算法: 搜索算法用于在给定的数据结构中查找单个元素或一组元素。根据它们的处理方式或元素所在的任何数据结构,它们可以有几种形式。
  5. 排序算法: 排序是根据需求以特定方式组织一组事实的过程。排序算法是帮助执行此任务的算法。数据组通常使用排序算法按升序或降序进行排序。
  6. 哈希算法: 哈希算法在操作上与搜索算法相似。但是,它们有一个带有键 ID 的索引。在哈希中,一个键被分配给一个特定的数据。
  7. 分而治之方法: 此方法将一个问题分解为更小的问题,分别解决每个问题,然后合并结果以提供整体答案。该过程涉及以下三个步骤
    • 除以
    • 解决
    • 合并
  8. 贪心算法: 这种算法通过逐块构建解决方案。下一部分的即时优势构成了该部分解决方案的基础。下一部分的答案将是提供最大收益的答案。
  9. 动态规划技术: 为了避免重复计算问题的同一部分,此技术利用了应用已发现答案的想法。它将问题分解为更易于管理的重叠子问题并解决每个子问题。
  10. 随机算法: 在随机算法中,我们使用随机数来提供快速优势。预测结果在一定程度上取决于随机数。

算法的运用

  1. 在许多领域,算法都至关重要,并有多种用途。算法广泛应用于各种领域,例如
  2. 算法是计算机编程的基石,用于解决从简单的排序和搜索到更复杂的问题,如人工智能和机器学习。
  3. 算法在数学中用于解决诸如确定图中最短路径或一组线性方程的最佳答案之类的问题。
  4. 运筹学: 算法用于资源分配、物流和运输等领域的决策和优化。
  5. 人工智能: 人工智能和机器学习建立在算法之上,用于创建能够执行图像识别、自然语言处理和决策等任务的智能系统。
  6. 数据科学: 算法在营销、银行和医疗保健等行业中用于分析、处理和洞察海量数据。
  7. 这些只是算法众多用途中的一小部分。随着新技术的出现和新领域的开发,算法在现代生活中的重要性日益增加。

根据您想做的事情,算法可以从简单到复杂。通过以制作新食谱的过程为例,可以理解它。遵循新食谱时,必须阅读说明并按正确的顺序执行每个步骤。最终结果是新餐点烹饪得恰到好处。每次使用电话、计算机、笔记本电脑或计算器时,您都在使用算法。同样,算法可以帮助程序员执行任务以产生所需的结果。

开发的算法与语言无关,这意味着它只包含简单的指令,这些指令可以用于用任何语言构建它,并且仍然可以提供所需的结果。

算法的性质包括

  • 它应该在设定的时间内结束。
  • 它应该至少有一个输出。
  • 它应该不需要输入,或者需要多个输入。
  • 确定性,这意味着它应该为给定的输入场景提供相同的结果。
  • 算法的每一步都必须是有效的,即每一步都必须产生结果。

算法的优点

  • 它易于理解。
  • 算法以步骤的形式表示问题的解决方案。
  • 由于使用算法时将问题分解为更小的部分或步骤,因此程序员更容易将算法转化为可工作的程序。

算法的缺点

  • 编写算法需要大量时间。
  • 使用算法理解复杂推理可能非常困难。
  • 算法(imp)使得显示分支和循环语句变得困难。

如何创建算法?

  • 作为先决条件,在创建算法之前需要以下事项
  • 明确的问题定义是该方法旨在解决的问题。
  • 在解决问题时,必须考虑问题的限制。
  • 解决问题所需的信息。
  • 问题解决后可能预期的结果。
  • 在提供的限制范围内,可以找到该问题的解决方案。

然后使用上述输入创建算法,以解决该问题。

考虑以下相加三个整数并打印结果的例子。

步骤 1:满足先决条件。

  1. 如前所述,在编写算法之前必须满足算法的要求。
  2. 此算法的任务是相加三个整数并报告该加法的计算结果。
  3. 在解决问题之前必须考虑的问题限制:数字不能包含除数字以外的任何字符。
  4. 解决问题所需的输入:必须相加的三个数字。
  5. 当问题解决后,预期结果如下:表示输入的三个数字之和的单个整数值。
  6. 根据限制,该问题的答案是:必须将三个数字相加才能得到答案。这可以使用 '+' 运算符、按位运算符或任何其他方法来完成。

步骤 2: 创建算法

现在让我们根据上述先决条件创建算法

用于相加三个整数并显示其总和的算法

  1. 开始
  2. 声明以下三个整数变量:1、2 和 3。
  3. 输入要相加的三个整数,并将它们分别输入到变量 num1、num2 和 num3 中。
  4. 声明一个整数变量 sum 以保存三个值的总和。
  5. 将三个整数相加,并将结果保存在变量 sum 中。
  6. 结束 打印变量的总和

步骤 3: 通过使用算法来测试它。

让我们将算法实现为 C++ 语言来测试它。

代码

输出

Enter the 1st number: 0
Enter the 2nd number: 0
Enter the 3rd number: -1577141152

Sum of the 3 numbers is: -1577141152
....................................................................
Process executed in 1.11 seconds
Press any key to continue.

解释

  • 为了保存要相加的三个整数,创建三个变量 num1、num2 和 num3。
  • 声明一个变量 sum 来保存三个数字的总和。
  • 使用 cout 语句提示用户输入第一个数字。
  • 读取第一个数字并将其保存在 num1 中,使用 cin 语句。
  • 使用 cout 命令提示用户输入第二个数字。
  • 读取第二个数字并将其保存在 num2 中,使用 cin 语句。
  • 使用 cout 命令提示用户输入第三个数字。
  • 读取第三个数字并将其保存在 num3 中,使用 cin 命令。
  • 使用 + 运算符将三个整数相加,然后将结果输入 sum 变量。
  • 使用 cout 命令打印三个数字的总和。
  • main 函数返回 0,表示程序已成功运行。

时间复杂度: O(1)

辅助空间: O(1)

一个问题,多种解决方案一个算法可能有一个或多个解决方案。这意味着实现算法的方法可能不止一种。例如,在上面相加三个整数的问题中,有几种计算总和的方法。

  • + 运算符
  • 按位运算符
  • . . 等等

如何分析算法?

一个标准的算法必须是有效的才能有效。因此,必须监视算法的有效性。可能有两个阶段

  • 先验分析: "Priori" 是拉丁语,意思是 "之前"。因此,先验分析是指在使用方法之前对其进行验证。当算法以理论步骤的形式编写时,它在此进行测试。假设所有其他变量,如处理器速度,保持不变并且不影响实现,则评估算法的效率。通常,算法设计者会这样做。硬件和编译器语言的类型对我们的调查没有影响。它为程序的复杂性提供了粗略的解决方案。
  • 事后分析: "Posterior" 是拉丁语,意思是 "之后"。因此,在实现算法后对其进行检查称为事后分析。在此,通过将其付诸实践并在任何编程语言中运行来测试方法。这种分析有助于获得有关正确性(对于每个可能的输入,它是否显示或返回正确的结果)、所需空间、使用时间等的准确且真实的分析报告。换句话说,它取决于硬件和编译器语言。

如何确定算法的复杂度?

算法根据其使用的空间和时间量进行分类。因此,算法的复杂度是对其运行和产生预期结果所需时间以及保存所有数据(输入、临时数据和输出)所需的存储空间量的度量。因此,这两个因素决定了算法的有效性。

使算法复杂的两个要素是

  • 时间因子: 通过计算诸如排序算法中的比较之类的关键操作的数量来确定经过的时间。
  • 空间因子: 空间量是通过将算法运行所需的总内存空间相加来计算的。

因此,有两种算法复杂度类别

空间复杂度: 算法存储变量和产生输出所需的内存量称为其空间复杂度。这可能适用于临时活动、输入或输出。

如何确定空间复杂度?

计算以下 2 个要素以确定算法的空间复杂度

  • 固定部分: 这描述了算法绝对需要占用的区域。例如,程序大小、输出变量和输入变量。
  • 可变部分: 这描述了根据算法的应用方式而变化的区域。例如,动态内存分配、递归堆栈空间、临时变量等。

因此,任何算法的空间复杂度 S(P) P 定义为 S(P) = C + SP(I),其中 C 表示算法的固定部分,S(I) 表示其可变部分,这取决于实例特征 I。

示例: 线性搜索方法的时序复杂度确定如下

如何制定算法?

自然语言: 在这里,我们使用日常英语来传达算法。从中理解算法将过于困难。

  • 流程图: 在这种情况下,我们以图形或视觉方式描绘算法。自然语言比这更难理解。
  • 伪代码: 在这种情况下,我们将算法表示为普通英语的指导性文本和注释。这非常接近真实代码,但由于它缺少任何类似编程语言的语法,因此机器无法构建或理解它。这是传达算法的最佳技术,因为即使是编程经验很少的普通人也可以理解它。