【数据结构】了解,ins下 时间复杂度

这篇具有很好参考价值的文章主要介绍了【数据结构】了解,ins下 时间复杂度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 一、算法时间复杂度的定义

定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作T(n) = O(f(n)).它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。

 即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度


// 请计算一下Func1中++count语句总共执行了多少次?
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


二、什么是大O(大O表示法)

这里的大O指的是什么呢,一提到时间复杂度,大家都懂O(1)、O(n)、O(n^2)等等,却不明白括号前面的O是什么意思。

在实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概的执行次数那这里就需要用到大O的渐进表示法。

在这边我们如果想要求出大概的执行次数,那就需要找到函数表达式中最具有决定性的一项(抓大头)

例如:F(N)=N^2+2*N+10这个函数表达式中,哪一项是能决定整个式子大小的?那必然是项数最大的那一项。

【数据结构】了解,ins下 时间复杂度,数据结构构构构构,数据结构

从图中看来,我们可以用极限的思想来看这个式子。当N无限增大的时候,就会发现后面这两项对整个式子的影响微乎其微。此时这个表达式的时间复杂度:O(N^2)。


前面我们简单的介绍了大O表示法,想必大家也对这个方法有了初步的印象。接下来,让我们进行更深入的了解吧。

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。

那么如何分析一个算法的时间复杂度呢?即如何推导大O阶呢?

推导大O阶:

  1. 用常数1取代运行时间中的所有加法常数。
  2. 在修改后的运行次数函数中,只保留最高阶项。
  3. 如果最高阶项存在且其系数不是1,则去除与这个项相乘的系数。

得到的结果计算大O阶。

现在,仿佛是得到游戏攻略一样,我们好像已经得到了一个推导算法时间按复杂度的万能公式。

通过上面我们会发现大O表示法去掉了那些对结果影响不大的项,简洁明了地表示出了执行次数。


最好情况,最坏情况,平均情况

  • 最坏情况:任意输入规模的最大运行次数(上界)
  • 平均情况:任意输入规模的期望运行次数
  • 最好情况:任意输入规模的最小运行次数(下界)

我们查找一个有n个随机数字数组中地某个数字,最好的情况是第一个数字就是,那算法的时间复杂度为O(1),但也有可能这个数字就在最后一个位置上待着,那么算法的时间复杂度为O(n)。

通常,除非特殊指定,我们提到的运行时间都是最坏情况的运行时间,也就是最坏时间复杂度。


三、一些实际的案例

例一、

// 计算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)

理解:整体的函数表达式为:F(N)=2*N+10。但根据大O阶表示法,我们只需要保留最高阶项,并把最高阶项的系数给化为1。

例二、

// 计算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;
    }
    printf("%d\n", count);
}

时间复杂度:O(M+N)

理解:函数内部有两个循环,一个执行N次,另一个执行M次。但是函数中并未给我们说明M和N的区别,所以在无法辨别的情况下,时间复杂度为O(M+N)。如果此时说明M远大于N,时间复杂度为O(M);如果说明N远大于M,时间复杂度为O(N);如果说明M和N一样大,时间复杂度为O(N)或O(M)。

例三、

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

时间复杂度:O(1)

理解:有些人会认为这个函数的时间复杂度为O(100),但是根据大O阶表示法的第一条:用常数1取代运行时间中的所有加法常数。所以时间复杂度为O(1)。

例四、

// 计算strchr的时间复杂度?
const char * strchr ( const char * str, int character );

时间复杂度:O(N)

理解:strchr这个库函数的作用是在str这个字符数组中查找一个字符。。如果这个字符在第一位,那时间复杂度为O(1)。如果这个字符在最后一位,那时间复杂度为O(N)。此时这就涉及到了最坏时间复杂度的知识点,一般就是无特殊说明,指的是最坏的时间复杂度。

例五、

  有关冒泡排序的知识我觉得这位作者的讲解很棒https://wzill.blog.csdn.net/

相关知识点:​​​​https://blog.csdn.net/weixin_45490198/article/details/130959009

// 计算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)

理解:这里是个冒泡排序,最终的结果是一个等差数列的和。当然,这个排序的时间复杂度也分最好与最坏。

首先,在最理想的情况下,时间复杂度为O(1)。但是,这明显是不可能的。毕竟我们不知道冒泡排序是有序还是乱序,而且如果数组的长度过长,那我们看也是看不过来的。

