![]() |
![]() |
Caranthir |
![]()
Сообщение
#1
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 48 Пол: Мужской Репутация: ![]() ![]() ![]() |
Подскажите плиз)
Файл содержит не более n (от1 до 1.000.000) положительных чисел, каждое из которых не превышает 10^7 (телефонный номер). Все номера в файле уникальны. Присутствие дубликата считается ошибкой. Результат. Упорядоченнный по возрастанию список целых чисел, каждое из которых не превышает 10^7. На выходе должен быть получен файл отсортированных по возрастанию номеров. Ограничения. ~1Мб ОП. место на диске не ограничено. время выполнения не должно превышать нескольких минут, если оно будет сокращено до нескольких секунд, то дальнейшая оптимизация не требуется. |
![]() ![]() |
Caranthir |
![]()
Сообщение
#2
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 48 Пол: Мужской Репутация: ![]() ![]() ![]() |
немного переделал твою первую версию hiv:
(с) и результат прилагается) ![]() PS/ самому плохо думается |
hiv |
![]()
Сообщение
#3
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: ![]() ![]() ![]() |
немного переделал твою первую версию hiv: Плохо переделал ![]() Во первых использование меток считается плохим тоном программирования на паскале и может вызывать кучу завуалированных ошибок. В вторых теряется смысл битовой сортировки, ты по индексу [tel[k]-sdvig] массива rad производишь обычный подсчет количества дубликатов номера tel[k], а потом еще их распечатываешь в итоговом файле в том же дублированном количестве... А как же условие задачи? Цитата Файл содержит не более n (от1 до 1.000.000) положительных чисел, каждое из которых не превышает 10^7 (телефонный номер). Все номера в файле уникальны. Присутствие дубликата считается ошибкой. Так что подумай на досуге ![]() Сообщение отредактировано: hiv - 18.12.2006 10:27 -------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
hiv |
![]()
Сообщение
#4
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: ![]() ![]() ![]() |
В третьих: функция setlength() - не обнуляет массив, в итоге у тебя могут появиться номера, которых в твоем исходном никогда небыло... (сравни размеры твоего исходного файла и файла с результатами сортировки - первый признак наличия ошибки).
Сообщение отредактировано: hiv - 18.12.2006 10:27 -------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
hiv |
![]()
Сообщение
#5
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: ![]() ![]() ![]() |
Вот третий вариант сортировки (супер твикс):
![]() 1) Определяем диапазон номеров которые будем читать и сразу сортировать битовой сортировкой. 2) Прочитываем весь файл и обрабатываем только те номера, которые входят в диапазон. 3) Сохраняем результат сортировки текущего диапазона в итоговый файл. 4) Берем следующий диапазон чисел и заново перечитываем исходный файл, т.е. переходим к пункту 2 ![]() Никаких временных файлов на диске не создается. В данной задаче исходный файл прочитывается всего два раза. Также везде буферный ввод вывод. Спасибо Michael_Rybak за подсказку. См. пост 49 Итого: Входной файл текстовый без повторяющихся номеров - 9 000 000 байт (1 000 000 номеров). Время работы 3,657 сек. Что почти догнало метод быстрой сортировки cool.gif Максимум выделяемой динамической памяти на данные не превысил 978556 байт. Выходной файл текстовый с отсортированными номерами - 9 000 000 байт (1 000 000 номеров). Программа - ![]() Параметры машины: теже Сообщение отредактировано: hiv - 18.12.2006 13:31 -------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
![]() ![]() |
![]() |
Текстовая версия | 20.06.2025 9:45 |