求解时间复杂度void Table(int k,int n,int**a)// 数组下标从1开始 { for (int i = 1;i <= n;i++) // 第一行排1-n a[1][i] = i; int m=1;// 用来控制每一次填表时i行j列的起始填充位置 for(int s=1;s<=k;s++) // k指分成k大部分进行填充日程表;s指第几大部分 { n/2; for(int t=1;t<=n;t++) // 第s部分内的循环 { for(int i=m+1;i<=2m;i++)//行 { for(int j=m+1;j<=2m;j++)//列 { a[i][j+(t-1)m*2]=a[i-m][j+(t-1)m*2-m]; //左上角等于右下角的值 a[i][j+(t-1)m*2-m]=a[i-m][j+(t-1)m*2]; //左下角等于右上角的值 } } } m*=2; } }
时间: 2023-05-26 22:04:16 浏览: 79
时间复杂度为O(knlogn)。
分析:
在循环内嵌套了3个for循环,其中i和j的循环次数都是2m,t的循环次数是n/2,s的循环次数是k。所以总的时间复杂度为O(k * n/2 * 2m * 2m)。
m的值在每一次循环中都会乘以2,所以m的最大值为n/2,即循环次数为log2(n)次。所以总的时间复杂度为O(k * n/2 * 2^2log2(n))=O(knlogn)。
阅读全文