【笔记】时间复杂度

文章目录

    • 时间复杂度概念
    • 常见的时间复杂度
    • 时间复杂度的衡量
      • 常数时间例子
      • 线性时间例子
      • 平方时间例子
      • 对数时间例子

时间复杂度概念

时间复杂度:衡量算法随着输入量增长,执行时间的增长速度。

一般来说,肯定是希望时间复杂度小点比较好。

常见的时间复杂度

常见的时间复杂度包括:

  1. 常数时间 O ( 1 ) O(1) O(1)
  2. 线性时间 O ( n ) O(n) O(n)
  3. 对数时间 O ( l o g n ) O(log n) O(logn)
  4. 平方时间 O ( n 2 ) O(n^2) O(n2)
  5. ……

时间复杂度的衡量

时间复杂度的衡量:算法中基本操作的执行次数。

时间复杂度= O ( x ) O(x) O(x),x为程序运行计算次数

  • 在算法分析中,基本操作是指算法执行过程中最简单、不可再分解的操作。这些操作通常具有以下特点:

    • 原子性:基本操作是不可分割的,即它在执行时不会被其他操作中断。
    • 简单性:基本操作通常非常简单,如赋值、比较、算术运算等。
    • 重复性:在算法执行过程中,基本操作会被重复执行多次。
  • 在衡量时间复杂度时,一般估算其最坏情况下的数量级,而不是具体的数字。

  • 如果存在多项时间复杂度,取最高项。

    • O(n^2+n)=O(n^2)
    • O(n+6)=O(n)
    • O(n^3+n+10)=O(n^3)

在做题的时候会关注到如下限制:

语言最大运行时间最大运行内存
C++1s256M
C1s256M
Java2s256M
Python33s256M
PyPy33s256M
Go3s256M
JavaScript3s256M

一般来说,评测机1s可以运行2e8次运算,为了不超时,尽量把运算规模控制在1e8之内。

常数时间例子

常数时间复杂度(O(1))意味着算法的运行时间与输入数据的大小无关,无论输入数据有多大,算法的执行时间都保持不变。这通常发生在算法只执行固定数量的操作时。

def add(x, y):return x + y

线性时间例子

线性时间复杂度(O(n))意味着算法的运行时间与输入数据的大小成正比。对于长度为n的输入,算法的执行时间大致是n的倍数。在Python中,很多基本的迭代操作都具有线性时间复杂度。

# 遍历列表中的所有元素:
def print_elements(lst):for element in lst:print(element)
# 计算最大公约数(GCD):
# 使用欧几里得算法计算两个数的最大公约数,该算法基于递归,每次将问题规模减半。def gcd(a, b):if b == 0:return aelse:return gcd(b, a % b)
# 快速幂算法:
# 快速幂算法用于计算a^b的值,通过将指数分解为2的幂次,每次迭代减少问题的规模。def fast_power(a, b):if b == 0:return 1elif b % 2 == 0:return fast_power(a, b // 2) ** 2else:return a * fast_power(a, b // 2) ** 2
# 归并排序中的分割步骤:
# 归并排序是一种分治算法,其中分割步骤的时间复杂度是O(log n)。def merge_sort(arr):if len(arr) > 1:mid = len(arr) // 2L = arr[:mid]R = arr[mid:]merge_sort(L)merge_sort(R)i = j = k = 0while i < len(L) and j < len(R):if L[i] < R[j]:arr[k] = L[i]i += 1else:arr[k] = R[j]j += 1k += 1while i < len(L):arr[k] = L[i]i += 1k += 1while j < len(R):arr[k] = R[j]j += 1k += 1
# 堆排序中的堆调整:
# 堆调整是堆排序算法中的关键步骤,用于保持堆的性质,其时间复杂度为O(log n)。def heapify(arr, n, i):largest = il = 2 * i + 1r = 2 * i + 2if l < n and arr[largest] < arr[l]:largest = lif r < n and arr[largest] < arr[r]:largest = rif largest != i:arr[i], arr[largest] = arr[largest], arr[i]heapify(arr, n, largest)

平方时间例子

平方时间复杂度(O(n^2))通常出现在需要对数据集中的每个元素进行多次操作的算法中。这种复杂度意味着算法的运行时间与输入数据大小的平方成正比。

