算法导论【时间复杂度】—排序算法、图算法、动态规划、字符串匹配等时间复杂度小结

news2024/9/25 13:24:25

算法导论【时间复杂度】—排序算法、图算法、DP等小结

  • 排序
    • 快速排序
    • 堆排序
    • 计数排序
    • 基数排序
    • 桶排序
  • SELECT算法
    • RANDOMIZED-SELECT
    • SELECT
  • 图算法
    • 广度优先搜索
    • 深度优先搜索
    • Kruskal算法
    • Prim算法
    • Bellman-Ford算法
    • Dijkstra算法
    • Floyd-Warshall算法
    • Johnson算法
    • Ford-Folkson方法
    • Edmonds-Karps算法
  • 动态规划
    • 钢条切割
    • 矩阵链乘法
    • 最长公共子序列
    • 最优二叉搜索树
  • 字符串匹配
    • 朴素算法
    • Rabin-Karp
    • 有限自动机
    • KMP算法

排序

快速排序

  • 时间复杂度O(nlogn)
  • 如果每次划分取得基准元素都是最大或者最小的元素,那么排序会退化至O(n2)
  • 如何改进?
    1. 避免最坏的情况,使用数组中的一个随机元素作为划分元素,这样出现最坏情况的几率就会相对很小
    2. 取出数组的左边元素,中间元素和右边元素,然后对这三个元素进行排序,然后以中间的元素作为基准值key

堆排序

  • 时间复杂度O(nlogn),调用一次Build-Max-Heap,再循环调用Max-Heapify
  • 调用Build-Max-Heap时间复杂度O(n)
  • n-1次调用Max-Heapify,每次的时间为O(logn)

计数排序

  • 时间复杂度O(n+k),实际工作中,k=O(n)时一般会采用计数排序
  • n个输入都是0-k的一个整数,k=O(n)时,排序运行时间为Θ(n)
  • 计数排序的基本思想是:对每一个输人元素x,确定小于x的元素个数,这样就可以直接把x放到它在输出数组中的位置上了
  • 计数排序是稳定的,所以计数排序通常会被用作基数排序的一个子过程

基数排序

  • 时间复杂度O(d(n+k)),n个数每个数有d位,每个数位有k个可能的取值
  • 其实就是对最高有d位数的数组,对每一位都调用计数排序一次,即进行d次计数排序
  • 从最低有效位开始排序
  • 为确保基数排序是正确的,一位数排序必须是稳定的
  • 在这里插入图片描述

桶排序

  • 时间复杂度O(n)
  • 桶排序(bucket sort)假设输入数据服从均匀分布,平均情况下它的时间代价为O(n)
  • 算法还需要一个临时数组B[0… n- 1]来存放链表(即桶)
  • 桶排序将[0,1)区间划分为n个相同大小的子区间,或称为桶。
  • 然后,将n个输入数分别放到各个桶中。
  • 因为输入数据是均匀、独立地分布在[0,1)区间上,所以一般不会出现很多数落在同一个桶中的情况。
  • 为了得到输出结果,我们先对每个桶中的数进行排序,然后遍历每个桶,按照次序把各个桶中的元素列出来即可。
  • 即使输入数据不服从均匀分布,桶排序也仍然可以线性时间内完成。只要输入数据满足下列性质:所有桶的大小的平方和与总的元素数呈线性关系,桶排序仍然能在线性时间完成。

SELECT算法

RANDOMIZED-SELECT

  • 时间复杂度Θ(n)
  • 可以确定一个有n>1个不同元素的输入数组中第i小的元素
  • 使用来自快排的确定性划分算法Partition
  • 划分的基准是随机选择的,这样可以一定程度避免极端情况
  • 与快排不同的是,快排会递归处理划分后的两边,而这里只处理划分的一边
  • 与快排类似,若划分每次都极端的选择最大/最小元素,那时间复杂度退化至Θ(n2)

SELECT

  • 时间复杂度O(n)
  • 此算法与RANDOMIZED-SELECT 类似, 区别在于该算法能保证得到对数组的一个好的划分
  • 在这里插入图片描述

图算法

广度优先搜索

  • 时间复杂度O(V+E)
  • Prim的最小生成树和Dijkstra的单源最短路径算法都使用了类似广度优先搜索的思想

