当前位置: 首页 > news >正文

算法面试小抄

第一章:算法与数据结构要点速学

1.时间复杂度 (大 O)

首先,我们来谈谈常用操作的时间复杂度,按数据结构/算法划分。然后,我们将讨论给定输入大小的合理复杂性。

数组(动态数组/列表)

规定 n = arr.length,

注意: 𝑂(1)O(1) 操作相对于 n 是常数.实际上,哈希算法可能代价很高。例如,如果你的键是字符串,那么它将花费 𝑂(𝑚)O(m),其中 𝑚m 是字符串的长度。 这些操作只需要相对于哈希映射大小的常数时间。

上面的说明也适用于这里。

  • 在结尾添加或删除元素: 𝑂(1)O(1) 相关讨论

  • 从任意索引中添加或删除元素: 𝑂(𝑛)O(n)

  • 访问或修改任意索引处的元素: 𝑂(1)O(1)

  • 检查元素是否存在: 𝑂(𝑛)O(n)

  • 双指针: 𝑂(𝑛⋅𝑘)O(n⋅k), 𝑘k 是每次迭代所做的工作,包括滑动窗口

  • 构建前缀和: 𝑂(𝑛)O(n)

  • 求给定前缀和的子数组的和:𝑂(1)O(1)


    字符串 (不可变)

    规定 n = s.length,

  • 添加或删除字符: 𝑂(𝑛)O(n)
  • 任意索引处的访问元素: 𝑂(1)O(1)
  • 两个字符串之间的连接: 𝑂(𝑛+𝑚)O(n+m), 𝑚m 是另一个字符串的长度
  • 创建子字符串: 𝑂(𝑚)O(m), 𝑚m 是子字符串的长度
  • 双指针: 𝑂(𝑛⋅𝑘)O(n⋅k), 𝑘k 是每次迭代所做的工作,包括滑动窗口
  • 通过连接数组、stringbuilder 等构建字符串:𝑂(𝑛)O(n)

    链表

    给定 𝑛n 作为链表中的节点数,

  • 给定指针位置的后面添加或删除元素: 𝑂(1)O(1)
  • 如果是双向链表,给定指针位置添加或删除元素: 𝑂(1)O(1)
  • 在没有指针的任意位置添加或删除元素: 𝑂(𝑛)O(n)
  • 无指针任意位置的访问元素: 𝑂(𝑛)O(n)
  • 检查元素是否存在: 𝑂(𝑛)O(n)
  • 在位置 i 和 j 之间反转: 𝑂(𝑗−𝑖)O(j−i)
  • 使用快慢指针或哈希映射完成一次遍历: 𝑂(𝑛)O(n)

    哈希表/字典

    给定 n = dic.length,

  • 添加或删除键值对: 𝑂(1)O(1)
  • 检查 key 是否存在: 𝑂(1)O(1)
  • 检查值是否存在: 𝑂(𝑛)O(n)
  • 访问或修改与 key 相关的值: 𝑂(1)O(1)
  • 遍历所有键值: 𝑂(𝑛)O(n)

    集合

    给定 n = set.length,

  • 添加或删除元素: 𝑂(1)O(1)
  • 检测元素是否存在: 𝑂(1)O(1)

栈操作依赖于它们的实现。栈只需要支持弹出和推入。如果使用动态数组实现:

给定 n = stack.length,

注意:大多数编程语言实现队列的方式比简单的双链表更复杂。根据实现的不同,通过索引访问元素可能比 𝑂(𝑛)O(n) 快,但有一个重要的常量除数。

  • 推入元素: 𝑂(1)O(1)
  • 弹出元素: 𝑂(1)O(1)
  • 查看 (查看栈顶元素): 𝑂(1)O(1)
  • 访问或修改任意索引处的元素: 𝑂(1)O(1)
  • 检测元素是否存在: 𝑂(𝑛)O(n)

    队列

    队列操作依赖于它们的实现。队列只需要支持出队列和入队列。如果使用双链表实现:

    给定 n = queue.length,

  • 入队的元素: 𝑂(1)O(1)
  • 出队的元素: 𝑂(1)O(1)
  • 查看 (查看队列前面的元素): 𝑂(1)O(1)
  • 访问或修改任意索引处的元素: 𝑂(𝑛)O(n)
  • 检查元素是否存在: 𝑂(𝑛)O(n)

二叉树问题 (DFS/BFS)

