写在前面的话
算法,本来就是作为一门独立的课程来学习的,所以,我没能力详细说!另外,算法真的是一门高深的学问,和数据结构一样,会让我打心底里产生一种敬佩感,这种敬佩有对“算法”和“数据结构”两个词语本身,也有对发现解决问题而研究出来的算法,数据结构和人的敬佩!真的超级厉害!
好了,废话到此结束!
算法:就是解决特定问题的求解步骤的描述;在计算机中,表现为指令的有限序列,并且每条指令表示一个或多个操作!
我的理解:算法就是如何解决某一个或某一类问题的步骤,我们在编程中自定义函数有时就是可以说是一个算法,其实算法离我们真的不远!
例如,我们现在求 1+2+3+...+99+100
这个问题;现在有以下两种思路:
1。
int i, sum = 0;
for(i = 1; i <=100; i++)
{
sum = sum + i;
}
printf("1+2+3+...+99+100=%d\n", sum);
2。
int sum = 0, n = 100;
sum = (1+n)*n/2;
printf("1+2+3+...+99+100=%d\n", sum);
以上两种计算方式就可以叫做两种算法(一种是累加,一种是通过求和公式)!
算法的特性和算法设计的要求
a. 算法的四个基本特性
1。输入和输出:可以0个输入,但必须至少有一个输出;
2。有穷性:算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每个步骤在可接受的时间内完成;
3。确定性:算法的每一步骤都具有确定的含义,不会出现二义性;
4。可行性:算法的每一步都必须可执行,也就是说每一步都可通过执行有限次数完成;
b. 算法的设计要求
1。正确性;
2。可读性;
3。健壮性;
4。时间效率高和存储量低;
大O阶方法推导 和 算法时间复杂度一些例子
a. 推导大O阶方法
1。用常数1取代运行时间中的所有加法常数;
2。在修改后的运行次数函数中,只保留最高阶项;
3。如果最高阶项存在且不是1,则去除这个项相乘的常数;
由此得到的结果就是大O阶
b. 算法时间复杂度一些例子
1。常数阶 O(1)
int sum = 0, n = 100;
sum = (1+n)*n/2;
printf("1+2+3+...+99+100=%d\n", sum);
推导:1 = O(1)
2。线性阶
int i;
for(i = 1; i <=n; i++)
{
//时间复杂度为O(1)的程序步骤序列
}
推导:1+1+1+...+1 = O(n)
3。对数阶
int count = 1;
while(count < n)
{
count = count * 2;
//时间复杂度为O(1)的程序步骤序列
}
推导:2^x = n; x = 以2为底n的对数;T(n) = O(logn)
4。平方阶
第一种:O(n^2)
int i,j;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
//时间复杂度为O(1)的程序步骤序列
}
}
推导:时间复杂度为O(n)的循环了n次,T(n) = O(n^2)
第二种:O(n*m)
int i,j;
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
{
//时间复杂度为O(1)的程序步骤序列
}
}
推导:时间复杂度为O(m)的循环了n次,T(n) = O(n*m)
所以,计算大O阶,主要还是运用高中的数列求和知识!
如下题:
int i,j;
for(i = 0; i < n; i++)
{
for(j = i; j < n; j++)
{
//时间复杂度为O(1)的程序步骤序列
}
}
推导:n+(n-1)+(n-2)+(n-3)+...+1 = ((n^2)+1)/2=O(n^2)
时间复杂度所耗费的时间从小到大一次是:
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
计算时间复杂度的公式:T(n) = O(f(n));
计算空间复杂度的公式:S(n) = O(f(n));
大家看了如果觉得有用,请点个赞,非常感谢,如果有问题,也欢迎直接评论指出,谢谢大家!