Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 2d8fd99

Browse files
authoredDec 28, 2018
Merge branch 'master' into patch-3
2 parents 51d494e + 2bf2cd9 commit 2d8fd99

File tree

11 files changed

+339
-2
lines changed

11 files changed

+339
-2
lines changed
 

‎src/data-structures/doubly-linked-list/README.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Doubly Linked List
22

3+
_Read this in other languages:_
4+
[_简体中文_](README.zh-CN.md),
5+
[_Русский_](README.ru-RU.md)
6+
37
In computer science, a **doubly linked list** is a linked data structure that
48
consists of a set of sequentially linked records called nodes. Each node contains
59
two fields, called links, that are references to the previous and to the next
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
# Двусвязный список
2+
3+
**Двусвязный список** — связная структура данных в информатике, состоящая из набора
4+
последовательно связанных записей, называемых узлами. Каждый узел содержит два поля,
5+
называемых ссылками, которые указывают на предыдущий и последующий элементы в
6+
последовательности узлов. Ссылка на предыдущий элемент корневого узла ссылка на
7+
последующий элемент последнего узла, указывают на некого рода прерыватель, обычно
8+
сторожевой узел или null, для облегчения обхода списка. Если в списке только один
9+
сторожевой узел, тогда список циклически связана через него.
10+
Двусвязный список можно представить, как два связных списка, которые образованны из
11+
одних и тех же данных, но расположенных в противоположном порядке.
12+
13+
![Двусвязный список](https://upload.wikimedia.org/wikipedia/commons/5/5e/Doubly-linked-list.svg)
14+
15+
Две ссылки позволяют обходить список в обоих направлениях. Добавление и
16+
удаление узла в двусвязном списке требует изменения большего количества ссылок,
17+
чем аналогичные операции в связном списке. Однако данные операции проще и потенциально
18+
более эффективны (для некорневых узлов) - при обходе не нужно следить за предыдущим
19+
узлом или повторно обходить список в поиске предыдущего узла, плюс его ссылка
20+
может быть изменена.
21+
22+
## Псевдокод основных операций
23+
24+
### Вставка
25+
26+
```text
27+
Add(value)
28+
Pre: value - добавляемое значение
29+
Post: value помещено в конец списка
30+
n ← node(value)
31+
if head = ø
32+
head ← n
33+
tail ← n
34+
else
35+
n.previous ← tail
36+
tail.next ← n
37+
tail ← n
38+
end if
39+
end Add
40+
```
41+
42+
### Удаление
43+
44+
```text
45+
Remove(head, value)
46+
Pre: head - первый узел в списке
47+
value - значение, которое следует удалить
48+
Post: true - value удалено из списка, иначе false
49+
if head = ø
50+
return false
51+
end if
52+
if value = head.value
53+
if head = tail
54+
head ← ø
55+
tail ← ø
56+
else
57+
head ← head.Next
58+
head.previous ← ø
59+
end if
60+
return true
61+
end if
62+
n ← head.next
63+
while n = ø and value = n.value
64+
n ← n.next
65+
end while
66+
if n = tail
67+
tail ← tail.previous
68+
tail.next ← ø
69+
return true
70+
else if n = ø
71+
n.previous.next ← n.next
72+
n.next.previous ← n.previous
73+
return true
74+
end if
75+
return false
76+
end Remove
77+
```
78+
79+
### Обратный обход
80+
81+
```text
82+
ReverseTraversal(tail)
83+
Pre: tail - конечный элемент обходимого списка
84+
Post: элементы списка пройдены в обратном порядке
85+
n ← tail
86+
while n = ø
87+
yield n.value
88+
n ← n.previous
89+
end while
90+
end Reverse Traversal
91+
```
92+
93+
## Сложность
94+
95+
## Временная сложность
96+
97+
| Чтение | Поиск | Вставка | Удаление |
98+
| :-------: | :-------: | :-------: | :-------: |
99+
| O(n) | O(n) | O(1) | O(1) |
100+
101+
### Пространственная сложность
102+
103+
O(n)
104+
105+
## Ссылки
106+
107+
- [Wikipedia](https://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA#%D0%94%D0%B2%D1%83%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_(%D0%B4%D0%B2%D1%83%D0%BD%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA))
108+
- [YouTube](https://www.youtube.com/watch?v=lQ-lPjbb9Ew)

‎src/data-structures/linked-list/README.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Linked List
22

3+
_Read this in other languages:_
4+
[_简体中文_](README.zh-CN.md),
5+
[_Русский_](README.ru-RU.md)
6+
37
In computer science, a **linked list** is a linear collection
48
of data elements, in which linear order is not given by
59
their physical placement in memory. Instead, each
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
# Связный список
2+
3+
Связный список — базовая динамическая структура данных в информатике, состоящая из узлов, каждый из которых содержит как собственно данные,так ссылку («связку») на следующий узел списка. Данная структура позволяет эффективно добавлять и удалять элементы на произвольной позиции в последовательности в процессе итерации. Более сложные варианты включают дополнительные ссылки, позволяющие эффективно добавлять и удалять произвольные элементы.
4+
5+
Принципиальным преимуществом перед массивом является структурная гибкость: порядок элементов связного списка может не совпадать с порядком расположения элементов данных в памяти компьютера, а порядок обхода списка всегда явно задаётся его внутренними связями. Суть преимущества состоит в том, что во многих языках создание массива требует указать его размер заранее. Связный список позволяет обойти это ограничение.
6+
7+
Недостатком связных списков является то, что время доступа линейно (и затруднительно для реализации конвейеров). Быстрый доступ(случайный) невозможен.
8+
9+
![Связный список](https://upload.wikimedia.org/wikipedia/commons/6/6d/Singly-linked-list.svg)
10+
11+
## Псевдокод основных операций
12+
13+
### Вставка
14+
15+
```text
16+
Add(value)
17+
Pre: value - добавляемое значение
18+
Post: value помещено в конец списка
19+
n ← node(value)
20+
if head = ø
21+
head ← n
22+
tail ← n
23+
else
24+
tail.next ← n
25+
tail ← n
26+
end if
27+
end Add
28+
```
29+
30+
```text
31+
Prepend(value)
32+
Pre: value - добавляемое значение
33+
Post: value помещено в начало списка
34+
n ← node(value)
35+
n.next ← head
36+
head ← n
37+
if tail = ø
38+
tail ← n
39+
end
40+
end Prepend
41+
```
42+
43+
### Поиск
44+
45+
```text
46+
Contains(head, value)
47+
Pre: head - первый узел в списке
48+
value - значение, которое следует найти
49+
Post: true - value найдено в списке, иначе false
50+
n ← head
51+
while n != ø and n.value != value
52+
n ← n.next
53+
end while
54+
if n = ø
55+
return false
56+
end if
57+
return true
58+
end Contains
59+
```
60+
61+
### Удаление
62+
63+
```text
64+
Remove(head, value)
65+
Pre: head - первый узел в списке
66+
value - значение, которое следует удалить
67+
Post: true - value удалено из списка, иначе false
68+
if head = ø
69+
return false
70+
end if
71+
n ← head
72+
if n.value = value
73+
if head = tail
74+
head ← ø
75+
tail ← ø
76+
else
77+
head ← head.next
78+
end if
79+
return true
80+
end if
81+
while n.next != ø and n.next.value != value
82+
n ← n.next
83+
end while
84+
if n.next != ø
85+
if n.next = tail
86+
tail ← n
87+
end if
88+
n.next ← n.next.next
89+
return true
90+
end if
91+
return false
92+
end Remove
93+
```
94+
95+
### Обход
96+
97+
```text
98+
Traverse(head)
99+
Pre: head - первый узел в списке
100+
Post: элементы списка пройдены
101+
n ← head
102+
while n != ø
103+
yield n.value
104+
n ← n.next
105+
end while
106+
end Traverse
107+
```
108+
109+
### Обратный обход
110+
111+
```text
112+
ReverseTraversal(head, tail)
113+
Pre: head и tail относятся к одному списку
114+
Post: элементы списка пройдены в обратном порядке
115+
if tail != ø
116+
curr ← tail
117+
while curr != head
118+
prev ← head
119+
while prev.next != curr
120+
prev ← prev.next
121+
end while
122+
yield curr.value
123+
curr ← prev
124+
end while
125+
yeild curr.value
126+
end if
127+
end ReverseTraversal
128+
```
129+
130+
## Сложность
131+
132+
### Временная сложность
133+
134+
| Чтение | Поиск | Вставка | Удаление |
135+
| :--------: | :-------: | :--------: | :-------: |
136+
| O(n) | O(n) | O(1) | O(1) |
137+
138+
### Пространственная сложность
139+
140+
O(n)
141+
142+
## Ссылки
143+
144+
- [Wikipedia](https://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA)
145+
- [YouTube](https://www.youtube.com/watch?v=KTpOalDwBjg)

‎src/data-structures/priority-queue/README.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Priority Queue
22

3+
_Read this in other languages:_
4+
[_简体中文_](README.zh-CN.md),
5+
[_Русский_](README.ru-RU.md)
6+
37
In computer science, a **priority queue** is an abstract data type
48
which is like a regular queue or stack data structure, but where
59
additionally each element has a "priority" associated with it.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Очередь с приоритетом
2+
3+
Очередь с приоритетом (англ. priority queue) — абстрактный тип данных в информатике,
4+
для каждого элемента которого можно вычислить его приоритет.
5+
6+
В очереди с приоритетами элемент с высоким приоритетом обслуживается раньше
7+
элемента с низким приоритетом. Если два элемента имеют одинаковый приоритет, они
8+
обслуживаются в соответствии с их порядком в очереди.
9+
10+
Очередь с приоритетом поддерживает две обязательные операции — добавить элемент и
11+
извлечь максимум(минимум).
12+
13+
Хотя приоритетные очереди часто реализуются в виде куч(heaps), они
14+
концептуально отличаются от куч. Очередь приоритетов является абстрактной
15+
концепцией вроде «списка» или «карты»; так же, как список может быть реализован
16+
в виде связного списка или массива, так и очередь с приоритетом может быть реализована
17+
в виде кучи или множеством других методов, например в виде неупорядоченного массива.
18+
19+
## Ссылки
20+
21+
- [Wikipedia](https://ru.wikipedia.org/wiki/%D0%9E%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C_%D1%81_%D0%BF%D1%80%D0%B8%D0%BE%D1%80%D0%B8%D1%82%D0%B5%D1%82%D0%BE%D0%BC_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5))
22+
- [YouTube](https://www.youtube.com/watch?v=y_2toG5-j_M)

‎src/data-structures/queue/README.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Queue
22

3+
_Read this in other languages:_
4+
[_简体中文_](README.zh-CN.md),
5+
[_Русский_](README.ru-RU.md)
6+
37
In computer science, a **queue** is a particular kind of abstract data
48
type or collection in which the entities in the collection are
59
kept in order and the principle (or only) operations on the
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Очередь
2+
3+
Очередь (англ. queue) - структура данных в информатике, в которой элементы
4+
хранятся в порядке их добавления. Добавление новых элементов(enqueue)
5+
осуществляется в начало списка. А удаление элементов (dequeue)
6+
осуществляется с конца. Таким образом очередь реализует принцип
7+
"первым вошёл - первым вышел" (FIFO). Часто реализуется операция чтения
8+
головного элемента (peek), которая возвращает первый в очереди элемент,
9+
при этом не удаляя его. Очередь является примером линейной структуры
10+
данных или последовательной коллекции.
11+
12+
Иллюстрация работы с очередью.
13+
14+
![Очередь](https://upload.wikimedia.org/wikipedia/commons/5/52/Data_Queue.svg)
15+
16+
## References
17+
18+
- [Wikipedia](https://ru.wikipedia.org/wiki/%D0%9E%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5))
19+
- [YouTube](https://www.youtube.com/watch?v=GRsVMTlBIoE)

‎src/data-structures/stack/README.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Stack
22

3+
_Read this in other languages:_
4+
[_简体中文_](README.zh-CN.md),
5+
[_Русский_](README.ru-RU.md)
6+
37
In computer science, a **stack** is an abstract data type that serves
48
as a collection of elements, with two principal operations:
59

@@ -13,7 +17,7 @@ the stack. The name "stack" for this type of structure comes
1317
from the analogy to a set of physical items stacked on top of
1418
each other, which makes it easy to take an item off the top
1519
of the stack, while getting to an item deeper in the stack
16-
may require taking off multiple other items first
20+
may require taking off multiple other items first.
1721

1822
Simple representation of a stack runtime with push and pop operations.
1923

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Стек
2+
3+
Стек (англ. stack — стопка) — абстрактный тип данных, представляющий собой
4+
список элементов, организованных по принципу LIFO (последним пришёл — первым вышел).
5+
6+
Стек имеет две ключевые операции:
7+
* **добавление (push)** элемента в конец стека, и
8+
* **удаление (pop)**, последнего добавленного элемента.
9+
10+
Дополнительная операция чтения головного элемента (peek) даёт доступ
11+
к последнему элементу стека без изменения самого стека.
12+
13+
Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую
14+
сверху, нужно снять верхнюю.
15+
16+
Иллюстрация работы со стеком.
17+
18+
![Стек](https://upload.wikimedia.org/wikipedia/commons/b/b4/Lifo_stack.png)
19+
20+
## Ссылки
21+
22+
- [Wikipedia](https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D0%BA)
23+
- [YouTube](https://www.youtube.com/watch?v=tH8qi7lej5U)

‎src/data-structures/stack/README.zh-CN.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#
22

3-
在计算机科学中, 一个 **栈(stack)** 时一种抽象数据类型,用作表示元素的集合,具有两种主要操作:
3+
在计算机科学中, 一个 **栈(stack)** 是一种抽象数据类型,用作表示元素的集合,具有两种主要操作:
44

55
* **push**, 添加元素到栈的顶端(末尾);
66
* **pop**, 移除栈最顶端(末尾)的元素.

0 commit comments

Comments
 (0)
Please sign in to comment.