Add ru version (#1865)

* Add Russian docs site baseline

* Add Russian localized codebase

* Polish Russian code wording

* Update ru code translation.

* Update code translation and chapter covers.

* Fix pythontutor extraction.

* Add README and landing page.

* placeholder of profiles

* Use figures of English version

* Remove chapter paperbook
This commit is contained in:
Yudong Jin
2026-03-28 04:24:07 +08:00
committed by GitHub
parent 2ca570cc33
commit 772183705e
1958 changed files with 108186 additions and 0 deletions
@@ -0,0 +1,116 @@
=begin
File: graph_adjacency_list.rb
Created Time: 2024-04-25
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
=end
require_relative '../utils/vertex'
# ## Класс неориентированного графа на основе списка смежности ###
class GraphAdjList
attr_reader :adj_list
# ## Конструктор ###
def initialize(edges)
# Список смежности, где key — вершина, а value — все смежные ей вершины
@adj_list = {}
# Добавить все вершины и ребра
for edge in edges
add_vertex(edge[0])
add_vertex(edge[1])
add_edge(edge[0], edge[1])
end
end
# ## Получение числа вершин ###
def size
@adj_list.length
end
# ## Добавление ребра ###
def add_edge(vet1, vet2)
raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)
@adj_list[vet1] << vet2
@adj_list[vet2] << vet1
end
# ## Удаление ребра ###
def remove_edge(vet1, vet2)
raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)
# Удалить ребро vet1 - vet2
@adj_list[vet1].delete(vet2)
@adj_list[vet2].delete(vet1)
end
# ## Добавление вершины ###
def add_vertex(vet)
return if @adj_list.include?(vet)
# Добавить новый список в список смежности
@adj_list[vet] = []
end
# ## Удаление вершины ###
def remove_vertex(vet)
raise ArgumentError unless @adj_list.include?(vet)
# Удалить из списка смежности список, соответствующий вершине vet
@adj_list.delete(vet)
# Обойти списки других вершин и удалить все ребра, содержащие vet
for vertex in @adj_list
@adj_list[vertex.first].delete(vet) if @adj_list[vertex.first].include?(vet)
end
end
# ## Вывести список смежности ###
def __print__
puts 'Список смежности ='
for vertex in @adj_list
tmp = @adj_list[vertex.first].map { |v| v.val }
puts "#{vertex.first.val}: #{tmp},"
end
end
end
### Driver Code ###
if __FILE__ == $0
# Инициализация неориентированного графа
v = vals_to_vets([1, 3, 2, 5, 4])
edges = [
[v[0], v[1]],
[v[0], v[3]],
[v[1], v[2]],
[v[2], v[3]],
[v[2], v[4]],
[v[3], v[4]],
]
graph = GraphAdjList.new(edges)
puts "\nГраф после инициализации"
graph.__print__
# Добавить ребро
# Вершины 1 и 2, то есть v[0] и v[2]
graph.add_edge(v[0], v[2])
puts "\nГраф после добавления ребра 1-2"
graph.__print__
# Удалить ребро
# Вершины 1 и 3 соответствуют v[0], v[1]
graph.remove_edge(v[0], v[1])
puts "\nГраф после удаления ребра 1-3"
graph.__print__
# Добавление вершины
v5 = Vertex.new(6)
graph.add_vertex(v5)
puts "\nГраф после добавления вершины 6"
graph.__print__
# Удаление вершины
# Вершина 3 соответствует v[1]
graph.remove_vertex(v[1])
puts "\nГраф после удаления вершины 3"
graph.__print__
end
@@ -0,0 +1,116 @@
=begin
File: graph_adjacency_matrix.rb
Created Time: 2024-04-25
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
=end
require_relative '../utils/print_util'
# ## Класс неориентированного графа на основе матрицы смежности ###
class GraphAdjMat
def initialize(vertices, edges)
# ## Конструктор ###
# Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин»
@vertices = []
# Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин»
@adj_mat = []
# Добавление вершины
vertices.each { |val| add_vertex(val) }
# Добавить ребра
# Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices
edges.each { |e| add_edge(e[0], e[1]) }
end
# ## Получение числа вершин ###
def size
@vertices.length
end
# ## Добавление вершины ###
def add_vertex(val)
n = size
# Добавить значение новой вершины в список вершин
@vertices << val
# Добавить строку в матрицу смежности
new_row = Array.new(n, 0)
@adj_mat << new_row
# Добавить столбец в матрицу смежности
@adj_mat.each { |row| row << 0 }
end
# ## Удаление вершины ###
def remove_vertex(index)
raise IndexError if index >= size
# Удалить вершину с индексом index из списка вершин
@vertices.delete_at(index)
# Удалить строку с индексом index из матрицы смежности
@adj_mat.delete_at(index)
# Удалить столбец с индексом index из матрицы смежности
@adj_mat.each { |row| row.delete_at(index) }
end
# ## Добавление ребра ###
def add_edge(i, j)
# Параметры i и j соответствуют индексам элементов vertices
# Обработка выхода индекса за границы и случая равенства
if i < 0 || j < 0 || i >= size || j >= size || i == j
raise IndexError
end
# В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i)
@adj_mat[i][j] = 1
@adj_mat[j][i] = 1
end
# ## Удаление ребра ###
def remove_edge(i, j)
# Параметры i и j соответствуют индексам элементов vertices
# Обработка выхода индекса за границы и случая равенства
if i < 0 || j < 0 || i >= size || j >= size || i == j
raise IndexError
end
@adj_mat[i][j] = 0
@adj_mat[j][i] = 0
end
# ## Вывести матрицу смежности ###
def __print__
puts "Список вершин = #{@vertices}"
puts 'Матрица смежности ='
print_matrix(@adj_mat)
end
end
### Driver Code ###
if __FILE__ == $0
# Инициализация неориентированного графа
# Обратите внимание: элементы edges представляют индексы вершин, то есть соответствуют индексам элементов vertices
vertices = [1, 3, 2, 5, 4]
edges = [[0, 1], [0, 3], [1, 2], [2, 3], [2, 4], [3, 4]]
graph = GraphAdjMat.new(vertices, edges)
puts "\nГраф после инициализации"
graph.__print__
# Добавление ребра
# Индексы вершин 1 и 2 равны 0 и 2 соответственно
graph.add_edge(0, 2)
puts "\nГраф после добавления ребра 1-2"
graph.__print__
# Удалить ребро
# Индексы вершин 1 и 3 равны 0 и 1
graph.remove_edge(0, 1)
puts "\nГраф после удаления ребра 1-3"
graph.__print__
# Добавление вершины
graph.add_vertex(6)
puts "\nГраф после добавления вершины 6"
graph.__print__
# Удаление вершины
# Индекс вершины 3 равен 1
graph.remove_vertex(1)
puts "\nГраф после удаления вершины 3"
graph.__print__
end
+61
View File
@@ -0,0 +1,61 @@
=begin
File: graph_bfs.rb
Created Time: 2024-04-25
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
=end
require 'set'
require_relative './graph_adjacency_list'
require_relative '../utils/vertex'
# ## Обход в ширину ###
def graph_bfs(graph, start_vet)
# Использовать список смежности для представления графа, чтобы получать все смежные вершины заданной вершины
# Последовательность обхода вершин
res = []
# Хеш-множество для хранения уже посещенных вершин
visited = Set.new([start_vet])
# Очередь используется для реализации BFS
que = [start_vet]
# Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины
while que.length > 0
vet = que.shift # Извлечь головную вершину из очереди
res << vet # Отметить посещенную вершину
# Обойти все смежные вершины данной вершины
for adj_vet in graph.adj_list[vet]
next if visited.include?(adj_vet) # Пропустить уже посещенную вершину
que << adj_vet # Помещать в очередь только непосещенные вершины
visited.add(adj_vet) # Отметить эту вершину как посещенную
end
end
# Вернуть последовательность обхода вершин
res
end
### Driver Code ###
if __FILE__ == $0
# Инициализация неориентированного графа
v = vals_to_vets([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
edges = [
[v[0], v[1]],
[v[0], v[3]],
[v[1], v[2]],
[v[1], v[4]],
[v[2], v[5]],
[v[3], v[4]],
[v[3], v[6]],
[v[4], v[5]],
[v[4], v[7]],
[v[5], v[8]],
[v[6], v[7]],
[v[7], v[8]],
]
graph = GraphAdjList.new(edges)
puts "\nГраф после инициализации"
graph.__print__
# Обход в ширину
res = graph_bfs(graph, v.first)
puts "\nПоследовательность вершин при обходе в ширину (BFS)"
p vets_to_vals(res)
end
+54
View File
@@ -0,0 +1,54 @@
=begin
File: graph_dfs.rb
Created Time: 2024-04-25
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
=end
require 'set'
require_relative './graph_adjacency_list'
require_relative '../utils/vertex'
# ## Вспомогательная функция обхода в глубину ###
def dfs(graph, visited, res, vet)
res << vet # Отметить посещенную вершину
visited.add(vet) # Отметить эту вершину как посещенную
# Обойти все смежные вершины данной вершины
for adj_vet in graph.adj_list[vet]
next if visited.include?(adj_vet) # Пропустить уже посещенную вершину
# Рекурсивно обходить смежные вершины
dfs(graph, visited, res, adj_vet)
end
end
# ## Обход в глубину ###
def graph_dfs(graph, start_vet)
# Использовать список смежности для представления графа, чтобы получать все смежные вершины заданной вершины
# Последовательность обхода вершин
res = []
# Хеш-множество для хранения уже посещенных вершин
visited = Set.new
dfs(graph, visited, res, start_vet)
res
end
### Driver Code ###
if __FILE__ == $0
# Инициализация неориентированного графа
v = vals_to_vets([0, 1, 2, 3, 4, 5, 6])
edges = [
[v[0], v[1]],
[v[0], v[3]],
[v[1], v[2]],
[v[2], v[5]],
[v[4], v[5]],
[v[5], v[6]],
]
graph = GraphAdjList.new(edges)
puts "\nГраф после инициализации"
graph.__print__
# Обход в глубину
res = graph_dfs(graph, v[0])
puts "\nПоследовательность вершин при обходе в глубину (DFS)"
p vets_to_vals(res)
end