您的位置:首页 > 编程语言 > C语言/C++

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

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;

用操作计数方法来估算时间复杂度时,都是针对选定的操作,而忽略了其他的操作,其实在步数的方法中,将对程序和函数的所有操作部分都进行统计,与操作计数一样步数也是实例特征的函数。任何一个实例都是包含有某些个特征,但是我们选择的特征都是我们所感兴趣的特征,例如:当我们想计算程序的运行时间是如何随着输入个数的增加而增加,那么就把步数看成输入个数的函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