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

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

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

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

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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2019, 17:18
Ответы с готовыми решениями:

Динамический массив, много циклов и простые числа. Как ускорить работу программы ?
Всем привет. Задание следующее: Кто нибудь вводит с клавиатуры число n и k, должен создастся...

Ускорить работу программы, содержащей много сессий
Это мой первый проект, поэтому я использовал много сессий и тд, при этом сайт теперь работает 10+...

Как ускорить работу программы
Доброго времени суток! Разработал первую программу для logo! на FBD. На симуляторе все...

Подскажите, как можно ускорить работу программы
Условие: Первая строка входных данных содержит натуральное число N - количество элементов массива...

4
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
25.07.2019, 17:37 2
Если я прааильно понял, то псевдокод примерно такой
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  [ТС] 3
Есть массив
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 4
blocker147, значит я правильно понял
1
0 / 0 / 5
Регистрация: 14.12.2015
Сообщений: 186
25.07.2019, 18:22  [ТС] 5
Я сделал таким образом:
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
25.07.2019, 18:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2019, 18:22
Помогаю со студенческими работами здесь

Подскажите пожалуйста как ускорить работу программы!
Есть задача :&quot;Во входном файле (вы можете читать данные из файла input.txt) записан текст. Словом...

Ускорить работу excel, когда в ячейках много пользовательских функций на VBA
Когда вставляю в большое количество ячеек даже относительно простые функции на VBA, Excel всё равно...

Ускорить работу программы
Лексикографический порядок чисел (Время: 1 сек. Память: 16 Мб Сложность: 31%) Натуральные числа...

Ускорить работу программы
суть такова, на форме имеется два текст бокса и кнопка, в первый текст бокс вводится набор букв, во...

Ускорить работу программы
// 1-й вариант using System; using System.Net; using System.Collections.Generic; using...

Ускорить работу программы
Здравствуйте. Помогите пожалуйста ускорить работу программы: n = d = for i in range(n): ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru