时间复杂度的计算

简介: 时间复杂度(就是一个函数)的计算,在算法中的基本操作的执行次数。就是算法的时间复杂度。

1

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);
}

Func1执行的基本操作次数:F(N)=N^2+2*N+10。Func1的时间复杂度就是O(N^2).

2

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);
}

Func2的时间复杂度是O(N).

3

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);
}

Func3的时间复杂度是:O(M+N).

4

void Func4(int N)
{
  int count = 0;
  for (int k = 0; k < 100; k++)
  {
    count++;
  }
  printf("%d\n", count);
}

对于这种运行次数可以确定为常数次的时间复杂度就是O(1)

5

const char* strchr(const char* str, int character)
{
  while (*str)
  {
    if (*str == character)
    {
      return str;
    }
    str++;
  }
}

最好情况:1次找到。
最坏情况:N次找到。
平均情况:N/2次找到。

由于在实际算法种关注的是算法最坏情况的运行情况,所以说数组中搜索数据时间复杂度为O(N)

6

、int BinarySearch(int* a, int n, int x)
{
  assert(a);
  int begin = 0;
  int end = n - 1;
  while (begin <= end)
  {
    int mid = begin + ((end - begin) >> 1);
    if (a[mid] > x)
    {
      end = mid - 1;
    }
    else if (a[mid] < x)
    {
      begin = mid + 1;
    }
    else
    {
      return mid;
    }
  }
  return -1;
}

二分查找就是用来查找你要查找的数据的,如果找到了,就返回所要查找数据的下标。

先来看一下最好情况:O(1),即查找一次就找到了。


看一下最坏情况:log以2为底,N的对数。

8.png

最好情况是1次很好理解,即把数据折半一次就找到了。

我们来看一下最坏的情况:我们首先要知道,查找一次,数据就要折半一次,查找一次,数据就要折半一次;所以当你一直查找,即一直折半直到折半到只有一个数据的时候,此时要么找到了,要么就没找到(没找到就是这些数据中根本就没有你所要查找的数据)。

比如:假设N是数组中元素的个数,x表示最坏情况的查找次数。查找一次就折半一次,即N/2,查找第二次:N/2/2;查找第三次:N/2/2/2,所以你要查找几次就需要除以几个2,直到最后查找到最后数组中只剩下一个元素的时候,即N/2/2/2/2……/2(除以x个2)=1;

把该式子整理一下就变成了这样:2^x=N,x=log以2为底N的对数。即:

9.png

7

//计算阶乘递归Fac的时间复杂度
long long Fac(size_t N)
{
  if (N == 0)
  {
    return 1;//0!=1
  }
  else
  {
    return Fac(N - 1) * N;
  }
}

时间复杂度是O(N),准确来说是O(N+1),只不过那个1忽略不计了。

10.png

8

//计算斐波那契数列Fib的时间复杂度
long long Fib(size_t N)
{
  if (N < 3)
  {
    return 1;
  }
  return Fib(N - 1) + Fib(N - 2);
}

11.png

但是这个算法很慢,当N是50的时候就要运行很长时间才行。

12.png

13.png


9

void BubbleSort(int* a, int n)
{
  assert(a);
  int i = 0;
  for (i = 0; i < n-1; i++)
  {
    int j = 0;
    int count = 0;
    for (j = 0; j < n - 1 - i; j++)
    {
      if (a[j] > a[j + 1])
      {
        int tmp = a[j];
        a[j] = a[j + 1];
        a[j + 1] = tmp;
        count = 1;
      }
    }
    if (count == 0)
    {
      break;
    }
  }
}

最好情况就是冒泡排序的第一趟就好了即O(N)

最坏情况:O(N^2)

14.png

好了,以上就是一些时间复杂度的一些计算,就到这里吧各位。

再见啦!!!

目录
相关文章
|
4天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
300 116
|
19天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
7天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
480 44
Meta SAM3开源:让图像分割,听懂你的话
|
14天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
692 222
|
2天前
|
Windows
dll错误修复 ,可指定下载dll,regsvr32等
dll错误修复 ,可指定下载dll,regsvr32等
135 95
|
12天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1697 158
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
945 62