您的位置:首页 > 理论基础 > 数据结构算法

数据结构笔记02 算法

2018-02-02 22:39 351 查看
写在前面的话

算法,本来就是作为一门独立的课程来学习的,所以,我没能力详细说!另外,算法真的是一门高深的学问,和数据结构一样,会让我打心底里产生一种敬佩感,这种敬佩有对“算法”和“数据结构”两个词语本身,也有对发现解决问题而研究出来的算法,数据结构和人的敬佩!真的超级厉害!

好了,废话到此结束!

算法:就是解决特定问题的求解步骤的描述;在计算机中,表现为指令的有限序列,并且每条指令表示一个或多个操作!

我的理解:算法就是如何解决某一个或某一类问题的步骤,我们在编程中自定义函数有时就是可以说是一个算法,其实算法离我们真的不远!

例如,我们现在求
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));

大家看了如果觉得有用,请点个赞,非常感谢,如果有问题,也欢迎直接评论指出,谢谢大家!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: