C/C++ 时间复杂度(On)

news/2025/1/22 4:11:34/

定义:

在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。

将数字从 1~100 进行排序不同的人用不同的方法写出的程序都会有所偏差,这就需要我们对编写这个算法有一定的预期,了解这部分算法的运行效果,如果运行效果不适用,就没必要使用这个算法。我们不需要知道某种算法具体的执行时间,而是用大O表示法表示时间的概念,也就是时间复杂度。

大O表示法一般就是来表示某个函数的时间复杂度,所以 O 代替了函数名字,括号里面的代数表示
函数参数。
在这里插入图片描述

O(1) :

每天去上班,只需要和老板一个人打招呼,不管招呼内容是什么,这件事情只需要做一次,每次花费的时间几乎是相等的,我们就可以用 O(1) 来表示这所消耗的时间。

int msg(const char * msg) {printf("%s \n", msg); // 需要执行一次
}

这里不管输入的字符串有多大,都是常量,对于程序而言,就只需要执行一次,把每次执行消耗的时间约等于相等,那么用x,y轴的形式来表示就会是一条直线,我们直接O(1)来表示这样的常量时间。
在这里插入图片描述

O(n):

每天去上班,需要和公司所有人都打招呼,就需要你每天和公司这n个人逐个问候,虽然与每个人打招呼时间相同,但是要进行n多次,因此我们就用O(n)来表示。

int msg(int n) {for (int i = 0; i < n; i++) {         // 需要执行 (n + 1) 次printf("Hello!\n");               // 需要执行 n 次}return 0;                              // 需要执行 1 次
}

这个函数需要遍历数组里面所有元素,因为数组里每个元素都需要遍历一次,所以数组如果有非常多元素,就需要执行多次,也就可以用 O(n) 来表示。因为很明显是一种线性的时间,如果n越大,也就是这个数组的元素越多。消耗的时间也就是越多的。
On

O(n²):

公司业务扩招,现在有多个部门,你需要每天上班,先给部门A所有人逐个打招呼,然后再给部门B里面所有人逐个打招呼,剩下所有部门都是这样打招呼,我们就可以用O(n^²)来表示这所耗费的时间,因为你不止要遍历每个部门还要遍历每个部门的人。

void msg(int numberofDepartments, int numberOfPeople) {for (int i = 0; i < numberofDepartments; i++) { // 循环次数为 nfor (int j = 0; j < numberOfPeople; j++) {  // 循环次数为 nprintf("Hello!\n");        // 循环体时间复杂度为 O(1)}}
}

也就是嵌套循环,这里一共有多少个部门 numberofDepartments,部门中有多少人 numberOfPeople。比方说有4个部门,每个部门有4个人,那么这里输出打招呼的信息就是 16 次,也就是 4 ² = 16 ,所以用 O(n²) 来表示.

在这里插入图片描述

O(log n)

2¹  = 2
2³  = 8
2= 32
2¹⁰ = 1024如果用 log 的形式写:
log₂2 = 1
log₂8 = 3
log₂32 = 5
log₂1024 = 10
这里的  2,8,32,1024 就是 n,这个n即使变得很大,结果并没有等比例增大,就是结果的增速缓慢。每次对半分的话,越到后面,需要消耗的时间相对就越少。

这里 O(log n) 并没有把底数 ₂ 写出来

#include <stdio.h> 
int binary_search(int *arr,int p,int q,int ele) {int mid = 0; if (p > q) {return -1;} mid = p + (q - p) / 2; if (ele == arr[mid]) {return mid;} if (ele < arr[mid]) { return binary_search(arr, p, mid - 1, ele);}else { return binary_search(arr, mid + 1, q, ele);}
}int main()
{int arr[10] = { 10,14,19,26,27,31,33,35,42,44 };printf("%d", binary_search(arr, 0, 9, 31));return 0;
}  

这是一个二分法查找,
在这里插入图片描述


http://www.ppmy.cn/news/1565126.html

相关文章

线程池遇到未处理的异常会崩溃吗?

线程池中的 execute 和 submit 方法详解 目录 引言execute 方法 使用示例代码 submit 方法 2.1 提交 Callable 任务2.2 提交 Runnable 任务 遇到未处理异常 3.1 execute 方法遇到未处理异常3.2 submit 方法遇到未处理异常 小结 引言 在多线程编程中&#xff0c;线程池是提高性…

搭建一个基于Spring Boot的外贸平台

搭建一个基于Spring Boot的外贸平台涉及多个模块的开发&#xff0c;包括用户管理、产品管理、订单管理、支付集成、物流跟踪等。以下是一个简化的步骤指南&#xff0c;帮助你快速搭建一个基础的外贸平台。 1. 项目初始化 首先&#xff0c;使用Spring Initializr生成一个Spri…

MyBatis基于XML的详细使用-缓存

MyBatis基于XML的详细使用-缓存 1、介绍 MyBatis 内置了一个强大的事务性查询缓存机制&#xff0c;它可以非常方便地配置和定制。 为了使它更加强大而且易于配置&#xff0c;我们对 MyBatis 3 中的缓存实现进行了许多改进。 默认情况下&#xff0c;只启用了本地的会话缓存&a…

Mousetrap:打造高效键盘快捷键体验的JavaScript库

Mousetrap&#xff1a;打造高效键盘快捷键体验的JavaScript库 前言 在当今快节奏的数字世界中&#xff0c;用户对Web应用的交互效率提出了更高的要求。 键盘快捷键作为一种提升操作便捷性和速度的有效手段&#xff0c;被广泛应用于各种应用中。 然而&#xff0c;实现一套稳定…

【王树森搜索引擎技术】概要01:搜索引擎的基本概念

1. 基本名词 query&#xff1a;查询词SUG&#xff1a;搜索建议文档&#xff1a;搜索结果标签/筛选项 文档单列曝光 文档双列曝光 2. 曝光与点击 曝光&#xff1a;用户在搜索结果页上看到文档&#xff0c;就算曝光文档点击&#xff1a;在曝光后&#xff0c;用户点击文档&…

Swift语言的多线程编程

Swift语言的多线程编程 在现代软件开发中&#xff0c;多线程编程是提高应用性能和响应速度的重要手段。尤其是在 iOS 和 macOS 开发中&#xff0c;由于用户界面(UI)的交互性和复杂性&#xff0c;合理利用多线程可以极大地提升用户体验。本文将深入探讨 Swift 语言中的多线程编…

Docker的原理:如何理解容器技术的力量

在今天的软件开发和运维中&#xff0c;Docker 已经成为了一个炙手可热的技术名词。它改变了开发者和运维人员的工作方式&#xff0c;使得应用的打包、分发、运行变得更加简便和高效。然而&#xff0c;很多人虽然在使用 Docker&#xff0c;但对它的内部原理了解却并不深入。今天…

shell-特殊位置变量

目录 1.特殊位置变量 $n 2.特殊位置变量 $0 3.特殊位置变量$ # 4.特殊位置变量$*/$ 4.1 $* 4.2 $ 5.shift 命令 1.特殊位置变量 $n $n&#xff1a;表示传递给脚本或函数的第 n 个参数。 $1&#xff1a;第一个参数$2&#xff1a;第二个参数...$9&#xff1a;第九个参数…