算法意思是“在计算或其他问题解决操作中遵循的一组有限规则或指令” 或“以有限数量的步骤解决数学问题的过程,经常涉及递归操作”。
因此,算法是指解决特定问题的一系列有限步骤。
算法在各个领域发挥着至关重要的作用,并且有很多应用。使用算法的一些关键领域包括:
这些只是算法众多应用的几个例子。随着新技术和领域的出现,算法的使用不断扩大,成为现代社会的重要组成部分。
算法可以简单也可以复杂,具体取决于我们想要实现的目标。
可以用烹饪新菜谱的例子来理解。要烹饪新菜谱,人们需要阅读说明和步骤,并按照给定的顺序一一执行。这样得到的结果是新菜煮得很完美。每次使用手机、电脑、笔记本电脑或计算器时,我们都在使用算法。同样,算法有助于完成编程任务以获得预期的输出。
设计的算法与语言无关,即它们只是可以用任何语言实现的简单指令,但输出将与预期相同。
因为人们不会遵循任何书面说明来烹饪食谱,而只会遵循标准食谱。同样,并非所有书面编程指令都是算法。对于某些指令来说,它必须具有以下特征:
有多种类型的算法可用。一些重要的算法是:
这是解决问题的最简单的方法。当我们发现问题时,暴力算法是第一种发现问题的方法。
递归算法基于递归。在这种情况下,一个问题被分成几个子部分并一次又一次地调用相同的函数。
回溯算法通过在所有可能的解决方案中搜索来构建解决方案。使用该算法,我们继续按照标准构建解决方案。每当一个解决方案失败时,我们都会追溯到下一个解决方案的故障点,并继续此过程,直到找到解决方案或照顾所有可能的解决方案。
搜索算法是用于从特定数据结构中搜索元素或元素组的算法。根据其方法或应在其中找到元素的数据结构,它们可以是不同的类型。
排序就是将一组数据按照需要以特定的方式排列。帮助执行此功能的算法称为排序算法。通常,排序算法用于以递增或递减的方式对数据组进行排序。
哈希算法的工作原理与搜索算法类似。但它们包含一个带有键 ID 的索引。在散列中,密钥被分配给特定数据。
该算法将问题分解为子问题,解决单个子问题,然后合并解决方案以获得最终解决方案。它由以下三个步骤组成:
在这种类型的算法中,解决方案是逐个部分构建的。下一部分的解决方案是基于下一部分的直接利益而构建的。将选择提供最大收益的解决方案作为下一部分的解决方案。
该算法采用使用已经找到的解的概念来避免对问题的同一部分进行重复计算。它将问题分成较小的重叠子问题并解决它们。
在随机算法中,我们使用随机数,因此它可以立即带来好处。随机数有助于确定预期结果。
要编写算法,需要满足以下条件:
然后借助上述参数编写算法来解决问题。
示例: 考虑将三个数字相加并打印总和的示例。
如上所述,要编写算法,必须满足其先决条件。
现在让我们在上述先决条件的帮助下设计算法:
将 3 个数字相加并打印其总和的算法:
开始
声明 3 个整型变量 num1、num2 和 num3。
将要相加的三个数字分别作为变量 num1、num2 和 num3 的输入。
声明一个整型变量 sum 来存储 3 个数字的总和。
将 3 个数字相加并将结果存储在变量 sum 中。
打印变量 sum 的值
结束
为了测试该算法,让我们用 Javascript
语言来实现。
// Javascript程序用于添加三个数字
// 借助上述设计的算法
// 从en到zh-CN获取输入的3个数字的变量
let num1 = 0, num2 = 0, num3 = 0;
// 用于存储结果总和的变量
let sum = 0;
// 将 3 个数字作为输入
console.log("Enter the 1st number: ");
num1 = parseInt(prompt());
console.log(" " + num1 + "<br>");
console.log("Enter the 2nd number: ");
num2=parseInt(prompt());
console.log(" " + num2 + "<br>");
console.log("Enter the 3rd number: ");
num3=parseInt(prompt());
console.log(" " + num3);
// 使用 + 运算符计算总和
// 并将其存储在变量 sum 中
sum = num1 + num2 + num3;
console.log("<br>Sum of the 3 numbers is: " + sum);
输出
输入第一个数字:0
输入第二个数字:0
输入第三个数字:-1577141152
3个数字的总和是:-1577141152
这是代码的逐步算法:
console.log()
语句打印三个数字的总和。时间复杂度: O(1)
辅助空间: O(1)
一个问题,多种解决方案:一种算法的解决方案可以是也不能是多个。这意味着在实现算法时,可以有不止一种方法来实现它。例如,在上面的 3 个数字相加的问题中,可以通过多种方式计算总和:
一个好的标准算法必须是高效的。因此,必须检查和维护算法的效率。它可以分为两个阶段:
先验分析意味着在实现之前检查算法。在此,当以理论步骤的形式编写算法时对其进行检查。算法的效率是通过假设所有其他因素(例如处理器速度)恒定并且对实现没有影响来衡量的。这通常由算法设计者完成。该分析与编译器的硬件类型和语言无关。它给出了程序复杂性的近似答案。
因此,事后分析意味着在算法实现后对其进行检查。在此,通过用任何编程语言实现并执行该算法来检查该算法。此分析有助于获得有关正确性(对于每个可能的输入,是否显示/返回正确的输出)、所需空间、消耗时间等的实际分析报告。也就是说,它取决于语言编译器和所使用的硬件类型。
算法根据其消耗的空间和时间量被定义为复杂的。因此,算法的复杂性是指执行并获得预期输出所需的时间以及存储所有数据(输入、临时数据和输出)所需的空间。因此,这两个因素定义了算法的效率。
算法复杂度的两个因素分别是:
因此算法的复杂度可以分为两类:
1.空间复杂度:算法的空间复杂度是指算法存储变量和得到结果所需的内存量。这可以用于输入、临时操作或输出。
如何计算空间复杂度?
算法的空间复杂度是通过确定以下两个组成部分来计算的:
示例: 考虑以下线性搜索算法
步骤1:开始 步骤2:获取arr中数组的n个元素以及x中要查找的数字 步骤3:从arr[]最左边的元素开始,将x与arr[]的每个元素一一比较 步骤4 :如果 x 与某个元素匹配,则打印 True。 步骤 5:如果 x 与任何元素都不匹配,则打印 False。 步骤6:结束
这里,有2个变量arr[]和x,其中arr[]是n个元素的可变部分,x是固定部分。因此 S(P) = 1+n。因此,空间复杂度取决于 n(元素数量)。现在,空间取决于给定变量的数据类型和常量类型,并且空间将相应地相乘。
2. 时间复杂度: 算法的时间复杂度是指算法执行并得到结果所需的时间量。这可以用于正常操作、条件 if-else 语句、循环语句等。
时间复杂度如何计算
算法的时间复杂度也是通过确定以下两个组成部分来计算的:
示例: 在上面的线性搜索算法中,时间复杂度计算如下:
步骤 1: – 恒定时间 步骤 2: – 可变时间(采用 n 个输入) 步骤 3: – 可变时间(直到数组 (n) 的长度或找到的元素的索引) 步骤 4: – 恒定时间 步骤 5: – 恒定时间 步骤 6: – 恒定时间 因此,T(P) = 1 + n + n(1 + 1) + 1 = 2 + 3n,可以表示为 T(n)。
阅读量:774
点赞量:0
收藏量:0