Поиск максимума и минимума

Тема в разделе "WASM.A&O", создана пользователем Yashin_Sergey, 15 июн 2007.

  1. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    Yashin_Sergey
    Значит я сейчас что - то не дотягиваю - надо подумать, но результат сильный.
     
  2. Yashin_Sergey

    Yashin_Sergey Сергей

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    62
    Адрес:
    Москва
    Тормозить он как раз то и не будет а будет так же выполняться как обычный перебор на каждом элементе.
     
  3. Yashin_Sergey

    Yashin_Sergey Сергей

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    62
    Адрес:
    Москва
    Всё верно, у меня в массиве ценовые котировки рынка, а это в общем случае детерминированный случайный процесс.
     
  4. Yashin_Sergey

    Yashin_Sergey Сергей

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    62
    Адрес:
    Москва
    Если строить дерево а потом просто брать минимум и максимум то получится не просто медленно а очень медленно.
    Так как для каждого эелементе мы выполняем несколько операций а не одну единственную операцию сравнения.
    Дерево то потом не нужно.
     
  5. Yashin_Sergey

    Yashin_Sergey Сергей

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    62
    Адрес:
    Москва
    И так тоже можно, и времяы последующих исполнений созранится, только памяти надо много для такого массива,
    если бы не такой выигрыш в скорости скорее всего так бы и делал.
     
  6. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    объясните, пожалуйста, как же выигрыш получаеться, ведь под перебор подпадают все элементы - приведите пример кода, пожалуйста, желательно на с++.
    ------------------------------------------------------------------
    Заранее благодарен.
     
  7. Yashin_Sergey

    Yashin_Sergey Сергей

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    62
    Адрес:
    Москва
    Выигрыш получается ни "как ?" а "за счет". За счет сокращения количества циклов для поиска максимума и минимума. На С у меня кода нет, к сожалению или к счастью. :)
     
  8. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    Yashin_Sergey
    так все же -все элементы перебираются?
     
  9. Yashin_Sergey

    Yashin_Sergey Сергей

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    62
    Адрес:
    Москва
    Если нужно перебрать эелементы заново то конечно каждый из 10 тыс.
     
  10. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    Yashin_Sergey
    насколько я понял: сначала находим мин./макс. первого сегмента, а затем эти экстремумы сравниваем с элементами других сегментов, но ведь количество сравнений тоже самое.
     
  11. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Народ, а о чем собственно спор? Кто-то может найти минимум из N элементов меньше чем N-1 сравниванием? :)
     
  12. Yashin_Sergey

    Yashin_Sergey Сергей

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    62
    Адрес:
    Москва
    1. находим мин. макс.
    2. переходим к новому элементу.
    3. вышли прошлые мин. или макс. за границу плавающего окна ?
    3.1 вышли: заново находим мин. макс. из 10 тыс. соседних элементов.
    3.2 не вышли: сравниваем новый элемент: больше макс. значит это новый макс., меньше мин. значит это новый мин.


    за счет того что массив - случайный набор чисел, то пункт 3.2. выполняется чаще так как мин. и макс. не всегда находятся в конце плавающего окна.

    Подробнее некуда.
     
  13. Yashin_Sergey

    Yashin_Sergey Сергей

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    62
    Адрес:
    Москва
    Оказывается, что не всегда нужно делать N сравнений, а достаточно одного.
     
  14. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    Yashin_Sergey
    странный алгос: если мин./макс. не вышел за границу - это не значит, что старые экстремумы действительны.
    например, возьмём массив: 3, 7, 5, 3, 1; длина окна: 4

    1. содержимое окна: 3, 7, 5, 3.
    2. содержимое окна: 7, 5, 3, 1.

    экстремумы старые не вышли за границу, но нижний на втором шаге не законен.
     
  15. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    не легче ли экстремумы для сегментов набирать по мере поступления данных?
     
  16. Yashin_Sergey

    Yashin_Sergey Сергей

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    62
    Адрес:
    Москва
    И где в этом примере алгоритм ошибется ?

    1. содержимое окна: 3(1), 7(2), 5(3), 3(4). - макс = 7(2), мин = 3(4)
    2. содержимое окна: 7(2), 5(3), 3(4), 1(5). - макс = 7(2), мин = 1(5) (так как 3(4) не вышел за границу окна то сравниваем минимум с новым элементом т.е. 1(5), меньше ? значит мин = 1(5))

    Если даже брать за минимум 3(1) то на след. шаге (2) 3(1) выйдет за границу и тут уже перебираем каждый элемент,
    и минимум будет равен 1(5) всё равно.

    Так сработает алгоритм. В чем вопрос ?
     
  17. Yashin_Sergey

    Yashin_Sergey Сергей

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    62
    Адрес:
    Москва
    Смотря для каких данных.

    Так можно делать если данные представленны в виде a, b, c, d где a < b, b < c, c < d и т.п.
    То если окно плавающее то максимумом будет в любом случае следующий элемент, и минимумом будет последний элемент окна.
    Если же окна нет то минимум будет всегда первый элемент а максимумом последний т.е. минимум "a" и максимум "d".

    Если данные представленны как случайный набор чисел то способ только описанный в этой теме или простой перебор каждого элемента на каждом шаге.
     
  18. halyavin

    halyavin New Member

    Публикаций:
    0
    Регистрация:
    13 май 2005
    Сообщения:
    252
    Адрес:
    Russia
    Есть такая структура данных, как дерево отрезков. Она решает эту задачу за O(n\log(m)) в худшем случае, где n - число чисел, m - длина интервалов, на которых нужно искать максимум.

    В данном случае возможна упрощенная ее реализация: считаем максимумы для всех отрезков длины 2^k, 2^k<m. Максимум на отрезке 2^k можно найти за O(1) через максимумы на отрезках длины 2^{k-1}. После чего отрезки длины m представляем как объединение двух отрезков длины 2^k (пересекающихся, если m не степень двойки) и находим максимумы для отрезков длины m за O(1) для каждого.
     
  19. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    Yashin_Sergey
    ага, получается, что внутрений цикл перебора сегмента врубается лишь изредка, ну, что ж признаю алгос IT' S COOOOOOOOO..OOL, но его можно улучшить - зачем сегмент перебирать весь, экстремум может выплыть из окошка, например, на середине сегмента.
     
  20. Yashin_Sergey

    Yashin_Sergey Сергей

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    62
    Адрес:
    Москва
    Если он выплывет на середине окошка то это значит что новый экстремум - в начале окна.