Здравствуйте прошла курсы на тему Алгоритмы С++. Но не пришел сертификат и не доступен.Где и как можно его скаачат? |
Внешний поиск
Перспективы
Наиболее важное применение рассмотренных в этой главе методов — это построение индексов для очень больших баз данных, хранимых во внешней памяти, например, в дисковых файлах. Хотя рассмотренные фундаментальные алгоритмы обладают большими возможностями, разработка реализации файловой системы, основанной на использовании B-деревьев или расширяемого хеширования, представляет собой сложную задачу. Во-первых, приведенные в этом разделе С++-программы нельзя использовать непосредственно — они должны быть модифицированы для считывания и обращения к дисковым файлам. Во-вторых, необходимо быть уверенным, что параметры алгоритма (например, размеры страницы и каталога) подобраны с учетом характеристик конкретного используемого аппаратного обеспечения. В-третьих, следует уделить внимание надежности, а также выявлению и исправлению ошибок. Например, необходимо иметь возможность убедиться в целостности структуры данных и принять решение о том, как исправить любую из множества возможных ошибок. Подобные системные факторы являются критичными и выходят за рамки этой книги.
С другой стороны, при наличии среды программирования, которая поддерживает виртуальную память, рассмотренные реализации на языке C++ можно непосредственно использовать в ситуации, когда необходимо выполнять очень большое количество операций в очень большой таблице символов. В первом приближении можно сказать, что при каждом обращении к странице такая система будет помещать эту страницу в кэш, в котором ссылки на данные этой страницы обрабатываются более эффективно. При обращении к странице, отсутствующей в кэше, система должна считать страницу из внешней памяти, поэтому случаи отсутствия страницы в кэше можно считать приблизительным эквивалентом используемой нами меры затрат на пробу.
При использовании B-деревьев каждый поиск или вставка обращается к корню, поэтому корень будет присутствовать в кэше всегда. В противном случае, если M достаточно велико, типичные случаи поиска или вставки максимум два раза обращаются к страницам вне кэша. При достаточно большом объеме кэш-памяти велика вероятность того, что первая страница, к которой происходит обращение при поиске (дочерняя страница корня), уже присутствует в кэше, поэтому средние затраты на один поиск, скорее всего, будут значительно меньше двух проб.
При использовании расширяемого хеширования маловероятно, что весь каталог будет храниться в кэше, поэтому можно ожидать, что обращения и к каталогу, и к странице не будут попадать в кэш (худший случай). То есть для выполнения поиска в очень большой таблице требуются две пробы: одна для обращения к соответствующей части каталога, а другая для обращения к соответствующей странице.
Эти алгоритмы завершают наше знакомство с поиском, поскольку для их эффективного использования требуется понимание базовых свойств бинарного поиска, деревьев бинарного поиска, сбалансированных деревьев, хеширования и trie-деревьев — базовых алгоритмов поиска, которые были изучены в лекциях 12—15. Все вместе эти алгоритмы предоставляют решения для задачи реализации таблицы символов во множестве ситуаций и представляют собой прекрасный пример возможностей технологии алгоритмов.
Упражнения
16.46. Разработайте реализацию таблицы символов с использованием B-деревьев, которая включает в себя деструктор, конструктор копирования и перегруженную операцию присваивания и поддерживает операции создать, подсчитать, найти, вставить, удалить и объединить для АТД таблицы символов с поддержкой клиентских дескрипторов (см. упражнения 12.6 и 12.7).
16.47. Разработайте реализацию таблицы символов с использованием расширяемого хеширования, которая включает в себя деструктор, конструктор копирования и перегруженную операцию присваивания и поддерживает операции создать, подсчитать, найти, вставить, удалить и объединить для АТД таблицы символов с поддержкой клиентских дескрипторов (см. упражнения 12.6 и 12.7).
16.48. Измените реализацию B-дерева, приведенную в разделе 16.3 (программы 16.1—16.3), чтобы в ней для обращений к страницам использовался абстрактный тип данных.
16.49. Измените реализацию расширяемого хеширования, приведенную в разделе 16.4 (программы 16.5—16.8), чтобы в ней для обращений к страницам использовался абстрактный тип данных.
16.50. Оцените среднее количество проб, затрачиваемое на каждый поиск в B-дереве, при выполнении S случайных поисков в типичной кэш-системе, хранящей в памяти T страниц, к которым выполнялись последние обращения (т.е. они не увеличивают значение счетчика проб). Считайте, что S значительно больше T.
16.51. Оцените среднее количество проб на каждый поиск в расширяемой хеш-таблице для модели кэш-памяти, описанной в упражнении 16.50.
16.52. Если используемая вами система поддерживает виртуальную память, разработайте и проведите эксперименты для сравнения производительности B-деревьев с производительностью бинарного поиска при выполнении случайных поисков в очень большой таблице символов.
16.53. Реализуйте АТД очереди с приоритетами, поддерживающий операцию создать для очень большого количества элементов, вслед за которой выполняется очень много операций вставить и удалить наибольший (см. "Очереди с приоритетами и пирамидальная сортировка"
16.54. Разработайте АТД внешней таблицы символов, основанной на представлении B-деревьев в виде слоеного списка (см. упражнение 13.80).
16.55. Если используемая вами система поддерживает виртуальную память, определите экспериментально значение M, которое обеспечивает наименьшее время выполнения для реализации B-дерева, поддерживающей случайные операции вставить в очень большой таблице символов. (Прежде чем выполнять подобные эксперименты, которые могут потребовать больших затрат, стоит ознакомиться с основными характеристиками системы.)
16.56. Измените реализацию B-дерева, приведенную в разделе 16.3 (программы 16.1—16.3), чтобы она работала в среде, в которой таблица размещается на внешнем запоминающем устройстве. Если применяемая файловая система допускает произвольный доступ к файлам, поместите всю таблицу в один (очень большой) файл, и в структуре данных вместо ссылок используйте смещения внутри файла. Если система допускает непосредственное обращение к страницам на внешних устройствах, то в структуре данных вместо ссылок используйте адреса страниц. Если система допускает оба вида доступа, выберите подход, который, по вашему мнению, наиболее подходит для реализации очень большой таблицы символов.
16.57. Измените реализацию таблицы расширяемого хеширования, приведенную в разделе 16.4 (программы 16.5—16.8), чтобы она работала в среде, в которой таблица размещается на внешнем запоминающем устройстве. Объясните причины выбранного вами способа распределения каталога и страниц по файлам (см. упражнение 16.56).
Ссылки для части IV
Основные источники для этого раздела — книги Кнута (Knuth); Баеса-Ятеса (Baeza-Yates) и Гонне (Gonnet); Мельхорна (Mehlhorn); и Кормена (Cormen), Ляйзерзона (Leiserson) и Райвеста (Rivest). В этих книгах подробно рассматриваются многие из приведенных в этой части алгоритмов, вместе с математическим анализом и предложениями по практическому применению. Классические методы подробно изложены в книге Кнута; более поздние методы описаны в остальных книгах, в них же приводятся ссылки на другую литературу. В этих четырех источниках, а также в книге Седжвика (Sedgewick) и Флажоле (Flajolet) описан практически весь материал, который упоминался как "выходящий за рамки этой книги".
Материал, приведенный в "Сбалансированные деревья" , взят из статьи Роура (Roura) и Мартинеса (Martinez) за 1996 г., статьи Слитора (Sleator) и Тарьяна (Tarjan) за 1985 г. и статьи Гиба (Guibas) и Седжвика за 1978 г. Как видно из дат публикации этих статей, исследование сбалансированных деревьев продолжается. Перечисленные источники содержат подробные доказательства свойств RB-деревьев и аналогичных им структур, а также ссылки на более современные работы.
Трактовка trie-деревьев, приведенная в "Поразрядный поиск" , является классической (хотя в литературе редко можно встретить реализации на языке C++). Материал по TST-деревьям взят из статьи Бентли (Bentley) и Седжвика за 1997 г.
B-деревья впервые рассматриваются в статье Байера (Bayer) и Мак-Крейта (McCreight) за 1972 г., а алгоритм расширяемого хеширования, представленный в главе 16, взят из статьи Фагина (Fagin), Нивергельта (Nievergelt), Пиппенгера (Pippenger) и Стронга (Strong), опубликованной в 1979 г. Аналитические результаты по расширяемому хешированию были получены Флажоле в 1983 г. С этими статьями следует обязательно ознакомиться всем, кто желает получить более подробную информацию по методам внешнего поиска. Практическое применение этих методов обусловлено распространенностью систем управления базами данных. С введением в эту область можно ознакомиться, например, в книге Дейта (Date).
1. R. Baeza-Yates and G. H. Gonnet, НаМЬоок of Algorithms and Data Structures, second edition, Addison-Wesley, Reading, MA, 1984.
2. J. L. Bentley and R. Sedgewick, "Sorting and searching strings," Eighth Symposium on Discrete Algorithms, New Orleans, January, 1997.
3. R. Bayer and E. M. McCreight, "Organization and maintenance of large ordered indexes," Acta Informatica 1, 1972.
4. Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн, Алгоритмы: построение и анализ, 2-е издание, ИД "Вильямс", 2009 г.
5. К. Дж. Дейт, Введение в системы баз данных, 7-е издание, ИД "Вильямс", 2001 г.
6. R. Fagin, J. Nievergelt, N. Pippenger and H. R. Strong, "Extendible hashing—a fast access method for dynamic files," ACM Transactions on Database Systems 4, 1979. 7. P Flajolet, "On the performance analysis of extendible hashing and trie search," Acta Informatica 20, 1983.
8. L. Guibas and R. Sedgewick, "A dichromatic framework for balanced trees," in 19th Annual Symposium on Foundations of Computer Science, IEEE, 1978. Также в A Decade of Progress 1970-1980, Xerox PARC, Palo Alto, CA.
9. Д.Э. Кнут, Искусство программирования, том 3. Сортировка и поиск, 2-е издание, ИД "Вильямс", 2008 г.
10. K. Mehlhorn, Data Structures and Algorithms 1: Sorting and Searching, Spiinger-Vferlag, Berlin, 1984.
11. S. Roura and C. Martinez, "Randomization of search trees by subtree size," Fourth European Symposium on Algorithms, Barcelona, September, 1996.
12. R. Sedgewick and P Flajolet, An Introduction to the Analysis of Algorithms, Addison-Wesley, Reading, MA, 1996.
13. D. Sleator and R. E. Tarjan, "Self-adjusting binary search trees," Journal of the ACM 32, 1985.