![]() |
|
Модераторы: bsa |
![]()
|
|
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
компилятор крутой, но в 10 раз быстрее даже он не сделает. почему все пытаются сравнивать строки? их сравнивать надо один раз, в момент размещения. и каждой строке присваивать числовой индекс. каждому объекту соответствует набор числовых индексов. если их хранить отсортированными, можно использовать двоичный поиск, не используя деревьев. плюс выигрыш в операции сравнения. навскидку: не может ли быть полезен boost::multimap? |
||||
|
|||||
| kamre |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 2 Всего: 13 |
Ну это вроде не принципиальная оптимизация...
Я тоже сначала хотел в set результат складывать, но потом заметил, что там любую последовательность можно использовать. Тем более там элементы всегда в строго возрастающем порядке добавляются, так что похоже при добавлении в set там часто дерево перестраивается. Еще вполне возможно в запросе наделать дубликатов и тогда set для хранения имен там лучше, т.к. не нужно будет искать пересечения заведомо одинаковых множеств.
Вообще там входных данных всего не более 512Kb ~ 1000*250 (ассоциации) + 1000*250 (запросы). При чем для самих ассоциаций можно сделать один список, отсортировать его и далее всегда уже оперировать только с номерами в этом списке. По идее запросы на пересечение множеств с числами будут гораздо быстрее работать. Еще у меня есть подозрее на то, что на перекладывание строк из контейнера в контейнер может тратиться заметное время на копирование. P.S. пока Java вариант с его immutable строками и hash-based контейнерами быстрее аналогичного варианта на stl... Это сообщение отредактировал(а) kamre - 2.7.2009, 13:23 |
||||||
|
|||||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Ваш результат на джаве попал в общую сотку лучших. А вообще вышла поразительная ситуация. Решение на Java быстрее и компактнее (код заметно меньше), чем решение на С++. Что делается...! Это сообщение отредактировал(а) Riddik - 2.7.2009, 10:33 |
|||
|
||||
| kamre |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 2 Всего: 13 |
Я там выше не весь код для Java приводил, а только метод для выполнения запросов. Так что там кода примерно столько же в итоге будет.
В Java другие контейнеры используются, алгоритмически более эффективные. Кроме того строки immutable и никогда не копируются, т.к. везде передаются по ссылке. Так что можно еще выжать из stl, тем более что самые быстрые варианты еще в раз в 10-15 быстрее чем мой вариант на Java. |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
что то ситуация с этой задачей меня заинтересовала, будет время - попробую набросать решение.
|
|||
|
||||
| kamre |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 2 Всего: 13 |
Вот немного обновленная полная версия решения на Java (0.656 / 11 170 KB):
Если заменить все HashMap/HashSet на TreeMap/TreeSet, которые алгоритмически соответствуют std::map/std::set, и убрать лишнюю сортировку перед выводом результатов то работает медленнее, но все равно проходит: (1.296 / 11 454 KB). |
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
kamre, респект
По какой причине может попасть в бесконечный цикл на последней строке? Если установить число итераций меньше на единицу, чем нужно, то пробегает быстро, но ответ, соответсвенно неверный, если задать верное число итераций, то сразу превышается тайм-лимит. Не может же последняя итерация длиться больше, чем все итерации до неё вместе взятые? Это сообщение отредактировал(а) Riddik - 2.7.2009, 13:26 |
|||
|
||||
| kamre |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 2 Всего: 13 |
Там же запускается набор тестов, и как только получается неверный ответ - сразу же заканчивается тестирование. Соответственно получается, что на первом же тесте заваливается программа, это очень быстро происходит. А последние тесты скорее всего как раз на timelimit, поэтому как только до них дело доходит программа прерывается снаружи и в табличке видно номер теста, на котором это произошло. Т.е. чем больше номер теста, на котором ошибка, тем больше тестов завершилось вовремя и правильно. |
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Так и есть, я не обратил внимание.
Добавлено @ 13:41 m не может быть больше 1000, если ограничить число итераций в 999, то доходит до 9-го теста, в лимит времени влезает. Если оставить без ограничений, то доходит до 13-го теста. Это сообщение отредактировал(а) Riddik - 2.7.2009, 13:55 |
|||
|
||||
| kamre |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 2 Всего: 13 |
Вот еще свое решение на C++ немного привел в порядок, глядя на код zim22:
Даже побыстрее чем Java вариант: (0.64 / 6 749 KB). Действительно вынос переменных из циклов помог немного времени отыграть. И похоже, что более быстрые решения используют другие алгоритмы/структуры данных. |
|||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Вопрос: как правильно передать адрес первого элемента в list функции qsort()?
Так
компилятор ругается, что не может конвертировать первый параметр в void*. rezalt - это list, который хранит string*. Это сообщение отредактировал(а) Riddik - 2.7.2009, 15:10 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
И что делать?
|
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
| Riddik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Пока без std::sort нужно проверить.
Скажите, как правильно передать параметры ф-ии qsort в этом случае
где pstr[0] это string *pstr[N]; cwr это short, содержащий число указателей на string, которое нужно отсортировать. srav() - самопальная ф-ия сравнения. При обращении к ф-ии возникает критическая ошибка. Это сообщение отредактировал(а) Riddik - 2.7.2009, 17:26 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |