c语言版:数据结构(时间复杂度,空间复杂度,练习)

时间复杂度

概念

   时间复杂度是用来衡量算法执行时间的一个指标。它表示随着输入规模的增加,算法执行时间的增长率。时间复杂度通常用大O符号表示。

   在计算时间复杂度时,通常会忽略常数项、低阶项和系数项只关注随着输入规模增长而导致的主要影响。这是因为在实际应用中,常数项、低阶项和系数项的影响往往可以忽略不计。

常见的时间复杂度有以下几种:

  1. 常数时间复杂度(O(1)):无论输入规模的大小,算法的执行时间都是恒定的。

  2. 线性时间复杂度(O(n)):算法的执行时间与输入规模成正比。

  3. 对数时间复杂度(O(log n)):算法的执行时间与输入规模的对数成正比。

  4. 平方时间复杂度(O(n^2)):算法的执行时间与输入规模的平方成正比。

  5. 指数时间复杂度(O(2^n)):算法的执行时间与输入规模的指数成正比。

练习

// 请计算一下Func1基本操作执行了多少次?
void Func1(int N)
{
     int count = 0;
  for (int i = 0; i < N ; ++ i)
 {
    for (int j = 0; j < N ; ++ j)
   {
     ++count;
   }
 }
 for (int k = 0; k < 2 * N ; ++ k)
 {
    ++count;
 }
 int M = 10;
 while (M--)
 {
   ++count;
 }
   printf("%d\n", count);
}

答案:O(N^2)

^是平方的意思,*是乘。


// 计算Func2的时间复杂度?
void Func2(int N)
{
    int count = 0;
 for (int k = 0; k < 2 * N ; ++ k)
 {
   ++count;
 }
 int M = 10;
 while (M--)
 {
    ++count;
 }
  printf("%d\n", count);
}

答案:O(N)

忽略前面的2。


