[ /tv/ /rf/ /vg/ /a/ /b/ /u/ /bo/ /fur/ /to/ /dt/ /cp/ /oe/ /bg/ /ve/ /r/ /mad/ /d/ /mu/ /cr/ /di/ /sw/ /hr/ /wh/ /lor/ /s/ /hau/ /slow/ /gf/ /vn/ /w/ /ma/ /azu/ /wn/ ] [ Main | Settings | Bookmarks | Music Player ]

No.27674 Reply
Добрач, у меня задача на Паскале (Борланд или Фришечка). Нужно отсортировать числа в вводном файл и сохранить в другой файл. Количество чисел не ограничено. Я правильно понял, что это можно сделать только заведя промежуточный файл и проводить сортировку переключаясь между двумя файлами? Или есть какой-то более удобный способ?
И какой посоветуешь алгоритм сортировки в данном случае?
>> No.27675 Reply
>>27674
Без дополнительного файла можно сделать сортировку вставками не напрягаясь.
> Борланд или Фришечка
Память ограничена сектором 64к?
Еще предположение: может то, что количество чисел не ограничено, относится к алгоритму? Просто оно хоть размером диска, да ограничено.
В общем случае для больших объемов данных можно воспользоваться B-деревьями enwiki://B-tree
>> No.27677 Reply
>>27674
Ну тык ж, ограничь их. И нагло утверждай, что они не ограничены (всё равно это не проверить).
>> No.27683 Reply
>>27675
Может просто имеется ввиду, что алгоритм должен уметь работать с любым количеством чисел.
>> No.27687 Reply
Для файлов вроде как удачной считается natural merge - работает за nlogn и не подразумевает перескоков по индексу, т.н. ленточная.
>> No.27688 Reply
>>27674
> Я правильно понял, что это можно сделать только заведя промежуточный файл и проводить сортировку переключаясь между двумя файлами?
Нет. Можно, например, пройти по файлу N раз, каждый раз находя минимальное число и записывая в выходной файл, а в памяти держать минимальное число с прошлой итерации.
> Количество чисел не ограничено.
Наверняка это означает, что нельзя в программе заводить массив фиксированного размера, в который читать числа из файла. С несколько меньшей вероятностью это означает, что читать весь файл в память вообще нельзя.
>> No.27689 Reply
>>27688
> Нет. Можно, например, пройти по файлу N раз, каждый раз находя минимальное число и записывая в выходной файл, а в памяти держать минимальное число с прошлой итерации.
Сортировать файлы за О(N^2)?! Это же несерьёзно!
>> No.27690 Reply
>>27688
> С несколько меньшей вероятностью это означает, что читать весь файл в память вообще нельзя.
Алсо, это тоже звучит несерьёзно на мой взгляд. Файлы они большие же. Я думаю, нужно городить сортировку, чтобы информация из файла черпалась буферами, то есть частями определённого размера. Весь файл же всю оперативу съест. Фильмы вон вообще больше 4ГБ весят нередко.
>> No.27691 Reply
>>27689
Зато памяти нужно 64 байта всего.
>> No.27692 Reply
>>27690
Ну хорошо. Есть блю-рей рип на 12 гигов. Режем на куски по 4 байта - получается 3 миллиарда чисел. Допустим, в одном буфере 1024 числа. Вот ты черпаешь инфу буферами. Получилось 3 миллиона буферов отсортированных чисел. Дальше что?
>> No.27695 Reply
>>27692
Буфер-то всегда один. Считал, обработал, очистил память.
>> No.27696 Reply
>>27695
Я у тебя спрашиваю, как ты 3 миллиона буферов собираешься объединить в отсортированный массив из 4-х миллиардов чисел и записать в выходной файл, если в памяти будет только 1024 элемента?
>> No.27697 Reply
>>27692
Я не говорю сортировать буферы, я говорю делать сортировку, которая использует считывание буферами. Хотя не знаю, стоит ли буферами... Что-то я засомневался. В любом случае незачем весь файл в оперативу помещать. Natural merge так или иначе можно использовать.
>> No.27698 Reply
>>27696
Любой внешней сортировкой.
>> No.27699 Reply
File: NMSPic_2.jpg
Jpg, 141.76 KB, 349×784 - Click the image to expand
edit Find source with google Find source with iqdb
NMSPic_2.jpg
>>27697
> Я не говорю сортировать буферы, я говорю делать сортировку, которая использует считывание буферами.
Это может ускорить ввод-вывод, но на сложности алгоритма точно не скажется тогда.
> В любом случае незачем весь файл в оперативу помещать.
Это подразумевалось.
> Natural merge так или иначе можно использовать.
Вот, смотри какую классную картинку я нашёл в гугле. Это пример натуральной сортировки слиянием. А теперь объясни мне, как ты собираешься ею воспользоваться при условии, что не все сортируемые числа могут быть одновременно загружены в память, а также без создания промежуточных файлов (как просил ОП).
>> No.27701 Reply
>>27699
> а также без создания промежуточных файлов (как просил ОП).
ОП этого прямо не просил. Он дал туманный реквест и я решил, что лучше советовать самое подходящее с моей точки зрения. Я подразумевал именно что промежуточные файлы. Они же лечше чем съесть всю оперативу или делать за N^2, так?
>> No.27702 Reply
>>27701
Ну а я на вопрос опа "можно ли сделать без промежуточных файлов" сказал "да" и подтвердил концептом самого простого из подходящих вариантов (и, возможно, единственного, хехе).