深度优先搜索

  • 时间复杂度Θ(V+E)

Kruskal算法

  • 时间复杂度O(ElgV)
  • 每次选取图中一个最小权值的边,且不构成环路

Prim算法

  • 时间复杂度O(ElgV)
  • 每次选择一个最小权值边加入当前树中,且不构成环路

Bellman-Ford算法

  • 时间复杂度O(VE)

Dijkstra算法

  • 时间复杂度
    1. O(V2),结点编号维持最小优先队列
    2. O((V+E)lgV),若所有结点都可从源节点到达,则该时间为O(ElgV),二叉堆实现最小优先队列
    3. O(VlgV+E),斐波那契堆实现最小优先队列

Floyd-Warshall算法

  • 时间复杂度O(n3),n为顶点个数

Johnson算法

  • 时间复杂度O(V2lgV+VE)

Ford-Folkson方法

  • 时间复杂度O(E|f*|),|f*|为最大流大小

Edmonds-Karps算法

  • 时间复杂度O(VE2),使用BFS找增广路径

动态规划

钢条切割

  • 时间复杂度O(n2)

矩阵链乘法

  • 时间复杂度O(n3)

最长公共子序列

  • 时间复杂度O(nm),两个字符串的长度分别为m,n

最优二叉搜索树

  • 时间复杂度Θ(n3)

字符串匹配

m为匹配串长度,n为文本串长度,n≥m

朴素算法

  • 时间复杂度O(m(n-m+1))
  • 预处理时间:0

Rabin-Karp

  • 时间复杂度O(m(n-m+1))
  • 预处理时间:Θ(m)

有限自动机

  • 时间复杂度Θ(n)
  • 预处理时间:O(m|Σ|),|Σ|为字母表大小

KMP算法

  • 时间复杂度Θ(n)
  • 预处理时间:Θ(m)

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

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

相关文章

基于Redis实现的分布式锁

基于Redis实现的分布式锁什么是分布式锁分布式锁主流的实现方案Redis分布式锁Redis分布式锁的Java代码体现优化一:使用UUID防止误删除优化二:LUA保证删除原子性什么是分布式锁 单体单机部署中可以为一个操作加上锁,这样其他操作就会等待锁释…

网络安全-FOFA资产收集和FOFA API调用

网络安全-FOFA资产收集和FOFA API调用 前言 一,我也是初学者记录的笔记 二,可能有错误的地方,请谨慎 三,欢迎各路大神指教 四,任何文章仅作为学习使用 五,学习网络安全知识请勿适用于违法行为 学习网络安全…

Android OTA升级常见问题的解决方法

1.1 多服务器编译 OTA 报错 Android7 以后引入了 jack-server 功能,也导致在公共服务器上 编译 Android7 以上的版本时,会出现 j ack-server 报错问题。 在多用户服务器上 编译 dist 时 会出现编译过程中 会将 port_service 和 port_admin 改为 默认的 …

Go语言Web入门之浅谈Gin框架

Gin框架Gin简介第一个Gin示例HelloworldRESTful APIGin返回数据的几种格式Gin 获取参数HTTP重定向Gin路由&路由组Gin框架当中的中间件Gin简介 Gin 是一个用 Go (Golang) 编写的 web 框架。它是一个类似于 martini 但拥有更好性能的 API 框架,由于 httprouter&a…

MySQl----- 单表查询

表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 varchar…

【Spark分布式内存计算框架——Spark SQL】11. External DataSource(中)parquet 数据

6.3 parquet 数据 SparkSQL模块中默认读取数据文件格式就是parquet列式存储数据,通过参数【spark.sql.sources.default】设置,默认值为【parquet】。 范例演示代码:直接load加载parquet数据和指定parquet格式加载数据 import org.apache.s…

事物发展的不同阶段会有不同的状态

之前讨论过一个话题,有人问“股票交易稳定盈利很难么?” 我的回答:不难,难在之前。 这几天我又想到经常看到论坛里有人pk观点,最后甩出一句话:“证明你说得对,你先赚一个亿再说。否则&#xf…

写代码犹如写文章: “大师级程序员把系统当故事来讲,而不是当做程序来写” | 如何架构设计复杂业务系统? 如何写复杂业务代码?...

