Skip to content

Commit

Permalink
Dejkstars Algo
Browse files Browse the repository at this point in the history
  • Loading branch information
ivanIStereotekk committed Nov 10, 2024
1 parent 15bc22f commit 93631ae
Show file tree
Hide file tree
Showing 4 changed files with 182 additions and 25 deletions.
2 changes: 1 addition & 1 deletion app/config.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export const metaData = {
baseUrl: "https://nextfolio-template.vercel.app/",
baseUrl: "https://ivanistereotekk.github.io/",
title: "Ivan Goncharov",
name: "Python Developer - Ivan Goncharov",
ogImage: "/ivan-goncharov.png",
Expand Down
11 changes: 11 additions & 0 deletions content/bellman-ford.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
title: "Алгоритм Эдсгера Белмана Форда. "
publishedAt: "2024-09-11"
summary: "Алгоритмы на графах"
tags: "алгоритмы, дейкстра, python"
---


#### Алгоритм Беллмана — Форда - для ребер с отрицательным весом.

Скоро тут будет статья про алгоритм алгоритм.
31 changes: 21 additions & 10 deletions content/collatz-hypothesis.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: "Математика это очень интересно, если ее..."
title: "Гипотеза Коллатца - забавная штука!"
publishedAt: "2024-08-13"
summary: "Небольшой рассказ о том как я делаю дела."
tags: "Configuration, Web development"
Expand All @@ -12,15 +12,23 @@ tags: "Configuration, Web development"
(получаем 3n + 1). Над полученным числом выполняем те же самые действия, и так далее.
Гипотеза Коллатца заключается в том, что какое бы начальное число n мы ни взяли,
рано или поздно мы получим единицу.

Например, для числа 3 получаем:
3 — нечётное, 3×3 + 1 = 10
10 — чётное, 10:2 = 5
5 — нечётное, 5×3 + 1 = 16
16 — чётное, 16:2 = 8
8 — чётное, 8:2 = 4
4 — чётное, 4:2 = 2
2 — чётное, 2:2 = 1
1 — нечётное.

- 3 — нечётное, 3×3 + 1 = 10
- 10 — чётное, 10:2 = 5
- 5 — нечётное, 5×3 + 1 = 16
- 16 — чётное, 16:2 = 8
- 8 — чётное, 8:2 = 4
- 4 — чётное, 4:2 = 2
- 2 — чётное, 2:2 = 1
- 1 — нечётное.


Эту функция которая реализует последовательность действий, и как следствие
доказывает гипотезу.
Можете сами проверить !

```
def collatz(x):
yield x
Expand All @@ -29,4 +37,7 @@ def collatz(x):
yield x
print(*collatz(114))
```
```


Такие дела...
163 changes: 149 additions & 14 deletions content/data-structures.mdx
Original file line number Diff line number Diff line change
@@ -1,26 +1,161 @@
---
title: "Тестовая статья о структурах данных . "
title: "Алгоритм Эдсгера Дейкстры. "
publishedAt: "2024-09-11"
summary: "Test article"
tags: "best knowledge"
summary: "Алгоритмы на графах"
tags: "алгоритмы, дейкстра, python"
---


Прежде чем что-либо делать, я всегда задаю себе вопрос. Зачем ?
Изучая материал всегда важно его запомнить, осознать на уровне моторной памяти.
Так чтобы оперировать этими знаниями на бесознательном уровне.
А поэтому, я решил конспектировать все то что считаю для себя важным.
Так что в большей степени я пишу это для себя, а если кто то будет пользоваться
моими шпаргалками, или кому то покажется текст и подача супер понятной.
Или вы нашли эту статью, то как говориться - welcome!

Алгоритмы это важно ! Возможно их не так часто приходится применять на практике,
но этот скилл просто должен быть у каждого кто кодит.
Это константы, догма и библия, правила дорожного движения. Или еще важнее.
В общем - очень надо!


---

#### Алгоритм Эдсгера Дейкстры (1959 год)
или "Алгорит Дейкстры"


Допустим что мы имеем:
Направленный (Ориентированный) Ациклический Граф
или Direct Acyclic Graph как говорят англичане.
Представим в нем ребра, узлы, ноды (как вам удобнее):


```
[Start] >>> [A]
[Start] >>> [B]
[B] >>> [A]
[A] >>> [Finish]
[B] >>> [Finish]
```

Алгоритм Дейкстры решает задачу поиска кратчайшего пути на 'взвешенных графах'.
То есть когда мы имеем значение - "вес ребра", это может означать практически любые данные, расстояние,
затрачиваемое время, съеденные каллории, потраченый рессурс, и так далее.

У нас есть ограничения:

Мы не можем решать этим алгоритмом задачу имея ребра с отрицательным весом.
Для этого есть другой алгоритм и это совсем другая история. Я думаю чуть позже я напишу о нем.
А пока к решению...



Декомпозиция задачи:

- Найти узел с наименьшим весом.
- Проверить, существует ли путь к соседним узлам "легче".
- Обойти с проверкой по всем узлам (нодам).
- Вычислить итоговый путь.



#### Инициируем Python dict() с нодами.

```
graph = {}
graph['start'] = {}
graph['a'] = {}
graph['b'] = {}
graph['fin'] = {}
```


#### Связи указывающие на направление вершин:
```
graph['start']['a'] = 6
graph['start']['b'] = 2
graph['a']['fin'] = 1
graph['b']['a'] = 3
graph['b']['fin'] = 5
```
- От старта к А
- От старта к В
- От А к финишу
- От В к А
- От В к финишу

Структура данных (англ. data structure) — программная единица, позволяющая хранить и
обрабатывать (машиной) однотипные и/или логически связанные данные. Для добавления,
поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций,
составляющих её интерфейс.
Термин «структура данных» может иметь несколько близких, но тем не менее различных значений[1]:
#### Цены / веса ребер:

```
costs = {}
costs['a'] = 6
costs['b'] = 2
costs['fin'] = float('inf')
```

#### Родительские узлы:

```
parents = {}
parents['a'] = "start"
parents['b'] = "start"
parents['in'] = None
```

#### Пустой Python List для результирующего набора.

```
processed = list()
```

#### Эта функция нам поможет найти самый легкий вес.

```
def find_low_cost(costs):
lowest = float('inf')
lowest_node = None
for node in costs:
cost = costs[node]
if cost < lowest and node not in processed:
lowest = cost
lowest_node = node
return lowest_node
```

#### Основной блок кода.

```
node = find_low_cost(costs)
while node is not None:
cost = costs[node]
neighbors = graph[node]
for nei in neighbors.keys():
new_cost = cost + neighbors[nei]
if costs[nei] > new_cost:
costs[nei] = new_cost
parents[nei] = node
processed.append(node)
node = find_low_cost(costs)
```

#### Ну и в самом конце "принтанем" наш результирующий набор.

```
print(processed)
```

---

Абстрактный тип данных;
Реализация какого-либо абстрактного типа данных;
Экземпляр типа данных, например, конкретный список;
В контексте функционального программирования — уникальная единица (англ. unique identity), сохраняющаяся при изменениях. О ней неформально говорят как об одной структуре данных, несмотря на возможное наличие различных версий.
Структуры данных формируются с помощью типов данных, ссылок и операций над ними в выбранном языке программирования.
### Чуть позже реализую алгоритм по другому, с декларацией классов.

Различные виды структур данных подходят для различных приложений; некоторые из них имеют узкую специализацию для определённых задач. Например, B-деревья обычно подходят для создания баз данных, в то время как хеш-таблицы используются повсеместно для создания различного рода словарей, например, для отображения доменных имён в интернет-адресах компьютеров.
Но это позже...

0 comments on commit 93631ae

Please sign in to comment.