#python #arrays #numbers
#python #массивы #числа
Вопрос:
Проблема:
У меня есть поток чисел, которые расположены на неравном расстоянии друг от друга в качестве входных данных, и мне нужно найти последовательность чисел, используя приведенную выше, которая возвращает как можно больше чисел для первой последовательности, но с равным интервалом.
Пример:
stream = [1,4,9,11,12,17,18,25,30,33,34,41,44,49,57,65,73,81,89,90,97,100]
Мне нужно найти последовательность, содержащую как можно больше равномерно разделенных чисел
Например, я знаю, что могу найти:
1,9,17,25,33,41,49,57,65,75,81,89,97
все они разделены цифрой 8.
Как мне решить эту проблему в целом?
Комментарии:
1. @Taegyung: Этот вопрос предполагает подпоследовательность (непрерывный ряд чисел); в этом вопросе есть промежуточные элементы.
2. Это поток (как в бесконечном источнике) или просто конечная последовательность (как в списке или одномерном массиве)? Если это бесконечный источник, и если числа действительно случайны, существует бесконечное количество ответов — вы сможете найти равномерно распределенные последовательности любого возможного размера шага. С другой стороны, если это просто конечный список, тот факт, что числа являются «случайными», вероятно, становится неактуальным для вашего требования.
3. Из его примера мне кажется довольно ясным, о чем он говорит. Я ожидаю, что под «случайным» он подразумевает «произвольный».
Ответ №1:
def find_seq(lst):
running = []
done = []
so_far = []
for element in sorted(lst):
still_running = []
for run in running:
d, m = divmod(element - run[0], run[2])
if m == 0:
if d == run[1]:
run[1] = 1
still_running.append(run)
else:
done.append(run)
else:
still_running.append(run)
running = still_running [[previous, 2, element - previous] for previous in so_far]
so_far.append(element)
return max(done running, key=lambda run: run[1])
start, length, step = find_seq([1,4,9,11,12,17,18,25,30,33,34,41,44,49,57,65,73,81,89,90,97,100])
Для каждой пары элементов мы предполагаем, что они начинают последовательность (с предполагаемой длиной 2 для начала). Для любого нового элемента мы проверяем, поместится ли он в последовательность (или больше), которую мы отслеживаем; если это так, но значение было пропущено, последовательность завершена; в противном случае мы увеличиваем длину последовательности. Все последовательности завершатся в конце ввода. Тогда легко увидеть, какая последовательность выполнялась дольше всего.