Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 5
Регистрация: 14.12.2015
Сообщений: 186

Как ускорить работу программы, если элементов много?

25.07.2019, 17:18. Показов 733. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такое задание: Найти медиану в массиве.

The median is the middlemost element of the array when sorted. For simplicity,
when an array contains an even number of elements, we'll consider the smaller of
the two candidates as the median. Therefore, the median of [1, 8, 4, 7, 13] is 7,
and the median of [1, 8, 4, 7] would be 4.

Но тут уточнено одно условие:
Note that explicitly extracting every prefix from the input array, sorting it then
trying to find the middlemost element will be way, way too slow to achieve the
satisfactory efficiency. The benchmark here is being able to process an array
containing a hundred thousand elements in a second or two.

Пример входных данных:
PHP
1
incrementalMedian([1, 8, 4, 7, 13]);
Ожидаемый результат:
PHP
1
//[1, 1, 4, 4, 7]
Я решил задачу следующим образом:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function incrementalMedian(array $values): array{
    sort($values);
    $i = 1;
    $tmp = array();
    $result = array();
    do{
        $tmp = array_slice($values, 0, $i);
        
        if(count($tmp) % 2 != 0){
            $median = $tmp[(count($tmp) / 2)];
        }else{
            $median = min($tmp[(count($tmp) / 2) - 1], $tmp[(count($tmp) / 2)]);
        }
        array_push($result, $median);
        $i++;
    }while($i <= count($values));
    return $result;
}
$values = array(1, 8, 4, 7, 13);
$values = incrementalMedian($values);
print_r($values);
Я занёс массив из 100 тысяч элементов, и мне выдало ошибку, мол процесс выполнялся дольше 30секунд.
Вопрос: как ускорить функцию и что конкретно долго выполняется?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.07.2019, 17:18
Ответы с готовыми решениями:

Как ускорить работу вебсайта
Основнок время при работе вебсайта это запрос к базе данный.Как работает жесткий диск: ...

Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести 2; если строку нельзя
Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести 2; если...

Ускорить работу интерпретатора
Очень тяжелый скрипт на 2 часа при работе загружает проц только на 10-15%. Есть ли какие-то настройки для apache или php чтобы отдать...

4
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
25.07.2019, 17:37
Если я прааильно понял, то псевдокод примерно такой
sort(arr)
return [arr[0], min(arr[0], arr[1]), arr[1], min(arr[1], arr[2]), arr[2], ...]
1
0 / 0 / 5
Регистрация: 14.12.2015
Сообщений: 186
25.07.2019, 17:56  [ТС]
Есть массив
PHP
1
$values = [1, 8, 4, 7, 13]
сортируем его [1, 4, 7, 8, 13]
далее ищем медиану по такому принципу:
для одного эелемента массива:
PHP
1
array_slice($values, 0, 1)
для двух элементов массива:
PHP
1
array_slice($values, 0, 2)
и так до последнего элемента массива.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
25.07.2019, 18:01
blocker147, значит я правильно понял
1
0 / 0 / 5
Регистрация: 14.12.2015
Сообщений: 186
25.07.2019, 18:22  [ТС]
Я сделал таким образом:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function incrementalMedian(array $values): array{
    sort($values);//сортируем массив
    $i = 1;//переменная хранит порядковый номер элемента входного массива
    $tmp = array();//создаём временный массив в котороам будем искать медиану
    $result = array();//в результирующий массив запишем все медианы
    do{
        $tmp = array_slice($values, 0, $i);//во временный массив записали элементы из входного массива
        
        if(count($tmp) % 2 != 0){//если нечётное количество элементов во временном массиве, то медиана это число по середине
            $median = $tmp[(count($tmp) / 2)];
        }else{
            $median = min($tmp[(count($tmp) / 2) - 1], $tmp[(count($tmp) / 2)]);//если чётное то медиана это наименьшее из двух чисел посередине стоящих посередине массива
        }
        array_push($result, $median);//записали в результирующий массив нашу медиану
        $i++;//инкрементировали 
    }while($i <= count($values));//пока не дошли до конца входного массива
    return $result;
}
$values = array(1, 8, 4, 7, 13);
$values = incrementalMedian($values);
print_r($values);
Добавлено через 14 минут
так ну я сделал по алгоритму который предложили Вы:
PHP
1
2
3
4
5
6
7
8
9
10
$a = 0;//количество элементов в массиве
$result = array();//сюда запишем медианы
do{
    if($values[$a] % 2 != 0){//если нечётное 
        array_push($result, $values[$a]);//записываем в результирующий массив элемент по индексу 1-3-5-7-9-...
    }else{
        array_push($result, min($values[$a], $values[$a + 1]));//записываем в массив минимальное из двух по середине
    }
    $a++;
}while($a < count($values));
так должно быстрее работать?

Добавлено через 5 минут
только что проверил 100.000 элементов выполнилось сразу, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.07.2019, 18:22
Помогаю со студенческими работами здесь

ускорить работу скрипта
Друзья - php скрипт выполняется более 400 секунд! Подскажите что можно подправить - что бы ускорить работу! &lt;?php $dbh =...

Ускорить работу тестов
Практически в каждом тесте точнее в класе тестов в setUp вызываю такую функцию $this-&gt;client-&gt;request( 'POST', ...

Ускорить работу file_get_contents возможно?
Нужно прочесть страницу и вытащить оттуда 30 байт. Страница у них очень тяжелая Читаю $text = file_get_contents...

Как можно ускорить загрузку рисунок которые создаются скриптом?
Ребята! Вопрос такой: Как можно ускорить загрузку рисунок которые создаются скриптом ... Если нельзя ... так и скажите, нельзя :)

Как ускорить процесс расстановки checkbox?
при расстановки большого количества checkbox echo &quot;&lt;input type='checkbox'&gt;&quot;; страница долго открывается. Как можно это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru