程序分析:最好,最坏和平均操作计数
2017-03-21 20:29
344 查看
对于分析一个程序的性能,其中分析操作计数是一个关键的点,下面做一些简单的介绍:
对于顺序查找来说,代码如下:
int sequentIndexSearch(T a[], int n,const T& x)
{
//在数组a[]中查找元素x,如果找到返回返回该元素的位置,否则返回-1
int i;
for (i = 0; i < n&&a[i] != x;i++)
if (i == n)
return -1;
else
return i;
}确定x和数组之间的比较次数,把n作为实例特征,但是比较次数也取决于x的值,假设n=100,x=a[0];那么就需要一次比较,容易得知最多需要100次比较;
为了计算平均比较次数,假设每个元素被查找的概率都相同为1/n,这是查找成功的平均比较次数如下(加权平均):
1/n+2/n+.......n/n+(n+1)/2
对于有序数组中插入元素的分析,代码如下:
template <class T>
void Insert(T a[],const T& x)
{
//假设a[]为递增数组
int i;
for (i = n - 1; i >= 0 && x < a[i]; i--)
a[i + 1] = a[i];
a[i+1] = x;
n++;//数组长度多1
}
确定x与数组方素的比较次数,容易得知元素x的插入位置为n+1个,最少的比较次数是1,最多的比较次数是n,,为了估算平均计数假设插入任一位置上的概率相等为1/(n+1);
如果x插入的位置是a[i+1],则x需要比较n-i次,如果每一个位置都有元素插入;
则总的比较次数是1+2+.......+n+n,这里需要注意为什么加了两次n,因为元素插入的位置有可能为n+1个,但是比较n次是最大的,有两个位置都可能比较n次(a[0]的左右侧)
所以平均比较次数是(总比较数/(n+1))=n/2 + n/(n+1);
当n比较大时,容易得知平均比较次数比最坏情况下的比较次数的一半大1;
用操作计数方法来估算时间复杂度时,都是针对选定的操作,而忽略了其他的操作,其实在步数的方法中,将对程序和函数的所有操作部分都进行统计,与操作计数一样步数也是实例特征的函数。任何一个实例都是包含有某些个特征,但是我们选择的特征都是我们所感兴趣的特征,例如:当我们想计算程序的运行时间是如何随着输入个数的增加而增加,那么就把步数看成输入个数的函数。
对于顺序查找来说,代码如下:
int sequentIndexSearch(T a[], int n,const T& x)
{
//在数组a[]中查找元素x,如果找到返回返回该元素的位置,否则返回-1
int i;
for (i = 0; i < n&&a[i] != x;i++)
if (i == n)
return -1;
else
return i;
}确定x和数组之间的比较次数,把n作为实例特征,但是比较次数也取决于x的值,假设n=100,x=a[0];那么就需要一次比较,容易得知最多需要100次比较;
为了计算平均比较次数,假设每个元素被查找的概率都相同为1/n,这是查找成功的平均比较次数如下(加权平均):
1/n+2/n+.......n/n+(n+1)/2
对于有序数组中插入元素的分析,代码如下:
template <class T>
void Insert(T a[],const T& x)
{
//假设a[]为递增数组
int i;
for (i = n - 1; i >= 0 && x < a[i]; i--)
a[i + 1] = a[i];
a[i+1] = x;
n++;//数组长度多1
}
确定x与数组方素的比较次数,容易得知元素x的插入位置为n+1个,最少的比较次数是1,最多的比较次数是n,,为了估算平均计数假设插入任一位置上的概率相等为1/(n+1);
如果x插入的位置是a[i+1],则x需要比较n-i次,如果每一个位置都有元素插入;
则总的比较次数是1+2+.......+n+n,这里需要注意为什么加了两次n,因为元素插入的位置有可能为n+1个,但是比较n次是最大的,有两个位置都可能比较n次(a[0]的左右侧)
所以平均比较次数是(总比较数/(n+1))=n/2 + n/(n+1);
当n比较大时,容易得知平均比较次数比最坏情况下的比较次数的一半大1;
用操作计数方法来估算时间复杂度时,都是针对选定的操作,而忽略了其他的操作,其实在步数的方法中,将对程序和函数的所有操作部分都进行统计,与操作计数一样步数也是实例特征的函数。任何一个实例都是包含有某些个特征,但是我们选择的特征都是我们所感兴趣的特征,例如:当我们想计算程序的运行时间是如何随着输入个数的增加而增加,那么就把步数看成输入个数的函数。
相关文章推荐
- ACM算法-时间复杂度分析(2.最坏,平均,最好时间复杂度分析)
- 最好最坏和平均情况下的性能分析
- 快速排序最好,最坏,平均复杂度分析
- 快速排序最好,最坏,平均复杂度分析
- Hadoop:第二个程序操作HDFS -> 【获取Datanode名】【写文件】【WordCount计数】
- 数据结构:程序加图示分析单链表的插入和删除操作
- 第015课 NOR Flash操作原理及裸机程序分析
- 最好的程序界面就是用户无需去阅读操作手册就知道该如何使用的界面
- 关于ETL 数据分析 停止程序的操作
- 各排序算法最好最坏平均情况下的时间复杂度
- (超强分析单人操作主机)程序中线性表存储数据
- 【Storm】storm安装、配置、使用以及Storm单词计数程序的实例分析
- 算法分析中,为什么分析最坏情况而不是平均情况
- 实验 5.2.8-3 对文件的任意部分加锁 1. 用 fcntl()对文件进行锁操作。 2. 完善课件中的示例程序,给出程序运行结果及分析。 给b.txt中的前10个字节加写锁
- 数据分析系统DIY2/3:本地64位WIN7+DEV C++编译程序操作VMware CentOS7+MariaDB
- 常见排序的最好,平均以及最坏时间复杂度
- 第016课 Nand Flash操作原理及裸机程序分析
- 与微信做对接实现程序分析操作
- 【Storm】storm安装、配置、使用以及Storm单词计数程序的实例分析
- 20110327-8.3-warning-如果程序崩溃了,则不会刷新缓冲区,最好的方法是保证所有的输出操作都显式地调用了flush或endl