# 冒泡排序:
# 冒泡排序通过重复遍历列表,比较并交换相邻元素来排序,每次遍历都减少未排序部分的长度。def bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]
# 选择排序:
# 选择排序通过不断选择剩余部分的最小元素并将其放置在正确的位置。def selection_sort(arr):n = len(arr)for i in range(n):min_idx = ifor j in range(i+1, n):if arr[min_idx] > arr[j]:min_idx = jarr[i], arr[min_idx] = arr[min_idx], arr[i]
# 插入排序:
# 插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。def insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]j = i-1while j >= 0 and key < arr[j]:arr[j + 1] = arr[j]j -= 1arr[j + 1] = key
# 计算两个字符串的最长公共子序列(LCS):
# 通过动态规划计算两个字符串的最长公共子序列的长度,时间复杂度为O(n^2)。def lcs(s1, s2):m = len(s1)n = len(s2)dp = [[0] * (n+1) for _ in range(m+1)]for i in range(1, m+1):for j in range(1, n+1):if s1[i-1] == s2[j-1]:dp[i][j] = dp[i-1][j-1] + 1else:dp[i][j] = max(dp[i-1][j], dp[i][j-1])return dp[m][n]

对数时间例子

对数时间复杂度(O(log n))通常出现在涉及二分搜索或类似分治策略的算法中。这种复杂度意味着算法的运行时间与输入数据的大小的对数成正比。

# 二分搜索:
# 二分搜索是一种在有序数组中查找特定元素的算法。它每次将搜索范围减半,因此搜索时间是输入数组长度的对数。def binary_search(arr, low, high, x):if high >= low:mid = (high + low) // 2if arr[mid] == x:return midelif arr[mid] > x:return binary_search(arr, low, mid - 1, x)else:return binary_search(arr, mid + 1, high, x)else:return -1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/879910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【FPGA】编程方式

FPGA编程方式 1 什么是PLD&#xff1f;2 什么是颗粒度&#xff1f;3 可编程逻辑器件的编程方式有哪些&#xff1f;3.1 SRAM 编程技术3.2 Flash/EEPROM 编程技术3.3 反熔丝编程技术3.4 编程技术比较 参考资料 1 什么是PLD&#xff1f; 可编程逻辑器件 英文全称为&#xff1a;pr…

SpringBoot 数据库表结构文档生成

官方地址&#xff1a;https://github.com/pingfangushi/screw screw 螺丝钉&#xff0c;支持以下数据库 MySQL MariaDB TIDB Oracle SqlServer PostgreSQL Cache DB&#xff08;2016&#xff09; 生产文档支持 html word markdown 开始 添加依赖 <!-- 螺丝钉 --><…

c语言面试字符串复制

1&#xff0c;下面这个函数的打印是什么&#xff1a; #include<stdio.h> #include<string.h>int main() {char str0[5], str1[] "welcome";strcpy(str0, str1);printf("str0:%s\r\n",str0);printf("str1:%s\r\n",str1); } larkla…

nginx实现https安全访问的详细配置过程

文章目录 前言什么是 HTTP&#xff1f;什么是 HTTPS&#xff1f;HTTP 和 HTTPS 的区别为什么 HTTPS 被称为安全的&#xff1f;配置过程配置自签名证书 前言 首先我们来简单了解一下什么是http和https以及他们的区别所在. 什么是 HTTP&#xff1f; HTTP&#xff0c;全称为“超…

notepad++的json查看

json文件查看 因为接触到3dtile模型&#xff0c;所以经常需要和json打交道&#xff0c;但是很多模型是下面这种情况&#xff0c;不好阅读&#xff0c;所以可以使用notepad的插件查看 正常打开是这样的 加载notepad插件 搜索json下载安装就可以了 如果网络抽象&#xff0c;下载…

Hive企业级调优[3]—— Explain 查看执行计划

Explain 查看执行计划 Explain 执行计划概述 EXPLAIN 命令呈现的执行计划由一系列 Stage 组成。这些 Stage 之间存在依赖关系&#xff0c;每一个 Stage 可能对应一个 MapReduce Job 或者一个文件系统的操作等。如果某 Stage 对应了一个 MapReduce Job&#xff0c;则该 Job 在 …

Apache James配置连接达梦数据库

项目场景&#xff1a; Apache James配置连接达梦数据库&#xff0c;其他配置中不存在的数据库也可参考此方案。 配置步骤 1、把需要的jar包导入到James 把DmJdbcDriver18.jar复制到下面lib目录下 james-2.3.2\lib 2、 修改连接配置 james-2.3.2\apps\james\SAR-INF\confi…

C# 技巧在 foreach 循环中巧妙获取索引

