时间复杂度的计算

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

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

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

再见啦!!!

目录
相关文章
|
存储 算法 搜索推荐
【算法基础】时间复杂度和空间复杂度
【算法基础】时间复杂度和空间复杂度
200 0
|
2月前
|
搜索推荐 算法
插入排序算法的平均时间复杂度解析
【10月更文挑战第12天】 插入排序是一种简单直观的排序算法,通过不断将未排序元素插入到已排序部分的合适位置来完成排序。其平均时间复杂度为$O(n^2)$,适用于小规模或部分有序的数据。尽管效率不高,但在特定场景下仍具优势。
|
7月前
|
算法
说说你对算法中时间复杂度,空间复杂度的理解?如何计算?
该文介绍了算法的基本概念,强调了时间和空间复杂度在衡量算法效率中的重要性。时间复杂度表示算法执行时间与输入规模的增长关系,常用大O符号表示,如O(1), O(log n), O(n), O(nlogn), O(n^2)等。文章指出,最坏情况下的时间复杂度是评估算法性能的上限,并且在实际应用中需要在时间与空间之间找到平衡。
|
7月前
|
算法 编译器
时间复杂度的计算
时间复杂度的计算
|
机器学习/深度学习 算法
时间复杂度介绍及其计算
时间复杂度介绍及其计算
115 0
|
7月前
|
存储 算法 程序员
算法的时间复杂度
算法的时间复杂度
63 0
|
算法 C语言
算法的时间复杂度下
算法的时间复杂度
66 1
|
存储 算法 数据库
算法的时间复杂度上
算法的时间复杂度
72 1
|
机器学习/深度学习 算法 搜索推荐
浅谈时间复杂度与计算
浅谈时间复杂度与计算
|
机器学习/深度学习 算法 搜索推荐
算法的时间复杂度详解
算法的时间复杂度详解
339 1
算法的时间复杂度详解