Я хочу эффективно определить, охватывает ли список диапазонов данный диапазон.Например, список диапазонов [(0-3), (3-5), (4-8), (6-10)] охватывает диапазон (0-10), а [(5-10), (0-3)] нет.Список может содержать наложения и не обязательно упорядочен.
Я попытался реализовать функцию Continuous
, показанную ниже, которая проверяет, содержит ли диапазон диапазонов байтов заданные значения start
и end
пройденного диапазона.
type byteRange struct {
start int64
end int64
}
type byteRanges []*byteRange
func (brs byteRanges) Len() int {
return len(brs)
}
func (brs byteRanges) Swap(i, j int) {
brs[i], brs[j] = brs[j], brs[i]
}
func (brs byteRanges) Less(i, j int) bool {
return brs[i].start < brs[j].start
}
func (brs byteRanges) Continuous(start int64, end int64) bool {
curPos := start
sort.Sort(brs)
for _, br := range brs {
if br.start > curPos+1 {
return false
}
if curPos < br.end {
curPos = br.end
}
if curPos >= end {
return true
}
}
return false
}
Функция работает правильно, но она не очень эффективна при работе с большим списком диапазонов и при частом ее вызове.Может кто-нибудь порекомендовать алгоритм / реализацию, которая может ускорить эту логику?