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

【Java八股文】10-数据结构与算法面试篇

【Java八股文】10-数据结构与算法面试篇

  • 数据结构与算法面试题
  • 数据结构
    • 红黑树说一下
    • 跳表说一下?
    • LRU是什么?如何实现?
    • 布隆过滤器怎么设计?时间复杂度?
  • 排序算法
    • 排序算法及空间复杂度


数据结构与算法面试题

数据结构

红黑树说一下

红黑树(Red-Black Tree)是一种自平衡的二叉搜索树,它在插入和删除操作后能够通过旋转和重新着色来保持树的平衡。红黑树的特点如下:

  • 每个节点都有一个颜色,红色或黑色。
  • 根节点是黑色的。
  • 每个叶子节点(NIL节点)都是黑色的。
  • 如果一个节点是红色的,则它的两个子节点都是黑色的。
  • 从根节点到叶子节点或空子节点的每条路径上,黑色节点的数量是相同的。

红黑树通过这些特性来保持树的平衡,确保最长路径不超过最短路径的两倍,从而保证了在最坏情况下的搜索、插入和删除操作的时间复杂度都为O(logN)。epoll 用了红黑树来保存监听的 socket。

跳表说一下?

跳表(Skip List)是一种基于链表的数据结构,它通过添加多层索引来加速搜索操作。

  • 跳表中的数据是有序的。
  • 跳表中的每个节点都包含一个指向下一层和右侧节点的指针

跳表通过多层索引的方式来加速搜索操作。最底层是一个普通的有序链表,而上面的每一层都是前一层的子集,每个节点在上一层都有一个指针指向它在下一层的对应节点。这样,在搜索时可以通过跳过一些节点,直接进入目标区域,从而减少搜索的时间复杂度。

跳表的平均搜索、插入和删除操作的时间复杂度都为O(logN),但空间复杂度稍高。跳表常用于需要高效搜索和插入操作的场景,如数据库、缓存等。redis 用了跳表来实现 zset。

LRU是什么?如何实现?

LRU 是一种缓存淘汰算法,当缓存空间已满时,优先淘汰最长时间未被访问的数据。

实现的方式是哈希表+双向链表结合。

在这里插入图片描述

  • 使用哈希表存储数据的键值对,键为缓存的键,值为对应的节点。
  • 使用双向链表存储数据节点,链表头部为最近访问的节点,链表尾部为最久未访问的节点。
  • 当数据被访问时,如果数据存在于缓存中,则将对应节点移动到链表头部;如果数据不存在于缓存中,则将数据添加到缓存中,同时创建一个新节点并插入到链表头部。
  • 当缓存空间已满时,需要淘汰最久未访问的节点,即链表尾部的节点。

上面这种思想方式,LRU 算法可以在 O(1) 的时间复杂度内实现数据的插入、查找和删除操作。

布隆过滤器怎么设计?时间复杂度?

布隆过滤器」可以用来解决类似的问题,具有运行快速,内存占用小的特点,它是一个保存了很长的二级制向量,同时结合 Hash 函数实现的。

而高效插入和查询的代价就是,它是一个基于概率的数据结构,只能告诉我们一个元素绝对不在集合内,对于存在集合内的元素有一定的误判率。

  • 初始化:当我们创建一个布隆过滤器时,我们首先创建一个全由0组成的位数组(bit array)。同时,我们还需选择几个独立的哈希函数,每个函数都可以将集合中的元素映射到这个位数组的某个位置。
  • 添加元素:在布隆过滤器中添加一个元素时,我们会将此元素通过所有的哈希函数进行映射,得到在位数组中的几个位置,然后将这些位置标记为1。
  • 查询元素:如果我们要检查一个元素是否在集合中,我们同样使用这些哈希函数将元素映射到位数组中的几个位置,如果所有的位置都被标记为1,那么我们就可以说该元素可能在集合中。如果有任何一个位置不为1,那么该元素肯定不在集合中

排序算法

排序算法及空间复杂度

  • 插入类排序:
    • 直接插入排序:将待排序元素逐个插入到已排序序列的合适位置,形成有序序列。
      • 时间复杂度:平均为O(N2),最好情况下为O(N),最坏情况下为O(N2)。
      • 空间复杂度:因为每回只移动一个所以空间复杂度为O(1)。
      • 稳定性:稳定。
    • 折半插入排序:将排好元素一分为二来进行查找插入的位置。
      • 时间复杂度:平均为O(N^2),最好情况下为O(NlogN),最坏情况下为O(N2)。
      • 空间复杂度:因为每回只移动一个所以空间复杂度为O(1)。
      • 稳定性:稳定。
    • 希尔排序:将待排数组分成若干个稀疏的子序列,分别进行直接插入排序,使得稀疏的子序列较为有序,然后再全部进行次直接插入排序,即可完成。
      • 时间复杂度:业界统一认为为O(N^1.3)。
      • 空间复杂度:因为每回只移动一个所以空间复杂度为O(1)
      • 稳定性:不稳定。
  • 交换类排序
    • 冒泡排序:在扫描的过程中顺次比较相邻的两个元素的大小,若逆序就交换位置。
      • 时间复杂度:平均为O(N2),最好情况下为O(N),最坏情况下为O(N2)。
      • 空间复杂度:因为每回只移动一个所以空间复杂度为O(1)。
      • 稳定性:稳定。
    • 快速排序
      • 时间复杂度:平均为O(NlogN),最好情况下为O(NlogN),最坏情况下为O(N^2)。
      • 空间复杂度:使用递归进行深搜,所以为O(NlogN)。
      • 稳定性:不稳定。
  • 选择排序
    • 简单选择排序:从第一个记录开始,通过n-1次关键字比较,从n个记录中选择出关键字最小的记录,并和第一个记录进行比较。
      • 时间复杂度:平均为O(N2),最好情况下为O(N2),最坏情况下为O(N^2)。
      • 空间复杂度:因为每回只移动一个所以空间复杂度为O(1)。
      • 稳定性:不稳定。
    • 堆排序:把待排序的数字看成一颗完全二叉树的顺序表示,每个结点表示一个记录,第一个记录作为二叉树的根,对剩下的记录依次逐层从左到右顺序排序,(i从0开始)任意节点r[i]的左孩子是r[2r+1],右孩子是r[2i+2],双亲是r[(i+1)/2-1]。对这颗完全二叉树进行调整。大根堆: r[i]>r[2i+1]且r[i]>r[2i+2],也就是父节点大于孩子节点的完全二叉树称为大根堆。
      • 时间复杂度:平均为O(NlogN),最好情况下为O(NlogN),最坏情况下为O(NlogN)。
      • 空间复杂度:因为每回只移动一个所以空间复杂度为O(1)。
      • 稳定性:不稳定。

相关文章:

【Java八股文】10-数据结构与算法面试篇

【Java八股文】10-数据结构与算法面试篇 数据结构与算法面试题数据结构红黑树说一下跳表说一下?LRU是什么?如何实现?布隆过滤器怎么设计?时间复杂度? 排序算法排序算法及空间复杂度 数据结构与算法面试题 数据结构 红…...

go 并发 gorouting chan channel select Mutex sync.One

goroutine // head&#xff1a; 前缀 index&#xff1a;是一个int的指针 func print(head string, index *int) {for i : 0; i < 5; i {// 指针对应的int *indexfmt.Println(*index, head, i)// 暂停1stime.Sleep(1 * time.Second)} }/* Go 允许使用 go 语句开启一个新的运…...

亲测Windows部署Ollama+WebUI可视化

一. Ollama下载 登录Ollama官网(Ollama)点击Download进行下载 如果下载很慢可用以下地址下载&#xff1a; https://github.com/ollama/ollama/releases/download/v0.5.7/OllamaSetup.exe 在DeepSeek官网上&#xff0c;你可以直接点击【model】 到达这个界面之后&#xff0c;…...

linux 安装启动zookeeper全过程及遇到的坑

1、下载安装zookeeper 参考文章&#xff1a;https://blog.csdn.net/weixin_48887095/article/details/132397448 2、启动失败 1、启动失败JAVA_HOME is not set and java could not be found in PATH 已安装 JAVA 配置了JAVA_HOME,还是报错解决方法&#xff1a;参考&#xf…...

策略模式Spring框架下开发实例

策略类Spring框架下开发实例 先列出策略模式下需要那些类: 策略接口 (Strategy)&#xff0c;定义所有策略类必须遵循的行为。 具体策略类&#xff08;如 ConcreteStrategyA、ConcreteStrategyB&#xff09;&#xff0c;实现不同的算法或行为。 上下文类 (Context)&#xff0c;…...

DeepSeek模型量化

技术背景 大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;&#xff0c;可以通过量化&#xff08;Quantization&#xff09;操作来节约内存/显存的使用&#xff0c;并且降低了通讯开销&#xff0c;进而达到加速模型推理的效果。常见的就是把Float16的浮…...

【练习】【回溯:组合:不同集合】力扣 17. 电话号码的字母组合

题目 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “2…...

分布式文件系统HDFS

一、HDFS简介 HDFS&#xff08; Hadoop Distributed File System &#xff09;&#xff0c;意为&#xff1a;Hadoop分布式文件系统。是Apache Hadoop核心组件之一&#xff0c;作为大数据生态圈最底层的分布式存储服务而存在。分布式文件系统解决大数据如何存储问题。分布式意味…...

从WebRTC到EasyRTC:嵌入式适配的视频通话SDK实现低延迟、高稳定性音视频通信

WebRTC最初是为浏览器之间的实时通信设计的&#xff0c;其资源需求和复杂性可能对嵌入式设备的性能提出较高要求&#xff0c;因此在嵌入式系统中应用时面临一些挑战&#xff1a; 1&#xff09;资源消耗较高 CPU和内存占用&#xff1a;WebRTC是一个功能强大的实时通信框架&…...

WordPress自定义排序插件:Simple Custom Post Order完全指南(SEO优化版)

在WordPress建站中&#xff0c;文章、分类目录或页面的默认排序方式往往无法满足个性化需求。WordPress自定义排序插件&#xff1a;Simple Custom Post Order插件&#xff0c;你可以轻松实现拖拽式自定义排序&#xff0c;无需修改代码即可优化内容展示逻辑。本文将详细介绍这款…...

docker安装ros2 并在windows中显示docker内ubuntu系统窗口并且vscode编程

这里包括docker desktop安装ros2 humble hawkshill , 安装xserver(用来在windows中显示ubuntu中窗口), vscode安装插件连接docker并配置python的一系列方法 1.安装xserver 为了能方便的在windows中显示ubuntu内的窗口,比如rqt窗口 参考文章:https://www.cnblogs.com/larva-zhh…...

【QT中的一些高级数据结构,持续更新中...】

QT中有一些很精妙、便捷的设计&#xff0c;在了解这些数据的同时&#xff0c;我们可以学到如何更好的设计代码。本贴持续更新中&#xff0c;欢迎关注和收藏 一 QScopedPointer主要特点&#xff1a;示例代码 二 Q_DISABLE_COPY 一 QScopedPointer QScopedPointer 是 Qt 中的一种…...

简单工厂模式 (Simple Factory Pattern) 在Spring Boot 中的应用

简单工厂模式&#xff08;Simple Factory Pattern&#xff09;虽然不属于 GoF 23 种经典设计模式&#xff0c;但在实际开发中非常常用&#xff0c;尤其是在 Spring Boot 项目中。它提供了一种简单的方式来创建对象&#xff0c;将对象的创建逻辑集中到一个工厂类中。 一、简单工…...

《95015网络安全应急响应分析报告(2024)》

2025年2月&#xff0c;95015服务平台发布了最新一期的《95015网络安全应急响应分析报告&#xff08;2024&#xff09;》。报告分别从整体形势、受害者特征、攻击者特征等方面&#xff0c;对2024年95015平台接报的739起网络安全应急响应事件展开分析&#xff0c;并给出了7个年度…...

TensorFlow v2.16 Overview

TensorFlow v2.16 Overview 一、模块 Modules二、类 Classes三、函数 Functions TensorFlow v2.16.1 Overview 一、模块 Modules 模块是TensorFlow中组织代码的一种方式&#xff0c;将相关的功能和类封装在一起&#xff0c;方便用户使用和管理。每个模块都提供了特定领域的公共…...

Udp发送和接收数据(python和QT)

服务端代码 (python) import socketdef udp_server(host0.0.0.0, port12345):# 创建一个UDP套接字sock socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定服务器的IP地址和端口号sock.bind((host, port))print(f"UDP服务器已启动&#xff0c;监听端口 {port}...&…...

element-plus 根据条件显示多选框

代码如下&#xff1a; <el-table :data"pager.lists" selection-change"handleSelectionChange" row-key"id" :tree-props"{ checkStrictly: true }" :cell-class-name"cellClass"> <el-table-column type"s…...

Ubuntu 22.04 Install deepseek

前言 deepseekAI助手。它具有聊天机器人功能&#xff0c;可以与用户进行自然语言交互&#xff0c;回答问题、提供建议和帮助解决问题。DeepSeek 的特点包括&#xff1a; 强大的语言理解能力&#xff1a;能够理解和生成自然语言&#xff0c;与用户进行流畅的对话。多领域知识&…...

DeepSeek赋能智慧文旅:新一代解决方案,重构文旅发展的底层逻辑

DeepSeek作为一款前沿的人工智能大模型&#xff0c;凭借其强大的多模态理解、知识推理和内容生成能力&#xff0c;正在重构文旅产业的发展逻辑&#xff0c;推动行业从传统的经验驱动向数据驱动、从人力密集型向智能协同型转变。 一、智能服务重构&#xff1a;打造全域感知的智…...

小程序的分包

1.分包的概念以及基本用法 2.在小程序项目里面添加自己的分包 3.给分包加上别名 4.查看分包体积大小 5.分包的打包原则 6.分包的引用原则 7.独立分包 8.分包的预下载...

