数据结构笔记02 算法

写在前面的话

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

好了,废话到此结束!


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

我的理解:算法就是如何解决某一个或某一类问题的步骤,我们在编程中自定义函数有时就是可以说是一个算法,其实算法离我们真的不远!
例如,我们现在求 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));

大家看了如果觉得有用,请点个赞,非常感谢,如果有问题,也欢迎直接评论指出,谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值