使用二分查找提高点击进度条时检索字幕索引的效率

使用二分查找提高点击进度条时检索字幕索引的效率

在现代网页应用中,点击进度条是常见的交互方式,尤其在音频播放器中,用户可以通过点击进度条快速跳转到不同的时间点。在我的英语听力训练网站项目中,我们需要根据用户点击进度条的位置,实时检索到对应的字幕内容。为了提高检索效率,我们选择使用二分查找来优化字幕索引的获取过程。

问题背景

在初始实现中,用户点击进度条后,我通过遍历字幕数组的方式来查找对应的字幕:

progress.addEventListener('click', (event) => {currentPlayCount = 0;const rect = progress.getBoundingClientRect();const clickX = event.clientX - rect.left;const width = rect.width;const duration = audio.duration;audio.currentTime = (clickX / width) * duration;// 遍历字幕查找对应时间for (let i = 0; i < subtitles.length; i++) {const startTime = parseTime(subtitles[i].start);const endTime = parseTime(subtitles[i].end);if (audio.currentTime >= startTime && audio.currentTime <= endTime) {currentSubtitleIndex = i;break;}}audio.play();startInterval();
});

这种遍历方法虽然简单,但当字幕数量较多时,性能会变差。特别是在频繁点击进度条时,性能问题变得更加显著。

解决方案:二分查找

我们可以利用字幕数组是按时间顺序排列的特点,使用二分查找来提升检索效率。二分查找的时间复杂度是 O(log n),相比 O(n) 的遍历查找,能够大幅提高性能。

实现思路

二分查找通过不断将查找范围减半,能够快速锁定目标字幕。具体的逻辑是:

  1. 比较当前时间与字幕的开始时间和结束时间。
  2. 如果当前时间落在该字幕的时间范围内,则返回该字幕索引。
  3. 如果当前时间小于字幕的开始时间,继续在前半部分查找;如果当前时间大于字幕的结束时间,则在后半部分查找。

二分查找代码实现

下面是我们如何在进度条点击事件中使用二分查找来优化字幕检索的代码:

