【发布时间】:2021-02-16 17:49:15
【问题描述】:
我有一个很大的日期元素数组,数组已经排序了。
[2020.12.31, 2020.12.31, 2021.01.03, 2021.01.04, 2021.01.04, 2021.02.16, 2021.06.16] 等
还有一些范围:[2021.01.03, 2021.05.15]
我需要找到包含在这个范围内的所有元素:[2021.01.03, 2021.01.04, 2021.01.04, 2021.02.16]
我编写了一个解决方案,但它对大数组效率不高。我认为这可以通过使用二进制搜索来解决,但我不知道如何。
我的代码:
let i = 0,
j = eventsId.length - 1,
startIndex,
endIndex
while (!startIndex && !endIndex && i < j) {
if (!startIndex) {
if (
events[eventsId[i]].startDate >= interval.start
)
startIndex = i
else i++
}
if (!endIndex) {
if (events[eventsId[j]].startDate <= interval.end)
endIndex = j
else j--
}
}
if (startIndex && endIndex) {
return eventsId.slice(startIndex, endIndex + 1)
}
【问题讨论】:
-
如果您不每次都创建
new Dates,您可能会改进它,因为您的日期具有标准化格式的年月日,字符串比较应该也可以工作 -
一旦你的 endIndex 被设置,你也可能想要打破这个时间
-
@OvidiuDolha 谢谢,我将删除
new Date。但我也需要从 O(n) 移动到 O(log n) 我认为 -
你可以实现某种二进制搜索。您遇到的问题是没有完全匹配,并且可能有多个匹配项。就我个人而言,我会按照你的方式实现它。
-
你为什么要担心这个的渐近时间复杂度?这些是格式化的日期。您认为它们的阵列会增长到多大?
标签: javascript arrays algorithm