-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
15bc22f
commit 93631ae
Showing
4 changed files
with
182 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
--- | ||
title: "Алгоритм Эдсгера Белмана Форда. " | ||
publishedAt: "2024-09-11" | ||
summary: "Алгоритмы на графах" | ||
tags: "алгоритмы, дейкстра, python" | ||
--- | ||
|
||
|
||
#### Алгоритм Беллмана — Форда - для ребер с отрицательным весом. | ||
|
||
Скоро тут будет статья про алгоритм алгоритм. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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-деревья обычно подходят для создания баз данных, в то время как хеш-таблицы используются повсеместно для создания различного рода словарей, например, для отображения доменных имён в интернет-адресах компьютеров. | ||
Но это позже... |