Теперь мой алгоритм - O (n) время и O (Dn) пространство, где Dn - общее несоответствие в списке.
Это решение не изменяет список.
пусть D будет разницей 1 и 0, найденных в списке.
Сначала давайте линейно пройдемся по списку и вычислим D, просто чтобы посмотреть, как он работает:
Я собираюсь использовать этот список в качестве примера: l = 1100111100001110
Element D
null 0
1 1
1 2 <-
0 1
0 0
1 1
1 2
1 3
1 4
0 3
0 2
0 1
0 0
1 1
1 2
1 3
0 2 <-
Нахождение самого длинного сбалансированного подмассива эквивалентно нахождению 2 равных элементов в D, которые являются более удаленной квартирой.(в этом примере 2 2 отмечены стрелками.)
Самый длинный сбалансированный подмассив находится между первым вхождением элемента +1 и последним вхождением элемента.(первая стрелка +1 и последняя стрелка: 00111100001110)
Примечание:
Самый длинный подмассив всегда будет между 2 элементами D, которые находятся между [0, Dn] где Dn - последний элемент D. (Dn = 2 в предыдущем примере) Dn - общий дисбаланс между 1 и 0 в списке.(или [Dn, 0], если Dn отрицателен)
В этом примере это означает, что мне не нужно «смотреть» на 3 с или 4 с
Доказательство:
Пусть Dn> 0.
Если существует подмассив, ограниченный P (P> Dn).Так как 0
P не может быть меньшечем 0 по тем же причинам
доказательство одинаково для Dn <0 </p>
Теперь давайте поработаем над D, D не случайно, разница между двумя последовательными элементами всегда1 или -1.Кроме того, существует легкая биекция между D и начальным списком.Поэтому у меня есть 2 решения этой проблемы:
- первое - отслеживать первое и последнее появление каждого элемента в D, которые находятся между 0 и Dn (см. Примечание).
- секунда - преобразовать список в D, а затем работать с D.
ПЕРВОЕ РЕШЕНИЕ
В настоящее время я не могу найтилучший подход, чем первый:
Сначала вычислите Dn (в O (n)).Dn = 2
Во-вторых, вместо создания D, создайте словарь, в котором ключами является значение D (между [0 и Dn]), а значением каждого ключа является пара (a, b), где aявляется первым вхождением ключа, а b последним.
Element D DICTIONNARY
null 0 {0:(0,0)}
1 1 {0:(0,0) 1:(1,1)}
1 2 {0:(0,0) 1:(1,1) 2:(2,2)}
0 1 {0:(0,0) 1:(1,3) 2:(2,2)}
0 0 {0:(0,4) 1:(1,3) 2:(2,2)}
1 1 {0:(0,4) 1:(1,5) 2:(2,2)}
1 2 {0:(0,4) 1:(1,5) 2:(2,6)}
1 3 { 0:(0,4) 1:(1,5) 2:(2,6)}
1 4 {0:(0,4) 1:(1,5) 2:(2,6)}
0 3{0:(0,4) 1:(1,5) 2:(2,6) }
0 2 {0:(0,4) 1:(1,5) 2:(2,9) }
0 1 {0:(0,4) 1:(1,10) 2:(2,9) }
0 0 {0:(0,11) 1:(1,10) 2:(2,9) }
1 1 {0:(0,11) 1:(1,12) 2:(2,9) }
1 2 {0:(0,11) 1:(1,12) 2:(2,13)}
1 3 {0:(0,11) 1:(1,12) 2:(2,13)}
0 2 {0:(0,11) 1:(1,12) 2:(2,15)}
, и вы выбрали элемент с наибольшим отличием: 2: (2,15) и равен l [3:15] = 00111100001110 (сl = 1100111100001110).
Сложность времени:
2 прохода, первый для накопления Dn, второй для построения словаря.найти максимальное значение в словаре.
Итого: O (n)
Пространство сложности:
текущий элемент в D: O (1)словарь O (Dn)
Я не беру 3 и 4 в словаре из-за замечания
Сложность O (n) времени и O (Dn) пространства(в среднем случае Dn << n). </strong>
Я думаю, что для этого подхода может быть лучший способ, чем словарь.
Любое предложение приветствуется.
Надеюсь, что это поможет
ВТОРОЕ РЕШЕНИЕ (ПРОСТО ИДЕЯ, А НЕ РЕАЛЬНОЕ РЕШЕНИЕ)
Второй способ - преобразовать вашесписок в D. (так как легко вернуться из D в список, все в порядке).(O (n) время и O (1) пространство, так как я преобразую список на месте, даже если он не может быть «действительным» O (1))
Тогда из D вам нужно найти2 равных элемента, которые являются более удаленными.
похоже, что найти самый длинный цикл в связанном списке, модификация алгоритма Ричарда Брента может вернуть самый длинный цикл, но я не знаю, как это сделать, и потребовалось бы O (n) время и O (1) пространство.
Как только вы найдете самый длинный цикл, вернитесь к первому списку и распечатайте его.
Этот алгоритм потребует O (n) времени и O (1) космическая сложность.