首页 > 其他分享 >使用二分查找提高点击进度条时检索字幕索引的效率

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

时间:2024-09-22 19:20:59浏览次数:3  
标签:二分 const 进度条 currentTime 字幕 查找 subtitles

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

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

问题背景

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

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) 的遍历查找,能够显著提升性能。如果你在项目中也遇到类似的问题,推荐尝试使用二分查找来优化你的查找逻辑。

标签:二分,const,进度条,currentTime,字幕,查找,subtitles
From: https://blog.csdn.net/ooobama/article/details/142421564

相关文章

  • 算法解析:二分查找实现整数平方根
    题目:给你一个非负整数 x ,计算并返回 x 的算术平方根 。由于返回类型是整数,结果只保留整数部分 ,小数部分将被舍去。注意:不允许使用任何内置指数函数和算符,例如 pow(x,0.5) 或者 x**0.5 。示例1:输入:x=4输出:2示例2:输入:x=8输出:2解释:8的算术平方根是2.82842.........
  • 如何在Reactjs中制作动态进度条
    使用react和循环进度组件构建性能仪表板在本博客中,我们将探讨如何使用react构建性能指标仪表板。仪表板显示不同绩效指标(例如可访问性、seo和最佳实践)的循环进度指示器。进度指示器逐渐填满,模拟加载动画。该项目使用tailwindcss进行样式设计,并组合了多个组件来创建灵活且......
  • 二分图
    定义节点由两个集合组成,且两个集合内部没有边的图性质无奇环每条边都是从一个集合走向另一个集合。二分图判定使用染色法。进行\(dfs\),为图进行黑白染色,若可以完成则该图是二分图。boolvis[N];//0:未染色,1:黑色,2:白色boolflag=1;voiddfs(intx){ for(autoy:v[......
  • 算法随笔——wqs二分
    学习链接学习链接应用条件选择恰好\(x\)个物品,求最优值设\(x\)对应最优值\(f_x\),\((x,f_x)\)在图像上呈现为凸包。无数量限制问题简单可做问题转化有\(n\)个物品,恰好选\(m\)个,计算最优值。做法例题模版题:P2619......
  • 【oj刷题】二分查找篇:二分查找算法的原理和应用场景
    前言:二分查找算法,又称折半查找算法,是一种在有序数组中查找特定元素的高效查找方法。它通过将搜索区间不断缩小一半,从而在对数时间内找到目标元素。二分查找是基于分治策略的一种典型应用,能够高效的处理许多问题,下面我们就来看一下二分查找算法的原理和应用场景目录一、什......
  • easyExcel导出大数据量EXCEL文件,前端实现进度条
    需求:页面点击导出,先按照页面条件去数据库查询,然后将查询到的数据导出。问题:由于查询特别耗时,所以点击之后页面会看上去没有反应,就在点击之后在页面增加了一个进度条,等待后盾查询结束之后,导出时,进度条会显示导出进度,导出结束之后进度条会消失。效果如下:注意点:后端需要在响应......
  • 算法设计与分析(二分查找算法
    目录二分查找算法详解引言算法步骤代码实现注意事项结论小结:二分查找算法详解引言二分查找算法是一种在有序数组中查找特定元素的搜索算法。它通过不断将数组分成两半,缩小搜索范围,从而快速定位到目标元素的位置。二分查找算法的时间复杂度为O(logn),其中n是数组的长度。算法步骤......
  • 字幕编辑用什么软件好?盘点国内外7款视频加字幕软件,简单高效!
    视频添加字幕被认为是让观众更好理解您在视频中讲述内容的最佳和最常见的方式。例如,您可以给视频中的某些文字添加不同的颜色,以帮助观众识别视频中的角色。然而,在制作视频过程中,添加字幕往往是个耗时耗力的任务。因此,不少人会问道:字幕编辑用什么软件好?别着急,在本文中,小编整理了......
  • 算法学习每日一题之2332. 坐上公交的最晚时间:二分答案 & 贪心双指针
    Problem:2332.坐上公交的最晚时间人话题意:你是一个懒惰的人,虽然你要赶公交车,但你想多睡会,恰好你知道每辆车的发车时间buses和每辆车容capacity,和每个乘客乘车的时间passenger,旨在求可以赶上公交车的最晚出发时间。思路一:二分答案求最晚能满足赶上公交的时间,可以发现......
  • 算法笔记2:二分
    二分二分可以求得满足条件的左边界或右边界,如下图所示查找左边界(绿色区域的最左边):intSL(intl,intr){while(l<r){intmid=l+r>>1;if(check(mid))r=mid;elsel=mid+1;}re......