其次,另一种情况是这个数组已经是有序或者是只有一两个数是乱序的。那时间复杂度就为O(N-1)。

最后就是最坏的情况,整个数组都是乱序的。这样子就是如图所示【数据结构】了解,ins下 时间复杂度,数据结构构构构构,数据结构

所以时间复杂度就为O(N^2)。 

例六、

// 计算BinarySearch的时间复杂度?
int BinarySearch(int* a, int n, int x)
{
    assert(a);
    int begin = 0;
    int end = n-1;
// [begin, end]:begin和end是左闭右闭区间,因此有=号
    while (begin <= end)
    {
        int mid = begin + ((end-begin)>>1);
        if (a[mid] < x)
            begin = mid+1;
        else if (a[mid] > x)
            end = mid-1;
        else
            return mid;
    }
    return -1;
}

时间复杂度:O(logN)

理解:

【数据结构】了解,ins下 时间复杂度,数据结构构构构构,数据结构

 所以就是2^x=N,利用数学的知识换个底就能求出答案。

补充:对数在文本中并不好写,支持一些展示公式编辑器才方便时间复杂度简写成logN。但是只有log2N可以简写成logN,其他的都要写出来。

例七、

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

 时间复杂度:O(N)

理解:

【数据结构】了解,ins下 时间复杂度,数据结构构构构构,数据结构

 总结:递归算法时间复杂度是多次调用的次数累加。

例八、

// 计算阶乘递归Fac的时间复杂度?
long long Fac(size_t N)
{
    if(0 == N)
        return 1;
 
    for(int i=0; i<N; i++)
    {
        ~
    )
 
    return Fac(N-1)*N;
}

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

l理解:这个递归里面有循环,那N随着递归会逐渐变小,所以这层循环的本质就是等差数列求和,那时间复杂度就是O(N^2)。

//计算斐波那契递归Fib的时间复杂度?
long long Fib(size_t N)
{
	if (N < 3)
		return 1;

	return Fib(N - 1) + Fib(N - 2);
}

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

理解:

【数据结构】了解,ins下 时间复杂度,数据结构构构构构,数据结构

所以结果可以用等比数列求和公式计算就可以得出时间复杂度 

 【数据结构】了解,ins下 时间复杂度,数据结构构构构构,数据结构

补充:常见的时间复杂度 

O(1) 常数阶
O(N) 线性阶
O(N^2) 平方阶
O(logN) 对数阶
O(N*logN) N*logN阶
O(N^3) 立方阶
O(2^N) 指数阶

常用的时间复杂度所耗费的时间从小到大依次是:

O(1)<O(logN)<O(N)<O(N*logN)<O(N^2)<O(N^3)<O(2^N)<O(N!)<O(N^N) 


 以上就是我对时间复杂度的一个理解。如果有出错的地方希望各位伙伴能及时指出,我也会及时改正的。感谢各位的观看,谢谢!!!!!文章来源地址https://www.toymoban.com/news/detail-828776.html

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

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

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

相关文章

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

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

    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)
  • 【数据结构】时间复杂度

    🚩 WRITE IN FRONT 🚩    🔎 介绍:\\\"謓泽\\\"正在路上朝着\\\"攻城狮\\\"方向\\\"前进四\\\" 🔎 🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星TOP100|TOP63、阿里云专家博主、掘金优秀创作者、全网粉丝量6w+、全网访问量100w+ 🏅 🆔 文章内容由 謓泽 原创 如需相关

    2024年02月11日
    浏览(41)
  • 数据结构——时间复杂度

    前言: 当谈到数据结构和算法时,时间复杂度是一个至关重要的概念。时间复杂度是衡量算法执行时间随输入规模增长而变化的度量,它指示了算法的效率和性能。在本篇博客中,我们将深入探讨时间复杂度的相关知识,并结合C语言给出一些代码示例来帮助读者更好地理解

    2024年02月21日
    浏览(38)
  • 数据结构(2)时间复杂度——渐进时间复杂度、渐进上界、渐进下界

    目录 2.1.概述 2.2.时间复杂度的计算 2.2.1.渐进复杂度 2.2.2.渐进上界 2.2.3.渐进下届 2.2.4.复杂度排序 2.2.5.举几个例子 算法的基本定义: 求解问题的一系列计算或者操作。 衡量算法性能的指标: 时间复杂性 空间复杂性 这两个指标里最有用的是时间复杂度,平时谈的算法复杂度

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

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

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

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

    2024年02月11日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包