程序分析:最好,最坏和平均操作计数

对于分析一个程序的性能,其中分析操作计数是一个关键的点,下面做一些简单的介绍:

对于顺序查找来说,代码如下:

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;


用操作计数方法来估算时间复杂度时,都是针对选定的操作,而忽略了其他的操作,其实在步数的方法中,将对程序和函数的所有操作部分都进行统计,与操作计数一样步数也是实例特征的函数。任何一个实例都是包含有某些个特征,但是我们选择的特征都是我们所感兴趣的特征,例如:当我们想计算程序的运行时间是如何随着输入个数的增加而增加,那么就把步数看成输入个数的函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值