【问题标题】:most efficient way to hash map an object to be keyed by a time range?哈希映射要按时间范围键入的对象的最有效方法?
【发布时间】:2019-04-20 03:27:14
【问题描述】:

示例对象:

{
    "start": "1.06",
    "end": "2.33",
    "content": "something"
},
{
    "start": "2.99",
    "end": "3.54",
    "content": "something else"
}

我想创建一个高效的哈希映射,我可以在其中随时输入并获取内容。例如,我输入2.01 并得到something,因为那发生在那个时间范围内。

除了为范围内的每个数字创建哈希之外,最好的方法是什么?

【问题讨论】:

  • 效率最高?一切都取决于它的使用方式。
  • 如果已排序,可能是某种快速排序的实现,将值与开始和结束进行比较。
  • 你的数据可以有重叠的时期吗?
  • 澄清@trincot,不,时间范围将始终按连续递增的顺序排列,而不是重叠
  • 然后二分查找就可以了。

标签: javascript dictionary time hash


【解决方案1】:

假设没有重叠的周期,并且数据已经排序,你应该实现一个二分查找:

function findIndex(data, time) {
    let left = 0;
    let right = data.length-1;
    while (left <= right) {
        const mid = (right + left)>>1;
        if (time > data[mid].end) {
            left = mid + 1;
        } else if (time < data[mid].start) {
            right = mid - 1;
        } else {
            return mid;
        }
    }
    return -1;
}

当没有匹配或匹配的索引时,这将返回 -1。使用该索引,您可以获得匹配的对象及其属性之一。

时间复杂度为O(logn)

注意:您需要将开始/结束属性定义为数字,而不是字符串,因此您会得到数字比较结果,而不是字母。

【讨论】:

  • 谢谢,这是有道理的。这比每次都会循环遍历整个数组的数组过滤器要好
猜你喜欢
  • 2023-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
相关资源
最近更新 更多