【剑指Offer刷题系列】数据流中的中位数
目录
- 问题描述
- 示例
- 示例 1:
- 思路解析
- 方法一:使用两个堆(最大堆和最小堆)
- 核心思路
- 详细步骤
- 示例分析
- 优势
- 适用场景
- 代码实现
- Python 实现(方法一:使用两个堆)
- 测试代码
- 复杂度分析
- 方法一:使用两个堆
- 时间复杂度
- 空间复杂度
- 结论
问题描述
中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。
例如,
[2,3,4]
的中位数是3
[2,3]
的中位数是(2 + 3) / 2 = 2.5
设计一个支持以下两种操作的数据结构:
void addNum(int num)
- 从数据流中添加一个整数到数据结构中。double findMedian()
- 返回目前所有元素的中位数。
示例 1:
输入:
["MedianFinder","addNum","addNum","findMedian","addNum","findMedian"]
[[],[1],[2],[],[3],[]]
输出:[null,null,null,1.50000,null,2.00000]
示例 2:
输入:
["MedianFinder","addNum","findMedian","addNum","findMedian"]
[[],[2],[],[3],[]]
输出:[null,null,2.00000,null,2.50000]
提示:
- 最多会对
addNum
、findMedian
进行 50000 次调用。 0 <= num <= 10000
原题链接:
- 力扣(LeetCode)原题链接
示例
示例 1:
输入:
["MedianFinder","addNum","addNum","findMedian","addNum","findMedian"]
[[],[1],[2],[],[3],[]]
输出:
[null,null,null,1.50000,null,2.00000]
解释:
MedianFinder mf = new MedianFinder();
mf.addNum(1); // 当前数据流: [1]
mf.addNum(2); // 当前数据流: [1, 2]
mf.findMedian(); // 返回 1.5
mf.addNum(3); // 当前数据流: [1, 2, 3]
mf.findMedian(); // 返回 2.0
思路解析
本题要求设计一个数据结构,能够高效地从数据流中添加数字并随时返回中位数。由于数据流可能非常大(最多50000次操作),我们需要一种高效的方法来维护数据的中位数。
方法一:使用两个堆(最大堆和最小堆)
核心思路
使用两个堆来维护数据流的前半部分和后半部分:
- 最大堆(Max-Heap):用于存储数据流中较小的一半元素。堆顶是这部分的最大值。
- 最小堆(Min-Heap):用于存储数据流中较大的一半元素。堆顶是这部分的最小值。
通过这样的划分,能够保证:
- 当总元素个数为奇数时,最大堆中的元素比最小堆多一个。
- 当总元素个数为偶数时,两个堆中的元素个数相等。
详细步骤
-
初始化:
- 创建一个最大堆(使用负数模拟,因为 Python 的
heapq
模块只支持最小堆)。 - 创建一个最小堆。
- 创建一个最大堆(使用负数模拟,因为 Python 的
-
添加数字 (
addNum
):- 将新数字添加到最大堆(较小的一半)。
- 将最大堆的堆顶元素(即较小的一半中的最大值)移动到最小堆中,以保持平衡。
- 如果最小堆的元素多于最大堆,则将最小堆的堆顶元素(即较大的一半中的最小值)移动回最大堆中。
-
查找中位数 (
findMedian
):- 如果两个堆的大小相同,中位数是两个堆顶元素的平均值。
- 如果堆的大小不同,中位数是较大堆的堆顶元素。
示例分析
以示例1为例:
["MedianFinder","addNum","addNum","findMedian","addNum","findMedian"]
[[],[1],[2],[],[3],[]]
-
操作1:
addNum(1)
- 最大堆:
[-1]
- 最小堆:
[]
- 最大堆:
-
操作2:
addNum(2)
- 最大堆:
[-1, -2]
- 最小堆:
[2]
(将最大堆顶1
移到最小堆)
- 最大堆:
-
操作3:
findMedian()
- 中位数 = (1 + 2) / 2 = 1.5
-
操作4:
addNum(3)
- 最大堆:
[-2, -1]
- 最小堆:
[2, 3]
- 最大堆:
-
操作5:
findMedian()
- 中位数 = 2
优势
-
时间复杂度:
addNum
: O(log n) 由于堆的插入和删除操作。findMedian
: O(1) 直接访问堆顶元素。
-
空间复杂度:
- O(n),用于存储所有元素在两个堆中。
适用场景
- 需要实时地获取中位数,且数据流量较大。
代码实现
Python 实现(方法一:使用两个堆)
import heapqclass MedianFinder:def __init__(self):"""初始化两个堆:- 小顶堆(用于存储较大的一半元素)- 大顶堆(用于存储较小的一半元素,通过取负数实现)"""self.min_heap = [] # 小顶堆self.max_heap = [] # 大顶堆(存储负数)def addNum(self, num: int) -> None:"""添加一个数字到数据结构中。"""# 将数添加到大顶堆(通过取负数实现最大堆)heapq.heappush(self.max_heap, -num)# 将大顶堆的堆顶元素移动到小顶堆if self.max_heap:top = -heapq.heappop(self.max_heap)heapq.heappush(self.min_heap, top)# 平衡两个堆的大小if len(self.min_heap) > len(self.max_heap):top = heapq.heappop(self.min_heap)heapq.heappush(self.max_heap, -top)def findMedian(self) -> float:"""返回当前所有元素的中位数。"""if len(self.max_heap) > len(self.min_heap):return -self.max_heap[0]elif len(self.max_heap) < len(self.min_heap):return self.min_heap[0]else:return (-self.max_heap[0] + self.min_heap[0]) / 2.0
测试代码
以下是针对上述方法的测试代码,使用 unittest
框架进行验证。
import unittestclass TestMedianFinder(unittest.TestCase):def test_example1(self):mf = MedianFinder()mf.addNum(1)mf.addNum(2)self.assertEqual(mf.findMedian(), 1.5, "示例1第一次findMedian失败")mf.addNum(3)self.assertEqual(mf.findMedian(), 2.0, "示例1第二次findMedian失败")def test_example2(self):mf = MedianFinder()mf.addNum(2)self.assertEqual(mf.findMedian(), 2.0, "示例2第一次findMedian失败")mf.addNum(3)self.assertEqual(mf.findMedian(), 2.5, "示例2第二次findMedian失败")def test_single_element(self):mf = MedianFinder()mf.addNum(5)self.assertEqual(mf.findMedian(), 5.0, "单元素测试失败")def test_two_elements(self):mf = MedianFinder()mf.addNum(1)mf.addNum(2)self.assertEqual(mf.findMedian(), 1.5, "两元素测试失败")def test_multiple_elements(self):mf = MedianFinder()elements = [5, 15, 1, 3]medians = [5.0, 10.0, 5.0, 4.0]for num, expected in zip(elements, medians):mf.addNum(num)self.assertEqual(mf.findMedian(), expected, f"多元素测试失败,添加{num}后中位数应为{expected}")def test_duplicates(self):mf = MedianFinder()mf.addNum(2)mf.addNum(2)mf.addNum(2)self.assertEqual(mf.findMedian(), 2.0, "重复元素测试失败")def test_negative_numbers(self):mf = MedianFinder()mf.addNum(-1)mf.addNum(-2)self.assertEqual(mf.findMedian(), -1.5, "负数测试失败")def test_large_input(self):mf = MedianFinder()for i in range(1, 1001):mf.addNum(i)# 中位数逐渐增加if i % 2 == 1:expected = (i + 1) / 2else:expected = (i // 2) + 0.5self.assertEqual(mf.findMedian(), expected, f"大输入测试失败,添加{i}后中位数应为{expected}")def test_interleaved_operations(self):mf = MedianFinder()operations = ["addNum", "findMedian", "addNum", "findMedian", "addNum", "findMedian", "addNum", "findMedian"]inputs = [1, None, 2, None, 3, None, 4, None]expected_outputs = [None, 1.0, None, 1.5, None, 2.0, None, 2.5]for op, inp, expected in zip(operations, inputs, expected_outputs):if op == "addNum":mf.addNum(inp)self.assertIsNone(expected, "addNum 操作应返回 None")elif op == "findMedian":median = mf.findMedian()self.assertEqual(median, expected, f"interleaved_operations 测试失败,预期中位数为{expected},实际为{median}")def test_no_elements(self):mf = MedianFinder()with self.assertRaises(IndexError, msg="没有元素时findMedian应引发错误"):mf.findMedian()if __name__ == "__main__":unittest.main(argv=[''], exit=False)
说明:
test_no_elements
: 在没有添加任何元素时调用findMedian
会引发IndexError
,因为堆为空。这一行为根据具体实现可能有所不同,视具体需求可以进行调整,例如返回None
或抛出自定义异常。
输出:
...........
----------------------------------------------------------------------
Ran 10 tests in 0.XXXsOK
复杂度分析
方法一:使用两个堆
时间复杂度
addNum
操作:每次插入和调整堆的操作都是O(log n)
,其中n
是当前堆的大小。findMedian
操作:O(1)
,直接访问堆顶元素。
空间复杂度
O(n)
:需要存储所有添加的元素,分布在两个堆中。
结论
通过采用 使用两个堆(最大堆和最小堆) 的方法,我们能够高效地设计一个支持实时添加数字和查找中位数的数据结构。关键在于:
- 堆的平衡:通过维护两个堆的大小差异不超过1,确保能够快速获取中位数。
- 高效性:
addNum
操作的时间复杂度为O(log n)
,findMedian
操作的时间复杂度为O(1)
,适用于高频次的操作需求。
该方法在实际应用中广泛使用,尤其适用于需要实时统计中位数的数据流场景,如在线统计、实时监控等。
相关文章:
【剑指Offer刷题系列】数据流中的中位数
目录 问题描述示例示例 1: 思路解析方法一:使用两个堆(最大堆和最小堆)核心思路详细步骤示例分析优势适用场景 代码实现Python 实现(方法一:使用两个堆) 测试代码复杂度分析方法一:使…...
RabbitMQ高级篇之MQ可靠性 数据持久化
文章目录 消息丢失的原因分析内存存储的缺陷如何确保 RabbitMQ 的消息可靠性?数据持久化的三个方面持久化对性能的影响持久化实验验证性能对比Spring AMQP 默认持久化总结 消息丢失的原因分析 RabbitMQ 默认使用内存存储消息,但这种方式带来了两个主要问…...
C 语言奇幻之旅 - 第16篇:C 语言项目实战
目录 引言1. 项目规划1.1 需求分析与设计1.1.1 项目目标1.1.2 功能需求1.1.3 技术实现方案 2. 代码实现2.1 模块化编程2.1.1 学生信息模块2.1.2 成绩管理模块 2.2 调试与测试2.2.1 调试2.2.2 测试2.2.4 测试结果 3. 项目总结3.1 代码优化与重构3.1.1 代码优化3.1.2 代码重构 3.…...
[笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server
随着软件开发节奏的加快,持续集成(CI)和持续部署(CD)已经成为确保软件质量和加速产品发布的不可或缺的部分。Jenkins作为一款广泛使用的开源自动化服务器,为开发者提供了一个强大的平台来实施这些实践。然而…...
Git最便捷的迁移方式
#当公司要求git需要迁移时,你是不是感觉到束手无策。今天带来给大家最快,最便捷的迁移方式 这个命令是用于重命名git仓库中的远程仓库名。在这个命令中,我们将远程仓库的名字从"origin"改为"old-origin"。 git remote …...
【颜色分类--荷兰国旗问题】
问题 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums , 原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。必须在不使用库内置的 sort 函数的情况下…...
xrdp连接闪退情况之一
错误核查 首先使用命令vim ~/.xsession-errors,当里面的报错信息为WARNING **: Could not make bus activated clients aware of XDG_CURRENT_DESKTOPGNOME environment variable:Failed to execute child process “dbus-launch” (No such file or directory)&am…...
KubeVirt 进阶:设置超卖比、CPU/MEM 升降配、在线磁盘扩容
前两篇文章,我们分别介绍 Kubevirt 的安装、基本使用 以及 将 oVirt 虚拟机迁移到 KubeVirt,我们留了两个ToDo,一个是本地磁盘的动态分配,一个是固定 IP 的需求,本期我们先解决第一个,本地磁盘的动态分配。…...
(回溯法)leetcode39组合总和
第一个2开头,下面的子节点的集合元素均为2,5,3 但是在5开头,下面的子节点集合元素均为5,3 带着这个图的思路确定i和index的传递值 backtracking(i, nums,8,sum);用的是i而不是i1 // ConsoleApplication3.cpp : 此文件包含 "main" 函数。程序…...
【数据结构】二叉搜索树
目录 1. 二叉搜索树的概念 2. 二叉搜索树的性能分析 3.二叉搜索树的实现 3. 1.二叉搜索树的插入 3.2. 二叉搜索树的查找 3.3. 二叉搜索树的删除 3.4. 二叉搜索树的实现代码 4. 二叉搜索树key和key/value两种使用场景 4.1 key搜索场景: 4.2 key/value搜索场…...
高可用虚拟IP-keepalived
个人觉得华为云这个文档十分详细:使用虚拟IP和Keepalived搭建高可用Web集群_弹性云服务器 ECS_华为云 应用场景:虚拟IP技术。虚拟IP,就是一个未分配给真实主机的IP,也就是说对外提供数据库服务器的主机除了有一个真实IP外还有一个…...
CSS语言的多线程编程
CSS语言的多线程编程 引言 在现代Web开发中,CSS(层叠样式表)被广泛用于给网页添加样式。然而,CSS本身是一种声明性语言,在设计上并没有直接支持多线程编程的功能。实际上,CSS的解析和应用是由浏览器的渲染…...
电脑之一键备份系统(One Click Backup System for Computer)
电脑之一键备份系统 相信使用电脑的的人都遇到过,电脑系统崩溃,开机蓝屏等原因,这个时候你急着用电脑办公,电脑却给你罢工是多么气人了,其实可以给电脑做一个系统备份。 最近每天都有系统蓝屏崩溃,这个实难…...
R语言的正则表达式
R语言中的正则表达式深度解析 正则表达式(Regular Expressions,简称Regex)是一种用于描述字符串匹配规则的工具,广泛应用于数据处理、文本分析、数据清洗等多个领域。在R语言中,正则表达式被广泛应用于字符串的处理和…...
解决el-table表格数据量过大导致页面卡顿问题 又名《umy-ui---虚拟表格仅渲染可视区域dom的神》
后台管理系统的某个页面需要展示多个列表 数据量过多 页面渲染dom卡顿 经调研发现两个组件 pl-table和umy-ui (也就是u-table) 最终决定使用umy-ui 它是专门基于 Vue 2.0 的桌面端组件库 流畅渲染表格万级数据 而且他是对element-ui的表格做了二次优化…...
《机器学习》——贝叶斯算法
贝叶斯简介 贝叶斯公式,又称贝叶斯定理、贝叶斯法则,最初是用来描述两个事件的条件概率间的关系的公式,后来被人们发现具有很深刻的实际意义和应用价值。该公式的实际内涵是,支持某项属性的事件发生得愈多,则该属性成…...
零基础 监控数据可视化 Spring Boot 2.x(Actuator + Prometheus + Grafana手把手) (上)
一、安装Prometheus Releases prometheus/prometheus GitHubhttps://github.com/prometheus/prometheus/releases 或 https://prometheus.io/download/https://prometheus.io/download/ 1. 下载适用于 Windows 的二进制文件: 找到最新版本的发布页面…...
4.STM32F407ZGT6-独立看门狗
参考: 1.正点原子 前言: 看门狗是一个项目或者产品中肯定需要的功能部分,必须会。常见的两种看门狗类型,独立看门狗和窗口看门狗,各有使用的场景。总结记录独立看门狗一些知识点: 1.独立看门狗的概念。&am…...
RHCE实验-nfs及autofs
本次实验的目的:实现服务端的网络文件共享(配置nfs),且实现客户端的自动挂载(配置autofs) 服务端配置: 关闭防火墙和selinux: 安装软件 [rootlocalhost ~]# yum install nfs-utils -y 创建需要被挂载的目…...
docker代理设置
最近遇到国内镜像无法下载的问题,因此需要配置docker代理来使其能够下载镜像 代理设置方法如下: 编辑 /etc/docker/daemon.json 文件: 配置 HTTP 和 HTTPS 代理: {"proxies": {"http-proxy": "http:/…...
死信交换机
什么是死信?什么是死信交换机? 在MQ中未能成功被消费的消息就被称之为死信,而死信交换机就用于存放死信消息。 消息转变成死信消息的原因: 消息被消费者拒绝或者需要重发(nack、reject) nack:消…...
cat命令详解
🏝️专栏:https://blog.csdn.net/2301_81831423/category_12872319.html 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” cat 是 Linux/Unix 中的一个非常常用的命令&…...
路由器的转发表
【4-24】 已知路由器R₁ 的转发表如表T-4-24 所示。 表T-4-24 习题4-24中路由器R₁的转发表 前缀匹配 下一跳地址 路由器接口 140.5.12.64/26 180.15.2.5 m2 130.5.8/24 190.16.6.2 ml 110.71/16 ----- m0 180.15/16 ----- m2 190.16/16 ----- ml 默认 11…...
腾讯云AI代码助手编程挑战赛-古诗词学习
一、作品介绍 在科技与文化深度交融的当下,“腾讯云 AI 代码助手编程挑战赛 - 每日古诗词” 宛如一颗璀璨的新星,闪耀登场。它绝非一场普通的赛事,而是一座连接编程智慧与古典诗词韵味的桥梁。 这项挑战赛以独特的视角,将每日古…...
积分系统的设计
1. 目的 学习是需要正反馈的,这样学员才能有源源不断的动力去继续学习。 为了激励学员,我们需要设定一个学习积分的排行榜系统。优秀的学员给予一定的奖励,比如奖励优惠券。大家互相比拼的,刺激学员持续学习,互相卷起…...
功能篇:spring事务配置
在 Java 应用程序中配置事务管理通常涉及使用 Spring 框架,因为 Spring 提供了强大的事务管理抽象,可以简化事务的配置和管理。Spring 支持两种类型的事务管理:编程式事务管理和声明式事务管理。 编程式事务管理 编程式事务管理是通过编写代…...
单元测试概述入门
引入 什么是测试?测试的阶段划分? 测试方法有哪些? 1.什么是单元测试? 单元测试:就是针对最小的功能单元(方法),编写测试代码对其正确性进行测试。 2.为什么要引入单元测试&#x…...
PySpark学习笔记2-RDD算子,RDD持久化
RDD定义 RDD是弹性分布式数据集,是spark中的最基本的数据抽象,里面的元素可以并行计算 RDD的五大特性 RDD是有分区的,它的分区是数据存储的最小单位 RDD的方法会作用在所有分区上 RDD之间是有依赖关系的 KV型的RDD可以有分区器 RDD的分区会尽…...
windows10下安装Microsoft SQL Server 2016
一、下载安装包 网站:MSDN, 我告诉你 - 做一个安静的工具站 选择需要的版本,点击详细信息,复制ed2k链接,打开eMule或迅雷,新建下载,粘贴链接,开始下载。 下载好的文件是一个.iso镜像文件。 二、…...
开关不一定是开关灯用 - 命令模式(Command Pattern)
命令模式(Command Pattern) 命令模式(Command Pattern)命令设计模式命令设计模式结构图命令设计模式涉及的角色 talk is cheap, show you my code总结 命令模式(Command Pattern) 命令模式&…...
急速了解什么是GPU服务器
GPU服务器是一种专门配置了高性能图形处理器(GPU)的服务器,旨在提供高性能计算、深度学习、科学计算等多种场景的计算服务。与传统的CPU服务器相比,GPU服务器在处理并行密集型计算任务时具有显著优势。本文将详细介绍GPU服务器的定…...
word论文排版常见问题汇总
word论文排版常见问题汇总 常用快捷键: Alt F9 正常模式与域代码模式切换 Ctrl F9 插入域代码 F9 刷新域代码显示,要注意选定后刷新才会有效果 word中在当前列表的基础上修改列表 在使用word时,我们会定义一个列表,并将其链接…...
作业:IO:day3
思维导图 使用3语言编写一个简易的界面 界面如下 1:标准输出流 2:标准错误流 3:文件流 要求: 按1的时候,通过printf输出数据, 按2的时候,通过perror输出数据, 按3的时候将输入写入文…...
H266/VVC 帧内预测 PDPC 技术
位置决定的帧内预测组合 PDPC 在 VVC 中,对于帧内预测的 Planar 模式、DC 模式和几种角度模式需要使用 PDPC (position dependent intra prediction combination) 方法进一步处理。 PDPC 用于 DC 模式、Planar 模式、小于等于水平模式(模式 18) 的角度模式、大于等于…...
微信小程序mp3音频播放组件,仅需传入url即可
// index.js // packageChat/components/audio-player/index.js Component({/*** 组件的属性列表*/properties: {/*** MP3 文件的 URL*/src: {type: String,value: ,observer(newVal, oldVal) {if (newVal ! oldVal && newVal) {// 如果 InnerAudioContext 已存在&…...
Hadoop3.x 万字解析,从入门到剖析源码
💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…...
mysql的一些函数及其用法
mysql 1-来自于leetcode1517的题目 表: Users------------------------ | Column Name | Type | ------------------------ | user_id | int | | name | varchar | | mail | varchar | ------------------------已知一个表,它的…...
[java基础]LinkedList源码粗析
LinkedList 的数据结构 实现List、Deque 接口,基于 双向链表实现的列表。与基于数组的 ArrayList 不同,基于链表的LinkedList 允许在列表的任何位置快速地插入和删除元素。 Java中LinkedList实现了Deque,它提供了 add, offer, remove, poll, …...
基于Spring Boot的海滨体育馆管理系统的设计与实现
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的海滨体育馆管理系统的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 宠物医院…...
易支付二次元网站源码及部署教程
易支付二次元网站源码及部署教程 引言 在当今数字化时代,二次元文化逐渐成为年轻人生活中不可或缺的一部分。为了满足这一庞大用户群体的需求,搭建一个二次元主题网站显得尤为重要。本文将为您详细介绍易支付二次元网站源码的特点及其部署教程…...
json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?
在使用 Python 的 json 模块进行序列化时,默认情况下会将中文转换为 Unicode 编码。如果你希望在序列化时保留中文,可以通过设置 ensure_asciiFalse 来实现。 以下是示例代码: import jsondata {"name": "李浩瑞", &q…...
Perl语言的循环实现
Perl语言的循环实现 引言 Perl是一种强大的脚本语言,以其灵活的语法和强大的文本处理能力著称。无论是在系统管理、网络编程,还是在Web应用开发中,Perl都广泛应用于各种领域。循环是编程语言中一个极其重要的概念,它允许程序重复…...
IOMMU PT
什么是 IOMMU PT IOMMU PT(Input/Output Memory Management Unit - Pass-Through)是一种技术,主要用于虚拟化环境中,特别是在使用直接设备分配(也称为设备直通)的情况下。这项技术允许虚拟机直接访问物理硬…...
DNS协议漏洞利用实验_hust计算机网络安全实验
文章目录 计算机网络安全实验 DNS协议漏洞利用实验 docker使用 建立实验环境docker常用指令 一些注意事项设置本地 DNS 服务器 配置用户计算机设置本地DNS服务器在本地 DNS 服务器中建一个区域 修改主机文件(可略)netwox实施DNS的用户响应欺骗攻击netwo…...
深度学习中的卷积和反卷积(二)——反卷积的介绍
1 简介 反卷积(deconvolution)又称转置卷积,是卷积的拟操作,常用于GAN等模型中。反卷积是上采样的一种,上采样是指将特征图维度恢复到原始图的维度,这种增大维度的过程被称为上采样。上采样可以用插值或反…...
PyCharm 引用其他路径下的文件报错 ModuleNotFound 或报红
PyCharm 中引用其他路径下的文件提示 ModuleNotFound,将被引用目录添加到系统路径: # # 获取当前目录 dir_path os.path.dirname(os.path.realpath(__file__)) # # 获取上级目录 parent_dir_path os.path.abspath(os.path.join(dir_path, os.pardir))…...
【人工智能】Transformers之Pipeline(二):自动语音识别(automatic-speech-recognition)
目录 一、引言 二、自动语音识别(automatic-speech-recognition) 2.1 概述 2.2 技术原理 2.2.1 whisper模型 2.2.2 Wav2vec 2.0模型 2.3 pipeline参数 2.3.1 pipeline对象实例化参数 2.3.2 pipeline对象使用参数…...
Linux 工作队列
系列文章目录 Linux内核学习 Linux 知识(1) Linux 知识(2) Linux 工作队列 Linux 内核源代码情景分析(一) Linux 设备驱动程序(二) 文章目录 系列文章目录综述工作(work_…...
程序血缘分析技术在工商银行软件工程中的应用
当前,随着软件领域技术更新换代速度的日益加快,市场需求也变得更加多样化和个性化,业界普遍通过加速产品迭代来满足客户需求,但在此过程中也暴露出一些研发管理痛点问题,如服务和程序类资产信息分散于各个不同的应用和系统中,信息归集费时费力;设计、开发和测试人员无法…...
纯手工(不基于maven的pom.xml、Web容器)连接MySQL数据库的详细过程(Java Web学习笔记)
1 引言 最近读一些Java Web开发类的书籍时,发现书中的连接数据库的过程缺少了一些关键性的过程,这对初学者非常不友好。为此,本文将给出详细的连接MySQL数据库的过程,并且是纯手工,不依赖于pom.xml和Web容器ÿ…...