“大师级程序员把系统当故事来讲,而不是当做程序来写”写代码犹如写文章好的代码应该如好文章一样表达思想,被人读懂。中心思想: 突出明确程序是开发者用编程语言写成的一本书,首先应该是记录开发者对业务需求分析、系统分析,最终…

并发编程底层原理

并发编程 文章目录并发编程线程知识点回顾多线程并行和并发什么是并发编程?并发编程的根本原因?Java内存模型(JMM)并发编程的核心问题-可见性、有序性、原子性可见性有序性原子性并发问题总结volatile关键字volatile的底层原理如何…

K8s学习(二)Kubernetest的资源管理及五大资源介绍

文章目录前言1.kubernetes的资源管理系统资源查看2.资源管理方式3.资源管理实战3.1 Namespace3.2 Pod3.3 Label3.4 Deployment3.5 Service3.5.1创建集群内部可访问的Service3.5.2创建集群外部可访问的Service前言 本文是k8s学习系列文章,前后串起来是一个完整的课程…

一招鉴别真假ChatGPT,并简要介绍ChatGPT、GPT、GPT2和GPT3模型之间的区别和联系

以下内容除红色字体部分之外,其他均来源于ChatGPT自动撰写。 ChatGPT是基于GPT模型的对话生成模型,旨在通过对话模拟实现自然语言交互。它是为了改善人机对话体验而设计的,主要应用于聊天机器人、智能客服等场景。 与GPT模型相比,…

全栈之路-前端篇 | 第一讲.基础前置知识【浏览器内核与网络知识】学习笔记

欢迎关注「全栈工程师修炼指南」公众号 点击 👇 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习! 涉及 企业运维、网络安全、应用开发、物联网、人工智能、大数据 学习知识 “ 花开堪折直须折,莫待无花…

内大-oj练习题(1期)

用于存储内大oj练习题 1. 排序题2. 实数输出3. 字符串比较大小4. 1055 找最小放表头,找最大放表尾5. 通过反转实现数据移动6. 破圈报数7. 通话记录8. 用栈实现进制转换9. 判断升序10. 金额的中文大写11. 生日组成的素数12. 判断是否属于一个子网13 统计字符个数14. 求前n项和1…

LeetCode02.07面试题 链表相交 带有输入和输出的链表相交

题目: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意, 函…

Git的基本操作

文章目录1.git的工作流程2.git的工作环境3.git的基本操作(1)git init(2)git status(3)git add(4)git commit4.版本控制(1)git reflog与git log(2)再增加两个版本(3)git reset --hard 版本号(4)两个指针4.分支管理(1)对分支的理解(2)git branch和git branch -v(3)git checkout 分…

基于matlab的斜视模式下SAR建模

一、前言此示例说明如何使用线性 FM (LFM) 波形对基于聚光灯的合成孔径雷达 (SAR) 系统进行建模。在斜视模式下,SAR平台根据需要从宽侧斜视一定角度向前或向后看。斜视模式有助于对位于当前雷达平台位置前面的区域进行…

mysql EXPLAIN关键字

EXPLAIN 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。通过EXPLAIN,我们可以分析出以下结果: 表的读取顺序数据读取操作的操作类型哪些索引可以使用哪些索…

一文吃透SQL性能优化,阿里47条军规

目录1、先了解MySQL的执行过程2、数据库常见规范3、所有表必须使用Innodb存储引擎4、每个Innodb表必须有个主键5、数据库和表的字符集统一使用UTF86、查询SQL尽量不要使用select *,而是具体字段7、避免在where子句中使用 or 来连接条件8、尽量使用数值替代字符串类型…

【数据挖掘实战】——中医证型的关联规则挖掘

目录 一、背景和挖掘目标 1、问题背景 2、传统方法的缺陷 3、原始数据情况 4、挖掘目标 二、分析方法和过程 1、初步分析 2、总体过程 第1步:数据获取 第2步:数据预处理 第3步:构建模型 三、思考和总结 项目地址:Data…

YOLOv6-目标检测论文解读

文章目录摘要问题算法网络设计BackboneNeckHead标签分配SimOTA(YOLOX提出):TAL(Task alignment learning,TOOD提出)损失函数分类损失框回归损失目标损失行业有用改进自蒸馏图像灰度边界填充量化及部署实验消…