Merge branch 'master' into fibonacci

This commit is contained in:
JenilChristo 2018-12-28 10:49:12 +05:30 committed by GitHub
commit d37f582a1c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 161 additions and 1 deletions

View File

@ -0,0 +1,156 @@
# Связный список
Связный список — базовая динамическая структура данных в информатике,
состоящая из узлов, каждый из которых содержит как собственно данные,так ссылку
(«связку») на следующий узел списка. Данная структура позволяет эффективно
добавлять и удалять элементы на произвольной позиции в последовательности в
процессе итерации. Более сложные варианты включают дополнительные ссылки,
позволяющие эффективно добавлять и удалять произвольные элементы.
Принципиальным преимуществом перед массивом является структурная гибкость:
порядок элементов связного списка может не совпадать с порядком расположения
элементов данных в памяти компьютера, а порядок обхода списка всегда
явно задаётся его внутренними связями. Суть преимущества состоит в том,
что во многих языках создание массива требует указать его размер заранее.
Связный список позволяет обойти это ограничение.
Недостатком связных списков является то, что время доступа линейно
(и затруднительно для реализации конвейеров). Быстрый доступ(случайный)
невозможен.
![Связный список](https://upload.wikimedia.org/wikipedia/commons/6/6d/Singly-linked-list.svg)
## Псевдокод основных операций
### Вставка
```text
Add(value)
Pre: value - добавляемое значение
Post: value помещено в конец списка
n ← node(value)
if head = ø
head ← n
tail ← n
else
tail.next ← n
tail ← n
end if
end Add
```
```text
Prepend(value)
Pre: value - добавляемое значение
Post: value помещено в начало списка
n ← node(value)
n.next ← head
head ← n
if tail = ø
tail ← n
end
end Prepend
```
### Поиск
```text
Contains(head, value)
Pre: head - первый узел в списке
value - значение, которое следует найти
Post: true - value найдено в списке, иначе false
n ← head
while n != ø and n.value != value
n ← n.next
end while
if n = ø
return false
end if
return true
end Contains
```
### Удаление
```text
Remove(head, value)
Pre: head - первый узел в списке
value - значение, которое следует удалить
Post: true - value удалено из списка, иначе false
if head = ø
return false
end if
n ← head
if n.value = value
if head = tail
head ← ø
tail ← ø
else
head ← head.next
end if
return true
end if
while n.next != ø and n.next.value != value
n ← n.next
end while
if n.next != ø
if n.next = tail
tail ← n
end if
n.next ← n.next.next
return true
end if
return false
end Remove
```
### Обход
```text
Traverse(head)
Pre: head - первый узел в списке
Post: элементы списка пройдены
n ← head
while n != ø
yield n.value
n ← n.next
end while
end Traverse
```
### Обратный обход
```text
ReverseTraversal(head, tail)
Pre: head и tail отноcятся к одному списку
Post: элементы списка пройдены в обратном порядке
if tail != ø
curr ← tail
while curr != head
prev ← head
while prev.next != curr
prev ← prev.next
end while
yield curr.value
curr ← prev
end while
yeild curr.value
end if
end ReverseTraversal
```
## Сложность
### Временная сложность
| Чтение | Поиск | Вставка | Удаление |
| :-------: | :-------: | :-------: | :-------: |
| O(n) | O(n) | O(1) | O(1) |
### Пространственная сложность
O(n)
## Ссылки
- [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)
- [YouTube](https://www.youtube.com/watch?v=njTh_OwMljA&index=2&t=1s&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)

View File

@ -1,5 +1,9 @@
# Linked List
_Read this in other languages:_
[_简体中文_](README.zh-CN.md),
[_Русский_](README.ru-RU.md)
In computer science, a **linked list** is a linear collection
of data elements, in which linear order is not given by
their physical placement in memory. Instead, each

View File

@ -1,6 +1,6 @@
# 栈
在计算机科学中, 一个 **栈(stack)** 一种抽象数据类型,用作表示元素的集合,具有两种主要操作:
在计算机科学中, 一个 **栈(stack)** 一种抽象数据类型,用作表示元素的集合,具有两种主要操作:
* **push**, 添加元素到栈的顶端(末尾);
* **pop**, 移除栈最顶端(末尾)的元素.