progress.addEventListener('click', (event) => {currentPlayCount = 0;const rect = progress.getBoundingClientRect();const clickX = event.clientX - rect.left;const width = rect.width;const duration = audio.duration;audio.currentTime = (clickX / width) * duration;// 使用二分查找来找到当前时间对应的字幕索引currentSubtitleIndex = findSubtitleByTime(subtitles, audio.currentTime);if (currentSubtitleIndex !== -1) {const currentSubtitle = subtitles[currentSubtitleIndex];currentCaptionIndex.textContent = currentSubtitleIndex + 1;captions.textContent = currentSubtitle.text;captionsTranslation.textContent = currentSubtitle.cntext;}audio.play();startInterval();
});
二分查找函数
function findSubtitleByTime(subtitles, currentTime) {let left = 0;let right = subtitles.length - 1;while (left <= right) {const mid = Math.floor((left + right) / 2);const startTime = parseTime(subtitles[mid].start);const endTime = parseTime(subtitles[mid].end);if (currentTime >= startTime && currentTime <= endTime) {return mid; // 找到当前时间对应的字幕索引} else if (currentTime < startTime) {right = mid - 1; // 当前时间在前半部分} else {left = mid + 1; // 当前时间在后半部分}}return -1; // 未找到字幕
}

总结

使用二分查找对字幕索引进行检索,可以大幅提高字幕播放器的效率,尤其在处理大量字幕数据时。二分查找的时间复杂度为 O(log n),相比 O(n) 的遍历查找,能够显著提升性能。如果你在项目中也遇到类似的问题,推荐尝试使用二分查找来优化你的查找逻辑。

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

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

相关文章

FastAPI 的隐藏宝石:自动生成 TypeScript 客户端

在现代 Web 开发中&#xff0c;前后端分离已成为标准做法。这种架构允许前端和后端独立开发和扩展&#xff0c;但同时也带来了如何高效交互的问题。FastAPI&#xff0c;作为一个新兴的 Python Web 框架&#xff0c;提供了一个优雅的解决方案&#xff1a;自动生成客户端代码。本…

C语言-文件操作-一些我想到的、见到的奇怪的问题

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【C语言】 欢迎点赞&#x1f44d;收藏⭐关注❤️ C语言-文件操作-一些我想到的、见到的奇怪的问题 前言1.在不关闭文件的情况下&#xff0c;连续多次调用 fopen() 打开同一个文件&#xff0c;会发生什么&#xff1f;1.1过…

简单多状态dp第三弹 leetcode -买卖股票的最佳时机问题

309. 买卖股票的最佳时机含冷冻期 买卖股票的最佳时机含冷冻期 分析: 使用动态规划解决 状态表示: 由于有「买入」「可交易」「冷冻期」三个状态&#xff0c;因此我们可以选择用三个数组&#xff0c;其中&#xff1a; ▪ dp[i][0] 表示&#xff1a;第 i 天结束后&#xff0c…

基于主从Reactor模型实现高并发服务器

目录 1. 项目简介1.1 环境介绍1.2 项目定位1.3 功能模块整体划分 2. Reactor简介2.1 Reactor模型分析2.2 多Reactor多线程分析&#xff1a;多I/O多路复用线程池&#xff08;业务处理&#xff09; 3. 日志宏的编写4. Server模块4.1 Buffer模块4.1.1 Buffer的功能4.1.2 Buffer的实…

AI健身之俯卧撑计数和姿态矫正-角度估计

在本项目中&#xff0c;实现了Yolov7-Pose用于人体姿态估计。以下是如何在Windows 11操作系统上设置和运行该项目的详细步骤。 环境准备 首先&#xff0c;确保您的计算机已经安装了Anaconda。Anaconda是一个开源的Python发行版本&#xff0c;它包含了conda、Python以及众多科…

Python基于TensorFlow实现时间序列循环神经网络回归模型(LSTM时间序列回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 随着信息技术的发展和传感器设备的广泛应用&#xff0c;时间序列数据的产生量急剧增加。无论是股市价格…

Windows本地连接远程服务器并创建新用户详细记录

前提可知&#xff1a; &#xff08;1&#xff09;服务器IP地址&#xff1a;x.x.x.x &#xff08;2&#xff09;服务器名称&#xff1a;root&#xff08;一般默认为root&#xff0c;当然也有别的名称&#xff09; &#xff08;3&#xff09;服务器登陆密码&#xff1a;**** 一、…

优化下载性能:使用Python多线程与异步并发提升下载效率

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 普通请求下载📝 使用多线程加速下载📝 使用异步编程加速下载📝 总结 📝⚓️ 相关链接 ⚓️📖 介绍 📖 你是否因为下载速度慢而感到焦虑?特别是在下载大型文件时,等待进度条慢慢移动的感觉真的很…

西圣、吉玛仕、绿联电容笔好不好用?热门平替电容笔超真实测评!

电容笔在数字化学习与办公环境中扮演着举足轻重的角色&#xff0c;它不仅是绘写的基本工具&#xff0c;更是提高创造效率的重要手段。随着平替电容笔的市场不断扩大&#xff0c;涌现了很多品牌&#xff0c;使得很多消费者不知道如何选择。此外&#xff0c;还有掺杂了一些性能不…

浅谈Spring Cloud:OpenFeign

RestTemplate 方式调用存在的问题&#xff1a; String url "http://userservice/user/" order.getUserId(); User user restTemplate.getForObject(url, User.class); 这是通过URL地址来访问的。但是&#xff1a; 代码可读性差&#xff0c;编程体验不统一参数复…

CSGHub开源版本v0.9.0更新

CSGHub开源版本v0.9.0更新现已发布&#xff01; 00 重大更新&#x1f50a;&#x1f50a;&#x1f50a; golang 重写 Rails 服务端API git server增加gitaly的支持&#xff0c;且新版本默认使用 gitaly 本地运行应用空间、推理、微调不再需要域名 01 代码仓库&#xff08;模型…

在线骑行网站设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装在线骑行网站软件来发挥其高效地信息处理的作用&#xff0c…

灾备技术演进之路 | 虚拟化无代理备份只能挂载验证和容灾吗?只能无代理恢复吗?且看科力锐升级方案

灾备技术演进之路系列 虚拟化备份技术演进 摆脱束缚&#xff0c;加速前行 无代理备份仅能挂载/恢复验证吗&#xff1f; ——科力锐极简验证演练无代理备份来了 无代理备份无法应对平台级故障吗&#xff1f; ——科力锐应急接管无代理备份来了 无代理备份仅能同平台挂载吗&a…

Java反序列化利用链篇 | URLDNS链

文章目录 URLDNS链调用链分析Payload编写 系列篇其他文章&#xff0c;推荐顺序观看~ Java反序列化利用链篇 | JdbcRowSetImpl利用链分析Java反序列化利用链篇 | CC1链_全网最菜的分析思路Java反序列化利用链篇 | CC1链的第二种方式-LazyMap版调用链Java反序列化利用链篇 | URLD…

thinkphp 做分布式服务+读写分离+分库分表(分区)(后续接着写)

thinkphp 做分布式服务读写分离分库分表&#xff08;分区&#xff09; 引言 thinkphp* 大道至简一、分库分表分表php 分库分表hash算法0、分表的方法&#xff08;thinkphp&#xff09;1、ThinkPHP6 业务分表之一&#xff1a;UID 发号器2、ThinkPHP6 业务分表之二&#xff1a;用…

【数据结构与算法 | 灵神题单 | 二叉搜索树篇】力扣653

1. 力扣653&#xff1a;两数之和IV - 输入二叉搜索树 1.1 题目&#xff1a; 给定一个二叉搜索树 root 和一个目标结果 k&#xff0c;如果二叉搜索树中存在两个元素且它们的和等于给定的目标结果&#xff0c;则返回 true。 示例 1&#xff1a; 输入: root [5,3,6,2,4,null,7…

伊犁云计算22-1 raid 5 linux 配置

&#xff11;  添加四块&#xff53;&#xff41;&#xff54;&#xff41; 硬盘  &#xff12;  设置启动项为原来&#xff53;&#xff43;&#xff53;&#xff49; 的硬盘 &#xff13;  四块盘都是  &#xff46;&#xff44;   &#xff4c;&#xff49;&…

用 HTML + JavaScript DIY 一个渐进式延迟法定退休年龄测算器

为减轻社会和个人因退休年龄变化带来的冲击&#xff0c;近日&#xff0c;全国人民代表大会常务委员会正式发布了关于实施渐进式延迟法定退休年龄的重要决定。 根据该决定&#xff0c;我国将同步启动对男、女职工法定退休年龄的延迟计划。这一调整将采取渐进式的方式进行&#…

概率论与数理统计(2)

第一节博客已经整理了求导的公式&#xff0c;一些常用的概念。链接如下&#xff1a;高等数学基础&#xff08;1&#xff09;-CSDN博客。 第二节博客整理了微积分的公式及其相关概念。链接如下&#xff1a;高等数学基础&#xff08;2&#xff09;——微积分-CSDN博客 第三节博客…

Java:Clonable 接口和拷贝

一 Clonable 接口 在 Java SE 中&#xff0c;Cloneable 是一个标记接口&#xff08;Marker Interface&#xff09;&#xff0c;它位于 java.lang 包中。这个接口的主要目的是标识实现该接口的类能够被合法地克隆&#xff08;即可以调用 Object 类中的 clone() 方法&#xff09…