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

数据结构_数据结构与算法02

2013-10-02 03:10 330 查看
1》算法设计的原则

设计算法时,通常应考虑达到以下目标:

1,正确性、2,可读性、3,健壮性、4,高效率与低存储量需求

1,正确性:规格说明

四个层次:

a,程序中不含语法错误;

b,程序对于几组输入数据能够得出满足要求的结果;

c,程序对精心选择的、典型、苛刻切带有刁难性的几组输入数据能够得出满足要求的结果;

d,程序对于一切合法的输入数据都能得出满足要求的结果;

之所以软件要求维护:d条件是很难满足的。是个趋势

2,可读性:方便人的理解; 难度的程序隐藏错误较多,错误也难以调试。

3,健壮性:当输入的数据非法时,算法应当恰当地作出反映或进行相应处理,而不是产生莫名其妙的输出结果。

4,高效率与低存储量需求:算法执行时间,存储空间大小

和算法执行时间相关的因素:

1,算法选用的策略

2,问题的规模

3,编写程序的语言

4,编译程序产生的机器代码的质量

5,计算机执行指令的速度

随着问题规模n的增长,算法执行时间的增长率和f(n)的增长率相同,则可以记作:

T(n)=O(f(n));

称T(n)为算法的时间复杂度.

算法=控制结构+原操作(固有数据类型的操作)

算法的执行时间=原操作(i)的执行次数*原操作(i)的执行时间。

算法的执行时间与原操作执行次数之和成比例。

for(){n次

for(){n次

for(){n次

}

}

}

时间复杂度:O(n*n*n)

我们在看看选择排序:

例子二:

void select_sort(int a[] ,int n){

//将a中整数序列重新排列成从小至大有序的整数序列

for(i=0;i<n-1;++i){

j=i;

for(k=i+1;k<n;++k){

if(a[k]<a[j]){j=k;}

}

if(j != i){ a[j] <--> a[i] }

}

}//select_sort

基本操作:比较操作

语句频度作为算法的时间复杂度。

这个算法的效率与输入的数据无关。-----》即使输入的数据是有序的,这双重for循环的次数无关。

例子三:

void bubble_sort(int a[] ,int n){

//将a中整数序列重新排列成自小至大

//有序的整数序列。

for(i=n-1;change=TRUE;i>1&&change;--i){

change=FALSE;

for(j=0;j<i;++j){

if(a[j]>a[j+1]){a[j] <--> a[j+1] ; change = TRUE; }

}

}

}//bubble_sort 气泡排序

开始气泡数据:5 7 4 2 8 3

5 5 4 2 2

7 4 2 4 3

4 2 5 3 4

2 7 3 5 5

8 3 7 7 7

3 8 8 8 8

最好情况 外循环只需执行一次,最坏的情况O(n*n)

平均的时间复杂度: O(n*n)

四、算法的存储空间需求

算法的空间复杂度

S(n)=O(g(n))

算法的存储量包括:

1、输入数据所占空间;

2、程序本身所占空间;//可以不考虑

3、辅助变量所占空间;

选择排序与气泡排序中:

输入数据所占的空间是相同的;那么只需考虑辅助变量所占空间。

学习要点:

理解算法要素的确切含义。

掌握计算语句频度和估算算法时间复杂度的方法。

n*n 与 50*log2(n) 运用高中学习的知识点:观察它们的二维 曲线

当n趋向于无穷大时 当然是50*log2(n)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: