【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)。
      • 稳定性:不稳定。

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

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

相关文章

Docker换源加速(更换镜像源)详细教程(2025.2最新可用镜像,全网最详细)

文章目录 前言可用镜像源汇总换源方法1-临时换源换源方法2-永久换源(推荐)常见问题及对应解决方案1.换源后,可以成功pull,但是search会出错 补充1.如何测试镜像源是否可用2.Docker内的Linux换源教程 换源速通版(可以直…

华为云deepseek大模型平台:deepseek满血版

华为云硅基流动使用Chatbox接入DeepSeek-R1满血版671B 1、注册: 华为云deepseek大模型平台注册:https://cloud.siliconflow.cn/i/aDmz6aVN 说明:填写邀请码的话邀请和被邀请的账号都会获得2000 万 Tokens;2个帐号间不会与其他关联…

抓包工具是什么?

抓包工具是一种用于捕获和分析网络数据包的软件或硬件设备。它可以帮助用户监控网络通信过程,查看网络中传输的数据内容、协议类型、源地址、目的地址等信息。以下是关于抓包工具的一些详细解释: 1. 主要功能 捕获数据包:抓包工具能够实时捕…

51c大模型~合集71

我自己的原文哦~ https://blog.51cto.com/whaosoft/12260659 #大模型推理加速技术的学习路线 EfficientQAT 可以在 41 小时内在单个 A100-80GB GPU 上完成对 2-bit Llama-2-70B 模型的量化感知训练。与全精度模型相比,精度仅下降了不到 3%(69.48 v…

OpenBMC:BmcWeb实例化App

BmcWeb是OpenBMC的一个核心模块,对外负责响应Redfish请求,并且由于OpenBMC的Web使用的Redfish api,所以BmcWeb也是Web的后台。 1.main函数 //src\webserver_main.cpp #include "webserver_run.hpp"int main(int /*argc*/, char**…

利用AI优化可再生能源管理:Python让绿色能源更高效

利用AI优化可再生能源管理:Python让绿色能源更高效 引言 在全球气候变化和能源危机的背景下,可再生能源的利用变得尤为重要。然而,可再生能源的管理和优化面临诸多挑战,如能源生产的不稳定性和能源需求的波动性。幸运的是&#…

改BUG:Mock测试的时候,when失效

问题再现: 这里我写了一测试用户注册接口的测试类,并通过when模拟下层的服务,但实际上when并没有奏效,还是走了真实的service层的逻辑。 package cn.ac.evo.review.test;import cn.ac.evo.review.user.UserMainApplication; imp…

单片机 code RO-data RW-data ZI-data以及OTA学习

带着问题去学习:这些数据是什么?分别放在哪里, 是什么:我个人的理解 code 和RO-data 分别是代码和只读数据,RW-data以及ZI-data分别是读写数据和初始化数据。 codeRO-data的大小正好是所占用ROM的大小,RO…

什么是LoRA微调

LoRA是大模型微调方法的一种,它的特点是只在模型的 部分权重(如 QKV 矩阵) 上 添加可训练参数 通过 低秩矩阵(AB) 来优化参数更新 优点: 极大降低显存消耗(deepseek 7B 只需 10GB) 适…

EasyRTC低延迟通信与智能处理:论嵌入式WebRTC与AI大模型的技术融合

在当今数字化时代,实时通信的需求日益增长,视频通话作为一种高效、直观的沟通方式,广泛应用于各个领域。WebRTC技术的出现,为实现浏览器之间的实时音视频通信提供了便捷的解决方案。而基于WebRTC技术的EasyRTC视频通话SDK&#xf…

10、k8s对外服务之ingress

service和ingress的作用 service的作用 NodePort:会在每个节点开放一个端口,端口号30000-32767。 也是只能用于内网访问,四层转发。实现负载均衡。不能基于域名进行访问。 clusterip:service的默认类型,只能在集群…

Java数据结构---栈

目录 一、栈的概念 二、栈的基本方法 三、栈的模拟实现 四、栈的练习 1、括号匹配 2、出栈入栈次序匹配 一、栈的概念 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底…

从CNN到Transformer:遥感影像目标检测的未来趋势

文章目录 前言专题一、深度卷积网络知识专题二、PyTorch应用与实践(遥感图像场景分类)专题三、卷积神经网络实践与遥感影像目标检测专题四、卷积神经网络的遥感影像目标检测任务案例【FasterRCNN】专题五、Transformer与遥感影像目标检测专题六、Transfo…

php-fpm

摘要 php-fpm(fastcgi process manager)是PHP 的FastCGI管理器,管理PHP的FastCGI进程,提升PHP应用的性能和稳定性 php-fpm是一个高性能的php FastCGI管理器,提供了更好的php进程管理方式,可以有效的控制内存和进程,支…

Python strip() 方法详解:用途、应用场景及示例解析(中英双语)

Python strip() 方法详解:用途、应用场景及示例解析 在 Python 处理字符串时,经常会遇到字符串前后存在多余的空格或特殊字符的问题。strip() 方法就是 Python 提供的一个强大工具,专门用于去除字符串两端的指定字符。本文将详细介绍 strip(…

open webui 部署 以及解决,首屏加载缓慢,nginx反向代理访问404,WebSocket后端服务器链接失败等问题

项目地址:GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 选择了docker部署 如果 Ollama 在您的计算机上,请使用以下命令 docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gatewa…

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…

VMware安装Centos 9虚拟机+设置共享文件夹+远程登录

一、安装背景 工作需要安装一台CentOS-Stream-9的机器环境,所以一开始的安装准备工作有: vmware版本:VMware Workstation 16 镜像版本:CentOS-Stream-9-latest-x86_64-dvd1.iso (kernel-5.14.0) …

C/C++ 中 volatile 关键字详解

volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊…

处理器架构、单片机、芯片、光刻机之间的关系

这些术语都涉及到半导体和电子设备的设计与制造,但它们的含义和作用有所不同。下面我会逐个解释,并描述它们之间的关系: 1. 处理器架构 (Processor Architecture) 处理器架构指的是处理器(CPU)的设计原理和结构。它定…