给定 𝑛n 作为树的节点数,

大多数算法的时间复杂度为 𝑂(𝑛⋅𝑘)O(n⋅k),𝑘k 是在每个节点上做的操作数, 通常是 𝑂(1)O(1)。这只是一个普遍规律,并非总是如此。我们在这里假设 BFS 是用高效队列实现的。


二叉搜索树

给定 𝑛n 作为树中的节点数,

  • 添加或删除元素:最坏的情况下 𝑂(𝑛)O(n),平均情况 𝑂(log⁡𝑛)O(logn)
  • 检查元素是否存在:最坏的情况下 𝑂(𝑛)O(n),平均情况 𝑂(log⁡𝑛)O(logn)

平均情况是当树很平衡时 —— 每个深度都接近满。最坏的情况是树只是一条直线。


堆/优先队列

给定 n = heap.length 并讨论最小堆,

  • 添加一个元素: 𝑂(log⁡𝑛)O(logn)
  • 删除最小的元素: 𝑂(log⁡𝑛)O(logn)
  • 找到最小的元素: 𝑂(1)O(1)
  • 查看元素是否存在: 𝑂(𝑛)O(n)

二分查找

在最坏的情况下,二分查找的时间复杂度为 𝑂(log⁡𝑛)O(logn),其中 𝑛n 是初始搜索空间的大小。


其他

  • 排序: 𝑂(𝑛⋅log⁡𝑛)O(n⋅logn), 其中 𝑛n 是要排序的数据的大小
  • 图上的 DFS 和 BFS:𝑂(𝑛⋅𝑘+𝑒)O(n⋅k+e),其中 𝑛n 是节点数,𝑒e 是边数,前提是每个节点处理花费都是 𝑂(1)O(1),不需要重复遍历。
  • DFS 和 BFS 空间复杂度:通常为 𝑂(𝑛)O(n),但如果它在图形中,则可能为 𝑂(𝑛+𝑒)O(n+e) 来存储图形
  • 动态规划时间复杂度:𝑂(𝑛⋅𝑘)O(n⋅k),其中 𝑛n 是状态数,𝑘k 是每个状态所需要的操作数
  • 动态规划空间复杂度:𝑂(𝑛)O(n),其中𝑛n是状态数

2.输入大小与时间复杂度

3.排序算法

4. 通用 DS/A 流程图

第二章:算法题代码模板

第二章:算法面试详解

相关文章:

算法面试小抄

第一章:算法与数据结构要点速学 1.时间复杂度 (大 O) 首先,我们来谈谈常用操作的时间复杂度,按数据结构/算法划分。然后,我们将讨论给定输入大小的合理复杂性。 数组(动态数组/列表) 规定 n arr.length, 注意: &am…...

当有违法数据时,浏览器不解析,返回了undefined,导致数据不解析

现象:页面上没有看到数据 排查:断点到线上的源码里:1、协议回调确实没有拿到数据是个undefined 2、network里看服务确实响应了数据 3、控制台没有任何报错。 心情:莫名其妙的现象 我本地有json格式化工具,copy进去后&…...

在MySQL中ORDER BY使用的那种排序算法

在 MySQL 中,ORDER BY 子句的排序算法通常根据场景、数据量和表的索引情况而有所不同。MySQL 常用的排序算法包括: 文件排序(File Sort):MySQL 没有使用索引排序的情况下,会进行文件排序,这可以…...

学习threejs,使用粒子实现雨滴特效

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.Points简介1.11 ☘️…...

分布式-单元化架构1

一 两地三中心 1.1 两地三中心* 两地指的是两个城市:同城,异地。三中心指的是三个数据中心:生产中心、同城容灾中心、异地容灾中心。 在同一个城市或者临近的城市建设两个相同的系统,双中心具备相当的业务处理能力,…...

C++模板、STL

目录 一、模板 1、函数模板 (1)、基本语法和使用 (2)、函数模板注意事项 (3)、普通函数与函数模板的区别 (4)、普通函数与函数模板的调用规则 (5)、模板的局限性 2、类模板 (1)、基本语法 (2)、类模板与函数模板区别 (3)、类模板中成员函数创建时机 (4)、类模板对象…...

计算机视觉中的点算子:从零开始构建

Hey小伙伴们!今天我们要聊的是一个非常基础但极其重要的计算机视觉技术——点算子(Point Operators)。点算子主要用于对图像的每个像素进行独立的处理,比如亮度调整、对比度增强、灰度化等。通过这些简单的操作,我们可…...