// 计算Func3的时间复杂度?
void Func3(int N, int M)
{
 int count = 0;
 for (int k = 0; k < M; ++ k)
 {
   ++count;
 }
 for (int k = 0; k < N ; ++ k)
 {
   ++count;
 }

答案:O(N+M)

未知数都可能影响结果,都需要写上去。

如果题目有给条件:N远大于M,则技术O(N)。N和M差不多大,则是O(M)或者O(N)。


// 计算Func4的时间复杂度?
void Func4(int N)
{
  int count = 0;
  for (int k = 0; k < 100; ++ k)
  {
    ++count;
  }
    printf("%d\n", count);
}

 答案:O(1)

k是常数项,有具体数值。就是O(1)。


// 计算strchr的时间复杂度?
const char * strchr ( const char * str, char character )
{
  while(*str != '\0')
 {
      if(*str == character)
          return str;
      
      ++str;
 }
  
  return NULL;
}

答案: O(N)

因为最好情况是1,最坏是N,按最坏情况计算。


// 计算BubbleSort的时间复杂度?
void BubbleSort(int* a, int n)
{
 assert(a);
 for (size_t end = n; end > 0; --end)
 {
     int exchange = 0;
     for (size_t i = 1; i < end; ++i)
     {
       if (a[i-1] > a[i])
       {
         Swap(&a[i-1], &a[i]);
          exchange = 1;
       }
     }
 if (exchange == 0)
 break;
 }
}

答案: O(N^2)

冒泡排序:

第一次:N

第二次:N-1

第三次:N-2

第N次:1

实际上,这是一个等差数列,运用数学公式就是(N+1)*N/2。忽略+ /,就是O(N^2)。


// 计算BinarySearch的时间复杂度?
int BinarySearch(int* a, int n, int x)
{
  assert(a);
  int begin = 0;
  int end = n;
  while (begin < end)
 {
  int mid = begin + ((end-begin)>>1);
  if (a[mid] < x)
    begin = mid+1;
  else if (a[mid] > x)
  end = mid;
  else
    return mid;
 }
 return -1;
}

 答案:O(log2N),这里格式不支持,是log2的n次方。


// 计算阶乘递归Factorial的时间复杂度?
long long Factorial(size_t N)
{
 return N < 2 ? N : Factorial(N-1)*N;
}

答案:O(N)

函数调用了N次。


空间复杂度

概念

空间复杂度是指算法在执行过程中所需的额外空间的量度。它衡量的是算法所使用的内存空间的数量和大小,包括程序代码本身所占用的空间、输入数据所占用的空间以及算法执行过程中所使用的辅助空间。

空间复杂度的计算通常是根据算法所使用的额外空间的最大值来进行评估。它可以用大O符号(O)来表示,类似于时间复杂度。

常见的空间复杂度有以下几种:

  1. O(1) - 常数空间复杂度: 算法所使用的额外空间是固定的,与输入规模无关。常数空间复杂度的算法通常只使用固定数量的变量或常量大小的数据结构。

  2. O(n) - 线性空间复杂度: 算法所使用的额外空间与输入规模成线性关系。例如,使用一个数组来存储输入数据。

  3. O(n^2) - 平方空间复杂度: 算法所使用的额外空间与输入规模的平方成正比。例如,使用一个二维数组来存储输入数据。

  4. O(log n) - 对数空间复杂度: 算法所使用的额外空间与输入规模的对数成正比。例如,使用递归调用栈所占用的空间。

  5. O(nlog n) - 线性对数空间复杂度: 算法所使用的额外空间与输入规模的对数乘以线性关系。例如,使用归并排序等分治算法时所占用的空间。

     在进行空间复杂度分析时,通常会忽略常数因子和低阶项,只关注随着输入规模增长而增长的部分。

练习

// 计算BubbleSort的空间复杂度?
void BubbleSort(int* a, int n)
{
 assert(a);
 for (size_t end = n; end > 0; --end)
 {
 int exchange = 0;
 for (size_t i = 1; i < end; ++i)
 {
 if (a[i-1] > a[i])
 {
 Swap(&a[i-1], &a[i]);
 exchange = 1;
 }
 }
 if (exchange == 0)
 break;
 }
}

答案:O(1)

时间是累积的,空间是不累积的(用完就丢)。


// 计算Fibonacci的空间复杂度?
long long* Fibonacci(size_t n)
{
     if(n==0)
          return NULL;
     long long * fibArray = (long long *)malloc((n+1) * sizeof(long long));
     fibArray[0] = 0;
     fibArray[1] = 1;
     for (int i = 2; i <= n ; ++i)
     {
           fibArray[i ] = fibArray[ i - 1] + fibArray [i - 2];
     }
     return fibArray ;
}

答案:O(N)

malloc了一个n+1大小的空间,就是N,如果是常数,就是O(1)。


// 计算阶乘递归Factorial的空间复杂度?
long long Factorial(size_t N)
{
   return N < 2 ? N : Factorial(N-1)*N;
}

答案:O(N),

最多的时候,开辟了N个栈帧。

  • 28
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 首先,数据结构是计算机科学中一种非常重要的学科,在程序设计中占有重要地位。其目的是为了设计、实现和应用数据结构算法。 在学习数据结构时,C语言是一种非常重要的编程语言。数据结构C语言专升本习题,涵盖了数据结构中基本的数据类型、简单的数据结构算法基础等内容。 学习数据结构C语言专升本习题,需要掌握C语言中的基础知识,如数组、指针、结构体等。这些知识对于理解数据结构算法的原理和实现方式非常重要。 此外,在学习数据结构C语言专升本习题时,还需要注意掌握常见的数据结构,如栈、队列、链表和树等。同时还需要学习和掌握算法分析的基本方法和技巧。 最后,在学习数据结构C语言专升本习题时,需要多动手实践,通过编写程序来加深对数据结构算法的理解和掌握。只有通过不断地实践和练习,才能真正学好数据结构算法,并提高自己的编程能力。 ### 回答2: 数据结构是计算机科学的基础课程之一。它主要研究不同数据的组织、存储和管理方法,以及对这些数据进行操作的算法和技术。 C语言是一种通用的、高级的编程语言,与数据结构紧密相关。在数据结构c语言专升本习题中,学习者需要掌握基本的数据结构算法,并利用C语言来实现和优化它们。 习题通常包括对不同的数据结构(如数组、链表、树等)进行操作的编程题目,以及针对常见算法(如排序算法、查找算法等)的实现练习。通过做这些习题,学习者可以加深对数据结构算法的理解,并提高编程技能。 在解决习题时,学习者需要注意算法的效率和空间复杂度,避免出现时间和空间浪费的情况。同时,要注意代码的风格和规范,编写高质量、易读、易维护的代码。 总之,数据结构c语言专升本习题对于提高计算机科学专业的技能和能力非常重要。学习者应该认真掌握这些习题,并理解其中的原理和思想,以便在以后的实际工作中得心应手。 ### 回答3: 数据结构是计算机科学中一个非常重要的领域,它主要研究数据组织、存储和管理的方法,是计算机软件设计必不可少的基础。 C语言是一种广泛使用的高级编程语言,出色的性能和灵活的特性使它成为许多软件开发人员和系统程序员的首选语言。 对于专升本考试来说,掌握数据结构C语言是非常必要的。数据结构c语言习题可以帮助我们深入理解数据结构C语言的使用。 在数据结构c语言习题中,我们可以学习到常见的数据结构,例如线性结构、树结构和图结构等等。同时,还可以学习到如何用C语言实现这些数据结构的操作和算法。 通过解决数据结构c语言习题,我们可以提高自己的编程能力,为日后的软件开发和系统设计积累宝贵经验。同时,还可以为我们的专升本考试打下坚实的基础,提高自己的考试成绩。 总之,数据结构c语言习题对于我们的学习和职业发展都非常重要,希望大家能够认真对待这一领域,不断提升自己的编程技巧和算法思维。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蓝lanll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值