📜  算法导论

📅  最后修改于: 2021-04-24 18:06:54             🧑  作者: Mango

什么是算法?算法基础

算法”一词的意思是“在计算或其他解决问题的操作中要遵循的一个过程或一组规则”。因此,算法指的是一组规则/指令,它们逐步定义了如何执行工作才能获得预期的结果。

以烹饪新食谱为例可以理解。要烹饪新食谱,请先阅读说明和步骤,然后按照给定的顺序逐一执行。这样获得的结果是完美烹饪的新菜。同样,算法有助于完成编程任务以获取预期的输出。
设计的算法与语言无关,即它们只是可以用任何一种语言实现的简单指令,但是输出将与预期的一样。

算法的特点是什么?

因为不会遵循任何书面说明来烹饪食谱,而只会遵循标准的说明。类似地,并非所有用于编程的书面指令都是算法。为了使某些指令成为算法,它必须具有以下特征:

  • 清晰明确:算法应清晰明确。它的每个步骤在所有方面都应该明确,并且只能导致一种含义。
  • 定义明确的输入:如果算法说要接受输入,则它应该是定义明确的输入。
  • 定义明确的输出:该算法必须明确定义将要产生的输出,并且也应定义明确。
  • 有限度:算法必须是有限的,即它不应以无限循环或类似形式结束。
  • 可行:该算法必须简单,通用且实用,以便可以根据可用资源执行该算法。它不得包含任何未来的技术或任何东西。
  • 与语言无关设计的算法必须与语言无关,即它必须只是可以用任何语言实现的简单指令,但输出将与预期的一样。

算法的优点:

  • 很容易理解。
  • 算法是对给定问题的解决方案的逐步表示。
  • 在“算法”中,问题被分解为较小的部分或步骤,因此,程序员可以更轻松地将其转换为实际程序。

算法的缺点:

  • 编写算法需要很长时间,因此很耗时。
  • 分支和循环语句很难在算法中显示。

如何设计算法?

为了编写算法,需要满足以下条件:

  1. 这是问题由该算法来解决。
  2. 解决问题时必须考虑的问题约束
  3. 解决问题要采取的投入
  4. 解决问题时可以预期的输出
  5. 在给定的约束下,此问题的解决方案

然后在上述参数的帮助下编写算法,从而解决了该问题。
示例:考虑将三个数字相加并打印总和的示例。

  • 步骤1:满足先决条件
    如上所述,为了编写算法,必须满足其先决条件。
    1. 此算法要解决的问题:将3个数字相加并打印它们的总和。
    2. 解决问题时必须考虑的问题约束:数字只能包含数字,不能包含其他字符。
    3. 解决该问题所要输入的内容:要相加的三个数字。
    4. 解决问题时可以预期的输出:三个数字的总和作为输入。
    5. 在给定的约束下,此问题的解决方案该解决方案包括将3个数字相加。可以借助’+’运算符或按位或任何其他方法来完成。
  • 步骤2:设计算法
    现在,让我们在上述先决条件的帮助下设计算法:
    将3个数字相加并打印其和的算法:
    1. 开始
    2. 声明3个整数变量num1,num2和num3。
    3. 将要添加的三个数字分别作为变量num1,num2和num3的输入。
    4. 声明一个整数变量和,以存储3个数字的总和。
    5. 将3个数字相加,然后将结果存储在变量sum中。
    6. 打印变量总和的值
    7. 结尾
  • 步骤3:通过实施对算法进行测试。
    为了测试该算法,让我们用C语言实现它。

程序:

C++
// C++ program to add three numbers
// with the help of above designed
// algorithm
#include 
using namespace std;
  
int main()
{
     
    // Variables to take the input of
    // the 3 numbers
    int num1, num2, num3;
  
    // Variable to store the resultant sum
    int sum;
  
    // Take the 3 numbers as input
    cout << "Enter the 1st number: ";
    cin >> num1;
    cout << " " << num1 << endl;
  
    cout << "Enter the 2nd number: ";
    cin >> num2;
    cout << " " << num2 << endl;
  
    cout << "Enter the 3rd number: ";
    cin >> num3;
    cout << " " << num3;
  
    // Calculate the sum using + operator
    // and store it in variable sum
    sum = num1 + num2 + num3;
  
    // Print the sum
    cout << "\nSum of the 3 numbers is: "
         << sum;
  
    return 0;
}
 
// This code is contributed by shivanisinghss2110


C
// C program to add three numbers
// with the help of above designed algorithm
 
#include 
 
int main()
{
 
    // Variables to take the input of the 3 numbers
    int num1, num2, num3;
 
    // Variable to store the resultant sum
    int sum;
 
    // Take the 3 numbers as input
    printf("Enter the 1st number: ");
    scanf("%d", &num1);
    printf("%d\n", num1);
 
    printf("Enter the 2nd number: ");
    scanf("%d", &num2);
    printf("%d\n", num2);
 
    printf("Enter the 3rd number: ");
    scanf("%d", &num3);
    printf("%d\n", num3);
 
    // Calculate the sum using + operator
    // and store it in variable sum
    sum = num1 + num2 + num3;
 
    // Print the sum
    printf("\nSum of the 3 numbers is: %d", sum);
 
    return 0;
}


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

Sum of the 3 numbers is: -1577141152
  • +运算符
  • 按位运算符
  • 。 。等等
  1. 先验分析: “ Priori”的意思是“之前”。因此,先验分析是指在算法实施之前对其进行检查。在这种情况下,当以理论步骤的形式编写算法时,将对其进行检查。通过假设所有其他因素(例如,处理器速度)是恒定的,并且对实现没有影响,来衡量算法的效率。这通常由算法设计者完成。正是在这种方法中,确定了算法复杂度。
  2. 后验分析: “后验”是指“之后”。因此,后验分析意味着在算法实施后对其进行检查。在这种情况下,可以通过以任何编程语言实现该算法并执行该算法来对其进行检查。该分析有助于获得有关正确性,所需空间,消耗时间等的实际和真实分析报告。
  • 时间因素:时间是通过计算关键操作(例如排序算法中的比较)的次数来衡量的。
  • 空间因数:空间是通过计算算法所需的最大存储空间来衡量的。
  1. 空间复杂度:算法的空间复杂度是指该算法执行并获得结果所需的内存量。这可以用于输入,临时操作或输出。
    如何计算空间复杂度?
    算法的空间复杂度是通过确定以下两个组成部分来计算的:
    • 固定部分:这是指算法绝对需要的空间。例如,输入变量,输出变量,程序大小等。
    • 可变部分:这是指根据算法的实现可以不同的空间。例如,临时变量,动态内存分配,递归堆栈空间等。
  2. 时间复杂度:算法的时间复杂度是指该算法执行并获得结果所需的时间。这可以用于常规操作,条件if-else语句,循环语句等。
    如何计算时间复杂度?
    算法的时间复杂度还可以通过确定以下两个组成部分来计算:
    • 恒定时间部分:此部分仅执行一次任何指令。例如,输入,输出,if-else,开关等。
    • 可变时间部分:此部分中执行了多次(例如,执行n次)的任何指令。例如,循环,递归等。