Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавляет доку "Структура данных в JS" #4963

Merged
merged 15 commits into from Mar 10, 2024
Merged
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
168 changes: 168 additions & 0 deletions tools/structure-data-in-js/index.md
@@ -0,0 +1,168 @@
---
title: "Структуры данных в JavaScript"
description: "В этой доке ты узнаешь основные структуры данных в JavaScript и зачем они нужны."
authors:
- eshevlyakova
related:
- js/array-every
- js/arrays
- js/for
tags:
- article
---

## Что такое и зачем

_Структуры данных_ — это способы организации и хранения данных в памяти компьютера. Они используются для решения различных задач, таких как поиск, сортировка, фильтрация и многое другое.
eshevlyakova marked this conversation as resolved.
Show resolved Hide resolved
Представим, что у нас есть список из 1000 имён, и нужно найти определённое имя в этом списке. Можно просматривать каждую строку списка по порядку. Это может занять много времени, особенно если список очень большой.

Однако, если хранить имена в другой структуре данных, например в хеш-таблице или дереве поиска, то можно найти нужное имя гораздо быстрее. Структуры данных позволяют эффективно организовывать данные и выполнять операции с ними.

## Массивы

[Массивы](/js/arrays/) — это одна из самых распространённых структур данных в программировании. Они используются для хранения коллекции элементов, таких как числа, строки или объекты.
eshevlyakova marked this conversation as resolved.
Show resolved Hide resolved

Представь, что у нас есть пицца, которую нужно разделить на несколько кусочков. Вы можете использовать массив, чтобы хранить каждый кусочек пиццы в отдельности:
eshevlyakova marked this conversation as resolved.
Show resolved Hide resolved

```javascript
let pizza = ["кусочек 1", "кусочек 2", "кусочек 3", "кусочек 4", "кусочек 5"];
```

Теперь мы можем поделить пиццу ещё на несколько кусочков:

```javascript
pizza.splice(2, 0, "кусочек 2.5");
console.log(pizza);
// ["кусочек 1", "кусочек 2", "кусочек 2.5", "кусочек 3", "кусочек 4", "кусочек 5"]
```

## Стeк

_Стек_ — это структура данных, которая работает по принципу «последним пришёл — первым вышел». К примеру вы моете посуду и ставите её друг на друга. В конце у вас есть стопка тарелок, последняя тарелка, которую вы положили на стопку, будет первой, которую вы возьмёте, когда начнёте разбирать стопку. Это и есть принцип работы стека.
eshevlyakova marked this conversation as resolved.
Show resolved Hide resolved

Стеки используются для извлечения данных в обратном порядке. Например, мы хотим сохранить историю действий пользователя в нашем приложении: когда пользователь выполняет новое действие, мы кладем элемент на стек. Когда пользователь хочет отменить действие, мы снимаем элемент со стека:

```javascript
let stack = [];

stack.push("действие 1");
stack.push("действие 2");
stack.push("действие 3");

console.log(stack); // ["действие 1", "действие 2", "действие 3"]

let lastAction = stack.pop();

console.log(lastAction); // "действие 3"
console.log(stack); // ["действие 1", "действие 2"]
```

В этом примере создали пустой стек и добавили в него три действия. Затем мы удалили последнее действие из вершины стека с помощью метода `pop()`.

## Очереди

_Очередь_ — это структура данных, которая работает по принципу «первым пришёл — первым обслужен». Её можно сравнить с очередью, в обычном понимании этого слова. Есть очередь из людей, которые ждут в очереди на кассу в магазине. Первый человек, который пришёл, будет первым, кто будет обслужен.
eshevlyakova marked this conversation as resolved.
Show resolved Hide resolved

Очереди используются для хранения данных в порядке их добавления. Например, если мы хотим сохранить список дня, то будем использовать очередь для хранения этих задач:

```javascript
let queue = [];

queue.push("задача 1");
queue.push("задача 2");
queue.push("задача 3");

console.log(queue); // ["задача 1", "задача 2", "задача 3"]

let firstTask = queue.shift();

console.log(firstTask); // "задача 1"
console.log(queue); // ["задача 2", "задача 3"]
```

В этом примере мы создали пустую очередь и добавили в неё три задачи. Затем взяли первую задачу из начала очереди с помощью метода `shift()`.

## Связанные списки

_Связанный список_ — это структура данных, которая состоит из узлов, каждый из которых содержит данные и ссылку на следующий узел в списке. Связанный список можно представить как поезд, где каждый вагон — это узел в списке. Каждый вагон содержит груз (данные) и соединение с следующим вагоном (ссылку). Первый вагон — это начало списка, а последний вагон, который не имеет соединения с другим вагоном, — это конец списка. Таким образом, вы можете перемещаться по поезду (списку), переходя от одного вагона (узла) к другому.
eshevlyakova marked this conversation as resolved.
Show resolved Hide resolved

Связанные списки используются в программировании для хранения данных в порядке их добавления. Например, если вы хотите сохранить список задач, которые нужно выполнить в вашем приложении, то вы можете использовать связанный список для хранения этих задач. Каждый узел списка будет содержать одну задачу и ссылку на следующую подзадачу в списке:
eshevlyakova marked this conversation as resolved.
Show resolved Hide resolved

```javascript
class Node {
constructor(data) {
this.data = data;
this.next = null;
}
}

let head = new Node("Задача 1");
let secondNode = new Node("Подзадача 1.1");
let thirdNode = new Node("Подзадача 1.1.2");

head.next = secondNode;
secondNode.next = thirdNode;

console.log(head);
// Node {
// data: "Задача 1",
// next: Node {
// data: "Подзадача 1.1",
// next: Node {
// data: "Подзадача 1.1.2",
// next: null
// }
// }
// }
```

В этом примере мы создали три узла списка и связали их друг с другом с помощью ссылок. Первый узел списка называется головой списка и содержит ссылку на следующий узел. Каждый последующий узел также содержит ссылку на следующий узел в списке.
eshevlyakova marked this conversation as resolved.
Show resolved Hide resolved

## Деревья

_Деревья_ — это структура данных, которая представляет собой иерархическую структуру в виде набора связанных узлов. Каждый узел дерева содержит значение и список ссылок на его дочерние узлы. Вершина дерева называется корнем.
eshevlyakova marked this conversation as resolved.
Show resolved Hide resolved

Давай создадим дерево с родителем, у которого есть два ребёнка. У каждого из этих детей есть свои дети (внуки):
eshevlyakova marked this conversation as resolved.
Show resolved Hide resolved

```javascript
class TreeNode {
constructor(value) {
this.value = value;
this.children = [];
}
}

const parent = new TreeNode('Родитель');
const child1 = new TreeNode('Ребёнок 1');
const child2 = new TreeNode('Ребёнок 2');

parent.children.push(child1);
parent.children.push(child2);

const grandChild1 = new TreeNode('Внук 1');
const grandChild2 = new TreeNode('Внук 2');

child1.children.push(grandChild1);
child2.children.push(grandChild2);
```

Деревья в программировании помогают нам организовывать данные иерархически, обрабатывать информацию, искать пути и многое другое. Бинарные деревья поиска — это пример деревьев, которые помогают нам быстро находить данные.
eshevlyakova marked this conversation as resolved.
Show resolved Hide resolved

_Бинарное дерево_ — это структура данных, в которой каждый узел имеет не более двух детей, обычно обозначаемых как «левый ребёнок» и «правый ребёнок». Особый вид бинарного дерева — это бинарное дерево поиска. В бинарном дереве поиска для каждого узла его значение больше или равно значению любого узла в его левом поддереве и меньше или равно значению любого узла в его правом поддереве. Это свойство делает бинарные деревья поиска эффективными для операций поиска и вставки.

Бинарные деревья широко используются в программировании. Они помогают нам быстро находить, вставлять и удалять значения, что делает их полезными во многих приложениях, включая базы данных и игры.
eshevlyakova marked this conversation as resolved.
Show resolved Hide resolved

## Графы

_Графы_ — это структура данных, которая представляет собой узлы, связанные рёбрами. Давайте представим, что у нас есть несколько городов, расположенных рядом друг с другом, и между ними проложены дороги. В этом контексте, узлы — это города, а рёбра — это дороги, соединяющие эти города:
eshevlyakova marked this conversation as resolved.
Show resolved Hide resolved

```javascript
const roadMap = new Graph();
roadMap.addVertex('Москва');
roadMap.addVertex('СанктПетербург');
roadMap.addVertex('Нижний Новгород');
roadMap.addEdge('Москва', 'Санкт-Петербург');
roadMap.addEdge('Москва', 'Нижний Новгород');
```

Графы используются для моделирования отношений между объектами, поиска путей, оптимизации маршрутов и многого другого. Иерархия друзей в Facebook или дороги Google Maps — это графы.