За последние 24 часа нас посетили 18998 программистов и 1608 роботов. Сейчас ищут 839 программистов ...

Максимальное падение или просадка в массиве %

Тема в разделе "PHP для новичков", создана пользователем lemonl, 10 ноя 2016.

  1. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    У меня получилось быстрее собрать в массив все просадки
    PHP:
    1. <?php
    2. $data = array(1,2,3,10,6,1,4,5,6,7,42,33,30,38);
    3. $max = 0;
    4. $drawdowns = [];
    5. while (false !== $v = current($data)) {
    6.     if ($max < $v) {
    7.         if (next($data) === false) {
    8.             break;
    9.         }
    10.         $max = $v;
    11.         continue;
    12.     }
    13.     $drawdowns[] = $max - $v;
    14.     next($data);
    15. }
    16. print_r($drawdowns);
    соответственно,
    PHP:
    1. echo max($drawdowns);
    --- Добавлено ---
    Из серединки цикла можно даже выбросить условие, но тогда в массив могут попадать нули (а это как-бы не просадка).
     
  2. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Коллеги, как-то у вас всё сложно.
    Победил лень и сделал оптимальный вариант:
    PHP:
    1.     $result = 0;
    2.     $max = reset($arr);
    3.     foreach($arr as $v) {
    4.         if($v > $max) { $max = $v; }
    5.         if(($max - $v) > $result) { $result = $max - $v; }
    6.     }
    7.     var_dump($result);
    На php-5.6 работает в ~5 раз быстрее, чем у [vs] и в ~8 раз, чем у Deonis, на больших данных от ТС (90 записей).
    Про остальное громко промолчу :)

    п.с. Кстати Deonis, у тебя ещё и считает неправильно.