【笔记】时间复杂度

文章目录

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

时间复杂度概念

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

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

常见的时间复杂度

常见的时间复杂度包括:

  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,一经查实,立即删除!

相关文章

linux文件同步、传输

使用rsync 适合用于大量文件多次同步&#xff0c;此工具是增量的同步&#xff0c;即如果之前同步过一次了&#xff0c;后续再同步&#xff0c;他只会传输有变化、新增的文件&#xff0c;就是之前同步过的文件如果没有变化&#xff08;文件大小、修改时间等判断&#xff09;就不…

Python使用虚拟环境解决依赖冲突

在处理多个 Python 库依赖时&#xff0c;遇到依赖冲突是很常见的&#xff0c;特别是当项目依赖的库版本相互不兼容时。要解决这些冲突&#xff0c;可以采用以下方式。 1. 虚拟环境的使用 为了避免系统级和用户级包的冲突&#xff0c;建议你使用 虚拟环境。虚拟环境为每个项目…

【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 开始 添加依赖 <!-- 螺丝钉 --><…

【Kubernetes】常见面试题汇总(二十九)

目录 81.简述你知道的几种 CNI 网络插件&#xff0c;并详述其工作原理。K8s 常用的CNI网络插件&#xff08;calico && flannel&#xff09;&#xff0c;简述一下它们的工作原理和区别。 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff…

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;全称为“超…

Apache Iceberg 试用

启动 spark-sql 因为 iceberg 相关的 jars 已经在 ${SPARK_HOME}/jars 目录&#xff0c;所以不用 --jars 或者 --package 参数。 spark-sql --master local[1] \--conf spark.sql.extensionsorg.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \--conf spar…

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…

oracle表的类型

表是数据库最基本的逻辑结构&#xff0c;一切数据都存放在表中&#xff0c;其它数据库对象(索引、视图、同义词等)都是为了更方便的操作表中的数据。Oracle数据库是由若干个表组成&#xff0c;每个表由列和行组成。 数据库表的类型按照存储结构划分&#xff1a; (1)普通表&…

SpringBoot开发——获取HTTP请求头(Header)的三种方法

文章目录 方法一&#xff1a;使用HttpServletRequest实现原理方法二&#xff1a;使用RequestContextHolder实现原理方法三&#xff1a;使用RequestHeader注解实现原理总结 在Spring Boot应用中&#xff0c;获取HTTP请求头&#xff08;Header&#xff09;信息是常见的需求&#…

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

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

Unity—Transform类-position

概要 游戏对象&#xff08;GameObject&#xff09;位移、旋转、缩放、父子关系、坐标转换等相关操作都由它处理 是Unity提供的极其重要的类 Vector3 Vector3主要是用来表示三维坐标系中的 一个点 或者一个向量 申明 Vector3 v new Vector3(); v.x …

如何限制任何爬虫爬取网站的图片

随着网络爬虫技术的普及&#xff0c;网站的图片、内容和数据容易被恶意爬取。这不仅可能导致带宽资源的浪费&#xff0c;还会侵犯图片版权和私密性。因此&#xff0c;许多网站管理员希望限制或阻止爬虫爬取网站的图片。本文将介绍一些有效的技术和方法&#xff0c;帮助网站管理…

[深度学习]神经网络

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

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

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

练习题 - Django 4.x Models CRUD(增、删、改、查)函数方法

在 web 应用程序开发中,数据的增、删、改、查(CRUD)操作是最基本的功能之一。Django 作为一个高效的 web 框架,提供了强大的 ORM(对象关系映射)功能,使得开发者可以通过 Python 代码直接操作数据库,而不需要编写繁琐的 SQL 语句。这种简化和抽象帮助开发者快速构建、测…

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

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