20 / 20 / 12
Регистрация: 16.01.2010
Сообщений: 66
|
||||||
1 | ||||||
нужна оптимизация приложения06.04.2012, 14:26. Показов 2701. Ответов 39
Метки нет (Все метки)
Одной ночью коту Мурзику приснилось, что он судья на математических соревнованиях крыс. Соревнования проводятся среди N команд по K крыс в каждой. Соревнования проводятся в К раундов, в каждом из которых представитель команды называет число. Побеждает та команда, у которой произведение всех чисел наибольшее. Почему крысы не называют каждый раз максимально возможное число? На то они и крысы, что в отличии от Мурзика, обделены интеллектом. Но и Мурзик понимает, что сам подсчитать результат не сможет из-за недостачи математических способностей и поэтому просит вашей помощи.
Технические условия Входные данные Первая строка содержит два целых числа N и K (0 < N ≤ 20, 0 < K ≤ 100000). Следующие К строк содержат по N чисел, которые называют представители команд. Причем крысы, как представители образованного вида, знают только 32-битовые знаковые числа. Выходные данные Номер команды, выигравшей соревнования. Если несколько команд имеют одинаковые результаты, то побеждает та, у которой больше номер. Лимит времени: 2 секунды Лимит памяти: 64 MB вот решение:
на четырех тестах не хватает времени (2 сек). как решить эту проблему?
0
|
06.04.2012, 14:26 | |
Ответы с готовыми решениями:
39
Типы оптимизация: черная оптимизация, серая оптимизация и белая оптимизация Нужна оптимизация Оптимизация приложения Оптимизация приложения |
20 / 20 / 12
Регистрация: 16.01.2010
Сообщений: 66
|
|
06.04.2012, 18:17 [ТС] | 21 |
0
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
||||||
06.04.2012, 18:26 | 22 | |||||
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
06.04.2012, 18:29 | 23 |
Тогда попробуй, как тебе уже советовали, считать не по честному. Сделай для каждого загруженного целого сдвиг на 24 бита вправо и умножай получившиеся числа. Они будут не больше 255. Может и хватит даблов.
0
|
Higher
|
|
06.04.2012, 19:08 | 24 |
Ну там тема на длинную арифметику, так что придется ее написать.
Я за 2 минуты накидал решение с double, максимальное время работы - 0.6 секунд, но на 6 тестах валится где-то. Тут длинную арифметику нужно неплохо так реализовать, если хранить 9 знаков в одном элементе массива, то все равно будет не особо быстро. Вроде можно по 17-18 хранить, но тогда нужно будет контролировать переполнение через asm-вставки. Где-то читал про такое, но не уверен, что даже на ассемблере можно умножить 2 64битных числа.
0
|
20 / 20 / 12
Регистрация: 16.01.2010
Сообщений: 66
|
|
06.04.2012, 19:16 [ТС] | 25 |
0
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
||||||
06.04.2012, 20:51 | 26 | |||||
быдлокод :)
Добавлено через 49 минут С умножением что-то не так... Проверил - в конце выводит то, что задал в начале (пробовал другие числа любой длины кроме 1 начальным значением).
0
|
06.04.2012, 21:18 | 27 |
Nekto, нужна оптимизация по скорости - не используй С++, используй Си.
Любой алгоритм на С++ можно переписать на Си, который будет выполняться быстрее. Классы, STL и т.д. и т.п. только замедляют выполнение программы.
0
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
|
06.04.2012, 21:19 | 28 |
0
|
06.04.2012, 22:45 | 30 | ||||||||||
Да ладно вам, считайте приближённо, складывая только порядки величин.
Вот: как вам это? Не уверен, правда, что будет быстрее.
0
|
06.04.2012, 23:11 | 32 | |||||
Как известно положительный int32 выглядит так
5=00000000000000000000000000000101 мы считаем нули сначала бит.маска mask=1<<30=01000000000000000000000000000000 (старший бит - знак) мы двигаем маску вправо, чтобы определить порядок числа, пока не доберёмся до старшей единицы. cnt=2; mask=00000000000000000000000000000100 если видим, что следующий бит=0 (как в примере), то округляем число до 1<<mask=4, если бы число было 7=00000000000000000000000000000111, то округляем число до 1<<mask+1=8, Но значение чисел нам не важны и мы эту операцию (1<<mask=) даже не выполняем вместо этого мы суммируем в переменной result все показатели, т.к 2^n*2^m=2^(n+m) Как известно ОТРИЦАТЕЛЬНЫЙ int32 выглядит так -5=11111111111111111111111111111011 мы считаем нули сначала бит.маска mask=1<<30=01000000000000000000000000000000 (старший бит - знак) мы двигаем маску вправо, чтобы определить порядок числа, но теперь наоборот: перебираем все единицы, пока не получим старший нуль Далее аналогично Добавлено через 5 минут Ну а как иначе предлагаешь оценить произведение 100000 чисел, каждое 32 разряда, не вызвав переполнение? Суммировать их порядки - идеальный вариант. Да, проблема - операция получения порядка числа, если кто знает более оптимальный вариант - отзовитесь. Возможно можно как-то вытащить порядок битовыми операциями c float
0
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
||||||
07.04.2012, 02:30 | 33 | |||||
нужна оптимизация приложения Так что, никто не знает, в чем ошибка? Посмотрите хотя бы первую функцию (mult). Она правильно должна работать?
Добавлено через 3 минуты В моём варианте числа хранятся в векторе. На тестовых вариантах получается максимальное время 1375 ms, память 8.5 mb. Но умножение почему-то вообще не меняет изначальное число. Наверное в синтаксисе где-то ошибка, потому что внутренности копировал из статьи про арифметику длинных чисел. Добавлено через 1 час 44 минуты Оптимизировал немного, нашел ошибку. Проходит 70% тестов. На одном неверный ответ, на остальных не хватает времени
0
|
07.04.2012, 12:59 | 34 |
Ну так скажи, ты всё ещё хочешь в лоб умножать или прислушаешься к моему варианту?
Обрати внимание: в задаче тебя не просят сказать, с каким конкретно счётом команда выиграла соревнования. Тебе нужно просто назвать победителя, а мой метод приближённого умножения, как раз позволяет это быстро оценить! Зачем изобретать методы длинного умножения? Зачем вычислять точно мантиссу произведения всех чисел, когда нам достаточно лишь знать порядок? Зачем эти пляски с векторами, которые только замедляют алгоритм? Ты точно понял суть моего предложения алгоритма?
0
|
Higher
|
|
07.04.2012, 13:07 | 35 |
По хорошему другого варианта нет, т.к. остальные методы неточные.
Я попробовал набросать длинку на С, но жрется 106% времени все равно. Можно попробовать распараллелить вычисления, или хранить цифры в 64битном числе и умножать через asm-вставки. Еще вариант - можно слегка оптимизировать, если брать за основание не степень десятки, а степень двойки, тогда будет работать немного быстрее и есть меньше памяти, правда будет сложновато выводить такие числа, но в данной задаче это и не требуется. P.S. Nekto, имхо, плохая оптимизация, т.к. в худшем случае время только увеличиться.
0
|
07.04.2012, 13:27 | 36 | ||||||||||
Нет, есть. Считать результаты крысиных команд, как сумму ближайших степеней двойки, а когда выяснится, что у пары команд одинаковые результаты, можно и поточнее для них пересчитать.
Но вот о скорости надо думать в первую очередь. А значит, никакой длинной арифметики. К тому же в моём решении берётся не просто порядок старшего бита числа, а в зависимости от следующего за ним бита, округляется в ближайшую сторону, то есть в среднем ошибка накапливаться не должна. Я думаю, составитель задания хотел именно это проверить. А не то, что задачу можно перемножить в лоб длинной арифметикой. К тому же вектора - зло. Ты только представь, на сколько это
Присутствие нуля должно отменять весь подсчёт произведения и переходить к следующей команде.
0
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
|
07.04.2012, 14:04 | 37 |
А если окажется, что 20 команд с одинаковыми степенями?
Добавлено через 8 минут Деление на миллиард идёт
0
|
07.04.2012, 14:29 | 38 |
Естественным желанием при оптимизации было бы.
1) Заменить деление на сдвиг, основание на степень двойки. 2) Использовать вместо вектора статический массив.
0
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
||||||
07.04.2012, 14:40 | 39 | |||||
0
|
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
||||||
08.04.2012, 18:22 | 40 | |||||
вот так проходит все тесты:
1
|
08.04.2012, 18:22 | |
08.04.2012, 18:22 | |
Помогаю со студенческими работами здесь
40
Оптимизация приложения Оптимизация приложения Оптимизация приложения Оптимизация приложения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Как работать с ветками (branch) в Git
InfoMaster 17.01.2025
Система контроля версий Git произвела революцию в процессе разработки программного обеспечения, предоставив разработчикам мощный инструмент для управления изменениями в коде. Одной из наиболее важных. . .
|
Как откатить последние коммиты в Git
InfoMaster 17.01.2025
Система контроля версий Git стала неотъемлемой частью современной разработки программного обеспечения, предоставляя разработчикам мощные инструменты для управления изменениями в коде. Одним из. . .
|
Что такое boilerplate и scaffold, чем они отличаются
InfoMaster 17.01.2025
В современном мире разработки программного обеспечения эффективность и скорость создания качественного кода играют crucial роль в успехе проектов. Разработчики постоянно ищут способы оптимизировать. . .
|
Чем отличаются ссылки и указатели в С++
InfoMaster 17.01.2025
В современном программировании на C++ эффективная работа с памятью является ключевым аспектом разработки качественного программного обеспечения. Указатели и ссылки представляют собой два. . .
|
В чем разница между PUT и POST
InfoMaster 17.01.2025
В современной веб-разработке правильное использование HTTP-методов играет ключевую роль в создании надежных и эффективных API-интерфейсов. Протокол HTTP прошел долгий путь развития с момента своего. . .
|
DTO, POCO и Value Object: что это такое, когда и как использовать
InfoMaster 17.01.2025
Введение в паттерны передачи данных
В современной разработке программного обеспечения эффективное управление данными и их передача между различными слоями приложения являются ключевыми аспектами. . .
|
Что такое pull request в Git
InfoMaster 17.01.2025
В современной разработке программного обеспечения pull request в Git представляет собой ключевой механизм для эффективного взаимодействия между разработчиками при работе над общим кодом проекта. По. . .
|
Как вернуться к предыдущему коммиту в Git
InfoMaster 17.01.2025
Система контроля версий Git представляет собой мощный инструмент для управления изменениями в программном коде, который позволяет разработчикам эффективно отслеживать и контролировать историю. . .
|
Что такое паттерны программирования и проектирования
InfoMaster 17.01.2025
Роль паттернов в современной разработке программного обеспечения
В современном мире разработки программного обеспечения паттерны проектирования стали неотъемлемой частью профессионального подхода. . .
|
Как добавить конструктор Яндекс Карт на сайт
InfoMaster 17.01.2025
Введение в API Яндекс Карт
В современной веб-разработке интеграция картографических сервисов стала неотъемлемой частью многих проектов. API Яндекс Карт представляет собой мощный инструмент для. . .
|
Что такое javascript:void(0) и зачем это нужно
InfoMaster 17.01.2025
Когда вы сталкиваетесь с веб-разработкой, особенно с использованием JavaScript, одной из директив, которая часто встречается, является javascript:void(0). Это выражение вызывает интерес из-за своей. . .
|
Что такое оркестрация и хореография микросервисов
InfoMaster 17.01.2025
Введение в оркестрацию и хореографию микросервисов
В современном мире разработки программного обеспечения микросервисная архитектура стала ключевым подходом к созданию масштабируемых и гибких. . .
|