Кстати, если оп не в состоянии самостоятельно нагуглить решение своим студентопроблемам, то программы с O(N^2) будут выглядеть менее подозрительно для преподавателя. Я, кстати, одно время вёл лабораторки по программированию и когда некто, кого ты считаешь тупым как пробка лентяем, приносит тебе императивную дристню с хитровыебанными оптимизациями, то становится очевидно, что писал он её не сам. Несколько вопросов по устройству коду и товарищ идёт нахуй. Такие дела.
>> No.27703 Reply
>>27702
В нашем универе или ты приносишь всё чтобы хитровыебано было, так как должно быть, или идёшь нахуй и это правильно.
>> No.27705 Reply
Спасибо за ответы, няши. В общем, делаю с промежуточными файлами. Деревья не годятся, так как и там есть ограничения на количество элементов.
Осваиваю сортировку слиянием, так как, вроде, во-первых, она быстрее и удобнее, во-вторых, я её не знаю, надо бы научится.
>>27703
У нас надо чтобы хотя бы чисто теоретически работало (факториала 20000 от моей предыдущей программки так и не дождались, но посмотрели, что на меньших числах работает хорошо и код годный, и зачли), чтобы код был по-человечески оформлен, с лесенкой, комментариями и осмысленными именами переменных и, чтобы, конечно, мы сами могли разобраться в собственном коде.
>> No.27708 Reply
Тогда, заодно вопрос по сортировке слиянием. В чём её суть я понял, теперь смотрю пример реализации в викиучебнике: http://ru.wikibooks.org/wiki/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8[...]B2.29
   Зачем нужно

   If (kol div 2) mod s<>0 then
               begin
                 tmp:=kol div 2;
                 While tmp mod s<>0 do
                   begin
                     Read(f,a1);
                     Write(f1,a1,' ');
                     inc(tmp);
                   End;
               End;
Почему необходимо, чтобы количество чисел в f1 делилось нацело на s?
>> No.27709 Reply
File: Capture.PNG
Png, 46.75 KB, 487×1105 - Click the image to expand
edit Find source with google Find source with iqdb
Capture.PNG
>>27708
О мой бог. Чем с этой императивной дристнёй разбираться, лучше уж нагуглить описание на естественном языке.
>> No.27718 Reply
>>27709
> дристнёй
Два чаю.
Автор этого высера явно не может в декомпозицию.
>> No.27728 Reply
>>27709
> лучше уж нагуглить описание на естественном языке.
Можно еще танец посмотреть, лол YouTube: Merge-sort with Transylvanian-saxon (German) folk dance
>> No.27729 Reply
И еще всякие визуализации есть http://rain.ifmo.ru/cat/view.php/vis/sorts
>> No.27731 Reply
>>27690
> Весь файл же всю оперативу съест.
Можно отобразить файл в память через http://www.kernel.org/doc/man-pages/online/pages/man2/mmap.2.html или http://msdn.microsoft.com/en-us/library/aa366537.aspx в зависимости от используемой ОС
Это можно из паскаля вызывать
>> No.27733 Reply
>>27731
Это для чего? Как поменяется суть?
>> No.27734 Reply
>>27733
> Это для чего?
Чтоб не записывать весь файл в оперативку
> Как поменяется суть?
Файл будет читаться с жесткого диска по мере надобности
>> No.27772 Reply
>>27718
Будто императивная дрисня может в декомпозицию.
>> No.27773 Reply
>>27772
вообще может. На этой штуке можно писать в функциональном стиле даже
>> No.27787 Reply
>>27718
> Автор этого высера явно не может в декомпозицию.
Да это же просто обфусцированный код.
>> No.27790 Reply
File: 1339473920753.png
Png, 328.44 KB, 631×543 - Click the image to expand
edit Find source with google Find source with iqdb
1339473920753.png
>>27674
Какой еще промежуточный файл? Уж не упорот ли ты?
Сортированный список запили и добавляй в него. Заполнишь почти за n и выльешь его в файл за n.
>> No.27792 Reply
>>27790
Предположим, у нас есть файл на 160ГБ (массив на 40 миллиардов интов) и 4ГБ оперативной памяти.
>> No.27793 Reply
>>27790
> количество чисел не ограничено
>> No.27796 Reply
>>27792
Подключить кондуиты, делов-то.
>> No.27807 Reply
File: 1345801940849.jpg
Jpg, 87.79 KB, 1024×576
edit Find source with google Find source with iqdb
1345801940849.jpg
File: Capture.PNG
Png, 1.04 KB, 132×22
edit Find source with google Find source with iqdb
Capture.PNG

>>27792
Если ты ОП, то поясни за область науки за которую ты так впрягаешься. А еще за то, почему ты не можешь заюзать местный суперкомпьютер минут на 20.

>>27793
Нужно понимать, что надпись "не ограничено" в формулировке вообще ничего не значит без уточнения ибо суть может варьироваться от "не создавать массив на n элементов и применять пузырек" до "подсчитать число атомов во вселенной"

С другой стороны если тут имеет место это ваше олимпиадное погромирование, то флаг в руки.


Password:

[ /tv/ /rf/ /vg/ /a/ /b/ /u/ /bo/ /fur/ /to/ /dt/ /cp/ /oe/ /bg/ /ve/ /r/ /mad/ /d/ /mu/ /cr/ /di/ /sw/ /hr/ /wh/ /lor/ /s/ /hau/ /slow/ /gf/ /vn/ /w/ /ma/ /azu/ /wn/ ] [ Main | Settings | Bookmarks | Music Player ]