什么是算法?算法基础
“算法”一词的意思是“在计算或其他解决问题的操作中要遵循的一个过程或一组规则”。因此,算法指的是一组规则/指令,它们逐步定义了如何执行工作才能获得预期的结果。
以烹饪新食谱为例可以理解。要烹饪新食谱,请先阅读说明和步骤,然后按照给定的顺序逐一执行。这样获得的结果是完美烹饪的新菜。同样,算法有助于完成编程任务以获取预期的输出。
设计的算法与语言无关,即它们只是可以用任何一种语言实现的简单指令,但是输出将与预期的一样。
算法的特点是什么?
因为不会遵循任何书面说明来烹饪食谱,而只会遵循标准的说明。类似地,并非所有用于编程的书面指令都是算法。为了使某些指令成为算法,它必须具有以下特征:
- 清晰明确:算法应清晰明确。它的每个步骤在所有方面都应该明确,并且只能导致一种含义。
- 定义明确的输入:如果算法说要接受输入,则它应该是定义明确的输入。
- 定义明确的输出:该算法必须明确定义将要产生的输出,并且也应定义明确。
- 有限度:算法必须是有限的,即它不应以无限循环或类似形式结束。
- 可行:该算法必须简单,通用且实用,以便可以根据可用资源执行该算法。它不得包含任何未来的技术或任何东西。
- 与语言无关:设计的算法必须与语言无关,即它必须只是可以用任何语言实现的简单指令,但输出将与预期的一样。
算法的优点:
- 很容易理解。
- 算法是对给定问题的解决方案的逐步表示。
- 在“算法”中,问题被分解为较小的部分或步骤,因此,程序员可以更轻松地将其转换为实际程序。
算法的缺点:
- 编写算法需要很长时间,因此很耗时。
- 分支和循环语句很难在算法中显示。
如何设计算法?
为了编写算法,需要满足以下条件:
- 这是问题由该算法来解决。
- 解决问题时必须考虑的问题约束。
- 解决问题要采取的投入。
- 解决问题时可以预期的输出。
- 在给定的约束下,此问题的解决方案。
然后在上述参数的帮助下编写算法,从而解决了该问题。
示例:考虑将三个数字相加并打印总和的示例。
- 步骤1:满足先决条件
如上所述,为了编写算法,必须满足其先决条件。- 此算法要解决的问题:将3个数字相加并打印它们的总和。
- 解决问题时必须考虑的问题约束:数字只能包含数字,不能包含其他字符。
- 解决该问题所要输入的内容:要相加的三个数字。
- 解决问题时可以预期的输出:三个数字的总和作为输入。
- 在给定的约束下,此问题的解决方案:该解决方案包括将3个数字相加。可以借助’+’运算符或按位或任何其他方法来完成。
- 步骤2:设计算法
现在,让我们在上述先决条件的帮助下设计算法:
将3个数字相加并打印其和的算法:- 开始
- 声明3个整数变量num1,num2和num3。
- 将要添加的三个数字分别作为变量num1,num2和num3的输入。
- 声明一个整数变量和,以存储3个数字的总和。
- 将3个数字相加,然后将结果存储在变量sum中。
- 打印变量总和的值
- 结尾
- 步骤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
- +运算符
- 按位运算符
- 。 。等等
- 先验分析: “ Priori”的意思是“之前”。因此,先验分析是指在算法实施之前对其进行检查。在这种情况下,当以理论步骤的形式编写算法时,将对其进行检查。通过假设所有其他因素(例如,处理器速度)是恒定的,并且对实现没有影响,来衡量算法的效率。这通常由算法设计者完成。正是在这种方法中,确定了算法复杂度。
- 后验分析: “后验”是指“之后”。因此,后验分析意味着在算法实施后对其进行检查。在这种情况下,可以通过以任何编程语言实现该算法并执行该算法来对其进行检查。该分析有助于获得有关正确性,所需空间,消耗时间等的实际和真实分析报告。
- 时间因素:时间是通过计算关键操作(例如排序算法中的比较)的次数来衡量的。
- 空间因数:空间是通过计算算法所需的最大存储空间来衡量的。
- 空间复杂度:算法的空间复杂度是指该算法执行并获得结果所需的内存量。这可以用于输入,临时操作或输出。
如何计算空间复杂度?
算法的空间复杂度是通过确定以下两个组成部分来计算的:- 固定部分:这是指算法绝对需要的空间。例如,输入变量,输出变量,程序大小等。
- 可变部分:这是指根据算法的实现可以不同的空间。例如,临时变量,动态内存分配,递归堆栈空间等。
- 时间复杂度:算法的时间复杂度是指该算法执行并获得结果所需的时间。这可以用于常规操作,条件if-else语句,循环语句等。
如何计算时间复杂度?
算法的时间复杂度还可以通过确定以下两个组成部分来计算:- 恒定时间部分:此部分仅执行一次任何指令。例如,输入,输出,if-else,开关等。
- 可变时间部分:此部分中执行了多次(例如,执行n次)的任何指令。例如,循环,递归等。