大话数据结构读书2-算法

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

    算法的五个基本特性(输入、输出、有穷性、确定性和可行性):

    1)输入输出——具有零个或多个输入,至少有一个输出。

    2)有穷性——算法在执行有限的步骤之后,自动结束而不会出现无线循环,并且每一个步骤在可接受的时间内完成。

    3)确定性——每一步骤都具有确定的含义,不会出现二义性。

    4)每一步都必须是可行的,即每一步都能够通过执行有限次数完成。

2、算法设计的要求:

(1)正确性——算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。(语法、合法输入数据满足要求的输出结果、非法输入数据满足规格说明的要求、测试数据满足要求的输出结果)

(2)可读性

(3)健壮性(输入数据不合法时,算法做出相关处理)

(4)事件效率高(执行时间)和存储量低

3、算法的效率:

    求1+2+3+......+100=?,有两个算法如下: 

int i, sum = 0, n = 100;
	for(i = 1; i <= n; i++){
	    sum = sum + i;
	}
	printf("%d",sum);



int sum = 0, n = 100;
	sum = (1 + n) * n / 2;
	printf("%d", sum);


第一段程序执行了2n+3次,第二段执行了3次,可见第二段程序的效率要远远高于第一段。

4、判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注主项的阶数。

时间复杂度:

推到大O阶方法:

    1.用常数1取代运行时间中的所有加分常数

    2.在修改后的运行次数函数中,只保留最高阶项

    3.如果最高阶项存在且不是1,则去除与这个项相乘的常数,得到的就是大O阶

(1)常数阶,O(1)

int sum = 0, n = 100;//一次
sum = (1 + n) * n / 2;//一次
printf("%d", sum);//一次

上面一共执行了3次,注意不管常数为多少,都几座O(1)

(2)线性阶,关键分析循环结构的运行情况

int i;
for(i=0;i<n;i++){
    //时间复杂度为O(1)的程序步骤序列
}
(3)对数阶

int count = 1;
while(count < 1){
    count = count * 2;
    //时间复杂度为O(1)的程序步骤序列
}
每次count乘以2之后距离n更近,2^x=n得到x=log2n,所以事件复杂度为O(logn)

(4)平方阶

int i,j;
for(i=0;i<n;i++){
    for(j=i;j<n;j++){
        //时间复杂度为O(1)的程序步骤序列
    }
}
当i=0,内循环n次;i=1,执行n-1次;……i=n-1执行1次。所以n+(n-1)+(n-2)+……+1=n^2/2+n/2,时间复杂度为O(n^2)

5、O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

6、一般在没有特殊说明的情况下,都是指最坏时间复杂度。

你可能感兴趣的:(数据结构)