Приём заказов:
Круглосуточно
Москва
ул. Никольская, д. 10.
Ежедневно 8:00–20:00
Звонок бесплатный

Структура данных и алгоритмов

Диплом777
Email: info@diplom777.ru
Phone: +7 (800) 707-84-52
Url:
Логотип сайта компании Диплом777
Никольская 10
Москва, RU 109012
Содержание

Допустим, в нашем распоряжении к сегментов памяти; к > 1. Заполняем их данными, считывая начало файла или разделяемой части файла и начинаем — в памяти — разделение на «большие» и «меньшие» записи. Для накопления «меньших» используем 1-й сегмент, для «больших» — все остальные. Дело в том, что мы пока у того «берега», где надо группировать «меньшие».
Дождавшись, когда в 1-м сегменте останутся одни «меньшие» записи, мы разгружаем его в файл, а из файла передаем в сегмент следующую порцию записей и т. д. Тем временем идет вытеснение «меньших» записей из прочих сегментов, т. е. в них остаются «большие». «Паром» приготовлен к перемещению этих записей на другой «берег»: переходим к концу файла (части файла). Если файл большой, штанга с головками совершает большой ход.
Один сегмент, например 1-й, должен быть свободен, иначе не «разгрузить паром»: сначала освобождаем окончание файла или части файла, передавая его записи в 1-й сегмент. Теперь, сегмент за сегментом, переписываем «большие» записи в файл, параллельно заполняя сегменты новыми записями.
Снова начинаем разделение — в пространстве к сегментов — на «большие» и «меньшие» записи, но теперь лишь один сегмент нужен для накопления «больших» (потому что сразу передаем их в файл и берем в него из файла следующую порцию записей), а все прочие постепенно заполняются «меньшими», чтобы быть отправленными «на другой берег», где в файле ранее образовалось свободное место для их размещения. Итак, произойдет 2-й большой ход штанги.
Подобные вышерассмотренным акты сортировки и перемещений записей выполняются вновь и вновь, пока все «меньшие» и все «большие» записи не будут сгруппированы и найдена точка раздела между группами.
Перейдем к оценке метода ПАРОМСОРТ. Влияние ходов штанги на время сортировки можно свести к минимуму. Например, если при разделении на 2 части файла размером 64 Мбайт воспользоваться шестью сегментами памяти по 64 Кбайт каждый, то при случайном наборе значений ключей ходов не будет слишком много: пока готовятся к «отправке» 5 сегментов «больших» записей, примерно столько же выявляется и «меньших», т. е. нерассмотренная часть файла сокращается примерно на 10 сегментов. То же происходит и на другом конце файла, следовательно, ходов окажется около сотни, а средняя их длина определяется размером половины файла (она немного меньше). Нетрудно записать коротенькую программу, выполняющую эти ходы, и убедиться, что они займут считаные секунды. В процессе дальнейшего разделения частей общая длина ходов будет примерно такой же, т. е. время лишь удвоится. Поэтому на первый план выступает задержка обращения к данным на диске, которую мы уменьшаем, считывая с диска большие порции данных.
Рекомендация освобождать память перед сортировкой на диске. Помимо высокого быстродействия достоинством метода является работа в пределах пространства, занятого файлом, т. е. метод предельно компактен.
Под структурами данных будем понимать набор из одного или нескольких имен (с одной стороны) и множества данных (с другой стороны), к которым эти имена позволяют получить доступ. Всякая структура данных может описываться на 3-х различных уровнях, перечисляемых от более абстрактного к более конкретному.
I уровень. Функциональная спецификация, указывающая для некоторого класса имен операции, разрешенные с этими именами, и свойства этих операций. На этом уровне речь идет о внешнем определении, независимо от машины и языка программирования. Программист должен ответить на вопросы: какие операции хотел бы я уметь выполнять над моими данными и каковы свойства этих операций?
II уровень. Логическое описание, которое задает декомпозицию объектов, отвечающую функциональному определению, на более элементарные объекты и декомпозицию соответствующих операций на более элементарные операции. Здесь программист отвечает на вопросы: какие данные известных типов и какие отношения, построенные для этих данных, позволяют удовлетворить функциональной спецификации?
III уровень. Физическое представление, которое дает метод расположения в памяти вычислительной машины тех величин, которые составляют структуру, и отношений между ними, а также способ кодирования операций в языке программирования. Программист здесь решает, как можно изобразить и использовать все это в его конкретной машине, в том конкретном языке программирования, которым он располагает.

Picture of Леонид Федотов
Леонид Федотов
Окончил НИУ ВШЭ факультет компьютерных наук. Сам являюсь кандидатом наук. По специальности работаю 13 лет, за это время создал 8 научных статей и 2 диссертации. В компании подрабатываю в свободное от работы время уже более 5 лет. Нравится помогать школьникам и студентам в решении контрольных работ и написании курсовых проектов. Люблю свою профессию за то, что это направление с каждым годом становится все более востребованным и актуальным.