目录 前言 使用 LINQ 和扩展方法 直接在 LINQ 查询中使用 使用 LINQ 的 Select() 与 Enumerable.Range() 总结 最后 前言 在C#中foreach 循环是处理集合的常见方式&#xff0c;因其简洁性和易读性而广受青睐。 但是在某些情况下&#xff0c;我们需要同时获取集合中元素的…

[深度学习]神经网络

1 人工神经网络 全连接神经网络 2 激活函数 隐藏层激活函数由人决定输出层激活函数由解决的任务决定: 二分类:sigmoid多分类:softmax回归:不加激活(恒等激活identify)2.1 sigmoid激活函数 x为加权和小于-6或者大于6,梯度接近于0,会出现梯度消失的问题即使取值 [-6,6] ,…

头戴式蓝牙耳机性价比高的有哪些?四款高能性价比机型对比推荐

在当今科技日新月异的时代&#xff0c;头戴式蓝牙耳机已经成为了我们日常生活中不可或缺的一部分&#xff0c;无论是通勤路上、健身房内还是家中休闲时&#xff0c;一副优质的头戴式蓝牙耳机都能为我们带来沉浸式的听觉体验&#xff0c;那么头戴式蓝牙耳机性价比高的有哪些&…

模版结构体没有可用成员(C3203)

没有typedef模版结构体而导致。 并且_tables[index]无法访问HashData内部的成员。

Windows系统使用PHPStudy搭建Cloudreve私有云盘公网环境远程访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#…

Vue(13)——router-link

router-link vue-router提供了一个全局组件router-link(取代a标签) 能跳转&#xff0c;配置to属性指定路径&#xff08;必须&#xff09;。本质还是a标签。默认会提供高亮类名&#xff0c;可以直接设置高亮样式 右键检查&#xff0c;发现多了两个类&#xff1a; 可以直接写样式…

【Python】探索 Errbot:多功能聊天机器人框架

不是旅行治愈了你&#xff0c;是你在路上放过了自己。 在当今的数字化时代&#xff0c;聊天机器人已成为企业与客户互动、提升工作效率和增加乐趣的重要工具。Errbot是一个高度可扩展的聊天机器人框架&#xff0c;它允许开发者使用Python轻松创建和定制机器人。本文将介绍Errb…

大型语言模型 (LLM) 劫持攻击不断升级,导致每天损失超过 100,000 美元

Sysdig 威胁研究团队 (TRT) 报告称&#xff0c;LLMjacking&#xff08;大型语言模型劫持&#xff09;事件急剧增加&#xff0c;攻击者通过窃取的云凭证非法访问大型语言模型 (LLM)。 这一趋势反映了 LLM 访问黑市的不断增长&#xff0c;攻击者的动机包括个人使用和规避禁令和制…

【webpack4系列】编写可维护的webpack构建配置(四)

文章目录 构建配置包设计功能模块设计和目录结构设计功能模块设计目录结构设计 使用ESLint规范构建脚本冒烟测试介绍和实际运用冒烟测试 (smoke testing)冒烟测试执行判断构建是否成功判断基本功能是否正常 单元测试和测试覆盖率测试框架编写单元测试用例单元测试接入测试覆盖率…

Ubuntu截图工具flameshot

最近在使用香橙派做一些东西&#xff0c;有些内容需要截图记录&#xff0c;这里记录一下截图工具的安装和使用过程&#xff0c;方便以后查阅。 Ubuntu截图工具flameshot flameshot 简介flameshot 安装flameshot 相关命令 flameshot 简介 linux系统里面最好用的截屏工具支持图形…

基于python+django+vue的旅游网站系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤pythondjangovue…

计算机四级-计算机网络

一、基础知识 1.对计算机网络发展具有重要影响的广域网是&#xff1a;ARPANET 随机争用型的介质访问控制方法起源于&#xff1a;ALOHANET 2.计算机网络发展阶段&#xff1a; A&#xff09;第一阶段的主要成果是计算机技术与通信技术的结合 B&#xff09;第二阶段的主要成果…

【例题】lanqiao4425 咖啡馆订单系统

样例输入 3 2 2 1 3 1 2样例输出 3 2样例说明 输入的数组为&#xff1a;【3&#xff0c;1&#xff0c;2】 增量序列为&#xff1a;【2&#xff0c;1】 当增量 h2&#xff1a;对于每一个索引 i&#xff0c;我们会将数组元素 arr[i] 与 arr[i−h] 进行比较&#xff0c;并进行可…