![]() |
![]() |
Caranthir |
![]()
Сообщение
#1
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 48 Пол: Мужской Репутация: ![]() ![]() ![]() |
Подскажите плиз)
Файл содержит не более n (от1 до 1.000.000) положительных чисел, каждое из которых не превышает 10^7 (телефонный номер). Все номера в файле уникальны. Присутствие дубликата считается ошибкой. Результат. Упорядоченнный по возрастанию список целых чисел, каждое из которых не превышает 10^7. На выходе должен быть получен файл отсортированных по возрастанию номеров. Ограничения. ~1Мб ОП. место на диске не ограничено. время выполнения не должно превышать нескольких минут, если оно будет сокращено до нескольких секунд, то дальнейшая оптимизация не требуется. |
![]() ![]() |
hiv |
![]()
Сообщение
#2
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: ![]() ![]() ![]() |
Вот первый вариант.
Номера разбрасываются по 90 временным файлам в соответствии с первыми двумя цифрами номера. Везде буферный ввод вывод. Сортировка типа radix битовая (оказалась самой быстрой, ускоренный пузырек более 40сек работал). Итого: Входной файл текстовый без повторяющихся номеров - 9 000 000 байт (1 000 000 номеров). Время работы 4,157 сек. Кто быстрее? ![]() Максимум выделяемой динамической памяти на данные не превысил 742900 байт. Выходной файл текстовый с отсортированными номерами - 9 000 000 байт (1 000 000 номеров). Программа - ![]() (обновлена) Параметры машины: ОС - WinXP Процессор - Pentium4 1.8ГГц ОЗУ - 512 Мб Винт - 40Гб 7200об/мин ЗЫ: Берусь теперь за второй вариант, предложенный Michael_Rybak. Если у кого есть предложения по оптимизации готового кода - буду рад ![]() Сообщение отредактировано: hiv - 15.12.2006 10:17 -------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
Michael_Rybak |
![]()
Сообщение
#3
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Вот первый вариант. Номера разбрасываются по 90 временным файлам в соответствии с первыми двумя цифрами номера. Везде буферный ввод вывод. Сортировка типа radix битовая (оказалась самой быстрой, ускоренный пузырек более 40сек работал). Итого: Входной файл текстовый без повторяющихся номеров - 9 000 000 байт (1 000 000 номеров). Время работы 4,157 сек. Кто быстрее? ![]() Максимум выделяемой динамической памяти на данные не превысил 742900 байт. Выходной файл текстовый с отсортированными номерами - 9 000 000 байт (1 000 000 номеров). Программа - Параметры машины: ОС - WinXP Процессор - Pentium4 1.8ГГц ОЗУ - 512 Мб Винт - 40Гб 7200об/мин ЗЫ: Берусь теперь за второй вариант, предложенный Michael_Rybak. Если у кого есть предложения по оптимизации готового кода - буду рад ![]() Еще можно попробовать поразрядную сортировку (т.е. по 10 файликов разибвать и сливать 8 раз). Напишешь? |
hiv |
![]()
Сообщение
#4
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: ![]() ![]() ![]() |
Еще можно попробовать поразрядную сортировку (т.е. по 10 файликов разибвать и сливать 8 раз). Напишешь? Поподробнее, а то твоя моя не понимай... ![]() Подумал на счет твоих постов 14 и 20 - с битовой сортировкой не получится: 7-мизначка = 9 000 000 номеров делим на 8 бит = 1125000 байт что больше 1Мбайта ![]() А использовать пузырек - не поможет (по объему около 40 сек выйдет). -------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
Michael_Rybak |
![]()
Сообщение
#5
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Цитата Поподробнее, а то твоя моя не понимай... ![]() Есть т.н. ковшовая, или поразрядная сортировка. Ковши = файлы. Есть 1 исходный ковш (большой), и 10 малых, пронумерованных от 0 до 9. Идем по большому ковшу, разбрасываем по малым все числа, в зависимости от последней цифры (младшего разряда). Потом сливаем малые ковши в порядке возрастания в большой ковш. Потом то же самое, но уже по второй с конца цифре (десятки), потом - с третьей и так до 10^8. Цитата Подумал на счет твоих постов 14 и 20 - с битовой сортировкой не получится: 7-мизначка = 9 000 000 номеров делим на 8 бит = 1125000 байт что больше 1Мбайта ![]() А использовать пузырек - не поможет (по объему около 40 сек выйдет). А вот тут уже моя твоя ![]() Что такое битовая сортировка? |
hiv |
![]()
Сообщение
#6
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: ![]() ![]() ![]() |
Есть т.н. ковшовая, или поразрядная сортировка... Думаю, что наверняка это будет долго.Потом то же самое, но уже по второй с конца цифре (десятки), потом - с третьей и так до 10^8. А вот тут уже моя твоя Это когда сортируем неповторяющиеся числа. Мы можем однозначно сопоставить значеням этих чисел порядковые номера битов в битовом массиве, т.е. число 5432167 будет означать, что 5432167-й бит установлен в единицу. В итоге максимальный размер битового массива в байтах = максимальное значение числа / 8 бит. Потом проходим битовый массив с первого по последний и последовательно записываем номера битов установленных в единицу в сортируемый массив чисел. Допустим значения чисел не превышают 10^7, то размер битового массива в байтах (10^7)/8=1 250 000, что сопоставимо с размером массива хранения самих чисел (в нашей задаче 1 000 000 чисел * 4байта= 4Мб). Конечно если чисел немного, то данный алгоритм не эффективен с точки зрения потребляемой памяти, а если совсем мало - то и медленнее всех других алгоритмов, ибо размер битового массива никак не зависит от количества сортируемых чисел.![]() Что такое битовая сортировка? ...8942629 Не стесняйся - программу в студию 8961911 8985513 8948864... ![]() -------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
![]() ![]() |
![]() |
Текстовая версия | 20.06.2025 2:00 |