数据结构_数据结构与算法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)
设计算法时,通常应考虑达到以下目标:
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)
相关文章推荐
- 数据结构排序算法_选择排序算法学习
- 数据结构_数据结构与算法01
- 数据结构之各种排序
- 数据结构基本知识点(三)
- [数据结构]程杰《大话数据结构》单链表代码
- 【数据结构复习】二叉树的遍历——从微软2014校园招聘说起
- 面试复习重点 算法 数据结构 【山科大牛陈磊整理】
- 数据结构之 排序
- 数据结构之 排序
- 数据结构之 最短路径2
- 数据结构之 最短路径2
- 数据结构之 最短路径
- 数据结构之 最短路径
- Java数据结构-线性表(顺序表)
- 数据结构之 最小生成树
- 数据结构之 最小生成树
- 数据结构(9)之树的补充(赫夫曼树;线索二叉树树;树与二叉树转换)
- 数据结构-线性表的初始化
- 数据结构之 图的操作
- 数据结构之 图的操作