Перейти к содержимому

Как уменьшить время выполнения программы c

  • автор:

Как уменьшить время выполнения с 1 секунды хотябы до 100 мс в легчайшем алгоритме?

Решил написать простую программу в целях обучения и практики. Решение правильное, но очень медленное. Сдаю задачку на сайте, 13 из 27 тестов выдаёт около 2 секунд, а нужно меньше 1 секунды. Постарался максимально сократить все if-ы, которые только возможно было, но и это не помогает. Думаю, что основное время затрачивается на прокрутку цикла, но иначе задачу не решить же. У других пользователей среднее время в этой задачке от 14 до 100 мс. Я просто недавно начал, и может этот алгоритм который я написал совсем никак не ускорить, но по другому я просто не представляю как можно это решить. условие задачи Новый русский Витек приватизировал участок в Междолине размером m квадратов с севера на юг и n квадратов с запада на восток. Он решил построить в пределах этого участка дом размером a квадратов с севера на юг и b – с запада на восток. Некоторые квадраты радиоактивны, и Витек не хочет на них строить дом. Кроме того, Витек хочет, чтобы расстояния от стен до границ участка выражалась целым числом квадратов. Долго выбирал он место для дома, но так и не выбрал – слишком много вариантов. А сколько? Начал наш герой считать, но не сумел – плохо математику учил. Помогите ему. Входные данные Напишите программу, которая считывает числа m, n, a, b, k (1 ≤ a ≤ m ≤ 5000, 1 ≤ b ≤ n ≤ 5000, 0 ≤ k ≤ m * n), где m, n – размеры участка, a и b – размеры дома, k – количество радиоактивных квадратов, а затем k неповторяющихся пар чисел i и j (1 ≤ i ≤ m, 1 ≤ j ≤ n), которые определяют координаты радиоактивных квадратов. Выходные данные Вывести искомое количество способов расположения дома. На С++

#include using namespace std; int main() < int m, n, a, b, k, S, Ox, Oy, Oxmain = 1, Oymain = 1, l, t; // m висота n ширина; a висота b ширина bool y = false; cin >> m >> n >> a >> b >> k; int i[100000]; for (l = 1; l > i[l] >> i[l + 1]; > S = a * b; l = 0; while (Oymain > > Oy = Oymain; > if (y); else l++; y = false; Oxmain++; > Oxmain = 1; Oymain++; > cout

Отслеживать

задан 9 окт 2020 в 19:39

user410415 user410415

У вас матрешка из 5-ти вложенных циклов, хотя вложенность 2-й степени циклов уже дает O(n^2) .

9 окт 2020 в 19:55

Матрица m * n заполнена нулями, к точкам с данными индексами, присваиваются единицы. Теперь нужно считать количество площадей, размером a * b, где не встречаются элементы с ненулевым значением

Как уменьшить время выполнения программы?

Переписать алгоритм. А чтобы в этом вам помочь, для начала хотелось бы понять что делает данный алгоритм. На первый взгляд, это поиск числа от 1 до n, сумма делителей которого максимальная, верно?

Ответ написан более трёх лет назад
yll3 @yll3 Автор вопроса

Нет смысла во втором цикле бежать до n. Как минимум можно бежать только до i, а ещё лучше до sqrt(i). И делать не S=S+j;, а S=S+j+i/j;
Это уже значительно ускорит работу программы. А если понять что корень возрастает медленно и не считать его для каждого i, а увеличивать на единицу переменную в которой хранится корень, то.

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ответы на вопрос 1
JoyceGraham @JoyceGraham

На первый взгляд почему бы не вынести
if(S > Smax)
за пределы второго цикла? А то получается при каждом проходе идет проверка.

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

cpp

  • C++

Не могу, понять как компьютер перемещает свой знак?

  • 1 подписчик
  • 14 часов назад
  • 68 просмотров

Как уменьшить время работы программы? C++

Как уменьшить время работы программы?
Выведите на первой строке число от 1 до n, включительно, которое имеет максимальное число делителей. На второй строке выведите число его делителей. Если есть несколько чисел от 1 до n с максимальным числом делителей, выведите любое из них.
Я для трех чисел написал исключение, но замечу что и без него все равно превышено ограничение по времени, n меньше либо равно 100000 (10^5).
Беда именно с большими числами.

#include
using namespace std;

Лучший ответ

твой алгоритм имеет квадратичное время работы, т. к. поиск числа делителей выполняется за линейное время

тривиальный алгоритм поиска делителей n может перебирать числа только до sqrt(n), а не до n/2, тогда любой делитель d в диапазоне [1; sqrt(n)] будет иметь парный делитель n / d, и мы будем добавлять к ответу сразу 2, а не 1 (кроме случая, когда n = d^2)

