Дек — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м
Строка 1: Строка 1:
 
== Определение ==
 
== Определение ==
 +
[[Файл:deque1.png|thumb|right|200px|Дек]]
 
'''Дек''' (от англ. ''deque'' {{---}} double ended queue) {{---}} структура данных, представляющая из себя список элементов, в которой добавление новых элементов и удаление существующих производится с обоих концов. Дек можно воспринимать как двустороннюю очередь или двусторонний стек. Он имеет следующие операции:
 
'''Дек''' (от англ. ''deque'' {{---}} double ended queue) {{---}} структура данных, представляющая из себя список элементов, в которой добавление новых элементов и удаление существующих производится с обоих концов. Дек можно воспринимать как двустороннюю очередь или двусторонний стек. Он имеет следующие операции:
 
* <tex> \mathtt{empty} </tex> {{---}} проверка на наличие элементов,
 
* <tex> \mathtt{empty} </tex> {{---}} проверка на наличие элементов,
Строка 5: Строка 6:
 
* <tex> \mathtt{popBack} </tex> (снятие с конца) {{---}} операция удаления конечного элемента,
 
* <tex> \mathtt{popBack} </tex> (снятие с конца) {{---}} операция удаления конечного элемента,
 
* <tex> \mathtt{pushFront} </tex> (запись в начало) {{---}} операция вставки нового элемента в начало,
 
* <tex> \mathtt{pushFront} </tex> (запись в начало) {{---}} операция вставки нового элемента в начало,
* <tex> \mathtt{popFront} </tex> (снятие с начала) {{---}} операция вставки начального элемента.
+
* <tex> \mathtt{popFront} </tex> (снятие с начала) {{---}} операция удаления начального элемента.
  
 
==Реализации==
 
==Реализации==
Строка 16: Строка 17:
  
 
Дек состоит из элементов <tex>\mathtt {d[d.tail\dots d.head]}</tex>. Если очень много раз добавлять в начало и столько же раз удалять конечные элементы, то скоро мы дойдем до границы, имея немного элементов, при этом добавление в начало вызовет переполнение (в данной реализации во внимание не берется). Если в деке верно равенство <tex>\mathtt{d.tail = d.head}</tex>, то такой дек пуст и изъятие из него может привести к ошибке.
 
Дек состоит из элементов <tex>\mathtt {d[d.tail\dots d.head]}</tex>. Если очень много раз добавлять в начало и столько же раз удалять конечные элементы, то скоро мы дойдем до границы, имея немного элементов, при этом добавление в начало вызовет переполнение (в данной реализации во внимание не берется). Если в деке верно равенство <tex>\mathtt{d.tail = d.head}</tex>, то такой дек пуст и изъятие из него может привести к ошибке.
---
+
 
Все операции выполняются за <tex>\mathtt{O(1)}</tex>.
+
 
 +
 
 +
Все операции выполняются за <tex>O(1)</tex>.
 
=== На саморасширяющемся массиве ===
 
=== На саморасширяющемся массиве ===
 
---
 
---

Версия 17:41, 3 января 2016

Определение

Дек

Дек (от англ. deque — double ended queue) — структура данных, представляющая из себя список элементов, в которой добавление новых элементов и удаление существующих производится с обоих концов. Дек можно воспринимать как двустороннюю очередь или двусторонний стек. Он имеет следующие операции:

  • [math] \mathtt{empty} [/math] — проверка на наличие элементов,
  • [math] \mathtt{pushBack} [/math] (запись в конец) — операция вставки нового элемента в конец,
  • [math] \mathtt{popBack} [/math] (снятие с конца) — операция удаления конечного элемента,
  • [math] \mathtt{pushFront} [/math] (запись в начало) — операция вставки нового элемента в начало,
  • [math] \mathtt{popFront} [/math] (снятие с начала) — операция удаления начального элемента.

Реализации

Дек расходует только [math]O(n)[/math] памяти, на хранение самих элементов.

На массиве

Ключевые поля:

  • [math]\mathtt{d[1\dots n]}[/math] — массив, с помощью которого реализуется дек, способный вместить не более [math]n[/math] элементов,
  • [math]\mathtt{d.head}[/math] — индекс головы дека,
  • [math]\mathtt{d.tail}[/math] — индекс хвоста дека.

Дек состоит из элементов [math]\mathtt {d[d.tail\dots d.head]}[/math]. Если очень много раз добавлять в начало и столько же раз удалять конечные элементы, то скоро мы дойдем до границы, имея немного элементов, при этом добавление в начало вызовет переполнение (в данной реализации во внимание не берется). Если в деке верно равенство [math]\mathtt{d.tail = d.head}[/math], то такой дек пуст и изъятие из него может привести к ошибке.


Все операции выполняются за [math]O(1)[/math].

На саморасширяющемся массиве

---

На списке

Ключевые поля:

  • ListItem(data : T, next : ListItem, prev : ListItem) — конструктор,
  • [math]\mathtt{tail}[/math] — ссылка на хвост,
  • [math]\mathtt{head}[/math] — ссылка на голову.

Дек очень просто реализуется на списке. Элементы всегда добавляются либо в [math]\mathtt{tail.prev}[/math], либо в [math]\mathtt{head.next}[/math].

На двух стеках