Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

6.3. Последовательности 255

6.3 Последовательности

В этой секции мы определяем абстрактный тип данных, который обобщает вектор и список ADTs. Этот ADT поэтому обеспечивает доступ к своим элементам, используя и индексы и положения, и является универсальной структурой данных для большого разнообразия заявлений.

6.3.1 Тип данных резюме последовательности

Последовательность - ADT, который поддерживает все функции списка ADT (обсужденный в

Раздел 6.2), но это также обеспечивает функции для доступа к элементам их индексом, поскольку мы сделали в векторе ADT (обсужденный в Разделе 6.1). Интерфейс состоит из операций списка ADT плюс следующие две функции «соединения», которые обеспечивают связи между индексами и положениями.

atIndex (i): Возвратите положение элемента в индексе i.

indexOf (p): Возвратите индекс элемента в положении p.

6.3.2 Осуществление последовательности с вдвойне связанным списком

Одно возможное внедрение последовательности, конечно, с вдвойне связанным списком.

Делая так, все функции списка ADT может быть легко осуществлен, чтобы бежать в O (1) время каждый. Функции atIndex и indexOf от вектора ADT могут также быть осуществлены с вдвойне связанным списком, хотя менее эффективным способом.

В частности если мы хотим, чтобы функции от списка ADT бежали эффективно (использующий объекты положения указать, где доступы и обновления должны произойти), тогда мы больше не можем явно хранить индексы элементов в последовательности. Следовательно, чтобы выполнить операцию atIndex (i), мы должны выполнить связь, «прыгающую» от одного из концов списка, пока мы не определяем местонахождение узла, хранящего элемент в индексе i. Как небольшая оптимизация, мы могли начать прыгать от самого близкого конца последовательности, которая достигнет продолжительности

O (минута (я + 1, n- i)).

Это все еще O (n) в худшем случае (когда я около среднего индекса), но это было бы

будьте более эффективными в заявлениях, где много требований к atIndex (i), как ожидают, включат ценности индекса, которые значительно ближе к любому концу списка. В нашем внедрении мы просто используем простой подход ходьбы с фронта списка, и мы оставляем двухстороннее решение как упражнение (R-6.14).

В Кодовом Фрагменте 6.17, мы представляем определение класса NodeSequence, который осуществляет последовательность ADT. Заметьте, что, потому что последовательность расширяет определение списка, мы унаследовали наш класс, расширив класс NodeList

256

Глава 6. Список и Iterator ADTs, который был введен в Разделе 6.2. Мы просто добавляем определения наших функций соединения. Через волшебство наследования пользователей нашего класса у NodeSequence есть доступ ко всем членам класса NodeList, включая его вложенный класс, NodeList:: Iterator.

класс NodeSequence: общественный NodeList

общественность:

Iterator atIndex (интервал i) константа; //получают положение от интервала индекса indexOf (константа Iterator& p) константа; //получают индекс от положения

;

Кодовый Фрагмент 6.17: определение класса NodeSequence, который осуществляет последовательность ADT использование вдвойне связанного списка.

Затем, в Кодовом Фрагменте 6.18, мы показываем внедрения atIndex и indexOf членских функций. Функция atIndex (i) прыгает через i положений вправо, начинаясь вначале, и возвращает получающееся положение. Функция indexOf прыгает через список до нахождения положения, которое соответствует данному положению p. Заметьте что условное предложение «q! = p» использует перегруженного оператора сравнения для положений, определенных в Кодовом Фрагменте 6.8.

//получите положение от индекса

NodeSequence:: Iterator NodeSequence:: atIndex (интервал i) константа

Iterator p = начинаются ();

для (интервал j = 0; j <я; j ++) ++ p; возвратите p;

//получите индекс от положения

международный NodeSequence:: indexOf (константа Iterator& p) константа

Iterator q = начинаются ();

интервал j = 0;

в то время как (q! = p)

++ q; ++ j;

возвратите j;

//до нахождения p//прогресс и перелеты количества

Кодовый Фрагмент 6.18: Определение функций atIndex и indexOf Узла класса - Последовательность.

Обе из этих функций довольно хрупки, и, вероятно, прервутся, если их монетные дворы argu-не находятся в границах. Более тщательное внедрение atIndex было бы сначала

проверьте, что аргумент i находится в диапазоне от 0 до n- 1, где n - размер

последовательность. Функция indexOf должна проверить, что не бежит мимо конца

из последовательности. В любом случае должно быть брошено соответствующее исключение.