国际中文教育知识图谱问答

你还在为毕业设计头疼么?想快速搭建一个智能化系统,展示数据又能精准回答问题?那你绝对不能错过这个超实用的 知识图谱问答系统,特别适用于需要整合复杂数据关系、交互性强的项目! 这个系统基于 Neo4j图数据库 开发&a…...

酒店大板轻触开关与传统的开关有什么区别

酒店大板轻触开关与传统的开关在功能、设计、使用方式以及安装维护等多个方面都存在显著的差异。以下是对这些差异的详细分析: 功能差异 酒店大板轻触开关: 多功能性:酒店大板轻触开关通常集成了多种功能,如控制照明、窗帘、夜灯、…...

【蓝桥杯选拔赛真题78】python电话号码 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python电话号码 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python电话号码 第十五届蓝桥杯青少年组python比赛选拔赛真题 一、题目要…...

对比两个json串的diff,支持map的深度递归

背景 项目重构,对老接口进行技术改造。动代码后,难免会有些bug,我们需要对比改造前后接口的返回,来判断逻辑是否有问题,这就涉及两个json的对比。 常规的diff文本工具是按行对比,无法处理复杂的map。本文通…...

【我的创作纪念日1024】

我的创作纪念日1024 机缘成就明年的规划 机缘 过去的1024个日子里,我在专业发展、职场和发展、科技创新创业、软件开发、人工智能、虚拟现实、区块链等栏目分享了一些工作和学习的建议和体会。尤其是在2022年,我连续发布100篇的博文,不仅仅是…...

萤石设备视频接入平台EasyCVR私有化视频平台变电站如何实现远程集中监控?

一、方案背景 随着城市经济的发展和电力系统的改造,变电站的数量和规模逐渐增加,对变电站的安全管理和监控需求也越来越高。视频监控系统作为重要的安全管理手段,在变电站中起到了关键的作用。 目前青犀视频研发的萤石设备视频接入平台EasyC…...

什么是多线程?请描述 Java 中实现多线程的基本方式?

今天和大家探讨一下 Java 中的多线程,包括它的基本概念、实现方式以及一些实际开发中的注意事项。 什么是多线程? 多线程是指在一个程序中存在多个执行流,每个执行流都可以独立于其他执行流执行。 在 Java 中,多线程允许开发者…...

Dynamic Sparse No Training: Training-Free Fine-tuning for Sparse LLMs

大语言模型(LLM)在设备上部署道路上落下了一个令人生畏的障碍。本文关注于大语言模型的剪枝算法。 动态稀疏训练(Dynamic Sparse Training,DST)是一种近期收到广泛关注的剪枝算法。与之前大部分剪枝方法需要训练整个网…...

解决n+1查询数据库问题

文章目录 1. 问题描述2. 解决方法3. 总结 1. 问题描述 在写项目中,可能会碰到一个问题:通过查询表A得到一个list结果,再对list中的n个元素各查询一次关联的表B。形成对数据库执行n1次查询。这种代码会无形增加数据库的处理负担,影…...

DICOM 基础知识:深入理解DICOM数据结构与标签说明

目录 DICOM 图像概念 DICOM 图像关键特性: DICOM 文件结构 常见数据元素: 数据元素示例详解 DICOM-VR 数据类型说明 DICOM 标准支持的数据集 结语 DICOM 图像概念 DICOM(Digital Imaging and Communications in Medicine&…...

Git - 如何删除 push 过一次的文件链路追踪?

(以 target 文件夹为例)如果你已经在 .gitignore 中添加了 target/ 目录,但 target 文件夹仍然出现在 Git 的变更列表中,可能是因为它之前已经被添加到 Git 仓库中。即使你更新了 .gitignore,Git 仍然会跟踪这些文件。…...

软件测试学习总结

一.软件测试概念和目的 软件测试的概念: 测试模型(V模型) 软件测试就是在软件投入运行前,对软件需求分析、设计规格说明和编码实现的最终审查,它是软件质量保证的关键步骤。 通常对软件测试的定义有两种描述: 定义1:软件测试是为了发现错误而执行程序的过程 定义2:…...

c语言错题——#define对应的查找替换

文章目录 一、题目 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目 分析 结构体向最长的char对齐,前两个位段元素一共42位,不足8位,合起来占1字节,最后一个单独1字节,一共3字节。另外…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...