首页 > 其他分享 >408数据结构—时间复杂度的计算

408数据结构—时间复杂度的计算

时间:2024-12-29 23:00:17浏览次数:3  
标签:int 复杂度 ++ 算法 循环 n0 数据结构 408

算法效率的度量是通过时间复杂度和空间复杂度来描述的。

时间复杂度在统考中是一大重点,在算法设计题里通常都会要求分析时间复杂度,空间复杂度,同时还会出现考察时间复杂度的选择题,所以需要考生熟练掌握

一、时间复杂度

频度: 一个语句的频度是指该语句在算法中被重复执行的次数

           算法中所有语句的频度之和记为T(n),是问题规模n的函数

时间复杂度主要分析T(n)的数量级,也就是所有语句执行的次数之和的数量级

也可以说是最深层循环中的语句(基本运算)的频度的数量级

表示: T(n)=O(f(n))


这里补充一下算法设计与分析课程中有关大O表示法等渐进符号的定义

O: f(n)=O(g(n))当且仅当存在正的常数C和n0,使得对于所有的n≥ n0,有f(n)≤Cg(n)。此时,称g(n)是f(n)当 n充分大时的一个上界。

Ω: f(n)=Ω(g(n))当且仅当存在正的常数C和n0,使得对于所有的n≥n0,有f(n)≥Cg(n)。此时,称g(n)是f(n)当 n充分大时的一个下界。

Θ: f(n)=Θ(g(n))当且仅当存在正的常数C1,C2和n0,使得对于所有的n≥n0,C1g(n)≤f(n)≤C2g(n)。此时,称f(n)与g(n)同阶。


算法的时间复杂度不仅依赖于问题的规模,还取决于待输入数据的性质

比如在数组中查找,要查找的元素在数组开头和在数组末尾肯定不一样

所以衍生出三种复杂度,即最好情况,最坏情况,平均情况的复杂度

其中平均情况就是指输入所有实例在等概率出现的情况下算法的期望运行时间。

我们一般只考虑最坏和平均时间复杂度

举个例子,比如刚才的查找,假设数组长度为n

那么最坏情况就是要查找的数正好在数组的最后,需要遍历一整个数组,复杂度为O(n)

计算平均时间复杂度时,每一个情况的概率就是1/n

设pi是查找第i个位置上元素的概率,则平均比较次数为1×1/n+2×1/n+…+n×1/n=1/n ×n(n+1)/2 = (n+1)/2,其实复杂度还是O(n)

考虑两个规则,加法和乘法

加法规则:   T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))

乘法规则:T(n)=T1(n)×T2(n)=O(f(n))×O(g(n))= O(f(n)×g(n))

这里提到,加法只保留阶数最大的,关于阶数,我们有如下常识:

O(1) < O(log2(n))< O(n)< O(nlog2(n))< O(n²) < O(n³)<0(2") < O(n!) <O(n")

这里直接记闲鱼学长口诀:常对幂指阶

0b85de2f009242ec8b13d0f9381b7d92.jpeg

 二、空间复杂度

算法的空间复杂度S(n)为该算法所需的存储空间,即

S(n)=O(g(n))

一个程序在执行时除需要存储空间来存放本身所用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。若输入数据所占空间只取决于问题本身,和算法无关,则只需分析除输入和程序之外的额外空间。例如,若算法中新建了几个与输入数据规模n相同的辅助数组,则空间复杂度为O(n)。

单独拿出空间复杂度为O(1)的情况:

表示算法原地工作,所需的辅助空间为常量,辅助空间大小与问题规模n无关,不是不需要辅助空间
 

void test(int n){
     int falg[n][n];
     int other[n];
     int i;
}

该算法的空间复杂度为O(n²)+O(n)+O(1)=O(n²)

三、有关时间复杂度的计算

总结技巧:找n和运行次数t的关系

void fun(int n){
     int i=1;
     while(i<=n)   i=i*2;
}

这里,i的变化为1,2,4,8,16…即2的t次方,t为次数

想一想运行多少次i的值才能等于n,跳出循环呢,也就是2的t次方=n

n=log2(n),所以时间复杂度O(logn),里面的2可以省略

void fun(int n){
     int i=0;
     while(i*i*i<=n)   i++;
}

针对于这个,我们还是找关系

对于每个i,i的三次方分别会是0,1,8,27… 每次都是次数t³与n比较

于是乎,当t³=n,循环跳出

所以时间复杂度为O(n的1/3次)

count=0;
for(k=1;k<=n;k*=2){
   for(j=1;j<=n;j++){
      count++;
 }
}

(2014统考)

这个题目我一开始也做错了,关键还是在于看语句执行了多少次

外层循环:k=1,2,4,8,…,n

内层循环:始终为n

那么就看k增长到n用了几次,也就是几个n

不难看出经过log2(n)次,一共是O(nlogn)

int sum=0;
for(int i=1;i<n;i*=2)
    for(int j=0;j<i;j++)
        sum++;

(2022统考)

还是老老实实分析执行次数

外层循环:1,2,4,8一直到n

