У меня есть миллион целых чисел в отсортированном порядке, и я хотел бы найти самую длинную подпоследовательность, где разница между последовательными парами равна. Например
1, 4, 5, 7, 8, 12
имеет подпоследовательность
4, 8, 12
Мой наивный метод жадный и просто проверяет, как далеко вы можете расширить подпоследовательность из каждой точки. Это занимает время O(n²)
для каждой точки.
Есть ли более быстрый способ решить эту проблему?
Обновление. Я буду проверять код, указанный в ответах, как можно скорее (спасибо). Однако уже ясно, что использование памяти n ^ 2 не будет работать. До сих пор нет кода, который заканчивается при вводе как [random.randint(0,100000) for r in xrange(200000)]
.
Сроки. Я тестировал со следующими входными данными в своей 32-битной системе.
a= [random.randint(0,10000) for r in xrange(20000)]
a.sort()
- Метод динамического программирования ZelluX использует 1.6G оперативной памяти и занимает 2 минуты и 14 секунд. С pypy требуется всего 9 секунд! Однако он падает с ошибкой памяти на больших входах.
- Метод O (nd) времени Armin занял 9 секунд с pypy, но только 20 МБ ОЗУ. Конечно, это было бы намного хуже, если бы диапазон был намного больше. Низкое использование памяти означало, что я мог бы также протестировать его с помощью = = [random.randint(0,100000) для r в xrange (200000)], но он не завершился за несколько минут, которые я дал ему с помощью pypy.
Чтобы проверить метод Kluev I, запустите
a= [random.randint(0,40000) for r in xrange(28000)]
a = list(set(a))
a.sort()
чтобы составить список длин примерно 20000
. Все тайминги с pypy
- ZelluX, 9 секунд
- Kluev, 20 секунд
- Armin, 52 секунды
Похоже, что если метод ZelluX можно было бы сделать линейным, это было бы явным победителем.