Дек — различия между версиями
Mutsch (обсуждение | вклад) м |
Mutsch (обсуждение | вклад) |
||
| Строка 11: | Строка 11: | ||
=== На массиве === | === На массиве === | ||
Ключевые поля: | Ключевые поля: | ||
| − | * <tex>\mathtt{d[1\dots n]} </tex> {{---}} массив, с помощью которого реализуется дек, способный вместить не более <tex>n</tex> элементов, | + | * <tex>\mathtt{d[1\dots n]}</tex> {{---}} массив, с помощью которого реализуется дек, способный вместить не более <tex>n</tex> элементов, |
* <tex>\mathtt{d.head}</tex> {{---}} индекс головы дека, | * <tex>\mathtt{d.head}</tex> {{---}} индекс головы дека, | ||
* <tex>\mathtt{d.tail}</tex> {{---}} индекс хвоста дека. | * <tex>\mathtt{d.tail}</tex> {{---}} индекс хвоста дека. | ||
| − | Дек состоит из элементов <tex>\mathtt { | + | Дек состоит из элементов <tex>\mathtt {d[d.tail\dots d.head]}</tex>. Если очень много раз добавлять в начало и столько же раз удалять конечные элементы, то скоро мы дойдем до границы, имея немного элементов, при этом добавление в начало вызовет переполнение (в данной реализации во внимание не берется). Если в деке верно равенство <tex>\mathtt{d.tail = d.head}</tex>, то такой дек пуст и изъятие из него может привести к ошибке. |
| + | --- | ||
| + | Все операции выполняются за <tex>\mathtt{O(1)}</tex>. | ||
| + | === На саморасширяющемся массиве === | ||
| + | --- | ||
| + | === На списке === | ||
| + | Ключевые поля: | ||
| + | * <code>ListItem(data : '''T''', next : '''ListItem''', prev : '''ListItem''')</code> {{---}} конструктор, | ||
| + | * <tex>\mathtt{tail}</tex> {{---}} ссылка на хвост, | ||
| + | * <tex>\mathtt{head}</tex> {{---}} ссылка на голову. | ||
| + | |||
| + | Дек очень просто реализуется на списке. Элементы всегда добавляются либо в <tex>\mathtt{tail.prev}</tex>, либо в <tex>\mathtt{head.next}</tex>. | ||
| + | === На двух стеках === | ||
Версия 22:22, 13 декабря 2015
Содержание
Определение
Дек (от англ. deque — double ended queue) — структура данных, представляющая из себя список элементов, в которой добавление новых элементов и удаление существующих производится с обоих концов. Дек можно воспринимать как двустороннюю очередь или двусторонний стек. Он имеет следующие операции:
- — проверка на наличие элементов,
- (запись в конец) — операция вставки нового элемента в конец,
- (снятие с конца) — операция удаления конечного элемента,
- (запись в начало) — операция вставки нового элемента в начало,
- (снятие с начала) — операция вставки начального элемента.
Реализации
Дек расходует только памяти, на хранение самих элементов.
На массиве
Ключевые поля:
- — массив, с помощью которого реализуется дек, способный вместить не более элементов,
- — индекс головы дека,
- — индекс хвоста дека.
Дек состоит из элементов . Если очень много раз добавлять в начало и столько же раз удалять конечные элементы, то скоро мы дойдем до границы, имея немного элементов, при этом добавление в начало вызовет переполнение (в данной реализации во внимание не берется). Если в деке верно равенство , то такой дек пуст и изъятие из него может привести к ошибке. --- Все операции выполняются за .
На саморасширяющемся массиве
---
На списке
Ключевые поля:
-
ListItem(data : T, next : ListItem, prev : ListItem)— конструктор, - — ссылка на хвост,
- — ссылка на голову.
Дек очень просто реализуется на списке. Элементы всегда добавляются либо в , либо в .