内层循环:1,2,4,8一直到n

实际运算次数就是内层这些次数之和,即2的幂,等比数列之和

等比数列的项数其实是外层循环的个数

外层循环有几个呢?t=log2(n)+1,加1是因为多了第一项1,是2的0次方

内层等比数列求和:首项为1,公比为2,项数为t

S=1+2+4+8+…=1×(1-2的t次)/(1-2)=2的t次方-1

由于t前面计算得,是log的,于是整体S=O(n)

int count=0;
for(int i=0;i*i<n;i++)
    for(int j=0;j<i;j++)
        count++;

(2025统考)

 外层循环:  0,1,4,9…n

内层循环:0,1,2,3…√n

于是乎内层直接相加就行,得到O(n)

标签:int,复杂度,++,算法,循环,n0,数据结构,408
From: https://blog.csdn.net/Benaldo_Y/article/details/144795137

相关文章

  • 数据结构复习
    背诵线性表前驱:后继表长:空表:首元结点:头结点:头指针线性表的结构特点,除了第一个和最后一个元素外,每个节点都只有一个前驱和后继。线性表的存储方式:栈与队列顺序栈链栈链队列栈与队列存储数据栈的应用:循环列表判队空、队满条件,......
  • 【初阶数据结构与算法】八大排序之非递归系列( 快排(使用栈或队列实现)、归并排序)
    *文章目录一、非递归版快排1.使用栈实现非递归版快排2.使用队列实现非递归版快排二、非递归版归并排序1.非递归版归并排序的实现一、非递归版快排1.使用栈实现非递归版快排   在学习非递归版快排前,建议大家先学习递归版的快排,否则非递归版的快排将很难理解,这......
  • [算法/数据结构]系列 华为面试原题:和为n的子串(前缀和+哈希表)
    [算法/数据结构]系列华为面试原题:和为n的子串(前缀和+哈希表)文章目录[算法/数据结构]系列华为面试原题:和为n的子串(前缀和+哈希表)面试原题样例分析代码及思路面试原题输入一串只有0和1的数组,返回输入和为n的子串的个数。样例:输入:[011100],n=3输出:6样......
  • 《数据结构》期末考试测试题【上】
    数据结构测试题1.数据结构是指什么?2.某语句时间复杂为?3.关于数据结构的说法那个正确?4.一个算法的评价标准包括哪些方面?5.时间复杂度指的是什么?6.算法的重要特征有那些?7.某语句时间复杂为?8.存储数据时要存储什么?9.某语句时间复杂为?10.某语句时间复杂为?11.某二叉树的遍历......
  • 数据结构与算法Python版 二叉堆与优先队列
    文章目录一、二叉堆与优先队列二、二叉堆的实现三、二叉堆的应用-堆排序一、二叉堆与优先队列优先队列PriorityQueue默认的队列是FIFO,队列有一种变体称为优先队列优先队列的出队:跟默认队列一样从队首出队优先队列的入队:数据项的次序由优先级来确定,高优先级的数据......
  • 【数据结构】二叉树
    二叉树1.树型结构(了解)1.1概念1.2概念(重要)1.3树的表示形式(了解)1.4树的应用2.二叉树(重点)2.1概念2.2两种特殊的二叉树2.3二叉树的性质2.4二叉树的存储2.5二叉树的基本操作2.5.1前置说明2.5.2二叉树的遍历2.5.3二叉树的基本操作2.6二叉树相关oj题【本节......
  • 头歌实训数据结构与算法-二叉树及其应用(第7关:由前序和中序遍历序列构造二叉树)
    任务描述本关任务要求采用前序遍历序列和中序遍历序列构造二叉树。相关知识给定一棵二叉树的前序遍历序列和中序遍历序列可以构造出这棵二叉树。例如前序序列是ABDECFG,中序序列是DBEAFCG,那么这颗二叉树的结构如图1所示。树结点结构定义为:structBTNode{    c......
  • 数据结构之线性表之链表(附加一个考研题)
    链表的定义链表的结构:单链表-初始化代码实现:单链表-头插法代码实现:这里我给大家分析一下我们每创建一个新的节点都要插在头节点的后面,我们一定要注意顺序一定要先让新节点指向头节点指向的下一个节点,再让头节点指向新的节点单链表-遍历代码实现:代码分析:这里我......
  • 数据结构之栈和队列
    栈的定义:我们要记住这8个字,先进后出,后进先出我们对于栈的操作只有两个,进栈和出栈栈的顺序结构初始化:(和顺序表差不多)代码实现:栈的顺序结构进栈:代码实现:栈的顺序结构出栈:代码实现:这里解释一下,让下标减一,下次进行进栈的时候就直接覆盖了,和顺序表的原理差不多获取栈......
  • 链表 实现复杂的数据结构
    `#includeusingnamespacestd;structNode{intdata;Node*next;};Node*CreateNode(intdata){Node*newNode=newNode();newNode->data=data;newNode->next=NULL;returnnewNode;}voidtraverseLinkedList(Node*head){Node*current=head;while(curre......