当前位置:   article > 正文

20道与时间复杂度相关的题_时间复杂度习题

时间复杂度习题
  1. // (1)
  2. x = 90; y = 100;
  3. while(y > 0){
  4. if(x > 100){
  5. x = x - 10;
  6. y--;
  7. }else{
  8. x++;
  9. }
  10. }

(1)   语句x++每循环执行11次,y--就会执行1次。当y--执行100次时,程序运行结束。故基本操作的语句频度为11 * 100 = 1100,时间复杂度为O(1),常数阶。

  1. //2
  2. for (i = 0; i < n; i++)
  3. for (j = 0; j < m; j++)
  4. a[i][j] = 0;

(2)  外循环执行n次,内循环执行m次,基本操作a[i][j] = 0执行总数为m * n,时间复杂度为O(m * n)。

  1. //3
  2. s = 0;
  3. for(i = 0; i < n; i++)
  4. for(j = 0; j < n; j++)
  5. s += B[i][j];
  6. sum = s;

(3)  s += B[i][j]执行次数为n * n,时间复杂度为O(n * n)。

  1. //4
  2. i = 1;
  3. while(i <= n)
  4. i = i*3;

(4)  设语句频度为x,则 i * (3 ^ x) > n。因 i = 1,故 x > log3(n),时间复杂度为O(log3(n))。

  1. //5
  2. x = 2;
  3. while(x < n/2)
  4. x = x * 2;

(5)  思路同上,时间复杂度为O(log2(n))。

  1. //6
  2. x = 0;
  3. for(i = 1; i < n; i++)
  4. for (j = 1; j <= n-i; j++)
  5. x++;

(6)  外循环共执行 n-1 次,内循环依次执行 n-1,n-2...1次,语句频度为 n*(n-1)/2,时间复杂度为O(n^2)。

  1. //7
  2. x = 0;
  3. for(k = 1; k <= n; k*=2)
  4. for (j = 1; j <= n; j++)
  5. x++;

(7)  外层循环执行 log2(n) 次,内循环执行 n 次,总次数为 n*log2(n) 次。时间复杂度为O(n*log2(n))。

  1. //8
  2. int fact(int n){
  3. if(n <= 1)
  4. return 1;
  5. return n*fact(n-1);
  6. }

(8)  每次执行函数,都会递归调用一次,同时参数减一。故总时间复杂度为 O(n)。

  1. //9
  2. x = n; //n>1
  3. y = 0;
  4. while(x ≥ (y+1) * (y+1))
  5. y++;

(9)  设循环次数为 k,n 与 k 应满足 k^2 > n,即 k > n^(1/2)。时间复杂度为O(n^(1/2))。

  1. //10
  2. int func(int n){
  3. int i = 0, sum = 0;
  4. while(sum < n)
  5. sum += ++i;
  6. return i;
  7. }

(10)  设循环次数为 k,n 与 k 应满足 k*(k+1)/2 > n,即 k > (2*n)^(1/2)。时间复杂度为O((2*n)^(1/2))。

  1. //11
  2. for(int i= n-1; i > 0; i--)
  3. for (int j = 0; j < i; j++)
  4. if(A[j] > A[j+1])
  5. A[j]与A[j+1]对换;

(11)  最好情况下,程序时间复杂度为常数阶。在最坏情况下,外层循环 n-1 次,内层循环为 n-2,n-3...1,0 次,故语句频度为 (n-1)*(n-2)/2 次,时间复杂度为 O(n^2)。

  1. // (12)
  2. void fun4(int N) {
  3. int count = 0;
  4. for (int k = 0; k < 100; k++) {
  5. ++count;
  6. }
  7. printf("%d\n", count);
  8. }

(12)  ++count 频度为100,时间复杂度为 O(1),常数阶。

  1. // (13)
  2. for(int i=0;i<n;i++){
  3. System.out.println(result[i]); //执行一次
  4. }

(13)  语句频度为 n 次,时间复杂度为 O(n),线性阶。

  1. // (14)
  2. int result=1;
  3. while(result<n){
  4. result=result*2; //时间复杂度为O(1)
  5. }

(14)  时间复杂度为 O(log2n),对数阶。

  1. // (15)
  2. //二分查找法
  3. int BinarySearch(int* a, int n, int x) {
  4. assert(a);
  5. int begin = 0;
  6. int end = n - 1;
  7. while (begin < end) {
  8. int mid = ((end - begin) >> 1) + begin; //计算end与begin的中间值,右移1位相当于除以2
  9. if (a[mid] < x) {begin = mid - 1;}
  10. else if(a[mid]>x){end = mid;}
  11. else {return mid;}
  12. }
  13. return -1;
  14. }

(15)  最坏情况下,时间复杂度为 O(log2n)。

  1. // (15)
  2. void fun(int n){
  3. int i=0;
  4. while(i*i*i<=n){
  5. i++;
  6. }
  7. }

(16)  时间复杂度为 O(n^(1/3)) 

  1. // (16)
  2. // 多个复杂度组合
  3. for(int i=0;i<n;i++){
  4. for(int j=0;j<n;i++){
  5. System.out.println(result[i][j]); //执行一次
  6. }
  7. }
  8. for(int i=0;i<n;i++){
  9. System.out.println(result[i]); //执行一次
  10. }

(17)  两个循环执行次数共为 n^2 + n 次,时间复杂度为 O(n^2)。

  1. // (17)
  2. // 多个复杂度组合
  3. if(flag){
  4. for(int i=0;i<n;i++){
  5. for(int j=0;j<n;i++){
  6. System.out.println(result[i][j]); //执行一次
  7. }
  8. }
  9. }else{
  10. for(int i=0;i<n;i++){
  11. System.out.println(result[i]); //执行一次
  12. }
  13. }

(17)  两个循环时间复杂度分别为 O(n^2) 和 O(n),按最坏情况考虑,时间复杂度应为 O(n^2)。

  1. // (18)
  2. void fun(int n){
  3. int i,k;
  4. for(i=1;i<=n;i++){
  5. for(j=1;j<=n;j++){
  6. k=1;
  7. while(k<=n){
  8. k = 5*k;
  9. }
  10. }
  11. }
  12. }

(18)  for循环总次数为 n^2,while循环总次数为 log5n,时间复杂度为 O(n^2 * log5n)。

  1. // (19)
  2. //求阶乘
  3. long long Factorial(int N) {
  4. return N < 2 ? N : N * Factorial(N - 1) ;
  5. }

(19)  时间复杂度为 O(n)。

  1. // (20)
  2. int m=0, i, j;
  3. for(i=l;i<=n;i++)
  4. for(j=1;j<=2 * i;j++)
  5. m++;

(20)  m++执行次数为 n*(n+1),时间复杂度应为 O(n^2)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/968162?site
推荐阅读
相关标签
  

闽ICP备14008679号