и да, вынеси поиск числа делителей в отдельную функцию

Илья МуромецУченик (141) 2 года назад

Здравствуйте, спасибо за ответ, можете пожалуйста исправить нужную строчку (и) в коде, я суть понял, но почему-то программа начала выдавать половину правильных ответов, буду очень благодарен!

user49913 Просветленный (38243) int DivisorsCount(int n) < int ret = 0; for (int d = 1; d * d > > return ret; > присобачишь как-нибудь
Остальные ответы
циклиться до sqrt(n), а не до n/2
если i является делителем, то n/i тоже делитель

<от 1 до n, включительно, >
вот определите это число как
int maxNumber = 12345. ;

и сначала тестируйте алгоритм на нем (без ввода cin >> maxNumber;)
и ищите от большего к меньшему
for ( int i = maxNumber; i > 1; i—)

возможно не нужно перебирать все числа (решение в лоб),
а использовать признаки делимости чисел.

Ответы режут форматирование, поэтому свой код лучше
копировать сюда https://pastebin.com
в Ответы давать только ссылку на код.

Избегайте лишних фигурных скобок, это только ухудшает понимание.
if (i % j == 0)
k++;
>
Здесь один оператор всего, лучше записать так:
if (i % j == 0) k++; // одна строчка вместо четырех

// не забывайте хотя бы делать краткие комментарии к коду,
// тем более когда его будут читать другие программисты

λИскусственный Интеллект (212192) 2 года назад
в ссылке готовый код. не тестировал, не вникал.
https://pastebin.com/K5iQdQAA
user49913Просветленный (38243) 2 года назад

совет про фигурные скобки весьма спорный
это сейчас там один оператор, а если понадобится второй добавить?
придётся доставлять ручками фигурные скобки, а ещё можно (с похмелья, например) вообще забыть их добавить и потом искать багу много минут
да и диффы куда красивее получаются
обычная практика в индустрии — это как раз всегда ставить фигурные скобки, даже если оператор один
пример — google c++ style guide

λ Искусственный Интеллект (212192) user49913, Стиль — дело вкуса. ( Пишу (я на лиспе) вообще (без скобок ни как))

Как уменьшить время выполнения программы c

Некоторое время назад мне понадобилось измерить время работы одного алгоритма, и я нашел быстрое решение для этого: Вычислениe времени выполнения участка кода на Си/C++. Дальнейшее исследование показало, что способ этот отнюдь не идеален.

Метод измерения времени

Итак, есть два основных типа измерение времени работы программы: измерение процессорного времени, то есть времени, которое процессор фактически потратил на выполнение заданного кода, и измерение так называемого wall-clock time — времени, которое реально прошло от старта программы до окончания ее работы. Основная разница между этими двумя измерениями заключается в том, что про измерении wall-clock time учитывается также время, которое процессор потратил на обработку других процессов. Соответственно, при разной загрузке системы, wall-clock time может отличаться для одного и того же кода. Также при наличии, например, записи в файл, время записи тоже будет включено в wall-clock time. Поэтому при измерении времени работы алгоритмов (а именно для этого я использую измерение времени), предпочтительнее смотреть именно на процессорное время.

Wall-clock time

В случае, если все-таки необходимо использовать wall-clock time (например, в случае профайлинга операций, включающих запись на носитель, или сетевое взаимодействие), использованная мной раньше функция gettimeofday() тоже плохо подходит по следующим причинам:

  • gettimeofday() использует приблизительное время, рассчитанное исходя из последнего замера системного времени. На примере это можно показать так: я смотрю на часы, они показывают 10:03. Примерно через 40 минут вы спрашиваете у меня, сколько сейчас времени, и я отвечаю: «примерно 10:43». Потом я опять смотрю на часы, а на часах еще 10:37. Вы снова спрашиваете меня через минуту: «а сейчас сколько времени», на что я отвечаю: «10:38». Получается, что в реальном мире прошла минута, а по вашим замерам время ушло назад на 5 минут (10:43 — 10:38). Такие вещи могут случаться, если последовательно использовать gettimeofday() для рассчета временных интервалов.
  • gettimeofday() может возвращать неравномерно возрастающее время, например, если реализация NTP изменяет время системы. Хотя современные реализации NTP не изменют системное время скачкообразно, но они могу заставлять его изменяться быстрее или медленнее, чтоб сократить разницу.
  • Так же другой процесс может изменить системное время, с помощью, например, функции settimeofday(). Таким образом, время с точки зрения функции gettimeofday() будет изменяться даже не монотонно, а скачком.

Измерение процессорного времени

  • clock() — для всех платформ;
  • уже упомянутая clock_gettime() с параметрами CLOCK_PROCESS_CPUTIME_ID или CLOCK_THREAD_CPUTIME_ID в параметрах — для POSIX.
#include #include #define NS_IN_S 1E9 int main() < struct timespec start, stop, duration; clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start); //Код, время выполнения которого нужно измерить clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &stop); //Вычисления длительности в виде timespec if ((stop.tv_nsec - start.tv_nsec) < 0) < duration.tv_sec = stop.tv_sec - start.tv_sec - 1; duration.tv_nsec = NS_IN_S + stop.tv_nsec - start.tv_nsec; >else < duration.tv_sec = stop.tv_sec - start.tv_sec; duration.tv_nsec = stop.tv_nsec - start.tv_nsec; >//Если нужен результат в секундах double result = duration.tv_sec + duration.tv_nsec / NS_IN_S; return 0; >
9 комментариев :

VarangaOfficial — варанга цена и отзывы — мы работаем только с официальными источниками, и предоставляем вниманию наших пользователей исключительно проверенные, не подвергающиеся сомнениям, факты. Воспользовавшись нашим сайтом, вы сможете узнать исчерпывающую информацию касающуюся представленного средства. Увидеть данные о проведенных клинических исследований, прочитать отзывы реальных пациентов и медицинского персонала. Изучить инструкцию по применению, прочитать об особенностях и методах работы мази, уяснить, в чем заключаются особенности работы крема Варанга, где необходимо заказывать сертифицированный, оригинальный препарат и, как не нарваться на подделку. Мы тщательно проверяем размещаемые данные. Предоставляем пользователям нашего ресурса сведения, почерпнутые только из достоверных источников. Если вы обнаружили признаки появления грибка или же долго и безрезультатно стараетесь излечиться от этого неприятного коварного недуга, на нашем сайте вы отыщете простой и быстрый способ устранения проблемы. Присоединяетесь и живите полноценной, здоровой жизнью. Мы собрали ответы на все вопросы на одном информационном ресурсе. Ответить Удалить

Территория бонго-чата с куклами! Этот эротический видеочат позволяет вам любоваться самыми красивыми русскими женщинами, которые публикуются онлайн прямо из своих комнат. В бонго-чате девушки будут безвозмездно и безрассудно участвовать в своих персиках, если жажда любопытства собеседника сможет их убедить. Нетрудно открыться для непринужденного общения в бонго-чате с русскими женщинами абсолютно бесплатно. Тонны положительных впечатлений ждут вас в лагерях бонго-чата с цыпочками. Вам не стоит спешить, здесь выложено действительно большое разнообразие вариантов, очаровательные лица которых не дадут поводов долго решать, кого из них следует соблазнить в первую очередь. Статус наших эксортесс просто без загрузки, лагеря видеочата бонго позаботились о таких проблемах. Вы можете убедиться, что в интернете мало что может быть приятнее прямого обсуждения. Здесь это нельзя сравнить с поиском записи или монотонной ленты, это зависит только от контакта с моделью в порядке настоящего времени, а также от любого слова, расцветет ли улыбка на ее милом лице. Далее — более того, для этого организован бонго-чат с барышнями, чтобы ничто не ограничивалось одним общением. Русские девушки будут делать такие трюки бесплатно, что вам обязательно захочется посетить этот чат бонго снова в ближайшее время. Скучно просто следить за чужим сексуальным представлением, поэтому имеет смысл забежать в порно чат с красотками и превратиться в полноценного участника такого действа. Предлагаемая эксклюзивная возможность визуального общения не оставит равнодушным ни одного мужчину. Достаточно просто часто кликать в чатах бонго с девушками. У владельцев есть некоторые вопросы о том, где и сколько вы можете приручить онлайн чат с девушками порно, У вас может быть возможность нажать на менеджера на локальной платформе. Ответить Удалить

Банки Финансовые учреждения предоставляют кредитные карты, но у них есть нюансы — высокая комиссия за годовое обслуживание переводов и инкассацию в банкоматах. Ломбарды выдают микрозаймы до зарплаты под залог имущества — ювелирных изделий, оборудования. Когда образуется задержка, ломбард имеет возможность реализовать ценности. Продукт должен соответствовать определенным параметрам. Они не примут оборудование, пришедшее в негодность, займ онлайн Неликвидные ювелирные изделия. Также минус — это довольно нормальный процент. Отличный вариант, но не знакомые могут помочь занять до зарплаты с нашего сайта. Обычно друзья и родственники дают средства без комиссии, и даже в микрофинансовой организации сейчас реально воспользоваться беспроцентным кредитом в рамках акции. Мфо предлагают услугу «микрокредит до зарплаты». Заполнение и зарабатывание денег возможно через интернет. Необходимо заполнить стандартный запрос, и банкноты и монеты зачисляются на личную карту мгновенно. Не нужно давать задаток, приходите на работу, чтобы подписать договор. Когда деньги нужны надолго и быстро, лучший способ — позвонить в микрофинансовую организацию. Возврат средств предлагается в течение 15 месяцев. Переплата небольшая, потому что кредит предоставляется на короткий срок. Пример. Заемщик хочет занять 10 000 тнг ровно на две недели. Ставка по кредиту составляет 2 % в день. Вам нужно вернуть 12800 тнг. Комиссия составит 1280 тнг. Ответить Удалить

В больнице займов «скромные суммы быстро и четко выдаются под проценты займ онлайн. Люди, которым срочно нужны деньги, могут воспользоваться микрозаймом до получения аванса, набрав бесплатный номер телефона или заполнив заявку в нашем интернет-магазине. После отправки заказа наш сотрудник связывается с пользователем в течение получаса и сообщает о принятом решении. В ситуации, когда это положительно, заявитель выбирает наиболее удобный способ получения кредита — в каком-нибудь из офисов или с доставкой в офис и квартиру. Чтобы перевести сумму, вам нужно найти нужные деньги и срок кредита. Определено несколько видов кредитов, для частых пользователей предоставляются кредиты со сниженной процентной ставкой. При предоставлении промо-кода возможен кредит до 7 тысяч рублей. В газете под 0%. 1. Для того, чтобы получить кредит, вам необходимо перейти на соответствующую кнопку: 2. После этого вы будете перенаправлены на страницу официального сайта производителя «центр займов» (centrzaimov.Ru), где вы можете использовать интерактивный калькулятор, чтобы выбрать желаемые характеристики (деньги и продолжительность) для предоставления вам кредита: Повышенное внимание при выборе кредитного продукта следует уделять доступным категориям заемщиков. Иногда для постоянных клиентов компании начисление процентов уменьшается с каждым выданным кредитом. Специальные условия действуют также для инвалидов. Вы можете узнать больше о процентной ставке в своем личном кабинете; 3. После выбора условий, заполнения контактной информации (фио, дата рождения, номер телефона для связи, регион оформления кредита) и нажатия кнопки «получить средства» вы полностью изучаете заявку. Это необходимо для быстрой подачи заказа. Ответить Удалить

Тем, кто желает получить деньги под залог машины или ПТС, рекомендуем не торопиться обращаться в банк. Проанализирует предложения по залоговым кредитам не только от банков, но и от специализированных компаний автоломбард под птс. Займ в таких организациях выдаются в залог авто различных марок и моделей без требовательных требований к заемщику. Ответить Удалить

Каждый мужик хотя бы раз в своей жизни безусловно сталкивался с обломами. Попробуй припомнить эту историю: ты гуляешь с шикарной девченкой, истратил козны на цветы, шампанское и конфеты, а обмен получал более поцелуйчик в щечку интим досуг за деньги в Москве ну смс-ку на ночь. Но с проституткой ты точно получишь данную сладкую дырочку! Уж чем предпочесть страстный секс с ночной феей, нежели выпрашивать его у что,этой, кот-ая способна принять подарочки, а тебя оставить ни с чем, согласен? Ответить Удалить

Когда отберёте понравившееся вознаграждение, придёт время прокрутить вейджер. Это одно из основных требований, полагая неотъемлемой верификации. Если на веб-сайте учтена обязательная процедура подтверждения личности 1xslots casino, то ликвидировать выигрыш получится только последствии проверки данных. Приготовьтесь наполнить анкету и выслать в техподдержку документ, подтверждающий лицо. Ответить Удалить

Закупать ссылки стопам для низкочастотных запросов, потом – среднечастотных, последствии – высокочастотных где купить ссылки для продвижения сайта. Отбираем страницы, формируем оригинальные анкоры и начинаем находить доноров. Желательно покупать 1-2 бэклинка сутки, максимально – 3-4. Главное – творить все умеренно. Если незамедлительно купить большое рекомендаций, велика возможность попасть под фильтр от Google. Ответить Удалить

Легко получить. Есть число каталогов и сервисов, позволяющих покупка ссылок для продвижения сайта в задаром заполучить массу таких назначений. Конкуренции между 2-мя ресурсами нет, в сего замен ссылками не сделает конфликтных обстановок. Ответить Удалить

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *