算法的时间复杂度

简介: 算法的时间复杂度

一、前言

如何衡量一个算法的好坏?

看时间复杂度和空间复杂度

二、时间复杂度

1.时间复杂度定义

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。

一个算法所花费的时间与其中语句执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

2.时间复杂度描述方法

大O复杂度表示法

求算法中语句的执行次数总和:

(1)取影响最大的项

(2)舍去系数

(3)常数次的时间复杂度取O(1)

(4)不确定大小关系的,用max函数取最大

(5)求和出现多种情况的,取最坏时间复杂度

(6)不可根据循环层次来确定时间复杂度,需要明白算法思想确定时间复杂度

(7)时间复杂度中,以2为底的对数可以省略底数2,直接写成logN,但是其他底数不可以省略

(8)递归的时间复杂度是递归的次数

三、实例代码

实例1(取影响最大的项)

F(N)=N*N+2N+10

时间复杂度:O(N^2)

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;
}
实例2(舍去系数)

F(N)=2N+10

时间复杂度:O(N)

void Func2(int N)
{
  int count = 0;
  for (int k = 0; k < 2 * N; ++k)
    ++count;
  int M = 10;
  while (M--)
    ++count;
}
实例3(不确定大小关系的用max函数取最大)

F(N)=M+N

时间复杂度:O(max(M,N))  

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;
}
实例4(常数次的时间复杂度取O(1))

(常数次的时间复杂度取O(1), O(1)并不是代表1次,而是常数次)

F(N)=200

时间复杂度:O(1)

void Func4(int N)
{
  int count = 0;
  for (int k = 0; k < 200; ++k)
    ++count;
}
实例5(取最坏时间复杂度)

时间复杂度:O(N)

const char* strchr(const char* str, int character)
{
  while (*str)
  {
    if (*str == character)
      return str;
    ++str;
  }
}
实例6(不能通过循环层次确定时间复杂度,需要理解算法思想)

这是一个快速排序(Quick Sort)算法的核心代码,函数Swap用来交换两个变量的值,函数PartSort用来进行快排的分区操作

具体地,快速排序的思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个过程可以递归进行。

PartSort函数中,首先选取最左边的元素作为关键字keyi,使用两个指针leftright分别从数组的左端和右端开始向中间扫描,找到第一个大于等于关键字的元素和第一个小于等于关键字的元素,然后交换它们的位置,直到leftright相遇。最后再将关键字元素与left所指向的元素进行交换,此时,keyi左边的元素均小于等于keyi,右边的元素均大于等于keyi,完成了一次分区操作。

时间复杂度:O(N)

int PartSort(int* a, int left, int right)
{
  int keyi = left;
  while (left < right)
  {
    while (left < right && a[right] >= a[keyi])//找小
      --right;
    while (left < right && a[left] <= a[keyi])//找大
      ++left;
    Swap(&a[left], &a[right]);
  }
  Swap(&a[keyi], &a[left]);
}
实例7(时间复杂度中,以2为底的对数可以省略底数2,直接写成logN,但是其他底数不可以省略)

时间复杂度:O(logN)

//整型有序数组的二分查找法
int binary_search(int arr[], int size, int num)
{
  int left = 0;
  int right = size - 1;
  int mid = (right - left) / 2 + left;//优化取平均值的计算方法
  while (left <= right)
  {
    if (arr[mid] < num)
    {
      left = mid + 1;
      mid = (right - left) / 2 + left;
    }
    else if (arr[mid] > num)
    {
      right = mid - 1;
      mid = (right - left) / 2 + left;
    }
    else if (arr[mid] == num)
    {
      return mid;
    }
  }
  return -1;
}
实例8(递归的时间复杂度是递归的次数)

时间复杂度:O(N)

//求n的阶乘
long long Fac(long long n)
{
    assert(n >= 1);
    if (n == 1)
        return 1;
    else
        return n * Fac(n - 1);
}
实例9(双目递归的时间复杂度)

其实这样计算一种粗略的计算,因为上图二叉树实际上是不满的。但由于时间复杂度的计算本身就是估算,所以不影响。

F(N)=2^0+2^1+2^2+……+2^(N-3)+2^(N-2) = 2^(N-1)+2^0

时间复杂度:O(2^N)

该算法效率极其低,实用性不大,且2^n结果随着n的增大是指数性暴增

//求斐波那契数列前n项和
long long Fibonaci(long long n)
{
    if (n < 3)
        return 1;
    else
        return Fibonaci(n - 1) + Fibonaci(n - 2);
}


目录
相关文章
|
2月前
|
机器学习/深度学习 缓存 算法
Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【10月更文挑战第4天】在Python编程中,算法的设计与优化至关重要,尤其在数据处理、科学计算及机器学习领域。本文探讨了评估算法性能的核心指标——时间复杂度和空间复杂度。通过详细解释两者的概念,并提供快速排序和字符串反转的示例代码,帮助读者深入理解这些概念。同时,文章还讨论了如何在实际应用中平衡时间和空间复杂度,以实现最优性能。
72 6
|
4月前
|
机器学习/深度学习 算法 程序员
读《趣学算法》:重开算法之门,时间复杂度与空间复杂度
本文是作者阅读《趣学算法》后的笔记,介绍了算法复杂度的基本概念,包括时间复杂度和空间复杂度的不同阶表示,并通过具体例子展示了如何计算和理解算法的效率。
68 2
读《趣学算法》:重开算法之门,时间复杂度与空间复杂度
|
2月前
|
搜索推荐 算法
插入排序算法的平均时间复杂度解析
【10月更文挑战第12天】 插入排序是一种简单直观的排序算法,通过不断将未排序元素插入到已排序部分的合适位置来完成排序。其平均时间复杂度为$O(n^2)$,适用于小规模或部分有序的数据。尽管效率不高,但在特定场景下仍具优势。
|
5月前
|
机器学习/深度学习 存储 算法
颠覆认知!Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【7月更文挑战第22天】在Python算法设计中,时间与空间复杂度是评估算法效能的核心。时间复杂度不仅限于大O表示法,还涵盖平均与最坏情况分析。空间复杂度虽关注额外存储,但也反映内存效率。平衡二者需视场景而定,如利用原地算法减少内存消耗,或牺牲空间加速执行。算法优化技巧,如分治与动态规划,助你在资源与速度间找寻最优解,从而高效应对大数据挑战。
54 3
|
2月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
38 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
2月前
|
存储 算法
算法的时间复杂度和空间复杂度
本文详细讨论了算法的时间复杂度和空间复杂度,包括它们的概念、计算方法和常见复杂度的对比,并通过多个实例解释了如何计算算法的时间和空间复杂度。
111 0
算法的时间复杂度和空间复杂度
|
3月前
|
算法 Python
震惊!Python 算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
在 Python 算法设计中,理解并巧妙运用时间复杂度和空间复杂度的知识,是实现高效、优雅代码的必经之路。通过不断地实践和优化,我们能够在这两个因素之间找到最佳的平衡点,创造出性能卓越的程序。
40 4
|
2月前
|
算法 C语言
深入理解算法效率:时间复杂度与空间复杂度
深入理解算法效率:时间复杂度与空间复杂度
|
4月前
|
机器学习/深度学习 存储 算法
算法时间复杂度分析
这篇文章讲解了如何分析算法的时间复杂度,包括关注循环执行次数最多的代码段、总复杂度的确定、嵌套代码复杂度的计算方法,并提供了大O阶的推导步骤和常见时间复杂度的列表,同时还介绍了空间复杂度的概念及其重要性。
|
4月前
|
搜索推荐
九大排序算法时间复杂度、空间复杂度、稳定性
九大排序算法的时间复杂度、空间复杂度和稳定性,提供了对各种排序方法效率和特性的比较分析。
169 1