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

这篇具有很好参考价值的文章主要介绍了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次。

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


空间复杂度

概念

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

空间复杂度的计算通常是根据算法所使用的额外空间的最大值来进行评估。它可以用大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个栈帧。文章来源地址https://www.toymoban.com/news/detail-813022.html

到了这里,关于c语言版:数据结构(时间复杂度,空间复杂度,练习)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构之时间复杂度-空间复杂度

    大家好,我是深鱼~ 目录 1.数据结构前言 1.1什么是数据结构 1.2什么是算法 1.3数据结构和算法的重要性 1.4如何学好数据结构和算法 2.算法的效率 3.时间复杂度 3.1时间复杂度的概念 3.2大O的渐进表示法 【实例1】:双重循环的时间复杂度:O(N) 【实例2】:双重循环的时间复杂度

    2024年02月14日
    浏览(42)
  • 【数据结构】时间复杂度与空间复杂度

    在学习C语言的时候,大多数的小伙伴们并不会对算法的效率了解,也许算法也是一个陌生的领域,当进入了数据结构这个模块,就应该对算法的效率做一个清晰的认识。但是算法的效率是什么呢?这里就引出来时间复杂度与空间复杂度的概念了。 算法效率 指的是算法解决问

    2024年02月07日
    浏览(44)
  • 数据结构--时间复杂度与空间复杂度

    在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有程序在机器上跑起来,才能知道,但是如果所有的算法都需要在机器上运行起来去测试时间复杂度就会很麻烦,所以才有了时

    2024年02月16日
    浏览(43)
  • 【数据结构】---时间复杂度与空间复杂度

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 · 时间复杂度的定义

    2024年02月15日
    浏览(53)
  • 数据结构——时间复杂度和空间复杂度

    1.算法效率 2.时间复杂度 3.空间复杂度 4. 常见时间复杂度以及复杂度oj练习 1.算法效率 1.1 如何衡量一个算法的好坏 如何衡量一个算法的好坏呢?比如对于以下斐波那契数的计算 我们看到虽然用递归的方式实现斐波那契很简单,但是简单一定代表效率高吗? 我们接着往下看。

    2024年02月13日
    浏览(49)
  • 数据结构入门 — 时间复杂度、空间复杂度

    数据结构_空间复杂度_时间复杂度讲解_常见复杂度对比 本文介绍数据结构中的时间复杂度和空间复杂度 ***文章末尾,博主进行了概要总结,可以直接看总结部分*** 博主博客链接:https://blog.csdn.net/m0_74014525 点点关注,后期持续更新系列文章 算法效率指的是算法在处理数据时

    2024年02月13日
    浏览(54)
  • 数据结构——时间复杂度与空间复杂度

    目录 一.什么是空间复杂度与时间复杂度 1.1算法效率 1.2时间复杂度的概念 1.3空间复杂度的概念 二.如何计算常见算法的时间复杂度 2.1大O的渐近表示法  使用规则 三.如何计算常见算法的空间复杂度 3.1 大O渐近表示法 3.2 面试题——消失的数字  3.3 面试题——旋转数组 分为两

    2024年02月07日
    浏览(46)
  • 数据结构:时间复杂度和空间复杂度计算

    算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度, 而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主 要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小

    2024年02月11日
    浏览(42)
  • 数据结构之时间复杂度与空间复杂度

    目录 1.算法效率 1.2算法的复杂度 1.3复杂度对于校招的重要性 ​编辑2.时间复杂度 空间复杂度: 1.1 如何衡量一个算法的好坏? 比方说我们非常熟悉的斐波拉契数列: 递归实现方式非常简洁,但一定好吗?如何衡量其好与坏? 定义: 算法在编写成可执行程序后,运行时需要

    2024年02月05日
    浏览(54)
  • 数据结构:算法(特性,时间复杂度,空间复杂度)

    算法(Algorithm)是对 特定问题求解步骤 的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。 一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成。 算法必须是有穷的,而程序可以是无穷的 算法中每条指令必须有确切的含义,对于

    2024年02月06日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包