Приведенные вами примеры допускают тривиальные O(n)
решения, используя метод ниже.Не могли бы вы (или кто-то другой) привести хотя бы один пример, который заставил бы этот метод быть неэффективным?(Таким образом, возможно, помогая нам улучшить его:)
Мне кажется, как показано в моем другом частичном ответе, что чем больше разнообразия или случайности вы пытаетесь внести во входные данные, тем больше вероятность того, что оптимальныйсовпадение может быть найдено быстро из-за недостатка или регулярности в недоступных длинах.
Метод:
Мы можем вычислить в O(n)
времени и пространстве список частот для нечетных вхождений и их индексов(они определяют переключатели четности).Начиная с каждого конца полного диапазона, мы можем рекурсивно свернуть ту или иную сторону, чтобы определить возможный диапазон, перейдя к следующему вхождению в этом предварительно рассчитанном списке.(Для любой фиксированной стороны мы также можем выполнить бинарный поиск диапазона, разделив пополам другую сторону.)
Например:
b = [1, 1, 1, 0]
l: (0,1)(1,2)(2,3)
Odd length 3-4, indexes: 0-(2..3)
Even length (collapse left):
2-3, indexes: 1-(2..3)
a = [0, 1, 0, 1, 0, 1]
l: (1,1) (3,2) (5,3)
Odd length 5-6, indexes: (0..1)-5
Even length (collapse right or left):
3-5, indexes: (0..1)-(3..4)
Next odd length (collapse right or left again):
1-3, indexes: (0..1)-(1..2)
Так как у нас нет соответствия для длины 4,следующий лучший результат - 3.
a = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
b = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Тривиальный, полный диапазон совпадений.
a = [0, 0, 0, 0, 0, 0, 0]
b = [0, 0, 0, 0, 0, 0, 0, 0]
Тривиальный, без лишних длин.
a = [0, 0, 0, 1, 0, 0, 0]
b = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Тривиальный, только один выборчетной длины, свернуть вправо или влево для диапазонов 1-3.
a = [0, 1, 0, 0, 1, 1, 1]
b = [1, 1, 1, 0, 1, 0]
Тривиально, не требуется сложение, полный четный диапазон сразу совпадает, a indexes: (0..1)-6
, b indexes: 0-(4..5)