自适应Hopf振荡器调参避坑指南:如何让外骨骼步态生成更平滑、更稳定?

自适应Hopf振荡器调参避坑指南&#xff1a;如何让外骨骼步态生成更平滑、更稳定&#xff1f; 外骨骼机器人的步态生成一直是控制领域的核心挑战。当工程师们尝试将自适应Hopf振荡器应用于实际项目时&#xff0c;常会遇到输出波形抖动、收敛速度慢等问题。本文将从工程实践角度&…...

丢包率不高但应用仍然卡顿?一次基于 tcpdump +RTT抽样的网络性能排障实战

丢包率不高但应用仍然卡顿&#xff1f;一次基于 tcpdump RTT 抽样的网络性能排障实战 在很多生产环境里&#xff0c;网络问题最容易被“表面指标”误导。监控看起来并不糟&#xff1a;带宽没打满、CPU 没爆、接口错误包不多、平均丢包率也几乎为零&#xff0c;但业务侧就是持续…...

Mac/Windows跨系统协作必看:GoLand里‘Contents are identical’的诡异提示,我是这样解决的

Mac/Windows跨系统协作开发&#xff1a;彻底解决GoLand中‘Contents are identical’的行分隔符陷阱 团队协作开发中&#xff0c;你是否经历过这样的场景&#xff1a;明明没有修改代码&#xff0c;GoLand的Git面板却显示所有文件都被标记为红色修改状态&#xff1f;更诡异的是…...

UE4/UE5委托实战避坑指南:从触发开关灯到跨Actor通信,手把手教你选对类型

UE4/UE5委托实战避坑指南&#xff1a;从触发开关灯到跨Actor通信 在虚幻引擎开发中&#xff0c;委托系统是实现对象间通信的核心机制之一。很多中级开发者在实际项目中都会遇到这样的困惑&#xff1a;明明功能实现了&#xff0c;却在某些情况下出现崩溃或内存泄漏&#xff1b;或…...

手把手教你用Python PyVISA连接Keysight示波器,实现数据自动采集与可视化

Python PyVISA实战&#xff1a;Keysight示波器数据采集与可视化全流程解析 当实验室里的Keysight示波器屏幕不断闪烁&#xff0c;而你需要连续记录数百组波形数据时&#xff0c;手动操作不仅效率低下&#xff0c;还容易出错。这就是Python PyVISA展现价值的时刻——通过几行代码…...

Real-ESRGAN-GUI终极指南:如何快速实现AI图像超分辨率增强

Real-ESRGAN-GUI终极指南&#xff1a;如何快速实现AI图像超分辨率增强 【免费下载链接】Real-ESRGAN-GUI Lovely Real-ESRGAN / Real-CUGAN GUI Wrapper 项目地址: https://gitcode.com/gh_mirrors/re/Real-ESRGAN-GUI Real-ESRGAN-GUI是一款基于Flutter开发的跨平台桌面…...

【VSCode 2026跨端调试终极指南】:覆盖Web/iOS/Android/Windows/macOS五端,实测性能提升47%的调试链路重构方案

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;VSCode 2026跨端调试架构全景概览 VSCode 2026 引入了全新的跨端调试抽象层&#xff08;Cross-Platform Debug Abstraction Layer, CPDAL&#xff09;&#xff0c;统一管理 Web、桌面&#xff08;Elec…...

机器人控制系统中工控机的选型要点(2026新版)

阿强带你了解机器人控制系统中工控机的选型要点。机器人控制系统是机器人的核心&#xff0c;而工控机又是机器人控制系统的核心。工控机的选型直接决定了机器人控制系统的性能、稳定性和可靠性。很多人在选型的时候&#xff0c;往往只关注处理器的主频和核心数&#xff0c;忽略…...

9月特努斯接任苹果CEO,能否化解AI焦虑、续写苹果辉煌?

苹果换帅&#xff01;约翰特努斯接任CEO&#xff0c;能否化解AI焦虑、续写苹果辉煌&#xff1f;今年9月&#xff0c;约翰特努斯&#xff08;John Ternus&#xff09;将接替蒂姆库克&#xff08;Tim Cook&#xff09;出任苹果CEO。在刚刚举行的员工大会上&#xff0c;这位素来低…...

R语言pls包实战:手把手教你用偏最小二乘(PLS)搞定高维数据回归(附完整代码与数据标准化避坑指南)

R语言pls包实战&#xff1a;手把手教你用偏最小二乘(PLS)搞定高维数据回归&#xff08;附完整代码与数据标准化避坑指南&#xff09; 当你面对一份包含数十个自变量的数据集时&#xff0c;传统线性回归往往会陷入"维度诅咒"。这时偏最小二乘回归(PLS)就像一把瑞士军刀…...