有一道数据额结构的题目不是很明白,for(i=0;i<n;i++) ,for(j=0;j<n;j++), s++。

答案是该程序的语句执次数f(n)=n+1+n(n+1)+n*n=2n*n+2n+1,时间复杂度为T(n)=O(f(n))=O(n*n)(注n*n表示n乘以n)。请问语句执行次数和时间复杂度是怎么算出来的?

首先这个程序最占用时间的3条语句是:i++,j++,s++。(本来i=0;i<n;j=0;j<n;这4条都是语句,但是估计考虑到这四条执行的时间很快,所以忽略不计了)。

接下来说上面3条语句的执行时间,你的程序等价于下面这种格式:

for(i=0;i<n;i++)
{
    for(j=0;j<n;j++)
    { 
        s++;
    }
}

这个一个双重循环,处于循环最里面的s++执行了n*n次,这个应该不难理解吧。

j++执行了n*(n+1)次:因为外层i执行了n次,j执行了n+1次。

i++执行了n+1次。


T(n)=O(f(n)) = O(2n*n+2*n+1)。但是我们说的是复杂度,复杂度的表示一般都只要把表示数据增长的性质表达出来就行了,而且是影响数据增长最主要的性质。何为数据增长的性质,比如说n,那就是线性增长;n*n,那就是平方增长,n*n*n,那就是3次方增长;log(n),那就是对数增长。以上综合,影响2n*n+2*n+1最主要的增长性质是n*n。所以复杂度就是O(n*n)。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-11-18
f(n)也就是语句执行次数是指所有语句执行的总次数,也就是for(i=0;i<n;i++)执行了n+1次
for(j=0;j<n;j++)执行了n(n+1)次,s++执行了n*n次。
O(n)出自大O算法,就是时间复杂度,也就是在最坏情况下语句执行次数,实际上就是f(n)的最高次幂,也就是2n*n+2n+1中的n*n,前面的常数无所谓

...for(i=0;i<n;i++) ,for(j=0;j<n;j++), s++。
for(i=0;i<n;i++){ for(j=0;j<n;j++) { s++; }}这个一个双重循环,处于循环最里面的s++执行了n*n次,这个应该不难理解吧。j++执行了n*(n+1)次:因为外层i执行了n次,j执行了n+1次。i++执行了n+1次。T(n)=O(f(n)) = O(2n*n+2*n+1)。但是我们...

...for(i=0;i<n;i++) ,for(j=i;j<n;j++), s++。
第二层循环从i运行到n-1 循环执行的内容是一个s自增 那么循环就是从0开始 第一次s自增n次 第2次自增n-1次 依次类推 则一直到最后s自增的执行次数即为n+(n-1)+(n-2)+...+2+1 按照等差求和公式 此式=n(n+1)\/2

有一道数据额结构的题目不是很明白,for(i=0;i<n;i++) s+=i。
for循环中循环n次 执行s+=i n次 故n+1次的i++ n次的s+=i 共2n+1次 时间复杂度是n (一般情况这个时间复杂度是n的多次幂,2n+1是n的一次幂 故时间复杂度是n 如果程序执行2n*n+1 那么时间复杂度是n*n 。如果再不懂,建议看时间复杂度的定义)记得要采纳 ...

哈夫曼编\/译码器问题:C语言版的数据结构,我急啊!那位朋友帮帮忙,结果必 ...
for(p=HT+1,i=1;i<=n;++i,++p,++character,++w){p->ch=*character;p->weight=*w;p->parent=0;p->lchild=0;p->rchild=0;}for(;i<=m;++i,++p) {p->ch=0;p->weight=0;p->parent=0;p->lchild=0;p->rchild=0;}for(i=n+1;i<=m;++i){ select(HT,i-1,&s1,&s2); HT[s1...

...for(i=0;i<N-1;i++)和for(j=i;j<N;j++)不懂,尤其是为什么j=i?_百 ...
i前面的元素都已经排好序了,还管它们干嘛,所以for(j=i;j<n;j++),是让j从i 循环到n,接着找最大的 至于你说的,当j==i时比较array[i]和array[j]没什么用,确实是,但是电脑是不计较这点浪费的,所以如果这样能让你写起来更顺手,大家一般是不会在意多浪费几次的。反正浪费的次数加...

for(i=0;i<n;i++)和for(i=0;i<n-1;i++),下面这两种有什么区别嘛,第二种...
不仅仅是少比较一个,上题中在嵌套循环结构中,第一层循环少一次,第二层循环则少一次,共少 (n-1)*2次循环。

java for循环 for(int i=0,j=0;i<10;i++){}报错,找不到符号,指向j。 f...
将临时变量j 写到大括号里面去。for(i=0;i<10;i++){int j=0;...},i 是循环控制变量,i从0到9,循环10次,每次循环进入之后,首先定一个临时变量,将变量初始化为0.

for(i=0;i=0;i++)为什么不是死循环?循环里一条语句都不能执行啊?
循环一次都不执行。因为在for(i=0;i=0;i++)中,第二个表达式i=0表示赋值,不是判断,表达式i=0的值为0,而0表示假,因此不会执行循环体的。

for(i=0;i<0;i++)如果事先得到i的值为0。这个for语句会不会执行?
这个for循环根本就不能执行。不管你事先i是什么值,for初始条件i=0都让i等于0,不满足for执行条件i<0,因此for语句不可能执行。

C语言求助,哪位大佬帮我看看这道题?一直搞不清楚
void ShowLine(int n) { int i; for(i = 0; i < n; ++i) printf("*"); printf("\\n");}void ShowData(pNode p) { printf("%-16s",p->name); printf("%-16s",p->telephone); printf("%-24s",p->email); printf("%-24s",p->address); printf("%-8d\\n",p->postcode);}void ...

相似回答