Ответы пользователя по тегу Алгоритмы
  • Как реализовать алгоритм группировки массива по значению?

    GomelHawk
    @GomelHawk
    PHP / Symfony developer
    Если предположить, что дни недели упорядочены по возрастанию, то можно использовать что-нибудь такое:

    $openingHours = [
        ['day' => 'monday', 'time' => '08:00-20:00'],
        ['day' => 'tuesday', 'time' => '08:00-20:00'],
        ['day' => 'wednesday', 'time' => '08:00-23:59'],
        ['day' => 'thursday', 'time' => '08:00-20:00'],
        ['day' => 'friday', 'time' => '08:00-20:00'],
        ['day' => 'saturday', 'time' => '10:00-16:00'],
        ['day' => 'sunday', 'time' => '10:00-16:00'],
    ];
    
    $result = $active = [];
    
    $openingHours[] = ['day' => '', 'time' => '']; // empty value to simplify code
    
    foreach ($openingHours as $openingHour) {
        if ($active) {
            if ($active['time'] === $openingHour['time']) {
                $active['end'] = $openingHour['day'];
            } else {
                $key          = $active['end'] ? $active['start'] . '-' . $active['end'] : $active['start'];
                $result[$key] = $active['time'];
                $active       = [];
            }
        }
        $active = $active ?: [
            'time'  => $openingHour['time'],
            'start' => $openingHour['day'],
            'end'   => null,
        ];
    }
    
    print_r($result);
    Ответ написан
    1 комментарий
  • Какой алгоритм выбрать для поиска в тексте?

    GomelHawk
    @GomelHawk
    PHP / Symfony developer
    Можно использовать алгоритм "игры в морской бой":
    1. Есть исходная матрица с данными
    2. Создаешь такую же пустую матрицу - это будет маска, где помечаешь обработанные ячейки.
    3. Последовательно проходишь по исходной матрице (с учетом обработанных ячеек в маске). Если буква - помечешь в маске. Если пробел - рекурсивно проходишь по всем связанным ячейкам (как вода заливает область), помечая при этом ячейки в основной маске и дополнительном слое-маске активной выявляемой фигуры (из пробелов).
    4. Обрезаешь фигуру в дополнительном слое (она может быть произвольной формы, в одной строке два пробела, в другой - пять) под необходимые требования (в данном случае - квадрат) и сохраняешь полученный результат.
    5. Возвращаешься к пункту 3 если есть необработанные ячейки.
    Ответ написан
    Комментировать
  • Поиск по массиву цветов

    GomelHawk
    @GomelHawk
    PHP / Symfony developer
    Я когда-то использовал следующий алгоритм (у меня стояла правда задача не получить абсолютно близкое значение, а просто цвет из близкой зоны, но вдруг что почерпнешь и для себя):

    1. Создается равномерный трехмерный массив (Р) в заданном пространстве с определенным шагом, к примеру 4. То бишь координаты в RGB у элементов будут 000, 400, 040, 440 и т.д.

    2. Проходим по всем элементам исходного массива (А) цветов и заполняем на базе этих данных наш равномерный массив (Р). Если у нас к примеру в исходном массиве (А) есть цвет 511, то запоминаем эти данные для самого близкого элемента в массиве (Р): Р[400]=511 иначе оставляем Р[400]=0

    3. Теперь нам достаточно при поиске ближайшего цвета (В) просто обратиться напрямую к ближайшему по сетке элементу массива (Р):
    В[301] -> ближайший цвет в сетке 400 -> Р[400]=511 -> ближайший исходный цвет 511…
    Ответ написан
    1 комментарий