【笔记】时间复杂度

server/2024/9/22 7:48:35/

文章目录

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

时间复杂度概念

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

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

常见的时间复杂度

常见的时间复杂度包括:

  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))意味着算法的运行时间与输入数据的大小无关,无论输入数据有多大,算法的执行时间都保持不变。这通常发生在算法只执行固定数量的操作时。

python">def add(x, y):return x + y

线性时间例子

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

python"># 遍历列表中的所有元素:
def print_elements(lst):for element in lst:print(element)
python"># 计算最大公约数(GCD):
# 使用欧几里得算法计算两个数的最大公约数,该算法基于递归,每次将问题规模减半。def gcd(a, b):if b == 0:return aelse:return gcd(b, a % b)
python"># 快速幂算法:
# 快速幂算法用于计算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
python"># 归并排序中的分割步骤:
# 归并排序是一种分治算法,其中分割步骤的时间复杂度是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
python"># 堆排序中的堆调整:
# 堆调整是堆排序算法中的关键步骤,用于保持堆的性质,其时间复杂度为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))通常出现在需要对数据集中的每个元素进行多次操作的算法中。这种复杂度意味着算法的运行时间与输入数据大小的平方成正比。

python"># 冒泡排序:
# 冒泡排序通过重复遍历列表,比较并交换相邻元素来排序,每次遍历都减少未排序部分的长度。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]
python"># 选择排序:
# 选择排序通过不断选择剩余部分的最小元素并将其放置在正确的位置。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]
python"># 插入排序:
# 插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。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
python"># 计算两个字符串的最长公共子序列(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))通常出现在涉及二分搜索或类似分治策略的算法中。这种复杂度意味着算法的运行时间与输入数据的大小的对数成正比。

python"># 二分搜索:
# 二分搜索是一种在有序数组中查找特定元素的算法。它每次将搜索范围减半,因此搜索时间是输入数组长度的对数。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.ppmy.cn/server/118366.html

相关文章

Cesium 问题:视角漫游时添加的无人机模型飞行时有抖动

文章目录 问题分析1. 调整飞机模型的高度,比如漫游视角飞行时是1500米,那么可以试着设置飞机模型的高度是1000米或300米,就不会看到抖动了2. 在给飞机新坐标时用如下方式问题 Cesium 问题:视角漫游时添加的无人机模型飞行时有抖动,飞行不太流畅 分析 不太平滑飞行有这两…

使用docker的小例子

演示一个简单的 Node.js 应用的 Docker 化过程。假设我们要创建一个简单的 Node.js 应用&#xff0c;它会在启动时输出 “Hello, Docker!”。 1. 创建 Node.js 项目 步骤 1: 创建项目目录和文件 mkdir my-node-app cd my-node-app 步骤 2: 初始化 Node.js 项目 npm init …

【重学 MySQL】二十七、七种 join 连接

【重学 MySQL】二十七、七种 join 连接 union 的使用UNION 的基本用法示例UNION ALL 的用法 七种 join 连接代码实现语法格式小结 union 的使用 UNION 在 SQL 中用于合并两个或多个 SELECT 语句的结果集&#xff0c;并默认去除重复的行。如果希望包含重复行&#xff0c;可以使…

MySQL——数据类型(二)

目录 一、日期与时间类型 1.1 date 1.2 datetime 1.3 timestamp 二、枚举和联合 2.1 enum 2.2 set 2.2.1 set 的插入 2.2.2 set 的查找 思维导图可以参考如下链接&#xff1a; 数据类型.xmind 夜夜亮晶晶/MySQL - Gitee.com 一、日期与时间类型 1.1 date 日期 yyy…

HTTP 协议的基本格式

HTTP协议("超文本传输协议")&#xff0c;是一个被广泛使用应用层协议&#xff0c;自1991年正式发布HTTP协议以来&#xff0c;HTTP协议就一直在更新&#xff0c;目前已经更新到3.0版本&#xff0c;但是目前主流的依旧是1.1版本&#xff0c;但依旧是一个最主流使用的应…

用Blender来烘培模型材质

通常我们在做三维设计&#xff0c;游戏开发的时候&#xff0c;经常需要从网上下载一些3D模型&#xff0c;这些模型采用的材质分辨率通常都不一样&#xff0c;而我们从性能考虑&#xff0c;需要对材质进行统一的处理&#xff0c;例如把材质都统一为2K的分辨率。 我们可以在Blen…

React两种路由模式的实现原理

React 中常用的两种路由模式是 HashRouter 和 BrowserRouter。它们分别使用不同的方式来管理和监听 URL 变化。以下是这两种路由模式的实现原理。 1. HashRouter HashRouter 使用 URL 的哈希部分&#xff08;即 # 后面的部分&#xff09;来保持 UI 和 URL 的同步。哈希部分不…

Kubernetes 网络

Kubernetes 网络详解与常见问题探讨 Kubernetes 是一种广泛使用的容器编排平台&#xff0c;其网络架构是保证集群内外通信顺畅的重要基础。Kubernetes 网络旨在为容器提供灵活、可扩展且隔离的通信机制。在实际的 Kubernetes 集群部署和使用过程中&#xff0c;网络相关的问题常…