Задачка. Поиск арифметической прогрессии максимальной длины.

Тема в разделе "WASM.HEAP", создана пользователем jaja, 24 июн 2009.

  1. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    Есть последовательность целых чисел. Нужно в ней выделить числа, которые образуют арифметическую прогрессию максимальной длины. Существует ли алгоритм, который это может сделать за O(n^2) или быстрее?
     
  2. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    Ах да, забыл, числа расположены в случайном порядке.
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Так нужно выбрать подпоследовательность чисел? или составить прогрессию независимо от их исходного порядка?
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    сортируешь и пробегаешься. O(n * log(n))
     
  5. ava

    ava New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2003
    Сообщения:
    169
    Можно и за o(n) управиться :)
     
  6. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    Выбрать подпоследовательность.
    Про O(n) ммм??? Расскажите вашу идею, пожалуйста.
    Про O(n*logn) А пробежка то как раз O(n^2)
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    сама пробежка O(n). В сумме - O(n * (log(n) + 1))
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а, если подпоследовательность, тогда вообще все просто -- O(n) и не нужно сортировки.
     
  9. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    Мы правильно друг друга поняли?
    Подпоследовательность, которая является самой длинной арифметической прогрессией.
    Например, для
    5 12 121 7 1 14 3 9 44 -10
    Это будет 1 3 5 7 9
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    значит сортировка будет нужна, и всё как я написал.
     
  11. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    А подробнее про пробежку можете рассказать?
    ну есть у нас

    -11 1 4 3 5 8 7 9 11 40 99

    Как за линейное время определить самую длинную арифметическую прогрессию?
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    jaja
    Это уже не подпоследовательность. Подпоследовательность - это выборка без перестановок.
     
  13. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Думаю можно сделать так:
    Каждое следующее число вычитать из всех предидущих, разность брать по модулю, и запоминать в таблице найденных разностей (шагов прогрессии), если новой разности в таблице ещё нет, то добавить её туда. Каждому помещённому в таблицу шагу прогрессии сопоставлять счётчик длины и список образующих эту разность значений. Самую длинную последовательность потом отсортировать.
    А обойтись линейной сложностью... боюсь не удастся - от однократного вычитания всех из всех + поиск в таблице уже найденных разностей никуда не денешься.
     
  14. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Вычитание следующего из всех предидущих это n*n/2 вычитаний + поиск в таблице и сортировка резльтата будут зависеть от конкретных данных, но думаю в О(n^2) это уложится.
     
  15. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    jaja
    А числа в исходной последовательности разные? (то бишь это перестановка?)
     
  16. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    Нет. Могут и повторяться.
    Числа влезают в int_64
     
  17. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    jaja
    нечёткий вероятностный подход - o(n) ;))

    оценка снизу >= 2;
    оценка сверху <= MAX(чётных, нечётных, (чётных + нечётных)/2);
     
  18. MEPOX

    MEPOX New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    259
    >Это уже не подпоследовательность. Подпоследовательность - это выборка без перестановок.
    Если то что вы говорите правда, то сортировка не нужна. Если нет, то мне кажется что нужна.
    Во всяком случае лично я ничего другого не вижу.
     
  19. MEPOX

    MEPOX New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    259
    Кстати это будет O(N) если я правильно понял, что такое подпоследовательность.
     
  20. rdtsc

    rdtsc Параллелепипедов Артем

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    180
    Адрес:
    Москва
    гамильтонианом его,гамильтонианом!