
- •Билет №2 Типы и характеристики запоминающих устройств. Организация основной памяти компьютера. Понятие адресного пространства. Прямой доступ к основной памяти.
- •Билет №3 Многоуровневая организация памяти. Модели ассоциативной кэш-памяти. Размещение, поиск и замещение блоков. Стратегии записи. Многоуровневая кэш-память.
- •1. Где может размещаться блок в кэш-памяти?
- •2. Как найти блок, находящийся в кэш-памяти?
- •3. Какой блок кэш-памяти должен быть замещен при промахе?
- •4. Что происходит во время записи?
- •Билет №5 Представление данных в эвм. Машинная арифметика. Погрешность представления чисел с плавающей точкой и ее влияние на точность вычислений.
- •Билет №8 Прерывания и программы обработки прерываний. Классификация прерываний. Зарезервированные вектора прерываний режима реального адреса микропроцессоров Intel x86. Последовательность прерывания.
- •Билет №9 Обработка внешних аппаратных прерываний. Назначение и работа контроллера прерываний. Последовательность аппаратного прерывания.
- •Билет №10 Работа микропроцессоров Intel x86 в защищенном режиме. Общая схема формирования исполнительного адреса. Кольца защиты. Организация дескрипторных таблиц. Типы дескрипторов.
- •Билет №12 Задача управления ресурсами эвм. Операционные системы и их классификация. Иерархия подсистем. Системные вызовы. Примеры реализации системных функций.
- •Билет №13 Понятие процесса. Диаграммы состояний процесса. Параллельное выполнение программ в различных операционных средах. Многопоточные операционные системы. Д иаграмма сстояния процессора:
- •Взаимодействие процессов. Асинхронно выполняющиеся процессы. Проблема критической секции и семафорные примитивы. Проблема тупика и методы ее решения. Алгоритм банкира.
- •Линейное упорядочение ресурсов
- •Иерархическое упорядочение ресурсов
- •Алгоритм банкира
- •6 Списки
- •Билет №19 Реализация множества на базе вектора. Последовательный и двоичный поиск. Битовая реализация множества. Оценка сложности алгоритмов. Хеширование. Методы разрешения коллизий.
- •8. Множества
- •Билет №20 Алгоритмы сортировки. Априорная оценка сложности алгоритма. Сравнение эффективности различных алгоритмов сортировки. Особенности реализации.
Билет №19 Реализация множества на базе вектора. Последовательный и двоичный поиск. Битовая реализация множества. Оценка сложности алгоритмов. Хеширование. Методы разрешения коллизий.
8. Множества
Существуют задачи, где упорядоченность данных не является существенной характеристикой на внешнем уровне представления. Для описания таких наборов данных наиболее подходит математическое понятие множества. С точки зрения задач обработки данных работа с множеством заключается в операциях добавления, удаления элемента, поиска конкретного элемента, а также перебора всех элементов, принадлежащих данному множеству. Отдельную область составляют операции с множествами как с цельными объектами — объединение, пересечение и др. Эти операции можно реализовать на основе операций поиска, добавления, удаления элементов в каждом отдельном множестве. При конкретизации предписаний работы с множеством может получиться следующий результат:
Создать множество (пустое).
Уничтожить множество.
Добавить элемент.
Удалить данный элемент.
Элемент принадлежит множеству ?
Взять какой-нибудь элемент из множества.
Очистить множество.
Множество пусто ?
Итератор по элементам множества.
Списки и деревья можно рассматривать как некоторые реализации множеств, поскольку они позволяют организовать перебор всех элементов, а таже поиск элемента по его значению. Легко видеть, что на списках можно реализовать процедуру последовательного поиска, а поиск в бинарном дереве аналогичен методу деления пополам. Процедуры просмотра списка или обхода дерева реализуют операцию перебора в таком множестве.
8.1 Битовая реализация множества
Пусть нам требуется реализовать подмножество множества целых чисел, лежащих в диапазоне от 0 до некоторого числа Nmax — 1. В этом случае нам достаточно иметь массив из iVmax элементов, каждый из которых может принимать значения 0 и 1, т.е. элемент массива с номером к будет иметь значение 1, если число к принадлежит нашему множеству, и 0 — в противном случае. Таким образом, для реализации подобного множества нам достаточно хранить массив из iVmax бит, а для добавления или удаления элемента нужно устанавливать соответствующий бит этого массива в 1 или 0. Так как позиция каждого бита легко определяется по его номеру в массиве, то операции добавления и удаления можно выполнить очень эффективно. Реализация подобного множества сводится к реализации битового массива: выделяется некоторый массив целых чисел, каждое из которых рассматривается как набор из фиксированного количества бит. Определение местоположения конкретного бита сводится в вычислению порядкового номера элемента базового массива чисел и определении номера нужного нам бита в этом элементе.
8.2 Хеширование
. Идея метода состоит в разделении исходного большого множество на несколько классов эквивалентности относительно некоторой функции (так называемой хеш-функции). Само слово хеширование происходит от английского слова hash, что дословно означает "рубить, крошить". Опишем идею хеширования более формально. Итак, пусть М — исходное множество всех возможных элементов интересующего нас типа, а N (- М — подмножество, с которым мы хотим в данный момент работать. Пусть на множестве М определена некоторая функция /, принимающая значения 0,...,р— 1, где р — некоторое натуральное число. Тогда функция / разбивает множество М на классы эквивалентности Мk
Mk = {x(- M : f(x) = k} .
Теперь при работе с множеством N для каждого интересующего нас элемента х нам достаточно вычислить значение k = f(x) и далее работать с множеством Nk = Мk ∩ N. При удачном выборе хеш-функции / количество элементов в множестве Nk будет в среднем в р раз меньше, чем во всем множестве N и, следовательно, поиск, добавление, удаление элементов будут выполняться существенно быстрее.
Бытовым примером применения метода хеширования может служить телефонная записная книжка, где хеш-функция сопоставляет каждому слову (фамилии) его первую букву. Действительно, при поиске информации о данном человеке мы первым делом открываем страницу записной книжки на первую букву фамилии ("вычисляем" хеш-функцию), а затем ищем или добавляем нужную запись в пределах этой страницы (работаем с множеством Nk).
Анализ трудоёмкости алгоритмов
Целью анализа трудоёмкости алгоритмов является нахождение оптимального алгоритма для решения данной задачи. В качестве критерия оптимальности алгоритма выбирается трудоемкость алгоритма, понимаемая как количество элементарных операций, которые необходимо выполнить для решения задачи с помощью данного алгоритма. Функцией трудоемкости называется отношение, связывающие входные данные алгоритма с количеством элементарных операций.
Трудоёмкость алгоритмов по-разному зависит от входных данных. Для некоторых алгоритмов трудоемкость зависит только от объема данных, для других алгоритмов — от значений данных, в некоторых случаях порядок поступления данных может влиять на трудоемкость. Трудоёмкость многих алгоритмов может в той или иной мере зависеть от всех перечисленных выше факторов.
Одним из упрощенных видов анализа, используемых на практике, является асимптотический анализ алгоритмов. Целью асимптотического анализа является сравнение затрат времени и других ресурсов различными алгоритмами, предназначенными для решения одной и той же задачи, при больших объемах входных данных. Используемая в асимптотическом анализе оценка функции трудоёмкости, называемая сложностью алгоритма, позволяет определить, как быстро растет трудоёмкость алгоритма с увеличением объема данных. В асимптотическом анализе алгоритмов используются обозначения, принятые в математическом асимптотическом анализе. Ниже перечислены основные оценки сложности.
Основной
оценкой функции сложности алгоритма
f(n) является оценка
.
Здесь n — величина объёма данных или
длина входа. Мы говорим, что оценка
сложности алгоритма
если при g > 0 при n > 0 существуют положительные с1, с2, n0, такие, что:
при n > n0, иначе говоря, можно найти такие с1 и c2, что при достаточно больших n f(n) будет заключена между
и
.
В таком случае говорят еще, что функция g(n) является асимптотически точной оценкой функции f(n), так как по определению функция f(n) не отличается от функции g(n) с точностью до постоянного множителя. Например, для метода сортировки heapsort оценка трудоёмкости составляет
то
есть g(n)
= nlogn
Из
следует,
что
.
Важно
понимать, что
представляет
собой не функцию, а множество функций,
описывающих рост
с
точностью до постоянного множителя.
дает
одновременно верхнюю и нижнюю оценки
роста функции. Часто бывает необходимо
рассматривать эти оценки по отдельности.
Оценка
представляет
собой верхнюю асимптотическую оценку
трудоемкости алгоритма. Мы говорим, что
если
Иначе говоря, запись означает, что f(n) принадлежит классу функций, которые растут не быстрее, чем функция g(n) с точностью до постоянного множителя.
Оценка
задает
нижнюю асимптотическую оценку роста
функции f(n) и определяет класс функций,
которые растут не медленнее, чем g(n) с
точностью до постоянного множителя.
если
Например,
запись
обозначает
класс функций, которые растут не
медленнее, чем
,
в этот класс попадают все полиномы со
степенью большей единицы, равно как и
все степенные функции с основанием
большим единицы. Равенство
выполняется
тогда и только тогда, когда
и
.
Асимптотический
анализ алгоритмов имеет не только
практическое, но и теоретическое
значение. Так, например, доказано, что
все алгоритмы сортировки, основанные
на попарном сравнении элементов,
отсортируют n элементов за время, не
меньшее
.
Поиск.
Последовательный поиск
Нахождение информации в неотсортированной структуре данных, например в массиве, требует применения последовательного поиска. Последовательный поиск - наиболее просто реализуемый метод поиска. Последовательный поиск заключается в последовательном просмотре массива от начального элемента до нахождения совпадения или до конца массива. Пример - циклы for и while. Последовательный поиск в среднем случае выполнит проверку 1/2*N элементов, в лучшем - 1 элемента, а в худьшем - N элементов. Недостаток - медленное выполнение при большом объеме просматриваемого массива. Но если данные не отсортированы, то должен использоваться только последовательный поиск.
Двоичный поиск
Бинарный поиск основан на итерационном сравнении ключа поиска со средним элементом массива. При каждой итерации интервал анализа делится пополам (на 2): 1/2, 1/4, 1/8 и т.д., откуда этот метод поиска и получил свое название. В зависимости от результата сравнения, выбирается нижний или верхний интервал. Процесс продолжается до тех пор, пока не будет найдено совпадение или длина интервала анализа не станет равной единице, и если при этом нет совпадения, то фиксируется неудача поиска. Этот метод поиска значительно эффективнее чем последовательный поиск, но требует, чтобы данные были предварительно упорядочены (отсортированы). В худшем случае выполняется не более log2(N)+E (где E<0.0861) сравнений, в связи с чем еще называется "логарифмическим поиском". Двоичный поиск также называется "дихотомическим".