Различия между версиями 6 и 7
Версия 6 от 2012-02-08 12:41:37
Размер: 5644
Редактор: FrBrGeorge
Комментарий:
Версия 7 от 2012-02-08 17:26:20
Размер: 5664
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 14: Строка 14:
  1. «Сортировка магнитных лент». Дан файл («магнитная лента»), содержащий строки, одновременно не умещающиеся в памяти. Требуется отсортировать этот файл построчно (записать отсортированные данные обратно на эту ленту). Для сортировки разрешается открывать небольшое число дополнительных файлов произвольного размера (использовать небольшое число дополнительных «лент»). /* Вот алгоритм с четырьмя лентами. Назовём ''отрезком'' упорядоченную последовательность строк на ленте. При записи отрезка на ленту применяется специальный ''маркер''-разделитель. Сначала разобьем исходную ленту на отрезки и перепишем их на первую вспомогательную ленту. Затем перепишем первые два отрезка на две временные ленты и сольём их в один, добавив на вторую вспомогательную ленту. Повторим процесс, пока все отрезки не кончатся (если остался один, просто допишем его). Поменяем вспомогательные ленты местами. Повторим процесс слияния отрезков до тех пор, пока на ленте-приёмнике не окажется ''ровно один'' отрезок. Это и будут отсортированные данные. Перепишем содержимое отрезка на исходную ленту. */   1. <<Anchor(tapesort)>>«Сортировка магнитных лент». Дан файл («магнитная лента»), содержащий строки, одновременно не умещающиеся в памяти. Требуется отсортировать этот файл построчно (записать отсортированные данные обратно на эту ленту). Для сортировки разрешается открывать небольшое число дополнительных файлов произвольного размера (использовать небольшое число дополнительных «лент»). /* Вот алгоритм с четырьмя лентами. Назовём ''отрезком'' упорядоченную последовательность строк на ленте. При записи отрезка на ленту применяется специальный ''маркер''-разделитель. Сначала разобьем исходную ленту на отрезки и перепишем их на первую вспомогательную ленту. Затем перепишем первые два отрезка на две временные ленты и сольём их в один, добавив на вторую вспомогательную ленту. Повторим процесс, пока все отрезки не кончатся (если остался один, просто допишем его). Поменяем вспомогательные ленты местами. Повторим процесс слияния отрезков до тех пор, пока на ленте-приёмнике не окажется ''ровно один'' отрезок. Это и будут отсортированные данные. Перепишем содержимое отрезка на исходную ленту. */

Модули `time` и `pickle`, множества

Довольно мелкие темы, попавшиеся под руку при решении домашних заданий.

  • Множества (set(последовательность)). Операции &, |, ^, Использование множеств для хранения уникальных элементов.

  • Модуль time. Функции time.time(), time.strftime(). Запуск и останов вычислений по времени.

  • Модуль pickle. Функции pickle.dump(объект,файл) и pickle.load(файл). Применение pickle для имитации «типизированных файлов» в задачах.

Домашнее задание

  1. {i} Прочитать в учебнике про Pickle и Наборы (множества) в учебнике; про модуль time в документации

  2. «Сортировка магнитных лент». Дан файл («магнитная лента»), содержащий строки, одновременно не умещающиеся в памяти. Требуется отсортировать этот файл построчно (записать отсортированные данные обратно на эту ленту). Для сортировки разрешается открывать небольшое число дополнительных файлов произвольного размера (использовать небольшое число дополнительных «лент»).

    • Предлагается использовать pickle для хранения в одном файле строк и не-строк.

    • Решение: sort_tape.py

  3. Измеритель скорости. С помощью time.time() замерить, сколько операций random.shuffle() выполняет компьютер за 5 секунд

    • Написать собственную процедуру shuffle(). Насколько она медленнее?

    • Решение с двумя всё более низкоуровневыми функциями (каждая медленнее предыдущей!): shufflemeter.py

  4. Записная книжка. В списке хранятся различные объекты Python, которые можно в него добавлять с клавиатуры (используется input()). Напишите программу, которая сохраняет ввод в файл, если видит специальную завершающую последовательность, и восстанавливает данные оттуда при последующем запуске.

    • Подсказка: input() — очень опасная функция, она выполняет eval() от введённой строки, следовательно, если вы определите функцию Quit() в программе, а потом введёте Quit() со стандартного ввода, то input() эту функцию выполнит!

    • Ввести ещё несколько функций, например, List(начало, конец) для просмотра пронумерованного списка (если параметры не указаны — всего) и Delete(начало, конец)

    • notepickle.py

Условные обозначения

  • {o} — тема по Linux

  • <!> ­— необязательная тема

  • {i} — теоретическое задание

  • {*} — тема для самостоятельного изучения


CategoryClass CategoryVmsh

LecturesVMSH/2012-02-01 (последним исправлял пользователь FrBrGeorge 2012-02-08 17:26:20)