From 772183705eac5a08e93ac834b1d97c7484d3862f Mon Sep 17 00:00:00 2001 From: Yudong Jin Date: Sat, 28 Mar 2026 04:24:07 +0800 Subject: [PATCH] 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 --- README.md | 2 + en/README.md | 2 + ja/README.md | 2 + mkdocs.yml | 3 + ru/README.md | 101 ++ ru/codes/Dockerfile | 35 + ru/codes/c/.gitignore | 9 + ru/codes/c/CMakeLists.txt | 20 + .../CMakeLists.txt | 3 + .../c/chapter_array_and_linkedlist/array.c | 114 ++ .../linked_list.c | 89 ++ .../c/chapter_array_and_linkedlist/my_list.c | 163 +++ .../c/chapter_backtracking/CMakeLists.txt | 10 + ru/codes/c/chapter_backtracking/n_queens.c | 95 ++ .../c/chapter_backtracking/permutations_i.c | 79 ++ .../c/chapter_backtracking/permutations_ii.c | 81 ++ .../preorder_traversal_i_compact.c | 49 + .../preorder_traversal_ii_compact.c | 61 + .../preorder_traversal_iii_compact.c | 62 + .../preorder_traversal_iii_template.c | 93 ++ .../c/chapter_backtracking/subset_sum_i.c | 78 ++ .../chapter_backtracking/subset_sum_i_naive.c | 69 + .../c/chapter_backtracking/subset_sum_ii.c | 83 ++ .../CMakeLists.txt | 5 + .../iteration.c | 81 ++ .../recursion.c | 77 ++ .../space_complexity.c | 141 ++ .../time_complexity.c | 179 +++ .../worst_best_time_complexity.c | 57 + .../chapter_divide_and_conquer/CMakeLists.txt | 3 + .../binary_search_recur.c | 47 + .../c/chapter_divide_and_conquer/build_tree.c | 61 + .../c/chapter_divide_and_conquer/hanota.c | 74 ++ .../CMakeLists.txt | 8 + .../climbing_stairs_backtrack.c | 47 + .../climbing_stairs_constraint_dp.c | 46 + .../climbing_stairs_dfs.c | 32 + .../climbing_stairs_dfs_mem.c | 44 + .../climbing_stairs_dp.c | 51 + .../chapter_dynamic_programming/coin_change.c | 92 ++ .../coin_change_ii.c | 81 ++ .../edit_distance.c | 159 +++ .../c/chapter_dynamic_programming/knapsack.c | 137 ++ .../min_cost_climbing_stairs_dp.c | 62 + .../min_path_sum.c | 134 ++ .../unbounded_knapsack.c | 81 ++ ru/codes/c/chapter_graph/CMakeLists.txt | 4 + .../c/chapter_graph/graph_adjacency_list.c | 171 +++ .../chapter_graph/graph_adjacency_list_test.c | 55 + .../c/chapter_graph/graph_adjacency_matrix.c | 150 +++ ru/codes/c/chapter_graph/graph_bfs.c | 116 ++ ru/codes/c/chapter_graph/graph_dfs.c | 75 ++ ru/codes/c/chapter_greedy/CMakeLists.txt | 8 + .../c/chapter_greedy/coin_change_greedy.c | 60 + .../c/chapter_greedy/fractional_knapsack.c | 60 + ru/codes/c/chapter_greedy/max_capacity.c | 49 + .../c/chapter_greedy/max_product_cutting.c | 38 + ru/codes/c/chapter_hashing/CMakeLists.txt | 4 + ru/codes/c/chapter_hashing/array_hash_map.c | 215 +++ .../c/chapter_hashing/hash_map_chaining.c | 213 +++ .../hash_map_open_addressing.c | 211 +++ ru/codes/c/chapter_hashing/simple_hash.c | 68 + ru/codes/c/chapter_heap/CMakeLists.txt | 2 + ru/codes/c/chapter_heap/my_heap.c | 152 +++ ru/codes/c/chapter_heap/my_heap_test.c | 41 + ru/codes/c/chapter_heap/top_k.c | 73 ++ ru/codes/c/chapter_searching/CMakeLists.txt | 4 + ru/codes/c/chapter_searching/binary_search.c | 59 + .../c/chapter_searching/binary_search_edge.c | 67 + .../binary_search_insertion.c | 68 + ru/codes/c/chapter_searching/two_sum.c | 86 ++ ru/codes/c/chapter_sorting/CMakeLists.txt | 9 + ru/codes/c/chapter_sorting/bubble_sort.c | 61 + ru/codes/c/chapter_sorting/bucket_sort.c | 57 + ru/codes/c/chapter_sorting/counting_sort.c | 87 ++ ru/codes/c/chapter_sorting/heap_sort.c | 60 + ru/codes/c/chapter_sorting/insertion_sort.c | 36 + ru/codes/c/chapter_sorting/merge_sort.c | 63 + ru/codes/c/chapter_sorting/quick_sort.c | 137 ++ ru/codes/c/chapter_sorting/radix_sort.c | 75 ++ ru/codes/c/chapter_sorting/selection_sort.c | 37 + .../c/chapter_stack_and_queue/CMakeLists.txt | 6 + .../c/chapter_stack_and_queue/array_deque.c | 172 +++ .../c/chapter_stack_and_queue/array_queue.c | 134 ++ .../c/chapter_stack_and_queue/array_stack.c | 103 ++ .../linkedlist_deque.c | 212 +++ .../linkedlist_queue.c | 128 ++ .../linkedlist_stack.c | 107 ++ ru/codes/c/chapter_tree/CMakeLists.txt | 6 + ru/codes/c/chapter_tree/array_binary_tree.c | 166 +++ ru/codes/c/chapter_tree/avl_tree.c | 259 ++++ ru/codes/c/chapter_tree/binary_search_tree.c | 171 +++ ru/codes/c/chapter_tree/binary_tree.c | 43 + ru/codes/c/chapter_tree/binary_tree_bfs.c | 73 ++ ru/codes/c/chapter_tree/binary_tree_dfs.c | 75 ++ ru/codes/c/utils/CMakeLists.txt | 5 + ru/codes/c/utils/common.h | 36 + ru/codes/c/utils/common_test.c | 35 + ru/codes/c/utils/list_node.h | 59 + ru/codes/c/utils/print_util.h | 131 ++ ru/codes/c/utils/tree_node.h | 107 ++ ru/codes/c/utils/uthash.h | 1140 ++++++++++++++++ ru/codes/c/utils/vector.h | 259 ++++ ru/codes/c/utils/vertex.h | 49 + ru/codes/cpp/.gitignore | 10 + ru/codes/cpp/CMakeLists.txt | 20 + .../CMakeLists.txt | 4 + .../chapter_array_and_linkedlist/array.cpp | 113 ++ .../linked_list.cpp | 89 ++ .../cpp/chapter_array_and_linkedlist/list.cpp | 72 ++ .../chapter_array_and_linkedlist/my_list.cpp | 171 +++ .../cpp/chapter_backtracking/CMakeLists.txt | 10 + .../cpp/chapter_backtracking/n_queens.cpp | 65 + .../chapter_backtracking/permutations_i.cpp | 54 + .../chapter_backtracking/permutations_ii.cpp | 56 + .../preorder_traversal_i_compact.cpp | 39 + .../preorder_traversal_ii_compact.cpp | 46 + .../preorder_traversal_iii_compact.cpp | 47 + .../preorder_traversal_iii_template.cpp | 76 ++ .../cpp/chapter_backtracking/subset_sum_i.cpp | 57 + .../subset_sum_i_naive.cpp | 54 + .../chapter_backtracking/subset_sum_ii.cpp | 62 + .../CMakeLists.txt | 5 + .../iteration.cpp | 76 ++ .../recursion.cpp | 78 ++ .../space_complexity.cpp | 107 ++ .../time_complexity.cpp | 168 +++ .../worst_best_time_complexity.cpp | 45 + .../chapter_divide_and_conquer/CMakeLists.txt | 3 + .../binary_search_recur.cpp | 46 + .../chapter_divide_and_conquer/build_tree.cpp | 51 + .../cpp/chapter_divide_and_conquer/hanota.cpp | 66 + .../CMakeLists.txt | 10 + .../climbing_stairs_backtrack.cpp | 43 + .../climbing_stairs_constraint_dp.cpp | 37 + .../climbing_stairs_dfs.cpp | 32 + .../climbing_stairs_dfs_mem.cpp | 39 + .../climbing_stairs_dp.cpp | 49 + .../coin_change.cpp | 70 + .../coin_change_ii.cpp | 68 + .../edit_distance.cpp | 136 ++ .../chapter_dynamic_programming/knapsack.cpp | 109 ++ .../min_cost_climbing_stairs_dp.cpp | 53 + .../min_path_sum.cpp | 116 ++ .../unbounded_knapsack.cpp | 64 + ru/codes/cpp/chapter_graph/CMakeLists.txt | 5 + .../chapter_graph/graph_adjacency_list.cpp | 90 ++ .../graph_adjacency_list_test.cpp | 49 + .../chapter_graph/graph_adjacency_matrix.cpp | 127 ++ ru/codes/cpp/chapter_graph/graph_bfs.cpp | 59 + ru/codes/cpp/chapter_graph/graph_dfs.cpp | 55 + ru/codes/cpp/chapter_greedy/CMakeLists.txt | 3 + .../cpp/chapter_greedy/coin_change_greedy.cpp | 60 + .../chapter_greedy/fractional_knapsack.cpp | 56 + ru/codes/cpp/chapter_greedy/max_capacity.cpp | 39 + .../chapter_greedy/max_product_cutting.cpp | 39 + ru/codes/cpp/chapter_hashing/CMakeLists.txt | 6 + .../cpp/chapter_hashing/array_hash_map.cpp | 110 ++ .../chapter_hashing/array_hash_map_test.cpp | 52 + .../cpp/chapter_hashing/built_in_hash.cpp | 29 + ru/codes/cpp/chapter_hashing/hash_map.cpp | 46 + .../cpp/chapter_hashing/hash_map_chaining.cpp | 150 +++ .../hash_map_open_addressing.cpp | 171 +++ ru/codes/cpp/chapter_hashing/simple_hash.cpp | 66 + ru/codes/cpp/chapter_heap/CMakeLists.txt | 3 + ru/codes/cpp/chapter_heap/heap.cpp | 66 + ru/codes/cpp/chapter_heap/my_heap.cpp | 155 +++ ru/codes/cpp/chapter_heap/top_k.cpp | 38 + ru/codes/cpp/chapter_searching/CMakeLists.txt | 4 + .../cpp/chapter_searching/binary_search.cpp | 59 + .../chapter_searching/binary_search_edge.cpp | 66 + .../binary_search_insertion.cpp | 66 + .../cpp/chapter_searching/hashing_search.cpp | 53 + .../cpp/chapter_searching/linear_search.cpp | 49 + ru/codes/cpp/chapter_searching/two_sum.cpp | 54 + ru/codes/cpp/chapter_sorting/CMakeLists.txt | 6 + ru/codes/cpp/chapter_sorting/bubble_sort.cpp | 56 + ru/codes/cpp/chapter_sorting/bucket_sort.cpp | 44 + .../cpp/chapter_sorting/counting_sort.cpp | 77 ++ ru/codes/cpp/chapter_sorting/heap_sort.cpp | 54 + .../cpp/chapter_sorting/insertion_sort.cpp | 31 + ru/codes/cpp/chapter_sorting/merge_sort.cpp | 58 + ru/codes/cpp/chapter_sorting/quick_sort.cpp | 145 +++ ru/codes/cpp/chapter_sorting/radix_sort.cpp | 65 + .../cpp/chapter_sorting/selection_sort.cpp | 34 + .../chapter_stack_and_queue/CMakeLists.txt | 9 + .../chapter_stack_and_queue/array_deque.cpp | 156 +++ .../chapter_stack_and_queue/array_queue.cpp | 129 ++ .../chapter_stack_and_queue/array_stack.cpp | 85 ++ .../cpp/chapter_stack_and_queue/deque.cpp | 46 + .../linkedlist_deque.cpp | 194 +++ .../linkedlist_queue.cpp | 120 ++ .../linkedlist_stack.cpp | 109 ++ .../cpp/chapter_stack_and_queue/queue.cpp | 41 + .../cpp/chapter_stack_and_queue/stack.cpp | 41 + ru/codes/cpp/chapter_tree/CMakeLists.txt | 6 + .../cpp/chapter_tree/array_binary_tree.cpp | 137 ++ ru/codes/cpp/chapter_tree/avl_tree.cpp | 233 ++++ .../cpp/chapter_tree/binary_search_tree.cpp | 170 +++ ru/codes/cpp/chapter_tree/binary_tree.cpp | 43 + ru/codes/cpp/chapter_tree/binary_tree_bfs.cpp | 42 + ru/codes/cpp/chapter_tree/binary_tree_dfs.cpp | 69 + ru/codes/cpp/utils/CMakeLists.txt | 4 + ru/codes/cpp/utils/common.hpp | 28 + ru/codes/cpp/utils/list_node.hpp | 42 + ru/codes/cpp/utils/print_utils.hpp | 228 ++++ ru/codes/cpp/utils/tree_node.hpp | 84 ++ ru/codes/cpp/utils/vertex.hpp | 36 + ru/codes/csharp/.editorconfig | 88 ++ ru/codes/csharp/.gitignore | 5 + ru/codes/csharp/.vscode/launch.json | 26 + ru/codes/csharp/.vscode/tasks.json | 41 + ru/codes/csharp/GlobalUsing.cs | 3 + .../chapter_array_and_linkedlist/array.cs | 107 ++ .../linked_list.cs | 80 ++ .../chapter_array_and_linkedlist/list.cs | 66 + .../chapter_array_and_linkedlist/my_list.cs | 144 +++ .../csharp/chapter_backtracking/n_queens.cs | 76 ++ .../chapter_backtracking/permutations_i.cs | 53 + .../chapter_backtracking/permutations_ii.cs | 55 + .../preorder_traversal_i_compact.cs | 37 + .../preorder_traversal_ii_compact.cs | 44 + .../preorder_traversal_iii_compact.cs | 45 + .../preorder_traversal_iii_template.cs | 72 ++ .../chapter_backtracking/subset_sum_i.cs | 55 + .../subset_sum_i_naive.cs | 53 + .../chapter_backtracking/subset_sum_ii.cs | 60 + .../iteration.cs | 77 ++ .../recursion.cs | 78 ++ .../space_complexity.cs | 104 ++ .../time_complexity.cs | 195 +++ .../worst_best_time_complexity.cs | 49 + .../binary_search_recur.cs | 46 + .../chapter_divide_and_conquer/build_tree.cs | 49 + .../chapter_divide_and_conquer/hanota.cs | 59 + .../climbing_stairs_backtrack.cs | 41 + .../climbing_stairs_constraint_dp.cs | 36 + .../climbing_stairs_dfs.cs | 31 + .../climbing_stairs_dfs_mem.cs | 39 + .../climbing_stairs_dp.cs | 49 + .../coin_change.cs | 71 + .../coin_change_ii.cs | 68 + .../edit_distance.cs | 141 ++ .../chapter_dynamic_programming/knapsack.cs | 118 ++ .../min_cost_climbing_stairs_dp.cs | 53 + .../min_path_sum.cs | 127 ++ .../unbounded_knapsack.cs | 64 + .../chapter_graph/graph_adjacency_list.cs | 122 ++ .../chapter_graph/graph_adjacency_matrix.cs | 137 ++ ru/codes/csharp/chapter_graph/graph_bfs.cs | 58 + ru/codes/csharp/chapter_graph/graph_dfs.cs | 54 + .../chapter_greedy/coin_change_greedy.cs | 54 + .../chapter_greedy/fractional_knapsack.cs | 52 + .../csharp/chapter_greedy/max_capacity.cs | 39 + .../chapter_greedy/max_product_cutting.cs | 39 + .../csharp/chapter_hashing/array_hash_map.cs | 134 ++ .../csharp/chapter_hashing/built_in_hash.cs | 36 + ru/codes/csharp/chapter_hashing/hash_map.cs | 51 + .../chapter_hashing/hash_map_chaining.cs | 144 +++ .../hash_map_open_addressing.cs | 159 +++ .../csharp/chapter_hashing/simple_hash.cs | 66 + ru/codes/csharp/chapter_heap/heap.cs | 64 + ru/codes/csharp/chapter_heap/my_heap.cs | 160 +++ ru/codes/csharp/chapter_heap/top_k.cs | 37 + .../csharp/chapter_searching/binary_search.cs | 59 + .../chapter_searching/binary_search_edge.cs | 50 + .../binary_search_insertion.cs | 64 + .../chapter_searching/hashing_search.cs | 50 + .../csharp/chapter_searching/linear_search.cs | 49 + ru/codes/csharp/chapter_searching/two_sum.cs | 52 + .../csharp/chapter_sorting/bubble_sort.cs | 51 + .../csharp/chapter_sorting/bucket_sort.cs | 46 + .../csharp/chapter_sorting/counting_sort.cs | 77 ++ ru/codes/csharp/chapter_sorting/heap_sort.cs | 52 + .../csharp/chapter_sorting/insertion_sort.cs | 30 + ru/codes/csharp/chapter_sorting/merge_sort.cs | 56 + ru/codes/csharp/chapter_sorting/quick_sort.cs | 150 +++ ru/codes/csharp/chapter_sorting/radix_sort.cs | 69 + .../csharp/chapter_sorting/selection_sort.cs | 32 + .../chapter_stack_and_queue/array_deque.cs | 152 +++ .../chapter_stack_and_queue/array_queue.cs | 114 ++ .../chapter_stack_and_queue/array_stack.cs | 84 ++ .../csharp/chapter_stack_and_queue/deque.cs | 44 + .../linkedlist_deque.cs | 177 +++ .../linkedlist_queue.cs | 106 ++ .../linkedlist_stack.cs | 97 ++ .../csharp/chapter_stack_and_queue/queue.cs | 39 + .../csharp/chapter_stack_and_queue/stack.cs | 40 + .../csharp/chapter_tree/array_binary_tree.cs | 129 ++ ru/codes/csharp/chapter_tree/avl_tree.cs | 216 ++++ .../csharp/chapter_tree/binary_search_tree.cs | 160 +++ ru/codes/csharp/chapter_tree/binary_tree.cs | 39 + .../csharp/chapter_tree/binary_tree_bfs.cs | 40 + .../csharp/chapter_tree/binary_tree_dfs.cs | 59 + ru/codes/csharp/csharp.sln | 25 + ru/codes/csharp/hello-algo.csproj | 21 + ru/codes/csharp/utils/ListNode.cs | 32 + ru/codes/csharp/utils/PrintUtil.cs | 132 ++ ru/codes/csharp/utils/TreeNode.cs | 67 + ru/codes/csharp/utils/Vertex.cs | 30 + ru/codes/dart/build.dart | 39 + .../chapter_array_and_linkedlist/array.dart | 105 ++ .../linked_list.dart | 83 ++ .../chapter_array_and_linkedlist/list.dart | 62 + .../chapter_array_and_linkedlist/my_list.dart | 132 ++ .../dart/chapter_backtracking/n_queens.dart | 75 ++ .../chapter_backtracking/permutations_i.dart | 51 + .../chapter_backtracking/permutations_ii.dart | 53 + .../preorder_traversal_i_compact.dart | 35 + .../preorder_traversal_ii_compact.dart | 47 + .../preorder_traversal_iii_compact.dart | 47 + .../preorder_traversal_iii_template.dart | 73 ++ .../chapter_backtracking/subset_sum_i.dart | 56 + .../subset_sum_i_naive.dart | 54 + .../chapter_backtracking/subset_sum_ii.dart | 61 + .../iteration.dart | 72 ++ .../recursion.dart | 70 + .../space_complexity.dart | 106 ++ .../time_complexity.dart | 165 +++ .../worst_best_time_complexity.dart | 40 + .../binary_search_recur.dart | 42 + .../build_tree.dart | 55 + .../chapter_divide_and_conquer/hanota.dart | 54 + .../climbing_stairs_backtrack.dart | 39 + .../climbing_stairs_constraint_dp.dart | 33 + .../climbing_stairs_dfs.dart | 27 + .../climbing_stairs_dfs_mem.dart | 33 + .../climbing_stairs_dp.dart | 43 + .../coin_change.dart | 68 + .../coin_change_ii.dart | 64 + .../edit_distance.dart | 125 ++ .../chapter_dynamic_programming/knapsack.dart | 116 ++ .../min_cost_climbing_stairs_dp.dart | 48 + .../min_path_sum.dart | 120 ++ .../unbounded_knapsack.dart | 62 + .../chapter_graph/graph_adjacency_list.dart | 124 ++ .../chapter_graph/graph_adjacency_matrix.dart | 133 ++ ru/codes/dart/chapter_graph/graph_bfs.dart | 66 + ru/codes/dart/chapter_graph/graph_dfs.dart | 59 + .../chapter_greedy/coin_change_greedy.dart | 50 + .../chapter_greedy/fractional_knapsack.dart | 47 + .../dart/chapter_greedy/max_capacity.dart | 37 + .../chapter_greedy/max_product_cutting.dart | 37 + .../dart/chapter_hashing/array_hash_map.dart | 126 ++ .../dart/chapter_hashing/built_in_hash.dart | 34 + ru/codes/dart/chapter_hashing/hash_map.dart | 41 + .../chapter_hashing/hash_map_chaining.dart | 138 ++ .../hash_map_open_addressing.dart | 157 +++ .../dart/chapter_hashing/simple_hash.dart | 62 + ru/codes/dart/chapter_heap/my_heap.dart | 151 +++ ru/codes/dart/chapter_heap/top_k.dart | 150 +++ .../dart/chapter_searching/binary_search.dart | 63 + .../chapter_searching/binary_search_edge.dart | 48 + .../binary_search_insertion.dart | 60 + .../chapter_searching/hashing_search.dart | 54 + .../dart/chapter_searching/linear_search.dart | 47 + ru/codes/dart/chapter_searching/two_sum.dart | 49 + .../dart/chapter_sorting/bubble_sort.dart | 51 + .../dart/chapter_sorting/bucket_sort.dart | 39 + .../dart/chapter_sorting/counting_sort.dart | 72 ++ ru/codes/dart/chapter_sorting/heap_sort.dart | 49 + .../dart/chapter_sorting/insertion_sort.dart | 26 + ru/codes/dart/chapter_sorting/merge_sort.dart | 52 + ru/codes/dart/chapter_sorting/quick_sort.dart | 145 +++ ru/codes/dart/chapter_sorting/radix_sort.dart | 71 + .../dart/chapter_sorting/selection_sort.dart | 29 + .../chapter_stack_and_queue/array_deque.dart | 146 +++ .../chapter_stack_and_queue/array_queue.dart | 110 ++ .../chapter_stack_and_queue/array_stack.dart | 77 ++ .../dart/chapter_stack_and_queue/deque.dart | 42 + .../linkedlist_deque.dart | 167 +++ .../linkedlist_queue.dart | 103 ++ .../linkedlist_stack.dart | 93 ++ .../dart/chapter_stack_and_queue/queue.dart | 37 + .../dart/chapter_stack_and_queue/stack.dart | 35 + .../dart/chapter_tree/array_binary_tree.dart | 152 +++ ru/codes/dart/chapter_tree/avl_tree.dart | 218 ++++ .../dart/chapter_tree/binary_search_tree.dart | 153 +++ ru/codes/dart/chapter_tree/binary_tree.dart | 37 + .../dart/chapter_tree/binary_tree_bfs.dart | 38 + .../dart/chapter_tree/binary_tree_dfs.dart | 62 + ru/codes/dart/utils/list_node.dart | 24 + ru/codes/dart/utils/print_util.dart | 90 ++ ru/codes/dart/utils/tree_node.dart | 50 + ru/codes/dart/utils/vertex.dart | 29 + ru/codes/docker-compose.yml | 12 + .../go/chapter_array_and_linkedlist/array.go | 79 ++ .../array_test.go | 50 + .../linked_list.go | 51 + .../linked_list_test.go | 48 + .../chapter_array_and_linkedlist/list_test.go | 66 + .../chapter_array_and_linkedlist/my_list.go | 109 ++ .../my_list_test.go | 46 + ru/codes/go/chapter_backtracking/n_queens.go | 57 + .../go/chapter_backtracking/n_queens_test.go | 24 + .../chapter_backtracking/permutation_test.go | 33 + .../go/chapter_backtracking/permutations_i.go | 38 + .../chapter_backtracking/permutations_ii.go | 41 + .../preorder_traversal_i_compact.go | 22 + .../preorder_traversal_ii_compact.go | 26 + .../preorder_traversal_iii_compact.go | 27 + .../preorder_traversal_iii_template.go | 57 + .../preorder_traversal_test.go | 91 ++ .../go/chapter_backtracking/subset_sum_i.go | 42 + .../subset_sum_i_naive.go | 37 + .../go/chapter_backtracking/subset_sum_ii.go | 47 + .../chapter_backtracking/subset_sum_test.go | 56 + .../iteration.go | 59 + .../iteration_test.go | 26 + .../recursion.go | 61 + .../recursion_test.go | 26 + .../space_complexity.go | 106 ++ .../space_complexity_test.go | 26 + .../time_complexity.go | 130 ++ .../time_complexity_test.go | 48 + .../worst_best_time_complexity.go | 35 + .../worst_best_time_complexity_test.go | 20 + .../binary_search_recur.go | 34 + .../binary_search_recur_test.go | 20 + .../chapter_divide_and_conquer/build_tree.go | 37 + .../build_tree_test.go | 25 + .../go/chapter_divide_and_conquer/hanota.go | 39 + .../chapter_divide_and_conquer/hanota_test.go | 40 + .../climbing_stairs_backtrack.go | 36 + .../climbing_stairs_constraint_dp.go | 25 + .../climbing_stairs_dfs.go | 21 + .../climbing_stairs_dfs_mem.go | 32 + .../climbing_stairs_dp.go | 35 + .../climbing_stairs_test.go | 57 + .../coin_change.go | 66 + .../coin_change_ii.go | 54 + .../coin_change_test.go | 23 + .../edit_distance.go | 129 ++ .../edit_distance_test.go | 40 + .../chapter_dynamic_programming/knapsack.go | 87 ++ .../knapsack_test.go | 54 + .../min_cost_climbing_stairs_dp.go | 52 + .../min_path_sum.go | 94 ++ .../min_path_sum_test.go | 43 + .../unbounded_knapsack.go | 50 + .../go/chapter_graph/graph_adjacency_list.go | 100 ++ .../graph_adjacency_list_test.go | 45 + .../chapter_graph/graph_adjacency_matrix.go | 102 ++ .../graph_adjacency_matrix_test.go | 43 + ru/codes/go/chapter_graph/graph_bfs.go | 41 + ru/codes/go/chapter_graph/graph_bfs_test.go | 29 + ru/codes/go/chapter_graph/graph_dfs.go | 36 + ru/codes/go/chapter_graph/graph_dfs_test.go | 28 + .../go/chapter_greedy/coin_change_greedy.go | 27 + .../chapter_greedy/coin_change_greedy_test.go | 35 + .../go/chapter_greedy/fractional_knapsack.go | 41 + .../fractional_knapsack_test.go | 20 + ru/codes/go/chapter_greedy/max_capacity.go | 28 + .../go/chapter_greedy/max_capacity_test.go | 18 + .../go/chapter_greedy/max_product_cutting.go | 28 + .../max_product_cutting_test.go | 17 + ru/codes/go/chapter_hashing/array_hash_map.go | 97 ++ .../go/chapter_hashing/array_hash_map_test.go | 52 + .../go/chapter_hashing/hash_collision_test.go | 62 + .../go/chapter_hashing/hash_map_chaining.go | 134 ++ .../hash_map_open_addressing.go | 126 ++ ru/codes/go/chapter_hashing/hash_map_test.go | 74 ++ ru/codes/go/chapter_hashing/simple_hash.go | 55 + ru/codes/go/chapter_heap/heap.go | 45 + ru/codes/go/chapter_heap/heap_test.go | 101 ++ ru/codes/go/chapter_heap/my_heap.go | 140 ++ ru/codes/go/chapter_heap/top_k.go | 51 + .../go/chapter_searching/binary_search.go | 43 + .../chapter_searching/binary_search_edge.go | 31 + .../binary_search_insertion.go | 49 + .../chapter_searching/binary_search_test.go | 61 + .../go/chapter_searching/hashing_search.go | 29 + .../chapter_searching/hashing_search_test.go | 36 + .../go/chapter_searching/linear_search.go | 36 + .../chapter_searching/linear_search_test.go | 26 + ru/codes/go/chapter_searching/two_sum.go | 33 + ru/codes/go/chapter_searching/two_sum_test.go | 24 + ru/codes/go/chapter_sorting/bubble_sort.go | 38 + .../go/chapter_sorting/bubble_sort_test.go | 20 + ru/codes/go/chapter_sorting/bucket_sort.go | 37 + .../go/chapter_sorting/bucket_sort_test.go | 17 + ru/codes/go/chapter_sorting/counting_sort.go | 68 + .../go/chapter_sorting/counting_sort_test.go | 20 + ru/codes/go/chapter_sorting/heap_sort.go | 44 + ru/codes/go/chapter_sorting/heap_sort_test.go | 16 + ru/codes/go/chapter_sorting/insertion_sort.go | 20 + .../go/chapter_sorting/insertion_sort_test.go | 16 + ru/codes/go/chapter_sorting/merge_sort.go | 54 + .../go/chapter_sorting/merge_sort_test.go | 16 + ru/codes/go/chapter_sorting/quick_sort.go | 130 ++ .../go/chapter_sorting/quick_sort_test.go | 34 + ru/codes/go/chapter_sorting/radix_sort.go | 60 + .../go/chapter_sorting/radix_sort_test.go | 18 + ru/codes/go/chapter_sorting/selection_sort.go | 24 + .../go/chapter_sorting/selection_sort_test.go | 16 + .../go/chapter_stack_and_queue/array_deque.go | 121 ++ .../go/chapter_stack_and_queue/array_queue.go | 78 ++ .../go/chapter_stack_and_queue/array_stack.go | 55 + .../go/chapter_stack_and_queue/deque_test.go | 141 ++ .../linkedlist_deque.go | 85 ++ .../linkedlist_queue.go | 61 + .../linkedlist_stack.go | 61 + .../go/chapter_stack_and_queue/queue_test.go | 146 +++ .../go/chapter_stack_and_queue/stack_test.go | 130 ++ ru/codes/go/chapter_tree/array_binary_tree.go | 101 ++ .../go/chapter_tree/array_binary_tree_test.go | 47 + ru/codes/go/chapter_tree/avl_tree.go | 200 +++ ru/codes/go/chapter_tree/avl_tree_test.go | 54 + .../go/chapter_tree/binary_search_tree.go | 142 ++ .../chapter_tree/binary_search_tree_test.go | 45 + ru/codes/go/chapter_tree/binary_tree_bfs.go | 35 + .../go/chapter_tree/binary_tree_bfs_test.go | 24 + ru/codes/go/chapter_tree/binary_tree_dfs.go | 44 + .../go/chapter_tree/binary_tree_dfs_test.go | 35 + ru/codes/go/chapter_tree/binary_tree_test.go | 41 + ru/codes/go/go.mod | 3 + ru/codes/go/pkg/list_node.go | 31 + ru/codes/go/pkg/list_node_test.go | 16 + ru/codes/go/pkg/print_utils.go | 118 ++ ru/codes/go/pkg/tree_node.go | 78 ++ ru/codes/go/pkg/tree_node_test.go | 21 + ru/codes/go/pkg/vertex.go | 55 + ru/codes/java/.gitignore | 1 + .../chapter_array_and_linkedlist/array.java | 105 ++ .../linked_list.java | 86 ++ .../chapter_array_and_linkedlist/list.java | 66 + .../chapter_array_and_linkedlist/my_list.java | 147 +++ .../java/chapter_backtracking/n_queens.java | 77 ++ .../chapter_backtracking/permutations_i.java | 51 + .../chapter_backtracking/permutations_ii.java | 53 + .../preorder_traversal_i_compact.java | 44 + .../preorder_traversal_ii_compact.java | 52 + .../preorder_traversal_iii_compact.java | 53 + .../preorder_traversal_iii_template.java | 77 ++ .../chapter_backtracking/subset_sum_i.java | 55 + .../subset_sum_i_naive.java | 53 + .../chapter_backtracking/subset_sum_ii.java | 60 + .../iteration.java | 76 ++ .../recursion.java | 79 ++ .../space_complexity.java | 110 ++ .../time_complexity.java | 167 +++ .../worst_best_time_complexity.java | 50 + .../binary_search_recur.java | 45 + .../build_tree.java | 51 + .../chapter_divide_and_conquer/hanota.java | 59 + .../climbing_stairs_backtrack.java | 44 + .../climbing_stairs_constraint_dp.java | 36 + .../climbing_stairs_dfs.java | 31 + .../climbing_stairs_dfs_mem.java | 41 + .../climbing_stairs_dp.java | 48 + .../coin_change.java | 72 ++ .../coin_change_ii.java | 67 + .../edit_distance.java | 139 ++ .../chapter_dynamic_programming/knapsack.java | 116 ++ .../min_cost_climbing_stairs_dp.java | 53 + .../min_path_sum.java | 125 ++ .../unbounded_knapsack.java | 63 + .../chapter_graph/graph_adjacency_list.java | 117 ++ .../chapter_graph/graph_adjacency_matrix.java | 131 ++ ru/codes/java/chapter_graph/graph_bfs.java | 55 + ru/codes/java/chapter_graph/graph_dfs.java | 51 + .../chapter_greedy/coin_change_greedy.java | 55 + .../chapter_greedy/fractional_knapsack.java | 59 + .../java/chapter_greedy/max_capacity.java | 38 + .../chapter_greedy/max_product_cutting.java | 40 + .../java/chapter_hashing/array_hash_map.java | 141 ++ .../java/chapter_hashing/built_in_hash.java | 38 + ru/codes/java/chapter_hashing/hash_map.java | 52 + .../chapter_hashing/hash_map_chaining.java | 148 +++ .../hash_map_open_addressing.java | 158 +++ .../java/chapter_hashing/simple_hash.java | 65 + ru/codes/java/chapter_heap/heap.java | 66 + ru/codes/java/chapter_heap/my_heap.java | 159 +++ ru/codes/java/chapter_heap/top_k.java | 40 + .../java/chapter_searching/binary_search.java | 58 + .../chapter_searching/binary_search_edge.java | 49 + .../binary_search_insertion.java | 63 + .../chapter_searching/hashing_search.java | 51 + .../java/chapter_searching/linear_search.java | 50 + ru/codes/java/chapter_searching/two_sum.java | 53 + .../java/chapter_sorting/bubble_sort.java | 57 + .../java/chapter_sorting/bucket_sort.java | 47 + .../java/chapter_sorting/counting_sort.java | 78 ++ ru/codes/java/chapter_sorting/heap_sort.java | 57 + .../java/chapter_sorting/insertion_sort.java | 31 + ru/codes/java/chapter_sorting/merge_sort.java | 58 + ru/codes/java/chapter_sorting/quick_sort.java | 158 +++ ru/codes/java/chapter_sorting/radix_sort.java | 69 + .../java/chapter_sorting/selection_sort.java | 35 + .../chapter_stack_and_queue/array_deque.java | 151 +++ .../chapter_stack_and_queue/array_queue.java | 115 ++ .../chapter_stack_and_queue/array_stack.java | 84 ++ .../java/chapter_stack_and_queue/deque.java | 46 + .../linkedlist_deque.java | 175 +++ .../linkedlist_queue.java | 104 ++ .../linkedlist_stack.java | 95 ++ .../java/chapter_stack_and_queue/queue.java | 40 + .../java/chapter_stack_and_queue/stack.java | 40 + .../java/chapter_tree/array_binary_tree.java | 136 ++ ru/codes/java/chapter_tree/avl_tree.java | 220 ++++ .../java/chapter_tree/binary_search_tree.java | 158 +++ ru/codes/java/chapter_tree/binary_tree.java | 40 + .../java/chapter_tree/binary_tree_bfs.java | 42 + .../java/chapter_tree/binary_tree_dfs.java | 68 + ru/codes/java/utils/ListNode.java | 28 + ru/codes/java/utils/PrintUtil.java | 116 ++ ru/codes/java/utils/TreeNode.java | 73 ++ ru/codes/java/utils/Vertex.java | 36 + ru/codes/javascript/.prettierrc | 6 + .../chapter_array_and_linkedlist/array.js | 97 ++ .../linked_list.js | 82 ++ .../chapter_array_and_linkedlist/list.js | 57 + .../chapter_array_and_linkedlist/my_list.js | 141 ++ .../chapter_backtracking/n_queens.js | 55 + .../chapter_backtracking/permutations_i.js | 42 + .../chapter_backtracking/permutations_ii.js | 44 + .../preorder_traversal_i_compact.js | 33 + .../preorder_traversal_ii_compact.js | 40 + .../preorder_traversal_iii_compact.js | 41 + .../preorder_traversal_iii_template.js | 68 + .../chapter_backtracking/subset_sum_i.js | 46 + .../subset_sum_i_naive.js | 44 + .../chapter_backtracking/subset_sum_ii.js | 51 + .../iteration.js | 70 + .../recursion.js | 69 + .../space_complexity.js | 103 ++ .../time_complexity.js | 155 +++ .../worst_best_time_complexity.js | 43 + .../binary_search_recur.js | 39 + .../chapter_divide_and_conquer/build_tree.js | 44 + .../chapter_divide_and_conquer/hanota.js | 52 + .../climbing_stairs_backtrack.js | 34 + .../climbing_stairs_constraint_dp.js | 30 + .../climbing_stairs_dfs.js | 24 + .../climbing_stairs_dfs_mem.js | 30 + .../climbing_stairs_dp.js | 40 + .../coin_change.js | 66 + .../coin_change_ii.js | 64 + .../edit_distance.js | 135 ++ .../chapter_dynamic_programming/knapsack.js | 113 ++ .../min_cost_climbing_stairs_dp.js | 49 + .../min_path_sum.js | 121 ++ .../unbounded_knapsack.js | 63 + .../chapter_graph/graph_adjacency_list.js | 142 ++ .../chapter_graph/graph_adjacency_matrix.js | 132 ++ .../javascript/chapter_graph/graph_bfs.js | 61 + .../javascript/chapter_graph/graph_dfs.js | 54 + .../chapter_greedy/coin_change_greedy.js | 48 + .../chapter_greedy/fractional_knapsack.js | 46 + .../javascript/chapter_greedy/max_capacity.js | 34 + .../chapter_greedy/max_product_cutting.js | 33 + .../chapter_hashing/array_hash_map.js | 128 ++ .../javascript/chapter_hashing/hash_map.js | 44 + .../chapter_hashing/hash_map_chaining.js | 142 ++ .../hash_map_open_addressing.js | 177 +++ .../javascript/chapter_hashing/simple_hash.js | 60 + ru/codes/javascript/chapter_heap/my_heap.js | 158 +++ ru/codes/javascript/chapter_heap/top_k.js | 58 + .../chapter_searching/binary_search.js | 60 + .../chapter_searching/binary_search_edge.js | 45 + .../binary_search_insertion.js | 64 + .../chapter_searching/hashing_search.js | 45 + .../chapter_searching/linear_search.js | 47 + .../javascript/chapter_searching/two_sum.js | 46 + .../javascript/chapter_sorting/bubble_sort.js | 49 + .../javascript/chapter_sorting/bucket_sort.js | 39 + .../chapter_sorting/counting_sort.js | 65 + .../javascript/chapter_sorting/heap_sort.js | 49 + .../chapter_sorting/insertion_sort.js | 25 + .../javascript/chapter_sorting/merge_sort.js | 52 + .../javascript/chapter_sorting/quick_sort.js | 161 +++ .../javascript/chapter_sorting/radix_sort.js | 61 + .../chapter_sorting/selection_sort.js | 27 + .../chapter_stack_and_queue/array_deque.js | 156 +++ .../chapter_stack_and_queue/array_queue.js | 106 ++ .../chapter_stack_and_queue/array_stack.js | 75 ++ .../chapter_stack_and_queue/deque.js | 44 + .../linkedlist_deque.js | 167 +++ .../linkedlist_queue.js | 99 ++ .../linkedlist_stack.js | 88 ++ .../chapter_stack_and_queue/queue.js | 35 + .../chapter_stack_and_queue/stack.js | 35 + .../chapter_tree/array_binary_tree.js | 147 +++ ru/codes/javascript/chapter_tree/avl_tree.js | 208 +++ .../chapter_tree/binary_search_tree.js | 139 ++ .../javascript/chapter_tree/binary_tree.js | 35 + .../chapter_tree/binary_tree_bfs.js | 34 + .../chapter_tree/binary_tree_dfs.js | 60 + ru/codes/javascript/modules/ListNode.js | 31 + ru/codes/javascript/modules/PrintUtil.js | 86 ++ ru/codes/javascript/modules/TreeNode.js | 35 + ru/codes/javascript/modules/Vertex.js | 35 + ru/codes/javascript/test_all.js | 63 + .../chapter_array_and_linkedlist/array.kt | 102 ++ .../linked_list.kt | 88 ++ .../chapter_array_and_linkedlist/list.kt | 63 + .../chapter_array_and_linkedlist/my_list.kt | 139 ++ .../kotlin/chapter_backtracking/n_queens.kt | 85 ++ .../chapter_backtracking/permutations_i.kt | 53 + .../chapter_backtracking/permutations_ii.kt | 54 + .../preorder_traversal_i_compact.kt | 43 + .../preorder_traversal_ii_compact.kt | 51 + .../preorder_traversal_iii_compact.kt | 52 + .../preorder_traversal_iii_template.kt | 82 ++ .../chapter_backtracking/subset_sum_i.kt | 58 + .../subset_sum_i_naive.kt | 55 + .../chapter_backtracking/subset_sum_ii.kt | 62 + .../iteration.kt | 74 ++ .../recursion.kt | 78 ++ .../space_complexity.kt | 109 ++ .../time_complexity.kt | 168 +++ .../worst_best_time_complexity.kt | 45 + .../binary_search_recur.kt | 49 + .../chapter_divide_and_conquer/build_tree.kt | 55 + .../chapter_divide_and_conquer/hanota.kt | 56 + .../climbing_stairs_backtrack.kt | 45 + .../climbing_stairs_constraint_dp.kt | 35 + .../climbing_stairs_dfs.kt | 29 + .../climbing_stairs_dfs_mem.kt | 36 + .../climbing_stairs_dp.kt | 46 + .../coin_change.kt | 71 + .../coin_change_ii.kt | 66 + .../edit_distance.kt | 143 ++ .../chapter_dynamic_programming/knapsack.kt | 125 ++ .../min_cost_climbing_stairs_dp.kt | 51 + .../min_path_sum.kt | 132 ++ .../unbounded_knapsack.kt | 68 + .../chapter_graph/graph_adjacency_list.kt | 121 ++ .../chapter_graph/graph_adjacency_matrix.kt | 134 ++ ru/codes/kotlin/chapter_graph/graph_bfs.kt | 65 + ru/codes/kotlin/chapter_graph/graph_dfs.kt | 60 + .../chapter_greedy/coin_change_greedy.kt | 53 + .../chapter_greedy/fractional_knapsack.kt | 51 + .../kotlin/chapter_greedy/max_capacity.kt | 41 + .../chapter_greedy/max_product_cutting.kt | 39 + .../kotlin/chapter_hashing/array_hash_map.kt | 126 ++ .../kotlin/chapter_hashing/built_in_hash.kt | 36 + ru/codes/kotlin/chapter_hashing/hash_map.kt | 50 + .../chapter_hashing/hash_map_chaining.kt | 145 +++ .../hash_map_open_addressing.kt | 161 +++ .../kotlin/chapter_hashing/simple_hash.kt | 64 + ru/codes/kotlin/chapter_heap/heap.kt | 66 + ru/codes/kotlin/chapter_heap/my_heap.kt | 160 +++ ru/codes/kotlin/chapter_heap/top_k.kt | 38 + .../kotlin/chapter_searching/binary_search.kt | 59 + .../chapter_searching/binary_search_edge.kt | 48 + .../binary_search_insertion.kt | 65 + .../chapter_searching/hashing_search.kt | 49 + .../kotlin/chapter_searching/linear_search.kt | 50 + ru/codes/kotlin/chapter_searching/two_sum.kt | 49 + .../kotlin/chapter_sorting/bubble_sort.kt | 53 + .../kotlin/chapter_sorting/bucket_sort.kt | 44 + .../kotlin/chapter_sorting/counting_sort.kt | 80 ++ ru/codes/kotlin/chapter_sorting/heap_sort.kt | 55 + .../kotlin/chapter_sorting/insertion_sort.kt | 29 + ru/codes/kotlin/chapter_sorting/merge_sort.kt | 56 + ru/codes/kotlin/chapter_sorting/quick_sort.kt | 121 ++ ru/codes/kotlin/chapter_sorting/radix_sort.kt | 68 + .../kotlin/chapter_sorting/selection_sort.kt | 32 + .../chapter_stack_and_queue/array_deque.kt | 145 +++ .../chapter_stack_and_queue/array_queue.kt | 110 ++ .../chapter_stack_and_queue/array_stack.kt | 75 ++ .../kotlin/chapter_stack_and_queue/deque.kt | 45 + .../linkedlist_deque.kt | 163 +++ .../linkedlist_queue.kt | 98 ++ .../linkedlist_stack.kt | 87 ++ .../kotlin/chapter_stack_and_queue/queue.kt | 39 + .../kotlin/chapter_stack_and_queue/stack.kt | 39 + .../kotlin/chapter_tree/array_binary_tree.kt | 127 ++ ru/codes/kotlin/chapter_tree/avl_tree.kt | 223 ++++ .../kotlin/chapter_tree/binary_search_tree.kt | 157 +++ ru/codes/kotlin/chapter_tree/binary_tree.kt | 40 + .../kotlin/chapter_tree/binary_tree_bfs.kt | 42 + .../kotlin/chapter_tree/binary_tree_dfs.kt | 64 + ru/codes/kotlin/utils/ListNode.kt | 25 + ru/codes/kotlin/utils/PrintUtil.kt | 107 ++ ru/codes/kotlin/utils/TreeNode.kt | 69 + ru/codes/kotlin/utils/Vertex.kt | 30 + ru/codes/python/.gitignore | 1 + .../chapter_array_and_linkedlist/array.py | 100 ++ .../linked_list.py | 85 ++ .../chapter_array_and_linkedlist/list.py | 56 + .../chapter_array_and_linkedlist/my_list.py | 118 ++ .../python/chapter_backtracking/n_queens.py | 62 + .../chapter_backtracking/permutations_i.py | 44 + .../chapter_backtracking/permutations_ii.py | 46 + .../preorder_traversal_i_compact.py | 36 + .../preorder_traversal_ii_compact.py | 42 + .../preorder_traversal_iii_compact.py | 43 + .../preorder_traversal_iii_template.py | 71 + .../chapter_backtracking/subset_sum_i.py | 48 + .../subset_sum_i_naive.py | 50 + .../chapter_backtracking/subset_sum_ii.py | 52 + .../iteration.py | 65 + .../recursion.py | 69 + .../space_complexity.py | 90 ++ .../time_complexity.py | 153 +++ .../worst_best_time_complexity.py | 36 + .../binary_search_recur.py | 40 + .../chapter_divide_and_conquer/build_tree.py | 54 + .../chapter_divide_and_conquer/hanota.py | 53 + .../climbing_stairs_backtrack.py | 37 + .../climbing_stairs_constraint_dp.py | 29 + .../climbing_stairs_dfs.py | 28 + .../climbing_stairs_dfs_mem.py | 35 + .../climbing_stairs_dp.py | 40 + .../coin_change.py | 60 + .../coin_change_ii.py | 58 + .../edit_distance.py | 123 ++ .../chapter_dynamic_programming/knapsack.py | 101 ++ .../min_cost_climbing_stairs_dp.py | 43 + .../min_path_sum.py | 104 ++ .../unbounded_knapsack.py | 55 + .../chapter_graph/graph_adjacency_list.py | 111 ++ .../chapter_graph/graph_adjacency_matrix.py | 116 ++ ru/codes/python/chapter_graph/graph_bfs.py | 64 + ru/codes/python/chapter_graph/graph_dfs.py | 57 + .../chapter_greedy/coin_change_greedy.py | 48 + .../chapter_greedy/fractional_knapsack.py | 46 + .../python/chapter_greedy/max_capacity.py | 33 + .../chapter_greedy/max_product_cutting.py | 33 + .../python/chapter_hashing/array_hash_map.py | 117 ++ .../python/chapter_hashing/built_in_hash.py | 37 + ru/codes/python/chapter_hashing/hash_map.py | 50 + .../chapter_hashing/hash_map_chaining.py | 118 ++ .../hash_map_open_addressing.py | 138 ++ .../python/chapter_hashing/simple_hash.py | 58 + ru/codes/python/chapter_heap/heap.py | 71 + ru/codes/python/chapter_heap/my_heap.py | 137 ++ ru/codes/python/chapter_heap/top_k.py | 39 + .../python/chapter_searching/binary_search.py | 52 + .../chapter_searching/binary_search_edge.py | 49 + .../binary_search_insertion.py | 54 + .../chapter_searching/hashing_search.py | 51 + .../python/chapter_searching/linear_search.py | 45 + ru/codes/python/chapter_searching/two_sum.py | 42 + .../python/chapter_sorting/bubble_sort.py | 44 + .../python/chapter_sorting/bucket_sort.py | 35 + .../python/chapter_sorting/counting_sort.py | 62 + ru/codes/python/chapter_sorting/heap_sort.py | 45 + .../python/chapter_sorting/insertion_sort.py | 25 + ru/codes/python/chapter_sorting/merge_sort.py | 55 + ru/codes/python/chapter_sorting/quick_sort.py | 129 ++ ru/codes/python/chapter_sorting/radix_sort.py | 69 + .../python/chapter_sorting/selection_sort.py | 26 + .../chapter_stack_and_queue/array_deque.py | 129 ++ .../chapter_stack_and_queue/array_queue.py | 98 ++ .../chapter_stack_and_queue/array_stack.py | 72 ++ .../python/chapter_stack_and_queue/deque.py | 42 + .../linkedlist_deque.py | 151 +++ .../linkedlist_queue.py | 97 ++ .../linkedlist_stack.py | 89 ++ .../python/chapter_stack_and_queue/queue.py | 39 + .../python/chapter_stack_and_queue/stack.py | 36 + .../python/chapter_tree/array_binary_tree.py | 119 ++ ru/codes/python/chapter_tree/avl_tree.py | 200 +++ .../python/chapter_tree/binary_search_tree.py | 146 +++ ru/codes/python/chapter_tree/binary_tree.py | 41 + .../python/chapter_tree/binary_tree_bfs.py | 42 + .../python/chapter_tree/binary_tree_dfs.py | 65 + ru/codes/python/modules/__init__.py | 19 + ru/codes/python/modules/list_node.py | 32 + ru/codes/python/modules/print_util.py | 81 ++ ru/codes/python/modules/tree_node.py | 69 + ru/codes/python/modules/vertex.py | 20 + ru/codes/python/test_all.py | 33 + .../chapter_array_and_linkedlist/array.md | 23 + .../linked_list.md | 17 + .../chapter_array_and_linkedlist/my_list.md | 8 + .../chapter_backtracking/n_queens.md | 8 + .../chapter_backtracking/permutations_i.md | 8 + .../chapter_backtracking/permutations_ii.md | 8 + .../preorder_traversal_i_compact.md | 8 + .../preorder_traversal_ii_compact.md | 8 + .../preorder_traversal_iii_compact.md | 8 + .../preorder_traversal_iii_template.md | 8 + .../chapter_backtracking/subset_sum_i.md | 8 + .../subset_sum_i_naive.md | 8 + .../chapter_backtracking/subset_sum_ii.md | 8 + .../iteration.md | 29 + .../recursion.md | 17 + .../space_complexity.md | 23 + .../time_complexity.md | 38 + .../worst_best_time_complexity.md | 8 + .../binary_search_recur.md | 8 + .../chapter_divide_and_conquer/build_tree.md | 8 + .../chapter_divide_and_conquer/hanota.md | 8 + .../climbing_stairs_backtrack.md | 8 + .../climbing_stairs_constraint_dp.md | 8 + .../climbing_stairs_dfs.md | 8 + .../climbing_stairs_dfs_mem.md | 8 + .../climbing_stairs_dp.md | 11 + .../coin_change.md | 11 + .../coin_change_ii.md | 11 + .../edit_distance.md | 11 + .../chapter_dynamic_programming/knapsack.md | 17 + .../min_cost_climbing_stairs_dp.md | 11 + .../min_path_sum.md | 17 + .../unbounded_knapsack.md | 11 + .../chapter_graph/graph_adjacency_list.md | 8 + .../chapter_graph/graph_adjacency_matrix.md | 8 + .../pythontutor/chapter_graph/graph_bfs.md | 8 + .../pythontutor/chapter_graph/graph_dfs.md | 8 + .../chapter_greedy/coin_change_greedy.md | 8 + .../chapter_greedy/fractional_knapsack.md | 8 + .../chapter_greedy/max_capacity.md | 8 + .../chapter_greedy/max_product_cutting.md | 8 + .../chapter_hashing/array_hash_map.md | 8 + .../chapter_hashing/hash_map_chaining.md | 8 + .../chapter_hashing/simple_hash.md | 8 + ru/codes/pythontutor/chapter_heap/my_heap.md | 20 + ru/codes/pythontutor/chapter_heap/top_k.md | 8 + .../chapter_searching/binary_search.md | 11 + .../chapter_searching/binary_search_edge.md | 11 + .../binary_search_insertion.md | 11 + .../pythontutor/chapter_searching/two_sum.md | 11 + .../chapter_sorting/bubble_sort.md | 11 + .../chapter_sorting/bucket_sort.md | 8 + .../chapter_sorting/counting_sort.md | 11 + .../pythontutor/chapter_sorting/heap_sort.md | 8 + .../chapter_sorting/insertion_sort.md | 8 + .../pythontutor/chapter_sorting/merge_sort.md | 8 + .../pythontutor/chapter_sorting/quick_sort.md | 17 + .../pythontutor/chapter_sorting/radix_sort.md | 8 + .../chapter_sorting/selection_sort.md | 8 + .../chapter_stack_and_queue/array_queue.md | 8 + .../chapter_stack_and_queue/array_stack.md | 8 + .../linkedlist_queue.md | 8 + .../linkedlist_stack.md | 8 + .../chapter_tree/array_binary_tree.md | 8 + .../chapter_tree/binary_search_tree.md | 14 + .../chapter_tree/binary_tree_bfs.md | 8 + .../chapter_tree/binary_tree_dfs.md | 8 + .../chapter_array_and_linkedlist/array.rb | 108 ++ .../linked_list.rb | 83 ++ .../ruby/chapter_array_and_linkedlist/list.rb | 60 + .../chapter_array_and_linkedlist/my_list.rb | 132 ++ .../ruby/chapter_backtracking/n_queens.rb | 61 + .../chapter_backtracking/permutations_i.rb | 46 + .../chapter_backtracking/permutations_ii.rb | 48 + .../preorder_traversal_i_compact.rb | 33 + .../preorder_traversal_ii_compact.rb | 41 + .../preorder_traversal_iii_compact.rb | 42 + .../preorder_traversal_iii_template.rb | 68 + .../ruby/chapter_backtracking/subset_sum_i.rb | 47 + .../subset_sum_i_naive.rb | 46 + .../chapter_backtracking/subset_sum_ii.rb | 51 + .../iteration.rb | 79 ++ .../recursion.rb | 70 + .../space_complexity.rb | 92 ++ .../time_complexity.rb | 165 +++ .../worst_best_time_complexity.rb | 35 + .../binary_search_recur.rb | 42 + .../chapter_divide_and_conquer/build_tree.rb | 46 + .../ruby/chapter_divide_and_conquer/hanota.rb | 55 + .../climbing_stairs_backtrack.rb | 37 + .../climbing_stairs_constraint_dp.rb | 31 + .../climbing_stairs_dfs.rb | 26 + .../climbing_stairs_dfs_mem.rb | 33 + .../climbing_stairs_dp.rb | 40 + .../coin_change.rb | 65 + .../coin_change_ii.rb | 63 + .../edit_distance.rb | 115 ++ .../chapter_dynamic_programming/knapsack.rb | 99 ++ .../min_cost_climbing_stairs_dp.rb | 39 + .../min_path_sum.rb | 93 ++ .../unbounded_knapsack.rb | 61 + .../chapter_graph/graph_adjacency_list.rb | 116 ++ .../chapter_graph/graph_adjacency_matrix.rb | 116 ++ ru/codes/ruby/chapter_graph/graph_bfs.rb | 61 + ru/codes/ruby/chapter_graph/graph_dfs.rb | 54 + .../ruby/chapter_greedy/coin_change_greedy.rb | 50 + .../chapter_greedy/fractional_knapsack.rb | 51 + ru/codes/ruby/chapter_greedy/max_capacity.rb | 37 + .../chapter_greedy/max_product_cutting.rb | 28 + .../ruby/chapter_hashing/array_hash_map.rb | 121 ++ .../ruby/chapter_hashing/built_in_hash.rb | 34 + ru/codes/ruby/chapter_hashing/hash_map.rb | 44 + .../ruby/chapter_hashing/hash_map_chaining.rb | 128 ++ .../hash_map_open_addressing.rb | 147 +++ ru/codes/ruby/chapter_hashing/simple_hash.rb | 62 + ru/codes/ruby/chapter_heap/my_heap.rb | 147 +++ ru/codes/ruby/chapter_heap/top_k.rb | 64 + .../ruby/chapter_searching/binary_search.rb | 63 + .../chapter_searching/binary_search_edge.rb | 47 + .../binary_search_insertion.rb | 68 + .../ruby/chapter_searching/hashing_search.rb | 47 + .../ruby/chapter_searching/linear_search.rb | 44 + ru/codes/ruby/chapter_searching/two_sum.rb | 46 + ru/codes/ruby/chapter_sorting/bubble_sort.rb | 51 + ru/codes/ruby/chapter_sorting/bucket_sort.rb | 43 + .../ruby/chapter_sorting/counting_sort.rb | 62 + ru/codes/ruby/chapter_sorting/heap_sort.rb | 45 + .../ruby/chapter_sorting/insertion_sort.rb | 26 + ru/codes/ruby/chapter_sorting/merge_sort.rb | 60 + ru/codes/ruby/chapter_sorting/quick_sort.rb | 153 +++ ru/codes/ruby/chapter_sorting/radix_sort.rb | 70 + .../ruby/chapter_sorting/selection_sort.rb | 29 + .../chapter_stack_and_queue/array_deque.rb | 145 +++ .../chapter_stack_and_queue/array_queue.rb | 107 ++ .../chapter_stack_and_queue/array_stack.rb | 78 ++ .../ruby/chapter_stack_and_queue/deque.rb | 42 + .../linkedlist_deque.rb | 168 +++ .../linkedlist_queue.rb | 101 ++ .../linkedlist_stack.rb | 87 ++ .../ruby/chapter_stack_and_queue/queue.rb | 38 + .../ruby/chapter_stack_and_queue/stack.rb | 37 + .../ruby/chapter_tree/array_binary_tree.rb | 124 ++ ru/codes/ruby/chapter_tree/avl_tree.rb | 216 ++++ .../ruby/chapter_tree/binary_search_tree.rb | 161 +++ ru/codes/ruby/chapter_tree/binary_tree.rb | 38 + ru/codes/ruby/chapter_tree/binary_tree_bfs.rb | 36 + ru/codes/ruby/chapter_tree/binary_tree_dfs.rb | 62 + ru/codes/ruby/test_all.rb | 23 + ru/codes/ruby/utils/list_node.rb | 38 + ru/codes/ruby/utils/print_util.rb | 80 ++ ru/codes/ruby/utils/tree_node.rb | 53 + ru/codes/ruby/utils/vertex.rb | 24 + ru/codes/rust/.gitignore | 2 + ru/codes/rust/Cargo.toml | 413 ++++++ .../chapter_array_and_linkedlist/array.rs | 111 ++ .../linked_list.rs | 100 ++ .../rust/chapter_array_and_linkedlist/list.rs | 71 + .../chapter_array_and_linkedlist/my_list.rs | 164 +++ .../rust/chapter_backtracking/n_queens.rs | 76 ++ .../chapter_backtracking/permutations_i.rs | 46 + .../chapter_backtracking/permutations_ii.rs | 50 + .../preorder_traversal_i_compact.rs | 41 + .../preorder_traversal_ii_compact.rs | 52 + .../preorder_traversal_iii_compact.rs | 53 + .../preorder_traversal_iii_template.rs | 88 ++ .../rust/chapter_backtracking/subset_sum_i.rs | 56 + .../subset_sum_i_naive.rs | 54 + .../chapter_backtracking/subset_sum_ii.rs | 61 + .../iteration.rs | 74 ++ .../recursion.rs | 76 ++ .../space_complexity.rs | 114 ++ .../time_complexity.rs | 170 +++ .../worst_best_time_complexity.rs | 42 + .../binary_search_recur.rs | 41 + .../chapter_divide_and_conquer/build_tree.rs | 56 + .../rust/chapter_divide_and_conquer/hanota.rs | 55 + .../climbing_stairs_backtrack.rs | 41 + .../climbing_stairs_constraint_dp.rs | 33 + .../climbing_stairs_dfs.rs | 29 + .../climbing_stairs_dfs_mem.rs | 37 + .../climbing_stairs_dp.rs | 48 + .../coin_change.rs | 75 ++ .../coin_change_ii.rs | 64 + .../edit_distance.rs | 145 +++ .../chapter_dynamic_programming/knapsack.rs | 113 ++ .../min_cost_climbing_stairs_dp.rs | 52 + .../min_path_sum.rs | 120 ++ .../unbounded_knapsack.rs | 60 + .../chapter_graph/graph_adjacency_list.rs | 135 ++ .../chapter_graph/graph_adjacency_matrix.rs | 136 ++ ru/codes/rust/chapter_graph/graph_bfs.rs | 69 + ru/codes/rust/chapter_graph/graph_dfs.rs | 61 + .../rust/chapter_greedy/coin_change_greedy.rs | 54 + .../chapter_greedy/fractional_knapsack.rs | 59 + ru/codes/rust/chapter_greedy/max_capacity.rs | 36 + .../chapter_greedy/max_product_cutting.rs | 35 + .../rust/chapter_hashing/array_hash_map.rs | 124 ++ .../rust/chapter_hashing/build_in_hash.rs | 49 + ru/codes/rust/chapter_hashing/hash_map.rs | 48 + .../rust/chapter_hashing/hash_map_chaining.rs | 156 +++ .../hash_map_open_addressing.rs | 181 +++ ru/codes/rust/chapter_hashing/simple_hash.rs | 70 + ru/codes/rust/chapter_heap/heap.rs | 71 + ru/codes/rust/chapter_heap/my_heap.rs | 165 +++ ru/codes/rust/chapter_heap/top_k.rs | 39 + .../rust/chapter_searching/binary_search.rs | 65 + .../chapter_searching/binary_search_edge.rs | 50 + .../binary_search_insertion.rs | 61 + .../rust/chapter_searching/hashing_search.rs | 50 + .../rust/chapter_searching/linear_search.rs | 54 + ru/codes/rust/chapter_searching/two_sum.rs | 52 + ru/codes/rust/chapter_sorting/bubble_sort.rs | 53 + ru/codes/rust/chapter_sorting/bucket_sort.rs | 43 + .../rust/chapter_sorting/counting_sort.rs | 70 + ru/codes/rust/chapter_sorting/heap_sort.rs | 54 + .../rust/chapter_sorting/insertion_sort.rs | 29 + ru/codes/rust/chapter_sorting/merge_sort.rs | 66 + ru/codes/rust/chapter_sorting/quick_sort.rs | 148 +++ ru/codes/rust/chapter_sorting/radix_sort.rs | 63 + .../rust/chapter_sorting/selection_sort.rs | 35 + .../chapter_stack_and_queue/array_deque.rs | 160 +++ .../chapter_stack_and_queue/array_queue.rs | 125 ++ .../chapter_stack_and_queue/array_stack.rs | 86 ++ .../rust/chapter_stack_and_queue/deque.rs | 49 + .../linkedlist_deque.rs | 218 ++++ .../linkedlist_queue.rs | 126 ++ .../linkedlist_stack.rs | 105 ++ .../rust/chapter_stack_and_queue/queue.rs | 41 + .../rust/chapter_stack_and_queue/stack.rs | 40 + .../rust/chapter_tree/array_binary_tree.rs | 186 +++ ru/codes/rust/chapter_tree/avl_tree.rs | 295 +++++ .../rust/chapter_tree/binary_search_tree.rs | 193 +++ ru/codes/rust/chapter_tree/binary_tree.rs | 38 + ru/codes/rust/chapter_tree/binary_tree_bfs.rs | 45 + ru/codes/rust/chapter_tree/binary_tree_dfs.rs | 87 ++ ru/codes/rust/src/include/list_node.rs | 57 + ru/codes/rust/src/include/mod.rs | 16 + ru/codes/rust/src/include/print_util.rs | 103 ++ ru/codes/rust/src/include/tree_node.rs | 92 ++ ru/codes/rust/src/include/vertex.rs | 27 + ru/codes/rust/src/lib.rs | 1 + ru/codes/swift/.gitignore | 130 ++ ru/codes/swift/Package.resolved | 14 + ru/codes/swift/Package.swift | 206 +++ .../chapter_array_and_linkedlist/array.swift | 107 ++ .../linked_list.swift | 90 ++ .../chapter_array_and_linkedlist/list.swift | 63 + .../my_list.swift | 146 +++ .../swift/chapter_backtracking/n_queens.swift | 67 + .../chapter_backtracking/permutations_i.swift | 50 + .../permutations_ii.swift | 52 + .../preorder_traversal_i_compact.swift | 43 + .../preorder_traversal_ii_compact.swift | 51 + .../preorder_traversal_iii_compact.swift | 52 + .../preorder_traversal_iii_template.swift | 76 ++ .../chapter_backtracking/subset_sum_i.swift | 53 + .../subset_sum_i_naive.swift | 51 + .../chapter_backtracking/subset_sum_ii.swift | 58 + .../iteration.swift | 75 ++ .../recursion.swift | 79 ++ .../space_complexity.swift | 98 ++ .../time_complexity.swift | 172 +++ .../worst_best_time_complexity.swift | 40 + .../binary_search_recur.swift | 44 + .../build_tree.swift | 47 + .../chapter_divide_and_conquer/hanota.swift | 58 + .../climbing_stairs_backtrack.swift | 44 + .../climbing_stairs_constraint_dp.swift | 36 + .../climbing_stairs_dfs.swift | 32 + .../climbing_stairs_dfs_mem.swift | 40 + .../climbing_stairs_dp.swift | 49 + .../coin_change.swift | 69 + .../coin_change_ii.swift | 67 + .../edit_distance.swift | 147 +++ .../knapsack.swift | 110 ++ .../min_cost_climbing_stairs_dp.swift | 51 + .../min_path_sum.swift | 123 ++ .../unbounded_knapsack.swift | 63 + .../chapter_graph/graph_adjacency_list.swift | 121 ++ .../graph_adjacency_list_target.swift | 121 ++ .../graph_adjacency_matrix.swift | 130 ++ ru/codes/swift/chapter_graph/graph_bfs.swift | 56 + ru/codes/swift/chapter_graph/graph_dfs.swift | 54 + .../chapter_greedy/coin_change_greedy.swift | 54 + .../chapter_greedy/fractional_knapsack.swift | 57 + .../swift/chapter_greedy/max_capacity.swift | 38 + .../chapter_greedy/max_product_cutting.swift | 43 + .../chapter_hashing/array_hash_map.swift | 110 ++ .../swift/chapter_hashing/built_in_hash.swift | 37 + ru/codes/swift/chapter_hashing/hash_map.swift | 51 + .../chapter_hashing/hash_map_chaining.swift | 138 ++ .../hash_map_open_addressing.swift | 164 +++ .../swift/chapter_hashing/simple_hash.swift | 73 ++ ru/codes/swift/chapter_heap/heap.swift | 62 + ru/codes/swift/chapter_heap/my_heap.swift | 163 +++ ru/codes/swift/chapter_heap/top_k.swift | 36 + .../chapter_searching/binary_search.swift | 62 + .../binary_search_edge.swift | 51 + .../binary_search_insertion.swift | 71 + .../binary_search_insertion_target.swift | 71 + .../chapter_searching/hashing_search.swift | 50 + .../chapter_searching/linear_search.swift | 53 + .../swift/chapter_searching/two_sum.swift | 49 + .../swift/chapter_sorting/bubble_sort.swift | 51 + .../swift/chapter_sorting/bucket_sort.swift | 43 + .../swift/chapter_sorting/counting_sort.swift | 70 + .../swift/chapter_sorting/heap_sort.swift | 55 + .../chapter_sorting/insertion_sort.swift | 30 + .../swift/chapter_sorting/merge_sort.swift | 65 + .../swift/chapter_sorting/quick_sort.swift | 114 ++ .../swift/chapter_sorting/radix_sort.swift | 79 ++ .../chapter_sorting/selection_sort.swift | 31 + .../chapter_stack_and_queue/array_deque.swift | 148 +++ .../chapter_stack_and_queue/array_queue.swift | 113 ++ .../chapter_stack_and_queue/array_stack.swift | 85 ++ .../swift/chapter_stack_and_queue/deque.swift | 44 + .../linkedlist_deque.swift | 180 +++ .../linkedlist_queue.swift | 107 ++ .../linkedlist_stack.swift | 96 ++ .../swift/chapter_stack_and_queue/queue.swift | 40 + .../swift/chapter_stack_and_queue/stack.swift | 39 + .../chapter_tree/array_binary_tree.swift | 141 ++ ru/codes/swift/chapter_tree/avl_tree.swift | 230 ++++ .../chapter_tree/binary_search_tree.swift | 173 +++ ru/codes/swift/chapter_tree/binary_tree.swift | 40 + .../swift/chapter_tree/binary_tree_bfs.swift | 42 + .../swift/chapter_tree/binary_tree_dfs.swift | 70 + ru/codes/swift/utils/ListNode.swift | 33 + ru/codes/swift/utils/Pair.swift | 20 + ru/codes/swift/utils/PrintUtil.swift | 93 ++ ru/codes/swift/utils/TreeNode.swift | 71 + ru/codes/swift/utils/Vertex.swift | 32 + ru/codes/typescript/.gitignore | 2 + ru/codes/typescript/.prettierrc | 6 + .../chapter_array_and_linkedlist/array.ts | 101 ++ .../linked_list.ts | 86 ++ .../chapter_array_and_linkedlist/list.ts | 59 + .../chapter_array_and_linkedlist/my_list.ts | 141 ++ .../chapter_backtracking/n_queens.ts | 65 + .../chapter_backtracking/permutations_i.ts | 49 + .../chapter_backtracking/permutations_ii.ts | 51 + .../preorder_traversal_i_compact.ts | 36 + .../preorder_traversal_ii_compact.ts | 47 + .../preorder_traversal_iii_compact.ts | 48 + .../preorder_traversal_iii_template.ts | 75 ++ .../chapter_backtracking/subset_sum_i.ts | 54 + .../subset_sum_i_naive.ts | 52 + .../chapter_backtracking/subset_sum_ii.ts | 59 + .../iteration.ts | 72 ++ .../recursion.ts | 70 + .../space_complexity.ts | 103 ++ .../time_complexity.ts | 157 +++ .../worst_best_time_complexity.ts | 45 + .../binary_search_recur.ts | 41 + .../chapter_divide_and_conquer/build_tree.ts | 50 + .../chapter_divide_and_conquer/hanota.ts | 52 + .../climbing_stairs_backtrack.ts | 41 + .../climbing_stairs_constraint_dp.ts | 32 + .../climbing_stairs_dfs.ts | 26 + .../climbing_stairs_dfs_mem.ts | 32 + .../climbing_stairs_dp.ts | 42 + .../coin_change.ts | 68 + .../coin_change_ii.ts | 66 + .../edit_distance.ts | 148 +++ .../chapter_dynamic_programming/knapsack.ts | 134 ++ .../min_cost_climbing_stairs_dp.ts | 51 + .../min_path_sum.ts | 132 ++ .../unbounded_knapsack.ts | 73 ++ .../chapter_graph/graph_adjacency_list.ts | 140 ++ .../chapter_graph/graph_adjacency_matrix.ts | 134 ++ .../typescript/chapter_graph/graph_bfs.ts | 61 + .../typescript/chapter_graph/graph_dfs.ts | 58 + .../chapter_greedy/coin_change_greedy.ts | 50 + .../chapter_greedy/fractional_knapsack.ts | 50 + .../typescript/chapter_greedy/max_capacity.ts | 36 + .../chapter_greedy/max_product_cutting.ts | 35 + .../chapter_hashing/array_hash_map.ts | 134 ++ .../typescript/chapter_hashing/hash_map.ts | 46 + .../chapter_hashing/hash_map_chaining.ts | 146 +++ .../hash_map_open_addressing.ts | 182 +++ .../typescript/chapter_hashing/simple_hash.ts | 60 + ru/codes/typescript/chapter_heap/my_heap.ts | 155 +++ ru/codes/typescript/chapter_heap/top_k.ts | 58 + .../chapter_searching/binary_search.ts | 65 + .../chapter_searching/binary_search_edge.ts | 46 + .../binary_search_insertion.ts | 65 + .../chapter_searching/hashing_search.ts | 50 + .../chapter_searching/linear_search.ts | 52 + .../typescript/chapter_searching/two_sum.ts | 49 + .../typescript/chapter_sorting/bubble_sort.ts | 51 + .../typescript/chapter_sorting/bucket_sort.ts | 41 + .../chapter_sorting/counting_sort.ts | 67 + .../typescript/chapter_sorting/heap_sort.ts | 51 + .../chapter_sorting/insertion_sort.ts | 27 + .../typescript/chapter_sorting/merge_sort.ts | 54 + .../typescript/chapter_sorting/quick_sort.ts | 180 +++ .../typescript/chapter_sorting/radix_sort.ts | 63 + .../chapter_sorting/selection_sort.ts | 29 + .../chapter_stack_and_queue/array_deque.ts | 158 +++ .../chapter_stack_and_queue/array_queue.ts | 109 ++ .../chapter_stack_and_queue/array_stack.ts | 77 ++ .../chapter_stack_and_queue/deque.ts | 46 + .../linkedlist_deque.ts | 167 +++ .../linkedlist_queue.ts | 102 ++ .../linkedlist_stack.ts | 91 ++ .../chapter_stack_and_queue/queue.ts | 37 + .../chapter_stack_and_queue/stack.ts | 37 + .../chapter_tree/array_binary_tree.ts | 151 +++ ru/codes/typescript/chapter_tree/avl_tree.ts | 222 ++++ .../chapter_tree/binary_search_tree.ts | 146 +++ .../typescript/chapter_tree/binary_tree.ts | 37 + .../chapter_tree/binary_tree_bfs.ts | 41 + .../chapter_tree/binary_tree_dfs.ts | 69 + ru/codes/typescript/modules/ListNode.ts | 28 + ru/codes/typescript/modules/PrintUtil.ts | 93 ++ ru/codes/typescript/modules/TreeNode.ts | 37 + ru/codes/typescript/modules/Vertex.ts | 33 + ru/codes/typescript/package.json | 11 + ru/codes/typescript/tsconfig.json | 12 + ru/codes/zig/.gitignore | 4 + ru/codes/zig/.vscode/launch.json | 14 + ru/codes/zig/.vscode/settings.json | 3 + ru/codes/zig/.vscode/tasks.json | 10 + ru/codes/zig/build.zig | 169 +++ .../chapter_array_and_linkedlist/array.zig | 131 ++ .../linked_list.zig | 96 ++ .../zig/chapter_array_and_linkedlist/list.zig | 78 ++ .../chapter_array_and_linkedlist/my_list.zig | 217 ++++ .../iteration.zig | 91 ++ .../recursion.zig | 88 ++ .../space_complexity.zig | 142 ++ .../time_complexity.zig | 184 +++ .../worst_best_time_complexity.zig | 53 + .../climbing_stairs_backtrack.zig | 44 + .../climbing_stairs_constraint_dp.zig | 35 + .../climbing_stairs_dfs.zig | 31 + .../climbing_stairs_dfs_mem.zig | 39 + .../climbing_stairs_dp.zig | 51 + .../coin_change.zig | 77 ++ .../coin_change_ii.zig | 66 + .../edit_distance.zig | 146 +++ .../chapter_dynamic_programming/knapsack.zig | 110 ++ .../min_cost_climbing_stairs_dp.zig | 54 + .../min_path_sum.zig | 122 ++ .../unbounded_knapsack.zig | 62 + .../zig/chapter_hashing/array_hash_map.zig | 162 +++ ru/codes/zig/chapter_hashing/hash_map.zig | 54 + ru/codes/zig/chapter_heap/heap.zig | 80 ++ ru/codes/zig/chapter_heap/my_heap.zig | 186 +++ .../zig/chapter_searching/binary_search.zig | 64 + .../zig/chapter_searching/hashing_search.zig | 57 + .../zig/chapter_searching/linear_search.zig | 54 + ru/codes/zig/chapter_searching/two_sum.zig | 58 + ru/codes/zig/chapter_sorting/bubble_sort.zig | 61 + .../zig/chapter_sorting/insertion_sort.zig | 31 + ru/codes/zig/chapter_sorting/merge_sort.zig | 67 + ru/codes/zig/chapter_sorting/quick_sort.zig | 162 +++ ru/codes/zig/chapter_sorting/radix_sort.zig | 77 ++ .../chapter_stack_and_queue/array_queue.zig | 140 ++ .../chapter_stack_and_queue/array_stack.zig | 97 ++ .../zig/chapter_stack_and_queue/deque.zig | 51 + .../linkedlist_deque.zig | 207 +++ .../linkedlist_queue.zig | 127 ++ .../linkedlist_stack.zig | 118 ++ .../zig/chapter_stack_and_queue/queue.zig | 46 + .../zig/chapter_stack_and_queue/stack.zig | 43 + ru/codes/zig/chapter_tree/avl_tree.zig | 249 ++++ .../zig/chapter_tree/binary_search_tree.zig | 182 +++ ru/codes/zig/chapter_tree/binary_tree.zig | 39 + ru/codes/zig/chapter_tree/binary_tree_bfs.zig | 57 + ru/codes/zig/chapter_tree/binary_tree_dfs.zig | 70 + ru/codes/zig/include/PrintUtil.zig | 42 + ru/codes/zig/include/include.zig | 7 + ru/codes/zig/main.zig | 25 + ru/codes/zig/utils/ListNode.zig | 49 + ru/codes/zig/utils/TreeNode.zig | 63 + ru/codes/zig/utils/format.zig | 140 ++ ru/codes/zig/utils/utils.zig | 8 + ru/docs/assets/covers/chapter_appendix.jpg | Bin 0 -> 135651 bytes .../covers/chapter_array_and_linkedlist.jpg | Bin 0 -> 128537 bytes .../assets/covers/chapter_backtracking.jpg | Bin 0 -> 132554 bytes .../covers/chapter_complexity_analysis.jpg | Bin 0 -> 96935 bytes .../assets/covers/chapter_data_structure.jpg | Bin 0 -> 144365 bytes .../covers/chapter_divide_and_conquer.jpg | Bin 0 -> 106560 bytes .../covers/chapter_dynamic_programming.jpg | Bin 0 -> 174477 bytes ru/docs/assets/covers/chapter_graph.jpg | Bin 0 -> 82689 bytes ru/docs/assets/covers/chapter_greedy.jpg | Bin 0 -> 131643 bytes ru/docs/assets/covers/chapter_hashing.jpg | Bin 0 -> 133919 bytes ru/docs/assets/covers/chapter_heap.jpg | Bin 0 -> 113059 bytes ru/docs/assets/covers/chapter_hello_algo.jpg | Bin 0 -> 147884 bytes .../assets/covers/chapter_introduction.jpg | Bin 0 -> 139471 bytes ru/docs/assets/covers/chapter_preface.jpg | Bin 0 -> 116035 bytes ru/docs/assets/covers/chapter_searching.jpg | Bin 0 -> 220204 bytes ru/docs/assets/covers/chapter_sorting.jpg | Bin 0 -> 95364 bytes .../assets/covers/chapter_stack_and_queue.jpg | Bin 0 -> 113383 bytes ru/docs/assets/covers/chapter_tree.jpg | Bin 0 -> 120467 bytes .../contribution.assets/edit_markdown.png | Bin 0 -> 94973 bytes ru/docs/chapter_appendix/contribution.md | 47 + ru/docs/chapter_appendix/index.md | 3 + .../vscode_extension_installation.png | Bin 0 -> 125768 bytes .../vscode_installation.png | Bin 0 -> 105345 bytes ru/docs/chapter_appendix/installation.md | 68 + ru/docs/chapter_appendix/terminology.md | 137 ++ .../array.assets/array_definition.png | Bin 0 -> 13100 bytes .../array.assets/array_insert_element.png | Bin 0 -> 23409 bytes .../array_memory_location_calculation.png | Bin 0 -> 18206 bytes .../array.assets/array_remove_element.png | Bin 0 -> 20698 bytes ru/docs/chapter_array_and_linkedlist/array.md | 227 ++++ ru/docs/chapter_array_and_linkedlist/index.md | 9 + .../linkedlist_common_types.png | Bin 0 -> 12967 bytes .../linkedlist_definition.png | Bin 0 -> 20407 bytes .../linkedlist_insert_node.png | Bin 0 -> 14761 bytes .../linkedlist_remove_node.png | Bin 0 -> 17655 bytes .../linked_list.md | 702 ++++++++++ ru/docs/chapter_array_and_linkedlist/list.md | 961 ++++++++++++++ .../computer_storage_devices.png | Bin 0 -> 8664 bytes .../ram_and_cache.assets/storage_pyramid.png | Bin 0 -> 14201 bytes .../ram_and_cache.md | 71 + .../chapter_array_and_linkedlist/summary.md | 86 ++ .../backtrack_remove_return_or_not.png | Bin 0 -> 26497 bytes .../preorder_find_constrained_paths.png | Bin 0 -> 23218 bytes .../preorder_find_nodes.png | Bin 0 -> 22454 bytes .../preorder_find_paths_step1.png | Bin 0 -> 12956 bytes .../preorder_find_paths_step10.png | Bin 0 -> 21456 bytes .../preorder_find_paths_step11.png | Bin 0 -> 20531 bytes .../preorder_find_paths_step2.png | Bin 0 -> 15254 bytes .../preorder_find_paths_step3.png | Bin 0 -> 16134 bytes .../preorder_find_paths_step4.png | Bin 0 -> 14927 bytes .../preorder_find_paths_step5.png | Bin 0 -> 17424 bytes .../preorder_find_paths_step6.png | Bin 0 -> 17212 bytes .../preorder_find_paths_step7.png | Bin 0 -> 17859 bytes .../preorder_find_paths_step8.png | Bin 0 -> 18823 bytes .../preorder_find_paths_step9.png | Bin 0 -> 18741 bytes .../backtracking_algorithm.md | 503 +++++++ ru/docs/chapter_backtracking/index.md | 9 + .../n_queens_cols_diagonals.png | Bin 0 -> 30180 bytes .../n_queens_constraints.png | Bin 0 -> 22586 bytes .../n_queens_placing.png | Bin 0 -> 21601 bytes .../solution_4_queens.png | Bin 0 -> 5624 bytes .../chapter_backtracking/n_queens_problem.md | 53 + .../permutations_i.png | Bin 0 -> 13552 bytes .../permutations_i_pruning.png | Bin 0 -> 21640 bytes .../permutations_ii.png | Bin 0 -> 15959 bytes .../permutations_ii_pruning.png | Bin 0 -> 20611 bytes .../permutations_ii_pruning_summary.png | Bin 0 -> 18382 bytes .../permutations_problem.md | 95 ++ .../subset_sum_i.png | Bin 0 -> 33270 bytes .../subset_sum_i_naive.png | Bin 0 -> 27646 bytes .../subset_sum_i_pruning.png | Bin 0 -> 23893 bytes .../subset_sum_ii.png | Bin 0 -> 33468 bytes .../subset_sum_ii_repeat.png | Bin 0 -> 14110 bytes .../subset_sum_problem.md | 95 ++ ru/docs/chapter_backtracking/summary.md | 23 + .../chapter_computational_complexity/index.md | 9 + .../iteration.png | Bin 0 -> 6283 bytes .../nested_iteration.png | Bin 0 -> 8215 bytes .../recursion_sum.png | Bin 0 -> 14702 bytes .../recursion_sum_depth.png | Bin 0 -> 15183 bytes .../recursion_tree.png | Bin 0 -> 11562 bytes .../tail_recursion_sum.png | Bin 0 -> 17867 bytes .../iteration_and_recursion.md | 194 +++ .../performance_evaluation.md | 49 + .../space_complexity_common_types.png | Bin 0 -> 15409 bytes .../space_complexity_exponential.png | Bin 0 -> 14109 bytes .../space_complexity_recursive_linear.png | Bin 0 -> 14278 bytes .../space_complexity_recursive_quadratic.png | Bin 0 -> 17878 bytes .../space_complexity.assets/space_types.png | Bin 0 -> 11359 bytes .../space_complexity.md | 880 +++++++++++++ .../summary.md | 55 + .../asymptotic_upper_bound.png | Bin 0 -> 15236 bytes .../time_complexity_common_types.png | Bin 0 -> 15452 bytes ...e_complexity_constant_linear_quadratic.png | Bin 0 -> 12308 bytes .../time_complexity_exponential.png | Bin 0 -> 14396 bytes .../time_complexity_factorial.png | Bin 0 -> 18067 bytes .../time_complexity_logarithmic.png | Bin 0 -> 14521 bytes .../time_complexity_logarithmic_linear.png | Bin 0 -> 17209 bytes .../time_complexity_simple_example.png | Bin 0 -> 9604 bytes .../time_complexity.md | 1151 +++++++++++++++++ .../basic_data_types.md | 175 +++ .../character_encoding.assets/ascii_table.png | Bin 0 -> 61253 bytes .../unicode_hello_algo.png | Bin 0 -> 14391 bytes .../utf-8_hello_algo.png | Bin 0 -> 18130 bytes .../character_encoding.md | 87 ++ .../classification_logic_structure.png | Bin 0 -> 20736 bytes .../classification_logic_structure.png | Bin 0 -> 20736 bytes .../classification_phisical_structure.png | Bin 0 -> 20118 bytes .../computer_memory_location.png | Bin 0 -> 50285 bytes .../classification_of_data_structure.md | 48 + .../classification_phisical_structure.png | Bin 0 -> 20118 bytes .../computer_memory_location.png | Bin 0 -> 50285 bytes ru/docs/chapter_data_structure/index.md | 9 + .../1s_2s_complement.png | Bin 0 -> 16863 bytes .../number_encoding.assets/ieee_754_float.png | Bin 0 -> 17615 bytes .../chapter_data_structure/number_encoding.md | 150 +++ ru/docs/chapter_data_structure/summary.md | 66 + .../binary_search_recur.png | Bin 0 -> 13104 bytes .../binary_search_recur.md | 45 + .../build_tree_division_pointers.png | Bin 0 -> 12399 bytes .../build_tree_example.png | Bin 0 -> 10452 bytes .../build_tree_preorder_inorder_division.png | Bin 0 -> 18731 bytes .../built_tree_overall.png | Bin 0 -> 20484 bytes .../built_tree_step1.png | Bin 0 -> 7616 bytes .../built_tree_step2.png | Bin 0 -> 8189 bytes .../built_tree_step3.png | Bin 0 -> 8739 bytes .../built_tree_step4.png | Bin 0 -> 9827 bytes .../built_tree_step5.png | Bin 0 -> 9616 bytes .../built_tree_step6.png | Bin 0 -> 10886 bytes .../built_tree_step7.png | Bin 0 -> 10842 bytes .../built_tree_step8.png | Bin 0 -> 12716 bytes .../built_tree_step9.png | Bin 0 -> 12565 bytes .../build_binary_tree_problem.md | 99 ++ .../divide_and_conquer_bubble_sort.png | Bin 0 -> 19342 bytes .../divide_and_conquer_merge_sort.png | Bin 0 -> 21182 bytes .../divide_and_conquer_parallel_computing.png | Bin 0 -> 19166 bytes .../divide_and_conquer.md | 91 ++ .../hanota_divide_and_conquer.png | Bin 0 -> 26938 bytes .../hanota_problem.assets/hanota_example.png | Bin 0 -> 8789 bytes .../hanota_problem.assets/hanota_f1_step1.png | Bin 0 -> 3665 bytes .../hanota_problem.assets/hanota_f1_step2.png | Bin 0 -> 5644 bytes .../hanota_problem.assets/hanota_f2_step1.png | Bin 0 -> 4022 bytes .../hanota_problem.assets/hanota_f2_step2.png | Bin 0 -> 6176 bytes .../hanota_problem.assets/hanota_f2_step3.png | Bin 0 -> 8042 bytes .../hanota_problem.assets/hanota_f2_step4.png | Bin 0 -> 9277 bytes .../hanota_problem.assets/hanota_f3_step1.png | Bin 0 -> 7711 bytes .../hanota_problem.assets/hanota_f3_step2.png | Bin 0 -> 7267 bytes .../hanota_problem.assets/hanota_f3_step3.png | Bin 0 -> 9156 bytes .../hanota_problem.assets/hanota_f3_step4.png | Bin 0 -> 11066 bytes .../hanota_recursive_tree.png | Bin 0 -> 13391 bytes .../hanota_problem.md | 97 ++ ru/docs/chapter_divide_and_conquer/index.md | 9 + ru/docs/chapter_divide_and_conquer/summary.md | 13 + .../climbing_stairs_constraint_example.png | Bin 0 -> 15988 bytes ...mbing_stairs_constraint_state_transfer.png | Bin 0 -> 12155 bytes .../min_cost_cs_dp.png | Bin 0 -> 16698 bytes .../min_cost_cs_example.png | Bin 0 -> 14208 bytes .../dp_problem_features.md | 101 ++ .../min_path_sum_dfs.png | Bin 0 -> 26563 bytes .../min_path_sum_dfs_mem.png | Bin 0 -> 18179 bytes .../min_path_sum_dp_step1.png | Bin 0 -> 9525 bytes .../min_path_sum_dp_step10.png | Bin 0 -> 13431 bytes .../min_path_sum_dp_step11.png | Bin 0 -> 13299 bytes .../min_path_sum_dp_step12.png | Bin 0 -> 10244 bytes .../min_path_sum_dp_step2.png | Bin 0 -> 13573 bytes .../min_path_sum_dp_step3.png | Bin 0 -> 13347 bytes .../min_path_sum_dp_step4.png | Bin 0 -> 13119 bytes .../min_path_sum_dp_step5.png | Bin 0 -> 13305 bytes .../min_path_sum_dp_step6.png | Bin 0 -> 14251 bytes .../min_path_sum_dp_step7.png | Bin 0 -> 13324 bytes .../min_path_sum_dp_step8.png | Bin 0 -> 13672 bytes .../min_path_sum_dp_step9.png | Bin 0 -> 14173 bytes .../min_path_sum_example.png | Bin 0 -> 10439 bytes .../min_path_sum_solution_initial_state.png | Bin 0 -> 17993 bytes ...min_path_sum_solution_state_definition.png | Bin 0 -> 20010 bytes ...min_path_sum_solution_state_transition.png | Bin 0 -> 15876 bytes .../dp_solution_pipeline.md | 183 +++ .../edit_distance_decision_tree.png | Bin 0 -> 12150 bytes .../edit_distance_dp_step1.png | Bin 0 -> 9059 bytes .../edit_distance_dp_step10.png | Bin 0 -> 11703 bytes .../edit_distance_dp_step11.png | Bin 0 -> 11153 bytes .../edit_distance_dp_step12.png | Bin 0 -> 11077 bytes .../edit_distance_dp_step13.png | Bin 0 -> 11705 bytes .../edit_distance_dp_step14.png | Bin 0 -> 11182 bytes .../edit_distance_dp_step15.png | Bin 0 -> 7944 bytes .../edit_distance_dp_step2.png | Bin 0 -> 8185 bytes .../edit_distance_dp_step3.png | Bin 0 -> 11339 bytes .../edit_distance_dp_step4.png | Bin 0 -> 10862 bytes .../edit_distance_dp_step5.png | Bin 0 -> 11115 bytes .../edit_distance_dp_step6.png | Bin 0 -> 10896 bytes .../edit_distance_dp_step7.png | Bin 0 -> 11456 bytes .../edit_distance_dp_step8.png | Bin 0 -> 9942 bytes .../edit_distance_dp_step9.png | Bin 0 -> 11503 bytes .../edit_distance_example.png | Bin 0 -> 9274 bytes .../edit_distance_state_transfer.png | Bin 0 -> 19714 bytes .../edit_distance_problem.md | 129 ++ ru/docs/chapter_dynamic_programming/index.md | 9 + .../climbing_stairs_dfs_memo_tree.png | Bin 0 -> 17551 bytes .../climbing_stairs_dfs_tree.png | Bin 0 -> 17222 bytes .../climbing_stairs_dp.png | Bin 0 -> 14773 bytes .../climbing_stairs_example.png | Bin 0 -> 12428 bytes .../climbing_stairs_state_transfer.png | Bin 0 -> 11967 bytes .../intro_to_dynamic_programming.md | 110 ++ .../knapsack_problem.assets/knapsack_dfs.png | Bin 0 -> 27551 bytes .../knapsack_dfs_mem.png | Bin 0 -> 27298 bytes .../knapsack_dp_comp_step1.png | Bin 0 -> 15216 bytes .../knapsack_dp_comp_step2.png | Bin 0 -> 16445 bytes .../knapsack_dp_comp_step3.png | Bin 0 -> 16784 bytes .../knapsack_dp_comp_step4.png | Bin 0 -> 16630 bytes .../knapsack_dp_comp_step5.png | Bin 0 -> 15988 bytes .../knapsack_dp_comp_step6.png | Bin 0 -> 16143 bytes .../knapsack_dp_step1.png | Bin 0 -> 14732 bytes .../knapsack_dp_step10.png | Bin 0 -> 15299 bytes .../knapsack_dp_step11.png | Bin 0 -> 15244 bytes .../knapsack_dp_step12.png | Bin 0 -> 16251 bytes .../knapsack_dp_step13.png | Bin 0 -> 16440 bytes .../knapsack_dp_step14.png | Bin 0 -> 13401 bytes .../knapsack_dp_step2.png | Bin 0 -> 15615 bytes .../knapsack_dp_step3.png | Bin 0 -> 15601 bytes .../knapsack_dp_step4.png | Bin 0 -> 15752 bytes .../knapsack_dp_step5.png | Bin 0 -> 15329 bytes .../knapsack_dp_step6.png | Bin 0 -> 15292 bytes .../knapsack_dp_step7.png | Bin 0 -> 15533 bytes .../knapsack_dp_step8.png | Bin 0 -> 16081 bytes .../knapsack_dp_step9.png | Bin 0 -> 15803 bytes .../knapsack_example.png | Bin 0 -> 16345 bytes .../knapsack_problem.md | 168 +++ .../chapter_dynamic_programming/summary.md | 25 + .../coin_change_dp_step1.png | Bin 0 -> 14318 bytes .../coin_change_dp_step10.png | Bin 0 -> 14865 bytes .../coin_change_dp_step11.png | Bin 0 -> 14978 bytes .../coin_change_dp_step12.png | Bin 0 -> 14483 bytes .../coin_change_dp_step13.png | Bin 0 -> 15518 bytes .../coin_change_dp_step14.png | Bin 0 -> 15151 bytes .../coin_change_dp_step15.png | Bin 0 -> 13707 bytes .../coin_change_dp_step2.png | Bin 0 -> 15044 bytes .../coin_change_dp_step3.png | Bin 0 -> 14928 bytes .../coin_change_dp_step4.png | Bin 0 -> 15311 bytes .../coin_change_dp_step5.png | Bin 0 -> 15468 bytes .../coin_change_dp_step6.png | Bin 0 -> 15376 bytes .../coin_change_dp_step7.png | Bin 0 -> 14847 bytes .../coin_change_dp_step8.png | Bin 0 -> 15288 bytes .../coin_change_dp_step9.png | Bin 0 -> 14988 bytes .../coin_change_example.png | Bin 0 -> 11714 bytes .../coin_change_ii_example.png | Bin 0 -> 14281 bytes .../unbounded_knapsack_dp_comp_step1.png | Bin 0 -> 16672 bytes .../unbounded_knapsack_dp_comp_step2.png | Bin 0 -> 16614 bytes .../unbounded_knapsack_dp_comp_step3.png | Bin 0 -> 17352 bytes .../unbounded_knapsack_dp_comp_step4.png | Bin 0 -> 16587 bytes .../unbounded_knapsack_dp_comp_step5.png | Bin 0 -> 16650 bytes .../unbounded_knapsack_dp_comp_step6.png | Bin 0 -> 16394 bytes .../unbounded_knapsack_example.png | Bin 0 -> 17783 bytes .../unbounded_knapsack_problem.md | 207 +++ .../graph.assets/adjacency_list.png | Bin 0 -> 15210 bytes .../graph.assets/adjacency_matrix.png | Bin 0 -> 15305 bytes .../graph.assets/connected_graph.png | Bin 0 -> 11698 bytes .../graph.assets/directed_graph.png | Bin 0 -> 12494 bytes .../graph.assets/linkedlist_tree_graph.png | Bin 0 -> 18131 bytes .../graph.assets/weighted_graph.png | Bin 0 -> 13655 bytes ru/docs/chapter_graph/graph.md | 83 ++ .../adjacency_list_step1_initialization.png | Bin 0 -> 17698 bytes .../adjacency_list_step2_add_edge.png | Bin 0 -> 19118 bytes .../adjacency_list_step3_remove_edge.png | Bin 0 -> 18509 bytes .../adjacency_list_step4_add_vertex.png | Bin 0 -> 19431 bytes .../adjacency_list_step5_remove_vertex.png | Bin 0 -> 16816 bytes .../adjacency_matrix_step1_initialization.png | Bin 0 -> 15546 bytes .../adjacency_matrix_step2_add_edge.png | Bin 0 -> 16570 bytes .../adjacency_matrix_step3_remove_edge.png | Bin 0 -> 16298 bytes .../adjacency_matrix_step4_add_vertex.png | Bin 0 -> 18807 bytes .../adjacency_matrix_step5_remove_vertex.png | Bin 0 -> 15872 bytes ru/docs/chapter_graph/graph_operations.md | 86 ++ .../graph_traversal.assets/graph_bfs.png | Bin 0 -> 20301 bytes .../graph_bfs_step1.png | Bin 0 -> 16201 bytes .../graph_bfs_step10.png | Bin 0 -> 29920 bytes .../graph_bfs_step11.png | Bin 0 -> 25540 bytes .../graph_bfs_step2.png | Bin 0 -> 25119 bytes .../graph_bfs_step3.png | Bin 0 -> 27357 bytes .../graph_bfs_step4.png | Bin 0 -> 27920 bytes .../graph_bfs_step5.png | Bin 0 -> 29684 bytes .../graph_bfs_step6.png | Bin 0 -> 29961 bytes .../graph_bfs_step7.png | Bin 0 -> 30212 bytes .../graph_bfs_step8.png | Bin 0 -> 34865 bytes .../graph_bfs_step9.png | Bin 0 -> 30035 bytes .../graph_traversal.assets/graph_dfs.png | Bin 0 -> 22379 bytes .../graph_dfs_step1.png | Bin 0 -> 13569 bytes .../graph_dfs_step10.png | Bin 0 -> 24568 bytes .../graph_dfs_step11.png | Bin 0 -> 27777 bytes .../graph_dfs_step2.png | Bin 0 -> 16629 bytes .../graph_dfs_step3.png | Bin 0 -> 17666 bytes .../graph_dfs_step4.png | Bin 0 -> 18294 bytes .../graph_dfs_step5.png | Bin 0 -> 18622 bytes .../graph_dfs_step6.png | Bin 0 -> 22087 bytes .../graph_dfs_step7.png | Bin 0 -> 20863 bytes .../graph_dfs_step8.png | Bin 0 -> 22686 bytes .../graph_dfs_step9.png | Bin 0 -> 28166 bytes ru/docs/chapter_graph/graph_traversal.md | 140 ++ ru/docs/chapter_graph/index.md | 9 + ru/docs/chapter_graph/summary.md | 31 + .../fractional_knapsack_area_chart.png | Bin 0 -> 9441 bytes .../fractional_knapsack_example.png | Bin 0 -> 20050 bytes .../fractional_knapsack_greedy_strategy.png | Bin 0 -> 15729 bytes .../fractional_knapsack_unit_value.png | Bin 0 -> 14882 bytes .../fractional_knapsack_problem.md | 52 + .../coin_change_greedy_strategy.png | Bin 0 -> 24626 bytes .../coin_change_greedy_vs_dp.png | Bin 0 -> 15505 bytes ru/docs/chapter_greedy/greedy_algorithm.md | 94 ++ ru/docs/chapter_greedy/index.md | 9 + .../max_capacity_example.png | Bin 0 -> 9271 bytes .../max_capacity_greedy_step1.png | Bin 0 -> 10279 bytes .../max_capacity_greedy_step2.png | Bin 0 -> 13482 bytes .../max_capacity_greedy_step3.png | Bin 0 -> 14611 bytes .../max_capacity_greedy_step4.png | Bin 0 -> 13628 bytes .../max_capacity_greedy_step5.png | Bin 0 -> 14542 bytes .../max_capacity_greedy_step6.png | Bin 0 -> 14333 bytes .../max_capacity_greedy_step7.png | Bin 0 -> 14140 bytes .../max_capacity_greedy_step8.png | Bin 0 -> 19168 bytes .../max_capacity_greedy_step9.png | Bin 0 -> 11767 bytes .../max_capacity_initial_state.png | Bin 0 -> 11287 bytes .../max_capacity_moving_long_board.png | Bin 0 -> 16639 bytes .../max_capacity_moving_short_board.png | Bin 0 -> 12560 bytes .../max_capacity_skipped_states.png | Bin 0 -> 19246 bytes .../chapter_greedy/max_capacity_problem.md | 99 ++ .../max_product_cutting_definition.png | Bin 0 -> 7487 bytes ...max_product_cutting_greedy_calculation.png | Bin 0 -> 4183 bytes .../max_product_cutting_greedy_infer1.png | Bin 0 -> 6729 bytes .../max_product_cutting_greedy_infer2.png | Bin 0 -> 6292 bytes .../max_product_cutting_problem.md | 85 ++ ru/docs/chapter_greedy/summary.md | 14 + .../hash_collision_best_worst_condition.png | Bin 0 -> 17593 bytes ru/docs/chapter_hashing/hash_algorithm.md | 410 ++++++ .../hash_table_chaining.png | Bin 0 -> 22339 bytes .../hash_table_linear_probing.png | Bin 0 -> 14242 bytes .../hash_table_open_addressing_deletion.png | Bin 0 -> 10895 bytes ru/docs/chapter_hashing/hash_collision.md | 108 ++ .../hash_map.assets/hash_collision.png | Bin 0 -> 21034 bytes .../hash_map.assets/hash_function.png | Bin 0 -> 22506 bytes .../hash_map.assets/hash_table_lookup.png | Bin 0 -> 12402 bytes .../hash_map.assets/hash_table_reshash.png | Bin 0 -> 20443 bytes ru/docs/chapter_hashing/hash_map.md | 591 +++++++++ ru/docs/chapter_hashing/index.md | 9 + ru/docs/chapter_hashing/summary.md | 51 + .../heapify_operations_count.png | Bin 0 -> 15303 bytes ru/docs/chapter_heap/build_heap.md | 74 ++ .../heap.assets/heap_pop_step1.png | Bin 0 -> 19057 bytes .../heap.assets/heap_pop_step10.png | Bin 0 -> 21897 bytes .../heap.assets/heap_pop_step2.png | Bin 0 -> 16686 bytes .../heap.assets/heap_pop_step3.png | Bin 0 -> 16587 bytes .../heap.assets/heap_pop_step4.png | Bin 0 -> 21838 bytes .../heap.assets/heap_pop_step5.png | Bin 0 -> 23982 bytes .../heap.assets/heap_pop_step6.png | Bin 0 -> 25032 bytes .../heap.assets/heap_pop_step7.png | Bin 0 -> 25567 bytes .../heap.assets/heap_pop_step8.png | Bin 0 -> 26503 bytes .../heap.assets/heap_pop_step9.png | Bin 0 -> 28508 bytes .../heap.assets/heap_push_step1.png | Bin 0 -> 15924 bytes .../heap.assets/heap_push_step2.png | Bin 0 -> 16219 bytes .../heap.assets/heap_push_step3.png | Bin 0 -> 19991 bytes .../heap.assets/heap_push_step4.png | Bin 0 -> 22304 bytes .../heap.assets/heap_push_step5.png | Bin 0 -> 21066 bytes .../heap.assets/heap_push_step6.png | Bin 0 -> 24783 bytes .../heap.assets/heap_push_step7.png | Bin 0 -> 22835 bytes .../heap.assets/heap_push_step8.png | Bin 0 -> 22743 bytes .../heap.assets/heap_push_step9.png | Bin 0 -> 20274 bytes .../heap.assets/min_heap_and_max_heap.png | Bin 0 -> 18581 bytes .../heap.assets/representation_of_heap.png | Bin 0 -> 29412 bytes ru/docs/chapter_heap/heap.md | 532 ++++++++ ru/docs/chapter_heap/index.md | 9 + ru/docs/chapter_heap/summary.md | 17 + .../top_k.assets/top_k_heap_step1.png | Bin 0 -> 11528 bytes .../top_k.assets/top_k_heap_step2.png | Bin 0 -> 13248 bytes .../top_k.assets/top_k_heap_step3.png | Bin 0 -> 14349 bytes .../top_k.assets/top_k_heap_step4.png | Bin 0 -> 17151 bytes .../top_k.assets/top_k_heap_step5.png | Bin 0 -> 17841 bytes .../top_k.assets/top_k_heap_step6.png | Bin 0 -> 20275 bytes .../top_k.assets/top_k_heap_step7.png | Bin 0 -> 17422 bytes .../top_k.assets/top_k_heap_step8.png | Bin 0 -> 18384 bytes .../top_k.assets/top_k_heap_step9.png | Bin 0 -> 12457 bytes .../top_k.assets/top_k_sorting.png | Bin 0 -> 6628 bytes .../top_k.assets/top_k_traversal.png | Bin 0 -> 15173 bytes ru/docs/chapter_heap/top_k.md | 73 ++ ru/docs/chapter_hello_algo/index.md | 30 + .../binary_search_dictionary_step1.png | Bin 0 -> 7878 bytes .../binary_search_dictionary_step2.png | Bin 0 -> 13020 bytes .../binary_search_dictionary_step3.png | Bin 0 -> 12322 bytes .../binary_search_dictionary_step4.png | Bin 0 -> 11992 bytes .../binary_search_dictionary_step5.png | Bin 0 -> 10427 bytes .../greedy_change.png | Bin 0 -> 23977 bytes .../playing_cards_sorting.png | Bin 0 -> 51137 bytes .../algorithms_are_everywhere.md | 56 + ru/docs/chapter_introduction/index.md | 9 + ru/docs/chapter_introduction/summary.md | 24 + .../what_is_dsa.assets/assembling_blocks.png | Bin 0 -> 417130 bytes ...p_between_data_structure_and_algorithm.png | Bin 0 -> 9810 bytes ru/docs/chapter_introduction/what_is_dsa.md | 53 + .../hello_algo_mindmap.png | Bin 0 -> 157698 bytes ru/docs/chapter_preface/about_the_book.md | 54 + ru/docs/chapter_preface/index.md | 9 + .../suggestions.assets/code_md_to_repo.png | Bin 0 -> 70595 bytes .../suggestions.assets/download_code.png | Bin 0 -> 93530 bytes .../suggestions.assets/learning_route.png | Bin 0 -> 17172 bytes .../pythontutor_example.png | Bin 0 -> 74149 bytes ru/docs/chapter_preface/suggestions.md | 241 ++++ ru/docs/chapter_preface/summary.md | 10 + ru/docs/chapter_reference/index.md | 25 + .../binary_search_example.png | Bin 0 -> 11717 bytes .../binary_search_ranges.png | Bin 0 -> 18799 bytes .../binary_search_step1.png | Bin 0 -> 12576 bytes .../binary_search_step2.png | Bin 0 -> 11228 bytes .../binary_search_step3.png | Bin 0 -> 13937 bytes .../binary_search_step4.png | Bin 0 -> 11131 bytes .../binary_search_step5.png | Bin 0 -> 13485 bytes .../binary_search_step6.png | Bin 0 -> 11009 bytes .../binary_search_step7.png | Bin 0 -> 11241 bytes ru/docs/chapter_searching/binary_search.md | 83 ++ .../binary_search_edge_by_element.png | Bin 0 -> 11754 bytes .../binary_search_right_edge_by_left_edge.png | Bin 0 -> 11004 bytes .../chapter_searching/binary_search_edge.md | 56 + .../binary_search_insertion_example.png | Bin 0 -> 12103 bytes .../binary_search_insertion_naive.png | Bin 0 -> 9307 bytes .../binary_search_insertion_step1.png | Bin 0 -> 11857 bytes .../binary_search_insertion_step2.png | Bin 0 -> 10168 bytes .../binary_search_insertion_step3.png | Bin 0 -> 13886 bytes .../binary_search_insertion_step4.png | Bin 0 -> 10749 bytes .../binary_search_insertion_step5.png | Bin 0 -> 13707 bytes .../binary_search_insertion_step6.png | Bin 0 -> 10634 bytes .../binary_search_insertion_step7.png | Bin 0 -> 13423 bytes .../binary_search_insertion_step8.png | Bin 0 -> 9686 bytes .../binary_search_insertion.md | 91 ++ ru/docs/chapter_searching/index.md | 9 + .../two_sum_brute_force.png | Bin 0 -> 8933 bytes .../two_sum_hashtable_step1.png | Bin 0 -> 10492 bytes .../two_sum_hashtable_step2.png | Bin 0 -> 10751 bytes .../two_sum_hashtable_step3.png | Bin 0 -> 11261 bytes .../replace_linear_by_hashing.md | 47 + .../searching_algorithms.png | Bin 0 -> 26082 bytes .../searching_algorithm_revisited.md | 84 ++ ru/docs/chapter_searching/summary.md | 10 + .../bubble_operation_step1.png | Bin 0 -> 8262 bytes .../bubble_operation_step2.png | Bin 0 -> 8888 bytes .../bubble_operation_step3.png | Bin 0 -> 8840 bytes .../bubble_operation_step4.png | Bin 0 -> 8966 bytes .../bubble_operation_step5.png | Bin 0 -> 7190 bytes .../bubble_operation_step6.png | Bin 0 -> 8724 bytes .../bubble_operation_step7.png | Bin 0 -> 9418 bytes .../bubble_sort_overview.png | Bin 0 -> 23343 bytes ru/docs/chapter_sorting/bubble_sort.md | 59 + .../bucket_sort_overview.png | Bin 0 -> 33824 bytes .../scatter_in_buckets_distribution.png | Bin 0 -> 16063 bytes .../scatter_in_buckets_recursively.png | Bin 0 -> 30313 bytes ru/docs/chapter_sorting/bucket_sort.md | 45 + .../counting_sort_overview.png | Bin 0 -> 21062 bytes .../counting_sort_step1.png | Bin 0 -> 15641 bytes .../counting_sort_step2.png | Bin 0 -> 14592 bytes .../counting_sort_step3.png | Bin 0 -> 16799 bytes .../counting_sort_step4.png | Bin 0 -> 16803 bytes .../counting_sort_step5.png | Bin 0 -> 16688 bytes .../counting_sort_step6.png | Bin 0 -> 16854 bytes .../counting_sort_step7.png | Bin 0 -> 14085 bytes .../counting_sort_step8.png | Bin 0 -> 11095 bytes ru/docs/chapter_sorting/counting_sort.md | 84 ++ .../heap_sort.assets/heap_sort_step1.png | Bin 0 -> 13394 bytes .../heap_sort.assets/heap_sort_step10.png | Bin 0 -> 13146 bytes .../heap_sort.assets/heap_sort_step11.png | Bin 0 -> 14664 bytes .../heap_sort.assets/heap_sort_step12.png | Bin 0 -> 14821 bytes .../heap_sort.assets/heap_sort_step2.png | Bin 0 -> 15287 bytes .../heap_sort.assets/heap_sort_step3.png | Bin 0 -> 17180 bytes .../heap_sort.assets/heap_sort_step4.png | Bin 0 -> 15314 bytes .../heap_sort.assets/heap_sort_step5.png | Bin 0 -> 16627 bytes .../heap_sort.assets/heap_sort_step6.png | Bin 0 -> 13649 bytes .../heap_sort.assets/heap_sort_step7.png | Bin 0 -> 16625 bytes .../heap_sort.assets/heap_sort_step8.png | Bin 0 -> 13391 bytes .../heap_sort.assets/heap_sort_step9.png | Bin 0 -> 16605 bytes ru/docs/chapter_sorting/heap_sort.md | 73 ++ ru/docs/chapter_sorting/index.md | 9 + .../insertion_operation.png | Bin 0 -> 20131 bytes .../insertion_sort_overview.png | Bin 0 -> 19612 bytes ru/docs/chapter_sorting/insertion_sort.md | 46 + .../merge_sort.assets/merge_sort_overview.png | Bin 0 -> 20301 bytes .../merge_sort.assets/merge_sort_step1.png | Bin 0 -> 6036 bytes .../merge_sort.assets/merge_sort_step10.png | Bin 0 -> 11724 bytes .../merge_sort.assets/merge_sort_step2.png | Bin 0 -> 6566 bytes .../merge_sort.assets/merge_sort_step3.png | Bin 0 -> 7021 bytes .../merge_sort.assets/merge_sort_step4.png | Bin 0 -> 7218 bytes .../merge_sort.assets/merge_sort_step5.png | Bin 0 -> 8249 bytes .../merge_sort.assets/merge_sort_step6.png | Bin 0 -> 8645 bytes .../merge_sort.assets/merge_sort_step7.png | Bin 0 -> 8872 bytes .../merge_sort.assets/merge_sort_step8.png | Bin 0 -> 9502 bytes .../merge_sort.assets/merge_sort_step9.png | Bin 0 -> 9760 bytes ru/docs/chapter_sorting/merge_sort.md | 73 ++ .../pivot_division_step1.png | Bin 0 -> 25182 bytes .../pivot_division_step2.png | Bin 0 -> 25175 bytes .../pivot_division_step3.png | Bin 0 -> 24992 bytes .../pivot_division_step4.png | Bin 0 -> 25689 bytes .../pivot_division_step5.png | Bin 0 -> 24960 bytes .../pivot_division_step6.png | Bin 0 -> 25341 bytes .../pivot_division_step7.png | Bin 0 -> 25348 bytes .../pivot_division_step8.png | Bin 0 -> 25432 bytes .../pivot_division_step9.png | Bin 0 -> 11634 bytes .../quick_sort.assets/quick_sort_overview.png | Bin 0 -> 19173 bytes ru/docs/chapter_sorting/quick_sort.md | 100 ++ .../radix_sort.assets/radix_sort_overview.png | Bin 0 -> 33876 bytes ru/docs/chapter_sorting/radix_sort.md | 41 + .../selection_sort_instability.png | Bin 0 -> 11893 bytes .../selection_sort_step1.png | Bin 0 -> 8503 bytes .../selection_sort_step10.png | Bin 0 -> 11571 bytes .../selection_sort_step11.png | Bin 0 -> 5824 bytes .../selection_sort_step2.png | Bin 0 -> 11536 bytes .../selection_sort_step3.png | Bin 0 -> 8033 bytes .../selection_sort_step4.png | Bin 0 -> 12005 bytes .../selection_sort_step5.png | Bin 0 -> 8152 bytes .../selection_sort_step6.png | Bin 0 -> 12067 bytes .../selection_sort_step7.png | Bin 0 -> 7957 bytes .../selection_sort_step8.png | Bin 0 -> 11873 bytes .../selection_sort_step9.png | Bin 0 -> 8252 bytes ru/docs/chapter_sorting/selection_sort.md | 58 + .../sorting_examples.png | Bin 0 -> 12018 bytes ru/docs/chapter_sorting/sorting_algorithm.md | 46 + ru/docs/chapter_sorting/sorting_examples.png | Bin 0 -> 12018 bytes .../sorting_algorithms_comparison.png | Bin 0 -> 41806 bytes ru/docs/chapter_sorting/summary.md | 47 + .../deque.assets/array_deque_step1.png | Bin 0 -> 21385 bytes .../array_deque_step2_push_last.png | Bin 0 -> 16235 bytes .../array_deque_step3_push_first.png | Bin 0 -> 14737 bytes .../array_deque_step4_pop_last.png | Bin 0 -> 11002 bytes .../array_deque_step5_pop_first.png | Bin 0 -> 12233 bytes .../deque.assets/deque_operations.png | Bin 0 -> 18425 bytes .../deque.assets/linkedlist_deque_step1.png | Bin 0 -> 12834 bytes .../linkedlist_deque_step2_push_last.png | Bin 0 -> 12654 bytes .../linkedlist_deque_step3_push_first.png | Bin 0 -> 14419 bytes .../linkedlist_deque_step4_pop_last.png | Bin 0 -> 11709 bytes .../linkedlist_deque_step5_pop_first.png | Bin 0 -> 10198 bytes ru/docs/chapter_stack_and_queue/deque.md | 452 +++++++ ru/docs/chapter_stack_and_queue/index.md | 9 + .../queue.assets/array_queue_step1.png | Bin 0 -> 18835 bytes .../queue.assets/array_queue_step2_push.png | Bin 0 -> 14623 bytes .../queue.assets/array_queue_step3_pop.png | Bin 0 -> 13915 bytes .../queue.assets/linkedlist_queue_step1.png | Bin 0 -> 12350 bytes .../linkedlist_queue_step2_push.png | Bin 0 -> 12938 bytes .../linkedlist_queue_step3_pop.png | Bin 0 -> 10429 bytes .../queue.assets/queue_operations.png | Bin 0 -> 14772 bytes ru/docs/chapter_stack_and_queue/queue.md | 423 ++++++ .../stack.assets/array_stack_step1.png | Bin 0 -> 12093 bytes .../stack.assets/array_stack_step2_push.png | Bin 0 -> 11563 bytes .../stack.assets/array_stack_step3_pop.png | Bin 0 -> 10236 bytes .../stack.assets/linkedlist_stack_step1.png | Bin 0 -> 12293 bytes .../linkedlist_stack_step2_push.png | Bin 0 -> 14576 bytes .../linkedlist_stack_step3_pop.png | Bin 0 -> 11224 bytes .../stack.assets/stack_operations.png | Bin 0 -> 14014 bytes ru/docs/chapter_stack_and_queue/stack.md | 430 ++++++ ru/docs/chapter_stack_and_queue/summary.md | 31 + .../array_representation_binary_tree.png | Bin 0 -> 22965 bytes ...ay_representation_complete_binary_tree.png | Bin 0 -> 16397 bytes .../array_representation_with_empty.png | Bin 0 -> 19919 bytes .../array_representation_without_empty.png | Bin 0 -> 14353 bytes .../array_representation_of_tree.md | 160 +++ ...vltree_degradation_from_inserting_node.png | Bin 0 -> 16405 bytes ...avltree_degradation_from_removing_node.png | Bin 0 -> 14177 bytes .../avltree_left_right_rotate.png | Bin 0 -> 16854 bytes .../avl_tree.assets/avltree_left_rotate.png | Bin 0 -> 17570 bytes .../avltree_left_rotate_with_grandchild.png | Bin 0 -> 21032 bytes .../avltree_right_left_rotate.png | Bin 0 -> 17695 bytes .../avltree_right_rotate_step1.png | Bin 0 -> 7613 bytes .../avltree_right_rotate_step2.png | Bin 0 -> 11671 bytes .../avltree_right_rotate_step3.png | Bin 0 -> 13886 bytes .../avltree_right_rotate_step4.png | Bin 0 -> 16288 bytes .../avltree_right_rotate_with_grandchild.png | Bin 0 -> 21374 bytes .../avltree_rotation_cases.png | Bin 0 -> 19027 bytes ru/docs/chapter_tree/avl_tree.md | 358 +++++ .../binary_search_tree.png | Bin 0 -> 8147 bytes .../bst_degradation.png | Bin 0 -> 14358 bytes .../bst_inorder_traversal.png | Bin 0 -> 23534 bytes .../binary_search_tree.assets/bst_insert.png | Bin 0 -> 20592 bytes .../bst_remove_case1.png | Bin 0 -> 20731 bytes .../bst_remove_case2.png | Bin 0 -> 21945 bytes .../bst_remove_case3_step1.png | Bin 0 -> 12574 bytes .../bst_remove_case3_step2.png | Bin 0 -> 20383 bytes .../bst_remove_case3_step3.png | Bin 0 -> 21270 bytes .../bst_remove_case3_step4.png | Bin 0 -> 23392 bytes .../bst_search_step1.png | Bin 0 -> 10644 bytes .../bst_search_step2.png | Bin 0 -> 12471 bytes .../bst_search_step3.png | Bin 0 -> 13232 bytes .../bst_search_step4.png | Bin 0 -> 13698 bytes ru/docs/chapter_tree/binary_search_tree.md | 129 ++ .../balanced_binary_tree.png | Bin 0 -> 13045 bytes .../binary_tree_add_remove.png | Bin 0 -> 16328 bytes .../binary_tree_best_worst_cases.png | Bin 0 -> 14844 bytes .../binary_tree_definition.png | Bin 0 -> 19479 bytes .../binary_tree_terminology.png | Bin 0 -> 16527 bytes .../complete_binary_tree.png | Bin 0 -> 12117 bytes .../binary_tree.assets/full_binary_tree.png | Bin 0 -> 7678 bytes .../perfect_binary_tree.png | Bin 0 -> 11028 bytes ru/docs/chapter_tree/binary_tree.md | 674 ++++++++++ .../binary_tree_bfs.png | Bin 0 -> 12214 bytes .../binary_tree_dfs.png | Bin 0 -> 46457 bytes .../preorder_step1.png | Bin 0 -> 12446 bytes .../preorder_step10.png | Bin 0 -> 22274 bytes .../preorder_step11.png | Bin 0 -> 23416 bytes .../preorder_step2.png | Bin 0 -> 13743 bytes .../preorder_step3.png | Bin 0 -> 14948 bytes .../preorder_step4.png | Bin 0 -> 16107 bytes .../preorder_step5.png | Bin 0 -> 17381 bytes .../preorder_step6.png | Bin 0 -> 18110 bytes .../preorder_step7.png | Bin 0 -> 20221 bytes .../preorder_step8.png | Bin 0 -> 20515 bytes .../preorder_step9.png | Bin 0 -> 20329 bytes ru/docs/chapter_tree/binary_tree_traversal.md | 89 ++ ru/docs/chapter_tree/index.md | 9 + ru/docs/chapter_tree/summary.md | 54 + ru/docs/index.assets/animation.gif | Bin 0 -> 119276 bytes ru/docs/index.assets/comment.gif | Bin 0 -> 320242 bytes ru/docs/index.assets/running_code.gif | Bin 0 -> 255319 bytes ru/docs/index.html | 357 +++++ ru/docs/index.md | 5 + ru/mkdocs.yml | 179 +++ zh-hant/README.md | 2 + 1958 files changed, 108186 insertions(+) create mode 100644 ru/README.md create mode 100644 ru/codes/Dockerfile create mode 100644 ru/codes/c/.gitignore create mode 100644 ru/codes/c/CMakeLists.txt create mode 100644 ru/codes/c/chapter_array_and_linkedlist/CMakeLists.txt create mode 100644 ru/codes/c/chapter_array_and_linkedlist/array.c create mode 100644 ru/codes/c/chapter_array_and_linkedlist/linked_list.c create mode 100644 ru/codes/c/chapter_array_and_linkedlist/my_list.c create mode 100644 ru/codes/c/chapter_backtracking/CMakeLists.txt create mode 100644 ru/codes/c/chapter_backtracking/n_queens.c create mode 100644 ru/codes/c/chapter_backtracking/permutations_i.c create mode 100644 ru/codes/c/chapter_backtracking/permutations_ii.c create mode 100644 ru/codes/c/chapter_backtracking/preorder_traversal_i_compact.c create mode 100644 ru/codes/c/chapter_backtracking/preorder_traversal_ii_compact.c create mode 100644 ru/codes/c/chapter_backtracking/preorder_traversal_iii_compact.c create mode 100644 ru/codes/c/chapter_backtracking/preorder_traversal_iii_template.c create mode 100644 ru/codes/c/chapter_backtracking/subset_sum_i.c create mode 100644 ru/codes/c/chapter_backtracking/subset_sum_i_naive.c create mode 100644 ru/codes/c/chapter_backtracking/subset_sum_ii.c create mode 100644 ru/codes/c/chapter_computational_complexity/CMakeLists.txt create mode 100644 ru/codes/c/chapter_computational_complexity/iteration.c create mode 100644 ru/codes/c/chapter_computational_complexity/recursion.c create mode 100644 ru/codes/c/chapter_computational_complexity/space_complexity.c create mode 100644 ru/codes/c/chapter_computational_complexity/time_complexity.c create mode 100644 ru/codes/c/chapter_computational_complexity/worst_best_time_complexity.c create mode 100644 ru/codes/c/chapter_divide_and_conquer/CMakeLists.txt create mode 100644 ru/codes/c/chapter_divide_and_conquer/binary_search_recur.c create mode 100644 ru/codes/c/chapter_divide_and_conquer/build_tree.c create mode 100644 ru/codes/c/chapter_divide_and_conquer/hanota.c create mode 100644 ru/codes/c/chapter_dynamic_programming/CMakeLists.txt create mode 100644 ru/codes/c/chapter_dynamic_programming/climbing_stairs_backtrack.c create mode 100644 ru/codes/c/chapter_dynamic_programming/climbing_stairs_constraint_dp.c create mode 100644 ru/codes/c/chapter_dynamic_programming/climbing_stairs_dfs.c create mode 100644 ru/codes/c/chapter_dynamic_programming/climbing_stairs_dfs_mem.c create mode 100644 ru/codes/c/chapter_dynamic_programming/climbing_stairs_dp.c create mode 100644 ru/codes/c/chapter_dynamic_programming/coin_change.c create mode 100644 ru/codes/c/chapter_dynamic_programming/coin_change_ii.c create mode 100644 ru/codes/c/chapter_dynamic_programming/edit_distance.c create mode 100644 ru/codes/c/chapter_dynamic_programming/knapsack.c create mode 100644 ru/codes/c/chapter_dynamic_programming/min_cost_climbing_stairs_dp.c create mode 100644 ru/codes/c/chapter_dynamic_programming/min_path_sum.c create mode 100644 ru/codes/c/chapter_dynamic_programming/unbounded_knapsack.c create mode 100644 ru/codes/c/chapter_graph/CMakeLists.txt create mode 100644 ru/codes/c/chapter_graph/graph_adjacency_list.c create mode 100644 ru/codes/c/chapter_graph/graph_adjacency_list_test.c create mode 100644 ru/codes/c/chapter_graph/graph_adjacency_matrix.c create mode 100644 ru/codes/c/chapter_graph/graph_bfs.c create mode 100644 ru/codes/c/chapter_graph/graph_dfs.c create mode 100644 ru/codes/c/chapter_greedy/CMakeLists.txt create mode 100644 ru/codes/c/chapter_greedy/coin_change_greedy.c create mode 100644 ru/codes/c/chapter_greedy/fractional_knapsack.c create mode 100644 ru/codes/c/chapter_greedy/max_capacity.c create mode 100644 ru/codes/c/chapter_greedy/max_product_cutting.c create mode 100644 ru/codes/c/chapter_hashing/CMakeLists.txt create mode 100644 ru/codes/c/chapter_hashing/array_hash_map.c create mode 100644 ru/codes/c/chapter_hashing/hash_map_chaining.c create mode 100644 ru/codes/c/chapter_hashing/hash_map_open_addressing.c create mode 100644 ru/codes/c/chapter_hashing/simple_hash.c create mode 100644 ru/codes/c/chapter_heap/CMakeLists.txt create mode 100644 ru/codes/c/chapter_heap/my_heap.c create mode 100644 ru/codes/c/chapter_heap/my_heap_test.c create mode 100644 ru/codes/c/chapter_heap/top_k.c create mode 100644 ru/codes/c/chapter_searching/CMakeLists.txt create mode 100644 ru/codes/c/chapter_searching/binary_search.c create mode 100644 ru/codes/c/chapter_searching/binary_search_edge.c create mode 100644 ru/codes/c/chapter_searching/binary_search_insertion.c create mode 100644 ru/codes/c/chapter_searching/two_sum.c create mode 100644 ru/codes/c/chapter_sorting/CMakeLists.txt create mode 100644 ru/codes/c/chapter_sorting/bubble_sort.c create mode 100644 ru/codes/c/chapter_sorting/bucket_sort.c create mode 100644 ru/codes/c/chapter_sorting/counting_sort.c create mode 100644 ru/codes/c/chapter_sorting/heap_sort.c create mode 100644 ru/codes/c/chapter_sorting/insertion_sort.c create mode 100644 ru/codes/c/chapter_sorting/merge_sort.c create mode 100644 ru/codes/c/chapter_sorting/quick_sort.c create mode 100644 ru/codes/c/chapter_sorting/radix_sort.c create mode 100644 ru/codes/c/chapter_sorting/selection_sort.c create mode 100644 ru/codes/c/chapter_stack_and_queue/CMakeLists.txt create mode 100644 ru/codes/c/chapter_stack_and_queue/array_deque.c create mode 100644 ru/codes/c/chapter_stack_and_queue/array_queue.c create mode 100644 ru/codes/c/chapter_stack_and_queue/array_stack.c create mode 100644 ru/codes/c/chapter_stack_and_queue/linkedlist_deque.c create mode 100644 ru/codes/c/chapter_stack_and_queue/linkedlist_queue.c create mode 100644 ru/codes/c/chapter_stack_and_queue/linkedlist_stack.c create mode 100644 ru/codes/c/chapter_tree/CMakeLists.txt create mode 100644 ru/codes/c/chapter_tree/array_binary_tree.c create mode 100644 ru/codes/c/chapter_tree/avl_tree.c create mode 100644 ru/codes/c/chapter_tree/binary_search_tree.c create mode 100644 ru/codes/c/chapter_tree/binary_tree.c create mode 100644 ru/codes/c/chapter_tree/binary_tree_bfs.c create mode 100644 ru/codes/c/chapter_tree/binary_tree_dfs.c create mode 100644 ru/codes/c/utils/CMakeLists.txt create mode 100644 ru/codes/c/utils/common.h create mode 100644 ru/codes/c/utils/common_test.c create mode 100644 ru/codes/c/utils/list_node.h create mode 100644 ru/codes/c/utils/print_util.h create mode 100644 ru/codes/c/utils/tree_node.h create mode 100644 ru/codes/c/utils/uthash.h create mode 100644 ru/codes/c/utils/vector.h create mode 100644 ru/codes/c/utils/vertex.h create mode 100644 ru/codes/cpp/.gitignore create mode 100644 ru/codes/cpp/CMakeLists.txt create mode 100644 ru/codes/cpp/chapter_array_and_linkedlist/CMakeLists.txt create mode 100644 ru/codes/cpp/chapter_array_and_linkedlist/array.cpp create mode 100644 ru/codes/cpp/chapter_array_and_linkedlist/linked_list.cpp create mode 100644 ru/codes/cpp/chapter_array_and_linkedlist/list.cpp create mode 100644 ru/codes/cpp/chapter_array_and_linkedlist/my_list.cpp create mode 100644 ru/codes/cpp/chapter_backtracking/CMakeLists.txt create mode 100644 ru/codes/cpp/chapter_backtracking/n_queens.cpp create mode 100644 ru/codes/cpp/chapter_backtracking/permutations_i.cpp create mode 100644 ru/codes/cpp/chapter_backtracking/permutations_ii.cpp create mode 100644 ru/codes/cpp/chapter_backtracking/preorder_traversal_i_compact.cpp create mode 100644 ru/codes/cpp/chapter_backtracking/preorder_traversal_ii_compact.cpp create mode 100644 ru/codes/cpp/chapter_backtracking/preorder_traversal_iii_compact.cpp create mode 100644 ru/codes/cpp/chapter_backtracking/preorder_traversal_iii_template.cpp create mode 100644 ru/codes/cpp/chapter_backtracking/subset_sum_i.cpp create mode 100644 ru/codes/cpp/chapter_backtracking/subset_sum_i_naive.cpp create mode 100644 ru/codes/cpp/chapter_backtracking/subset_sum_ii.cpp create mode 100644 ru/codes/cpp/chapter_computational_complexity/CMakeLists.txt create mode 100644 ru/codes/cpp/chapter_computational_complexity/iteration.cpp create mode 100644 ru/codes/cpp/chapter_computational_complexity/recursion.cpp create mode 100644 ru/codes/cpp/chapter_computational_complexity/space_complexity.cpp create mode 100644 ru/codes/cpp/chapter_computational_complexity/time_complexity.cpp create mode 100644 ru/codes/cpp/chapter_computational_complexity/worst_best_time_complexity.cpp create mode 100644 ru/codes/cpp/chapter_divide_and_conquer/CMakeLists.txt create mode 100644 ru/codes/cpp/chapter_divide_and_conquer/binary_search_recur.cpp create mode 100644 ru/codes/cpp/chapter_divide_and_conquer/build_tree.cpp create mode 100644 ru/codes/cpp/chapter_divide_and_conquer/hanota.cpp create mode 100644 ru/codes/cpp/chapter_dynamic_programming/CMakeLists.txt create mode 100644 ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_backtrack.cpp create mode 100644 ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_constraint_dp.cpp create mode 100644 ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_dfs.cpp create mode 100644 ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_dfs_mem.cpp create mode 100644 ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_dp.cpp create mode 100644 ru/codes/cpp/chapter_dynamic_programming/coin_change.cpp create mode 100644 ru/codes/cpp/chapter_dynamic_programming/coin_change_ii.cpp create mode 100644 ru/codes/cpp/chapter_dynamic_programming/edit_distance.cpp create mode 100644 ru/codes/cpp/chapter_dynamic_programming/knapsack.cpp create mode 100644 ru/codes/cpp/chapter_dynamic_programming/min_cost_climbing_stairs_dp.cpp create mode 100644 ru/codes/cpp/chapter_dynamic_programming/min_path_sum.cpp create mode 100644 ru/codes/cpp/chapter_dynamic_programming/unbounded_knapsack.cpp create mode 100644 ru/codes/cpp/chapter_graph/CMakeLists.txt create mode 100644 ru/codes/cpp/chapter_graph/graph_adjacency_list.cpp create mode 100644 ru/codes/cpp/chapter_graph/graph_adjacency_list_test.cpp create mode 100644 ru/codes/cpp/chapter_graph/graph_adjacency_matrix.cpp create mode 100644 ru/codes/cpp/chapter_graph/graph_bfs.cpp create mode 100644 ru/codes/cpp/chapter_graph/graph_dfs.cpp create mode 100644 ru/codes/cpp/chapter_greedy/CMakeLists.txt create mode 100644 ru/codes/cpp/chapter_greedy/coin_change_greedy.cpp create mode 100644 ru/codes/cpp/chapter_greedy/fractional_knapsack.cpp create mode 100644 ru/codes/cpp/chapter_greedy/max_capacity.cpp create mode 100644 ru/codes/cpp/chapter_greedy/max_product_cutting.cpp create mode 100644 ru/codes/cpp/chapter_hashing/CMakeLists.txt create mode 100644 ru/codes/cpp/chapter_hashing/array_hash_map.cpp create mode 100644 ru/codes/cpp/chapter_hashing/array_hash_map_test.cpp create mode 100644 ru/codes/cpp/chapter_hashing/built_in_hash.cpp create mode 100644 ru/codes/cpp/chapter_hashing/hash_map.cpp create mode 100644 ru/codes/cpp/chapter_hashing/hash_map_chaining.cpp create mode 100644 ru/codes/cpp/chapter_hashing/hash_map_open_addressing.cpp create mode 100644 ru/codes/cpp/chapter_hashing/simple_hash.cpp create mode 100644 ru/codes/cpp/chapter_heap/CMakeLists.txt create mode 100644 ru/codes/cpp/chapter_heap/heap.cpp create mode 100644 ru/codes/cpp/chapter_heap/my_heap.cpp create mode 100644 ru/codes/cpp/chapter_heap/top_k.cpp create mode 100644 ru/codes/cpp/chapter_searching/CMakeLists.txt create mode 100644 ru/codes/cpp/chapter_searching/binary_search.cpp create mode 100644 ru/codes/cpp/chapter_searching/binary_search_edge.cpp create mode 100644 ru/codes/cpp/chapter_searching/binary_search_insertion.cpp create mode 100644 ru/codes/cpp/chapter_searching/hashing_search.cpp create mode 100644 ru/codes/cpp/chapter_searching/linear_search.cpp create mode 100644 ru/codes/cpp/chapter_searching/two_sum.cpp create mode 100644 ru/codes/cpp/chapter_sorting/CMakeLists.txt create mode 100644 ru/codes/cpp/chapter_sorting/bubble_sort.cpp create mode 100644 ru/codes/cpp/chapter_sorting/bucket_sort.cpp create mode 100644 ru/codes/cpp/chapter_sorting/counting_sort.cpp create mode 100644 ru/codes/cpp/chapter_sorting/heap_sort.cpp create mode 100644 ru/codes/cpp/chapter_sorting/insertion_sort.cpp create mode 100644 ru/codes/cpp/chapter_sorting/merge_sort.cpp create mode 100644 ru/codes/cpp/chapter_sorting/quick_sort.cpp create mode 100644 ru/codes/cpp/chapter_sorting/radix_sort.cpp create mode 100644 ru/codes/cpp/chapter_sorting/selection_sort.cpp create mode 100644 ru/codes/cpp/chapter_stack_and_queue/CMakeLists.txt create mode 100644 ru/codes/cpp/chapter_stack_and_queue/array_deque.cpp create mode 100644 ru/codes/cpp/chapter_stack_and_queue/array_queue.cpp create mode 100644 ru/codes/cpp/chapter_stack_and_queue/array_stack.cpp create mode 100644 ru/codes/cpp/chapter_stack_and_queue/deque.cpp create mode 100644 ru/codes/cpp/chapter_stack_and_queue/linkedlist_deque.cpp create mode 100644 ru/codes/cpp/chapter_stack_and_queue/linkedlist_queue.cpp create mode 100644 ru/codes/cpp/chapter_stack_and_queue/linkedlist_stack.cpp create mode 100644 ru/codes/cpp/chapter_stack_and_queue/queue.cpp create mode 100644 ru/codes/cpp/chapter_stack_and_queue/stack.cpp create mode 100644 ru/codes/cpp/chapter_tree/CMakeLists.txt create mode 100644 ru/codes/cpp/chapter_tree/array_binary_tree.cpp create mode 100644 ru/codes/cpp/chapter_tree/avl_tree.cpp create mode 100644 ru/codes/cpp/chapter_tree/binary_search_tree.cpp create mode 100644 ru/codes/cpp/chapter_tree/binary_tree.cpp create mode 100644 ru/codes/cpp/chapter_tree/binary_tree_bfs.cpp create mode 100644 ru/codes/cpp/chapter_tree/binary_tree_dfs.cpp create mode 100644 ru/codes/cpp/utils/CMakeLists.txt create mode 100644 ru/codes/cpp/utils/common.hpp create mode 100644 ru/codes/cpp/utils/list_node.hpp create mode 100644 ru/codes/cpp/utils/print_utils.hpp create mode 100644 ru/codes/cpp/utils/tree_node.hpp create mode 100644 ru/codes/cpp/utils/vertex.hpp create mode 100644 ru/codes/csharp/.editorconfig create mode 100644 ru/codes/csharp/.gitignore create mode 100644 ru/codes/csharp/.vscode/launch.json create mode 100644 ru/codes/csharp/.vscode/tasks.json create mode 100644 ru/codes/csharp/GlobalUsing.cs create mode 100644 ru/codes/csharp/chapter_array_and_linkedlist/array.cs create mode 100644 ru/codes/csharp/chapter_array_and_linkedlist/linked_list.cs create mode 100644 ru/codes/csharp/chapter_array_and_linkedlist/list.cs create mode 100644 ru/codes/csharp/chapter_array_and_linkedlist/my_list.cs create mode 100644 ru/codes/csharp/chapter_backtracking/n_queens.cs create mode 100644 ru/codes/csharp/chapter_backtracking/permutations_i.cs create mode 100644 ru/codes/csharp/chapter_backtracking/permutations_ii.cs create mode 100644 ru/codes/csharp/chapter_backtracking/preorder_traversal_i_compact.cs create mode 100644 ru/codes/csharp/chapter_backtracking/preorder_traversal_ii_compact.cs create mode 100644 ru/codes/csharp/chapter_backtracking/preorder_traversal_iii_compact.cs create mode 100644 ru/codes/csharp/chapter_backtracking/preorder_traversal_iii_template.cs create mode 100644 ru/codes/csharp/chapter_backtracking/subset_sum_i.cs create mode 100644 ru/codes/csharp/chapter_backtracking/subset_sum_i_naive.cs create mode 100644 ru/codes/csharp/chapter_backtracking/subset_sum_ii.cs create mode 100644 ru/codes/csharp/chapter_computational_complexity/iteration.cs create mode 100644 ru/codes/csharp/chapter_computational_complexity/recursion.cs create mode 100644 ru/codes/csharp/chapter_computational_complexity/space_complexity.cs create mode 100644 ru/codes/csharp/chapter_computational_complexity/time_complexity.cs create mode 100644 ru/codes/csharp/chapter_computational_complexity/worst_best_time_complexity.cs create mode 100644 ru/codes/csharp/chapter_divide_and_conquer/binary_search_recur.cs create mode 100644 ru/codes/csharp/chapter_divide_and_conquer/build_tree.cs create mode 100644 ru/codes/csharp/chapter_divide_and_conquer/hanota.cs create mode 100644 ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_backtrack.cs create mode 100644 ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_constraint_dp.cs create mode 100644 ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_dfs.cs create mode 100644 ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_dfs_mem.cs create mode 100644 ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_dp.cs create mode 100644 ru/codes/csharp/chapter_dynamic_programming/coin_change.cs create mode 100644 ru/codes/csharp/chapter_dynamic_programming/coin_change_ii.cs create mode 100644 ru/codes/csharp/chapter_dynamic_programming/edit_distance.cs create mode 100644 ru/codes/csharp/chapter_dynamic_programming/knapsack.cs create mode 100644 ru/codes/csharp/chapter_dynamic_programming/min_cost_climbing_stairs_dp.cs create mode 100644 ru/codes/csharp/chapter_dynamic_programming/min_path_sum.cs create mode 100644 ru/codes/csharp/chapter_dynamic_programming/unbounded_knapsack.cs create mode 100644 ru/codes/csharp/chapter_graph/graph_adjacency_list.cs create mode 100644 ru/codes/csharp/chapter_graph/graph_adjacency_matrix.cs create mode 100644 ru/codes/csharp/chapter_graph/graph_bfs.cs create mode 100644 ru/codes/csharp/chapter_graph/graph_dfs.cs create mode 100644 ru/codes/csharp/chapter_greedy/coin_change_greedy.cs create mode 100644 ru/codes/csharp/chapter_greedy/fractional_knapsack.cs create mode 100644 ru/codes/csharp/chapter_greedy/max_capacity.cs create mode 100644 ru/codes/csharp/chapter_greedy/max_product_cutting.cs create mode 100644 ru/codes/csharp/chapter_hashing/array_hash_map.cs create mode 100644 ru/codes/csharp/chapter_hashing/built_in_hash.cs create mode 100644 ru/codes/csharp/chapter_hashing/hash_map.cs create mode 100644 ru/codes/csharp/chapter_hashing/hash_map_chaining.cs create mode 100644 ru/codes/csharp/chapter_hashing/hash_map_open_addressing.cs create mode 100644 ru/codes/csharp/chapter_hashing/simple_hash.cs create mode 100644 ru/codes/csharp/chapter_heap/heap.cs create mode 100644 ru/codes/csharp/chapter_heap/my_heap.cs create mode 100644 ru/codes/csharp/chapter_heap/top_k.cs create mode 100644 ru/codes/csharp/chapter_searching/binary_search.cs create mode 100644 ru/codes/csharp/chapter_searching/binary_search_edge.cs create mode 100644 ru/codes/csharp/chapter_searching/binary_search_insertion.cs create mode 100644 ru/codes/csharp/chapter_searching/hashing_search.cs create mode 100644 ru/codes/csharp/chapter_searching/linear_search.cs create mode 100644 ru/codes/csharp/chapter_searching/two_sum.cs create mode 100644 ru/codes/csharp/chapter_sorting/bubble_sort.cs create mode 100644 ru/codes/csharp/chapter_sorting/bucket_sort.cs create mode 100644 ru/codes/csharp/chapter_sorting/counting_sort.cs create mode 100644 ru/codes/csharp/chapter_sorting/heap_sort.cs create mode 100644 ru/codes/csharp/chapter_sorting/insertion_sort.cs create mode 100644 ru/codes/csharp/chapter_sorting/merge_sort.cs create mode 100644 ru/codes/csharp/chapter_sorting/quick_sort.cs create mode 100644 ru/codes/csharp/chapter_sorting/radix_sort.cs create mode 100644 ru/codes/csharp/chapter_sorting/selection_sort.cs create mode 100644 ru/codes/csharp/chapter_stack_and_queue/array_deque.cs create mode 100644 ru/codes/csharp/chapter_stack_and_queue/array_queue.cs create mode 100644 ru/codes/csharp/chapter_stack_and_queue/array_stack.cs create mode 100644 ru/codes/csharp/chapter_stack_and_queue/deque.cs create mode 100644 ru/codes/csharp/chapter_stack_and_queue/linkedlist_deque.cs create mode 100644 ru/codes/csharp/chapter_stack_and_queue/linkedlist_queue.cs create mode 100644 ru/codes/csharp/chapter_stack_and_queue/linkedlist_stack.cs create mode 100644 ru/codes/csharp/chapter_stack_and_queue/queue.cs create mode 100644 ru/codes/csharp/chapter_stack_and_queue/stack.cs create mode 100644 ru/codes/csharp/chapter_tree/array_binary_tree.cs create mode 100644 ru/codes/csharp/chapter_tree/avl_tree.cs create mode 100644 ru/codes/csharp/chapter_tree/binary_search_tree.cs create mode 100644 ru/codes/csharp/chapter_tree/binary_tree.cs create mode 100644 ru/codes/csharp/chapter_tree/binary_tree_bfs.cs create mode 100644 ru/codes/csharp/chapter_tree/binary_tree_dfs.cs create mode 100644 ru/codes/csharp/csharp.sln create mode 100644 ru/codes/csharp/hello-algo.csproj create mode 100644 ru/codes/csharp/utils/ListNode.cs create mode 100644 ru/codes/csharp/utils/PrintUtil.cs create mode 100644 ru/codes/csharp/utils/TreeNode.cs create mode 100644 ru/codes/csharp/utils/Vertex.cs create mode 100644 ru/codes/dart/build.dart create mode 100644 ru/codes/dart/chapter_array_and_linkedlist/array.dart create mode 100644 ru/codes/dart/chapter_array_and_linkedlist/linked_list.dart create mode 100644 ru/codes/dart/chapter_array_and_linkedlist/list.dart create mode 100644 ru/codes/dart/chapter_array_and_linkedlist/my_list.dart create mode 100644 ru/codes/dart/chapter_backtracking/n_queens.dart create mode 100644 ru/codes/dart/chapter_backtracking/permutations_i.dart create mode 100644 ru/codes/dart/chapter_backtracking/permutations_ii.dart create mode 100644 ru/codes/dart/chapter_backtracking/preorder_traversal_i_compact.dart create mode 100644 ru/codes/dart/chapter_backtracking/preorder_traversal_ii_compact.dart create mode 100644 ru/codes/dart/chapter_backtracking/preorder_traversal_iii_compact.dart create mode 100644 ru/codes/dart/chapter_backtracking/preorder_traversal_iii_template.dart create mode 100644 ru/codes/dart/chapter_backtracking/subset_sum_i.dart create mode 100644 ru/codes/dart/chapter_backtracking/subset_sum_i_naive.dart create mode 100644 ru/codes/dart/chapter_backtracking/subset_sum_ii.dart create mode 100644 ru/codes/dart/chapter_computational_complexity/iteration.dart create mode 100644 ru/codes/dart/chapter_computational_complexity/recursion.dart create mode 100644 ru/codes/dart/chapter_computational_complexity/space_complexity.dart create mode 100644 ru/codes/dart/chapter_computational_complexity/time_complexity.dart create mode 100644 ru/codes/dart/chapter_computational_complexity/worst_best_time_complexity.dart create mode 100644 ru/codes/dart/chapter_divide_and_conquer/binary_search_recur.dart create mode 100644 ru/codes/dart/chapter_divide_and_conquer/build_tree.dart create mode 100644 ru/codes/dart/chapter_divide_and_conquer/hanota.dart create mode 100644 ru/codes/dart/chapter_dynamic_programming/climbing_stairs_backtrack.dart create mode 100644 ru/codes/dart/chapter_dynamic_programming/climbing_stairs_constraint_dp.dart create mode 100644 ru/codes/dart/chapter_dynamic_programming/climbing_stairs_dfs.dart create mode 100644 ru/codes/dart/chapter_dynamic_programming/climbing_stairs_dfs_mem.dart create mode 100644 ru/codes/dart/chapter_dynamic_programming/climbing_stairs_dp.dart create mode 100644 ru/codes/dart/chapter_dynamic_programming/coin_change.dart create mode 100644 ru/codes/dart/chapter_dynamic_programming/coin_change_ii.dart create mode 100644 ru/codes/dart/chapter_dynamic_programming/edit_distance.dart create mode 100644 ru/codes/dart/chapter_dynamic_programming/knapsack.dart create mode 100644 ru/codes/dart/chapter_dynamic_programming/min_cost_climbing_stairs_dp.dart create mode 100644 ru/codes/dart/chapter_dynamic_programming/min_path_sum.dart create mode 100644 ru/codes/dart/chapter_dynamic_programming/unbounded_knapsack.dart create mode 100644 ru/codes/dart/chapter_graph/graph_adjacency_list.dart create mode 100644 ru/codes/dart/chapter_graph/graph_adjacency_matrix.dart create mode 100644 ru/codes/dart/chapter_graph/graph_bfs.dart create mode 100644 ru/codes/dart/chapter_graph/graph_dfs.dart create mode 100644 ru/codes/dart/chapter_greedy/coin_change_greedy.dart create mode 100644 ru/codes/dart/chapter_greedy/fractional_knapsack.dart create mode 100644 ru/codes/dart/chapter_greedy/max_capacity.dart create mode 100644 ru/codes/dart/chapter_greedy/max_product_cutting.dart create mode 100644 ru/codes/dart/chapter_hashing/array_hash_map.dart create mode 100644 ru/codes/dart/chapter_hashing/built_in_hash.dart create mode 100644 ru/codes/dart/chapter_hashing/hash_map.dart create mode 100644 ru/codes/dart/chapter_hashing/hash_map_chaining.dart create mode 100644 ru/codes/dart/chapter_hashing/hash_map_open_addressing.dart create mode 100644 ru/codes/dart/chapter_hashing/simple_hash.dart create mode 100644 ru/codes/dart/chapter_heap/my_heap.dart create mode 100644 ru/codes/dart/chapter_heap/top_k.dart create mode 100644 ru/codes/dart/chapter_searching/binary_search.dart create mode 100644 ru/codes/dart/chapter_searching/binary_search_edge.dart create mode 100644 ru/codes/dart/chapter_searching/binary_search_insertion.dart create mode 100644 ru/codes/dart/chapter_searching/hashing_search.dart create mode 100644 ru/codes/dart/chapter_searching/linear_search.dart create mode 100644 ru/codes/dart/chapter_searching/two_sum.dart create mode 100644 ru/codes/dart/chapter_sorting/bubble_sort.dart create mode 100644 ru/codes/dart/chapter_sorting/bucket_sort.dart create mode 100644 ru/codes/dart/chapter_sorting/counting_sort.dart create mode 100644 ru/codes/dart/chapter_sorting/heap_sort.dart create mode 100644 ru/codes/dart/chapter_sorting/insertion_sort.dart create mode 100644 ru/codes/dart/chapter_sorting/merge_sort.dart create mode 100644 ru/codes/dart/chapter_sorting/quick_sort.dart create mode 100644 ru/codes/dart/chapter_sorting/radix_sort.dart create mode 100644 ru/codes/dart/chapter_sorting/selection_sort.dart create mode 100644 ru/codes/dart/chapter_stack_and_queue/array_deque.dart create mode 100644 ru/codes/dart/chapter_stack_and_queue/array_queue.dart create mode 100644 ru/codes/dart/chapter_stack_and_queue/array_stack.dart create mode 100644 ru/codes/dart/chapter_stack_and_queue/deque.dart create mode 100644 ru/codes/dart/chapter_stack_and_queue/linkedlist_deque.dart create mode 100644 ru/codes/dart/chapter_stack_and_queue/linkedlist_queue.dart create mode 100644 ru/codes/dart/chapter_stack_and_queue/linkedlist_stack.dart create mode 100644 ru/codes/dart/chapter_stack_and_queue/queue.dart create mode 100644 ru/codes/dart/chapter_stack_and_queue/stack.dart create mode 100644 ru/codes/dart/chapter_tree/array_binary_tree.dart create mode 100644 ru/codes/dart/chapter_tree/avl_tree.dart create mode 100644 ru/codes/dart/chapter_tree/binary_search_tree.dart create mode 100644 ru/codes/dart/chapter_tree/binary_tree.dart create mode 100644 ru/codes/dart/chapter_tree/binary_tree_bfs.dart create mode 100644 ru/codes/dart/chapter_tree/binary_tree_dfs.dart create mode 100644 ru/codes/dart/utils/list_node.dart create mode 100644 ru/codes/dart/utils/print_util.dart create mode 100644 ru/codes/dart/utils/tree_node.dart create mode 100644 ru/codes/dart/utils/vertex.dart create mode 100644 ru/codes/docker-compose.yml create mode 100644 ru/codes/go/chapter_array_and_linkedlist/array.go create mode 100644 ru/codes/go/chapter_array_and_linkedlist/array_test.go create mode 100644 ru/codes/go/chapter_array_and_linkedlist/linked_list.go create mode 100644 ru/codes/go/chapter_array_and_linkedlist/linked_list_test.go create mode 100644 ru/codes/go/chapter_array_and_linkedlist/list_test.go create mode 100644 ru/codes/go/chapter_array_and_linkedlist/my_list.go create mode 100644 ru/codes/go/chapter_array_and_linkedlist/my_list_test.go create mode 100644 ru/codes/go/chapter_backtracking/n_queens.go create mode 100644 ru/codes/go/chapter_backtracking/n_queens_test.go create mode 100644 ru/codes/go/chapter_backtracking/permutation_test.go create mode 100644 ru/codes/go/chapter_backtracking/permutations_i.go create mode 100644 ru/codes/go/chapter_backtracking/permutations_ii.go create mode 100644 ru/codes/go/chapter_backtracking/preorder_traversal_i_compact.go create mode 100644 ru/codes/go/chapter_backtracking/preorder_traversal_ii_compact.go create mode 100644 ru/codes/go/chapter_backtracking/preorder_traversal_iii_compact.go create mode 100644 ru/codes/go/chapter_backtracking/preorder_traversal_iii_template.go create mode 100644 ru/codes/go/chapter_backtracking/preorder_traversal_test.go create mode 100644 ru/codes/go/chapter_backtracking/subset_sum_i.go create mode 100644 ru/codes/go/chapter_backtracking/subset_sum_i_naive.go create mode 100644 ru/codes/go/chapter_backtracking/subset_sum_ii.go create mode 100644 ru/codes/go/chapter_backtracking/subset_sum_test.go create mode 100644 ru/codes/go/chapter_computational_complexity/iteration.go create mode 100644 ru/codes/go/chapter_computational_complexity/iteration_test.go create mode 100644 ru/codes/go/chapter_computational_complexity/recursion.go create mode 100644 ru/codes/go/chapter_computational_complexity/recursion_test.go create mode 100644 ru/codes/go/chapter_computational_complexity/space_complexity.go create mode 100644 ru/codes/go/chapter_computational_complexity/space_complexity_test.go create mode 100644 ru/codes/go/chapter_computational_complexity/time_complexity.go create mode 100644 ru/codes/go/chapter_computational_complexity/time_complexity_test.go create mode 100644 ru/codes/go/chapter_computational_complexity/worst_best_time_complexity.go create mode 100644 ru/codes/go/chapter_computational_complexity/worst_best_time_complexity_test.go create mode 100644 ru/codes/go/chapter_divide_and_conquer/binary_search_recur.go create mode 100644 ru/codes/go/chapter_divide_and_conquer/binary_search_recur_test.go create mode 100644 ru/codes/go/chapter_divide_and_conquer/build_tree.go create mode 100644 ru/codes/go/chapter_divide_and_conquer/build_tree_test.go create mode 100644 ru/codes/go/chapter_divide_and_conquer/hanota.go create mode 100644 ru/codes/go/chapter_divide_and_conquer/hanota_test.go create mode 100644 ru/codes/go/chapter_dynamic_programming/climbing_stairs_backtrack.go create mode 100644 ru/codes/go/chapter_dynamic_programming/climbing_stairs_constraint_dp.go create mode 100644 ru/codes/go/chapter_dynamic_programming/climbing_stairs_dfs.go create mode 100644 ru/codes/go/chapter_dynamic_programming/climbing_stairs_dfs_mem.go create mode 100644 ru/codes/go/chapter_dynamic_programming/climbing_stairs_dp.go create mode 100644 ru/codes/go/chapter_dynamic_programming/climbing_stairs_test.go create mode 100644 ru/codes/go/chapter_dynamic_programming/coin_change.go create mode 100644 ru/codes/go/chapter_dynamic_programming/coin_change_ii.go create mode 100644 ru/codes/go/chapter_dynamic_programming/coin_change_test.go create mode 100644 ru/codes/go/chapter_dynamic_programming/edit_distance.go create mode 100644 ru/codes/go/chapter_dynamic_programming/edit_distance_test.go create mode 100644 ru/codes/go/chapter_dynamic_programming/knapsack.go create mode 100644 ru/codes/go/chapter_dynamic_programming/knapsack_test.go create mode 100644 ru/codes/go/chapter_dynamic_programming/min_cost_climbing_stairs_dp.go create mode 100644 ru/codes/go/chapter_dynamic_programming/min_path_sum.go create mode 100644 ru/codes/go/chapter_dynamic_programming/min_path_sum_test.go create mode 100644 ru/codes/go/chapter_dynamic_programming/unbounded_knapsack.go create mode 100644 ru/codes/go/chapter_graph/graph_adjacency_list.go create mode 100644 ru/codes/go/chapter_graph/graph_adjacency_list_test.go create mode 100644 ru/codes/go/chapter_graph/graph_adjacency_matrix.go create mode 100644 ru/codes/go/chapter_graph/graph_adjacency_matrix_test.go create mode 100644 ru/codes/go/chapter_graph/graph_bfs.go create mode 100644 ru/codes/go/chapter_graph/graph_bfs_test.go create mode 100644 ru/codes/go/chapter_graph/graph_dfs.go create mode 100644 ru/codes/go/chapter_graph/graph_dfs_test.go create mode 100644 ru/codes/go/chapter_greedy/coin_change_greedy.go create mode 100644 ru/codes/go/chapter_greedy/coin_change_greedy_test.go create mode 100644 ru/codes/go/chapter_greedy/fractional_knapsack.go create mode 100644 ru/codes/go/chapter_greedy/fractional_knapsack_test.go create mode 100644 ru/codes/go/chapter_greedy/max_capacity.go create mode 100644 ru/codes/go/chapter_greedy/max_capacity_test.go create mode 100644 ru/codes/go/chapter_greedy/max_product_cutting.go create mode 100644 ru/codes/go/chapter_greedy/max_product_cutting_test.go create mode 100644 ru/codes/go/chapter_hashing/array_hash_map.go create mode 100644 ru/codes/go/chapter_hashing/array_hash_map_test.go create mode 100644 ru/codes/go/chapter_hashing/hash_collision_test.go create mode 100644 ru/codes/go/chapter_hashing/hash_map_chaining.go create mode 100644 ru/codes/go/chapter_hashing/hash_map_open_addressing.go create mode 100644 ru/codes/go/chapter_hashing/hash_map_test.go create mode 100644 ru/codes/go/chapter_hashing/simple_hash.go create mode 100644 ru/codes/go/chapter_heap/heap.go create mode 100644 ru/codes/go/chapter_heap/heap_test.go create mode 100644 ru/codes/go/chapter_heap/my_heap.go create mode 100644 ru/codes/go/chapter_heap/top_k.go create mode 100644 ru/codes/go/chapter_searching/binary_search.go create mode 100644 ru/codes/go/chapter_searching/binary_search_edge.go create mode 100644 ru/codes/go/chapter_searching/binary_search_insertion.go create mode 100644 ru/codes/go/chapter_searching/binary_search_test.go create mode 100644 ru/codes/go/chapter_searching/hashing_search.go create mode 100644 ru/codes/go/chapter_searching/hashing_search_test.go create mode 100644 ru/codes/go/chapter_searching/linear_search.go create mode 100644 ru/codes/go/chapter_searching/linear_search_test.go create mode 100644 ru/codes/go/chapter_searching/two_sum.go create mode 100644 ru/codes/go/chapter_searching/two_sum_test.go create mode 100644 ru/codes/go/chapter_sorting/bubble_sort.go create mode 100644 ru/codes/go/chapter_sorting/bubble_sort_test.go create mode 100644 ru/codes/go/chapter_sorting/bucket_sort.go create mode 100644 ru/codes/go/chapter_sorting/bucket_sort_test.go create mode 100644 ru/codes/go/chapter_sorting/counting_sort.go create mode 100644 ru/codes/go/chapter_sorting/counting_sort_test.go create mode 100644 ru/codes/go/chapter_sorting/heap_sort.go create mode 100644 ru/codes/go/chapter_sorting/heap_sort_test.go create mode 100644 ru/codes/go/chapter_sorting/insertion_sort.go create mode 100644 ru/codes/go/chapter_sorting/insertion_sort_test.go create mode 100644 ru/codes/go/chapter_sorting/merge_sort.go create mode 100644 ru/codes/go/chapter_sorting/merge_sort_test.go create mode 100644 ru/codes/go/chapter_sorting/quick_sort.go create mode 100644 ru/codes/go/chapter_sorting/quick_sort_test.go create mode 100644 ru/codes/go/chapter_sorting/radix_sort.go create mode 100644 ru/codes/go/chapter_sorting/radix_sort_test.go create mode 100644 ru/codes/go/chapter_sorting/selection_sort.go create mode 100644 ru/codes/go/chapter_sorting/selection_sort_test.go create mode 100644 ru/codes/go/chapter_stack_and_queue/array_deque.go create mode 100644 ru/codes/go/chapter_stack_and_queue/array_queue.go create mode 100644 ru/codes/go/chapter_stack_and_queue/array_stack.go create mode 100644 ru/codes/go/chapter_stack_and_queue/deque_test.go create mode 100644 ru/codes/go/chapter_stack_and_queue/linkedlist_deque.go create mode 100644 ru/codes/go/chapter_stack_and_queue/linkedlist_queue.go create mode 100644 ru/codes/go/chapter_stack_and_queue/linkedlist_stack.go create mode 100644 ru/codes/go/chapter_stack_and_queue/queue_test.go create mode 100644 ru/codes/go/chapter_stack_and_queue/stack_test.go create mode 100644 ru/codes/go/chapter_tree/array_binary_tree.go create mode 100644 ru/codes/go/chapter_tree/array_binary_tree_test.go create mode 100644 ru/codes/go/chapter_tree/avl_tree.go create mode 100644 ru/codes/go/chapter_tree/avl_tree_test.go create mode 100644 ru/codes/go/chapter_tree/binary_search_tree.go create mode 100644 ru/codes/go/chapter_tree/binary_search_tree_test.go create mode 100644 ru/codes/go/chapter_tree/binary_tree_bfs.go create mode 100644 ru/codes/go/chapter_tree/binary_tree_bfs_test.go create mode 100644 ru/codes/go/chapter_tree/binary_tree_dfs.go create mode 100644 ru/codes/go/chapter_tree/binary_tree_dfs_test.go create mode 100644 ru/codes/go/chapter_tree/binary_tree_test.go create mode 100644 ru/codes/go/go.mod create mode 100644 ru/codes/go/pkg/list_node.go create mode 100644 ru/codes/go/pkg/list_node_test.go create mode 100644 ru/codes/go/pkg/print_utils.go create mode 100644 ru/codes/go/pkg/tree_node.go create mode 100644 ru/codes/go/pkg/tree_node_test.go create mode 100644 ru/codes/go/pkg/vertex.go create mode 100644 ru/codes/java/.gitignore create mode 100644 ru/codes/java/chapter_array_and_linkedlist/array.java create mode 100644 ru/codes/java/chapter_array_and_linkedlist/linked_list.java create mode 100644 ru/codes/java/chapter_array_and_linkedlist/list.java create mode 100644 ru/codes/java/chapter_array_and_linkedlist/my_list.java create mode 100644 ru/codes/java/chapter_backtracking/n_queens.java create mode 100644 ru/codes/java/chapter_backtracking/permutations_i.java create mode 100644 ru/codes/java/chapter_backtracking/permutations_ii.java create mode 100644 ru/codes/java/chapter_backtracking/preorder_traversal_i_compact.java create mode 100644 ru/codes/java/chapter_backtracking/preorder_traversal_ii_compact.java create mode 100644 ru/codes/java/chapter_backtracking/preorder_traversal_iii_compact.java create mode 100644 ru/codes/java/chapter_backtracking/preorder_traversal_iii_template.java create mode 100644 ru/codes/java/chapter_backtracking/subset_sum_i.java create mode 100644 ru/codes/java/chapter_backtracking/subset_sum_i_naive.java create mode 100644 ru/codes/java/chapter_backtracking/subset_sum_ii.java create mode 100644 ru/codes/java/chapter_computational_complexity/iteration.java create mode 100644 ru/codes/java/chapter_computational_complexity/recursion.java create mode 100644 ru/codes/java/chapter_computational_complexity/space_complexity.java create mode 100644 ru/codes/java/chapter_computational_complexity/time_complexity.java create mode 100644 ru/codes/java/chapter_computational_complexity/worst_best_time_complexity.java create mode 100644 ru/codes/java/chapter_divide_and_conquer/binary_search_recur.java create mode 100644 ru/codes/java/chapter_divide_and_conquer/build_tree.java create mode 100644 ru/codes/java/chapter_divide_and_conquer/hanota.java create mode 100644 ru/codes/java/chapter_dynamic_programming/climbing_stairs_backtrack.java create mode 100644 ru/codes/java/chapter_dynamic_programming/climbing_stairs_constraint_dp.java create mode 100644 ru/codes/java/chapter_dynamic_programming/climbing_stairs_dfs.java create mode 100644 ru/codes/java/chapter_dynamic_programming/climbing_stairs_dfs_mem.java create mode 100644 ru/codes/java/chapter_dynamic_programming/climbing_stairs_dp.java create mode 100644 ru/codes/java/chapter_dynamic_programming/coin_change.java create mode 100644 ru/codes/java/chapter_dynamic_programming/coin_change_ii.java create mode 100644 ru/codes/java/chapter_dynamic_programming/edit_distance.java create mode 100644 ru/codes/java/chapter_dynamic_programming/knapsack.java create mode 100644 ru/codes/java/chapter_dynamic_programming/min_cost_climbing_stairs_dp.java create mode 100644 ru/codes/java/chapter_dynamic_programming/min_path_sum.java create mode 100644 ru/codes/java/chapter_dynamic_programming/unbounded_knapsack.java create mode 100644 ru/codes/java/chapter_graph/graph_adjacency_list.java create mode 100644 ru/codes/java/chapter_graph/graph_adjacency_matrix.java create mode 100644 ru/codes/java/chapter_graph/graph_bfs.java create mode 100644 ru/codes/java/chapter_graph/graph_dfs.java create mode 100644 ru/codes/java/chapter_greedy/coin_change_greedy.java create mode 100644 ru/codes/java/chapter_greedy/fractional_knapsack.java create mode 100644 ru/codes/java/chapter_greedy/max_capacity.java create mode 100644 ru/codes/java/chapter_greedy/max_product_cutting.java create mode 100644 ru/codes/java/chapter_hashing/array_hash_map.java create mode 100644 ru/codes/java/chapter_hashing/built_in_hash.java create mode 100644 ru/codes/java/chapter_hashing/hash_map.java create mode 100644 ru/codes/java/chapter_hashing/hash_map_chaining.java create mode 100644 ru/codes/java/chapter_hashing/hash_map_open_addressing.java create mode 100644 ru/codes/java/chapter_hashing/simple_hash.java create mode 100644 ru/codes/java/chapter_heap/heap.java create mode 100644 ru/codes/java/chapter_heap/my_heap.java create mode 100644 ru/codes/java/chapter_heap/top_k.java create mode 100644 ru/codes/java/chapter_searching/binary_search.java create mode 100644 ru/codes/java/chapter_searching/binary_search_edge.java create mode 100644 ru/codes/java/chapter_searching/binary_search_insertion.java create mode 100644 ru/codes/java/chapter_searching/hashing_search.java create mode 100644 ru/codes/java/chapter_searching/linear_search.java create mode 100644 ru/codes/java/chapter_searching/two_sum.java create mode 100644 ru/codes/java/chapter_sorting/bubble_sort.java create mode 100644 ru/codes/java/chapter_sorting/bucket_sort.java create mode 100644 ru/codes/java/chapter_sorting/counting_sort.java create mode 100644 ru/codes/java/chapter_sorting/heap_sort.java create mode 100644 ru/codes/java/chapter_sorting/insertion_sort.java create mode 100644 ru/codes/java/chapter_sorting/merge_sort.java create mode 100644 ru/codes/java/chapter_sorting/quick_sort.java create mode 100644 ru/codes/java/chapter_sorting/radix_sort.java create mode 100644 ru/codes/java/chapter_sorting/selection_sort.java create mode 100644 ru/codes/java/chapter_stack_and_queue/array_deque.java create mode 100644 ru/codes/java/chapter_stack_and_queue/array_queue.java create mode 100644 ru/codes/java/chapter_stack_and_queue/array_stack.java create mode 100644 ru/codes/java/chapter_stack_and_queue/deque.java create mode 100644 ru/codes/java/chapter_stack_and_queue/linkedlist_deque.java create mode 100644 ru/codes/java/chapter_stack_and_queue/linkedlist_queue.java create mode 100644 ru/codes/java/chapter_stack_and_queue/linkedlist_stack.java create mode 100644 ru/codes/java/chapter_stack_and_queue/queue.java create mode 100644 ru/codes/java/chapter_stack_and_queue/stack.java create mode 100644 ru/codes/java/chapter_tree/array_binary_tree.java create mode 100644 ru/codes/java/chapter_tree/avl_tree.java create mode 100644 ru/codes/java/chapter_tree/binary_search_tree.java create mode 100644 ru/codes/java/chapter_tree/binary_tree.java create mode 100644 ru/codes/java/chapter_tree/binary_tree_bfs.java create mode 100644 ru/codes/java/chapter_tree/binary_tree_dfs.java create mode 100644 ru/codes/java/utils/ListNode.java create mode 100644 ru/codes/java/utils/PrintUtil.java create mode 100644 ru/codes/java/utils/TreeNode.java create mode 100644 ru/codes/java/utils/Vertex.java create mode 100644 ru/codes/javascript/.prettierrc create mode 100644 ru/codes/javascript/chapter_array_and_linkedlist/array.js create mode 100644 ru/codes/javascript/chapter_array_and_linkedlist/linked_list.js create mode 100644 ru/codes/javascript/chapter_array_and_linkedlist/list.js create mode 100644 ru/codes/javascript/chapter_array_and_linkedlist/my_list.js create mode 100644 ru/codes/javascript/chapter_backtracking/n_queens.js create mode 100644 ru/codes/javascript/chapter_backtracking/permutations_i.js create mode 100644 ru/codes/javascript/chapter_backtracking/permutations_ii.js create mode 100644 ru/codes/javascript/chapter_backtracking/preorder_traversal_i_compact.js create mode 100644 ru/codes/javascript/chapter_backtracking/preorder_traversal_ii_compact.js create mode 100644 ru/codes/javascript/chapter_backtracking/preorder_traversal_iii_compact.js create mode 100644 ru/codes/javascript/chapter_backtracking/preorder_traversal_iii_template.js create mode 100644 ru/codes/javascript/chapter_backtracking/subset_sum_i.js create mode 100644 ru/codes/javascript/chapter_backtracking/subset_sum_i_naive.js create mode 100644 ru/codes/javascript/chapter_backtracking/subset_sum_ii.js create mode 100644 ru/codes/javascript/chapter_computational_complexity/iteration.js create mode 100644 ru/codes/javascript/chapter_computational_complexity/recursion.js create mode 100644 ru/codes/javascript/chapter_computational_complexity/space_complexity.js create mode 100644 ru/codes/javascript/chapter_computational_complexity/time_complexity.js create mode 100644 ru/codes/javascript/chapter_computational_complexity/worst_best_time_complexity.js create mode 100644 ru/codes/javascript/chapter_divide_and_conquer/binary_search_recur.js create mode 100644 ru/codes/javascript/chapter_divide_and_conquer/build_tree.js create mode 100644 ru/codes/javascript/chapter_divide_and_conquer/hanota.js create mode 100644 ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_backtrack.js create mode 100644 ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_constraint_dp.js create mode 100644 ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_dfs.js create mode 100644 ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_dfs_mem.js create mode 100644 ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_dp.js create mode 100644 ru/codes/javascript/chapter_dynamic_programming/coin_change.js create mode 100644 ru/codes/javascript/chapter_dynamic_programming/coin_change_ii.js create mode 100644 ru/codes/javascript/chapter_dynamic_programming/edit_distance.js create mode 100644 ru/codes/javascript/chapter_dynamic_programming/knapsack.js create mode 100644 ru/codes/javascript/chapter_dynamic_programming/min_cost_climbing_stairs_dp.js create mode 100644 ru/codes/javascript/chapter_dynamic_programming/min_path_sum.js create mode 100644 ru/codes/javascript/chapter_dynamic_programming/unbounded_knapsack.js create mode 100644 ru/codes/javascript/chapter_graph/graph_adjacency_list.js create mode 100644 ru/codes/javascript/chapter_graph/graph_adjacency_matrix.js create mode 100644 ru/codes/javascript/chapter_graph/graph_bfs.js create mode 100644 ru/codes/javascript/chapter_graph/graph_dfs.js create mode 100644 ru/codes/javascript/chapter_greedy/coin_change_greedy.js create mode 100644 ru/codes/javascript/chapter_greedy/fractional_knapsack.js create mode 100644 ru/codes/javascript/chapter_greedy/max_capacity.js create mode 100644 ru/codes/javascript/chapter_greedy/max_product_cutting.js create mode 100644 ru/codes/javascript/chapter_hashing/array_hash_map.js create mode 100644 ru/codes/javascript/chapter_hashing/hash_map.js create mode 100644 ru/codes/javascript/chapter_hashing/hash_map_chaining.js create mode 100644 ru/codes/javascript/chapter_hashing/hash_map_open_addressing.js create mode 100644 ru/codes/javascript/chapter_hashing/simple_hash.js create mode 100644 ru/codes/javascript/chapter_heap/my_heap.js create mode 100644 ru/codes/javascript/chapter_heap/top_k.js create mode 100644 ru/codes/javascript/chapter_searching/binary_search.js create mode 100644 ru/codes/javascript/chapter_searching/binary_search_edge.js create mode 100644 ru/codes/javascript/chapter_searching/binary_search_insertion.js create mode 100644 ru/codes/javascript/chapter_searching/hashing_search.js create mode 100644 ru/codes/javascript/chapter_searching/linear_search.js create mode 100644 ru/codes/javascript/chapter_searching/two_sum.js create mode 100644 ru/codes/javascript/chapter_sorting/bubble_sort.js create mode 100644 ru/codes/javascript/chapter_sorting/bucket_sort.js create mode 100644 ru/codes/javascript/chapter_sorting/counting_sort.js create mode 100644 ru/codes/javascript/chapter_sorting/heap_sort.js create mode 100644 ru/codes/javascript/chapter_sorting/insertion_sort.js create mode 100644 ru/codes/javascript/chapter_sorting/merge_sort.js create mode 100644 ru/codes/javascript/chapter_sorting/quick_sort.js create mode 100644 ru/codes/javascript/chapter_sorting/radix_sort.js create mode 100644 ru/codes/javascript/chapter_sorting/selection_sort.js create mode 100644 ru/codes/javascript/chapter_stack_and_queue/array_deque.js create mode 100644 ru/codes/javascript/chapter_stack_and_queue/array_queue.js create mode 100644 ru/codes/javascript/chapter_stack_and_queue/array_stack.js create mode 100644 ru/codes/javascript/chapter_stack_and_queue/deque.js create mode 100644 ru/codes/javascript/chapter_stack_and_queue/linkedlist_deque.js create mode 100644 ru/codes/javascript/chapter_stack_and_queue/linkedlist_queue.js create mode 100644 ru/codes/javascript/chapter_stack_and_queue/linkedlist_stack.js create mode 100644 ru/codes/javascript/chapter_stack_and_queue/queue.js create mode 100644 ru/codes/javascript/chapter_stack_and_queue/stack.js create mode 100644 ru/codes/javascript/chapter_tree/array_binary_tree.js create mode 100644 ru/codes/javascript/chapter_tree/avl_tree.js create mode 100644 ru/codes/javascript/chapter_tree/binary_search_tree.js create mode 100644 ru/codes/javascript/chapter_tree/binary_tree.js create mode 100644 ru/codes/javascript/chapter_tree/binary_tree_bfs.js create mode 100644 ru/codes/javascript/chapter_tree/binary_tree_dfs.js create mode 100644 ru/codes/javascript/modules/ListNode.js create mode 100644 ru/codes/javascript/modules/PrintUtil.js create mode 100644 ru/codes/javascript/modules/TreeNode.js create mode 100644 ru/codes/javascript/modules/Vertex.js create mode 100644 ru/codes/javascript/test_all.js create mode 100644 ru/codes/kotlin/chapter_array_and_linkedlist/array.kt create mode 100644 ru/codes/kotlin/chapter_array_and_linkedlist/linked_list.kt create mode 100644 ru/codes/kotlin/chapter_array_and_linkedlist/list.kt create mode 100644 ru/codes/kotlin/chapter_array_and_linkedlist/my_list.kt create mode 100644 ru/codes/kotlin/chapter_backtracking/n_queens.kt create mode 100644 ru/codes/kotlin/chapter_backtracking/permutations_i.kt create mode 100644 ru/codes/kotlin/chapter_backtracking/permutations_ii.kt create mode 100644 ru/codes/kotlin/chapter_backtracking/preorder_traversal_i_compact.kt create mode 100644 ru/codes/kotlin/chapter_backtracking/preorder_traversal_ii_compact.kt create mode 100644 ru/codes/kotlin/chapter_backtracking/preorder_traversal_iii_compact.kt create mode 100644 ru/codes/kotlin/chapter_backtracking/preorder_traversal_iii_template.kt create mode 100644 ru/codes/kotlin/chapter_backtracking/subset_sum_i.kt create mode 100644 ru/codes/kotlin/chapter_backtracking/subset_sum_i_naive.kt create mode 100644 ru/codes/kotlin/chapter_backtracking/subset_sum_ii.kt create mode 100644 ru/codes/kotlin/chapter_computational_complexity/iteration.kt create mode 100644 ru/codes/kotlin/chapter_computational_complexity/recursion.kt create mode 100644 ru/codes/kotlin/chapter_computational_complexity/space_complexity.kt create mode 100644 ru/codes/kotlin/chapter_computational_complexity/time_complexity.kt create mode 100644 ru/codes/kotlin/chapter_computational_complexity/worst_best_time_complexity.kt create mode 100644 ru/codes/kotlin/chapter_divide_and_conquer/binary_search_recur.kt create mode 100644 ru/codes/kotlin/chapter_divide_and_conquer/build_tree.kt create mode 100644 ru/codes/kotlin/chapter_divide_and_conquer/hanota.kt create mode 100644 ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_backtrack.kt create mode 100644 ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_constraint_dp.kt create mode 100644 ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_dfs.kt create mode 100644 ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_dfs_mem.kt create mode 100644 ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_dp.kt create mode 100644 ru/codes/kotlin/chapter_dynamic_programming/coin_change.kt create mode 100644 ru/codes/kotlin/chapter_dynamic_programming/coin_change_ii.kt create mode 100644 ru/codes/kotlin/chapter_dynamic_programming/edit_distance.kt create mode 100644 ru/codes/kotlin/chapter_dynamic_programming/knapsack.kt create mode 100644 ru/codes/kotlin/chapter_dynamic_programming/min_cost_climbing_stairs_dp.kt create mode 100644 ru/codes/kotlin/chapter_dynamic_programming/min_path_sum.kt create mode 100644 ru/codes/kotlin/chapter_dynamic_programming/unbounded_knapsack.kt create mode 100644 ru/codes/kotlin/chapter_graph/graph_adjacency_list.kt create mode 100644 ru/codes/kotlin/chapter_graph/graph_adjacency_matrix.kt create mode 100644 ru/codes/kotlin/chapter_graph/graph_bfs.kt create mode 100644 ru/codes/kotlin/chapter_graph/graph_dfs.kt create mode 100644 ru/codes/kotlin/chapter_greedy/coin_change_greedy.kt create mode 100644 ru/codes/kotlin/chapter_greedy/fractional_knapsack.kt create mode 100644 ru/codes/kotlin/chapter_greedy/max_capacity.kt create mode 100644 ru/codes/kotlin/chapter_greedy/max_product_cutting.kt create mode 100644 ru/codes/kotlin/chapter_hashing/array_hash_map.kt create mode 100644 ru/codes/kotlin/chapter_hashing/built_in_hash.kt create mode 100644 ru/codes/kotlin/chapter_hashing/hash_map.kt create mode 100644 ru/codes/kotlin/chapter_hashing/hash_map_chaining.kt create mode 100644 ru/codes/kotlin/chapter_hashing/hash_map_open_addressing.kt create mode 100644 ru/codes/kotlin/chapter_hashing/simple_hash.kt create mode 100644 ru/codes/kotlin/chapter_heap/heap.kt create mode 100644 ru/codes/kotlin/chapter_heap/my_heap.kt create mode 100644 ru/codes/kotlin/chapter_heap/top_k.kt create mode 100644 ru/codes/kotlin/chapter_searching/binary_search.kt create mode 100644 ru/codes/kotlin/chapter_searching/binary_search_edge.kt create mode 100644 ru/codes/kotlin/chapter_searching/binary_search_insertion.kt create mode 100644 ru/codes/kotlin/chapter_searching/hashing_search.kt create mode 100644 ru/codes/kotlin/chapter_searching/linear_search.kt create mode 100644 ru/codes/kotlin/chapter_searching/two_sum.kt create mode 100644 ru/codes/kotlin/chapter_sorting/bubble_sort.kt create mode 100644 ru/codes/kotlin/chapter_sorting/bucket_sort.kt create mode 100644 ru/codes/kotlin/chapter_sorting/counting_sort.kt create mode 100644 ru/codes/kotlin/chapter_sorting/heap_sort.kt create mode 100644 ru/codes/kotlin/chapter_sorting/insertion_sort.kt create mode 100644 ru/codes/kotlin/chapter_sorting/merge_sort.kt create mode 100644 ru/codes/kotlin/chapter_sorting/quick_sort.kt create mode 100644 ru/codes/kotlin/chapter_sorting/radix_sort.kt create mode 100644 ru/codes/kotlin/chapter_sorting/selection_sort.kt create mode 100644 ru/codes/kotlin/chapter_stack_and_queue/array_deque.kt create mode 100644 ru/codes/kotlin/chapter_stack_and_queue/array_queue.kt create mode 100644 ru/codes/kotlin/chapter_stack_and_queue/array_stack.kt create mode 100644 ru/codes/kotlin/chapter_stack_and_queue/deque.kt create mode 100644 ru/codes/kotlin/chapter_stack_and_queue/linkedlist_deque.kt create mode 100644 ru/codes/kotlin/chapter_stack_and_queue/linkedlist_queue.kt create mode 100644 ru/codes/kotlin/chapter_stack_and_queue/linkedlist_stack.kt create mode 100644 ru/codes/kotlin/chapter_stack_and_queue/queue.kt create mode 100644 ru/codes/kotlin/chapter_stack_and_queue/stack.kt create mode 100644 ru/codes/kotlin/chapter_tree/array_binary_tree.kt create mode 100644 ru/codes/kotlin/chapter_tree/avl_tree.kt create mode 100644 ru/codes/kotlin/chapter_tree/binary_search_tree.kt create mode 100644 ru/codes/kotlin/chapter_tree/binary_tree.kt create mode 100644 ru/codes/kotlin/chapter_tree/binary_tree_bfs.kt create mode 100644 ru/codes/kotlin/chapter_tree/binary_tree_dfs.kt create mode 100644 ru/codes/kotlin/utils/ListNode.kt create mode 100644 ru/codes/kotlin/utils/PrintUtil.kt create mode 100644 ru/codes/kotlin/utils/TreeNode.kt create mode 100644 ru/codes/kotlin/utils/Vertex.kt create mode 100644 ru/codes/python/.gitignore create mode 100644 ru/codes/python/chapter_array_and_linkedlist/array.py create mode 100644 ru/codes/python/chapter_array_and_linkedlist/linked_list.py create mode 100644 ru/codes/python/chapter_array_and_linkedlist/list.py create mode 100644 ru/codes/python/chapter_array_and_linkedlist/my_list.py create mode 100644 ru/codes/python/chapter_backtracking/n_queens.py create mode 100644 ru/codes/python/chapter_backtracking/permutations_i.py create mode 100644 ru/codes/python/chapter_backtracking/permutations_ii.py create mode 100644 ru/codes/python/chapter_backtracking/preorder_traversal_i_compact.py create mode 100644 ru/codes/python/chapter_backtracking/preorder_traversal_ii_compact.py create mode 100644 ru/codes/python/chapter_backtracking/preorder_traversal_iii_compact.py create mode 100644 ru/codes/python/chapter_backtracking/preorder_traversal_iii_template.py create mode 100644 ru/codes/python/chapter_backtracking/subset_sum_i.py create mode 100644 ru/codes/python/chapter_backtracking/subset_sum_i_naive.py create mode 100644 ru/codes/python/chapter_backtracking/subset_sum_ii.py create mode 100644 ru/codes/python/chapter_computational_complexity/iteration.py create mode 100644 ru/codes/python/chapter_computational_complexity/recursion.py create mode 100644 ru/codes/python/chapter_computational_complexity/space_complexity.py create mode 100644 ru/codes/python/chapter_computational_complexity/time_complexity.py create mode 100644 ru/codes/python/chapter_computational_complexity/worst_best_time_complexity.py create mode 100644 ru/codes/python/chapter_divide_and_conquer/binary_search_recur.py create mode 100644 ru/codes/python/chapter_divide_and_conquer/build_tree.py create mode 100644 ru/codes/python/chapter_divide_and_conquer/hanota.py create mode 100644 ru/codes/python/chapter_dynamic_programming/climbing_stairs_backtrack.py create mode 100644 ru/codes/python/chapter_dynamic_programming/climbing_stairs_constraint_dp.py create mode 100644 ru/codes/python/chapter_dynamic_programming/climbing_stairs_dfs.py create mode 100644 ru/codes/python/chapter_dynamic_programming/climbing_stairs_dfs_mem.py create mode 100644 ru/codes/python/chapter_dynamic_programming/climbing_stairs_dp.py create mode 100644 ru/codes/python/chapter_dynamic_programming/coin_change.py create mode 100644 ru/codes/python/chapter_dynamic_programming/coin_change_ii.py create mode 100644 ru/codes/python/chapter_dynamic_programming/edit_distance.py create mode 100644 ru/codes/python/chapter_dynamic_programming/knapsack.py create mode 100644 ru/codes/python/chapter_dynamic_programming/min_cost_climbing_stairs_dp.py create mode 100644 ru/codes/python/chapter_dynamic_programming/min_path_sum.py create mode 100644 ru/codes/python/chapter_dynamic_programming/unbounded_knapsack.py create mode 100644 ru/codes/python/chapter_graph/graph_adjacency_list.py create mode 100644 ru/codes/python/chapter_graph/graph_adjacency_matrix.py create mode 100644 ru/codes/python/chapter_graph/graph_bfs.py create mode 100644 ru/codes/python/chapter_graph/graph_dfs.py create mode 100644 ru/codes/python/chapter_greedy/coin_change_greedy.py create mode 100644 ru/codes/python/chapter_greedy/fractional_knapsack.py create mode 100644 ru/codes/python/chapter_greedy/max_capacity.py create mode 100644 ru/codes/python/chapter_greedy/max_product_cutting.py create mode 100644 ru/codes/python/chapter_hashing/array_hash_map.py create mode 100644 ru/codes/python/chapter_hashing/built_in_hash.py create mode 100644 ru/codes/python/chapter_hashing/hash_map.py create mode 100644 ru/codes/python/chapter_hashing/hash_map_chaining.py create mode 100644 ru/codes/python/chapter_hashing/hash_map_open_addressing.py create mode 100644 ru/codes/python/chapter_hashing/simple_hash.py create mode 100644 ru/codes/python/chapter_heap/heap.py create mode 100644 ru/codes/python/chapter_heap/my_heap.py create mode 100644 ru/codes/python/chapter_heap/top_k.py create mode 100644 ru/codes/python/chapter_searching/binary_search.py create mode 100644 ru/codes/python/chapter_searching/binary_search_edge.py create mode 100644 ru/codes/python/chapter_searching/binary_search_insertion.py create mode 100644 ru/codes/python/chapter_searching/hashing_search.py create mode 100644 ru/codes/python/chapter_searching/linear_search.py create mode 100644 ru/codes/python/chapter_searching/two_sum.py create mode 100644 ru/codes/python/chapter_sorting/bubble_sort.py create mode 100644 ru/codes/python/chapter_sorting/bucket_sort.py create mode 100644 ru/codes/python/chapter_sorting/counting_sort.py create mode 100644 ru/codes/python/chapter_sorting/heap_sort.py create mode 100644 ru/codes/python/chapter_sorting/insertion_sort.py create mode 100644 ru/codes/python/chapter_sorting/merge_sort.py create mode 100644 ru/codes/python/chapter_sorting/quick_sort.py create mode 100644 ru/codes/python/chapter_sorting/radix_sort.py create mode 100644 ru/codes/python/chapter_sorting/selection_sort.py create mode 100644 ru/codes/python/chapter_stack_and_queue/array_deque.py create mode 100644 ru/codes/python/chapter_stack_and_queue/array_queue.py create mode 100644 ru/codes/python/chapter_stack_and_queue/array_stack.py create mode 100644 ru/codes/python/chapter_stack_and_queue/deque.py create mode 100644 ru/codes/python/chapter_stack_and_queue/linkedlist_deque.py create mode 100644 ru/codes/python/chapter_stack_and_queue/linkedlist_queue.py create mode 100644 ru/codes/python/chapter_stack_and_queue/linkedlist_stack.py create mode 100644 ru/codes/python/chapter_stack_and_queue/queue.py create mode 100644 ru/codes/python/chapter_stack_and_queue/stack.py create mode 100644 ru/codes/python/chapter_tree/array_binary_tree.py create mode 100644 ru/codes/python/chapter_tree/avl_tree.py create mode 100644 ru/codes/python/chapter_tree/binary_search_tree.py create mode 100644 ru/codes/python/chapter_tree/binary_tree.py create mode 100644 ru/codes/python/chapter_tree/binary_tree_bfs.py create mode 100644 ru/codes/python/chapter_tree/binary_tree_dfs.py create mode 100644 ru/codes/python/modules/__init__.py create mode 100644 ru/codes/python/modules/list_node.py create mode 100644 ru/codes/python/modules/print_util.py create mode 100644 ru/codes/python/modules/tree_node.py create mode 100644 ru/codes/python/modules/vertex.py create mode 100644 ru/codes/python/test_all.py create mode 100644 ru/codes/pythontutor/chapter_array_and_linkedlist/array.md create mode 100644 ru/codes/pythontutor/chapter_array_and_linkedlist/linked_list.md create mode 100644 ru/codes/pythontutor/chapter_array_and_linkedlist/my_list.md create mode 100644 ru/codes/pythontutor/chapter_backtracking/n_queens.md create mode 100644 ru/codes/pythontutor/chapter_backtracking/permutations_i.md create mode 100644 ru/codes/pythontutor/chapter_backtracking/permutations_ii.md create mode 100644 ru/codes/pythontutor/chapter_backtracking/preorder_traversal_i_compact.md create mode 100644 ru/codes/pythontutor/chapter_backtracking/preorder_traversal_ii_compact.md create mode 100644 ru/codes/pythontutor/chapter_backtracking/preorder_traversal_iii_compact.md create mode 100644 ru/codes/pythontutor/chapter_backtracking/preorder_traversal_iii_template.md create mode 100644 ru/codes/pythontutor/chapter_backtracking/subset_sum_i.md create mode 100644 ru/codes/pythontutor/chapter_backtracking/subset_sum_i_naive.md create mode 100644 ru/codes/pythontutor/chapter_backtracking/subset_sum_ii.md create mode 100644 ru/codes/pythontutor/chapter_computational_complexity/iteration.md create mode 100644 ru/codes/pythontutor/chapter_computational_complexity/recursion.md create mode 100644 ru/codes/pythontutor/chapter_computational_complexity/space_complexity.md create mode 100644 ru/codes/pythontutor/chapter_computational_complexity/time_complexity.md create mode 100644 ru/codes/pythontutor/chapter_computational_complexity/worst_best_time_complexity.md create mode 100644 ru/codes/pythontutor/chapter_divide_and_conquer/binary_search_recur.md create mode 100644 ru/codes/pythontutor/chapter_divide_and_conquer/build_tree.md create mode 100644 ru/codes/pythontutor/chapter_divide_and_conquer/hanota.md create mode 100644 ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_backtrack.md create mode 100644 ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_constraint_dp.md create mode 100644 ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_dfs.md create mode 100644 ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_dfs_mem.md create mode 100644 ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_dp.md create mode 100644 ru/codes/pythontutor/chapter_dynamic_programming/coin_change.md create mode 100644 ru/codes/pythontutor/chapter_dynamic_programming/coin_change_ii.md create mode 100644 ru/codes/pythontutor/chapter_dynamic_programming/edit_distance.md create mode 100644 ru/codes/pythontutor/chapter_dynamic_programming/knapsack.md create mode 100644 ru/codes/pythontutor/chapter_dynamic_programming/min_cost_climbing_stairs_dp.md create mode 100644 ru/codes/pythontutor/chapter_dynamic_programming/min_path_sum.md create mode 100644 ru/codes/pythontutor/chapter_dynamic_programming/unbounded_knapsack.md create mode 100644 ru/codes/pythontutor/chapter_graph/graph_adjacency_list.md create mode 100644 ru/codes/pythontutor/chapter_graph/graph_adjacency_matrix.md create mode 100644 ru/codes/pythontutor/chapter_graph/graph_bfs.md create mode 100644 ru/codes/pythontutor/chapter_graph/graph_dfs.md create mode 100644 ru/codes/pythontutor/chapter_greedy/coin_change_greedy.md create mode 100644 ru/codes/pythontutor/chapter_greedy/fractional_knapsack.md create mode 100644 ru/codes/pythontutor/chapter_greedy/max_capacity.md create mode 100644 ru/codes/pythontutor/chapter_greedy/max_product_cutting.md create mode 100644 ru/codes/pythontutor/chapter_hashing/array_hash_map.md create mode 100644 ru/codes/pythontutor/chapter_hashing/hash_map_chaining.md create mode 100644 ru/codes/pythontutor/chapter_hashing/simple_hash.md create mode 100644 ru/codes/pythontutor/chapter_heap/my_heap.md create mode 100644 ru/codes/pythontutor/chapter_heap/top_k.md create mode 100644 ru/codes/pythontutor/chapter_searching/binary_search.md create mode 100644 ru/codes/pythontutor/chapter_searching/binary_search_edge.md create mode 100644 ru/codes/pythontutor/chapter_searching/binary_search_insertion.md create mode 100644 ru/codes/pythontutor/chapter_searching/two_sum.md create mode 100644 ru/codes/pythontutor/chapter_sorting/bubble_sort.md create mode 100644 ru/codes/pythontutor/chapter_sorting/bucket_sort.md create mode 100644 ru/codes/pythontutor/chapter_sorting/counting_sort.md create mode 100644 ru/codes/pythontutor/chapter_sorting/heap_sort.md create mode 100644 ru/codes/pythontutor/chapter_sorting/insertion_sort.md create mode 100644 ru/codes/pythontutor/chapter_sorting/merge_sort.md create mode 100644 ru/codes/pythontutor/chapter_sorting/quick_sort.md create mode 100644 ru/codes/pythontutor/chapter_sorting/radix_sort.md create mode 100644 ru/codes/pythontutor/chapter_sorting/selection_sort.md create mode 100644 ru/codes/pythontutor/chapter_stack_and_queue/array_queue.md create mode 100644 ru/codes/pythontutor/chapter_stack_and_queue/array_stack.md create mode 100644 ru/codes/pythontutor/chapter_stack_and_queue/linkedlist_queue.md create mode 100644 ru/codes/pythontutor/chapter_stack_and_queue/linkedlist_stack.md create mode 100644 ru/codes/pythontutor/chapter_tree/array_binary_tree.md create mode 100644 ru/codes/pythontutor/chapter_tree/binary_search_tree.md create mode 100644 ru/codes/pythontutor/chapter_tree/binary_tree_bfs.md create mode 100644 ru/codes/pythontutor/chapter_tree/binary_tree_dfs.md create mode 100644 ru/codes/ruby/chapter_array_and_linkedlist/array.rb create mode 100644 ru/codes/ruby/chapter_array_and_linkedlist/linked_list.rb create mode 100644 ru/codes/ruby/chapter_array_and_linkedlist/list.rb create mode 100644 ru/codes/ruby/chapter_array_and_linkedlist/my_list.rb create mode 100644 ru/codes/ruby/chapter_backtracking/n_queens.rb create mode 100644 ru/codes/ruby/chapter_backtracking/permutations_i.rb create mode 100644 ru/codes/ruby/chapter_backtracking/permutations_ii.rb create mode 100644 ru/codes/ruby/chapter_backtracking/preorder_traversal_i_compact.rb create mode 100644 ru/codes/ruby/chapter_backtracking/preorder_traversal_ii_compact.rb create mode 100644 ru/codes/ruby/chapter_backtracking/preorder_traversal_iii_compact.rb create mode 100644 ru/codes/ruby/chapter_backtracking/preorder_traversal_iii_template.rb create mode 100644 ru/codes/ruby/chapter_backtracking/subset_sum_i.rb create mode 100644 ru/codes/ruby/chapter_backtracking/subset_sum_i_naive.rb create mode 100644 ru/codes/ruby/chapter_backtracking/subset_sum_ii.rb create mode 100644 ru/codes/ruby/chapter_computational_complexity/iteration.rb create mode 100644 ru/codes/ruby/chapter_computational_complexity/recursion.rb create mode 100644 ru/codes/ruby/chapter_computational_complexity/space_complexity.rb create mode 100644 ru/codes/ruby/chapter_computational_complexity/time_complexity.rb create mode 100644 ru/codes/ruby/chapter_computational_complexity/worst_best_time_complexity.rb create mode 100644 ru/codes/ruby/chapter_divide_and_conquer/binary_search_recur.rb create mode 100644 ru/codes/ruby/chapter_divide_and_conquer/build_tree.rb create mode 100644 ru/codes/ruby/chapter_divide_and_conquer/hanota.rb create mode 100644 ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_backtrack.rb create mode 100644 ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_constraint_dp.rb create mode 100644 ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_dfs.rb create mode 100644 ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_dfs_mem.rb create mode 100644 ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_dp.rb create mode 100644 ru/codes/ruby/chapter_dynamic_programming/coin_change.rb create mode 100644 ru/codes/ruby/chapter_dynamic_programming/coin_change_ii.rb create mode 100644 ru/codes/ruby/chapter_dynamic_programming/edit_distance.rb create mode 100644 ru/codes/ruby/chapter_dynamic_programming/knapsack.rb create mode 100644 ru/codes/ruby/chapter_dynamic_programming/min_cost_climbing_stairs_dp.rb create mode 100644 ru/codes/ruby/chapter_dynamic_programming/min_path_sum.rb create mode 100644 ru/codes/ruby/chapter_dynamic_programming/unbounded_knapsack.rb create mode 100644 ru/codes/ruby/chapter_graph/graph_adjacency_list.rb create mode 100644 ru/codes/ruby/chapter_graph/graph_adjacency_matrix.rb create mode 100644 ru/codes/ruby/chapter_graph/graph_bfs.rb create mode 100644 ru/codes/ruby/chapter_graph/graph_dfs.rb create mode 100644 ru/codes/ruby/chapter_greedy/coin_change_greedy.rb create mode 100644 ru/codes/ruby/chapter_greedy/fractional_knapsack.rb create mode 100644 ru/codes/ruby/chapter_greedy/max_capacity.rb create mode 100644 ru/codes/ruby/chapter_greedy/max_product_cutting.rb create mode 100644 ru/codes/ruby/chapter_hashing/array_hash_map.rb create mode 100644 ru/codes/ruby/chapter_hashing/built_in_hash.rb create mode 100644 ru/codes/ruby/chapter_hashing/hash_map.rb create mode 100644 ru/codes/ruby/chapter_hashing/hash_map_chaining.rb create mode 100644 ru/codes/ruby/chapter_hashing/hash_map_open_addressing.rb create mode 100644 ru/codes/ruby/chapter_hashing/simple_hash.rb create mode 100644 ru/codes/ruby/chapter_heap/my_heap.rb create mode 100644 ru/codes/ruby/chapter_heap/top_k.rb create mode 100644 ru/codes/ruby/chapter_searching/binary_search.rb create mode 100644 ru/codes/ruby/chapter_searching/binary_search_edge.rb create mode 100644 ru/codes/ruby/chapter_searching/binary_search_insertion.rb create mode 100644 ru/codes/ruby/chapter_searching/hashing_search.rb create mode 100644 ru/codes/ruby/chapter_searching/linear_search.rb create mode 100644 ru/codes/ruby/chapter_searching/two_sum.rb create mode 100644 ru/codes/ruby/chapter_sorting/bubble_sort.rb create mode 100644 ru/codes/ruby/chapter_sorting/bucket_sort.rb create mode 100644 ru/codes/ruby/chapter_sorting/counting_sort.rb create mode 100644 ru/codes/ruby/chapter_sorting/heap_sort.rb create mode 100644 ru/codes/ruby/chapter_sorting/insertion_sort.rb create mode 100644 ru/codes/ruby/chapter_sorting/merge_sort.rb create mode 100644 ru/codes/ruby/chapter_sorting/quick_sort.rb create mode 100644 ru/codes/ruby/chapter_sorting/radix_sort.rb create mode 100644 ru/codes/ruby/chapter_sorting/selection_sort.rb create mode 100644 ru/codes/ruby/chapter_stack_and_queue/array_deque.rb create mode 100644 ru/codes/ruby/chapter_stack_and_queue/array_queue.rb create mode 100644 ru/codes/ruby/chapter_stack_and_queue/array_stack.rb create mode 100644 ru/codes/ruby/chapter_stack_and_queue/deque.rb create mode 100644 ru/codes/ruby/chapter_stack_and_queue/linkedlist_deque.rb create mode 100644 ru/codes/ruby/chapter_stack_and_queue/linkedlist_queue.rb create mode 100644 ru/codes/ruby/chapter_stack_and_queue/linkedlist_stack.rb create mode 100644 ru/codes/ruby/chapter_stack_and_queue/queue.rb create mode 100644 ru/codes/ruby/chapter_stack_and_queue/stack.rb create mode 100644 ru/codes/ruby/chapter_tree/array_binary_tree.rb create mode 100644 ru/codes/ruby/chapter_tree/avl_tree.rb create mode 100644 ru/codes/ruby/chapter_tree/binary_search_tree.rb create mode 100644 ru/codes/ruby/chapter_tree/binary_tree.rb create mode 100644 ru/codes/ruby/chapter_tree/binary_tree_bfs.rb create mode 100644 ru/codes/ruby/chapter_tree/binary_tree_dfs.rb create mode 100644 ru/codes/ruby/test_all.rb create mode 100644 ru/codes/ruby/utils/list_node.rb create mode 100644 ru/codes/ruby/utils/print_util.rb create mode 100644 ru/codes/ruby/utils/tree_node.rb create mode 100644 ru/codes/ruby/utils/vertex.rb create mode 100644 ru/codes/rust/.gitignore create mode 100644 ru/codes/rust/Cargo.toml create mode 100644 ru/codes/rust/chapter_array_and_linkedlist/array.rs create mode 100644 ru/codes/rust/chapter_array_and_linkedlist/linked_list.rs create mode 100644 ru/codes/rust/chapter_array_and_linkedlist/list.rs create mode 100644 ru/codes/rust/chapter_array_and_linkedlist/my_list.rs create mode 100644 ru/codes/rust/chapter_backtracking/n_queens.rs create mode 100644 ru/codes/rust/chapter_backtracking/permutations_i.rs create mode 100644 ru/codes/rust/chapter_backtracking/permutations_ii.rs create mode 100644 ru/codes/rust/chapter_backtracking/preorder_traversal_i_compact.rs create mode 100644 ru/codes/rust/chapter_backtracking/preorder_traversal_ii_compact.rs create mode 100644 ru/codes/rust/chapter_backtracking/preorder_traversal_iii_compact.rs create mode 100644 ru/codes/rust/chapter_backtracking/preorder_traversal_iii_template.rs create mode 100644 ru/codes/rust/chapter_backtracking/subset_sum_i.rs create mode 100644 ru/codes/rust/chapter_backtracking/subset_sum_i_naive.rs create mode 100644 ru/codes/rust/chapter_backtracking/subset_sum_ii.rs create mode 100644 ru/codes/rust/chapter_computational_complexity/iteration.rs create mode 100644 ru/codes/rust/chapter_computational_complexity/recursion.rs create mode 100644 ru/codes/rust/chapter_computational_complexity/space_complexity.rs create mode 100644 ru/codes/rust/chapter_computational_complexity/time_complexity.rs create mode 100644 ru/codes/rust/chapter_computational_complexity/worst_best_time_complexity.rs create mode 100644 ru/codes/rust/chapter_divide_and_conquer/binary_search_recur.rs create mode 100644 ru/codes/rust/chapter_divide_and_conquer/build_tree.rs create mode 100644 ru/codes/rust/chapter_divide_and_conquer/hanota.rs create mode 100644 ru/codes/rust/chapter_dynamic_programming/climbing_stairs_backtrack.rs create mode 100644 ru/codes/rust/chapter_dynamic_programming/climbing_stairs_constraint_dp.rs create mode 100644 ru/codes/rust/chapter_dynamic_programming/climbing_stairs_dfs.rs create mode 100644 ru/codes/rust/chapter_dynamic_programming/climbing_stairs_dfs_mem.rs create mode 100644 ru/codes/rust/chapter_dynamic_programming/climbing_stairs_dp.rs create mode 100644 ru/codes/rust/chapter_dynamic_programming/coin_change.rs create mode 100644 ru/codes/rust/chapter_dynamic_programming/coin_change_ii.rs create mode 100644 ru/codes/rust/chapter_dynamic_programming/edit_distance.rs create mode 100644 ru/codes/rust/chapter_dynamic_programming/knapsack.rs create mode 100644 ru/codes/rust/chapter_dynamic_programming/min_cost_climbing_stairs_dp.rs create mode 100644 ru/codes/rust/chapter_dynamic_programming/min_path_sum.rs create mode 100644 ru/codes/rust/chapter_dynamic_programming/unbounded_knapsack.rs create mode 100644 ru/codes/rust/chapter_graph/graph_adjacency_list.rs create mode 100644 ru/codes/rust/chapter_graph/graph_adjacency_matrix.rs create mode 100644 ru/codes/rust/chapter_graph/graph_bfs.rs create mode 100644 ru/codes/rust/chapter_graph/graph_dfs.rs create mode 100644 ru/codes/rust/chapter_greedy/coin_change_greedy.rs create mode 100644 ru/codes/rust/chapter_greedy/fractional_knapsack.rs create mode 100644 ru/codes/rust/chapter_greedy/max_capacity.rs create mode 100644 ru/codes/rust/chapter_greedy/max_product_cutting.rs create mode 100644 ru/codes/rust/chapter_hashing/array_hash_map.rs create mode 100644 ru/codes/rust/chapter_hashing/build_in_hash.rs create mode 100644 ru/codes/rust/chapter_hashing/hash_map.rs create mode 100644 ru/codes/rust/chapter_hashing/hash_map_chaining.rs create mode 100644 ru/codes/rust/chapter_hashing/hash_map_open_addressing.rs create mode 100644 ru/codes/rust/chapter_hashing/simple_hash.rs create mode 100644 ru/codes/rust/chapter_heap/heap.rs create mode 100644 ru/codes/rust/chapter_heap/my_heap.rs create mode 100644 ru/codes/rust/chapter_heap/top_k.rs create mode 100644 ru/codes/rust/chapter_searching/binary_search.rs create mode 100644 ru/codes/rust/chapter_searching/binary_search_edge.rs create mode 100644 ru/codes/rust/chapter_searching/binary_search_insertion.rs create mode 100644 ru/codes/rust/chapter_searching/hashing_search.rs create mode 100644 ru/codes/rust/chapter_searching/linear_search.rs create mode 100644 ru/codes/rust/chapter_searching/two_sum.rs create mode 100644 ru/codes/rust/chapter_sorting/bubble_sort.rs create mode 100644 ru/codes/rust/chapter_sorting/bucket_sort.rs create mode 100644 ru/codes/rust/chapter_sorting/counting_sort.rs create mode 100644 ru/codes/rust/chapter_sorting/heap_sort.rs create mode 100644 ru/codes/rust/chapter_sorting/insertion_sort.rs create mode 100644 ru/codes/rust/chapter_sorting/merge_sort.rs create mode 100644 ru/codes/rust/chapter_sorting/quick_sort.rs create mode 100644 ru/codes/rust/chapter_sorting/radix_sort.rs create mode 100644 ru/codes/rust/chapter_sorting/selection_sort.rs create mode 100644 ru/codes/rust/chapter_stack_and_queue/array_deque.rs create mode 100644 ru/codes/rust/chapter_stack_and_queue/array_queue.rs create mode 100644 ru/codes/rust/chapter_stack_and_queue/array_stack.rs create mode 100644 ru/codes/rust/chapter_stack_and_queue/deque.rs create mode 100644 ru/codes/rust/chapter_stack_and_queue/linkedlist_deque.rs create mode 100644 ru/codes/rust/chapter_stack_and_queue/linkedlist_queue.rs create mode 100644 ru/codes/rust/chapter_stack_and_queue/linkedlist_stack.rs create mode 100644 ru/codes/rust/chapter_stack_and_queue/queue.rs create mode 100644 ru/codes/rust/chapter_stack_and_queue/stack.rs create mode 100644 ru/codes/rust/chapter_tree/array_binary_tree.rs create mode 100644 ru/codes/rust/chapter_tree/avl_tree.rs create mode 100644 ru/codes/rust/chapter_tree/binary_search_tree.rs create mode 100644 ru/codes/rust/chapter_tree/binary_tree.rs create mode 100644 ru/codes/rust/chapter_tree/binary_tree_bfs.rs create mode 100644 ru/codes/rust/chapter_tree/binary_tree_dfs.rs create mode 100644 ru/codes/rust/src/include/list_node.rs create mode 100644 ru/codes/rust/src/include/mod.rs create mode 100644 ru/codes/rust/src/include/print_util.rs create mode 100644 ru/codes/rust/src/include/tree_node.rs create mode 100644 ru/codes/rust/src/include/vertex.rs create mode 100644 ru/codes/rust/src/lib.rs create mode 100644 ru/codes/swift/.gitignore create mode 100644 ru/codes/swift/Package.resolved create mode 100644 ru/codes/swift/Package.swift create mode 100644 ru/codes/swift/chapter_array_and_linkedlist/array.swift create mode 100644 ru/codes/swift/chapter_array_and_linkedlist/linked_list.swift create mode 100644 ru/codes/swift/chapter_array_and_linkedlist/list.swift create mode 100644 ru/codes/swift/chapter_array_and_linkedlist/my_list.swift create mode 100644 ru/codes/swift/chapter_backtracking/n_queens.swift create mode 100644 ru/codes/swift/chapter_backtracking/permutations_i.swift create mode 100644 ru/codes/swift/chapter_backtracking/permutations_ii.swift create mode 100644 ru/codes/swift/chapter_backtracking/preorder_traversal_i_compact.swift create mode 100644 ru/codes/swift/chapter_backtracking/preorder_traversal_ii_compact.swift create mode 100644 ru/codes/swift/chapter_backtracking/preorder_traversal_iii_compact.swift create mode 100644 ru/codes/swift/chapter_backtracking/preorder_traversal_iii_template.swift create mode 100644 ru/codes/swift/chapter_backtracking/subset_sum_i.swift create mode 100644 ru/codes/swift/chapter_backtracking/subset_sum_i_naive.swift create mode 100644 ru/codes/swift/chapter_backtracking/subset_sum_ii.swift create mode 100644 ru/codes/swift/chapter_computational_complexity/iteration.swift create mode 100644 ru/codes/swift/chapter_computational_complexity/recursion.swift create mode 100644 ru/codes/swift/chapter_computational_complexity/space_complexity.swift create mode 100644 ru/codes/swift/chapter_computational_complexity/time_complexity.swift create mode 100644 ru/codes/swift/chapter_computational_complexity/worst_best_time_complexity.swift create mode 100644 ru/codes/swift/chapter_divide_and_conquer/binary_search_recur.swift create mode 100644 ru/codes/swift/chapter_divide_and_conquer/build_tree.swift create mode 100644 ru/codes/swift/chapter_divide_and_conquer/hanota.swift create mode 100644 ru/codes/swift/chapter_dynamic_programming/climbing_stairs_backtrack.swift create mode 100644 ru/codes/swift/chapter_dynamic_programming/climbing_stairs_constraint_dp.swift create mode 100644 ru/codes/swift/chapter_dynamic_programming/climbing_stairs_dfs.swift create mode 100644 ru/codes/swift/chapter_dynamic_programming/climbing_stairs_dfs_mem.swift create mode 100644 ru/codes/swift/chapter_dynamic_programming/climbing_stairs_dp.swift create mode 100644 ru/codes/swift/chapter_dynamic_programming/coin_change.swift create mode 100644 ru/codes/swift/chapter_dynamic_programming/coin_change_ii.swift create mode 100644 ru/codes/swift/chapter_dynamic_programming/edit_distance.swift create mode 100644 ru/codes/swift/chapter_dynamic_programming/knapsack.swift create mode 100644 ru/codes/swift/chapter_dynamic_programming/min_cost_climbing_stairs_dp.swift create mode 100644 ru/codes/swift/chapter_dynamic_programming/min_path_sum.swift create mode 100644 ru/codes/swift/chapter_dynamic_programming/unbounded_knapsack.swift create mode 100644 ru/codes/swift/chapter_graph/graph_adjacency_list.swift create mode 100644 ru/codes/swift/chapter_graph/graph_adjacency_list_target.swift create mode 100644 ru/codes/swift/chapter_graph/graph_adjacency_matrix.swift create mode 100644 ru/codes/swift/chapter_graph/graph_bfs.swift create mode 100644 ru/codes/swift/chapter_graph/graph_dfs.swift create mode 100644 ru/codes/swift/chapter_greedy/coin_change_greedy.swift create mode 100644 ru/codes/swift/chapter_greedy/fractional_knapsack.swift create mode 100644 ru/codes/swift/chapter_greedy/max_capacity.swift create mode 100644 ru/codes/swift/chapter_greedy/max_product_cutting.swift create mode 100644 ru/codes/swift/chapter_hashing/array_hash_map.swift create mode 100644 ru/codes/swift/chapter_hashing/built_in_hash.swift create mode 100644 ru/codes/swift/chapter_hashing/hash_map.swift create mode 100644 ru/codes/swift/chapter_hashing/hash_map_chaining.swift create mode 100644 ru/codes/swift/chapter_hashing/hash_map_open_addressing.swift create mode 100644 ru/codes/swift/chapter_hashing/simple_hash.swift create mode 100644 ru/codes/swift/chapter_heap/heap.swift create mode 100644 ru/codes/swift/chapter_heap/my_heap.swift create mode 100644 ru/codes/swift/chapter_heap/top_k.swift create mode 100644 ru/codes/swift/chapter_searching/binary_search.swift create mode 100644 ru/codes/swift/chapter_searching/binary_search_edge.swift create mode 100644 ru/codes/swift/chapter_searching/binary_search_insertion.swift create mode 100644 ru/codes/swift/chapter_searching/binary_search_insertion_target.swift create mode 100644 ru/codes/swift/chapter_searching/hashing_search.swift create mode 100644 ru/codes/swift/chapter_searching/linear_search.swift create mode 100644 ru/codes/swift/chapter_searching/two_sum.swift create mode 100644 ru/codes/swift/chapter_sorting/bubble_sort.swift create mode 100644 ru/codes/swift/chapter_sorting/bucket_sort.swift create mode 100644 ru/codes/swift/chapter_sorting/counting_sort.swift create mode 100644 ru/codes/swift/chapter_sorting/heap_sort.swift create mode 100644 ru/codes/swift/chapter_sorting/insertion_sort.swift create mode 100644 ru/codes/swift/chapter_sorting/merge_sort.swift create mode 100644 ru/codes/swift/chapter_sorting/quick_sort.swift create mode 100644 ru/codes/swift/chapter_sorting/radix_sort.swift create mode 100644 ru/codes/swift/chapter_sorting/selection_sort.swift create mode 100644 ru/codes/swift/chapter_stack_and_queue/array_deque.swift create mode 100644 ru/codes/swift/chapter_stack_and_queue/array_queue.swift create mode 100644 ru/codes/swift/chapter_stack_and_queue/array_stack.swift create mode 100644 ru/codes/swift/chapter_stack_and_queue/deque.swift create mode 100644 ru/codes/swift/chapter_stack_and_queue/linkedlist_deque.swift create mode 100644 ru/codes/swift/chapter_stack_and_queue/linkedlist_queue.swift create mode 100644 ru/codes/swift/chapter_stack_and_queue/linkedlist_stack.swift create mode 100644 ru/codes/swift/chapter_stack_and_queue/queue.swift create mode 100644 ru/codes/swift/chapter_stack_and_queue/stack.swift create mode 100644 ru/codes/swift/chapter_tree/array_binary_tree.swift create mode 100644 ru/codes/swift/chapter_tree/avl_tree.swift create mode 100644 ru/codes/swift/chapter_tree/binary_search_tree.swift create mode 100644 ru/codes/swift/chapter_tree/binary_tree.swift create mode 100644 ru/codes/swift/chapter_tree/binary_tree_bfs.swift create mode 100644 ru/codes/swift/chapter_tree/binary_tree_dfs.swift create mode 100644 ru/codes/swift/utils/ListNode.swift create mode 100644 ru/codes/swift/utils/Pair.swift create mode 100644 ru/codes/swift/utils/PrintUtil.swift create mode 100644 ru/codes/swift/utils/TreeNode.swift create mode 100644 ru/codes/swift/utils/Vertex.swift create mode 100644 ru/codes/typescript/.gitignore create mode 100644 ru/codes/typescript/.prettierrc create mode 100644 ru/codes/typescript/chapter_array_and_linkedlist/array.ts create mode 100644 ru/codes/typescript/chapter_array_and_linkedlist/linked_list.ts create mode 100644 ru/codes/typescript/chapter_array_and_linkedlist/list.ts create mode 100644 ru/codes/typescript/chapter_array_and_linkedlist/my_list.ts create mode 100644 ru/codes/typescript/chapter_backtracking/n_queens.ts create mode 100644 ru/codes/typescript/chapter_backtracking/permutations_i.ts create mode 100644 ru/codes/typescript/chapter_backtracking/permutations_ii.ts create mode 100644 ru/codes/typescript/chapter_backtracking/preorder_traversal_i_compact.ts create mode 100644 ru/codes/typescript/chapter_backtracking/preorder_traversal_ii_compact.ts create mode 100644 ru/codes/typescript/chapter_backtracking/preorder_traversal_iii_compact.ts create mode 100644 ru/codes/typescript/chapter_backtracking/preorder_traversal_iii_template.ts create mode 100644 ru/codes/typescript/chapter_backtracking/subset_sum_i.ts create mode 100644 ru/codes/typescript/chapter_backtracking/subset_sum_i_naive.ts create mode 100644 ru/codes/typescript/chapter_backtracking/subset_sum_ii.ts create mode 100644 ru/codes/typescript/chapter_computational_complexity/iteration.ts create mode 100644 ru/codes/typescript/chapter_computational_complexity/recursion.ts create mode 100644 ru/codes/typescript/chapter_computational_complexity/space_complexity.ts create mode 100644 ru/codes/typescript/chapter_computational_complexity/time_complexity.ts create mode 100644 ru/codes/typescript/chapter_computational_complexity/worst_best_time_complexity.ts create mode 100644 ru/codes/typescript/chapter_divide_and_conquer/binary_search_recur.ts create mode 100644 ru/codes/typescript/chapter_divide_and_conquer/build_tree.ts create mode 100644 ru/codes/typescript/chapter_divide_and_conquer/hanota.ts create mode 100644 ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_backtrack.ts create mode 100644 ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_constraint_dp.ts create mode 100644 ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_dfs.ts create mode 100644 ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_dfs_mem.ts create mode 100644 ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_dp.ts create mode 100644 ru/codes/typescript/chapter_dynamic_programming/coin_change.ts create mode 100644 ru/codes/typescript/chapter_dynamic_programming/coin_change_ii.ts create mode 100644 ru/codes/typescript/chapter_dynamic_programming/edit_distance.ts create mode 100644 ru/codes/typescript/chapter_dynamic_programming/knapsack.ts create mode 100644 ru/codes/typescript/chapter_dynamic_programming/min_cost_climbing_stairs_dp.ts create mode 100644 ru/codes/typescript/chapter_dynamic_programming/min_path_sum.ts create mode 100644 ru/codes/typescript/chapter_dynamic_programming/unbounded_knapsack.ts create mode 100644 ru/codes/typescript/chapter_graph/graph_adjacency_list.ts create mode 100644 ru/codes/typescript/chapter_graph/graph_adjacency_matrix.ts create mode 100644 ru/codes/typescript/chapter_graph/graph_bfs.ts create mode 100644 ru/codes/typescript/chapter_graph/graph_dfs.ts create mode 100644 ru/codes/typescript/chapter_greedy/coin_change_greedy.ts create mode 100644 ru/codes/typescript/chapter_greedy/fractional_knapsack.ts create mode 100644 ru/codes/typescript/chapter_greedy/max_capacity.ts create mode 100644 ru/codes/typescript/chapter_greedy/max_product_cutting.ts create mode 100644 ru/codes/typescript/chapter_hashing/array_hash_map.ts create mode 100644 ru/codes/typescript/chapter_hashing/hash_map.ts create mode 100644 ru/codes/typescript/chapter_hashing/hash_map_chaining.ts create mode 100644 ru/codes/typescript/chapter_hashing/hash_map_open_addressing.ts create mode 100644 ru/codes/typescript/chapter_hashing/simple_hash.ts create mode 100644 ru/codes/typescript/chapter_heap/my_heap.ts create mode 100644 ru/codes/typescript/chapter_heap/top_k.ts create mode 100644 ru/codes/typescript/chapter_searching/binary_search.ts create mode 100644 ru/codes/typescript/chapter_searching/binary_search_edge.ts create mode 100644 ru/codes/typescript/chapter_searching/binary_search_insertion.ts create mode 100644 ru/codes/typescript/chapter_searching/hashing_search.ts create mode 100644 ru/codes/typescript/chapter_searching/linear_search.ts create mode 100644 ru/codes/typescript/chapter_searching/two_sum.ts create mode 100644 ru/codes/typescript/chapter_sorting/bubble_sort.ts create mode 100644 ru/codes/typescript/chapter_sorting/bucket_sort.ts create mode 100644 ru/codes/typescript/chapter_sorting/counting_sort.ts create mode 100644 ru/codes/typescript/chapter_sorting/heap_sort.ts create mode 100644 ru/codes/typescript/chapter_sorting/insertion_sort.ts create mode 100644 ru/codes/typescript/chapter_sorting/merge_sort.ts create mode 100644 ru/codes/typescript/chapter_sorting/quick_sort.ts create mode 100644 ru/codes/typescript/chapter_sorting/radix_sort.ts create mode 100644 ru/codes/typescript/chapter_sorting/selection_sort.ts create mode 100644 ru/codes/typescript/chapter_stack_and_queue/array_deque.ts create mode 100644 ru/codes/typescript/chapter_stack_and_queue/array_queue.ts create mode 100644 ru/codes/typescript/chapter_stack_and_queue/array_stack.ts create mode 100644 ru/codes/typescript/chapter_stack_and_queue/deque.ts create mode 100644 ru/codes/typescript/chapter_stack_and_queue/linkedlist_deque.ts create mode 100644 ru/codes/typescript/chapter_stack_and_queue/linkedlist_queue.ts create mode 100644 ru/codes/typescript/chapter_stack_and_queue/linkedlist_stack.ts create mode 100644 ru/codes/typescript/chapter_stack_and_queue/queue.ts create mode 100644 ru/codes/typescript/chapter_stack_and_queue/stack.ts create mode 100644 ru/codes/typescript/chapter_tree/array_binary_tree.ts create mode 100644 ru/codes/typescript/chapter_tree/avl_tree.ts create mode 100644 ru/codes/typescript/chapter_tree/binary_search_tree.ts create mode 100644 ru/codes/typescript/chapter_tree/binary_tree.ts create mode 100644 ru/codes/typescript/chapter_tree/binary_tree_bfs.ts create mode 100644 ru/codes/typescript/chapter_tree/binary_tree_dfs.ts create mode 100644 ru/codes/typescript/modules/ListNode.ts create mode 100644 ru/codes/typescript/modules/PrintUtil.ts create mode 100644 ru/codes/typescript/modules/TreeNode.ts create mode 100644 ru/codes/typescript/modules/Vertex.ts create mode 100644 ru/codes/typescript/package.json create mode 100644 ru/codes/typescript/tsconfig.json create mode 100644 ru/codes/zig/.gitignore create mode 100644 ru/codes/zig/.vscode/launch.json create mode 100644 ru/codes/zig/.vscode/settings.json create mode 100644 ru/codes/zig/.vscode/tasks.json create mode 100644 ru/codes/zig/build.zig create mode 100644 ru/codes/zig/chapter_array_and_linkedlist/array.zig create mode 100644 ru/codes/zig/chapter_array_and_linkedlist/linked_list.zig create mode 100644 ru/codes/zig/chapter_array_and_linkedlist/list.zig create mode 100644 ru/codes/zig/chapter_array_and_linkedlist/my_list.zig create mode 100644 ru/codes/zig/chapter_computational_complexity/iteration.zig create mode 100644 ru/codes/zig/chapter_computational_complexity/recursion.zig create mode 100644 ru/codes/zig/chapter_computational_complexity/space_complexity.zig create mode 100644 ru/codes/zig/chapter_computational_complexity/time_complexity.zig create mode 100644 ru/codes/zig/chapter_computational_complexity/worst_best_time_complexity.zig create mode 100644 ru/codes/zig/chapter_dynamic_programming/climbing_stairs_backtrack.zig create mode 100644 ru/codes/zig/chapter_dynamic_programming/climbing_stairs_constraint_dp.zig create mode 100644 ru/codes/zig/chapter_dynamic_programming/climbing_stairs_dfs.zig create mode 100644 ru/codes/zig/chapter_dynamic_programming/climbing_stairs_dfs_mem.zig create mode 100644 ru/codes/zig/chapter_dynamic_programming/climbing_stairs_dp.zig create mode 100644 ru/codes/zig/chapter_dynamic_programming/coin_change.zig create mode 100644 ru/codes/zig/chapter_dynamic_programming/coin_change_ii.zig create mode 100644 ru/codes/zig/chapter_dynamic_programming/edit_distance.zig create mode 100644 ru/codes/zig/chapter_dynamic_programming/knapsack.zig create mode 100644 ru/codes/zig/chapter_dynamic_programming/min_cost_climbing_stairs_dp.zig create mode 100644 ru/codes/zig/chapter_dynamic_programming/min_path_sum.zig create mode 100644 ru/codes/zig/chapter_dynamic_programming/unbounded_knapsack.zig create mode 100644 ru/codes/zig/chapter_hashing/array_hash_map.zig create mode 100644 ru/codes/zig/chapter_hashing/hash_map.zig create mode 100644 ru/codes/zig/chapter_heap/heap.zig create mode 100644 ru/codes/zig/chapter_heap/my_heap.zig create mode 100644 ru/codes/zig/chapter_searching/binary_search.zig create mode 100644 ru/codes/zig/chapter_searching/hashing_search.zig create mode 100644 ru/codes/zig/chapter_searching/linear_search.zig create mode 100644 ru/codes/zig/chapter_searching/two_sum.zig create mode 100644 ru/codes/zig/chapter_sorting/bubble_sort.zig create mode 100644 ru/codes/zig/chapter_sorting/insertion_sort.zig create mode 100644 ru/codes/zig/chapter_sorting/merge_sort.zig create mode 100644 ru/codes/zig/chapter_sorting/quick_sort.zig create mode 100644 ru/codes/zig/chapter_sorting/radix_sort.zig create mode 100644 ru/codes/zig/chapter_stack_and_queue/array_queue.zig create mode 100644 ru/codes/zig/chapter_stack_and_queue/array_stack.zig create mode 100644 ru/codes/zig/chapter_stack_and_queue/deque.zig create mode 100644 ru/codes/zig/chapter_stack_and_queue/linkedlist_deque.zig create mode 100644 ru/codes/zig/chapter_stack_and_queue/linkedlist_queue.zig create mode 100644 ru/codes/zig/chapter_stack_and_queue/linkedlist_stack.zig create mode 100644 ru/codes/zig/chapter_stack_and_queue/queue.zig create mode 100644 ru/codes/zig/chapter_stack_and_queue/stack.zig create mode 100644 ru/codes/zig/chapter_tree/avl_tree.zig create mode 100644 ru/codes/zig/chapter_tree/binary_search_tree.zig create mode 100644 ru/codes/zig/chapter_tree/binary_tree.zig create mode 100644 ru/codes/zig/chapter_tree/binary_tree_bfs.zig create mode 100644 ru/codes/zig/chapter_tree/binary_tree_dfs.zig create mode 100644 ru/codes/zig/include/PrintUtil.zig create mode 100644 ru/codes/zig/include/include.zig create mode 100644 ru/codes/zig/main.zig create mode 100644 ru/codes/zig/utils/ListNode.zig create mode 100644 ru/codes/zig/utils/TreeNode.zig create mode 100644 ru/codes/zig/utils/format.zig create mode 100644 ru/codes/zig/utils/utils.zig create mode 100644 ru/docs/assets/covers/chapter_appendix.jpg create mode 100644 ru/docs/assets/covers/chapter_array_and_linkedlist.jpg create mode 100644 ru/docs/assets/covers/chapter_backtracking.jpg create mode 100644 ru/docs/assets/covers/chapter_complexity_analysis.jpg create mode 100644 ru/docs/assets/covers/chapter_data_structure.jpg create mode 100644 ru/docs/assets/covers/chapter_divide_and_conquer.jpg create mode 100644 ru/docs/assets/covers/chapter_dynamic_programming.jpg create mode 100644 ru/docs/assets/covers/chapter_graph.jpg create mode 100644 ru/docs/assets/covers/chapter_greedy.jpg create mode 100644 ru/docs/assets/covers/chapter_hashing.jpg create mode 100644 ru/docs/assets/covers/chapter_heap.jpg create mode 100644 ru/docs/assets/covers/chapter_hello_algo.jpg create mode 100644 ru/docs/assets/covers/chapter_introduction.jpg create mode 100644 ru/docs/assets/covers/chapter_preface.jpg create mode 100644 ru/docs/assets/covers/chapter_searching.jpg create mode 100644 ru/docs/assets/covers/chapter_sorting.jpg create mode 100644 ru/docs/assets/covers/chapter_stack_and_queue.jpg create mode 100644 ru/docs/assets/covers/chapter_tree.jpg create mode 100644 ru/docs/chapter_appendix/contribution.assets/edit_markdown.png create mode 100644 ru/docs/chapter_appendix/contribution.md create mode 100644 ru/docs/chapter_appendix/index.md create mode 100644 ru/docs/chapter_appendix/installation.assets/vscode_extension_installation.png create mode 100644 ru/docs/chapter_appendix/installation.assets/vscode_installation.png create mode 100644 ru/docs/chapter_appendix/installation.md create mode 100644 ru/docs/chapter_appendix/terminology.md create mode 100644 ru/docs/chapter_array_and_linkedlist/array.assets/array_definition.png create mode 100644 ru/docs/chapter_array_and_linkedlist/array.assets/array_insert_element.png create mode 100644 ru/docs/chapter_array_and_linkedlist/array.assets/array_memory_location_calculation.png create mode 100644 ru/docs/chapter_array_and_linkedlist/array.assets/array_remove_element.png create mode 100644 ru/docs/chapter_array_and_linkedlist/array.md create mode 100644 ru/docs/chapter_array_and_linkedlist/index.md create mode 100644 ru/docs/chapter_array_and_linkedlist/linked_list.assets/linkedlist_common_types.png create mode 100644 ru/docs/chapter_array_and_linkedlist/linked_list.assets/linkedlist_definition.png create mode 100644 ru/docs/chapter_array_and_linkedlist/linked_list.assets/linkedlist_insert_node.png create mode 100644 ru/docs/chapter_array_and_linkedlist/linked_list.assets/linkedlist_remove_node.png create mode 100644 ru/docs/chapter_array_and_linkedlist/linked_list.md create mode 100644 ru/docs/chapter_array_and_linkedlist/list.md create mode 100644 ru/docs/chapter_array_and_linkedlist/ram_and_cache.assets/computer_storage_devices.png create mode 100644 ru/docs/chapter_array_and_linkedlist/ram_and_cache.assets/storage_pyramid.png create mode 100644 ru/docs/chapter_array_and_linkedlist/ram_and_cache.md create mode 100644 ru/docs/chapter_array_and_linkedlist/summary.md create mode 100644 ru/docs/chapter_backtracking/backtracking_algorithm.assets/backtrack_remove_return_or_not.png create mode 100644 ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_constrained_paths.png create mode 100644 ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_nodes.png create mode 100644 ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step1.png create mode 100644 ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step10.png create mode 100644 ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step11.png create mode 100644 ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step2.png create mode 100644 ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step3.png create mode 100644 ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step4.png create mode 100644 ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step5.png create mode 100644 ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step6.png create mode 100644 ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step7.png create mode 100644 ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step8.png create mode 100644 ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step9.png create mode 100644 ru/docs/chapter_backtracking/backtracking_algorithm.md create mode 100644 ru/docs/chapter_backtracking/index.md create mode 100644 ru/docs/chapter_backtracking/n_queens_problem.assets/n_queens_cols_diagonals.png create mode 100644 ru/docs/chapter_backtracking/n_queens_problem.assets/n_queens_constraints.png create mode 100644 ru/docs/chapter_backtracking/n_queens_problem.assets/n_queens_placing.png create mode 100644 ru/docs/chapter_backtracking/n_queens_problem.assets/solution_4_queens.png create mode 100644 ru/docs/chapter_backtracking/n_queens_problem.md create mode 100644 ru/docs/chapter_backtracking/permutations_problem.assets/permutations_i.png create mode 100644 ru/docs/chapter_backtracking/permutations_problem.assets/permutations_i_pruning.png create mode 100644 ru/docs/chapter_backtracking/permutations_problem.assets/permutations_ii.png create mode 100644 ru/docs/chapter_backtracking/permutations_problem.assets/permutations_ii_pruning.png create mode 100644 ru/docs/chapter_backtracking/permutations_problem.assets/permutations_ii_pruning_summary.png create mode 100644 ru/docs/chapter_backtracking/permutations_problem.md create mode 100644 ru/docs/chapter_backtracking/subset_sum_problem.assets/subset_sum_i.png create mode 100644 ru/docs/chapter_backtracking/subset_sum_problem.assets/subset_sum_i_naive.png create mode 100644 ru/docs/chapter_backtracking/subset_sum_problem.assets/subset_sum_i_pruning.png create mode 100644 ru/docs/chapter_backtracking/subset_sum_problem.assets/subset_sum_ii.png create mode 100644 ru/docs/chapter_backtracking/subset_sum_problem.assets/subset_sum_ii_repeat.png create mode 100644 ru/docs/chapter_backtracking/subset_sum_problem.md create mode 100644 ru/docs/chapter_backtracking/summary.md create mode 100644 ru/docs/chapter_computational_complexity/index.md create mode 100644 ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/iteration.png create mode 100644 ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/nested_iteration.png create mode 100644 ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/recursion_sum.png create mode 100644 ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/recursion_sum_depth.png create mode 100644 ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/recursion_tree.png create mode 100644 ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/tail_recursion_sum.png create mode 100644 ru/docs/chapter_computational_complexity/iteration_and_recursion.md create mode 100644 ru/docs/chapter_computational_complexity/performance_evaluation.md create mode 100644 ru/docs/chapter_computational_complexity/space_complexity.assets/space_complexity_common_types.png create mode 100644 ru/docs/chapter_computational_complexity/space_complexity.assets/space_complexity_exponential.png create mode 100644 ru/docs/chapter_computational_complexity/space_complexity.assets/space_complexity_recursive_linear.png create mode 100644 ru/docs/chapter_computational_complexity/space_complexity.assets/space_complexity_recursive_quadratic.png create mode 100644 ru/docs/chapter_computational_complexity/space_complexity.assets/space_types.png create mode 100644 ru/docs/chapter_computational_complexity/space_complexity.md create mode 100644 ru/docs/chapter_computational_complexity/summary.md create mode 100644 ru/docs/chapter_computational_complexity/time_complexity.assets/asymptotic_upper_bound.png create mode 100644 ru/docs/chapter_computational_complexity/time_complexity.assets/time_complexity_common_types.png create mode 100644 ru/docs/chapter_computational_complexity/time_complexity.assets/time_complexity_constant_linear_quadratic.png create mode 100644 ru/docs/chapter_computational_complexity/time_complexity.assets/time_complexity_exponential.png create mode 100644 ru/docs/chapter_computational_complexity/time_complexity.assets/time_complexity_factorial.png create mode 100644 ru/docs/chapter_computational_complexity/time_complexity.assets/time_complexity_logarithmic.png create mode 100644 ru/docs/chapter_computational_complexity/time_complexity.assets/time_complexity_logarithmic_linear.png create mode 100644 ru/docs/chapter_computational_complexity/time_complexity.assets/time_complexity_simple_example.png create mode 100644 ru/docs/chapter_computational_complexity/time_complexity.md create mode 100644 ru/docs/chapter_data_structure/basic_data_types.md create mode 100644 ru/docs/chapter_data_structure/character_encoding.assets/ascii_table.png create mode 100644 ru/docs/chapter_data_structure/character_encoding.assets/unicode_hello_algo.png create mode 100644 ru/docs/chapter_data_structure/character_encoding.assets/utf-8_hello_algo.png create mode 100644 ru/docs/chapter_data_structure/character_encoding.md create mode 100644 ru/docs/chapter_data_structure/classification_logic_structure.png create mode 100644 ru/docs/chapter_data_structure/classification_of_data_structure.assets/classification_logic_structure.png create mode 100644 ru/docs/chapter_data_structure/classification_of_data_structure.assets/classification_phisical_structure.png create mode 100644 ru/docs/chapter_data_structure/classification_of_data_structure.assets/computer_memory_location.png create mode 100644 ru/docs/chapter_data_structure/classification_of_data_structure.md create mode 100644 ru/docs/chapter_data_structure/classification_phisical_structure.png create mode 100644 ru/docs/chapter_data_structure/computer_memory_location.png create mode 100644 ru/docs/chapter_data_structure/index.md create mode 100644 ru/docs/chapter_data_structure/number_encoding.assets/1s_2s_complement.png create mode 100644 ru/docs/chapter_data_structure/number_encoding.assets/ieee_754_float.png create mode 100644 ru/docs/chapter_data_structure/number_encoding.md create mode 100644 ru/docs/chapter_data_structure/summary.md create mode 100644 ru/docs/chapter_divide_and_conquer/binary_search_recur.assets/binary_search_recur.png create mode 100644 ru/docs/chapter_divide_and_conquer/binary_search_recur.md create mode 100644 ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/build_tree_division_pointers.png create mode 100644 ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/build_tree_example.png create mode 100644 ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/build_tree_preorder_inorder_division.png create mode 100644 ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_overall.png create mode 100644 ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step1.png create mode 100644 ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step2.png create mode 100644 ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step3.png create mode 100644 ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step4.png create mode 100644 ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step5.png create mode 100644 ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step6.png create mode 100644 ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step7.png create mode 100644 ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step8.png create mode 100644 ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step9.png create mode 100644 ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.md create mode 100644 ru/docs/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_bubble_sort.png create mode 100644 ru/docs/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_merge_sort.png create mode 100644 ru/docs/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_parallel_computing.png create mode 100644 ru/docs/chapter_divide_and_conquer/divide_and_conquer.md create mode 100644 ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_divide_and_conquer.png create mode 100644 ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_example.png create mode 100644 ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f1_step1.png create mode 100644 ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f1_step2.png create mode 100644 ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step1.png create mode 100644 ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step2.png create mode 100644 ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step3.png create mode 100644 ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step4.png create mode 100644 ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step1.png create mode 100644 ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step2.png create mode 100644 ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step3.png create mode 100644 ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step4.png create mode 100644 ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_recursive_tree.png create mode 100644 ru/docs/chapter_divide_and_conquer/hanota_problem.md create mode 100644 ru/docs/chapter_divide_and_conquer/index.md create mode 100644 ru/docs/chapter_divide_and_conquer/summary.md create mode 100644 ru/docs/chapter_dynamic_programming/dp_problem_features.assets/climbing_stairs_constraint_example.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_problem_features.assets/climbing_stairs_constraint_state_transfer.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_problem_features.assets/min_cost_cs_dp.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_problem_features.assets/min_cost_cs_example.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_problem_features.md create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dfs.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dfs_mem.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step1.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step10.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step11.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step12.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step2.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step3.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step4.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step5.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step6.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step7.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step8.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step9.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_example.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_initial_state.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_state_definition.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_state_transition.png create mode 100644 ru/docs/chapter_dynamic_programming/dp_solution_pipeline.md create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_decision_tree.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step1.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step10.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step11.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step12.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step13.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step14.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step15.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step2.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step3.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step4.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step5.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step6.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step7.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step8.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step9.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_example.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_state_transfer.png create mode 100644 ru/docs/chapter_dynamic_programming/edit_distance_problem.md create mode 100644 ru/docs/chapter_dynamic_programming/index.md create mode 100644 ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dfs_memo_tree.png create mode 100644 ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dfs_tree.png create mode 100644 ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dp.png create mode 100644 ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_example.png create mode 100644 ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_state_transfer.png create mode 100644 ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.md create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dfs.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dfs_mem.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step1.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step2.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step3.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step4.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step5.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step6.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step1.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step10.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step11.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step12.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step13.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step14.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step2.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step3.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step4.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step5.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step6.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step7.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step8.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step9.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_example.png create mode 100644 ru/docs/chapter_dynamic_programming/knapsack_problem.md create mode 100644 ru/docs/chapter_dynamic_programming/summary.md create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step1.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step10.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step11.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step12.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step13.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step14.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step15.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step2.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step3.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step4.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step5.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step6.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step7.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step8.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step9.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_example.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_ii_example.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step1.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step2.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step3.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step4.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step5.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step6.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_example.png create mode 100644 ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.md create mode 100644 ru/docs/chapter_graph/graph.assets/adjacency_list.png create mode 100644 ru/docs/chapter_graph/graph.assets/adjacency_matrix.png create mode 100644 ru/docs/chapter_graph/graph.assets/connected_graph.png create mode 100644 ru/docs/chapter_graph/graph.assets/directed_graph.png create mode 100644 ru/docs/chapter_graph/graph.assets/linkedlist_tree_graph.png create mode 100644 ru/docs/chapter_graph/graph.assets/weighted_graph.png create mode 100644 ru/docs/chapter_graph/graph.md create mode 100644 ru/docs/chapter_graph/graph_operations.assets/adjacency_list_step1_initialization.png create mode 100644 ru/docs/chapter_graph/graph_operations.assets/adjacency_list_step2_add_edge.png create mode 100644 ru/docs/chapter_graph/graph_operations.assets/adjacency_list_step3_remove_edge.png create mode 100644 ru/docs/chapter_graph/graph_operations.assets/adjacency_list_step4_add_vertex.png create mode 100644 ru/docs/chapter_graph/graph_operations.assets/adjacency_list_step5_remove_vertex.png create mode 100644 ru/docs/chapter_graph/graph_operations.assets/adjacency_matrix_step1_initialization.png create mode 100644 ru/docs/chapter_graph/graph_operations.assets/adjacency_matrix_step2_add_edge.png create mode 100644 ru/docs/chapter_graph/graph_operations.assets/adjacency_matrix_step3_remove_edge.png create mode 100644 ru/docs/chapter_graph/graph_operations.assets/adjacency_matrix_step4_add_vertex.png create mode 100644 ru/docs/chapter_graph/graph_operations.assets/adjacency_matrix_step5_remove_vertex.png create mode 100644 ru/docs/chapter_graph/graph_operations.md create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_bfs.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step1.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step10.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step11.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step2.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step3.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step4.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step5.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step6.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step7.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step8.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step9.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_dfs.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step1.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step10.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step11.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step2.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step3.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step4.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step5.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step6.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step7.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step8.png create mode 100644 ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step9.png create mode 100644 ru/docs/chapter_graph/graph_traversal.md create mode 100644 ru/docs/chapter_graph/index.md create mode 100644 ru/docs/chapter_graph/summary.md create mode 100644 ru/docs/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_area_chart.png create mode 100644 ru/docs/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_example.png create mode 100644 ru/docs/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_greedy_strategy.png create mode 100644 ru/docs/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_unit_value.png create mode 100644 ru/docs/chapter_greedy/fractional_knapsack_problem.md create mode 100644 ru/docs/chapter_greedy/greedy_algorithm.assets/coin_change_greedy_strategy.png create mode 100644 ru/docs/chapter_greedy/greedy_algorithm.assets/coin_change_greedy_vs_dp.png create mode 100644 ru/docs/chapter_greedy/greedy_algorithm.md create mode 100644 ru/docs/chapter_greedy/index.md create mode 100644 ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_example.png create mode 100644 ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step1.png create mode 100644 ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step2.png create mode 100644 ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step3.png create mode 100644 ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step4.png create mode 100644 ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step5.png create mode 100644 ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step6.png create mode 100644 ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step7.png create mode 100644 ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step8.png create mode 100644 ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step9.png create mode 100644 ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_initial_state.png create mode 100644 ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_long_board.png create mode 100644 ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_short_board.png create mode 100644 ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_skipped_states.png create mode 100644 ru/docs/chapter_greedy/max_capacity_problem.md create mode 100644 ru/docs/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_definition.png create mode 100644 ru/docs/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_greedy_calculation.png create mode 100644 ru/docs/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_greedy_infer1.png create mode 100644 ru/docs/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_greedy_infer2.png create mode 100644 ru/docs/chapter_greedy/max_product_cutting_problem.md create mode 100644 ru/docs/chapter_greedy/summary.md create mode 100644 ru/docs/chapter_hashing/hash_algorithm.assets/hash_collision_best_worst_condition.png create mode 100644 ru/docs/chapter_hashing/hash_algorithm.md create mode 100644 ru/docs/chapter_hashing/hash_collision.assets/hash_table_chaining.png create mode 100644 ru/docs/chapter_hashing/hash_collision.assets/hash_table_linear_probing.png create mode 100644 ru/docs/chapter_hashing/hash_collision.assets/hash_table_open_addressing_deletion.png create mode 100644 ru/docs/chapter_hashing/hash_collision.md create mode 100644 ru/docs/chapter_hashing/hash_map.assets/hash_collision.png create mode 100644 ru/docs/chapter_hashing/hash_map.assets/hash_function.png create mode 100644 ru/docs/chapter_hashing/hash_map.assets/hash_table_lookup.png create mode 100644 ru/docs/chapter_hashing/hash_map.assets/hash_table_reshash.png create mode 100644 ru/docs/chapter_hashing/hash_map.md create mode 100644 ru/docs/chapter_hashing/index.md create mode 100644 ru/docs/chapter_hashing/summary.md create mode 100644 ru/docs/chapter_heap/build_heap.assets/heapify_operations_count.png create mode 100644 ru/docs/chapter_heap/build_heap.md create mode 100644 ru/docs/chapter_heap/heap.assets/heap_pop_step1.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_pop_step10.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_pop_step2.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_pop_step3.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_pop_step4.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_pop_step5.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_pop_step6.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_pop_step7.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_pop_step8.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_pop_step9.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_push_step1.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_push_step2.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_push_step3.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_push_step4.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_push_step5.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_push_step6.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_push_step7.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_push_step8.png create mode 100644 ru/docs/chapter_heap/heap.assets/heap_push_step9.png create mode 100644 ru/docs/chapter_heap/heap.assets/min_heap_and_max_heap.png create mode 100644 ru/docs/chapter_heap/heap.assets/representation_of_heap.png create mode 100644 ru/docs/chapter_heap/heap.md create mode 100644 ru/docs/chapter_heap/index.md create mode 100644 ru/docs/chapter_heap/summary.md create mode 100644 ru/docs/chapter_heap/top_k.assets/top_k_heap_step1.png create mode 100644 ru/docs/chapter_heap/top_k.assets/top_k_heap_step2.png create mode 100644 ru/docs/chapter_heap/top_k.assets/top_k_heap_step3.png create mode 100644 ru/docs/chapter_heap/top_k.assets/top_k_heap_step4.png create mode 100644 ru/docs/chapter_heap/top_k.assets/top_k_heap_step5.png create mode 100644 ru/docs/chapter_heap/top_k.assets/top_k_heap_step6.png create mode 100644 ru/docs/chapter_heap/top_k.assets/top_k_heap_step7.png create mode 100644 ru/docs/chapter_heap/top_k.assets/top_k_heap_step8.png create mode 100644 ru/docs/chapter_heap/top_k.assets/top_k_heap_step9.png create mode 100644 ru/docs/chapter_heap/top_k.assets/top_k_sorting.png create mode 100644 ru/docs/chapter_heap/top_k.assets/top_k_traversal.png create mode 100644 ru/docs/chapter_heap/top_k.md create mode 100644 ru/docs/chapter_hello_algo/index.md create mode 100644 ru/docs/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step1.png create mode 100644 ru/docs/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step2.png create mode 100644 ru/docs/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step3.png create mode 100644 ru/docs/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step4.png create mode 100644 ru/docs/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step5.png create mode 100644 ru/docs/chapter_introduction/algorithms_are_everywhere.assets/greedy_change.png create mode 100644 ru/docs/chapter_introduction/algorithms_are_everywhere.assets/playing_cards_sorting.png create mode 100644 ru/docs/chapter_introduction/algorithms_are_everywhere.md create mode 100644 ru/docs/chapter_introduction/index.md create mode 100644 ru/docs/chapter_introduction/summary.md create mode 100644 ru/docs/chapter_introduction/what_is_dsa.assets/assembling_blocks.png create mode 100644 ru/docs/chapter_introduction/what_is_dsa.assets/relationship_between_data_structure_and_algorithm.png create mode 100644 ru/docs/chapter_introduction/what_is_dsa.md create mode 100644 ru/docs/chapter_preface/about_the_book.assets/hello_algo_mindmap.png create mode 100644 ru/docs/chapter_preface/about_the_book.md create mode 100644 ru/docs/chapter_preface/index.md create mode 100644 ru/docs/chapter_preface/suggestions.assets/code_md_to_repo.png create mode 100644 ru/docs/chapter_preface/suggestions.assets/download_code.png create mode 100644 ru/docs/chapter_preface/suggestions.assets/learning_route.png create mode 100644 ru/docs/chapter_preface/suggestions.assets/pythontutor_example.png create mode 100644 ru/docs/chapter_preface/suggestions.md create mode 100644 ru/docs/chapter_preface/summary.md create mode 100644 ru/docs/chapter_reference/index.md create mode 100644 ru/docs/chapter_searching/binary_search.assets/binary_search_example.png create mode 100644 ru/docs/chapter_searching/binary_search.assets/binary_search_ranges.png create mode 100644 ru/docs/chapter_searching/binary_search.assets/binary_search_step1.png create mode 100644 ru/docs/chapter_searching/binary_search.assets/binary_search_step2.png create mode 100644 ru/docs/chapter_searching/binary_search.assets/binary_search_step3.png create mode 100644 ru/docs/chapter_searching/binary_search.assets/binary_search_step4.png create mode 100644 ru/docs/chapter_searching/binary_search.assets/binary_search_step5.png create mode 100644 ru/docs/chapter_searching/binary_search.assets/binary_search_step6.png create mode 100644 ru/docs/chapter_searching/binary_search.assets/binary_search_step7.png create mode 100644 ru/docs/chapter_searching/binary_search.md create mode 100644 ru/docs/chapter_searching/binary_search_edge.assets/binary_search_edge_by_element.png create mode 100644 ru/docs/chapter_searching/binary_search_edge.assets/binary_search_right_edge_by_left_edge.png create mode 100644 ru/docs/chapter_searching/binary_search_edge.md create mode 100644 ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_example.png create mode 100644 ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_naive.png create mode 100644 ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step1.png create mode 100644 ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step2.png create mode 100644 ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step3.png create mode 100644 ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step4.png create mode 100644 ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step5.png create mode 100644 ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step6.png create mode 100644 ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step7.png create mode 100644 ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step8.png create mode 100644 ru/docs/chapter_searching/binary_search_insertion.md create mode 100644 ru/docs/chapter_searching/index.md create mode 100644 ru/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png create mode 100644 ru/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step1.png create mode 100644 ru/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step2.png create mode 100644 ru/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step3.png create mode 100644 ru/docs/chapter_searching/replace_linear_by_hashing.md create mode 100644 ru/docs/chapter_searching/searching_algorithm_revisited.assets/searching_algorithms.png create mode 100644 ru/docs/chapter_searching/searching_algorithm_revisited.md create mode 100644 ru/docs/chapter_searching/summary.md create mode 100644 ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step1.png create mode 100644 ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step2.png create mode 100644 ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step3.png create mode 100644 ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step4.png create mode 100644 ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step5.png create mode 100644 ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step6.png create mode 100644 ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step7.png create mode 100644 ru/docs/chapter_sorting/bubble_sort.assets/bubble_sort_overview.png create mode 100644 ru/docs/chapter_sorting/bubble_sort.md create mode 100644 ru/docs/chapter_sorting/bucket_sort.assets/bucket_sort_overview.png create mode 100644 ru/docs/chapter_sorting/bucket_sort.assets/scatter_in_buckets_distribution.png create mode 100644 ru/docs/chapter_sorting/bucket_sort.assets/scatter_in_buckets_recursively.png create mode 100644 ru/docs/chapter_sorting/bucket_sort.md create mode 100644 ru/docs/chapter_sorting/counting_sort.assets/counting_sort_overview.png create mode 100644 ru/docs/chapter_sorting/counting_sort.assets/counting_sort_step1.png create mode 100644 ru/docs/chapter_sorting/counting_sort.assets/counting_sort_step2.png create mode 100644 ru/docs/chapter_sorting/counting_sort.assets/counting_sort_step3.png create mode 100644 ru/docs/chapter_sorting/counting_sort.assets/counting_sort_step4.png create mode 100644 ru/docs/chapter_sorting/counting_sort.assets/counting_sort_step5.png create mode 100644 ru/docs/chapter_sorting/counting_sort.assets/counting_sort_step6.png create mode 100644 ru/docs/chapter_sorting/counting_sort.assets/counting_sort_step7.png create mode 100644 ru/docs/chapter_sorting/counting_sort.assets/counting_sort_step8.png create mode 100644 ru/docs/chapter_sorting/counting_sort.md create mode 100644 ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step1.png create mode 100644 ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step10.png create mode 100644 ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step11.png create mode 100644 ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step12.png create mode 100644 ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step2.png create mode 100644 ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step3.png create mode 100644 ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step4.png create mode 100644 ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step5.png create mode 100644 ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step6.png create mode 100644 ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step7.png create mode 100644 ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step8.png create mode 100644 ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step9.png create mode 100644 ru/docs/chapter_sorting/heap_sort.md create mode 100644 ru/docs/chapter_sorting/index.md create mode 100644 ru/docs/chapter_sorting/insertion_sort.assets/insertion_operation.png create mode 100644 ru/docs/chapter_sorting/insertion_sort.assets/insertion_sort_overview.png create mode 100644 ru/docs/chapter_sorting/insertion_sort.md create mode 100644 ru/docs/chapter_sorting/merge_sort.assets/merge_sort_overview.png create mode 100644 ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step1.png create mode 100644 ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step10.png create mode 100644 ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step2.png create mode 100644 ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step3.png create mode 100644 ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step4.png create mode 100644 ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step5.png create mode 100644 ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step6.png create mode 100644 ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step7.png create mode 100644 ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step8.png create mode 100644 ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step9.png create mode 100644 ru/docs/chapter_sorting/merge_sort.md create mode 100644 ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step1.png create mode 100644 ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step2.png create mode 100644 ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step3.png create mode 100644 ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step4.png create mode 100644 ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step5.png create mode 100644 ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step6.png create mode 100644 ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step7.png create mode 100644 ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step8.png create mode 100644 ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step9.png create mode 100644 ru/docs/chapter_sorting/quick_sort.assets/quick_sort_overview.png create mode 100644 ru/docs/chapter_sorting/quick_sort.md create mode 100644 ru/docs/chapter_sorting/radix_sort.assets/radix_sort_overview.png create mode 100644 ru/docs/chapter_sorting/radix_sort.md create mode 100644 ru/docs/chapter_sorting/selection_sort.assets/selection_sort_instability.png create mode 100644 ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step1.png create mode 100644 ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step10.png create mode 100644 ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step11.png create mode 100644 ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step2.png create mode 100644 ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step3.png create mode 100644 ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step4.png create mode 100644 ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step5.png create mode 100644 ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step6.png create mode 100644 ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step7.png create mode 100644 ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step8.png create mode 100644 ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step9.png create mode 100644 ru/docs/chapter_sorting/selection_sort.md create mode 100644 ru/docs/chapter_sorting/sorting_algorithm.assets/sorting_examples.png create mode 100644 ru/docs/chapter_sorting/sorting_algorithm.md create mode 100644 ru/docs/chapter_sorting/sorting_examples.png create mode 100644 ru/docs/chapter_sorting/summary.assets/sorting_algorithms_comparison.png create mode 100644 ru/docs/chapter_sorting/summary.md create mode 100644 ru/docs/chapter_stack_and_queue/deque.assets/array_deque_step1.png create mode 100644 ru/docs/chapter_stack_and_queue/deque.assets/array_deque_step2_push_last.png create mode 100644 ru/docs/chapter_stack_and_queue/deque.assets/array_deque_step3_push_first.png create mode 100644 ru/docs/chapter_stack_and_queue/deque.assets/array_deque_step4_pop_last.png create mode 100644 ru/docs/chapter_stack_and_queue/deque.assets/array_deque_step5_pop_first.png create mode 100644 ru/docs/chapter_stack_and_queue/deque.assets/deque_operations.png create mode 100644 ru/docs/chapter_stack_and_queue/deque.assets/linkedlist_deque_step1.png create mode 100644 ru/docs/chapter_stack_and_queue/deque.assets/linkedlist_deque_step2_push_last.png create mode 100644 ru/docs/chapter_stack_and_queue/deque.assets/linkedlist_deque_step3_push_first.png create mode 100644 ru/docs/chapter_stack_and_queue/deque.assets/linkedlist_deque_step4_pop_last.png create mode 100644 ru/docs/chapter_stack_and_queue/deque.assets/linkedlist_deque_step5_pop_first.png create mode 100644 ru/docs/chapter_stack_and_queue/deque.md create mode 100644 ru/docs/chapter_stack_and_queue/index.md create mode 100644 ru/docs/chapter_stack_and_queue/queue.assets/array_queue_step1.png create mode 100644 ru/docs/chapter_stack_and_queue/queue.assets/array_queue_step2_push.png create mode 100644 ru/docs/chapter_stack_and_queue/queue.assets/array_queue_step3_pop.png create mode 100644 ru/docs/chapter_stack_and_queue/queue.assets/linkedlist_queue_step1.png create mode 100644 ru/docs/chapter_stack_and_queue/queue.assets/linkedlist_queue_step2_push.png create mode 100644 ru/docs/chapter_stack_and_queue/queue.assets/linkedlist_queue_step3_pop.png create mode 100644 ru/docs/chapter_stack_and_queue/queue.assets/queue_operations.png create mode 100644 ru/docs/chapter_stack_and_queue/queue.md create mode 100644 ru/docs/chapter_stack_and_queue/stack.assets/array_stack_step1.png create mode 100644 ru/docs/chapter_stack_and_queue/stack.assets/array_stack_step2_push.png create mode 100644 ru/docs/chapter_stack_and_queue/stack.assets/array_stack_step3_pop.png create mode 100644 ru/docs/chapter_stack_and_queue/stack.assets/linkedlist_stack_step1.png create mode 100644 ru/docs/chapter_stack_and_queue/stack.assets/linkedlist_stack_step2_push.png create mode 100644 ru/docs/chapter_stack_and_queue/stack.assets/linkedlist_stack_step3_pop.png create mode 100644 ru/docs/chapter_stack_and_queue/stack.assets/stack_operations.png create mode 100644 ru/docs/chapter_stack_and_queue/stack.md create mode 100644 ru/docs/chapter_stack_and_queue/summary.md create mode 100644 ru/docs/chapter_tree/array_representation_of_tree.assets/array_representation_binary_tree.png create mode 100644 ru/docs/chapter_tree/array_representation_of_tree.assets/array_representation_complete_binary_tree.png create mode 100644 ru/docs/chapter_tree/array_representation_of_tree.assets/array_representation_with_empty.png create mode 100644 ru/docs/chapter_tree/array_representation_of_tree.assets/array_representation_without_empty.png create mode 100644 ru/docs/chapter_tree/array_representation_of_tree.md create mode 100644 ru/docs/chapter_tree/avl_tree.assets/avltree_degradation_from_inserting_node.png create mode 100644 ru/docs/chapter_tree/avl_tree.assets/avltree_degradation_from_removing_node.png create mode 100644 ru/docs/chapter_tree/avl_tree.assets/avltree_left_right_rotate.png create mode 100644 ru/docs/chapter_tree/avl_tree.assets/avltree_left_rotate.png create mode 100644 ru/docs/chapter_tree/avl_tree.assets/avltree_left_rotate_with_grandchild.png create mode 100644 ru/docs/chapter_tree/avl_tree.assets/avltree_right_left_rotate.png create mode 100644 ru/docs/chapter_tree/avl_tree.assets/avltree_right_rotate_step1.png create mode 100644 ru/docs/chapter_tree/avl_tree.assets/avltree_right_rotate_step2.png create mode 100644 ru/docs/chapter_tree/avl_tree.assets/avltree_right_rotate_step3.png create mode 100644 ru/docs/chapter_tree/avl_tree.assets/avltree_right_rotate_step4.png create mode 100644 ru/docs/chapter_tree/avl_tree.assets/avltree_right_rotate_with_grandchild.png create mode 100644 ru/docs/chapter_tree/avl_tree.assets/avltree_rotation_cases.png create mode 100644 ru/docs/chapter_tree/avl_tree.md create mode 100644 ru/docs/chapter_tree/binary_search_tree.assets/binary_search_tree.png create mode 100644 ru/docs/chapter_tree/binary_search_tree.assets/bst_degradation.png create mode 100644 ru/docs/chapter_tree/binary_search_tree.assets/bst_inorder_traversal.png create mode 100644 ru/docs/chapter_tree/binary_search_tree.assets/bst_insert.png create mode 100644 ru/docs/chapter_tree/binary_search_tree.assets/bst_remove_case1.png create mode 100644 ru/docs/chapter_tree/binary_search_tree.assets/bst_remove_case2.png create mode 100644 ru/docs/chapter_tree/binary_search_tree.assets/bst_remove_case3_step1.png create mode 100644 ru/docs/chapter_tree/binary_search_tree.assets/bst_remove_case3_step2.png create mode 100644 ru/docs/chapter_tree/binary_search_tree.assets/bst_remove_case3_step3.png create mode 100644 ru/docs/chapter_tree/binary_search_tree.assets/bst_remove_case3_step4.png create mode 100644 ru/docs/chapter_tree/binary_search_tree.assets/bst_search_step1.png create mode 100644 ru/docs/chapter_tree/binary_search_tree.assets/bst_search_step2.png create mode 100644 ru/docs/chapter_tree/binary_search_tree.assets/bst_search_step3.png create mode 100644 ru/docs/chapter_tree/binary_search_tree.assets/bst_search_step4.png create mode 100644 ru/docs/chapter_tree/binary_search_tree.md create mode 100644 ru/docs/chapter_tree/binary_tree.assets/balanced_binary_tree.png create mode 100644 ru/docs/chapter_tree/binary_tree.assets/binary_tree_add_remove.png create mode 100644 ru/docs/chapter_tree/binary_tree.assets/binary_tree_best_worst_cases.png create mode 100644 ru/docs/chapter_tree/binary_tree.assets/binary_tree_definition.png create mode 100644 ru/docs/chapter_tree/binary_tree.assets/binary_tree_terminology.png create mode 100644 ru/docs/chapter_tree/binary_tree.assets/complete_binary_tree.png create mode 100644 ru/docs/chapter_tree/binary_tree.assets/full_binary_tree.png create mode 100644 ru/docs/chapter_tree/binary_tree.assets/perfect_binary_tree.png create mode 100644 ru/docs/chapter_tree/binary_tree.md create mode 100644 ru/docs/chapter_tree/binary_tree_traversal.assets/binary_tree_bfs.png create mode 100644 ru/docs/chapter_tree/binary_tree_traversal.assets/binary_tree_dfs.png create mode 100644 ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step1.png create mode 100644 ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step10.png create mode 100644 ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step11.png create mode 100644 ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step2.png create mode 100644 ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step3.png create mode 100644 ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step4.png create mode 100644 ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step5.png create mode 100644 ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step6.png create mode 100644 ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step7.png create mode 100644 ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step8.png create mode 100644 ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step9.png create mode 100644 ru/docs/chapter_tree/binary_tree_traversal.md create mode 100644 ru/docs/chapter_tree/index.md create mode 100644 ru/docs/chapter_tree/summary.md create mode 100644 ru/docs/index.assets/animation.gif create mode 100644 ru/docs/index.assets/comment.gif create mode 100644 ru/docs/index.assets/running_code.gif create mode 100644 ru/docs/index.html create mode 100644 ru/docs/index.md create mode 100644 ru/mkdocs.yml diff --git a/README.md b/README.md index 58ccc3e7d..6b171db4e 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,8 @@ English日本語 + | + Русский

## 关于本书 diff --git a/en/README.md b/en/README.md index db534581f..1d444db02 100644 --- a/en/README.md +++ b/en/README.md @@ -45,6 +45,8 @@ English | 日本語 + | + Русский

## The book diff --git a/ja/README.md b/ja/README.md index 54f556580..733cc7763 100644 --- a/ja/README.md +++ b/ja/README.md @@ -43,6 +43,8 @@ English | 日本語 + | + Русский

## この本について diff --git a/mkdocs.yml b/mkdocs.yml index ccfd7023f..b63dba521 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -80,6 +80,9 @@ extra: - name: 日本語 link: /ja/ lang: ja + - name: Русский + link: /ru/ + lang: ru social: - icon: fontawesome/brands/github link: https://github.com/krahets diff --git a/ru/README.md b/ru/README.md new file mode 100644 index 000000000..df8a0e5da --- /dev/null +++ b/ru/README.md @@ -0,0 +1,101 @@ +

+ + +

+ +

+ hello-algo-typing-svg +
+ Учебник по структурам данных и алгоритмам с анимированными схемами и кодом, готовым к запуску в один клик +

+ +

+ Читать онлайн + | + Скачать PDF/EPUB +

+ +

+ + +

+ +

+ + + + + + + + + + + + + +

+ +

+ 简体中文 + | + 繁體中文 + | + English + | + 日本語 + | + Русский +

+ +## О книге + +Этот проект призван создать бесплатный, открытый и дружелюбный к начинающим учебник по структурам данных и алгоритмам. + +- Книга построена на анимированных схемах, понятном изложении и плавной кривой обучения, помогая начинающим выстроить карту знаний по структурам данных и алгоритмам. +- Исходный код можно запускать в один клик, чтобы на практике развивать навыки программирования и понимать, как работают алгоритмы и как устроены структуры данных внутри. +- Мы поддерживаем совместное обучение: задавайте вопросы, делитесь идеями и продвигайтесь вперед через обсуждение. + +Если книга оказалась вам полезной, пожалуйста, поставьте Star :star: в правом верхнем углу страницы. Спасибо! + +## Рекомендации + +> «Понятная вводная книга по структурам данных и алгоритмам, которая направляет читателя к обучению и умом, и руками. Настоятельно рекомендую начинающим изучать алгоритмы именно с нее.» +> +> **—— Junhui Deng, профессор факультета компьютерных наук Университета Цинхуа** + +> «Если бы у меня была “Hello Algo”, когда я изучал структуры данных и алгоритмы, учиться было бы в десять раз проще!» +> +> **—— Mu Li, Senior Principal Scientist, Amazon** + +## Благодарности + +

+ + Warp-Github-LG-02 +

+ +[Warp создан для программирования с несколькими AI-агентами.](https://go.warp.dev/hello-algo) + +Очень рекомендуем терминал Warp: красивый интерфейс, полезные AI-возможности и отличное общее впечатление от работы. + +## Участие + +Эта открытая книга продолжает активно развиваться, и мы будем рады вашему участию, чтобы сделать обучение для читателей еще качественнее. + +- [Исправление содержания](https://www.hello-algo.com/ru/chapter_appendix/contribution/): помогайте исправлять или указывать в комментариях грамматические ошибки, пропуски в содержании, двусмысленные формулировки, неработающие ссылки и баги в коде. +- [Перевод кода на другие языки](https://github.com/krahets/hello-algo/issues/15): приглашаем вносить вклад в код на разных языках программирования; сейчас уже поддерживаются Python, Java, C++, Go, JavaScript и другие. + +Будем рады вашим замечаниям и предложениям. Если у вас есть вопросы, создайте Issue или свяжитесь через WeChat: `krahets-jyd`. + +Мы благодарим каждого участника, работавшего над этой книгой. Именно их самоотверженный вклад делает ее лучше: + +

+ + + +

+ +## License + +The texts, code, images, photos, and videos in this repository are licensed under [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/). diff --git a/ru/codes/Dockerfile b/ru/codes/Dockerfile new file mode 100644 index 000000000..97d37bbcf --- /dev/null +++ b/ru/codes/Dockerfile @@ -0,0 +1,35 @@ +FROM ubuntu:latest + +# Use Ubuntu image from Aliyun +RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \ + sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \ + sed -i 's/ports.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list + +RUN apt-get update && apt-get install -y wget + +# Install languages environment +ARG LANGS +RUN for LANG in $LANGS; do \ + case $LANG in \ + python) \ + apt-get install -y python3.10 && \ + update-alternatives --install /usr/bin/python python /usr/bin/python3.10 1 ;; \ + cpp) \ + apt-get install -y g++ gdb ;; \ + java) \ + apt-get install -y openjdk-17-jdk ;; \ + csharp) \ + wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb && \ + dpkg -i packages-microsoft-prod.deb && \ + apt-get update && \ + apt-get install -y dotnet-sdk-8.0 ;; \ + # More languages... + *) \ + echo "Warning: No installation workflow for $LANG" ;; \ + esac \ + done + +WORKDIR /codes +COPY ./ ./ + +CMD ["/bin/bash"] diff --git a/ru/codes/c/.gitignore b/ru/codes/c/.gitignore new file mode 100644 index 000000000..698ee4e21 --- /dev/null +++ b/ru/codes/c/.gitignore @@ -0,0 +1,9 @@ +# Ignore all +* +# Unignore all with extensions +!*.* +# Unignore all dirs +!*/ +*.dSYM/ + +build/ diff --git a/ru/codes/c/CMakeLists.txt b/ru/codes/c/CMakeLists.txt new file mode 100644 index 000000000..bb5f8f6a9 --- /dev/null +++ b/ru/codes/c/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 3.10) +project(hello_algo C) + +set(CMAKE_C_STANDARD 11) + +include_directories(./include) + +add_subdirectory(chapter_computational_complexity) +add_subdirectory(chapter_array_and_linkedlist) +add_subdirectory(chapter_stack_and_queue) +add_subdirectory(chapter_hashing) +add_subdirectory(chapter_tree) +add_subdirectory(chapter_heap) +add_subdirectory(chapter_graph) +add_subdirectory(chapter_searching) +add_subdirectory(chapter_sorting) +add_subdirectory(chapter_divide_and_conquer) +add_subdirectory(chapter_backtracking) +add_subdirectory(chapter_dynamic_programming) +add_subdirectory(chapter_greedy) diff --git a/ru/codes/c/chapter_array_and_linkedlist/CMakeLists.txt b/ru/codes/c/chapter_array_and_linkedlist/CMakeLists.txt new file mode 100644 index 000000000..29677a0be --- /dev/null +++ b/ru/codes/c/chapter_array_and_linkedlist/CMakeLists.txt @@ -0,0 +1,3 @@ +add_executable(array array.c) +add_executable(linked_list linked_list.c) +add_executable(my_list my_list.c) \ No newline at end of file diff --git a/ru/codes/c/chapter_array_and_linkedlist/array.c b/ru/codes/c/chapter_array_and_linkedlist/array.c new file mode 100644 index 000000000..4f26b5a76 --- /dev/null +++ b/ru/codes/c/chapter_array_and_linkedlist/array.c @@ -0,0 +1,114 @@ +/** + * File: array.c + * Created Time: 2022-12-20 + * Author: MolDuM (moldum@163.com) + */ + +#include "../utils/common.h" + +/* Случайный доступ к элементу */ +int randomAccess(int *nums, int size) { + // Случайным образом выбрать число из интервала [0, size) + int randomIndex = rand() % size; + // Получить и вернуть случайный элемент + int randomNum = nums[randomIndex]; + return randomNum; +} + +/* Увеличить длину массива */ +int *extend(int *nums, int size, int enlarge) { + // Инициализировать массив увеличенной длины + int *res = (int *)malloc(sizeof(int) * (size + enlarge)); + // Скопировать все элементы исходного массива в новый массив + for (int i = 0; i < size; i++) { + res[i] = nums[i]; + } + // Инициализировать расширенное пространство + for (int i = size; i < size + enlarge; i++) { + res[i] = 0; + } + // Вернуть новый массив после расширения + return res; +} + +/* Вставить элемент num по индексу index в массив */ +void insert(int *nums, int size, int num, int index) { + // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад + for (int i = size - 1; i > index; i--) { + nums[i] = nums[i - 1]; + } + // Присвоить num элементу по индексу index + nums[index] = num; +} + +/* Удалить элемент по индексу index */ +// Внимание: stdio.h уже использует ключевое слово remove +void removeItem(int *nums, int size, int index) { + // Сдвинуть все элементы после индекса index на одну позицию вперед + for (int i = index; i < size - 1; i++) { + nums[i] = nums[i + 1]; + } +} + +/* Обход массива */ +void traverse(int *nums, int size) { + int count = 0; + // Обход массива по индексам + for (int i = 0; i < size; i++) { + count += nums[i]; + } +} + +/* Найти заданный элемент в массиве */ +int find(int *nums, int size, int target) { + for (int i = 0; i < size; i++) { + if (nums[i] == target) + return i; + } + return -1; +} + +/* Driver Code */ +int main() { + /* Инициализация массива */ + int size = 5; + int arr[5]; + printf("Массив arr = "); + printArray(arr, size); + + int nums[] = {1, 3, 2, 5, 4}; + printf("Массив nums = "); + printArray(nums, size); + + /* Случайный доступ */ + int randomNum = randomAccess(nums, size); + printf("Случайный элемент из nums = %d", randomNum); + + /* Расширение длины */ + int enlarge = 3; + int *res = extend(nums, size, enlarge); + size += enlarge; + printf("После увеличения длины массива до 8 nums = "); + printArray(res, size); + + /* Вставка элемента */ + insert(res, size, 6, 3); + printf("После вставки числа 6 по индексу 3 nums = "); + printArray(res, size); + + /* Удаление элемента */ + removeItem(res, size, 2); + printf("После удаления элемента по индексу 2 nums = "); + printArray(res, size); + + /* Обход массива */ + traverse(res, size); + + /* Поиск элемента */ + int index = find(res, size, 3); + printf("Индекс элемента 3 в res = %d\n", index); + + /* Освободить память */ + free(res); + return 0; +} diff --git a/ru/codes/c/chapter_array_and_linkedlist/linked_list.c b/ru/codes/c/chapter_array_and_linkedlist/linked_list.c new file mode 100644 index 000000000..99f595b59 --- /dev/null +++ b/ru/codes/c/chapter_array_and_linkedlist/linked_list.c @@ -0,0 +1,89 @@ +/** + * File: linked_list.c + * Created Time: 2023-01-12 + * Author: Zero (glj0@outlook.com) + */ + +#include "../utils/common.h" + +/* Вставить узел P после узла n0 в связном списке */ +void insert(ListNode *n0, ListNode *P) { + ListNode *n1 = n0->next; + P->next = n1; + n0->next = P; +} + +/* Удалить первый узел после узла n0 в связном списке */ +// Внимание: stdio.h уже использует ключевое слово remove +void removeItem(ListNode *n0) { + if (!n0->next) + return; + // n0 -> P -> n1 + ListNode *P = n0->next; + ListNode *n1 = P->next; + n0->next = n1; + // Освободить память + free(P); +} + +/* Доступ к узлу связного списка по индексу index */ +ListNode *access(ListNode *head, int index) { + for (int i = 0; i < index; i++) { + if (head == NULL) + return NULL; + head = head->next; + } + return head; +} + +/* Найти в связном списке первый узел со значением target */ +int find(ListNode *head, int target) { + int index = 0; + while (head) { + if (head->val == target) + return index; + head = head->next; + index++; + } + return -1; +} + +/* Driver Code */ +int main() { + /* Инициализация связного списка */ + // Инициализация всех узлов + ListNode *n0 = newListNode(1); + ListNode *n1 = newListNode(3); + ListNode *n2 = newListNode(2); + ListNode *n3 = newListNode(5); + ListNode *n4 = newListNode(4); + // Построить ссылки между узлами + n0->next = n1; + n1->next = n2; + n2->next = n3; + n3->next = n4; + printf("Инициализированный связный список\r\n"); + printLinkedList(n0); + + /* Вставка узла */ + insert(n0, newListNode(0)); + printf("Связный список после вставки узла\r\n"); + printLinkedList(n0); + + /* Удаление узла */ + removeItem(n0); + printf("Связный список после удаления узла\r\n"); + printLinkedList(n0); + + /* Доступ к узлу */ + ListNode *node = access(n0, 3); + printf("Значение узла по индексу 3 в связном списке = %d\r\n", node->val); + + /* Поиск узла */ + int index = find(n0, 2); + printf("Индекс узла со значением 2 в связном списке = %d\r\n", index); + + // Освободить память + freeMemoryLinkedList(n0); + return 0; +} diff --git a/ru/codes/c/chapter_array_and_linkedlist/my_list.c b/ru/codes/c/chapter_array_and_linkedlist/my_list.c new file mode 100644 index 000000000..3817de31a --- /dev/null +++ b/ru/codes/c/chapter_array_and_linkedlist/my_list.c @@ -0,0 +1,163 @@ +/** + * File: my_list.c + * Created Time: 2023-01-12 + * Author: Zero (glj0@outlook.com) + */ + +#include "../utils/common.h" + +/* Класс списка */ +typedef struct { + int *arr; // Массив (для хранения элементов списка) + int capacity; // Вместимость списка + int size; // Размер списка + int extendRatio; // Коэффициент расширения списка при каждом увеличении +} MyList; + +void extendCapacity(MyList *nums); + +/* Конструктор */ +MyList *newMyList() { + MyList *nums = malloc(sizeof(MyList)); + nums->capacity = 10; + nums->arr = malloc(sizeof(int) * nums->capacity); + nums->size = 0; + nums->extendRatio = 2; + return nums; +} + +/* Деструктор */ +void delMyList(MyList *nums) { + free(nums->arr); + free(nums); +} + +/* Получить длину списка */ +int size(MyList *nums) { + return nums->size; +} + +/* Получить вместимость списка */ +int capacity(MyList *nums) { + return nums->capacity; +} + +/* Доступ к элементу */ +int get(MyList *nums, int index) { + assert(index >= 0 && index < nums->size); + return nums->arr[index]; +} + +/* Обновление элемента */ +void set(MyList *nums, int index, int num) { + assert(index >= 0 && index < nums->size); + nums->arr[index] = num; +} + +/* Добавление элемента в конец */ +void add(MyList *nums, int num) { + if (size(nums) == capacity(nums)) { + extendCapacity(nums); // Расширение емкости + } + nums->arr[size(nums)] = num; + nums->size++; +} + +/* Вставка элемента в середину */ +void insert(MyList *nums, int index, int num) { + assert(index >= 0 && index < size(nums)); + // При превышении вместимости по числу элементов запускается расширение + if (size(nums) == capacity(nums)) { + extendCapacity(nums); // Расширение емкости + } + for (int i = size(nums); i > index; --i) { + nums->arr[i] = nums->arr[i - 1]; + } + nums->arr[index] = num; + nums->size++; +} + +/* Удаление элемента */ +// Внимание: stdio.h уже использует ключевое слово remove +int removeItem(MyList *nums, int index) { + assert(index >= 0 && index < size(nums)); + int num = nums->arr[index]; + for (int i = index; i < size(nums) - 1; i++) { + nums->arr[i] = nums->arr[i + 1]; + } + nums->size--; + return num; +} + +/* Расширение списка */ +void extendCapacity(MyList *nums) { + // Сначала выделить память + int newCapacity = capacity(nums) * nums->extendRatio; + int *extend = (int *)malloc(sizeof(int) * newCapacity); + int *temp = nums->arr; + + // Скопировать старые данные в новые + for (int i = 0; i < size(nums); i++) + extend[i] = nums->arr[i]; + + // Освободить старые данные + free(temp); + + // Обновить новые данные + nums->arr = extend; + nums->capacity = newCapacity; +} + +/* Преобразовать список в Array для вывода */ +int *toArray(MyList *nums) { + return nums->arr; +} + +/* Driver Code */ +int main() { + /* Инициализация списка */ + MyList *nums = newMyList(); + /* Добавление элемента в конец */ + add(nums, 1); + add(nums, 3); + add(nums, 2); + add(nums, 5); + add(nums, 4); + printf("Список nums = "); + printArray(toArray(nums), size(nums)); + printf("Вместимость = %d, длина = %d\n", capacity(nums), size(nums)); + + /* Вставка элемента в середину */ + insert(nums, 3, 6); + printf("После вставки числа 6 по индексу 3 nums = "); + printArray(toArray(nums), size(nums)); + + /* Удаление элемента */ + removeItem(nums, 3); + printf("После удаления элемента по индексу 3 nums = "); + printArray(toArray(nums), size(nums)); + + /* Доступ к элементу */ + int num = get(nums, 1); + printf("Элемент по индексу 1: num = %d\n", num); + + /* Обновление элемента */ + set(nums, 1, 0); + printf("После обновления элемента по индексу 1 на 0 nums = "); + printArray(toArray(nums), size(nums)); + + /* Проверка механизма расширения */ + for (int i = 0; i < 10; i++) { + // При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения + add(nums, i); + } + + printf("После расширения список nums = "); + printArray(toArray(nums), size(nums)); + printf("Вместимость = %d, длина = %d\n", capacity(nums), size(nums)); + + /* Освободить выделенную память */ + delMyList(nums); + + return 0; +} diff --git a/ru/codes/c/chapter_backtracking/CMakeLists.txt b/ru/codes/c/chapter_backtracking/CMakeLists.txt new file mode 100644 index 000000000..70161b6dd --- /dev/null +++ b/ru/codes/c/chapter_backtracking/CMakeLists.txt @@ -0,0 +1,10 @@ +add_executable(permutations_i permutations_i.c) +add_executable(permutations_ii permutations_ii.c) +add_executable(preorder_traversal_i_compact preorder_traversal_i_compact.c) +add_executable(preorder_traversal_ii_compact preorder_traversal_ii_compact.c) +add_executable(preorder_traversal_iii_compact preorder_traversal_iii_compact.c) +add_executable(preorder_traversal_iii_template preorder_traversal_iii_template.c) +add_executable(subset_sum_i_naive subset_sum_i_naive.c) +add_executable(subset_sum_i subset_sum_i.c) +add_executable(subset_sum_ii subset_sum_ii.c) +add_executable(n_queens n_queens.c) \ No newline at end of file diff --git a/ru/codes/c/chapter_backtracking/n_queens.c b/ru/codes/c/chapter_backtracking/n_queens.c new file mode 100644 index 000000000..929da94a8 --- /dev/null +++ b/ru/codes/c/chapter_backtracking/n_queens.c @@ -0,0 +1,95 @@ +/** + * File : n_queens.c + * Created Time: 2023-09-25 + * Author : lucas (superrat6@gmail.com) + */ + +#include "../utils/common.h" + +#define MAX_SIZE 100 + +/* Алгоритм бэктрекинга: n ферзей */ +void backtrack(int row, int n, char state[MAX_SIZE][MAX_SIZE], char ***res, int *resSize, bool cols[MAX_SIZE], + bool diags1[2 * MAX_SIZE - 1], bool diags2[2 * MAX_SIZE - 1]) { + // Когда все строки уже обработаны, записать решение + if (row == n) { + res[*resSize] = (char **)malloc(sizeof(char *) * n); + for (int i = 0; i < n; ++i) { + res[*resSize][i] = (char *)malloc(sizeof(char) * (n + 1)); + strcpy(res[*resSize][i], state[i]); + } + (*resSize)++; + return; + } + // Обойти все столбцы + for (int col = 0; col < n; col++) { + // Вычислить главную и побочную диагонали, соответствующие этой клетке + int diag1 = row - col + n - 1; + int diag2 = row + col; + // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей + if (!cols[col] && !diags1[diag1] && !diags2[diag2]) { + // Попытка: поставить ферзя в эту клетку + state[row][col] = 'Q'; + cols[col] = diags1[diag1] = diags2[diag2] = true; + // Перейти к размещению следующей строки + backtrack(row + 1, n, state, res, resSize, cols, diags1, diags2); + // Откат: восстановить эту клетку как пустую + state[row][col] = '#'; + cols[col] = diags1[diag1] = diags2[diag2] = false; + } + } +} + +/* Решить задачу о n ферзях */ +char ***nQueens(int n, int *returnSize) { + char state[MAX_SIZE][MAX_SIZE]; + // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку + for (int i = 0; i < n; ++i) { + for (int j = 0; j < n; ++j) { + state[i][j] = '#'; + } + state[i][n] = '\0'; + } + bool cols[MAX_SIZE] = {false}; // Отмечать, есть ли ферзь в столбце + bool diags1[2 * MAX_SIZE - 1] = {false}; // Отмечать наличие ферзя на главной диагонали + bool diags2[2 * MAX_SIZE - 1] = {false}; // Отмечать наличие ферзя на побочной диагонали + + char ***res = (char ***)malloc(sizeof(char **) * MAX_SIZE); + *returnSize = 0; + backtrack(0, n, state, res, returnSize, cols, diags1, diags2); + return res; +} + +/* Driver Code */ +int main() { + int n = 4; + int returnSize; + char ***res = nQueens(n, &returnSize); + + printf("Размер входной доски = %d\n", n); + printf("Количество способов расстановки ферзей: %d\n", returnSize); + for (int i = 0; i < returnSize; ++i) { + for (int j = 0; j < n; ++j) { + printf("["); + for (int k = 0; res[i][j][k] != '\0'; ++k) { + printf("%c", res[i][j][k]); + if (res[i][j][k + 1] != '\0') { + printf(", "); + } + } + printf("]\n"); + } + printf("---------------------\n"); + } + + // Освободить память + for (int i = 0; i < returnSize; ++i) { + for (int j = 0; j < n; ++j) { + free(res[i][j]); + } + free(res[i]); + } + free(res); + + return 0; +} diff --git a/ru/codes/c/chapter_backtracking/permutations_i.c b/ru/codes/c/chapter_backtracking/permutations_i.c new file mode 100644 index 000000000..5a94d4647 --- /dev/null +++ b/ru/codes/c/chapter_backtracking/permutations_i.c @@ -0,0 +1,79 @@ +/** + * File: permutations_i.c + * Created Time: 2023-06-04 + * Author: Gonglja (glj0@outlook.com), krahets (krahets@163.com) + */ + +#include "../utils/common.h" + +// Предположим, что существует не более 1000 перестановок +#define MAX_SIZE 1000 + +/* Алгоритм бэктрекинга: все перестановки I */ +void backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) { + // Когда длина состояния равна числу элементов, записать решение + if (stateSize == choicesSize) { + res[*resSize] = (int *)malloc(choicesSize * sizeof(int)); + for (int i = 0; i < choicesSize; i++) { + res[*resSize][i] = state[i]; + } + (*resSize)++; + return; + } + // Перебор всех вариантов выбора + for (int i = 0; i < choicesSize; i++) { + int choice = choices[i]; + // Отсечение: нельзя выбирать один и тот же элемент повторно + if (!selected[i]) { + // Попытка: сделать выбор и обновить состояние + selected[i] = true; + state[stateSize] = choice; + // Перейти к следующему выбору + backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize); + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false; + } + } +} + +/* Все перестановки I */ +int **permutationsI(int *nums, int numsSize, int *returnSize) { + int *state = (int *)malloc(numsSize * sizeof(int)); + bool *selected = (bool *)malloc(numsSize * sizeof(bool)); + for (int i = 0; i < numsSize; i++) { + selected[i] = false; + } + int **res = (int **)malloc(MAX_SIZE * sizeof(int *)); + *returnSize = 0; + + backtrack(state, 0, nums, numsSize, selected, res, returnSize); + + free(state); + free(selected); + + return res; +} + +/* Driver Code */ +int main() { + int nums[] = {1, 2, 3}; + int numsSize = sizeof(nums) / sizeof(nums[0]); + int returnSize; + + int **res = permutationsI(nums, numsSize, &returnSize); + + printf("Входной массив nums = "); + printArray(nums, numsSize); + printf("\nВсе перестановки res = \n"); + for (int i = 0; i < returnSize; i++) { + printArray(res[i], numsSize); + } + + // Освободить память + for (int i = 0; i < returnSize; i++) { + free(res[i]); + } + free(res); + + return 0; +} diff --git a/ru/codes/c/chapter_backtracking/permutations_ii.c b/ru/codes/c/chapter_backtracking/permutations_ii.c new file mode 100644 index 000000000..2caa13b50 --- /dev/null +++ b/ru/codes/c/chapter_backtracking/permutations_ii.c @@ -0,0 +1,81 @@ +/** + * File: permutations_ii.c + * Created Time: 2023-10-17 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.h" + +// Предположить, что существует не более 1000 перестановок, а максимальный элемент равен 1000 +#define MAX_SIZE 1000 + +/* Алгоритм бэктрекинга: все перестановки II */ +void backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) { + // Когда длина состояния равна числу элементов, записать решение + if (stateSize == choicesSize) { + res[*resSize] = (int *)malloc(choicesSize * sizeof(int)); + for (int i = 0; i < choicesSize; i++) { + res[*resSize][i] = state[i]; + } + (*resSize)++; + return; + } + // Перебор всех вариантов выбора + bool duplicated[MAX_SIZE] = {false}; + for (int i = 0; i < choicesSize; i++) { + int choice = choices[i]; + // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы + if (!selected[i] && !duplicated[choice]) { + // Попытка: сделать выбор и обновить состояние + duplicated[choice] = true; // Записать значения уже выбранных элементов + selected[i] = true; + state[stateSize] = choice; + // Перейти к следующему выбору + backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize); + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false; + } + } +} + +/* Все перестановки II */ +int **permutationsII(int *nums, int numsSize, int *returnSize) { + int *state = (int *)malloc(numsSize * sizeof(int)); + bool *selected = (bool *)malloc(numsSize * sizeof(bool)); + for (int i = 0; i < numsSize; i++) { + selected[i] = false; + } + int **res = (int **)malloc(MAX_SIZE * sizeof(int *)); + *returnSize = 0; + + backtrack(state, 0, nums, numsSize, selected, res, returnSize); + + free(state); + free(selected); + + return res; +} + +/* Driver Code */ +int main() { + int nums[] = {1, 1, 2}; + int numsSize = sizeof(nums) / sizeof(nums[0]); + int returnSize; + + int **res = permutationsII(nums, numsSize, &returnSize); + + printf("Входной массив nums = "); + printArray(nums, numsSize); + printf("\nВсе перестановки res = \n"); + for (int i = 0; i < returnSize; i++) { + printArray(res[i], numsSize); + } + + // Освободить память + for (int i = 0; i < returnSize; i++) { + free(res[i]); + } + free(res); + + return 0; +} diff --git a/ru/codes/c/chapter_backtracking/preorder_traversal_i_compact.c b/ru/codes/c/chapter_backtracking/preorder_traversal_i_compact.c new file mode 100644 index 000000000..0dffbb407 --- /dev/null +++ b/ru/codes/c/chapter_backtracking/preorder_traversal_i_compact.c @@ -0,0 +1,49 @@ +/** + * File: preorder_traversal_i_compact.c + * Created Time: 2023-05-10 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +// Предположить, что длина результата не превышает 100 +#define MAX_SIZE 100 + +TreeNode *res[MAX_SIZE]; +int resSize = 0; + +/* Предварительный обход: пример 1 */ +void preOrder(TreeNode *root) { + if (root == NULL) { + return; + } + if (root->val == 7) { + // Записать решение + res[resSize++] = root; + } + preOrder(root->left); + preOrder(root->right); +} + +/* Driver Code */ +int main() { + int arr[] = {1, 7, 3, 4, 5, 6, 7}; + TreeNode *root = arrayToTree(arr, sizeof(arr) / sizeof(arr[0])); + printf("\nИнициализация двоичного дерева\n"); + printTree(root); + + // Предварительный обход + preOrder(root); + + printf("\nВывести все узлы со значением 7\n"); + int *vals = malloc(resSize * sizeof(int)); + for (int i = 0; i < resSize; i++) { + vals[i] = res[i]->val; + } + printArray(vals, resSize); + + // Освободить память + freeMemoryTree(root); + free(vals); + return 0; +} diff --git a/ru/codes/c/chapter_backtracking/preorder_traversal_ii_compact.c b/ru/codes/c/chapter_backtracking/preorder_traversal_ii_compact.c new file mode 100644 index 000000000..3b5983e38 --- /dev/null +++ b/ru/codes/c/chapter_backtracking/preorder_traversal_ii_compact.c @@ -0,0 +1,61 @@ +/** + * File: preorder_traversal_ii_compact.c + * Created Time: 2023-05-28 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +// Предположим, что длина пути и результата не превышает 100 +#define MAX_SIZE 100 +#define MAX_RES_SIZE 100 + +TreeNode *path[MAX_SIZE]; +TreeNode *res[MAX_RES_SIZE][MAX_SIZE]; +int pathSize = 0, resSize = 0; + +/* Предварительный обход: пример 2 */ +void preOrder(TreeNode *root) { + if (root == NULL) { + return; + } + // Попытка + path[pathSize++] = root; + if (root->val == 7) { + // Записать решение + for (int i = 0; i < pathSize; ++i) { + res[resSize][i] = path[i]; + } + resSize++; + } + preOrder(root->left); + preOrder(root->right); + // Откат + pathSize--; +} + +/* Driver Code */ +int main() { + int arr[] = {1, 7, 3, 4, 5, 6, 7}; + TreeNode *root = arrayToTree(arr, sizeof(arr) / sizeof(arr[0])); + printf("\nИнициализация двоичного дерева\n"); + printTree(root); + + // Предварительный обход + preOrder(root); + + printf("\nВывести все пути от корня к узлу 7\n"); + for (int i = 0; i < resSize; ++i) { + int *vals = malloc(MAX_SIZE * sizeof(int)); + int size = 0; + for (int j = 0; res[i][j] != NULL; ++j) { + vals[size++] = res[i][j]->val; + } + printArray(vals, size); + free(vals); + } + + // Освободить память + freeMemoryTree(root); + return 0; +} diff --git a/ru/codes/c/chapter_backtracking/preorder_traversal_iii_compact.c b/ru/codes/c/chapter_backtracking/preorder_traversal_iii_compact.c new file mode 100644 index 000000000..7a4e03adf --- /dev/null +++ b/ru/codes/c/chapter_backtracking/preorder_traversal_iii_compact.c @@ -0,0 +1,62 @@ +/** + * File: preorder_traversal_iii_compact.c + * Created Time: 2023-06-04 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +// Предположим, что длина пути и результата не превышает 100 +#define MAX_SIZE 100 +#define MAX_RES_SIZE 100 + +TreeNode *path[MAX_SIZE]; +TreeNode *res[MAX_RES_SIZE][MAX_SIZE]; +int pathSize = 0, resSize = 0; + +/* Предварительный обход: пример 3 */ +void preOrder(TreeNode *root) { + // Отсечение + if (root == NULL || root->val == 3) { + return; + } + // Попытка + path[pathSize++] = root; + if (root->val == 7) { + // Записать решение + for (int i = 0; i < pathSize; i++) { + res[resSize][i] = path[i]; + } + resSize++; + } + preOrder(root->left); + preOrder(root->right); + // Откат + pathSize--; +} + +/* Driver Code */ +int main() { + int arr[] = {1, 7, 3, 4, 5, 6, 7}; + TreeNode *root = arrayToTree(arr, sizeof(arr) / sizeof(arr[0])); + printf("\nИнициализация двоичного дерева\n"); + printTree(root); + + // Предварительный обход + preOrder(root); + + printf("\nВывести все пути от корня к узлу 7, не содержащие узлов со значением 3\n"); + for (int i = 0; i < resSize; ++i) { + int *vals = malloc(MAX_SIZE * sizeof(int)); + int size = 0; + for (int j = 0; res[i][j] != NULL; ++j) { + vals[size++] = res[i][j]->val; + } + printArray(vals, size); + free(vals); + } + + // Освободить память + freeMemoryTree(root); + return 0; +} diff --git a/ru/codes/c/chapter_backtracking/preorder_traversal_iii_template.c b/ru/codes/c/chapter_backtracking/preorder_traversal_iii_template.c new file mode 100644 index 000000000..98ad4a116 --- /dev/null +++ b/ru/codes/c/chapter_backtracking/preorder_traversal_iii_template.c @@ -0,0 +1,93 @@ +/** + * File: preorder_traversal_iii_template.c + * Created Time: 2023-06-04 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +// Предположим, что длина пути и результата не превышает 100 +#define MAX_SIZE 100 +#define MAX_RES_SIZE 100 + +TreeNode *path[MAX_SIZE]; +TreeNode *res[MAX_RES_SIZE][MAX_SIZE]; +int pathSize = 0, resSize = 0; + +/* Проверить, является ли текущее состояние решением */ +bool isSolution(void) { + return pathSize > 0 && path[pathSize - 1]->val == 7; +} + +/* Записать решение */ +void recordSolution(void) { + for (int i = 0; i < pathSize; i++) { + res[resSize][i] = path[i]; + } + resSize++; +} + +/* Проверить, допустим ли этот выбор в текущем состоянии */ +bool isValid(TreeNode *choice) { + return choice != NULL && choice->val != 3; +} + +/* Обновить состояние */ +void makeChoice(TreeNode *choice) { + path[pathSize++] = choice; +} + +/* Восстановить состояние */ +void undoChoice(void) { + pathSize--; +} + +/* Алгоритм бэктрекинга: пример 3 */ +void backtrack(TreeNode *choices[2]) { + // Проверить, является ли текущее состояние решением + if (isSolution()) { + // Записать решение + recordSolution(); + } + // Перебор всех вариантов выбора + for (int i = 0; i < 2; i++) { + TreeNode *choice = choices[i]; + // Отсечение: проверить допустимость выбора + if (isValid(choice)) { + // Попытка: сделать выбор и обновить состояние + makeChoice(choice); + // Перейти к следующему выбору + TreeNode *nextChoices[2] = {choice->left, choice->right}; + backtrack(nextChoices); + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(); + } + } +} + +/* Driver Code */ +int main() { + int arr[] = {1, 7, 3, 4, 5, 6, 7}; + TreeNode *root = arrayToTree(arr, sizeof(arr) / sizeof(arr[0])); + printf("\nИнициализация двоичного дерева\n"); + printTree(root); + + // Алгоритм бэктрекинга + TreeNode *choices[2] = {root, NULL}; + backtrack(choices); + + printf("\nВывести все пути от корня к узлу 7, не содержащие узлов со значением 3\n"); + for (int i = 0; i < resSize; ++i) { + int *vals = malloc(MAX_SIZE * sizeof(int)); + int size = 0; + for (int j = 0; res[i][j] != NULL; ++j) { + vals[size++] = res[i][j]->val; + } + printArray(vals, size); + free(vals); + } + + // Освободить память + freeMemoryTree(root); + return 0; +} diff --git a/ru/codes/c/chapter_backtracking/subset_sum_i.c b/ru/codes/c/chapter_backtracking/subset_sum_i.c new file mode 100644 index 000000000..ec5374445 --- /dev/null +++ b/ru/codes/c/chapter_backtracking/subset_sum_i.c @@ -0,0 +1,78 @@ +/** + * File: subset_sum_i.c + * Created Time: 2023-07-29 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +#define MAX_SIZE 100 +#define MAX_RES_SIZE 100 + +// Состояние (подмножество) +int state[MAX_SIZE]; +int stateSize = 0; + +// Список результатов (список подмножеств) +int res[MAX_RES_SIZE][MAX_SIZE]; +int resColSizes[MAX_RES_SIZE]; +int resSize = 0; + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +void backtrack(int target, int *choices, int choicesSize, int start) { + // Если сумма подмножества равна target, записать решение + if (target == 0) { + for (int i = 0; i < stateSize; ++i) { + res[resSize][i] = state[i]; + } + resColSizes[resSize++] = stateSize; + return; + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + for (int i = start; i < choicesSize; i++) { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if (target - choices[i] < 0) { + break; + } + // Попытка: сделать выбор и обновить target и start + state[stateSize] = choices[i]; + stateSize++; + // Перейти к следующему выбору + backtrack(target - choices[i], choices, choicesSize, i); + // Откат: отменить выбор и восстановить предыдущее состояние + stateSize--; + } +} + +/* Функция сравнения */ +int cmp(const void *a, const void *b) { + return (*(int *)a - *(int *)b); +} + +/* Решить задачу суммы подмножеств I */ +void subsetSumI(int *nums, int numsSize, int target) { + qsort(nums, numsSize, sizeof(int), cmp); // Отсортировать nums + int start = 0; // Стартовая вершина обхода + backtrack(target, nums, numsSize, start); +} + +/* Driver Code */ +int main() { + int nums[] = {3, 4, 5}; + int numsSize = sizeof(nums) / sizeof(nums[0]); + int target = 9; + + subsetSumI(nums, numsSize, target); + + printf("Входной массив nums = "); + printArray(nums, numsSize); + printf("target = %d\n", target); + printf("Все подмножества с суммой %d: \n", target); + for (int i = 0; i < resSize; ++i) { + printArray(res[i], resColSizes[i]); + } + + return 0; +} diff --git a/ru/codes/c/chapter_backtracking/subset_sum_i_naive.c b/ru/codes/c/chapter_backtracking/subset_sum_i_naive.c new file mode 100644 index 000000000..a606a7366 --- /dev/null +++ b/ru/codes/c/chapter_backtracking/subset_sum_i_naive.c @@ -0,0 +1,69 @@ +/** + * File: subset_sum_i_naive.c + * Created Time: 2023-07-28 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +#define MAX_SIZE 100 +#define MAX_RES_SIZE 100 + +// Состояние (подмножество) +int state[MAX_SIZE]; +int stateSize = 0; + +// Список результатов (список подмножеств) +int res[MAX_RES_SIZE][MAX_SIZE]; +int resColSizes[MAX_RES_SIZE]; +int resSize = 0; + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +void backtrack(int target, int total, int *choices, int choicesSize) { + // Если сумма подмножества равна target, записать решение + if (total == target) { + for (int i = 0; i < stateSize; i++) { + res[resSize][i] = state[i]; + } + resColSizes[resSize++] = stateSize; + return; + } + // Перебор всех вариантов выбора + for (int i = 0; i < choicesSize; i++) { + // Отсечение: если сумма подмножества превышает target, пропустить этот выбор + if (total + choices[i] > target) { + continue; + } + // Попытка: сделать выбор и обновить элемент и total + state[stateSize++] = choices[i]; + // Перейти к следующему выбору + backtrack(target, total + choices[i], choices, choicesSize); + // Откат: отменить выбор и восстановить предыдущее состояние + stateSize--; + } +} + +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */ +void subsetSumINaive(int *nums, int numsSize, int target) { + resSize = 0; // Инициализировать число решений нулем + backtrack(target, 0, nums, numsSize); +} + +/* Driver Code */ +int main() { + int nums[] = {3, 4, 5}; + int numsSize = sizeof(nums) / sizeof(nums[0]); + int target = 9; + + subsetSumINaive(nums, numsSize, target); + + printf("Входной массив nums = "); + printArray(nums, numsSize); + printf("target = %d\n", target); + printf("Все подмножества с суммой %d: \n", target); + for (int i = 0; i < resSize; i++) { + printArray(res[i], resColSizes[i]); + } + + return 0; +} diff --git a/ru/codes/c/chapter_backtracking/subset_sum_ii.c b/ru/codes/c/chapter_backtracking/subset_sum_ii.c new file mode 100644 index 000000000..9ea1c791b --- /dev/null +++ b/ru/codes/c/chapter_backtracking/subset_sum_ii.c @@ -0,0 +1,83 @@ +/** + * File: subset_sum_ii.c + * Created Time: 2023-07-29 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +#define MAX_SIZE 100 +#define MAX_RES_SIZE 100 + +// Состояние (подмножество) +int state[MAX_SIZE]; +int stateSize = 0; + +// Список результатов (список подмножеств) +int res[MAX_RES_SIZE][MAX_SIZE]; +int resColSizes[MAX_RES_SIZE]; +int resSize = 0; + +/* Алгоритм бэктрекинга: сумма подмножеств II */ +void backtrack(int target, int *choices, int choicesSize, int start) { + // Если сумма подмножества равна target, записать решение + if (target == 0) { + for (int i = 0; i < stateSize; i++) { + res[resSize][i] = state[i]; + } + resColSizes[resSize++] = stateSize; + return; + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента + for (int i = start; i < choicesSize; i++) { + // Отсечение 1: если сумма подмножества превышает target, сразу пропустить + if (target - choices[i] < 0) { + continue; + } + // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить + if (i > start && choices[i] == choices[i - 1]) { + continue; + } + // Попытка: сделать выбор и обновить target и start + state[stateSize] = choices[i]; + stateSize++; + // Перейти к следующему выбору + backtrack(target - choices[i], choices, choicesSize, i + 1); + // Откат: отменить выбор и восстановить предыдущее состояние + stateSize--; + } +} + +/* Функция сравнения */ +int cmp(const void *a, const void *b) { + return (*(int *)a - *(int *)b); +} + +/* Решить задачу суммы подмножеств II */ +void subsetSumII(int *nums, int numsSize, int target) { + // Отсортировать nums + qsort(nums, numsSize, sizeof(int), cmp); + // Начать бэктрекинг + backtrack(target, nums, numsSize, 0); +} + +/* Driver Code */ +int main() { + int nums[] = {4, 4, 5}; + int numsSize = sizeof(nums) / sizeof(nums[0]); + int target = 9; + + subsetSumII(nums, numsSize, target); + + printf("Входной массив nums = "); + printArray(nums, numsSize); + printf("target = %d\n", target); + printf("Все подмножества с суммой %d: \n", target); + for (int i = 0; i < resSize; ++i) { + printArray(res[i], resColSizes[i]); + } + + return 0; +} diff --git a/ru/codes/c/chapter_computational_complexity/CMakeLists.txt b/ru/codes/c/chapter_computational_complexity/CMakeLists.txt new file mode 100644 index 000000000..dcfa063c3 --- /dev/null +++ b/ru/codes/c/chapter_computational_complexity/CMakeLists.txt @@ -0,0 +1,5 @@ +add_executable(iteration iteration.c) +add_executable(recursion recursion.c) +add_executable(time_complexity time_complexity.c) +add_executable(worst_best_time_complexity worst_best_time_complexity.c) +add_executable(space_complexity space_complexity.c) diff --git a/ru/codes/c/chapter_computational_complexity/iteration.c b/ru/codes/c/chapter_computational_complexity/iteration.c new file mode 100644 index 000000000..00f6a9904 --- /dev/null +++ b/ru/codes/c/chapter_computational_complexity/iteration.c @@ -0,0 +1,81 @@ +/** + * File: iteration.c + * Created Time: 2023-09-09 + * Author: Gonglja (glj0@outlook.com), MwumLi (mwumli@hotmail.com) + */ + +#include "../utils/common.h" + +/* Цикл for */ +int forLoop(int n) { + int res = 0; + // Циклическое суммирование 1, 2, ..., n-1, n + for (int i = 1; i <= n; i++) { + res += i; + } + return res; +} + +/* Цикл while */ +int whileLoop(int n) { + int res = 0; + int i = 1; // Инициализация условной переменной + // Циклическое суммирование 1, 2, ..., n-1, n + while (i <= n) { + res += i; + i++; // Обновить условную переменную + } + return res; +} + +/* Цикл while (двойное обновление) */ +int whileLoopII(int n) { + int res = 0; + int i = 1; // Инициализация условной переменной + // Циклическое суммирование 1, 4, 10, ... + while (i <= n) { + res += i; + // Обновить условную переменную + i++; + i *= 2; + } + return res; +} + +/* Двойной цикл for */ +char *nestedForLoop(int n) { + // n * n — это число соответствующих точек, а максимальная длина строки "(i, j), " равна 6+10*2, плюс дополнительное место для завершающего нулевого символа \0 + int size = n * n * 26 + 1; + char *res = malloc(size * sizeof(char)); + // Цикл по i = 1, 2, ..., n-1, n + for (int i = 1; i <= n; i++) { + // Цикл по j = 1, 2, ..., n-1, n + for (int j = 1; j <= n; j++) { + char tmp[26]; + snprintf(tmp, sizeof(tmp), "(%d, %d), ", i, j); + strncat(res, tmp, size - strlen(res) - 1); + } + } + return res; +} + +/* Driver Code */ +int main() { + int n = 5; + int res; + + res = forLoop(n); + printf("\nРезультат суммирования в цикле for res = %d\n", res); + + res = whileLoop(n); + printf("\nРезультат суммирования в цикле while res = %d\n", res); + + res = whileLoopII(n); + printf("\nРезультат суммирования в цикле while (двойное обновление) res = %d\n", res); + + char *resStr = nestedForLoop(n); + printf("\nРезультат двойного цикла for %s\r\n", resStr); + free(resStr); + + return 0; +} diff --git a/ru/codes/c/chapter_computational_complexity/recursion.c b/ru/codes/c/chapter_computational_complexity/recursion.c new file mode 100644 index 000000000..55d4d697d --- /dev/null +++ b/ru/codes/c/chapter_computational_complexity/recursion.c @@ -0,0 +1,77 @@ +/** + * File: recursion.c + * Created Time: 2023-09-09 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +/* Рекурсия */ +int recur(int n) { + // Условие завершения + if (n == 1) + return 1; + // Рекурсия: рекурсивный вызов + int res = recur(n - 1); + // Возврат: вернуть результат + return n + res; +} + +/* Имитация рекурсии итерацией */ +int forLoopRecur(int n) { + int stack[1000]; // Использовать большой массив для имитации стека + int top = -1; // Индекс вершины стека + int res = 0; + // Рекурсия: рекурсивный вызов + for (int i = n; i > 0; i--) { + // Имитировать «рекурсию» с помощью операции помещения в стек + stack[1 + top++] = i; + } + // Возврат: вернуть результат + while (top >= 0) { + // Имитировать «возврат» с помощью операции извлечения из стека + res += stack[top--]; + } + // res = 1+2+3+...+n + return res; +} + +/* Хвостовая рекурсия */ +int tailRecur(int n, int res) { + // Условие завершения + if (n == 0) + return res; + // Хвостовой рекурсивный вызов + return tailRecur(n - 1, res + n); +} + +/* Последовательность Фибоначчи: рекурсия */ +int fib(int n) { + // Условие завершения: f(1) = 0, f(2) = 1 + if (n == 1 || n == 2) + return n - 1; + // Рекурсивный вызов f(n) = f(n-1) + f(n-2) + int res = fib(n - 1) + fib(n - 2); + // Вернуть результат f(n) + return res; +} + +/* Driver Code */ +int main() { + int n = 5; + int res; + + res = recur(n); + printf("\nРезультат суммирования в рекурсивной функции res = %d\n", res); + + res = forLoopRecur(n); + printf("\nРезультат суммирования с использованием итерации для имитации рекурсии res = %d\n", res); + + res = tailRecur(n, 0); + printf("\nРезультат суммирования в хвостовой рекурсии res = %d\n", res); + + res = fib(n); + printf("\nЭлемент последовательности Фибоначчи с индексом %d = %d\n", n, res); + + return 0; +} diff --git a/ru/codes/c/chapter_computational_complexity/space_complexity.c b/ru/codes/c/chapter_computational_complexity/space_complexity.c new file mode 100644 index 000000000..2846fdfe9 --- /dev/null +++ b/ru/codes/c/chapter_computational_complexity/space_complexity.c @@ -0,0 +1,141 @@ +/** + * File: space_complexity.c + * Created Time: 2023-04-15 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +/* Функция */ +int func() { + // Выполнить некоторые операции + return 0; +} + +/* Постоянная сложность */ +void constant(int n) { + // Константы, переменные и объекты занимают O(1) памяти + const int a = 0; + int b = 0; + int nums[1000]; + ListNode *node = newListNode(0); + free(node); + // Переменные в цикле занимают O(1) памяти + for (int i = 0; i < n; i++) { + int c = 0; + } + // Функции в цикле занимают O(1) памяти + for (int i = 0; i < n; i++) { + func(); + } +} + +/* Хеш-таблица */ +typedef struct { + int key; + int val; + UT_hash_handle hh; // Реализовано на основе uthash.h +} HashTable; + +/* Линейная сложность */ +void linear(int n) { + // Массив длины n занимает O(n) памяти + int *nums = malloc(sizeof(int) * n); + free(nums); + + // Список длины n занимает O(n) памяти + ListNode **nodes = malloc(sizeof(ListNode *) * n); + for (int i = 0; i < n; i++) { + nodes[i] = newListNode(i); + } + // Освобождение памяти + for (int i = 0; i < n; i++) { + free(nodes[i]); + } + free(nodes); + + // Хеш-таблица длины n занимает O(n) памяти + HashTable *h = NULL; + for (int i = 0; i < n; i++) { + HashTable *tmp = malloc(sizeof(HashTable)); + tmp->key = i; + tmp->val = i; + HASH_ADD_INT(h, key, tmp); + } + + // Освобождение памяти + HashTable *curr, *tmp; + HASH_ITER(hh, h, curr, tmp) { + HASH_DEL(h, curr); + free(curr); + } +} + +/* Линейная сложность (рекурсивная реализация) */ +void linearRecur(int n) { + printf("Рекурсия n = %d\r\n", n); + if (n == 1) + return; + linearRecur(n - 1); +} + +/* Квадратичная сложность */ +void quadratic(int n) { + // Двумерный список занимает O(n^2) памяти + int **numMatrix = malloc(sizeof(int *) * n); + for (int i = 0; i < n; i++) { + int *tmp = malloc(sizeof(int) * n); + for (int j = 0; j < n; j++) { + tmp[j] = 0; + } + numMatrix[i] = tmp; + } + + // Освобождение памяти + for (int i = 0; i < n; i++) { + free(numMatrix[i]); + } + free(numMatrix); +} + +/* Квадратичная сложность (рекурсивная реализация) */ +int quadraticRecur(int n) { + if (n <= 0) + return 0; + int *nums = malloc(sizeof(int) * n); + printf("Рекурсия n = %d, длина nums = %d\r\n", n, n); + int res = quadraticRecur(n - 1); + free(nums); + return res; +} + +/* Экспоненциальная сложность (построение полного двоичного дерева) */ +TreeNode *buildTree(int n) { + if (n == 0) + return NULL; + TreeNode *root = newTreeNode(0); + root->left = buildTree(n - 1); + root->right = buildTree(n - 1); + return root; +} + +/* Driver Code */ +int main() { + int n = 5; + // Постоянная сложность + constant(n); + // Линейная сложность + linear(n); + linearRecur(n); + // Квадратичная сложность + quadratic(n); + quadraticRecur(n); + // Экспоненциальная сложность + TreeNode *root = buildTree(n); + printTree(root); + + // Освободить память + freeMemoryTree(root); + + return 0; +} diff --git a/ru/codes/c/chapter_computational_complexity/time_complexity.c b/ru/codes/c/chapter_computational_complexity/time_complexity.c new file mode 100644 index 000000000..56720669b --- /dev/null +++ b/ru/codes/c/chapter_computational_complexity/time_complexity.c @@ -0,0 +1,179 @@ +/** + * File: time_complexity.c + * Created Time: 2023-01-03 + * Author: codingonion (coderonion@gmail.com) + */ + +#include "../utils/common.h" + +/* Постоянная сложность */ +int constant(int n) { + int count = 0; + int size = 100000; + int i = 0; + for (int i = 0; i < size; i++) { + count++; + } + return count; +} + +/* Линейная сложность */ +int linear(int n) { + int count = 0; + for (int i = 0; i < n; i++) { + count++; + } + return count; +} + +/* Линейная сложность (обход массива) */ +int arrayTraversal(int *nums, int n) { + int count = 0; + // Число итераций пропорционально длине массива + for (int i = 0; i < n; i++) { + count++; + } + return count; +} + +/* Квадратичная сложность */ +int quadratic(int n) { + int count = 0; + // Число итераций квадратично зависит от размера данных n + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + count++; + } + } + return count; +} + +/* Квадратичная сложность (пузырьковая сортировка) */ +int bubbleSort(int *nums, int n) { + int count = 0; // Счетчик + // Внешний цикл: неотсортированный диапазон [0, i] + for (int i = n - 1; i > 0; i--) { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (int j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + int tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + count += 3; // Обмен элементов включает 3 элементарные операции + } + } + } + return count; +} + +/* Экспоненциальная сложность (итеративная реализация) */ +int exponential(int n) { + int count = 0; + int bas = 1; + // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1) + for (int i = 0; i < n; i++) { + for (int j = 0; j < bas; j++) { + count++; + } + bas *= 2; + } + // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1 + return count; +} + +/* Экспоненциальная сложность (рекурсивная реализация) */ +int expRecur(int n) { + if (n == 1) + return 1; + return expRecur(n - 1) + expRecur(n - 1) + 1; +} + +/* Логарифмическая сложность (итеративная реализация) */ +int logarithmic(int n) { + int count = 0; + while (n > 1) { + n = n / 2; + count++; + } + return count; +} + +/* Логарифмическая сложность (рекурсивная реализация) */ +int logRecur(int n) { + if (n <= 1) + return 0; + return logRecur(n / 2) + 1; +} + +/* Линейно-логарифмическая сложность */ +int linearLogRecur(int n) { + if (n <= 1) + return 1; + int count = linearLogRecur(n / 2) + linearLogRecur(n / 2); + for (int i = 0; i < n; i++) { + count++; + } + return count; +} + +/* Факториальная сложность (рекурсивная реализация) */ +int factorialRecur(int n) { + if (n == 0) + return 1; + int count = 0; + for (int i = 0; i < n; i++) { + count += factorialRecur(n - 1); + } + return count; +} + +/* Driver Code */ +int main(int argc, char *argv[]) { + // Можно изменить n и запустить программу, чтобы увидеть, как меняется число операций при разных сложностях + int n = 8; + printf("Размер входных данных n = %d\n", n); + + int count = constant(n); + printf("Количество операций постоянной сложности = %d\n", count); + + count = linear(n); + printf("Количество операций линейной сложности = %d\n", count); + // Выделить память в куче (создать одномерный массив переменной длины: число элементов равно n, тип элементов — int) + int *nums = (int *)malloc(n * sizeof(int)); + count = arrayTraversal(nums, n); + printf("Количество операций линейной сложности (обход массива) = %d\n", count); + + count = quadratic(n); + printf("Количество операций квадратичной сложности = %d\n", count); + for (int i = 0; i < n; i++) { + nums[i] = n - i; // [n,n-1,...,2,1] + } + count = bubbleSort(nums, n); + printf("Количество операций квадратичной сложности (пузырьковая сортировка) = %d\n", count); + + count = exponential(n); + printf("Количество операций экспоненциальной сложности (итерация) = %d\n", count); + count = expRecur(n); + printf("Количество операций экспоненциальной сложности (рекурсия) = %d\n", count); + + count = logarithmic(n); + printf("Количество операций логарифмической сложности (итерация) = %d\n", count); + count = logRecur(n); + printf("Количество операций логарифмической сложности (рекурсия) = %d\n", count); + + count = linearLogRecur(n); + printf("Количество операций линейно-логарифмической сложности (рекурсия) = %d\n", count); + + count = factorialRecur(n); + printf("Количество операций факториальной сложности (рекурсия) = %d\n", count); + + // Освободить память в куче + if (nums != NULL) { + free(nums); + nums = NULL; + } + getchar(); + + return 0; +} diff --git a/ru/codes/c/chapter_computational_complexity/worst_best_time_complexity.c b/ru/codes/c/chapter_computational_complexity/worst_best_time_complexity.c new file mode 100644 index 000000000..0ac947c94 --- /dev/null +++ b/ru/codes/c/chapter_computational_complexity/worst_best_time_complexity.c @@ -0,0 +1,57 @@ +/** + * File: worst_best_time_complexity.c + * Created Time: 2023-01-03 + * Author: codingonion (coderonion@gmail.com) + */ + +#include "../utils/common.h" + +/* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */ +int *randomNumbers(int n) { + // Выделить память в куче (создать одномерный массив переменной длины: число элементов равно n, тип элементов — int) + int *nums = (int *)malloc(n * sizeof(int)); + // Создать массив nums = { 1, 2, 3, ..., n } + for (int i = 0; i < n; i++) { + nums[i] = i + 1; + } + // Случайно перемешать элементы массива + for (int i = n - 1; i > 0; i--) { + int j = rand() % (i + 1); + int temp = nums[i]; + nums[i] = nums[j]; + nums[j] = temp; + } + return nums; +} + +/* Найти индекс числа 1 в массиве nums */ +int findOne(int *nums, int n) { + for (int i = 0; i < n; i++) { + // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1) + // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n) + if (nums[i] == 1) + return i; + } + return -1; +} + +/* Driver Code */ +int main(int argc, char *argv[]) { + // Инициализировать seed генератора случайных чисел + srand((unsigned int)time(NULL)); + for (int i = 0; i < 10; i++) { + int n = 100; + int *nums = randomNumbers(n); + int index = findOne(nums, n); + printf("\nПосле перемешивания массива [ 1, 2, ..., n ] nums = "); + printArray(nums, n); + printf("Индекс числа 1 = %d\n", index); + // Освободить память в куче + if (nums != NULL) { + free(nums); + nums = NULL; + } + } + + return 0; +} diff --git a/ru/codes/c/chapter_divide_and_conquer/CMakeLists.txt b/ru/codes/c/chapter_divide_and_conquer/CMakeLists.txt new file mode 100644 index 000000000..e03b1c588 --- /dev/null +++ b/ru/codes/c/chapter_divide_and_conquer/CMakeLists.txt @@ -0,0 +1,3 @@ +add_executable(binary_search_recur binary_search_recur.c) +add_executable(build_tree build_tree.c) +add_executable(hanota hanota.c) diff --git a/ru/codes/c/chapter_divide_and_conquer/binary_search_recur.c b/ru/codes/c/chapter_divide_and_conquer/binary_search_recur.c new file mode 100644 index 000000000..89bdbb8df --- /dev/null +++ b/ru/codes/c/chapter_divide_and_conquer/binary_search_recur.c @@ -0,0 +1,47 @@ +/** + * File: binary_search_recur.c + * Created Time: 2023-10-01 + * Author: Zuoxun (845242523@qq.com) + */ + +#include "../utils/common.h" + +/* Бинарный поиск: задача f(i, j) */ +int dfs(int nums[], int target, int i, int j) { + // Если интервал пуст, целевой элемент отсутствует, вернуть -1 + if (i > j) { + return -1; + } + // Вычислить индекс середины m + int m = (i + j) / 2; + if (nums[m] < target) { + // Рекурсивная подзадача f(m+1, j) + return dfs(nums, target, m + 1, j); + } else if (nums[m] > target) { + // Рекурсивная подзадача f(i, m-1) + return dfs(nums, target, i, m - 1); + } else { + // Целевой элемент найден, вернуть его индекс + return m; + } +} + +/* Бинарный поиск */ +int binarySearch(int nums[], int target, int numsSize) { + int n = numsSize; + // Решить задачу f(0, n-1) + return dfs(nums, target, 0, n - 1); +} + +/* Driver Code */ +int main() { + int target = 6; + int nums[] = {1, 3, 6, 8, 12, 15, 23, 26, 31, 35}; + int numsSize = sizeof(nums) / sizeof(nums[0]); + + // Бинарный поиск (двусторонне замкнутый интервал) + int index = binarySearch(nums, target, numsSize); + printf("Индекс целевого элемента 6 = %d\n", index); + + return 0; +} diff --git a/ru/codes/c/chapter_divide_and_conquer/build_tree.c b/ru/codes/c/chapter_divide_and_conquer/build_tree.c new file mode 100644 index 000000000..57b59c062 --- /dev/null +++ b/ru/codes/c/chapter_divide_and_conquer/build_tree.c @@ -0,0 +1,61 @@ +/** + * File : build_tree.c + * Created Time: 2023-10-16 + * Author : lucas (superrat6@gmail.com) + */ + +#include "../utils/common.h" + +// Предположить, что все элементы меньше 1000 +#define MAX_SIZE 1000 + +/* Построить двоичное дерево: разделяй и властвуй */ +TreeNode *dfs(int *preorder, int *inorderMap, int i, int l, int r, int size) { + // Завершить при пустом диапазоне поддерева + if (r - l < 0) + return NULL; + // Инициализировать корневой узел + TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode)); + root->val = preorder[i]; + root->left = NULL; + root->right = NULL; + // Найти m, чтобы разделить левое и правое поддеревья + int m = inorderMap[preorder[i]]; + // Подзадача: построить левое поддерево + root->left = dfs(preorder, inorderMap, i + 1, l, m - 1, size); + // Подзадача: построить правое поддерево + root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r, size); + // Вернуть корневой узел + return root; +} + +/* Построить двоичное дерево */ +TreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) { + // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам + int *inorderMap = (int *)malloc(sizeof(int) * MAX_SIZE); + for (int i = 0; i < inorderSize; i++) { + inorderMap[inorder[i]] = i; + } + TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorderSize - 1, inorderSize); + free(inorderMap); + return root; +} + +/* Driver Code */ +int main() { + int preorder[] = {3, 9, 2, 1, 7}; + int inorder[] = {9, 3, 1, 2, 7}; + int preorderSize = sizeof(preorder) / sizeof(preorder[0]); + int inorderSize = sizeof(inorder) / sizeof(inorder[0]); + printf("Предварительный обход = "); + printArray(preorder, preorderSize); + printf("Симметричный обход = "); + printArray(inorder, inorderSize); + + TreeNode *root = buildTree(preorder, preorderSize, inorder, inorderSize); + printf("Построенное двоичное дерево:\n"); + printTree(root); + + freeMemoryTree(root); + return 0; +} diff --git a/ru/codes/c/chapter_divide_and_conquer/hanota.c b/ru/codes/c/chapter_divide_and_conquer/hanota.c new file mode 100644 index 000000000..8201b948b --- /dev/null +++ b/ru/codes/c/chapter_divide_and_conquer/hanota.c @@ -0,0 +1,74 @@ +/** + * File: hanota.c + * Created Time: 2023-10-01 + * Author: Zuoxun (845242523@qq.com), lucas(superrat6@gmail.com) + */ + +#include "../utils/common.h" + +// Предположим, что существует не более 1000 перестановок +#define MAX_SIZE 1000 + +/* Переместить один диск */ +void move(int *src, int *srcSize, int *tar, int *tarSize) { + // Снять диск с вершины src + int pan = src[*srcSize - 1]; + src[*srcSize - 1] = 0; + (*srcSize)--; + // Положить диск на вершину tar + tar[*tarSize] = pan; + (*tarSize)++; +} + +/* Решить задачу Ханойской башни f(i) */ +void dfs(int i, int *src, int *srcSize, int *buf, int *bufSize, int *tar, int *tarSize) { + // Если в src остался только один диск, сразу переместить его в tar + if (i == 1) { + move(src, srcSize, tar, tarSize); + return; + } + // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar + dfs(i - 1, src, srcSize, tar, tarSize, buf, bufSize); + // Подзадача f(1): переместить оставшийся один диск из src в tar + move(src, srcSize, tar, tarSize); + // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src + dfs(i - 1, buf, bufSize, src, srcSize, tar, tarSize); +} + +/* Решить задачу Ханойской башни */ +void solveHanota(int *A, int *ASize, int *B, int *BSize, int *C, int *CSize) { + // Переместить верхние n дисков из A в C с помощью B + dfs(*ASize, A, ASize, B, BSize, C, CSize); +} + +/* Driver Code */ +int main() { + // Хвост списка соответствует вершине столбца + int a[] = {5, 4, 3, 2, 1}; + int b[MAX_SIZE] = {0}; + int c[MAX_SIZE] = {0}; + + int ASize = sizeof(a) / sizeof(a[0]); + int BSize = 0; + int CSize = 0; + + printf("\nНачальное состояние:"); + printf("\nA = "); + printArray(a, ASize); + printf("B = "); + printArray(b, BSize); + printf("C = "); + printArray(c, CSize); + + solveHanota(a, &ASize, b, &BSize, c, &CSize); + + printf("\nПосле завершения перемещения дисков:"); + printf("A = "); + printArray(a, ASize); + printf("B = "); + printArray(b, BSize); + printf("C = "); + printArray(c, CSize); + + return 0; +} diff --git a/ru/codes/c/chapter_dynamic_programming/CMakeLists.txt b/ru/codes/c/chapter_dynamic_programming/CMakeLists.txt new file mode 100644 index 000000000..dd769ebd5 --- /dev/null +++ b/ru/codes/c/chapter_dynamic_programming/CMakeLists.txt @@ -0,0 +1,8 @@ +add_executable(climbing_stairs_constraint_dp climbing_stairs_constraint_dp.c) +add_executable(min_cost_climbing_stairs_dp min_cost_climbing_stairs_dp.c) +add_executable(min_path_sum min_path_sum.c) +add_executable(knapsack knapsack.c) +add_executable(unbounded_knapsack unbounded_knapsack.c) +add_executable(coin_change coin_change.c) +add_executable(coin_change_ii coin_change_ii.c) +add_executable(edit_distance edit_distance.c) diff --git a/ru/codes/c/chapter_dynamic_programming/climbing_stairs_backtrack.c b/ru/codes/c/chapter_dynamic_programming/climbing_stairs_backtrack.c new file mode 100644 index 000000000..2a9c4cac3 --- /dev/null +++ b/ru/codes/c/chapter_dynamic_programming/climbing_stairs_backtrack.c @@ -0,0 +1,47 @@ +/** + * File: climbing_stairs_backtrack.c + * Created Time: 2023-09-22 + * Author: huawuque404 (huawuque404@163.com) + */ + +#include "../utils/common.h" + +/* Бэктрекинг */ +void backtrack(int *choices, int state, int n, int *res, int len) { + // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1 + if (state == n) + res[0]++; + // Перебор всех вариантов выбора + for (int i = 0; i < len; i++) { + int choice = choices[i]; + // Отсечение: нельзя выходить за n-ю ступень + if (state + choice > n) + continue; + // Попытка: сделать выбор и обновить состояние + backtrack(choices, state + choice, n, res, len); + // Откат + } +} + +/* Подъем по лестнице: бэктрекинг */ +int climbingStairsBacktrack(int n) { + int choices[2] = {1, 2}; // Можно подняться на 1 или 2 ступени + int state = 0; // Начать подъем с 0-й ступени + int *res = (int *)malloc(sizeof(int)); + *res = 0; // Использовать res[0] для хранения числа решений + int len = sizeof(choices) / sizeof(int); + backtrack(choices, state, n, res, len); + int result = *res; + free(res); + return result; +} + +/* Driver Code */ +int main() { + int n = 9; + + int res = climbingStairsBacktrack(n); + printf("Количество способов подняться по лестнице из %d ступеней: %d\n", n, res); + + return 0; +} \ No newline at end of file diff --git a/ru/codes/c/chapter_dynamic_programming/climbing_stairs_constraint_dp.c b/ru/codes/c/chapter_dynamic_programming/climbing_stairs_constraint_dp.c new file mode 100644 index 000000000..22b3f6619 --- /dev/null +++ b/ru/codes/c/chapter_dynamic_programming/climbing_stairs_constraint_dp.c @@ -0,0 +1,46 @@ +/** + * File: climbing_stairs_constraint_dp.c + * Created Time: 2023-10-02 + * Author: Zuoxun (845242523@qq.com) + */ + +#include "../utils/common.h" + +/* Подъем по лестнице с ограничениями: динамическое программирование */ +int climbingStairsConstraintDP(int n) { + if (n == 1 || n == 2) { + return 1; + } + // Инициализация таблицы dp для хранения решений подзадач + int **dp = malloc((n + 1) * sizeof(int *)); + for (int i = 0; i <= n; i++) { + dp[i] = calloc(3, sizeof(int)); + } + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1][1] = 1; + dp[1][2] = 0; + dp[2][1] = 0; + dp[2][2] = 1; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (int i = 3; i <= n; i++) { + dp[i][1] = dp[i - 1][2]; + dp[i][2] = dp[i - 2][1] + dp[i - 2][2]; + } + int res = dp[n][1] + dp[n][2]; + // Освободить память + for (int i = 0; i <= n; i++) { + free(dp[i]); + } + free(dp); + return res; +} + +/* Driver Code */ +int main() { + int n = 9; + + int res = climbingStairsConstraintDP(n); + printf("Количество способов подняться по лестнице из %d ступеней: %d\n", n, res); + + return 0; +} diff --git a/ru/codes/c/chapter_dynamic_programming/climbing_stairs_dfs.c b/ru/codes/c/chapter_dynamic_programming/climbing_stairs_dfs.c new file mode 100644 index 000000000..4cabb613e --- /dev/null +++ b/ru/codes/c/chapter_dynamic_programming/climbing_stairs_dfs.c @@ -0,0 +1,32 @@ +/** + * File: climbing_stairs_dfs.c + * Created Time: 2023-09-19 + * Author: huawuque404 (huawuque404@163.com) + */ + +#include "../utils/common.h" + +/* Поиск */ +int dfs(int i) { + // dp[1] и dp[2] уже известны, вернуть их + if (i == 1 || i == 2) + return i; + // dp[i] = dp[i-1] + dp[i-2] + int count = dfs(i - 1) + dfs(i - 2); + return count; +} + +/* Подъем по лестнице: поиск */ +int climbingStairsDFS(int n) { + return dfs(n); +} + +/* Driver Code */ +int main() { + int n = 9; + + int res = climbingStairsDFS(n); + printf("Количество способов подняться по лестнице из %d ступеней: %d\n", n, res); + + return 0; +} \ No newline at end of file diff --git a/ru/codes/c/chapter_dynamic_programming/climbing_stairs_dfs_mem.c b/ru/codes/c/chapter_dynamic_programming/climbing_stairs_dfs_mem.c new file mode 100644 index 000000000..f15c87a32 --- /dev/null +++ b/ru/codes/c/chapter_dynamic_programming/climbing_stairs_dfs_mem.c @@ -0,0 +1,44 @@ +/** + * File: climbing_stairs_dfs_mem.c + * Created Time: 2023-09-19 + * Author: huawuque404 (huawuque404@163.com) + */ + +#include "../utils/common.h" + +/* Поиск с мемоизацией */ +int dfs(int i, int *mem) { + // dp[1] и dp[2] уже известны, вернуть их + if (i == 1 || i == 2) + return i; + // Если запись dp[i] существует, сразу вернуть ее + if (mem[i] != -1) + return mem[i]; + // dp[i] = dp[i-1] + dp[i-2] + int count = dfs(i - 1, mem) + dfs(i - 2, mem); + // Сохранить dp[i] + mem[i] = count; + return count; +} + +/* Подъем по лестнице: поиск с мемоизацией */ +int climbingStairsDFSMem(int n) { + // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи + int *mem = (int *)malloc((n + 1) * sizeof(int)); + for (int i = 0; i <= n; i++) { + mem[i] = -1; + } + int result = dfs(n, mem); + free(mem); + return result; +} + +/* Driver Code */ +int main() { + int n = 9; + + int res = climbingStairsDFSMem(n); + printf("Количество способов подняться по лестнице из %d ступеней: %d\n", n, res); + + return 0; +} \ No newline at end of file diff --git a/ru/codes/c/chapter_dynamic_programming/climbing_stairs_dp.c b/ru/codes/c/chapter_dynamic_programming/climbing_stairs_dp.c new file mode 100644 index 000000000..b27f91cee --- /dev/null +++ b/ru/codes/c/chapter_dynamic_programming/climbing_stairs_dp.c @@ -0,0 +1,51 @@ +/** + * File: climbing_stairs_dp.c + * Created Time: 2023-09-19 + * Author: huawuque404 (huawuque404@163.com) + */ + +#include "../utils/common.h" + +/* Подъем по лестнице: динамическое программирование */ +int climbingStairsDP(int n) { + if (n == 1 || n == 2) + return n; + // Инициализация таблицы dp для хранения решений подзадач + int *dp = (int *)malloc((n + 1) * sizeof(int)); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = 1; + dp[2] = 2; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (int i = 3; i <= n; i++) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + int result = dp[n]; + free(dp); + return result; +} + +/* Подъем по лестнице: динамическое программирование с оптимизацией памяти */ +int climbingStairsDPComp(int n) { + if (n == 1 || n == 2) + return n; + int a = 1, b = 2; + for (int i = 3; i <= n; i++) { + int tmp = b; + b = a + b; + a = tmp; + } + return b; +} + +/* Driver Code */ +int main() { + int n = 9; + + int res = climbingStairsDP(n); + printf("Количество способов подняться по лестнице из %d ступеней: %d\n", n, res); + + res = climbingStairsDPComp(n); + printf("Количество способов подняться по лестнице из %d ступеней: %d\n", n, res); + + return 0; +} \ No newline at end of file diff --git a/ru/codes/c/chapter_dynamic_programming/coin_change.c b/ru/codes/c/chapter_dynamic_programming/coin_change.c new file mode 100644 index 000000000..99913f9f1 --- /dev/null +++ b/ru/codes/c/chapter_dynamic_programming/coin_change.c @@ -0,0 +1,92 @@ +/** + * File: coin_change.c + * Created Time: 2023-10-02 + * Author: Zuoxun (845242523@qq.com) + */ + +#include "../utils/common.h" + +/* Найти минимум */ +int myMin(int a, int b) { + return a < b ? a : b; +} + +/* Размен монет: динамическое программирование */ +int coinChangeDP(int coins[], int amt, int coinsSize) { + int n = coinsSize; + int MAX = amt + 1; + // Инициализация таблицы dp + int **dp = malloc((n + 1) * sizeof(int *)); + for (int i = 0; i <= n; i++) { + dp[i] = calloc(amt + 1, sizeof(int)); + } + // Переход состояний: первая строка и первый столбец + for (int a = 1; a <= amt; a++) { + dp[0][a] = MAX; + } + // Переход состояний: остальные строки и столбцы + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[i][a] = myMin(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1); + } + } + } + int res = dp[n][amt] != MAX ? dp[n][amt] : -1; + // Освободить память + for (int i = 0; i <= n; i++) { + free(dp[i]); + } + free(dp); + return res; +} + +/* Размен монет: динамическое программирование с оптимизацией памяти */ +int coinChangeDPComp(int coins[], int amt, int coinsSize) { + int n = coinsSize; + int MAX = amt + 1; + // Инициализация таблицы dp + int *dp = malloc((amt + 1) * sizeof(int)); + for (int j = 1; j <= amt; j++) { + dp[j] = MAX; + } + dp[0] = 0; + + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[a] = myMin(dp[a], dp[a - coins[i - 1]] + 1); + } + } + } + int res = dp[amt] != MAX ? dp[amt] : -1; + // Освободить память + free(dp); + return res; +} + +/* Driver code */ +int main() { + int coins[] = {1, 2, 5}; + int coinsSize = sizeof(coins) / sizeof(coins[0]); + int amt = 4; + + // Динамическое программирование + int res = coinChangeDP(coins, amt, coinsSize); + printf("Минимальное количество монет для целевой суммы = %d\n", res); + + // Динамическое программирование с оптимизацией памяти + res = coinChangeDPComp(coins, amt, coinsSize); + printf("Минимальное количество монет для целевой суммы = %d\n", res); + + return 0; +} diff --git a/ru/codes/c/chapter_dynamic_programming/coin_change_ii.c b/ru/codes/c/chapter_dynamic_programming/coin_change_ii.c new file mode 100644 index 000000000..20e2d0056 --- /dev/null +++ b/ru/codes/c/chapter_dynamic_programming/coin_change_ii.c @@ -0,0 +1,81 @@ +/** + * File: coin_change_ii.c + * Created Time: 2023-10-02 + * Author: Zuoxun (845242523@qq.com) + */ + +#include "../utils/common.h" + +/* Размен монет II: динамическое программирование */ +int coinChangeIIDP(int coins[], int amt, int coinsSize) { + int n = coinsSize; + // Инициализация таблицы dp + int **dp = malloc((n + 1) * sizeof(int *)); + for (int i = 0; i <= n; i++) { + dp[i] = calloc(amt + 1, sizeof(int)); + } + // Инициализация первого столбца + for (int i = 0; i <= n; i++) { + dp[i][0] = 1; + } + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a]; + } else { + // Сумма двух решений: не брать или взять монету i + dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]; + } + } + } + int res = dp[n][amt]; + // Освободить память + for (int i = 0; i <= n; i++) { + free(dp[i]); + } + free(dp); + return res; +} + +/* Размен монет II: динамическое программирование с оптимизацией памяти */ +int coinChangeIIDPComp(int coins[], int amt, int coinsSize) { + int n = coinsSize; + // Инициализация таблицы dp + int *dp = calloc(amt + 1, sizeof(int)); + dp[0] = 1; + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Сумма двух решений: не брать или взять монету i + dp[a] = dp[a] + dp[a - coins[i - 1]]; + } + } + } + int res = dp[amt]; + // Освободить память + free(dp); + return res; +} + +/* Driver code */ +int main() { + int coins[] = {1, 2, 5}; + int coinsSize = sizeof(coins) / sizeof(coins[0]); + int amt = 5; + + // Динамическое программирование + int res = coinChangeIIDP(coins, amt, coinsSize); + printf("Количество комбинаций монет для набора целевой суммы = %d\n", res); + + // Динамическое программирование с оптимизацией памяти + res = coinChangeIIDPComp(coins, amt, coinsSize); + printf("Количество комбинаций монет для набора целевой суммы = %d\n", res); + + return 0; +} diff --git a/ru/codes/c/chapter_dynamic_programming/edit_distance.c b/ru/codes/c/chapter_dynamic_programming/edit_distance.c new file mode 100644 index 000000000..f352a0c45 --- /dev/null +++ b/ru/codes/c/chapter_dynamic_programming/edit_distance.c @@ -0,0 +1,159 @@ +/** + * File: edit_distance.c + * Created Time: 2023-10-02 + * Author: Zuoxun (845242523@qq.com) + */ + +#include "../utils/common.h" + +/* Найти минимум */ +int myMin(int a, int b) { + return a < b ? a : b; +} + +/* Редакционное расстояние: полный перебор */ +int editDistanceDFS(char *s, char *t, int i, int j) { + // Если s и t пусты, вернуть 0 + if (i == 0 && j == 0) + return 0; + // Если s пусто, вернуть длину t + if (i == 0) + return j; + // Если t пусто, вернуть длину s + if (j == 0) + return i; + // Если два символа равны, сразу пропустить их + if (s[i - 1] == t[j - 1]) + return editDistanceDFS(s, t, i - 1, j - 1); + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + int insert = editDistanceDFS(s, t, i, j - 1); + int del = editDistanceDFS(s, t, i - 1, j); + int replace = editDistanceDFS(s, t, i - 1, j - 1); + // Вернуть минимальное число шагов редактирования + return myMin(myMin(insert, del), replace) + 1; +} + +/* Редакционное расстояние: поиск с мемоизацией */ +int editDistanceDFSMem(char *s, char *t, int memCols, int **mem, int i, int j) { + // Если s и t пусты, вернуть 0 + if (i == 0 && j == 0) + return 0; + // Если s пусто, вернуть длину t + if (i == 0) + return j; + // Если t пусто, вернуть длину s + if (j == 0) + return i; + // Если запись уже есть, сразу вернуть ее + if (mem[i][j] != -1) + return mem[i][j]; + // Если два символа равны, сразу пропустить их + if (s[i - 1] == t[j - 1]) + return editDistanceDFSMem(s, t, memCols, mem, i - 1, j - 1); + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + int insert = editDistanceDFSMem(s, t, memCols, mem, i, j - 1); + int del = editDistanceDFSMem(s, t, memCols, mem, i - 1, j); + int replace = editDistanceDFSMem(s, t, memCols, mem, i - 1, j - 1); + // Сохранить и вернуть минимальное число шагов редактирования + mem[i][j] = myMin(myMin(insert, del), replace) + 1; + return mem[i][j]; +} + +/* Редакционное расстояние: динамическое программирование */ +int editDistanceDP(char *s, char *t, int n, int m) { + int **dp = malloc((n + 1) * sizeof(int *)); + for (int i = 0; i <= n; i++) { + dp[i] = calloc(m + 1, sizeof(int)); + } + // Переход состояний: первая строка и первый столбец + for (int i = 1; i <= n; i++) { + dp[i][0] = i; + } + for (int j = 1; j <= m; j++) { + dp[0][j] = j; + } + // Переход состояний: остальные строки и столбцы + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= m; j++) { + if (s[i - 1] == t[j - 1]) { + // Если два символа равны, сразу пропустить их + dp[i][j] = dp[i - 1][j - 1]; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[i][j] = myMin(myMin(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1; + } + } + } + int res = dp[n][m]; + // Освободить память + for (int i = 0; i <= n; i++) { + free(dp[i]); + } + return res; +} + +/* Редакционное расстояние: динамическое программирование с оптимизацией памяти */ +int editDistanceDPComp(char *s, char *t, int n, int m) { + int *dp = calloc(m + 1, sizeof(int)); + // Переход состояний: первая строка + for (int j = 1; j <= m; j++) { + dp[j] = j; + } + // Переход состояний: остальные строки + for (int i = 1; i <= n; i++) { + // Переход состояний: первый столбец + int leftup = dp[0]; // Временно сохранить dp[i-1, j-1] + dp[0] = i; + // Переход состояний: остальные столбцы + for (int j = 1; j <= m; j++) { + int temp = dp[j]; + if (s[i - 1] == t[j - 1]) { + // Если два символа равны, сразу пропустить их + dp[j] = leftup; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[j] = myMin(myMin(dp[j - 1], dp[j]), leftup) + 1; + } + leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации + } + } + int res = dp[m]; + // Освободить память + free(dp); + return res; +} + +/* Driver Code */ +int main() { + char *s = "bag"; + char *t = "pack"; + int n = strlen(s), m = strlen(t); + + // Полный перебор + int res = editDistanceDFS(s, t, n, m); + printf("Чтобы заменить %s на %s, требуется минимум %d операций редактирования\n", s, t, res); + + // Поиск с мемоизацией + int **mem = malloc((n + 1) * sizeof(int *)); + for (int i = 0; i <= n; i++) { + mem[i] = malloc((m + 1) * sizeof(int)); + memset(mem[i], -1, (m + 1) * sizeof(int)); + } + res = editDistanceDFSMem(s, t, m + 1, mem, n, m); + printf("Чтобы заменить %s на %s, требуется минимум %d операций редактирования\n", s, t, res); + // Освободить память + for (int i = 0; i <= n; i++) { + free(mem[i]); + } + free(mem); + + // Динамическое программирование + res = editDistanceDP(s, t, n, m); + printf("Чтобы заменить %s на %s, требуется минимум %d операций редактирования\n", s, t, res); + + // Динамическое программирование с оптимизацией памяти + res = editDistanceDPComp(s, t, n, m); + printf("Чтобы заменить %s на %s, требуется минимум %d операций редактирования\n", s, t, res); + + return 0; +} diff --git a/ru/codes/c/chapter_dynamic_programming/knapsack.c b/ru/codes/c/chapter_dynamic_programming/knapsack.c new file mode 100644 index 000000000..4f12a5e91 --- /dev/null +++ b/ru/codes/c/chapter_dynamic_programming/knapsack.c @@ -0,0 +1,137 @@ +/** + * File: knapsack.c + * Created Time: 2023-10-02 + * Author: Zuoxun (845242523@qq.com) + */ + +#include "../utils/common.h" + +/* Найти максимум */ +int myMax(int a, int b) { + return a > b ? a : b; +} + +/* Рюкзак 0-1: полный перебор */ +int knapsackDFS(int wgt[], int val[], int i, int c) { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i == 0 || c == 0) { + return 0; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (wgt[i - 1] > c) { + return knapsackDFS(wgt, val, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + int no = knapsackDFS(wgt, val, i - 1, c); + int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]; + // Вернуть вариант с большей стоимостью из двух возможных + return myMax(no, yes); +} + +/* Рюкзак 0-1: поиск с мемоизацией */ +int knapsackDFSMem(int wgt[], int val[], int memCols, int **mem, int i, int c) { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i == 0 || c == 0) { + return 0; + } + // Если запись уже есть, вернуть сразу + if (mem[i][c] != -1) { + return mem[i][c]; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (wgt[i - 1] > c) { + return knapsackDFSMem(wgt, val, memCols, mem, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + int no = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c); + int yes = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c - wgt[i - 1]) + val[i - 1]; + // Сохранить и вернуть вариант с большей стоимостью из двух решений + mem[i][c] = myMax(no, yes); + return mem[i][c]; +} + +/* Рюкзак 0-1: динамическое программирование */ +int knapsackDP(int wgt[], int val[], int cap, int wgtSize) { + int n = wgtSize; + // Инициализация таблицы dp + int **dp = malloc((n + 1) * sizeof(int *)); + for (int i = 0; i <= n; i++) { + dp[i] = calloc(cap + 1, sizeof(int)); + } + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = myMax(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]); + } + } + } + int res = dp[n][cap]; + // Освободить память + for (int i = 0; i <= n; i++) { + free(dp[i]); + } + return res; +} + +/* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */ +int knapsackDPComp(int wgt[], int val[], int cap, int wgtSize) { + int n = wgtSize; + // Инициализация таблицы dp + int *dp = calloc(cap + 1, sizeof(int)); + // Переход состояний + for (int i = 1; i <= n; i++) { + // Обход в обратном порядке + for (int c = cap; c >= 1; c--) { + if (wgt[i - 1] <= c) { + // Большее из двух решений: не брать или взять предмет i + dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]); + } + } + } + int res = dp[cap]; + // Освободить память + free(dp); + return res; +} + +/* Driver Code */ +int main() { + int wgt[] = {10, 20, 30, 40, 50}; + int val[] = {50, 120, 150, 210, 240}; + int cap = 50; + int n = sizeof(wgt) / sizeof(wgt[0]); + int wgtSize = n; + + // Полный перебор + int res = knapsackDFS(wgt, val, n, cap); + printf("Максимальная стоимость предметов, не превышающая вместимость рюкзака, равна %d\n", res); + + // Поиск с мемоизацией + int **mem = malloc((n + 1) * sizeof(int *)); + for (int i = 0; i <= n; i++) { + mem[i] = malloc((cap + 1) * sizeof(int)); + memset(mem[i], -1, (cap + 1) * sizeof(int)); + } + res = knapsackDFSMem(wgt, val, cap + 1, mem, n, cap); + printf("Максимальная стоимость предметов, не превышающая вместимость рюкзака, равна %d\n", res); + // Освободить память + for (int i = 0; i <= n; i++) { + free(mem[i]); + } + free(mem); + + // Динамическое программирование + res = knapsackDP(wgt, val, cap, wgtSize); + printf("Максимальная стоимость предметов, не превышающая вместимость рюкзака, равна %d\n", res); + + // Динамическое программирование с оптимизацией памяти + res = knapsackDPComp(wgt, val, cap, wgtSize); + printf("Максимальная стоимость предметов, не превышающая вместимость рюкзака, равна %d\n", res); + + return 0; +} diff --git a/ru/codes/c/chapter_dynamic_programming/min_cost_climbing_stairs_dp.c b/ru/codes/c/chapter_dynamic_programming/min_cost_climbing_stairs_dp.c new file mode 100644 index 000000000..24175e4bb --- /dev/null +++ b/ru/codes/c/chapter_dynamic_programming/min_cost_climbing_stairs_dp.c @@ -0,0 +1,62 @@ +/** + * File: min_cost_climbing_stairs_dp.c + * Created Time: 2023-10-02 + * Author: Zuoxun (845242523@qq.com) + */ + +#include "../utils/common.h" + +/* Найти минимум */ +int myMin(int a, int b) { + return a < b ? a : b; +} + +/* Минимальная стоимость подъема по лестнице: динамическое программирование */ +int minCostClimbingStairsDP(int cost[], int costSize) { + int n = costSize - 1; + if (n == 1 || n == 2) + return cost[n]; + // Инициализация таблицы dp для хранения решений подзадач + int *dp = calloc(n + 1, sizeof(int)); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = cost[1]; + dp[2] = cost[2]; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (int i = 3; i <= n; i++) { + dp[i] = myMin(dp[i - 1], dp[i - 2]) + cost[i]; + } + int res = dp[n]; + // Освободить память + free(dp); + return res; +} + +/* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */ +int minCostClimbingStairsDPComp(int cost[], int costSize) { + int n = costSize - 1; + if (n == 1 || n == 2) + return cost[n]; + int a = cost[1], b = cost[2]; + for (int i = 3; i <= n; i++) { + int tmp = b; + b = myMin(a, tmp) + cost[i]; + a = tmp; + } + return b; +} + +/* Driver Code */ +int main() { + int cost[] = {0, 1, 10, 1, 1, 1, 10, 1, 1, 10, 1}; + int costSize = sizeof(cost) / sizeof(cost[0]); + printf("Список стоимостей ступеней = "); + printArray(cost, costSize); + + int res = minCostClimbingStairsDP(cost, costSize); + printf("Минимальная стоимость подъема по лестнице = %d\n", res); + + res = minCostClimbingStairsDPComp(cost, costSize); + printf("Минимальная стоимость подъема по лестнице = %d\n", res); + + return 0; +} diff --git a/ru/codes/c/chapter_dynamic_programming/min_path_sum.c b/ru/codes/c/chapter_dynamic_programming/min_path_sum.c new file mode 100644 index 000000000..5f0db0575 --- /dev/null +++ b/ru/codes/c/chapter_dynamic_programming/min_path_sum.c @@ -0,0 +1,134 @@ +/** + * File: min_path_sum.c + * Created Time: 2023-10-02 + * Author: Zuoxun (845242523@qq.com) + */ + +#include "../utils/common.h" + +// Предположить, что максимальное число строк и столбцов матрицы равно 100 +#define MAX_SIZE 100 + +/* Найти минимум */ +int myMin(int a, int b) { + return a < b ? a : b; +} + +/* Минимальная сумма пути: полный перебор */ +int minPathSumDFS(int grid[MAX_SIZE][MAX_SIZE], int i, int j) { + // Если это верхняя левая ячейка, завершить поиск + if (i == 0 && j == 0) { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 || j < 0) { + return INT_MAX; + } + // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1) + int up = minPathSumDFS(grid, i - 1, j); + int left = minPathSumDFS(grid, i, j - 1); + // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + return myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX; +} + +/* Минимальная сумма пути: поиск с мемоизацией */ +int minPathSumDFSMem(int grid[MAX_SIZE][MAX_SIZE], int mem[MAX_SIZE][MAX_SIZE], int i, int j) { + // Если это верхняя левая ячейка, завершить поиск + if (i == 0 && j == 0) { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 || j < 0) { + return INT_MAX; + } + // Если запись уже есть, вернуть сразу + if (mem[i][j] != -1) { + return mem[i][j]; + } + // Минимальная стоимость пути для левой и верхней ячеек + int up = minPathSumDFSMem(grid, mem, i - 1, j); + int left = minPathSumDFSMem(grid, mem, i, j - 1); + // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + mem[i][j] = myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX; + return mem[i][j]; +} + +/* Минимальная сумма пути: динамическое программирование */ +int minPathSumDP(int grid[MAX_SIZE][MAX_SIZE], int n, int m) { + // Инициализация таблицы dp + int **dp = malloc(n * sizeof(int *)); + for (int i = 0; i < n; i++) { + dp[i] = calloc(m, sizeof(int)); + } + dp[0][0] = grid[0][0]; + // Переход состояний: первая строка + for (int j = 1; j < m; j++) { + dp[0][j] = dp[0][j - 1] + grid[0][j]; + } + // Переход состояний: первый столбец + for (int i = 1; i < n; i++) { + dp[i][0] = dp[i - 1][0] + grid[i][0]; + } + // Переход состояний: остальные строки и столбцы + for (int i = 1; i < n; i++) { + for (int j = 1; j < m; j++) { + dp[i][j] = myMin(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]; + } + } + int res = dp[n - 1][m - 1]; + // Освободить память + for (int i = 0; i < n; i++) { + free(dp[i]); + } + return res; +} + +/* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */ +int minPathSumDPComp(int grid[MAX_SIZE][MAX_SIZE], int n, int m) { + // Инициализация таблицы dp + int *dp = calloc(m, sizeof(int)); + // Переход состояний: первая строка + dp[0] = grid[0][0]; + for (int j = 1; j < m; j++) { + dp[j] = dp[j - 1] + grid[0][j]; + } + // Переход состояний: остальные строки + for (int i = 1; i < n; i++) { + // Переход состояний: первый столбец + dp[0] = dp[0] + grid[i][0]; + // Переход состояний: остальные столбцы + for (int j = 1; j < m; j++) { + dp[j] = myMin(dp[j - 1], dp[j]) + grid[i][j]; + } + } + int res = dp[m - 1]; + // Освободить память + free(dp); + return res; +} + +/* Driver Code */ +int main() { + int grid[MAX_SIZE][MAX_SIZE] = {{1, 3, 1, 5}, {2, 2, 4, 2}, {5, 3, 2, 1}, {4, 3, 5, 2}}; + int n = 4, m = 4; // Емкость матрицы равна MAX_SIZE * MAX_SIZE, число эффективных строк и столбцов — n * m + + // Полный перебор + int res = minPathSumDFS(grid, n - 1, m - 1); + printf("Минимальная сумма пути из левого верхнего в правый нижний угол = %d\n", res); + + // Поиск с мемоизацией + int mem[MAX_SIZE][MAX_SIZE]; + memset(mem, -1, sizeof(mem)); + res = minPathSumDFSMem(grid, mem, n - 1, m - 1); + printf("Минимальная сумма пути из левого верхнего в правый нижний угол = %d\n", res); + + // Динамическое программирование + res = minPathSumDP(grid, n, m); + printf("Минимальная сумма пути из левого верхнего в правый нижний угол = %d\n", res); + + // Динамическое программирование с оптимизацией памяти + res = minPathSumDPComp(grid, n, m); + printf("Минимальная сумма пути из левого верхнего в правый нижний угол = %d\n", res); + + return 0; +} diff --git a/ru/codes/c/chapter_dynamic_programming/unbounded_knapsack.c b/ru/codes/c/chapter_dynamic_programming/unbounded_knapsack.c new file mode 100644 index 000000000..a39e116ff --- /dev/null +++ b/ru/codes/c/chapter_dynamic_programming/unbounded_knapsack.c @@ -0,0 +1,81 @@ +/** + * File: unbounded_knapsack.c + * Created Time: 2023-10-02 + * Author: Zuoxun (845242523@qq.com) + */ + +#include "../utils/common.h" + +/* Найти максимум */ +int myMax(int a, int b) { + return a > b ? a : b; +} + +/* Полный рюкзак: динамическое программирование */ +int unboundedKnapsackDP(int wgt[], int val[], int cap, int wgtSize) { + int n = wgtSize; + // Инициализация таблицы dp + int **dp = malloc((n + 1) * sizeof(int *)); + for (int i = 0; i <= n; i++) { + dp[i] = calloc(cap + 1, sizeof(int)); + } + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = myMax(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]); + } + } + } + int res = dp[n][cap]; + // Освободить память + for (int i = 0; i <= n; i++) { + free(dp[i]); + } + return res; +} + +/* Полный рюкзак: динамическое программирование с оптимизацией памяти */ +int unboundedKnapsackDPComp(int wgt[], int val[], int cap, int wgtSize) { + int n = wgtSize; + // Инициализация таблицы dp + int *dp = calloc(cap + 1, sizeof(int)); + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]); + } + } + } + int res = dp[cap]; + // Освободить память + free(dp); + return res; +} + +/* Driver code */ +int main() { + int wgt[] = {1, 2, 3}; + int val[] = {5, 11, 15}; + int wgtSize = sizeof(wgt) / sizeof(wgt[0]); + int cap = 4; + + // Динамическое программирование + int res = unboundedKnapsackDP(wgt, val, cap, wgtSize); + printf("Максимальная стоимость предметов, не превышающая вместимость рюкзака, равна %d\n", res); + + // Динамическое программирование с оптимизацией памяти + res = unboundedKnapsackDPComp(wgt, val, cap, wgtSize); + printf("Максимальная стоимость предметов, не превышающая вместимость рюкзака, равна %d\n", res); + + return 0; +} diff --git a/ru/codes/c/chapter_graph/CMakeLists.txt b/ru/codes/c/chapter_graph/CMakeLists.txt new file mode 100644 index 000000000..28f8470f4 --- /dev/null +++ b/ru/codes/c/chapter_graph/CMakeLists.txt @@ -0,0 +1,4 @@ +add_executable(graph_adjacency_matrix graph_adjacency_matrix.c) +add_executable(graph_adjacency_list_test graph_adjacency_list_test.c) +add_executable(graph_bfs graph_bfs.c) +add_executable(graph_dfs graph_dfs.c) diff --git a/ru/codes/c/chapter_graph/graph_adjacency_list.c b/ru/codes/c/chapter_graph/graph_adjacency_list.c new file mode 100644 index 000000000..2ee8281a8 --- /dev/null +++ b/ru/codes/c/chapter_graph/graph_adjacency_list.c @@ -0,0 +1,171 @@ +/** + * File: graph_adjacency_list.c + * Created Time: 2023-07-07 + * Author: NI-SW (947743645@qq.com) + */ + +#include "../utils/common.h" + +// Предположим, что максимальное число узлов равно 100 +#define MAX_SIZE 100 + +/* Структура узла */ +typedef struct AdjListNode { + Vertex *vertex; // Вершина + struct AdjListNode *next; // Узел-преемник +} AdjListNode; + +/* Класс неориентированного графа на основе списка смежности */ +typedef struct { + AdjListNode *heads[MAX_SIZE]; // Массив узлов + int size; // Количество узлов +} GraphAdjList; + +/* Конструктор */ +GraphAdjList *newGraphAdjList() { + GraphAdjList *graph = (GraphAdjList *)malloc(sizeof(GraphAdjList)); + if (!graph) { + return NULL; + } + graph->size = 0; + for (int i = 0; i < MAX_SIZE; i++) { + graph->heads[i] = NULL; + } + return graph; +} + +/* Деструктор */ +void delGraphAdjList(GraphAdjList *graph) { + for (int i = 0; i < graph->size; i++) { + AdjListNode *cur = graph->heads[i]; + while (cur != NULL) { + AdjListNode *next = cur->next; + if (cur != graph->heads[i]) { + free(cur); + } + cur = next; + } + free(graph->heads[i]->vertex); + free(graph->heads[i]); + } + free(graph); +} + +/* Найти узел, соответствующий вершине */ +AdjListNode *findNode(GraphAdjList *graph, Vertex *vet) { + for (int i = 0; i < graph->size; i++) { + if (graph->heads[i]->vertex == vet) { + return graph->heads[i]; + } + } + return NULL; +} + +/* Вспомогательная функция добавления ребра */ +void addEdgeHelper(AdjListNode *head, Vertex *vet) { + AdjListNode *node = (AdjListNode *)malloc(sizeof(AdjListNode)); + node->vertex = vet; + // Вставка в голову + node->next = head->next; + head->next = node; +} + +/* Добавление ребра */ +void addEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) { + AdjListNode *head1 = findNode(graph, vet1); + AdjListNode *head2 = findNode(graph, vet2); + assert(head1 != NULL && head2 != NULL && head1 != head2); + // Добавить ребро vet1 - vet2 + addEdgeHelper(head1, vet2); + addEdgeHelper(head2, vet1); +} + +/* Вспомогательная функция удаления ребра */ +void removeEdgeHelper(AdjListNode *head, Vertex *vet) { + AdjListNode *pre = head; + AdjListNode *cur = head->next; + // Искать в связном списке узел, соответствующий vet + while (cur != NULL && cur->vertex != vet) { + pre = cur; + cur = cur->next; + } + if (cur == NULL) + return; + // Удалить из связного списка узел, соответствующий vet + pre->next = cur->next; + // Освободить память + free(cur); +} + +/* Удаление ребра */ +void removeEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) { + AdjListNode *head1 = findNode(graph, vet1); + AdjListNode *head2 = findNode(graph, vet2); + assert(head1 != NULL && head2 != NULL); + // Удалить ребро vet1 - vet2 + removeEdgeHelper(head1, head2->vertex); + removeEdgeHelper(head2, head1->vertex); +} + +/* Добавление вершины */ +void addVertex(GraphAdjList *graph, Vertex *vet) { + assert(graph != NULL && graph->size < MAX_SIZE); + AdjListNode *head = (AdjListNode *)malloc(sizeof(AdjListNode)); + head->vertex = vet; + head->next = NULL; + // Добавить новый список в список смежности + graph->heads[graph->size++] = head; +} + +/* Удаление вершины */ +void removeVertex(GraphAdjList *graph, Vertex *vet) { + AdjListNode *node = findNode(graph, vet); + assert(node != NULL); + // Удалить из списка смежности список, соответствующий вершине vet + AdjListNode *cur = node, *pre = NULL; + while (cur) { + pre = cur; + cur = cur->next; + free(pre); + } + // Обойти списки других вершин и удалить все ребра, содержащие vet + for (int i = 0; i < graph->size; i++) { + cur = graph->heads[i]; + pre = NULL; + while (cur) { + pre = cur; + cur = cur->next; + if (cur && cur->vertex == vet) { + pre->next = cur->next; + free(cur); + break; + } + } + } + // Сдвинуть вершины после данной вперед, чтобы заполнить образовавшийся пробел + int i; + for (i = 0; i < graph->size; i++) { + if (graph->heads[i] == node) + break; + } + for (int j = i; j < graph->size - 1; j++) { + graph->heads[j] = graph->heads[j + 1]; + } + graph->size--; + free(vet); +} + +/* Вывести список смежности */ +void printGraph(const GraphAdjList *graph) { + printf("Список смежности =\n"); + for (int i = 0; i < graph->size; ++i) { + AdjListNode *node = graph->heads[i]; + printf("%d: [", node->vertex->val); + node = node->next; + while (node) { + printf("%d, ", node->vertex->val); + node = node->next; + } + printf("]\n"); + } +} diff --git a/ru/codes/c/chapter_graph/graph_adjacency_list_test.c b/ru/codes/c/chapter_graph/graph_adjacency_list_test.c new file mode 100644 index 000000000..7a2a22674 --- /dev/null +++ b/ru/codes/c/chapter_graph/graph_adjacency_list_test.c @@ -0,0 +1,55 @@ +/** + * File: graph_adjacency_list_test.c + * Created Time: 2023-07-11 + * Author: NI-SW (947743645@qq.com) + */ + +#include "graph_adjacency_list.c" + +/* Driver Code */ +int main() { + int vals[] = {1, 3, 2, 5, 4}; + int size = sizeof(vals) / sizeof(vals[0]); + Vertex **v = valsToVets(vals, size); + Vertex *edges[][2] = {{v[0], v[1]}, {v[0], v[3]}, {v[1], v[2]}, {v[2], v[3]}, {v[2], v[4]}, {v[3], v[4]}}; + int egdeSize = sizeof(edges) / sizeof(edges[0]); + GraphAdjList *graph = newGraphAdjList(); + // Добавить все вершины и ребра + for (int i = 0; i < size; i++) { + addVertex(graph, v[i]); + } + for (int i = 0; i < egdeSize; i++) { + addEdge(graph, edges[i][0], edges[i][1]); + } + printf("\nПосле инициализации граф имеет вид\n"); + printGraph(graph); + + /* Добавление ребра */ + // Вершины 1 и 2 соответствуют v[0] и v[2] + addEdge(graph, v[0], v[2]); + printf("\nПосле добавления ребра 1-2 граф имеет вид\n"); + printGraph(graph); + + /* Удаление ребра */ + // Вершины 1 и 3 соответствуют v[0] и v[1] + removeEdge(graph, v[0], v[1]); + printf("\nПосле удаления ребра 1-3 граф имеет вид\n"); + printGraph(graph); + + /* Добавление вершины */ + Vertex *v5 = newVertex(6); + addVertex(graph, v5); + printf("\nПосле добавления вершины 6 граф имеет вид\n"); + printGraph(graph); + + /* Удаление вершины */ + // Вершина 3 соответствует v[1] + removeVertex(graph, v[1]); + printf("\nПосле удаления вершины 3 граф имеет вид:\n"); + printGraph(graph); + + // Освободить память + delGraphAdjList(graph); + free(v); + return 0; +} diff --git a/ru/codes/c/chapter_graph/graph_adjacency_matrix.c b/ru/codes/c/chapter_graph/graph_adjacency_matrix.c new file mode 100644 index 000000000..1ed36a736 --- /dev/null +++ b/ru/codes/c/chapter_graph/graph_adjacency_matrix.c @@ -0,0 +1,150 @@ +/** + * File: graph_adjacency_matrix.c + * Created Time: 2023-07-06 + * Author: NI-SW (947743645@qq.com) + */ + +#include "../utils/common.h" + +// Предположить, что максимальное число вершин равно 100 +#define MAX_SIZE 100 + +/* Структура неориентированного графа на основе матрицы смежности */ +typedef struct { + int vertices[MAX_SIZE]; + int adjMat[MAX_SIZE][MAX_SIZE]; + int size; +} GraphAdjMat; + +/* Конструктор */ +GraphAdjMat *newGraphAdjMat() { + GraphAdjMat *graph = (GraphAdjMat *)malloc(sizeof(GraphAdjMat)); + graph->size = 0; + for (int i = 0; i < MAX_SIZE; i++) { + for (int j = 0; j < MAX_SIZE; j++) { + graph->adjMat[i][j] = 0; + } + } + return graph; +} + +/* Деструктор */ +void delGraphAdjMat(GraphAdjMat *graph) { + free(graph); +} + +/* Добавление вершины */ +void addVertex(GraphAdjMat *graph, int val) { + if (graph->size == MAX_SIZE) { + fprintf(stderr, "Количество вершин графа уже достигло максимума\n"); + return; + } + // Добавить n-ю вершину и обнулить n-ю строку и столбец + int n = graph->size; + graph->vertices[n] = val; + for (int i = 0; i <= n; i++) { + graph->adjMat[n][i] = graph->adjMat[i][n] = 0; + } + graph->size++; +} + +/* Удаление вершины */ +void removeVertex(GraphAdjMat *graph, int index) { + if (index < 0 || index >= graph->size) { + fprintf(stderr, "индекс вершины выходит за границы\n"); + return; + } + // Удалить вершину с индексом index из списка вершин + for (int i = index; i < graph->size - 1; i++) { + graph->vertices[i] = graph->vertices[i + 1]; + } + // Удалить строку с индексом index из матрицы смежности + for (int i = index; i < graph->size - 1; i++) { + for (int j = 0; j < graph->size; j++) { + graph->adjMat[i][j] = graph->adjMat[i + 1][j]; + } + } + // Удалить столбец с индексом index из матрицы смежности + for (int i = 0; i < graph->size; i++) { + for (int j = index; j < graph->size - 1; j++) { + graph->adjMat[i][j] = graph->adjMat[i][j + 1]; + } + } + graph->size--; +} + +/* Добавление ребра */ +// Параметры i и j соответствуют индексам элементов vertices +void addEdge(GraphAdjMat *graph, int i, int j) { + if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) { + fprintf(stderr, "индексы ребра выходят за границы или совпадают\n"); + return; + } + graph->adjMat[i][j] = 1; + graph->adjMat[j][i] = 1; +} + +/* Удаление ребра */ +// Параметры i и j соответствуют индексам элементов vertices +void removeEdge(GraphAdjMat *graph, int i, int j) { + if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) { + fprintf(stderr, "индексы ребра выходят за границы или совпадают\n"); + return; + } + graph->adjMat[i][j] = 0; + graph->adjMat[j][i] = 0; +} + +/* Вывести матрицу смежности */ +void printGraphAdjMat(GraphAdjMat *graph) { + printf("Список вершин = "); + printArray(graph->vertices, graph->size); + printf("Матрица смежности =\n"); + for (int i = 0; i < graph->size; i++) { + printArray(graph->adjMat[i], graph->size); + } +} + +/* Driver Code */ +int main() { + // Инициализация неориентированного графа + GraphAdjMat *graph = newGraphAdjMat(); + int vertices[] = {1, 3, 2, 5, 4}; + for (int i = 0; i < 5; i++) { + addVertex(graph, vertices[i]); + } + int edges[][2] = {{0, 1}, {0, 3}, {1, 2}, {2, 3}, {2, 4}, {3, 4}}; + for (int i = 0; i < 6; i++) { + addEdge(graph, edges[i][0], edges[i][1]); + } + printf("\nПосле инициализации граф имеет вид\n"); + printGraphAdjMat(graph); + + /* Добавление ребра */ + // Индексы вершин 1 и 2 равны 0 и 2 соответственно + addEdge(graph, 0, 2); + printf("\nПосле добавления ребра 1-2 граф имеет вид\n"); + printGraphAdjMat(graph); + + /* Удаление ребра */ + // Индексы вершин 1 и 3 равны 0 и 1 соответственно + removeEdge(graph, 0, 1); + printf("\nПосле удаления ребра 1-3 граф имеет вид\n"); + printGraphAdjMat(graph); + + /* Добавление вершины */ + addVertex(graph, 6); + printf("\nПосле добавления вершины 6 граф имеет вид\n"); + printGraphAdjMat(graph); + + /* Удаление вершины */ + // Индекс вершины 3 равен 1 + removeVertex(graph, 1); + printf("\nПосле удаления вершины 3 граф имеет вид\n"); + printGraphAdjMat(graph); + + // Освободить память + delGraphAdjMat(graph); + + return 0; +} diff --git a/ru/codes/c/chapter_graph/graph_bfs.c b/ru/codes/c/chapter_graph/graph_bfs.c new file mode 100644 index 000000000..8a41b29b3 --- /dev/null +++ b/ru/codes/c/chapter_graph/graph_bfs.c @@ -0,0 +1,116 @@ +/** + * File: graph_bfs.c + * Created Time: 2023-07-11 + * Author: NI-SW (947743645@qq.com) + */ + +#include "graph_adjacency_list.c" + +// Предположим, что максимальное число узлов равно 100 +#define MAX_SIZE 100 + +/* Структура очереди узлов */ +typedef struct { + Vertex *vertices[MAX_SIZE]; + int front, rear, size; +} Queue; + +/* Конструктор */ +Queue *newQueue() { + Queue *q = (Queue *)malloc(sizeof(Queue)); + q->front = q->rear = q->size = 0; + return q; +} + +/* Проверка, пуста ли очередь */ +int isEmpty(Queue *q) { + return q->size == 0; +} + +/* Операция добавления в очередь */ +void enqueue(Queue *q, Vertex *vet) { + q->vertices[q->rear] = vet; + q->rear = (q->rear + 1) % MAX_SIZE; + q->size++; +} + +/* Операция извлечения из очереди */ +Vertex *dequeue(Queue *q) { + Vertex *vet = q->vertices[q->front]; + q->front = (q->front + 1) % MAX_SIZE; + q->size--; + return vet; +} + +/* Проверить, была ли вершина уже посещена */ +int isVisited(Vertex **visited, int size, Vertex *vet) { + // Искать узел обходом за O(n) времени + for (int i = 0; i < size; i++) { + if (visited[i] == vet) + return 1; + } + return 0; +} + +/* Обход в ширину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +void graphBFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize, Vertex **visited, int *visitedSize) { + // Очередь используется для реализации BFS + Queue *queue = newQueue(); + enqueue(queue, startVet); + visited[(*visitedSize)++] = startVet; + // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины + while (!isEmpty(queue)) { + Vertex *vet = dequeue(queue); // Извлечь головную вершину из очереди + res[(*resSize)++] = vet; // Отметить посещенную вершину + // Обойти все смежные вершины данной вершины + AdjListNode *node = findNode(graph, vet); + while (node != NULL) { + // Пропустить уже посещенную вершину + if (!isVisited(visited, *visitedSize, node->vertex)) { + enqueue(queue, node->vertex); // Помещать в очередь только непосещенные вершины + visited[(*visitedSize)++] = node->vertex; // Отметить эту вершину как посещенную + } + node = node->next; + } + } + // Освободить память + free(queue); +} + +/* Driver Code */ +int main() { + // Инициализация неориентированного графа + int vals[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + int size = sizeof(vals) / sizeof(vals[0]); + Vertex **v = valsToVets(vals, size); + Vertex *edges[][2] = {{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]}}; + int egdeSize = sizeof(edges) / sizeof(edges[0]); + GraphAdjList *graph = newGraphAdjList(); + // Добавить все вершины и ребра + for (int i = 0; i < size; i++) { + addVertex(graph, v[i]); + } + for (int i = 0; i < egdeSize; i++) { + addEdge(graph, edges[i][0], edges[i][1]); + } + printf("\nПосле инициализации граф имеет вид\n"); + printGraph(graph); + + // Обход в ширину + // Последовательность обхода вершин + Vertex *res[MAX_SIZE]; + int resSize = 0; + // Используется для записи уже посещенных вершин + Vertex *visited[MAX_SIZE]; + int visitedSize = 0; + graphBFS(graph, v[0], res, &resSize, visited, &visitedSize); + printf("\nПоследовательность вершин при обходе в ширину (BFS)\n"); + printArray(vetsToVals(res, resSize), resSize); + + // Освободить память + delGraphAdjList(graph); + free(v); + return 0; +} diff --git a/ru/codes/c/chapter_graph/graph_dfs.c b/ru/codes/c/chapter_graph/graph_dfs.c new file mode 100644 index 000000000..61cb4ad4a --- /dev/null +++ b/ru/codes/c/chapter_graph/graph_dfs.c @@ -0,0 +1,75 @@ +/** + * File: graph_dfs.c + * Created Time: 2023-07-13 + * Author: NI-SW (947743645@qq.com) + */ + +#include "graph_adjacency_list.c" + +// Предположим, что максимальное число узлов равно 100 +#define MAX_SIZE 100 + +/* Проверить, была ли вершина уже посещена */ +int isVisited(Vertex **res, int size, Vertex *vet) { + // Искать узел обходом за O(n) времени + for (int i = 0; i < size; i++) { + if (res[i] == vet) { + return 1; + } + } + return 0; +} + +/* Вспомогательная функция обхода в глубину */ +void dfs(GraphAdjList *graph, Vertex **res, int *resSize, Vertex *vet) { + // Отметить посещенную вершину + res[(*resSize)++] = vet; + // Обойти все смежные вершины данной вершины + AdjListNode *node = findNode(graph, vet); + while (node != NULL) { + // Пропустить уже посещенную вершину + if (!isVisited(res, *resSize, node->vertex)) { + // Рекурсивно обходить смежные вершины + dfs(graph, res, resSize, node->vertex); + } + node = node->next; + } +} + +/* Обход в глубину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +void graphDFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize) { + dfs(graph, res, resSize, startVet); +} + +/* Driver Code */ +int main() { + // Инициализация неориентированного графа + int vals[] = {0, 1, 2, 3, 4, 5, 6}; + int size = sizeof(vals) / sizeof(vals[0]); + Vertex **v = valsToVets(vals, size); + Vertex *edges[][2] = {{v[0], v[1]}, {v[0], v[3]}, {v[1], v[2]}, {v[2], v[5]}, {v[4], v[5]}, {v[5], v[6]}}; + int egdeSize = sizeof(edges) / sizeof(edges[0]); + GraphAdjList *graph = newGraphAdjList(); + // Добавить все вершины и ребра + for (int i = 0; i < size; i++) { + addVertex(graph, v[i]); + } + for (int i = 0; i < egdeSize; i++) { + addEdge(graph, edges[i][0], edges[i][1]); + } + printf("\nПосле инициализации граф имеет вид\n"); + printGraph(graph); + + // Обход в глубину + Vertex *res[MAX_SIZE]; + int resSize = 0; + graphDFS(graph, v[0], res, &resSize); + printf("\nПоследовательность вершин при обходе в глубину (DFS)\n"); + printArray(vetsToVals(res, resSize), resSize); + + // Освободить память + delGraphAdjList(graph); + free(v); + return 0; +} diff --git a/ru/codes/c/chapter_greedy/CMakeLists.txt b/ru/codes/c/chapter_greedy/CMakeLists.txt new file mode 100644 index 000000000..b8e6ca425 --- /dev/null +++ b/ru/codes/c/chapter_greedy/CMakeLists.txt @@ -0,0 +1,8 @@ +add_executable(coin_change_greedy coin_change_greedy.c) +add_executable(fractional_knapsack fractional_knapsack.c) +add_executable(max_capacity max_capacity.c) +add_executable(max_product_cutting max_product_cutting.c) + +if (NOT CMAKE_C_COMPILER_ID STREQUAL "MSVC") + target_link_libraries(max_product_cutting m) +endif() diff --git a/ru/codes/c/chapter_greedy/coin_change_greedy.c b/ru/codes/c/chapter_greedy/coin_change_greedy.c new file mode 100644 index 000000000..9cb45bb8e --- /dev/null +++ b/ru/codes/c/chapter_greedy/coin_change_greedy.c @@ -0,0 +1,60 @@ +/** + * File: coin_change_greedy.c + * Created Time: 2023-09-07 + * Author: lwbaptx (lwbaptx@gmail.com) + */ + +#include "../utils/common.h" + +/* Размен монет: жадный алгоритм */ +int coinChangeGreedy(int *coins, int size, int amt) { + // Предположить, что список coins упорядочен + int i = size - 1; + int count = 0; + // Циклически выполнять жадный выбор, пока не останется суммы + while (amt > 0) { + // Найти монету, которая меньше остатка суммы и наиболее к нему близка + while (i > 0 && coins[i] > amt) { + i--; + } + // Выбрать coins[i] + amt -= coins[i]; + count++; + } + // Если допустимое решение не найдено, вернуть -1 + return amt == 0 ? count : -1; +} + +/* Driver Code */ +int main() { + // Жадный подход: гарантирует нахождение глобально оптимального решения + int coins1[6] = {1, 5, 10, 20, 50, 100}; + int amt = 186; + int res = coinChangeGreedy(coins1, 6, amt); + printf("\ncoins = "); + printArray(coins1, 6); + printf("amt = %d\n", amt); + printf("Минимальное количество монет для набора суммы %d = %d\n", amt, res); + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + int coins2[3] = {1, 20, 50}; + amt = 60; + res = coinChangeGreedy(coins2, 3, amt); + printf("\ncoins = "); + printArray(coins2, 3); + printf("amt = %d\n", amt); + printf("Минимальное количество монет для набора суммы %d = %d\n", amt, res); + printf("На самом деле минимальное количество равно 3, а именно 20 + 20 + 20\n"); + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + int coins3[3] = {1, 49, 50}; + amt = 98; + res = coinChangeGreedy(coins3, 3, amt); + printf("\ncoins = "); + printArray(coins3, 3); + printf("amt = %d\n", amt); + printf("Минимальное количество монет для набора суммы %d = %d\n", amt, res); + printf("На самом деле минимальное количество равно 2, а именно 49 + 49\n"); + + return 0; +} diff --git a/ru/codes/c/chapter_greedy/fractional_knapsack.c b/ru/codes/c/chapter_greedy/fractional_knapsack.c new file mode 100644 index 000000000..1325b2e76 --- /dev/null +++ b/ru/codes/c/chapter_greedy/fractional_knapsack.c @@ -0,0 +1,60 @@ +/** + * File: fractional_knapsack.c + * Created Time: 2023-09-14 + * Author: xianii (xianyi.xia@outlook.com) + */ + +#include "../utils/common.h" + +/* Предмет */ +typedef struct { + int w; // Вес предмета + int v; // Стоимость предмета +} Item; + +/* Отсортировать по удельной стоимости */ +int sortByValueDensity(const void *a, const void *b) { + Item *t1 = (Item *)a; + Item *t2 = (Item *)b; + return (float)(t1->v) / t1->w < (float)(t2->v) / t2->w; +} + +/* Дробный рюкзак: жадный алгоритм */ +float fractionalKnapsack(int wgt[], int val[], int itemCount, int cap) { + // Создать список предметов с двумя свойствами: вес и стоимость + Item *items = malloc(sizeof(Item) * itemCount); + for (int i = 0; i < itemCount; i++) { + items[i] = (Item){.w = wgt[i], .v = val[i]}; + } + // Отсортировать по удельной стоимости item.v / item.w в порядке убывания + qsort(items, (size_t)itemCount, sizeof(Item), sortByValueDensity); + // Циклический жадный выбор + float res = 0.0; + for (int i = 0; i < itemCount; i++) { + if (items[i].w <= cap) { + // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком + res += items[i].v; + cap -= items[i].w; + } else { + // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета + res += (float)cap / items[i].w * items[i].v; + cap = 0; + break; + } + } + free(items); + return res; +} + +/* Driver Code */ +int main(void) { + int wgt[] = {10, 20, 30, 40, 50}; + int val[] = {50, 120, 150, 210, 240}; + int capacity = 50; + + // Жадный алгоритм + float res = fractionalKnapsack(wgt, val, sizeof(wgt) / sizeof(int), capacity); + printf("Максимальная стоимость предметов, не превышающая вместимость рюкзака, равна %0.2f\n", res); + + return 0; +} diff --git a/ru/codes/c/chapter_greedy/max_capacity.c b/ru/codes/c/chapter_greedy/max_capacity.c new file mode 100644 index 000000000..7300454c6 --- /dev/null +++ b/ru/codes/c/chapter_greedy/max_capacity.c @@ -0,0 +1,49 @@ +/** + * File: max_capacity.c + * Created Time: 2023-09-15 + * Author: xianii (xianyi.xia@outlook.com) + */ + +#include "../utils/common.h" + +/* Найти минимум */ +int myMin(int a, int b) { + return a < b ? a : b; +} +/* Найти максимум */ +int myMax(int a, int b) { + return a > b ? a : b; +} + +/* Максимальная вместимость: жадный алгоритм */ +int maxCapacity(int ht[], int htLength) { + // Инициализировать i и j так, чтобы они располагались по двум концам массива + int i = 0; + int j = htLength - 1; + // Начальная максимальная вместимость равна 0 + int res = 0; + // Выполнять жадный выбор в цикле, пока две доски не встретятся + while (i < j) { + // Обновить максимальную вместимость + int capacity = myMin(ht[i], ht[j]) * (j - i); + res = myMax(res, capacity); + // Сдвигать внутрь более короткую сторону + if (ht[i] < ht[j]) { + i++; + } else { + j--; + } + } + return res; +} + +/* Driver Code */ +int main(void) { + int ht[] = {3, 8, 5, 2, 7, 7, 3, 4}; + + // Жадный алгоритм + int res = maxCapacity(ht, sizeof(ht) / sizeof(int)); + printf("Максимальная вместимость = %d\n", res); + + return 0; +} diff --git a/ru/codes/c/chapter_greedy/max_product_cutting.c b/ru/codes/c/chapter_greedy/max_product_cutting.c new file mode 100644 index 000000000..19107c18c --- /dev/null +++ b/ru/codes/c/chapter_greedy/max_product_cutting.c @@ -0,0 +1,38 @@ +/** + * File: max_product_cutting.c + * Created Time: 2023-09-15 + * Author: xianii (xianyi.xia@outlook.com) + */ + +#include "../utils/common.h" + +/* Максимальное произведение разрезания: жадный алгоритм */ +int maxProductCutting(int n) { + // Когда n <= 3, обязательно нужно выделить одну 1 + if (n <= 3) { + return 1 * (n - 1); + } + // Жадно выделить множители 3, где a — число троек, а b — остаток + int a = n / 3; + int b = n % 3; + if (b == 1) { + // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2 + return pow(3, a - 1) * 2 * 2; + } + if (b == 2) { + // Если остаток равен 2, ничего не делать + return pow(3, a) * 2; + } + // Если остаток равен 0, ничего не делать + return pow(3, a); +} + +/* Driver Code */ +int main(void) { + int n = 58; + // Жадный алгоритм + int res = maxProductCutting(n); + printf("Максимальное произведение после разрезания = %d\n", res); + + return 0; +} diff --git a/ru/codes/c/chapter_hashing/CMakeLists.txt b/ru/codes/c/chapter_hashing/CMakeLists.txt new file mode 100644 index 000000000..9ac951ae4 --- /dev/null +++ b/ru/codes/c/chapter_hashing/CMakeLists.txt @@ -0,0 +1,4 @@ +add_executable(array_hash_map array_hash_map.c) +add_executable(hash_map_chaining hash_map_chaining.c) +add_executable(hash_map_open_addressing hash_map_open_addressing.c) +add_executable(simple_hash simple_hash.c) diff --git a/ru/codes/c/chapter_hashing/array_hash_map.c b/ru/codes/c/chapter_hashing/array_hash_map.c new file mode 100644 index 000000000..cb2c2cdb3 --- /dev/null +++ b/ru/codes/c/chapter_hashing/array_hash_map.c @@ -0,0 +1,215 @@ +/** + * File: array_hash_map.c + * Created Time: 2023-03-18 + * Author: Guanngxu (446678850@qq.com) + */ + +#include "../utils/common.h" + +/* Размер хеш-таблицы по умолчанию */ +#define MAX_SIZE 100 + +/* Пара ключ-значение int->string */ +typedef struct { + int key; + char *val; +} Pair; + +/* Набор пар ключ-значение */ +typedef struct { + void *set; + int len; +} MapSet; + +/* Хеш-таблица на основе массива */ +typedef struct { + Pair *buckets[MAX_SIZE]; +} ArrayHashMap; + +/* Конструктор */ +ArrayHashMap *newArrayHashMap() { + ArrayHashMap *hmap = malloc(sizeof(ArrayHashMap)); + for (int i=0; i < MAX_SIZE; i++) { + hmap->buckets[i] = NULL; + } + return hmap; +} + +/* Деструктор */ +void delArrayHashMap(ArrayHashMap *hmap) { + for (int i = 0; i < MAX_SIZE; i++) { + if (hmap->buckets[i] != NULL) { + free(hmap->buckets[i]->val); + free(hmap->buckets[i]); + } + } + free(hmap); +} + +/* Хеш-функция */ +int hashFunc(int key) { + int index = key % MAX_SIZE; + return index; +} + +/* Операция поиска */ +const char *get(const ArrayHashMap *hmap, const int key) { + int index = hashFunc(key); + const Pair *Pair = hmap->buckets[index]; + if (Pair == NULL) + return NULL; + return Pair->val; +} + +/* Операция добавления */ +void put(ArrayHashMap *hmap, const int key, const char *val) { + Pair *Pair = malloc(sizeof(Pair)); + Pair->key = key; + Pair->val = malloc(strlen(val) + 1); + strcpy(Pair->val, val); + + int index = hashFunc(key); + hmap->buckets[index] = Pair; +} + +/* Операция удаления */ +void removeItem(ArrayHashMap *hmap, const int key) { + int index = hashFunc(key); + free(hmap->buckets[index]->val); + free(hmap->buckets[index]); + hmap->buckets[index] = NULL; +} + +/* Получить все пары ключ-значение */ +void pairSet(ArrayHashMap *hmap, MapSet *set) { + Pair *entries; + int i = 0, index = 0; + int total = 0; + /* Подсчитать число действительных пар ключ-значение */ + for (i = 0; i < MAX_SIZE; i++) { + if (hmap->buckets[i] != NULL) { + total++; + } + } + entries = malloc(sizeof(Pair) * total); + for (i = 0; i < MAX_SIZE; i++) { + if (hmap->buckets[i] != NULL) { + entries[index].key = hmap->buckets[i]->key; + entries[index].val = malloc(strlen(hmap->buckets[i]->val) + 1); + strcpy(entries[index].val, hmap->buckets[i]->val); + index++; + } + } + set->set = entries; + set->len = total; +} + +/* Получить все ключи */ +void keySet(ArrayHashMap *hmap, MapSet *set) { + int *keys; + int i = 0, index = 0; + int total = 0; + /* Подсчитать число действительных пар ключ-значение */ + for (i = 0; i < MAX_SIZE; i++) { + if (hmap->buckets[i] != NULL) { + total++; + } + } + keys = malloc(total * sizeof(int)); + for (i = 0; i < MAX_SIZE; i++) { + if (hmap->buckets[i] != NULL) { + keys[index] = hmap->buckets[i]->key; + index++; + } + } + set->set = keys; + set->len = total; +} + +/* Получить все значения */ +void valueSet(ArrayHashMap *hmap, MapSet *set) { + char **vals; + int i = 0, index = 0; + int total = 0; + /* Подсчитать число действительных пар ключ-значение */ + for (i = 0; i < MAX_SIZE; i++) { + if (hmap->buckets[i] != NULL) { + total++; + } + } + vals = malloc(total * sizeof(char *)); + for (i = 0; i < MAX_SIZE; i++) { + if (hmap->buckets[i] != NULL) { + vals[index] = hmap->buckets[i]->val; + index++; + } + } + set->set = vals; + set->len = total; +} + +/* Вывести хеш-таблицу */ +void print(ArrayHashMap *hmap) { + int i; + MapSet set; + pairSet(hmap, &set); + Pair *entries = (Pair *)set.set; + for (i = 0; i < set.len; i++) { + printf("%d -> %s\n", entries[i].key, entries[i].val); + } + free(set.set); +} + +/* Driver Code */ +int main() { + /* Инициализация хеш-таблицы */ + ArrayHashMap *hmap = newArrayHashMap(); + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + put(hmap, 12836, "Сяо Ха"); + put(hmap, 15937, "Сяо Ло"); + put(hmap, 16750, "Сяо Суань"); + put(hmap, 13276, "Сяо Фа"); + put(hmap, 10583, "Сяо Я"); + printf("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение\n"); + print(hmap); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + const char *name = get(hmap, 15937); + printf("\nДля студенческого номера 15937 найдено имя %s\n", name); + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + removeItem(hmap, 10583); + printf("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение\n"); + print(hmap); + + /* Обход хеш-таблицы */ + int i; + + printf("\nОтдельный обход пар ключ-значение\n"); + print(hmap); + + MapSet set; + + keySet(hmap, &set); + int *keys = (int *)set.set; + printf("\nОтдельный обход ключей\n"); + for (i = 0; i < set.len; i++) { + printf("%d\n", keys[i]); + } + free(set.set); + + valueSet(hmap, &set); + char **vals = (char **)set.set; + printf("\nОбход только значений Value\n"); + for (i = 0; i < set.len; i++) { + printf("%s\n", vals[i]); + } + free(set.set); + + delArrayHashMap(hmap); + return 0; +} diff --git a/ru/codes/c/chapter_hashing/hash_map_chaining.c b/ru/codes/c/chapter_hashing/hash_map_chaining.c new file mode 100644 index 000000000..6ff3702fc --- /dev/null +++ b/ru/codes/c/chapter_hashing/hash_map_chaining.c @@ -0,0 +1,213 @@ +/** + * File: hash_map_chaining.c + * Created Time: 2023-10-13 + * Author: SenMing (1206575349@qq.com), krahets (krahets@163.com) + */ + +#include +#include +#include + +// Предположить, что максимальная длина val равна 100 +#define MAX_SIZE 100 + +/* Пара ключ-значение */ +typedef struct { + int key; + char val[MAX_SIZE]; +} Pair; + +/* Узел связного списка */ +typedef struct Node { + Pair *pair; + struct Node *next; +} Node; + +/* Хеш-таблица с цепочками */ +typedef struct { + int size; // Число пар ключ-значение + int capacity; // Вместимость хеш-таблицы + double loadThres; // Порог коэффициента загрузки для запуска расширения + int extendRatio; // Коэффициент расширения + Node **buckets; // Массив корзин +} HashMapChaining; + +/* Конструктор */ +HashMapChaining *newHashMapChaining() { + HashMapChaining *hashMap = (HashMapChaining *)malloc(sizeof(HashMapChaining)); + hashMap->size = 0; + hashMap->capacity = 4; + hashMap->loadThres = 2.0 / 3.0; + hashMap->extendRatio = 2; + hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *)); + for (int i = 0; i < hashMap->capacity; i++) { + hashMap->buckets[i] = NULL; + } + return hashMap; +} + +/* Деструктор */ +void delHashMapChaining(HashMapChaining *hashMap) { + for (int i = 0; i < hashMap->capacity; i++) { + Node *cur = hashMap->buckets[i]; + while (cur) { + Node *tmp = cur; + cur = cur->next; + free(tmp->pair); + free(tmp); + } + } + free(hashMap->buckets); + free(hashMap); +} + +/* Хеш-функция */ +int hashFunc(HashMapChaining *hashMap, int key) { + return key % hashMap->capacity; +} + +/* Коэффициент загрузки */ +double loadFactor(HashMapChaining *hashMap) { + return (double)hashMap->size / (double)hashMap->capacity; +} + +/* Операция поиска */ +char *get(HashMapChaining *hashMap, int key) { + int index = hashFunc(hashMap, key); + // Обойти корзину; если найден key, вернуть соответствующее val + Node *cur = hashMap->buckets[index]; + while (cur) { + if (cur->pair->key == key) { + return cur->pair->val; + } + cur = cur->next; + } + return ""; // Если key не найден, вернуть пустую строку +} + +/* Операция добавления */ +void put(HashMapChaining *hashMap, int key, const char *val); + +/* Расширить хеш-таблицу */ +void extend(HashMapChaining *hashMap) { + // Временно сохранить исходную хеш-таблицу + int oldCapacity = hashMap->capacity; + Node **oldBuckets = hashMap->buckets; + // Инициализация новой хеш-таблицы после расширения + hashMap->capacity *= hashMap->extendRatio; + hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *)); + for (int i = 0; i < hashMap->capacity; i++) { + hashMap->buckets[i] = NULL; + } + hashMap->size = 0; + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for (int i = 0; i < oldCapacity; i++) { + Node *cur = oldBuckets[i]; + while (cur) { + put(hashMap, cur->pair->key, cur->pair->val); + Node *temp = cur; + cur = cur->next; + // Освободить память + free(temp->pair); + free(temp); + } + } + + free(oldBuckets); +} + +/* Операция добавления */ +void put(HashMapChaining *hashMap, int key, const char *val) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if (loadFactor(hashMap) > hashMap->loadThres) { + extend(hashMap); + } + int index = hashFunc(hashMap, key); + // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть + Node *cur = hashMap->buckets[index]; + while (cur) { + if (cur->pair->key == key) { + strcpy(cur->pair->val, val); // Если встретился указанный key, обновить соответствующий val и вернуть + return; + } + cur = cur->next; + } + // Если такого key нет, добавить пару ключ-значение в голову связного списка + Pair *newPair = (Pair *)malloc(sizeof(Pair)); + newPair->key = key; + strcpy(newPair->val, val); + Node *newNode = (Node *)malloc(sizeof(Node)); + newNode->pair = newPair; + newNode->next = hashMap->buckets[index]; + hashMap->buckets[index] = newNode; + hashMap->size++; +} + +/* Операция удаления */ +void removeItem(HashMapChaining *hashMap, int key) { + int index = hashFunc(hashMap, key); + Node *cur = hashMap->buckets[index]; + Node *pre = NULL; + while (cur) { + if (cur->pair->key == key) { + // Удалить из него пару ключ-значение + if (pre) { + pre->next = cur->next; + } else { + hashMap->buckets[index] = cur->next; + } + // Освободить память + free(cur->pair); + free(cur); + hashMap->size--; + return; + } + pre = cur; + cur = cur->next; + } +} + +/* Вывести хеш-таблицу */ +void print(HashMapChaining *hashMap) { + for (int i = 0; i < hashMap->capacity; i++) { + Node *cur = hashMap->buckets[i]; + printf("["); + while (cur) { + printf("%d -> %s, ", cur->pair->key, cur->pair->val); + cur = cur->next; + } + printf("]\n"); + } +} + +/* Driver Code */ +int main() { + /* Инициализация хеш-таблицы */ + HashMapChaining *hashMap = newHashMapChaining(); + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + put(hashMap, 12836, "Сяо Ха"); + put(hashMap, 15937, "Сяо Ло"); + put(hashMap, 16750, "Сяо Суань"); + put(hashMap, 13276, "Сяо Фа"); + put(hashMap, 10583, "Сяо Я"); + printf("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение\n"); + print(hashMap); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + char *name = get(hashMap, 13276); + printf("\nДля студенческого номера 13276 найдено имя %s\n", name); + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + removeItem(hashMap, 12836); + printf("\nПосле удаления студенческого номера 12836 хеш-таблица имеет вид\nКлюч -> Значение\n"); + print(hashMap); + + /* Освободить память хеш-таблицы */ + delHashMapChaining(hashMap); + + return 0; +} diff --git a/ru/codes/c/chapter_hashing/hash_map_open_addressing.c b/ru/codes/c/chapter_hashing/hash_map_open_addressing.c new file mode 100644 index 000000000..41eba6053 --- /dev/null +++ b/ru/codes/c/chapter_hashing/hash_map_open_addressing.c @@ -0,0 +1,211 @@ +/** + * File: hash_map_open_addressing.c + * Created Time: 2023-10-6 + * Author: lclc6 (w1929522410@163.com) + */ + +#include "../utils/common.h" + +/* Хеш-таблица с открытой адресацией */ +typedef struct { + int key; + char *val; +} Pair; + +/* Хеш-таблица с открытой адресацией */ +typedef struct { + int size; // Число пар ключ-значение + int capacity; // Вместимость хеш-таблицы + double loadThres; // Порог коэффициента загрузки для запуска расширения + int extendRatio; // Коэффициент расширения + Pair **buckets; // Массив корзин + Pair *TOMBSTONE; // Удалить метку +} HashMapOpenAddressing; + +// Объявление функции +void extend(HashMapOpenAddressing *hashMap); + +/* Конструктор */ +HashMapOpenAddressing *newHashMapOpenAddressing() { + HashMapOpenAddressing *hashMap = (HashMapOpenAddressing *)malloc(sizeof(HashMapOpenAddressing)); + hashMap->size = 0; + hashMap->capacity = 4; + hashMap->loadThres = 2.0 / 3.0; + hashMap->extendRatio = 2; + hashMap->buckets = (Pair **)calloc(hashMap->capacity, sizeof(Pair *)); + hashMap->TOMBSTONE = (Pair *)malloc(sizeof(Pair)); + hashMap->TOMBSTONE->key = -1; + hashMap->TOMBSTONE->val = "-1"; + + return hashMap; +} + +/* Деструктор */ +void delHashMapOpenAddressing(HashMapOpenAddressing *hashMap) { + for (int i = 0; i < hashMap->capacity; i++) { + Pair *pair = hashMap->buckets[i]; + if (pair != NULL && pair != hashMap->TOMBSTONE) { + free(pair->val); + free(pair); + } + } + free(hashMap->buckets); + free(hashMap->TOMBSTONE); + free(hashMap); +} + +/* Хеш-функция */ +int hashFunc(HashMapOpenAddressing *hashMap, int key) { + return key % hashMap->capacity; +} + +/* Коэффициент загрузки */ +double loadFactor(HashMapOpenAddressing *hashMap) { + return (double)hashMap->size / (double)hashMap->capacity; +} + +/* Найти индекс корзины, соответствующий key */ +int findBucket(HashMapOpenAddressing *hashMap, int key) { + int index = hashFunc(hashMap, key); + int firstTombstone = -1; + // Выполнять линейное пробирование и завершить при встрече с пустой корзиной + while (hashMap->buckets[index] != NULL) { + // Если встретился key, вернуть соответствующий индекс корзины + if (hashMap->buckets[index]->key == key) { + // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс + if (firstTombstone != -1) { + hashMap->buckets[firstTombstone] = hashMap->buckets[index]; + hashMap->buckets[index] = hashMap->TOMBSTONE; + return firstTombstone; // Вернуть индекс корзины после перемещения + } + return index; // Вернуть индекс корзины + } + // Записать первую встретившуюся метку удаления + if (firstTombstone == -1 && hashMap->buckets[index] == hashMap->TOMBSTONE) { + firstTombstone = index; + } + // Вычислить индекс корзины; при выходе за конец вернуться к началу + index = (index + 1) % hashMap->capacity; + } + // Если key не существует, вернуть индекс точки добавления + return firstTombstone == -1 ? index : firstTombstone; +} + +/* Операция поиска */ +char *get(HashMapOpenAddressing *hashMap, int key) { + // Найти индекс корзины, соответствующий key + int index = findBucket(hashMap, key); + // Если пара ключ-значение найдена, вернуть соответствующее val + if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) { + return hashMap->buckets[index]->val; + } + // Если пары ключ-значение не существует, вернуть пустую строку + return ""; +} + +/* Операция добавления */ +void put(HashMapOpenAddressing *hashMap, int key, char *val) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if (loadFactor(hashMap) > hashMap->loadThres) { + extend(hashMap); + } + // Найти индекс корзины, соответствующий key + int index = findBucket(hashMap, key); + // Если пара ключ-значение найдена, перезаписать val и вернуть + if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) { + free(hashMap->buckets[index]->val); + hashMap->buckets[index]->val = (char *)malloc(sizeof(strlen(val) + 1)); + strcpy(hashMap->buckets[index]->val, val); + hashMap->buckets[index]->val[strlen(val)] = '\0'; + return; + } + // Если пары ключ-значение нет, добавить ее + Pair *pair = (Pair *)malloc(sizeof(Pair)); + pair->key = key; + pair->val = (char *)malloc(sizeof(strlen(val) + 1)); + strcpy(pair->val, val); + pair->val[strlen(val)] = '\0'; + + hashMap->buckets[index] = pair; + hashMap->size++; +} + +/* Операция удаления */ +void removeItem(HashMapOpenAddressing *hashMap, int key) { + // Найти индекс корзины, соответствующий key + int index = findBucket(hashMap, key); + // Если пара ключ-значение найдена, заменить ее меткой удаления + if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) { + Pair *pair = hashMap->buckets[index]; + free(pair->val); + free(pair); + hashMap->buckets[index] = hashMap->TOMBSTONE; + hashMap->size--; + } +} + +/* Расширить хеш-таблицу */ +void extend(HashMapOpenAddressing *hashMap) { + // Временно сохранить исходную хеш-таблицу + Pair **bucketsTmp = hashMap->buckets; + int oldCapacity = hashMap->capacity; + // Инициализация новой хеш-таблицы после расширения + hashMap->capacity *= hashMap->extendRatio; + hashMap->buckets = (Pair **)calloc(hashMap->capacity, sizeof(Pair *)); + hashMap->size = 0; + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for (int i = 0; i < oldCapacity; i++) { + Pair *pair = bucketsTmp[i]; + if (pair != NULL && pair != hashMap->TOMBSTONE) { + put(hashMap, pair->key, pair->val); + free(pair->val); + free(pair); + } + } + free(bucketsTmp); +} + +/* Вывести хеш-таблицу */ +void print(HashMapOpenAddressing *hashMap) { + for (int i = 0; i < hashMap->capacity; i++) { + Pair *pair = hashMap->buckets[i]; + if (pair == NULL) { + printf("NULL\n"); + } else if (pair == hashMap->TOMBSTONE) { + printf("TOMBSTONE\n"); + } else { + printf("%d -> %s\n", pair->key, pair->val); + } + } +} + +/* Driver Code */ +int main() { + // Инициализация хеш-таблицы + HashMapOpenAddressing *hashmap = newHashMapOpenAddressing(); + + // Операция добавления + // Добавить пару (key, val) в хеш-таблицу + put(hashmap, 12836, "Сяо Ха"); + put(hashmap, 15937, "Сяо Ло"); + put(hashmap, 16750, "Сяо Суань"); + put(hashmap, 13276, "Сяо Фа"); + put(hashmap, 10583, "Сяо Я"); + printf("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение\n"); + print(hashmap); + + // Операция поиска + // Передать ключ key в хеш-таблицу и получить значение val + char *name = get(hashmap, 13276); + printf("\nДля студенческого номера 13276 найдено имя %s\n", name); + + // Операция удаления + // Удалить пару (key, val) из хеш-таблицы + removeItem(hashmap, 16750); + printf("\nПосле удаления 16750 хеш-таблица имеет вид\nКлюч -> Значение\n"); + print(hashmap); + + // Уничтожить хеш-таблицу + delHashMapOpenAddressing(hashmap); + return 0; +} diff --git a/ru/codes/c/chapter_hashing/simple_hash.c b/ru/codes/c/chapter_hashing/simple_hash.c new file mode 100644 index 000000000..d4107c0ef --- /dev/null +++ b/ru/codes/c/chapter_hashing/simple_hash.c @@ -0,0 +1,68 @@ +/** + * File: simple_hash.c + * Created Time: 2023-09-09 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +/* Аддитивное хеширование */ +int addHash(char *key) { + long long hash = 0; + const int MODULUS = 1000000007; + for (int i = 0; i < strlen(key); i++) { + hash = (hash + (unsigned char)key[i]) % MODULUS; + } + return (int)hash; +} + +/* Мультипликативное хеширование */ +int mulHash(char *key) { + long long hash = 0; + const int MODULUS = 1000000007; + for (int i = 0; i < strlen(key); i++) { + hash = (31 * hash + (unsigned char)key[i]) % MODULUS; + } + return (int)hash; +} + +/* XOR-хеширование */ +int xorHash(char *key) { + int hash = 0; + const int MODULUS = 1000000007; + + for (int i = 0; i < strlen(key); i++) { + hash ^= (unsigned char)key[i]; + } + return hash & MODULUS; +} + +/* Хеширование с циклическим сдвигом */ +int rotHash(char *key) { + long long hash = 0; + const int MODULUS = 1000000007; + for (int i = 0; i < strlen(key); i++) { + hash = ((hash << 4) ^ (hash >> 28) ^ (unsigned char)key[i]) % MODULUS; + } + + return (int)hash; +} + +/* Driver Code */ +int main() { + char *key = "Hello Algo"; + + int hash = addHash(key); + printf("Хеш суммы = %d\n", hash); + + hash = mulHash(key); + printf("Хеш произведения = %d\n", hash); + + hash = xorHash(key); + printf("XOR-хеш = %d\n", hash); + + hash = rotHash(key); + printf("Хеш с циклическим сдвигом = %d\n", hash); + + return 0; +} diff --git a/ru/codes/c/chapter_heap/CMakeLists.txt b/ru/codes/c/chapter_heap/CMakeLists.txt new file mode 100644 index 000000000..357ec702c --- /dev/null +++ b/ru/codes/c/chapter_heap/CMakeLists.txt @@ -0,0 +1,2 @@ +add_executable(my_heap_test my_heap_test.c) +add_executable(top_k top_k.c) diff --git a/ru/codes/c/chapter_heap/my_heap.c b/ru/codes/c/chapter_heap/my_heap.c new file mode 100644 index 000000000..0cf692ce4 --- /dev/null +++ b/ru/codes/c/chapter_heap/my_heap.c @@ -0,0 +1,152 @@ +/** + * File: my_heap.c + * Created Time: 2023-01-15 + * Author: Reanon (793584285@qq.com) + */ + +#include "../utils/common.h" + +#define MAX_SIZE 5000 + +/* Максимальная куча */ +typedef struct { + // size обозначает фактическое число элементов + int size; + // Использовать массив с заранее выделенной памятью, чтобы избежать расширения + int data[MAX_SIZE]; +} MaxHeap; + +// Объявление функции +void siftDown(MaxHeap *maxHeap, int i); +void siftUp(MaxHeap *maxHeap, int i); +int parent(MaxHeap *maxHeap, int i); + +/* Конструктор, строящий кучу по срезу */ +MaxHeap *newMaxHeap(int nums[], int size) { + // Поместить все элементы в кучу + MaxHeap *maxHeap = (MaxHeap *)malloc(sizeof(MaxHeap)); + maxHeap->size = size; + memcpy(maxHeap->data, nums, size * sizeof(int)); + for (int i = parent(maxHeap, size - 1); i >= 0; i--) { + // Выполнить heapify для всех узлов, кроме листовых + siftDown(maxHeap, i); + } + return maxHeap; +} + +/* Деструктор */ +void delMaxHeap(MaxHeap *maxHeap) { + // Освободить память + free(maxHeap); +} + +/* Получить индекс левого дочернего узла */ +int left(MaxHeap *maxHeap, int i) { + return 2 * i + 1; +} + +/* Получить индекс правого дочернего узла */ +int right(MaxHeap *maxHeap, int i) { + return 2 * i + 2; +} + +/* Получить индекс родительского узла */ +int parent(MaxHeap *maxHeap, int i) { + return (i - 1) / 2; // Округление вниз +} + +/* Поменять элементы местами */ +void swap(MaxHeap *maxHeap, int i, int j) { + int temp = maxHeap->data[i]; + maxHeap->data[i] = maxHeap->data[j]; + maxHeap->data[j] = temp; +} + +/* Получение размера кучи */ +int size(MaxHeap *maxHeap) { + return maxHeap->size; +} + +/* Проверка, пуста ли куча */ +int isEmpty(MaxHeap *maxHeap) { + return maxHeap->size == 0; +} + +/* Доступ к элементу на вершине кучи */ +int peek(MaxHeap *maxHeap) { + return maxHeap->data[0]; +} + +/* Добавление элемента в кучу */ +void push(MaxHeap *maxHeap, int val) { + // По умолчанию не следует добавлять так много узлов + if (maxHeap->size == MAX_SIZE) { + printf("heap is full!"); + return; + } + // Добавление узла + maxHeap->data[maxHeap->size] = val; + maxHeap->size++; + + // Просеивание снизу вверх + siftUp(maxHeap, maxHeap->size - 1); +} + +/* Извлечение элемента из кучи */ +int pop(MaxHeap *maxHeap) { + // Обработка пустого случая + if (isEmpty(maxHeap)) { + printf("heap is empty!"); + return INT_MAX; + } + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + swap(maxHeap, 0, size(maxHeap) - 1); + // Удаление узла + int val = maxHeap->data[maxHeap->size - 1]; + maxHeap->size--; + // Просеивание сверху вниз + siftDown(maxHeap, 0); + + // Вернуть элемент с вершины кучи + return val; +} + +/* Начиная с узла i, выполнить просеивание сверху вниз */ +void siftDown(MaxHeap *maxHeap, int i) { + while (true) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как max + int l = left(maxHeap, i); + int r = right(maxHeap, i); + int max = i; + if (l < size(maxHeap) && maxHeap->data[l] > maxHeap->data[max]) { + max = l; + } + if (r < size(maxHeap) && maxHeap->data[r] > maxHeap->data[max]) { + max = r; + } + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (max == i) { + break; + } + // Поменять два узла местами + swap(maxHeap, i, max); + // Циклическое просеивание вниз + i = max; + } +} + +/* Начиная с узла i, выполнить просеивание снизу вверх */ +void siftUp(MaxHeap *maxHeap, int i) { + while (true) { + // Получение родительского узла для узла i + int p = parent(maxHeap, i); + // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления» + if (p < 0 || maxHeap->data[i] <= maxHeap->data[p]) { + break; + } + // Поменять два узла местами + swap(maxHeap, i, p); + // Циклическое просеивание вверх + i = p; + } +} diff --git a/ru/codes/c/chapter_heap/my_heap_test.c b/ru/codes/c/chapter_heap/my_heap_test.c new file mode 100644 index 000000000..670358033 --- /dev/null +++ b/ru/codes/c/chapter_heap/my_heap_test.c @@ -0,0 +1,41 @@ +/** + * File: my_heap_test.c + * Created Time: 2023-01-15 + * Author: Reanon (793584285@qq.com) + */ + +#include "my_heap.c" + +/* Driver Code */ +int main() { + /* Инициализация кучи */ + // Инициализация максимальной кучи + int nums[] = {9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2}; + MaxHeap *maxHeap = newMaxHeap(nums, sizeof(nums) / sizeof(int)); + printf("После построения кучи из входного массива\n"); + printHeap(maxHeap->data, maxHeap->size); + + /* Получение элемента с вершины кучи */ + printf("\nВерхний элемент кучи = %d\n", peek(maxHeap)); + + /* Добавление элемента в кучу */ + push(maxHeap, 7); + printf("\nПосле добавления элемента 7 в кучу\n"); + printHeap(maxHeap->data, maxHeap->size); + + /* Извлечение элемента с вершины кучи */ + int top = pop(maxHeap); + printf("\nПосле извлечения верхнего элемента %d из кучи\n", top); + printHeap(maxHeap->data, maxHeap->size); + + /* Получение размера кучи */ + printf("\nКоличество элементов в куче = %d\n", size(maxHeap)); + + /* Проверка, пуста ли куча */ + printf("\nПуста ли куча: %d\n", isEmpty(maxHeap)); + + // Освободить память + delMaxHeap(maxHeap); + + return 0; +} diff --git a/ru/codes/c/chapter_heap/top_k.c b/ru/codes/c/chapter_heap/top_k.c new file mode 100644 index 000000000..2f5ce1cd3 --- /dev/null +++ b/ru/codes/c/chapter_heap/top_k.c @@ -0,0 +1,73 @@ +/** + * File: top_k.c + * Created Time: 2023-10-26 + * Author: krahets (krahets163.com) + */ + +#include "my_heap.c" + +/* Добавление элемента в кучу */ +void pushMinHeap(MaxHeap *maxHeap, int val) { + // Инвертировать знак элемента + push(maxHeap, -val); +} + +/* Извлечение элемента из кучи */ +int popMinHeap(MaxHeap *maxHeap) { + // Инвертировать знак элемента + return -pop(maxHeap); +} + +/* Доступ к элементу на вершине кучи */ +int peekMinHeap(MaxHeap *maxHeap) { + // Инвертировать знак элемента + return -peek(maxHeap); +} + +/* Извлечь элементы из кучи */ +int *getMinHeap(MaxHeap *maxHeap) { + // Инвертировать все элементы кучи и записать их в массив res + int *res = (int *)malloc(maxHeap->size * sizeof(int)); + for (int i = 0; i < maxHeap->size; i++) { + res[i] = -maxHeap->data[i]; + } + return res; +} + +// Функция поиска k наибольших элементов массива на основе кучи +int *topKHeap(int *nums, int sizeNums, int k) { + // Инициализация минимальной кучи + // Обратите внимание: мы инвертируем все элементы кучи, чтобы с помощью максимальной кучи имитировать минимальную + int *empty = (int *)malloc(0); + MaxHeap *maxHeap = newMaxHeap(empty, 0); + // Поместить первые k элементов массива в кучу + for (int i = 0; i < k; i++) { + pushMinHeap(maxHeap, nums[i]); + } + // Начиная с элемента k+1, поддерживать длину кучи равной k + for (int i = k; i < sizeNums; i++) { + // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу + if (nums[i] > peekMinHeap(maxHeap)) { + popMinHeap(maxHeap); + pushMinHeap(maxHeap, nums[i]); + } + } + int *res = getMinHeap(maxHeap); + // Освободить память + delMaxHeap(maxHeap); + return res; +} + +/* Driver Code */ +int main() { + int nums[] = {1, 7, 6, 3, 2}; + int k = 3; + int sizeNums = sizeof(nums) / sizeof(nums[0]); + + int *res = topKHeap(nums, sizeNums, k); + printf("Наибольшие %d элементов: ", k); + printArray(res, k); + + free(res); + return 0; +} diff --git a/ru/codes/c/chapter_searching/CMakeLists.txt b/ru/codes/c/chapter_searching/CMakeLists.txt new file mode 100644 index 000000000..7b2a152d5 --- /dev/null +++ b/ru/codes/c/chapter_searching/CMakeLists.txt @@ -0,0 +1,4 @@ +add_executable(binary_search binary_search.c) +add_executable(two_sum two_sum.c) +add_executable(binary_search_edge binary_search_edge.c) +add_executable(binary_search_insertion binary_search_insertion.c) diff --git a/ru/codes/c/chapter_searching/binary_search.c b/ru/codes/c/chapter_searching/binary_search.c new file mode 100644 index 000000000..250cb4e8c --- /dev/null +++ b/ru/codes/c/chapter_searching/binary_search.c @@ -0,0 +1,59 @@ +/** + * File: binary_search.c + * Created Time: 2023-03-18 + * Author: Guanngxu (446678850@qq.com) + */ + +#include "../utils/common.h" + +/* Бинарный поиск (двусторонне замкнутый интервал) */ +int binarySearch(int *nums, int len, int target) { + // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно + int i = 0, j = len - 1; + // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст) + while (i <= j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) // Это означает, что target находится в интервале [m+1, j] + i = m + 1; + else if (nums[m] > target) // Это означает, что target находится в интервале [i, m-1] + j = m - 1; + else // Целевой элемент найден, вернуть его индекс + return m; + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +/* Бинарный поиск (лево замкнутый, право открытый интервал) */ +int binarySearchLCRO(int *nums, int len, int target) { + // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно + int i = 0, j = len; + // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст) + while (i < j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) // Это означает, что target находится в интервале [m+1, j) + i = m + 1; + else if (nums[m] > target) // Это означает, что target находится в интервале [i, m) + j = m; + else // Целевой элемент найден, вернуть его индекс + return m; + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +/* Driver Code */ +int main() { + int target = 6; + int nums[10] = {1, 3, 6, 8, 12, 15, 23, 26, 31, 35}; + + /* Бинарный поиск (двусторонне замкнутый интервал) */ + int index = binarySearch(nums, 10, target); + printf("Индекс целевого элемента 6 = %d\n", index); + + /* Бинарный поиск (лево замкнутый, право открытый интервал) */ + index = binarySearchLCRO(nums, 10, target); + printf("Индекс целевого элемента 6 = %d\n", index); + + return 0; +} diff --git a/ru/codes/c/chapter_searching/binary_search_edge.c b/ru/codes/c/chapter_searching/binary_search_edge.c new file mode 100644 index 000000000..71dbef1bb --- /dev/null +++ b/ru/codes/c/chapter_searching/binary_search_edge.c @@ -0,0 +1,67 @@ +/** + * File: binary_search_edge.c + * Created Time: 2023-09-09 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +/* Бинарный поиск точки вставки (с повторяющимися элементами) */ +int binarySearchInsertion(int *nums, int numSize, int target) { + int i = 0, j = numSize - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) { + i = m + 1; // target находится в интервале [m+1, j] + } else { + j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1] + } + } + // Вернуть точку вставки i + return i; +} + +/* Бинарный поиск самого левого target */ +int binarySearchLeftEdge(int *nums, int numSize, int target) { + // Эквивалентно поиску точки вставки target + int i = binarySearchInsertion(nums, numSize, target); + // target не найден, вернуть -1 + if (i == numSize || nums[i] != target) { + return -1; + } + // Найти target и вернуть индекс i + return i; +} + +/* Бинарный поиск самого правого target */ +int binarySearchRightEdge(int *nums, int numSize, int target) { + // Преобразовать задачу в поиск самого левого target + 1 + int i = binarySearchInsertion(nums, numSize, target + 1); + // j указывает на самый правый target, а i — на первый элемент больше target + int j = i - 1; + // target не найден, вернуть -1 + if (j == -1 || nums[j] != target) { + return -1; + } + // Найти target и вернуть индекс j + return j; +} + +/* Driver Code */ +int main() { + // Массив с повторяющимися элементами + int nums[] = {1, 3, 6, 6, 6, 6, 6, 10, 12, 15}; + printf("\nМассив nums = "); + printArray(nums, sizeof(nums) / sizeof(nums[0])); + + // Бинарный поиск левой и правой границы + int targets[] = {6, 7}; + for (int i = 0; i < sizeof(targets) / sizeof(targets[0]); i++) { + int index = binarySearchLeftEdge(nums, sizeof(nums) / sizeof(nums[0]), targets[i]); + printf("Индекс самого левого элемента %d = %d\n", targets[i], index); + index = binarySearchRightEdge(nums, sizeof(nums) / sizeof(nums[0]), targets[i]); + printf("Индекс самого правого элемента %d = %d\n", targets[i], index); + } + + return 0; +} \ No newline at end of file diff --git a/ru/codes/c/chapter_searching/binary_search_insertion.c b/ru/codes/c/chapter_searching/binary_search_insertion.c new file mode 100644 index 000000000..3d99ba0f7 --- /dev/null +++ b/ru/codes/c/chapter_searching/binary_search_insertion.c @@ -0,0 +1,68 @@ +/** + * File: binary_search_insertion.c + * Created Time: 2023-09-09 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +/* Бинарный поиск точки вставки (без повторяющихся элементов) */ +int binarySearchInsertionSimple(int *nums, int numSize, int target) { + int i = 0, j = numSize - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) { + i = m + 1; // target находится в интервале [m+1, j] + } else if (nums[m] > target) { + j = m - 1; // target находится в интервале [i, m-1] + } else { + return m; // Найти target и вернуть точку вставки m + } + } + // target не найден, вернуть точку вставки i + return i; +} + +/* Бинарный поиск точки вставки (с повторяющимися элементами) */ +int binarySearchInsertion(int *nums, int numSize, int target) { + int i = 0, j = numSize - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) { + i = m + 1; // target находится в интервале [m+1, j] + } else if (nums[m] > target) { + j = m - 1; // target находится в интервале [i, m-1] + } else { + j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1] + } + } + // Вернуть точку вставки i + return i; +} + +/* Driver Code */ +int main() { + // Массив без повторяющихся элементов + int nums1[] = {1, 3, 6, 8, 12, 15, 23, 26, 31, 35}; + printf("\nМассив nums = "); + printArray(nums1, sizeof(nums1) / sizeof(nums1[0])); + // Бинарный поиск точки вставки + int targets1[] = {6, 9}; + for (int i = 0; i < sizeof(targets1) / sizeof(targets1[0]); i++) { + int index = binarySearchInsertionSimple(nums1, sizeof(nums1) / sizeof(nums1[0]), targets1[i]); + printf("Индекс позиции вставки для элемента %d = %d\n", targets1[i], index); + } + + // Массив с повторяющимися элементами + int nums2[] = {1, 3, 6, 6, 6, 6, 6, 10, 12, 15}; + printf("\nМассив nums = "); + printArray(nums2, sizeof(nums2) / sizeof(nums2[0])); + // Бинарный поиск точки вставки + int targets2[] = {2, 6, 20}; + for (int i = 0; i < sizeof(targets2) / sizeof(int); i++) { + int index = binarySearchInsertion(nums2, sizeof(nums2) / sizeof(nums2[0]), targets2[i]); + printf("Индекс позиции вставки для элемента %d = %d\n", targets2[i], index); + } + + return 0; +} diff --git a/ru/codes/c/chapter_searching/two_sum.c b/ru/codes/c/chapter_searching/two_sum.c new file mode 100644 index 000000000..e9b3ce103 --- /dev/null +++ b/ru/codes/c/chapter_searching/two_sum.c @@ -0,0 +1,86 @@ +/** + * File: two_sum.c + * Created Time: 2023-01-19 + * Author: Reanon (793584285@qq.com) + */ + +#include "../utils/common.h" + +/* Метод 1: полный перебор */ +int *twoSumBruteForce(int *nums, int numsSize, int target, int *returnSize) { + for (int i = 0; i < numsSize; ++i) { + for (int j = i + 1; j < numsSize; ++j) { + if (nums[i] + nums[j] == target) { + int *res = malloc(sizeof(int) * 2); + res[0] = i, res[1] = j; + *returnSize = 2; + return res; + } + } + } + *returnSize = 0; + return NULL; +} + +/* Хеш-таблица */ +typedef struct { + int key; + int val; + UT_hash_handle hh; // Реализовано на основе uthash.h +} HashTable; + +/* Поиск в хеш-таблице */ +HashTable *find(HashTable *h, int key) { + HashTable *tmp; + HASH_FIND_INT(h, &key, tmp); + return tmp; +} + +/* Вставка элемента в хеш-таблицу */ +void insert(HashTable **h, int key, int val) { + HashTable *t = find(*h, key); + if (t == NULL) { + HashTable *tmp = malloc(sizeof(HashTable)); + tmp->key = key, tmp->val = val; + HASH_ADD_INT(*h, key, tmp); + } else { + t->val = val; + } +} + +/* Метод 2: вспомогательная хеш-таблица */ +int *twoSumHashTable(int *nums, int numsSize, int target, int *returnSize) { + HashTable *hashtable = NULL; + for (int i = 0; i < numsSize; i++) { + HashTable *t = find(hashtable, target - nums[i]); + if (t != NULL) { + int *res = malloc(sizeof(int) * 2); + res[0] = t->val, res[1] = i; + *returnSize = 2; + return res; + } + insert(&hashtable, nums[i], i); + } + *returnSize = 0; + return NULL; +} + +/* Driver Code */ +int main() { + // ======= Test Case ======= + int nums[] = {2, 7, 11, 15}; + int target = 13; + // ====== Driver Code ====== + int returnSize; + int *res = twoSumBruteForce(nums, sizeof(nums) / sizeof(int), target, &returnSize); + // Метод 1 + printf("Способ 1: res = "); + printArray(res, returnSize); + + // Метод 2 + res = twoSumHashTable(nums, sizeof(nums) / sizeof(int), target, &returnSize); + printf("Способ 2: res = "); + printArray(res, returnSize); + + return 0; +} \ No newline at end of file diff --git a/ru/codes/c/chapter_sorting/CMakeLists.txt b/ru/codes/c/chapter_sorting/CMakeLists.txt new file mode 100644 index 000000000..88756b4c9 --- /dev/null +++ b/ru/codes/c/chapter_sorting/CMakeLists.txt @@ -0,0 +1,9 @@ +add_executable(bubble_sort bubble_sort.c) +add_executable(insertion_sort insertion_sort.c) +add_executable(quick_sort quick_sort.c) +add_executable(counting_sort counting_sort.c) +add_executable(radix_sort radix_sort.c) +add_executable(merge_sort merge_sort.c) +add_executable(heap_sort heap_sort.c) +add_executable(bucket_sort bucket_sort.c) +add_executable(selection_sort selection_sort.c) diff --git a/ru/codes/c/chapter_sorting/bubble_sort.c b/ru/codes/c/chapter_sorting/bubble_sort.c new file mode 100644 index 000000000..f5c48dd80 --- /dev/null +++ b/ru/codes/c/chapter_sorting/bubble_sort.c @@ -0,0 +1,61 @@ +/** + * File: bubble_sort.c + * Created Time: 2022-12-26 + * Author: Listening (https://github.com/L-Super) + */ + +#include "../utils/common.h" + +/* Пузырьковая сортировка */ +void bubbleSort(int nums[], int size) { + // Внешний цикл: неотсортированный диапазон [0, i] + for (int i = size - 1; i > 0; i--) { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (int j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + int temp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = temp; + } + } + } +} + +/* Пузырьковая сортировка (оптимизация флагом) */ +void bubbleSortWithFlag(int nums[], int size) { + // Внешний цикл: неотсортированный диапазон [0, i] + for (int i = size - 1; i > 0; i--) { + bool flag = false; + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (int j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + int temp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = temp; + flag = true; + } + } + if (!flag) + break; + } +} + +/* Driver Code */ +int main() { + int nums[6] = {4, 1, 3, 1, 5, 2}; + printf("После пузырьковой сортировки: "); + bubbleSort(nums, 6); + for (int i = 0; i < 6; i++) { + printf("%d ", nums[i]); + } + + int nums1[6] = {4, 1, 3, 1, 5, 2}; + printf("\nПосле оптимизированной пузырьковой сортировки: "); + bubbleSortWithFlag(nums1, 6); + for (int i = 0; i < 6; i++) { + printf("%d ", nums1[i]); + } + printf("\n"); + + return 0; +} diff --git a/ru/codes/c/chapter_sorting/bucket_sort.c b/ru/codes/c/chapter_sorting/bucket_sort.c new file mode 100644 index 000000000..2f54d502a --- /dev/null +++ b/ru/codes/c/chapter_sorting/bucket_sort.c @@ -0,0 +1,57 @@ +/** + * File: bucket_sort.c + * Created Time: 2023-05-30 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +#define SIZE 10 + +/* Функция сравнения для qsort */ +int compare(const void *a, const void *b) { + float fa = *(const float *)a; + float fb = *(const float *)b; + return (fa > fb) - (fa < fb); +} + +/* Сортировка корзинами */ +void bucketSort(float nums[], int n) { + int k = n / 2; // Инициализировать k = n/2 корзин + int *sizes = malloc(k * sizeof(int)); // Записать размер каждой корзины + float **buckets = malloc(k * sizeof(float *)); // Массив динамических массивов (корзины) + // Предварительно выделить достаточно места для каждой корзины + for (int i = 0; i < k; ++i) { + buckets[i] = (float *)malloc(n * sizeof(float)); + sizes[i] = 0; + } + // 1. Распределить элементы массива по корзинам + for (int i = 0; i < n; ++i) { + int idx = (int)(nums[i] * k); + buckets[idx][sizes[idx]++] = nums[i]; + } + // 2. Выполнить сортировку внутри каждой корзины + for (int i = 0; i < k; ++i) { + qsort(buckets[i], sizes[i], sizeof(float), compare); + } + // 3. Объединить отсортированные корзины + int idx = 0; + for (int i = 0; i < k; ++i) { + for (int j = 0; j < sizes[i]; ++j) { + nums[idx++] = buckets[i][j]; + } + // Освободить память + free(buckets[i]); + } +} + +/* Driver Code */ +int main() { + // Пусть входные данные — числа с плавающей точкой из диапазона [0, 1) + float nums[SIZE] = {0.49f, 0.96f, 0.82f, 0.09f, 0.57f, 0.43f, 0.91f, 0.75f, 0.15f, 0.37f}; + bucketSort(nums, SIZE); + printf("После сортировки корзинами nums = "); + printArrayFloat(nums, SIZE); + + return 0; +} diff --git a/ru/codes/c/chapter_sorting/counting_sort.c b/ru/codes/c/chapter_sorting/counting_sort.c new file mode 100644 index 000000000..5aba17388 --- /dev/null +++ b/ru/codes/c/chapter_sorting/counting_sort.c @@ -0,0 +1,87 @@ +/** + * File: counting_sort.c + * Created Time: 2023-03-20 + * Author: Reanon (793584285@qq.com), Guanngxu (446678850@qq.com) + */ + +#include "../utils/common.h" + +/* Сортировка подсчетом */ +// Простая реализация, не подходит для сортировки объектов +void countingSortNaive(int nums[], int size) { + // 1. Найти максимальный элемент массива m + int m = 0; + for (int i = 0; i < size; i++) { + if (nums[i] > m) { + m = nums[i]; + } + } + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + int *counter = calloc(m + 1, sizeof(int)); + for (int i = 0; i < size; i++) { + counter[nums[i]]++; + } + // 3. Обойти counter и заполнить исходный массив nums элементами + int i = 0; + for (int num = 0; num < m + 1; num++) { + for (int j = 0; j < counter[num]; j++, i++) { + nums[i] = num; + } + } + // 4. Освободить память + free(counter); +} + +/* Сортировка подсчетом */ +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой +void countingSort(int nums[], int size) { + // 1. Найти максимальный элемент массива m + int m = 0; + for (int i = 0; i < size; i++) { + if (nums[i] > m) { + m = nums[i]; + } + } + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + int *counter = calloc(m, sizeof(int)); + for (int i = 0; i < size; i++) { + counter[nums[i]]++; + } + // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс» + // То есть counter[num]-1 — это индекс последнего появления num в res + for (int i = 0; i < m; i++) { + counter[i + 1] += counter[i]; + } + // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res + // Инициализировать массив res для хранения результата + int *res = malloc(sizeof(int) * size); + for (int i = size - 1; i >= 0; i--) { + int num = nums[i]; + res[counter[num] - 1] = num; // Поместить num по соответствующему индексу + counter[num]--; // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num + } + // Перезаписать исходный массив nums массивом результата res + memcpy(nums, res, size * sizeof(int)); + // 5. Освободить память + free(res); + free(counter); +} + +/* Driver Code */ +int main() { + int nums[] = {1, 0, 1, 2, 0, 4, 0, 2, 2, 4}; + int size = sizeof(nums) / sizeof(int); + countingSortNaive(nums, size); + printf("После сортировки подсчетом (объекты не поддерживаются) nums = "); + printArray(nums, size); + + int nums1[] = {1, 0, 1, 2, 0, 4, 0, 2, 2, 4}; + int size1 = sizeof(nums1) / sizeof(int); + countingSort(nums1, size1); + printf("После сортировки подсчетом nums1 = "); + printArray(nums1, size1); + + return 0; +} diff --git a/ru/codes/c/chapter_sorting/heap_sort.c b/ru/codes/c/chapter_sorting/heap_sort.c new file mode 100644 index 000000000..c5fe1d5a1 --- /dev/null +++ b/ru/codes/c/chapter_sorting/heap_sort.c @@ -0,0 +1,60 @@ +/** + * File: heap_sort.c + * Created Time: 2023-05-30 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +/* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */ +void siftDown(int nums[], int n, int i) { + while (1) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + int l = 2 * i + 1; + int r = 2 * i + 2; + int ma = i; + if (l < n && nums[l] > nums[ma]) + ma = l; + if (r < n && nums[r] > nums[ma]) + ma = r; + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (ma == i) { + break; + } + // Поменять два узла местами + int temp = nums[i]; + nums[i] = nums[ma]; + nums[ma] = temp; + // Циклическое просеивание вниз + i = ma; + } +} + +/* Сортировка кучей */ +void heapSort(int nums[], int n) { + // Построение кучи: выполнить heapify для всех узлов, кроме листовых + for (int i = n / 2 - 1; i >= 0; --i) { + siftDown(nums, n, i); + } + // Извлекать максимальный элемент из кучи в течение n-1 итераций + for (int i = n - 1; i > 0; --i) { + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + int tmp = nums[0]; + nums[0] = nums[i]; + nums[i] = tmp; + // Начиная с корневого узла, выполнить просеивание сверху вниз + siftDown(nums, i, 0); + } +} + +/* Driver Code */ +int main() { + int nums[] = {4, 1, 3, 1, 5, 2}; + int n = sizeof(nums) / sizeof(nums[0]); + + heapSort(nums, n); + printf("После сортировки кучей nums = "); + printArray(nums, n); + + return 0; +} \ No newline at end of file diff --git a/ru/codes/c/chapter_sorting/insertion_sort.c b/ru/codes/c/chapter_sorting/insertion_sort.c new file mode 100644 index 000000000..a30f3b1bf --- /dev/null +++ b/ru/codes/c/chapter_sorting/insertion_sort.c @@ -0,0 +1,36 @@ +/** + * File: insertion_sort.c + * Created Time: 2022-12-29 + * Author: Listening (https://github.com/L-Super) + */ + +#include "../utils/common.h" + +/* Сортировка вставками */ +void insertionSort(int nums[], int size) { + // Внешний цикл: отсортированный диапазон [0, i-1] + for (int i = 1; i < size; i++) { + int base = nums[i], j = i - 1; + // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1] + while (j >= 0 && nums[j] > base) { + // Сдвинуть nums[j] на одну позицию вправо + nums[j + 1] = nums[j]; + j--; + } + // Поместить base в правильную позицию + nums[j + 1] = base; + } +} + +/* Driver Code */ +int main() { + int nums[] = {4, 1, 3, 1, 5, 2}; + insertionSort(nums, 6); + printf("После сортировки вставками nums = "); + for (int i = 0; i < 6; i++) { + printf("%d ", nums[i]); + } + printf("\n"); + + return 0; +} diff --git a/ru/codes/c/chapter_sorting/merge_sort.c b/ru/codes/c/chapter_sorting/merge_sort.c new file mode 100644 index 000000000..274f2a256 --- /dev/null +++ b/ru/codes/c/chapter_sorting/merge_sort.c @@ -0,0 +1,63 @@ +/** + * File: merge_sort.c + * Created Time: 2022-03-21 + * Author: Guanngxu (446678850@qq.com) + */ + +#include "../utils/common.h" + +/* Объединить левый и правый подмассивы */ +void merge(int *nums, int left, int mid, int right) { + // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right] + // Создать временный массив tmp для хранения результата слияния + int tmpSize = right - left + 1; + int *tmp = (int *)malloc(tmpSize * sizeof(int)); + // Инициализировать начальные индексы левого и правого подмассивов + int i = left, j = mid + 1, k = 0; + // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив + while (i <= mid && j <= right) { + if (nums[i] <= nums[j]) { + tmp[k++] = nums[i++]; + } else { + tmp[k++] = nums[j++]; + } + } + // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив + while (i <= mid) { + tmp[k++] = nums[i++]; + } + while (j <= right) { + tmp[k++] = nums[j++]; + } + // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums + for (k = 0; k < tmpSize; ++k) { + nums[left + k] = tmp[k]; + } + // Освободить память + free(tmp); +} + +/* Сортировка слиянием */ +void mergeSort(int *nums, int left, int right) { + // Условие завершения + if (left >= right) + return; // Завершить рекурсию, когда длина подмассива равна 1 + // Этап разбиения + int mid = left + (right - left) / 2; // Вычислить середину + mergeSort(nums, left, mid); // Рекурсивно обработать левый подмассив + mergeSort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив + // Этап слияния + merge(nums, left, mid, right); +} + +/* Driver Code */ +int main() { + /* Сортировка слиянием */ + int nums[] = {7, 3, 2, 6, 0, 1, 5, 4}; + int size = sizeof(nums) / sizeof(int); + mergeSort(nums, 0, size - 1); + printf("После сортировки слиянием nums = "); + printArray(nums, size); + + return 0; +} diff --git a/ru/codes/c/chapter_sorting/quick_sort.c b/ru/codes/c/chapter_sorting/quick_sort.c new file mode 100644 index 000000000..289f7c86b --- /dev/null +++ b/ru/codes/c/chapter_sorting/quick_sort.c @@ -0,0 +1,137 @@ +/** + * File: quick_sort.c + * Created Time: 2023-01-18 + * Author: Reanon (793584285@qq.com) + */ + +#include "../utils/common.h" + +/* Обмен элементов */ +void swap(int nums[], int i, int j) { + int tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; +} + +/* Разбиение с опорными указателями */ +int partition(int nums[], int left, int right) { + // Взять nums[left] в качестве опорного элемента + int i = left, j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) { + j--; // Идти справа налево в поисках первого элемента меньше опорного + } + while (i < j && nums[i] <= nums[left]) { + i++; // Идти слева направо в поисках первого элемента больше опорного + } + // Поменять эти два элемента местами + swap(nums, i, j); + } + // Переместить опорный элемент на границу двух подмассивов + swap(nums, i, left); + // Вернуть индекс опорного элемента + return i; +} + +/* Быстрая сортировка */ +void quickSort(int nums[], int left, int right) { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) { + return; + } + // Разбиение с опорными указателями + int pivot = partition(nums, left, right); + // Рекурсивно обработать левый и правый подмассивы + quickSort(nums, left, pivot - 1); + quickSort(nums, pivot + 1, right); +} + +// Ниже приведена быстрая сортировка с оптимизацией медианой + +/* Выбрать медиану из трех кандидатов */ +int medianThree(int nums[], int left, int mid, int right) { + int l = nums[left], m = nums[mid], r = nums[right]; + if ((l <= m && m <= r) || (r <= m && m <= l)) + return mid; // m находится между l и r + if ((m <= l && l <= r) || (r <= l && l <= m)) + return left; // l находится между m и r + return right; +} + +/* Разбиение с опорными указателями (медиана трех) */ +int partitionMedian(int nums[], int left, int right) { + // Выбрать медиану из трех кандидатов + int med = medianThree(nums, left, (left + right) / 2, right); + // Переместить медиану в крайний левый элемент массива + swap(nums, left, med); + // Взять nums[left] в качестве опорного элемента + int i = left, j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) + j--; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) + i++; // Идти слева направо в поисках первого элемента больше опорного + swap(nums, i, j); // Поменять эти два элемента местами + } + swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента +} + +/* Быстрая сортировка (медиана трех) */ +void quickSortMedian(int nums[], int left, int right) { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) + return; + // Разбиение с опорными указателями + int pivot = partitionMedian(nums, left, right); + // Рекурсивно обработать левый и правый подмассивы + quickSortMedian(nums, left, pivot - 1); + quickSortMedian(nums, pivot + 1, right); +} + +// Ниже приведена быстрая сортировка с оптимизацией глубины рекурсии + +/* Быстрая сортировка (оптимизация глубины рекурсии) */ +void quickSortTailCall(int nums[], int left, int right) { + // Завершить, когда длина подмассива равна 1 + while (left < right) { + // Операция разбиения с опорными указателями + int pivot = partition(nums, left, right); + // Выполнить быструю сортировку для более короткого из двух подмассивов + if (pivot - left < right - pivot) { + // Рекурсивно отсортировать левый подмассив + quickSortTailCall(nums, left, pivot - 1); + // Оставшийся неотсортированный диапазон: [pivot + 1, right] + left = pivot + 1; + } else { + // Рекурсивно отсортировать правый подмассив + quickSortTailCall(nums, pivot + 1, right); + // Оставшийся неотсортированный диапазон: [left, pivot - 1] + right = pivot - 1; + } + } +} + +/* Driver Code */ +int main() { + /* Быстрая сортировка */ + int nums[] = {2, 4, 1, 0, 3, 5}; + int size = sizeof(nums) / sizeof(int); + quickSort(nums, 0, size - 1); + printf("После быстрой сортировки nums = "); + printArray(nums, size); + + /* Быстрая сортировка (оптимизация медианным опорным элементом) */ + int nums1[] = {2, 4, 1, 0, 3, 5}; + quickSortMedian(nums1, 0, size - 1); + printf("После быстрой сортировки (оптимизация медианным опорным элементом) nums = "); + printArray(nums1, size); + + /* Быстрая сортировка (оптимизация глубины рекурсии) */ + int nums2[] = {2, 4, 1, 0, 3, 5}; + quickSortTailCall(nums2, 0, size - 1); + printf("После быстрой сортировки (оптимизация глубины рекурсии) nums = "); + printArray(nums1, size); + + return 0; +} diff --git a/ru/codes/c/chapter_sorting/radix_sort.c b/ru/codes/c/chapter_sorting/radix_sort.c new file mode 100644 index 000000000..994084243 --- /dev/null +++ b/ru/codes/c/chapter_sorting/radix_sort.c @@ -0,0 +1,75 @@ +/** + * File: radix_sort.c + * Created Time: 2023-01-18 + * Author: Reanon (793584285@qq.com) + */ + +#include "../utils/common.h" + +/* Получить k-й разряд элемента num, где exp = 10^(k-1) */ +int digit(int num, int exp) { + // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени + return (num / exp) % 10; +} + +/* Сортировка подсчетом (сортировка по k-му разряду nums) */ +void countingSortDigit(int nums[], int size, int exp) { + // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10 + int *counter = (int *)malloc((sizeof(int) * 10)); + memset(counter, 0, sizeof(int) * 10); // Инициализировать нулем для последующего освобождения памяти + // Подсчитать число появлений каждой цифры от 0 до 9 + for (int i = 0; i < size; i++) { + // Получить k-й разряд nums[i], обозначив его как d + int d = digit(nums[i], exp); + // Подсчитать число появлений цифры d + counter[d]++; + } + // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива» + for (int i = 1; i < 10; i++) { + counter[i] += counter[i - 1]; + } + // Выполняя обратный проход, заполнить res элементами по статистике в корзинах + int *res = (int *)malloc(sizeof(int) * size); + for (int i = size - 1; i >= 0; i--) { + int d = digit(nums[i], exp); + int j = counter[d] - 1; // Получить индекс j цифры d в массиве + res[j] = nums[i]; // Поместить текущий элемент по индексу j + counter[d]--; // Уменьшить количество d на 1 + } + // Перезаписать исходный массив nums результатом + for (int i = 0; i < size; i++) { + nums[i] = res[i]; + } + // Освободить память + free(res); + free(counter); +} + +/* Поразрядная сортировка */ +void radixSort(int nums[], int size) { + // Получить максимальный элемент массива, чтобы определить максимальное число разрядов + int max = INT32_MIN; + for (int i = 0; i < size; i++) { + if (nums[i] > max) { + max = nums[i]; + } + } + // Проходить разряды от младшего к старшему + for (int exp = 1; max >= exp; exp *= 10) + // Выполнить сортировку подсчетом по k-му разряду элементов массива + // k = 1 -> exp = 1 + // k = 2 -> exp = 10 + // то есть exp = 10^(k-1) + countingSortDigit(nums, size, exp); +} + +/* Driver Code */ +int main() { + // Поразрядная сортировка + int nums[] = {10546151, 35663510, 42865989, 34862445, 81883077, + 88906420, 72429244, 30524779, 82060337, 63832996}; + int size = sizeof(nums) / sizeof(int); + radixSort(nums, size); + printf("После поразрядной сортировки nums = "); + printArray(nums, size); +} diff --git a/ru/codes/c/chapter_sorting/selection_sort.c b/ru/codes/c/chapter_sorting/selection_sort.c new file mode 100644 index 000000000..9fb799cb0 --- /dev/null +++ b/ru/codes/c/chapter_sorting/selection_sort.c @@ -0,0 +1,37 @@ +/** + * File: selection_sort.c + * Created Time: 2023-05-31 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +/* Сортировка выбором */ +void selectionSort(int nums[], int n) { + // Внешний цикл: неотсортированный диапазон [i, n-1] + for (int i = 0; i < n - 1; i++) { + // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне + int k = i; + for (int j = i + 1; j < n; j++) { + if (nums[j] < nums[k]) + k = j; // Записать индекс минимального элемента + } + // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона + int temp = nums[i]; + nums[i] = nums[k]; + nums[k] = temp; + } +} + +/* Driver Code */ +int main() { + int nums[] = {4, 1, 3, 1, 5, 2}; + int n = sizeof(nums) / sizeof(nums[0]); + + selectionSort(nums, n); + + printf("После сортировки выбором nums = "); + printArray(nums, n); + + return 0; +} diff --git a/ru/codes/c/chapter_stack_and_queue/CMakeLists.txt b/ru/codes/c/chapter_stack_and_queue/CMakeLists.txt new file mode 100644 index 000000000..ed3ba840c --- /dev/null +++ b/ru/codes/c/chapter_stack_and_queue/CMakeLists.txt @@ -0,0 +1,6 @@ +add_executable(array_stack array_stack.c) +add_executable(linkedlist_stack linkedlist_stack.c) +add_executable(array_queue array_queue.c) +add_executable(linkedlist_queue linkedlist_queue.c) +add_executable(array_deque array_deque.c) +add_executable(linkedlist_deque linkedlist_deque.c) diff --git a/ru/codes/c/chapter_stack_and_queue/array_deque.c b/ru/codes/c/chapter_stack_and_queue/array_deque.c new file mode 100644 index 000000000..1e72fc628 --- /dev/null +++ b/ru/codes/c/chapter_stack_and_queue/array_deque.c @@ -0,0 +1,172 @@ +/** + * File: array_deque.c + * Created Time: 2023-03-13 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +/* Двусторонняя очередь на основе кольцевого массива */ +typedef struct { + int *nums; // Массив для хранения элементов очереди + int front; // Указатель head, указывающий на первый элемент очереди + int queSize; // Указатель хвоста, указывающий на позицию после хвоста + int queCapacity; // Вместимость очереди +} ArrayDeque; + +/* Конструктор */ +ArrayDeque *newArrayDeque(int capacity) { + ArrayDeque *deque = (ArrayDeque *)malloc(sizeof(ArrayDeque)); + // Инициализация массива + deque->queCapacity = capacity; + deque->nums = (int *)malloc(sizeof(int) * deque->queCapacity); + deque->front = deque->queSize = 0; + return deque; +} + +/* Деструктор */ +void delArrayDeque(ArrayDeque *deque) { + free(deque->nums); + free(deque); +} + +/* Получить вместимость двусторонней очереди */ +int capacity(ArrayDeque *deque) { + return deque->queCapacity; +} + +/* Получение длины двусторонней очереди */ +int size(ArrayDeque *deque) { + return deque->queSize; +} + +/* Проверка, пуста ли двусторонняя очередь */ +bool empty(ArrayDeque *deque) { + return deque->queSize == 0; +} + +/* Вычислить индекс в кольцевом массиве */ +int dequeIndex(ArrayDeque *deque, int i) { + // С помощью операции взятия остатка соединить начало и конец массива + // Когда i выходит за хвост массива, вернуться к началу + // Когда i выходит за голову массива, вернуться к концу + return ((i + capacity(deque)) % capacity(deque)); +} + +/* Добавление в голову очереди */ +void pushFirst(ArrayDeque *deque, int num) { + if (deque->queSize == capacity(deque)) { + printf("Дек заполнен\r\n"); + return; + } + // Указатель головы сместить влево на одну позицию + // С помощью операции взятия остатка реализовать возврат front к хвосту после выхода за начало массива + deque->front = dequeIndex(deque, deque->front - 1); + // Добавить num в голову очереди + deque->nums[deque->front] = num; + deque->queSize++; +} + +/* Добавление в хвост очереди */ +void pushLast(ArrayDeque *deque, int num) { + if (deque->queSize == capacity(deque)) { + printf("Дек заполнен\r\n"); + return; + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + int rear = dequeIndex(deque, deque->front + deque->queSize); + // Добавить num в хвост очереди + deque->nums[rear] = num; + deque->queSize++; +} + +/* Доступ к элементу в начале очереди */ +int peekFirst(ArrayDeque *deque) { + // Ошибка доступа: двусторонняя очередь пуста + assert(empty(deque) == 0); + return deque->nums[deque->front]; +} + +/* Доступ к элементу в конце очереди */ +int peekLast(ArrayDeque *deque) { + // Ошибка доступа: двусторонняя очередь пуста + assert(empty(deque) == 0); + int last = dequeIndex(deque, deque->front + deque->queSize - 1); + return deque->nums[last]; +} + +/* Извлечение из головы очереди */ +int popFirst(ArrayDeque *deque) { + int num = peekFirst(deque); + // Указатель головы сдвигается на одну позицию назад + deque->front = dequeIndex(deque, deque->front + 1); + deque->queSize--; + return num; +} + +/* Извлечение из хвоста очереди */ +int popLast(ArrayDeque *deque) { + int num = peekLast(deque); + deque->queSize--; + return num; +} + +/* Вернуть массив для вывода */ +int *toArray(ArrayDeque *deque, int *queSize) { + *queSize = deque->queSize; + int *res = (int *)calloc(deque->queSize, sizeof(int)); + int j = deque->front; + for (int i = 0; i < deque->queSize; i++) { + res[i] = deque->nums[j % deque->queCapacity]; + j++; + } + return res; +} + +/* Driver Code */ +int main() { + /* Инициализация очереди */ + int capacity = 10; + int queSize; + ArrayDeque *deque = newArrayDeque(capacity); + pushLast(deque, 3); + pushLast(deque, 2); + pushLast(deque, 5); + printf("Дек deque = "); + printArray(toArray(deque, &queSize), queSize); + + /* Доступ к элементу */ + int peekFirstNum = peekFirst(deque); + printf("Элемент в голове peekFirst = %d\r\n", peekFirstNum); + int peekLastNum = peekLast(deque); + printf("Элемент в хвосте peekLast = %d\r\n", peekLastNum); + + /* Добавление элемента в очередь */ + pushLast(deque, 4); + printf("После вставки элемента 4 в хвост дек = "); + printArray(toArray(deque, &queSize), queSize); + pushFirst(deque, 1); + printf("После вставки элемента 1 в голову дек = "); + printArray(toArray(deque, &queSize), queSize); + + /* Извлечение элемента из очереди */ + int popLastNum = popLast(deque); + printf("Извлечен элемент из хвоста = %d, дек после извлечения из хвоста = ", popLastNum); + printArray(toArray(deque, &queSize), queSize); + int popFirstNum = popFirst(deque); + printf("Извлечен элемент из головы = %d, дек после извлечения из головы = ", popFirstNum); + printArray(toArray(deque, &queSize), queSize); + + /* Получение длины очереди */ + int dequeSize = size(deque); + printf("Длина дека size = %d\r\n", dequeSize); + + /* Проверка, пуста ли очередь */ + bool isEmpty = empty(deque); + printf("Пуста ли очередь = %s\r\n", isEmpty ? "true" : "false"); + + // Освободить память + delArrayDeque(deque); + + return 0; +} \ No newline at end of file diff --git a/ru/codes/c/chapter_stack_and_queue/array_queue.c b/ru/codes/c/chapter_stack_and_queue/array_queue.c new file mode 100644 index 000000000..00e05c0b3 --- /dev/null +++ b/ru/codes/c/chapter_stack_and_queue/array_queue.c @@ -0,0 +1,134 @@ +/** + * File: array_queue.c + * Created Time: 2023-01-28 + * Author: Zero (glj0@outlook.com) + */ + +#include "../utils/common.h" + +/* Очередь на основе кольцевого массива */ +typedef struct { + int *nums; // Массив для хранения элементов очереди + int front; // Указатель head, указывающий на первый элемент очереди + int queSize; // Указатель хвоста, указывающий на позицию после хвоста + int queCapacity; // Вместимость очереди +} ArrayQueue; + +/* Конструктор */ +ArrayQueue *newArrayQueue(int capacity) { + ArrayQueue *queue = (ArrayQueue *)malloc(sizeof(ArrayQueue)); + // Инициализация массива + queue->queCapacity = capacity; + queue->nums = (int *)malloc(sizeof(int) * queue->queCapacity); + queue->front = queue->queSize = 0; + return queue; +} + +/* Деструктор */ +void delArrayQueue(ArrayQueue *queue) { + free(queue->nums); + free(queue); +} + +/* Получить вместимость очереди */ +int capacity(ArrayQueue *queue) { + return queue->queCapacity; +} + +/* Получение длины очереди */ +int size(ArrayQueue *queue) { + return queue->queSize; +} + +/* Проверка, пуста ли очередь */ +bool empty(ArrayQueue *queue) { + return queue->queSize == 0; +} + +/* Доступ к элементу в начале очереди */ +int peek(ArrayQueue *queue) { + assert(size(queue) != 0); + return queue->nums[queue->front]; +} + +/* Поместить в очередь */ +void push(ArrayQueue *queue, int num) { + if (size(queue) == capacity(queue)) { + printf("Очередь заполнена\r\n"); + return; + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива + int rear = (queue->front + queue->queSize) % queue->queCapacity; + // Добавить num в хвост очереди + queue->nums[rear] = num; + queue->queSize++; +} + +/* Извлечь из очереди */ +int pop(ArrayQueue *queue) { + int num = peek(queue); + // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива + queue->front = (queue->front + 1) % queue->queCapacity; + queue->queSize--; + return num; +} + +/* Вернуть массив для вывода */ +int *toArray(ArrayQueue *queue, int *queSize) { + *queSize = queue->queSize; + int *res = (int *)calloc(queue->queSize, sizeof(int)); + int j = queue->front; + for (int i = 0; i < queue->queSize; i++) { + res[i] = queue->nums[j % queue->queCapacity]; + j++; + } + return res; +} + +/* Driver Code */ +int main() { + /* Инициализация очереди */ + int capacity = 10; + int queSize; + ArrayQueue *queue = newArrayQueue(capacity); + + /* Добавление элемента в очередь */ + push(queue, 1); + push(queue, 3); + push(queue, 2); + push(queue, 5); + push(queue, 4); + printf("Очередь queue = "); + printArray(toArray(queue, &queSize), queSize); + + /* Доступ к элементу в начале очереди */ + int peekNum = peek(queue); + printf("Элемент в голове peek = %d\r\n", peekNum); + + /* Извлечение элемента из очереди */ + peekNum = pop(queue); + printf("Извлечен элемент из очереди pop = %d, очередь после извлечения = ", peekNum); + printArray(toArray(queue, &queSize), queSize); + + /* Получение длины очереди */ + int queueSize = size(queue); + printf("Длина очереди size = %d\r\n", queueSize); + + /* Проверка, пуста ли очередь */ + bool isEmpty = empty(queue); + printf("Пуста ли очередь = %s\r\n", isEmpty ? "true" : "false"); + + /* Проверка кольцевого массива */ + for (int i = 0; i < 10; i++) { + push(queue, i); + pop(queue); + printf("После %d-го цикла enqueue + dequeue queue = ", i); + printArray(toArray(queue, &queSize), queSize); + } + + // Освободить память + delArrayQueue(queue); + + return 0; +} \ No newline at end of file diff --git a/ru/codes/c/chapter_stack_and_queue/array_stack.c b/ru/codes/c/chapter_stack_and_queue/array_stack.c new file mode 100644 index 000000000..e11bd22f7 --- /dev/null +++ b/ru/codes/c/chapter_stack_and_queue/array_stack.c @@ -0,0 +1,103 @@ +/** + * File: array_stack.c + * Created Time: 2023-01-12 + * Author: Zero (glj0@outlook.com) + */ + +#include "../utils/common.h" + +#define MAX_SIZE 5000 + +/* Стек на основе массива */ +typedef struct { + int *data; + int size; +} ArrayStack; + +/* Конструктор */ +ArrayStack *newArrayStack() { + ArrayStack *stack = malloc(sizeof(ArrayStack)); + // Инициализировать большую вместимость, чтобы избежать расширения + stack->data = malloc(sizeof(int) * MAX_SIZE); + stack->size = 0; + return stack; +} + +/* Деструктор */ +void delArrayStack(ArrayStack *stack) { + free(stack->data); + free(stack); +} + +/* Получение длины стека */ +int size(ArrayStack *stack) { + return stack->size; +} + +/* Проверка, пуст ли стек */ +bool isEmpty(ArrayStack *stack) { + return stack->size == 0; +} + +/* Поместить в стек */ +void push(ArrayStack *stack, int num) { + if (stack->size == MAX_SIZE) { + printf("Стек заполнен\n"); + return; + } + stack->data[stack->size] = num; + stack->size++; +} + +/* Доступ к верхнему элементу стека */ +int peek(ArrayStack *stack) { + if (stack->size == 0) { + printf("стек пуст\n"); + return INT_MAX; + } + return stack->data[stack->size - 1]; +} + +/* Извлечь из стека */ +int pop(ArrayStack *stack) { + int val = peek(stack); + stack->size--; + return val; +} + +/* Driver Code */ +int main() { + /* Инициализация стека */ + ArrayStack *stack = newArrayStack(); + + /* Помещение элемента в стек */ + push(stack, 1); + push(stack, 3); + push(stack, 2); + push(stack, 5); + push(stack, 4); + printf("Стек stack = "); + printArray(stack->data, stack->size); + + /* Доступ к верхнему элементу стека */ + int val = peek(stack); + printf("Верхний элемент стека top = %d\n", val); + + /* Извлечение элемента из стека */ + val = pop(stack); + printf("Извлечен элемент из стека pop = %d, стек после извлечения = ", val); + printArray(stack->data, stack->size); + + /* Получение длины стека */ + int size = stack->size; + printf("Длина стека size = %d\n", size); + + /* Проверка на пустоту */ + bool empty = isEmpty(stack); + printf("Пуст ли стек = %s\n", empty ? "true" : "false"); + + // Освободить память + delArrayStack(stack); + + return 0; +} diff --git a/ru/codes/c/chapter_stack_and_queue/linkedlist_deque.c b/ru/codes/c/chapter_stack_and_queue/linkedlist_deque.c new file mode 100644 index 000000000..eae7185a1 --- /dev/null +++ b/ru/codes/c/chapter_stack_and_queue/linkedlist_deque.c @@ -0,0 +1,212 @@ +/** + * File: linkedlist_deque.c + * Created Time: 2023-03-13 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +/* Узел двусвязного списка */ +typedef struct DoublyListNode { + int val; // Значение узла + struct DoublyListNode *next; // Узел-преемник + struct DoublyListNode *prev; // Узел-предшественник +} DoublyListNode; + +/* Конструктор */ +DoublyListNode *newDoublyListNode(int num) { + DoublyListNode *new = (DoublyListNode *)malloc(sizeof(DoublyListNode)); + new->val = num; + new->next = NULL; + new->prev = NULL; + return new; +} + +/* Деструктор */ +void delDoublyListNode(DoublyListNode *node) { + free(node); +} + +/* Двусторонняя очередь на основе двусвязного списка */ +typedef struct { + DoublyListNode *front, *rear; // Головной узел front, хвостовой узел rear + int queSize; // Длина двусторонней очереди +} LinkedListDeque; + +/* Конструктор */ +LinkedListDeque *newLinkedListDeque() { + LinkedListDeque *deque = (LinkedListDeque *)malloc(sizeof(LinkedListDeque)); + deque->front = NULL; + deque->rear = NULL; + deque->queSize = 0; + return deque; +} + +/* Деструктор */ +void delLinkedListdeque(LinkedListDeque *deque) { + // Освободить все узлы + for (int i = 0; i < deque->queSize && deque->front != NULL; i++) { + DoublyListNode *tmp = deque->front; + deque->front = deque->front->next; + free(tmp); + } + // Освободить структуру deque + free(deque); +} + +/* Получение длины очереди */ +int size(LinkedListDeque *deque) { + return deque->queSize; +} + +/* Проверка, пуста ли очередь */ +bool empty(LinkedListDeque *deque) { + return (size(deque) == 0); +} + +/* Поместить в очередь */ +void push(LinkedListDeque *deque, int num, bool isFront) { + DoublyListNode *node = newDoublyListNode(num); + // Если связный список пуст, пусть front и rear оба указывают на node + if (empty(deque)) { + deque->front = deque->rear = node; + } + // Операция добавления в голову очереди + else if (isFront) { + // Добавить node в голову списка + deque->front->prev = node; + node->next = deque->front; + deque->front = node; // Обновить головной узел + } + // Операция добавления в хвост очереди + else { + // Добавить node в хвост списка + deque->rear->next = node; + node->prev = deque->rear; + deque->rear = node; + } + deque->queSize++; // Обновить длину очереди +} + +/* Добавление в голову очереди */ +void pushFirst(LinkedListDeque *deque, int num) { + push(deque, num, true); +} + +/* Добавление в хвост очереди */ +void pushLast(LinkedListDeque *deque, int num) { + push(deque, num, false); +} + +/* Доступ к элементу в начале очереди */ +int peekFirst(LinkedListDeque *deque) { + assert(size(deque) && deque->front); + return deque->front->val; +} + +/* Доступ к элементу в конце очереди */ +int peekLast(LinkedListDeque *deque) { + assert(size(deque) && deque->rear); + return deque->rear->val; +} + +/* Извлечь из очереди */ +int pop(LinkedListDeque *deque, bool isFront) { + if (empty(deque)) + return -1; + int val; + // Операция извлечения из головы очереди + if (isFront) { + val = peekFirst(deque); // Временно сохранить значение головного узла + DoublyListNode *fNext = deque->front->next; + if (fNext) { + fNext->prev = NULL; + deque->front->next = NULL; + } + delDoublyListNode(deque->front); + deque->front = fNext; // Обновить головной узел + } + // Операция извлечения из хвоста очереди + else { + val = peekLast(deque); // Временно сохранить значение хвостового узла + DoublyListNode *rPrev = deque->rear->prev; + if (rPrev) { + rPrev->next = NULL; + deque->rear->prev = NULL; + } + delDoublyListNode(deque->rear); + deque->rear = rPrev; // Обновить хвостовой узел + } + deque->queSize--; // Обновить длину очереди + return val; +} + +/* Извлечение из головы очереди */ +int popFirst(LinkedListDeque *deque) { + return pop(deque, true); +} + +/* Извлечение из хвоста очереди */ +int popLast(LinkedListDeque *deque) { + return pop(deque, false); +} + +/* Вывести очередь */ +void printLinkedListDeque(LinkedListDeque *deque) { + int *arr = malloc(sizeof(int) * deque->queSize); + // Скопировать данные связного списка в массив + int i; + DoublyListNode *node; + for (i = 0, node = deque->front; i < deque->queSize; i++) { + arr[i] = node->val; + node = node->next; + } + printArray(arr, deque->queSize); + free(arr); +} + +/* Driver Code */ +int main() { + /* Инициализация двусторонней очереди */ + LinkedListDeque *deque = newLinkedListDeque(); + pushLast(deque, 3); + pushLast(deque, 2); + pushLast(deque, 5); + printf("Дек deque = "); + printLinkedListDeque(deque); + + /* Доступ к элементу */ + int peekFirstNum = peekFirst(deque); + printf("Элемент в голове peekFirst = %d\r\n", peekFirstNum); + int peekLastNum = peekLast(deque); + printf("Элемент в хвосте peekLast = %d\r\n", peekLastNum); + + /* Добавление элемента в очередь */ + pushLast(deque, 4); + printf("После вставки элемента 4 в хвост дек ="); + printLinkedListDeque(deque); + pushFirst(deque, 1); + printf("После вставки элемента 1 в голову дек ="); + printLinkedListDeque(deque); + + /* Извлечение элемента из очереди */ + int popLastNum = popLast(deque); + printf("Извлечен элемент из хвоста popLast = %d, дек после извлечения из хвоста = ", popLastNum); + printLinkedListDeque(deque); + int popFirstNum = popFirst(deque); + printf("Извлечен элемент из головы popFirst = %d, дек после извлечения из головы = ", popFirstNum); + printLinkedListDeque(deque); + + /* Получение длины очереди */ + int dequeSize = size(deque); + printf("Длина дека size = %d\r\n", dequeSize); + + /* Проверка, пуста ли очередь */ + bool isEmpty = empty(deque); + printf("Пуст ли дек = %s\r\n", isEmpty ? "true" : "false"); + + // Освободить память + delLinkedListdeque(deque); + + return 0; +} diff --git a/ru/codes/c/chapter_stack_and_queue/linkedlist_queue.c b/ru/codes/c/chapter_stack_and_queue/linkedlist_queue.c new file mode 100644 index 000000000..9ba64740f --- /dev/null +++ b/ru/codes/c/chapter_stack_and_queue/linkedlist_queue.c @@ -0,0 +1,128 @@ +/** + * File: linkedlist_queue.c + * Created Time: 2023-03-13 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +/* Очередь на основе связного списка */ +typedef struct { + ListNode *front, *rear; + int queSize; +} LinkedListQueue; + +/* Конструктор */ +LinkedListQueue *newLinkedListQueue() { + LinkedListQueue *queue = (LinkedListQueue *)malloc(sizeof(LinkedListQueue)); + queue->front = NULL; + queue->rear = NULL; + queue->queSize = 0; + return queue; +} + +/* Деструктор */ +void delLinkedListQueue(LinkedListQueue *queue) { + // Освободить все узлы + while (queue->front != NULL) { + ListNode *tmp = queue->front; + queue->front = queue->front->next; + free(tmp); + } + // Освободить структуру queue + free(queue); +} + +/* Получение длины очереди */ +int size(LinkedListQueue *queue) { + return queue->queSize; +} + +/* Проверка, пуста ли очередь */ +bool empty(LinkedListQueue *queue) { + return (size(queue) == 0); +} + +/* Поместить в очередь */ +void push(LinkedListQueue *queue, int num) { + // Добавить node в хвост + ListNode *node = newListNode(num); + // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел + if (queue->front == NULL) { + queue->front = node; + queue->rear = node; + } + // Если очередь не пуста, добавить этот узел после хвостового узла + else { + queue->rear->next = node; + queue->rear = node; + } + queue->queSize++; +} + +/* Доступ к элементу в начале очереди */ +int peek(LinkedListQueue *queue) { + assert(size(queue) && queue->front); + return queue->front->val; +} + +/* Извлечь из очереди */ +int pop(LinkedListQueue *queue) { + int num = peek(queue); + ListNode *tmp = queue->front; + queue->front = queue->front->next; + free(tmp); + queue->queSize--; + return num; +} + +/* Вывести очередь */ +void printLinkedListQueue(LinkedListQueue *queue) { + int *arr = malloc(sizeof(int) * queue->queSize); + // Скопировать данные связного списка в массив + int i; + ListNode *node; + for (i = 0, node = queue->front; i < queue->queSize; i++) { + arr[i] = node->val; + node = node->next; + } + printArray(arr, queue->queSize); + free(arr); +} + +/* Driver Code */ +int main() { + /* Инициализация очереди */ + LinkedListQueue *queue = newLinkedListQueue(); + + /* Добавление элемента в очередь */ + push(queue, 1); + push(queue, 3); + push(queue, 2); + push(queue, 5); + push(queue, 4); + printf("Очередь queue = "); + printLinkedListQueue(queue); + + /* Доступ к элементу в начале очереди */ + int peekNum = peek(queue); + printf("Элемент в голове peek = %d\r\n", peekNum); + + /* Извлечение элемента из очереди */ + peekNum = pop(queue); + printf("Извлечен элемент из очереди pop = %d, очередь после извлечения = ", peekNum); + printLinkedListQueue(queue); + + /* Получение длины очереди */ + int queueSize = size(queue); + printf("Длина очереди size = %d\r\n", queueSize); + + /* Проверка, пуста ли очередь */ + bool isEmpty = empty(queue); + printf("Пуста ли очередь = %s\r\n", isEmpty ? "true" : "false"); + + // Освободить память + delLinkedListQueue(queue); + + return 0; +} diff --git a/ru/codes/c/chapter_stack_and_queue/linkedlist_stack.c b/ru/codes/c/chapter_stack_and_queue/linkedlist_stack.c new file mode 100644 index 000000000..cba0b13c5 --- /dev/null +++ b/ru/codes/c/chapter_stack_and_queue/linkedlist_stack.c @@ -0,0 +1,107 @@ +/** + * File: linkedlist_stack.c + * Created Time: 2023-01-12 + * Author: Zero (glj0@outlook.com) + */ + +#include "../utils/common.h" + +/* Стек на основе связного списка */ +typedef struct { + ListNode *top; // Использовать головной узел как вершину стека + int size; // Длина стека +} LinkedListStack; + +/* Конструктор */ +LinkedListStack *newLinkedListStack() { + LinkedListStack *s = malloc(sizeof(LinkedListStack)); + s->top = NULL; + s->size = 0; + return s; +} + +/* Деструктор */ +void delLinkedListStack(LinkedListStack *s) { + while (s->top) { + ListNode *n = s->top->next; + free(s->top); + s->top = n; + } + free(s); +} + +/* Получение длины стека */ +int size(LinkedListStack *s) { + return s->size; +} + +/* Проверка, пуст ли стек */ +bool isEmpty(LinkedListStack *s) { + return size(s) == 0; +} + +/* Поместить в стек */ +void push(LinkedListStack *s, int num) { + ListNode *node = (ListNode *)malloc(sizeof(ListNode)); + node->next = s->top; // Обновить поле указателя нового узла + node->val = num; // Обновить поле данных нового узла + s->top = node; // Обновить вершину стека + s->size++; // Обновить размер стека +} + +/* Доступ к верхнему элементу стека */ +int peek(LinkedListStack *s) { + if (s->size == 0) { + printf("стек пуст\n"); + return INT_MAX; + } + return s->top->val; +} + +/* Извлечь из стека */ +int pop(LinkedListStack *s) { + int val = peek(s); + ListNode *tmp = s->top; + s->top = s->top->next; + // Освободить память + free(tmp); + s->size--; + return val; +} + +/* Driver Code */ +int main() { + /* Инициализация стека */ + LinkedListStack *stack = newLinkedListStack(); + + /* Помещение элемента в стек */ + push(stack, 1); + push(stack, 3); + push(stack, 2); + push(stack, 5); + push(stack, 4); + + printf("Стек stack = "); + printLinkedList(stack->top); + + /* Доступ к верхнему элементу стека */ + int val = peek(stack); + printf("Верхний элемент стека top = %d\r\n", val); + + /* Извлечение элемента из стека */ + val = pop(stack); + printf("Извлечен элемент из стека pop = %d, стек после извлечения = ", val); + printLinkedList(stack->top); + + /* Получение длины стека */ + printf("Длина стека size = %d\n", size(stack)); + + /* Проверка на пустоту */ + bool empty = isEmpty(stack); + printf("Пуст ли стек = %s\n", empty ? "true" : "false"); + + // Освободить память + delLinkedListStack(stack); + + return 0; +} diff --git a/ru/codes/c/chapter_tree/CMakeLists.txt b/ru/codes/c/chapter_tree/CMakeLists.txt new file mode 100644 index 000000000..9b4e825ff --- /dev/null +++ b/ru/codes/c/chapter_tree/CMakeLists.txt @@ -0,0 +1,6 @@ +add_executable(avl_tree avl_tree.c) +add_executable(binary_tree binary_tree.c) +add_executable(binary_tree_bfs binary_tree_bfs.c) +add_executable(binary_tree_dfs binary_tree_dfs.c) +add_executable(binary_search_tree binary_search_tree.c) +add_executable(array_binary_tree array_binary_tree.c) diff --git a/ru/codes/c/chapter_tree/array_binary_tree.c b/ru/codes/c/chapter_tree/array_binary_tree.c new file mode 100644 index 000000000..04a08b927 --- /dev/null +++ b/ru/codes/c/chapter_tree/array_binary_tree.c @@ -0,0 +1,166 @@ +/** + * File: array_binary_tree.c + * Created Time: 2023-07-29 + * Author: Gonglja (glj0@outlook.com) + */ + +#include "../utils/common.h" + +/* Структура двоичного дерева в представлении массивом */ +typedef struct { + int *tree; + int size; +} ArrayBinaryTree; + +/* Конструктор */ +ArrayBinaryTree *newArrayBinaryTree(int *arr, int arrSize) { + ArrayBinaryTree *abt = (ArrayBinaryTree *)malloc(sizeof(ArrayBinaryTree)); + abt->tree = malloc(sizeof(int) * arrSize); + memcpy(abt->tree, arr, sizeof(int) * arrSize); + abt->size = arrSize; + return abt; +} + +/* Деструктор */ +void delArrayBinaryTree(ArrayBinaryTree *abt) { + free(abt->tree); + free(abt); +} + +/* Вместимость списка */ +int size(ArrayBinaryTree *abt) { + return abt->size; +} + +/* Получить значение узла с индексом i */ +int val(ArrayBinaryTree *abt, int i) { + // Если индекс выходит за границы, вернуть INT_MAX, обозначающий пустую позицию + if (i < 0 || i >= size(abt)) + return INT_MAX; + return abt->tree[i]; +} + +/* Получить индекс левого дочернего узла узла с индексом i */ +int left(int i) { + return 2 * i + 1; +} + +/* Получить индекс правого дочернего узла узла с индексом i */ +int right(int i) { + return 2 * i + 2; +} + +/* Получить индекс родительского узла узла с индексом i */ +int parent(int i) { + return (i - 1) / 2; +} + +/* Обход в ширину */ +int *levelOrder(ArrayBinaryTree *abt, int *returnSize) { + int *res = (int *)malloc(sizeof(int) * size(abt)); + int index = 0; + // Непосредственно обходить массив + for (int i = 0; i < size(abt); i++) { + if (val(abt, i) != INT_MAX) + res[index++] = val(abt, i); + } + *returnSize = index; + return res; +} + +/* Обход в глубину */ +void dfs(ArrayBinaryTree *abt, int i, char *order, int *res, int *index) { + // Если это пустая позиция, вернуть + if (val(abt, i) == INT_MAX) + return; + // Предварительный обход + if (strcmp(order, "pre") == 0) + res[(*index)++] = val(abt, i); + dfs(abt, left(i), order, res, index); + // Симметричный обход + if (strcmp(order, "in") == 0) + res[(*index)++] = val(abt, i); + dfs(abt, right(i), order, res, index); + // Обратный обход + if (strcmp(order, "post") == 0) + res[(*index)++] = val(abt, i); +} + +/* Предварительный обход */ +int *preOrder(ArrayBinaryTree *abt, int *returnSize) { + int *res = (int *)malloc(sizeof(int) * size(abt)); + int index = 0; + dfs(abt, 0, "pre", res, &index); + *returnSize = index; + return res; +} + +/* Симметричный обход */ +int *inOrder(ArrayBinaryTree *abt, int *returnSize) { + int *res = (int *)malloc(sizeof(int) * size(abt)); + int index = 0; + dfs(abt, 0, "in", res, &index); + *returnSize = index; + return res; +} + +/* Обратный обход */ +int *postOrder(ArrayBinaryTree *abt, int *returnSize) { + int *res = (int *)malloc(sizeof(int) * size(abt)); + int index = 0; + dfs(abt, 0, "post", res, &index); + *returnSize = index; + return res; +} + +/* Driver Code */ +int main() { + // Инициализировать двоичное дерево + // Использовать INT_MAX для обозначения пустой позиции NULL + int arr[] = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15}; + int arrSize = sizeof(arr) / sizeof(arr[0]); + TreeNode *root = arrayToTree(arr, arrSize); + printf("\nИнициализация двоичного дерева\n"); + printf("Массивное представление двоичного дерева:\n"); + printArray(arr, arrSize); + printf("Связное представление двоичного дерева:\n"); + printTree(root); + + ArrayBinaryTree *abt = newArrayBinaryTree(arr, arrSize); + + // Доступ к узлу + int i = 1; + int l = left(i), r = right(i), p = parent(i); + printf("\nТекущий индекс узла = %d, значение = %d\n", i, val(abt, i)); + printf("Индекс левого дочернего узла = %d, значение = %d\n", l, l < arrSize ? val(abt, l) : INT_MAX); + printf("Индекс правого дочернего узла = %d, значение = %d\n", r, r < arrSize ? val(abt, r) : INT_MAX); + printf("Индекс родительского узла = %d, значение = %d\n", p, p < arrSize ? val(abt, p) : INT_MAX); + + // Обходить дерево + int returnSize; + int *res; + + res = levelOrder(abt, &returnSize); + printf("\nОбход по уровням: "); + printArray(res, returnSize); + free(res); + + res = preOrder(abt, &returnSize); + printf("Предварительный обход: "); + printArray(res, returnSize); + free(res); + + res = inOrder(abt, &returnSize); + printf("Симметричный обход: "); + printArray(res, returnSize); + free(res); + + res = postOrder(abt, &returnSize); + printf("Обратный обход: "); + printArray(res, returnSize); + free(res); + + // Освободить память + delArrayBinaryTree(abt); + return 0; +} diff --git a/ru/codes/c/chapter_tree/avl_tree.c b/ru/codes/c/chapter_tree/avl_tree.c new file mode 100644 index 000000000..1c1e55121 --- /dev/null +++ b/ru/codes/c/chapter_tree/avl_tree.c @@ -0,0 +1,259 @@ +/** + * File: avl_tree.c + * Created Time: 2023-01-15 + * Author: Reanon (793584285@qq.com) + */ + +#include "../utils/common.h" + +/* Структура AVL-дерева */ +typedef struct { + TreeNode *root; +} AVLTree; + +/* Конструктор */ +AVLTree *newAVLTree() { + AVLTree *tree = (AVLTree *)malloc(sizeof(AVLTree)); + tree->root = NULL; + return tree; +} + +/* Деструктор */ +void delAVLTree(AVLTree *tree) { + freeMemoryTree(tree->root); + free(tree); +} + +/* Получить высоту узла */ +int height(TreeNode *node) { + // Высота пустого узла равна -1, высота листового узла равна 0 + if (node != NULL) { + return node->height; + } + return -1; +} + +/* Обновить высоту узла */ +void updateHeight(TreeNode *node) { + int lh = height(node->left); + int rh = height(node->right); + // Высота узла равна высоте более высокого поддерева + 1 + if (lh > rh) { + node->height = lh + 1; + } else { + node->height = rh + 1; + } +} + +/* Получить коэффициент баланса */ +int balanceFactor(TreeNode *node) { + // Коэффициент баланса пустого узла равен 0 + if (node == NULL) { + return 0; + } + // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева + return height(node->left) - height(node->right); +} + +/* Операция правого вращения */ +TreeNode *rightRotate(TreeNode *node) { + TreeNode *child, *grandChild; + child = node->left; + grandChild = child->right; + // Выполнить правое вращение узла node вокруг child + child->right = node; + node->left = grandChild; + // Обновить высоту узла + updateHeight(node); + updateHeight(child); + // Вернуть корневой узел поддерева после вращения + return child; +} + +/* Операция левого вращения */ +TreeNode *leftRotate(TreeNode *node) { + TreeNode *child, *grandChild; + child = node->right; + grandChild = child->left; + // Выполнить левое вращение узла node вокруг child + child->left = node; + node->right = grandChild; + // Обновить высоту узла + updateHeight(node); + updateHeight(child); + // Вернуть корневой узел поддерева после вращения + return child; +} + +/* Выполнить вращение, чтобы снова сбалансировать поддерево */ +TreeNode *rotate(TreeNode *node) { + // Получить коэффициент баланса узла node + int bf = balanceFactor(node); + // Левосторонне перекошенное дерево + if (bf > 1) { + if (balanceFactor(node->left) >= 0) { + // Правое вращение + return rightRotate(node); + } else { + // Сначала левое вращение, затем правое + node->left = leftRotate(node->left); + return rightRotate(node); + } + } + // Правосторонне перекошенное дерево + if (bf < -1) { + if (balanceFactor(node->right) <= 0) { + // Левое вращение + return leftRotate(node); + } else { + // Сначала правое вращение, затем левое + node->right = rightRotate(node->right); + return leftRotate(node); + } + } + // Дерево сбалансировано, вращение не требуется, вернуть сразу + return node; +} + +/* Рекурсивная вставка узла (вспомогательная функция) */ +TreeNode *insertHelper(TreeNode *node, int val) { + if (node == NULL) { + return newTreeNode(val); + } + /* 1. Найти позицию вставки и вставить узел */ + if (val < node->val) { + node->left = insertHelper(node->left, val); + } else if (val > node->val) { + node->right = insertHelper(node->right, val); + } else { + // Повторяющийся узел не вставлять, сразу вернуть + return node; + } + // Обновить высоту узла + updateHeight(node); + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = rotate(node); + // Вернуть корневой узел поддерева + return node; +} + +/* Вставка узла */ +void insert(AVLTree *tree, int val) { + tree->root = insertHelper(tree->root, val); +} + +/* Рекурсивное удаление узла (вспомогательная функция) */ +TreeNode *removeHelper(TreeNode *node, int val) { + TreeNode *child, *grandChild; + if (node == NULL) { + return NULL; + } + /* 1. Найти узел и удалить его */ + if (val < node->val) { + node->left = removeHelper(node->left, val); + } else if (val > node->val) { + node->right = removeHelper(node->right, val); + } else { + if (node->left == NULL || node->right == NULL) { + child = node->left; + if (node->right != NULL) { + child = node->right; + } + // Число дочерних узлов = 0, удалить node и сразу вернуть + if (child == NULL) { + return NULL; + } else { + // Число дочерних узлов = 1, удалить node напрямую + node = child; + } + } else { + // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел + TreeNode *temp = node->right; + while (temp->left != NULL) { + temp = temp->left; + } + int tempVal = temp->val; + node->right = removeHelper(node->right, temp->val); + node->val = tempVal; + } + } + // Обновить высоту узла + updateHeight(node); + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = rotate(node); + // Вернуть корневой узел поддерева + return node; +} + +/* Удаление узла */ +// Из-за подключения stdio.h здесь нельзя использовать ключевое слово remove +void removeItem(AVLTree *tree, int val) { + TreeNode *root = removeHelper(tree->root, val); +} + +/* Поиск узла */ +TreeNode *search(AVLTree *tree, int val) { + TreeNode *cur = tree->root; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != NULL) { + if (cur->val < val) { + // Целевой узел находится в правом поддереве cur + cur = cur->right; + } else if (cur->val > val) { + // Целевой узел находится в левом поддереве cur + cur = cur->left; + } else { + // Найти целевой узел и выйти из цикла + break; + } + } + // Найти целевой узел и выйти из цикла + return cur; +} + +void testInsert(AVLTree *tree, int val) { + insert(tree, val); + printf("\nПосле вставки узла %d AVL-дерево имеет вид \n", val); + printTree(tree->root); +} + +void testRemove(AVLTree *tree, int val) { + removeItem(tree, val); + printf("\nПосле удаления узла %d AVL-дерево имеет вид \n", val); + printTree(tree->root); +} + +/* Driver Code */ +int main() { + /* Инициализация пустого AVL-дерева */ + AVLTree *tree = (AVLTree *)newAVLTree(); + /* Вставка узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после вставки узла + testInsert(tree, 1); + testInsert(tree, 2); + testInsert(tree, 3); + testInsert(tree, 4); + testInsert(tree, 5); + testInsert(tree, 8); + testInsert(tree, 7); + testInsert(tree, 9); + testInsert(tree, 10); + testInsert(tree, 6); + + /* Вставка повторяющегося узла */ + testInsert(tree, 7); + + /* Удаление узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после удаления узла + testRemove(tree, 8); // Удаление узла степени 0 + testRemove(tree, 5); // Удаление узла степени 1 + testRemove(tree, 4); // Удаление узла степени 2 + + /* Поиск узла */ + TreeNode *node = search(tree, 7); + printf("\nНайденный объект узла, значение узла = %d \n", node->val); + + // Освободить память + delAVLTree(tree); + return 0; +} diff --git a/ru/codes/c/chapter_tree/binary_search_tree.c b/ru/codes/c/chapter_tree/binary_search_tree.c new file mode 100644 index 000000000..d7c7b4158 --- /dev/null +++ b/ru/codes/c/chapter_tree/binary_search_tree.c @@ -0,0 +1,171 @@ +/** + * File: binary_search_tree.c + * Created Time: 2023-01-11 + * Author: Reanon (793584285@qq.com) + */ + +#include "../utils/common.h" + +/* Структура двоичного дерева поиска */ +typedef struct { + TreeNode *root; +} BinarySearchTree; + +/* Конструктор */ +BinarySearchTree *newBinarySearchTree() { + // Инициализировать пустое дерево + BinarySearchTree *bst = (BinarySearchTree *)malloc(sizeof(BinarySearchTree)); + bst->root = NULL; + return bst; +} + +/* Деструктор */ +void delBinarySearchTree(BinarySearchTree *bst) { + freeMemoryTree(bst->root); + free(bst); +} + +/* Получить корневой узел двоичного дерева */ +TreeNode *getRoot(BinarySearchTree *bst) { + return bst->root; +} + +/* Поиск узла */ +TreeNode *search(BinarySearchTree *bst, int num) { + TreeNode *cur = bst->root; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != NULL) { + if (cur->val < num) { + // Целевой узел находится в правом поддереве cur + cur = cur->right; + } else if (cur->val > num) { + // Целевой узел находится в левом поддереве cur + cur = cur->left; + } else { + // Найти целевой узел и выйти из цикла + break; + } + } + // Вернуть целевой узел + return cur; +} + +/* Вставка узла */ +void insert(BinarySearchTree *bst, int num) { + // Если дерево пусто, инициализировать корневой узел + if (bst->root == NULL) { + bst->root = newTreeNode(num); + return; + } + TreeNode *cur = bst->root, *pre = NULL; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != NULL) { + // Найти повторяющийся узел и сразу вернуть + if (cur->val == num) { + return; + } + pre = cur; + if (cur->val < num) { + // Позиция вставки находится в правом поддереве cur + cur = cur->right; + } else { + // Позиция вставки находится в левом поддереве cur + cur = cur->left; + } + } + // Вставка узла + TreeNode *node = newTreeNode(num); + if (pre->val < num) { + pre->right = node; + } else { + pre->left = node; + } +} + +/* Удаление узла */ +// Из-за подключения stdio.h здесь нельзя использовать ключевое слово remove +void removeItem(BinarySearchTree *bst, int num) { + // Если дерево пусто, сразу вернуть + if (bst->root == NULL) + return; + TreeNode *cur = bst->root, *pre = NULL; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != NULL) { + // Найти узел для удаления и выйти из цикла + if (cur->val == num) + break; + pre = cur; + if (cur->val < num) { + // Удаляемый узел находится в правом поддереве root + cur = cur->right; + } else { + // Удаляемый узел находится в левом поддереве root + cur = cur->left; + } + } + // Если узел для удаления отсутствует, сразу вернуть + if (cur == NULL) + return; + // Проверить, есть ли дочерние узлы у удаляемого узла + if (cur->left == NULL || cur->right == NULL) { + /* Число дочерних узлов = 0 или 1 */ + // Когда число дочерних узлов = 0 / 1, child = nullptr / этот дочерний узел + TreeNode *child = cur->left != NULL ? cur->left : cur->right; + // Удалить узел cur + if (pre->left == cur) { + pre->left = child; + } else { + pre->right = child; + } + // Освободить память + free(cur); + } else { + /* Число дочерних узлов = 2 */ + // Получить следующий узел после cur в симметричном обходе + TreeNode *tmp = cur->right; + while (tmp->left != NULL) { + tmp = tmp->left; + } + int tmpVal = tmp->val; + // Рекурсивно удалить узел tmp + removeItem(bst, tmp->val); + // Перезаписать cur значением tmp + cur->val = tmpVal; + } +} + +/* Driver Code */ +int main() { + /* Инициализация двоичного дерева поиска */ + int nums[] = {8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15}; + BinarySearchTree *bst = newBinarySearchTree(); + for (int i = 0; i < sizeof(nums) / sizeof(int); i++) { + insert(bst, nums[i]); + } + printf("Инициализированное двоичное дерево\n"); + printTree(getRoot(bst)); + + /* Поиск узла */ + TreeNode *node = search(bst, 7); + printf("Значение найденного объекта узла = %d\n", node->val); + + /* Вставка узла */ + insert(bst, 16); + printf("После вставки узла 16 двоичное дерево имеет вид\n"); + printTree(getRoot(bst)); + + /* Удаление узла */ + removeItem(bst, 1); + printf("После удаления узла 1 двоичное дерево имеет вид\n"); + printTree(getRoot(bst)); + removeItem(bst, 2); + printf("После удаления узла 2 двоичное дерево имеет вид\n"); + printTree(getRoot(bst)); + removeItem(bst, 4); + printf("После удаления узла 4 двоичное дерево имеет вид\n"); + printTree(getRoot(bst)); + + // Освободить память + delBinarySearchTree(bst); + return 0; +} diff --git a/ru/codes/c/chapter_tree/binary_tree.c b/ru/codes/c/chapter_tree/binary_tree.c new file mode 100644 index 000000000..5410c858f --- /dev/null +++ b/ru/codes/c/chapter_tree/binary_tree.c @@ -0,0 +1,43 @@ +/** + * File: binary_tree.c + * Created Time: 2023-01-11 + * Author: Reanon (793584285@qq.com) + */ + +#include "../utils/common.h" + +/* Driver Code */ +int main() { + /* Инициализация двоичного дерева */ + // Инициализация узла + TreeNode *n1 = newTreeNode(1); + TreeNode *n2 = newTreeNode(2); + TreeNode *n3 = newTreeNode(3); + TreeNode *n4 = newTreeNode(4); + TreeNode *n5 = newTreeNode(5); + // Построить связи между узлами (указатели) + n1->left = n2; + n1->right = n3; + n2->left = n4; + n2->right = n5; + printf("Инициализация двоичного дерева\n"); + printTree(n1); + + /* Вставка и удаление узлов */ + TreeNode *P = newTreeNode(0); + // Вставить узел P между n1 -> n2 + n1->left = P; + P->left = n2; + printf("После вставки узла P\n"); + printTree(n1); + + // Удалить узел P + n1->left = n2; + // Освободить память + free(P); + printf("После удаления узла P\n"); + printTree(n1); + + freeMemoryTree(n1); + return 0; +} diff --git a/ru/codes/c/chapter_tree/binary_tree_bfs.c b/ru/codes/c/chapter_tree/binary_tree_bfs.c new file mode 100644 index 000000000..cf851844c --- /dev/null +++ b/ru/codes/c/chapter_tree/binary_tree_bfs.c @@ -0,0 +1,73 @@ +/** + * File: binary_tree_bfs.c + * Created Time: 2023-01-11 + * Author: Reanon (793584285@qq.com) + */ + +#include "../utils/common.h" + +#define MAX_SIZE 100 + +/* Обход в ширину */ +int *levelOrder(TreeNode *root, int *size) { + /* Вспомогательная очередь */ + int front, rear; + int index, *arr; + TreeNode *node; + TreeNode **queue; + + /* Вспомогательная очередь */ + queue = (TreeNode **)malloc(sizeof(TreeNode *) * MAX_SIZE); + // Указатель очереди + front = 0, rear = 0; + // Добавить корневой узел + queue[rear++] = root; + // Инициализировать список для хранения последовательности обхода + /* Вспомогательный массив */ + arr = (int *)malloc(sizeof(int) * MAX_SIZE); + // Указатель на массив + index = 0; + while (front < rear) { + // Извлечение из очереди + node = queue[front++]; + // Сохранить значение узла + arr[index++] = node->val; + if (node->left != NULL) { + // Поместить левый дочерний узел в очередь + queue[rear++] = node->left; + } + if (node->right != NULL) { + // Поместить правый дочерний узел в очередь + queue[rear++] = node->right; + } + } + // Обновить значение длины массива + *size = index; + arr = realloc(arr, sizeof(int) * (*size)); + + // Освободить память вспомогательного массива + free(queue); + return arr; +} + +/* Driver Code */ +int main() { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из массива + int nums[] = {1, 2, 3, 4, 5, 6, 7}; + int size = sizeof(nums) / sizeof(int); + TreeNode *root = arrayToTree(nums, size); + printf("Инициализация двоичного дерева\n"); + printTree(root); + + /* Обход в ширину */ + // Нужно передать длину массива + int *arr = levelOrder(root, &size); + printf("Последовательность узлов при обходе по уровням = "); + printArray(arr, size); + + // Освободить память + freeMemoryTree(root); + free(arr); + return 0; +} diff --git a/ru/codes/c/chapter_tree/binary_tree_dfs.c b/ru/codes/c/chapter_tree/binary_tree_dfs.c new file mode 100644 index 000000000..fcfe0942b --- /dev/null +++ b/ru/codes/c/chapter_tree/binary_tree_dfs.c @@ -0,0 +1,75 @@ +/** + * File: binary_tree_dfs.c + * Created Time: 2023-01-11 + * Author: Reanon (793584285@qq.com) + */ + +#include "../utils/common.h" + +#define MAX_SIZE 100 + +// Вспомогательный массив для хранения последовательности обхода +int arr[MAX_SIZE]; + +/* Предварительный обход */ +void preOrder(TreeNode *root, int *size) { + if (root == NULL) + return; + // Порядок обхода: корень -> левое поддерево -> правое поддерево + arr[(*size)++] = root->val; + preOrder(root->left, size); + preOrder(root->right, size); +} + +/* Симметричный обход */ +void inOrder(TreeNode *root, int *size) { + if (root == NULL) + return; + // Порядок обхода: левое поддерево -> корень -> правое поддерево + inOrder(root->left, size); + arr[(*size)++] = root->val; + inOrder(root->right, size); +} + +/* Обратный обход */ +void postOrder(TreeNode *root, int *size) { + if (root == NULL) + return; + // Порядок обхода: левое поддерево -> правое поддерево -> корень + postOrder(root->left, size); + postOrder(root->right, size); + arr[(*size)++] = root->val; +} + +/* Driver Code */ +int main() { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из массива + int nums[] = {1, 2, 3, 4, 5, 6, 7}; + int size = sizeof(nums) / sizeof(int); + TreeNode *root = arrayToTree(nums, size); + printf("Инициализация двоичного дерева\n"); + printTree(root); + + /* Предварительный обход */ + // Инициализация вспомогательного массива + size = 0; + preOrder(root, &size); + printf("Последовательность узлов при предварительном обходе = "); + printArray(arr, size); + + /* Симметричный обход */ + size = 0; + inOrder(root, &size); + printf("Последовательность узлов при симметричном обходе = "); + printArray(arr, size); + + /* Обратный обход */ + size = 0; + postOrder(root, &size); + printf("Последовательность узлов при обратном обходе = "); + printArray(arr, size); + + freeMemoryTree(root); + return 0; +} diff --git a/ru/codes/c/utils/CMakeLists.txt b/ru/codes/c/utils/CMakeLists.txt new file mode 100644 index 000000000..c1ece2e38 --- /dev/null +++ b/ru/codes/c/utils/CMakeLists.txt @@ -0,0 +1,5 @@ +add_executable(utils + common_test.c + common.h print_util.h + list_node.h tree_node.h + uthash.h) \ No newline at end of file diff --git a/ru/codes/c/utils/common.h b/ru/codes/c/utils/common.h new file mode 100644 index 000000000..8b9adeff7 --- /dev/null +++ b/ru/codes/c/utils/common.h @@ -0,0 +1,36 @@ +/** + * File: common.h + * Created Time: 2022-12-20 + * Author: MolDuM (moldum@163.com)、Reanon (793584285@qq.com) + */ + +#ifndef COMMON_H +#define COMMON_H + +#include +#include +#include +#include +#include +#include +#include + +#include "list_node.h" +#include "print_util.h" +#include "tree_node.h" +#include "vertex.h" + +// hash table lib +#include "uthash.h" + +#include "vector.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif // COMMON_H diff --git a/ru/codes/c/utils/common_test.c b/ru/codes/c/utils/common_test.c new file mode 100644 index 000000000..a889b423b --- /dev/null +++ b/ru/codes/c/utils/common_test.c @@ -0,0 +1,35 @@ +/** + * File: include_test.c + * Created Time: 2023-01-10 + * Author: Reanon (793584285@qq.com) + */ + +#include "common.h" + +void testListNode() { + int nums[] = {2, 3, 5, 6, 7}; + int size = sizeof(nums) / sizeof(int); + ListNode *head = arrToLinkedList(nums, size); + printLinkedList(head); +} + +void testTreeNode() { + int nums[] = {1, 2, 3, INT_MAX, 5, 6, INT_MAX}; + int size = sizeof(nums) / sizeof(int); + TreeNode *root = arrayToTree(nums, size); + + // print tree + printTree(root); + + // tree to arr + int *arr = treeToArray(root, &size); + printArray(arr, size); +} + +int main(int argc, char *argv[]) { + printf("==testListNode==\n"); + testListNode(); + printf("==testTreeNode==\n"); + testTreeNode(); + return 0; +} diff --git a/ru/codes/c/utils/list_node.h b/ru/codes/c/utils/list_node.h new file mode 100644 index 000000000..76775e419 --- /dev/null +++ b/ru/codes/c/utils/list_node.h @@ -0,0 +1,59 @@ +/** + * File: list_node.h + * Created Time: 2023-01-09 + * Author: Reanon (793584285@qq.com) + */ + +#ifndef LIST_NODE_H +#define LIST_NODE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Структура узла связного списка */ +typedef struct ListNode { + int val; // Значение узла + struct ListNode *next; // Ссылка на следующий узел +} ListNode; + +/* Конструктор, инициализирующий новый узел */ +ListNode *newListNode(int val) { + ListNode *node; + node = (ListNode *)malloc(sizeof(ListNode)); + node->val = val; + node->next = NULL; + return node; +} + +/* Десериализовать массив в связный список */ +ListNode *arrToLinkedList(const int *arr, size_t size) { + if (size <= 0) { + return NULL; + } + + ListNode *dummy = newListNode(0); + ListNode *node = dummy; + for (int i = 0; i < size; i++) { + node->next = newListNode(arr[i]); + node = node->next; + } + return dummy->next; +} + +/* Освободить память, выделенную под связный список */ +void freeMemoryLinkedList(ListNode *cur) { + // Освободить память + ListNode *pre; + while (cur != NULL) { + pre = cur; + cur = cur->next; + free(pre); + } +} + +#ifdef __cplusplus +} +#endif + +#endif // LIST_NODE_H diff --git a/ru/codes/c/utils/print_util.h b/ru/codes/c/utils/print_util.h new file mode 100644 index 000000000..fd963dd66 --- /dev/null +++ b/ru/codes/c/utils/print_util.h @@ -0,0 +1,131 @@ +/** + * File: print_util.h + * Created Time: 2022-12-21 + * Author: MolDum (moldum@163.com), Reanon (793584285@qq.com) + */ + +#ifndef PRINT_UTIL_H +#define PRINT_UTIL_H + +#include +#include +#include + +#include "list_node.h" +#include "tree_node.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Вывести массив */ +void printArray(int arr[], int size) { + if (arr == NULL || size == 0) { + printf("[]"); + return; + } + printf("["); + for (int i = 0; i < size - 1; i++) { + printf("%d, ", arr[i]); + } + printf("%d]\n", arr[size - 1]); +} + +/* Вывести массив */ +void printArrayFloat(float arr[], int size) { + if (arr == NULL || size == 0) { + printf("[]"); + return; + } + printf("["); + for (int i = 0; i < size - 1; i++) { + printf("%.2f, ", arr[i]); + } + printf("%.2f]\n", arr[size - 1]); +} + +/* Вывести связный список */ +void printLinkedList(ListNode *node) { + if (node == NULL) { + return; + } + while (node->next != NULL) { + printf("%d -> ", node->val); + node = node->next; + } + printf("%d\n", node->val); +} + +typedef struct Trunk { + struct Trunk *prev; + char *str; +} Trunk; + +Trunk *newTrunk(Trunk *prev, char *str) { + Trunk *trunk = (Trunk *)malloc(sizeof(Trunk)); + trunk->prev = prev; + trunk->str = (char *)malloc(sizeof(char) * 10); + strcpy(trunk->str, str); + return trunk; +} + +void showTrunks(Trunk *trunk) { + if (trunk == NULL) { + return; + } + showTrunks(trunk->prev); + printf("%s", trunk->str); +} + +/** + * Вывести двоичное дерево + * Этот вывод дерева заимствован из TECHIE DELIGHT + * https://www.techiedelight.com/c-program-print-binary-tree/ + */ +void printTreeHelper(TreeNode *node, Trunk *prev, bool isRight) { + if (node == NULL) { + return; + } + char *prev_str = " "; + Trunk *trunk = newTrunk(prev, prev_str); + printTreeHelper(node->right, trunk, true); + if (prev == NULL) { + trunk->str = "———"; + } else if (isRight) { + trunk->str = "/———"; + prev_str = " |"; + } else { + trunk->str = "\\———"; + prev->str = prev_str; + } + showTrunks(trunk); + printf("%d\n", node->val); + + if (prev != NULL) { + prev->str = prev_str; + } + trunk->str = " |"; + + printTreeHelper(node->left, trunk, false); +} + +/* Вывести двоичное дерево */ +void printTree(TreeNode *root) { + printTreeHelper(root, NULL, false); +} + +/* Вывести кучу */ +void printHeap(int arr[], int size) { + TreeNode *root; + printf("Массивное представление кучи:"); + printArray(arr, size); + printf("Древовидное представление кучи:\n"); + root = arrayToTree(arr, size); + printTree(root); +} + +#ifdef __cplusplus +} +#endif + +#endif // PRINT_UTIL_H diff --git a/ru/codes/c/utils/tree_node.h b/ru/codes/c/utils/tree_node.h new file mode 100644 index 000000000..32b9e1c06 --- /dev/null +++ b/ru/codes/c/utils/tree_node.h @@ -0,0 +1,107 @@ +/** + * File: tree_node.h + * Created Time: 2023-01-09 + * Author: Reanon (793584285@qq.com) + */ + +#ifndef TREE_NODE_H +#define TREE_NODE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define MAX_NODE_SIZE 5000 + +/* Структура узла двоичного дерева */ +typedef struct TreeNode { + int val; // Значение узла + int height; // Высота узла + struct TreeNode *left; // Указатель на левый дочерний узел + struct TreeNode *right; // Указатель на правый дочерний узел +} TreeNode; + +/* Конструктор */ +TreeNode *newTreeNode(int val) { + TreeNode *node; + + node = (TreeNode *)malloc(sizeof(TreeNode)); + node->val = val; + node->height = 0; + node->left = NULL; + node->right = NULL; + return node; +} + +// Правила кодирования сериализации см.: +// https://www.hello-algo.com/chapter_tree/array_representation_of_tree/ +// Массивное представление двоичного дерева: +// [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15] +// Связное представление двоичного дерева: +// /——— 15 +// /——— 7 +// /——— 3 +// | \——— 6 +// | \——— 12 +// ——— 1 +// \——— 2 +// | /——— 9 +// \——— 4 +// \——— 8 + +/* Десериализовать список в двоичное дерево: рекурсия */ +TreeNode *arrayToTreeDFS(int *arr, int size, int i) { + if (i < 0 || i >= size || arr[i] == INT_MAX) { + return NULL; + } + TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode)); + root->val = arr[i]; + root->left = arrayToTreeDFS(arr, size, 2 * i + 1); + root->right = arrayToTreeDFS(arr, size, 2 * i + 2); + return root; +} + +/* Десериализовать список в двоичное дерево */ +TreeNode *arrayToTree(int *arr, int size) { + return arrayToTreeDFS(arr, size, 0); +} + +/* Сериализовать двоичное дерево в список: рекурсия */ +void treeToArrayDFS(TreeNode *root, int i, int *res, int *size) { + if (root == NULL) { + return; + } + while (i >= *size) { + res = realloc(res, (*size + 1) * sizeof(int)); + res[*size] = INT_MAX; + (*size)++; + } + res[i] = root->val; + treeToArrayDFS(root->left, 2 * i + 1, res, size); + treeToArrayDFS(root->right, 2 * i + 2, res, size); +} + +/* Сериализовать двоичное дерево в список */ +int *treeToArray(TreeNode *root, int *size) { + *size = 0; + int *res = NULL; + treeToArrayDFS(root, 0, res, size); + return res; +} + +/* Освободить память двоичного дерева */ +void freeMemoryTree(TreeNode *root) { + if (root == NULL) + return; + freeMemoryTree(root->left); + freeMemoryTree(root->right); + free(root); +} + +#ifdef __cplusplus +} +#endif + +#endif // TREE_NODE_H diff --git a/ru/codes/c/utils/uthash.h b/ru/codes/c/utils/uthash.h new file mode 100644 index 000000000..68693bf39 --- /dev/null +++ b/ru/codes/c/utils/uthash.h @@ -0,0 +1,1140 @@ +/* +Copyright (c) 2003-2022, Troy D. Hanson https://troydhanson.github.io/uthash/ +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef UTHASH_H +#define UTHASH_H + +#define UTHASH_VERSION 2.3.0 + +#include /* memcmp, memset, strlen */ +#include /* ptrdiff_t */ +#include /* exit */ + +#if defined(HASH_DEFINE_OWN_STDINT) && HASH_DEFINE_OWN_STDINT +/* This codepath is provided for backward compatibility, but I plan to remove it. */ +#warning "HASH_DEFINE_OWN_STDINT is deprecated; please use HASH_NO_STDINT instead" +typedef unsigned int uint32_t; +typedef unsigned char uint8_t; +#elif defined(HASH_NO_STDINT) && HASH_NO_STDINT +#else +#include /* uint8_t, uint32_t */ +#endif + +/* These macros use decltype or the earlier __typeof GNU extension. + As decltype is only available in newer compilers (VS2010 or gcc 4.3+ + when compiling c++ source) this code uses whatever method is needed + or, for VS2008 where neither is available, uses casting workarounds. */ +#if !defined(DECLTYPE) && !defined(NO_DECLTYPE) +#if defined(_MSC_VER) /* MS compiler */ +#if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */ +#define DECLTYPE(x) (decltype(x)) +#else /* VS2008 or older (or VS2010 in C mode) */ +#define NO_DECLTYPE +#endif +#elif defined(__MCST__) /* Elbrus C Compiler */ +#define DECLTYPE(x) (__typeof(x)) +#elif defined(__BORLANDC__) || defined(__ICCARM__) || defined(__LCC__) || defined(__WATCOMC__) +#define NO_DECLTYPE +#else /* GNU, Sun and other compilers */ +#define DECLTYPE(x) (__typeof(x)) +#endif +#endif + +#ifdef NO_DECLTYPE +#define DECLTYPE(x) +#define DECLTYPE_ASSIGN(dst,src) \ +do { \ + char **_da_dst = (char**)(&(dst)); \ + *_da_dst = (char*)(src); \ +} while (0) +#else +#define DECLTYPE_ASSIGN(dst,src) \ +do { \ + (dst) = DECLTYPE(dst)(src); \ +} while (0) +#endif + +#ifndef uthash_malloc +#define uthash_malloc(sz) malloc(sz) /* malloc fcn */ +#endif +#ifndef uthash_free +#define uthash_free(ptr,sz) free(ptr) /* free fcn */ +#endif +#ifndef uthash_bzero +#define uthash_bzero(a,n) memset(a,'\0',n) +#endif +#ifndef uthash_strlen +#define uthash_strlen(s) strlen(s) +#endif + +#ifndef HASH_FUNCTION +#define HASH_FUNCTION(keyptr,keylen,hashv) HASH_JEN(keyptr, keylen, hashv) +#endif + +#ifndef HASH_KEYCMP +#define HASH_KEYCMP(a,b,n) memcmp(a,b,n) +#endif + +#ifndef uthash_noexpand_fyi +#define uthash_noexpand_fyi(tbl) /* can be defined to log noexpand */ +#endif +#ifndef uthash_expand_fyi +#define uthash_expand_fyi(tbl) /* can be defined to log expands */ +#endif + +#ifndef HASH_NONFATAL_OOM +#define HASH_NONFATAL_OOM 0 +#endif + +#if HASH_NONFATAL_OOM +/* malloc failures can be recovered from */ + +#ifndef uthash_nonfatal_oom +#define uthash_nonfatal_oom(obj) do {} while (0) /* non-fatal OOM error */ +#endif + +#define HASH_RECORD_OOM(oomed) do { (oomed) = 1; } while (0) +#define IF_HASH_NONFATAL_OOM(x) x + +#else +/* malloc failures result in lost memory, hash tables are unusable */ + +#ifndef uthash_fatal +#define uthash_fatal(msg) exit(-1) /* fatal OOM error */ +#endif + +#define HASH_RECORD_OOM(oomed) uthash_fatal("out of memory") +#define IF_HASH_NONFATAL_OOM(x) + +#endif + +/* initial number of buckets */ +#define HASH_INITIAL_NUM_BUCKETS 32U /* initial number of buckets */ +#define HASH_INITIAL_NUM_BUCKETS_LOG2 5U /* lg2 of initial number of buckets */ +#define HASH_BKT_CAPACITY_THRESH 10U /* expand when bucket count reaches */ + +/* calculate the element whose hash handle address is hhp */ +#define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho))) +/* calculate the hash handle from element address elp */ +#define HH_FROM_ELMT(tbl,elp) ((UT_hash_handle*)(void*)(((char*)(elp)) + ((tbl)->hho))) + +#define HASH_ROLLBACK_BKT(hh, head, itemptrhh) \ +do { \ + struct UT_hash_handle *_hd_hh_item = (itemptrhh); \ + unsigned _hd_bkt; \ + HASH_TO_BKT(_hd_hh_item->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \ + (head)->hh.tbl->buckets[_hd_bkt].count++; \ + _hd_hh_item->hh_next = NULL; \ + _hd_hh_item->hh_prev = NULL; \ +} while (0) + +#define HASH_VALUE(keyptr,keylen,hashv) \ +do { \ + HASH_FUNCTION(keyptr, keylen, hashv); \ +} while (0) + +#define HASH_FIND_BYHASHVALUE(hh,head,keyptr,keylen,hashval,out) \ +do { \ + (out) = NULL; \ + if (head) { \ + unsigned _hf_bkt; \ + HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _hf_bkt); \ + if (HASH_BLOOM_TEST((head)->hh.tbl, hashval) != 0) { \ + HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], keyptr, keylen, hashval, out); \ + } \ + } \ +} while (0) + +#define HASH_FIND(hh,head,keyptr,keylen,out) \ +do { \ + (out) = NULL; \ + if (head) { \ + unsigned _hf_hashv; \ + HASH_VALUE(keyptr, keylen, _hf_hashv); \ + HASH_FIND_BYHASHVALUE(hh, head, keyptr, keylen, _hf_hashv, out); \ + } \ +} while (0) + +#ifdef HASH_BLOOM +#define HASH_BLOOM_BITLEN (1UL << HASH_BLOOM) +#define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8UL) + (((HASH_BLOOM_BITLEN%8UL)!=0UL) ? 1UL : 0UL) +#define HASH_BLOOM_MAKE(tbl,oomed) \ +do { \ + (tbl)->bloom_nbits = HASH_BLOOM; \ + (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN); \ + if (!(tbl)->bloom_bv) { \ + HASH_RECORD_OOM(oomed); \ + } else { \ + uthash_bzero((tbl)->bloom_bv, HASH_BLOOM_BYTELEN); \ + (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE; \ + } \ +} while (0) + +#define HASH_BLOOM_FREE(tbl) \ +do { \ + uthash_free((tbl)->bloom_bv, HASH_BLOOM_BYTELEN); \ +} while (0) + +#define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8U] |= (1U << ((idx)%8U))) +#define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8U] & (1U << ((idx)%8U))) + +#define HASH_BLOOM_ADD(tbl,hashv) \ + HASH_BLOOM_BITSET((tbl)->bloom_bv, ((hashv) & (uint32_t)((1UL << (tbl)->bloom_nbits) - 1U))) + +#define HASH_BLOOM_TEST(tbl,hashv) \ + HASH_BLOOM_BITTEST((tbl)->bloom_bv, ((hashv) & (uint32_t)((1UL << (tbl)->bloom_nbits) - 1U))) + +#else +#define HASH_BLOOM_MAKE(tbl,oomed) +#define HASH_BLOOM_FREE(tbl) +#define HASH_BLOOM_ADD(tbl,hashv) +#define HASH_BLOOM_TEST(tbl,hashv) (1) +#define HASH_BLOOM_BYTELEN 0U +#endif + +#define HASH_MAKE_TABLE(hh,head,oomed) \ +do { \ + (head)->hh.tbl = (UT_hash_table*)uthash_malloc(sizeof(UT_hash_table)); \ + if (!(head)->hh.tbl) { \ + HASH_RECORD_OOM(oomed); \ + } else { \ + uthash_bzero((head)->hh.tbl, sizeof(UT_hash_table)); \ + (head)->hh.tbl->tail = &((head)->hh); \ + (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \ + (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \ + (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \ + (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \ + HASH_INITIAL_NUM_BUCKETS * sizeof(struct UT_hash_bucket)); \ + (head)->hh.tbl->signature = HASH_SIGNATURE; \ + if (!(head)->hh.tbl->buckets) { \ + HASH_RECORD_OOM(oomed); \ + uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ + } else { \ + uthash_bzero((head)->hh.tbl->buckets, \ + HASH_INITIAL_NUM_BUCKETS * sizeof(struct UT_hash_bucket)); \ + HASH_BLOOM_MAKE((head)->hh.tbl, oomed); \ + IF_HASH_NONFATAL_OOM( \ + if (oomed) { \ + uthash_free((head)->hh.tbl->buckets, \ + HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ + uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ + } \ + ) \ + } \ + } \ +} while (0) + +#define HASH_REPLACE_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,replaced,cmpfcn) \ +do { \ + (replaced) = NULL; \ + HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \ + if (replaced) { \ + HASH_DELETE(hh, head, replaced); \ + } \ + HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn); \ +} while (0) + +#define HASH_REPLACE_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add,replaced) \ +do { \ + (replaced) = NULL; \ + HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \ + if (replaced) { \ + HASH_DELETE(hh, head, replaced); \ + } \ + HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add); \ +} while (0) + +#define HASH_REPLACE(hh,head,fieldname,keylen_in,add,replaced) \ +do { \ + unsigned _hr_hashv; \ + HASH_VALUE(&((add)->fieldname), keylen_in, _hr_hashv); \ + HASH_REPLACE_BYHASHVALUE(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced); \ +} while (0) + +#define HASH_REPLACE_INORDER(hh,head,fieldname,keylen_in,add,replaced,cmpfcn) \ +do { \ + unsigned _hr_hashv; \ + HASH_VALUE(&((add)->fieldname), keylen_in, _hr_hashv); \ + HASH_REPLACE_BYHASHVALUE_INORDER(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced, cmpfcn); \ +} while (0) + +#define HASH_APPEND_LIST(hh, head, add) \ +do { \ + (add)->hh.next = NULL; \ + (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail); \ + (head)->hh.tbl->tail->next = (add); \ + (head)->hh.tbl->tail = &((add)->hh); \ +} while (0) + +#define HASH_AKBI_INNER_LOOP(hh,head,add,cmpfcn) \ +do { \ + do { \ + if (cmpfcn(DECLTYPE(head)(_hs_iter), add) > 0) { \ + break; \ + } \ + } while ((_hs_iter = HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->next)); \ +} while (0) + +#ifdef NO_DECLTYPE +#undef HASH_AKBI_INNER_LOOP +#define HASH_AKBI_INNER_LOOP(hh,head,add,cmpfcn) \ +do { \ + char *_hs_saved_head = (char*)(head); \ + do { \ + DECLTYPE_ASSIGN(head, _hs_iter); \ + if (cmpfcn(head, add) > 0) { \ + DECLTYPE_ASSIGN(head, _hs_saved_head); \ + break; \ + } \ + DECLTYPE_ASSIGN(head, _hs_saved_head); \ + } while ((_hs_iter = HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->next)); \ +} while (0) +#endif + +#if HASH_NONFATAL_OOM + +#define HASH_ADD_TO_TABLE(hh,head,keyptr,keylen_in,hashval,add,oomed) \ +do { \ + if (!(oomed)) { \ + unsigned _ha_bkt; \ + (head)->hh.tbl->num_items++; \ + HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt); \ + HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], hh, &(add)->hh, oomed); \ + if (oomed) { \ + HASH_ROLLBACK_BKT(hh, head, &(add)->hh); \ + HASH_DELETE_HH(hh, head, &(add)->hh); \ + (add)->hh.tbl = NULL; \ + uthash_nonfatal_oom(add); \ + } else { \ + HASH_BLOOM_ADD((head)->hh.tbl, hashval); \ + HASH_EMIT_KEY(hh, head, keyptr, keylen_in); \ + } \ + } else { \ + (add)->hh.tbl = NULL; \ + uthash_nonfatal_oom(add); \ + } \ +} while (0) + +#else + +#define HASH_ADD_TO_TABLE(hh,head,keyptr,keylen_in,hashval,add,oomed) \ +do { \ + unsigned _ha_bkt; \ + (head)->hh.tbl->num_items++; \ + HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt); \ + HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], hh, &(add)->hh, oomed); \ + HASH_BLOOM_ADD((head)->hh.tbl, hashval); \ + HASH_EMIT_KEY(hh, head, keyptr, keylen_in); \ +} while (0) + +#endif + + +#define HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh,head,keyptr,keylen_in,hashval,add,cmpfcn) \ +do { \ + IF_HASH_NONFATAL_OOM( int _ha_oomed = 0; ) \ + (add)->hh.hashv = (hashval); \ + (add)->hh.key = (char*) (keyptr); \ + (add)->hh.keylen = (unsigned) (keylen_in); \ + if (!(head)) { \ + (add)->hh.next = NULL; \ + (add)->hh.prev = NULL; \ + HASH_MAKE_TABLE(hh, add, _ha_oomed); \ + IF_HASH_NONFATAL_OOM( if (!_ha_oomed) { ) \ + (head) = (add); \ + IF_HASH_NONFATAL_OOM( } ) \ + } else { \ + void *_hs_iter = (head); \ + (add)->hh.tbl = (head)->hh.tbl; \ + HASH_AKBI_INNER_LOOP(hh, head, add, cmpfcn); \ + if (_hs_iter) { \ + (add)->hh.next = _hs_iter; \ + if (((add)->hh.prev = HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->prev)) { \ + HH_FROM_ELMT((head)->hh.tbl, (add)->hh.prev)->next = (add); \ + } else { \ + (head) = (add); \ + } \ + HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->prev = (add); \ + } else { \ + HASH_APPEND_LIST(hh, head, add); \ + } \ + } \ + HASH_ADD_TO_TABLE(hh, head, keyptr, keylen_in, hashval, add, _ha_oomed); \ + HASH_FSCK(hh, head, "HASH_ADD_KEYPTR_BYHASHVALUE_INORDER"); \ +} while (0) + +#define HASH_ADD_KEYPTR_INORDER(hh,head,keyptr,keylen_in,add,cmpfcn) \ +do { \ + unsigned _hs_hashv; \ + HASH_VALUE(keyptr, keylen_in, _hs_hashv); \ + HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, keyptr, keylen_in, _hs_hashv, add, cmpfcn); \ +} while (0) + +#define HASH_ADD_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,cmpfcn) \ + HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn) + +#define HASH_ADD_INORDER(hh,head,fieldname,keylen_in,add,cmpfcn) \ + HASH_ADD_KEYPTR_INORDER(hh, head, &((add)->fieldname), keylen_in, add, cmpfcn) + +#define HASH_ADD_KEYPTR_BYHASHVALUE(hh,head,keyptr,keylen_in,hashval,add) \ +do { \ + IF_HASH_NONFATAL_OOM( int _ha_oomed = 0; ) \ + (add)->hh.hashv = (hashval); \ + (add)->hh.key = (const void*) (keyptr); \ + (add)->hh.keylen = (unsigned) (keylen_in); \ + if (!(head)) { \ + (add)->hh.next = NULL; \ + (add)->hh.prev = NULL; \ + HASH_MAKE_TABLE(hh, add, _ha_oomed); \ + IF_HASH_NONFATAL_OOM( if (!_ha_oomed) { ) \ + (head) = (add); \ + IF_HASH_NONFATAL_OOM( } ) \ + } else { \ + (add)->hh.tbl = (head)->hh.tbl; \ + HASH_APPEND_LIST(hh, head, add); \ + } \ + HASH_ADD_TO_TABLE(hh, head, keyptr, keylen_in, hashval, add, _ha_oomed); \ + HASH_FSCK(hh, head, "HASH_ADD_KEYPTR_BYHASHVALUE"); \ +} while (0) + +#define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \ +do { \ + unsigned _ha_hashv; \ + HASH_VALUE(keyptr, keylen_in, _ha_hashv); \ + HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, keyptr, keylen_in, _ha_hashv, add); \ +} while (0) + +#define HASH_ADD_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add) \ + HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add) + +#define HASH_ADD(hh,head,fieldname,keylen_in,add) \ + HASH_ADD_KEYPTR(hh, head, &((add)->fieldname), keylen_in, add) + +#define HASH_TO_BKT(hashv,num_bkts,bkt) \ +do { \ + bkt = ((hashv) & ((num_bkts) - 1U)); \ +} while (0) + +/* delete "delptr" from the hash table. + * "the usual" patch-up process for the app-order doubly-linked-list. + * The use of _hd_hh_del below deserves special explanation. + * These used to be expressed using (delptr) but that led to a bug + * if someone used the same symbol for the head and deletee, like + * HASH_DELETE(hh,users,users); + * We want that to work, but by changing the head (users) below + * we were forfeiting our ability to further refer to the deletee (users) + * in the patch-up process. Solution: use scratch space to + * copy the deletee pointer, then the latter references are via that + * scratch pointer rather than through the repointed (users) symbol. + */ +#define HASH_DELETE(hh,head,delptr) \ + HASH_DELETE_HH(hh, head, &(delptr)->hh) + +#define HASH_DELETE_HH(hh,head,delptrhh) \ +do { \ + const struct UT_hash_handle *_hd_hh_del = (delptrhh); \ + if ((_hd_hh_del->prev == NULL) && (_hd_hh_del->next == NULL)) { \ + HASH_BLOOM_FREE((head)->hh.tbl); \ + uthash_free((head)->hh.tbl->buckets, \ + (head)->hh.tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ + uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ + (head) = NULL; \ + } else { \ + unsigned _hd_bkt; \ + if (_hd_hh_del == (head)->hh.tbl->tail) { \ + (head)->hh.tbl->tail = HH_FROM_ELMT((head)->hh.tbl, _hd_hh_del->prev); \ + } \ + if (_hd_hh_del->prev != NULL) { \ + HH_FROM_ELMT((head)->hh.tbl, _hd_hh_del->prev)->next = _hd_hh_del->next; \ + } else { \ + DECLTYPE_ASSIGN(head, _hd_hh_del->next); \ + } \ + if (_hd_hh_del->next != NULL) { \ + HH_FROM_ELMT((head)->hh.tbl, _hd_hh_del->next)->prev = _hd_hh_del->prev; \ + } \ + HASH_TO_BKT(_hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \ + HASH_DEL_IN_BKT((head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del); \ + (head)->hh.tbl->num_items--; \ + } \ + HASH_FSCK(hh, head, "HASH_DELETE_HH"); \ +} while (0) + +/* convenience forms of HASH_FIND/HASH_ADD/HASH_DEL */ +#define HASH_FIND_STR(head,findstr,out) \ +do { \ + unsigned _uthash_hfstr_keylen = (unsigned)uthash_strlen(findstr); \ + HASH_FIND(hh, head, findstr, _uthash_hfstr_keylen, out); \ +} while (0) +#define HASH_ADD_STR(head,strfield,add) \ +do { \ + unsigned _uthash_hastr_keylen = (unsigned)uthash_strlen((add)->strfield); \ + HASH_ADD(hh, head, strfield[0], _uthash_hastr_keylen, add); \ +} while (0) +#define HASH_REPLACE_STR(head,strfield,add,replaced) \ +do { \ + unsigned _uthash_hrstr_keylen = (unsigned)uthash_strlen((add)->strfield); \ + HASH_REPLACE(hh, head, strfield[0], _uthash_hrstr_keylen, add, replaced); \ +} while (0) +#define HASH_FIND_INT(head,findint,out) \ + HASH_FIND(hh,head,findint,sizeof(int),out) +#define HASH_ADD_INT(head,intfield,add) \ + HASH_ADD(hh,head,intfield,sizeof(int),add) +#define HASH_REPLACE_INT(head,intfield,add,replaced) \ + HASH_REPLACE(hh,head,intfield,sizeof(int),add,replaced) +#define HASH_FIND_PTR(head,findptr,out) \ + HASH_FIND(hh,head,findptr,sizeof(void *),out) +#define HASH_ADD_PTR(head,ptrfield,add) \ + HASH_ADD(hh,head,ptrfield,sizeof(void *),add) +#define HASH_REPLACE_PTR(head,ptrfield,add,replaced) \ + HASH_REPLACE(hh,head,ptrfield,sizeof(void *),add,replaced) +#define HASH_DEL(head,delptr) \ + HASH_DELETE(hh,head,delptr) + +/* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined. + * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined. + */ +#ifdef HASH_DEBUG +#include /* fprintf, stderr */ +#define HASH_OOPS(...) do { fprintf(stderr, __VA_ARGS__); exit(-1); } while (0) +#define HASH_FSCK(hh,head,where) \ +do { \ + struct UT_hash_handle *_thh; \ + if (head) { \ + unsigned _bkt_i; \ + unsigned _count = 0; \ + char *_prev; \ + for (_bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; ++_bkt_i) { \ + unsigned _bkt_count = 0; \ + _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head; \ + _prev = NULL; \ + while (_thh) { \ + if (_prev != (char*)(_thh->hh_prev)) { \ + HASH_OOPS("%s: invalid hh_prev %p, actual %p\n", \ + (where), (void*)_thh->hh_prev, (void*)_prev); \ + } \ + _bkt_count++; \ + _prev = (char*)(_thh); \ + _thh = _thh->hh_next; \ + } \ + _count += _bkt_count; \ + if ((head)->hh.tbl->buckets[_bkt_i].count != _bkt_count) { \ + HASH_OOPS("%s: invalid bucket count %u, actual %u\n", \ + (where), (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \ + } \ + } \ + if (_count != (head)->hh.tbl->num_items) { \ + HASH_OOPS("%s: invalid hh item count %u, actual %u\n", \ + (where), (head)->hh.tbl->num_items, _count); \ + } \ + _count = 0; \ + _prev = NULL; \ + _thh = &(head)->hh; \ + while (_thh) { \ + _count++; \ + if (_prev != (char*)_thh->prev) { \ + HASH_OOPS("%s: invalid prev %p, actual %p\n", \ + (where), (void*)_thh->prev, (void*)_prev); \ + } \ + _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh); \ + _thh = (_thh->next ? HH_FROM_ELMT((head)->hh.tbl, _thh->next) : NULL); \ + } \ + if (_count != (head)->hh.tbl->num_items) { \ + HASH_OOPS("%s: invalid app item count %u, actual %u\n", \ + (where), (head)->hh.tbl->num_items, _count); \ + } \ + } \ +} while (0) +#else +#define HASH_FSCK(hh,head,where) +#endif + +/* When compiled with -DHASH_EMIT_KEYS, length-prefixed keys are emitted to + * the descriptor to which this macro is defined for tuning the hash function. + * The app can #include to get the prototype for write(2). */ +#ifdef HASH_EMIT_KEYS +#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) \ +do { \ + unsigned _klen = fieldlen; \ + write(HASH_EMIT_KEYS, &_klen, sizeof(_klen)); \ + write(HASH_EMIT_KEYS, keyptr, (unsigned long)fieldlen); \ +} while (0) +#else +#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) +#endif + +/* The Bernstein hash function, used in Perl prior to v5.6. Note (x<<5+x)=x*33. */ +#define HASH_BER(key,keylen,hashv) \ +do { \ + unsigned _hb_keylen = (unsigned)keylen; \ + const unsigned char *_hb_key = (const unsigned char*)(key); \ + (hashv) = 0; \ + while (_hb_keylen-- != 0U) { \ + (hashv) = (((hashv) << 5) + (hashv)) + *_hb_key++; \ + } \ +} while (0) + + +/* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at + * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx + * (archive link: https://archive.is/Ivcan ) + */ +#define HASH_SAX(key,keylen,hashv) \ +do { \ + unsigned _sx_i; \ + const unsigned char *_hs_key = (const unsigned char*)(key); \ + hashv = 0; \ + for (_sx_i=0; _sx_i < keylen; _sx_i++) { \ + hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i]; \ + } \ +} while (0) +/* FNV-1a variation */ +#define HASH_FNV(key,keylen,hashv) \ +do { \ + unsigned _fn_i; \ + const unsigned char *_hf_key = (const unsigned char*)(key); \ + (hashv) = 2166136261U; \ + for (_fn_i=0; _fn_i < keylen; _fn_i++) { \ + hashv = hashv ^ _hf_key[_fn_i]; \ + hashv = hashv * 16777619U; \ + } \ +} while (0) + +#define HASH_OAT(key,keylen,hashv) \ +do { \ + unsigned _ho_i; \ + const unsigned char *_ho_key=(const unsigned char*)(key); \ + hashv = 0; \ + for(_ho_i=0; _ho_i < keylen; _ho_i++) { \ + hashv += _ho_key[_ho_i]; \ + hashv += (hashv << 10); \ + hashv ^= (hashv >> 6); \ + } \ + hashv += (hashv << 3); \ + hashv ^= (hashv >> 11); \ + hashv += (hashv << 15); \ +} while (0) + +#define HASH_JEN_MIX(a,b,c) \ +do { \ + a -= b; a -= c; a ^= ( c >> 13 ); \ + b -= c; b -= a; b ^= ( a << 8 ); \ + c -= a; c -= b; c ^= ( b >> 13 ); \ + a -= b; a -= c; a ^= ( c >> 12 ); \ + b -= c; b -= a; b ^= ( a << 16 ); \ + c -= a; c -= b; c ^= ( b >> 5 ); \ + a -= b; a -= c; a ^= ( c >> 3 ); \ + b -= c; b -= a; b ^= ( a << 10 ); \ + c -= a; c -= b; c ^= ( b >> 15 ); \ +} while (0) + +#define HASH_JEN(key,keylen,hashv) \ +do { \ + unsigned _hj_i,_hj_j,_hj_k; \ + unsigned const char *_hj_key=(unsigned const char*)(key); \ + hashv = 0xfeedbeefu; \ + _hj_i = _hj_j = 0x9e3779b9u; \ + _hj_k = (unsigned)(keylen); \ + while (_hj_k >= 12U) { \ + _hj_i += (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 ) \ + + ( (unsigned)_hj_key[2] << 16 ) \ + + ( (unsigned)_hj_key[3] << 24 ) ); \ + _hj_j += (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 ) \ + + ( (unsigned)_hj_key[6] << 16 ) \ + + ( (unsigned)_hj_key[7] << 24 ) ); \ + hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 ) \ + + ( (unsigned)_hj_key[10] << 16 ) \ + + ( (unsigned)_hj_key[11] << 24 ) ); \ + \ + HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ + \ + _hj_key += 12; \ + _hj_k -= 12U; \ + } \ + hashv += (unsigned)(keylen); \ + switch ( _hj_k ) { \ + case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); /* FALLTHROUGH */ \ + case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); /* FALLTHROUGH */ \ + case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); /* FALLTHROUGH */ \ + case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); /* FALLTHROUGH */ \ + case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); /* FALLTHROUGH */ \ + case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); /* FALLTHROUGH */ \ + case 5: _hj_j += _hj_key[4]; /* FALLTHROUGH */ \ + case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); /* FALLTHROUGH */ \ + case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); /* FALLTHROUGH */ \ + case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); /* FALLTHROUGH */ \ + case 1: _hj_i += _hj_key[0]; /* FALLTHROUGH */ \ + default: ; \ + } \ + HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ +} while (0) + +/* The Paul Hsieh hash function */ +#undef get16bits +#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \ + || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__) +#define get16bits(d) (*((const uint16_t *) (d))) +#endif + +#if !defined (get16bits) +#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) \ + +(uint32_t)(((const uint8_t *)(d))[0]) ) +#endif +#define HASH_SFH(key,keylen,hashv) \ +do { \ + unsigned const char *_sfh_key=(unsigned const char*)(key); \ + uint32_t _sfh_tmp, _sfh_len = (uint32_t)keylen; \ + \ + unsigned _sfh_rem = _sfh_len & 3U; \ + _sfh_len >>= 2; \ + hashv = 0xcafebabeu; \ + \ + /* Main loop */ \ + for (;_sfh_len > 0U; _sfh_len--) { \ + hashv += get16bits (_sfh_key); \ + _sfh_tmp = ((uint32_t)(get16bits (_sfh_key+2)) << 11) ^ hashv; \ + hashv = (hashv << 16) ^ _sfh_tmp; \ + _sfh_key += 2U*sizeof (uint16_t); \ + hashv += hashv >> 11; \ + } \ + \ + /* Handle end cases */ \ + switch (_sfh_rem) { \ + case 3: hashv += get16bits (_sfh_key); \ + hashv ^= hashv << 16; \ + hashv ^= (uint32_t)(_sfh_key[sizeof (uint16_t)]) << 18; \ + hashv += hashv >> 11; \ + break; \ + case 2: hashv += get16bits (_sfh_key); \ + hashv ^= hashv << 11; \ + hashv += hashv >> 17; \ + break; \ + case 1: hashv += *_sfh_key; \ + hashv ^= hashv << 10; \ + hashv += hashv >> 1; \ + break; \ + default: ; \ + } \ + \ + /* Force "avalanching" of final 127 bits */ \ + hashv ^= hashv << 3; \ + hashv += hashv >> 5; \ + hashv ^= hashv << 4; \ + hashv += hashv >> 17; \ + hashv ^= hashv << 25; \ + hashv += hashv >> 6; \ +} while (0) + +/* iterate over items in a known bucket to find desired item */ +#define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,hashval,out) \ +do { \ + if ((head).hh_head != NULL) { \ + DECLTYPE_ASSIGN(out, ELMT_FROM_HH(tbl, (head).hh_head)); \ + } else { \ + (out) = NULL; \ + } \ + while ((out) != NULL) { \ + if ((out)->hh.hashv == (hashval) && (out)->hh.keylen == (keylen_in)) { \ + if (HASH_KEYCMP((out)->hh.key, keyptr, keylen_in) == 0) { \ + break; \ + } \ + } \ + if ((out)->hh.hh_next != NULL) { \ + DECLTYPE_ASSIGN(out, ELMT_FROM_HH(tbl, (out)->hh.hh_next)); \ + } else { \ + (out) = NULL; \ + } \ + } \ +} while (0) + +/* add an item to a bucket */ +#define HASH_ADD_TO_BKT(head,hh,addhh,oomed) \ +do { \ + UT_hash_bucket *_ha_head = &(head); \ + _ha_head->count++; \ + (addhh)->hh_next = _ha_head->hh_head; \ + (addhh)->hh_prev = NULL; \ + if (_ha_head->hh_head != NULL) { \ + _ha_head->hh_head->hh_prev = (addhh); \ + } \ + _ha_head->hh_head = (addhh); \ + if ((_ha_head->count >= ((_ha_head->expand_mult + 1U) * HASH_BKT_CAPACITY_THRESH)) \ + && !(addhh)->tbl->noexpand) { \ + HASH_EXPAND_BUCKETS(addhh,(addhh)->tbl, oomed); \ + IF_HASH_NONFATAL_OOM( \ + if (oomed) { \ + HASH_DEL_IN_BKT(head,addhh); \ + } \ + ) \ + } \ +} while (0) + +/* remove an item from a given bucket */ +#define HASH_DEL_IN_BKT(head,delhh) \ +do { \ + UT_hash_bucket *_hd_head = &(head); \ + _hd_head->count--; \ + if (_hd_head->hh_head == (delhh)) { \ + _hd_head->hh_head = (delhh)->hh_next; \ + } \ + if ((delhh)->hh_prev) { \ + (delhh)->hh_prev->hh_next = (delhh)->hh_next; \ + } \ + if ((delhh)->hh_next) { \ + (delhh)->hh_next->hh_prev = (delhh)->hh_prev; \ + } \ +} while (0) + +/* Bucket expansion has the effect of doubling the number of buckets + * and redistributing the items into the new buckets. Ideally the + * items will distribute more or less evenly into the new buckets + * (the extent to which this is true is a measure of the quality of + * the hash function as it applies to the key domain). + * + * With the items distributed into more buckets, the chain length + * (item count) in each bucket is reduced. Thus by expanding buckets + * the hash keeps a bound on the chain length. This bounded chain + * length is the essence of how a hash provides constant time lookup. + * + * The calculation of tbl->ideal_chain_maxlen below deserves some + * explanation. First, keep in mind that we're calculating the ideal + * maximum chain length based on the *new* (doubled) bucket count. + * In fractions this is just n/b (n=number of items,b=new num buckets). + * Since the ideal chain length is an integer, we want to calculate + * ceil(n/b). We don't depend on floating point arithmetic in this + * hash, so to calculate ceil(n/b) with integers we could write + * + * ceil(n/b) = (n/b) + ((n%b)?1:0) + * + * and in fact a previous version of this hash did just that. + * But now we have improved things a bit by recognizing that b is + * always a power of two. We keep its base 2 log handy (call it lb), + * so now we can write this with a bit shift and logical AND: + * + * ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0) + * + */ +#define HASH_EXPAND_BUCKETS(hh,tbl,oomed) \ +do { \ + unsigned _he_bkt; \ + unsigned _he_bkt_i; \ + struct UT_hash_handle *_he_thh, *_he_hh_nxt; \ + UT_hash_bucket *_he_new_buckets, *_he_newbkt; \ + _he_new_buckets = (UT_hash_bucket*)uthash_malloc( \ + sizeof(struct UT_hash_bucket) * (tbl)->num_buckets * 2U); \ + if (!_he_new_buckets) { \ + HASH_RECORD_OOM(oomed); \ + } else { \ + uthash_bzero(_he_new_buckets, \ + sizeof(struct UT_hash_bucket) * (tbl)->num_buckets * 2U); \ + (tbl)->ideal_chain_maxlen = \ + ((tbl)->num_items >> ((tbl)->log2_num_buckets+1U)) + \ + ((((tbl)->num_items & (((tbl)->num_buckets*2U)-1U)) != 0U) ? 1U : 0U); \ + (tbl)->nonideal_items = 0; \ + for (_he_bkt_i = 0; _he_bkt_i < (tbl)->num_buckets; _he_bkt_i++) { \ + _he_thh = (tbl)->buckets[ _he_bkt_i ].hh_head; \ + while (_he_thh != NULL) { \ + _he_hh_nxt = _he_thh->hh_next; \ + HASH_TO_BKT(_he_thh->hashv, (tbl)->num_buckets * 2U, _he_bkt); \ + _he_newbkt = &(_he_new_buckets[_he_bkt]); \ + if (++(_he_newbkt->count) > (tbl)->ideal_chain_maxlen) { \ + (tbl)->nonideal_items++; \ + if (_he_newbkt->count > _he_newbkt->expand_mult * (tbl)->ideal_chain_maxlen) { \ + _he_newbkt->expand_mult++; \ + } \ + } \ + _he_thh->hh_prev = NULL; \ + _he_thh->hh_next = _he_newbkt->hh_head; \ + if (_he_newbkt->hh_head != NULL) { \ + _he_newbkt->hh_head->hh_prev = _he_thh; \ + } \ + _he_newbkt->hh_head = _he_thh; \ + _he_thh = _he_hh_nxt; \ + } \ + } \ + uthash_free((tbl)->buckets, (tbl)->num_buckets * sizeof(struct UT_hash_bucket)); \ + (tbl)->num_buckets *= 2U; \ + (tbl)->log2_num_buckets++; \ + (tbl)->buckets = _he_new_buckets; \ + (tbl)->ineff_expands = ((tbl)->nonideal_items > ((tbl)->num_items >> 1)) ? \ + ((tbl)->ineff_expands+1U) : 0U; \ + if ((tbl)->ineff_expands > 1U) { \ + (tbl)->noexpand = 1; \ + uthash_noexpand_fyi(tbl); \ + } \ + uthash_expand_fyi(tbl); \ + } \ +} while (0) + + +/* This is an adaptation of Simon Tatham's O(n log(n)) mergesort */ +/* Note that HASH_SORT assumes the hash handle name to be hh. + * HASH_SRT was added to allow the hash handle name to be passed in. */ +#define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn) +#define HASH_SRT(hh,head,cmpfcn) \ +do { \ + unsigned _hs_i; \ + unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize; \ + struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail; \ + if (head != NULL) { \ + _hs_insize = 1; \ + _hs_looping = 1; \ + _hs_list = &((head)->hh); \ + while (_hs_looping != 0U) { \ + _hs_p = _hs_list; \ + _hs_list = NULL; \ + _hs_tail = NULL; \ + _hs_nmerges = 0; \ + while (_hs_p != NULL) { \ + _hs_nmerges++; \ + _hs_q = _hs_p; \ + _hs_psize = 0; \ + for (_hs_i = 0; _hs_i < _hs_insize; ++_hs_i) { \ + _hs_psize++; \ + _hs_q = ((_hs_q->next != NULL) ? \ + HH_FROM_ELMT((head)->hh.tbl, _hs_q->next) : NULL); \ + if (_hs_q == NULL) { \ + break; \ + } \ + } \ + _hs_qsize = _hs_insize; \ + while ((_hs_psize != 0U) || ((_hs_qsize != 0U) && (_hs_q != NULL))) { \ + if (_hs_psize == 0U) { \ + _hs_e = _hs_q; \ + _hs_q = ((_hs_q->next != NULL) ? \ + HH_FROM_ELMT((head)->hh.tbl, _hs_q->next) : NULL); \ + _hs_qsize--; \ + } else if ((_hs_qsize == 0U) || (_hs_q == NULL)) { \ + _hs_e = _hs_p; \ + if (_hs_p != NULL) { \ + _hs_p = ((_hs_p->next != NULL) ? \ + HH_FROM_ELMT((head)->hh.tbl, _hs_p->next) : NULL); \ + } \ + _hs_psize--; \ + } else if ((cmpfcn( \ + DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl, _hs_p)), \ + DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl, _hs_q)) \ + )) <= 0) { \ + _hs_e = _hs_p; \ + if (_hs_p != NULL) { \ + _hs_p = ((_hs_p->next != NULL) ? \ + HH_FROM_ELMT((head)->hh.tbl, _hs_p->next) : NULL); \ + } \ + _hs_psize--; \ + } else { \ + _hs_e = _hs_q; \ + _hs_q = ((_hs_q->next != NULL) ? \ + HH_FROM_ELMT((head)->hh.tbl, _hs_q->next) : NULL); \ + _hs_qsize--; \ + } \ + if ( _hs_tail != NULL ) { \ + _hs_tail->next = ((_hs_e != NULL) ? \ + ELMT_FROM_HH((head)->hh.tbl, _hs_e) : NULL); \ + } else { \ + _hs_list = _hs_e; \ + } \ + if (_hs_e != NULL) { \ + _hs_e->prev = ((_hs_tail != NULL) ? \ + ELMT_FROM_HH((head)->hh.tbl, _hs_tail) : NULL); \ + } \ + _hs_tail = _hs_e; \ + } \ + _hs_p = _hs_q; \ + } \ + if (_hs_tail != NULL) { \ + _hs_tail->next = NULL; \ + } \ + if (_hs_nmerges <= 1U) { \ + _hs_looping = 0; \ + (head)->hh.tbl->tail = _hs_tail; \ + DECLTYPE_ASSIGN(head, ELMT_FROM_HH((head)->hh.tbl, _hs_list)); \ + } \ + _hs_insize *= 2U; \ + } \ + HASH_FSCK(hh, head, "HASH_SRT"); \ + } \ +} while (0) + +/* This function selects items from one hash into another hash. + * The end result is that the selected items have dual presence + * in both hashes. There is no copy of the items made; rather + * they are added into the new hash through a secondary hash + * hash handle that must be present in the structure. */ +#define HASH_SELECT(hh_dst, dst, hh_src, src, cond) \ +do { \ + unsigned _src_bkt, _dst_bkt; \ + void *_last_elt = NULL, *_elt; \ + UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL; \ + ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst)); \ + if ((src) != NULL) { \ + for (_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) { \ + for (_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head; \ + _src_hh != NULL; \ + _src_hh = _src_hh->hh_next) { \ + _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh); \ + if (cond(_elt)) { \ + IF_HASH_NONFATAL_OOM( int _hs_oomed = 0; ) \ + _dst_hh = (UT_hash_handle*)(void*)(((char*)_elt) + _dst_hho); \ + _dst_hh->key = _src_hh->key; \ + _dst_hh->keylen = _src_hh->keylen; \ + _dst_hh->hashv = _src_hh->hashv; \ + _dst_hh->prev = _last_elt; \ + _dst_hh->next = NULL; \ + if (_last_elt_hh != NULL) { \ + _last_elt_hh->next = _elt; \ + } \ + if ((dst) == NULL) { \ + DECLTYPE_ASSIGN(dst, _elt); \ + HASH_MAKE_TABLE(hh_dst, dst, _hs_oomed); \ + IF_HASH_NONFATAL_OOM( \ + if (_hs_oomed) { \ + uthash_nonfatal_oom(_elt); \ + (dst) = NULL; \ + continue; \ + } \ + ) \ + } else { \ + _dst_hh->tbl = (dst)->hh_dst.tbl; \ + } \ + HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt); \ + HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt], hh_dst, _dst_hh, _hs_oomed); \ + (dst)->hh_dst.tbl->num_items++; \ + IF_HASH_NONFATAL_OOM( \ + if (_hs_oomed) { \ + HASH_ROLLBACK_BKT(hh_dst, dst, _dst_hh); \ + HASH_DELETE_HH(hh_dst, dst, _dst_hh); \ + _dst_hh->tbl = NULL; \ + uthash_nonfatal_oom(_elt); \ + continue; \ + } \ + ) \ + HASH_BLOOM_ADD(_dst_hh->tbl, _dst_hh->hashv); \ + _last_elt = _elt; \ + _last_elt_hh = _dst_hh; \ + } \ + } \ + } \ + } \ + HASH_FSCK(hh_dst, dst, "HASH_SELECT"); \ +} while (0) + +#define HASH_CLEAR(hh,head) \ +do { \ + if ((head) != NULL) { \ + HASH_BLOOM_FREE((head)->hh.tbl); \ + uthash_free((head)->hh.tbl->buckets, \ + (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket)); \ + uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ + (head) = NULL; \ + } \ +} while (0) + +#define HASH_OVERHEAD(hh,head) \ + (((head) != NULL) ? ( \ + (size_t)(((head)->hh.tbl->num_items * sizeof(UT_hash_handle)) + \ + ((head)->hh.tbl->num_buckets * sizeof(UT_hash_bucket)) + \ + sizeof(UT_hash_table) + \ + (HASH_BLOOM_BYTELEN))) : 0U) + +#ifdef NO_DECLTYPE +#define HASH_ITER(hh,head,el,tmp) \ +for(((el)=(head)), ((*(char**)(&(tmp)))=(char*)((head!=NULL)?(head)->hh.next:NULL)); \ + (el) != NULL; ((el)=(tmp)), ((*(char**)(&(tmp)))=(char*)((tmp!=NULL)?(tmp)->hh.next:NULL))) +#else +#define HASH_ITER(hh,head,el,tmp) \ +for(((el)=(head)), ((tmp)=DECLTYPE(el)((head!=NULL)?(head)->hh.next:NULL)); \ + (el) != NULL; ((el)=(tmp)), ((tmp)=DECLTYPE(el)((tmp!=NULL)?(tmp)->hh.next:NULL))) +#endif + +/* obtain a count of items in the hash */ +#define HASH_COUNT(head) HASH_CNT(hh,head) +#define HASH_CNT(hh,head) ((head != NULL)?((head)->hh.tbl->num_items):0U) + +typedef struct UT_hash_bucket { + struct UT_hash_handle *hh_head; + unsigned count; + + /* expand_mult is normally set to 0. In this situation, the max chain length + * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If + * the bucket's chain exceeds this length, bucket expansion is triggered). + * However, setting expand_mult to a non-zero value delays bucket expansion + * (that would be triggered by additions to this particular bucket) + * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH. + * (The multiplier is simply expand_mult+1). The whole idea of this + * multiplier is to reduce bucket expansions, since they are expensive, in + * situations where we know that a particular bucket tends to be overused. + * It is better to let its chain length grow to a longer yet-still-bounded + * value, than to do an O(n) bucket expansion too often. + */ + unsigned expand_mult; + +} UT_hash_bucket; + +/* random signature used only to find hash tables in external analysis */ +#define HASH_SIGNATURE 0xa0111fe1u +#define HASH_BLOOM_SIGNATURE 0xb12220f2u + +typedef struct UT_hash_table { + UT_hash_bucket *buckets; + unsigned num_buckets, log2_num_buckets; + unsigned num_items; + struct UT_hash_handle *tail; /* tail hh in app order, for fast append */ + ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */ + + /* in an ideal situation (all buckets used equally), no bucket would have + * more than ceil(#items/#buckets) items. that's the ideal chain length. */ + unsigned ideal_chain_maxlen; + + /* nonideal_items is the number of items in the hash whose chain position + * exceeds the ideal chain maxlen. these items pay the penalty for an uneven + * hash distribution; reaching them in a chain traversal takes >ideal steps */ + unsigned nonideal_items; + + /* ineffective expands occur when a bucket doubling was performed, but + * afterward, more than half the items in the hash had nonideal chain + * positions. If this happens on two consecutive expansions we inhibit any + * further expansion, as it's not helping; this happens when the hash + * function isn't a good fit for the key domain. When expansion is inhibited + * the hash will still work, albeit no longer in constant time. */ + unsigned ineff_expands, noexpand; + + uint32_t signature; /* used only to find hash tables in external analysis */ +#ifdef HASH_BLOOM + uint32_t bloom_sig; /* used only to test bloom exists in external analysis */ + uint8_t *bloom_bv; + uint8_t bloom_nbits; +#endif + +} UT_hash_table; + +typedef struct UT_hash_handle { + struct UT_hash_table *tbl; + void *prev; /* prev element in app order */ + void *next; /* next element in app order */ + struct UT_hash_handle *hh_prev; /* previous hh in bucket order */ + struct UT_hash_handle *hh_next; /* next hh in bucket order */ + const void *key; /* ptr to enclosing struct's key */ + unsigned keylen; /* enclosing struct's key len */ + unsigned hashv; /* result of hash-fcn(key) */ +} UT_hash_handle; + +#endif /* UTHASH_H */ diff --git a/ru/codes/c/utils/vector.h b/ru/codes/c/utils/vector.h new file mode 100644 index 000000000..a022fa6f2 --- /dev/null +++ b/ru/codes/c/utils/vector.h @@ -0,0 +1,259 @@ +/** + * File: vector.h + * Created Time: 2023-07-13 + * Author: Zuoxun (845242523@qq.com)、Gonglja (glj0@outlook.com) + */ + +#ifndef VECTOR_H +#define VECTOR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Определить тип вектора */ +typedef struct vector { + int size; // Текущий размер вектора + int capacity; // Текущая емкость вектора + int depth; // Текущая глубина вектора + void **data; // Массив указателей на данные +} vector; + +/* Создать вектор */ +vector *newVector() { + vector *v = malloc(sizeof(vector)); + v->size = 0; + v->capacity = 4; + v->depth = 1; + v->data = malloc(v->capacity * sizeof(void *)); + return v; +} + +/* Создать вектор, указав размер и значение элементов по умолчанию */ +vector *_newVector(int size, void *elem, int elemSize) { + vector *v = malloc(sizeof(vector)); + v->size = size; + v->capacity = size; + v->depth = 1; + v->data = malloc(v->capacity * sizeof(void *)); + for (int i = 0; i < size; i++) { + void *tmp = malloc(sizeof(char) * elemSize); + memcpy(tmp, elem, elemSize); + v->data[i] = tmp; + } + return v; +} + +/* Уничтожить вектор */ +void delVector(vector *v) { + if (v) { + if (v->depth == 0) { + return; + } else if (v->depth == 1) { + for (int i = 0; i < v->size; i++) { + free(v->data[i]); + } + free(v); + } else { + for (int i = 0; i < v->size; i++) { + delVector(v->data[i]); + } + v->depth--; + } + } +} + +/* Добавить элемент в конец вектора (копированием) */ +void vectorPushback(vector *v, void *elem, int elemSize) { + if (v->size == v->capacity) { + v->capacity *= 2; + v->data = realloc(v->data, v->capacity * sizeof(void *)); + } + void *tmp = malloc(sizeof(char) * elemSize); + memcpy(tmp, elem, elemSize); + v->data[v->size++] = tmp; +} + +/* Извлечь элемент из конца вектора */ +void vectorPopback(vector *v) { + if (v->size != 0) { + free(v->data[v->size - 1]); + v->size--; + } +} + +/* Очистить вектор */ +void vectorClear(vector *v) { + delVector(v); + v->size = 0; + v->capacity = 4; + v->depth = 1; + v->data = malloc(v->capacity * sizeof(void *)); +} + +/* Получить размер вектора */ +int vectorSize(vector *v) { + return v->size; +} + +/* Получить последний элемент вектора */ +void *vectorBack(vector *v) { + int n = v->size; + return n > 0 ? v->data[n - 1] : NULL; +} + +/* Получить первый элемент вектора */ +void *vectorFront(vector *v) { + return v->size > 0 ? v->data[0] : NULL; +} + +/* Получить элемент вектора по индексу pos */ +void *vectorAt(vector *v, int pos) { + if (pos < 0 || pos >= v->size) { + printf("vectorAt: out of range\n"); + return NULL; + } + return v->data[pos]; +} + +/* Установить элемент вектора по индексу pos */ +void vectorSet(vector *v, int pos, void *elem, int elemSize) { + if (pos < 0 || pos >= v->size) { + printf("vectorSet: out of range\n"); + return; + } + free(v->data[pos]); + void *tmp = malloc(sizeof(char) * elemSize); + memcpy(tmp, elem, elemSize); + v->data[pos] = tmp; +} + +/* Расширение вектора */ +void vectorExpand(vector *v) { + v->capacity *= 2; + v->data = realloc(v->data, v->capacity * sizeof(void *)); +} + +/* Сжатие вектора */ +void vectorShrink(vector *v) { + v->capacity /= 2; + v->data = realloc(v->data, v->capacity * sizeof(void *)); +} + +/* Вставить элемент по индексу pos в вектор */ +void vectorInsert(vector *v, int pos, void *elem, int elemSize) { + if (v->size == v->capacity) { + vectorExpand(v); + } + for (int j = v->size; j > pos; j--) { + v->data[j] = v->data[j - 1]; + } + void *tmp = malloc(sizeof(char) * elemSize); + memcpy(tmp, elem, elemSize); + v->data[pos] = tmp; + v->size++; +} + +/* Удалить элемент вектора по индексу pos */ +void vectorErase(vector *v, int pos) { + if (v->size != 0) { + free(v->data[pos]); + for (int j = pos; j < v->size - 1; j++) { + v->data[j] = v->data[j + 1]; + } + v->size--; + } +} + +/* Обмен элементов вектора */ +void vectorSwap(vector *v, int i, int j) { + void *tmp = v->data[i]; + v->data[i] = v->data[j]; + v->data[j] = tmp; +} + +/* Пуст ли вектор */ +bool vectorEmpty(vector *v) { + return v->size == 0; +} + +/* Заполнен ли вектор */ +bool vectorFull(vector *v) { + return v->size == v->capacity; +} + +/* Равны ли векторы */ +bool vectorEqual(vector *v1, vector *v2) { + if (v1->size != v2->size) { + printf("size not equal\n"); + return false; + } + for (int i = 0; i < v1->size; i++) { + void *a = v1->data[i]; + void *b = v2->data[i]; + if (memcmp(a, b, sizeof(a)) != 0) { + printf("data %d not equal\n", i); + return false; + } + } + return true; +} + +/* Отсортировать содержимое вектора */ +void vectorSort(vector *v, int (*cmp)(const void *, const void *)) { + qsort(v->data, v->size, sizeof(void *), cmp); +} + +/* Функция печати: нужно передать функцию для вывода значения переменной */ +/* В настоящее время поддерживается только вывод vector глубины 1 */ +void printVector(vector *v, void (*printFunc)(vector *v, void *p)) { + if (v) { + if (v->depth == 0) { + return; + } else if (v->depth == 1) { + if(v->size == 0) { + printf("\n"); + return; + } + for (int i = 0; i < v->size; i++) { + if (i == 0) { + printf("["); + } else if (i == v->size - 1) { + printFunc(v, v->data[i]); + printf("]\r\n"); + break; + } + printFunc(v, v->data[i]); + printf(","); + } + } else { + for (int i = 0; i < v->size; i++) { + printVector(v->data[i], printFunc); + } + v->depth--; + } + } +} + +/* В настоящее время поддерживается только вывод vector глубины 2 */ +void printVectorMatrix(vector *vv, void (*printFunc)(vector *v, void *p)) { + printf("[\n"); + for (int i = 0; i < vv->size; i++) { + vector *v = (vector *)vv->data[i]; + printf(" ["); + for (int j = 0; j < v->size; j++) { + printFunc(v, v->data[j]); + if (j != v->size - 1) + printf(","); + } + printf("],"); + printf("\n"); + } + printf("]\n"); +} + +#ifdef __cplusplus +} +#endif + +#endif // VECTOR_H diff --git a/ru/codes/c/utils/vertex.h b/ru/codes/c/utils/vertex.h new file mode 100644 index 000000000..28ca1f2a8 --- /dev/null +++ b/ru/codes/c/utils/vertex.h @@ -0,0 +1,49 @@ +/** + * File: vertex.h + * Created Time: 2023-10-28 + * Author: krahets (krahets@163.com) + */ + +#ifndef VERTEX_H +#define VERTEX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Структура вершины */ +typedef struct { + int val; +} Vertex; + +/* Конструктор, инициализирующий новый узел */ +Vertex *newVertex(int val) { + Vertex *vet; + vet = (Vertex *)malloc(sizeof(Vertex)); + vet->val = val; + return vet; +} + +/* Преобразовать массив значений в массив вершин */ +Vertex **valsToVets(int *vals, int size) { + Vertex **vertices = (Vertex **)malloc(size * sizeof(Vertex *)); + for (int i = 0; i < size; ++i) { + vertices[i] = newVertex(vals[i]); + } + return vertices; +} + +/* Преобразовать массив вершин в массив значений */ +int *vetsToVals(Vertex **vertices, int size) { + int *vals = (int *)malloc(size * sizeof(int)); + for (int i = 0; i < size; ++i) { + vals[i] = vertices[i]->val; + } + return vals; +} + +#ifdef __cplusplus +} +#endif + +#endif // VERTEX_H diff --git a/ru/codes/cpp/.gitignore b/ru/codes/cpp/.gitignore new file mode 100644 index 000000000..dc1ffacf4 --- /dev/null +++ b/ru/codes/cpp/.gitignore @@ -0,0 +1,10 @@ +# Ignore all +* +# Unignore all with extensions +!*.* +# Unignore all dirs +!*/ + +*.dSYM/ + +build/ diff --git a/ru/codes/cpp/CMakeLists.txt b/ru/codes/cpp/CMakeLists.txt new file mode 100644 index 000000000..1e80bc4d7 --- /dev/null +++ b/ru/codes/cpp/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 3.10) +project(hello_algo CXX) + +set(CMAKE_CXX_STANDARD 11) + +include_directories(./include) + +add_subdirectory(chapter_computational_complexity) +add_subdirectory(chapter_array_and_linkedlist) +add_subdirectory(chapter_stack_and_queue) +add_subdirectory(chapter_hashing) +add_subdirectory(chapter_tree) +add_subdirectory(chapter_heap) +add_subdirectory(chapter_graph) +add_subdirectory(chapter_searching) +add_subdirectory(chapter_sorting) +add_subdirectory(chapter_divide_and_conquer) +add_subdirectory(chapter_backtracking) +add_subdirectory(chapter_dynamic_programming) +add_subdirectory(chapter_greedy) diff --git a/ru/codes/cpp/chapter_array_and_linkedlist/CMakeLists.txt b/ru/codes/cpp/chapter_array_and_linkedlist/CMakeLists.txt new file mode 100644 index 000000000..2e933e016 --- /dev/null +++ b/ru/codes/cpp/chapter_array_and_linkedlist/CMakeLists.txt @@ -0,0 +1,4 @@ +add_executable(array array.cpp) +add_executable(linked_list linked_list.cpp) +add_executable(list list.cpp) +add_executable(my_list my_list.cpp) diff --git a/ru/codes/cpp/chapter_array_and_linkedlist/array.cpp b/ru/codes/cpp/chapter_array_and_linkedlist/array.cpp new file mode 100644 index 000000000..50ca477c8 --- /dev/null +++ b/ru/codes/cpp/chapter_array_and_linkedlist/array.cpp @@ -0,0 +1,113 @@ +/** + * File: array.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Случайный доступ к элементу */ +int randomAccess(int *nums, int size) { + // Случайным образом выбрать число из интервала [0, size) + int randomIndex = rand() % size; + // Получить и вернуть случайный элемент + int randomNum = nums[randomIndex]; + return randomNum; +} + +/* Увеличить длину массива */ +int *extend(int *nums, int size, int enlarge) { + // Инициализировать массив увеличенной длины + int *res = new int[size + enlarge]; + // Скопировать все элементы исходного массива в новый массив + for (int i = 0; i < size; i++) { + res[i] = nums[i]; + } + // Освободить память + delete[] nums; + // Вернуть новый массив после расширения + return res; +} + +/* Вставить элемент num по индексу index в массив */ +void insert(int *nums, int size, int num, int index) { + // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад + for (int i = size - 1; i > index; i--) { + nums[i] = nums[i - 1]; + } + // Присвоить num элементу по индексу index + nums[index] = num; +} + +/* Удалить элемент по индексу index */ +void remove(int *nums, int size, int index) { + // Сдвинуть все элементы после индекса index на одну позицию вперед + for (int i = index; i < size - 1; i++) { + nums[i] = nums[i + 1]; + } +} + +/* Обход массива */ +void traverse(int *nums, int size) { + int count = 0; + // Обход массива по индексам + for (int i = 0; i < size; i++) { + count += nums[i]; + } +} + +/* Найти заданный элемент в массиве */ +int find(int *nums, int size, int target) { + for (int i = 0; i < size; i++) { + if (nums[i] == target) + return i; + } + return -1; +} + +/* Driver Code */ +int main() { + /* Инициализация массива */ + int size = 5; + int *arr = new int[size]; + cout << "Массив arr = "; + printArray(arr, size); + + int *nums = new int[size]{1, 3, 2, 5, 4}; + cout << "Массив nums = "; + printArray(nums, size); + + /* Случайный доступ */ + int randomNum = randomAccess(nums, size); + cout << "Случайный элемент из nums = " << randomNum << endl; + + /* Расширение длины */ + int enlarge = 3; + nums = extend(nums, size, enlarge); + size += enlarge; + cout << "После увеличения длины массива до 8 nums = "; + printArray(nums, size); + + /* Вставка элемента */ + insert(nums, size, 6, 3); + cout << "После вставки числа 6 по индексу 3 nums = "; + printArray(nums, size); + + /* Удаление элемента */ + remove(nums, size, 2); + cout << "После удаления элемента по индексу 2 nums = "; + printArray(nums, size); + + /* Обход массива */ + traverse(nums, size); + + /* Поиск элемента */ + int index = find(nums, size, 3); + cout << "Индекс элемента 3 в nums = " << index << endl; + + // Освободить память + delete[] arr; + delete[] nums; + + return 0; +} diff --git a/ru/codes/cpp/chapter_array_and_linkedlist/linked_list.cpp b/ru/codes/cpp/chapter_array_and_linkedlist/linked_list.cpp new file mode 100644 index 000000000..f0f52242a --- /dev/null +++ b/ru/codes/cpp/chapter_array_and_linkedlist/linked_list.cpp @@ -0,0 +1,89 @@ +/** + * File: linked_list.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Вставить узел P после узла n0 в связном списке */ +void insert(ListNode *n0, ListNode *P) { + ListNode *n1 = n0->next; + P->next = n1; + n0->next = P; +} + +/* Удалить первый узел после узла n0 в связном списке */ +void remove(ListNode *n0) { + if (n0->next == nullptr) + return; + // n0 -> P -> n1 + ListNode *P = n0->next; + ListNode *n1 = P->next; + n0->next = n1; + // Освободить память + delete P; +} + +/* Доступ к узлу связного списка по индексу index */ +ListNode *access(ListNode *head, int index) { + for (int i = 0; i < index; i++) { + if (head == nullptr) + return nullptr; + head = head->next; + } + return head; +} + +/* Найти в связном списке первый узел со значением target */ +int find(ListNode *head, int target) { + int index = 0; + while (head != nullptr) { + if (head->val == target) + return index; + head = head->next; + index++; + } + return -1; +} + +/* Driver Code */ +int main() { + /* Инициализация связного списка */ + // Инициализация всех узлов + ListNode *n0 = new ListNode(1); + ListNode *n1 = new ListNode(3); + ListNode *n2 = new ListNode(2); + ListNode *n3 = new ListNode(5); + ListNode *n4 = new ListNode(4); + // Построить ссылки между узлами + n0->next = n1; + n1->next = n2; + n2->next = n3; + n3->next = n4; + cout << "Инициализированный связный список" << endl; + printLinkedList(n0); + + /* Вставка узла */ + insert(n0, new ListNode(0)); + cout << "Связный список после вставки узла" << endl; + printLinkedList(n0); + + /* Удаление узла */ + remove(n0); + cout << "Связный список после удаления узла" << endl; + printLinkedList(n0); + + /* Доступ к узлу */ + ListNode *node = access(n0, 3); + cout << "Значение узла по индексу 3 в связном списке = " << node->val << endl; + + /* Поиск узла */ + int index = find(n0, 2); + cout << "Индекс узла со значением 2 в связном списке = " << index << endl; + + // Освободить память + freeMemoryLinkedList(n0); + + return 0; +} diff --git a/ru/codes/cpp/chapter_array_and_linkedlist/list.cpp b/ru/codes/cpp/chapter_array_and_linkedlist/list.cpp new file mode 100644 index 000000000..04c7956eb --- /dev/null +++ b/ru/codes/cpp/chapter_array_and_linkedlist/list.cpp @@ -0,0 +1,72 @@ +/** + * File: list.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Driver Code */ +int main() { + /* Инициализация списка */ + vector nums = {1, 3, 2, 5, 4}; + cout << "Список nums = "; + printVector(nums); + + /* Доступ к элементу */ + int num = nums[1]; + cout << "Элемент по индексу 1: num = " << num << endl; + + /* Обновление элемента */ + nums[1] = 0; + cout << "После обновления элемента по индексу 1 на 0 nums = "; + printVector(nums); + + /* Очистить список */ + nums.clear(); + cout << "После очистки списка nums = "; + printVector(nums); + + /* Добавление элемента в конец */ + nums.push_back(1); + nums.push_back(3); + nums.push_back(2); + nums.push_back(5); + nums.push_back(4); + cout << "После добавления элемента nums = "; + printVector(nums); + + /* Вставка элемента в середину */ + nums.insert(nums.begin() + 3, 6); + cout << "После вставки числа 6 по индексу 3 nums = "; + printVector(nums); + + /* Удаление элемента */ + nums.erase(nums.begin() + 3); + cout << "После удаления элемента по индексу 3 nums = "; + printVector(nums); + + /* Обходить список по индексам */ + int count = 0; + for (int i = 0; i < nums.size(); i++) { + count += nums[i]; + } + /* Непосредственно обходить элементы списка */ + count = 0; + for (int x : nums) { + count += x; + } + + /* Объединить два списка */ + vector nums1 = {6, 8, 7, 10, 9}; + nums.insert(nums.end(), nums1.begin(), nums1.end()); + cout << "После присоединения списка nums1 к nums nums = "; + printVector(nums); + + /* Отсортировать список */ + sort(nums.begin(), nums.end()); + cout << "После сортировки списка nums = "; + printVector(nums); + + return 0; +} diff --git a/ru/codes/cpp/chapter_array_and_linkedlist/my_list.cpp b/ru/codes/cpp/chapter_array_and_linkedlist/my_list.cpp new file mode 100644 index 000000000..4ced0b491 --- /dev/null +++ b/ru/codes/cpp/chapter_array_and_linkedlist/my_list.cpp @@ -0,0 +1,171 @@ +/** + * File: my_list.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Класс списка */ +class MyList { + private: + int *arr; // Массив (для хранения элементов списка) + int arrCapacity = 10; // Вместимость списка + int arrSize = 0; // Длина списка (текущее число элементов) + int extendRatio = 2; // Коэффициент увеличения списка при каждом расширении + + public: + /* Конструктор */ + MyList() { + arr = new int[arrCapacity]; + } + + /* Метод-деструктор */ + ~MyList() { + delete[] arr; + } + + /* Получить длину списка (текущее число элементов) */ + int size() { + return arrSize; + } + + /* Получить вместимость списка */ + int capacity() { + return arrCapacity; + } + + /* Доступ к элементу */ + int get(int index) { + // Если индекс выходит за границы, выбрасывается исключение; далее аналогично + if (index < 0 || index >= size()) + throw out_of_range("индекс выходит за границы"); + return arr[index]; + } + + /* Обновление элемента */ + void set(int index, int num) { + if (index < 0 || index >= size()) + throw out_of_range("индекс выходит за границы"); + arr[index] = num; + } + + /* Добавление элемента в конец */ + void add(int num) { + // При превышении вместимости по числу элементов запускается расширение + if (size() == capacity()) + extendCapacity(); + arr[size()] = num; + // Обновить число элементов + arrSize++; + } + + /* Вставка элемента в середину */ + void insert(int index, int num) { + if (index < 0 || index >= size()) + throw out_of_range("индекс выходит за границы"); + // При превышении вместимости по числу элементов запускается расширение + if (size() == capacity()) + extendCapacity(); + // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад + for (int j = size() - 1; j >= index; j--) { + arr[j + 1] = arr[j]; + } + arr[index] = num; + // Обновить число элементов + arrSize++; + } + + /* Удаление элемента */ + int remove(int index) { + if (index < 0 || index >= size()) + throw out_of_range("индекс выходит за границы"); + int num = arr[index]; + // Сдвинуть все элементы после индекса index на одну позицию вперед + for (int j = index; j < size() - 1; j++) { + arr[j] = arr[j + 1]; + } + // Обновить число элементов + arrSize--; + // Вернуть удаленный элемент + return num; + } + + /* Расширение списка */ + void extendCapacity() { + // Создать новый массив длиной в extendRatio раз больше исходного массива + int newCapacity = capacity() * extendRatio; + int *tmp = arr; + arr = new int[newCapacity]; + // Скопировать все элементы исходного массива в новый массив + for (int i = 0; i < size(); i++) { + arr[i] = tmp[i]; + } + // Освободить память + delete[] tmp; + arrCapacity = newCapacity; + } + + /* Преобразовать список в Vector для вывода */ + vector toVector() { + // Преобразовывать только элементы списка в пределах фактической длины + vector vec(size()); + for (int i = 0; i < size(); i++) { + vec[i] = arr[i]; + } + return vec; + } +}; + +/* Driver Code */ +int main() { + /* Инициализация списка */ + MyList *nums = new MyList(); + /* Добавление элемента в конец */ + nums->add(1); + nums->add(3); + nums->add(2); + nums->add(5); + nums->add(4); + cout << "Список nums = "; + vector vec = nums->toVector(); + printVector(vec); + cout << "Вместимость = " << nums->capacity() << ", длина = " << nums->size() << endl; + + /* Вставка элемента в середину */ + nums->insert(3, 6); + cout << "После вставки числа 6 по индексу 3 nums = "; + vec = nums->toVector(); + printVector(vec); + + /* Удаление элемента */ + nums->remove(3); + cout << "После удаления элемента по индексу 3 nums = "; + vec = nums->toVector(); + printVector(vec); + + /* Доступ к элементу */ + int num = nums->get(1); + cout << "Элемент по индексу 1: num = " << num << endl; + + /* Обновление элемента */ + nums->set(1, 0); + cout << "После обновления элемента по индексу 1 на 0 nums = "; + vec = nums->toVector(); + printVector(vec); + + /* Проверка механизма расширения */ + for (int i = 0; i < 10; i++) { + // При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения + nums->add(i); + } + cout << "После расширения список nums = "; + vec = nums->toVector(); + printVector(vec); + cout << "Вместимость = " << nums->capacity() << ", длина = " << nums->size() << endl; + + // Освободить память + delete nums; + + return 0; +} diff --git a/ru/codes/cpp/chapter_backtracking/CMakeLists.txt b/ru/codes/cpp/chapter_backtracking/CMakeLists.txt new file mode 100644 index 000000000..6c271e330 --- /dev/null +++ b/ru/codes/cpp/chapter_backtracking/CMakeLists.txt @@ -0,0 +1,10 @@ +add_executable(preorder_traversal_i_compact preorder_traversal_i_compact.cpp) +add_executable(preorder_traversal_ii_compact preorder_traversal_ii_compact.cpp) +add_executable(preorder_traversal_iii_compact preorder_traversal_iii_compact.cpp) +add_executable(preorder_traversal_iii_template preorder_traversal_iii_template.cpp) +add_executable(permutations_i permutations_i.cpp) +add_executable(permutations_ii permutations_ii.cpp) +add_executable(n_queens n_queens.cpp) +add_executable(subset_sum_i_naive subset_sum_i_naive.cpp) +add_executable(subset_sum_i subset_sum_i.cpp) +add_executable(subset_sum_ii subset_sum_ii.cpp) diff --git a/ru/codes/cpp/chapter_backtracking/n_queens.cpp b/ru/codes/cpp/chapter_backtracking/n_queens.cpp new file mode 100644 index 000000000..d40a8714f --- /dev/null +++ b/ru/codes/cpp/chapter_backtracking/n_queens.cpp @@ -0,0 +1,65 @@ +/** + * File: n_queens.cpp + * Created Time: 2023-05-04 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Алгоритм бэктрекинга: n ферзей */ +void backtrack(int row, int n, vector> &state, vector>> &res, vector &cols, + vector &diags1, vector &diags2) { + // Когда все строки уже обработаны, записать решение + if (row == n) { + res.push_back(state); + return; + } + // Обойти все столбцы + for (int col = 0; col < n; col++) { + // Вычислить главную и побочную диагонали, соответствующие этой клетке + int diag1 = row - col + n - 1; + int diag2 = row + col; + // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей + if (!cols[col] && !diags1[diag1] && !diags2[diag2]) { + // Попытка: поставить ферзя в эту клетку + state[row][col] = "Q"; + cols[col] = diags1[diag1] = diags2[diag2] = true; + // Перейти к размещению следующей строки + backtrack(row + 1, n, state, res, cols, diags1, diags2); + // Откат: восстановить эту клетку как пустую + state[row][col] = "#"; + cols[col] = diags1[diag1] = diags2[diag2] = false; + } + } +} + +/* Решить задачу о n ферзях */ +vector>> nQueens(int n) { + // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку + vector> state(n, vector(n, "#")); + vector cols(n, false); // Отмечать, есть ли ферзь в столбце + vector diags1(2 * n - 1, false); // Отмечать наличие ферзя на главной диагонали + vector diags2(2 * n - 1, false); // Отмечать наличие ферзя на побочной диагонали + vector>> res; + + backtrack(0, n, state, res, cols, diags1, diags2); + + return res; +} + +/* Driver Code */ +int main() { + int n = 4; + vector>> res = nQueens(n); + + cout << "Размер входной доски = " << n << endl; + cout << "Количество способов расстановки ферзей: " << res.size() << endl; + for (const vector> &state : res) { + cout << "--------------------" << endl; + for (const vector &row : state) { + printVector(row); + } + } + + return 0; +} diff --git a/ru/codes/cpp/chapter_backtracking/permutations_i.cpp b/ru/codes/cpp/chapter_backtracking/permutations_i.cpp new file mode 100644 index 000000000..64b77a5f0 --- /dev/null +++ b/ru/codes/cpp/chapter_backtracking/permutations_i.cpp @@ -0,0 +1,54 @@ +/** + * File: permutations_i.cpp + * Created Time: 2023-04-24 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Алгоритм бэктрекинга: все перестановки I */ +void backtrack(vector &state, const vector &choices, vector &selected, vector> &res) { + // Когда длина состояния равна числу элементов, записать решение + if (state.size() == choices.size()) { + res.push_back(state); + return; + } + // Перебор всех вариантов выбора + for (int i = 0; i < choices.size(); i++) { + int choice = choices[i]; + // Отсечение: нельзя выбирать один и тот же элемент повторно + if (!selected[i]) { + // Попытка: сделать выбор и обновить состояние + selected[i] = true; + state.push_back(choice); + // Перейти к следующему выбору + backtrack(state, choices, selected, res); + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false; + state.pop_back(); + } + } +} + +/* Все перестановки I */ +vector> permutationsI(vector nums) { + vector state; + vector selected(nums.size(), false); + vector> res; + backtrack(state, nums, selected, res); + return res; +} + +/* Driver Code */ +int main() { + vector nums = {1, 2, 3}; + + vector> res = permutationsI(nums); + + cout << "Входной массив nums = "; + printVector(nums); + cout << "Все перестановки res = "; + printVectorMatrix(res); + + return 0; +} diff --git a/ru/codes/cpp/chapter_backtracking/permutations_ii.cpp b/ru/codes/cpp/chapter_backtracking/permutations_ii.cpp new file mode 100644 index 000000000..d52b6ed47 --- /dev/null +++ b/ru/codes/cpp/chapter_backtracking/permutations_ii.cpp @@ -0,0 +1,56 @@ +/** + * File: permutations_ii.cpp + * Created Time: 2023-04-24 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Алгоритм бэктрекинга: все перестановки II */ +void backtrack(vector &state, const vector &choices, vector &selected, vector> &res) { + // Когда длина состояния равна числу элементов, записать решение + if (state.size() == choices.size()) { + res.push_back(state); + return; + } + // Перебор всех вариантов выбора + unordered_set duplicated; + for (int i = 0; i < choices.size(); i++) { + int choice = choices[i]; + // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы + if (!selected[i] && duplicated.find(choice) == duplicated.end()) { + // Попытка: сделать выбор и обновить состояние + duplicated.emplace(choice); // Записать значения уже выбранных элементов + selected[i] = true; + state.push_back(choice); + // Перейти к следующему выбору + backtrack(state, choices, selected, res); + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false; + state.pop_back(); + } + } +} + +/* Все перестановки II */ +vector> permutationsII(vector nums) { + vector state; + vector selected(nums.size(), false); + vector> res; + backtrack(state, nums, selected, res); + return res; +} + +/* Driver Code */ +int main() { + vector nums = {1, 1, 2}; + + vector> res = permutationsII(nums); + + cout << "Входной массив nums = "; + printVector(nums); + cout << "Все перестановки res = "; + printVectorMatrix(res); + + return 0; +} diff --git a/ru/codes/cpp/chapter_backtracking/preorder_traversal_i_compact.cpp b/ru/codes/cpp/chapter_backtracking/preorder_traversal_i_compact.cpp new file mode 100644 index 000000000..0e92e7253 --- /dev/null +++ b/ru/codes/cpp/chapter_backtracking/preorder_traversal_i_compact.cpp @@ -0,0 +1,39 @@ +/** + * File: preorder_traversal_i_compact.cpp + * Created Time: 2023-04-16 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +vector res; + +/* Предварительный обход: пример 1 */ +void preOrder(TreeNode *root) { + if (root == nullptr) { + return; + } + if (root->val == 7) { + // Записать решение + res.push_back(root); + } + preOrder(root->left); + preOrder(root->right); +} + +/* Driver Code */ +int main() { + TreeNode *root = vectorToTree(vector{1, 7, 3, 4, 5, 6, 7}); + cout << "\nИнициализация двоичного дерева" << endl; + printTree(root); + + // Предварительный обход + preOrder(root); + + cout << "\nВывести все узлы со значением 7" << endl; + vector vals; + for (TreeNode *node : res) { + vals.push_back(node->val); + } + printVector(vals); +} diff --git a/ru/codes/cpp/chapter_backtracking/preorder_traversal_ii_compact.cpp b/ru/codes/cpp/chapter_backtracking/preorder_traversal_ii_compact.cpp new file mode 100644 index 000000000..12ccd265e --- /dev/null +++ b/ru/codes/cpp/chapter_backtracking/preorder_traversal_ii_compact.cpp @@ -0,0 +1,46 @@ +/** + * File: preorder_traversal_ii_compact.cpp + * Created Time: 2023-04-16 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +vector path; +vector> res; + +/* Предварительный обход: пример 2 */ +void preOrder(TreeNode *root) { + if (root == nullptr) { + return; + } + // Попытка + path.push_back(root); + if (root->val == 7) { + // Записать решение + res.push_back(path); + } + preOrder(root->left); + preOrder(root->right); + // Откат + path.pop_back(); +} + +/* Driver Code */ +int main() { + TreeNode *root = vectorToTree(vector{1, 7, 3, 4, 5, 6, 7}); + cout << "\nИнициализация двоичного дерева" << endl; + printTree(root); + + // Предварительный обход + preOrder(root); + + cout << "\nВывести все пути от корня к узлу 7" << endl; + for (vector &path : res) { + vector vals; + for (TreeNode *node : path) { + vals.push_back(node->val); + } + printVector(vals); + } +} diff --git a/ru/codes/cpp/chapter_backtracking/preorder_traversal_iii_compact.cpp b/ru/codes/cpp/chapter_backtracking/preorder_traversal_iii_compact.cpp new file mode 100644 index 000000000..09e95ec7f --- /dev/null +++ b/ru/codes/cpp/chapter_backtracking/preorder_traversal_iii_compact.cpp @@ -0,0 +1,47 @@ +/** + * File: preorder_traversal_iii_compact.cpp + * Created Time: 2023-04-16 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +vector path; +vector> res; + +/* Предварительный обход: пример 3 */ +void preOrder(TreeNode *root) { + // Отсечение + if (root == nullptr || root->val == 3) { + return; + } + // Попытка + path.push_back(root); + if (root->val == 7) { + // Записать решение + res.push_back(path); + } + preOrder(root->left); + preOrder(root->right); + // Откат + path.pop_back(); +} + +/* Driver Code */ +int main() { + TreeNode *root = vectorToTree(vector{1, 7, 3, 4, 5, 6, 7}); + cout << "\nИнициализация двоичного дерева" << endl; + printTree(root); + + // Предварительный обход + preOrder(root); + + cout << "\nВывести все пути от корня к узлу 7, не содержащие узлов со значением 3" << endl; + for (vector &path : res) { + vector vals; + for (TreeNode *node : path) { + vals.push_back(node->val); + } + printVector(vals); + } +} diff --git a/ru/codes/cpp/chapter_backtracking/preorder_traversal_iii_template.cpp b/ru/codes/cpp/chapter_backtracking/preorder_traversal_iii_template.cpp new file mode 100644 index 000000000..081c475b9 --- /dev/null +++ b/ru/codes/cpp/chapter_backtracking/preorder_traversal_iii_template.cpp @@ -0,0 +1,76 @@ +/** + * File: preorder_traversal_iii_template.cpp + * Created Time: 2023-04-16 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Проверить, является ли текущее состояние решением */ +bool isSolution(vector &state) { + return !state.empty() && state.back()->val == 7; +} + +/* Записать решение */ +void recordSolution(vector &state, vector> &res) { + res.push_back(state); +} + +/* Проверить, допустим ли этот выбор в текущем состоянии */ +bool isValid(vector &state, TreeNode *choice) { + return choice != nullptr && choice->val != 3; +} + +/* Обновить состояние */ +void makeChoice(vector &state, TreeNode *choice) { + state.push_back(choice); +} + +/* Восстановить состояние */ +void undoChoice(vector &state, TreeNode *choice) { + state.pop_back(); +} + +/* Алгоритм бэктрекинга: пример 3 */ +void backtrack(vector &state, vector &choices, vector> &res) { + // Проверить, является ли текущее состояние решением + if (isSolution(state)) { + // Записать решение + recordSolution(state, res); + } + // Перебор всех вариантов выбора + for (TreeNode *choice : choices) { + // Отсечение: проверить допустимость выбора + if (isValid(state, choice)) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state, choice); + // Перейти к следующему выбору + vector nextChoices{choice->left, choice->right}; + backtrack(state, nextChoices, res); + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state, choice); + } + } +} + +/* Driver Code */ +int main() { + TreeNode *root = vectorToTree(vector{1, 7, 3, 4, 5, 6, 7}); + cout << "\nИнициализация двоичного дерева" << endl; + printTree(root); + + // Алгоритм бэктрекинга + vector state; + vector choices = {root}; + vector> res; + backtrack(state, choices, res); + + cout << "\nВывести все пути от корня к узлу 7, не содержащие узлов со значением 3" << endl; + for (vector &path : res) { + vector vals; + for (TreeNode *node : path) { + vals.push_back(node->val); + } + printVector(vals); + } +} diff --git a/ru/codes/cpp/chapter_backtracking/subset_sum_i.cpp b/ru/codes/cpp/chapter_backtracking/subset_sum_i.cpp new file mode 100644 index 000000000..df3d2e91b --- /dev/null +++ b/ru/codes/cpp/chapter_backtracking/subset_sum_i.cpp @@ -0,0 +1,57 @@ +/** + * File: subset_sum_i.cpp + * Created Time: 2023-06-21 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +void backtrack(vector &state, int target, vector &choices, int start, vector> &res) { + // Если сумма подмножества равна target, записать решение + if (target == 0) { + res.push_back(state); + return; + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + for (int i = start; i < choices.size(); i++) { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if (target - choices[i] < 0) { + break; + } + // Попытка: сделать выбор и обновить target и start + state.push_back(choices[i]); + // Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.pop_back(); + } +} + +/* Решить задачу суммы подмножеств I */ +vector> subsetSumI(vector &nums, int target) { + vector state; // Состояние (подмножество) + sort(nums.begin(), nums.end()); // Отсортировать nums + int start = 0; // Стартовая вершина обхода + vector> res; // Список результатов (список подмножеств) + backtrack(state, target, nums, start, res); + return res; +} + +/* Driver Code */ +int main() { + vector nums = {3, 4, 5}; + int target = 9; + + vector> res = subsetSumI(nums, target); + + cout << "Входной массив nums = "; + printVector(nums); + cout << "target = " << target << endl; + cout << "Все подмножества с суммой " << target << ": " << endl; + printVectorMatrix(res); + + return 0; +} diff --git a/ru/codes/cpp/chapter_backtracking/subset_sum_i_naive.cpp b/ru/codes/cpp/chapter_backtracking/subset_sum_i_naive.cpp new file mode 100644 index 000000000..2cf0b98aa --- /dev/null +++ b/ru/codes/cpp/chapter_backtracking/subset_sum_i_naive.cpp @@ -0,0 +1,54 @@ +/** + * File: subset_sum_i_naive.cpp + * Created Time: 2023-06-21 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +void backtrack(vector &state, int target, int total, vector &choices, vector> &res) { + // Если сумма подмножества равна target, записать решение + if (total == target) { + res.push_back(state); + return; + } + // Перебор всех вариантов выбора + for (size_t i = 0; i < choices.size(); i++) { + // Отсечение: если сумма подмножества превышает target, пропустить этот выбор + if (total + choices[i] > target) { + continue; + } + // Попытка: сделать выбор и обновить элемент и total + state.push_back(choices[i]); + // Перейти к следующему выбору + backtrack(state, target, total + choices[i], choices, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.pop_back(); + } +} + +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */ +vector> subsetSumINaive(vector &nums, int target) { + vector state; // Состояние (подмножество) + int total = 0; // Сумма подмножеств + vector> res; // Список результатов (список подмножеств) + backtrack(state, target, total, nums, res); + return res; +} + +/* Driver Code */ +int main() { + vector nums = {3, 4, 5}; + int target = 9; + + vector> res = subsetSumINaive(nums, target); + + cout << "Входной массив nums = "; + printVector(nums); + cout << "target = " << target << endl; + cout << "Все подмножества с суммой " << target << ": " << endl; + printVectorMatrix(res); + + return 0; +} diff --git a/ru/codes/cpp/chapter_backtracking/subset_sum_ii.cpp b/ru/codes/cpp/chapter_backtracking/subset_sum_ii.cpp new file mode 100644 index 000000000..20af16c3e --- /dev/null +++ b/ru/codes/cpp/chapter_backtracking/subset_sum_ii.cpp @@ -0,0 +1,62 @@ +/** + * File: subset_sum_ii.cpp + * Created Time: 2023-06-21 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Алгоритм бэктрекинга: сумма подмножеств II */ +void backtrack(vector &state, int target, vector &choices, int start, vector> &res) { + // Если сумма подмножества равна target, записать решение + if (target == 0) { + res.push_back(state); + return; + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента + for (int i = start; i < choices.size(); i++) { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if (target - choices[i] < 0) { + break; + } + // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить + if (i > start && choices[i] == choices[i - 1]) { + continue; + } + // Попытка: сделать выбор и обновить target и start + state.push_back(choices[i]); + // Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i + 1, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.pop_back(); + } +} + +/* Решить задачу суммы подмножеств II */ +vector> subsetSumII(vector &nums, int target) { + vector state; // Состояние (подмножество) + sort(nums.begin(), nums.end()); // Отсортировать nums + int start = 0; // Стартовая вершина обхода + vector> res; // Список результатов (список подмножеств) + backtrack(state, target, nums, start, res); + return res; +} + +/* Driver Code */ +int main() { + vector nums = {4, 4, 5}; + int target = 9; + + vector> res = subsetSumII(nums, target); + + cout << "Входной массив nums = "; + printVector(nums); + cout << "target = " << target << endl; + cout << "Все подмножества с суммой " << target << ": " << endl; + printVectorMatrix(res); + + return 0; +} diff --git a/ru/codes/cpp/chapter_computational_complexity/CMakeLists.txt b/ru/codes/cpp/chapter_computational_complexity/CMakeLists.txt new file mode 100644 index 000000000..ea2845b75 --- /dev/null +++ b/ru/codes/cpp/chapter_computational_complexity/CMakeLists.txt @@ -0,0 +1,5 @@ +add_executable(iteration iteration.cpp) +add_executable(recursion recursion.cpp) +add_executable(space_complexity space_complexity.cpp) +add_executable(time_complexity time_complexity.cpp) +add_executable(worst_best_time_complexity worst_best_time_complexity.cpp) \ No newline at end of file diff --git a/ru/codes/cpp/chapter_computational_complexity/iteration.cpp b/ru/codes/cpp/chapter_computational_complexity/iteration.cpp new file mode 100644 index 000000000..9f3b0296a --- /dev/null +++ b/ru/codes/cpp/chapter_computational_complexity/iteration.cpp @@ -0,0 +1,76 @@ +/** + * File: iteration.cpp + * Created Time: 2023-08-24 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Цикл for */ +int forLoop(int n) { + int res = 0; + // Циклическое суммирование 1, 2, ..., n-1, n + for (int i = 1; i <= n; ++i) { + res += i; + } + return res; +} + +/* Цикл while */ +int whileLoop(int n) { + int res = 0; + int i = 1; // Инициализация условной переменной + // Циклическое суммирование 1, 2, ..., n-1, n + while (i <= n) { + res += i; + i++; // Обновить условную переменную + } + return res; +} + +/* Цикл while (двойное обновление) */ +int whileLoopII(int n) { + int res = 0; + int i = 1; // Инициализация условной переменной + // Циклическое суммирование 1, 4, 10, ... + while (i <= n) { + res += i; + // Обновить условную переменную + i++; + i *= 2; + } + return res; +} + +/* Двойной цикл for */ +string nestedForLoop(int n) { + ostringstream res; + // Цикл по i = 1, 2, ..., n-1, n + for (int i = 1; i <= n; ++i) { + // Цикл по j = 1, 2, ..., n-1, n + for (int j = 1; j <= n; ++j) { + res << "(" << i << ", " << j << "), "; + } + } + return res.str(); +} + +/* Driver Code */ +int main() { + int n = 5; + int res; + + res = forLoop(n); + cout << "\nРезультат суммирования в цикле for res = " << res << endl; + + res = whileLoop(n); + cout << "\nРезультат суммирования в цикле while res = " << res << endl; + + res = whileLoopII(n); + cout << "\nРезультат суммирования в цикле while (двойное обновление) res = " << res << endl; + + string resStr = nestedForLoop(n); + cout << "\nРезультат двойного цикла for " << resStr << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_computational_complexity/recursion.cpp b/ru/codes/cpp/chapter_computational_complexity/recursion.cpp new file mode 100644 index 000000000..e067c9061 --- /dev/null +++ b/ru/codes/cpp/chapter_computational_complexity/recursion.cpp @@ -0,0 +1,78 @@ +/** + * File: recursion.cpp + * Created Time: 2023-08-24 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Рекурсия */ +int recur(int n) { + // Условие завершения + if (n == 1) + return 1; + // Рекурсия: рекурсивный вызов + int res = recur(n - 1); + // Возврат: вернуть результат + return n + res; +} + +/* Имитация рекурсии итерацией */ +int forLoopRecur(int n) { + // Использовать явный стек для имитации системного стека вызовов + stack stack; + int res = 0; + // Рекурсия: рекурсивный вызов + for (int i = n; i > 0; i--) { + // Имитировать «рекурсию» с помощью операции помещения в стек + stack.push(i); + } + // Возврат: вернуть результат + while (!stack.empty()) { + // Имитировать «возврат» с помощью операции извлечения из стека + res += stack.top(); + stack.pop(); + } + // res = 1+2+3+...+n + return res; +} + +/* Хвостовая рекурсия */ +int tailRecur(int n, int res) { + // Условие завершения + if (n == 0) + return res; + // Хвостовой рекурсивный вызов + return tailRecur(n - 1, res + n); +} + +/* Последовательность Фибоначчи: рекурсия */ +int fib(int n) { + // Условие завершения: f(1) = 0, f(2) = 1 + if (n == 1 || n == 2) + return n - 1; + // Рекурсивный вызов f(n) = f(n-1) + f(n-2) + int res = fib(n - 1) + fib(n - 2); + // Вернуть результат f(n) + return res; +} + +/* Driver Code */ +int main() { + int n = 5; + int res; + + res = recur(n); + cout << "\nРезультат суммирования в рекурсивной функции res = " << res << endl; + + res = forLoopRecur(n); + cout << "\nРезультат суммирования с использованием итерации для имитации рекурсии res = " << res << endl; + + res = tailRecur(n, 0); + cout << "\nРезультат суммирования в хвостовой рекурсии res = " << res << endl; + + res = fib(n); + cout << "\nЭлемент последовательности Фибоначчи с индексом " << n << " = " << res << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_computational_complexity/space_complexity.cpp b/ru/codes/cpp/chapter_computational_complexity/space_complexity.cpp new file mode 100644 index 000000000..b105792d8 --- /dev/null +++ b/ru/codes/cpp/chapter_computational_complexity/space_complexity.cpp @@ -0,0 +1,107 @@ +/** + * File: space_complexity.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Функция */ +int func() { + // Выполнить некоторые операции + return 0; +} + +/* Постоянная сложность */ +void constant(int n) { + // Константы, переменные и объекты занимают O(1) памяти + const int a = 0; + int b = 0; + vector nums(10000); + ListNode node(0); + // Переменные в цикле занимают O(1) памяти + for (int i = 0; i < n; i++) { + int c = 0; + } + // Функции в цикле занимают O(1) памяти + for (int i = 0; i < n; i++) { + func(); + } +} + +/* Линейная сложность */ +void linear(int n) { + // Массив длины n занимает O(n) памяти + vector nums(n); + // Список длины n занимает O(n) памяти + vector nodes; + for (int i = 0; i < n; i++) { + nodes.push_back(ListNode(i)); + } + // Хеш-таблица длины n занимает O(n) памяти + unordered_map map; + for (int i = 0; i < n; i++) { + map[i] = to_string(i); + } +} + +/* Линейная сложность (рекурсивная реализация) */ +void linearRecur(int n) { + cout << "Рекурсия n = " << n << endl; + if (n == 1) + return; + linearRecur(n - 1); +} + +/* Квадратичная сложность */ +void quadratic(int n) { + // Двумерный список занимает O(n^2) памяти + vector> numMatrix; + for (int i = 0; i < n; i++) { + vector tmp; + for (int j = 0; j < n; j++) { + tmp.push_back(0); + } + numMatrix.push_back(tmp); + } +} + +/* Квадратичная сложность (рекурсивная реализация) */ +int quadraticRecur(int n) { + if (n <= 0) + return 0; + vector nums(n); + cout << "Рекурсия n = " << n << " , длина nums = " << nums.size() << endl; + return quadraticRecur(n - 1); +} + +/* Экспоненциальная сложность (построение полного двоичного дерева) */ +TreeNode *buildTree(int n) { + if (n == 0) + return nullptr; + TreeNode *root = new TreeNode(0); + root->left = buildTree(n - 1); + root->right = buildTree(n - 1); + return root; +} + +/* Driver Code */ +int main() { + int n = 5; + // Постоянная сложность + constant(n); + // Линейная сложность + linear(n); + linearRecur(n); + // Квадратичная сложность + quadratic(n); + quadraticRecur(n); + // Экспоненциальная сложность + TreeNode *root = buildTree(n); + printTree(root); + + // Освободить память + freeMemoryTree(root); + + return 0; +} diff --git a/ru/codes/cpp/chapter_computational_complexity/time_complexity.cpp b/ru/codes/cpp/chapter_computational_complexity/time_complexity.cpp new file mode 100644 index 000000000..4ba231343 --- /dev/null +++ b/ru/codes/cpp/chapter_computational_complexity/time_complexity.cpp @@ -0,0 +1,168 @@ +/** + * File: time_complexity.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Постоянная сложность */ +int constant(int n) { + int count = 0; + int size = 100000; + for (int i = 0; i < size; i++) + count++; + return count; +} + +/* Линейная сложность */ +int linear(int n) { + int count = 0; + for (int i = 0; i < n; i++) + count++; + return count; +} + +/* Линейная сложность (обход массива) */ +int arrayTraversal(vector &nums) { + int count = 0; + // Число итераций пропорционально длине массива + for (int num : nums) { + count++; + } + return count; +} + +/* Квадратичная сложность */ +int quadratic(int n) { + int count = 0; + // Число итераций квадратично зависит от размера данных n + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + count++; + } + } + return count; +} + +/* Квадратичная сложность (пузырьковая сортировка) */ +int bubbleSort(vector &nums) { + int count = 0; // Счетчик + // Внешний цикл: неотсортированный диапазон [0, i] + for (int i = nums.size() - 1; i > 0; i--) { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (int j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + int tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + count += 3; // Обмен элементов включает 3 элементарные операции + } + } + } + return count; +} + +/* Экспоненциальная сложность (итеративная реализация) */ +int exponential(int n) { + int count = 0, base = 1; + // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1) + for (int i = 0; i < n; i++) { + for (int j = 0; j < base; j++) { + count++; + } + base *= 2; + } + // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1 + return count; +} + +/* Экспоненциальная сложность (рекурсивная реализация) */ +int expRecur(int n) { + if (n == 1) + return 1; + return expRecur(n - 1) + expRecur(n - 1) + 1; +} + +/* Логарифмическая сложность (итеративная реализация) */ +int logarithmic(int n) { + int count = 0; + while (n > 1) { + n = n / 2; + count++; + } + return count; +} + +/* Логарифмическая сложность (рекурсивная реализация) */ +int logRecur(int n) { + if (n <= 1) + return 0; + return logRecur(n / 2) + 1; +} + +/* Линейно-логарифмическая сложность */ +int linearLogRecur(int n) { + if (n <= 1) + return 1; + int count = linearLogRecur(n / 2) + linearLogRecur(n / 2); + for (int i = 0; i < n; i++) { + count++; + } + return count; +} + +/* Факториальная сложность (рекурсивная реализация) */ +int factorialRecur(int n) { + if (n == 0) + return 1; + int count = 0; + // Из одного получается n + for (int i = 0; i < n; i++) { + count += factorialRecur(n - 1); + } + return count; +} + +/* Driver Code */ +int main() { + // Можно изменить n и запустить программу, чтобы увидеть, как меняется число операций при разных сложностях + int n = 8; + cout << "Размер входных данных n = " << n << endl; + + int count = constant(n); + cout << "Количество операций постоянной сложности = " << count << endl; + + count = linear(n); + cout << "Количество операций линейной сложности = " << count << endl; + vector arr(n); + count = arrayTraversal(arr); + cout << "Количество операций линейной сложности (обход массива) = " << count << endl; + + count = quadratic(n); + cout << "Количество операций квадратичной сложности = " << count << endl; + vector nums(n); + for (int i = 0; i < n; i++) + nums[i] = n - i; // [n,n-1,...,2,1] + count = bubbleSort(nums); + cout << "Количество операций квадратичной сложности (пузырьковая сортировка) = " << count << endl; + + count = exponential(n); + cout << "Количество операций экспоненциальной сложности (итерация) = " << count << endl; + count = expRecur(n); + cout << "Количество операций экспоненциальной сложности (рекурсия) = " << count << endl; + + count = logarithmic(n); + cout << "Количество операций логарифмической сложности (итерация) = " << count << endl; + count = logRecur(n); + cout << "Количество операций логарифмической сложности (рекурсия) = " << count << endl; + + count = linearLogRecur(n); + cout << "Количество операций линейно-логарифмической сложности (рекурсия) = " << count << endl; + + count = factorialRecur(n); + cout << "Количество операций факториальной сложности (рекурсия) = " << count << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_computational_complexity/worst_best_time_complexity.cpp b/ru/codes/cpp/chapter_computational_complexity/worst_best_time_complexity.cpp new file mode 100644 index 000000000..bfb342011 --- /dev/null +++ b/ru/codes/cpp/chapter_computational_complexity/worst_best_time_complexity.cpp @@ -0,0 +1,45 @@ +/** + * File: worst_best_time_complexity.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */ +vector randomNumbers(int n) { + vector nums(n); + // Создать массив nums = { 1, 2, 3, ..., n } + for (int i = 0; i < n; i++) { + nums[i] = i + 1; + } + // Использовать системное время для генерации случайного seed + unsigned seed = chrono::system_clock::now().time_since_epoch().count(); + // Случайно перемешать элементы массива + shuffle(nums.begin(), nums.end(), default_random_engine(seed)); + return nums; +} + +/* Найти индекс числа 1 в массиве nums */ +int findOne(vector &nums) { + for (int i = 0; i < nums.size(); i++) { + // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1) + // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n) + if (nums[i] == 1) + return i; + } + return -1; +} + +/* Driver Code */ +int main() { + for (int i = 0; i < 1000; i++) { + int n = 100; + vector nums = randomNumbers(n); + int index = findOne(nums); + cout << "\nПосле перемешивания массива [ 1, 2, ..., n ] nums = "; + printVector(nums); + cout << "Индекс числа 1 = " << index << endl; + } + return 0; +} diff --git a/ru/codes/cpp/chapter_divide_and_conquer/CMakeLists.txt b/ru/codes/cpp/chapter_divide_and_conquer/CMakeLists.txt new file mode 100644 index 000000000..38dfff710 --- /dev/null +++ b/ru/codes/cpp/chapter_divide_and_conquer/CMakeLists.txt @@ -0,0 +1,3 @@ +add_executable(binary_search_recur binary_search_recur.cpp) +add_executable(build_tree build_tree.cpp) +add_executable(hanota hanota.cpp) \ No newline at end of file diff --git a/ru/codes/cpp/chapter_divide_and_conquer/binary_search_recur.cpp b/ru/codes/cpp/chapter_divide_and_conquer/binary_search_recur.cpp new file mode 100644 index 000000000..2281bb66b --- /dev/null +++ b/ru/codes/cpp/chapter_divide_and_conquer/binary_search_recur.cpp @@ -0,0 +1,46 @@ +/** + * File: binary_search_recur.cpp + * Created Time: 2023-07-17 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Бинарный поиск: задача f(i, j) */ +int dfs(vector &nums, int target, int i, int j) { + // Если интервал пуст, целевой элемент отсутствует, вернуть -1 + if (i > j) { + return -1; + } + // Вычислить индекс середины m + int m = (i + j) / 2; + if (nums[m] < target) { + // Рекурсивная подзадача f(m+1, j) + return dfs(nums, target, m + 1, j); + } else if (nums[m] > target) { + // Рекурсивная подзадача f(i, m-1) + return dfs(nums, target, i, m - 1); + } else { + // Целевой элемент найден, вернуть его индекс + return m; + } +} + +/* Бинарный поиск */ +int binarySearch(vector &nums, int target) { + int n = nums.size(); + // Решить задачу f(0, n-1) + return dfs(nums, target, 0, n - 1); +} + +/* Driver Code */ +int main() { + int target = 6; + vector nums = {1, 3, 6, 8, 12, 15, 23, 26, 31, 35}; + + // Бинарный поиск (двусторонне замкнутый интервал) + int index = binarySearch(nums, target); + cout << "Индекс целевого элемента 6 = " << index << endl; + + return 0; +} \ No newline at end of file diff --git a/ru/codes/cpp/chapter_divide_and_conquer/build_tree.cpp b/ru/codes/cpp/chapter_divide_and_conquer/build_tree.cpp new file mode 100644 index 000000000..f47833d59 --- /dev/null +++ b/ru/codes/cpp/chapter_divide_and_conquer/build_tree.cpp @@ -0,0 +1,51 @@ +/** + * File: build_tree.cpp + * Created Time: 2023-07-17 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Построить двоичное дерево: разделяй и властвуй */ +TreeNode *dfs(vector &preorder, unordered_map &inorderMap, int i, int l, int r) { + // Завершить при пустом диапазоне поддерева + if (r - l < 0) + return NULL; + // Инициализировать корневой узел + TreeNode *root = new TreeNode(preorder[i]); + // Найти m, чтобы разделить левое и правое поддеревья + int m = inorderMap[preorder[i]]; + // Подзадача: построить левое поддерево + root->left = dfs(preorder, inorderMap, i + 1, l, m - 1); + // Подзадача: построить правое поддерево + root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r); + // Вернуть корневой узел + return root; +} + +/* Построить двоичное дерево */ +TreeNode *buildTree(vector &preorder, vector &inorder) { + // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам + unordered_map inorderMap; + for (int i = 0; i < inorder.size(); i++) { + inorderMap[inorder[i]] = i; + } + TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorder.size() - 1); + return root; +} + +/* Driver Code */ +int main() { + vector preorder = {3, 9, 2, 1, 7}; + vector inorder = {9, 3, 1, 2, 7}; + cout << "Предварительный обход = "; + printVector(preorder); + cout << "Симметричный обход = "; + printVector(inorder); + + TreeNode *root = buildTree(preorder, inorder); + cout << "Построенное двоичное дерево:\n"; + printTree(root); + + return 0; +} diff --git a/ru/codes/cpp/chapter_divide_and_conquer/hanota.cpp b/ru/codes/cpp/chapter_divide_and_conquer/hanota.cpp new file mode 100644 index 000000000..15ac1f1ea --- /dev/null +++ b/ru/codes/cpp/chapter_divide_and_conquer/hanota.cpp @@ -0,0 +1,66 @@ +/** + * File: hanota.cpp + * Created Time: 2023-07-17 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Переместить один диск */ +void move(vector &src, vector &tar) { + // Снять диск с вершины src + int pan = src.back(); + src.pop_back(); + // Положить диск на вершину tar + tar.push_back(pan); +} + +/* Решить задачу Ханойской башни f(i) */ +void dfs(int i, vector &src, vector &buf, vector &tar) { + // Если в src остался только один диск, сразу переместить его в tar + if (i == 1) { + move(src, tar); + return; + } + // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar + dfs(i - 1, src, tar, buf); + // Подзадача f(1): переместить оставшийся один диск из src в tar + move(src, tar); + // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src + dfs(i - 1, buf, src, tar); +} + +/* Решить задачу Ханойской башни */ +void solveHanota(vector &A, vector &B, vector &C) { + int n = A.size(); + // Переместить верхние n дисков из A в C с помощью B + dfs(n, A, B, C); +} + +/* Driver Code */ +int main() { + // Хвост списка соответствует вершине столбца + vector A = {5, 4, 3, 2, 1}; + vector B = {}; + vector C = {}; + + cout << "Начальное состояние:\n"; + cout << "A ="; + printVector(A); + cout << "B ="; + printVector(B); + cout << "C ="; + printVector(C); + + solveHanota(A, B, C); + + cout << "После завершения перемещения дисков:\n"; + cout << "A ="; + printVector(A); + cout << "B ="; + printVector(B); + cout << "C ="; + printVector(C); + + return 0; +} diff --git a/ru/codes/cpp/chapter_dynamic_programming/CMakeLists.txt b/ru/codes/cpp/chapter_dynamic_programming/CMakeLists.txt new file mode 100644 index 000000000..ed185458a --- /dev/null +++ b/ru/codes/cpp/chapter_dynamic_programming/CMakeLists.txt @@ -0,0 +1,10 @@ +add_executable(climbing_stairs_backtrack climbing_stairs_backtrack.cpp) +add_executable(climbing_stairs_dfs climbing_stairs_dfs.cpp) +add_executable(climbing_stairs_dfs_mem climbing_stairs_dfs_mem.cpp) +add_executable(climbing_stairs_dp climbing_stairs_dp.cpp) +add_executable(min_cost_climbing_stairs_dp min_cost_climbing_stairs_dp.cpp) +add_executable(min_path_sum min_path_sum.cpp) +add_executable(unbounded_knapsack unbounded_knapsack.cpp) +add_executable(coin_change coin_change.cpp) +add_executable(coin_change_ii coin_change_ii.cpp) +add_executable(edit_distance edit_distance.cpp) \ No newline at end of file diff --git a/ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_backtrack.cpp b/ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_backtrack.cpp new file mode 100644 index 000000000..b3ee775cb --- /dev/null +++ b/ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_backtrack.cpp @@ -0,0 +1,43 @@ + +/** + * File: climbing_stairs_backtrack.cpp + * Created Time: 2023-06-30 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Бэктрекинг */ +void backtrack(vector &choices, int state, int n, vector &res) { + // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1 + if (state == n) + res[0]++; + // Перебор всех вариантов выбора + for (auto &choice : choices) { + // Отсечение: нельзя выходить за n-ю ступень + if (state + choice > n) + continue; + // Попытка: сделать выбор и обновить состояние + backtrack(choices, state + choice, n, res); + // Откат + } +} + +/* Подъем по лестнице: бэктрекинг */ +int climbingStairsBacktrack(int n) { + vector choices = {1, 2}; // Можно подняться на 1 или 2 ступени + int state = 0; // Начать подъем с 0-й ступени + vector res = {0}; // Использовать res[0] для хранения числа решений + backtrack(choices, state, n, res); + return res[0]; +} + +/* Driver Code */ +int main() { + int n = 9; + + int res = climbingStairsBacktrack(n); + cout << "Количество способов подняться по лестнице из " << n << " ступеней: " << res << " вариантов" << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_constraint_dp.cpp b/ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_constraint_dp.cpp new file mode 100644 index 000000000..4afdd1af2 --- /dev/null +++ b/ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_constraint_dp.cpp @@ -0,0 +1,37 @@ +/** + * File: climbing_stairs_constraint_dp.cpp + * Created Time: 2023-07-01 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Подъем по лестнице с ограничениями: динамическое программирование */ +int climbingStairsConstraintDP(int n) { + if (n == 1 || n == 2) { + return 1; + } + // Инициализация таблицы dp для хранения решений подзадач + vector> dp(n + 1, vector(3, 0)); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1][1] = 1; + dp[1][2] = 0; + dp[2][1] = 0; + dp[2][2] = 1; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (int i = 3; i <= n; i++) { + dp[i][1] = dp[i - 1][2]; + dp[i][2] = dp[i - 2][1] + dp[i - 2][2]; + } + return dp[n][1] + dp[n][2]; +} + +/* Driver Code */ +int main() { + int n = 9; + + int res = climbingStairsConstraintDP(n); + cout << "Количество способов подняться по лестнице из " << n << " ступеней: " << res << " вариантов" << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_dfs.cpp b/ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_dfs.cpp new file mode 100644 index 000000000..f49fc40ea --- /dev/null +++ b/ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_dfs.cpp @@ -0,0 +1,32 @@ +/** + * File: climbing_stairs_dfs.cpp + * Created Time: 2023-06-30 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Поиск */ +int dfs(int i) { + // dp[1] и dp[2] уже известны, вернуть их + if (i == 1 || i == 2) + return i; + // dp[i] = dp[i-1] + dp[i-2] + int count = dfs(i - 1) + dfs(i - 2); + return count; +} + +/* Подъем по лестнице: поиск */ +int climbingStairsDFS(int n) { + return dfs(n); +} + +/* Driver Code */ +int main() { + int n = 9; + + int res = climbingStairsDFS(n); + cout << "Количество способов подняться по лестнице из " << n << " ступеней: " << res << " вариантов" << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_dfs_mem.cpp b/ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_dfs_mem.cpp new file mode 100644 index 000000000..eeb114042 --- /dev/null +++ b/ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_dfs_mem.cpp @@ -0,0 +1,39 @@ +/** + * File: climbing_stairs_dfs_mem.cpp + * Created Time: 2023-06-30 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Поиск с мемоизацией */ +int dfs(int i, vector &mem) { + // dp[1] и dp[2] уже известны, вернуть их + if (i == 1 || i == 2) + return i; + // Если запись dp[i] существует, сразу вернуть ее + if (mem[i] != -1) + return mem[i]; + // dp[i] = dp[i-1] + dp[i-2] + int count = dfs(i - 1, mem) + dfs(i - 2, mem); + // Сохранить dp[i] + mem[i] = count; + return count; +} + +/* Подъем по лестнице: поиск с мемоизацией */ +int climbingStairsDFSMem(int n) { + // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи + vector mem(n + 1, -1); + return dfs(n, mem); +} + +/* Driver Code */ +int main() { + int n = 9; + + int res = climbingStairsDFSMem(n); + cout << "Количество способов подняться по лестнице из " << n << " ступеней: " << res << " вариантов" << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_dp.cpp b/ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_dp.cpp new file mode 100644 index 000000000..e3db584a8 --- /dev/null +++ b/ru/codes/cpp/chapter_dynamic_programming/climbing_stairs_dp.cpp @@ -0,0 +1,49 @@ +/** + * File: climbing_stairs_dp.cpp + * Created Time: 2023-06-30 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Подъем по лестнице: динамическое программирование */ +int climbingStairsDP(int n) { + if (n == 1 || n == 2) + return n; + // Инициализация таблицы dp для хранения решений подзадач + vector dp(n + 1); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = 1; + dp[2] = 2; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (int i = 3; i <= n; i++) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + return dp[n]; +} + +/* Подъем по лестнице: динамическое программирование с оптимизацией памяти */ +int climbingStairsDPComp(int n) { + if (n == 1 || n == 2) + return n; + int a = 1, b = 2; + for (int i = 3; i <= n; i++) { + int tmp = b; + b = a + b; + a = tmp; + } + return b; +} + +/* Driver Code */ +int main() { + int n = 9; + + int res = climbingStairsDP(n); + cout << "Количество способов подняться по лестнице из " << n << " ступеней: " << res << " вариантов" << endl; + + res = climbingStairsDPComp(n); + cout << "Количество способов подняться по лестнице из " << n << " ступеней: " << res << " вариантов" << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_dynamic_programming/coin_change.cpp b/ru/codes/cpp/chapter_dynamic_programming/coin_change.cpp new file mode 100644 index 000000000..2986dbaf9 --- /dev/null +++ b/ru/codes/cpp/chapter_dynamic_programming/coin_change.cpp @@ -0,0 +1,70 @@ +/** + * File: coin_change.cpp + * Created Time: 2023-07-11 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Размен монет: динамическое программирование */ +int coinChangeDP(vector &coins, int amt) { + int n = coins.size(); + int MAX = amt + 1; + // Инициализация таблицы dp + vector> dp(n + 1, vector(amt + 1, 0)); + // Переход состояний: первая строка и первый столбец + for (int a = 1; a <= amt; a++) { + dp[0][a] = MAX; + } + // Переход состояний: остальные строки и столбцы + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1); + } + } + } + return dp[n][amt] != MAX ? dp[n][amt] : -1; +} + +/* Размен монет: динамическое программирование с оптимизацией памяти */ +int coinChangeDPComp(vector &coins, int amt) { + int n = coins.size(); + int MAX = amt + 1; + // Инициализация таблицы dp + vector dp(amt + 1, MAX); + dp[0] = 0; + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1); + } + } + } + return dp[amt] != MAX ? dp[amt] : -1; +} + +/* Driver code */ +int main() { + vector coins = {1, 2, 5}; + int amt = 4; + + // Динамическое программирование + int res = coinChangeDP(coins, amt); + cout << "Минимальное количество монет для целевой суммы = " << res << endl; + + // Динамическое программирование с оптимизацией памяти + res = coinChangeDPComp(coins, amt); + cout << "Минимальное количество монет для целевой суммы = " << res << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_dynamic_programming/coin_change_ii.cpp b/ru/codes/cpp/chapter_dynamic_programming/coin_change_ii.cpp new file mode 100644 index 000000000..a63e1b740 --- /dev/null +++ b/ru/codes/cpp/chapter_dynamic_programming/coin_change_ii.cpp @@ -0,0 +1,68 @@ +/** + * File: coin_change_ii.cpp + * Created Time: 2023-07-11 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Размен монет II: динамическое программирование */ +int coinChangeIIDP(vector &coins, int amt) { + int n = coins.size(); + // Инициализация таблицы dp + vector> dp(n + 1, vector(amt + 1, 0)); + // Инициализация первого столбца + for (int i = 0; i <= n; i++) { + dp[i][0] = 1; + } + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a]; + } else { + // Сумма двух решений: не брать или взять монету i + dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]; + } + } + } + return dp[n][amt]; +} + +/* Размен монет II: динамическое программирование с оптимизацией памяти */ +int coinChangeIIDPComp(vector &coins, int amt) { + int n = coins.size(); + // Инициализация таблицы dp + vector dp(amt + 1, 0); + dp[0] = 1; + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Сумма двух решений: не брать или взять монету i + dp[a] = dp[a] + dp[a - coins[i - 1]]; + } + } + } + return dp[amt]; +} + +/* Driver code */ +int main() { + vector coins = {1, 2, 5}; + int amt = 5; + + // Динамическое программирование + int res = coinChangeIIDP(coins, amt); + cout << "Количество комбинаций монет для набора целевой суммы = " << res << endl; + + // Динамическое программирование с оптимизацией памяти + res = coinChangeIIDPComp(coins, amt); + cout << "Количество комбинаций монет для набора целевой суммы = " << res << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_dynamic_programming/edit_distance.cpp b/ru/codes/cpp/chapter_dynamic_programming/edit_distance.cpp new file mode 100644 index 000000000..488e999ec --- /dev/null +++ b/ru/codes/cpp/chapter_dynamic_programming/edit_distance.cpp @@ -0,0 +1,136 @@ +/** + * File: edit_distance.cpp + * Created Time: 2023-07-13 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Редакционное расстояние: полный перебор */ +int editDistanceDFS(string s, string t, int i, int j) { + // Если s и t пусты, вернуть 0 + if (i == 0 && j == 0) + return 0; + // Если s пусто, вернуть длину t + if (i == 0) + return j; + // Если t пусто, вернуть длину s + if (j == 0) + return i; + // Если два символа равны, сразу пропустить их + if (s[i - 1] == t[j - 1]) + return editDistanceDFS(s, t, i - 1, j - 1); + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + int insert = editDistanceDFS(s, t, i, j - 1); + int del = editDistanceDFS(s, t, i - 1, j); + int replace = editDistanceDFS(s, t, i - 1, j - 1); + // Вернуть минимальное число шагов редактирования + return min(min(insert, del), replace) + 1; +} + +/* Редакционное расстояние: поиск с мемоизацией */ +int editDistanceDFSMem(string s, string t, vector> &mem, int i, int j) { + // Если s и t пусты, вернуть 0 + if (i == 0 && j == 0) + return 0; + // Если s пусто, вернуть длину t + if (i == 0) + return j; + // Если t пусто, вернуть длину s + if (j == 0) + return i; + // Если запись уже есть, сразу вернуть ее + if (mem[i][j] != -1) + return mem[i][j]; + // Если два символа равны, сразу пропустить их + if (s[i - 1] == t[j - 1]) + return editDistanceDFSMem(s, t, mem, i - 1, j - 1); + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + int insert = editDistanceDFSMem(s, t, mem, i, j - 1); + int del = editDistanceDFSMem(s, t, mem, i - 1, j); + int replace = editDistanceDFSMem(s, t, mem, i - 1, j - 1); + // Сохранить и вернуть минимальное число шагов редактирования + mem[i][j] = min(min(insert, del), replace) + 1; + return mem[i][j]; +} + +/* Редакционное расстояние: динамическое программирование */ +int editDistanceDP(string s, string t) { + int n = s.length(), m = t.length(); + vector> dp(n + 1, vector(m + 1, 0)); + // Переход состояний: первая строка и первый столбец + for (int i = 1; i <= n; i++) { + dp[i][0] = i; + } + for (int j = 1; j <= m; j++) { + dp[0][j] = j; + } + // Переход состояний: остальные строки и столбцы + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= m; j++) { + if (s[i - 1] == t[j - 1]) { + // Если два символа равны, сразу пропустить их + dp[i][j] = dp[i - 1][j - 1]; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1; + } + } + } + return dp[n][m]; +} + +/* Редакционное расстояние: динамическое программирование с оптимизацией памяти */ +int editDistanceDPComp(string s, string t) { + int n = s.length(), m = t.length(); + vector dp(m + 1, 0); + // Переход состояний: первая строка + for (int j = 1; j <= m; j++) { + dp[j] = j; + } + // Переход состояний: остальные строки + for (int i = 1; i <= n; i++) { + // Переход состояний: первый столбец + int leftup = dp[0]; // Временно сохранить dp[i-1, j-1] + dp[0] = i; + // Переход состояний: остальные столбцы + for (int j = 1; j <= m; j++) { + int temp = dp[j]; + if (s[i - 1] == t[j - 1]) { + // Если два символа равны, сразу пропустить их + dp[j] = leftup; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1; + } + leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации + } + } + return dp[m]; +} + +/* Driver Code */ +int main() { + string s = "bag"; + string t = "pack"; + int n = s.length(), m = t.length(); + + // Полный перебор + int res = editDistanceDFS(s, t, n, m); + cout << "Чтобы заменить " << s << " на " << t << " , требуется минимум " << res << " операций редактирования\n"; + + // Поиск с мемоизацией + vector> mem(n + 1, vector(m + 1, -1)); + res = editDistanceDFSMem(s, t, mem, n, m); + cout << "Чтобы заменить " << s << " на " << t << " , требуется минимум " << res << " операций редактирования\n"; + + // Динамическое программирование + res = editDistanceDP(s, t); + cout << "Чтобы заменить " << s << " на " << t << " , требуется минимум " << res << " операций редактирования\n"; + + // Динамическое программирование с оптимизацией памяти + res = editDistanceDPComp(s, t); + cout << "Чтобы заменить " << s << " на " << t << " , требуется минимум " << res << " операций редактирования\n"; + + return 0; +} diff --git a/ru/codes/cpp/chapter_dynamic_programming/knapsack.cpp b/ru/codes/cpp/chapter_dynamic_programming/knapsack.cpp new file mode 100644 index 000000000..65ebdab48 --- /dev/null +++ b/ru/codes/cpp/chapter_dynamic_programming/knapsack.cpp @@ -0,0 +1,109 @@ +#include +#include +#include + +using namespace std; + +/* Рюкзак 0-1: полный перебор */ +int knapsackDFS(vector &wgt, vector &val, int i, int c) { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i == 0 || c == 0) { + return 0; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (wgt[i - 1] > c) { + return knapsackDFS(wgt, val, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + int no = knapsackDFS(wgt, val, i - 1, c); + int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]; + // Вернуть вариант с большей стоимостью из двух возможных + return max(no, yes); +} + +/* Рюкзак 0-1: поиск с мемоизацией */ +int knapsackDFSMem(vector &wgt, vector &val, vector> &mem, int i, int c) { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i == 0 || c == 0) { + return 0; + } + // Если запись уже есть, вернуть сразу + if (mem[i][c] != -1) { + return mem[i][c]; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (wgt[i - 1] > c) { + return knapsackDFSMem(wgt, val, mem, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + int no = knapsackDFSMem(wgt, val, mem, i - 1, c); + int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]; + // Сохранить и вернуть вариант с большей стоимостью из двух решений + mem[i][c] = max(no, yes); + return mem[i][c]; +} + +/* Рюкзак 0-1: динамическое программирование */ +int knapsackDP(vector &wgt, vector &val, int cap) { + int n = wgt.size(); + // Инициализация таблицы dp + vector> dp(n + 1, vector(cap + 1, 0)); + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[n][cap]; +} + +/* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */ +int knapsackDPComp(vector &wgt, vector &val, int cap) { + int n = wgt.size(); + // Инициализация таблицы dp + vector dp(cap + 1, 0); + // Переход состояний + for (int i = 1; i <= n; i++) { + // Обход в обратном порядке + for (int c = cap; c >= 1; c--) { + if (wgt[i - 1] <= c) { + // Большее из двух решений: не брать или взять предмет i + dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[cap]; +} + +/* Driver Code */ +int main() { + vector wgt = {10, 20, 30, 40, 50}; + vector val = {50, 120, 150, 210, 240}; + int cap = 50; + int n = wgt.size(); + + // Полный перебор + int res = knapsackDFS(wgt, val, n, cap); + cout << "Максимальная стоимость предметов, не превышающая вместимость рюкзака, равна " << res << endl; + + // Поиск с мемоизацией + vector> mem(n + 1, vector(cap + 1, -1)); + res = knapsackDFSMem(wgt, val, mem, n, cap); + cout << "Максимальная стоимость предметов, не превышающая вместимость рюкзака, равна " << res << endl; + + // Динамическое программирование + res = knapsackDP(wgt, val, cap); + cout << "Максимальная стоимость предметов, не превышающая вместимость рюкзака, равна " << res << endl; + + // Динамическое программирование с оптимизацией памяти + res = knapsackDPComp(wgt, val, cap); + cout << "Максимальная стоимость предметов, не превышающая вместимость рюкзака, равна " << res << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_dynamic_programming/min_cost_climbing_stairs_dp.cpp b/ru/codes/cpp/chapter_dynamic_programming/min_cost_climbing_stairs_dp.cpp new file mode 100644 index 000000000..5de0c080b --- /dev/null +++ b/ru/codes/cpp/chapter_dynamic_programming/min_cost_climbing_stairs_dp.cpp @@ -0,0 +1,53 @@ +/** + * File: min_cost_climbing_stairs_dp.cpp + * Created Time: 2023-06-30 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Минимальная стоимость подъема по лестнице: динамическое программирование */ +int minCostClimbingStairsDP(vector &cost) { + int n = cost.size() - 1; + if (n == 1 || n == 2) + return cost[n]; + // Инициализация таблицы dp для хранения решений подзадач + vector dp(n + 1); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = cost[1]; + dp[2] = cost[2]; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (int i = 3; i <= n; i++) { + dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]; + } + return dp[n]; +} + +/* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */ +int minCostClimbingStairsDPComp(vector &cost) { + int n = cost.size() - 1; + if (n == 1 || n == 2) + return cost[n]; + int a = cost[1], b = cost[2]; + for (int i = 3; i <= n; i++) { + int tmp = b; + b = min(a, tmp) + cost[i]; + a = tmp; + } + return b; +} + +/* Driver Code */ +int main() { + vector cost = {0, 1, 10, 1, 1, 1, 10, 1, 1, 10, 1}; + cout << "Список стоимостей ступеней = "; + printVector(cost); + + int res = minCostClimbingStairsDP(cost); + cout << "Минимальная стоимость подъема по лестнице = " << res << endl; + + res = minCostClimbingStairsDPComp(cost); + cout << "Минимальная стоимость подъема по лестнице = " << res << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_dynamic_programming/min_path_sum.cpp b/ru/codes/cpp/chapter_dynamic_programming/min_path_sum.cpp new file mode 100644 index 000000000..d5c0bb534 --- /dev/null +++ b/ru/codes/cpp/chapter_dynamic_programming/min_path_sum.cpp @@ -0,0 +1,116 @@ +/** + * File: min_path_sum.cpp + * Created Time: 2023-07-10 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Минимальная сумма пути: полный перебор */ +int minPathSumDFS(vector> &grid, int i, int j) { + // Если это верхняя левая ячейка, завершить поиск + if (i == 0 && j == 0) { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 || j < 0) { + return INT_MAX; + } + // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1) + int up = minPathSumDFS(grid, i - 1, j); + int left = minPathSumDFS(grid, i, j - 1); + // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + return min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX; +} + +/* Минимальная сумма пути: поиск с мемоизацией */ +int minPathSumDFSMem(vector> &grid, vector> &mem, int i, int j) { + // Если это верхняя левая ячейка, завершить поиск + if (i == 0 && j == 0) { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 || j < 0) { + return INT_MAX; + } + // Если запись уже есть, вернуть сразу + if (mem[i][j] != -1) { + return mem[i][j]; + } + // Минимальная стоимость пути для левой и верхней ячеек + int up = minPathSumDFSMem(grid, mem, i - 1, j); + int left = minPathSumDFSMem(grid, mem, i, j - 1); + // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + mem[i][j] = min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX; + return mem[i][j]; +} + +/* Минимальная сумма пути: динамическое программирование */ +int minPathSumDP(vector> &grid) { + int n = grid.size(), m = grid[0].size(); + // Инициализация таблицы dp + vector> dp(n, vector(m)); + dp[0][0] = grid[0][0]; + // Переход состояний: первая строка + for (int j = 1; j < m; j++) { + dp[0][j] = dp[0][j - 1] + grid[0][j]; + } + // Переход состояний: первый столбец + for (int i = 1; i < n; i++) { + dp[i][0] = dp[i - 1][0] + grid[i][0]; + } + // Переход состояний: остальные строки и столбцы + for (int i = 1; i < n; i++) { + for (int j = 1; j < m; j++) { + dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]; + } + } + return dp[n - 1][m - 1]; +} + +/* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */ +int minPathSumDPComp(vector> &grid) { + int n = grid.size(), m = grid[0].size(); + // Инициализация таблицы dp + vector dp(m); + // Переход состояний: первая строка + dp[0] = grid[0][0]; + for (int j = 1; j < m; j++) { + dp[j] = dp[j - 1] + grid[0][j]; + } + // Переход состояний: остальные строки + for (int i = 1; i < n; i++) { + // Переход состояний: первый столбец + dp[0] = dp[0] + grid[i][0]; + // Переход состояний: остальные столбцы + for (int j = 1; j < m; j++) { + dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]; + } + } + return dp[m - 1]; +} + +/* Driver Code */ +int main() { + vector> grid = {{1, 3, 1, 5}, {2, 2, 4, 2}, {5, 3, 2, 1}, {4, 3, 5, 2}}; + int n = grid.size(), m = grid[0].size(); + + // Полный перебор + int res = minPathSumDFS(grid, n - 1, m - 1); + cout << "Минимальная сумма пути из левого верхнего в правый нижний угол = " << res << endl; + + // Поиск с мемоизацией + vector> mem(n, vector(m, -1)); + res = minPathSumDFSMem(grid, mem, n - 1, m - 1); + cout << "Минимальная сумма пути из левого верхнего в правый нижний угол = " << res << endl; + + // Динамическое программирование + res = minPathSumDP(grid); + cout << "Минимальная сумма пути из левого верхнего в правый нижний угол = " << res << endl; + + // Динамическое программирование с оптимизацией памяти + res = minPathSumDPComp(grid); + cout << "Минимальная сумма пути из левого верхнего в правый нижний угол = " << res << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_dynamic_programming/unbounded_knapsack.cpp b/ru/codes/cpp/chapter_dynamic_programming/unbounded_knapsack.cpp new file mode 100644 index 000000000..f40accb04 --- /dev/null +++ b/ru/codes/cpp/chapter_dynamic_programming/unbounded_knapsack.cpp @@ -0,0 +1,64 @@ +/** + * File: unbounded_knapsack.cpp + * Created Time: 2023-07-11 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Полный рюкзак: динамическое программирование */ +int unboundedKnapsackDP(vector &wgt, vector &val, int cap) { + int n = wgt.size(); + // Инициализация таблицы dp + vector> dp(n + 1, vector(cap + 1, 0)); + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[n][cap]; +} + +/* Полный рюкзак: динамическое программирование с оптимизацией памяти */ +int unboundedKnapsackDPComp(vector &wgt, vector &val, int cap) { + int n = wgt.size(); + // Инициализация таблицы dp + vector dp(cap + 1, 0); + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[cap]; +} + +/* Driver code */ +int main() { + vector wgt = {1, 2, 3}; + vector val = {5, 11, 15}; + int cap = 4; + + // Динамическое программирование + int res = unboundedKnapsackDP(wgt, val, cap); + cout << "Максимальная стоимость предметов, не превышающая вместимость рюкзака, равна " << res << endl; + + // Динамическое программирование с оптимизацией памяти + res = unboundedKnapsackDPComp(wgt, val, cap); + cout << "Максимальная стоимость предметов, не превышающая вместимость рюкзака, равна " << res << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_graph/CMakeLists.txt b/ru/codes/cpp/chapter_graph/CMakeLists.txt new file mode 100644 index 000000000..4a56ce35b --- /dev/null +++ b/ru/codes/cpp/chapter_graph/CMakeLists.txt @@ -0,0 +1,5 @@ +add_executable(graph_bfs graph_bfs.cpp) +add_executable(graph_dfs graph_dfs.cpp) +# add_executable(graph_adjacency_list graph_adjacency_list.cpp) +add_executable(graph_adjacency_list_test graph_adjacency_list_test.cpp) +add_executable(graph_adjacency_matrix graph_adjacency_matrix.cpp) diff --git a/ru/codes/cpp/chapter_graph/graph_adjacency_list.cpp b/ru/codes/cpp/chapter_graph/graph_adjacency_list.cpp new file mode 100644 index 000000000..7a14735fd --- /dev/null +++ b/ru/codes/cpp/chapter_graph/graph_adjacency_list.cpp @@ -0,0 +1,90 @@ +/** + * File: graph_adjacency_list.cpp + * Created Time: 2023-02-09 + * Author: what-is-me (whatisme@outlook.jp), krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Класс неориентированного графа на основе списка смежности */ +class GraphAdjList { + public: + // Список смежности, где key — вершина, а value — все смежные ей вершины + unordered_map> adjList; + + /* Удалить указанный узел из vector */ + void remove(vector &vec, Vertex *vet) { + for (int i = 0; i < vec.size(); i++) { + if (vec[i] == vet) { + vec.erase(vec.begin() + i); + break; + } + } + } + + /* Конструктор */ + GraphAdjList(const vector> &edges) { + // Добавить все вершины и ребра + for (const vector &edge : edges) { + addVertex(edge[0]); + addVertex(edge[1]); + addEdge(edge[0], edge[1]); + } + } + + /* Получить число вершин */ + int size() { + return adjList.size(); + } + + /* Добавление ребра */ + void addEdge(Vertex *vet1, Vertex *vet2) { + if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2) + throw invalid_argument("вершина не существует"); + // Добавить ребро vet1 - vet2 + adjList[vet1].push_back(vet2); + adjList[vet2].push_back(vet1); + } + + /* Удаление ребра */ + void removeEdge(Vertex *vet1, Vertex *vet2) { + if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2) + throw invalid_argument("вершина не существует"); + // Удалить ребро vet1 - vet2 + remove(adjList[vet1], vet2); + remove(adjList[vet2], vet1); + } + + /* Добавление вершины */ + void addVertex(Vertex *vet) { + if (adjList.count(vet)) + return; + // Добавить новый список в список смежности + adjList[vet] = vector(); + } + + /* Удаление вершины */ + void removeVertex(Vertex *vet) { + if (!adjList.count(vet)) + throw invalid_argument("вершина не существует"); + // Удалить из списка смежности список, соответствующий вершине vet + adjList.erase(vet); + // Обойти списки других вершин и удалить все ребра, содержащие vet + for (auto &adj : adjList) { + remove(adj.second, vet); + } + } + + /* Вывести список смежности */ + void print() { + cout << "Список смежности =" << endl; + for (auto &adj : adjList) { + const auto &key = adj.first; + const auto &vec = adj.second; + cout << key->val << ": "; + printVector(vetsToVals(vec)); + } + } +}; + +// Тестовые примеры см. в graph_adjacency_list_test.cpp diff --git a/ru/codes/cpp/chapter_graph/graph_adjacency_list_test.cpp b/ru/codes/cpp/chapter_graph/graph_adjacency_list_test.cpp new file mode 100644 index 000000000..12dd82ca4 --- /dev/null +++ b/ru/codes/cpp/chapter_graph/graph_adjacency_list_test.cpp @@ -0,0 +1,49 @@ +/** + * File: graph_adjacency_list_test.cpp + * Created Time: 2023-02-09 + * Author: what-is-me (whatisme@outlook.jp), krahets (krahets@163.com) + */ + +#include "./graph_adjacency_list.cpp" + +/* Driver Code */ +int main() { + /* Инициализация неориентированного графа */ + vector v = valsToVets(vector{1, 3, 2, 5, 4}); + vector> 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]}}; + GraphAdjList graph(edges); + cout << "\nПосле инициализации граф имеет вид" << endl; + graph.print(); + + /* Добавление ребра */ + // Вершины 1 и 2 соответствуют v[0] и v[2] + graph.addEdge(v[0], v[2]); + cout << "\nПосле добавления ребра 1-2 граф имеет вид" << endl; + graph.print(); + + /* Удаление ребра */ + // Вершины 1 и 3 соответствуют v[0] и v[1] + graph.removeEdge(v[0], v[1]); + cout << "\nПосле удаления ребра 1-3 граф имеет вид" << endl; + graph.print(); + + /* Добавление вершины */ + Vertex *v5 = new Vertex(6); + graph.addVertex(v5); + cout << "\nПосле добавления вершины 6 граф имеет вид" << endl; + graph.print(); + + /* Удаление вершины */ + // Вершина 3 соответствует v[1] + graph.removeVertex(v[1]); + cout << "\nПосле удаления вершины 3 граф имеет вид" << endl; + graph.print(); + + // Освободить память + for (Vertex *vet : v) { + delete vet; + } + + return 0; +} diff --git a/ru/codes/cpp/chapter_graph/graph_adjacency_matrix.cpp b/ru/codes/cpp/chapter_graph/graph_adjacency_matrix.cpp new file mode 100644 index 000000000..d524dce66 --- /dev/null +++ b/ru/codes/cpp/chapter_graph/graph_adjacency_matrix.cpp @@ -0,0 +1,127 @@ +/** + * File: graph_adjacency_matrix.cpp + * Created Time: 2023-02-09 + * Author: what-is-me (whatisme@outlook.jp) + */ + +#include "../utils/common.hpp" + +/* Класс неориентированного графа на основе матрицы смежности */ +class GraphAdjMat { + vector vertices; // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин» + vector> adjMat; // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин» + + public: + /* Конструктор */ + GraphAdjMat(const vector &vertices, const vector> &edges) { + // Добавление вершины + for (int val : vertices) { + addVertex(val); + } + // Добавить ребра + // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices + for (const vector &edge : edges) { + addEdge(edge[0], edge[1]); + } + } + + /* Получить число вершин */ + int size() const { + return vertices.size(); + } + + /* Добавление вершины */ + void addVertex(int val) { + int n = size(); + // Добавить значение новой вершины в список вершин + vertices.push_back(val); + // Добавить строку в матрицу смежности + adjMat.emplace_back(vector(n, 0)); + // Добавить столбец в матрицу смежности + for (vector &row : adjMat) { + row.push_back(0); + } + } + + /* Удаление вершины */ + void removeVertex(int index) { + if (index >= size()) { + throw out_of_range("вершина не существует"); + } + // Удалить вершину с индексом index из списка вершин + vertices.erase(vertices.begin() + index); + // Удалить строку с индексом index из матрицы смежности + adjMat.erase(adjMat.begin() + index); + // Удалить столбец с индексом index из матрицы смежности + for (vector &row : adjMat) { + row.erase(row.begin() + index); + } + } + + /* Добавление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + void addEdge(int i, int j) { + // Обработка выхода индекса за границы и случая равенства + if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) { + throw out_of_range("вершина не существует"); + } + // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i) + adjMat[i][j] = 1; + adjMat[j][i] = 1; + } + + /* Удаление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + void removeEdge(int i, int j) { + // Обработка выхода индекса за границы и случая равенства + if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) { + throw out_of_range("вершина не существует"); + } + adjMat[i][j] = 0; + adjMat[j][i] = 0; + } + + /* Вывести матрицу смежности */ + void print() { + cout << "Список вершин = "; + printVector(vertices); + cout << "Матрица смежности =" << endl; + printVectorMatrix(adjMat); + } +}; + +/* Driver Code */ +int main() { + /* Инициализация неориентированного графа */ + // Обратите внимание: элементы edges представляют индексы вершин, то есть соответствуют индексам элементов vertices + vector vertices = {1, 3, 2, 5, 4}; + vector> edges = {{0, 1}, {0, 3}, {1, 2}, {2, 3}, {2, 4}, {3, 4}}; + GraphAdjMat graph(vertices, edges); + cout << "\nПосле инициализации граф имеет вид" << endl; + graph.print(); + + /* Добавление ребра */ + // Индексы вершин 1 и 2 равны 0 и 2 соответственно + graph.addEdge(0, 2); + cout << "\nПосле добавления ребра 1-2 граф имеет вид" << endl; + graph.print(); + + /* Удаление ребра */ + // Индексы вершин 1 и 3 равны 0 и 1 соответственно + graph.removeEdge(0, 1); + cout << "\nПосле удаления ребра 1-3 граф имеет вид" << endl; + graph.print(); + + /* Добавление вершины */ + graph.addVertex(6); + cout << "\nПосле добавления вершины 6 граф имеет вид" << endl; + graph.print(); + + /* Удаление вершины */ + // Индекс вершины 3 равен 1 + graph.removeVertex(1); + cout << "\nПосле удаления вершины 3 граф имеет вид" << endl; + graph.print(); + + return 0; +} diff --git a/ru/codes/cpp/chapter_graph/graph_bfs.cpp b/ru/codes/cpp/chapter_graph/graph_bfs.cpp new file mode 100644 index 000000000..ac80cb966 --- /dev/null +++ b/ru/codes/cpp/chapter_graph/graph_bfs.cpp @@ -0,0 +1,59 @@ +/** + * File: graph_bfs.cpp + * Created Time: 2023-03-02 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" +#include "./graph_adjacency_list.cpp" + +/* Обход в ширину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +vector graphBFS(GraphAdjList &graph, Vertex *startVet) { + // Последовательность обхода вершин + vector res; + // Хеш-множество для хранения уже посещенных вершин + unordered_set visited = {startVet}; + // Очередь используется для реализации BFS + queue que; + que.push(startVet); + // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины + while (!que.empty()) { + Vertex *vet = que.front(); + que.pop(); // Извлечь головную вершину из очереди + res.push_back(vet); // Отметить посещенную вершину + // Обойти все смежные вершины данной вершины + for (auto adjVet : graph.adjList[vet]) { + if (visited.count(adjVet)) + continue; // Пропустить уже посещенную вершину + que.push(adjVet); // Помещать в очередь только непосещенные вершины + visited.emplace(adjVet); // Отметить эту вершину как посещенную + } + } + // Вернуть последовательность обхода вершин + return res; +} + +/* Driver Code */ +int main() { + /* Инициализация неориентированного графа */ + vector v = valsToVets({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}); + vector> 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]}}; + GraphAdjList graph(edges); + cout << "\nПосле инициализации граф имеет вид\n"; + graph.print(); + + /* Обход в ширину */ + vector res = graphBFS(graph, v[0]); + cout << "\nПоследовательность вершин при обходе в ширину (BFS)" << endl; + printVector(vetsToVals(res)); + + // Освободить память + for (Vertex *vet : v) { + delete vet; + } + + return 0; +} diff --git a/ru/codes/cpp/chapter_graph/graph_dfs.cpp b/ru/codes/cpp/chapter_graph/graph_dfs.cpp new file mode 100644 index 000000000..034c00da6 --- /dev/null +++ b/ru/codes/cpp/chapter_graph/graph_dfs.cpp @@ -0,0 +1,55 @@ +/** + * File: graph_dfs.cpp + * Created Time: 2023-03-02 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" +#include "./graph_adjacency_list.cpp" + +/* Вспомогательная функция обхода в глубину */ +void dfs(GraphAdjList &graph, unordered_set &visited, vector &res, Vertex *vet) { + res.push_back(vet); // Отметить посещенную вершину + visited.emplace(vet); // Отметить эту вершину как посещенную + // Обойти все смежные вершины данной вершины + for (Vertex *adjVet : graph.adjList[vet]) { + if (visited.count(adjVet)) + continue; // Пропустить уже посещенную вершину + // Рекурсивно обходить смежные вершины + dfs(graph, visited, res, adjVet); + } +} + +/* Обход в глубину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +vector graphDFS(GraphAdjList &graph, Vertex *startVet) { + // Последовательность обхода вершин + vector res; + // Хеш-множество для хранения уже посещенных вершин + unordered_set visited; + dfs(graph, visited, res, startVet); + return res; +} + +/* Driver Code */ +int main() { + /* Инициализация неориентированного графа */ + vector v = valsToVets(vector{0, 1, 2, 3, 4, 5, 6}); + vector> 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]}}; + GraphAdjList graph(edges); + cout << "\nПосле инициализации граф имеет вид" << endl; + graph.print(); + + /* Обход в глубину */ + vector res = graphDFS(graph, v[0]); + cout << "\nПоследовательность вершин при обходе в глубину (DFS)" << endl; + printVector(vetsToVals(res)); + + // Освободить память + for (Vertex *vet : v) { + delete vet; + } + + return 0; +} diff --git a/ru/codes/cpp/chapter_greedy/CMakeLists.txt b/ru/codes/cpp/chapter_greedy/CMakeLists.txt new file mode 100644 index 000000000..91788668d --- /dev/null +++ b/ru/codes/cpp/chapter_greedy/CMakeLists.txt @@ -0,0 +1,3 @@ +add_executable(coin_change_greedy coin_change_greedy.cpp) +add_executable(fractional_knapsack fractional_knapsack.cpp) +add_executable(max_capacity max_capacity.cpp) \ No newline at end of file diff --git a/ru/codes/cpp/chapter_greedy/coin_change_greedy.cpp b/ru/codes/cpp/chapter_greedy/coin_change_greedy.cpp new file mode 100644 index 000000000..6d34f46cd --- /dev/null +++ b/ru/codes/cpp/chapter_greedy/coin_change_greedy.cpp @@ -0,0 +1,60 @@ +/** + * File: coin_change_greedy.cpp + * Created Time: 2023-07-20 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Размен монет: жадный алгоритм */ +int coinChangeGreedy(vector &coins, int amt) { + // Предположить, что список coins упорядочен + int i = coins.size() - 1; + int count = 0; + // Циклически выполнять жадный выбор, пока не останется суммы + while (amt > 0) { + // Найти монету, которая меньше остатка суммы и наиболее к нему близка + while (i > 0 && coins[i] > amt) { + i--; + } + // Выбрать coins[i] + amt -= coins[i]; + count++; + } + // Если допустимое решение не найдено, вернуть -1 + return amt == 0 ? count : -1; +} + +/* Driver Code */ +int main() { + // Жадный подход: гарантирует нахождение глобально оптимального решения + vector coins = {1, 5, 10, 20, 50, 100}; + int amt = 186; + int res = coinChangeGreedy(coins, amt); + cout << "\ncoins = "; + printVector(coins); + cout << "amt = " << amt << endl; + cout << "Минимальное количество монет для набора суммы " << amt << " = " << res << endl; + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = {1, 20, 50}; + amt = 60; + res = coinChangeGreedy(coins, amt); + cout << "\ncoins = "; + printVector(coins); + cout << "amt = " << amt << endl; + cout << "Минимальное количество монет для набора суммы " << amt << " = " << res << endl; + cout << "На самом деле минимальное количество равно 3, а именно 20 + 20 + 20" << endl; + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = {1, 49, 50}; + amt = 98; + res = coinChangeGreedy(coins, amt); + cout << "\ncoins = "; + printVector(coins); + cout << "amt = " << amt << endl; + cout << "Минимальное количество монет для набора суммы " << amt << " = " << res << endl; + cout << "На самом деле минимальное количество равно 2, а именно 49 + 49" << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_greedy/fractional_knapsack.cpp b/ru/codes/cpp/chapter_greedy/fractional_knapsack.cpp new file mode 100644 index 000000000..eca0abe1c --- /dev/null +++ b/ru/codes/cpp/chapter_greedy/fractional_knapsack.cpp @@ -0,0 +1,56 @@ +/** + * File: fractional_knapsack.cpp + * Created Time: 2023-07-20 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Предмет */ +class Item { + public: + int w; // Вес предмета + int v; // Стоимость предмета + + Item(int w, int v) : w(w), v(v) { + } +}; + +/* Дробный рюкзак: жадный алгоритм */ +double fractionalKnapsack(vector &wgt, vector &val, int cap) { + // Создать список предметов с двумя свойствами: вес и стоимость + vector items; + for (int i = 0; i < wgt.size(); i++) { + items.push_back(Item(wgt[i], val[i])); + } + // Отсортировать по удельной стоимости item.v / item.w в порядке убывания + sort(items.begin(), items.end(), [](Item &a, Item &b) { return (double)a.v / a.w > (double)b.v / b.w; }); + // Циклический жадный выбор + double res = 0; + for (auto &item : items) { + if (item.w <= cap) { + // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком + res += item.v; + cap -= item.w; + } else { + // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета + res += (double)item.v / item.w * cap; + // Свободной вместимости больше не осталось, поэтому выйти из цикла + break; + } + } + return res; +} + +/* Driver Code */ +int main() { + vector wgt = {10, 20, 30, 40, 50}; + vector val = {50, 120, 150, 210, 240}; + int cap = 50; + + // Жадный алгоритм + double res = fractionalKnapsack(wgt, val, cap); + cout << "Максимальная стоимость предметов, не превышающая вместимость рюкзака, равна " << res << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_greedy/max_capacity.cpp b/ru/codes/cpp/chapter_greedy/max_capacity.cpp new file mode 100644 index 000000000..9bf15ff0f --- /dev/null +++ b/ru/codes/cpp/chapter_greedy/max_capacity.cpp @@ -0,0 +1,39 @@ +/** + * File: max_capacity.cpp + * Created Time: 2023-07-21 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Максимальная вместимость: жадный алгоритм */ +int maxCapacity(vector &ht) { + // Инициализировать i и j так, чтобы они располагались по двум концам массива + int i = 0, j = ht.size() - 1; + // Начальная максимальная вместимость равна 0 + int res = 0; + // Выполнять жадный выбор в цикле, пока две доски не встретятся + while (i < j) { + // Обновить максимальную вместимость + int cap = min(ht[i], ht[j]) * (j - i); + res = max(res, cap); + // Сдвигать внутрь более короткую сторону + if (ht[i] < ht[j]) { + i++; + } else { + j--; + } + } + return res; +} + +/* Driver Code */ +int main() { + vector ht = {3, 8, 5, 2, 7, 7, 3, 4}; + + // Жадный алгоритм + int res = maxCapacity(ht); + cout << "Максимальная вместимость = " << res << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_greedy/max_product_cutting.cpp b/ru/codes/cpp/chapter_greedy/max_product_cutting.cpp new file mode 100644 index 000000000..4adcaae10 --- /dev/null +++ b/ru/codes/cpp/chapter_greedy/max_product_cutting.cpp @@ -0,0 +1,39 @@ +/** + * File: max_product_cutting.cpp + * Created Time: 2023-07-21 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Максимальное произведение разрезания: жадный алгоритм */ +int maxProductCutting(int n) { + // Когда n <= 3, обязательно нужно выделить одну 1 + if (n <= 3) { + return 1 * (n - 1); + } + // Жадно выделить множители 3, где a — число троек, а b — остаток + int a = n / 3; + int b = n % 3; + if (b == 1) { + // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2 + return (int)pow(3, a - 1) * 2 * 2; + } + if (b == 2) { + // Если остаток равен 2, ничего не делать + return (int)pow(3, a) * 2; + } + // Если остаток равен 0, ничего не делать + return (int)pow(3, a); +} + +/* Driver Code */ +int main() { + int n = 58; + + // Жадный алгоритм + int res = maxProductCutting(n); + cout << "Максимальное произведение после разрезания = " << res << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_hashing/CMakeLists.txt b/ru/codes/cpp/chapter_hashing/CMakeLists.txt new file mode 100644 index 000000000..6b583ef55 --- /dev/null +++ b/ru/codes/cpp/chapter_hashing/CMakeLists.txt @@ -0,0 +1,6 @@ +add_executable(hash_map hash_map.cpp) +add_executable(array_hash_map_test array_hash_map_test.cpp) +add_executable(hash_map_chaining hash_map_chaining.cpp) +add_executable(hash_map_open_addressing hash_map_open_addressing.cpp) +add_executable(simple_hash simple_hash.cpp) +add_executable(built_in_hash built_in_hash.cpp) \ No newline at end of file diff --git a/ru/codes/cpp/chapter_hashing/array_hash_map.cpp b/ru/codes/cpp/chapter_hashing/array_hash_map.cpp new file mode 100644 index 000000000..30d83a080 --- /dev/null +++ b/ru/codes/cpp/chapter_hashing/array_hash_map.cpp @@ -0,0 +1,110 @@ +/** + * File: array_hash_map.cpp + * Created Time: 2022-12-14 + * Author: msk397 (machangxinq@gmail.com) + */ + +#include "../utils/common.hpp" + +/* Пара ключ-значение */ +struct Pair { + public: + int key; + string val; + Pair(int key, string val) { + this->key = key; + this->val = val; + } +}; + +/* Хеш-таблица на основе массива */ +class ArrayHashMap { + private: + vector buckets; + + public: + ArrayHashMap() { + // Инициализировать массив, содержащий 100 корзин + buckets = vector(100); + } + + ~ArrayHashMap() { + // Освободить память + for (const auto &bucket : buckets) { + delete bucket; + } + buckets.clear(); + } + + /* Хеш-функция */ + int hashFunc(int key) { + int index = key % 100; + return index; + } + + /* Операция поиска */ + string get(int key) { + int index = hashFunc(key); + Pair *pair = buckets[index]; + if (pair == nullptr) + return ""; + return pair->val; + } + + /* Операция добавления */ + void put(int key, string val) { + Pair *pair = new Pair(key, val); + int index = hashFunc(key); + buckets[index] = pair; + } + + /* Операция удаления */ + void remove(int key) { + int index = hashFunc(key); + // Освободить память и присвоить nullptr + delete buckets[index]; + buckets[index] = nullptr; + } + + /* Получить все пары ключ-значение */ + vector pairSet() { + vector pairSet; + for (Pair *pair : buckets) { + if (pair != nullptr) { + pairSet.push_back(pair); + } + } + return pairSet; + } + + /* Получить все ключи */ + vector keySet() { + vector keySet; + for (Pair *pair : buckets) { + if (pair != nullptr) { + keySet.push_back(pair->key); + } + } + return keySet; + } + + /* Получить все значения */ + vector valueSet() { + vector valueSet; + for (Pair *pair : buckets) { + if (pair != nullptr) { + valueSet.push_back(pair->val); + } + } + return valueSet; + } + + /* Вывести хеш-таблицу */ + void print() { + for (Pair *kv : pairSet()) { + cout << kv->key << " -> " << kv->val << endl; + } + } +}; + +// Тестовые примеры см. в array_hash_map_test.cpp diff --git a/ru/codes/cpp/chapter_hashing/array_hash_map_test.cpp b/ru/codes/cpp/chapter_hashing/array_hash_map_test.cpp new file mode 100644 index 000000000..e2d596e57 --- /dev/null +++ b/ru/codes/cpp/chapter_hashing/array_hash_map_test.cpp @@ -0,0 +1,52 @@ +/** + * File: array_hash_map_test.cpp + * Created Time: 2022-12-14 + * Author: msk397 (machangxinq@gmail.com) + */ + +#include "./array_hash_map.cpp" + +/* Driver Code */ +int main() { + /* Инициализация хеш-таблицы */ + ArrayHashMap map = ArrayHashMap(); + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.put(12836, "Сяо Ха"); + map.put(15937, "Сяо Ло"); + map.put(16750, "Сяо Суань"); + map.put(13276, "Сяо Фа"); + map.put(10583, "Сяо Я"); + cout << "\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение" << endl; + map.print(); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + string name = map.get(15937); + cout << "\nДля студенческого номера 15937 найдено имя " << name << endl; + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(10583); + cout << "\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение" << endl; + map.print(); + + /* Обход хеш-таблицы */ + cout << "\nОтдельный обход пар ключ-значение" << endl; + for (auto kv : map.pairSet()) { + cout << kv->key << " -> " << kv->val << endl; + } + + cout << "\nОтдельный обход ключей" << endl; + for (auto key : map.keySet()) { + cout << key << endl; + } + + cout << "\nОтдельный обход значений" << endl; + for (auto val : map.valueSet()) { + cout << val << endl; + } + + return 0; +} diff --git a/ru/codes/cpp/chapter_hashing/built_in_hash.cpp b/ru/codes/cpp/chapter_hashing/built_in_hash.cpp new file mode 100644 index 000000000..55d3d1d38 --- /dev/null +++ b/ru/codes/cpp/chapter_hashing/built_in_hash.cpp @@ -0,0 +1,29 @@ +/** + * File: built_in_hash.cpp + * Created Time: 2023-06-21 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Driver Code */ +int main() { + int num = 3; + size_t hashNum = hash()(num); + cout << "Хеш-значение целого числа " << num << " = " << hashNum << "\n"; + + bool bol = true; + size_t hashBol = hash()(bol); + cout << "Хеш-значение булева значения " << bol << " = " << hashBol << "\n"; + + double dec = 3.14159; + size_t hashDec = hash()(dec); + cout << "Хеш-значение десятичного числа " << dec << " = " << hashDec << "\n"; + + string str = "Hello Algo"; + size_t hashStr = hash()(str); + cout << "Хеш-значение строки " << str << " = " << hashStr << "\n"; + + // В C++ встроенный std::hash() предоставляет вычисление хеша только для базовых типов данных + // Вычисление хеша для массивов и объектов нужно реализовывать самостоятельно +} diff --git a/ru/codes/cpp/chapter_hashing/hash_map.cpp b/ru/codes/cpp/chapter_hashing/hash_map.cpp new file mode 100644 index 000000000..7e076327e --- /dev/null +++ b/ru/codes/cpp/chapter_hashing/hash_map.cpp @@ -0,0 +1,46 @@ +/** + * File: hash_map.cpp + * Created Time: 2022-12-14 + * Author: msk397 (machangxinq@gmail.com) + */ + +#include "../utils/common.hpp" + +/* Driver Code */ +int main() { + /* Инициализация хеш-таблицы */ + unordered_map map; + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map[12836] = "Сяо Ха"; + map[15937] = "Сяо Ло"; + map[16750] = "Сяо Суань"; + map[13276] = "Сяо Фа"; + map[10583] = "Сяо Я"; + cout << "\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение" << endl; + printHashMap(map); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + string name = map[15937]; + cout << "\nДля студенческого номера 15937 найдено имя " << name << endl; + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.erase(10583); + cout << "\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение" << endl; + printHashMap(map); + + /* Обход хеш-таблицы */ + cout << "\nОтдельный обход пар ключ-значение" << endl; + for (auto kv : map) { + cout << kv.first << " -> " << kv.second << endl; + } + cout << "\nОбход пар Key->Value с помощью итератора" << endl; + for (auto iter = map.begin(); iter != map.end(); iter++) { + cout << iter->first << "->" << iter->second << endl; + } + + return 0; +} diff --git a/ru/codes/cpp/chapter_hashing/hash_map_chaining.cpp b/ru/codes/cpp/chapter_hashing/hash_map_chaining.cpp new file mode 100644 index 000000000..953c2d558 --- /dev/null +++ b/ru/codes/cpp/chapter_hashing/hash_map_chaining.cpp @@ -0,0 +1,150 @@ +/** + * File: hash_map_chaining.cpp + * Created Time: 2023-06-13 + * Author: krahets (krahets@163.com) + */ + +#include "./array_hash_map.cpp" + +/* Хеш-таблица с цепочками */ +class HashMapChaining { + private: + int size; // Число пар ключ-значение + int capacity; // Вместимость хеш-таблицы + double loadThres; // Порог коэффициента загрузки для запуска расширения + int extendRatio; // Коэффициент расширения + vector> buckets; // Массив корзин + + public: + /* Конструктор */ + HashMapChaining() : size(0), capacity(4), loadThres(2.0 / 3.0), extendRatio(2) { + buckets.resize(capacity); + } + + /* Метод-деструктор */ + ~HashMapChaining() { + for (auto &bucket : buckets) { + for (Pair *pair : bucket) { + // Освободить память + delete pair; + } + } + } + + /* Хеш-функция */ + int hashFunc(int key) { + return key % capacity; + } + + /* Коэффициент загрузки */ + double loadFactor() { + return (double)size / (double)capacity; + } + + /* Операция поиска */ + string get(int key) { + int index = hashFunc(key); + // Обойти корзину; если найден key, вернуть соответствующее val + for (Pair *pair : buckets[index]) { + if (pair->key == key) { + return pair->val; + } + } + // Если key не найден, вернуть пустую строку + return ""; + } + + /* Операция добавления */ + void put(int key, string val) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if (loadFactor() > loadThres) { + extend(); + } + int index = hashFunc(key); + // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть + for (Pair *pair : buckets[index]) { + if (pair->key == key) { + pair->val = val; + return; + } + } + // Если такого key нет, добавить пару ключ-значение в конец + buckets[index].push_back(new Pair(key, val)); + size++; + } + + /* Операция удаления */ + void remove(int key) { + int index = hashFunc(key); + auto &bucket = buckets[index]; + // Обойти корзину и удалить из нее пару ключ-значение + for (int i = 0; i < bucket.size(); i++) { + if (bucket[i]->key == key) { + Pair *tmp = bucket[i]; + bucket.erase(bucket.begin() + i); // Удалить из него пару ключ-значение + delete tmp; // Освободить память + size--; + return; + } + } + } + + /* Расширить хеш-таблицу */ + void extend() { + // Временно сохранить исходную хеш-таблицу + vector> bucketsTmp = buckets; + // Инициализация новой хеш-таблицы после расширения + capacity *= extendRatio; + buckets.clear(); + buckets.resize(capacity); + size = 0; + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for (auto &bucket : bucketsTmp) { + for (Pair *pair : bucket) { + put(pair->key, pair->val); + // Освободить память + delete pair; + } + } + } + + /* Вывести хеш-таблицу */ + void print() { + for (auto &bucket : buckets) { + cout << "["; + for (Pair *pair : bucket) { + cout << pair->key << " -> " << pair->val << ", "; + } + cout << "]\n"; + } + } +}; + +/* Driver Code */ +int main() { + /* Инициализация хеш-таблицы */ + HashMapChaining map = HashMapChaining(); + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.put(12836, "Сяо Ха"); + map.put(15937, "Сяо Ло"); + map.put(16750, "Сяо Суань"); + map.put(13276, "Сяо Фа"); + map.put(10583, "Сяо Я"); + cout << "\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение" << endl; + map.print(); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + string name = map.get(13276); + cout << "\nДля студенческого номера 13276 найдено имя " << name << endl; + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(12836); + cout << "\nПосле удаления 12836 хеш-таблица имеет вид\nКлюч -> Значение" << endl; + map.print(); + + return 0; +} diff --git a/ru/codes/cpp/chapter_hashing/hash_map_open_addressing.cpp b/ru/codes/cpp/chapter_hashing/hash_map_open_addressing.cpp new file mode 100644 index 000000000..a41ac0d79 --- /dev/null +++ b/ru/codes/cpp/chapter_hashing/hash_map_open_addressing.cpp @@ -0,0 +1,171 @@ +/** + * File: hash_map_open_addressing.cpp + * Created Time: 2023-06-13 + * Author: krahets (krahets@163.com) + */ + +#include "./array_hash_map.cpp" + +/* Хеш-таблица с открытой адресацией */ +class HashMapOpenAddressing { + private: + int size; // Число пар ключ-значение + int capacity = 4; // Вместимость хеш-таблицы + const double loadThres = 2.0 / 3.0; // Порог коэффициента загрузки для запуска расширения + const int extendRatio = 2; // Коэффициент расширения + vector buckets; // Массив корзин + Pair *TOMBSTONE = new Pair(-1, "-1"); // Удалить метку + + public: + /* Конструктор */ + HashMapOpenAddressing() : size(0), buckets(capacity, nullptr) { + } + + /* Метод-деструктор */ + ~HashMapOpenAddressing() { + for (Pair *pair : buckets) { + if (pair != nullptr && pair != TOMBSTONE) { + delete pair; + } + } + delete TOMBSTONE; + } + + /* Хеш-функция */ + int hashFunc(int key) { + return key % capacity; + } + + /* Коэффициент загрузки */ + double loadFactor() { + return (double)size / capacity; + } + + /* Найти индекс корзины, соответствующий key */ + int findBucket(int key) { + int index = hashFunc(key); + int firstTombstone = -1; + // Выполнять линейное пробирование и завершить при встрече с пустой корзиной + while (buckets[index] != nullptr) { + // Если встретился key, вернуть соответствующий индекс корзины + if (buckets[index]->key == key) { + // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс + if (firstTombstone != -1) { + buckets[firstTombstone] = buckets[index]; + buckets[index] = TOMBSTONE; + return firstTombstone; // Вернуть индекс корзины после перемещения + } + return index; // Вернуть индекс корзины + } + // Записать первую встретившуюся метку удаления + if (firstTombstone == -1 && buckets[index] == TOMBSTONE) { + firstTombstone = index; + } + // Вычислить индекс корзины; при выходе за конец вернуться к началу + index = (index + 1) % capacity; + } + // Если key не существует, вернуть индекс точки добавления + return firstTombstone == -1 ? index : firstTombstone; + } + + /* Операция поиска */ + string get(int key) { + // Найти индекс корзины, соответствующий key + int index = findBucket(key); + // Если пара ключ-значение найдена, вернуть соответствующее val + if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) { + return buckets[index]->val; + } + // Если пары ключ-значение не существует, вернуть пустую строку + return ""; + } + + /* Операция добавления */ + void put(int key, string val) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if (loadFactor() > loadThres) { + extend(); + } + // Найти индекс корзины, соответствующий key + int index = findBucket(key); + // Если пара ключ-значение найдена, перезаписать val и вернуть + if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) { + buckets[index]->val = val; + return; + } + // Если пары ключ-значение нет, добавить ее + buckets[index] = new Pair(key, val); + size++; + } + + /* Операция удаления */ + void remove(int key) { + // Найти индекс корзины, соответствующий key + int index = findBucket(key); + // Если пара ключ-значение найдена, заменить ее меткой удаления + if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) { + delete buckets[index]; + buckets[index] = TOMBSTONE; + size--; + } + } + + /* Расширить хеш-таблицу */ + void extend() { + // Временно сохранить исходную хеш-таблицу + vector bucketsTmp = buckets; + // Инициализация новой хеш-таблицы после расширения + capacity *= extendRatio; + buckets = vector(capacity, nullptr); + size = 0; + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for (Pair *pair : bucketsTmp) { + if (pair != nullptr && pair != TOMBSTONE) { + put(pair->key, pair->val); + delete pair; + } + } + } + + /* Вывести хеш-таблицу */ + void print() { + for (Pair *pair : buckets) { + if (pair == nullptr) { + cout << "nullptr" << endl; + } else if (pair == TOMBSTONE) { + cout << "TOMBSTONE" << endl; + } else { + cout << pair->key << " -> " << pair->val << endl; + } + } + } +}; + +/* Driver Code */ +int main() { + // Инициализация хеш-таблицы + HashMapOpenAddressing hashmap; + + // Операция добавления + // Добавить пару (key, val) в хеш-таблицу + hashmap.put(12836, "Сяо Ха"); + hashmap.put(15937, "Сяо Ло"); + hashmap.put(16750, "Сяо Суань"); + hashmap.put(13276, "Сяо Фа"); + hashmap.put(10583, "Сяо Я"); + cout << "\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение" << endl; + hashmap.print(); + + // Операция поиска + // Передать ключ key в хеш-таблицу и получить значение val + string name = hashmap.get(13276); + cout << "\nДля студенческого номера 13276 найдено имя " << name << endl; + + // Операция удаления + // Удалить пару (key, val) из хеш-таблицы + hashmap.remove(16750); + cout << "\nПосле удаления 16750 хеш-таблица имеет вид\nКлюч -> Значение" << endl; + hashmap.print(); + + return 0; +} diff --git a/ru/codes/cpp/chapter_hashing/simple_hash.cpp b/ru/codes/cpp/chapter_hashing/simple_hash.cpp new file mode 100644 index 000000000..a49b62182 --- /dev/null +++ b/ru/codes/cpp/chapter_hashing/simple_hash.cpp @@ -0,0 +1,66 @@ +/** + * File: simple_hash.cpp + * Created Time: 2023-06-21 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Аддитивное хеширование */ +int addHash(string key) { + long long hash = 0; + const int MODULUS = 1000000007; + for (unsigned char c : key) { + hash = (hash + (int)c) % MODULUS; + } + return (int)hash; +} + +/* Мультипликативное хеширование */ +int mulHash(string key) { + long long hash = 0; + const int MODULUS = 1000000007; + for (unsigned char c : key) { + hash = (31 * hash + (int)c) % MODULUS; + } + return (int)hash; +} + +/* XOR-хеширование */ +int xorHash(string key) { + int hash = 0; + const int MODULUS = 1000000007; + for (unsigned char c : key) { + hash ^= (int)c; + } + return hash & MODULUS; +} + +/* Хеширование с циклическим сдвигом */ +int rotHash(string key) { + long long hash = 0; + const int MODULUS = 1000000007; + for (unsigned char c : key) { + hash = ((hash << 4) ^ (hash >> 28) ^ (int)c) % MODULUS; + } + return (int)hash; +} + +/* Driver Code */ +int main() { + string key = "Hello Algo"; + + int hash = addHash(key); + cout << "Хеш суммы = " << hash << endl; + + hash = mulHash(key); + cout << "Хеш произведения = " << hash << endl; + + hash = xorHash(key); + cout << "XOR-хеш = " << hash << endl; + + hash = rotHash(key); + cout << "Хеш с циклическим сдвигом = " << hash << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_heap/CMakeLists.txt b/ru/codes/cpp/chapter_heap/CMakeLists.txt new file mode 100644 index 000000000..1ac33a44f --- /dev/null +++ b/ru/codes/cpp/chapter_heap/CMakeLists.txt @@ -0,0 +1,3 @@ +add_executable(heap heap.cpp) +add_executable(my_heap my_heap.cpp) +add_executable(top_k top_k.cpp) diff --git a/ru/codes/cpp/chapter_heap/heap.cpp b/ru/codes/cpp/chapter_heap/heap.cpp new file mode 100644 index 000000000..973018009 --- /dev/null +++ b/ru/codes/cpp/chapter_heap/heap.cpp @@ -0,0 +1,66 @@ +/** + * File: heap.cpp + * Created Time: 2023-01-19 + * Author: LoneRanger(836253168@qq.com) + */ + +#include "../utils/common.hpp" + +void testPush(priority_queue &heap, int val) { + heap.push(val); // Добавление элемента в кучу + cout << "\nПосле добавления элемента " << val << " в кучу" << endl; + printHeap(heap); +} + +void testPop(priority_queue &heap) { + int val = heap.top(); + heap.pop(); + cout << "\nПосле извлечения верхнего элемента " << val << " из кучи" << endl; + printHeap(heap); +} + +/* Driver Code */ +int main() { + /* Инициализация кучи */ + // Инициализировать минимальную кучу + // priority_queue, greater> minHeap; + // Инициализировать максимальную кучу + priority_queue, less> maxHeap; + + cout << "\nНиже приведены тестовые примеры для max-heap" << endl; + + /* Добавление элемента в кучу */ + testPush(maxHeap, 1); + testPush(maxHeap, 3); + testPush(maxHeap, 2); + testPush(maxHeap, 5); + testPush(maxHeap, 4); + + /* Получение элемента с вершины кучи */ + int peek = maxHeap.top(); + cout << "\nВерхний элемент кучи = " << peek << endl; + + /* Извлечение элемента с вершины кучи */ + testPop(maxHeap); + testPop(maxHeap); + testPop(maxHeap); + testPop(maxHeap); + testPop(maxHeap); + + /* Получение размера кучи */ + int size = maxHeap.size(); + cout << "\nКоличество элементов в куче = " << size << endl; + + /* Проверка, пуста ли куча */ + bool isEmpty = maxHeap.empty(); + cout << "\nПуста ли куча: " << isEmpty << endl; + + /* Построить кучу по входному списку */ + // Временная сложность равна O(n), а не O(nlogn) + vector input{1, 3, 2, 5, 4}; + priority_queue, greater> minHeap(input.begin(), input.end()); + cout << "После построения min-heap из входного списка" << endl; + printHeap(minHeap); + + return 0; +} diff --git a/ru/codes/cpp/chapter_heap/my_heap.cpp b/ru/codes/cpp/chapter_heap/my_heap.cpp new file mode 100644 index 000000000..8143b4eec --- /dev/null +++ b/ru/codes/cpp/chapter_heap/my_heap.cpp @@ -0,0 +1,155 @@ +/** + * File: my_heap.cpp + * Created Time: 2023-02-04 + * Author: LoneRanger (836253168@qq.com), what-is-me (whatisme@outlook.jp) + */ + +#include "../utils/common.hpp" + +/* Максимальная куча */ +class MaxHeap { + private: + // Использовать динамический массив, чтобы не учитывать проблему расширения + vector maxHeap; + + /* Получить индекс левого дочернего узла */ + int left(int i) { + return 2 * i + 1; + } + + /* Получить индекс правого дочернего узла */ + int right(int i) { + return 2 * i + 2; + } + + /* Получить индекс родительского узла */ + int parent(int i) { + return (i - 1) / 2; // Округление вниз при делении + } + + /* Начиная с узла i, выполнить просеивание снизу вверх */ + void siftUp(int i) { + while (true) { + // Получение родительского узла для узла i + int p = parent(i); + // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления» + if (p < 0 || maxHeap[i] <= maxHeap[p]) + break; + // Поменять два узла местами + swap(maxHeap[i], maxHeap[p]); + // Циклическое просеивание вверх + i = p; + } + } + + /* Начиная с узла i, выполнить просеивание сверху вниз */ + void siftDown(int i) { + while (true) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + int l = left(i), r = right(i), ma = i; + if (l < size() && maxHeap[l] > maxHeap[ma]) + ma = l; + if (r < size() && maxHeap[r] > maxHeap[ma]) + ma = r; + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (ma == i) + break; + swap(maxHeap[i], maxHeap[ma]); + // Циклическое просеивание вниз + i = ma; + } + } + + public: + /* Конструктор, строящий кучу по входному списку */ + MaxHeap(vector nums) { + // Добавить элементы списка в кучу без изменений + maxHeap = nums; + // Выполнить heapify для всех узлов, кроме листовых + for (int i = parent(size() - 1); i >= 0; i--) { + siftDown(i); + } + } + + /* Получение размера кучи */ + int size() { + return maxHeap.size(); + } + + /* Проверка, пуста ли куча */ + bool isEmpty() { + return size() == 0; + } + + /* Доступ к элементу на вершине кучи */ + int peek() { + return maxHeap[0]; + } + + /* Добавление элемента в кучу */ + void push(int val) { + // Добавление узла + maxHeap.push_back(val); + // Просеивание снизу вверх + siftUp(size() - 1); + } + + /* Извлечение элемента из кучи */ + void pop() { + // Обработка пустого случая + if (isEmpty()) { + throw out_of_range("куча пуста"); + } + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + swap(maxHeap[0], maxHeap[size() - 1]); + // Удаление узла + maxHeap.pop_back(); + // Просеивание сверху вниз + siftDown(0); + } + + /* Вывести кучу (двоичное дерево) */ + void print() { + cout << "Массивное представление кучи:"; + printVector(maxHeap); + cout << "Древовидное представление кучи:" << endl; + TreeNode *root = vectorToTree(maxHeap); + printTree(root); + freeMemoryTree(root); + } +}; + +/* Driver Code */ +int main() { + /* Инициализация максимальной кучи */ + vector vec{9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2}; + MaxHeap maxHeap(vec); + cout << "\nПосле построения кучи из входного списка" << endl; + maxHeap.print(); + + /* Получение элемента с вершины кучи */ + int peek = maxHeap.peek(); + cout << "\nВерхний элемент кучи = " << peek << endl; + + /* Добавление элемента в кучу */ + int val = 7; + maxHeap.push(val); + cout << "\nПосле добавления элемента " << val << " в кучу" << endl; + maxHeap.print(); + + /* Извлечение элемента с вершины кучи */ + peek = maxHeap.peek(); + maxHeap.pop(); + cout << "\nПосле извлечения верхнего элемента " << peek << " из кучи" << endl; + maxHeap.print(); + + /* Получение размера кучи */ + int size = maxHeap.size(); + cout << "\nКоличество элементов в куче = " << size << endl; + + /* Проверка, пуста ли куча */ + bool isEmpty = maxHeap.isEmpty(); + cout << "\nПуста ли куча: " << isEmpty << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_heap/top_k.cpp b/ru/codes/cpp/chapter_heap/top_k.cpp new file mode 100644 index 000000000..63775fedb --- /dev/null +++ b/ru/codes/cpp/chapter_heap/top_k.cpp @@ -0,0 +1,38 @@ +/** + * File: top_k.cpp + * Created Time: 2023-06-12 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Найти k наибольших элементов массива с помощью кучи */ +priority_queue, greater> topKHeap(vector &nums, int k) { + // Инициализация минимальной кучи + priority_queue, greater> heap; + // Поместить первые k элементов массива в кучу + for (int i = 0; i < k; i++) { + heap.push(nums[i]); + } + // Начиная с элемента k+1, поддерживать длину кучи равной k + for (int i = k; i < nums.size(); i++) { + // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу + if (nums[i] > heap.top()) { + heap.pop(); + heap.push(nums[i]); + } + } + return heap; +} + +// Driver Code +int main() { + vector nums = {1, 7, 6, 3, 2}; + int k = 3; + + priority_queue, greater> res = topKHeap(nums, k); + cout << "Наибольшие " << k << " элементов: "; + printHeap(res); + + return 0; +} diff --git a/ru/codes/cpp/chapter_searching/CMakeLists.txt b/ru/codes/cpp/chapter_searching/CMakeLists.txt new file mode 100644 index 000000000..60a223d83 --- /dev/null +++ b/ru/codes/cpp/chapter_searching/CMakeLists.txt @@ -0,0 +1,4 @@ +add_executable(binary_search binary_search.cpp) +add_executable(binary_search_insertion binary_search_insertion.cpp) +add_executable(binary_search_edge binary_search_edge.cpp) +add_executable(two_sum two_sum.cpp) diff --git a/ru/codes/cpp/chapter_searching/binary_search.cpp b/ru/codes/cpp/chapter_searching/binary_search.cpp new file mode 100644 index 000000000..c83d28e9f --- /dev/null +++ b/ru/codes/cpp/chapter_searching/binary_search.cpp @@ -0,0 +1,59 @@ +/** + * File: binary_search.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Бинарный поиск (двусторонне замкнутый интервал) */ +int binarySearch(vector &nums, int target) { + // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно + int i = 0, j = nums.size() - 1; + // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст) + while (i <= j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) // Это означает, что target находится в интервале [m+1, j] + i = m + 1; + else if (nums[m] > target) // Это означает, что target находится в интервале [i, m-1] + j = m - 1; + else // Целевой элемент найден, вернуть его индекс + return m; + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +/* Бинарный поиск (лево замкнутый, право открытый интервал) */ +int binarySearchLCRO(vector &nums, int target) { + // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно + int i = 0, j = nums.size(); + // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст) + while (i < j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) // Это означает, что target находится в интервале [m+1, j) + i = m + 1; + else if (nums[m] > target) // Это означает, что target находится в интервале [i, m) + j = m; + else // Целевой элемент найден, вернуть его индекс + return m; + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +/* Driver Code */ +int main() { + int target = 6; + vector nums = {1, 3, 6, 8, 12, 15, 23, 26, 31, 35}; + + /* Бинарный поиск (двусторонне замкнутый интервал) */ + int index = binarySearch(nums, target); + cout << "Индекс целевого элемента 6 = " << index << endl; + + /* Бинарный поиск (лево замкнутый, право открытый интервал) */ + index = binarySearchLCRO(nums, target); + cout << "Индекс целевого элемента 6 = " << index << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_searching/binary_search_edge.cpp b/ru/codes/cpp/chapter_searching/binary_search_edge.cpp new file mode 100644 index 000000000..674db9a8b --- /dev/null +++ b/ru/codes/cpp/chapter_searching/binary_search_edge.cpp @@ -0,0 +1,66 @@ +/** + * File: binary_search_edge.cpp + * Created Time: 2023-08-04 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Бинарный поиск точки вставки (с повторяющимися элементами) */ +int binarySearchInsertion(const vector &nums, int target) { + int i = 0, j = nums.size() - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) { + i = m + 1; // target находится в интервале [m+1, j] + } else { + j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1] + } + } + // Вернуть точку вставки i + return i; +} + +/* Бинарный поиск самого левого target */ +int binarySearchLeftEdge(vector &nums, int target) { + // Эквивалентно поиску точки вставки target + int i = binarySearchInsertion(nums, target); + // target не найден, вернуть -1 + if (i == nums.size() || nums[i] != target) { + return -1; + } + // Найти target и вернуть индекс i + return i; +} + +/* Бинарный поиск самого правого target */ +int binarySearchRightEdge(vector &nums, int target) { + // Преобразовать задачу в поиск самого левого target + 1 + int i = binarySearchInsertion(nums, target + 1); + // j указывает на самый правый target, а i — на первый элемент больше target + int j = i - 1; + // target не найден, вернуть -1 + if (j == -1 || nums[j] != target) { + return -1; + } + // Найти target и вернуть индекс j + return j; +} + +/* Driver Code */ +int main() { + // Массив с повторяющимися элементами + vector nums = {1, 3, 6, 6, 6, 6, 6, 10, 12, 15}; + cout << "\nМассив nums = "; + printVector(nums); + + // Бинарный поиск левой и правой границы + for (int target : {6, 7}) { + int index = binarySearchLeftEdge(nums, target); + cout << "Индекс самого левого элемента " << target << " равен " << index << endl; + index = binarySearchRightEdge(nums, target); + cout << "Индекс самого правого элемента " << target << " равен " << index << endl; + } + + return 0; +} diff --git a/ru/codes/cpp/chapter_searching/binary_search_insertion.cpp b/ru/codes/cpp/chapter_searching/binary_search_insertion.cpp new file mode 100644 index 000000000..60d1afc37 --- /dev/null +++ b/ru/codes/cpp/chapter_searching/binary_search_insertion.cpp @@ -0,0 +1,66 @@ +/** + * File: binary_search_insertion.cpp + * Created Time: 2023-08-04 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Бинарный поиск точки вставки (без повторяющихся элементов) */ +int binarySearchInsertionSimple(vector &nums, int target) { + int i = 0, j = nums.size() - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) { + i = m + 1; // target находится в интервале [m+1, j] + } else if (nums[m] > target) { + j = m - 1; // target находится в интервале [i, m-1] + } else { + return m; // Найти target и вернуть точку вставки m + } + } + // target не найден, вернуть точку вставки i + return i; +} + +/* Бинарный поиск точки вставки (с повторяющимися элементами) */ +int binarySearchInsertion(vector &nums, int target) { + int i = 0, j = nums.size() - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) { + i = m + 1; // target находится в интервале [m+1, j] + } else if (nums[m] > target) { + j = m - 1; // target находится в интервале [i, m-1] + } else { + j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1] + } + } + // Вернуть точку вставки i + return i; +} + +/* Driver Code */ +int main() { + // Массив без повторяющихся элементов + vector nums = {1, 3, 6, 8, 12, 15, 23, 26, 31, 35}; + cout << "\nМассив nums = "; + printVector(nums); + // Бинарный поиск точки вставки + for (int target : {6, 9}) { + int index = binarySearchInsertionSimple(nums, target); + cout << "Индекс позиции вставки элемента " << target << " равен " << index << endl; + } + + // Массив с повторяющимися элементами + nums = {1, 3, 6, 6, 6, 6, 6, 10, 12, 15}; + cout << "\nМассив nums = "; + printVector(nums); + // Бинарный поиск точки вставки + for (int target : {2, 6, 20}) { + int index = binarySearchInsertion(nums, target); + cout << "Индекс позиции вставки элемента " << target << " равен " << index << endl; + } + + return 0; +} diff --git a/ru/codes/cpp/chapter_searching/hashing_search.cpp b/ru/codes/cpp/chapter_searching/hashing_search.cpp new file mode 100644 index 000000000..9fa5f44bd --- /dev/null +++ b/ru/codes/cpp/chapter_searching/hashing_search.cpp @@ -0,0 +1,53 @@ +/** + * File: hashing_search.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Хеш-поиск (массив) */ +int hashingSearchArray(unordered_map map, int target) { + // key хеш-таблицы: целевой элемент, value: индекс + // Если такого key нет в хеш-таблице, вернуть -1 + if (map.find(target) == map.end()) + return -1; + return map[target]; +} + +/* Хеш-поиск (связный список) */ +ListNode *hashingSearchLinkedList(unordered_map map, int target) { + // key хеш-таблицы: значение целевого узла, value: объект узла + // Если такого key нет в хеш-таблице, вернуть nullptr + if (map.find(target) == map.end()) + return nullptr; + return map[target]; +} + +/* Driver Code */ +int main() { + int target = 3; + + /* Хеш-поиск (массив) */ + vector nums = {1, 5, 3, 2, 4, 7, 5, 9, 10, 8}; + // Инициализация хеш-таблицы + unordered_map map; + for (int i = 0; i < nums.size(); i++) { + map[nums[i]] = i; // key: элемент, value: индекс + } + int index = hashingSearchArray(map, target); + cout << "Индекс целевого элемента 3 = " << index << endl; + + /* Хеш-поиск (связный список) */ + ListNode *head = vecToLinkedList(nums); + // Инициализация хеш-таблицы + unordered_map map1; + while (head != nullptr) { + map1[head->val] = head; // key: значение узла, value: узел + head = head->next; + } + ListNode *node = hashingSearchLinkedList(map1, target); + cout << "Объект узла со значением 3 = " << node << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_searching/linear_search.cpp b/ru/codes/cpp/chapter_searching/linear_search.cpp new file mode 100644 index 000000000..31f2514b1 --- /dev/null +++ b/ru/codes/cpp/chapter_searching/linear_search.cpp @@ -0,0 +1,49 @@ +/** + * File: linear_search.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Линейный поиск (массив) */ +int linearSearchArray(vector &nums, int target) { + // Обход массива + for (int i = 0; i < nums.size(); i++) { + // Целевой элемент найден, вернуть его индекс + if (nums[i] == target) + return i; + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +/* Линейный поиск (связный список) */ +ListNode *linearSearchLinkedList(ListNode *head, int target) { + // Обойти связный список + while (head != nullptr) { + // Найти целевой узел и вернуть его + if (head->val == target) + return head; + head = head->next; + } + // Целевой узел не найден, вернуть nullptr + return nullptr; +} + +/* Driver Code */ +int main() { + int target = 3; + + /* Выполнить линейный поиск в массиве */ + vector nums = {1, 5, 3, 2, 4, 7, 5, 9, 10, 8}; + int index = linearSearchArray(nums, target); + cout << "Индекс целевого элемента 3 = " << index << endl; + + /* Выполнить линейный поиск в связном списке */ + ListNode *head = vecToLinkedList(nums); + ListNode *node = linearSearchLinkedList(head, target); + cout << "Объект узла со значением 3 = " << node << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_searching/two_sum.cpp b/ru/codes/cpp/chapter_searching/two_sum.cpp new file mode 100644 index 000000000..1893fef63 --- /dev/null +++ b/ru/codes/cpp/chapter_searching/two_sum.cpp @@ -0,0 +1,54 @@ +/** + * File: two_sum.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Метод 1: полный перебор */ +vector twoSumBruteForce(vector &nums, int target) { + int size = nums.size(); + // Два вложенных цикла, временная сложность O(n^2) + for (int i = 0; i < size - 1; i++) { + for (int j = i + 1; j < size; j++) { + if (nums[i] + nums[j] == target) + return {i, j}; + } + } + return {}; +} + +/* Метод 2: вспомогательная хеш-таблица */ +vector twoSumHashTable(vector &nums, int target) { + int size = nums.size(); + // Вспомогательная хеш-таблица, пространственная сложность O(n) + unordered_map dic; + // Один цикл, временная сложность O(n) + for (int i = 0; i < size; i++) { + if (dic.find(target - nums[i]) != dic.end()) { + return {dic[target - nums[i]], i}; + } + dic.emplace(nums[i], i); + } + return {}; +} + +/* Driver Code */ +int main() { + // ======= Test Case ======= + vector nums = {2, 7, 11, 15}; + int target = 13; + + // ====== Основной код ====== + // Метод 1 + vector res = twoSumBruteForce(nums, target); + cout << "Результат метода 1 res = "; + printVector(res); + // Метод 2 + res = twoSumHashTable(nums, target); + cout << "Результат метода 2 res = "; + printVector(res); + + return 0; +} diff --git a/ru/codes/cpp/chapter_sorting/CMakeLists.txt b/ru/codes/cpp/chapter_sorting/CMakeLists.txt new file mode 100644 index 000000000..e6347cf9f --- /dev/null +++ b/ru/codes/cpp/chapter_sorting/CMakeLists.txt @@ -0,0 +1,6 @@ +add_executable(selection_sort selection_sort.cpp) +add_executable(bubble_sort bubble_sort.cpp) +add_executable(insertion_sort insertion_sort.cpp) +add_executable(merge_sort merge_sort.cpp) +add_executable(quick_sort quick_sort.cpp) +add_executable(heap_sort heap_sort.cpp) \ No newline at end of file diff --git a/ru/codes/cpp/chapter_sorting/bubble_sort.cpp b/ru/codes/cpp/chapter_sorting/bubble_sort.cpp new file mode 100644 index 000000000..7801f0d10 --- /dev/null +++ b/ru/codes/cpp/chapter_sorting/bubble_sort.cpp @@ -0,0 +1,56 @@ +/** + * File: bubble_sort.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Пузырьковая сортировка */ +void bubbleSort(vector &nums) { + // Внешний цикл: неотсортированный диапазон [0, i] + for (int i = nums.size() - 1; i > 0; i--) { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (int j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + // Здесь используется функция std::swap() + swap(nums[j], nums[j + 1]); + } + } + } +} + +/* Пузырьковая сортировка (оптимизация флагом) */ +void bubbleSortWithFlag(vector &nums) { + // Внешний цикл: неотсортированный диапазон [0, i] + for (int i = nums.size() - 1; i > 0; i--) { + bool flag = false; // Инициализировать флаг + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (int j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + // Здесь используется функция std::swap() + swap(nums[j], nums[j + 1]); + flag = true; // Записать обмен элементов + } + } + if (!flag) + break; // На этой итерации «всплытия» не было ни одного обмена, сразу выйти + } +} + +/* Driver Code */ +int main() { + vector nums = {4, 1, 3, 1, 5, 2}; + bubbleSort(nums); + cout << "После пузырьковой сортировки nums = "; + printVector(nums); + + vector nums1 = {4, 1, 3, 1, 5, 2}; + bubbleSortWithFlag(nums1); + cout << "После пузырьковой сортировки nums1 = "; + printVector(nums1); + + return 0; +} diff --git a/ru/codes/cpp/chapter_sorting/bucket_sort.cpp b/ru/codes/cpp/chapter_sorting/bucket_sort.cpp new file mode 100644 index 000000000..ad0bc2a90 --- /dev/null +++ b/ru/codes/cpp/chapter_sorting/bucket_sort.cpp @@ -0,0 +1,44 @@ +/** + * File: bucket_sort.cpp + * Created Time: 2023-03-30 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Сортировка корзинами */ +void bucketSort(vector &nums) { + // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину + int k = nums.size() / 2; + vector> buckets(k); + // 1. Распределить элементы массива по корзинам + for (float num : nums) { + // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1] + int i = num * k; + // Добавить num в корзину bucket_idx + buckets[i].push_back(num); + } + // 2. Выполнить сортировку внутри каждой корзины + for (vector &bucket : buckets) { + // Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки + sort(bucket.begin(), bucket.end()); + } + // 3. Обойти корзины и объединить результаты + int i = 0; + for (vector &bucket : buckets) { + for (float num : bucket) { + nums[i++] = num; + } + } +} + +/* Driver Code */ +int main() { + // Пусть входные данные — числа с плавающей точкой из диапазона [0, 1) + vector nums = {0.49f, 0.96f, 0.82f, 0.09f, 0.57f, 0.43f, 0.91f, 0.75f, 0.15f, 0.37f}; + bucketSort(nums); + cout << "После сортировки корзинами nums = "; + printVector(nums); + + return 0; +} diff --git a/ru/codes/cpp/chapter_sorting/counting_sort.cpp b/ru/codes/cpp/chapter_sorting/counting_sort.cpp new file mode 100644 index 000000000..653984812 --- /dev/null +++ b/ru/codes/cpp/chapter_sorting/counting_sort.cpp @@ -0,0 +1,77 @@ +/** + * File: counting_sort.cpp + * Created Time: 2023-03-17 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Сортировка подсчетом */ +// Простая реализация, не подходит для сортировки объектов +void countingSortNaive(vector &nums) { + // 1. Найти максимальный элемент массива m + int m = 0; + for (int num : nums) { + m = max(m, num); + } + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + vector counter(m + 1, 0); + for (int num : nums) { + counter[num]++; + } + // 3. Обойти counter и заполнить исходный массив nums элементами + int i = 0; + for (int num = 0; num < m + 1; num++) { + for (int j = 0; j < counter[num]; j++, i++) { + nums[i] = num; + } + } +} + +/* Сортировка подсчетом */ +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой +void countingSort(vector &nums) { + // 1. Найти максимальный элемент массива m + int m = 0; + for (int num : nums) { + m = max(m, num); + } + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + vector counter(m + 1, 0); + for (int num : nums) { + counter[num]++; + } + // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс» + // То есть counter[num]-1 — это индекс последнего появления num в res + for (int i = 0; i < m; i++) { + counter[i + 1] += counter[i]; + } + // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res + // Инициализировать массив res для хранения результата + int n = nums.size(); + vector res(n); + for (int i = n - 1; i >= 0; i--) { + int num = nums[i]; + res[counter[num] - 1] = num; // Поместить num по соответствующему индексу + counter[num]--; // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num + } + // Перезаписать исходный массив nums массивом результата res + nums = res; +} + +/* Driver Code */ +int main() { + vector nums = {1, 0, 1, 2, 0, 4, 0, 2, 2, 4}; + countingSortNaive(nums); + cout << "После сортировки подсчетом (объекты не поддерживаются) nums = "; + printVector(nums); + + vector nums1 = {1, 0, 1, 2, 0, 4, 0, 2, 2, 4}; + countingSort(nums1); + cout << "После сортировки подсчетом nums1 = "; + printVector(nums1); + + return 0; +} diff --git a/ru/codes/cpp/chapter_sorting/heap_sort.cpp b/ru/codes/cpp/chapter_sorting/heap_sort.cpp new file mode 100644 index 000000000..13c1cf99d --- /dev/null +++ b/ru/codes/cpp/chapter_sorting/heap_sort.cpp @@ -0,0 +1,54 @@ +/** + * File: heap_sort.cpp + * Created Time: 2023-05-26 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */ +void siftDown(vector &nums, int n, int i) { + while (true) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + int l = 2 * i + 1; + int r = 2 * i + 2; + int ma = i; + if (l < n && nums[l] > nums[ma]) + ma = l; + if (r < n && nums[r] > nums[ma]) + ma = r; + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (ma == i) { + break; + } + // Поменять два узла местами + swap(nums[i], nums[ma]); + // Циклическое просеивание вниз + i = ma; + } +} + +/* Сортировка кучей */ +void heapSort(vector &nums) { + // Построение кучи: выполнить heapify для всех узлов, кроме листовых + for (int i = nums.size() / 2 - 1; i >= 0; --i) { + siftDown(nums, nums.size(), i); + } + // Извлекать максимальный элемент из кучи в течение n-1 итераций + for (int i = nums.size() - 1; i > 0; --i) { + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + swap(nums[0], nums[i]); + // Начиная с корневого узла, выполнить просеивание сверху вниз + siftDown(nums, i, 0); + } +} + +/* Driver Code */ +int main() { + vector nums = {4, 1, 3, 1, 5, 2}; + heapSort(nums); + cout << "После сортировки кучей nums = "; + printVector(nums); + + return 0; +} diff --git a/ru/codes/cpp/chapter_sorting/insertion_sort.cpp b/ru/codes/cpp/chapter_sorting/insertion_sort.cpp new file mode 100644 index 000000000..ed5de0072 --- /dev/null +++ b/ru/codes/cpp/chapter_sorting/insertion_sort.cpp @@ -0,0 +1,31 @@ +/** + * File: insertion_sort.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Сортировка вставками */ +void insertionSort(vector &nums) { + // Внешний цикл: отсортированный диапазон [0, i-1] + for (int i = 1; i < nums.size(); i++) { + int base = nums[i], j = i - 1; + // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1] + while (j >= 0 && nums[j] > base) { + nums[j + 1] = nums[j]; // Сдвинуть nums[j] на одну позицию вправо + j--; + } + nums[j + 1] = base; // Поместить base в правильную позицию + } +} + +/* Driver Code */ +int main() { + vector nums = {4, 1, 3, 1, 5, 2}; + insertionSort(nums); + cout << "После сортировки вставками nums = "; + printVector(nums); + + return 0; +} diff --git a/ru/codes/cpp/chapter_sorting/merge_sort.cpp b/ru/codes/cpp/chapter_sorting/merge_sort.cpp new file mode 100644 index 000000000..5efa81412 --- /dev/null +++ b/ru/codes/cpp/chapter_sorting/merge_sort.cpp @@ -0,0 +1,58 @@ +/** + * File: merge_sort.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Объединить левый и правый подмассивы */ +void merge(vector &nums, int left, int mid, int right) { + // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right] + // Создать временный массив tmp для хранения результата слияния + vector tmp(right - left + 1); + // Инициализировать начальные индексы левого и правого подмассивов + int i = left, j = mid + 1, k = 0; + // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив + while (i <= mid && j <= right) { + if (nums[i] <= nums[j]) + tmp[k++] = nums[i++]; + else + tmp[k++] = nums[j++]; + } + // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив + while (i <= mid) { + tmp[k++] = nums[i++]; + } + while (j <= right) { + tmp[k++] = nums[j++]; + } + // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums + for (k = 0; k < tmp.size(); k++) { + nums[left + k] = tmp[k]; + } +} + +/* Сортировка слиянием */ +void mergeSort(vector &nums, int left, int right) { + // Условие завершения + if (left >= right) + return; // Завершить рекурсию, когда длина подмассива равна 1 + // Этап разбиения + int mid = left + (right - left) / 2; // Вычислить середину + mergeSort(nums, left, mid); // Рекурсивно обработать левый подмассив + mergeSort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив + // Этап слияния + merge(nums, left, mid, right); +} + +/* Driver Code */ +int main() { + /* Сортировка слиянием */ + vector nums = {7, 3, 2, 6, 0, 1, 5, 4}; + mergeSort(nums, 0, nums.size() - 1); + cout << "После сортировки слиянием nums = "; + printVector(nums); + + return 0; +} diff --git a/ru/codes/cpp/chapter_sorting/quick_sort.cpp b/ru/codes/cpp/chapter_sorting/quick_sort.cpp new file mode 100644 index 000000000..0a85eabb8 --- /dev/null +++ b/ru/codes/cpp/chapter_sorting/quick_sort.cpp @@ -0,0 +1,145 @@ +/** + * File: quick_sort.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Класс быстрой сортировки */ +class QuickSort { + private: + /* Разбиение с опорными указателями */ + static int partition(vector &nums, int left, int right) { + // Взять nums[left] в качестве опорного элемента + int i = left, j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) + j--; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) + i++; // Идти слева направо в поисках первого элемента больше опорного + swap(nums[i], nums[j]); // Поменять эти два элемента местами + } + swap(nums[i], nums[left]); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + public: + /* Быстрая сортировка */ + static void quickSort(vector &nums, int left, int right) { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) + return; + // Разбиение с опорными указателями + int pivot = partition(nums, left, right); + // Рекурсивно обработать левый и правый подмассивы + quickSort(nums, left, pivot - 1); + quickSort(nums, pivot + 1, right); + } +}; + +/* Класс быстрой сортировки (оптимизация медианным опорным элементом) */ +class QuickSortMedian { + private: + /* Выбрать медиану из трех кандидатов */ + static int medianThree(vector &nums, int left, int mid, int right) { + int l = nums[left], m = nums[mid], r = nums[right]; + if ((l <= m && m <= r) || (r <= m && m <= l)) + return mid; // m находится между l и r + if ((m <= l && l <= r) || (r <= l && l <= m)) + return left; // l находится между m и r + return right; + } + + /* Разбиение с опорными указателями (медиана трех) */ + static int partition(vector &nums, int left, int right) { + // Выбрать медиану из трех кандидатов + int med = medianThree(nums, left, (left + right) / 2, right); + // Переместить медиану в крайний левый элемент массива + swap(nums[left], nums[med]); + // Взять nums[left] в качестве опорного элемента + int i = left, j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) + j--; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) + i++; // Идти слева направо в поисках первого элемента больше опорного + swap(nums[i], nums[j]); // Поменять эти два элемента местами + } + swap(nums[i], nums[left]); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + public: + /* Быстрая сортировка */ + static void quickSort(vector &nums, int left, int right) { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) + return; + // Разбиение с опорными указателями + int pivot = partition(nums, left, right); + // Рекурсивно обработать левый и правый подмассивы + quickSort(nums, left, pivot - 1); + quickSort(nums, pivot + 1, right); + } +}; + +/* Класс быстрой сортировки (оптимизация глубины рекурсии) */ +class QuickSortTailCall { + private: + /* Разбиение с опорными указателями */ + static int partition(vector &nums, int left, int right) { + // Взять nums[left] в качестве опорного элемента + int i = left, j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) + j--; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) + i++; // Идти слева направо в поисках первого элемента больше опорного + swap(nums[i], nums[j]); // Поменять эти два элемента местами + } + swap(nums[i], nums[left]); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + public: + /* Быстрая сортировка (оптимизация глубины рекурсии) */ + static void quickSort(vector &nums, int left, int right) { + // Завершить, когда длина подмассива равна 1 + while (left < right) { + // Операция разбиения с опорными указателями + int pivot = partition(nums, left, right); + // Выполнить быструю сортировку для более короткого из двух подмассивов + if (pivot - left < right - pivot) { + quickSort(nums, left, pivot - 1); // Рекурсивно отсортировать левый подмассив + left = pivot + 1; // Оставшийся неотсортированный диапазон: [pivot + 1, right] + } else { + quickSort(nums, pivot + 1, right); // Рекурсивно отсортировать правый подмассив + right = pivot - 1; // Оставшийся неотсортированный диапазон: [left, pivot - 1] + } + } + } +}; + +/* Driver Code */ +int main() { + /* Быстрая сортировка */ + vector nums{2, 4, 1, 0, 3, 5}; + QuickSort::quickSort(nums, 0, nums.size() - 1); + cout << "После быстрой сортировки nums = "; + printVector(nums); + + /* Быстрая сортировка (оптимизация медианным опорным элементом) */ + vector nums1 = {2, 4, 1, 0, 3, 5}; + QuickSortMedian::quickSort(nums1, 0, nums1.size() - 1); + cout << "После быстрой сортировки (оптимизация медианным опорным элементом) nums = "; + printVector(nums1); + + /* Быстрая сортировка (оптимизация глубины рекурсии) */ + vector nums2 = {2, 4, 1, 0, 3, 5}; + QuickSortTailCall::quickSort(nums2, 0, nums2.size() - 1); + cout << "После быстрой сортировки (оптимизация глубины рекурсии) nums = "; + printVector(nums2); + + return 0; +} diff --git a/ru/codes/cpp/chapter_sorting/radix_sort.cpp b/ru/codes/cpp/chapter_sorting/radix_sort.cpp new file mode 100644 index 000000000..0186d2225 --- /dev/null +++ b/ru/codes/cpp/chapter_sorting/radix_sort.cpp @@ -0,0 +1,65 @@ +/** + * File: radix_sort.cpp + * Created Time: 2023-03-26 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Получить k-й разряд элемента num, где exp = 10^(k-1) */ +int digit(int num, int exp) { + // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени + return (num / exp) % 10; +} + +/* Сортировка подсчетом (сортировка по k-му разряду nums) */ +void countingSortDigit(vector &nums, int exp) { + // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10 + vector counter(10, 0); + int n = nums.size(); + // Подсчитать число появлений каждой цифры от 0 до 9 + for (int i = 0; i < n; i++) { + int d = digit(nums[i], exp); // Получить k-й разряд nums[i], обозначив его как d + counter[d]++; // Подсчитать число появлений цифры d + } + // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива» + for (int i = 1; i < 10; i++) { + counter[i] += counter[i - 1]; + } + // Выполняя обратный проход, заполнить res элементами по статистике в корзинах + vector res(n, 0); + for (int i = n - 1; i >= 0; i--) { + int d = digit(nums[i], exp); + int j = counter[d] - 1; // Получить индекс j цифры d в массиве + res[j] = nums[i]; // Поместить текущий элемент по индексу j + counter[d]--; // Уменьшить количество d на 1 + } + // Перезаписать исходный массив nums результатом + for (int i = 0; i < n; i++) + nums[i] = res[i]; +} + +/* Поразрядная сортировка */ +void radixSort(vector &nums) { + // Получить максимальный элемент массива, чтобы определить максимальное число разрядов + int m = *max_element(nums.begin(), nums.end()); + // Проходить разряды от младшего к старшему + for (int exp = 1; exp <= m; exp *= 10) + // Выполнить сортировку подсчетом по k-му разряду элементов массива + // k = 1 -> exp = 1 + // k = 2 -> exp = 10 + // то есть exp = 10^(k-1) + countingSortDigit(nums, exp); +} + +/* Driver Code */ +int main() { + // Поразрядная сортировка + vector nums = {10546151, 35663510, 42865989, 34862445, 81883077, + 88906420, 72429244, 30524779, 82060337, 63832996}; + radixSort(nums); + cout << "После поразрядной сортировки nums = "; + printVector(nums); + + return 0; +} diff --git a/ru/codes/cpp/chapter_sorting/selection_sort.cpp b/ru/codes/cpp/chapter_sorting/selection_sort.cpp new file mode 100644 index 000000000..cd4464be2 --- /dev/null +++ b/ru/codes/cpp/chapter_sorting/selection_sort.cpp @@ -0,0 +1,34 @@ +/** + * File: selection_sort.cpp + * Created Time: 2023-05-23 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Сортировка выбором */ +void selectionSort(vector &nums) { + int n = nums.size(); + // Внешний цикл: неотсортированный диапазон [i, n-1] + for (int i = 0; i < n - 1; i++) { + // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне + int k = i; + for (int j = i + 1; j < n; j++) { + if (nums[j] < nums[k]) + k = j; // Записать индекс минимального элемента + } + // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона + swap(nums[i], nums[k]); + } +} + +/* Driver Code */ +int main() { + vector nums = {4, 1, 3, 1, 5, 2}; + selectionSort(nums); + + cout << "После сортировки выбором nums = "; + printVector(nums); + + return 0; +} diff --git a/ru/codes/cpp/chapter_stack_and_queue/CMakeLists.txt b/ru/codes/cpp/chapter_stack_and_queue/CMakeLists.txt new file mode 100644 index 000000000..b55878a17 --- /dev/null +++ b/ru/codes/cpp/chapter_stack_and_queue/CMakeLists.txt @@ -0,0 +1,9 @@ +add_executable(array_deque array_deque.cpp) +add_executable(array_queue array_queue.cpp) +add_executable(array_stack array_stack.cpp) +add_executable(deque deque.cpp) +add_executable(linkedlist_deque linkedlist_deque.cpp) +add_executable(linkedlist_queue linkedlist_queue.cpp) +add_executable(linkedlist_stack linkedlist_stack.cpp) +add_executable(queue queue.cpp) +add_executable(stack stack.cpp) diff --git a/ru/codes/cpp/chapter_stack_and_queue/array_deque.cpp b/ru/codes/cpp/chapter_stack_and_queue/array_deque.cpp new file mode 100644 index 000000000..d374af324 --- /dev/null +++ b/ru/codes/cpp/chapter_stack_and_queue/array_deque.cpp @@ -0,0 +1,156 @@ +/** + * File: array_deque.cpp + * Created Time: 2023-03-02 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Двусторонняя очередь на основе кольцевого массива */ +class ArrayDeque { + private: + vector nums; // Массив для хранения элементов двусторонней очереди + int front; // Указатель head, указывающий на первый элемент очереди + int queSize; // Длина двусторонней очереди + + public: + /* Конструктор */ + ArrayDeque(int capacity) { + nums.resize(capacity); + front = queSize = 0; + } + + /* Получить вместимость двусторонней очереди */ + int capacity() { + return nums.size(); + } + + /* Получение длины двусторонней очереди */ + int size() { + return queSize; + } + + /* Проверка, пуста ли двусторонняя очередь */ + bool isEmpty() { + return queSize == 0; + } + + /* Вычислить индекс в кольцевом массиве */ + int index(int i) { + // С помощью операции взятия по модулю соединить начало и конец массива + // Когда i выходит за конец массива, он возвращается в начало + // Когда i выходит за начало массива, он возвращается в конец + return (i + capacity()) % capacity(); + } + + /* Добавление в голову очереди */ + void pushFirst(int num) { + if (queSize == capacity()) { + cout << "Двусторонняя очередь заполнена" << endl; + return; + } + // Указатель головы сдвигается на одну позицию влево + // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост + front = index(front - 1); + // Добавить num в голову очереди + nums[front] = num; + queSize++; + } + + /* Добавление в хвост очереди */ + void pushLast(int num) { + if (queSize == capacity()) { + cout << "Двусторонняя очередь заполнена" << endl; + return; + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + int rear = index(front + queSize); + // Добавить num в хвост очереди + nums[rear] = num; + queSize++; + } + + /* Извлечение из головы очереди */ + int popFirst() { + int num = peekFirst(); + // Указатель головы сдвигается на одну позицию назад + front = index(front + 1); + queSize--; + return num; + } + + /* Извлечение из хвоста очереди */ + int popLast() { + int num = peekLast(); + queSize--; + return num; + } + + /* Доступ к элементу в начале очереди */ + int peekFirst() { + if (isEmpty()) + throw out_of_range("двусторонняя очередь пуста"); + return nums[front]; + } + + /* Доступ к элементу в конце очереди */ + int peekLast() { + if (isEmpty()) + throw out_of_range("двусторонняя очередь пуста"); + // Вычислить индекс хвостового элемента + int last = index(front + queSize - 1); + return nums[last]; + } + + /* Вернуть массив для вывода */ + vector toVector() { + // Преобразовывать только элементы списка в пределах фактической длины + vector res(queSize); + for (int i = 0, j = front; i < queSize; i++, j++) { + res[i] = nums[index(j)]; + } + return res; + } +}; + +/* Driver Code */ +int main() { + /* Инициализация двусторонней очереди */ + ArrayDeque *deque = new ArrayDeque(10); + deque->pushLast(3); + deque->pushLast(2); + deque->pushLast(5); + cout << "Двусторонняя очередь deque = "; + printVector(deque->toVector()); + + /* Доступ к элементу */ + int peekFirst = deque->peekFirst(); + cout << "Первый элемент peekFirst = " << peekFirst << endl; + int peekLast = deque->peekLast(); + cout << "Последний элемент peekLast = " << peekLast << endl; + + /* Добавление элемента в очередь */ + deque->pushLast(4); + cout << "После добавления элемента 4 в хвост deque = "; + printVector(deque->toVector()); + deque->pushFirst(1); + cout << "После добавления элемента 1 в голову deque = "; + printVector(deque->toVector()); + + /* Извлечение элемента из очереди */ + int popLast = deque->popLast(); + cout << "Извлеченный из хвоста элемент = " << popLast << ", deque после извлечения из хвоста = "; + printVector(deque->toVector()); + int popFirst = deque->popFirst(); + cout << "Извлеченный из головы элемент = " << popFirst << ", deque после извлечения из головы = "; + printVector(deque->toVector()); + + /* Получение длины двусторонней очереди */ + int size = deque->size(); + cout << "Длина двусторонней очереди size = " << size << endl; + + /* Проверка, пуста ли двусторонняя очередь */ + bool isEmpty = deque->isEmpty(); + cout << "Пуста ли двусторонняя очередь = " << boolalpha << isEmpty << endl; + return 0; +} diff --git a/ru/codes/cpp/chapter_stack_and_queue/array_queue.cpp b/ru/codes/cpp/chapter_stack_and_queue/array_queue.cpp new file mode 100644 index 000000000..eee44154b --- /dev/null +++ b/ru/codes/cpp/chapter_stack_and_queue/array_queue.cpp @@ -0,0 +1,129 @@ +/** + * File: array_queue.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Очередь на основе кольцевого массива */ +class ArrayQueue { + private: + int *nums; // Массив для хранения элементов очереди + int front; // Указатель head, указывающий на первый элемент очереди + int queSize; // Длина очереди + int queCapacity; // Вместимость очереди + + public: + ArrayQueue(int capacity) { + // Инициализация массива + nums = new int[capacity]; + queCapacity = capacity; + front = queSize = 0; + } + + ~ArrayQueue() { + delete[] nums; + } + + /* Получить вместимость очереди */ + int capacity() { + return queCapacity; + } + + /* Получение длины очереди */ + int size() { + return queSize; + } + + /* Проверка, пуста ли очередь */ + bool isEmpty() { + return size() == 0; + } + + /* Поместить в очередь */ + void push(int num) { + if (queSize == queCapacity) { + cout << "Очередь заполнена" << endl; + return; + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива + int rear = (front + queSize) % queCapacity; + // Добавить num в хвост очереди + nums[rear] = num; + queSize++; + } + + /* Извлечь из очереди */ + int pop() { + int num = peek(); + // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива + front = (front + 1) % queCapacity; + queSize--; + return num; + } + + /* Доступ к элементу в начале очереди */ + int peek() { + if (isEmpty()) + throw out_of_range("очередь пуста"); + return nums[front]; + } + + /* Преобразовать массив в Vector и вернуть */ + vector toVector() { + // Преобразовывать только элементы списка в пределах фактической длины + vector arr(queSize); + for (int i = 0, j = front; i < queSize; i++, j++) { + arr[i] = nums[j % queCapacity]; + } + return arr; + } +}; + +/* Driver Code */ +int main() { + /* Инициализация очереди */ + int capacity = 10; + ArrayQueue *queue = new ArrayQueue(capacity); + + /* Добавление элемента в очередь */ + queue->push(1); + queue->push(3); + queue->push(2); + queue->push(5); + queue->push(4); + cout << "Очередь queue = "; + printVector(queue->toVector()); + + /* Доступ к элементу в начале очереди */ + int peek = queue->peek(); + cout << "Первый элемент peek = " << peek << endl; + + /* Извлечение элемента из очереди */ + peek = queue->pop(); + cout << "Извлеченный элемент pop = " << peek << ", queue после извлечения = "; + printVector(queue->toVector()); + + /* Получение длины очереди */ + int size = queue->size(); + cout << "Длина очереди size = " << size << endl; + + /* Проверка, пуста ли очередь */ + bool empty = queue->isEmpty(); + cout << "Пуста ли очередь = " << empty << endl; + + /* Проверка кольцевого массива */ + for (int i = 0; i < 10; i++) { + queue->push(i); + queue->pop(); + cout << "После " << i << "-го раунда операций enqueue и dequeue queue = "; + printVector(queue->toVector()); + } + + // Освободить память + delete queue; + + return 0; +} diff --git a/ru/codes/cpp/chapter_stack_and_queue/array_stack.cpp b/ru/codes/cpp/chapter_stack_and_queue/array_stack.cpp new file mode 100644 index 000000000..11add19ca --- /dev/null +++ b/ru/codes/cpp/chapter_stack_and_queue/array_stack.cpp @@ -0,0 +1,85 @@ +/** + * File: array_stack.cpp + * Created Time: 2022-11-28 + * Author: qualifier1024 (2539244001@qq.com) + */ + +#include "../utils/common.hpp" + +/* Стек на основе массива */ +class ArrayStack { + private: + vector stack; + + public: + /* Получение длины стека */ + int size() { + return stack.size(); + } + + /* Проверка, пуст ли стек */ + bool isEmpty() { + return stack.size() == 0; + } + + /* Поместить в стек */ + void push(int num) { + stack.push_back(num); + } + + /* Извлечь из стека */ + int pop() { + int num = top(); + stack.pop_back(); + return num; + } + + /* Доступ к верхнему элементу стека */ + int top() { + if (isEmpty()) + throw out_of_range("стек пуст"); + return stack.back(); + } + + /* Вернуть Vector */ + vector toVector() { + return stack; + } +}; + +/* Driver Code */ +int main() { + /* Инициализация стека */ + ArrayStack *stack = new ArrayStack(); + + /* Помещение элемента в стек */ + stack->push(1); + stack->push(3); + stack->push(2); + stack->push(5); + stack->push(4); + cout << "Стек stack = "; + printVector(stack->toVector()); + + /* Доступ к верхнему элементу стека */ + int top = stack->top(); + cout << "Верхний элемент top = " << top << endl; + + /* Извлечение элемента из стека */ + top = stack->pop(); + cout << "Извлеченный элемент pop = " << top << ", stack после извлечения = "; + printVector(stack->toVector()); + + /* Получение длины стека */ + int size = stack->size(); + cout << "Длина стека size = " << size << endl; + + /* Проверка на пустоту */ + bool empty = stack->isEmpty(); + cout << "Пуст ли стек = " << empty << endl; + + // Освободить память + delete stack; + + return 0; +} diff --git a/ru/codes/cpp/chapter_stack_and_queue/deque.cpp b/ru/codes/cpp/chapter_stack_and_queue/deque.cpp new file mode 100644 index 000000000..494fbe9d6 --- /dev/null +++ b/ru/codes/cpp/chapter_stack_and_queue/deque.cpp @@ -0,0 +1,46 @@ +/** + * File: deque.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Driver Code */ +int main() { + /* Инициализация двусторонней очереди */ + deque deque; + + /* Добавление элемента в очередь */ + deque.push_back(2); + deque.push_back(5); + deque.push_back(4); + deque.push_front(3); + deque.push_front(1); + cout << "Двусторонняя очередь deque = "; + printDeque(deque); + + /* Доступ к элементу */ + int front = deque.front(); + cout << "Первый элемент front = " << front << endl; + int back = deque.back(); + cout << "Последний элемент back = " << back << endl; + + /* Извлечение элемента из очереди */ + deque.pop_front(); + cout << "Извлеченный из головы элемент popFront = " << front << ", deque после извлечения из головы = "; + printDeque(deque); + deque.pop_back(); + cout << "Извлеченный из хвоста элемент popLast = " << back << ", deque после извлечения из хвоста = "; + printDeque(deque); + + /* Получение длины двусторонней очереди */ + int size = deque.size(); + cout << "Длина двусторонней очереди size = " << size << endl; + + /* Проверка, пуста ли двусторонняя очередь */ + bool empty = deque.empty(); + cout << "Пуста ли двусторонняя очередь = " << empty << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_stack_and_queue/linkedlist_deque.cpp b/ru/codes/cpp/chapter_stack_and_queue/linkedlist_deque.cpp new file mode 100644 index 000000000..91361058e --- /dev/null +++ b/ru/codes/cpp/chapter_stack_and_queue/linkedlist_deque.cpp @@ -0,0 +1,194 @@ +/** + * File: linkedlist_deque.cpp + * Created Time: 2023-03-02 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Узел двусвязного списка */ +struct DoublyListNode { + int val; // Значение узла + DoublyListNode *next; // Указатель на узел-преемник + DoublyListNode *prev; // Указатель на узел-предшественник + DoublyListNode(int val) : val(val), prev(nullptr), next(nullptr) { + } +}; + +/* Двусторонняя очередь на основе двусвязного списка */ +class LinkedListDeque { + private: + DoublyListNode *front, *rear; // Головной узел front, хвостовой узел rear + int queSize = 0; // Длина двусторонней очереди + + public: + /* Конструктор */ + LinkedListDeque() : front(nullptr), rear(nullptr) { + } + + /* Метод-деструктор */ + ~LinkedListDeque() { + // Обходить связный список, удалять узлы и освобождать память + DoublyListNode *pre, *cur = front; + while (cur != nullptr) { + pre = cur; + cur = cur->next; + delete pre; + } + } + + /* Получение длины двусторонней очереди */ + int size() { + return queSize; + } + + /* Проверка, пуста ли двусторонняя очередь */ + bool isEmpty() { + return size() == 0; + } + + /* Операция добавления в очередь */ + void push(int num, bool isFront) { + DoublyListNode *node = new DoublyListNode(num); + // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node + if (isEmpty()) + front = rear = node; + // Операция добавления в голову очереди + else if (isFront) { + // Добавить node в голову списка + front->prev = node; + node->next = front; + front = node; // Обновить головной узел + // Операция добавления в хвост очереди + } else { + // Добавить node в хвост списка + rear->next = node; + node->prev = rear; + rear = node; // Обновить хвостовой узел + } + queSize++; // Обновить длину очереди + } + + /* Добавление в голову очереди */ + void pushFirst(int num) { + push(num, true); + } + + /* Добавление в хвост очереди */ + void pushLast(int num) { + push(num, false); + } + + /* Операция извлечения из очереди */ + int pop(bool isFront) { + if (isEmpty()) + throw out_of_range("очередь пуста"); + int val; + // Операция извлечения из головы очереди + if (isFront) { + val = front->val; // Временно сохранить значение головного узла + // Удалить головной узел + DoublyListNode *fNext = front->next; + if (fNext != nullptr) { + fNext->prev = nullptr; + front->next = nullptr; + } + delete front; + front = fNext; // Обновить головной узел + // Операция извлечения из хвоста очереди + } else { + val = rear->val; // Временно сохранить значение хвостового узла + // Удалить хвостовой узел + DoublyListNode *rPrev = rear->prev; + if (rPrev != nullptr) { + rPrev->next = nullptr; + rear->prev = nullptr; + } + delete rear; + rear = rPrev; // Обновить хвостовой узел + } + queSize--; // Обновить длину очереди + return val; + } + + /* Извлечение из головы очереди */ + int popFirst() { + return pop(true); + } + + /* Извлечение из хвоста очереди */ + int popLast() { + return pop(false); + } + + /* Доступ к элементу в начале очереди */ + int peekFirst() { + if (isEmpty()) + throw out_of_range("двусторонняя очередь пуста"); + return front->val; + } + + /* Доступ к элементу в конце очереди */ + int peekLast() { + if (isEmpty()) + throw out_of_range("двусторонняя очередь пуста"); + return rear->val; + } + + /* Вернуть массив для вывода */ + vector toVector() { + DoublyListNode *node = front; + vector res(size()); + for (int i = 0; i < res.size(); i++) { + res[i] = node->val; + node = node->next; + } + return res; + } +}; + +/* Driver Code */ +int main() { + /* Инициализация двусторонней очереди */ + LinkedListDeque *deque = new LinkedListDeque(); + deque->pushLast(3); + deque->pushLast(2); + deque->pushLast(5); + cout << "Двусторонняя очередь deque = "; + printVector(deque->toVector()); + + /* Доступ к элементу */ + int peekFirst = deque->peekFirst(); + cout << "Первый элемент peekFirst = " << peekFirst << endl; + int peekLast = deque->peekLast(); + cout << "Последний элемент peekLast = " << peekLast << endl; + + /* Добавление элемента в очередь */ + deque->pushLast(4); + cout << "После добавления элемента 4 в хвост deque ="; + printVector(deque->toVector()); + deque->pushFirst(1); + cout << "После добавления элемента 1 в голову deque = "; + printVector(deque->toVector()); + + /* Извлечение элемента из очереди */ + int popLast = deque->popLast(); + cout << "Извлеченный из хвоста элемент = " << popLast << ", deque после извлечения из хвоста = "; + printVector(deque->toVector()); + int popFirst = deque->popFirst(); + cout << "Извлеченный из головы элемент = " << popFirst << ", deque после извлечения из головы = "; + printVector(deque->toVector()); + + /* Получение длины двусторонней очереди */ + int size = deque->size(); + cout << "Длина двусторонней очереди size = " << size << endl; + + /* Проверка, пуста ли двусторонняя очередь */ + bool isEmpty = deque->isEmpty(); + cout << "Пуста ли двусторонняя очередь = " << boolalpha << isEmpty << endl; + + // Освободить память + delete deque; + + return 0; +} diff --git a/ru/codes/cpp/chapter_stack_and_queue/linkedlist_queue.cpp b/ru/codes/cpp/chapter_stack_and_queue/linkedlist_queue.cpp new file mode 100644 index 000000000..2d08d6364 --- /dev/null +++ b/ru/codes/cpp/chapter_stack_and_queue/linkedlist_queue.cpp @@ -0,0 +1,120 @@ +/** + * File: linkedlist_queue.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Очередь на основе связного списка */ +class LinkedListQueue { + private: + ListNode *front, *rear; // Головной узел front, хвостовой узел rear + int queSize; + + public: + LinkedListQueue() { + front = nullptr; + rear = nullptr; + queSize = 0; + } + + ~LinkedListQueue() { + // Обходить связный список, удалять узлы и освобождать память + freeMemoryLinkedList(front); + } + + /* Получение длины очереди */ + int size() { + return queSize; + } + + /* Проверка, пуста ли очередь */ + bool isEmpty() { + return queSize == 0; + } + + /* Поместить в очередь */ + void push(int num) { + // Добавить num после хвостового узла + ListNode *node = new ListNode(num); + // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел + if (front == nullptr) { + front = node; + rear = node; + } + // Если очередь не пуста, добавить этот узел после хвостового узла + else { + rear->next = node; + rear = node; + } + queSize++; + } + + /* Извлечь из очереди */ + int pop() { + int num = peek(); + // Удалить головной узел + ListNode *tmp = front; + front = front->next; + // Освободить память + delete tmp; + queSize--; + return num; + } + + /* Доступ к элементу в начале очереди */ + int peek() { + if (size() == 0) + throw out_of_range("очередь пуста"); + return front->val; + } + + /* Преобразовать связный список в Vector и вернуть */ + vector toVector() { + ListNode *node = front; + vector res(size()); + for (int i = 0; i < res.size(); i++) { + res[i] = node->val; + node = node->next; + } + return res; + } +}; + +/* Driver Code */ +int main() { + /* Инициализация очереди */ + LinkedListQueue *queue = new LinkedListQueue(); + + /* Добавление элемента в очередь */ + queue->push(1); + queue->push(3); + queue->push(2); + queue->push(5); + queue->push(4); + cout << "Очередь queue = "; + printVector(queue->toVector()); + + /* Доступ к элементу в начале очереди */ + int peek = queue->peek(); + cout << "Первый элемент peek = " << peek << endl; + + /* Извлечение элемента из очереди */ + peek = queue->pop(); + cout << "Извлеченный элемент pop = " << peek << ", queue после извлечения = "; + printVector(queue->toVector()); + + /* Получение длины очереди */ + int size = queue->size(); + cout << "Длина очереди size = " << size << endl; + + /* Проверка, пуста ли очередь */ + bool empty = queue->isEmpty(); + cout << "Пуста ли очередь = " << empty << endl; + + // Освободить память + delete queue; + + return 0; +} diff --git a/ru/codes/cpp/chapter_stack_and_queue/linkedlist_stack.cpp b/ru/codes/cpp/chapter_stack_and_queue/linkedlist_stack.cpp new file mode 100644 index 000000000..01d4ac341 --- /dev/null +++ b/ru/codes/cpp/chapter_stack_and_queue/linkedlist_stack.cpp @@ -0,0 +1,109 @@ +/** + * File: linkedlist_stack.cpp + * Created Time: 2022-11-28 + * Author: qualifier1024 (2539244001@qq.com) + */ + +#include "../utils/common.hpp" + +/* Стек на основе связного списка */ +class LinkedListStack { + private: + ListNode *stackTop; // Использовать головной узел как вершину стека + int stkSize; // Длина стека + + public: + LinkedListStack() { + stackTop = nullptr; + stkSize = 0; + } + + ~LinkedListStack() { + // Обходить связный список, удалять узлы и освобождать память + freeMemoryLinkedList(stackTop); + } + + /* Получение длины стека */ + int size() { + return stkSize; + } + + /* Проверка, пуст ли стек */ + bool isEmpty() { + return size() == 0; + } + + /* Поместить в стек */ + void push(int num) { + ListNode *node = new ListNode(num); + node->next = stackTop; + stackTop = node; + stkSize++; + } + + /* Извлечь из стека */ + int pop() { + int num = top(); + ListNode *tmp = stackTop; + stackTop = stackTop->next; + // Освободить память + delete tmp; + stkSize--; + return num; + } + + /* Доступ к верхнему элементу стека */ + int top() { + if (isEmpty()) + throw out_of_range("стек пуст"); + return stackTop->val; + } + + /* Преобразовать List в Array и вернуть */ + vector toVector() { + ListNode *node = stackTop; + vector res(size()); + for (int i = res.size() - 1; i >= 0; i--) { + res[i] = node->val; + node = node->next; + } + return res; + } +}; + +/* Driver Code */ +int main() { + /* Инициализация стека */ + LinkedListStack *stack = new LinkedListStack(); + + /* Помещение элемента в стек */ + stack->push(1); + stack->push(3); + stack->push(2); + stack->push(5); + stack->push(4); + cout << "Стек stack = "; + printVector(stack->toVector()); + + /* Доступ к верхнему элементу стека */ + int top = stack->top(); + cout << "Верхний элемент top = " << top << endl; + + /* Извлечение элемента из стека */ + top = stack->pop(); + cout << "Извлеченный элемент pop = " << top << ", stack после извлечения = "; + printVector(stack->toVector()); + + /* Получение длины стека */ + int size = stack->size(); + cout << "Длина стека size = " << size << endl; + + /* Проверка на пустоту */ + bool empty = stack->isEmpty(); + cout << "Пуст ли стек = " << empty << endl; + + // Освободить память + delete stack; + + return 0; +} diff --git a/ru/codes/cpp/chapter_stack_and_queue/queue.cpp b/ru/codes/cpp/chapter_stack_and_queue/queue.cpp new file mode 100644 index 000000000..e1ce496e0 --- /dev/null +++ b/ru/codes/cpp/chapter_stack_and_queue/queue.cpp @@ -0,0 +1,41 @@ +/** + * File: queue.cpp + * Created Time: 2022-11-28 + * Author: qualifier1024 (2539244001@qq.com) + */ + +#include "../utils/common.hpp" + +/* Driver Code */ +int main() { + /* Инициализация очереди */ + queue queue; + + /* Добавление элемента в очередь */ + queue.push(1); + queue.push(3); + queue.push(2); + queue.push(5); + queue.push(4); + cout << "Очередь queue = "; + printQueue(queue); + + /* Доступ к элементу в начале очереди */ + int front = queue.front(); + cout << "Первый элемент front = " << front << endl; + + /* Извлечение элемента из очереди */ + queue.pop(); + cout << "Извлеченный элемент front = " << front << ", queue после извлечения = "; + printQueue(queue); + + /* Получение длины очереди */ + int size = queue.size(); + cout << "Длина очереди size = " << size << endl; + + /* Проверка, пуста ли очередь */ + bool empty = queue.empty(); + cout << "Пуста ли очередь = " << empty << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_stack_and_queue/stack.cpp b/ru/codes/cpp/chapter_stack_and_queue/stack.cpp new file mode 100644 index 000000000..b536bb3e6 --- /dev/null +++ b/ru/codes/cpp/chapter_stack_and_queue/stack.cpp @@ -0,0 +1,41 @@ +/** + * File: stack.cpp + * Created Time: 2022-11-28 + * Author: qualifier1024 (2539244001@qq.com) + */ + +#include "../utils/common.hpp" + +/* Driver Code */ +int main() { + /* Инициализация стека */ + stack stack; + + /* Помещение элемента в стек */ + stack.push(1); + stack.push(3); + stack.push(2); + stack.push(5); + stack.push(4); + cout << "Стек stack = "; + printStack(stack); + + /* Доступ к верхнему элементу стека */ + int top = stack.top(); + cout << "Верхний элемент top = " << top << endl; + + /* Извлечение элемента из стека */ + stack.pop(); // Без возвращаемого значения + cout << "Извлеченный элемент pop = " << top << ", stack после извлечения = "; + printStack(stack); + + /* Получение длины стека */ + int size = stack.size(); + cout << "Длина стека size = " << size << endl; + + /* Проверка на пустоту */ + bool empty = stack.empty(); + cout << "Пуст ли стек = " << empty << endl; + + return 0; +} diff --git a/ru/codes/cpp/chapter_tree/CMakeLists.txt b/ru/codes/cpp/chapter_tree/CMakeLists.txt new file mode 100644 index 000000000..fa7009bcb --- /dev/null +++ b/ru/codes/cpp/chapter_tree/CMakeLists.txt @@ -0,0 +1,6 @@ +add_executable(avl_tree avl_tree.cpp) +add_executable(binary_search_tree binary_search_tree.cpp) +add_executable(binary_tree binary_tree.cpp) +add_executable(binary_tree_bfs binary_tree_bfs.cpp) +add_executable(binary_tree_dfs binary_tree_dfs.cpp) +add_executable(array_binary_tree array_binary_tree.cpp) \ No newline at end of file diff --git a/ru/codes/cpp/chapter_tree/array_binary_tree.cpp b/ru/codes/cpp/chapter_tree/array_binary_tree.cpp new file mode 100644 index 000000000..342d6d8c8 --- /dev/null +++ b/ru/codes/cpp/chapter_tree/array_binary_tree.cpp @@ -0,0 +1,137 @@ +/** + * File: array_binary_tree.cpp + * Created Time: 2023-07-19 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Класс двоичного дерева в массивном представлении */ +class ArrayBinaryTree { + public: + /* Конструктор */ + ArrayBinaryTree(vector arr) { + tree = arr; + } + + /* Вместимость списка */ + int size() { + return tree.size(); + } + + /* Получить значение узла с индексом i */ + int val(int i) { + // Если индекс выходит за границы, вернуть INT_MAX, обозначающий пустую позицию + if (i < 0 || i >= size()) + return INT_MAX; + return tree[i]; + } + + /* Получить индекс левого дочернего узла узла с индексом i */ + int left(int i) { + return 2 * i + 1; + } + + /* Получить индекс правого дочернего узла узла с индексом i */ + int right(int i) { + return 2 * i + 2; + } + + /* Получить индекс родительского узла узла с индексом i */ + int parent(int i) { + return (i - 1) / 2; + } + + /* Обход в ширину */ + vector levelOrder() { + vector res; + // Непосредственно обходить массив + for (int i = 0; i < size(); i++) { + if (val(i) != INT_MAX) + res.push_back(val(i)); + } + return res; + } + + /* Предварительный обход */ + vector preOrder() { + vector res; + dfs(0, "pre", res); + return res; + } + + /* Симметричный обход */ + vector inOrder() { + vector res; + dfs(0, "in", res); + return res; + } + + /* Обратный обход */ + vector postOrder() { + vector res; + dfs(0, "post", res); + return res; + } + + private: + vector tree; + + /* Обход в глубину */ + void dfs(int i, string order, vector &res) { + // Если это пустая позиция, вернуть + if (val(i) == INT_MAX) + return; + // Предварительный обход + if (order == "pre") + res.push_back(val(i)); + dfs(left(i), order, res); + // Симметричный обход + if (order == "in") + res.push_back(val(i)); + dfs(right(i), order, res); + // Обратный обход + if (order == "post") + res.push_back(val(i)); + } +}; + +/* Driver Code */ +int main() { + // Инициализировать двоичное дерево + // Использовать INT_MAX для обозначения пустой позиции nullptr + vector arr = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15}; + TreeNode *root = vectorToTree(arr); + cout << "\nИнициализация двоичного дерева\n"; + cout << "Массивное представление двоичного дерева:\n"; + printVector(arr); + cout << "Связное представление двоичного дерева:\n"; + printTree(root); + + // Класс двоичного дерева в массивном представлении + ArrayBinaryTree abt(arr); + + // Доступ к узлу + int i = 1; + int l = abt.left(i), r = abt.right(i), p = abt.parent(i); + cout << "\nТекущий узел: индекс = " << i << ", значение = " << abt.val(i) << "\n"; + cout << "Индекс левого дочернего узла = " << l << ", значение = " << (abt.val(l) != INT_MAX ? to_string(abt.val(l)) : "nullptr") << "\n"; + cout << "Индекс правого дочернего узла = " << r << ", значение = " << (abt.val(r) != INT_MAX ? to_string(abt.val(r)) : "nullptr") << "\n"; + cout << "Индекс родительского узла = " << p << ", значение = " << (abt.val(p) != INT_MAX ? to_string(abt.val(p)) : "nullptr") << "\n"; + + // Обходить дерево + vector res = abt.levelOrder(); + cout << "\nОбход в ширину: "; + printVector(res); + res = abt.preOrder(); + cout << "Предварительный обход: "; + printVector(res); + res = abt.inOrder(); + cout << "Симметричный обход: "; + printVector(res); + res = abt.postOrder(); + cout << "Обратный обход: "; + printVector(res); + + return 0; +} diff --git a/ru/codes/cpp/chapter_tree/avl_tree.cpp b/ru/codes/cpp/chapter_tree/avl_tree.cpp new file mode 100644 index 000000000..89d6477d1 --- /dev/null +++ b/ru/codes/cpp/chapter_tree/avl_tree.cpp @@ -0,0 +1,233 @@ +/** + * File: avl_tree.cpp + * Created Time: 2023-02-03 + * Author: what-is-me (whatisme@outlook.jp) + */ + +#include "../utils/common.hpp" + +/* AVL-дерево */ +class AVLTree { + private: + /* Обновить высоту узла */ + void updateHeight(TreeNode *node) { + // Высота узла равна высоте более высокого поддерева + 1 + node->height = max(height(node->left), height(node->right)) + 1; + } + + /* Операция правого вращения */ + TreeNode *rightRotate(TreeNode *node) { + TreeNode *child = node->left; + TreeNode *grandChild = child->right; + // Выполнить правое вращение узла node вокруг child + child->right = node; + node->left = grandChild; + // Обновить высоту узла + updateHeight(node); + updateHeight(child); + // Вернуть корневой узел поддерева после вращения + return child; + } + + /* Операция левого вращения */ + TreeNode *leftRotate(TreeNode *node) { + TreeNode *child = node->right; + TreeNode *grandChild = child->left; + // Выполнить левое вращение узла node вокруг child + child->left = node; + node->right = grandChild; + // Обновить высоту узла + updateHeight(node); + updateHeight(child); + // Вернуть корневой узел поддерева после вращения + return child; + } + + /* Выполнить вращение, чтобы снова сбалансировать поддерево */ + TreeNode *rotate(TreeNode *node) { + // Получить коэффициент баланса узла node + int _balanceFactor = balanceFactor(node); + // Левосторонне перекошенное дерево + if (_balanceFactor > 1) { + if (balanceFactor(node->left) >= 0) { + // Правое вращение + return rightRotate(node); + } else { + // Сначала левое вращение, затем правое + node->left = leftRotate(node->left); + return rightRotate(node); + } + } + // Правосторонне перекошенное дерево + if (_balanceFactor < -1) { + if (balanceFactor(node->right) <= 0) { + // Левое вращение + return leftRotate(node); + } else { + // Сначала правое вращение, затем левое + node->right = rightRotate(node->right); + return leftRotate(node); + } + } + // Дерево сбалансировано, вращение не требуется, вернуть сразу + return node; + } + + /* Рекурсивная вставка узла (вспомогательный метод) */ + TreeNode *insertHelper(TreeNode *node, int val) { + if (node == nullptr) + return new TreeNode(val); + /* 1. Найти позицию вставки и вставить узел */ + if (val < node->val) + node->left = insertHelper(node->left, val); + else if (val > node->val) + node->right = insertHelper(node->right, val); + else + return node; // Повторяющийся узел не вставлять, сразу вернуть + updateHeight(node); // Обновить высоту узла + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = rotate(node); + // Вернуть корневой узел поддерева + return node; + } + + /* Рекурсивное удаление узла (вспомогательный метод) */ + TreeNode *removeHelper(TreeNode *node, int val) { + if (node == nullptr) + return nullptr; + /* 1. Найти узел и удалить его */ + if (val < node->val) + node->left = removeHelper(node->left, val); + else if (val > node->val) + node->right = removeHelper(node->right, val); + else { + if (node->left == nullptr || node->right == nullptr) { + TreeNode *child = node->left != nullptr ? node->left : node->right; + // Число дочерних узлов = 0, удалить node и сразу вернуть + if (child == nullptr) { + delete node; + return nullptr; + } + // Число дочерних узлов = 1, удалить node напрямую + else { + delete node; + node = child; + } + } else { + // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел + TreeNode *temp = node->right; + while (temp->left != nullptr) { + temp = temp->left; + } + int tempVal = temp->val; + node->right = removeHelper(node->right, temp->val); + node->val = tempVal; + } + } + updateHeight(node); // Обновить высоту узла + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = rotate(node); + // Вернуть корневой узел поддерева + return node; + } + + public: + TreeNode *root; // Корневой узел + + /* Получить высоту узла */ + int height(TreeNode *node) { + // Высота пустого узла равна -1, высота листового узла равна 0 + return node == nullptr ? -1 : node->height; + } + + /* Получить коэффициент баланса */ + int balanceFactor(TreeNode *node) { + // Коэффициент баланса пустого узла равен 0 + if (node == nullptr) + return 0; + // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева + return height(node->left) - height(node->right); + } + + /* Вставка узла */ + void insert(int val) { + root = insertHelper(root, val); + } + + /* Удаление узла */ + void remove(int val) { + root = removeHelper(root, val); + } + + /* Поиск узла */ + TreeNode *search(int val) { + TreeNode *cur = root; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != nullptr) { + // Целевой узел находится в правом поддереве cur + if (cur->val < val) + cur = cur->right; + // Целевой узел находится в левом поддереве cur + else if (cur->val > val) + cur = cur->left; + // Найти целевой узел и выйти из цикла + else + break; + } + // Вернуть целевой узел + return cur; + } + + /* Конструктор */ + AVLTree() : root(nullptr) { + } + + /* Метод-деструктор */ + ~AVLTree() { + freeMemoryTree(root); + } +}; + +void testInsert(AVLTree &tree, int val) { + tree.insert(val); + cout << "\nПосле вставки узла " << val << " AVL-дерево имеет вид" << endl; + printTree(tree.root); +} + +void testRemove(AVLTree &tree, int val) { + tree.remove(val); + cout << "\nПосле удаления узла " << val << " AVL-дерево имеет вид" << endl; + printTree(tree.root); +} + +/* Driver Code */ +int main() { + /* Инициализация пустого AVL-дерева */ + AVLTree avlTree; + + /* Вставка узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после вставки узла + testInsert(avlTree, 1); + testInsert(avlTree, 2); + testInsert(avlTree, 3); + testInsert(avlTree, 4); + testInsert(avlTree, 5); + testInsert(avlTree, 8); + testInsert(avlTree, 7); + testInsert(avlTree, 9); + testInsert(avlTree, 10); + testInsert(avlTree, 6); + + /* Вставка повторяющегося узла */ + testInsert(avlTree, 7); + + /* Удаление узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после удаления узла + testRemove(avlTree, 8); // Удаление узла степени 0 + testRemove(avlTree, 5); // Удаление узла степени 1 + testRemove(avlTree, 4); // Удаление узла степени 2 + + /* Поиск узла */ + TreeNode *node = avlTree.search(7); + cout << "\nНайденный объект узла = " << node << ", значение узла = " << node->val << endl; +} diff --git a/ru/codes/cpp/chapter_tree/binary_search_tree.cpp b/ru/codes/cpp/chapter_tree/binary_search_tree.cpp new file mode 100644 index 000000000..c8fe5294e --- /dev/null +++ b/ru/codes/cpp/chapter_tree/binary_search_tree.cpp @@ -0,0 +1,170 @@ +/** + * File: binary_search_tree.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Двоичное дерево поиска */ +class BinarySearchTree { + private: + TreeNode *root; + + public: + /* Конструктор */ + BinarySearchTree() { + // Инициализировать пустое дерево + root = nullptr; + } + + /* Метод-деструктор */ + ~BinarySearchTree() { + freeMemoryTree(root); + } + + /* Получить корневой узел двоичного дерева */ + TreeNode *getRoot() { + return root; + } + + /* Поиск узла */ + TreeNode *search(int num) { + TreeNode *cur = root; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != nullptr) { + // Целевой узел находится в правом поддереве cur + if (cur->val < num) + cur = cur->right; + // Целевой узел находится в левом поддереве cur + else if (cur->val > num) + cur = cur->left; + // Найти целевой узел и выйти из цикла + else + break; + } + // Вернуть целевой узел + return cur; + } + + /* Вставка узла */ + void insert(int num) { + // Если дерево пусто, инициализировать корневой узел + if (root == nullptr) { + root = new TreeNode(num); + return; + } + TreeNode *cur = root, *pre = nullptr; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != nullptr) { + // Найти повторяющийся узел и сразу вернуть + if (cur->val == num) + return; + pre = cur; + // Позиция вставки находится в правом поддереве cur + if (cur->val < num) + cur = cur->right; + // Позиция вставки находится в левом поддереве cur + else + cur = cur->left; + } + // Вставка узла + TreeNode *node = new TreeNode(num); + if (pre->val < num) + pre->right = node; + else + pre->left = node; + } + + /* Удаление узла */ + void remove(int num) { + // Если дерево пусто, сразу вернуть + if (root == nullptr) + return; + TreeNode *cur = root, *pre = nullptr; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != nullptr) { + // Найти узел для удаления и выйти из цикла + if (cur->val == num) + break; + pre = cur; + // Узел для удаления находится в правом поддереве cur + if (cur->val < num) + cur = cur->right; + // Узел для удаления находится в левом поддереве cur + else + cur = cur->left; + } + // Если узел для удаления отсутствует, сразу вернуть + if (cur == nullptr) + return; + // Число дочерних узлов = 0 или 1 + if (cur->left == nullptr || cur->right == nullptr) { + // Когда число дочерних узлов = 0 / 1, child = nullptr / этот дочерний узел + TreeNode *child = cur->left != nullptr ? cur->left : cur->right; + // Удалить узел cur + if (cur != root) { + if (pre->left == cur) + pre->left = child; + else + pre->right = child; + } else { + // Если удаляемый узел является корнем, заново назначить корневой узел + root = child; + } + // Освободить память + delete cur; + } + // Число дочерних узлов = 2 + else { + // Получить следующий узел после cur в симметричном обходе + TreeNode *tmp = cur->right; + while (tmp->left != nullptr) { + tmp = tmp->left; + } + int tmpVal = tmp->val; + // Рекурсивно удалить узел tmp + remove(tmp->val); + // Перезаписать cur значением tmp + cur->val = tmpVal; + } + } +}; + +/* Driver Code */ +int main() { + /* Инициализация двоичного дерева поиска */ + BinarySearchTree *bst = new BinarySearchTree(); + // Обратите внимание: разные порядки вставки порождают разные двоичные деревья; данная последовательность может построить совершенное двоичное дерево + vector nums = {8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15}; + for (int num : nums) { + bst->insert(num); + } + cout << endl << "Исходное двоичное дерево\n" << endl; + printTree(bst->getRoot()); + + /* Поиск узла */ + TreeNode *node = bst->search(7); + cout << endl << "Найденный объект узла = " << node << ", значение узла = " << node->val << endl; + + /* Вставка узла */ + bst->insert(16); + cout << endl << "После вставки узла 16 двоичное дерево имеет вид\n" << endl; + printTree(bst->getRoot()); + + /* Удаление узла */ + bst->remove(1); + cout << endl << "После удаления узла 1 двоичное дерево имеет вид\n" << endl; + printTree(bst->getRoot()); + bst->remove(2); + cout << endl << "После удаления узла 2 двоичное дерево имеет вид\n" << endl; + printTree(bst->getRoot()); + bst->remove(4); + cout << endl << "После удаления узла 4 двоичное дерево имеет вид\n" << endl; + printTree(bst->getRoot()); + + // Освободить память + delete bst; + + return 0; +} diff --git a/ru/codes/cpp/chapter_tree/binary_tree.cpp b/ru/codes/cpp/chapter_tree/binary_tree.cpp new file mode 100644 index 000000000..fd35e8c79 --- /dev/null +++ b/ru/codes/cpp/chapter_tree/binary_tree.cpp @@ -0,0 +1,43 @@ +/** + * File: binary_tree.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Driver Code */ +int main() { + /* Инициализация двоичного дерева */ + // Инициализация узла + TreeNode *n1 = new TreeNode(1); + TreeNode *n2 = new TreeNode(2); + TreeNode *n3 = new TreeNode(3); + TreeNode *n4 = new TreeNode(4); + TreeNode *n5 = new TreeNode(5); + // Построить связи между узлами (указатели) + n1->left = n2; + n1->right = n3; + n2->left = n4; + n2->right = n5; + cout << endl << "Инициализация двоичного дерева\n" << endl; + printTree(n1); + + /* Вставка и удаление узлов */ + TreeNode *P = new TreeNode(0); + // Вставить узел P между n1 -> n2 + n1->left = P; + P->left = n2; + cout << endl << "После вставки узла P\n" << endl; + printTree(n1); + // Удалить узел P + n1->left = n2; + delete P; // Освободить память + cout << endl << "После удаления узла P\n" << endl; + printTree(n1); + + // Освободить память + freeMemoryTree(n1); + + return 0; +} diff --git a/ru/codes/cpp/chapter_tree/binary_tree_bfs.cpp b/ru/codes/cpp/chapter_tree/binary_tree_bfs.cpp new file mode 100644 index 000000000..81e5fb82f --- /dev/null +++ b/ru/codes/cpp/chapter_tree/binary_tree_bfs.cpp @@ -0,0 +1,42 @@ +/** + * File: binary_tree_bfs.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +/* Обход в ширину */ +vector levelOrder(TreeNode *root) { + // Инициализировать очередь и добавить корневой узел + queue queue; + queue.push(root); + // Инициализировать список для хранения последовательности обхода + vector vec; + while (!queue.empty()) { + TreeNode *node = queue.front(); + queue.pop(); // Извлечение из очереди + vec.push_back(node->val); // Сохранить значение узла + if (node->left != nullptr) + queue.push(node->left); // Поместить левый дочерний узел в очередь + if (node->right != nullptr) + queue.push(node->right); // Поместить правый дочерний узел в очередь + } + return vec; +} + +/* Driver Code */ +int main() { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из массива + TreeNode *root = vectorToTree(vector{1, 2, 3, 4, 5, 6, 7}); + cout << endl << "Инициализация двоичного дерева\n" << endl; + printTree(root); + + /* Обход в ширину */ + vector vec = levelOrder(root); + cout << endl << "Последовательность печати узлов при обходе в ширину = "; + printVector(vec); + + return 0; +} diff --git a/ru/codes/cpp/chapter_tree/binary_tree_dfs.cpp b/ru/codes/cpp/chapter_tree/binary_tree_dfs.cpp new file mode 100644 index 000000000..ceb601b81 --- /dev/null +++ b/ru/codes/cpp/chapter_tree/binary_tree_dfs.cpp @@ -0,0 +1,69 @@ +/** + * File: binary_tree_dfs.cpp + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +#include "../utils/common.hpp" + +// Инициализировать список для хранения последовательности обхода +vector vec; + +/* Предварительный обход */ +void preOrder(TreeNode *root) { + if (root == nullptr) + return; + // Порядок обхода: корень -> левое поддерево -> правое поддерево + vec.push_back(root->val); + preOrder(root->left); + preOrder(root->right); +} + +/* Симметричный обход */ +void inOrder(TreeNode *root) { + if (root == nullptr) + return; + // Порядок обхода: левое поддерево -> корень -> правое поддерево + inOrder(root->left); + vec.push_back(root->val); + inOrder(root->right); +} + +/* Обратный обход */ +void postOrder(TreeNode *root) { + if (root == nullptr) + return; + // Порядок обхода: левое поддерево -> правое поддерево -> корень + postOrder(root->left); + postOrder(root->right); + vec.push_back(root->val); +} + +/* Driver Code */ +int main() { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из массива + TreeNode *root = vectorToTree(vector{1, 2, 3, 4, 5, 6, 7}); + cout << endl << "Инициализация двоичного дерева\n" << endl; + printTree(root); + + /* Предварительный обход */ + vec.clear(); + preOrder(root); + cout << endl << "Последовательность печати узлов при предварительном обходе = "; + printVector(vec); + + /* Симметричный обход */ + vec.clear(); + inOrder(root); + cout << endl << "Последовательность печати узлов при симметричном обходе = "; + printVector(vec); + + /* Обратный обход */ + vec.clear(); + postOrder(root); + cout << endl << "Последовательность печати узлов при обратном обходе = "; + printVector(vec); + + return 0; +} diff --git a/ru/codes/cpp/utils/CMakeLists.txt b/ru/codes/cpp/utils/CMakeLists.txt new file mode 100644 index 000000000..775a55869 --- /dev/null +++ b/ru/codes/cpp/utils/CMakeLists.txt @@ -0,0 +1,4 @@ +add_executable(utils + common.hpp print_utils.hpp + list_node.hpp tree_node.hpp + vertex.hpp) \ No newline at end of file diff --git a/ru/codes/cpp/utils/common.hpp b/ru/codes/cpp/utils/common.hpp new file mode 100644 index 000000000..c72dabd88 --- /dev/null +++ b/ru/codes/cpp/utils/common.hpp @@ -0,0 +1,28 @@ +/** + * File: common.hpp + * Created Time: 2021-12-19 + * Author: krahets (krahets@163.com) + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "list_node.hpp" +#include "print_utils.hpp" +#include "tree_node.hpp" +#include "vertex.hpp" + +using namespace std; diff --git a/ru/codes/cpp/utils/list_node.hpp b/ru/codes/cpp/utils/list_node.hpp new file mode 100644 index 000000000..4cfc235ce --- /dev/null +++ b/ru/codes/cpp/utils/list_node.hpp @@ -0,0 +1,42 @@ +/** + * File: list_node.hpp + * Created Time: 2021-12-19 + * Author: krahets (krahets@163.com) + */ + +#pragma once + +#include +#include + +using namespace std; + +/* Узел связного списка */ +struct ListNode { + int val; + ListNode *next; + ListNode(int x) : val(x), next(nullptr) { + } +}; + +/* Десериализовать список в связный список */ +ListNode *vecToLinkedList(vector list) { + ListNode *dum = new ListNode(0); + ListNode *head = dum; + for (int val : list) { + head->next = new ListNode(val); + head = head->next; + } + return dum->next; +} + +/* Освободить память, выделенную под связный список */ +void freeMemoryLinkedList(ListNode *cur) { + // Освободить память + ListNode *pre; + while (cur != nullptr) { + pre = cur; + cur = cur->next; + delete pre; + } +} diff --git a/ru/codes/cpp/utils/print_utils.hpp b/ru/codes/cpp/utils/print_utils.hpp new file mode 100644 index 000000000..72449cff6 --- /dev/null +++ b/ru/codes/cpp/utils/print_utils.hpp @@ -0,0 +1,228 @@ +/** + * File: print_utils.hpp + * Created Time: 2021-12-19 + * Author: krahets (krahets@163.com), msk397 (machangxinq@gmail.com), LoneRanger(836253168@qq.com) + */ + +#pragma once + +#include "list_node.hpp" +#include "tree_node.hpp" +#include +#include +#include +#include + +/* Find an element in a vector */ +template int vecFind(const vector &vec, T ele) { + int j = INT_MAX; + for (int i = 0; i < vec.size(); i++) { + if (vec[i] == ele) { + j = i; + } + } + return j; +} + +/* Concatenate a vector with a delim */ +template string strJoin(const string &delim, const T &vec) { + ostringstream s; + for (const auto &i : vec) { + if (&i != &vec[0]) { + s << delim; + } + s << i; + } + return s.str(); +} + +/* Repeat a string for n times */ +string strRepeat(string str, int n) { + ostringstream os; + for (int i = 0; i < n; i++) + os << str; + return os.str(); +} + +/* Вывести массив */ +template void printArray(T *arr, int n) { + cout << "["; + for (int i = 0; i < n - 1; i++) { + cout << arr[i] << ", "; + } + if (n >= 1) + cout << arr[n - 1] << "]" << endl; + else + cout << "]" << endl; +} + +/* Get the Vector String object */ +template string getVectorString(vector &list) { + return "[" + strJoin(", ", list) + "]"; +} + +/* Вывести список */ +template void printVector(vector list) { + cout << getVectorString(list) << '\n'; +} + +/* Вывести матрицу */ +template void printVectorMatrix(vector> &matrix) { + cout << "[" << '\n'; + for (vector &list : matrix) + cout << " " + getVectorString(list) + "," << '\n'; + cout << "]" << '\n'; +} + +/* Вывести связный список */ +void printLinkedList(ListNode *head) { + vector list; + while (head != nullptr) { + list.push_back(head->val); + head = head->next; + } + + cout << strJoin(" -> ", list) << '\n'; +} + +struct Trunk { + Trunk *prev; + string str; + Trunk(Trunk *prev, string str) { + this->prev = prev; + this->str = str; + } +}; + +void showTrunks(Trunk *p) { + if (p == nullptr) { + return; + } + + showTrunks(p->prev); + cout << p->str; +} + +/** + * Вывести двоичное дерево + * Этот вывод дерева заимствован из TECHIE DELIGHT + * https://www.techiedelight.com/c-program-print-binary-tree/ + */ +void printTree(TreeNode *root, Trunk *prev, bool isRight) { + if (root == nullptr) { + return; + } + + string prev_str = " "; + Trunk trunk(prev, prev_str); + + printTree(root->right, &trunk, true); + + if (!prev) { + trunk.str = "———"; + } else if (isRight) { + trunk.str = "/———"; + prev_str = " |"; + } else { + trunk.str = "\\———"; + prev->str = prev_str; + } + + showTrunks(&trunk); + cout << " " << root->val << endl; + + if (prev) { + prev->str = prev_str; + } + trunk.str = " |"; + + printTree(root->left, &trunk, false); +} + +/* Вывести двоичное дерево */ +void printTree(TreeNode *root) { + printTree(root, nullptr, false); +} + +/* Вывести стек */ +template void printStack(stack stk) { + // Reverse the input stack + stack tmp; + while (!stk.empty()) { + tmp.push(stk.top()); + stk.pop(); + } + // Generate the string to print + ostringstream s; + bool flag = true; + while (!tmp.empty()) { + if (flag) { + s << tmp.top(); + flag = false; + } else + s << ", " << tmp.top(); + tmp.pop(); + } + cout << "[" + s.str() + "]" << '\n'; +} + +/* Вывести очередь */ +template void printQueue(queue queue) { + // Generate the string to print + ostringstream s; + bool flag = true; + while (!queue.empty()) { + if (flag) { + s << queue.front(); + flag = false; + } else + s << ", " << queue.front(); + queue.pop(); + } + cout << "[" + s.str() + "]" << '\n'; +} + +/* Вывести двустороннюю очередь */ +template void printDeque(deque deque) { + // Generate the string to print + ostringstream s; + bool flag = true; + while (!deque.empty()) { + if (flag) { + s << deque.front(); + flag = false; + } else + s << ", " << deque.front(); + deque.pop_front(); + } + cout << "[" + s.str() + "]" << '\n'; +} + +/* Вывести хеш-таблицу */ +// Определить параметры шаблона TKey и TValue для указания типов пары ключ-значение +template void printHashMap(unordered_map map) { + for (auto kv : map) { + cout << kv.first << " -> " << kv.second << '\n'; + } +} + +/* Expose the underlying storage of the priority_queue container */ +template S &Container(priority_queue &pq) { + struct HackedQueue : private priority_queue { + static S &Container(priority_queue &pq) { + return pq.*&HackedQueue::c; + } + }; + return HackedQueue::Container(pq); +} + +/* Вывести кучу (приоритетную очередь) */ +template void printHeap(priority_queue &heap) { + vector vec = Container(heap); + cout << "Массивное представление кучи:"; + printVector(vec); + cout << "Древовидное представление кучи:" << endl; + TreeNode *root = vectorToTree(vec); + printTree(root); + freeMemoryTree(root); +} diff --git a/ru/codes/cpp/utils/tree_node.hpp b/ru/codes/cpp/utils/tree_node.hpp new file mode 100644 index 000000000..e2f338c95 --- /dev/null +++ b/ru/codes/cpp/utils/tree_node.hpp @@ -0,0 +1,84 @@ +/** + * File: tree_node.hpp + * Created Time: 2021-12-19 + * Author: krahets (krahets@163.com) + */ + +#pragma once + +#include +#include + +using namespace std; + +/* Структура узла двоичного дерева */ +struct TreeNode { + int val{}; + int height = 0; + TreeNode *parent{}; + TreeNode *left{}; + TreeNode *right{}; + TreeNode() = default; + explicit TreeNode(int x, TreeNode *parent = nullptr) : val(x), parent(parent) { + } +}; + +// Правила кодирования сериализации см.: +// https://www.hello-algo.com/chapter_tree/array_representation_of_tree/ +// Массивное представление двоичного дерева: +// [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15] +// Связное представление двоичного дерева: +// /——— 15 +// /——— 7 +// /——— 3 +// | \——— 6 +// | \——— 12 +// ——— 1 +// \——— 2 +// | /——— 9 +// \——— 4 +// \——— 8 + +/* Десериализовать список в двоичное дерево: рекурсия */ +TreeNode *vectorToTreeDFS(vector &arr, int i) { + if (i < 0 || i >= arr.size() || arr[i] == INT_MAX) { + return nullptr; + } + TreeNode *root = new TreeNode(arr[i]); + root->left = vectorToTreeDFS(arr, 2 * i + 1); + root->right = vectorToTreeDFS(arr, 2 * i + 2); + return root; +} + +/* Десериализовать список в двоичное дерево */ +TreeNode *vectorToTree(vector arr) { + return vectorToTreeDFS(arr, 0); +} + +/* Сериализовать двоичное дерево в список: рекурсия */ +void treeToVecorDFS(TreeNode *root, int i, vector &res) { + if (root == nullptr) + return; + while (i >= res.size()) { + res.push_back(INT_MAX); + } + res[i] = root->val; + treeToVecorDFS(root->left, 2 * i + 1, res); + treeToVecorDFS(root->right, 2 * i + 2, res); +} + +/* Сериализовать двоичное дерево в список */ +vector treeToVecor(TreeNode *root) { + vector res; + treeToVecorDFS(root, 0, res); + return res; +} + +/* Освободить память двоичного дерева */ +void freeMemoryTree(TreeNode *root) { + if (root == nullptr) + return; + freeMemoryTree(root->left); + freeMemoryTree(root->right); + delete root; +} diff --git a/ru/codes/cpp/utils/vertex.hpp b/ru/codes/cpp/utils/vertex.hpp new file mode 100644 index 000000000..a9d0f405d --- /dev/null +++ b/ru/codes/cpp/utils/vertex.hpp @@ -0,0 +1,36 @@ +/** + * File: vertex.hpp + * Created Time: 2023-03-02 + * Author: krahets (krahets@163.com) + */ + +#pragma once + +#include + +using namespace std; + +/* Класс вершины */ +struct Vertex { + int val; + Vertex(int x) : val(x) { + } +}; + +/* На вход подается список значений vals, на выходе возвращается список вершин vets */ +vector valsToVets(vector vals) { + vector vets; + for (int val : vals) { + vets.push_back(new Vertex(val)); + } + return vets; +} + +/* На вход подается список вершин vets, на выходе возвращается список значений vals */ +vector vetsToVals(vector vets) { + vector vals; + for (Vertex *vet : vets) { + vals.push_back(vet->val); + } + return vals; +} diff --git a/ru/codes/csharp/.editorconfig b/ru/codes/csharp/.editorconfig new file mode 100644 index 000000000..0a2c1df58 --- /dev/null +++ b/ru/codes/csharp/.editorconfig @@ -0,0 +1,88 @@ +# CSharp formatting rules +[*.cs] +csharp_new_line_before_open_brace = none +csharp_new_line_before_else = false +csharp_new_line_before_catch = false +csharp_new_line_before_finally = false +csharp_indent_labels = one_less_than_current +csharp_using_directive_placement = outside_namespace:silent +csharp_prefer_simple_using_statement = true:suggestion +csharp_prefer_braces = true:silent +csharp_style_namespace_declarations = block_scoped:silent +csharp_style_prefer_method_group_conversion = true:silent +csharp_style_prefer_top_level_statements = true:silent +csharp_style_prefer_primary_constructors = true:suggestion +csharp_style_expression_bodied_methods = false:silent +csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_operators = false:silent +csharp_style_expression_bodied_properties = true:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_lambdas = true:silent + +# CS8981: The type name only contains lower-cased ascii characters. Such names may become reserved for the language. +dotnet_diagnostic.CS8981.severity = silent + +# IDE1006: Naming Styles +dotnet_diagnostic.IDE1006.severity = silent + +# CA1822: Mark members as static +dotnet_diagnostic.CA1822.severity = silent + +[*.{cs,vb}] +#### Naming styles #### + +# Naming rules + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + +# Symbol specifications + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +# Naming styles + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case +dotnet_style_operator_placement_when_wrapping = beginning_of_line +tab_width = 4 +indent_size = 4 +end_of_line = crlf + +# IDE0040: Add accessibility modifiers +dotnet_diagnostic.IDE0040.severity = silent + +# IDE0044: Add readonly modifier +dotnet_diagnostic.IDE0044.severity = silent diff --git a/ru/codes/csharp/.gitignore b/ru/codes/csharp/.gitignore new file mode 100644 index 000000000..a4b66a94a --- /dev/null +++ b/ru/codes/csharp/.gitignore @@ -0,0 +1,5 @@ +.idea/ +.vs/ +obj/ +.Debug +bin/ diff --git a/ru/codes/csharp/.vscode/launch.json b/ru/codes/csharp/.vscode/launch.json new file mode 100644 index 000000000..c3201256b --- /dev/null +++ b/ru/codes/csharp/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + "version": "0.2.0", + "configurations": [ + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "name": ".NET Core Launch (console)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/bin/Debug/net6.0/hello-algo.dll", + "args": [], + "cwd": "${workspaceFolder}", + // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console + "console": "internalConsole", + "stopAtEntry": false + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach" + } + ] +} diff --git a/ru/codes/csharp/.vscode/tasks.json b/ru/codes/csharp/.vscode/tasks.json new file mode 100644 index 000000000..dc310d887 --- /dev/null +++ b/ru/codes/csharp/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/hello-algo.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/hello-algo.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/hello-algo.csproj" + ], + "problemMatcher": "$msCompile" + } + ] +} diff --git a/ru/codes/csharp/GlobalUsing.cs b/ru/codes/csharp/GlobalUsing.cs new file mode 100644 index 000000000..402066ff4 --- /dev/null +++ b/ru/codes/csharp/GlobalUsing.cs @@ -0,0 +1,3 @@ +global using NUnit.Framework; +global using hello_algo.utils; +global using System.Text; \ No newline at end of file diff --git a/ru/codes/csharp/chapter_array_and_linkedlist/array.cs b/ru/codes/csharp/chapter_array_and_linkedlist/array.cs new file mode 100644 index 000000000..1cc5b9b13 --- /dev/null +++ b/ru/codes/csharp/chapter_array_and_linkedlist/array.cs @@ -0,0 +1,107 @@ +// File: array.cs +// Created Time: 2022-12-14 +// Author: mingXta (1195669834@qq.com) + +namespace hello_algo.chapter_array_and_linkedlist; + +public class array { + /* Случайный доступ к элементу */ + int RandomAccess(int[] nums) { + Random random = new(); + // Случайным образом выбрать число из интервала [0, nums.Length) + int randomIndex = random.Next(nums.Length); + // Получить и вернуть случайный элемент + int randomNum = nums[randomIndex]; + return randomNum; + } + + /* Увеличить длину массива */ + int[] Extend(int[] nums, int enlarge) { + // Инициализировать массив увеличенной длины + int[] res = new int[nums.Length + enlarge]; + // Скопировать все элементы исходного массива в новый массив + for (int i = 0; i < nums.Length; i++) { + res[i] = nums[i]; + } + // Вернуть новый массив после расширения + return res; + } + + /* Вставить элемент num по индексу index в массив */ + void Insert(int[] nums, int num, int index) { + // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад + for (int i = nums.Length - 1; i > index; i--) { + nums[i] = nums[i - 1]; + } + // Присвоить num элементу по индексу index + nums[index] = num; + } + + /* Удалить элемент по индексу index */ + void Remove(int[] nums, int index) { + // Сдвинуть все элементы после индекса index на одну позицию вперед + for (int i = index; i < nums.Length - 1; i++) { + nums[i] = nums[i + 1]; + } + } + + /* Обход массива */ + void Traverse(int[] nums) { + int count = 0; + // Обход массива по индексам + for (int i = 0; i < nums.Length; i++) { + count += nums[i]; + } + // Непосредственно обходить элементы массива + foreach (int num in nums) { + count += num; + } + } + + /* Найти заданный элемент в массиве */ + int Find(int[] nums, int target) { + for (int i = 0; i < nums.Length; i++) { + if (nums[i] == target) + return i; + } + return -1; + } + + /* Вспомогательная функция: преобразовать массив в строку */ + string ToString(int[] nums) { + return string.Join(",", nums); + } + + + [Test] + public void Test() { + // Инициализация массива + int[] arr = new int[5]; + Console.WriteLine("Массив arr = " + ToString(arr)); + int[] nums = [1, 3, 2, 5, 4]; + Console.WriteLine("Массив nums = " + ToString(nums)); + + // Случайный доступ + int randomNum = RandomAccess(nums); + Console.WriteLine("Случайный элемент из nums = " + randomNum); + + // Расширение длины + nums = Extend(nums, 3); + Console.WriteLine("После увеличения длины массива до 8 nums = " + ToString(nums)); + + // Вставка элемента + Insert(nums, 6, 3); + Console.WriteLine("После вставки числа 6 по индексу 3 nums = " + ToString(nums)); + + // Удаление элемента + Remove(nums, 2); + Console.WriteLine("После удаления элемента по индексу 2 nums = " + ToString(nums)); + + // Обход массива + Traverse(nums); + + // Поиск элемента + int index = Find(nums, 3); + Console.WriteLine("Поиск элемента 3 в nums: индекс = " + index); + } +} diff --git a/ru/codes/csharp/chapter_array_and_linkedlist/linked_list.cs b/ru/codes/csharp/chapter_array_and_linkedlist/linked_list.cs new file mode 100644 index 000000000..68b82d445 --- /dev/null +++ b/ru/codes/csharp/chapter_array_and_linkedlist/linked_list.cs @@ -0,0 +1,80 @@ +// File: linked_list.cs +// Created Time: 2022-12-16 +// Author: mingXta (1195669834@qq.com) + +namespace hello_algo.chapter_array_and_linkedlist; + +public class linked_list { + /* Вставить узел P после узла n0 в связном списке */ + void Insert(ListNode n0, ListNode P) { + ListNode? n1 = n0.next; + P.next = n1; + n0.next = P; + } + + /* Удалить первый узел после узла n0 в связном списке */ + void Remove(ListNode n0) { + if (n0.next == null) + return; + // n0 -> P -> n1 + ListNode P = n0.next; + ListNode? n1 = P.next; + n0.next = n1; + } + + /* Доступ к узлу связного списка по индексу index */ + ListNode? Access(ListNode? head, int index) { + for (int i = 0; i < index; i++) { + if (head == null) + return null; + head = head.next; + } + return head; + } + + /* Найти в связном списке первый узел со значением target */ + int Find(ListNode? head, int target) { + int index = 0; + while (head != null) { + if (head.val == target) + return index; + head = head.next; + index++; + } + return -1; + } + + + [Test] + public void Test() { + // Инициализация связного списка + // Инициализация всех узлов + ListNode n0 = new(1); + ListNode n1 = new(3); + ListNode n2 = new(2); + ListNode n3 = new(5); + ListNode n4 = new(4); + // Построить ссылки между узлами + n0.next = n1; + n1.next = n2; + n2.next = n3; + n3.next = n4; + Console.WriteLine($"Исходный связный список: {n0}"); + + // Вставка узла + Insert(n0, new ListNode(0)); + Console.WriteLine($"Связный список после вставки узла: {n0}"); + + // Удаление узла + Remove(n0); + Console.WriteLine($"Связный список после удаления узла: {n0}"); + + // Доступ к узлу + ListNode? node = Access(n0, 3); + Console.WriteLine($"Значение узла по индексу 3 в связном списке = {node?.val}"); + + // Поиск узла + int index = Find(n0, 2); + Console.WriteLine($"Индекс узла со значением 2 в связном списке = {index}"); + } +} diff --git a/ru/codes/csharp/chapter_array_and_linkedlist/list.cs b/ru/codes/csharp/chapter_array_and_linkedlist/list.cs new file mode 100644 index 000000000..bea624e5e --- /dev/null +++ b/ru/codes/csharp/chapter_array_and_linkedlist/list.cs @@ -0,0 +1,66 @@ +/** + * File: list.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_array_and_linkedlist; + +public class list { + [Test] + public void Test() { + + /* Инициализация списка */ + int[] numbers = [1, 3, 2, 5, 4]; + List nums = [.. numbers]; + Console.WriteLine("Список nums = " + string.Join(",", nums)); + + /* Доступ к элементу */ + int num = nums[1]; + Console.WriteLine("Элемент по индексу 1: num = " + num); + + /* Обновление элемента */ + nums[1] = 0; + Console.WriteLine("После обновления элемента по индексу 1 до 0 nums = " + string.Join(",", nums)); + + /* Очистить список */ + nums.Clear(); + Console.WriteLine("После очистки списка nums = " + string.Join(",", nums)); + + /* Добавление элемента в конец */ + nums.Add(1); + nums.Add(3); + nums.Add(2); + nums.Add(5); + nums.Add(4); + Console.WriteLine("После добавления элементов nums = " + string.Join(",", nums)); + + /* Вставка элемента в середину */ + nums.Insert(3, 6); + Console.WriteLine("После вставки числа 6 по индексу 3 nums = " + string.Join(",", nums)); + + /* Удаление элемента */ + nums.RemoveAt(3); + Console.WriteLine("После удаления элемента по индексу 3 nums = " + string.Join(",", nums)); + + /* Обходить список по индексам */ + int count = 0; + for (int i = 0; i < nums.Count; i++) { + count += nums[i]; + } + /* Непосредственно обходить элементы списка */ + count = 0; + foreach (int x in nums) { + count += x; + } + + /* Объединить два списка */ + List nums1 = [6, 8, 7, 10, 9]; + nums.AddRange(nums1); + Console.WriteLine("После конкатенации списка nums1 к nums nums = " + string.Join(",", nums)); + + /* Отсортировать список */ + nums.Sort(); // После сортировки элементы списка располагаются по возрастанию + Console.WriteLine("После сортировки списка nums = " + string.Join(",", nums)); + } +} diff --git a/ru/codes/csharp/chapter_array_and_linkedlist/my_list.cs b/ru/codes/csharp/chapter_array_and_linkedlist/my_list.cs new file mode 100644 index 000000000..a47098526 --- /dev/null +++ b/ru/codes/csharp/chapter_array_and_linkedlist/my_list.cs @@ -0,0 +1,144 @@ +/** + * File: my_list.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_array_and_linkedlist; + +/* Класс списка */ +class MyList { + private int[] arr; // Массив (для хранения элементов списка) + private int arrCapacity = 10; // Вместимость списка + private int arrSize = 0; // Длина списка (текущее число элементов) + private readonly int extendRatio = 2; // Коэффициент увеличения списка при каждом расширении + + /* Конструктор */ + public MyList() { + arr = new int[arrCapacity]; + } + + /* Получить длину списка (текущее число элементов) */ + public int Size() { + return arrSize; + } + + /* Получить вместимость списка */ + public int Capacity() { + return arrCapacity; + } + + /* Доступ к элементу */ + public int Get(int index) { + // Если индекс выходит за границы, выбрасывается исключение; далее аналогично + if (index < 0 || index >= arrSize) + throw new IndexOutOfRangeException("индекс выходит за границы"); + return arr[index]; + } + + /* Обновление элемента */ + public void Set(int index, int num) { + if (index < 0 || index >= arrSize) + throw new IndexOutOfRangeException("индекс выходит за границы"); + arr[index] = num; + } + + /* Добавление элемента в конец */ + public void Add(int num) { + // При превышении вместимости по числу элементов запускается расширение + if (arrSize == arrCapacity) + ExtendCapacity(); + arr[arrSize] = num; + // Обновить число элементов + arrSize++; + } + + /* Вставка элемента в середину */ + public void Insert(int index, int num) { + if (index < 0 || index >= arrSize) + throw new IndexOutOfRangeException("индекс выходит за границы"); + // При превышении вместимости по числу элементов запускается расширение + if (arrSize == arrCapacity) + ExtendCapacity(); + // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад + for (int j = arrSize - 1; j >= index; j--) { + arr[j + 1] = arr[j]; + } + arr[index] = num; + // Обновить число элементов + arrSize++; + } + + /* Удаление элемента */ + public int Remove(int index) { + if (index < 0 || index >= arrSize) + throw new IndexOutOfRangeException("индекс выходит за границы"); + int num = arr[index]; + // Сдвинуть все элементы после индекса index на одну позицию вперед + for (int j = index; j < arrSize - 1; j++) { + arr[j] = arr[j + 1]; + } + // Обновить число элементов + arrSize--; + // Вернуть удаленный элемент + return num; + } + + /* Расширение списка */ + public void ExtendCapacity() { + // Создать новый массив длиной arrCapacity * extendRatio и скопировать в него исходный массив + Array.Resize(ref arr, arrCapacity * extendRatio); + // Обновить вместимость списка + arrCapacity = arr.Length; + } + + /* Преобразовать список в массив */ + public int[] ToArray() { + // Преобразовывать только элементы списка в пределах фактической длины + int[] arr = new int[arrSize]; + for (int i = 0; i < arrSize; i++) { + arr[i] = Get(i); + } + return arr; + } +} + +public class my_list { + [Test] + public void Test() { + /* Инициализация списка */ + MyList nums = new(); + /* Добавление элемента в конец */ + nums.Add(1); + nums.Add(3); + nums.Add(2); + nums.Add(5); + nums.Add(4); + Console.WriteLine("Список nums = " + string.Join(",", nums.ToArray()) + + ", вместимость = " + nums.Capacity() + " , длина = " + nums.Size()); + + /* Вставка элемента в середину */ + nums.Insert(3, 6); + Console.WriteLine("После вставки числа 6 по индексу 3 nums = " + string.Join(",", nums.ToArray())); + + /* Удаление элемента */ + nums.Remove(3); + Console.WriteLine("После удаления элемента по индексу 3 nums = " + string.Join(",", nums.ToArray())); + + /* Доступ к элементу */ + int num = nums.Get(1); + Console.WriteLine("Элемент по индексу 1: num = " + num); + + /* Обновление элемента */ + nums.Set(1, 0); + Console.WriteLine("После обновления элемента по индексу 1 до 0 nums = " + string.Join(",", nums.ToArray())); + + /* Проверка механизма расширения */ + for (int i = 0; i < 10; i++) { + // При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения + nums.Add(i); + } + Console.WriteLine("Список nums после увеличения вместимости = " + string.Join(",", nums.ToArray()) + + ", вместимость = " + nums.Capacity() + " , длина = " + nums.Size()); + } +} diff --git a/ru/codes/csharp/chapter_backtracking/n_queens.cs b/ru/codes/csharp/chapter_backtracking/n_queens.cs new file mode 100644 index 000000000..7d6465e80 --- /dev/null +++ b/ru/codes/csharp/chapter_backtracking/n_queens.cs @@ -0,0 +1,76 @@ +/** + * File: n_queens.cs + * Created Time: 2023-05-04 + * Author: hpstory (hpstory1024@163.com) + */ + +namespace hello_algo.chapter_backtracking; + +public class n_queens { + /* Алгоритм бэктрекинга: n ферзей */ + void Backtrack(int row, int n, List> state, List>> res, + bool[] cols, bool[] diags1, bool[] diags2) { + // Когда все строки уже обработаны, записать решение + if (row == n) { + List> copyState = []; + foreach (List sRow in state) { + copyState.Add(new List(sRow)); + } + res.Add(copyState); + return; + } + // Обойти все столбцы + for (int col = 0; col < n; col++) { + // Вычислить главную и побочную диагонали, соответствующие этой клетке + int diag1 = row - col + n - 1; + int diag2 = row + col; + // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей + if (!cols[col] && !diags1[diag1] && !diags2[diag2]) { + // Попытка: поставить ферзя в эту клетку + state[row][col] = "Q"; + cols[col] = diags1[diag1] = diags2[diag2] = true; + // Перейти к размещению следующей строки + Backtrack(row + 1, n, state, res, cols, diags1, diags2); + // Откат: восстановить эту клетку как пустую + state[row][col] = "#"; + cols[col] = diags1[diag1] = diags2[diag2] = false; + } + } + } + + /* Решить задачу о n ферзях */ + List>> NQueens(int n) { + // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку + List> state = []; + for (int i = 0; i < n; i++) { + List row = []; + for (int j = 0; j < n; j++) { + row.Add("#"); + } + state.Add(row); + } + bool[] cols = new bool[n]; // Отмечать, есть ли ферзь в столбце + bool[] diags1 = new bool[2 * n - 1]; // Отмечать наличие ферзя на главной диагонали + bool[] diags2 = new bool[2 * n - 1]; // Отмечать наличие ферзя на побочной диагонали + List>> res = []; + + Backtrack(0, n, state, res, cols, diags1, diags2); + + return res; + } + + [Test] + public void Test() { + int n = 4; + List>> res = NQueens(n); + + Console.WriteLine("Размер входной доски = " + n); + Console.WriteLine("Количество способов расстановки ферзей: " + res.Count); + foreach (List> state in res) { + Console.WriteLine("--------------------"); + foreach (List row in state) { + PrintUtil.PrintList(row); + } + } + } +} diff --git a/ru/codes/csharp/chapter_backtracking/permutations_i.cs b/ru/codes/csharp/chapter_backtracking/permutations_i.cs new file mode 100644 index 000000000..6c59e0fa5 --- /dev/null +++ b/ru/codes/csharp/chapter_backtracking/permutations_i.cs @@ -0,0 +1,53 @@ +/** + * File: permutations_i.cs + * Created Time: 2023-04-24 + * Author: hpstory (hpstory1024@163.com) + */ + +namespace hello_algo.chapter_backtracking; + +public class permutations_i { + /* Алгоритм бэктрекинга: все перестановки I */ + void Backtrack(List state, int[] choices, bool[] selected, List> res) { + // Когда длина состояния равна числу элементов, записать решение + if (state.Count == choices.Length) { + res.Add(new List(state)); + return; + } + // Перебор всех вариантов выбора + for (int i = 0; i < choices.Length; i++) { + int choice = choices[i]; + // Отсечение: нельзя выбирать один и тот же элемент повторно + if (!selected[i]) { + // Попытка: сделать выбор и обновить состояние + selected[i] = true; + state.Add(choice); + // Перейти к следующему выбору + Backtrack(state, choices, selected, res); + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false; + state.RemoveAt(state.Count - 1); + } + } + } + + /* Все перестановки I */ + List> PermutationsI(int[] nums) { + List> res = []; + Backtrack([], nums, new bool[nums.Length], res); + return res; + } + + [Test] + public void Test() { + int[] nums = [1, 2, 3]; + + List> res = PermutationsI(nums); + + Console.WriteLine("Входной массив nums = " + string.Join(", ", nums)); + Console.WriteLine("Все перестановки res = "); + foreach (List permutation in res) { + PrintUtil.PrintList(permutation); + } + } +} diff --git a/ru/codes/csharp/chapter_backtracking/permutations_ii.cs b/ru/codes/csharp/chapter_backtracking/permutations_ii.cs new file mode 100644 index 000000000..c0f175477 --- /dev/null +++ b/ru/codes/csharp/chapter_backtracking/permutations_ii.cs @@ -0,0 +1,55 @@ +/** + * File: permutations_ii.cs + * Created Time: 2023-04-24 + * Author: hpstory (hpstory1024@163.com) + */ + +namespace hello_algo.chapter_backtracking; + +public class permutations_ii { + /* Алгоритм бэктрекинга: все перестановки II */ + void Backtrack(List state, int[] choices, bool[] selected, List> res) { + // Когда длина состояния равна числу элементов, записать решение + if (state.Count == choices.Length) { + res.Add(new List(state)); + return; + } + // Перебор всех вариантов выбора + HashSet duplicated = []; + for (int i = 0; i < choices.Length; i++) { + int choice = choices[i]; + // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы + if (!selected[i] && !duplicated.Contains(choice)) { + // Попытка: сделать выбор и обновить состояние + duplicated.Add(choice); // Записать значения уже выбранных элементов + selected[i] = true; + state.Add(choice); + // Перейти к следующему выбору + Backtrack(state, choices, selected, res); + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false; + state.RemoveAt(state.Count - 1); + } + } + } + + /* Все перестановки II */ + List> PermutationsII(int[] nums) { + List> res = []; + Backtrack([], nums, new bool[nums.Length], res); + return res; + } + + [Test] + public void Test() { + int[] nums = [1, 2, 2]; + + List> res = PermutationsII(nums); + + Console.WriteLine("Входной массив nums = " + string.Join(", ", nums)); + Console.WriteLine("Все перестановки res = "); + foreach (List permutation in res) { + PrintUtil.PrintList(permutation); + } + } +} diff --git a/ru/codes/csharp/chapter_backtracking/preorder_traversal_i_compact.cs b/ru/codes/csharp/chapter_backtracking/preorder_traversal_i_compact.cs new file mode 100644 index 000000000..18cd35708 --- /dev/null +++ b/ru/codes/csharp/chapter_backtracking/preorder_traversal_i_compact.cs @@ -0,0 +1,37 @@ +/** + * File: preorder_traversal_i_compact.cs + * Created Time: 2023-04-17 + * Author: hpstory (hpstory1024@163.com) + */ + +namespace hello_algo.chapter_backtracking; + +public class preorder_traversal_i_compact { + List res = []; + + /* Предварительный обход: пример 1 */ + void PreOrder(TreeNode? root) { + if (root == null) { + return; + } + if (root.val == 7) { + // Записать решение + res.Add(root); + } + PreOrder(root.left); + PreOrder(root.right); + } + + [Test] + public void Test() { + TreeNode? root = TreeNode.ListToTree([1, 7, 3, 4, 5, 6, 7]); + Console.WriteLine("\nИнициализация двоичного дерева"); + PrintUtil.PrintTree(root); + + // Предварительный обход + PreOrder(root); + + Console.WriteLine("\nВсе узлы со значением 7"); + PrintUtil.PrintList(res.Select(p => p.val).ToList()); + } +} diff --git a/ru/codes/csharp/chapter_backtracking/preorder_traversal_ii_compact.cs b/ru/codes/csharp/chapter_backtracking/preorder_traversal_ii_compact.cs new file mode 100644 index 000000000..29babf146 --- /dev/null +++ b/ru/codes/csharp/chapter_backtracking/preorder_traversal_ii_compact.cs @@ -0,0 +1,44 @@ +/** + * File: preorder_traversal_ii_compact.cs + * Created Time: 2023-04-17 + * Author: hpstory (hpstory1024@163.com) + */ + +namespace hello_algo.chapter_backtracking; + +public class preorder_traversal_ii_compact { + List path = []; + List> res = []; + + /* Предварительный обход: пример 2 */ + void PreOrder(TreeNode? root) { + if (root == null) { + return; + } + // Попытка + path.Add(root); + if (root.val == 7) { + // Записать решение + res.Add(new List(path)); + } + PreOrder(root.left); + PreOrder(root.right); + // Откат + path.RemoveAt(path.Count - 1); + } + + [Test] + public void Test() { + TreeNode? root = TreeNode.ListToTree([1, 7, 3, 4, 5, 6, 7]); + Console.WriteLine("\nИнициализация двоичного дерева"); + PrintUtil.PrintTree(root); + + // Предварительный обход + PreOrder(root); + + Console.WriteLine("\nВсе пути от корня к узлу 7"); + foreach (List path in res) { + PrintUtil.PrintList(path.Select(p => p.val).ToList()); + } + } +} diff --git a/ru/codes/csharp/chapter_backtracking/preorder_traversal_iii_compact.cs b/ru/codes/csharp/chapter_backtracking/preorder_traversal_iii_compact.cs new file mode 100644 index 000000000..5d0731efa --- /dev/null +++ b/ru/codes/csharp/chapter_backtracking/preorder_traversal_iii_compact.cs @@ -0,0 +1,45 @@ +/** + * File: preorder_traversal_iii_compact.cs + * Created Time: 2023-04-17 + * Author: hpstory (hpstory1024@163.com) + */ + +namespace hello_algo.chapter_backtracking; + +public class preorder_traversal_iii_compact { + List path = []; + List> res = []; + + /* Предварительный обход: пример 3 */ + void PreOrder(TreeNode? root) { + // Отсечение + if (root == null || root.val == 3) { + return; + } + // Попытка + path.Add(root); + if (root.val == 7) { + // Записать решение + res.Add(new List(path)); + } + PreOrder(root.left); + PreOrder(root.right); + // Откат + path.RemoveAt(path.Count - 1); + } + + [Test] + public void Test() { + TreeNode? root = TreeNode.ListToTree([1, 7, 3, 4, 5, 6, 7]); + Console.WriteLine("\nИнициализация двоичного дерева"); + PrintUtil.PrintTree(root); + + // Предварительный обход + PreOrder(root); + + Console.WriteLine("\nВсе пути от корня к узлу 7, не содержащие узлов со значением 3"); + foreach (List path in res) { + PrintUtil.PrintList(path.Select(p => p.val).ToList()); + } + } +} diff --git a/ru/codes/csharp/chapter_backtracking/preorder_traversal_iii_template.cs b/ru/codes/csharp/chapter_backtracking/preorder_traversal_iii_template.cs new file mode 100644 index 000000000..c396774d5 --- /dev/null +++ b/ru/codes/csharp/chapter_backtracking/preorder_traversal_iii_template.cs @@ -0,0 +1,72 @@ +/** + * File: preorder_traversal_iii_template.cs + * Created Time: 2023-04-17 + * Author: hpstory (hpstory1024@163.com) + */ + +namespace hello_algo.chapter_backtracking; + +public class preorder_traversal_iii_template { + /* Проверить, является ли текущее состояние решением */ + bool IsSolution(List state) { + return state.Count != 0 && state[^1].val == 7; + } + + /* Записать решение */ + void RecordSolution(List state, List> res) { + res.Add(new List(state)); + } + + /* Проверить, допустим ли этот выбор в текущем состоянии */ + bool IsValid(List state, TreeNode choice) { + return choice != null && choice.val != 3; + } + + /* Обновить состояние */ + void MakeChoice(List state, TreeNode choice) { + state.Add(choice); + } + + /* Восстановить состояние */ + void UndoChoice(List state, TreeNode choice) { + state.RemoveAt(state.Count - 1); + } + + /* Алгоритм бэктрекинга: пример 3 */ + void Backtrack(List state, List choices, List> res) { + // Проверить, является ли текущее состояние решением + if (IsSolution(state)) { + // Записать решение + RecordSolution(state, res); + } + // Перебор всех вариантов выбора + foreach (TreeNode choice in choices) { + // Отсечение: проверить допустимость выбора + if (IsValid(state, choice)) { + // Попытка: сделать выбор и обновить состояние + MakeChoice(state, choice); + // Перейти к следующему выбору + Backtrack(state, [choice.left!, choice.right!], res); + // Откат: отменить выбор и восстановить предыдущее состояние + UndoChoice(state, choice); + } + } + } + + [Test] + public void Test() { + TreeNode? root = TreeNode.ListToTree([1, 7, 3, 4, 5, 6, 7]); + Console.WriteLine("\nИнициализация двоичного дерева"); + PrintUtil.PrintTree(root); + + // Алгоритм бэктрекинга + List> res = []; + List choices = [root!]; + Backtrack([], choices, res); + + Console.WriteLine("\nВсе пути от корня к узлу 7, в которых путь не содержит узлов со значением 3"); + foreach (List path in res) { + PrintUtil.PrintList(path.Select(p => p.val).ToList()); + } + } +} diff --git a/ru/codes/csharp/chapter_backtracking/subset_sum_i.cs b/ru/codes/csharp/chapter_backtracking/subset_sum_i.cs new file mode 100644 index 000000000..9682bb7d8 --- /dev/null +++ b/ru/codes/csharp/chapter_backtracking/subset_sum_i.cs @@ -0,0 +1,55 @@ +/** +* File: subset_sum_i.cs +* Created Time: 2023-06-25 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_backtracking; + +public class subset_sum_i { + /* Алгоритм бэктрекинга: сумма подмножеств I */ + void Backtrack(List state, int target, int[] choices, int start, List> res) { + // Если сумма подмножества равна target, записать решение + if (target == 0) { + res.Add(new List(state)); + return; + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + for (int i = start; i < choices.Length; i++) { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if (target - choices[i] < 0) { + break; + } + // Попытка: сделать выбор и обновить target и start + state.Add(choices[i]); + // Перейти к следующему выбору + Backtrack(state, target - choices[i], choices, i, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.RemoveAt(state.Count - 1); + } + } + + /* Решить задачу суммы подмножеств I */ + List> SubsetSumI(int[] nums, int target) { + List state = []; // Состояние (подмножество) + Array.Sort(nums); // Отсортировать nums + int start = 0; // Стартовая вершина обхода + List> res = []; // Список результатов (список подмножеств) + Backtrack(state, target, nums, start, res); + return res; + } + + [Test] + public void Test() { + int[] nums = [3, 4, 5]; + int target = 9; + List> res = SubsetSumI(nums, target); + Console.WriteLine("Входной массив nums = " + string.Join(", ", nums) + ", target = " + target); + Console.WriteLine("Все подмножества с суммой " + target + ": res = "); + foreach (var subset in res) { + PrintUtil.PrintList(subset); + } + } +} diff --git a/ru/codes/csharp/chapter_backtracking/subset_sum_i_naive.cs b/ru/codes/csharp/chapter_backtracking/subset_sum_i_naive.cs new file mode 100644 index 000000000..68a2594fa --- /dev/null +++ b/ru/codes/csharp/chapter_backtracking/subset_sum_i_naive.cs @@ -0,0 +1,53 @@ +/** +* File: subset_sum_i_naive.cs +* Created Time: 2023-06-25 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_backtracking; + +public class subset_sum_i_naive { + /* Алгоритм бэктрекинга: сумма подмножеств I */ + void Backtrack(List state, int target, int total, int[] choices, List> res) { + // Если сумма подмножества равна target, записать решение + if (total == target) { + res.Add(new List(state)); + return; + } + // Перебор всех вариантов выбора + for (int i = 0; i < choices.Length; i++) { + // Отсечение: если сумма подмножества превышает target, пропустить этот выбор + if (total + choices[i] > target) { + continue; + } + // Попытка: сделать выбор и обновить элемент и total + state.Add(choices[i]); + // Перейти к следующему выбору + Backtrack(state, target, total + choices[i], choices, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.RemoveAt(state.Count - 1); + } + } + + /* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */ + List> SubsetSumINaive(int[] nums, int target) { + List state = []; // Состояние (подмножество) + int total = 0; // Сумма подмножеств + List> res = []; // Список результатов (список подмножеств) + Backtrack(state, target, total, nums, res); + return res; + } + + [Test] + public void Test() { + int[] nums = [3, 4, 5]; + int target = 9; + List> res = SubsetSumINaive(nums, target); + Console.WriteLine("Входной массив nums = " + string.Join(", ", nums) + ", target = " + target); + Console.WriteLine("Все подмножества с суммой " + target + ": res = "); + foreach (var subset in res) { + PrintUtil.PrintList(subset); + } + Console.WriteLine("Обратите внимание: результат этого метода содержит повторяющиеся множества"); + } +} diff --git a/ru/codes/csharp/chapter_backtracking/subset_sum_ii.cs b/ru/codes/csharp/chapter_backtracking/subset_sum_ii.cs new file mode 100644 index 000000000..2c7ffae6d --- /dev/null +++ b/ru/codes/csharp/chapter_backtracking/subset_sum_ii.cs @@ -0,0 +1,60 @@ +/** +* File: subset_sum_ii.cs +* Created Time: 2023-06-25 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_backtracking; + +public class subset_sum_ii { + /* Алгоритм бэктрекинга: сумма подмножеств II */ + void Backtrack(List state, int target, int[] choices, int start, List> res) { + // Если сумма подмножества равна target, записать решение + if (target == 0) { + res.Add(new List(state)); + return; + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента + for (int i = start; i < choices.Length; i++) { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if (target - choices[i] < 0) { + break; + } + // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить + if (i > start && choices[i] == choices[i - 1]) { + continue; + } + // Попытка: сделать выбор и обновить target и start + state.Add(choices[i]); + // Перейти к следующему выбору + Backtrack(state, target - choices[i], choices, i + 1, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.RemoveAt(state.Count - 1); + } + } + + /* Решить задачу суммы подмножеств II */ + List> SubsetSumII(int[] nums, int target) { + List state = []; // Состояние (подмножество) + Array.Sort(nums); // Отсортировать nums + int start = 0; // Стартовая вершина обхода + List> res = []; // Список результатов (список подмножеств) + Backtrack(state, target, nums, start, res); + return res; + } + + [Test] + public void Test() { + int[] nums = [4, 4, 5]; + int target = 9; + List> res = SubsetSumII(nums, target); + Console.WriteLine("Входной массив nums = " + string.Join(", ", nums) + ", target = " + target); + Console.WriteLine("Все подмножества с суммой " + target + ": res = "); + foreach (var subset in res) { + PrintUtil.PrintList(subset); + } + } +} diff --git a/ru/codes/csharp/chapter_computational_complexity/iteration.cs b/ru/codes/csharp/chapter_computational_complexity/iteration.cs new file mode 100644 index 000000000..318e43363 --- /dev/null +++ b/ru/codes/csharp/chapter_computational_complexity/iteration.cs @@ -0,0 +1,77 @@ +/** +* File: iteration.cs +* Created Time: 2023-08-28 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_computational_complexity; + +public class iteration { + /* Цикл for */ + int ForLoop(int n) { + int res = 0; + // Циклическое суммирование 1, 2, ..., n-1, n + for (int i = 1; i <= n; i++) { + res += i; + } + return res; + } + + /* Цикл while */ + int WhileLoop(int n) { + int res = 0; + int i = 1; // Инициализация условной переменной + // Циклическое суммирование 1, 2, ..., n-1, n + while (i <= n) { + res += i; + i += 1; // Обновить условную переменную + } + return res; + } + + /* Цикл while (двойное обновление) */ + int WhileLoopII(int n) { + int res = 0; + int i = 1; // Инициализация условной переменной + // Циклическое суммирование 1, 4, 10, ... + while (i <= n) { + res += i; + // Обновить условную переменную + i += 1; + i *= 2; + } + return res; + } + + /* Двойной цикл for */ + string NestedForLoop(int n) { + StringBuilder res = new(); + // Цикл по i = 1, 2, ..., n-1, n + for (int i = 1; i <= n; i++) { + // Цикл по j = 1, 2, ..., n-1, n + for (int j = 1; j <= n; j++) { + res.Append($"({i}, {j}), "); + } + } + return res.ToString(); + } + + /* Driver Code */ + [Test] + public void Test() { + int n = 5; + int res; + + res = ForLoop(n); + Console.WriteLine("\nРезультат суммирования в цикле for res = " + res); + + res = WhileLoop(n); + Console.WriteLine("\nРезультат суммирования в цикле while res = " + res); + + res = WhileLoopII(n); + Console.WriteLine("\nРезультат суммирования в цикле while (двойное обновление) res = " + res); + + string resStr = NestedForLoop(n); + Console.WriteLine("\nРезультат обхода в двойном цикле for " + resStr); + } +} diff --git a/ru/codes/csharp/chapter_computational_complexity/recursion.cs b/ru/codes/csharp/chapter_computational_complexity/recursion.cs new file mode 100644 index 000000000..7f8bd218f --- /dev/null +++ b/ru/codes/csharp/chapter_computational_complexity/recursion.cs @@ -0,0 +1,78 @@ +/** +* File: recursion.cs +* Created Time: 2023-08-28 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_computational_complexity; + +public class recursion { + /* Рекурсия */ + int Recur(int n) { + // Условие завершения + if (n == 1) + return 1; + // Рекурсия: рекурсивный вызов + int res = Recur(n - 1); + // Возврат: вернуть результат + return n + res; + } + + /* Имитация рекурсии итерацией */ + int ForLoopRecur(int n) { + // Использовать явный стек для имитации системного стека вызовов + Stack stack = new(); + int res = 0; + // Рекурсия: рекурсивный вызов + for (int i = n; i > 0; i--) { + // Имитировать «рекурсию» с помощью операции помещения в стек + stack.Push(i); + } + // Возврат: вернуть результат + while (stack.Count > 0) { + // Имитировать «возврат» с помощью операции извлечения из стека + res += stack.Pop(); + } + // res = 1+2+3+...+n + return res; + } + + /* Хвостовая рекурсия */ + int TailRecur(int n, int res) { + // Условие завершения + if (n == 0) + return res; + // Хвостовой рекурсивный вызов + return TailRecur(n - 1, res + n); + } + + /* Последовательность Фибоначчи: рекурсия */ + int Fib(int n) { + // Условие завершения: f(1) = 0, f(2) = 1 + if (n == 1 || n == 2) + return n - 1; + // Рекурсивный вызов f(n) = f(n-1) + f(n-2) + int res = Fib(n - 1) + Fib(n - 2); + // Вернуть результат f(n) + return res; + } + + /* Driver Code */ + [Test] + public void Test() { + int n = 5; + int res; + + res = Recur(n); + Console.WriteLine("\nРезультат суммирования в рекурсивной функции res = " + res); + + res = ForLoopRecur(n); + Console.WriteLine("\nРезультат суммирования при имитации рекурсии итерацией res = " + res); + + res = TailRecur(n, 0); + Console.WriteLine("\nРезультат суммирования в хвостовой рекурсии res = " + res); + + res = Fib(n); + Console.WriteLine("\nЧлен последовательности Фибоначчи с номером " + n + " = " + res); + } +} diff --git a/ru/codes/csharp/chapter_computational_complexity/space_complexity.cs b/ru/codes/csharp/chapter_computational_complexity/space_complexity.cs new file mode 100644 index 000000000..e30af8b36 --- /dev/null +++ b/ru/codes/csharp/chapter_computational_complexity/space_complexity.cs @@ -0,0 +1,104 @@ +/** + * File: space_complexity.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_computational_complexity; + +public class space_complexity { + /* Функция */ + int Function() { + // Выполнить некоторые операции + return 0; + } + + /* Постоянная сложность */ + void Constant(int n) { + // Константы, переменные и объекты занимают O(1) памяти + int a = 0; + int b = 0; + int[] nums = new int[10000]; + ListNode node = new(0); + // Переменные в цикле занимают O(1) памяти + for (int i = 0; i < n; i++) { + int c = 0; + } + // Функции в цикле занимают O(1) памяти + for (int i = 0; i < n; i++) { + Function(); + } + } + + /* Линейная сложность */ + void Linear(int n) { + // Массив длины n занимает O(n) памяти + int[] nums = new int[n]; + // Список длины n занимает O(n) памяти + List nodes = []; + for (int i = 0; i < n; i++) { + nodes.Add(new ListNode(i)); + } + // Хеш-таблица длины n занимает O(n) памяти + Dictionary map = []; + for (int i = 0; i < n; i++) { + map.Add(i, i.ToString()); + } + } + + /* Линейная сложность (рекурсивная реализация) */ + void LinearRecur(int n) { + Console.WriteLine("Рекурсия n = " + n); + if (n == 1) return; + LinearRecur(n - 1); + } + + /* Квадратичная сложность */ + void Quadratic(int n) { + // Матрица занимает O(n^2) памяти + int[,] numMatrix = new int[n, n]; + // Двумерный список занимает O(n^2) памяти + List> numList = []; + for (int i = 0; i < n; i++) { + List tmp = []; + for (int j = 0; j < n; j++) { + tmp.Add(0); + } + numList.Add(tmp); + } + } + + /* Квадратичная сложность (рекурсивная реализация) */ + int QuadraticRecur(int n) { + if (n <= 0) return 0; + int[] nums = new int[n]; + Console.WriteLine("В рекурсии n = " + n + ", длина nums = " + nums.Length); + return QuadraticRecur(n - 1); + } + + /* Экспоненциальная сложность (построение полного двоичного дерева) */ + TreeNode? BuildTree(int n) { + if (n == 0) return null; + TreeNode root = new(0) { + left = BuildTree(n - 1), + right = BuildTree(n - 1) + }; + return root; + } + + [Test] + public void Test() { + int n = 5; + // Постоянная сложность + Constant(n); + // Линейная сложность + Linear(n); + LinearRecur(n); + // Квадратичная сложность + Quadratic(n); + QuadraticRecur(n); + // Экспоненциальная сложность + TreeNode? root = BuildTree(n); + PrintUtil.PrintTree(root); + } +} diff --git a/ru/codes/csharp/chapter_computational_complexity/time_complexity.cs b/ru/codes/csharp/chapter_computational_complexity/time_complexity.cs new file mode 100644 index 000000000..f60495bfb --- /dev/null +++ b/ru/codes/csharp/chapter_computational_complexity/time_complexity.cs @@ -0,0 +1,195 @@ +/** + * File: time_complexity.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_computational_complexity; + +public class time_complexity { + void Algorithm(int n) { + int a = 1; // +0 (прием 1) + a += n; // +0 (прием 1) + // +n (прием 2) + for (int i = 0; i < 5 * n + 1; i++) { + Console.WriteLine(0); + } + // +n*n (прием 3) + for (int i = 0; i < 2 * n; i++) { + for (int j = 0; j < n + 1; j++) { + Console.WriteLine(0); + } + } + } + + // Временная сложность алгоритма A: константная + void AlgorithmA(int n) { + Console.WriteLine(0); + } + + // Временная сложность алгоритма B: линейная + void AlgorithmB(int n) { + for (int i = 0; i < n; i++) { + Console.WriteLine(0); + } + } + + // Временная сложность алгоритма C: константная + void AlgorithmC(int n) { + for (int i = 0; i < 1000000; i++) { + Console.WriteLine(0); + } + } + + /* Постоянная сложность */ + int Constant(int n) { + int count = 0; + int size = 100000; + for (int i = 0; i < size; i++) + count++; + return count; + } + + /* Линейная сложность */ + int Linear(int n) { + int count = 0; + for (int i = 0; i < n; i++) + count++; + return count; + } + + /* Линейная сложность (обход массива) */ + int ArrayTraversal(int[] nums) { + int count = 0; + // Число итераций пропорционально длине массива + foreach (int num in nums) { + count++; + } + return count; + } + + /* Квадратичная сложность */ + int Quadratic(int n) { + int count = 0; + // Число итераций квадратично зависит от размера данных n + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + count++; + } + } + return count; + } + + /* Квадратичная сложность (пузырьковая сортировка) */ + int BubbleSort(int[] nums) { + int count = 0; // Счетчик + // Внешний цикл: неотсортированный диапазон [0, i] + for (int i = nums.Length - 1; i > 0; i--) { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (int j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]); + count += 3; // Обмен элементов включает 3 элементарные операции + } + } + } + return count; + } + + /* Экспоненциальная сложность (итеративная реализация) */ + int Exponential(int n) { + int count = 0, bas = 1; + // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1) + for (int i = 0; i < n; i++) { + for (int j = 0; j < bas; j++) { + count++; + } + bas *= 2; + } + // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1 + return count; + } + + /* Экспоненциальная сложность (рекурсивная реализация) */ + int ExpRecur(int n) { + if (n == 1) return 1; + return ExpRecur(n - 1) + ExpRecur(n - 1) + 1; + } + + /* Логарифмическая сложность (итеративная реализация) */ + int Logarithmic(int n) { + int count = 0; + while (n > 1) { + n /= 2; + count++; + } + return count; + } + + /* Логарифмическая сложность (рекурсивная реализация) */ + int LogRecur(int n) { + if (n <= 1) return 0; + return LogRecur(n / 2) + 1; + } + + /* Линейно-логарифмическая сложность */ + int LinearLogRecur(int n) { + if (n <= 1) return 1; + int count = LinearLogRecur(n / 2) + LinearLogRecur(n / 2); + for (int i = 0; i < n; i++) { + count++; + } + return count; + } + + /* Факториальная сложность (рекурсивная реализация) */ + int FactorialRecur(int n) { + if (n == 0) return 1; + int count = 0; + // Из одного получается n + for (int i = 0; i < n; i++) { + count += FactorialRecur(n - 1); + } + return count; + } + + [Test] + public void Test() { + // Можно изменить n и запустить программу, чтобы увидеть, как меняется число операций при разных сложностях + int n = 8; + Console.WriteLine("Размер входных данных n = " + n); + + int count = Constant(n); + Console.WriteLine("Число операций константной сложности = " + count); + + count = Linear(n); + Console.WriteLine("Число операций линейной сложности = " + count); + count = ArrayTraversal(new int[n]); + Console.WriteLine("Число операций линейной сложности (обход массива) = " + count); + + count = Quadratic(n); + Console.WriteLine("Число операций квадратичной сложности = " + count); + int[] nums = new int[n]; + for (int i = 0; i < n; i++) + nums[i] = n - i; // [n,n-1,...,2,1] + count = BubbleSort(nums); + Console.WriteLine("Число операций квадратичной сложности (пузырьковая сортировка) = " + count); + + count = Exponential(n); + Console.WriteLine("Число операций экспоненциальной сложности (итеративная реализация) = " + count); + count = ExpRecur(n); + Console.WriteLine("Число операций экспоненциальной сложности (рекурсивная реализация) = " + count); + + count = Logarithmic(n); + Console.WriteLine("Число операций логарифмической сложности (итеративная реализация) = " + count); + count = LogRecur(n); + Console.WriteLine("Число операций логарифмической сложности (рекурсивная реализация) = " + count); + + count = LinearLogRecur(n); + Console.WriteLine("Число операций линейно-логарифмической сложности (рекурсивная реализация) = " + count); + + count = FactorialRecur(n); + Console.WriteLine("Число операций факториальной сложности (рекурсивная реализация) = " + count); + } +} diff --git a/ru/codes/csharp/chapter_computational_complexity/worst_best_time_complexity.cs b/ru/codes/csharp/chapter_computational_complexity/worst_best_time_complexity.cs new file mode 100644 index 000000000..330b9f542 --- /dev/null +++ b/ru/codes/csharp/chapter_computational_complexity/worst_best_time_complexity.cs @@ -0,0 +1,49 @@ +/** + * File: worst_best_time_complexity.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_computational_complexity; + +public class worst_best_time_complexity { + /* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */ + int[] RandomNumbers(int n) { + int[] nums = new int[n]; + // Создать массив nums = { 1, 2, 3, ..., n } + for (int i = 0; i < n; i++) { + nums[i] = i + 1; + } + + // Случайно перемешать элементы массива + for (int i = 0; i < nums.Length; i++) { + int index = new Random().Next(i, nums.Length); + (nums[i], nums[index]) = (nums[index], nums[i]); + } + return nums; + } + + /* Найти индекс числа 1 в массиве nums */ + int FindOne(int[] nums) { + for (int i = 0; i < nums.Length; i++) { + // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1) + // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n) + if (nums[i] == 1) + return i; + } + return -1; + } + + + /* Driver Code */ + [Test] + public void Test() { + for (int i = 0; i < 10; i++) { + int n = 100; + int[] nums = RandomNumbers(n); + int index = FindOne(nums); + Console.WriteLine("\nМассив [1, 2, ..., n] после перемешивания = " + string.Join(",", nums)); + Console.WriteLine("Индекс числа 1 = " + index); + } + } +} diff --git a/ru/codes/csharp/chapter_divide_and_conquer/binary_search_recur.cs b/ru/codes/csharp/chapter_divide_and_conquer/binary_search_recur.cs new file mode 100644 index 000000000..0227e8587 --- /dev/null +++ b/ru/codes/csharp/chapter_divide_and_conquer/binary_search_recur.cs @@ -0,0 +1,46 @@ +/** +* File: binary_search_recur.cs +* Created Time: 2023-07-18 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_divide_and_conquer; + +public class binary_search_recur { + /* Бинарный поиск: задача f(i, j) */ + int DFS(int[] nums, int target, int i, int j) { + // Если интервал пуст, целевой элемент отсутствует, вернуть -1 + if (i > j) { + return -1; + } + // Вычислить индекс середины m + int m = (i + j) / 2; + if (nums[m] < target) { + // Рекурсивная подзадача f(m+1, j) + return DFS(nums, target, m + 1, j); + } else if (nums[m] > target) { + // Рекурсивная подзадача f(i, m-1) + return DFS(nums, target, i, m - 1); + } else { + // Целевой элемент найден, вернуть его индекс + return m; + } + } + + /* Бинарный поиск */ + int BinarySearch(int[] nums, int target) { + int n = nums.Length; + // Решить задачу f(0, n-1) + return DFS(nums, target, 0, n - 1); + } + + [Test] + public void Test() { + int target = 6; + int[] nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; + + // Бинарный поиск (двусторонне замкнутый интервал) + int index = BinarySearch(nums, target); + Console.WriteLine("Индекс целевого элемента 6 = " + index); + } +} diff --git a/ru/codes/csharp/chapter_divide_and_conquer/build_tree.cs b/ru/codes/csharp/chapter_divide_and_conquer/build_tree.cs new file mode 100644 index 000000000..a732553f7 --- /dev/null +++ b/ru/codes/csharp/chapter_divide_and_conquer/build_tree.cs @@ -0,0 +1,49 @@ +/** +* File: build_tree.cs +* Created Time: 2023-07-18 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_divide_and_conquer; + +public class build_tree { + /* Построить двоичное дерево: разделяй и властвуй */ + TreeNode? DFS(int[] preorder, Dictionary inorderMap, int i, int l, int r) { + // Завершить при пустом диапазоне поддерева + if (r - l < 0) + return null; + // Инициализировать корневой узел + TreeNode root = new(preorder[i]); + // Найти m, чтобы разделить левое и правое поддеревья + int m = inorderMap[preorder[i]]; + // Подзадача: построить левое поддерево + root.left = DFS(preorder, inorderMap, i + 1, l, m - 1); + // Подзадача: построить правое поддерево + root.right = DFS(preorder, inorderMap, i + 1 + m - l, m + 1, r); + // Вернуть корневой узел + return root; + } + + /* Построить двоичное дерево */ + TreeNode? BuildTree(int[] preorder, int[] inorder) { + // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам + Dictionary inorderMap = []; + for (int i = 0; i < inorder.Length; i++) { + inorderMap.TryAdd(inorder[i], i); + } + TreeNode? root = DFS(preorder, inorderMap, 0, 0, inorder.Length - 1); + return root; + } + + [Test] + public void Test() { + int[] preorder = [3, 9, 2, 1, 7]; + int[] inorder = [9, 3, 1, 2, 7]; + Console.WriteLine("Предварительный обход = " + string.Join(", ", preorder)); + Console.WriteLine("Симметричный обход = " + string.Join(", ", inorder)); + + TreeNode? root = BuildTree(preorder, inorder); + Console.WriteLine("Построенное двоичное дерево:"); + PrintUtil.PrintTree(root); + } +} diff --git a/ru/codes/csharp/chapter_divide_and_conquer/hanota.cs b/ru/codes/csharp/chapter_divide_and_conquer/hanota.cs new file mode 100644 index 000000000..dab44215e --- /dev/null +++ b/ru/codes/csharp/chapter_divide_and_conquer/hanota.cs @@ -0,0 +1,59 @@ +/** +* File: hanota.cs +* Created Time: 2023-07-18 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_divide_and_conquer; + +public class hanota { + /* Переместить один диск */ + void Move(List src, List tar) { + // Снять диск с вершины src + int pan = src[^1]; + src.RemoveAt(src.Count - 1); + // Положить диск на вершину tar + tar.Add(pan); + } + + /* Решить задачу Ханойской башни f(i) */ + void DFS(int i, List src, List buf, List tar) { + // Если в src остался только один диск, сразу переместить его в tar + if (i == 1) { + Move(src, tar); + return; + } + // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar + DFS(i - 1, src, tar, buf); + // Подзадача f(1): переместить оставшийся один диск из src в tar + Move(src, tar); + // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src + DFS(i - 1, buf, src, tar); + } + + /* Решить задачу Ханойской башни */ + void SolveHanota(List A, List B, List C) { + int n = A.Count; + // Переместить верхние n дисков из A в C с помощью B + DFS(n, A, B, C); + } + + [Test] + public void Test() { + // Хвост списка соответствует вершине столбца + List A = [5, 4, 3, 2, 1]; + List B = []; + List C = []; + Console.WriteLine("Исходное состояние:"); + Console.WriteLine("A = " + string.Join(", ", A)); + Console.WriteLine("B = " + string.Join(", ", B)); + Console.WriteLine("C = " + string.Join(", ", C)); + + SolveHanota(A, B, C); + + Console.WriteLine("После завершения перемещения дисков:"); + Console.WriteLine("A = " + string.Join(", ", A)); + Console.WriteLine("B = " + string.Join(", ", B)); + Console.WriteLine("C = " + string.Join(", ", C)); + } +} diff --git a/ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_backtrack.cs b/ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_backtrack.cs new file mode 100644 index 000000000..d8f418c4c --- /dev/null +++ b/ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_backtrack.cs @@ -0,0 +1,41 @@ +/** +* File: climbing_stairs_backtrack.cs +* Created Time: 2023-06-30 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_dynamic_programming; + +public class climbing_stairs_backtrack { + /* Бэктрекинг */ + void Backtrack(List choices, int state, int n, List res) { + // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1 + if (state == n) + res[0]++; + // Перебор всех вариантов выбора + foreach (int choice in choices) { + // Отсечение: нельзя выходить за n-ю ступень + if (state + choice > n) + continue; + // Попытка: сделать выбор и обновить состояние + Backtrack(choices, state + choice, n, res); + // Откат + } + } + + /* Подъем по лестнице: бэктрекинг */ + int ClimbingStairsBacktrack(int n) { + List choices = [1, 2]; // Можно подняться на 1 или 2 ступени + int state = 0; // Начать подъем с 0-й ступени + List res = [0]; // Использовать res[0] для хранения числа решений + Backtrack(choices, state, n, res); + return res[0]; + } + + [Test] + public void Test() { + int n = 9; + int res = ClimbingStairsBacktrack(n); + Console.WriteLine($"Количество способов подняться по лестнице из {n} ступеней = {res}"); + } +} diff --git a/ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_constraint_dp.cs b/ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_constraint_dp.cs new file mode 100644 index 000000000..6331ffcb8 --- /dev/null +++ b/ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_constraint_dp.cs @@ -0,0 +1,36 @@ +/** +* File: climbing_stairs_constraint_dp.cs +* Created Time: 2023-07-03 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_dynamic_programming; + +public class climbing_stairs_constraint_dp { + /* Подъем по лестнице с ограничениями: динамическое программирование */ + int ClimbingStairsConstraintDP(int n) { + if (n == 1 || n == 2) { + return 1; + } + // Инициализация таблицы dp для хранения решений подзадач + int[,] dp = new int[n + 1, 3]; + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1, 1] = 1; + dp[1, 2] = 0; + dp[2, 1] = 0; + dp[2, 2] = 1; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (int i = 3; i <= n; i++) { + dp[i, 1] = dp[i - 1, 2]; + dp[i, 2] = dp[i - 2, 1] + dp[i - 2, 2]; + } + return dp[n, 1] + dp[n, 2]; + } + + [Test] + public void Test() { + int n = 9; + int res = ClimbingStairsConstraintDP(n); + Console.WriteLine($"Количество способов подняться по лестнице из {n} ступеней = {res}"); + } +} diff --git a/ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_dfs.cs b/ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_dfs.cs new file mode 100644 index 000000000..de677fcf1 --- /dev/null +++ b/ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_dfs.cs @@ -0,0 +1,31 @@ +/** +* File: climbing_stairs_dfs.cs +* Created Time: 2023-06-30 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_dynamic_programming; + +public class climbing_stairs_dfs { + /* Поиск */ + int DFS(int i) { + // dp[1] и dp[2] уже известны, вернуть их + if (i == 1 || i == 2) + return i; + // dp[i] = dp[i-1] + dp[i-2] + int count = DFS(i - 1) + DFS(i - 2); + return count; + } + + /* Подъем по лестнице: поиск */ + int ClimbingStairsDFS(int n) { + return DFS(n); + } + + [Test] + public void Test() { + int n = 9; + int res = ClimbingStairsDFS(n); + Console.WriteLine($"Количество способов подняться по лестнице из {n} ступеней = {res}"); + } +} diff --git a/ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_dfs_mem.cs b/ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_dfs_mem.cs new file mode 100644 index 000000000..94628f521 --- /dev/null +++ b/ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_dfs_mem.cs @@ -0,0 +1,39 @@ +/** +* File: climbing_stairs_dfs_mem.cs +* Created Time: 2023-06-30 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_dynamic_programming; + +public class climbing_stairs_dfs_mem { + /* Поиск с мемоизацией */ + int DFS(int i, int[] mem) { + // dp[1] и dp[2] уже известны, вернуть их + if (i == 1 || i == 2) + return i; + // Если запись dp[i] существует, сразу вернуть ее + if (mem[i] != -1) + return mem[i]; + // dp[i] = dp[i-1] + dp[i-2] + int count = DFS(i - 1, mem) + DFS(i - 2, mem); + // Сохранить dp[i] + mem[i] = count; + return count; + } + + /* Подъем по лестнице: поиск с мемоизацией */ + int ClimbingStairsDFSMem(int n) { + // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи + int[] mem = new int[n + 1]; + Array.Fill(mem, -1); + return DFS(n, mem); + } + + [Test] + public void Test() { + int n = 9; + int res = ClimbingStairsDFSMem(n); + Console.WriteLine($"Количество способов подняться по лестнице из {n} ступеней = {res}"); + } +} diff --git a/ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_dp.cs b/ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_dp.cs new file mode 100644 index 000000000..53c8e171d --- /dev/null +++ b/ru/codes/csharp/chapter_dynamic_programming/climbing_stairs_dp.cs @@ -0,0 +1,49 @@ +/** +* File: climbing_stairs_dp.cs +* Created Time: 2023-06-30 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_dynamic_programming; + +public class climbing_stairs_dp { + /* Подъем по лестнице: динамическое программирование */ + int ClimbingStairsDP(int n) { + if (n == 1 || n == 2) + return n; + // Инициализация таблицы dp для хранения решений подзадач + int[] dp = new int[n + 1]; + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = 1; + dp[2] = 2; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (int i = 3; i <= n; i++) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + return dp[n]; + } + + /* Подъем по лестнице: динамическое программирование с оптимизацией памяти */ + int ClimbingStairsDPComp(int n) { + if (n == 1 || n == 2) + return n; + int a = 1, b = 2; + for (int i = 3; i <= n; i++) { + int tmp = b; + b = a + b; + a = tmp; + } + return b; + } + + [Test] + public void Test() { + int n = 9; + + int res = ClimbingStairsDP(n); + Console.WriteLine($"Количество способов подняться по лестнице из {n} ступеней = {res}"); + + res = ClimbingStairsDPComp(n); + Console.WriteLine($"Количество способов подняться по лестнице из {n} ступеней = {res}"); + } +} diff --git a/ru/codes/csharp/chapter_dynamic_programming/coin_change.cs b/ru/codes/csharp/chapter_dynamic_programming/coin_change.cs new file mode 100644 index 000000000..bb73e89c8 --- /dev/null +++ b/ru/codes/csharp/chapter_dynamic_programming/coin_change.cs @@ -0,0 +1,71 @@ +/** +* File: coin_change.cs +* Created Time: 2023-07-12 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_dynamic_programming; + +public class coin_change { + /* Размен монет: динамическое программирование */ + int CoinChangeDP(int[] coins, int amt) { + int n = coins.Length; + int MAX = amt + 1; + // Инициализация таблицы dp + int[,] dp = new int[n + 1, amt + 1]; + // Переход состояний: первая строка и первый столбец + for (int a = 1; a <= amt; a++) { + dp[0, a] = MAX; + } + // Переход состояний: остальные строки и столбцы + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[i, a] = dp[i - 1, a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[i, a] = Math.Min(dp[i - 1, a], dp[i, a - coins[i - 1]] + 1); + } + } + } + return dp[n, amt] != MAX ? dp[n, amt] : -1; + } + + /* Размен монет: динамическое программирование с оптимизацией памяти */ + int CoinChangeDPComp(int[] coins, int amt) { + int n = coins.Length; + int MAX = amt + 1; + // Инициализация таблицы dp + int[] dp = new int[amt + 1]; + Array.Fill(dp, MAX); + dp[0] = 0; + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[a] = Math.Min(dp[a], dp[a - coins[i - 1]] + 1); + } + } + } + return dp[amt] != MAX ? dp[amt] : -1; + } + + [Test] + public void Test() { + int[] coins = [1, 2, 5]; + int amt = 4; + + // Динамическое программирование + int res = CoinChangeDP(coins, amt); + Console.WriteLine("Минимальное число монет для набора целевой суммы = " + res); + + // Динамическое программирование с оптимизацией памяти + res = CoinChangeDPComp(coins, amt); + Console.WriteLine("Минимальное число монет для набора целевой суммы = " + res); + } +} diff --git a/ru/codes/csharp/chapter_dynamic_programming/coin_change_ii.cs b/ru/codes/csharp/chapter_dynamic_programming/coin_change_ii.cs new file mode 100644 index 000000000..01fa17e3c --- /dev/null +++ b/ru/codes/csharp/chapter_dynamic_programming/coin_change_ii.cs @@ -0,0 +1,68 @@ +/** +* File: coin_change_ii.cs +* Created Time: 2023-07-12 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_dynamic_programming; + +public class coin_change_ii { + /* Размен монет II: динамическое программирование */ + int CoinChangeIIDP(int[] coins, int amt) { + int n = coins.Length; + // Инициализация таблицы dp + int[,] dp = new int[n + 1, amt + 1]; + // Инициализация первого столбца + for (int i = 0; i <= n; i++) { + dp[i, 0] = 1; + } + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[i, a] = dp[i - 1, a]; + } else { + // Сумма двух решений: не брать или взять монету i + dp[i, a] = dp[i - 1, a] + dp[i, a - coins[i - 1]]; + } + } + } + return dp[n, amt]; + } + + /* Размен монет II: динамическое программирование с оптимизацией памяти */ + int CoinChangeIIDPComp(int[] coins, int amt) { + int n = coins.Length; + // Инициализация таблицы dp + int[] dp = new int[amt + 1]; + dp[0] = 1; + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Сумма двух решений: не брать или взять монету i + dp[a] = dp[a] + dp[a - coins[i - 1]]; + } + } + } + return dp[amt]; + } + + [Test] + public void Test() { + int[] coins = [1, 2, 5]; + int amt = 5; + + // Динамическое программирование + int res = CoinChangeIIDP(coins, amt); + Console.WriteLine("Количество комбинаций монет для набора целевой суммы = " + res); + + // Динамическое программирование с оптимизацией памяти + res = CoinChangeIIDPComp(coins, amt); + Console.WriteLine("Количество комбинаций монет для набора целевой суммы = " + res); + } +} diff --git a/ru/codes/csharp/chapter_dynamic_programming/edit_distance.cs b/ru/codes/csharp/chapter_dynamic_programming/edit_distance.cs new file mode 100644 index 000000000..afc1848bb --- /dev/null +++ b/ru/codes/csharp/chapter_dynamic_programming/edit_distance.cs @@ -0,0 +1,141 @@ +/** +* File: edit_distance.cs +* Created Time: 2023-07-14 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_dynamic_programming; + +public class edit_distance { + /* Редакционное расстояние: полный перебор */ + int EditDistanceDFS(string s, string t, int i, int j) { + // Если s и t пусты, вернуть 0 + if (i == 0 && j == 0) + return 0; + // Если s пусто, вернуть длину t + if (i == 0) + return j; + // Если t пусто, вернуть длину s + if (j == 0) + return i; + // Если два символа равны, сразу пропустить их + if (s[i - 1] == t[j - 1]) + return EditDistanceDFS(s, t, i - 1, j - 1); + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + int insert = EditDistanceDFS(s, t, i, j - 1); + int delete = EditDistanceDFS(s, t, i - 1, j); + int replace = EditDistanceDFS(s, t, i - 1, j - 1); + // Вернуть минимальное число шагов редактирования + return Math.Min(Math.Min(insert, delete), replace) + 1; + } + + /* Редакционное расстояние: поиск с мемоизацией */ + int EditDistanceDFSMem(string s, string t, int[][] mem, int i, int j) { + // Если s и t пусты, вернуть 0 + if (i == 0 && j == 0) + return 0; + // Если s пусто, вернуть длину t + if (i == 0) + return j; + // Если t пусто, вернуть длину s + if (j == 0) + return i; + // Если запись уже есть, сразу вернуть ее + if (mem[i][j] != -1) + return mem[i][j]; + // Если два символа равны, сразу пропустить их + if (s[i - 1] == t[j - 1]) + return EditDistanceDFSMem(s, t, mem, i - 1, j - 1); + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + int insert = EditDistanceDFSMem(s, t, mem, i, j - 1); + int delete = EditDistanceDFSMem(s, t, mem, i - 1, j); + int replace = EditDistanceDFSMem(s, t, mem, i - 1, j - 1); + // Сохранить и вернуть минимальное число шагов редактирования + mem[i][j] = Math.Min(Math.Min(insert, delete), replace) + 1; + return mem[i][j]; + } + + /* Редакционное расстояние: динамическое программирование */ + int EditDistanceDP(string s, string t) { + int n = s.Length, m = t.Length; + int[,] dp = new int[n + 1, m + 1]; + // Переход состояний: первая строка и первый столбец + for (int i = 1; i <= n; i++) { + dp[i, 0] = i; + } + for (int j = 1; j <= m; j++) { + dp[0, j] = j; + } + // Переход состояний: остальные строки и столбцы + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= m; j++) { + if (s[i - 1] == t[j - 1]) { + // Если два символа равны, сразу пропустить их + dp[i, j] = dp[i - 1, j - 1]; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[i, j] = Math.Min(Math.Min(dp[i, j - 1], dp[i - 1, j]), dp[i - 1, j - 1]) + 1; + } + } + } + return dp[n, m]; + } + + /* Редакционное расстояние: динамическое программирование с оптимизацией памяти */ + int EditDistanceDPComp(string s, string t) { + int n = s.Length, m = t.Length; + int[] dp = new int[m + 1]; + // Переход состояний: первая строка + for (int j = 1; j <= m; j++) { + dp[j] = j; + } + // Переход состояний: остальные строки + for (int i = 1; i <= n; i++) { + // Переход состояний: первый столбец + int leftup = dp[0]; // Временно сохранить dp[i-1, j-1] + dp[0] = i; + // Переход состояний: остальные столбцы + for (int j = 1; j <= m; j++) { + int temp = dp[j]; + if (s[i - 1] == t[j - 1]) { + // Если два символа равны, сразу пропустить их + dp[j] = leftup; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[j] = Math.Min(Math.Min(dp[j - 1], dp[j]), leftup) + 1; + } + leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации + } + } + return dp[m]; + } + + [Test] + public void Test() { + string s = "bag"; + string t = "pack"; + int n = s.Length, m = t.Length; + + // Полный перебор + int res = EditDistanceDFS(s, t, n, m); + Console.WriteLine("Чтобы преобразовать " + s + " в " + t + ", нужно минимум " + res + " шагов редактирования"); + + // Поиск с мемоизацией + int[][] mem = new int[n + 1][]; + for (int i = 0; i <= n; i++) { + mem[i] = new int[m + 1]; + Array.Fill(mem[i], -1); + } + + res = EditDistanceDFSMem(s, t, mem, n, m); + Console.WriteLine("Чтобы преобразовать " + s + " в " + t + ", нужно минимум " + res + " шагов редактирования"); + + // Динамическое программирование + res = EditDistanceDP(s, t); + Console.WriteLine("Чтобы преобразовать " + s + " в " + t + ", нужно минимум " + res + " шагов редактирования"); + + // Динамическое программирование с оптимизацией памяти + res = EditDistanceDPComp(s, t); + Console.WriteLine("Чтобы преобразовать " + s + " в " + t + ", нужно минимум " + res + " шагов редактирования"); + } +} diff --git a/ru/codes/csharp/chapter_dynamic_programming/knapsack.cs b/ru/codes/csharp/chapter_dynamic_programming/knapsack.cs new file mode 100644 index 000000000..c04e15bc6 --- /dev/null +++ b/ru/codes/csharp/chapter_dynamic_programming/knapsack.cs @@ -0,0 +1,118 @@ +/** +* File: knapsack.cs +* Created Time: 2023-07-07 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_dynamic_programming; + +public class knapsack { + /* Рюкзак 0-1: полный перебор */ + int KnapsackDFS(int[] weight, int[] val, int i, int c) { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i == 0 || c == 0) { + return 0; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (weight[i - 1] > c) { + return KnapsackDFS(weight, val, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + int no = KnapsackDFS(weight, val, i - 1, c); + int yes = KnapsackDFS(weight, val, i - 1, c - weight[i - 1]) + val[i - 1]; + // Вернуть вариант с большей стоимостью из двух возможных + return Math.Max(no, yes); + } + + /* Рюкзак 0-1: поиск с мемоизацией */ + int KnapsackDFSMem(int[] weight, int[] val, int[][] mem, int i, int c) { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i == 0 || c == 0) { + return 0; + } + // Если запись уже есть, вернуть сразу + if (mem[i][c] != -1) { + return mem[i][c]; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (weight[i - 1] > c) { + return KnapsackDFSMem(weight, val, mem, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + int no = KnapsackDFSMem(weight, val, mem, i - 1, c); + int yes = KnapsackDFSMem(weight, val, mem, i - 1, c - weight[i - 1]) + val[i - 1]; + // Сохранить и вернуть вариант с большей стоимостью из двух решений + mem[i][c] = Math.Max(no, yes); + return mem[i][c]; + } + + /* Рюкзак 0-1: динамическое программирование */ + int KnapsackDP(int[] weight, int[] val, int cap) { + int n = weight.Length; + // Инициализация таблицы dp + int[,] dp = new int[n + 1, cap + 1]; + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int c = 1; c <= cap; c++) { + if (weight[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i, c] = dp[i - 1, c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i, c] = Math.Max(dp[i - 1, c - weight[i - 1]] + val[i - 1], dp[i - 1, c]); + } + } + } + return dp[n, cap]; + } + + /* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */ + int KnapsackDPComp(int[] weight, int[] val, int cap) { + int n = weight.Length; + // Инициализация таблицы dp + int[] dp = new int[cap + 1]; + // Переход состояний + for (int i = 1; i <= n; i++) { + // Обход в обратном порядке + for (int c = cap; c > 0; c--) { + if (weight[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[c] = Math.Max(dp[c], dp[c - weight[i - 1]] + val[i - 1]); + } + } + } + return dp[cap]; + } + + [Test] + public void Test() { + int[] weight = [10, 20, 30, 40, 50]; + int[] val = [50, 120, 150, 210, 240]; + int cap = 50; + int n = weight.Length; + + // Полный перебор + int res = KnapsackDFS(weight, val, n, cap); + Console.WriteLine("Максимальная стоимость предметов без превышения вместимости рюкзака = " + res); + + // Поиск с мемоизацией + int[][] mem = new int[n + 1][]; + for (int i = 0; i <= n; i++) { + mem[i] = new int[cap + 1]; + Array.Fill(mem[i], -1); + } + res = KnapsackDFSMem(weight, val, mem, n, cap); + Console.WriteLine("Максимальная стоимость предметов без превышения вместимости рюкзака = " + res); + + // Динамическое программирование + res = KnapsackDP(weight, val, cap); + Console.WriteLine("Максимальная стоимость предметов без превышения вместимости рюкзака = " + res); + + // Динамическое программирование с оптимизацией памяти + res = KnapsackDPComp(weight, val, cap); + Console.WriteLine("Максимальная стоимость предметов без превышения вместимости рюкзака = " + res); + } +} diff --git a/ru/codes/csharp/chapter_dynamic_programming/min_cost_climbing_stairs_dp.cs b/ru/codes/csharp/chapter_dynamic_programming/min_cost_climbing_stairs_dp.cs new file mode 100644 index 000000000..0ff229d93 --- /dev/null +++ b/ru/codes/csharp/chapter_dynamic_programming/min_cost_climbing_stairs_dp.cs @@ -0,0 +1,53 @@ +/** +* File: min_cost_climbing_stairs_dp.cs +* Created Time: 2023-06-30 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_dynamic_programming; + +public class min_cost_climbing_stairs_dp { + /* Минимальная стоимость подъема по лестнице: динамическое программирование */ + int MinCostClimbingStairsDP(int[] cost) { + int n = cost.Length - 1; + if (n == 1 || n == 2) + return cost[n]; + // Инициализация таблицы dp для хранения решений подзадач + int[] dp = new int[n + 1]; + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = cost[1]; + dp[2] = cost[2]; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (int i = 3; i <= n; i++) { + dp[i] = Math.Min(dp[i - 1], dp[i - 2]) + cost[i]; + } + return dp[n]; + } + + /* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */ + int MinCostClimbingStairsDPComp(int[] cost) { + int n = cost.Length - 1; + if (n == 1 || n == 2) + return cost[n]; + int a = cost[1], b = cost[2]; + for (int i = 3; i <= n; i++) { + int tmp = b; + b = Math.Min(a, tmp) + cost[i]; + a = tmp; + } + return b; + } + + [Test] + public void Test() { + int[] cost = [0, 1, 10, 1, 1, 1, 10, 1, 1, 10, 1]; + Console.WriteLine("Список стоимостей ступеней:"); + PrintUtil.PrintList(cost); + + int res = MinCostClimbingStairsDP(cost); + Console.WriteLine($"Минимальная стоимость подъема по лестнице = {res}"); + + res = MinCostClimbingStairsDPComp(cost); + Console.WriteLine($"Минимальная стоимость подъема по лестнице = {res}"); + } +} diff --git a/ru/codes/csharp/chapter_dynamic_programming/min_path_sum.cs b/ru/codes/csharp/chapter_dynamic_programming/min_path_sum.cs new file mode 100644 index 000000000..7ffe88a64 --- /dev/null +++ b/ru/codes/csharp/chapter_dynamic_programming/min_path_sum.cs @@ -0,0 +1,127 @@ +/** +* File: min_path_sum.cs +* Created Time: 2023-07-10 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_dynamic_programming; + +public class min_path_sum { + /* Минимальная сумма пути: полный перебор */ + int MinPathSumDFS(int[][] grid, int i, int j) { + // Если это верхняя левая ячейка, завершить поиск + if (i == 0 && j == 0) { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 || j < 0) { + return int.MaxValue; + } + // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1) + int up = MinPathSumDFS(grid, i - 1, j); + int left = MinPathSumDFS(grid, i, j - 1); + // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + return Math.Min(left, up) + grid[i][j]; + } + + /* Минимальная сумма пути: поиск с мемоизацией */ + int MinPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) { + // Если это верхняя левая ячейка, завершить поиск + if (i == 0 && j == 0) { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 || j < 0) { + return int.MaxValue; + } + // Если запись уже есть, вернуть сразу + if (mem[i][j] != -1) { + return mem[i][j]; + } + // Минимальная стоимость пути для левой и верхней ячеек + int up = MinPathSumDFSMem(grid, mem, i - 1, j); + int left = MinPathSumDFSMem(grid, mem, i, j - 1); + // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + mem[i][j] = Math.Min(left, up) + grid[i][j]; + return mem[i][j]; + } + + /* Минимальная сумма пути: динамическое программирование */ + int MinPathSumDP(int[][] grid) { + int n = grid.Length, m = grid[0].Length; + // Инициализация таблицы dp + int[,] dp = new int[n, m]; + dp[0, 0] = grid[0][0]; + // Переход состояний: первая строка + for (int j = 1; j < m; j++) { + dp[0, j] = dp[0, j - 1] + grid[0][j]; + } + // Переход состояний: первый столбец + for (int i = 1; i < n; i++) { + dp[i, 0] = dp[i - 1, 0] + grid[i][0]; + } + // Переход состояний: остальные строки и столбцы + for (int i = 1; i < n; i++) { + for (int j = 1; j < m; j++) { + dp[i, j] = Math.Min(dp[i, j - 1], dp[i - 1, j]) + grid[i][j]; + } + } + return dp[n - 1, m - 1]; + } + + /* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */ + int MinPathSumDPComp(int[][] grid) { + int n = grid.Length, m = grid[0].Length; + // Инициализация таблицы dp + int[] dp = new int[m]; + dp[0] = grid[0][0]; + // Переход состояний: первая строка + for (int j = 1; j < m; j++) { + dp[j] = dp[j - 1] + grid[0][j]; + } + // Переход состояний: остальные строки + for (int i = 1; i < n; i++) { + // Переход состояний: первый столбец + dp[0] = dp[0] + grid[i][0]; + // Переход состояний: остальные столбцы + for (int j = 1; j < m; j++) { + dp[j] = Math.Min(dp[j - 1], dp[j]) + grid[i][j]; + } + } + return dp[m - 1]; + } + + [Test] + public void Test() { + int[][] grid = + [ + [1, 3, 1, 5], + [2, 2, 4, 2], + [5, 3, 2, 1], + [4, 3, 5, 2] + ]; + + int n = grid.Length, m = grid[0].Length; + + // Полный перебор + int res = MinPathSumDFS(grid, n - 1, m - 1); + Console.WriteLine("Минимальная сумма пути из левого верхнего угла в правый нижний = " + res); + + // Поиск с мемоизацией + int[][] mem = new int[n][]; + for (int i = 0; i < n; i++) { + mem[i] = new int[m]; + Array.Fill(mem[i], -1); + } + res = MinPathSumDFSMem(grid, mem, n - 1, m - 1); + Console.WriteLine("Минимальная сумма пути из левого верхнего угла в правый нижний = " + res); + + // Динамическое программирование + res = MinPathSumDP(grid); + Console.WriteLine("Минимальная сумма пути из левого верхнего угла в правый нижний = " + res); + + // Динамическое программирование с оптимизацией памяти + res = MinPathSumDPComp(grid); + Console.WriteLine("Минимальная сумма пути из левого верхнего угла в правый нижний = " + res); + } +} diff --git a/ru/codes/csharp/chapter_dynamic_programming/unbounded_knapsack.cs b/ru/codes/csharp/chapter_dynamic_programming/unbounded_knapsack.cs new file mode 100644 index 000000000..be198e848 --- /dev/null +++ b/ru/codes/csharp/chapter_dynamic_programming/unbounded_knapsack.cs @@ -0,0 +1,64 @@ +/** +* File: unbounded_knapsack.cs +* Created Time: 2023-07-12 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_dynamic_programming; + +public class unbounded_knapsack { + /* Полный рюкзак: динамическое программирование */ + int UnboundedKnapsackDP(int[] wgt, int[] val, int cap) { + int n = wgt.Length; + // Инициализация таблицы dp + int[,] dp = new int[n + 1, cap + 1]; + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i, c] = dp[i - 1, c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i, c] = Math.Max(dp[i - 1, c], dp[i, c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[n, cap]; + } + + /* Полный рюкзак: динамическое программирование с оптимизацией памяти */ + int UnboundedKnapsackDPComp(int[] wgt, int[] val, int cap) { + int n = wgt.Length; + // Инициализация таблицы dp + int[] dp = new int[cap + 1]; + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[c] = Math.Max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[cap]; + } + + [Test] + public void Test() { + int[] wgt = [1, 2, 3]; + int[] val = [5, 11, 15]; + int cap = 4; + + // Динамическое программирование + int res = UnboundedKnapsackDP(wgt, val, cap); + Console.WriteLine("Максимальная стоимость предметов без превышения вместимости рюкзака = " + res); + + // Динамическое программирование с оптимизацией памяти + res = UnboundedKnapsackDPComp(wgt, val, cap); + Console.WriteLine("Максимальная стоимость предметов без превышения вместимости рюкзака = " + res); + } +} diff --git a/ru/codes/csharp/chapter_graph/graph_adjacency_list.cs b/ru/codes/csharp/chapter_graph/graph_adjacency_list.cs new file mode 100644 index 000000000..c0ad57623 --- /dev/null +++ b/ru/codes/csharp/chapter_graph/graph_adjacency_list.cs @@ -0,0 +1,122 @@ +/** + * File: graph_adjacency_list.cs + * Created Time: 2023-02-06 + * Author: zjkung1123 (zjkung1123@gmail.com) + */ + +namespace hello_algo.chapter_graph; + +/* Класс неориентированного графа на основе списка смежности */ +public class GraphAdjList { + // Список смежности, где key — вершина, а value — все смежные ей вершины + public Dictionary> adjList; + + /* Конструктор */ + public GraphAdjList(Vertex[][] edges) { + adjList = []; + // Добавить все вершины и ребра + foreach (Vertex[] edge in edges) { + AddVertex(edge[0]); + AddVertex(edge[1]); + AddEdge(edge[0], edge[1]); + } + } + + /* Получить число вершин */ + int Size() { + return adjList.Count; + } + + /* Добавление ребра */ + public void AddEdge(Vertex vet1, Vertex vet2) { + if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2) + throw new InvalidOperationException(); + // Добавить ребро vet1 - vet2 + adjList[vet1].Add(vet2); + adjList[vet2].Add(vet1); + } + + /* Удаление ребра */ + public void RemoveEdge(Vertex vet1, Vertex vet2) { + if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2) + throw new InvalidOperationException(); + // Удалить ребро vet1 - vet2 + adjList[vet1].Remove(vet2); + adjList[vet2].Remove(vet1); + } + + /* Добавление вершины */ + public void AddVertex(Vertex vet) { + if (adjList.ContainsKey(vet)) + return; + // Добавить новый список в список смежности + adjList.Add(vet, []); + } + + /* Удаление вершины */ + public void RemoveVertex(Vertex vet) { + if (!adjList.ContainsKey(vet)) + throw new InvalidOperationException(); + // Удалить из списка смежности список, соответствующий вершине vet + adjList.Remove(vet); + // Обойти списки других вершин и удалить все ребра, содержащие vet + foreach (List list in adjList.Values) { + list.Remove(vet); + } + } + + /* Вывести список смежности */ + public void Print() { + Console.WriteLine("Список смежности ="); + foreach (KeyValuePair> pair in adjList) { + List tmp = []; + foreach (Vertex vertex in pair.Value) + tmp.Add(vertex.val); + Console.WriteLine(pair.Key.val + ": [" + string.Join(", ", tmp) + "],"); + } + } +} + +public class graph_adjacency_list { + [Test] + public void Test() { + /* Инициализация неориентированного графа */ + Vertex[] v = Vertex.ValsToVets([1, 3, 2, 5, 4]); + Vertex[][] 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]] + ]; + GraphAdjList graph = new(edges); + Console.WriteLine("\nГраф после инициализации"); + graph.Print(); + + /* Добавление ребра */ + // Вершины 1 и 2 соответствуют v[0] и v[2] + graph.AddEdge(v[0], v[2]); + Console.WriteLine("\nГраф после добавления ребра 1-2"); + graph.Print(); + + /* Удаление ребра */ + // Вершины 1 и 3 соответствуют v[0] и v[1] + graph.RemoveEdge(v[0], v[1]); + Console.WriteLine("\nГраф после удаления ребра 1-3"); + graph.Print(); + + /* Добавление вершины */ + Vertex v5 = new(6); + graph.AddVertex(v5); + Console.WriteLine("\nГраф после добавления вершины 6"); + graph.Print(); + + /* Удаление вершины */ + // Вершина 3 соответствует v[1] + graph.RemoveVertex(v[1]); + Console.WriteLine("\nГраф после удаления вершины 3"); + graph.Print(); + } +} diff --git a/ru/codes/csharp/chapter_graph/graph_adjacency_matrix.cs b/ru/codes/csharp/chapter_graph/graph_adjacency_matrix.cs new file mode 100644 index 000000000..0d11468b8 --- /dev/null +++ b/ru/codes/csharp/chapter_graph/graph_adjacency_matrix.cs @@ -0,0 +1,137 @@ +/** + * File: graph_adjacency_matrix.cs + * Created Time: 2023-02-06 + * Author: zjkung1123 (zjkung1123@gmail.com) + */ + +namespace hello_algo.chapter_graph; + +/* Класс неориентированного графа на основе матрицы смежности */ +class GraphAdjMat { + List vertices; // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин» + List> adjMat; // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин» + + /* Конструктор */ + public GraphAdjMat(int[] vertices, int[][] edges) { + this.vertices = []; + this.adjMat = []; + // Добавление вершины + foreach (int val in vertices) { + AddVertex(val); + } + // Добавить ребра + // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices + foreach (int[] e in edges) { + AddEdge(e[0], e[1]); + } + } + + /* Получить число вершин */ + int Size() { + return vertices.Count; + } + + /* Добавление вершины */ + public void AddVertex(int val) { + int n = Size(); + // Добавить значение новой вершины в список вершин + vertices.Add(val); + // Добавить строку в матрицу смежности + List newRow = new(n); + for (int j = 0; j < n; j++) { + newRow.Add(0); + } + adjMat.Add(newRow); + // Добавить столбец в матрицу смежности + foreach (List row in adjMat) { + row.Add(0); + } + } + + /* Удаление вершины */ + public void RemoveVertex(int index) { + if (index >= Size()) + throw new IndexOutOfRangeException(); + // Удалить вершину с индексом index из списка вершин + vertices.RemoveAt(index); + // Удалить строку с индексом index из матрицы смежности + adjMat.RemoveAt(index); + // Удалить столбец с индексом index из матрицы смежности + foreach (List row in adjMat) { + row.RemoveAt(index); + } + } + + /* Добавление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + public void AddEdge(int i, int j) { + // Обработка выхода индекса за границы и случая равенства + if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j) + throw new IndexOutOfRangeException(); + // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i) + adjMat[i][j] = 1; + adjMat[j][i] = 1; + } + + /* Удаление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + public void RemoveEdge(int i, int j) { + // Обработка выхода индекса за границы и случая равенства + if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j) + throw new IndexOutOfRangeException(); + adjMat[i][j] = 0; + adjMat[j][i] = 0; + } + + /* Вывести матрицу смежности */ + public void Print() { + Console.Write("Список вершин = "); + PrintUtil.PrintList(vertices); + Console.WriteLine("Матрица смежности ="); + PrintUtil.PrintMatrix(adjMat); + } +} + +public class graph_adjacency_matrix { + [Test] + public void Test() { + /* Инициализация неориентированного графа */ + // Обратите внимание: элементы edges представляют индексы вершин, то есть соответствуют индексам элементов vertices + int[] vertices = [1, 3, 2, 5, 4]; + int[][] edges = + [ + [0, 1], + [0, 3], + [1, 2], + [2, 3], + [2, 4], + [3, 4] + ]; + GraphAdjMat graph = new(vertices, edges); + Console.WriteLine("\nГраф после инициализации"); + graph.Print(); + + /* Добавление ребра */ + // Индексы вершин 1 и 2 равны 0 и 2 соответственно + graph.AddEdge(0, 2); + Console.WriteLine("\nГраф после добавления ребра 1-2"); + graph.Print(); + + /* Удаление ребра */ + // Индексы вершин 1 и 3 равны 0 и 1 соответственно + graph.RemoveEdge(0, 1); + Console.WriteLine("\nГраф после удаления ребра 1-3"); + graph.Print(); + + /* Добавление вершины */ + graph.AddVertex(6); + Console.WriteLine("\nГраф после добавления вершины 6"); + graph.Print(); + + /* Удаление вершины */ + // Индекс вершины 3 равен 1 + graph.RemoveVertex(1); + Console.WriteLine("\nГраф после удаления вершины 3"); + graph.Print(); + } +} diff --git a/ru/codes/csharp/chapter_graph/graph_bfs.cs b/ru/codes/csharp/chapter_graph/graph_bfs.cs new file mode 100644 index 000000000..79e6da4b2 --- /dev/null +++ b/ru/codes/csharp/chapter_graph/graph_bfs.cs @@ -0,0 +1,58 @@ +/** + * File: graph_bfs.cs + * Created Time: 2023-03-08 + * Author: hpstory (hpstory1024@163.com) + */ + +namespace hello_algo.chapter_graph; + +public class graph_bfs { + /* Обход в ширину */ + // Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины + List GraphBFS(GraphAdjList graph, Vertex startVet) { + // Последовательность обхода вершин + List res = []; + // Хеш-множество для хранения уже посещенных вершин + HashSet visited = [startVet]; + // Очередь используется для реализации BFS + Queue que = new(); + que.Enqueue(startVet); + // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины + while (que.Count > 0) { + Vertex vet = que.Dequeue(); // Извлечь головную вершину из очереди + res.Add(vet); // Отметить посещенную вершину + foreach (Vertex adjVet in graph.adjList[vet]) { + if (visited.Contains(adjVet)) { + continue; // Пропустить уже посещенную вершину + } + que.Enqueue(adjVet); // Помещать в очередь только непосещенные вершины + visited.Add(adjVet); // Отметить эту вершину как посещенную + } + } + + // Вернуть последовательность обхода вершин + return res; + } + + [Test] + public void Test() { + /* Инициализация неориентированного графа */ + Vertex[] v = Vertex.ValsToVets([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + Vertex[][] 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]] + ]; + + GraphAdjList graph = new(edges); + Console.WriteLine("\nГраф после инициализации"); + graph.Print(); + + /* Обход в ширину */ + List res = GraphBFS(graph, v[0]); + Console.WriteLine("\nПоследовательность вершин при обходе в ширину (BFS)"); + Console.WriteLine(string.Join(" ", Vertex.VetsToVals(res))); + } +} diff --git a/ru/codes/csharp/chapter_graph/graph_dfs.cs b/ru/codes/csharp/chapter_graph/graph_dfs.cs new file mode 100644 index 000000000..03a527f29 --- /dev/null +++ b/ru/codes/csharp/chapter_graph/graph_dfs.cs @@ -0,0 +1,54 @@ +/** + * File: graph_dfs.cs + * Created Time: 2023-03-08 + * Author: hpstory (hpstory1024@163.com) + */ + +namespace hello_algo.chapter_graph; + +public class graph_dfs { + /* Вспомогательная функция обхода в глубину */ + void DFS(GraphAdjList graph, HashSet visited, List res, Vertex vet) { + res.Add(vet); // Отметить посещенную вершину + visited.Add(vet); // Отметить эту вершину как посещенную + // Обойти все смежные вершины данной вершины + foreach (Vertex adjVet in graph.adjList[vet]) { + if (visited.Contains(adjVet)) { + continue; // Пропустить уже посещенную вершину + } + // Рекурсивно обходить смежные вершины + DFS(graph, visited, res, adjVet); + } + } + + /* Обход в глубину */ + // Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины + List GraphDFS(GraphAdjList graph, Vertex startVet) { + // Последовательность обхода вершин + List res = []; + // Хеш-множество для хранения уже посещенных вершин + HashSet visited = []; + DFS(graph, visited, res, startVet); + return res; + } + + [Test] + public void Test() { + /* Инициализация неориентированного графа */ + Vertex[] v = Vertex.ValsToVets([0, 1, 2, 3, 4, 5, 6]); + Vertex[][] 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]], + ]; + + GraphAdjList graph = new(edges); + Console.WriteLine("\nГраф после инициализации"); + graph.Print(); + + /* Обход в глубину */ + List res = GraphDFS(graph, v[0]); + Console.WriteLine("\nПоследовательность вершин при обходе в глубину (DFS)"); + Console.WriteLine(string.Join(" ", Vertex.VetsToVals(res))); + } +} diff --git a/ru/codes/csharp/chapter_greedy/coin_change_greedy.cs b/ru/codes/csharp/chapter_greedy/coin_change_greedy.cs new file mode 100644 index 000000000..e285c2941 --- /dev/null +++ b/ru/codes/csharp/chapter_greedy/coin_change_greedy.cs @@ -0,0 +1,54 @@ +/** +* File: coin_change_greedy.cs +* Created Time: 2023-07-21 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_greedy; + +public class coin_change_greedy { + /* Размен монет: жадный алгоритм */ + int CoinChangeGreedy(int[] coins, int amt) { + // Предположить, что список coins упорядочен + int i = coins.Length - 1; + int count = 0; + // Циклически выполнять жадный выбор, пока не останется суммы + while (amt > 0) { + // Найти монету, которая меньше остатка суммы и наиболее к нему близка + while (i > 0 && coins[i] > amt) { + i--; + } + // Выбрать coins[i] + amt -= coins[i]; + count++; + } + // Если допустимое решение не найдено, вернуть -1 + return amt == 0 ? count : -1; + } + + [Test] + public void Test() { + // Жадный подход: гарантирует нахождение глобально оптимального решения + int[] coins = [1, 5, 10, 20, 50, 100]; + int amt = 186; + int res = CoinChangeGreedy(coins, amt); + Console.WriteLine("\ncoins = " + coins.PrintList() + ", amt = " + amt); + Console.WriteLine("Минимальное число монет для набора суммы " + amt + " = " + res); + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = [1, 20, 50]; + amt = 60; + res = CoinChangeGreedy(coins, amt); + Console.WriteLine("\ncoins = " + coins.PrintList() + ", amt = " + amt); + Console.WriteLine("Минимальное число монет для набора суммы " + amt + " = " + res); + Console.WriteLine("На самом деле минимум равен 3: 20 + 20 + 20"); + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = [1, 49, 50]; + amt = 98; + res = CoinChangeGreedy(coins, amt); + Console.WriteLine("\ncoins = " + coins.PrintList() + ", amt = " + amt); + Console.WriteLine("Минимальное число монет для набора суммы " + amt + " = " + res); + Console.WriteLine("На самом деле минимум равен 2: 49 + 49"); + } +} \ No newline at end of file diff --git a/ru/codes/csharp/chapter_greedy/fractional_knapsack.cs b/ru/codes/csharp/chapter_greedy/fractional_knapsack.cs new file mode 100644 index 000000000..3b2f48bd2 --- /dev/null +++ b/ru/codes/csharp/chapter_greedy/fractional_knapsack.cs @@ -0,0 +1,52 @@ +/** +* File: fractional_knapsack.cs +* Created Time: 2023-07-21 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_greedy; + +/* Предмет */ +class Item(int w, int v) { + public int w = w; // Вес предмета + public int v = v; // Стоимость предмета +} + +public class fractional_knapsack { + /* Дробный рюкзак: жадный алгоритм */ + double FractionalKnapsack(int[] wgt, int[] val, int cap) { + // Создать список предметов с двумя свойствами: вес и стоимость + Item[] items = new Item[wgt.Length]; + for (int i = 0; i < wgt.Length; i++) { + items[i] = new Item(wgt[i], val[i]); + } + // Отсортировать по удельной стоимости item.v / item.w в порядке убывания + Array.Sort(items, (x, y) => (y.v / y.w).CompareTo(x.v / x.w)); + // Циклический жадный выбор + double res = 0; + foreach (Item item in items) { + if (item.w <= cap) { + // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком + res += item.v; + cap -= item.w; + } else { + // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета + res += (double)item.v / item.w * cap; + // Свободной вместимости больше не осталось, поэтому выйти из цикла + break; + } + } + return res; + } + + [Test] + public void Test() { + int[] wgt = [10, 20, 30, 40, 50]; + int[] val = [50, 120, 150, 210, 240]; + int cap = 50; + + // Жадный алгоритм + double res = FractionalKnapsack(wgt, val, cap); + Console.WriteLine("Максимальная стоимость предметов без превышения вместимости рюкзака = " + res); + } +} \ No newline at end of file diff --git a/ru/codes/csharp/chapter_greedy/max_capacity.cs b/ru/codes/csharp/chapter_greedy/max_capacity.cs new file mode 100644 index 000000000..84635f084 --- /dev/null +++ b/ru/codes/csharp/chapter_greedy/max_capacity.cs @@ -0,0 +1,39 @@ +/** +* File: max_capacity.cs +* Created Time: 2023-07-21 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_greedy; + +public class max_capacity { + /* Максимальная вместимость: жадный алгоритм */ + int MaxCapacity(int[] ht) { + // Инициализировать i и j так, чтобы они располагались по двум концам массива + int i = 0, j = ht.Length - 1; + // Начальная максимальная вместимость равна 0 + int res = 0; + // Выполнять жадный выбор в цикле, пока две доски не встретятся + while (i < j) { + // Обновить максимальную вместимость + int cap = Math.Min(ht[i], ht[j]) * (j - i); + res = Math.Max(res, cap); + // Сдвигать внутрь более короткую сторону + if (ht[i] < ht[j]) { + i++; + } else { + j--; + } + } + return res; + } + + [Test] + public void Test() { + int[] ht = [3, 8, 5, 2, 7, 7, 3, 4]; + + // Жадный алгоритм + int res = MaxCapacity(ht); + Console.WriteLine("Максимальная вместимость = " + res); + } +} \ No newline at end of file diff --git a/ru/codes/csharp/chapter_greedy/max_product_cutting.cs b/ru/codes/csharp/chapter_greedy/max_product_cutting.cs new file mode 100644 index 000000000..b5da7a03b --- /dev/null +++ b/ru/codes/csharp/chapter_greedy/max_product_cutting.cs @@ -0,0 +1,39 @@ +/** +* File: max_product_cutting.cs +* Created Time: 2023-07-21 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_greedy; + +public class max_product_cutting { + /* Максимальное произведение разрезания: жадный алгоритм */ + int MaxProductCutting(int n) { + // Когда n <= 3, обязательно нужно выделить одну 1 + if (n <= 3) { + return 1 * (n - 1); + } + // Жадно выделить множители 3, где a — число троек, а b — остаток + int a = n / 3; + int b = n % 3; + if (b == 1) { + // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2 + return (int)Math.Pow(3, a - 1) * 2 * 2; + } + if (b == 2) { + // Если остаток равен 2, ничего не делать + return (int)Math.Pow(3, a) * 2; + } + // Если остаток равен 0, ничего не делать + return (int)Math.Pow(3, a); + } + + [Test] + public void Test() { + int n = 58; + + // Жадный алгоритм + int res = MaxProductCutting(n); + Console.WriteLine("Максимальное произведение после разрезания = " + res); + } +} \ No newline at end of file diff --git a/ru/codes/csharp/chapter_hashing/array_hash_map.cs b/ru/codes/csharp/chapter_hashing/array_hash_map.cs new file mode 100644 index 000000000..b4892f53d --- /dev/null +++ b/ru/codes/csharp/chapter_hashing/array_hash_map.cs @@ -0,0 +1,134 @@ +/** + * File: array_hash_map.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_hashing; + +/* Пара ключ-значение int->string */ +class Pair(int key, string val) { + public int key = key; + public string val = val; +} + +/* Хеш-таблица на основе массива */ +class ArrayHashMap { + List buckets; + public ArrayHashMap() { + // Инициализировать массив, содержащий 100 корзин + buckets = []; + for (int i = 0; i < 100; i++) { + buckets.Add(null); + } + } + + /* Хеш-функция */ + int HashFunc(int key) { + int index = key % 100; + return index; + } + + /* Операция поиска */ + public string? Get(int key) { + int index = HashFunc(key); + Pair? pair = buckets[index]; + if (pair == null) return null; + return pair.val; + } + + /* Операция добавления */ + public void Put(int key, string val) { + Pair pair = new(key, val); + int index = HashFunc(key); + buckets[index] = pair; + } + + /* Операция удаления */ + public void Remove(int key) { + int index = HashFunc(key); + // Присвоить null, что означает удаление + buckets[index] = null; + } + + /* Получить все пары ключ-значение */ + public List PairSet() { + List pairSet = []; + foreach (Pair? pair in buckets) { + if (pair != null) + pairSet.Add(pair); + } + return pairSet; + } + + /* Получить все ключи */ + public List KeySet() { + List keySet = []; + foreach (Pair? pair in buckets) { + if (pair != null) + keySet.Add(pair.key); + } + return keySet; + } + + /* Получить все значения */ + public List ValueSet() { + List valueSet = []; + foreach (Pair? pair in buckets) { + if (pair != null) + valueSet.Add(pair.val); + } + return valueSet; + } + + /* Вывести хеш-таблицу */ + public void Print() { + foreach (Pair kv in PairSet()) { + Console.WriteLine(kv.key + " -> " + kv.val); + } + } +} + + +public class array_hash_map { + [Test] + public void Test() { + /* Инициализация хеш-таблицы */ + ArrayHashMap map = new(); + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.Put(12836, "Сяо Ха"); + map.Put(15937, "Сяо Ло"); + map.Put(16750, "Сяо Суань"); + map.Put(13276, "Сяо Фа"); + map.Put(10583, "Сяо Я"); + Console.WriteLine("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение"); + map.Print(); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + string? name = map.Get(15937); + Console.WriteLine("\nДля номера 15937 найдено имя " + name); + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.Remove(10583); + Console.WriteLine("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение"); + map.Print(); + + /* Обход хеш-таблицы */ + Console.WriteLine("\nОтдельный обход пар ключ-значение"); + foreach (Pair kv in map.PairSet()) { + Console.WriteLine(kv.key + " -> " + kv.val); + } + Console.WriteLine("\nОтдельный обход ключей"); + foreach (int key in map.KeySet()) { + Console.WriteLine(key); + } + Console.WriteLine("\nОтдельный обход значений"); + foreach (string val in map.ValueSet()) { + Console.WriteLine(val); + } + } +} diff --git a/ru/codes/csharp/chapter_hashing/built_in_hash.cs b/ru/codes/csharp/chapter_hashing/built_in_hash.cs new file mode 100644 index 000000000..b3cc581a8 --- /dev/null +++ b/ru/codes/csharp/chapter_hashing/built_in_hash.cs @@ -0,0 +1,36 @@ +/** +* File: built_in_hash.cs +* Created Time: 2023-06-26 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_hashing; + +public class built_in_hash { + [Test] + public void Test() { + int num = 3; + int hashNum = num.GetHashCode(); + Console.WriteLine("Хеш-значение целого числа " + num + " = " + hashNum); + + bool bol = true; + int hashBol = bol.GetHashCode(); + Console.WriteLine("Хеш-значение булева значения " + bol + " = " + hashBol); + + double dec = 3.14159; + int hashDec = dec.GetHashCode(); + Console.WriteLine("Хеш-значение десятичного числа " + dec + " = " + hashDec); + + string str = "Hello Algo"; + int hashStr = str.GetHashCode(); + Console.WriteLine("Хеш-значение строки " + str + " = " + hashStr); + + object[] arr = [12836, "Сяо Ха"]; + int hashTup = arr.GetHashCode(); + Console.WriteLine("Хеш-значение массива [" + string.Join(", ", arr) + "] = " + hashTup); + + ListNode obj = new(0); + int hashObj = obj.GetHashCode(); + Console.WriteLine("Хеш-значение объекта узла " + obj + " = " + hashObj); + } +} diff --git a/ru/codes/csharp/chapter_hashing/hash_map.cs b/ru/codes/csharp/chapter_hashing/hash_map.cs new file mode 100644 index 000000000..4d1770c62 --- /dev/null +++ b/ru/codes/csharp/chapter_hashing/hash_map.cs @@ -0,0 +1,51 @@ + +/** + * File: hash_map.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_hashing; + +public class hash_map { + [Test] + public void Test() { + /* Инициализация хеш-таблицы */ + Dictionary map = new() { + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + { 12836, "Сяо Ха" }, + { 15937, "Сяо Ло" }, + { 16750, "Сяо Суань" }, + { 13276, "Сяо Фа" }, + { 10583, "Сяо Я" } + }; + Console.WriteLine("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение"); + PrintUtil.PrintHashMap(map); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + string name = map[15937]; + Console.WriteLine("\nДля номера 15937 найдено имя " + name); + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.Remove(10583); + Console.WriteLine("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение"); + PrintUtil.PrintHashMap(map); + + /* Обход хеш-таблицы */ + Console.WriteLine("\nОтдельный обход пар ключ-значение"); + foreach (var kv in map) { + Console.WriteLine(kv.Key + " -> " + kv.Value); + } + Console.WriteLine("\nОтдельный обход ключей"); + foreach (int key in map.Keys) { + Console.WriteLine(key); + } + Console.WriteLine("\nОтдельный обход значений"); + foreach (string val in map.Values) { + Console.WriteLine(val); + } + } +} diff --git a/ru/codes/csharp/chapter_hashing/hash_map_chaining.cs b/ru/codes/csharp/chapter_hashing/hash_map_chaining.cs new file mode 100644 index 000000000..7763bcb1b --- /dev/null +++ b/ru/codes/csharp/chapter_hashing/hash_map_chaining.cs @@ -0,0 +1,144 @@ +/** +* File: hash_map_chaining.cs +* Created Time: 2023-06-26 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_hashing; + +/* Хеш-таблица с цепочками */ +class HashMapChaining { + int size; // Число пар ключ-значение + int capacity; // Вместимость хеш-таблицы + double loadThres; // Порог коэффициента загрузки для запуска расширения + int extendRatio; // Коэффициент расширения + List> buckets; // Массив корзин + + /* Конструктор */ + public HashMapChaining() { + size = 0; + capacity = 4; + loadThres = 2.0 / 3.0; + extendRatio = 2; + buckets = new List>(capacity); + for (int i = 0; i < capacity; i++) { + buckets.Add([]); + } + } + + /* Хеш-функция */ + int HashFunc(int key) { + return key % capacity; + } + + /* Коэффициент загрузки */ + double LoadFactor() { + return (double)size / capacity; + } + + /* Операция поиска */ + public string? Get(int key) { + int index = HashFunc(key); + // Обойти корзину; если найден key, вернуть соответствующее val + foreach (Pair pair in buckets[index]) { + if (pair.key == key) { + return pair.val; + } + } + // Если key не найден, вернуть null + return null; + } + + /* Операция добавления */ + public void Put(int key, string val) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if (LoadFactor() > loadThres) { + Extend(); + } + int index = HashFunc(key); + // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть + foreach (Pair pair in buckets[index]) { + if (pair.key == key) { + pair.val = val; + return; + } + } + // Если такого key нет, добавить пару ключ-значение в конец + buckets[index].Add(new Pair(key, val)); + size++; + } + + /* Операция удаления */ + public void Remove(int key) { + int index = HashFunc(key); + // Обойти корзину и удалить из нее пару ключ-значение + foreach (Pair pair in buckets[index].ToList()) { + if (pair.key == key) { + buckets[index].Remove(pair); + size--; + break; + } + } + } + + /* Расширить хеш-таблицу */ + void Extend() { + // Временно сохранить исходную хеш-таблицу + List> bucketsTmp = buckets; + // Инициализация новой хеш-таблицы после расширения + capacity *= extendRatio; + buckets = new List>(capacity); + for (int i = 0; i < capacity; i++) { + buckets.Add([]); + } + size = 0; + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + foreach (List bucket in bucketsTmp) { + foreach (Pair pair in bucket) { + Put(pair.key, pair.val); + } + } + } + + /* Вывести хеш-таблицу */ + public void Print() { + foreach (List bucket in buckets) { + List res = []; + foreach (Pair pair in bucket) { + res.Add(pair.key + " -> " + pair.val); + } + foreach (string kv in res) { + Console.WriteLine(kv); + } + } + } +} + +public class hash_map_chaining { + [Test] + public void Test() { + /* Инициализация хеш-таблицы */ + HashMapChaining map = new(); + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.Put(12836, "Сяо Ха"); + map.Put(15937, "Сяо Ло"); + map.Put(16750, "Сяо Суань"); + map.Put(13276, "Сяо Фа"); + map.Put(10583, "Сяо Я"); + Console.WriteLine("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение"); + map.Print(); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + string? name = map.Get(13276); + Console.WriteLine("\nДля номера 13276 найдено имя " + name); + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.Remove(12836); + Console.WriteLine("\nПосле удаления 12836 хеш-таблица имеет вид\nКлюч -> Значение"); + map.Print(); + } +} \ No newline at end of file diff --git a/ru/codes/csharp/chapter_hashing/hash_map_open_addressing.cs b/ru/codes/csharp/chapter_hashing/hash_map_open_addressing.cs new file mode 100644 index 000000000..80367ee03 --- /dev/null +++ b/ru/codes/csharp/chapter_hashing/hash_map_open_addressing.cs @@ -0,0 +1,159 @@ +/** +* File: hash_map_open_addressing.cs +* Created Time: 2023-06-26 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_hashing; + +/* Хеш-таблица с открытой адресацией */ +class HashMapOpenAddressing { + int size; // Число пар ключ-значение + int capacity = 4; // Вместимость хеш-таблицы + double loadThres = 2.0 / 3.0; // Порог коэффициента загрузки для запуска расширения + int extendRatio = 2; // Коэффициент расширения + Pair[] buckets; // Массив корзин + Pair TOMBSTONE = new(-1, "-1"); // Удалить метку + + /* Конструктор */ + public HashMapOpenAddressing() { + size = 0; + buckets = new Pair[capacity]; + } + + /* Хеш-функция */ + int HashFunc(int key) { + return key % capacity; + } + + /* Коэффициент загрузки */ + double LoadFactor() { + return (double)size / capacity; + } + + /* Найти индекс корзины, соответствующий key */ + int FindBucket(int key) { + int index = HashFunc(key); + int firstTombstone = -1; + // Выполнять линейное пробирование и завершить при встрече с пустой корзиной + while (buckets[index] != null) { + // Если встретился key, вернуть соответствующий индекс корзины + if (buckets[index].key == key) { + // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс + if (firstTombstone != -1) { + buckets[firstTombstone] = buckets[index]; + buckets[index] = TOMBSTONE; + return firstTombstone; // Вернуть индекс корзины после перемещения + } + return index; // Вернуть индекс корзины + } + // Записать первую встретившуюся метку удаления + if (firstTombstone == -1 && buckets[index] == TOMBSTONE) { + firstTombstone = index; + } + // Вычислить индекс корзины; при выходе за конец вернуться к началу + index = (index + 1) % capacity; + } + // Если key не существует, вернуть индекс точки добавления + return firstTombstone == -1 ? index : firstTombstone; + } + + /* Операция поиска */ + public string? Get(int key) { + // Найти индекс корзины, соответствующий key + int index = FindBucket(key); + // Если пара ключ-значение найдена, вернуть соответствующее val + if (buckets[index] != null && buckets[index] != TOMBSTONE) { + return buckets[index].val; + } + // Если пары ключ-значение не существует, вернуть null + return null; + } + + /* Операция добавления */ + public void Put(int key, string val) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if (LoadFactor() > loadThres) { + Extend(); + } + // Найти индекс корзины, соответствующий key + int index = FindBucket(key); + // Если пара ключ-значение найдена, перезаписать val и вернуть + if (buckets[index] != null && buckets[index] != TOMBSTONE) { + buckets[index].val = val; + return; + } + // Если пары ключ-значение нет, добавить ее + buckets[index] = new Pair(key, val); + size++; + } + + /* Операция удаления */ + public void Remove(int key) { + // Найти индекс корзины, соответствующий key + int index = FindBucket(key); + // Если пара ключ-значение найдена, заменить ее меткой удаления + if (buckets[index] != null && buckets[index] != TOMBSTONE) { + buckets[index] = TOMBSTONE; + size--; + } + } + + /* Расширить хеш-таблицу */ + void Extend() { + // Временно сохранить исходную хеш-таблицу + Pair[] bucketsTmp = buckets; + // Инициализация новой хеш-таблицы после расширения + capacity *= extendRatio; + buckets = new Pair[capacity]; + size = 0; + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + foreach (Pair pair in bucketsTmp) { + if (pair != null && pair != TOMBSTONE) { + Put(pair.key, pair.val); + } + } + } + + /* Вывести хеш-таблицу */ + public void Print() { + foreach (Pair pair in buckets) { + if (pair == null) { + Console.WriteLine("null"); + } else if (pair == TOMBSTONE) { + Console.WriteLine("TOMBSTONE"); + } else { + Console.WriteLine(pair.key + " -> " + pair.val); + } + } + } +} + +public class hash_map_open_addressing { + [Test] + public void Test() { + /* Инициализация хеш-таблицы */ + HashMapOpenAddressing map = new(); + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.Put(12836, "Сяо Ха"); + map.Put(15937, "Сяо Ло"); + map.Put(16750, "Сяо Суань"); + map.Put(13276, "Сяо Фа"); + map.Put(10583, "Сяо Я"); + Console.WriteLine("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение"); + map.Print(); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + string? name = map.Get(13276); + Console.WriteLine("\nДля номера 13276 найдено имя " + name); + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.Remove(16750); + Console.WriteLine("\nПосле удаления 16750 хеш-таблица имеет вид\nКлюч -> Значение"); + map.Print(); + } +} diff --git a/ru/codes/csharp/chapter_hashing/simple_hash.cs b/ru/codes/csharp/chapter_hashing/simple_hash.cs new file mode 100644 index 000000000..feda043a8 --- /dev/null +++ b/ru/codes/csharp/chapter_hashing/simple_hash.cs @@ -0,0 +1,66 @@ +/** +* File: simple_hash.cs +* Created Time: 2023-06-26 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_hashing; + +public class simple_hash { + /* Аддитивное хеширование */ + int AddHash(string key) { + long hash = 0; + const int MODULUS = 1000000007; + foreach (char c in key) { + hash = (hash + c) % MODULUS; + } + return (int)hash; + } + + /* Мультипликативное хеширование */ + int MulHash(string key) { + long hash = 0; + const int MODULUS = 1000000007; + foreach (char c in key) { + hash = (31 * hash + c) % MODULUS; + } + return (int)hash; + } + + /* XOR-хеширование */ + int XorHash(string key) { + int hash = 0; + const int MODULUS = 1000000007; + foreach (char c in key) { + hash ^= c; + } + return hash & MODULUS; + } + + /* Хеширование с циклическим сдвигом */ + int RotHash(string key) { + long hash = 0; + const int MODULUS = 1000000007; + foreach (char c in key) { + hash = ((hash << 4) ^ (hash >> 28) ^ c) % MODULUS; + } + return (int)hash; + } + + [Test] + public void Test() { + string key = "Hello Algo"; + + int hash = AddHash(key); + Console.WriteLine("Хеш-сумма сложением = " + hash); + + hash = MulHash(key); + Console.WriteLine("Хеш-сумма умножением = " + hash); + + hash = XorHash(key); + Console.WriteLine("Хеш-сумма XOR = " + hash); + + hash = RotHash(key); + Console.WriteLine("Хеш-сумма с циклическим сдвигом = " + hash); + } +} diff --git a/ru/codes/csharp/chapter_heap/heap.cs b/ru/codes/csharp/chapter_heap/heap.cs new file mode 100644 index 000000000..fc73cec56 --- /dev/null +++ b/ru/codes/csharp/chapter_heap/heap.cs @@ -0,0 +1,64 @@ +/** + * File: heap.cs + * Created Time: 2023-02-06 + * Author: zjkung1123 (zjkung1123@gmail.com) + */ + +namespace hello_algo.chapter_heap; + +public class heap { + void TestPush(PriorityQueue heap, int val) { + heap.Enqueue(val, val); // Добавление элемента в кучу + Console.WriteLine($"\nПосле добавления элемента {val} в кучу\n"); + PrintUtil.PrintHeap(heap); + } + + void TestPop(PriorityQueue heap) { + int val = heap.Dequeue(); // Извлечение элемента с вершины кучи + Console.WriteLine($"\nПосле извлечения элемента вершины кучи {val}\n"); + PrintUtil.PrintHeap(heap); + } + + [Test] + public void Test() { + /* Инициализация кучи */ + // Инициализация минимальной кучи + PriorityQueue minHeap = new(); + // Инициализировать максимальную кучу (достаточно изменить Comparer с помощью lambda-выражения) + PriorityQueue maxHeap = new(Comparer.Create((x, y) => y.CompareTo(x))); + Console.WriteLine("Ниже приведен тестовый пример для max-heap"); + + /* Добавление элемента в кучу */ + TestPush(maxHeap, 1); + TestPush(maxHeap, 3); + TestPush(maxHeap, 2); + TestPush(maxHeap, 5); + TestPush(maxHeap, 4); + + /* Получение элемента с вершины кучи */ + int peek = maxHeap.Peek(); + Console.WriteLine($"Элемент на вершине кучи = {peek}"); + + /* Извлечение элемента с вершины кучи */ + // Элементы, извлеченные из кучи, образуют последовательность от большего к меньшему + TestPop(maxHeap); + TestPop(maxHeap); + TestPop(maxHeap); + TestPop(maxHeap); + TestPop(maxHeap); + + /* Получение размера кучи */ + int size = maxHeap.Count; + Console.WriteLine($"Количество элементов в куче = {size}"); + + /* Проверка, пуста ли куча */ + bool isEmpty = maxHeap.Count == 0; + Console.WriteLine($"Пуста ли куча: {isEmpty}"); + + /* Построить кучу по входному списку */ + var list = new int[] { 1, 3, 2, 5, 4 }; + minHeap = new PriorityQueue(list.Select(x => (x, x))); + Console.WriteLine("После построения min-heap из входного списка"); + PrintUtil.PrintHeap(minHeap); + } +} diff --git a/ru/codes/csharp/chapter_heap/my_heap.cs b/ru/codes/csharp/chapter_heap/my_heap.cs new file mode 100644 index 000000000..69199f206 --- /dev/null +++ b/ru/codes/csharp/chapter_heap/my_heap.cs @@ -0,0 +1,160 @@ +/** + * File: my_heap.cs + * Created Time: 2023-02-06 + * Author: zjkung1123 (zjkung1123@gmail.com) + */ + +namespace hello_algo.chapter_heap; + +/* Максимальная куча */ +class MaxHeap { + // Использовать список вместо массива, чтобы не учитывать проблему расширения + List maxHeap; + + /* Конструктор, создающий пустую кучу */ + public MaxHeap() { + maxHeap = []; + } + + /* Конструктор: построить кучу по входному списку */ + public MaxHeap(IEnumerable nums) { + // Добавить элементы списка в кучу без изменений + maxHeap = new List(nums); + // Выполнить heapify для всех узлов, кроме листовых + var size = Parent(this.Size() - 1); + for (int i = size; i >= 0; i--) { + SiftDown(i); + } + } + + /* Получить индекс левого дочернего узла */ + int Left(int i) { + return 2 * i + 1; + } + + /* Получить индекс правого дочернего узла */ + int Right(int i) { + return 2 * i + 2; + } + + /* Получить индекс родительского узла */ + int Parent(int i) { + return (i - 1) / 2; // Округление вниз при делении + } + + /* Доступ к элементу на вершине кучи */ + public int Peek() { + return maxHeap[0]; + } + + /* Добавление элемента в кучу */ + public void Push(int val) { + // Добавление узла + maxHeap.Add(val); + // Просеивание снизу вверх + SiftUp(Size() - 1); + } + + /* Получение размера кучи */ + public int Size() { + return maxHeap.Count; + } + + /* Проверка, пуста ли куча */ + public bool IsEmpty() { + return Size() == 0; + } + + /* Начиная с узла i, выполнить просеивание снизу вверх */ + void SiftUp(int i) { + while (true) { + // Получение родительского узла для узла i + int p = Parent(i); + // Если «выход за пределы корневого узла» или «узел не требует исправления», завершить просеивание + if (p < 0 || maxHeap[i] <= maxHeap[p]) + break; + // Поменять два узла местами + Swap(i, p); + // Циклическое просеивание вверх + i = p; + } + } + + /* Извлечение элемента из кучи */ + public int Pop() { + // Обработка пустого случая + if (IsEmpty()) + throw new IndexOutOfRangeException(); + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + Swap(0, Size() - 1); + // Удаление узла + int val = maxHeap.Last(); + maxHeap.RemoveAt(Size() - 1); + // Просеивание сверху вниз + SiftDown(0); + // Вернуть элемент с вершины кучи + return val; + } + + /* Начиная с узла i, выполнить просеивание сверху вниз */ + void SiftDown(int i) { + while (true) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + int l = Left(i), r = Right(i), ma = i; + if (l < Size() && maxHeap[l] > maxHeap[ma]) + ma = l; + if (r < Size() && maxHeap[r] > maxHeap[ma]) + ma = r; + // Если «узел i максимален» или «выход за пределы листовых узлов», завершить просеивание + if (ma == i) break; + // Поменять два узла местами + Swap(i, ma); + // Циклическое просеивание вниз + i = ma; + } + } + + /* Поменять элементы местами */ + void Swap(int i, int p) { + (maxHeap[i], maxHeap[p]) = (maxHeap[p], maxHeap[i]); + } + + /* Вывести кучу (двоичное дерево) */ + public void Print() { + var queue = new Queue(maxHeap); + PrintUtil.PrintHeap(queue); + } +} + +public class my_heap { + [Test] + public void Test() { + /* Инициализация максимальной кучи */ + MaxHeap maxHeap = new([9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2]); + Console.WriteLine("\nПосле построения кучи из входного списка"); + maxHeap.Print(); + + /* Получение элемента с вершины кучи */ + int peek = maxHeap.Peek(); + Console.WriteLine($"Элемент на вершине кучи = {peek}"); + + /* Добавление элемента в кучу */ + int val = 7; + maxHeap.Push(val); + Console.WriteLine($"После добавления элемента {val} в кучу"); + maxHeap.Print(); + + /* Извлечение элемента с вершины кучи */ + peek = maxHeap.Pop(); + Console.WriteLine($"После извлечения элемента вершины кучи {peek}"); + maxHeap.Print(); + + /* Получение размера кучи */ + int size = maxHeap.Size(); + Console.WriteLine($"Количество элементов в куче = {size}"); + + /* Проверка, пуста ли куча */ + bool isEmpty = maxHeap.IsEmpty(); + Console.WriteLine($"Пуста ли куча: {isEmpty}"); + } +} diff --git a/ru/codes/csharp/chapter_heap/top_k.cs b/ru/codes/csharp/chapter_heap/top_k.cs new file mode 100644 index 000000000..6d6f6739c --- /dev/null +++ b/ru/codes/csharp/chapter_heap/top_k.cs @@ -0,0 +1,37 @@ +/** +* File: top_k.cs +* Created Time: 2023-06-14 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_heap; + +public class top_k { + /* Найти k наибольших элементов массива с помощью кучи */ + PriorityQueue TopKHeap(int[] nums, int k) { + // Инициализация минимальной кучи + PriorityQueue heap = new(); + // Поместить первые k элементов массива в кучу + for (int i = 0; i < k; i++) { + heap.Enqueue(nums[i], nums[i]); + } + // Начиная с элемента k+1, поддерживать длину кучи равной k + for (int i = k; i < nums.Length; i++) { + // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу + if (nums[i] > heap.Peek()) { + heap.Dequeue(); + heap.Enqueue(nums[i], nums[i]); + } + } + return heap; + } + + [Test] + public void Test() { + int[] nums = [1, 7, 6, 3, 2]; + int k = 3; + PriorityQueue res = TopKHeap(nums, k); + Console.WriteLine("Наибольшие " + k + " элементов ="); + PrintUtil.PrintHeap(res); + } +} diff --git a/ru/codes/csharp/chapter_searching/binary_search.cs b/ru/codes/csharp/chapter_searching/binary_search.cs new file mode 100644 index 000000000..3cc98a657 --- /dev/null +++ b/ru/codes/csharp/chapter_searching/binary_search.cs @@ -0,0 +1,59 @@ +/** + * File: binary_search.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_searching; + +public class binary_search { + /* Бинарный поиск (двусторонне замкнутый интервал) */ + int BinarySearch(int[] nums, int target) { + // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно + int i = 0, j = nums.Length - 1; + // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст) + while (i <= j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) // Это означает, что target находится в интервале [m+1, j] + i = m + 1; + else if (nums[m] > target) // Это означает, что target находится в интервале [i, m-1] + j = m - 1; + else // Целевой элемент найден, вернуть его индекс + return m; + } + // Целевой элемент не найден, вернуть -1 + return -1; + } + + /* Бинарный поиск (лево замкнутый, право открытый интервал) */ + int BinarySearchLCRO(int[] nums, int target) { + // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно + int i = 0, j = nums.Length; + // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст) + while (i < j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) // Это означает, что target находится в интервале [m+1, j) + i = m + 1; + else if (nums[m] > target) // Это означает, что target находится в интервале [i, m) + j = m; + else // Целевой элемент найден, вернуть его индекс + return m; + } + // Целевой элемент не найден, вернуть -1 + return -1; + } + + [Test] + public void Test() { + int target = 6; + int[] nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; + + /* Бинарный поиск (двусторонне замкнутый интервал) */ + int index = BinarySearch(nums, target); + Console.WriteLine("Индекс целевого элемента 6 = " + index); + + /* Бинарный поиск (лево замкнутый, право открытый интервал) */ + index = BinarySearchLCRO(nums, target); + Console.WriteLine("Индекс целевого элемента 6 = " + index); + } +} diff --git a/ru/codes/csharp/chapter_searching/binary_search_edge.cs b/ru/codes/csharp/chapter_searching/binary_search_edge.cs new file mode 100644 index 000000000..c6cbc288e --- /dev/null +++ b/ru/codes/csharp/chapter_searching/binary_search_edge.cs @@ -0,0 +1,50 @@ +/** +* File: binary_search_edge.cs +* Created Time: 2023-08-06 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_searching; + +public class binary_search_edge { + /* Бинарный поиск самого левого target */ + int BinarySearchLeftEdge(int[] nums, int target) { + // Эквивалентно поиску точки вставки target + int i = binary_search_insertion.BinarySearchInsertion(nums, target); + // target не найден, вернуть -1 + if (i == nums.Length || nums[i] != target) { + return -1; + } + // Найти target и вернуть индекс i + return i; + } + + /* Бинарный поиск самого правого target */ + int BinarySearchRightEdge(int[] nums, int target) { + // Преобразовать задачу в поиск самого левого target + 1 + int i = binary_search_insertion.BinarySearchInsertion(nums, target + 1); + // j указывает на самый правый target, а i — на первый элемент больше target + int j = i - 1; + // target не найден, вернуть -1 + if (j == -1 || nums[j] != target) { + return -1; + } + // Найти target и вернуть индекс j + return j; + } + + [Test] + public void Test() { + // Массив с повторяющимися элементами + int[] nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15]; + Console.WriteLine("\nМассив nums = " + nums.PrintList()); + + // Бинарный поиск левой и правой границы + foreach (int target in new int[] { 6, 7 }) { + int index = BinarySearchLeftEdge(nums, target); + Console.WriteLine("Индекс самого левого элемента " + target + " равен " + index); + index = BinarySearchRightEdge(nums, target); + Console.WriteLine("Индекс самого правого элемента " + target + " равен " + index); + } + } +} diff --git a/ru/codes/csharp/chapter_searching/binary_search_insertion.cs b/ru/codes/csharp/chapter_searching/binary_search_insertion.cs new file mode 100644 index 000000000..d0300c5d7 --- /dev/null +++ b/ru/codes/csharp/chapter_searching/binary_search_insertion.cs @@ -0,0 +1,64 @@ +/** +* File: binary_search_insertion.cs +* Created Time: 2023-08-06 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_searching; + +public class binary_search_insertion { + /* Бинарный поиск точки вставки (без повторяющихся элементов) */ + public static int BinarySearchInsertionSimple(int[] nums, int target) { + int i = 0, j = nums.Length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) { + i = m + 1; // target находится в интервале [m+1, j] + } else if (nums[m] > target) { + j = m - 1; // target находится в интервале [i, m-1] + } else { + return m; // Найти target и вернуть точку вставки m + } + } + // target не найден, вернуть точку вставки i + return i; + } + + /* Бинарный поиск точки вставки (с повторяющимися элементами) */ + public static int BinarySearchInsertion(int[] nums, int target) { + int i = 0, j = nums.Length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) { + i = m + 1; // target находится в интервале [m+1, j] + } else if (nums[m] > target) { + j = m - 1; // target находится в интервале [i, m-1] + } else { + j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1] + } + } + // Вернуть точку вставки i + return i; + } + + [Test] + public void Test() { + // Массив без повторяющихся элементов + int[] nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; + Console.WriteLine("\nМассив nums = " + nums.PrintList()); + // Бинарный поиск точки вставки + foreach (int target in new int[] { 6, 9 }) { + int index = BinarySearchInsertionSimple(nums, target); + Console.WriteLine("Индекс позиции вставки элемента " + target + " равен " + index); + } + + // Массив с повторяющимися элементами + nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15]; + Console.WriteLine("\nМассив nums = " + nums.PrintList()); + // Бинарный поиск точки вставки + foreach (int target in new int[] { 2, 6, 20 }) { + int index = BinarySearchInsertion(nums, target); + Console.WriteLine("Индекс позиции вставки элемента " + target + " равен " + index); + } + } +} diff --git a/ru/codes/csharp/chapter_searching/hashing_search.cs b/ru/codes/csharp/chapter_searching/hashing_search.cs new file mode 100644 index 000000000..824ed83b0 --- /dev/null +++ b/ru/codes/csharp/chapter_searching/hashing_search.cs @@ -0,0 +1,50 @@ +/** + * File: hashing_search.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_searching; + +public class hashing_search { + /* Хеш-поиск (массив) */ + int HashingSearchArray(Dictionary map, int target) { + // key хеш-таблицы: целевой элемент, value: индекс + // Если такого key нет в хеш-таблице, вернуть -1 + return map.GetValueOrDefault(target, -1); + } + + /* Хеш-поиск (связный список) */ + ListNode? HashingSearchLinkedList(Dictionary map, int target) { + + // key хеш-таблицы: значение целевого узла, value: объект узла + // Если такого key нет в хеш-таблице, вернуть null + return map.GetValueOrDefault(target); + } + + [Test] + public void Test() { + int target = 3; + + /* Хеш-поиск (массив) */ + int[] nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8]; + // Инициализация хеш-таблицы + Dictionary map = []; + for (int i = 0; i < nums.Length; i++) { + map[nums[i]] = i; // key: элемент, value: индекс + } + int index = HashingSearchArray(map, target); + Console.WriteLine("Индекс целевого элемента 3 = " + index); + + /* Хеш-поиск (связный список) */ + ListNode? head = ListNode.ArrToLinkedList(nums); + // Инициализация хеш-таблицы + Dictionary map1 = []; + while (head != null) { + map1[head.val] = head; // key: значение узла, value: узел + head = head.next; + } + ListNode? node = HashingSearchLinkedList(map1, target); + Console.WriteLine("Объект узла со значением 3 = " + node); + } +} diff --git a/ru/codes/csharp/chapter_searching/linear_search.cs b/ru/codes/csharp/chapter_searching/linear_search.cs new file mode 100644 index 000000000..51bba2d9f --- /dev/null +++ b/ru/codes/csharp/chapter_searching/linear_search.cs @@ -0,0 +1,49 @@ +/** + * File: linear_search.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_searching; + +public class linear_search { + /* Линейный поиск (массив) */ + int LinearSearchArray(int[] nums, int target) { + // Обход массива + for (int i = 0; i < nums.Length; i++) { + // Целевой элемент найден, вернуть его индекс + if (nums[i] == target) + return i; + } + // Целевой элемент не найден, вернуть -1 + return -1; + } + + /* Линейный поиск (связный список) */ + ListNode? LinearSearchLinkedList(ListNode? head, int target) { + // Обойти связный список + while (head != null) { + // Найти целевой узел и вернуть его + if (head.val == target) + return head; + head = head.next; + } + // Целевой узел не найден, вернуть null + return null; + } + + [Test] + public void Test() { + int target = 3; + + /* Выполнить линейный поиск в массиве */ + int[] nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8]; + int index = LinearSearchArray(nums, target); + Console.WriteLine("Индекс целевого элемента 3 = " + index); + + /* Выполнить линейный поиск в связном списке */ + ListNode? head = ListNode.ArrToLinkedList(nums); + ListNode? node = LinearSearchLinkedList(head, target); + Console.WriteLine("Объект узла со значением 3 = " + node); + } +} diff --git a/ru/codes/csharp/chapter_searching/two_sum.cs b/ru/codes/csharp/chapter_searching/two_sum.cs new file mode 100644 index 000000000..9a3c8e6a9 --- /dev/null +++ b/ru/codes/csharp/chapter_searching/two_sum.cs @@ -0,0 +1,52 @@ +/** + * File: two_sum.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_searching; + +public class two_sum { + /* Метод 1: полный перебор */ + int[] TwoSumBruteForce(int[] nums, int target) { + int size = nums.Length; + // Два вложенных цикла, временная сложность O(n^2) + for (int i = 0; i < size - 1; i++) { + for (int j = i + 1; j < size; j++) { + if (nums[i] + nums[j] == target) + return [i, j]; + } + } + return []; + } + + /* Метод 2: вспомогательная хеш-таблица */ + int[] TwoSumHashTable(int[] nums, int target) { + int size = nums.Length; + // Вспомогательная хеш-таблица, пространственная сложность O(n) + Dictionary dic = []; + // Один цикл, временная сложность O(n) + for (int i = 0; i < size; i++) { + if (dic.ContainsKey(target - nums[i])) { + return [dic[target - nums[i]], i]; + } + dic.Add(nums[i], i); + } + return []; + } + + [Test] + public void Test() { + // ======= Test Case ======= + int[] nums = [2, 7, 11, 15]; + int target = 13; + + // ====== Основной код ====== + // Метод 1 + int[] res = TwoSumBruteForce(nums, target); + Console.WriteLine("Результат метода 1 res = " + string.Join(",", res)); + // Метод 2 + res = TwoSumHashTable(nums, target); + Console.WriteLine("Результат метода 2 res = " + string.Join(",", res)); + } +} diff --git a/ru/codes/csharp/chapter_sorting/bubble_sort.cs b/ru/codes/csharp/chapter_sorting/bubble_sort.cs new file mode 100644 index 000000000..ee43d8c54 --- /dev/null +++ b/ru/codes/csharp/chapter_sorting/bubble_sort.cs @@ -0,0 +1,51 @@ +/** + * File: bubble_sort.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_sorting; + +public class bubble_sort { + /* Пузырьковая сортировка */ + void BubbleSort(int[] nums) { + // Внешний цикл: неотсортированный диапазон [0, i] + for (int i = nums.Length - 1; i > 0; i--) { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (int j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]); + } + } + } + } + + /* Пузырьковая сортировка (оптимизация флагом) */ + void BubbleSortWithFlag(int[] nums) { + // Внешний цикл: неотсортированный диапазон [0, i] + for (int i = nums.Length - 1; i > 0; i--) { + bool flag = false; // Инициализировать флаг + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (int j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]); + flag = true; // Записать обмен элементов + } + } + if (!flag) break; // На этой итерации «всплытия» не было ни одного обмена, сразу выйти + } + } + + [Test] + public void Test() { + int[] nums = [4, 1, 3, 1, 5, 2]; + BubbleSort(nums); + Console.WriteLine("После пузырьковой сортировки nums = " + string.Join(",", nums)); + + int[] nums1 = [4, 1, 3, 1, 5, 2]; + BubbleSortWithFlag(nums1); + Console.WriteLine("После пузырьковой сортировки nums1 = " + string.Join(",", nums1)); + } +} diff --git a/ru/codes/csharp/chapter_sorting/bucket_sort.cs b/ru/codes/csharp/chapter_sorting/bucket_sort.cs new file mode 100644 index 000000000..550a0fcb7 --- /dev/null +++ b/ru/codes/csharp/chapter_sorting/bucket_sort.cs @@ -0,0 +1,46 @@ +/** + * File: bucket_sort.cs + * Created Time: 2023-04-13 + * Author: hpstory (hpstory1024@163.com) + */ + +namespace hello_algo.chapter_sorting; + +public class bucket_sort { + /* Сортировка корзинами */ + void BucketSort(float[] nums) { + // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину + int k = nums.Length / 2; + List> buckets = []; + for (int i = 0; i < k; i++) { + buckets.Add([]); + } + // 1. Распределить элементы массива по корзинам + foreach (float num in nums) { + // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1] + int i = (int)(num * k); + // Добавить num в корзину i + buckets[i].Add(num); + } + // 2. Выполнить сортировку внутри каждой корзины + foreach (List bucket in buckets) { + // Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки + bucket.Sort(); + } + // 3. Обойти корзины и объединить результаты + int j = 0; + foreach (List bucket in buckets) { + foreach (float num in bucket) { + nums[j++] = num; + } + } + } + + [Test] + public void Test() { + // Пусть входные данные — числа с плавающей точкой из диапазона [0, 1) + float[] nums = [0.49f, 0.96f, 0.82f, 0.09f, 0.57f, 0.43f, 0.91f, 0.75f, 0.15f, 0.37f]; + BucketSort(nums); + Console.WriteLine("После сортировки корзинами nums = " + string.Join(" ", nums)); + } +} diff --git a/ru/codes/csharp/chapter_sorting/counting_sort.cs b/ru/codes/csharp/chapter_sorting/counting_sort.cs new file mode 100644 index 000000000..b6f2c9e67 --- /dev/null +++ b/ru/codes/csharp/chapter_sorting/counting_sort.cs @@ -0,0 +1,77 @@ +/** + * File: counting_sort.cs + * Created Time: 2023-04-13 + * Author: hpstory (hpstory1024@163.com) + */ + +namespace hello_algo.chapter_sorting; + +public class counting_sort { + /* Сортировка подсчетом */ + // Простая реализация, не подходит для сортировки объектов + void CountingSortNaive(int[] nums) { + // 1. Найти максимальный элемент массива m + int m = 0; + foreach (int num in nums) { + m = Math.Max(m, num); + } + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + int[] counter = new int[m + 1]; + foreach (int num in nums) { + counter[num]++; + } + // 3. Обойти counter и заполнить исходный массив nums элементами + int i = 0; + for (int num = 0; num < m + 1; num++) { + for (int j = 0; j < counter[num]; j++, i++) { + nums[i] = num; + } + } + } + + /* Сортировка подсчетом */ + // Полная реализация, позволяет сортировать объекты и является стабильной сортировкой + void CountingSort(int[] nums) { + // 1. Найти максимальный элемент массива m + int m = 0; + foreach (int num in nums) { + m = Math.Max(m, num); + } + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + int[] counter = new int[m + 1]; + foreach (int num in nums) { + counter[num]++; + } + // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс» + // То есть counter[num]-1 — это индекс последнего появления num в res + for (int i = 0; i < m; i++) { + counter[i + 1] += counter[i]; + } + // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res + // Инициализировать массив res для хранения результата + int n = nums.Length; + int[] res = new int[n]; + for (int i = n - 1; i >= 0; i--) { + int num = nums[i]; + res[counter[num] - 1] = num; // Поместить num по соответствующему индексу + counter[num]--; // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num + } + // Перезаписать исходный массив nums массивом результата res + for (int i = 0; i < n; i++) { + nums[i] = res[i]; + } + } + + [Test] + public void Test() { + int[] nums = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4]; + CountingSortNaive(nums); + Console.WriteLine("После сортировки подсчетом (объекты не поддерживаются) nums = " + string.Join(" ", nums)); + + int[] nums1 = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4]; + CountingSort(nums1); + Console.WriteLine("После сортировки подсчетом nums1 = " + string.Join(" ", nums)); + } +} diff --git a/ru/codes/csharp/chapter_sorting/heap_sort.cs b/ru/codes/csharp/chapter_sorting/heap_sort.cs new file mode 100644 index 000000000..8cdd0465f --- /dev/null +++ b/ru/codes/csharp/chapter_sorting/heap_sort.cs @@ -0,0 +1,52 @@ +/** +* File: heap_sort.cs +* Created Time: 2023-06-01 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_sorting; + +public class heap_sort { + /* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */ + void SiftDown(int[] nums, int n, int i) { + while (true) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + int l = 2 * i + 1; + int r = 2 * i + 2; + int ma = i; + if (l < n && nums[l] > nums[ma]) + ma = l; + if (r < n && nums[r] > nums[ma]) + ma = r; + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (ma == i) + break; + // Поменять два узла местами + (nums[ma], nums[i]) = (nums[i], nums[ma]); + // Циклическое просеивание вниз + i = ma; + } + } + + /* Сортировка кучей */ + void HeapSort(int[] nums) { + // Построение кучи: выполнить heapify для всех узлов, кроме листовых + for (int i = nums.Length / 2 - 1; i >= 0; i--) { + SiftDown(nums, nums.Length, i); + } + // Извлекать максимальный элемент из кучи в течение n-1 итераций + for (int i = nums.Length - 1; i > 0; i--) { + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + (nums[i], nums[0]) = (nums[0], nums[i]); + // Начиная с корневого узла, выполнить просеивание сверху вниз + SiftDown(nums, i, 0); + } + } + + [Test] + public void Test() { + int[] nums = [4, 1, 3, 1, 5, 2]; + HeapSort(nums); + Console.WriteLine("После сортировки кучей nums = " + string.Join(" ", nums)); + } +} diff --git a/ru/codes/csharp/chapter_sorting/insertion_sort.cs b/ru/codes/csharp/chapter_sorting/insertion_sort.cs new file mode 100644 index 000000000..85c5ddcc7 --- /dev/null +++ b/ru/codes/csharp/chapter_sorting/insertion_sort.cs @@ -0,0 +1,30 @@ +/** + * File: insertion_sort.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_sorting; + +public class insertion_sort { + /* Сортировка вставками */ + void InsertionSort(int[] nums) { + // Внешний цикл: отсортированный диапазон [0, i-1] + for (int i = 1; i < nums.Length; i++) { + int bas = nums[i], j = i - 1; + // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1] + while (j >= 0 && nums[j] > bas) { + nums[j + 1] = nums[j]; // Сдвинуть nums[j] на одну позицию вправо + j--; + } + nums[j + 1] = bas; // Поместить base в правильную позицию + } + } + + [Test] + public void Test() { + int[] nums = [4, 1, 3, 1, 5, 2]; + InsertionSort(nums); + Console.WriteLine("После сортировки вставками nums = " + string.Join(",", nums)); + } +} diff --git a/ru/codes/csharp/chapter_sorting/merge_sort.cs b/ru/codes/csharp/chapter_sorting/merge_sort.cs new file mode 100644 index 000000000..ab368d979 --- /dev/null +++ b/ru/codes/csharp/chapter_sorting/merge_sort.cs @@ -0,0 +1,56 @@ +/** + * File: merge_sort.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_sorting; + +public class merge_sort { + /* Объединить левый и правый подмассивы */ + void Merge(int[] nums, int left, int mid, int right) { + // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right] + // Создать временный массив tmp для хранения результата слияния + int[] tmp = new int[right - left + 1]; + // Инициализировать начальные индексы левого и правого подмассивов + int i = left, j = mid + 1, k = 0; + // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив + while (i <= mid && j <= right) { + if (nums[i] <= nums[j]) + tmp[k++] = nums[i++]; + else + tmp[k++] = nums[j++]; + } + // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив + while (i <= mid) { + tmp[k++] = nums[i++]; + } + while (j <= right) { + tmp[k++] = nums[j++]; + } + // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums + for (k = 0; k < tmp.Length; ++k) { + nums[left + k] = tmp[k]; + } + } + + /* Сортировка слиянием */ + void MergeSort(int[] nums, int left, int right) { + // Условие завершения + if (left >= right) return; // Завершить рекурсию, когда длина подмассива равна 1 + // Этап разбиения + int mid = left + (right - left) / 2; // Вычислить середину + MergeSort(nums, left, mid); // Рекурсивно обработать левый подмассив + MergeSort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив + // Этап слияния + Merge(nums, left, mid, right); + } + + [Test] + public void Test() { + /* Сортировка слиянием */ + int[] nums = [7, 3, 2, 6, 0, 1, 5, 4]; + MergeSort(nums, 0, nums.Length - 1); + Console.WriteLine("После сортировки слиянием nums = " + string.Join(",", nums)); + } +} diff --git a/ru/codes/csharp/chapter_sorting/quick_sort.cs b/ru/codes/csharp/chapter_sorting/quick_sort.cs new file mode 100644 index 000000000..9f0ff7112 --- /dev/null +++ b/ru/codes/csharp/chapter_sorting/quick_sort.cs @@ -0,0 +1,150 @@ +/** + * File: quick_sort.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_sorting; + +class quickSort { + /* Обмен элементов */ + static void Swap(int[] nums, int i, int j) { + (nums[j], nums[i]) = (nums[i], nums[j]); + } + + /* Разбиение с опорными указателями */ + static int Partition(int[] nums, int left, int right) { + // Взять nums[left] в качестве опорного элемента + int i = left, j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) + j--; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) + i++; // Идти слева направо в поисках первого элемента больше опорного + Swap(nums, i, j); // Поменять эти два элемента местами + } + Swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка */ + public static void QuickSort(int[] nums, int left, int right) { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) + return; + // Разбиение с опорными указателями + int pivot = Partition(nums, left, right); + // Рекурсивно обработать левый и правый подмассивы + QuickSort(nums, left, pivot - 1); + QuickSort(nums, pivot + 1, right); + } +} + +/* Класс быстрой сортировки (оптимизация медианным опорным элементом) */ +class QuickSortMedian { + /* Обмен элементов */ + static void Swap(int[] nums, int i, int j) { + (nums[j], nums[i]) = (nums[i], nums[j]); + } + + /* Выбрать медиану из трех кандидатов */ + static int MedianThree(int[] nums, int left, int mid, int right) { + int l = nums[left], m = nums[mid], r = nums[right]; + if ((l <= m && m <= r) || (r <= m && m <= l)) + return mid; // m находится между l и r + if ((m <= l && l <= r) || (r <= l && l <= m)) + return left; // l находится между m и r + return right; + } + + /* Разбиение с опорными указателями (медиана трех) */ + static int Partition(int[] nums, int left, int right) { + // Выбрать медиану из трех кандидатов + int med = MedianThree(nums, left, (left + right) / 2, right); + // Переместить медиану в крайний левый элемент массива + Swap(nums, left, med); + // Взять nums[left] в качестве опорного элемента + int i = left, j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) + j--; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) + i++; // Идти слева направо в поисках первого элемента больше опорного + Swap(nums, i, j); // Поменять эти два элемента местами + } + Swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка */ + public static void QuickSort(int[] nums, int left, int right) { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) + return; + // Разбиение с опорными указателями + int pivot = Partition(nums, left, right); + // Рекурсивно обработать левый и правый подмассивы + QuickSort(nums, left, pivot - 1); + QuickSort(nums, pivot + 1, right); + } +} + +/* Класс быстрой сортировки (оптимизация глубины рекурсии) */ +class QuickSortTailCall { + /* Обмен элементов */ + static void Swap(int[] nums, int i, int j) { + (nums[j], nums[i]) = (nums[i], nums[j]); + } + + /* Разбиение с опорными указателями */ + static int Partition(int[] nums, int left, int right) { + // Взять nums[left] в качестве опорного элемента + int i = left, j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) + j--; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) + i++; // Идти слева направо в поисках первого элемента больше опорного + Swap(nums, i, j); // Поменять эти два элемента местами + } + Swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка (оптимизация глубины рекурсии) */ + public static void QuickSort(int[] nums, int left, int right) { + // Завершить, когда длина подмассива равна 1 + while (left < right) { + // Операция разбиения с опорными указателями + int pivot = Partition(nums, left, right); + // Выполнить быструю сортировку для более короткого из двух подмассивов + if (pivot - left < right - pivot) { + QuickSort(nums, left, pivot - 1); // Рекурсивно отсортировать левый подмассив + left = pivot + 1; // Оставшийся неотсортированный диапазон: [pivot + 1, right] + } else { + QuickSort(nums, pivot + 1, right); // Рекурсивно отсортировать правый подмассив + right = pivot - 1; // Оставшийся неотсортированный диапазон: [left, pivot - 1] + } + } + } +} + +public class quick_sort { + [Test] + public void Test() { + /* Быстрая сортировка */ + int[] nums = [2, 4, 1, 0, 3, 5]; + quickSort.QuickSort(nums, 0, nums.Length - 1); + Console.WriteLine("После быстрой сортировки nums = " + string.Join(",", nums)); + + /* Быстрая сортировка (оптимизация медианным опорным элементом) */ + int[] nums1 = [2, 4, 1, 0, 3, 5]; + QuickSortMedian.QuickSort(nums1, 0, nums1.Length - 1); + Console.WriteLine("После быстрой сортировки (оптимизация медианным опорным элементом) nums1 = " + string.Join(",", nums1)); + + /* Быстрая сортировка (оптимизация глубины рекурсии) */ + int[] nums2 = [2, 4, 1, 0, 3, 5]; + QuickSortTailCall.QuickSort(nums2, 0, nums2.Length - 1); + Console.WriteLine("После быстрой сортировки (оптимизация глубины рекурсии) nums2 = " + string.Join(",", nums2)); + } +} diff --git a/ru/codes/csharp/chapter_sorting/radix_sort.cs b/ru/codes/csharp/chapter_sorting/radix_sort.cs new file mode 100644 index 000000000..d7ba9675a --- /dev/null +++ b/ru/codes/csharp/chapter_sorting/radix_sort.cs @@ -0,0 +1,69 @@ +/** + * File: radix_sort.cs + * Created Time: 2023-04-13 + * Author: hpstory (hpstory1024@163.com) + */ + +namespace hello_algo.chapter_sorting; + +public class radix_sort { + /* Получить k-й разряд элемента num, где exp = 10^(k-1) */ + int Digit(int num, int exp) { + // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени + return (num / exp) % 10; + } + + /* Сортировка подсчетом (сортировка по k-му разряду nums) */ + void CountingSortDigit(int[] nums, int exp) { + // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10 + int[] counter = new int[10]; + int n = nums.Length; + // Подсчитать число появлений каждой цифры от 0 до 9 + for (int i = 0; i < n; i++) { + int d = Digit(nums[i], exp); // Получить k-й разряд nums[i], обозначив его как d + counter[d]++; // Подсчитать число появлений цифры d + } + // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива» + for (int i = 1; i < 10; i++) { + counter[i] += counter[i - 1]; + } + // Выполняя обратный проход, заполнить res элементами по статистике в корзинах + int[] res = new int[n]; + for (int i = n - 1; i >= 0; i--) { + int d = Digit(nums[i], exp); + int j = counter[d] - 1; // Получить индекс j цифры d в массиве + res[j] = nums[i]; // Поместить текущий элемент по индексу j + counter[d]--; // Уменьшить количество d на 1 + } + // Перезаписать исходный массив nums результатом + for (int i = 0; i < n; i++) { + nums[i] = res[i]; + } + } + + /* Поразрядная сортировка */ + void RadixSort(int[] nums) { + // Получить максимальный элемент массива, чтобы определить максимальное число разрядов + int m = int.MinValue; + foreach (int num in nums) { + if (num > m) m = num; + } + // Проходить разряды от младшего к старшему + for (int exp = 1; exp <= m; exp *= 10) { + // Выполнить сортировку подсчетом по k-му разряду элементов массива + // k = 1 -> exp = 1 + // k = 2 -> exp = 10 + // то есть exp = 10^(k-1) + CountingSortDigit(nums, exp); + } + } + + [Test] + public void Test() { + // Поразрядная сортировка + int[] nums = [ 10546151, 35663510, 42865989, 34862445, 81883077, + 88906420, 72429244, 30524779, 82060337, 63832996 ]; + RadixSort(nums); + Console.WriteLine("После поразрядной сортировки nums = " + string.Join(" ", nums)); + } +} diff --git a/ru/codes/csharp/chapter_sorting/selection_sort.cs b/ru/codes/csharp/chapter_sorting/selection_sort.cs new file mode 100644 index 000000000..395985bf6 --- /dev/null +++ b/ru/codes/csharp/chapter_sorting/selection_sort.cs @@ -0,0 +1,32 @@ +/** +* File: selection_sort.cs +* Created Time: 2023-06-01 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_sorting; + +public class selection_sort { + /* Сортировка выбором */ + void SelectionSort(int[] nums) { + int n = nums.Length; + // Внешний цикл: неотсортированный диапазон [i, n-1] + for (int i = 0; i < n - 1; i++) { + // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне + int k = i; + for (int j = i + 1; j < n; j++) { + if (nums[j] < nums[k]) + k = j; // Записать индекс минимального элемента + } + // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона + (nums[k], nums[i]) = (nums[i], nums[k]); + } + } + + [Test] + public void Test() { + int[] nums = [4, 1, 3, 1, 5, 2]; + SelectionSort(nums); + Console.WriteLine("После сортировки выбором nums = " + string.Join(" ", nums)); + } +} diff --git a/ru/codes/csharp/chapter_stack_and_queue/array_deque.cs b/ru/codes/csharp/chapter_stack_and_queue/array_deque.cs new file mode 100644 index 000000000..69ad08426 --- /dev/null +++ b/ru/codes/csharp/chapter_stack_and_queue/array_deque.cs @@ -0,0 +1,152 @@ +/** + * File: array_deque.cs + * Created Time: 2023-03-08 + * Author: hpstory (hpstory1024@163.com) + */ + +namespace hello_algo.chapter_stack_and_queue; + +/* Двусторонняя очередь на основе кольцевого массива */ +public class ArrayDeque { + int[] nums; // Массив для хранения элементов двусторонней очереди + int front; // Указатель head, указывающий на первый элемент очереди + int queSize; // Длина двусторонней очереди + + /* Конструктор */ + public ArrayDeque(int capacity) { + nums = new int[capacity]; + front = queSize = 0; + } + + /* Получить вместимость двусторонней очереди */ + int Capacity() { + return nums.Length; + } + + /* Получение длины двусторонней очереди */ + public int Size() { + return queSize; + } + + /* Проверка, пуста ли двусторонняя очередь */ + public bool IsEmpty() { + return queSize == 0; + } + + /* Вычислить индекс в кольцевом массиве */ + int Index(int i) { + // С помощью операции взятия по модулю соединить начало и конец массива + // Когда i выходит за конец массива, он возвращается в начало + // Когда i выходит за начало массива, он возвращается в конец + return (i + Capacity()) % Capacity(); + } + + /* Добавление в голову очереди */ + public void PushFirst(int num) { + if (queSize == Capacity()) { + Console.WriteLine("Двусторонняя очередь заполнена"); + return; + } + // Указатель головы сдвигается на одну позицию влево + // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост + front = Index(front - 1); + // Добавить num в голову очереди + nums[front] = num; + queSize++; + } + + /* Добавление в хвост очереди */ + public void PushLast(int num) { + if (queSize == Capacity()) { + Console.WriteLine("Двусторонняя очередь заполнена"); + return; + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + int rear = Index(front + queSize); + // Добавить num в хвост очереди + nums[rear] = num; + queSize++; + } + + /* Извлечение из головы очереди */ + public int PopFirst() { + int num = PeekFirst(); + // Указатель головы сдвигается на одну позицию назад + front = Index(front + 1); + queSize--; + return num; + } + + /* Извлечение из хвоста очереди */ + public int PopLast() { + int num = PeekLast(); + queSize--; + return num; + } + + /* Доступ к элементу в начале очереди */ + public int PeekFirst() { + if (IsEmpty()) { + throw new InvalidOperationException(); + } + return nums[front]; + } + + /* Доступ к элементу в конце очереди */ + public int PeekLast() { + if (IsEmpty()) { + throw new InvalidOperationException(); + } + // Вычислить индекс хвостового элемента + int last = Index(front + queSize - 1); + return nums[last]; + } + + /* Вернуть массив для вывода */ + public int[] ToArray() { + // Преобразовывать только элементы списка в пределах фактической длины + int[] res = new int[queSize]; + for (int i = 0, j = front; i < queSize; i++, j++) { + res[i] = nums[Index(j)]; + } + return res; + } +} + +public class array_deque { + [Test] + public void Test() { + /* Инициализация двусторонней очереди */ + ArrayDeque deque = new(10); + deque.PushLast(3); + deque.PushLast(2); + deque.PushLast(5); + Console.WriteLine("Двусторонняя очередь deque = " + string.Join(" ", deque.ToArray())); + + /* Доступ к элементу */ + int peekFirst = deque.PeekFirst(); + Console.WriteLine("Первый элемент peekFirst = " + peekFirst); + int peekLast = deque.PeekLast(); + Console.WriteLine("Последний элемент peekLast = " + peekLast); + + /* Добавление элемента в очередь */ + deque.PushLast(4); + Console.WriteLine("После добавления элемента 4 в хвост deque = " + string.Join(" ", deque.ToArray())); + deque.PushFirst(1); + Console.WriteLine("После добавления элемента 1 в голову deque = " + string.Join(" ", deque.ToArray())); + + /* Извлечение элемента из очереди */ + int popLast = deque.PopLast(); + Console.WriteLine("Извлеченный из хвоста элемент = " + popLast + ", deque после извлечения из хвоста = " + string.Join(" ", deque.ToArray())); + int popFirst = deque.PopFirst(); + Console.WriteLine("Извлеченный из головы элемент = " + popFirst + ", deque после извлечения из головы = " + string.Join(" ", deque.ToArray())); + + /* Получение длины двусторонней очереди */ + int size = deque.Size(); + Console.WriteLine("Длина двусторонней очереди size = " + size); + + /* Проверка, пуста ли двусторонняя очередь */ + bool isEmpty = deque.IsEmpty(); + Console.WriteLine("Пуста ли двусторонняя очередь = " + isEmpty); + } +} diff --git a/ru/codes/csharp/chapter_stack_and_queue/array_queue.cs b/ru/codes/csharp/chapter_stack_and_queue/array_queue.cs new file mode 100644 index 000000000..6a0dee214 --- /dev/null +++ b/ru/codes/csharp/chapter_stack_and_queue/array_queue.cs @@ -0,0 +1,114 @@ +/** + * File: array_queue.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_stack_and_queue; + +/* Очередь на основе кольцевого массива */ +class ArrayQueue { + int[] nums; // Массив для хранения элементов очереди + int front; // Указатель head, указывающий на первый элемент очереди + int queSize; // Длина очереди + + public ArrayQueue(int capacity) { + nums = new int[capacity]; + front = queSize = 0; + } + + /* Получить вместимость очереди */ + int Capacity() { + return nums.Length; + } + + /* Получение длины очереди */ + public int Size() { + return queSize; + } + + /* Проверка, пуста ли очередь */ + public bool IsEmpty() { + return queSize == 0; + } + + /* Поместить в очередь */ + public void Push(int num) { + if (queSize == Capacity()) { + Console.WriteLine("Очередь заполнена"); + return; + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива + int rear = (front + queSize) % Capacity(); + // Добавить num в хвост очереди + nums[rear] = num; + queSize++; + } + + /* Извлечь из очереди */ + public int Pop() { + int num = Peek(); + // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива + front = (front + 1) % Capacity(); + queSize--; + return num; + } + + /* Доступ к элементу в начале очереди */ + public int Peek() { + if (IsEmpty()) + throw new Exception(); + return nums[front]; + } + + /* Вернуть массив */ + public int[] ToArray() { + // Преобразовывать только элементы списка в пределах фактической длины + int[] res = new int[queSize]; + for (int i = 0, j = front; i < queSize; i++, j++) { + res[i] = nums[j % this.Capacity()]; + } + return res; + } +} + +public class array_queue { + [Test] + public void Test() { + /* Инициализация очереди */ + int capacity = 10; + ArrayQueue queue = new(capacity); + + /* Добавление элемента в очередь */ + queue.Push(1); + queue.Push(3); + queue.Push(2); + queue.Push(5); + queue.Push(4); + Console.WriteLine("Очередь queue = " + string.Join(",", queue.ToArray())); + + /* Доступ к элементу в начале очереди */ + int peek = queue.Peek(); + Console.WriteLine("Первый элемент peek = " + peek); + + /* Извлечение элемента из очереди */ + int pop = queue.Pop(); + Console.WriteLine("Извлеченный элемент pop = " + pop + ", queue после извлечения = " + string.Join(",", queue.ToArray())); + + /* Получение длины очереди */ + int size = queue.Size(); + Console.WriteLine("Длина очереди size = " + size); + + /* Проверка, пуста ли очередь */ + bool isEmpty = queue.IsEmpty(); + Console.WriteLine("Пуста ли очередь = " + isEmpty); + + /* Проверка кольцевого массива */ + for (int i = 0; i < 10; i++) { + queue.Push(i); + queue.Pop(); + Console.WriteLine("После " + i + "-го раунда операций enqueue и dequeue queue = " + string.Join(",", queue.ToArray())); + } + } +} diff --git a/ru/codes/csharp/chapter_stack_and_queue/array_stack.cs b/ru/codes/csharp/chapter_stack_and_queue/array_stack.cs new file mode 100644 index 000000000..c0c963701 --- /dev/null +++ b/ru/codes/csharp/chapter_stack_and_queue/array_stack.cs @@ -0,0 +1,84 @@ +/** + * File: array_stack.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_stack_and_queue; + +/* Стек на основе массива */ +class ArrayStack { + List stack; + public ArrayStack() { + // Инициализация списка (динамического массива) + stack = []; + } + + /* Получение длины стека */ + public int Size() { + return stack.Count; + } + + /* Проверка, пуст ли стек */ + public bool IsEmpty() { + return Size() == 0; + } + + /* Поместить в стек */ + public void Push(int num) { + stack.Add(num); + } + + /* Извлечь из стека */ + public int Pop() { + if (IsEmpty()) + throw new Exception(); + var val = Peek(); + stack.RemoveAt(Size() - 1); + return val; + } + + /* Доступ к верхнему элементу стека */ + public int Peek() { + if (IsEmpty()) + throw new Exception(); + return stack[Size() - 1]; + } + + /* Преобразовать List в Array и вернуть */ + public int[] ToArray() { + return [.. stack]; + } +} + +public class array_stack { + [Test] + public void Test() { + /* Инициализация стека */ + ArrayStack stack = new(); + + /* Помещение элемента в стек */ + stack.Push(1); + stack.Push(3); + stack.Push(2); + stack.Push(5); + stack.Push(4); + Console.WriteLine("Стек stack = " + string.Join(",", stack.ToArray())); + + /* Доступ к верхнему элементу стека */ + int peek = stack.Peek(); + Console.WriteLine("Верхний элемент peek = " + peek); + + /* Извлечение элемента из стека */ + int pop = stack.Pop(); + Console.WriteLine("Извлеченный элемент pop = " + pop + ", stack после извлечения = " + string.Join(",", stack.ToArray())); + + /* Получение длины стека */ + int size = stack.Size(); + Console.WriteLine("Длина стека size = " + size); + + /* Проверка на пустоту */ + bool isEmpty = stack.IsEmpty(); + Console.WriteLine("Пуст ли стек = " + isEmpty); + } +} diff --git a/ru/codes/csharp/chapter_stack_and_queue/deque.cs b/ru/codes/csharp/chapter_stack_and_queue/deque.cs new file mode 100644 index 000000000..6709b5c88 --- /dev/null +++ b/ru/codes/csharp/chapter_stack_and_queue/deque.cs @@ -0,0 +1,44 @@ +/** + * File: deque.cs + * Created Time: 2022-12-30 + * Author: moonache (microin1301@outlook.com) + */ + +namespace hello_algo.chapter_stack_and_queue; + +public class deque { + [Test] + public void Test() { + /* Инициализация двусторонней очереди */ + // В C# связный список LinkedList рассматривается как двусторонняя очередь + LinkedList deque = new(); + + /* Добавление элемента в очередь */ + deque.AddLast(2); // Добавить в хвост очереди + deque.AddLast(5); + deque.AddLast(4); + deque.AddFirst(3); // Добавить в голову очереди + deque.AddFirst(1); + Console.WriteLine("Двусторонняя очередь deque = " + string.Join(",", deque)); + + /* Доступ к элементу */ + int? peekFirst = deque.First?.Value; // Элемент в голове очереди + Console.WriteLine("Первый элемент peekFirst = " + peekFirst); + int? peekLast = deque.Last?.Value; // Элемент в хвосте очереди + Console.WriteLine("Последний элемент peekLast = " + peekLast); + + /* Извлечение элемента из очереди */ + deque.RemoveFirst(); // Извлечь элемент из головы очереди + Console.WriteLine("После извлечения элемента из головы deque = " + string.Join(",", deque)); + deque.RemoveLast(); // Извлечь элемент из хвоста очереди + Console.WriteLine("После извлечения элемента из хвоста deque = " + string.Join(",", deque)); + + /* Получение длины двусторонней очереди */ + int size = deque.Count; + Console.WriteLine("Длина двусторонней очереди size = " + size); + + /* Проверка, пуста ли двусторонняя очередь */ + bool isEmpty = deque.Count == 0; + Console.WriteLine("Пуста ли двусторонняя очередь = " + isEmpty); + } +} diff --git a/ru/codes/csharp/chapter_stack_and_queue/linkedlist_deque.cs b/ru/codes/csharp/chapter_stack_and_queue/linkedlist_deque.cs new file mode 100644 index 000000000..82e35cb17 --- /dev/null +++ b/ru/codes/csharp/chapter_stack_and_queue/linkedlist_deque.cs @@ -0,0 +1,177 @@ +/** + * File: linkedlist_deque.cs + * Created Time: 2023-03-08 + * Author: hpstory (hpstory1024@163.com) + */ + +namespace hello_algo.chapter_stack_and_queue; + +/* Узел двусвязного списка */ +public class ListNode(int val) { + public int val = val; // Значение узла + public ListNode? next = null; // Ссылка на узел-преемник + public ListNode? prev = null; // Ссылка на узел-предшественник +} + +/* Двусторонняя очередь на основе двусвязного списка */ +public class LinkedListDeque { + ListNode? front, rear; // Головной узел front, хвостовой узел rear + int queSize = 0; // Длина двусторонней очереди + + public LinkedListDeque() { + front = null; + rear = null; + } + + /* Получение длины двусторонней очереди */ + public int Size() { + return queSize; + } + + /* Проверка, пуста ли двусторонняя очередь */ + public bool IsEmpty() { + return Size() == 0; + } + + /* Операция добавления в очередь */ + void Push(int num, bool isFront) { + ListNode node = new(num); + // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node + if (IsEmpty()) { + front = node; + rear = node; + } + // Операция добавления в голову очереди + else if (isFront) { + // Добавить node в голову списка + front!.prev = node; + node.next = front; + front = node; // Обновить головной узел + } + // Операция добавления в хвост очереди + else { + // Добавить node в хвост списка + rear!.next = node; + node.prev = rear; + rear = node; // Обновить хвостовой узел + } + + queSize++; // Обновить длину очереди + } + + /* Добавление в голову очереди */ + public void PushFirst(int num) { + Push(num, true); + } + + /* Добавление в хвост очереди */ + public void PushLast(int num) { + Push(num, false); + } + + /* Операция извлечения из очереди */ + int? Pop(bool isFront) { + if (IsEmpty()) + throw new Exception(); + int? val; + // Операция извлечения из головы очереди + if (isFront) { + val = front?.val; // Временно сохранить значение головного узла + // Удалить головной узел + ListNode? fNext = front?.next; + if (fNext != null) { + fNext.prev = null; + front!.next = null; + } + front = fNext; // Обновить головной узел + } + // Операция извлечения из хвоста очереди + else { + val = rear?.val; // Временно сохранить значение хвостового узла + // Удалить хвостовой узел + ListNode? rPrev = rear?.prev; + if (rPrev != null) { + rPrev.next = null; + rear!.prev = null; + } + rear = rPrev; // Обновить хвостовой узел + } + + queSize--; // Обновить длину очереди + return val; + } + + /* Извлечение из головы очереди */ + public int? PopFirst() { + return Pop(true); + } + + /* Извлечение из хвоста очереди */ + public int? PopLast() { + return Pop(false); + } + + /* Доступ к элементу в начале очереди */ + public int? PeekFirst() { + if (IsEmpty()) + throw new Exception(); + return front?.val; + } + + /* Доступ к элементу в конце очереди */ + public int? PeekLast() { + if (IsEmpty()) + throw new Exception(); + return rear?.val; + } + + /* Вернуть массив для вывода */ + public int?[] ToArray() { + ListNode? node = front; + int?[] res = new int?[Size()]; + for (int i = 0; i < res.Length; i++) { + res[i] = node?.val; + node = node?.next; + } + + return res; + } +} + +public class linkedlist_deque { + [Test] + public void Test() { + /* Инициализация двусторонней очереди */ + LinkedListDeque deque = new(); + deque.PushLast(3); + deque.PushLast(2); + deque.PushLast(5); + Console.WriteLine("Двусторонняя очередь deque = " + string.Join(" ", deque.ToArray())); + + /* Доступ к элементу */ + int? peekFirst = deque.PeekFirst(); + Console.WriteLine("Первый элемент peekFirst = " + peekFirst); + int? peekLast = deque.PeekLast(); + Console.WriteLine("Последний элемент peekLast = " + peekLast); + + /* Добавление элемента в очередь */ + deque.PushLast(4); + Console.WriteLine("После добавления элемента 4 в хвост deque = " + string.Join(" ", deque.ToArray())); + deque.PushFirst(1); + Console.WriteLine("После добавления элемента 1 в голову deque = " + string.Join(" ", deque.ToArray())); + + /* Извлечение элемента из очереди */ + int? popLast = deque.PopLast(); + Console.WriteLine("Извлеченный из хвоста элемент = " + popLast + ", deque после извлечения из хвоста = " + string.Join(" ", deque.ToArray())); + int? popFirst = deque.PopFirst(); + Console.WriteLine("Извлеченный из головы элемент = " + popFirst + ", deque после извлечения из головы = " + string.Join(" ", deque.ToArray())); + + /* Получение длины двусторонней очереди */ + int size = deque.Size(); + Console.WriteLine("Длина двусторонней очереди size = " + size); + + /* Проверка, пуста ли двусторонняя очередь */ + bool isEmpty = deque.IsEmpty(); + Console.WriteLine("Пуста ли двусторонняя очередь = " + isEmpty); + } +} diff --git a/ru/codes/csharp/chapter_stack_and_queue/linkedlist_queue.cs b/ru/codes/csharp/chapter_stack_and_queue/linkedlist_queue.cs new file mode 100644 index 000000000..931c87b7b --- /dev/null +++ b/ru/codes/csharp/chapter_stack_and_queue/linkedlist_queue.cs @@ -0,0 +1,106 @@ +/** + * File: linkedlist_queue.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_stack_and_queue; + +/* Очередь на основе связного списка */ +class LinkedListQueue { + ListNode? front, rear; // Головной узел front, хвостовой узел rear + int queSize = 0; + + public LinkedListQueue() { + front = null; + rear = null; + } + + /* Получение длины очереди */ + public int Size() { + return queSize; + } + + /* Проверка, пуста ли очередь */ + public bool IsEmpty() { + return Size() == 0; + } + + /* Поместить в очередь */ + public void Push(int num) { + // Добавить num после хвостового узла + ListNode node = new(num); + // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел + if (front == null) { + front = node; + rear = node; + // Если очередь не пуста, добавить этот узел после хвостового узла + } else if (rear != null) { + rear.next = node; + rear = node; + } + queSize++; + } + + /* Извлечь из очереди */ + public int Pop() { + int num = Peek(); + // Удалить головной узел + front = front?.next; + queSize--; + return num; + } + + /* Доступ к элементу в начале очереди */ + public int Peek() { + if (IsEmpty()) + throw new Exception(); + return front!.val; + } + + /* Преобразовать связный список в Array и вернуть */ + public int[] ToArray() { + if (front == null) + return []; + + ListNode? node = front; + int[] res = new int[Size()]; + for (int i = 0; i < res.Length; i++) { + res[i] = node!.val; + node = node.next; + } + return res; + } +} + +public class linkedlist_queue { + [Test] + public void Test() { + /* Инициализация очереди */ + LinkedListQueue queue = new(); + + /* Добавление элемента в очередь */ + queue.Push(1); + queue.Push(3); + queue.Push(2); + queue.Push(5); + queue.Push(4); + Console.WriteLine("Очередь queue = " + string.Join(",", queue.ToArray())); + + /* Доступ к элементу в начале очереди */ + int peek = queue.Peek(); + Console.WriteLine("Первый элемент peek = " + peek); + + /* Извлечение элемента из очереди */ + int pop = queue.Pop(); + Console.WriteLine("Извлеченный элемент pop = " + pop + ", queue после извлечения = " + string.Join(",", queue.ToArray())); + + /* Получение длины очереди */ + int size = queue.Size(); + Console.WriteLine("Длина очереди size = " + size); + + /* Проверка, пуста ли очередь */ + bool isEmpty = queue.IsEmpty(); + Console.WriteLine("Пуста ли очередь = " + isEmpty); + } +} diff --git a/ru/codes/csharp/chapter_stack_and_queue/linkedlist_stack.cs b/ru/codes/csharp/chapter_stack_and_queue/linkedlist_stack.cs new file mode 100644 index 000000000..daa83ab42 --- /dev/null +++ b/ru/codes/csharp/chapter_stack_and_queue/linkedlist_stack.cs @@ -0,0 +1,97 @@ +/** + * File: linkedlist_stack.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_stack_and_queue; + +/* Стек на основе связного списка */ +class LinkedListStack { + ListNode? stackPeek; // Использовать головной узел как вершину стека + int stkSize = 0; // Длина стека + + public LinkedListStack() { + stackPeek = null; + } + + /* Получение длины стека */ + public int Size() { + return stkSize; + } + + /* Проверка, пуст ли стек */ + public bool IsEmpty() { + return Size() == 0; + } + + /* Поместить в стек */ + public void Push(int num) { + ListNode node = new(num) { + next = stackPeek + }; + stackPeek = node; + stkSize++; + } + + /* Извлечь из стека */ + public int Pop() { + int num = Peek(); + stackPeek = stackPeek!.next; + stkSize--; + return num; + } + + /* Доступ к верхнему элементу стека */ + public int Peek() { + if (IsEmpty()) + throw new Exception(); + return stackPeek!.val; + } + + /* Преобразовать List в Array и вернуть */ + public int[] ToArray() { + if (stackPeek == null) + return []; + + ListNode? node = stackPeek; + int[] res = new int[Size()]; + for (int i = res.Length - 1; i >= 0; i--) { + res[i] = node!.val; + node = node.next; + } + return res; + } +} + +public class linkedlist_stack { + [Test] + public void Test() { + /* Инициализация стека */ + LinkedListStack stack = new(); + + /* Помещение элемента в стек */ + stack.Push(1); + stack.Push(3); + stack.Push(2); + stack.Push(5); + stack.Push(4); + Console.WriteLine("Стек stack = " + string.Join(",", stack.ToArray())); + + /* Доступ к верхнему элементу стека */ + int peek = stack.Peek(); + Console.WriteLine("Верхний элемент peek = " + peek); + + /* Извлечение элемента из стека */ + int pop = stack.Pop(); + Console.WriteLine("Извлеченный элемент pop = " + pop + ", stack после извлечения = " + string.Join(",", stack.ToArray())); + + /* Получение длины стека */ + int size = stack.Size(); + Console.WriteLine("Длина стека size = " + size); + + /* Проверка на пустоту */ + bool isEmpty = stack.IsEmpty(); + Console.WriteLine("Пуст ли стек = " + isEmpty); + } +} diff --git a/ru/codes/csharp/chapter_stack_and_queue/queue.cs b/ru/codes/csharp/chapter_stack_and_queue/queue.cs new file mode 100644 index 000000000..22e3a14f6 --- /dev/null +++ b/ru/codes/csharp/chapter_stack_and_queue/queue.cs @@ -0,0 +1,39 @@ +/** + * File: queue.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_stack_and_queue; + +public class queue { + [Test] + public void Test() { + /* Инициализация очереди */ + Queue queue = new(); + + /* Добавление элемента в очередь */ + queue.Enqueue(1); + queue.Enqueue(3); + queue.Enqueue(2); + queue.Enqueue(5); + queue.Enqueue(4); + Console.WriteLine("Очередь queue = " + string.Join(",", queue)); + + /* Доступ к элементу в начале очереди */ + int peek = queue.Peek(); + Console.WriteLine("Первый элемент peek = " + peek); + + /* Извлечение элемента из очереди */ + int pop = queue.Dequeue(); + Console.WriteLine("Извлеченный элемент pop = " + pop + ", queue после извлечения = " + string.Join(",", queue)); + + /* Получение длины очереди */ + int size = queue.Count; + Console.WriteLine("Длина очереди size = " + size); + + /* Проверка, пуста ли очередь */ + bool isEmpty = queue.Count == 0; + Console.WriteLine("Пуста ли очередь = " + isEmpty); + } +} diff --git a/ru/codes/csharp/chapter_stack_and_queue/stack.cs b/ru/codes/csharp/chapter_stack_and_queue/stack.cs new file mode 100644 index 000000000..68d518c41 --- /dev/null +++ b/ru/codes/csharp/chapter_stack_and_queue/stack.cs @@ -0,0 +1,40 @@ +/** + * File: stack.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_stack_and_queue; + +public class stack { + [Test] + public void Test() { + /* Инициализация стека */ + Stack stack = new(); + + /* Помещение элемента в стек */ + stack.Push(1); + stack.Push(3); + stack.Push(2); + stack.Push(5); + stack.Push(4); + // Обратите внимание: stack.ToArray() возвращает последовательность в обратном порядке, то есть индекс 0 соответствует вершине стека + Console.WriteLine("Стек stack = " + string.Join(",", stack)); + + /* Доступ к верхнему элементу стека */ + int peek = stack.Peek(); + Console.WriteLine("Верхний элемент peek = " + peek); + + /* Извлечение элемента из стека */ + int pop = stack.Pop(); + Console.WriteLine("Извлеченный элемент pop = " + pop + ", stack после извлечения = " + string.Join(",", stack)); + + /* Получение длины стека */ + int size = stack.Count; + Console.WriteLine("Длина стека size = " + size); + + /* Проверка на пустоту */ + bool isEmpty = stack.Count == 0; + Console.WriteLine("Пуст ли стек = " + isEmpty); + } +} diff --git a/ru/codes/csharp/chapter_tree/array_binary_tree.cs b/ru/codes/csharp/chapter_tree/array_binary_tree.cs new file mode 100644 index 000000000..ec864a169 --- /dev/null +++ b/ru/codes/csharp/chapter_tree/array_binary_tree.cs @@ -0,0 +1,129 @@ +/** +* File: array_binary_tree.cs +* Created Time: 2023-07-20 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_tree; + +/* Класс двоичного дерева в массивном представлении */ +public class ArrayBinaryTree(List arr) { + List tree = new(arr); + + /* Вместимость списка */ + public int Size() { + return tree.Count; + } + + /* Получить значение узла с индексом i */ + public int? Val(int i) { + // Если индекс выходит за границы, вернуть null, обозначающий пустую позицию + if (i < 0 || i >= Size()) + return null; + return tree[i]; + } + + /* Получить индекс левого дочернего узла узла с индексом i */ + public int Left(int i) { + return 2 * i + 1; + } + + /* Получить индекс правого дочернего узла узла с индексом i */ + public int Right(int i) { + return 2 * i + 2; + } + + /* Получить индекс родительского узла узла с индексом i */ + public int Parent(int i) { + return (i - 1) / 2; + } + + /* Обход в ширину */ + public List LevelOrder() { + List res = []; + // Непосредственно обходить массив + for (int i = 0; i < Size(); i++) { + if (Val(i).HasValue) + res.Add(Val(i)!.Value); + } + return res; + } + + /* Обход в глубину */ + void DFS(int i, string order, List res) { + // Если это пустая позиция, вернуть + if (!Val(i).HasValue) + return; + // Предварительный обход + if (order == "pre") + res.Add(Val(i)!.Value); + DFS(Left(i), order, res); + // Симметричный обход + if (order == "in") + res.Add(Val(i)!.Value); + DFS(Right(i), order, res); + // Обратный обход + if (order == "post") + res.Add(Val(i)!.Value); + } + + /* Предварительный обход */ + public List PreOrder() { + List res = []; + DFS(0, "pre", res); + return res; + } + + /* Симметричный обход */ + public List InOrder() { + List res = []; + DFS(0, "in", res); + return res; + } + + /* Обратный обход */ + public List PostOrder() { + List res = []; + DFS(0, "post", res); + return res; + } +} + +public class array_binary_tree { + [Test] + public void Test() { + // Инициализировать двоичное дерево + // Здесь используется функция, напрямую строящая двоичное дерево из массива + List arr = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15]; + + TreeNode? root = TreeNode.ListToTree(arr); + Console.WriteLine("\nИнициализация двоичного дерева\n"); + Console.WriteLine("Массивное представление двоичного дерева:"); + Console.WriteLine(arr.PrintList()); + Console.WriteLine("Связное представление двоичного дерева:"); + PrintUtil.PrintTree(root); + + // Класс двоичного дерева в массивном представлении + ArrayBinaryTree abt = new(arr); + + // Доступ к узлу + int i = 1; + int l = abt.Left(i); + int r = abt.Right(i); + int p = abt.Parent(i); + Console.WriteLine("\nТекущий узел: индекс = " + i + " , значение = " + abt.Val(i)); + Console.WriteLine("Индекс левого дочернего узла = " + l + " , значение = " + (abt.Val(l).HasValue ? abt.Val(l) : "null")); + Console.WriteLine("Индекс правого дочернего узла = " + r + " , значение = " + (abt.Val(r).HasValue ? abt.Val(r) : "null")); + Console.WriteLine("Индекс родительского узла = " + p + " , значение = " + (abt.Val(p).HasValue ? abt.Val(p) : "null")); + + // Обходить дерево + List res = abt.LevelOrder(); + Console.WriteLine("\nОбход в ширину = " + res.PrintList()); + res = abt.PreOrder(); + Console.WriteLine("Предварительный обход = " + res.PrintList()); + res = abt.InOrder(); + Console.WriteLine("Симметричный обход = " + res.PrintList()); + res = abt.PostOrder(); + Console.WriteLine("Обратный обход = " + res.PrintList()); + } +} \ No newline at end of file diff --git a/ru/codes/csharp/chapter_tree/avl_tree.cs b/ru/codes/csharp/chapter_tree/avl_tree.cs new file mode 100644 index 000000000..369e2c5fe --- /dev/null +++ b/ru/codes/csharp/chapter_tree/avl_tree.cs @@ -0,0 +1,216 @@ +/** + * File: avl_tree.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_tree; + +/* AVL-дерево */ +class AVLTree { + public TreeNode? root; // Корневой узел + + /* Получить высоту узла */ + int Height(TreeNode? node) { + // Высота пустого узла равна -1, высота листового узла равна 0 + return node == null ? -1 : node.height; + } + + /* Обновить высоту узла */ + void UpdateHeight(TreeNode node) { + // Высота узла равна высоте более высокого поддерева + 1 + node.height = Math.Max(Height(node.left), Height(node.right)) + 1; + } + + /* Получить коэффициент баланса */ + public int BalanceFactor(TreeNode? node) { + // Коэффициент баланса пустого узла равен 0 + if (node == null) return 0; + // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева + return Height(node.left) - Height(node.right); + } + + /* Операция правого вращения */ + TreeNode? RightRotate(TreeNode? node) { + TreeNode? child = node?.left; + TreeNode? grandChild = child?.right; + // Выполнить правое вращение узла node вокруг child + child.right = node; + node.left = grandChild; + // Обновить высоту узла + UpdateHeight(node); + UpdateHeight(child); + // Вернуть корневой узел поддерева после вращения + return child; + } + + /* Операция левого вращения */ + TreeNode? LeftRotate(TreeNode? node) { + TreeNode? child = node?.right; + TreeNode? grandChild = child?.left; + // Выполнить левое вращение узла node вокруг child + child.left = node; + node.right = grandChild; + // Обновить высоту узла + UpdateHeight(node); + UpdateHeight(child); + // Вернуть корневой узел поддерева после вращения + return child; + } + + /* Выполнить вращение, чтобы снова сбалансировать поддерево */ + TreeNode? Rotate(TreeNode? node) { + // Получить коэффициент баланса узла node + int balanceFactorInt = BalanceFactor(node); + // Левосторонне перекошенное дерево + if (balanceFactorInt > 1) { + if (BalanceFactor(node?.left) >= 0) { + // Правое вращение + return RightRotate(node); + } else { + // Сначала левое вращение, затем правое + node!.left = LeftRotate(node!.left); + return RightRotate(node); + } + } + // Правосторонне перекошенное дерево + if (balanceFactorInt < -1) { + if (BalanceFactor(node?.right) <= 0) { + // Левое вращение + return LeftRotate(node); + } else { + // Сначала правое вращение, затем левое + node!.right = RightRotate(node!.right); + return LeftRotate(node); + } + } + // Дерево сбалансировано, вращение не требуется, вернуть сразу + return node; + } + + /* Вставка узла */ + public void Insert(int val) { + root = InsertHelper(root, val); + } + + /* Рекурсивная вставка узла (вспомогательный метод) */ + TreeNode? InsertHelper(TreeNode? node, int val) { + if (node == null) return new TreeNode(val); + /* 1. Найти позицию вставки и вставить узел */ + if (val < node.val) + node.left = InsertHelper(node.left, val); + else if (val > node.val) + node.right = InsertHelper(node.right, val); + else + return node; // Повторяющийся узел не вставлять, сразу вернуть + UpdateHeight(node); // Обновить высоту узла + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = Rotate(node); + // Вернуть корневой узел поддерева + return node; + } + + /* Удаление узла */ + public void Remove(int val) { + root = RemoveHelper(root, val); + } + + /* Рекурсивное удаление узла (вспомогательный метод) */ + TreeNode? RemoveHelper(TreeNode? node, int val) { + if (node == null) return null; + /* 1. Найти узел и удалить его */ + if (val < node.val) + node.left = RemoveHelper(node.left, val); + else if (val > node.val) + node.right = RemoveHelper(node.right, val); + else { + if (node.left == null || node.right == null) { + TreeNode? child = node.left ?? node.right; + // Число дочерних узлов = 0, удалить node и сразу вернуть + if (child == null) + return null; + // Число дочерних узлов = 1, удалить node напрямую + else + node = child; + } else { + // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел + TreeNode? temp = node.right; + while (temp.left != null) { + temp = temp.left; + } + node.right = RemoveHelper(node.right, temp.val!.Value); + node.val = temp.val; + } + } + UpdateHeight(node); // Обновить высоту узла + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = Rotate(node); + // Вернуть корневой узел поддерева + return node; + } + + /* Поиск узла */ + public TreeNode? Search(int val) { + TreeNode? cur = root; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Целевой узел находится в правом поддереве cur + if (cur.val < val) + cur = cur.right; + // Целевой узел находится в левом поддереве cur + else if (cur.val > val) + cur = cur.left; + // Найти целевой узел и выйти из цикла + else + break; + } + // Вернуть целевой узел + return cur; + } +} + +public class avl_tree { + static void TestInsert(AVLTree tree, int val) { + tree.Insert(val); + Console.WriteLine("\nПосле вставки узла " + val + " AVL-дерево имеет вид"); + PrintUtil.PrintTree(tree.root); + } + + static void TestRemove(AVLTree tree, int val) { + tree.Remove(val); + Console.WriteLine("\nПосле удаления узла " + val + " AVL-дерево имеет вид"); + PrintUtil.PrintTree(tree.root); + } + + [Test] + public void Test() { + /* Инициализация пустого AVL-дерева */ + AVLTree avlTree = new(); + + /* Вставка узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после вставки узла + TestInsert(avlTree, 1); + TestInsert(avlTree, 2); + TestInsert(avlTree, 3); + TestInsert(avlTree, 4); + TestInsert(avlTree, 5); + TestInsert(avlTree, 8); + TestInsert(avlTree, 7); + TestInsert(avlTree, 9); + TestInsert(avlTree, 10); + TestInsert(avlTree, 6); + + /* Вставка повторяющегося узла */ + TestInsert(avlTree, 7); + + /* Удаление узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после удаления узла + TestRemove(avlTree, 8); // Удаление узла степени 0 + TestRemove(avlTree, 5); // Удаление узла степени 1 + TestRemove(avlTree, 4); // Удаление узла степени 2 + + /* Поиск узла */ + TreeNode? node = avlTree.Search(7); + Console.WriteLine("\nНайденный объект узла = " + node + ", значение узла = " + node?.val); + } +} diff --git a/ru/codes/csharp/chapter_tree/binary_search_tree.cs b/ru/codes/csharp/chapter_tree/binary_search_tree.cs new file mode 100644 index 000000000..31db5d896 --- /dev/null +++ b/ru/codes/csharp/chapter_tree/binary_search_tree.cs @@ -0,0 +1,160 @@ +/** + * File: binary_search_tree.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_tree; + +class BinarySearchTree { + TreeNode? root; + + public BinarySearchTree() { + // Инициализировать пустое дерево + root = null; + } + + /* Получить корневой узел двоичного дерева */ + public TreeNode? GetRoot() { + return root; + } + + /* Поиск узла */ + public TreeNode? Search(int num) { + TreeNode? cur = root; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Целевой узел находится в правом поддереве cur + if (cur.val < num) cur = + cur.right; + // Целевой узел находится в левом поддереве cur + else if (cur.val > num) + cur = cur.left; + // Найти целевой узел и выйти из цикла + else + break; + } + // Вернуть целевой узел + return cur; + } + + /* Вставка узла */ + public void Insert(int num) { + // Если дерево пусто, инициализировать корневой узел + if (root == null) { + root = new TreeNode(num); + return; + } + TreeNode? cur = root, pre = null; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Найти повторяющийся узел и сразу вернуть + if (cur.val == num) + return; + pre = cur; + // Позиция вставки находится в правом поддереве cur + if (cur.val < num) + cur = cur.right; + // Позиция вставки находится в левом поддереве cur + else + cur = cur.left; + } + + // Вставка узла + TreeNode node = new(num); + if (pre != null) { + if (pre.val < num) + pre.right = node; + else + pre.left = node; + } + } + + + /* Удаление узла */ + public void Remove(int num) { + // Если дерево пусто, сразу вернуть + if (root == null) + return; + TreeNode? cur = root, pre = null; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Найти узел для удаления и выйти из цикла + if (cur.val == num) + break; + pre = cur; + // Узел для удаления находится в правом поддереве cur + if (cur.val < num) + cur = cur.right; + // Узел для удаления находится в левом поддереве cur + else + cur = cur.left; + } + // Если узел для удаления отсутствует, сразу вернуть + if (cur == null) + return; + // Число дочерних узлов = 0 или 1 + if (cur.left == null || cur.right == null) { + // Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел + TreeNode? child = cur.left ?? cur.right; + // Удалить узел cur + if (cur != root) { + if (pre!.left == cur) + pre.left = child; + else + pre.right = child; + } else { + // Если удаляемый узел является корнем, заново назначить корневой узел + root = child; + } + } + // Число дочерних узлов = 2 + else { + // Получить следующий узел после cur в симметричном обходе + TreeNode? tmp = cur.right; + while (tmp.left != null) { + tmp = tmp.left; + } + // Рекурсивно удалить узел tmp + Remove(tmp.val!.Value); + // Перезаписать cur значением tmp + cur.val = tmp.val; + } + } +} + +public class binary_search_tree { + [Test] + public void Test() { + /* Инициализация двоичного дерева поиска */ + BinarySearchTree bst = new(); + // Обратите внимание: разные порядки вставки порождают разные двоичные деревья; данная последовательность может построить совершенное двоичное дерево + int[] nums = [8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15]; + foreach (int num in nums) { + bst.Insert(num); + } + + Console.WriteLine("\nИсходное двоичное дерево\n"); + PrintUtil.PrintTree(bst.GetRoot()); + + /* Поиск узла */ + TreeNode? node = bst.Search(7); + Console.WriteLine("\nНайденный объект узла = " + node + ", значение узла = " + node?.val); + + /* Вставка узла */ + bst.Insert(16); + Console.WriteLine("\nПосле вставки узла 16 двоичное дерево имеет вид\n"); + PrintUtil.PrintTree(bst.GetRoot()); + + /* Удаление узла */ + bst.Remove(1); + Console.WriteLine("\nПосле удаления узла 1 двоичное дерево имеет вид\n"); + PrintUtil.PrintTree(bst.GetRoot()); + bst.Remove(2); + Console.WriteLine("\nПосле удаления узла 2 двоичное дерево имеет вид\n"); + PrintUtil.PrintTree(bst.GetRoot()); + bst.Remove(4); + Console.WriteLine("\nПосле удаления узла 4 двоичное дерево имеет вид\n"); + PrintUtil.PrintTree(bst.GetRoot()); + } +} diff --git a/ru/codes/csharp/chapter_tree/binary_tree.cs b/ru/codes/csharp/chapter_tree/binary_tree.cs new file mode 100644 index 000000000..5910e9c75 --- /dev/null +++ b/ru/codes/csharp/chapter_tree/binary_tree.cs @@ -0,0 +1,39 @@ +/** + * File: binary_tree.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_tree; + +public class binary_tree { + [Test] + public void Test() { + /* Инициализация двоичного дерева */ + // Инициализация узла + TreeNode n1 = new(1); + TreeNode n2 = new(2); + TreeNode n3 = new(3); + TreeNode n4 = new(4); + TreeNode n5 = new(5); + // Построить связи между узлами (указатели) + n1.left = n2; + n1.right = n3; + n2.left = n4; + n2.right = n5; + Console.WriteLine("\nИнициализация двоичного дерева\n"); + PrintUtil.PrintTree(n1); + + /* Вставка и удаление узлов */ + TreeNode P = new(0); + // Вставить узел P между n1 -> n2 + n1.left = P; + P.left = n2; + Console.WriteLine("\nПосле вставки узла P\n"); + PrintUtil.PrintTree(n1); + // Удалить узел P + n1.left = n2; + Console.WriteLine("\nПосле удаления узла P\n"); + PrintUtil.PrintTree(n1); + } +} diff --git a/ru/codes/csharp/chapter_tree/binary_tree_bfs.cs b/ru/codes/csharp/chapter_tree/binary_tree_bfs.cs new file mode 100644 index 000000000..13a2ada40 --- /dev/null +++ b/ru/codes/csharp/chapter_tree/binary_tree_bfs.cs @@ -0,0 +1,40 @@ +/** + * File: binary_tree_bfs.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_tree; + +public class binary_tree_bfs { + + /* Обход в ширину */ + List LevelOrder(TreeNode root) { + // Инициализировать очередь и добавить корневой узел + Queue queue = new(); + queue.Enqueue(root); + // Инициализировать список для хранения последовательности обхода + List list = []; + while (queue.Count != 0) { + TreeNode node = queue.Dequeue(); // Извлечение из очереди + list.Add(node.val!.Value); // Сохранить значение узла + if (node.left != null) + queue.Enqueue(node.left); // Поместить левый дочерний узел в очередь + if (node.right != null) + queue.Enqueue(node.right); // Поместить правый дочерний узел в очередь + } + return list; + } + + [Test] + public void Test() { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из массива + TreeNode? root = TreeNode.ListToTree([1, 2, 3, 4, 5, 6, 7]); + Console.WriteLine("\nИнициализация двоичного дерева\n"); + PrintUtil.PrintTree(root); + + List list = LevelOrder(root!); + Console.WriteLine("\nПоследовательность печати узлов при обходе в ширину = " + string.Join(",", list)); + } +} diff --git a/ru/codes/csharp/chapter_tree/binary_tree_dfs.cs b/ru/codes/csharp/chapter_tree/binary_tree_dfs.cs new file mode 100644 index 000000000..3173825e5 --- /dev/null +++ b/ru/codes/csharp/chapter_tree/binary_tree_dfs.cs @@ -0,0 +1,59 @@ +/** + * File: binary_tree_dfs.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.chapter_tree; + +public class binary_tree_dfs { + List list = []; + + /* Предварительный обход */ + void PreOrder(TreeNode? root) { + if (root == null) return; + // Порядок обхода: корень -> левое поддерево -> правое поддерево + list.Add(root.val!.Value); + PreOrder(root.left); + PreOrder(root.right); + } + + /* Симметричный обход */ + void InOrder(TreeNode? root) { + if (root == null) return; + // Порядок обхода: левое поддерево -> корень -> правое поддерево + InOrder(root.left); + list.Add(root.val!.Value); + InOrder(root.right); + } + + /* Обратный обход */ + void PostOrder(TreeNode? root) { + if (root == null) return; + // Порядок обхода: левое поддерево -> правое поддерево -> корень + PostOrder(root.left); + PostOrder(root.right); + list.Add(root.val!.Value); + } + + [Test] + public void Test() { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из массива + TreeNode? root = TreeNode.ListToTree([1, 2, 3, 4, 5, 6, 7]); + Console.WriteLine("\nИнициализация двоичного дерева\n"); + PrintUtil.PrintTree(root); + + list.Clear(); + PreOrder(root); + Console.WriteLine("\nПоследовательность печати узлов при предварительном обходе = " + string.Join(",", list)); + + list.Clear(); + InOrder(root); + Console.WriteLine("\nПоследовательность печати узлов при симметричном обходе = " + string.Join(",", list)); + + list.Clear(); + PostOrder(root); + Console.WriteLine("\nПоследовательность печати узлов при обратном обходе = " + string.Join(",", list)); + } +} diff --git a/ru/codes/csharp/csharp.sln b/ru/codes/csharp/csharp.sln new file mode 100644 index 000000000..0c74ccc53 --- /dev/null +++ b/ru/codes/csharp/csharp.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.002.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "hello-algo", "hello-algo.csproj", "{48B60439-EFDC-4C8F-AE8D-41979958C8AC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {48B60439-EFDC-4C8F-AE8D-41979958C8AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48B60439-EFDC-4C8F-AE8D-41979958C8AC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48B60439-EFDC-4C8F-AE8D-41979958C8AC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48B60439-EFDC-4C8F-AE8D-41979958C8AC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1E773F8A-FF66-4974-820B-FCE9032D19AE} + EndGlobalSection +EndGlobal diff --git a/ru/codes/csharp/hello-algo.csproj b/ru/codes/csharp/hello-algo.csproj new file mode 100644 index 000000000..43817cc38 --- /dev/null +++ b/ru/codes/csharp/hello-algo.csproj @@ -0,0 +1,21 @@ + + + + Exe + net8.0 + hello_algo + enable + enable + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/ru/codes/csharp/utils/ListNode.cs b/ru/codes/csharp/utils/ListNode.cs new file mode 100644 index 000000000..35f1b555c --- /dev/null +++ b/ru/codes/csharp/utils/ListNode.cs @@ -0,0 +1,32 @@ +// File: ListNode.cs +// Created Time: 2022-12-16 +// Author: mingXta (1195669834@qq.com) + +namespace hello_algo.utils; + +/* Узел связного списка */ +public class ListNode(int x) { + public int val = x; + public ListNode? next; + + /* Десериализовать массив в связный список */ + public static ListNode? ArrToLinkedList(int[] arr) { + ListNode dum = new(0); + ListNode head = dum; + foreach (int val in arr) { + head.next = new ListNode(val); + head = head.next; + } + return dum.next; + } + + public override string? ToString() { + List list = []; + var head = this; + while (head != null) { + list.Add(head.val.ToString()); + head = head.next; + } + return string.Join("->", list); + } +} diff --git a/ru/codes/csharp/utils/PrintUtil.cs b/ru/codes/csharp/utils/PrintUtil.cs new file mode 100644 index 000000000..794c6a0e9 --- /dev/null +++ b/ru/codes/csharp/utils/PrintUtil.cs @@ -0,0 +1,132 @@ +/** +* File: PrintUtil.cs +* Created Time: 2022-12-23 +* Author: haptear (haptear@hotmail.com), krahets (krahets@163.com) +*/ + +namespace hello_algo.utils; + +public class Trunk(Trunk? prev, string str) { + public Trunk? prev = prev; + public string str = str; +}; + +public static class PrintUtil { + /* Вывести список */ + public static void PrintList(IList list) { + Console.WriteLine("[" + string.Join(", ", list) + "]"); + } + + public static string PrintList(this IEnumerable list) { + return $"[ {string.Join(", ", list.Select(x => x?.ToString() ?? "null"))} ]"; + } + + /* Вывести матрицу (Array) */ + public static void PrintMatrix(T[][] matrix) { + Console.WriteLine("["); + foreach (T[] row in matrix) { + Console.WriteLine(" " + string.Join(", ", row) + ","); + } + Console.WriteLine("]"); + } + + /* Вывести матрицу (List) */ + public static void PrintMatrix(List> matrix) { + Console.WriteLine("["); + foreach (List row in matrix) { + Console.WriteLine(" " + string.Join(", ", row) + ","); + } + Console.WriteLine("]"); + } + + /* Вывести связный список */ + public static void PrintLinkedList(ListNode? head) { + List list = []; + while (head != null) { + list.Add(head.val.ToString()); + head = head.next; + } + Console.Write(string.Join(" -> ", list)); + } + + /** + * Вывести двоичное дерево + * Этот вывод дерева заимствован из TECHIE DELIGHT + * https://www.techiedelight.com/c-program-print-binary-tree/ + */ + public static void PrintTree(TreeNode? root) { + PrintTree(root, null, false); + } + + /* Вывести двоичное дерево */ + public static void PrintTree(TreeNode? root, Trunk? prev, bool isRight) { + if (root == null) { + return; + } + + string prev_str = " "; + Trunk trunk = new(prev, prev_str); + + PrintTree(root.right, trunk, true); + + if (prev == null) { + trunk.str = "———"; + } else if (isRight) { + trunk.str = "/———"; + prev_str = " |"; + } else { + trunk.str = "\\———"; + prev.str = prev_str; + } + + ShowTrunks(trunk); + Console.WriteLine(" " + root.val); + + if (prev != null) { + prev.str = prev_str; + } + trunk.str = " |"; + + PrintTree(root.left, trunk, false); + } + + public static void ShowTrunks(Trunk? p) { + if (p == null) { + return; + } + + ShowTrunks(p.prev); + Console.Write(p.str); + } + + /* Вывести хеш-таблицу */ + public static void PrintHashMap(Dictionary map) where K : notnull { + foreach (var kv in map.Keys) { + Console.WriteLine(kv.ToString() + " -> " + map[kv]?.ToString()); + } + } + + /* Вывести кучу */ + public static void PrintHeap(Queue queue) { + Console.Write("Массивное представление кучи:"); + List list = [.. queue]; + Console.WriteLine(string.Join(',', list)); + Console.WriteLine("Древовидное представление кучи:"); + TreeNode? tree = TreeNode.ListToTree(list.Cast().ToList()); + PrintTree(tree); + } + + /* Вывести приоритетную очередь */ + public static void PrintHeap(PriorityQueue queue) { + var newQueue = new PriorityQueue(queue.UnorderedItems, queue.Comparer); + Console.Write("Массивное представление кучи:"); + List list = []; + while (newQueue.TryDequeue(out int element, out _)) { + list.Add(element); + } + Console.WriteLine("Древовидное представление кучи:"); + Console.WriteLine(string.Join(',', list.ToList())); + TreeNode? tree = TreeNode.ListToTree(list.Cast().ToList()); + PrintTree(tree); + } +} \ No newline at end of file diff --git a/ru/codes/csharp/utils/TreeNode.cs b/ru/codes/csharp/utils/TreeNode.cs new file mode 100644 index 000000000..481f6df64 --- /dev/null +++ b/ru/codes/csharp/utils/TreeNode.cs @@ -0,0 +1,67 @@ +/** + * File: TreeNode.cs + * Created Time: 2022-12-23 + * Author: haptear (haptear@hotmail.com) + */ + +namespace hello_algo.utils; + +/* Класс узла двоичного дерева */ +public class TreeNode(int? x) { + public int? val = x; // Значение узла + public int height; // Высота узла + public TreeNode? left; // Ссылка на левый дочерний узел + public TreeNode? right; // Ссылка на правый дочерний узел + + // Правила кодирования сериализации см.: + // https://www.hello-algo.com/chapter_tree/array_representation_of_tree/ + // Массивное представление двоичного дерева: + // [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15] + // Связное представление двоичного дерева: + // /——— 15 + // /——— 7 + // /——— 3 + // | \——— 6 + // | \——— 12 + // ——— 1 + // \——— 2 + // | /——— 9 + // \——— 4 + // \——— 8 + + /* Десериализовать список в двоичное дерево: рекурсия */ + static TreeNode? ListToTreeDFS(List arr, int i) { + if (i < 0 || i >= arr.Count || !arr[i].HasValue) { + return null; + } + TreeNode root = new(arr[i]) { + left = ListToTreeDFS(arr, 2 * i + 1), + right = ListToTreeDFS(arr, 2 * i + 2) + }; + return root; + } + + /* Десериализовать список в двоичное дерево */ + public static TreeNode? ListToTree(List arr) { + return ListToTreeDFS(arr, 0); + } + + /* Сериализовать двоичное дерево в список: рекурсия */ + static void TreeToListDFS(TreeNode? root, int i, List res) { + if (root == null) + return; + while (i >= res.Count) { + res.Add(null); + } + res[i] = root.val; + TreeToListDFS(root.left, 2 * i + 1, res); + TreeToListDFS(root.right, 2 * i + 2, res); + } + + /* Сериализовать двоичное дерево в список */ + public static List TreeToList(TreeNode root) { + List res = []; + TreeToListDFS(root, 0, res); + return res; + } +} diff --git a/ru/codes/csharp/utils/Vertex.cs b/ru/codes/csharp/utils/Vertex.cs new file mode 100644 index 000000000..2ea29f0d6 --- /dev/null +++ b/ru/codes/csharp/utils/Vertex.cs @@ -0,0 +1,30 @@ +/** + * File: Vertex.cs + * Created Time: 2023-02-06 + * Author: zjkung1123 (zjkung1123@gmail.com), krahets (krahets@163.com) + */ + +namespace hello_algo.utils; + +/* Класс вершины */ +public class Vertex(int val) { + public int val = val; + + /* На вход подается список значений vals, на выходе возвращается список вершин vets */ + public static Vertex[] ValsToVets(int[] vals) { + Vertex[] vets = new Vertex[vals.Length]; + for (int i = 0; i < vals.Length; i++) { + vets[i] = new Vertex(vals[i]); + } + return vets; + } + + /* На вход подается список вершин vets, на выходе возвращается список значений vals */ + public static List VetsToVals(List vets) { + List vals = []; + foreach (Vertex vet in vets) { + vals.Add(vet.val); + } + return vals; + } +} diff --git a/ru/codes/dart/build.dart b/ru/codes/dart/build.dart new file mode 100644 index 000000000..7bd5b51a1 --- /dev/null +++ b/ru/codes/dart/build.dart @@ -0,0 +1,39 @@ +import 'dart:io'; + +void main() { + Directory foldPath = Directory('codes/dart/'); + List files = foldPath.listSync(); + int totalCount = 0; + int errorCount = 0; + for (var file in files) { + if (file.path.endsWith('build.dart')) continue; + if (file is File && file.path.endsWith('.dart')) { + totalCount++; + try { + Process.runSync('dart', [file.path]); + } catch (e) { + errorCount++; + print('Error: $e'); + print('File: ${file.path}'); + } + } else if (file is Directory) { + List subFiles = file.listSync(); + for (var subFile in subFiles) { + if (subFile is File && subFile.path.endsWith('.dart')) { + totalCount++; + try { + Process.runSync('dart', [subFile.path]); + } catch (e) { + errorCount++; + print('Error: $e'); + print('File: ${file.path}'); + } + } + } + } + } + + print('===== Build Complete ====='); + print('Total: $totalCount'); + print('Error: $errorCount'); +} diff --git a/ru/codes/dart/chapter_array_and_linkedlist/array.dart b/ru/codes/dart/chapter_array_and_linkedlist/array.dart new file mode 100644 index 000000000..e6108f9fe --- /dev/null +++ b/ru/codes/dart/chapter_array_and_linkedlist/array.dart @@ -0,0 +1,105 @@ +/** + * File: array.dart + * Created Time: 2023-01-20 + * Author: Jefferson (JeffersonHuang77@gmail.com) + */ + +// ignore_for_file: unused_local_variable + +import 'dart:math'; + +/* Случайный доступ к элементу */ +int randomAccess(List nums) { + // Случайным образом выбрать число из интервала [0, nums.length) + int randomIndex = Random().nextInt(nums.length); + // Получить и вернуть случайный элемент + int randomNum = nums[randomIndex]; + return randomNum; +} + +/* Увеличить длину массива */ +List extend(List nums, int enlarge) { + // Инициализировать массив увеличенной длины + List res = List.filled(nums.length + enlarge, 0); + // Скопировать все элементы исходного массива в новый массив + for (var i = 0; i < nums.length; i++) { + res[i] = nums[i]; + } + // Вернуть новый массив после расширения + return res; +} + +/* Вставить элемент _num по индексу index в массив */ +void insert(List nums, int _num, int index) { + // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад + for (var i = nums.length - 1; i > index; i--) { + nums[i] = nums[i - 1]; + } + // Присвоить _num элементу по индексу index + nums[index] = _num; +} + +/* Удалить элемент по индексу index */ +void remove(List nums, int index) { + // Сдвинуть все элементы после индекса index на одну позицию вперед + for (var i = index; i < nums.length - 1; i++) { + nums[i] = nums[i + 1]; + } +} + +/* Перебрать элементы массива */ +void traverse(List nums) { + int count = 0; + // Обход массива по индексам + for (var i = 0; i < nums.length; i++) { + count += nums[i]; + } + // Непосредственно обходить элементы массива + for (int _num in nums) { + count += _num; + } + // Перебрать массив методом forEach + nums.forEach((_num) { + count += _num; + }); +} + +/* Найти заданный элемент в массиве */ +int find(List nums, int target) { + for (var i = 0; i < nums.length; i++) { + if (nums[i] == target) return i; + } + return -1; +} + +/* Driver Code */ +void main() { + /* Инициализация массива */ + var arr = List.filled(5, 0); + print('Массив arr = $arr'); + List nums = [1, 3, 2, 5, 4]; + print('Массив nums = $nums'); + + /* Случайный доступ */ + int randomNum = randomAccess(nums); + print('Случайный элемент из nums = $randomNum'); + + /* Расширение длины */ + nums = extend(nums, 3); + print('После увеличения длины массива до 8 nums = $nums'); + + /* Вставка элемента */ + insert(nums, 6, 3); + print('После вставки числа 6 по индексу 3 nums = $nums'); + + /* Удаление элемента */ + remove(nums, 2); + print('После удаления элемента по индексу 2 nums = $nums'); + + /* Обход массива */ + traverse(nums); + + /* Поиск элемента */ + int index = find(nums, 3); + print('Поиск элемента 3 в nums: индекс = $index'); +} diff --git a/ru/codes/dart/chapter_array_and_linkedlist/linked_list.dart b/ru/codes/dart/chapter_array_and_linkedlist/linked_list.dart new file mode 100644 index 000000000..6763176f7 --- /dev/null +++ b/ru/codes/dart/chapter_array_and_linkedlist/linked_list.dart @@ -0,0 +1,83 @@ +/** + * File: linked_list.dart + * Created Time: 2023-01-23 + * Author: Jefferson (JeffersonHuang77@gmail.com) + */ + +import '../utils/list_node.dart'; +import '../utils/print_util.dart'; + +/* Вставить узел P после узла n0 в связном списке */ +void insert(ListNode n0, ListNode P) { + ListNode? n1 = n0.next; + P.next = n1; + n0.next = P; +} + +/* Удалить первый узел после узла n0 в связном списке */ +void remove(ListNode n0) { + if (n0.next == null) return; + // n0 -> P -> n1 + ListNode P = n0.next!; + ListNode? n1 = P.next; + n0.next = n1; +} + +/* Доступ к узлу связного списка по индексу index */ +ListNode? access(ListNode? head, int index) { + for (var i = 0; i < index; i++) { + if (head == null) return null; + head = head.next; + } + return head; +} + +/* Найти в связном списке первый узел со значением target */ +int find(ListNode? head, int target) { + int index = 0; + while (head != null) { + if (head.val == target) { + return index; + } + head = head.next; + index++; + } + return -1; +} + +/* Driver Code */ +void main() { + // Инициализация связного списка + // Инициализация всех узлов + ListNode n0 = ListNode(1); + ListNode n1 = ListNode(3); + ListNode n2 = ListNode(2); + ListNode n3 = ListNode(5); + ListNode n4 = ListNode(4); + // Построить ссылки между узлами + n0.next = n1; + n1.next = n2; + n2.next = n3; + n3.next = n4; + + print('Исходный связный список'); + printLinkedList(n0); + + /* Вставка узла */ + insert(n0, ListNode(0)); + print('Связный список после вставки узла'); + printLinkedList(n0); + + /* Удаление узла */ + remove(n0); + print('Связный список после удаления узла'); + printLinkedList(n0); + + /* Доступ к узлу */ + ListNode? node = access(n0, 3); + print('Значение узла по индексу 3 в связном списке = ${node!.val}'); + + /* Поиск узла */ + int index = find(n0, 2); + print('Индекс узла со значением 2 в связном списке = $index'); +} diff --git a/ru/codes/dart/chapter_array_and_linkedlist/list.dart b/ru/codes/dart/chapter_array_and_linkedlist/list.dart new file mode 100644 index 000000000..e376b8684 --- /dev/null +++ b/ru/codes/dart/chapter_array_and_linkedlist/list.dart @@ -0,0 +1,62 @@ +/** + * File: list.dart + * Created Time: 2023-01-24 + * Author: Jefferson (JeffersonHuang77@gmail.com) + */ + +// ignore_for_file: unused_local_variable + +/* Driver Code */ +void main() { + /* Инициализация списка */ + List nums = [1, 3, 2, 5, 4]; + print('Список nums = $nums'); + + /* Доступ к элементу */ + int _num = nums[1]; + print('Элемент по индексу 1: _num = $_num'); + + /* Обновление элемента */ + nums[1] = 0; + print('После обновления элемента по индексу 1 до 0 nums = $nums'); + + /* Очистить список */ + nums.clear(); + print('После очистки списка nums = $nums'); + + /* Добавление элемента в конец */ + nums.add(1); + nums.add(3); + nums.add(2); + nums.add(5); + nums.add(4); + print('После добавления элементов nums = $nums'); + + /* Вставка элемента в середину */ + nums.insert(3, 6); + print('После вставки числа 6 по индексу 3 nums = $nums'); + + /* Удаление элемента */ + nums.removeAt(3); + print('После удаления элемента по индексу 3 nums = $nums'); + + /* Обходить список по индексам */ + int count = 0; + for (var i = 0; i < nums.length; i++) { + count += nums[i]; + } + /* Непосредственно обходить элементы списка */ + count = 0; + for (var x in nums) { + count += x; + } + + /* Объединить два списка */ + List nums1 = [6, 8, 7, 10, 9]; + nums.addAll(nums1); + print('После конкатенации списка nums1 к nums nums = $nums'); + + /* Отсортировать список */ + nums.sort(); + print('После сортировки списка nums = $nums'); +} diff --git a/ru/codes/dart/chapter_array_and_linkedlist/my_list.dart b/ru/codes/dart/chapter_array_and_linkedlist/my_list.dart new file mode 100644 index 000000000..27f1e9b8d --- /dev/null +++ b/ru/codes/dart/chapter_array_and_linkedlist/my_list.dart @@ -0,0 +1,132 @@ +/** + * File: my_list.dart + * Created Time: 2023-02-05 + * Author: Jefferson (JeffersonHuang77@gmail.com) + */ + +/* Класс списка */ +class MyList { + late List _arr; // Массив (для хранения элементов списка) + int _capacity = 10; // Вместимость списка + int _size = 0; // Длина списка (текущее число элементов) + int _extendRatio = 2; // Коэффициент увеличения списка при каждом расширении + + /* Конструктор */ + MyList() { + _arr = List.filled(_capacity, 0); + } + + /* Получить длину списка (текущее число элементов) */ + int size() => _size; + + /* Получить вместимость списка */ + int capacity() => _capacity; + + /* Доступ к элементу */ + int get(int index) { + if (index >= _size) throw RangeError('индекс выходит за границы'); + return _arr[index]; + } + + /* Обновление элемента */ + void set(int index, int _num) { + if (index >= _size) throw RangeError('индекс выходит за границы'); + _arr[index] = _num; + } + + /* Добавление элемента в конец */ + void add(int _num) { + // При превышении вместимости по числу элементов запускается расширение + if (_size == _capacity) extendCapacity(); + _arr[_size] = _num; + // Обновить число элементов + _size++; + } + + /* Вставка элемента в середину */ + void insert(int index, int _num) { + if (index >= _size) throw RangeError('индекс выходит за границы'); + // При превышении вместимости по числу элементов запускается расширение + if (_size == _capacity) extendCapacity(); + // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад + for (var j = _size - 1; j >= index; j--) { + _arr[j + 1] = _arr[j]; + } + _arr[index] = _num; + // Обновить число элементов + _size++; + } + + /* Удаление элемента */ + int remove(int index) { + if (index >= _size) throw RangeError('индекс выходит за границы'); + int _num = _arr[index]; + // Сдвинуть все элементы после индекса index на одну позицию вперед + for (var j = index; j < _size - 1; j++) { + _arr[j] = _arr[j + 1]; + } + // Обновить число элементов + _size--; + // Вернуть удаленный элемент + return _num; + } + + /* Расширение списка */ + void extendCapacity() { + // Создать новый массив длиной в _extendRatio раз больше исходного массива + final _newNums = List.filled(_capacity * _extendRatio, 0); + // Скопировать исходный массив в новый массив + List.copyRange(_newNums, 0, _arr); + // Обновить ссылку на _arr + _arr = _newNums; + // Обновить вместимость списка + _capacity = _arr.length; + } + + /* Преобразовать список в массив */ + List toArray() { + List arr = []; + for (var i = 0; i < _size; i++) { + arr.add(get(i)); + } + return arr; + } +} + +/* Driver Code */ +void main() { + /* Инициализация списка */ + MyList nums = MyList(); + /* Добавление элемента в конец */ + nums.add(1); + nums.add(3); + nums.add(2); + nums.add(5); + nums.add(4); + print( + 'Список nums = ${nums.toArray()}, вместимость = ${nums.capacity()}, длина = ${nums.size()}'); + + /* Вставка элемента в середину */ + nums.insert(3, 6); + print('После вставки числа 6 по индексу 3 nums = ${nums.toArray()}'); + + /* Удаление элемента */ + nums.remove(3); + print('После удаления элемента по индексу 3 nums = ${nums.toArray()}'); + + /* Доступ к элементу */ + int _num = nums.get(1); + print('Элемент по индексу 1: _num = $_num'); + + /* Обновление элемента */ + nums.set(1, 0); + print('После обновления элемента по индексу 1 до 0 nums = ${nums.toArray()}'); + + /* Проверка механизма расширения */ + for (var i = 0; i < 10; i++) { + // При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения + nums.add(i); + } + print( + 'Список nums после увеличения вместимости = ${nums.toArray()}, вместимость = ${nums.capacity()}, длина = ${nums.size()}'); +} diff --git a/ru/codes/dart/chapter_backtracking/n_queens.dart b/ru/codes/dart/chapter_backtracking/n_queens.dart new file mode 100644 index 000000000..b072d9f59 --- /dev/null +++ b/ru/codes/dart/chapter_backtracking/n_queens.dart @@ -0,0 +1,75 @@ +/** + * File: n_queens.dart + * Created Time: 2023-08-10 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Алгоритм бэктрекинга: n ферзей */ +void backtrack( + int row, + int n, + List> state, + List>> res, + List cols, + List diags1, + List diags2, +) { + // Когда все строки уже обработаны, записать решение + if (row == n) { + List> copyState = []; + for (List sRow in state) { + copyState.add(List.from(sRow)); + } + res.add(copyState); + return; + } + // Обойти все столбцы + for (int col = 0; col < n; col++) { + // Вычислить главную и побочную диагонали, соответствующие этой клетке + int diag1 = row - col + n - 1; + int diag2 = row + col; + // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей + if (!cols[col] && !diags1[diag1] && !diags2[diag2]) { + // Попытка: поставить ферзя в эту клетку + state[row][col] = "Q"; + cols[col] = true; + diags1[diag1] = true; + diags2[diag2] = true; + // Перейти к размещению следующей строки + backtrack(row + 1, n, state, res, cols, diags1, diags2); + // Откат: восстановить эту клетку как пустую + state[row][col] = "#"; + cols[col] = false; + diags1[diag1] = false; + diags2[diag2] = false; + } + } +} + +/* Решить задачу о n ферзях */ +List>> nQueens(int n) { + // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку + List> state = List.generate(n, (index) => List.filled(n, "#")); + List cols = List.filled(n, false); // Отмечать, есть ли ферзь в столбце + List diags1 = List.filled(2 * n - 1, false); // Отмечать наличие ферзя на главной диагонали + List diags2 = List.filled(2 * n - 1, false); // Отмечать наличие ферзя на побочной диагонали + List>> res = []; + + backtrack(0, n, state, res, cols, diags1, diags2); + + return res; +} + +/* Driver Code */ +void main() { + int n = 4; + List>> res = nQueens(n); + print("Размер входной доски = $n"); + print("Количество способов расстановки ферзей: ${res.length}"); + for (List> state in res) { + print("--------------------"); + for (List row in state) { + print(row); + } + } +} diff --git a/ru/codes/dart/chapter_backtracking/permutations_i.dart b/ru/codes/dart/chapter_backtracking/permutations_i.dart new file mode 100644 index 000000000..19071a5e9 --- /dev/null +++ b/ru/codes/dart/chapter_backtracking/permutations_i.dart @@ -0,0 +1,51 @@ +/** + * File: permutations_i.dart + * Created Time: 2023-08-10 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Алгоритм бэктрекинга: все перестановки I */ +void backtrack( + List state, + List choices, + List selected, + List> res, +) { + // Когда длина состояния равна числу элементов, записать решение + if (state.length == choices.length) { + res.add(List.from(state)); + return; + } + // Перебор всех вариантов выбора + for (int i = 0; i < choices.length; i++) { + int choice = choices[i]; + // Отсечение: нельзя выбирать один и тот же элемент повторно + if (!selected[i]) { + // Попытка: сделать выбор и обновить состояние + selected[i] = true; + state.add(choice); + // Перейти к следующему выбору + backtrack(state, choices, selected, res); + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false; + state.removeLast(); + } + } +} + +/* Все перестановки I */ +List> permutationsI(List nums) { + List> res = []; + backtrack([], nums, List.filled(nums.length, false), res); + return res; +} + +/* Driver Code */ +void main() { + List nums = [1, 2, 3]; + + List> res = permutationsI(nums); + + print("Входной массив nums = $nums"); + print("Все перестановки res = $res"); +} diff --git a/ru/codes/dart/chapter_backtracking/permutations_ii.dart b/ru/codes/dart/chapter_backtracking/permutations_ii.dart new file mode 100644 index 000000000..816c442e7 --- /dev/null +++ b/ru/codes/dart/chapter_backtracking/permutations_ii.dart @@ -0,0 +1,53 @@ +/** + * File: permutations_ii.dart + * Created Time: 2023-08-10 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Алгоритм бэктрекинга: все перестановки II */ +void backtrack( + List state, + List choices, + List selected, + List> res, +) { + // Когда длина состояния равна числу элементов, записать решение + if (state.length == choices.length) { + res.add(List.from(state)); + return; + } + // Перебор всех вариантов выбора + Set duplicated = {}; + for (int i = 0; i < choices.length; i++) { + int choice = choices[i]; + // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы + if (!selected[i] && !duplicated.contains(choice)) { + // Попытка: сделать выбор и обновить состояние + duplicated.add(choice); // Записать значения уже выбранных элементов + selected[i] = true; + state.add(choice); + // Перейти к следующему выбору + backtrack(state, choices, selected, res); + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false; + state.removeLast(); + } + } +} + +/* Все перестановки II */ +List> permutationsII(List nums) { + List> res = []; + backtrack([], nums, List.filled(nums.length, false), res); + return res; +} + +/* Driver Code */ +void main() { + List nums = [1, 2, 2]; + + List> res = permutationsII(nums); + + print("Входной массив nums = $nums"); + print("Все перестановки res = $res"); +} diff --git a/ru/codes/dart/chapter_backtracking/preorder_traversal_i_compact.dart b/ru/codes/dart/chapter_backtracking/preorder_traversal_i_compact.dart new file mode 100644 index 000000000..4c3001474 --- /dev/null +++ b/ru/codes/dart/chapter_backtracking/preorder_traversal_i_compact.dart @@ -0,0 +1,35 @@ +/** + * File: preorder_traversal_i_compact.dart + * Created Time: 2023-08-10 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../utils/print_util.dart'; +import '../utils/tree_node.dart'; + +/* Предварительный обход: пример 1 */ +void preOrder(TreeNode? root, List res) { + if (root == null) { + return; + } + if (root.val == 7) { + // Записать решение + res.add(root); + } + preOrder(root.left, res); + preOrder(root.right, res); +} + +/* Driver Code */ +void main() { + TreeNode? root = listToTree([1, 7, 3, 4, 5, 6, 7]); + print("\nИнициализация двоичного дерева"); + printTree(root); + + // Предварительный обход + List res = []; + preOrder(root, res); + + print("\nВсе узлы со значением 7"); + print(List.generate(res.length, (i) => res[i].val)); +} diff --git a/ru/codes/dart/chapter_backtracking/preorder_traversal_ii_compact.dart b/ru/codes/dart/chapter_backtracking/preorder_traversal_ii_compact.dart new file mode 100644 index 000000000..efc949725 --- /dev/null +++ b/ru/codes/dart/chapter_backtracking/preorder_traversal_ii_compact.dart @@ -0,0 +1,47 @@ +/** + * File: preorder_traversal_ii_compact.dart + * Created Time: 2023-08-10 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../utils/print_util.dart'; +import '../utils/tree_node.dart'; + +/* Предварительный обход: пример 2 */ +void preOrder( + TreeNode? root, + List path, + List> res, +) { + if (root == null) { + return; + } + + // Попытка + path.add(root); + if (root.val == 7) { + // Записать решение + res.add(List.from(path)); + } + preOrder(root.left, path, res); + preOrder(root.right, path, res); + // Откат + path.removeLast(); +} + +/* Driver Code */ +void main() { + TreeNode? root = listToTree([1, 7, 3, 4, 5, 6, 7]); + print("\nИнициализация двоичного дерева"); + printTree(root); + + // Предварительный обход + List path = []; + List> res = []; + preOrder(root, path, res); + + print("\nВсе пути от корня к узлу 7"); + for (List vals in res) { + print(List.generate(vals.length, (i) => vals[i].val)); + } +} diff --git a/ru/codes/dart/chapter_backtracking/preorder_traversal_iii_compact.dart b/ru/codes/dart/chapter_backtracking/preorder_traversal_iii_compact.dart new file mode 100644 index 000000000..39a1c4283 --- /dev/null +++ b/ru/codes/dart/chapter_backtracking/preorder_traversal_iii_compact.dart @@ -0,0 +1,47 @@ +/** + * File: preorder_traversal_iii_compact.dart + * Created Time: 2023-08-10 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../utils/print_util.dart'; +import '../utils/tree_node.dart'; + +/* Предварительный обход: пример 3 */ +void preOrder( + TreeNode? root, + List path, + List> res, +) { + if (root == null || root.val == 3) { + return; + } + + // Попытка + path.add(root); + if (root.val == 7) { + // Записать решение + res.add(List.from(path)); + } + preOrder(root.left, path, res); + preOrder(root.right, path, res); + // Откат + path.removeLast(); +} + +/* Driver Code */ +void main() { + TreeNode? root = listToTree([1, 7, 3, 4, 5, 6, 7]); + print("\nИнициализация двоичного дерева"); + printTree(root); + + // Предварительный обход + List path = []; + List> res = []; + preOrder(root, path, res); + + print("\nВсе пути от корня к узлу 7"); + for (List vals in res) { + print(List.generate(vals.length, (i) => vals[i].val)); + } +} diff --git a/ru/codes/dart/chapter_backtracking/preorder_traversal_iii_template.dart b/ru/codes/dart/chapter_backtracking/preorder_traversal_iii_template.dart new file mode 100644 index 000000000..8035177b1 --- /dev/null +++ b/ru/codes/dart/chapter_backtracking/preorder_traversal_iii_template.dart @@ -0,0 +1,73 @@ +/** + * File: preorder_traversal_iii_template.dart + * Created Time: 2023-08-10 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../utils/print_util.dart'; +import '../utils/tree_node.dart'; + +/* Проверить, является ли текущее состояние решением */ +bool isSolution(List state) { + return state.isNotEmpty && state.last.val == 7; +} + +/* Записать решение */ +void recordSolution(List state, List> res) { + res.add(List.from(state)); +} + +/* Проверить, допустим ли этот выбор в текущем состоянии */ +bool isValid(List state, TreeNode? choice) { + return choice != null && choice.val != 3; +} + +/* Обновить состояние */ +void makeChoice(List state, TreeNode? choice) { + state.add(choice!); +} + +/* Восстановить состояние */ +void undoChoice(List state, TreeNode? choice) { + state.removeLast(); +} + +/* Алгоритм бэктрекинга: пример 3 */ +void backtrack( + List state, + List choices, + List> res, +) { + // Проверить, является ли текущее состояние решением + if (isSolution(state)) { + // Записать решение + recordSolution(state, res); + } + // Перебор всех вариантов выбора + for (TreeNode? choice in choices) { + // Отсечение: проверить допустимость выбора + if (isValid(state, choice)) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state, choice); + // Перейти к следующему выбору + backtrack(state, [choice!.left, choice.right], res); + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state, choice); + } + } +} + +/* Driver Code */ +void main() { + TreeNode? root = listToTree([1, 7, 3, 4, 5, 6, 7]); + print("\nИнициализация двоичного дерева"); + printTree(root); + + // Алгоритм бэктрекинга + List> res = []; + backtrack([], [root!], res); + print("\nВсе пути от корня к узлу 7, в которых путь не содержит узлов со значением 3"); + for (List path in res) { + print(List.from(path.map((e) => e.val))); + } +} diff --git a/ru/codes/dart/chapter_backtracking/subset_sum_i.dart b/ru/codes/dart/chapter_backtracking/subset_sum_i.dart new file mode 100644 index 000000000..550e46712 --- /dev/null +++ b/ru/codes/dart/chapter_backtracking/subset_sum_i.dart @@ -0,0 +1,56 @@ +/** + * File: subset_sum_i.dart + * Created Time: 2023-08-10 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +void backtrack( + List state, + int target, + List choices, + int start, + List> res, +) { + // Если сумма подмножества равна target, записать решение + if (target == 0) { + res.add(List.from(state)); + return; + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + for (int i = start; i < choices.length; i++) { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if (target - choices[i] < 0) { + break; + } + // Попытка: сделать выбор и обновить target и start + state.add(choices[i]); + // Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.removeLast(); + } +} + +/* Решить задачу суммы подмножеств I */ +List> subsetSumI(List nums, int target) { + List state = []; // Состояние (подмножество) + nums.sort(); // Отсортировать nums + int start = 0; // Стартовая вершина обхода + List> res = []; // Список результатов (список подмножеств) + backtrack(state, target, nums, start, res); + return res; +} + +/* Driver Code */ +void main() { + List nums = [3, 4, 5]; + int target = 9; + + List> res = subsetSumI(nums, target); + + print("Входной массив nums = $nums, target = $target"); + print("Все подмножества с суммой $target: res = $res"); +} diff --git a/ru/codes/dart/chapter_backtracking/subset_sum_i_naive.dart b/ru/codes/dart/chapter_backtracking/subset_sum_i_naive.dart new file mode 100644 index 000000000..c21adfa6d --- /dev/null +++ b/ru/codes/dart/chapter_backtracking/subset_sum_i_naive.dart @@ -0,0 +1,54 @@ +/** + * File: subset_sum_i_naive.dart + * Created Time: 2023-08-10 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +void backtrack( + List state, + int target, + int total, + List choices, + List> res, +) { + // Если сумма подмножества равна target, записать решение + if (total == target) { + res.add(List.from(state)); + return; + } + // Перебор всех вариантов выбора + for (int i = 0; i < choices.length; i++) { + // Отсечение: если сумма подмножества превышает target, пропустить этот выбор + if (total + choices[i] > target) { + continue; + } + // Попытка: сделать выбор и обновить элемент и total + state.add(choices[i]); + // Перейти к следующему выбору + backtrack(state, target, total + choices[i], choices, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.removeLast(); + } +} + +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */ +List> subsetSumINaive(List nums, int target) { + List state = []; // Состояние (подмножество) + int total = 0; // Сумма элементов + List> res = []; // Список результатов (список подмножеств) + backtrack(state, target, total, nums, res); + return res; +} + +/* Driver Code */ +void main() { + List nums = [3, 4, 5]; + int target = 9; + + List> res = subsetSumINaive(nums, target); + + print("Входной массив nums = $nums, target = $target"); + print("Все подмножества с суммой $target: res = $res"); + print("Обратите внимание: результат этого метода содержит повторяющиеся множества"); +} diff --git a/ru/codes/dart/chapter_backtracking/subset_sum_ii.dart b/ru/codes/dart/chapter_backtracking/subset_sum_ii.dart new file mode 100644 index 000000000..6341b999f --- /dev/null +++ b/ru/codes/dart/chapter_backtracking/subset_sum_ii.dart @@ -0,0 +1,61 @@ +/** + * File: subset_sum_ii.dart + * Created Time: 2023-08-10 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Алгоритм бэктрекинга: сумма подмножеств II */ +void backtrack( + List state, + int target, + List choices, + int start, + List> res, +) { + // Если сумма подмножества равна target, записать решение + if (target == 0) { + res.add(List.from(state)); + return; + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента + for (int i = start; i < choices.length; i++) { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if (target - choices[i] < 0) { + break; + } + // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить + if (i > start && choices[i] == choices[i - 1]) { + continue; + } + // Попытка: сделать выбор и обновить target и start + state.add(choices[i]); + // Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i + 1, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.removeLast(); + } +} + +/* Решить задачу суммы подмножеств II */ +List> subsetSumII(List nums, int target) { + List state = []; // Состояние (подмножество) + nums.sort(); // Отсортировать nums + int start = 0; // Стартовая вершина обхода + List> res = []; // Список результатов (список подмножеств) + backtrack(state, target, nums, start, res); + return res; +} + +/* Driver Code */ +void main() { + List nums = [4, 4, 5]; + int target = 9; + + List> res = subsetSumII(nums, target); + + print("Входной массив nums = $nums, target = $target"); + print("Все подмножества с суммой $target: res = $res"); +} diff --git a/ru/codes/dart/chapter_computational_complexity/iteration.dart b/ru/codes/dart/chapter_computational_complexity/iteration.dart new file mode 100644 index 000000000..bf980be9f --- /dev/null +++ b/ru/codes/dart/chapter_computational_complexity/iteration.dart @@ -0,0 +1,72 @@ +/** + * File: iteration.dart + * Created Time: 2023-08-27 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Цикл for */ +int forLoop(int n) { + int res = 0; + // Циклическое суммирование 1, 2, ..., n-1, n + for (int i = 1; i <= n; i++) { + res += i; + } + return res; +} + +/* Цикл while */ +int whileLoop(int n) { + int res = 0; + int i = 1; // Инициализация условной переменной + // Циклическое суммирование 1, 2, ..., n-1, n + while (i <= n) { + res += i; + i++; // Обновить условную переменную + } + return res; +} + +/* Цикл while (двойное обновление) */ +int whileLoopII(int n) { + int res = 0; + int i = 1; // Инициализация условной переменной + // Циклическое суммирование 1, 4, 10, ... + while (i <= n) { + res += i; + // Обновить условную переменную + i++; + i *= 2; + } + return res; +} + +/* Двойной цикл for */ +String nestedForLoop(int n) { + String res = ""; + // Цикл по i = 1, 2, ..., n-1, n + for (int i = 1; i <= n; i++) { + // Цикл по j = 1, 2, ..., n-1, n + for (int j = 1; j <= n; j++) { + res += "($i, $j), "; + } + } + return res; +} + +/* Driver Code */ +void main() { + int n = 5; + int res; + + res = forLoop(n); + print("\nРезультат суммирования в цикле for res = $res"); + + res = whileLoop(n); + print("\nРезультат суммирования в цикле while res = $res"); + + res = whileLoopII(n); + print("\nРезультат суммирования в цикле while (двойное обновление) res = $res"); + + String resStr = nestedForLoop(n); + print("\nРезультат двойного цикла for $resStr"); +} diff --git a/ru/codes/dart/chapter_computational_complexity/recursion.dart b/ru/codes/dart/chapter_computational_complexity/recursion.dart new file mode 100644 index 000000000..a98231a6b --- /dev/null +++ b/ru/codes/dart/chapter_computational_complexity/recursion.dart @@ -0,0 +1,70 @@ +/** + * File: recursion.dart + * Created Time: 2023-08-27 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Рекурсия */ +int recur(int n) { + // Условие завершения + if (n == 1) return 1; + // Рекурсия: рекурсивный вызов + int res = recur(n - 1); + // Возврат: вернуть результат + return n + res; +} + +/* Имитация рекурсии итерацией */ +int forLoopRecur(int n) { + // Использовать явный стек для имитации системного стека вызовов + List stack = []; + int res = 0; + // Рекурсия: рекурсивный вызов + for (int i = n; i > 0; i--) { + // Имитировать «рекурсию» с помощью операции помещения в стек + stack.add(i); + } + // Возврат: вернуть результат + while (!stack.isEmpty) { + // Имитировать «возврат» с помощью операции извлечения из стека + res += stack.removeLast(); + } + // res = 1+2+3+...+n + return res; +} + +/* Хвостовая рекурсия */ +int tailRecur(int n, int res) { + // Условие завершения + if (n == 0) return res; + // Хвостовой рекурсивный вызов + return tailRecur(n - 1, res + n); +} + +/* Последовательность Фибоначчи: рекурсия */ +int fib(int n) { + // Условие завершения: f(1) = 0, f(2) = 1 + if (n == 1 || n == 2) return n - 1; + // Рекурсивный вызов f(n) = f(n-1) + f(n-2) + int res = fib(n - 1) + fib(n - 2); + // Вернуть результат f(n) + return res; +} + +/* Driver Code */ +void main() { + int n = 5; + int res; + + res = recur(n); + print("\nРезультат суммирования в рекурсивной функции res = $res"); + + res = tailRecur(n, 0); + print("\nРезультат суммирования в хвостовой рекурсии res = $res"); + + res = forLoopRecur(n); + print("\nРезультат суммирования при имитации рекурсии итерацией res = $res"); + + res = fib(n); + print("\nЧлен последовательности Фибоначчи с номером $n = $res"); +} diff --git a/ru/codes/dart/chapter_computational_complexity/space_complexity.dart b/ru/codes/dart/chapter_computational_complexity/space_complexity.dart new file mode 100644 index 000000000..de17009d4 --- /dev/null +++ b/ru/codes/dart/chapter_computational_complexity/space_complexity.dart @@ -0,0 +1,106 @@ +/** + * File: space_complexity.dart + * Created Time: 2023-2-12 + * Author: Jefferson (JeffersonHuang77@gmail.com) + */ + +// ignore_for_file: unused_local_variable + +import 'dart:collection'; +import '../utils/list_node.dart'; +import '../utils/print_util.dart'; +import '../utils/tree_node.dart'; + +/* Функция */ +int function() { + // Выполнить некоторые операции + return 0; +} + +/* Постоянная сложность */ +void constant(int n) { + // Константы, переменные и объекты занимают O(1) памяти + final int a = 0; + int b = 0; + List nums = List.filled(10000, 0); + ListNode node = ListNode(0); + // Переменные в цикле занимают O(1) памяти + for (var i = 0; i < n; i++) { + int c = 0; + } + // Функции в цикле занимают O(1) памяти + for (var i = 0; i < n; i++) { + function(); + } +} + +/* Линейная сложность */ +void linear(int n) { + // Массив длины n занимает O(n) памяти + List nums = List.filled(n, 0); + // Список длины n занимает O(n) памяти + List nodes = []; + for (var i = 0; i < n; i++) { + nodes.add(ListNode(i)); + } + // Хеш-таблица длины n занимает O(n) памяти + Map map = HashMap(); + for (var i = 0; i < n; i++) { + map.putIfAbsent(i, () => i.toString()); + } +} + +/* Линейная сложность (рекурсивная реализация) */ +void linearRecur(int n) { + print('Рекурсия n = $n'); + if (n == 1) return; + linearRecur(n - 1); +} + +/* Квадратичная сложность */ +void quadratic(int n) { + // Матрица занимает O(n^2) памяти + List> numMatrix = List.generate(n, (_) => List.filled(n, 0)); + // Двумерный список занимает O(n^2) памяти + List> numList = []; + for (var i = 0; i < n; i++) { + List tmp = []; + for (int j = 0; j < n; j++) { + tmp.add(0); + } + numList.add(tmp); + } +} + +/* Квадратичная сложность (рекурсивная реализация) */ +int quadraticRecur(int n) { + if (n <= 0) return 0; + List nums = List.filled(n, 0); + print('В рекурсии n = $n длина nums = ${nums.length}'); + return quadraticRecur(n - 1); +} + +/* Экспоненциальная сложность (построение полного двоичного дерева) */ +TreeNode? buildTree(int n) { + if (n == 0) return null; + TreeNode root = TreeNode(0); + root.left = buildTree(n - 1); + root.right = buildTree(n - 1); + return root; +} + +/* Driver Code */ +void main() { + int n = 5; + // Постоянная сложность + constant(n); + // Линейная сложность + linear(n); + linearRecur(n); + // Квадратичная сложность + quadratic(n); + quadraticRecur(n); + // Экспоненциальная сложность + TreeNode? root = buildTree(n); + printTree(root); +} diff --git a/ru/codes/dart/chapter_computational_complexity/time_complexity.dart b/ru/codes/dart/chapter_computational_complexity/time_complexity.dart new file mode 100644 index 000000000..22916c7f9 --- /dev/null +++ b/ru/codes/dart/chapter_computational_complexity/time_complexity.dart @@ -0,0 +1,165 @@ +/** + * File: time_complexity.dart + * Created Time: 2023-02-12 + * Author: Jefferson (JeffersonHuang77@gmail.com) + */ + +// ignore_for_file: unused_local_variable + +/* Постоянная сложность */ +int constant(int n) { + int count = 0; + int size = 100000; + for (var i = 0; i < size; i++) { + count++; + } + return count; +} + +/* Линейная сложность */ +int linear(int n) { + int count = 0; + for (var i = 0; i < n; i++) { + count++; + } + return count; +} + +/* Линейная сложность (обход массива) */ +int arrayTraversal(List nums) { + int count = 0; + // Число итераций пропорционально длине массива + for (var _num in nums) { + count++; + } + return count; +} + +/* Квадратичная сложность */ +int quadratic(int n) { + int count = 0; + // Число итераций квадратично зависит от размера данных n + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + count++; + } + } + return count; +} + +/* Квадратичная сложность (пузырьковая сортировка) */ +int bubbleSort(List nums) { + int count = 0; // Счетчик + // Внешний цикл: неотсортированный диапазон [0, i] + for (var i = nums.length - 1; i > 0; i--) { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (var j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + int tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + count += 3; // Обмен элементов включает 3 элементарные операции + } + } + } + return count; +} + +/* Экспоненциальная сложность (итеративная реализация) */ +int exponential(int n) { + int count = 0, base = 1; + // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1) + for (var i = 0; i < n; i++) { + for (var j = 0; j < base; j++) { + count++; + } + base *= 2; + } + // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1 + return count; +} + +/* Экспоненциальная сложность (рекурсивная реализация) */ +int expRecur(int n) { + if (n == 1) return 1; + return expRecur(n - 1) + expRecur(n - 1) + 1; +} + +/* Логарифмическая сложность (итеративная реализация) */ +int logarithmic(int n) { + int count = 0; + while (n > 1) { + n = n ~/ 2; + count++; + } + return count; +} + +/* Логарифмическая сложность (рекурсивная реализация) */ +int logRecur(int n) { + if (n <= 1) return 0; + return logRecur(n ~/ 2) + 1; +} + +/* Линейно-логарифмическая сложность */ +int linearLogRecur(int n) { + if (n <= 1) return 1; + int count = linearLogRecur(n ~/ 2) + linearLogRecur(n ~/ 2); + for (var i = 0; i < n; i++) { + count++; + } + return count; +} + +/* Факториальная сложность (рекурсивная реализация) */ +int factorialRecur(int n) { + if (n == 0) return 1; + int count = 0; + // Из одного получается n + for (var i = 0; i < n; i++) { + count += factorialRecur(n - 1); + } + return count; +} + +/* Driver Code */ +void main() { + // Можно изменить n и запустить программу, чтобы увидеть, как меняется число операций при разных сложностях + int n = 8; + print('Размер входных данных n = $n'); + + int count = constant(n); + print('Число операций константной сложности = $count'); + + count = linear(n); + print('Число операций линейной сложности = $count'); + + count = arrayTraversal(List.filled(n, 0)); + print('Число операций линейной сложности (обход массива) = $count'); + + count = quadratic(n); + print('Число операций квадратичной сложности = $count'); + final nums = List.filled(n, 0); + for (int i = 0; i < n; i++) { + nums[i] = n - i; // [n,n-1,...,2,1] + } + count = bubbleSort(nums); + print('Число операций квадратичной сложности (пузырьковая сортировка) = $count'); + + count = exponential(n); + print('Число операций экспоненциальной сложности (итеративная реализация) = $count'); + count = expRecur(n); + print('Число операций экспоненциальной сложности (рекурсивная реализация) = $count'); + + count = logarithmic(n); + print('Число операций логарифмической сложности (итеративная реализация) = $count'); + count = logRecur(n); + print('Число операций логарифмической сложности (рекурсивная реализация) = $count'); + + count = linearLogRecur(n); + print('Число операций линейно-логарифмической сложности (рекурсивная реализация) = $count'); + + count = factorialRecur(n); + print('Число операций факториальной сложности (рекурсивная реализация) = $count'); +} diff --git a/ru/codes/dart/chapter_computational_complexity/worst_best_time_complexity.dart b/ru/codes/dart/chapter_computational_complexity/worst_best_time_complexity.dart new file mode 100644 index 000000000..73256fcb2 --- /dev/null +++ b/ru/codes/dart/chapter_computational_complexity/worst_best_time_complexity.dart @@ -0,0 +1,40 @@ +/** + * File: worst_best_time_complexity.dart + * Created Time: 2023-02-12 + * Author: Jefferson (JeffersonHuang77@gmail.com) + */ + +/* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */ +List randomNumbers(int n) { + final nums = List.filled(n, 0); + // Создать массив nums = { 1, 2, 3, ..., n } + for (var i = 0; i < n; i++) { + nums[i] = i + 1; + } + // Случайно перемешать элементы массива + nums.shuffle(); + + return nums; +} + +/* Найти индекс числа 1 в массиве nums */ +int findOne(List nums) { + for (var i = 0; i < nums.length; i++) { + // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1) + // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n) + if (nums[i] == 1) return i; + } + + return -1; +} + +/* Driver Code */ +void main() { + for (var i = 0; i < 10; i++) { + int n = 100; + final nums = randomNumbers(n); + int index = findOne(nums); + print('\nМассив [1, 2, ..., n] после перемешивания = $nums'); + print('Индекс числа 1 = $index'); + } +} diff --git a/ru/codes/dart/chapter_divide_and_conquer/binary_search_recur.dart b/ru/codes/dart/chapter_divide_and_conquer/binary_search_recur.dart new file mode 100644 index 000000000..a927c7be4 --- /dev/null +++ b/ru/codes/dart/chapter_divide_and_conquer/binary_search_recur.dart @@ -0,0 +1,42 @@ +/** + * File: binary_search_recur.dart + * Created Time: 2023-08-10 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Бинарный поиск: задача f(i, j) */ +int dfs(List nums, int target, int i, int j) { + // Если интервал пуст, целевой элемент отсутствует, вернуть -1 + if (i > j) { + return -1; + } + // Вычислить индекс середины m + int m = (i + j) ~/ 2; + if (nums[m] < target) { + // Рекурсивная подзадача f(m+1, j) + return dfs(nums, target, m + 1, j); + } else if (nums[m] > target) { + // Рекурсивная подзадача f(i, m-1) + return dfs(nums, target, i, m - 1); + } else { + // Целевой элемент найден, вернуть его индекс + return m; + } +} + +/* Бинарный поиск */ +int binarySearch(List nums, int target) { + int n = nums.length; + // Решить задачу f(0, n-1) + return dfs(nums, target, 0, n - 1); +} + +/* Driver Code */ +void main() { + int target = 6; + List nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; + + // Бинарный поиск (двусторонне замкнутый интервал) + int index = binarySearch(nums, target); + print("Индекс целевого элемента 6 = $index"); +} diff --git a/ru/codes/dart/chapter_divide_and_conquer/build_tree.dart b/ru/codes/dart/chapter_divide_and_conquer/build_tree.dart new file mode 100644 index 000000000..3af3e307a --- /dev/null +++ b/ru/codes/dart/chapter_divide_and_conquer/build_tree.dart @@ -0,0 +1,55 @@ +/** + * File: build_tree.dart + * Created Time: 2023-08-10 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../utils/print_util.dart'; +import '../utils/tree_node.dart'; + +/* Построить двоичное дерево: разделяй и властвуй */ +TreeNode? dfs( + List preorder, + Map inorderMap, + int i, + int l, + int r, +) { + // Завершить при пустом диапазоне поддерева + if (r - l < 0) { + return null; + } + // Инициализировать корневой узел + TreeNode? root = TreeNode(preorder[i]); + // Найти m, чтобы разделить левое и правое поддеревья + int m = inorderMap[preorder[i]]!; + // Подзадача: построить левое поддерево + root.left = dfs(preorder, inorderMap, i + 1, l, m - 1); + // Подзадача: построить правое поддерево + root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r); + // Вернуть корневой узел + return root; +} + +/* Построить двоичное дерево */ +TreeNode? buildTree(List preorder, List inorder) { + // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам + Map inorderMap = {}; + for (int i = 0; i < inorder.length; i++) { + inorderMap[inorder[i]] = i; + } + TreeNode? root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1); + return root; +} + +/* Driver Code */ +void main() { + List preorder = [3, 9, 2, 1, 7]; + List inorder = [9, 3, 1, 2, 7]; + print("Предварительный обход = $preorder"); + print("Симметричный обход = $inorder"); + + TreeNode? root = buildTree(preorder, inorder); + print("Построенное двоичное дерево:"); + printTree(root!); +} diff --git a/ru/codes/dart/chapter_divide_and_conquer/hanota.dart b/ru/codes/dart/chapter_divide_and_conquer/hanota.dart new file mode 100644 index 000000000..fe00cd1f4 --- /dev/null +++ b/ru/codes/dart/chapter_divide_and_conquer/hanota.dart @@ -0,0 +1,54 @@ +/** + * File: hanota.dart + * Created Time: 2023-08-10 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Переместить один диск */ +void move(List src, List tar) { + // Снять диск с вершины src + int pan = src.removeLast(); + // Положить диск на вершину tar + tar.add(pan); +} + +/* Решить задачу Ханойской башни f(i) */ +void dfs(int i, List src, List buf, List tar) { + // Если в src остался только один диск, сразу переместить его в tar + if (i == 1) { + move(src, tar); + return; + } + // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar + dfs(i - 1, src, tar, buf); + // Подзадача f(1): переместить оставшийся один диск из src в tar + move(src, tar); + // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src + dfs(i - 1, buf, src, tar); +} + +/* Решить задачу Ханойской башни */ +void solveHanota(List A, List B, List C) { + int n = A.length; + // Переместить верхние n дисков из A в C с помощью B + dfs(n, A, B, C); +} + +/* Driver Code */ +void main() { + // Хвост списка соответствует вершине столбца + List A = [5, 4, 3, 2, 1]; + List B = []; + List C = []; + print("Исходное состояние:"); + print("A = $A"); + print("B = $B"); + print("C = $C"); + + solveHanota(A, B, C); + + print("После завершения перемещения дисков:"); + print("A = $A"); + print("B = $B"); + print("C = $C"); +} diff --git a/ru/codes/dart/chapter_dynamic_programming/climbing_stairs_backtrack.dart b/ru/codes/dart/chapter_dynamic_programming/climbing_stairs_backtrack.dart new file mode 100644 index 000000000..35533da5b --- /dev/null +++ b/ru/codes/dart/chapter_dynamic_programming/climbing_stairs_backtrack.dart @@ -0,0 +1,39 @@ +/** + * File: climbing_stairs_backtrack.dart + * Created Time: 2023-08-11 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Бэктрекинг */ +void backtrack(List choices, int state, int n, List res) { + // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1 + if (state == n) { + res[0]++; + } + // Перебор всех вариантов выбора + for (int choice in choices) { + // Отсечение: нельзя выходить за n-ю ступень + if (state + choice > n) continue; + // Попытка: сделать выбор и обновить состояние + backtrack(choices, state + choice, n, res); + // Откат + } +} + +/* Подъем по лестнице: бэктрекинг */ +int climbingStairsBacktrack(int n) { + List choices = [1, 2]; // Можно подняться на 1 или 2 ступени + int state = 0; // Начать подъем с 0-й ступени + List res = []; + res.add(0); // Использовать res[0] для хранения числа решений + backtrack(choices, state, n, res); + return res[0]; +} + +/* Driver Code */ +void main() { + int n = 9; + + int res = climbingStairsBacktrack(n); + print("Количество способов подняться по лестнице из $n ступеней = $res"); +} diff --git a/ru/codes/dart/chapter_dynamic_programming/climbing_stairs_constraint_dp.dart b/ru/codes/dart/chapter_dynamic_programming/climbing_stairs_constraint_dp.dart new file mode 100644 index 000000000..a3e495eea --- /dev/null +++ b/ru/codes/dart/chapter_dynamic_programming/climbing_stairs_constraint_dp.dart @@ -0,0 +1,33 @@ +/** + * File: climbing_stairs_constraint_dp.dart + * Created Time: 2023-08-11 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Подъем по лестнице с ограничениями: динамическое программирование */ +int climbingStairsConstraintDP(int n) { + if (n == 1 || n == 2) { + return 1; + } + // Инициализация таблицы dp для хранения решений подзадач + List> dp = List.generate(n + 1, (index) => List.filled(3, 0)); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1][1] = 1; + dp[1][2] = 0; + dp[2][1] = 0; + dp[2][2] = 1; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (int i = 3; i <= n; i++) { + dp[i][1] = dp[i - 1][2]; + dp[i][2] = dp[i - 2][1] + dp[i - 2][2]; + } + return dp[n][1] + dp[n][2]; +} + +/* Driver Code */ +void main() { + int n = 9; + + int res = climbingStairsConstraintDP(n); + print("Количество способов подняться по лестнице из $n ступеней = $res"); +} diff --git a/ru/codes/dart/chapter_dynamic_programming/climbing_stairs_dfs.dart b/ru/codes/dart/chapter_dynamic_programming/climbing_stairs_dfs.dart new file mode 100644 index 000000000..e1747d55d --- /dev/null +++ b/ru/codes/dart/chapter_dynamic_programming/climbing_stairs_dfs.dart @@ -0,0 +1,27 @@ +/** + * File: climbing_stairs_dfs.dart + * Created Time: 2023-08-11 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Поиск */ +int dfs(int i) { + // dp[1] и dp[2] уже известны, вернуть их + if (i == 1 || i == 2) return i; + // dp[i] = dp[i-1] + dp[i-2] + int count = dfs(i - 1) + dfs(i - 2); + return count; +} + +/* Подъем по лестнице: поиск */ +int climbingStairsDFS(int n) { + return dfs(n); +} + +/* Driver Code */ +void main() { + int n = 9; + + int res = climbingStairsDFS(n); + print("Количество способов подняться по лестнице из $n ступеней = $res"); +} diff --git a/ru/codes/dart/chapter_dynamic_programming/climbing_stairs_dfs_mem.dart b/ru/codes/dart/chapter_dynamic_programming/climbing_stairs_dfs_mem.dart new file mode 100644 index 000000000..bd7569deb --- /dev/null +++ b/ru/codes/dart/chapter_dynamic_programming/climbing_stairs_dfs_mem.dart @@ -0,0 +1,33 @@ +/** + * File: climbing_stairs_dfs_mem.dart + * Created Time: 2023-08-11 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Поиск с мемоизацией */ +int dfs(int i, List mem) { + // dp[1] и dp[2] уже известны, вернуть их + if (i == 1 || i == 2) return i; + // Если запись dp[i] существует, сразу вернуть ее + if (mem[i] != -1) return mem[i]; + // dp[i] = dp[i-1] + dp[i-2] + int count = dfs(i - 1, mem) + dfs(i - 2, mem); + // Сохранить dp[i] + mem[i] = count; + return count; +} + +/* Подъем по лестнице: поиск с мемоизацией */ +int climbingStairsDFSMem(int n) { + // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи + List mem = List.filled(n + 1, -1); + return dfs(n, mem); +} + +/* Driver Code */ +void main() { + int n = 9; + + int res = climbingStairsDFSMem(n); + print("Количество способов подняться по лестнице из $n ступеней = $res"); +} diff --git a/ru/codes/dart/chapter_dynamic_programming/climbing_stairs_dp.dart b/ru/codes/dart/chapter_dynamic_programming/climbing_stairs_dp.dart new file mode 100644 index 000000000..94c4585a3 --- /dev/null +++ b/ru/codes/dart/chapter_dynamic_programming/climbing_stairs_dp.dart @@ -0,0 +1,43 @@ +/** + * File: climbing_stairs_dp.dart + * Created Time: 2023-08-11 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Подъем по лестнице: динамическое программирование */ +int climbingStairsDP(int n) { + if (n == 1 || n == 2) return n; + // Инициализация таблицы dp для хранения решений подзадач + List dp = List.filled(n + 1, 0); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = 1; + dp[2] = 2; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (int i = 3; i <= n; i++) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + return dp[n]; +} + +/* Подъем по лестнице: динамическое программирование с оптимизацией памяти */ +int climbingStairsDPComp(int n) { + if (n == 1 || n == 2) return n; + int a = 1, b = 2; + for (int i = 3; i <= n; i++) { + int tmp = b; + b = a + b; + a = tmp; + } + return b; +} + +/* Driver Code */ +void main() { + int n = 9; + + int res = climbingStairsDP(n); + print("Количество способов подняться по лестнице из $n ступеней = $res"); + + res = climbingStairsDPComp(n); + print("Количество способов подняться по лестнице из $n ступеней = $res"); +} diff --git a/ru/codes/dart/chapter_dynamic_programming/coin_change.dart b/ru/codes/dart/chapter_dynamic_programming/coin_change.dart new file mode 100644 index 000000000..b1d4ac034 --- /dev/null +++ b/ru/codes/dart/chapter_dynamic_programming/coin_change.dart @@ -0,0 +1,68 @@ +/** + * File: coin_change.dart + * Created Time: 2023-08-11 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import 'dart:math'; + +/* Размен монет: динамическое программирование */ +int coinChangeDP(List coins, int amt) { + int n = coins.length; + int MAX = amt + 1; + // Инициализация таблицы dp + List> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0)); + // Переход состояний: первая строка и первый столбец + for (int a = 1; a <= amt; a++) { + dp[0][a] = MAX; + } + // Переход состояний: остальные строки и столбцы + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1); + } + } + } + return dp[n][amt] != MAX ? dp[n][amt] : -1; +} + +/* Размен монет: динамическое программирование с оптимизацией памяти */ +int coinChangeDPComp(List coins, int amt) { + int n = coins.length; + int MAX = amt + 1; + // Инициализация таблицы dp + List dp = List.filled(amt + 1, MAX); + dp[0] = 0; + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1); + } + } + } + return dp[amt] != MAX ? dp[amt] : -1; +} + +/* Driver Code */ +void main() { + List coins = [1, 2, 5]; + int amt = 4; + + // Динамическое программирование + int res = coinChangeDP(coins, amt); + print("Минимальное число монет для набора целевой суммы = $res"); + + // Динамическое программирование с оптимизацией памяти + res = coinChangeDPComp(coins, amt); + print("Минимальное число монет для набора целевой суммы = $res"); +} diff --git a/ru/codes/dart/chapter_dynamic_programming/coin_change_ii.dart b/ru/codes/dart/chapter_dynamic_programming/coin_change_ii.dart new file mode 100644 index 000000000..009d69179 --- /dev/null +++ b/ru/codes/dart/chapter_dynamic_programming/coin_change_ii.dart @@ -0,0 +1,64 @@ +/** + * File: coin_change_ii.dart + * Created Time: 2023-08-11 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Размен монет II: динамическое программирование */ +int coinChangeIIDP(List coins, int amt) { + int n = coins.length; + // Инициализация таблицы dp + List> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0)); + // Инициализация первого столбца + for (int i = 0; i <= n; i++) { + dp[i][0] = 1; + } + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a]; + } else { + // Сумма двух решений: не брать или взять монету i + dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]; + } + } + } + return dp[n][amt]; +} + +/* Размен монет II: динамическое программирование с оптимизацией памяти */ +int coinChangeIIDPComp(List coins, int amt) { + int n = coins.length; + // Инициализация таблицы dp + List dp = List.filled(amt + 1, 0); + dp[0] = 1; + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Сумма двух решений: не брать или взять монету i + dp[a] = dp[a] + dp[a - coins[i - 1]]; + } + } + } + return dp[amt]; +} + +/* Driver Code */ +void main() { + List coins = [1, 2, 5]; + int amt = 5; + + // Динамическое программирование + int res = coinChangeIIDP(coins, amt); + print("Количество комбинаций монет для набора целевой суммы = $res"); + + // Динамическое программирование с оптимизацией памяти + res = coinChangeIIDPComp(coins, amt); + print("Количество комбинаций монет для набора целевой суммы = $res"); +} diff --git a/ru/codes/dart/chapter_dynamic_programming/edit_distance.dart b/ru/codes/dart/chapter_dynamic_programming/edit_distance.dart new file mode 100644 index 000000000..83df45386 --- /dev/null +++ b/ru/codes/dart/chapter_dynamic_programming/edit_distance.dart @@ -0,0 +1,125 @@ +/** + * File: edit_distance.dart + * Created Time: 2023-08-11 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import 'dart:math'; + +/* Редакционное расстояние: полный перебор */ +int editDistanceDFS(String s, String t, int i, int j) { + // Если s и t пусты, вернуть 0 + if (i == 0 && j == 0) return 0; + // Если s пусто, вернуть длину t + if (i == 0) return j; + // Если t пусто, вернуть длину s + if (j == 0) return i; + // Если два символа равны, сразу пропустить их + if (s[i - 1] == t[j - 1]) return editDistanceDFS(s, t, i - 1, j - 1); + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + int insert = editDistanceDFS(s, t, i, j - 1); + int delete = editDistanceDFS(s, t, i - 1, j); + int replace = editDistanceDFS(s, t, i - 1, j - 1); + // Вернуть минимальное число шагов редактирования + return min(min(insert, delete), replace) + 1; +} + +/* Редакционное расстояние: поиск с мемоизацией */ +int editDistanceDFSMem(String s, String t, List> mem, int i, int j) { + // Если s и t пусты, вернуть 0 + if (i == 0 && j == 0) return 0; + // Если s пусто, вернуть длину t + if (i == 0) return j; + // Если t пусто, вернуть длину s + if (j == 0) return i; + // Если запись уже есть, сразу вернуть ее + if (mem[i][j] != -1) return mem[i][j]; + // Если два символа равны, сразу пропустить их + if (s[i - 1] == t[j - 1]) return editDistanceDFSMem(s, t, mem, i - 1, j - 1); + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + int insert = editDistanceDFSMem(s, t, mem, i, j - 1); + int delete = editDistanceDFSMem(s, t, mem, i - 1, j); + int replace = editDistanceDFSMem(s, t, mem, i - 1, j - 1); + // Сохранить и вернуть минимальное число шагов редактирования + mem[i][j] = min(min(insert, delete), replace) + 1; + return mem[i][j]; +} + +/* Редакционное расстояние: динамическое программирование */ +int editDistanceDP(String s, String t) { + int n = s.length, m = t.length; + List> dp = List.generate(n + 1, (_) => List.filled(m + 1, 0)); + // Переход состояний: первая строка и первый столбец + for (int i = 1; i <= n; i++) { + dp[i][0] = i; + } + for (int j = 1; j <= m; j++) { + dp[0][j] = j; + } + // Переход состояний: остальные строки и столбцы + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= m; j++) { + if (s[i - 1] == t[j - 1]) { + // Если два символа равны, сразу пропустить их + dp[i][j] = dp[i - 1][j - 1]; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1; + } + } + } + return dp[n][m]; +} + +/* Редакционное расстояние: динамическое программирование с оптимизацией памяти */ +int editDistanceDPComp(String s, String t) { + int n = s.length, m = t.length; + List dp = List.filled(m + 1, 0); + // Переход состояний: первая строка + for (int j = 1; j <= m; j++) { + dp[j] = j; + } + // Переход состояний: остальные строки + for (int i = 1; i <= n; i++) { + // Переход состояний: первый столбец + int leftup = dp[0]; // Временно сохранить dp[i-1, j-1] + dp[0] = i; + // Переход состояний: остальные столбцы + for (int j = 1; j <= m; j++) { + int temp = dp[j]; + if (s[i - 1] == t[j - 1]) { + // Если два символа равны, сразу пропустить их + dp[j] = leftup; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1; + } + leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации + } + } + return dp[m]; +} + +/* Driver Code */ +void main() { + String s = "bag"; + String t = "pack"; + int n = s.length, m = t.length; + + // Полный перебор + int res = editDistanceDFS(s, t, n, m); + print("Чтобы преобразовать " + s + " в " + t + ", нужно минимум $res шагов"); + + // Поиск с мемоизацией + List> mem = List.generate(n + 1, (_) => List.filled(m + 1, -1)); + res = editDistanceDFSMem(s, t, mem, n, m); + print("Чтобы преобразовать " + s + " в " + t + ", нужно минимум $res шагов"); + + // Динамическое программирование + res = editDistanceDP(s, t); + print("Чтобы преобразовать " + s + " в " + t + ", нужно минимум $res шагов"); + + // Динамическое программирование с оптимизацией памяти + res = editDistanceDPComp(s, t); + print("Чтобы преобразовать " + s + " в " + t + ", нужно минимум $res шагов"); +} diff --git a/ru/codes/dart/chapter_dynamic_programming/knapsack.dart b/ru/codes/dart/chapter_dynamic_programming/knapsack.dart new file mode 100644 index 000000000..d4a109a07 --- /dev/null +++ b/ru/codes/dart/chapter_dynamic_programming/knapsack.dart @@ -0,0 +1,116 @@ +/** + * File: knapsack.dart + * Created Time: 2023-08-11 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import 'dart:math'; + +/* Рюкзак 0-1: полный перебор */ +int knapsackDFS(List wgt, List val, int i, int c) { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i == 0 || c == 0) { + return 0; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (wgt[i - 1] > c) { + return knapsackDFS(wgt, val, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + int no = knapsackDFS(wgt, val, i - 1, c); + int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]; + // Вернуть вариант с большей стоимостью из двух возможных + return max(no, yes); +} + +/* Рюкзак 0-1: поиск с мемоизацией */ +int knapsackDFSMem( + List wgt, + List val, + List> mem, + int i, + int c, +) { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i == 0 || c == 0) { + return 0; + } + // Если запись уже есть, вернуть сразу + if (mem[i][c] != -1) { + return mem[i][c]; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (wgt[i - 1] > c) { + return knapsackDFSMem(wgt, val, mem, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + int no = knapsackDFSMem(wgt, val, mem, i - 1, c); + int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]; + // Сохранить и вернуть вариант с большей стоимостью из двух решений + mem[i][c] = max(no, yes); + return mem[i][c]; +} + +/* Рюкзак 0-1: динамическое программирование */ +int knapsackDP(List wgt, List val, int cap) { + int n = wgt.length; + // Инициализация таблицы dp + List> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0)); + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[n][cap]; +} + +/* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */ +int knapsackDPComp(List wgt, List val, int cap) { + int n = wgt.length; + // Инициализация таблицы dp + List dp = List.filled(cap + 1, 0); + // Переход состояний + for (int i = 1; i <= n; i++) { + // Обход в обратном порядке + for (int c = cap; c >= 1; c--) { + if (wgt[i - 1] <= c) { + // Большее из двух решений: не брать или взять предмет i + dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[cap]; +} + +/* Driver Code */ +void main() { + List wgt = [10, 20, 30, 40, 50]; + List val = [50, 120, 150, 210, 240]; + int cap = 50; + int n = wgt.length; + + // Полный перебор + int res = knapsackDFS(wgt, val, n, cap); + print("Максимальная стоимость предметов без превышения вместимости рюкзака = $res"); + + // Поиск с мемоизацией + List> mem = + List.generate(n + 1, (index) => List.filled(cap + 1, -1)); + res = knapsackDFSMem(wgt, val, mem, n, cap); + print("Максимальная стоимость предметов без превышения вместимости рюкзака = $res"); + + // Динамическое программирование + res = knapsackDP(wgt, val, cap); + print("Максимальная стоимость предметов без превышения вместимости рюкзака = $res"); + + // Динамическое программирование с оптимизацией памяти + res = knapsackDPComp(wgt, val, cap); + print("Максимальная стоимость предметов без превышения вместимости рюкзака = $res"); +} diff --git a/ru/codes/dart/chapter_dynamic_programming/min_cost_climbing_stairs_dp.dart b/ru/codes/dart/chapter_dynamic_programming/min_cost_climbing_stairs_dp.dart new file mode 100644 index 000000000..812977b80 --- /dev/null +++ b/ru/codes/dart/chapter_dynamic_programming/min_cost_climbing_stairs_dp.dart @@ -0,0 +1,48 @@ +/** + * File: min_cost_climbing_stairs_dp.dart + * Created Time: 2023-08-11 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import 'dart:math'; + +/* Минимальная стоимость подъема по лестнице: динамическое программирование */ +int minCostClimbingStairsDP(List cost) { + int n = cost.length - 1; + if (n == 1 || n == 2) return cost[n]; + // Инициализация таблицы dp для хранения решений подзадач + List dp = List.filled(n + 1, 0); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = cost[1]; + dp[2] = cost[2]; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (int i = 3; i <= n; i++) { + dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]; + } + return dp[n]; +} + +/* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */ +int minCostClimbingStairsDPComp(List cost) { + int n = cost.length - 1; + if (n == 1 || n == 2) return cost[n]; + int a = cost[1], b = cost[2]; + for (int i = 3; i <= n; i++) { + int tmp = b; + b = min(a, tmp) + cost[i]; + a = tmp; + } + return b; +} + +/* Driver Code */ +void main() { + List cost = [0, 1, 10, 1, 1, 1, 10, 1, 1, 10, 1]; + print("Список стоимостей ступеней = $cost"); + + int res = minCostClimbingStairsDP(cost); + print("Минимальная стоимость подъема по лестнице = $res"); + + res = minCostClimbingStairsDPComp(cost); + print("Минимальная стоимость подъема по лестнице = $res"); +} diff --git a/ru/codes/dart/chapter_dynamic_programming/min_path_sum.dart b/ru/codes/dart/chapter_dynamic_programming/min_path_sum.dart new file mode 100644 index 000000000..e43fbf2e4 --- /dev/null +++ b/ru/codes/dart/chapter_dynamic_programming/min_path_sum.dart @@ -0,0 +1,120 @@ +/** + * File: min_path_sum.dart + * Created Time: 2023-08-11 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import 'dart:math'; + +/* Минимальная сумма пути: полный перебор */ +int minPathSumDFS(List> grid, int i, int j) { + // Если это верхняя левая ячейка, завершить поиск + if (i == 0 && j == 0) { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 || j < 0) { + // В Dart тип int — целое число фиксированного диапазона; значения, представляющего «бесконечность», не существует + return BigInt.from(2).pow(31).toInt(); + } + // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1) + int up = minPathSumDFS(grid, i - 1, j); + int left = minPathSumDFS(grid, i, j - 1); + // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + return min(left, up) + grid[i][j]; +} + +/* Минимальная сумма пути: поиск с мемоизацией */ +int minPathSumDFSMem(List> grid, List> mem, int i, int j) { + // Если это верхняя левая ячейка, завершить поиск + if (i == 0 && j == 0) { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 || j < 0) { + // В Dart тип int — целое число фиксированного диапазона; значения, представляющего «бесконечность», не существует + return BigInt.from(2).pow(31).toInt(); + } + // Если запись уже есть, вернуть сразу + if (mem[i][j] != -1) { + return mem[i][j]; + } + // Минимальная стоимость пути для левой и верхней ячеек + int up = minPathSumDFSMem(grid, mem, i - 1, j); + int left = minPathSumDFSMem(grid, mem, i, j - 1); + // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + mem[i][j] = min(left, up) + grid[i][j]; + return mem[i][j]; +} + +/* Минимальная сумма пути: динамическое программирование */ +int minPathSumDP(List> grid) { + int n = grid.length, m = grid[0].length; + // Инициализация таблицы dp + List> dp = List.generate(n, (i) => List.filled(m, 0)); + dp[0][0] = grid[0][0]; + // Переход состояний: первая строка + for (int j = 1; j < m; j++) { + dp[0][j] = dp[0][j - 1] + grid[0][j]; + } + // Переход состояний: первый столбец + for (int i = 1; i < n; i++) { + dp[i][0] = dp[i - 1][0] + grid[i][0]; + } + // Переход состояний: остальные строки и столбцы + for (int i = 1; i < n; i++) { + for (int j = 1; j < m; j++) { + dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]; + } + } + return dp[n - 1][m - 1]; +} + +/* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */ +int minPathSumDPComp(List> grid) { + int n = grid.length, m = grid[0].length; + // Инициализация таблицы dp + List dp = List.filled(m, 0); + dp[0] = grid[0][0]; + for (int j = 1; j < m; j++) { + dp[j] = dp[j - 1] + grid[0][j]; + } + // Переход состояний: остальные строки + for (int i = 1; i < n; i++) { + // Переход состояний: первый столбец + dp[0] = dp[0] + grid[i][0]; + // Переход состояний: остальные столбцы + for (int j = 1; j < m; j++) { + dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]; + } + } + return dp[m - 1]; +} + +/* Driver Code */ +void main() { + List> grid = [ + [1, 3, 1, 5], + [2, 2, 4, 2], + [5, 3, 2, 1], + [4, 3, 5, 2], + ]; + int n = grid.length, m = grid[0].length; + +// Полный перебор + int res = minPathSumDFS(grid, n - 1, m - 1); + print("Минимальная сумма пути из левого верхнего угла в правый нижний = $res"); + +// Поиск с мемоизацией + List> mem = List.generate(n, (i) => List.filled(m, -1)); + res = minPathSumDFSMem(grid, mem, n - 1, m - 1); + print("Минимальная сумма пути из левого верхнего угла в правый нижний = $res"); + +// Динамическое программирование + res = minPathSumDP(grid); + print("Минимальная сумма пути из левого верхнего угла в правый нижний = $res"); + +// Динамическое программирование с оптимизацией памяти + res = minPathSumDPComp(grid); + print("Минимальная сумма пути из левого верхнего угла в правый нижний = $res"); +} diff --git a/ru/codes/dart/chapter_dynamic_programming/unbounded_knapsack.dart b/ru/codes/dart/chapter_dynamic_programming/unbounded_knapsack.dart new file mode 100644 index 000000000..ffe581e4d --- /dev/null +++ b/ru/codes/dart/chapter_dynamic_programming/unbounded_knapsack.dart @@ -0,0 +1,62 @@ +/** + * File: unbounded_knapsack.dart + * Created Time: 2023-08-11 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import 'dart:math'; + +/* Полный рюкзак: динамическое программирование */ +int unboundedKnapsackDP(List wgt, List val, int cap) { + int n = wgt.length; + // Инициализация таблицы dp + List> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0)); + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[n][cap]; +} + +/* Полный рюкзак: динамическое программирование с оптимизацией памяти */ +int unboundedKnapsackDPComp(List wgt, List val, int cap) { + int n = wgt.length; + // Инициализация таблицы dp + List dp = List.filled(cap + 1, 0); + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[cap]; +} + +/* Driver Code */ +void main() { + List wgt = [1, 2, 3]; + List val = [5, 11, 15]; + int cap = 4; + + // Динамическое программирование + int res = unboundedKnapsackDP(wgt, val, cap); + print("Максимальная стоимость предметов без превышения вместимости рюкзака = $res"); + + // Динамическое программирование с оптимизацией памяти + int resComp = unboundedKnapsackDPComp(wgt, val, cap); + print("Максимальная стоимость предметов без превышения вместимости рюкзака = $resComp"); +} diff --git a/ru/codes/dart/chapter_graph/graph_adjacency_list.dart b/ru/codes/dart/chapter_graph/graph_adjacency_list.dart new file mode 100644 index 000000000..5248ea48d --- /dev/null +++ b/ru/codes/dart/chapter_graph/graph_adjacency_list.dart @@ -0,0 +1,124 @@ +/** + * File: graph_adjacency_list.dart + * Created Time: 2023-05-15 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../utils/vertex.dart'; + +/* Класс неориентированного графа на основе списка смежности */ +class GraphAdjList { + // Список смежности, где key — вершина, а value — все смежные ей вершины + Map> adjList = {}; + + /* Конструктор */ + GraphAdjList(List> edges) { + for (List edge in edges) { + addVertex(edge[0]); + addVertex(edge[1]); + addEdge(edge[0], edge[1]); + } + } + + /* Получить число вершин */ + int size() { + return adjList.length; + } + + /* Добавление ребра */ + void addEdge(Vertex vet1, Vertex vet2) { + if (!adjList.containsKey(vet1) || + !adjList.containsKey(vet2) || + vet1 == vet2) { + throw ArgumentError; + } + // Добавить ребро vet1 - vet2 + adjList[vet1]!.add(vet2); + adjList[vet2]!.add(vet1); + } + + /* Удаление ребра */ + void removeEdge(Vertex vet1, Vertex vet2) { + if (!adjList.containsKey(vet1) || + !adjList.containsKey(vet2) || + vet1 == vet2) { + throw ArgumentError; + } + // Удалить ребро vet1 - vet2 + adjList[vet1]!.remove(vet2); + adjList[vet2]!.remove(vet1); + } + + /* Добавление вершины */ + void addVertex(Vertex vet) { + if (adjList.containsKey(vet)) return; + // Добавить новый список в список смежности + adjList[vet] = []; + } + + /* Удаление вершины */ + void removeVertex(Vertex vet) { + if (!adjList.containsKey(vet)) { + throw ArgumentError; + } + // Удалить из списка смежности список, соответствующий вершине vet + adjList.remove(vet); + // Обойти списки других вершин и удалить все ребра, содержащие vet + adjList.forEach((key, value) { + value.remove(vet); + }); + } + + /* Вывести список смежности */ + void printAdjList() { + print("Список смежности ="); + adjList.forEach((key, value) { + List tmp = []; + for (Vertex vertex in value) { + tmp.add(vertex.val); + } + print("${key.val}: $tmp,"); + }); + } +} + +/* Driver Code */ +void main() { + /* Инициализация неориентированного графа */ + List v = Vertex.valsToVets([1, 3, 2, 5, 4]); + List> 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]], + ]; + GraphAdjList graph = GraphAdjList(edges); + print("\nГраф после инициализации"); + graph.printAdjList(); + + /* Добавление ребра */ + // Вершины 1 и 2 соответствуют v[0] и v[2] + graph.addEdge(v[0], v[2]); + print("\nГраф после добавления ребра 1-2"); + graph.printAdjList(); + + /* Удаление ребра */ + // Вершины 1 и 3 соответствуют v[0] и v[1] + graph.removeEdge(v[0], v[1]); + print("\nГраф после удаления ребра 1-3"); + graph.printAdjList(); + + /* Добавление вершины */ + Vertex v5 = Vertex(6); + graph.addVertex(v5); + print("\nГраф после добавления вершины 6"); + graph.printAdjList(); + + /* Удаление вершины */ + // Вершина 3 соответствует v[1] + graph.removeVertex(v[1]); + print("\nГраф после удаления вершины 3"); + graph.printAdjList(); +} diff --git a/ru/codes/dart/chapter_graph/graph_adjacency_matrix.dart b/ru/codes/dart/chapter_graph/graph_adjacency_matrix.dart new file mode 100644 index 000000000..3b3b84a2a --- /dev/null +++ b/ru/codes/dart/chapter_graph/graph_adjacency_matrix.dart @@ -0,0 +1,133 @@ +/** + * File: graph_adjacency_matrix.dart + * Created Time: 2023-05-15 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../utils/print_util.dart'; + +/* Класс неориентированного графа на основе матрицы смежности */ +class GraphAdjMat { + List vertices = []; // Элемент вершины: элемент представляет «значение вершины», индекс представляет «индекс вершины» + List> adjMat = []; // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин» + + /* Конструктор */ + GraphAdjMat(List vertices, List> edges) { + this.vertices = []; + this.adjMat = []; + // Добавление вершины + for (int val in vertices) { + addVertex(val); + } + // Добавить ребра + // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices + for (List e in edges) { + addEdge(e[0], e[1]); + } + } + + /* Получить число вершин */ + int size() { + return vertices.length; + } + + /* Добавление вершины */ + void addVertex(int val) { + int n = size(); + // Добавить значение новой вершины в список вершин + vertices.add(val); + // Добавить строку в матрицу смежности + List newRow = List.filled(n, 0, growable: true); + adjMat.add(newRow); + // Добавить столбец в матрицу смежности + for (List row in adjMat) { + row.add(0); + } + } + + /* Удаление вершины */ + void removeVertex(int index) { + if (index >= size()) { + throw IndexError; + } + // Удалить вершину с индексом index из списка вершин + vertices.removeAt(index); + // Удалить строку с индексом index из матрицы смежности + adjMat.removeAt(index); + // Удалить столбец с индексом index из матрицы смежности + for (List row in adjMat) { + row.removeAt(index); + } + } + + /* Добавление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + void addEdge(int i, int j) { + // Обработка выхода индекса за границы и случая равенства + if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) { + throw IndexError; + } + // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i) + adjMat[i][j] = 1; + adjMat[j][i] = 1; + } + + /* Удаление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + void removeEdge(int i, int j) { + // Обработка выхода индекса за границы и случая равенства + if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) { + throw IndexError; + } + adjMat[i][j] = 0; + adjMat[j][i] = 0; + } + + /* Вывести матрицу смежности */ + void printAdjMat() { + print("Список вершин = $vertices"); + print("Матрица смежности = "); + printMatrix(adjMat); + } +} + +/* Driver Code */ +void main() { + /* Инициализация неориентированного графа */ + // Обратите внимание: элементы edges представляют индексы вершин, то есть соответствуют индексам элементов vertices + List vertices = [1, 3, 2, 5, 4]; + List> edges = [ + [0, 1], + [0, 3], + [1, 2], + [2, 3], + [2, 4], + [3, 4], + ]; + GraphAdjMat graph = GraphAdjMat(vertices, edges); + print("\nГраф после инициализации"); + graph.printAdjMat(); + + /* Добавление ребра */ + // Индексы вершин 1 и 2 равны 0 и 2 соответственно + graph.addEdge(0, 2); + print("\nГраф после добавления ребра 1-2"); + graph.printAdjMat(); + + /* Удаление ребра */ + // Индексы вершин 1 и 3 равны 0 и 1 соответственно + graph.removeEdge(0, 1); + print("\nГраф после удаления ребра 1-3"); + graph.printAdjMat(); + + /* Добавление вершины */ + graph.addVertex(6); + print("\nГраф после добавления вершины 6"); + graph.printAdjMat(); + + /* Удаление вершины */ + // Индекс вершины 3 равен 1 + graph.removeVertex(1); + print("\nГраф после удаления вершины 3"); + graph.printAdjMat(); +} diff --git a/ru/codes/dart/chapter_graph/graph_bfs.dart b/ru/codes/dart/chapter_graph/graph_bfs.dart new file mode 100644 index 000000000..4750ed1eb --- /dev/null +++ b/ru/codes/dart/chapter_graph/graph_bfs.dart @@ -0,0 +1,66 @@ +/** + * File: graph_bfs.dart + * Created Time: 2023-05-15 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import 'dart:collection'; + +import '../utils/vertex.dart'; +import 'graph_adjacency_list.dart'; + +/* Обход в ширину */ +List graphBFS(GraphAdjList graph, Vertex startVet) { + // Использовать список смежности для представления графа, чтобы получать все смежные вершины заданной вершины + // Последовательность обхода вершин + List res = []; + // Хеш-множество для хранения уже посещенных вершин + Set visited = {}; + visited.add(startVet); + // Очередь используется для реализации BFS + Queue que = Queue(); + que.add(startVet); + // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины + while (que.isNotEmpty) { + Vertex vet = que.removeFirst(); // Извлечь головную вершину из очереди + res.add(vet); // Отметить посещенную вершину + // Обойти все смежные вершины данной вершины + for (Vertex adjVet in graph.adjList[vet]!) { + if (visited.contains(adjVet)) { + continue; // Пропустить уже посещенную вершину + } + que.add(adjVet); // Помещать в очередь только непосещенные вершины + visited.add(adjVet); // Отметить эту вершину как посещенную + } + } + // Вернуть последовательность обхода вершин + return res; +} + +/* Dirver Code */ +void main() { + /* Инициализация неориентированного графа */ + List v = Vertex.valsToVets([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + List> 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]], + ]; + GraphAdjList graph = GraphAdjList(edges); + print("\nГраф после инициализации"); + graph.printAdjList(); + + /* Обход в ширину */ + List res = graphBFS(graph, v[0]); + print("\nПоследовательность вершин при обходе в ширину (BFS)"); + print(Vertex.vetsToVals(res)); +} diff --git a/ru/codes/dart/chapter_graph/graph_dfs.dart b/ru/codes/dart/chapter_graph/graph_dfs.dart new file mode 100644 index 000000000..25df94f52 --- /dev/null +++ b/ru/codes/dart/chapter_graph/graph_dfs.dart @@ -0,0 +1,59 @@ +/** + * File: graph_dfs.dart + * Created Time: 2023-05-15 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../utils/vertex.dart'; +import 'graph_adjacency_list.dart'; + +/* Вспомогательная функция обхода в глубину */ +void dfs( + GraphAdjList graph, + Set visited, + List res, + Vertex vet, +) { + res.add(vet); // Отметить посещенную вершину + visited.add(vet); // Отметить эту вершину как посещенную + // Обойти все смежные вершины данной вершины + for (Vertex adjVet in graph.adjList[vet]!) { + if (visited.contains(adjVet)) { + continue; // Пропустить уже посещенную вершину + } + // Рекурсивно обходить смежные вершины + dfs(graph, visited, res, adjVet); + } +} + +/* Обход в глубину */ +List graphDFS(GraphAdjList graph, Vertex startVet) { + // Последовательность обхода вершин + List res = []; + // Хеш-множество для хранения уже посещенных вершин + Set visited = {}; + dfs(graph, visited, res, startVet); + return res; +} + +/* Driver Code */ +void main() { + /* Инициализация неориентированного графа */ + List v = Vertex.valsToVets([0, 1, 2, 3, 4, 5, 6]); + List> 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]], + ]; + GraphAdjList graph = GraphAdjList(edges); + print("\nГраф после инициализации"); + graph.printAdjList(); + + /* Обход в глубину */ + List res = graphDFS(graph, v[0]); + print("\nПоследовательность вершин при обходе в глубину (DFS)"); + print(Vertex.vetsToVals(res)); +} diff --git a/ru/codes/dart/chapter_greedy/coin_change_greedy.dart b/ru/codes/dart/chapter_greedy/coin_change_greedy.dart new file mode 100644 index 000000000..9de834e8e --- /dev/null +++ b/ru/codes/dart/chapter_greedy/coin_change_greedy.dart @@ -0,0 +1,50 @@ +/** + * File: coin_change_greedy.dart + * Created Time: 2023-08-11 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Размен монет: жадный алгоритм */ +int coinChangeGreedy(List coins, int amt) { + // Предположить, что список coins упорядочен + int i = coins.length - 1; + int count = 0; + // Циклически выполнять жадный выбор, пока не останется суммы + while (amt > 0) { + // Найти монету, которая меньше остатка суммы и наиболее к нему близка + while (i > 0 && coins[i] > amt) { + i--; + } + // Выбрать coins[i] + amt -= coins[i]; + count++; + } + // Если допустимое решение не найдено, вернуть -1 + return amt == 0 ? count : -1; +} + +/* Driver Code */ +void main() { + // Жадный подход: гарантирует нахождение глобально оптимального решения + List coins = [1, 5, 10, 20, 50, 100]; + int amt = 186; + int res = coinChangeGreedy(coins, amt); + print("\ncoins = $coins, amt = $amt"); + print("Минимальное число монет для набора суммы $amt = $res"); + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = [1, 20, 50]; + amt = 60; + res = coinChangeGreedy(coins, amt); + print("\ncoins = $coins, amt = $amt"); + print("Минимальное число монет для набора суммы $amt = $res"); + print("На самом деле минимум равен 3: 20 + 20 + 20"); + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = [1, 49, 50]; + amt = 98; + res = coinChangeGreedy(coins, amt); + print("\ncoins = $coins, amt = $amt"); + print("Минимальное число монет для набора суммы $amt = $res"); + print("На самом деле минимум равен 2: 49 + 49"); +} diff --git a/ru/codes/dart/chapter_greedy/fractional_knapsack.dart b/ru/codes/dart/chapter_greedy/fractional_knapsack.dart new file mode 100644 index 000000000..4aec0780e --- /dev/null +++ b/ru/codes/dart/chapter_greedy/fractional_knapsack.dart @@ -0,0 +1,47 @@ +/** + * File: fractional_knapsack.dart + * Created Time: 2023-08-11 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Предмет */ +class Item { + int w; // Вес предмета + int v; // Стоимость предмета + + Item(this.w, this.v); +} + +/* Дробный рюкзак: жадный алгоритм */ +double fractionalKnapsack(List wgt, List val, int cap) { + // Создать список предметов с двумя свойствами: вес и стоимость + List items = List.generate(wgt.length, (i) => Item(wgt[i], val[i])); + // Отсортировать по удельной стоимости item.v / item.w в порядке убывания + items.sort((a, b) => (b.v / b.w).compareTo(a.v / a.w)); + // Циклический жадный выбор + double res = 0; + for (Item item in items) { + if (item.w <= cap) { + // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком + res += item.v; + cap -= item.w; + } else { + // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета + res += item.v / item.w * cap; + // Свободной вместимости больше не осталось, поэтому выйти из цикла + break; + } + } + return res; +} + +/* Driver Code */ +void main() { + List wgt = [10, 20, 30, 40, 50]; + List val = [50, 120, 150, 210, 240]; + int cap = 50; + + // Жадный алгоритм + double res = fractionalKnapsack(wgt, val, cap); + print("Максимальная стоимость предметов без превышения вместимости рюкзака = $res"); +} diff --git a/ru/codes/dart/chapter_greedy/max_capacity.dart b/ru/codes/dart/chapter_greedy/max_capacity.dart new file mode 100644 index 000000000..c9f4c1e1b --- /dev/null +++ b/ru/codes/dart/chapter_greedy/max_capacity.dart @@ -0,0 +1,37 @@ +/** + * File: max_capacity.dart + * Created Time: 2023-08-11 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import 'dart:math'; + +/* Максимальная вместимость: жадный алгоритм */ +int maxCapacity(List ht) { + // Инициализировать i и j так, чтобы они располагались по двум концам массива + int i = 0, j = ht.length - 1; + // Начальная максимальная вместимость равна 0 + int res = 0; + // Выполнять жадный выбор в цикле, пока две доски не встретятся + while (i < j) { + // Обновить максимальную вместимость + int cap = min(ht[i], ht[j]) * (j - i); + res = max(res, cap); + // Сдвигать внутрь более короткую сторону + if (ht[i] < ht[j]) { + i++; + } else { + j--; + } + } + return res; +} + +/* Driver Code */ +void main() { + List ht = [3, 8, 5, 2, 7, 7, 3, 4]; + + // Жадный алгоритм + int res = maxCapacity(ht); + print("Максимальная вместимость = $res"); +} diff --git a/ru/codes/dart/chapter_greedy/max_product_cutting.dart b/ru/codes/dart/chapter_greedy/max_product_cutting.dart new file mode 100644 index 000000000..4d63c6717 --- /dev/null +++ b/ru/codes/dart/chapter_greedy/max_product_cutting.dart @@ -0,0 +1,37 @@ +/** + * File: max_product_cutting.dart + * Created Time: 2023-08-11 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import 'dart:math'; + +/* Максимальное произведение разрезания: жадный алгоритм */ +int maxProductCutting(int n) { + // Когда n <= 3, обязательно нужно выделить одну 1 + if (n <= 3) { + return 1 * (n - 1); + } + // Жадно выделить множители 3, где a — число троек, а b — остаток + int a = n ~/ 3; + int b = n % 3; + if (b == 1) { + // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2 + return (pow(3, a - 1) * 2 * 2).toInt(); + } + if (b == 2) { + // Если остаток равен 2, ничего не делать + return (pow(3, a) * 2).toInt(); + } + // Если остаток равен 0, ничего не делать + return pow(3, a).toInt(); +} + +/* Driver Code */ +void main() { + int n = 58; + + // Жадный алгоритм + int res = maxProductCutting(n); + print("Максимальное произведение после разрезания = $res"); +} diff --git a/ru/codes/dart/chapter_hashing/array_hash_map.dart b/ru/codes/dart/chapter_hashing/array_hash_map.dart new file mode 100644 index 000000000..a26892a3d --- /dev/null +++ b/ru/codes/dart/chapter_hashing/array_hash_map.dart @@ -0,0 +1,126 @@ +/** + * File: array_hash_map.dart + * Created Time: 2023-03-29 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Пара ключ-значение */ +class Pair { + int key; + String val; + Pair(this.key, this.val); +} + +/* Хеш-таблица на основе массива */ +class ArrayHashMap { + late List _buckets; + + ArrayHashMap() { + // Инициализировать массив, содержащий 100 корзин + _buckets = List.filled(100, null); + } + + /* Хеш-функция */ + int _hashFunc(int key) { + final int index = key % 100; + return index; + } + + /* Операция поиска */ + String? get(int key) { + final int index = _hashFunc(key); + final Pair? pair = _buckets[index]; + if (pair == null) { + return null; + } + return pair.val; + } + + /* Операция добавления */ + void put(int key, String val) { + final Pair pair = Pair(key, val); + final int index = _hashFunc(key); + _buckets[index] = pair; + } + + /* Операция удаления */ + void remove(int key) { + final int index = _hashFunc(key); + _buckets[index] = null; + } + + /* Получить все пары ключ-значение */ + List pairSet() { + List pairSet = []; + for (final Pair? pair in _buckets) { + if (pair != null) { + pairSet.add(pair); + } + } + return pairSet; + } + + /* Получить все ключи */ + List keySet() { + List keySet = []; + for (final Pair? pair in _buckets) { + if (pair != null) { + keySet.add(pair.key); + } + } + return keySet; + } + + /* Получить все значения */ + List values() { + List valueSet = []; + for (final Pair? pair in _buckets) { + if (pair != null) { + valueSet.add(pair.val); + } + } + return valueSet; + } + + /* Вывести хеш-таблицу */ + void printHashMap() { + for (final Pair kv in pairSet()) { + print("${kv.key} -> ${kv.val}"); + } + } +} + +/* Driver Code */ +void main() { + /* Инициализация хеш-таблицы */ + final ArrayHashMap map = ArrayHashMap(); + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.put(12836, "Сяо Ха"); + map.put(15937, "Сяо Ло"); + map.put(16750, "Сяо Суань"); + map.put(13276, "Сяо Фа"); + map.put(10583, "Сяо Я"); + print("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение"); + map.printHashMap(); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + String? name = map.get(15937); + print("\nДля номера 15937 найдено имя $name"); + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(10583); + print("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение"); + map.printHashMap(); + + /* Обход хеш-таблицы */ + print("\nОтдельный обход пар ключ-значение"); + map.pairSet().forEach((kv) => print("${kv.key} -> ${kv.val}")); + print("\nОтдельный обход ключей"); + map.keySet().forEach((key) => print("$key")); + print("\nОтдельный обход значений"); + map.values().forEach((val) => print("$val")); +} diff --git a/ru/codes/dart/chapter_hashing/built_in_hash.dart b/ru/codes/dart/chapter_hashing/built_in_hash.dart new file mode 100644 index 000000000..9e8cce0e9 --- /dev/null +++ b/ru/codes/dart/chapter_hashing/built_in_hash.dart @@ -0,0 +1,34 @@ +/** + * File: built_in_hash.dart + * Created Time: 2023-06-25 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../chapter_stack_and_queue/linkedlist_deque.dart'; + +/* Driver Code */ +void main() { + int _num = 3; + int hashNum = _num.hashCode; + print("Хеш-значение целого числа $_num = $hashNum"); + + bool bol = true; + int hashBol = bol.hashCode; + print("Хеш-значение булева значения $bol = $hashBol"); + + double dec = 3.14159; + int hashDec = dec.hashCode; + print("Хеш-значение десятичного числа $dec = $hashDec"); + + String str = "Hello Algo"; + int hashStr = str.hashCode; + print("Хеш-значение строки $str = $hashStr"); + + List arr = [12836, "Сяо Ха"]; + int hashArr = arr.hashCode; + print("Хеш-значение массива $arr = $hashArr"); + + ListNode obj = new ListNode(0); + int hashObj = obj.hashCode; + print("Хеш-значение объекта узла $obj = $hashObj"); +} diff --git a/ru/codes/dart/chapter_hashing/hash_map.dart b/ru/codes/dart/chapter_hashing/hash_map.dart new file mode 100644 index 000000000..674d7d93c --- /dev/null +++ b/ru/codes/dart/chapter_hashing/hash_map.dart @@ -0,0 +1,41 @@ +/** + * File: hash_map.dart + * Created Time: 2023-03-29 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Driver Code */ +void main() { + /* Инициализация хеш-таблицы */ + final Map map = {}; + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map[12836] = "Сяо Ха"; + map[15937] = "Сяо Ло"; + map[16750] = "Сяо Суань"; + map[13276] = "Сяо Фа"; + map[10583] = "Сяо Я"; + print("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение"); + map.forEach((key, value) => print("$key -> $value")); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + final String? name = map[15937]; + print("\nДля номера 15937 найдено имя $name"); + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(10583); + print("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение"); + map.forEach((key, value) => print("$key -> $value")); + + /* Обход хеш-таблицы */ + print("\nОтдельный обход пар ключ-значение"); + map.forEach((key, value) => print("$key -> $value")); + print("\nОтдельный обход ключей"); + map.keys.forEach((key) => print(key)); + print("\nОтдельный обход значений"); + map.forEach((key, value) => print("$value")); + map.values.forEach((value) => print(value)); +} diff --git a/ru/codes/dart/chapter_hashing/hash_map_chaining.dart b/ru/codes/dart/chapter_hashing/hash_map_chaining.dart new file mode 100644 index 000000000..2748c7d13 --- /dev/null +++ b/ru/codes/dart/chapter_hashing/hash_map_chaining.dart @@ -0,0 +1,138 @@ +/** + * File: hash_map_chaining.dart + * Created Time: 2023-06-24 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import 'array_hash_map.dart'; + +/* Хеш-таблица с цепочками */ +class HashMapChaining { + late int size; // Число пар ключ-значение + late int capacity; // Вместимость хеш-таблицы + late double loadThres; // Порог коэффициента загрузки для запуска расширения + late int extendRatio; // Коэффициент расширения + late List> buckets; // Массив корзин + + /* Конструктор */ + HashMapChaining() { + size = 0; + capacity = 4; + loadThres = 2.0 / 3.0; + extendRatio = 2; + buckets = List.generate(capacity, (_) => []); + } + + /* Хеш-функция */ + int hashFunc(int key) { + return key % capacity; + } + + /* Коэффициент загрузки */ + double loadFactor() { + return size / capacity; + } + + /* Операция поиска */ + String? get(int key) { + int index = hashFunc(key); + List bucket = buckets[index]; + // Обойти корзину; если найден key, вернуть соответствующее val + for (Pair pair in bucket) { + if (pair.key == key) { + return pair.val; + } + } + // Если key не найден, вернуть null + return null; + } + + /* Операция добавления */ + void put(int key, String val) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if (loadFactor() > loadThres) { + extend(); + } + int index = hashFunc(key); + List bucket = buckets[index]; + // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть + for (Pair pair in bucket) { + if (pair.key == key) { + pair.val = val; + return; + } + } + // Если такого key нет, добавить пару ключ-значение в конец + Pair pair = Pair(key, val); + bucket.add(pair); + size++; + } + + /* Операция удаления */ + void remove(int key) { + int index = hashFunc(key); + List bucket = buckets[index]; + // Обойти корзину и удалить из нее пару ключ-значение + for (Pair pair in bucket) { + if (pair.key == key) { + bucket.remove(pair); + size--; + break; + } + } + } + + /* Расширить хеш-таблицу */ + void extend() { + // Временно сохранить исходную хеш-таблицу + List> bucketsTmp = buckets; + // Инициализация новой хеш-таблицы после расширения + capacity *= extendRatio; + buckets = List.generate(capacity, (_) => []); + size = 0; + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for (List bucket in bucketsTmp) { + for (Pair pair in bucket) { + put(pair.key, pair.val); + } + } + } + + /* Вывести хеш-таблицу */ + void printHashMap() { + for (List bucket in buckets) { + List res = []; + for (Pair pair in bucket) { + res.add("${pair.key} -> ${pair.val}"); + } + print(res); + } + } +} + +/* Driver Code */ +void main() { + /* Инициализация хеш-таблицы */ + HashMapChaining map = HashMapChaining(); + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.put(12836, "Сяо Ха"); + map.put(15937, "Сяо Ло"); + map.put(16750, "Сяо Суань"); + map.put(13276, "Сяо Фа"); + map.put(10583, "Сяо Я"); + print("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение"); + map.printHashMap(); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + String? name = map.get(13276); + print("\nДля номера 13276 найдено имя ${name}"); + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(12836); + print("\nПосле удаления 12836 хеш-таблица имеет вид\nКлюч -> Значение"); + map.printHashMap(); +} diff --git a/ru/codes/dart/chapter_hashing/hash_map_open_addressing.dart b/ru/codes/dart/chapter_hashing/hash_map_open_addressing.dart new file mode 100644 index 000000000..e0e97a131 --- /dev/null +++ b/ru/codes/dart/chapter_hashing/hash_map_open_addressing.dart @@ -0,0 +1,157 @@ +/** + * File: hash_map_open_addressing.dart + * Created Time: 2023-06-25 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import 'array_hash_map.dart'; + +/* Хеш-таблица с открытой адресацией */ +class HashMapOpenAddressing { + late int _size; // Число пар ключ-значение + int _capacity = 4; // Вместимость хеш-таблицы + double _loadThres = 2.0 / 3.0; // Порог коэффициента загрузки для запуска расширения + int _extendRatio = 2; // Коэффициент расширения + late List _buckets; // Массив корзин + Pair _TOMBSTONE = Pair(-1, "-1"); // Удалить метку + + /* Конструктор */ + HashMapOpenAddressing() { + _size = 0; + _buckets = List.generate(_capacity, (index) => null); + } + + /* Хеш-функция */ + int hashFunc(int key) { + return key % _capacity; + } + + /* Коэффициент загрузки */ + double loadFactor() { + return _size / _capacity; + } + + /* Найти индекс корзины, соответствующий key */ + int findBucket(int key) { + int index = hashFunc(key); + int firstTombstone = -1; + // Выполнять линейное пробирование и завершить при встрече с пустой корзиной + while (_buckets[index] != null) { + // Если встретился key, вернуть соответствующий индекс корзины + if (_buckets[index]!.key == key) { + // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс + if (firstTombstone != -1) { + _buckets[firstTombstone] = _buckets[index]; + _buckets[index] = _TOMBSTONE; + return firstTombstone; // Вернуть индекс корзины после перемещения + } + return index; // Вернуть индекс корзины + } + // Записать первую встретившуюся метку удаления + if (firstTombstone == -1 && _buckets[index] == _TOMBSTONE) { + firstTombstone = index; + } + // Вычислить индекс корзины; при выходе за конец вернуться к началу + index = (index + 1) % _capacity; + } + // Если key не существует, вернуть индекс точки добавления + return firstTombstone == -1 ? index : firstTombstone; + } + + /* Операция поиска */ + String? get(int key) { + // Найти индекс корзины, соответствующий key + int index = findBucket(key); + // Если пара ключ-значение найдена, вернуть соответствующее val + if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) { + return _buckets[index]!.val; + } + // Если пары ключ-значение не существует, вернуть null + return null; + } + + /* Операция добавления */ + void put(int key, String val) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if (loadFactor() > _loadThres) { + extend(); + } + // Найти индекс корзины, соответствующий key + int index = findBucket(key); + // Если пара ключ-значение найдена, перезаписать val и вернуть + if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) { + _buckets[index]!.val = val; + return; + } + // Если пары ключ-значение нет, добавить ее + _buckets[index] = new Pair(key, val); + _size++; + } + + /* Операция удаления */ + void remove(int key) { + // Найти индекс корзины, соответствующий key + int index = findBucket(key); + // Если пара ключ-значение найдена, заменить ее меткой удаления + if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) { + _buckets[index] = _TOMBSTONE; + _size--; + } + } + + /* Расширить хеш-таблицу */ + void extend() { + // Временно сохранить исходную хеш-таблицу + List bucketsTmp = _buckets; + // Инициализация новой хеш-таблицы после расширения + _capacity *= _extendRatio; + _buckets = List.generate(_capacity, (index) => null); + _size = 0; + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for (Pair? pair in bucketsTmp) { + if (pair != null && pair != _TOMBSTONE) { + put(pair.key, pair.val); + } + } + } + + /* Вывести хеш-таблицу */ + void printHashMap() { + for (Pair? pair in _buckets) { + if (pair == null) { + print("null"); + } else if (pair == _TOMBSTONE) { + print("TOMBSTONE"); + } else { + print("${pair.key} -> ${pair.val}"); + } + } + } +} + +/* Driver Code */ +void main() { + /* Инициализация хеш-таблицы */ + HashMapOpenAddressing map = HashMapOpenAddressing(); + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.put(12836, "Сяо Ха"); + map.put(15937, "Сяо Ло"); + map.put(16750, "Сяо Суань"); + map.put(13276, "Сяо Фа"); + map.put(10583, "Сяо Я"); + print("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение"); + map.printHashMap(); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + String? name = map.get(13276); + print("\nДля номера 13276 найдено имя $name"); + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(16750); + print("\nПосле удаления 16750 хеш-таблица имеет вид\nКлюч -> Значение"); + map.printHashMap(); +} diff --git a/ru/codes/dart/chapter_hashing/simple_hash.dart b/ru/codes/dart/chapter_hashing/simple_hash.dart new file mode 100644 index 000000000..d4c59c5bd --- /dev/null +++ b/ru/codes/dart/chapter_hashing/simple_hash.dart @@ -0,0 +1,62 @@ +/** + * File: simple_hash.dart + * Created Time: 2023-06-25 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Аддитивное хеширование */ +int addHash(String key) { + int hash = 0; + final int MODULUS = 1000000007; + for (int i = 0; i < key.length; i++) { + hash = (hash + key.codeUnitAt(i)) % MODULUS; + } + return hash; +} + +/* Мультипликативное хеширование */ +int mulHash(String key) { + int hash = 0; + final int MODULUS = 1000000007; + for (int i = 0; i < key.length; i++) { + hash = (31 * hash + key.codeUnitAt(i)) % MODULUS; + } + return hash; +} + +/* XOR-хеширование */ +int xorHash(String key) { + int hash = 0; + final int MODULUS = 1000000007; + for (int i = 0; i < key.length; i++) { + hash ^= key.codeUnitAt(i); + } + return hash & MODULUS; +} + +/* Хеширование с циклическим сдвигом */ +int rotHash(String key) { + int hash = 0; + final int MODULUS = 1000000007; + for (int i = 0; i < key.length; i++) { + hash = ((hash << 4) ^ (hash >> 28) ^ key.codeUnitAt(i)) % MODULUS; + } + return hash; +} + +/* Dirver Code */ +void main() { + String key = "Hello Algo"; + + int hash = addHash(key); + print("Хеш-сумма сложением = $hash"); + + hash = mulHash(key); + print("Хеш-сумма умножением = $hash"); + + hash = xorHash(key); + print("Хеш-сумма XOR = $hash"); + + hash = rotHash(key); + print("Хеш-сумма с циклическим сдвигом = $hash"); +} diff --git a/ru/codes/dart/chapter_heap/my_heap.dart b/ru/codes/dart/chapter_heap/my_heap.dart new file mode 100644 index 000000000..c76e94269 --- /dev/null +++ b/ru/codes/dart/chapter_heap/my_heap.dart @@ -0,0 +1,151 @@ +/** + * File: my_heap.dart + * Created Time: 2023-04-09 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../utils/print_util.dart'; + +/* Максимальная куча */ +class MaxHeap { + late List _maxHeap; + + /* Конструктор, строящий кучу по входному списку */ + MaxHeap(List nums) { + // Добавить элементы списка в кучу без изменений + _maxHeap = nums; + // Выполнить heapify для всех узлов, кроме листовых + for (int i = _parent(size() - 1); i >= 0; i--) { + siftDown(i); + } + } + + /* Получить индекс левого дочернего узла */ + int _left(int i) { + return 2 * i + 1; + } + + /* Получить индекс правого дочернего узла */ + int _right(int i) { + return 2 * i + 2; + } + + /* Получить индекс родительского узла */ + int _parent(int i) { + return (i - 1) ~/ 2; // Округление вниз при делении + } + + /* Поменять элементы местами */ + void _swap(int i, int j) { + int tmp = _maxHeap[i]; + _maxHeap[i] = _maxHeap[j]; + _maxHeap[j] = tmp; + } + + /* Получение размера кучи */ + int size() { + return _maxHeap.length; + } + + /* Проверка, пуста ли куча */ + bool isEmpty() { + return size() == 0; + } + + /* Доступ к элементу на вершине кучи */ + int peek() { + return _maxHeap[0]; + } + + /* Добавление элемента в кучу */ + void push(int val) { + // Добавление узла + _maxHeap.add(val); + // Просеивание снизу вверх + siftUp(size() - 1); + } + + /* Начиная с узла i, выполнить просеивание снизу вверх */ + void siftUp(int i) { + while (true) { + // Получение родительского узла для узла i + int p = _parent(i); + // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления» + if (p < 0 || _maxHeap[i] <= _maxHeap[p]) { + break; + } + // Поменять два узла местами + _swap(i, p); + // Циклическое просеивание вверх + i = p; + } + } + + /* Извлечение элемента из кучи */ + int pop() { + // Обработка пустого случая + if (isEmpty()) throw Exception('куча пуста'); + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + _swap(0, size() - 1); + // Удаление узла + int val = _maxHeap.removeLast(); + // Просеивание сверху вниз + siftDown(0); + // Вернуть элемент с вершины кучи + return val; + } + + /* Начиная с узла i, выполнить просеивание сверху вниз */ + void siftDown(int i) { + while (true) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + int l = _left(i); + int r = _right(i); + int ma = i; + if (l < size() && _maxHeap[l] > _maxHeap[ma]) ma = l; + if (r < size() && _maxHeap[r] > _maxHeap[ma]) ma = r; + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (ma == i) break; + // Поменять два узла местами + _swap(i, ma); + // Циклическое просеивание вниз + i = ma; + } + } + + /* Вывести кучу (двоичное дерево) */ + void print() { + printHeap(_maxHeap); + } +} + +/* Driver Code */ +void main() { + /* Инициализация максимальной кучи */ + MaxHeap maxHeap = MaxHeap([9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2]); + print("\nПосле построения кучи из входного списка"); + maxHeap.print(); + + /* Получение элемента с вершины кучи */ + int peek = maxHeap.peek(); + print("\nЭлемент на вершине кучи = $peek"); + + /* Добавление элемента в кучу */ + int val = 7; + maxHeap.push(val); + print("\nПосле добавления элемента $val в кучу"); + maxHeap.print(); + + /* Извлечение элемента с вершины кучи */ + peek = maxHeap.pop(); + print("\nПосле извлечения элемента вершины кучи $peek"); + maxHeap.print(); + + /* Получение размера кучи */ + int size = maxHeap.size(); + print("\nКоличество элементов в куче = $size"); + + /* Проверка, пуста ли куча */ + bool isEmpty = maxHeap.isEmpty(); + print("\nПуста ли куча: $isEmpty"); +} diff --git a/ru/codes/dart/chapter_heap/top_k.dart b/ru/codes/dart/chapter_heap/top_k.dart new file mode 100644 index 000000000..7cf6f705e --- /dev/null +++ b/ru/codes/dart/chapter_heap/top_k.dart @@ -0,0 +1,150 @@ +/** + * File: top_k.dart + * Created Time: 2023-08-15 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../utils/print_util.dart'; + +/* Найти k наибольших элементов массива с помощью кучи */ +MinHeap topKHeap(List nums, int k) { + // Инициализировать минимальную кучу, поместив в нее первые k элементов массива + MinHeap heap = MinHeap(nums.sublist(0, k)); + // Начиная с элемента k+1, поддерживать длину кучи равной k + for (int i = k; i < nums.length; i++) { + // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу + if (nums[i] > heap.peek()) { + heap.pop(); + heap.push(nums[i]); + } + } + return heap; +} + +/* Driver Code */ +void main() { + List nums = [1, 7, 6, 3, 2]; + int k = 3; + + MinHeap res = topKHeap(nums, k); + print("Наибольшие $k элементов"); + res.print(); +} + +/* Минимальная куча */ +class MinHeap { + late List _minHeap; + + /* Конструктор, строящий кучу по входному списку */ + MinHeap(List nums) { + // Добавить элементы списка в кучу без изменений + _minHeap = nums; + // Выполнить heapify для всех узлов, кроме листовых + for (int i = _parent(size() - 1); i >= 0; i--) { + siftDown(i); + } + } + + /* Вернуть элементы в куче */ + List getHeap() { + return _minHeap; + } + + /* Получить индекс левого дочернего узла */ + int _left(int i) { + return 2 * i + 1; + } + + /* Получить индекс правого дочернего узла */ + int _right(int i) { + return 2 * i + 2; + } + + /* Получить индекс родительского узла */ + int _parent(int i) { + return (i - 1) ~/ 2; // Округление вниз при делении + } + + /* Поменять элементы местами */ + void _swap(int i, int j) { + int tmp = _minHeap[i]; + _minHeap[i] = _minHeap[j]; + _minHeap[j] = tmp; + } + + /* Получение размера кучи */ + int size() { + return _minHeap.length; + } + + /* Проверка, пуста ли куча */ + bool isEmpty() { + return size() == 0; + } + + /* Доступ к элементу на вершине кучи */ + int peek() { + return _minHeap[0]; + } + + /* Добавление элемента в кучу */ + void push(int val) { + // Добавление узла + _minHeap.add(val); + // Просеивание снизу вверх + siftUp(size() - 1); + } + + /* Начиная с узла i, выполнить просеивание снизу вверх */ + void siftUp(int i) { + while (true) { + // Получение родительского узла для узла i + int p = _parent(i); + // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления» + if (p < 0 || _minHeap[i] >= _minHeap[p]) { + break; + } + // Поменять два узла местами + _swap(i, p); + // Циклическое просеивание вверх + i = p; + } + } + + /* Извлечение элемента из кучи */ + int pop() { + // Обработка пустого случая + if (isEmpty()) throw Exception('куча пуста'); + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + _swap(0, size() - 1); + // Удаление узла + int val = _minHeap.removeLast(); + // Просеивание сверху вниз + siftDown(0); + // Вернуть элемент с вершины кучи + return val; + } + + /* Начиная с узла i, выполнить просеивание сверху вниз */ + void siftDown(int i) { + while (true) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + int l = _left(i); + int r = _right(i); + int mi = i; + if (l < size() && _minHeap[l] < _minHeap[mi]) mi = l; + if (r < size() && _minHeap[r] < _minHeap[mi]) mi = r; + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (mi == i) break; + // Поменять два узла местами + _swap(i, mi); + // Циклическое просеивание вниз + i = mi; + } + } + + /* Вывести кучу (двоичное дерево) */ + void print() { + printHeap(_minHeap); + } +} diff --git a/ru/codes/dart/chapter_searching/binary_search.dart b/ru/codes/dart/chapter_searching/binary_search.dart new file mode 100644 index 000000000..0d40b91a2 --- /dev/null +++ b/ru/codes/dart/chapter_searching/binary_search.dart @@ -0,0 +1,63 @@ +/** + * File: binary_search.dart + * Created Time: 2023-05-12 + * Author: Jefferson (JeffersonHuang77@gmail.com) + */ + +/* Бинарный поиск (двусторонне замкнутый интервал) */ +int binarySearch(List nums, int target) { + // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно + int i = 0, j = nums.length - 1; + // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст) + while (i <= j) { + int m = i + (j - i) ~/ 2; // Вычислить индекс середины m + if (nums[m] < target) { + // Это означает, что target находится в интервале [m+1, j] + i = m + 1; + } else if (nums[m] > target) { + // Это означает, что target находится в интервале [i, m-1] + j = m - 1; + } else { + // Целевой элемент найден, вернуть его индекс + return m; + } + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +/* Бинарный поиск (лево замкнутый, право открытый интервал) */ +int binarySearchLCRO(List nums, int target) { + // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно + int i = 0, j = nums.length; + // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст) + while (i < j) { + int m = i + (j - i) ~/ 2; // Вычислить индекс середины m + if (nums[m] < target) { + // Это означает, что target находится в интервале [m+1, j) + i = m + 1; + } else if (nums[m] > target) { + // Это означает, что target находится в интервале [i, m) + j = m; + } else { + // Целевой элемент найден, вернуть его индекс + return m; + } + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +/* Driver Code*/ +void main() { + int target = 6; + final nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; + + /* Бинарный поиск (двусторонне замкнутый интервал) */ + int index = binarySearch(nums, target); + print('Индекс целевого элемента 6 = $index'); + + /* Бинарный поиск (лево замкнутый, право открытый интервал) */ + index = binarySearchLCRO(nums, target); + print('Индекс целевого элемента 6 = $index'); +} diff --git a/ru/codes/dart/chapter_searching/binary_search_edge.dart b/ru/codes/dart/chapter_searching/binary_search_edge.dart new file mode 100644 index 000000000..403b1367d --- /dev/null +++ b/ru/codes/dart/chapter_searching/binary_search_edge.dart @@ -0,0 +1,48 @@ +/** + * File: binary_search_edge.dart + * Created Time: 2023-08-14 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import 'binary_search_insertion.dart'; + +/* Бинарный поиск самого левого target */ +int binarySearchLeftEdge(List nums, int target) { + // Эквивалентно поиску точки вставки target + int i = binarySearchInsertion(nums, target); + // target не найден, вернуть -1 + if (i == nums.length || nums[i] != target) { + return -1; + } + // Найти target и вернуть индекс i + return i; +} + +/* Бинарный поиск самого правого target */ +int binarySearchRightEdge(List nums, int target) { + // Преобразовать задачу в поиск самого левого target + 1 + int i = binarySearchInsertion(nums, target + 1); + // j указывает на самый правый target, а i — на первый элемент больше target + int j = i - 1; + // target не найден, вернуть -1 + if (j == -1 || nums[j] != target) { + return -1; + } + // Найти target и вернуть индекс j + return j; +} + +/* Driver Code */ +void main() { + // Массив с повторяющимися элементами + List nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15]; + print("\nМассив nums = $nums"); + + // Бинарный поиск левой и правой границы + for (int target in [6, 7]) { + int index = binarySearchLeftEdge(nums, target); + print("Индекс самого левого элемента $target равен $index"); + index = binarySearchRightEdge(nums, target); + print("Индекс самого правого элемента $target равен $index"); + } +} diff --git a/ru/codes/dart/chapter_searching/binary_search_insertion.dart b/ru/codes/dart/chapter_searching/binary_search_insertion.dart new file mode 100644 index 000000000..31aaf7ea1 --- /dev/null +++ b/ru/codes/dart/chapter_searching/binary_search_insertion.dart @@ -0,0 +1,60 @@ +/** + * File: binary_search_insertion.dart + * Created Time: 2023-08-14 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Бинарный поиск точки вставки (без повторяющихся элементов) */ +int binarySearchInsertionSimple(List nums, int target) { + int i = 0, j = nums.length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + int m = i + (j - i) ~/ 2; // Вычислить индекс середины m + if (nums[m] < target) { + i = m + 1; // target находится в интервале [m+1, j] + } else if (nums[m] > target) { + j = m - 1; // target находится в интервале [i, m-1] + } else { + return m; // Найти target и вернуть точку вставки m + } + } + // target не найден, вернуть точку вставки i + return i; +} + +/* Бинарный поиск точки вставки (с повторяющимися элементами) */ +int binarySearchInsertion(List nums, int target) { + int i = 0, j = nums.length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + int m = i + (j - i) ~/ 2; // Вычислить индекс середины m + if (nums[m] < target) { + i = m + 1; // target находится в интервале [m+1, j] + } else if (nums[m] > target) { + j = m - 1; // target находится в интервале [i, m-1] + } else { + j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1] + } + } + // Вернуть точку вставки i + return i; +} + +/* Driver Code */ +void main() { + // Массив без повторяющихся элементов + List nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; + print("\nМассив nums = $nums"); + // Бинарный поиск точки вставки + for (int target in [6, 9]) { + int index = binarySearchInsertionSimple(nums, target); + print("Индекс позиции вставки элемента $target равен $index"); + } + + // Массив с повторяющимися элементами + nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15]; + print("\nМассив nums = $nums"); + // Бинарный поиск точки вставки + for (int target in [2, 6, 20]) { + int index = binarySearchInsertion(nums, target); + print("Индекс позиции вставки элемента $target равен $index"); + } +} diff --git a/ru/codes/dart/chapter_searching/hashing_search.dart b/ru/codes/dart/chapter_searching/hashing_search.dart new file mode 100644 index 000000000..c4450b747 --- /dev/null +++ b/ru/codes/dart/chapter_searching/hashing_search.dart @@ -0,0 +1,54 @@ +/** + * File: hashing_search.dart + * Created Time: 2023-05-12 + * Author: Jefferson (JeffersonHuang77@gmail.com) + */ + +import 'dart:collection'; +import '../utils/list_node.dart'; + +/* Хеш-поиск (массив) */ +int hashingSearchArray(Map map, int target) { + // key хеш-таблицы: целевой элемент, value: индекс + // Если такого key нет в хеш-таблице, вернуть -1 + if (!map.containsKey(target)) { + return -1; + } + return map[target]!; +} + +/* Хеш-поиск (связный список) */ +ListNode? hashingSearchLinkedList(Map map, int target) { + // key хеш-таблицы: значение целевого узла, value: объект узла + // Если такого key нет в хеш-таблице, вернуть null + if (!map.containsKey(target)) { + return null; + } + return map[target]!; +} + +/* Driver Code */ +void main() { + int target = 3; + + /* Хеш-поиск (массив) */ + List nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8]; + // Инициализация хеш-таблицы + Map map = HashMap(); + for (int i = 0; i < nums.length; i++) { + map.putIfAbsent(nums[i], () => i); // key: элемент, value: индекс + } + int index = hashingSearchArray(map, target); + print('Индекс целевого элемента 3 = $index'); + + /* Хеш-поиск (связный список) */ + ListNode? head = listToLinkedList(nums); + // Инициализация хеш-таблицы + Map map1 = HashMap(); + while (head != null) { + map1.putIfAbsent(head.val, () => head!); // key: значение узла, value: узел + head = head.next; + } + ListNode? node = hashingSearchLinkedList(map1, target); + print('Объект узла со значением 3 = $node'); +} diff --git a/ru/codes/dart/chapter_searching/linear_search.dart b/ru/codes/dart/chapter_searching/linear_search.dart new file mode 100644 index 000000000..72bd1b13f --- /dev/null +++ b/ru/codes/dart/chapter_searching/linear_search.dart @@ -0,0 +1,47 @@ +/** + * File: linear_search.dart + * Created Time: 2023-05-12 + * Author: Jefferson (JeffersonHuang77@gmail.com) + */ + +import '../utils/list_node.dart'; + +/* Линейный поиск (массив) */ +int linearSearchArray(List nums, int target) { + // Обход массива + for (int i = 0; i < nums.length; i++) { + // Целевой элемент найден, вернуть его индекс + if (nums[i] == target) { + return i; + } + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +/* Линейный поиск (связный список) */ +ListNode? linearSearchList(ListNode? head, int target) { + // Обойти связный список + while (head != null) { + // Найти целевой узел и вернуть его + if (head.val == target) return head; + head = head.next; + } + // Целевой элемент не найден, вернуть null + return null; +} + +/* Driver Code */ +void main() { + int target = 3; + + /* Выполнить линейный поиск в массиве */ + List nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8]; + int index = linearSearchArray(nums, target); + print('Индекс целевого элемента 3 = $index'); + + /* Выполнить линейный поиск в связном списке */ + ListNode? head = listToLinkedList(nums); + ListNode? node = linearSearchList(head, target); + print('Объект узла со значением 3 = $node'); +} diff --git a/ru/codes/dart/chapter_searching/two_sum.dart b/ru/codes/dart/chapter_searching/two_sum.dart new file mode 100644 index 000000000..d7a1d7c26 --- /dev/null +++ b/ru/codes/dart/chapter_searching/two_sum.dart @@ -0,0 +1,49 @@ +/** + * File: two_sum.dart + * Created Time: 2023-2-11 + * Author: Jefferson (JeffersonHuang77@gmail.com) + */ + +import 'dart:collection'; + +/* Способ 1: полный перебор */ +List twoSumBruteForce(List nums, int target) { + int size = nums.length; + // Два вложенных цикла, временная сложность O(n^2) + for (var i = 0; i < size - 1; i++) { + for (var j = i + 1; j < size; j++) { + if (nums[i] + nums[j] == target) return [i, j]; + } + } + return [0]; +} + +/* Способ 2: вспомогательная хеш-таблица */ +List twoSumHashTable(List nums, int target) { + int size = nums.length; + // Вспомогательная хеш-таблица, пространственная сложность O(n) + Map dic = HashMap(); + // Один цикл, временная сложность O(n) + for (var i = 0; i < size; i++) { + if (dic.containsKey(target - nums[i])) { + return [dic[target - nums[i]]!, i]; + } + dic.putIfAbsent(nums[i], () => i); + } + return [0]; +} + +/* Driver Code */ +void main() { + // ======= Test Case ======= + List nums = [2, 7, 11, 15]; + int target = 13; + + // ====== Основной код ====== + // Метод 1 + List res = twoSumBruteForce(nums, target); + print('Результат метода 1 res = $res'); + // Метод 2 + res = twoSumHashTable(nums, target); + print('Результат метода 2 res = $res'); +} diff --git a/ru/codes/dart/chapter_sorting/bubble_sort.dart b/ru/codes/dart/chapter_sorting/bubble_sort.dart new file mode 100644 index 000000000..bb83d8544 --- /dev/null +++ b/ru/codes/dart/chapter_sorting/bubble_sort.dart @@ -0,0 +1,51 @@ +/** + * File: bubble_sort.dart + * Created Time: 2023-02-14 + * Author: what-is-me (whatisme@outlook.jp) + */ + +/* Пузырьковая сортировка */ +void bubbleSort(List nums) { + // Внешний цикл: неотсортированный диапазон [0, i] + for (int i = nums.length - 1; i > 0; i--) { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (int j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + int tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + } + } + } +} + +/* Пузырьковая сортировка (оптимизация флагом) */ +void bubbleSortWithFlag(List nums) { + // Внешний цикл: неотсортированный диапазон [0, i] + for (int i = nums.length - 1; i > 0; i--) { + bool flag = false; // Инициализировать флаг + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (int j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + int tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + flag = true; // Записать обмен элементов + } + } + if (!flag) break; // На этой итерации «всплытия» не было ни одного обмена, сразу выйти + } +} + +/* Driver Code */ +void main() { + List nums = [4, 1, 3, 1, 5, 2]; + bubbleSort(nums); + print("После пузырьковой сортировки nums = $nums"); + + List nums1 = [4, 1, 3, 1, 5, 2]; + bubbleSortWithFlag(nums1); + print("После пузырьковой сортировки nums1 = $nums1"); +} diff --git a/ru/codes/dart/chapter_sorting/bucket_sort.dart b/ru/codes/dart/chapter_sorting/bucket_sort.dart new file mode 100644 index 000000000..62cadfba0 --- /dev/null +++ b/ru/codes/dart/chapter_sorting/bucket_sort.dart @@ -0,0 +1,39 @@ +/** + * File: bucket_sort.dart + * Created Time: 2023-05-12 + * Author: Jefferson (JeffersonHuang77@gmail.com) + */ + +/* Сортировка корзинами */ +void bucketSort(List nums) { + // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину + int k = nums.length ~/ 2; + List> buckets = List.generate(k, (index) => []); + + // 1. Распределить элементы массива по корзинам + for (double _num in nums) { + // Входные данные находятся в диапазоне [0, 1), используем _num * k для отображения в диапазон индексов [0, k-1] + int i = (_num * k).toInt(); + // Добавить _num в корзину bucket_idx + buckets[i].add(_num); + } + // 2. Выполнить сортировку внутри каждой корзины + for (List bucket in buckets) { + bucket.sort(); + } + // 3. Обойти корзины и объединить результаты + int i = 0; + for (List bucket in buckets) { + for (double _num in bucket) { + nums[i++] = _num; + } + } +} + +/* Driver Code*/ +void main() { + // Пусть входные данные — числа с плавающей точкой из диапазона [0, 1) + final nums = [0.49, 0.96, 0.82, 0.09, 0.57, 0.43, 0.91, 0.75, 0.15, 0.37]; + bucketSort(nums); + print('После сортировки корзинами nums = $nums'); +} diff --git a/ru/codes/dart/chapter_sorting/counting_sort.dart b/ru/codes/dart/chapter_sorting/counting_sort.dart new file mode 100644 index 000000000..9dfd232ac --- /dev/null +++ b/ru/codes/dart/chapter_sorting/counting_sort.dart @@ -0,0 +1,72 @@ +/** + * File: counting_sort.dart + * Created Time: 2023-05-12 + * Author: Jefferson (JeffersonHuang77@gmail.com) + */ +import 'dart:math'; + +/* Сортировка подсчетом */ +// Простая реализация, не подходит для сортировки объектов +void countingSortNaive(List nums) { + // 1. Найти максимальный элемент массива m + int m = 0; + for (int _num in nums) { + m = max(m, _num); + } + // 2. Подсчитать число появлений каждой цифры + // counter[_num] обозначает число появлений _num + List counter = List.filled(m + 1, 0); + for (int _num in nums) { + counter[_num]++; + } + // 3. Обойти counter и заполнить исходный массив nums элементами + int i = 0; + for (int _num = 0; _num < m + 1; _num++) { + for (int j = 0; j < counter[_num]; j++, i++) { + nums[i] = _num; + } + } +} + +/* Сортировка подсчетом */ +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой +void countingSort(List nums) { + // 1. Найти максимальный элемент массива m + int m = 0; + for (int _num in nums) { + m = max(m, _num); + } + // 2. Подсчитать число появлений каждой цифры + // counter[_num] обозначает число появлений _num + List counter = List.filled(m + 1, 0); + for (int _num in nums) { + counter[_num]++; + } + // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс» + // То есть counter[_num]-1 — это индекс последнего появления _num в res + for (int i = 0; i < m; i++) { + counter[i + 1] += counter[i]; + } + // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res + // Инициализировать массив res для хранения результата + int n = nums.length; + List res = List.filled(n, 0); + for (int i = n - 1; i >= 0; i--) { + int _num = nums[i]; + res[counter[_num] - 1] = _num; // Поместить _num по соответствующему индексу + counter[_num]--; // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения _num + } + // Перезаписать исходный массив nums массивом результата res + nums.setAll(0, res); +} + +/* Driver Code*/ +void main() { + final nums = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4]; + countingSortNaive(nums); + print('После сортировки подсчетом (объекты не поддерживаются) nums = $nums'); + + final nums1 = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4]; + countingSort(nums1); + print('После сортировки подсчетом nums1 = $nums1'); +} diff --git a/ru/codes/dart/chapter_sorting/heap_sort.dart b/ru/codes/dart/chapter_sorting/heap_sort.dart new file mode 100644 index 000000000..de8a56ee1 --- /dev/null +++ b/ru/codes/dart/chapter_sorting/heap_sort.dart @@ -0,0 +1,49 @@ +/** + * File: heap_sort.dart + * Created Time: 2023-06-01 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */ +void siftDown(List nums, int n, int i) { + while (true) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + int l = 2 * i + 1; + int r = 2 * i + 2; + int ma = i; + if (l < n && nums[l] > nums[ma]) ma = l; + if (r < n && nums[r] > nums[ma]) ma = r; + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (ma == i) break; + // Поменять два узла местами + int temp = nums[i]; + nums[i] = nums[ma]; + nums[ma] = temp; + // Циклическое просеивание вниз + i = ma; + } +} + +/* Сортировка кучей */ +void heapSort(List nums) { + // Построение кучи: выполнить heapify для всех узлов, кроме листовых + for (int i = nums.length ~/ 2 - 1; i >= 0; i--) { + siftDown(nums, nums.length, i); + } + // Извлекать максимальный элемент из кучи в течение n-1 итераций + for (int i = nums.length - 1; i > 0; i--) { + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + int tmp = nums[0]; + nums[0] = nums[i]; + nums[i] = tmp; + // Начиная с корневого узла, выполнить просеивание сверху вниз + siftDown(nums, i, 0); + } +} + +/* Driver Code */ +void main() { + List nums = [4, 1, 3, 1, 5, 2]; + heapSort(nums); + print("После сортировки кучей nums = $nums"); +} diff --git a/ru/codes/dart/chapter_sorting/insertion_sort.dart b/ru/codes/dart/chapter_sorting/insertion_sort.dart new file mode 100644 index 000000000..cba7a5b2d --- /dev/null +++ b/ru/codes/dart/chapter_sorting/insertion_sort.dart @@ -0,0 +1,26 @@ +/** + * File: insertion_sort.dart + * Created Time: 2023-02-14 + * Author: what-is-me (whatisme@outlook.jp) + */ + +/* Сортировка вставками */ +void insertionSort(List nums) { + // Внешний цикл: отсортированный диапазон [0, i-1] + for (int i = 1; i < nums.length; i++) { + int base = nums[i], j = i - 1; + // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1] + while (j >= 0 && nums[j] > base) { + nums[j + 1] = nums[j]; // Сдвинуть nums[j] на одну позицию вправо + j--; + } + nums[j + 1] = base; // Поместить base в правильную позицию + } +} + +/* Driver Code */ +void main() { + List nums = [4, 1, 3, 1, 5, 2]; + insertionSort(nums); + print("После сортировки вставками nums = $nums"); +} diff --git a/ru/codes/dart/chapter_sorting/merge_sort.dart b/ru/codes/dart/chapter_sorting/merge_sort.dart new file mode 100644 index 000000000..c1f7bf43a --- /dev/null +++ b/ru/codes/dart/chapter_sorting/merge_sort.dart @@ -0,0 +1,52 @@ +/** + * File: merge_sort.dart + * Created Time: 2023-02-14 + * Author: what-is-me (whatisme@outlook.jp) + */ + +/* Объединить левый и правый подмассивы */ +void merge(List nums, int left, int mid, int right) { + // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right] + // Создать временный массив tmp для хранения результата слияния + List tmp = List.filled(right - left + 1, 0); + // Инициализировать начальные индексы левого и правого подмассивов + int i = left, j = mid + 1, k = 0; + // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив + while (i <= mid && j <= right) { + if (nums[i] <= nums[j]) + tmp[k++] = nums[i++]; + else + tmp[k++] = nums[j++]; + } + // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив + while (i <= mid) { + tmp[k++] = nums[i++]; + } + while (j <= right) { + tmp[k++] = nums[j++]; + } + // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums + for (k = 0; k < tmp.length; k++) { + nums[left + k] = tmp[k]; + } +} + +/* Сортировка слиянием */ +void mergeSort(List nums, int left, int right) { + // Условие завершения + if (left >= right) return; // Завершить рекурсию, когда длина подмассива равна 1 + // Этап разбиения + int mid = left + (right - left) ~/ 2; // Вычислить середину + mergeSort(nums, left, mid); // Рекурсивно обработать левый подмассив + mergeSort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив + // Этап слияния + merge(nums, left, mid, right); +} + +/* Driver Code */ +void main() { + /* Сортировка слиянием */ + List nums = [7, 3, 2, 6, 0, 1, 5, 4]; + mergeSort(nums, 0, nums.length - 1); + print("После сортировки слиянием nums = $nums"); +} diff --git a/ru/codes/dart/chapter_sorting/quick_sort.dart b/ru/codes/dart/chapter_sorting/quick_sort.dart new file mode 100644 index 000000000..46bb2f072 --- /dev/null +++ b/ru/codes/dart/chapter_sorting/quick_sort.dart @@ -0,0 +1,145 @@ +/** + * File: quick_sort.dart + * Created Time: 2023-02-14 + * Author: what-is-me (whatisme@outlook.jp) + */ + +/* Класс быстрой сортировки */ +class QuickSort { + /* Обмен элементов */ + static void _swap(List nums, int i, int j) { + int tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + /* Разбиение с опорными указателями */ + static int _partition(List nums, int left, int right) { + // Взять nums[left] в качестве опорного элемента + int i = left, j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) j--; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) i++; // Идти слева направо в поисках первого элемента больше опорного + _swap(nums, i, j); // Поменять эти два элемента местами + } + _swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка */ + static void quickSort(List nums, int left, int right) { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) return; + // Разбиение с опорными указателями + int pivot = _partition(nums, left, right); + // Рекурсивно обработать левый и правый подмассивы + quickSort(nums, left, pivot - 1); + quickSort(nums, pivot + 1, right); + } +} + +/* Класс быстрой сортировки (оптимизация медианным опорным элементом) */ +class QuickSortMedian { + /* Обмен элементов */ + static void _swap(List nums, int i, int j) { + int tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + /* Выбрать медиану из трех кандидатов */ + static int _medianThree(List nums, int left, int mid, int right) { + int l = nums[left], m = nums[mid], r = nums[right]; + if ((l <= m && m <= r) || (r <= m && m <= l)) + return mid; // m находится между l и r + if ((m <= l && l <= r) || (r <= l && l <= m)) + return left; // l находится между m и r + return right; + } + + /* Разбиение с опорными указателями (медиана трех) */ + static int _partition(List nums, int left, int right) { + // Выбрать медиану из трех кандидатов + int med = _medianThree(nums, left, (left + right) ~/ 2, right); + // Переместить медиану в крайний левый элемент массива + _swap(nums, left, med); + // Взять nums[left] в качестве опорного элемента + int i = left, j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) j--; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) i++; // Идти слева направо в поисках первого элемента больше опорного + _swap(nums, i, j); // Поменять эти два элемента местами + } + _swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка */ + static void quickSort(List nums, int left, int right) { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) return; + // Разбиение с опорными указателями + int pivot = _partition(nums, left, right); + // Рекурсивно обработать левый и правый подмассивы + quickSort(nums, left, pivot - 1); + quickSort(nums, pivot + 1, right); + } +} + +/* Класс быстрой сортировки (оптимизация глубины рекурсии) */ +class QuickSortTailCall { + /* Обмен элементов */ + static void _swap(List nums, int i, int j) { + int tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + /* Разбиение с опорными указателями */ + static int _partition(List nums, int left, int right) { + // Взять nums[left] в качестве опорного элемента + int i = left, j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) j--; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) i++; // Идти слева направо в поисках первого элемента больше опорного + _swap(nums, i, j); // Поменять эти два элемента местами + } + _swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка (оптимизация глубины рекурсии) */ + static void quickSort(List nums, int left, int right) { + // Завершить, когда длина подмассива равна 1 + while (left < right) { + // Операция разбиения с опорными указателями + int pivot = _partition(nums, left, right); + // Выполнить быструю сортировку для более короткого из двух подмассивов + if (pivot - left < right - pivot) { + quickSort(nums, left, pivot - 1); // Рекурсивно отсортировать левый подмассив + left = pivot + 1; // Оставшийся неотсортированный диапазон: [pivot + 1, right] + } else { + quickSort(nums, pivot + 1, right); // Рекурсивно отсортировать правый подмассив + right = pivot - 1; // Оставшийся неотсортированный диапазон: [left, pivot - 1] + } + } + } +} + +/* Driver Code */ +void main() { + /* Быстрая сортировка */ + List nums = [2, 4, 1, 0, 3, 5]; + QuickSort.quickSort(nums, 0, nums.length - 1); + print("После быстрой сортировки nums = $nums"); + + /* Быстрая сортировка (оптимизация медианным опорным элементом) */ + List nums1 = [2, 4, 1, 0, 3, 5]; + QuickSortMedian.quickSort(nums1, 0, nums1.length - 1); + print("После быстрой сортировки (оптимизация медианным опорным элементом) nums1 = $nums1"); + + /* Быстрая сортировка (оптимизация глубины рекурсии) */ + List nums2 = [2, 4, 1, 0, 3, 5]; + QuickSortTailCall.quickSort(nums2, 0, nums2.length - 1); + print("После быстрой сортировки (оптимизация глубины рекурсии) nums2 = $nums2"); +} diff --git a/ru/codes/dart/chapter_sorting/radix_sort.dart b/ru/codes/dart/chapter_sorting/radix_sort.dart new file mode 100644 index 000000000..d5ff43449 --- /dev/null +++ b/ru/codes/dart/chapter_sorting/radix_sort.dart @@ -0,0 +1,71 @@ +/** + * File: radix_sort.dart + * Created Time: 2023-02-14 + * Author: what-is-me (whatisme@outlook.jp) + */ + +/* Получить k-й разряд элемента _num, где exp = 10^(k-1) */ +int digit(int _num, int exp) { + // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени + return (_num ~/ exp) % 10; +} + +/* Сортировка подсчетом (сортировка по k-му разряду nums) */ +void countingSortDigit(List nums, int exp) { + // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10 + List counter = List.filled(10, 0); + int n = nums.length; + // Подсчитать число появлений каждой цифры от 0 до 9 + for (int i = 0; i < n; i++) { + int d = digit(nums[i], exp); // Получить k-й разряд nums[i], обозначив его как d + counter[d]++; // Подсчитать число появлений цифры d + } + // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива» + for (int i = 1; i < 10; i++) { + counter[i] += counter[i - 1]; + } + // Выполняя обратный проход, заполнить res элементами по статистике в корзинах + List res = List.filled(n, 0); + for (int i = n - 1; i >= 0; i--) { + int d = digit(nums[i], exp); + int j = counter[d] - 1; // Получить индекс j цифры d в массиве + res[j] = nums[i]; // Поместить текущий элемент по индексу j + counter[d]--; // Уменьшить количество d на 1 + } + // Перезаписать исходный массив nums результатом + for (int i = 0; i < n; i++) nums[i] = res[i]; +} + +/* Поразрядная сортировка */ +void radixSort(List nums) { + // Получить максимальный элемент массива, чтобы определить максимальное число разрядов + // В dart длина int составляет 64 бита + int m = -1 << 63; + for (int _num in nums) if (_num > m) m = _num; + // Проходить разряды от младшего к старшему + for (int exp = 1; exp <= m; exp *= 10) + // Выполнить сортировку подсчетом по k-му разряду элементов массива + // k = 1 -> exp = 1 + // k = 2 -> exp = 10 + // то есть exp = 10^(k-1) + countingSortDigit(nums, exp); +} + +/* Driver Code */ +void main() { + // Поразрядная сортировка + List nums = [ + 10546151, + 35663510, + 42865989, + 34862445, + 81883077, + 88906420, + 72429244, + 30524779, + 82060337, + 63832996 + ]; + radixSort(nums); + print("После поразрядной сортировки nums = $nums"); +} diff --git a/ru/codes/dart/chapter_sorting/selection_sort.dart b/ru/codes/dart/chapter_sorting/selection_sort.dart new file mode 100644 index 000000000..78fd3e882 --- /dev/null +++ b/ru/codes/dart/chapter_sorting/selection_sort.dart @@ -0,0 +1,29 @@ +/** + * File: selection_sort.dart + * Created Time: 2023-06-01 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Сортировка выбором */ +void selectionSort(List nums) { + int n = nums.length; + // Внешний цикл: неотсортированный диапазон [i, n-1] + for (int i = 0; i < n - 1; i++) { + // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне + int k = i; + for (int j = i + 1; j < n; j++) { + if (nums[j] < nums[k]) k = j; // Записать индекс минимального элемента + } + // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона + int temp = nums[i]; + nums[i] = nums[k]; + nums[k] = temp; + } +} + +/* Driver Code */ +void main() { + List nums = [4, 1, 3, 1, 5, 2]; + selectionSort(nums); + print("После сортировки выбором nums = $nums"); +} diff --git a/ru/codes/dart/chapter_stack_and_queue/array_deque.dart b/ru/codes/dart/chapter_stack_and_queue/array_deque.dart new file mode 100644 index 000000000..cbe00a24c --- /dev/null +++ b/ru/codes/dart/chapter_stack_and_queue/array_deque.dart @@ -0,0 +1,146 @@ +/** + * File: array_deque.dart + * Created Time: 2023-03-28 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Двусторонняя очередь на основе кольцевого массива */ +class ArrayDeque { + late List _nums; // Массив для хранения элементов двусторонней очереди + late int _front; // Указатель head, указывающий на первый элемент очереди + late int _queSize; // Длина двусторонней очереди + + /* Конструктор */ + ArrayDeque(int capacity) { + this._nums = List.filled(capacity, 0); + this._front = this._queSize = 0; + } + + /* Получить вместимость двусторонней очереди */ + int capacity() { + return _nums.length; + } + + /* Получение длины двусторонней очереди */ + int size() { + return _queSize; + } + + /* Проверка, пуста ли двусторонняя очередь */ + bool isEmpty() { + return _queSize == 0; + } + + /* Вычислить индекс в кольцевом массиве */ + int index(int i) { + // С помощью операции взятия по модулю соединить начало и конец массива + // Когда i выходит за конец массива, он возвращается в начало + // Когда i выходит за начало массива, он возвращается в конец + return (i + capacity()) % capacity(); + } + + /* Добавление в голову очереди */ + void pushFirst(int _num) { + if (_queSize == capacity()) { + throw Exception("Двусторонняя очередь заполнена"); + } + // Указатель головы сместить влево на одну позицию + // С помощью операции взятия остатка реализовать возврат _front к хвосту после выхода за начало массива + _front = index(_front - 1); + // Добавить _num в голову очереди + _nums[_front] = _num; + _queSize++; + } + + /* Добавление в хвост очереди */ + void pushLast(int _num) { + if (_queSize == capacity()) { + throw Exception("Двусторонняя очередь заполнена"); + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + int rear = index(_front + _queSize); + // Добавить _num в хвост очереди + _nums[rear] = _num; + _queSize++; + } + + /* Извлечение из головы очереди */ + int popFirst() { + int _num = peekFirst(); + // Указатель головы сместить вправо на одну позицию + _front = index(_front + 1); + _queSize--; + return _num; + } + + /* Извлечение из хвоста очереди */ + int popLast() { + int _num = peekLast(); + _queSize--; + return _num; + } + + /* Доступ к элементу в начале очереди */ + int peekFirst() { + if (isEmpty()) { + throw Exception("двусторонняя очередь пуста"); + } + return _nums[_front]; + } + + /* Доступ к элементу в конце очереди */ + int peekLast() { + if (isEmpty()) { + throw Exception("двусторонняя очередь пуста"); + } + // Вычислить индекс хвостового элемента + int last = index(_front + _queSize - 1); + return _nums[last]; + } + + /* Вернуть массив для вывода */ + List toArray() { + // Преобразовывать только элементы списка в пределах фактической длины + List res = List.filled(_queSize, 0); + for (int i = 0, j = _front; i < _queSize; i++, j++) { + res[i] = _nums[index(j)]; + } + return res; + } +} + +/* Driver Code */ +void main() { + /* Инициализация двусторонней очереди */ + final ArrayDeque deque = ArrayDeque(10); + deque.pushLast(3); + deque.pushLast(2); + deque.pushLast(5); + print("Двусторонняя очередь deque = ${deque.toArray()}"); + + /* Доступ к элементу */ + final int peekFirst = deque.peekFirst(); + print("Первый элемент peekFirst = $peekFirst"); + final int peekLast = deque.peekLast(); + print("Последний элемент peekLast = $peekLast"); + + /* Добавление элемента в очередь */ + deque.pushLast(4); + print("После добавления элемента 4 в хвост deque = ${deque.toArray()}"); + deque.pushFirst(1); + print("После добавления элемента 1 в голову deque = ${deque.toArray()}"); + + /* Извлечение элемента из очереди */ + final int popLast = deque.popLast(); + print("Извлеченный из хвоста элемент = $popLast, deque после извлечения из хвоста = ${deque.toArray()}"); + final int popFirst = deque.popFirst(); + print("Извлеченный из головы элемент = $popFirst, deque после извлечения из головы = ${deque.toArray()}"); + + /* Получение длины двусторонней очереди */ + final int size = deque.size(); + print("Длина двусторонней очереди size = $size"); + + /* Проверка, пуста ли двусторонняя очередь */ + final bool isEmpty = deque.isEmpty(); + print("Пуста ли двусторонняя очередь = $isEmpty"); +} diff --git a/ru/codes/dart/chapter_stack_and_queue/array_queue.dart b/ru/codes/dart/chapter_stack_and_queue/array_queue.dart new file mode 100644 index 000000000..47abf3aaa --- /dev/null +++ b/ru/codes/dart/chapter_stack_and_queue/array_queue.dart @@ -0,0 +1,110 @@ +/** + * File: array_queue.dart + * Created Time: 2023-03-28 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Очередь на основе кольцевого массива */ +class ArrayQueue { + late List _nums; // Массив для хранения элементов очереди + late int _front; // Указатель head, указывающий на первый элемент очереди + late int _queSize; // Длина очереди + + ArrayQueue(int capacity) { + _nums = List.filled(capacity, 0); + _front = _queSize = 0; + } + + /* Получить вместимость очереди */ + int capaCity() { + return _nums.length; + } + + /* Получение длины очереди */ + int size() { + return _queSize; + } + + /* Проверка, пуста ли очередь */ + bool isEmpty() { + return _queSize == 0; + } + + /* Поместить в очередь */ + void push(int _num) { + if (_queSize == capaCity()) { + throw Exception("Очередь заполнена"); + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива + int rear = (_front + _queSize) % capaCity(); + // Добавить _num в хвост очереди + _nums[rear] = _num; + _queSize++; + } + + /* Извлечь из очереди */ + int pop() { + int _num = peek(); + // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива + _front = (_front + 1) % capaCity(); + _queSize--; + return _num; + } + + /* Доступ к элементу в начале очереди */ + int peek() { + if (isEmpty()) { + throw Exception("очередь пуста"); + } + return _nums[_front]; + } + + /* Вернуть Array */ + List toArray() { + // Преобразовывать только элементы списка в пределах фактической длины + final List res = List.filled(_queSize, 0); + for (int i = 0, j = _front; i < _queSize; i++, j++) { + res[i] = _nums[j % capaCity()]; + } + return res; + } +} + +/* Driver Code */ +void main() { + /* Инициализация очереди */ + final int capacity = 10; + final ArrayQueue queue = ArrayQueue(capacity); + + /* Добавление элемента в очередь */ + queue.push(1); + queue.push(3); + queue.push(2); + queue.push(5); + queue.push(4); + print("Очередь queue = ${queue.toArray()}"); + + /* Доступ к элементу в начале очереди */ + final int peek = queue.peek(); + print("Первый элемент peek = $peek"); + + /* Извлечение элемента из очереди */ + final int pop = queue.pop(); + print("Извлеченный элемент pop = $pop, queue после извлечения = ${queue.toArray()}"); + + /* Получить длину очереди */ + final int size = queue.size(); + print("Длина очереди size = $size"); + + /* Проверка, пуста ли очередь */ + final bool isEmpty = queue.isEmpty(); + print("Пуста ли очередь = $isEmpty"); + + /* Проверка кольцевого массива */ + for (int i = 0; i < 10; i++) { + queue.push(i); + queue.pop(); + print("После $i-го раунда операций enqueue и dequeue queue = ${queue.toArray()}"); + } +} diff --git a/ru/codes/dart/chapter_stack_and_queue/array_stack.dart b/ru/codes/dart/chapter_stack_and_queue/array_stack.dart new file mode 100644 index 000000000..c40aeb793 --- /dev/null +++ b/ru/codes/dart/chapter_stack_and_queue/array_stack.dart @@ -0,0 +1,77 @@ +/** + * File: array_stack.dart + * Created Time: 2023-03-28 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Стек на основе массива */ +class ArrayStack { + late List _stack; + ArrayStack() { + _stack = []; + } + + /* Получение длины стека */ + int size() { + return _stack.length; + } + + /* Проверка, пуст ли стек */ + bool isEmpty() { + return _stack.isEmpty; + } + + /* Поместить в стек */ + void push(int _num) { + _stack.add(_num); + } + + /* Извлечь из стека */ + int pop() { + if (isEmpty()) { + throw Exception("стек пуст"); + } + return _stack.removeLast(); + } + + /* Доступ к верхнему элементу стека */ + int peek() { + if (isEmpty()) { + throw Exception("стек пуст"); + } + return _stack.last; + } + + /* Преобразовать стек в Array и вернуть */ + List toArray() => _stack; +} + +/* Driver Code */ +void main() { + /* Инициализация стека */ + final ArrayStack stack = ArrayStack(); + + /* Помещение элемента в стек */ + stack.push(1); + stack.push(3); + stack.push(2); + stack.push(5); + stack.push(4); + print("Стек stack = ${stack.toArray()}"); + + /* Доступ к верхнему элементу стека */ + final int peek = stack.peek(); + print("Верхний элемент peek = $peek"); + + /* Извлечение элемента из стека */ + final int pop = stack.pop(); + print("Извлеченный элемент pop = $pop, stack после извлечения = ${stack.toArray()}"); + + /* Получение длины стека */ + final int size = stack.size(); + print("Длина стека size = $size"); + + /* Проверка на пустоту */ + final bool isEmpty = stack.isEmpty(); + print("Пуст ли стек = $isEmpty"); +} diff --git a/ru/codes/dart/chapter_stack_and_queue/deque.dart b/ru/codes/dart/chapter_stack_and_queue/deque.dart new file mode 100644 index 000000000..6d3e1007e --- /dev/null +++ b/ru/codes/dart/chapter_stack_and_queue/deque.dart @@ -0,0 +1,42 @@ +/** + * File: deque.dart + * Created Time: 2023-03-28 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import 'dart:collection'; + +void main() { + /* Инициализация двусторонней очереди */ + final Queue deque = Queue(); + deque.addFirst(3); + deque.addLast(2); + deque.addLast(5); + print("Двусторонняя очередь deque = $deque"); + + /* Доступ к элементу */ + final int peekFirst = deque.first; + print("Первый элемент peekFirst = $peekFirst"); + final int peekLast = deque.last; + print("Последний элемент peekLast = $peekLast"); + + /* Добавление элемента в очередь */ + deque.addLast(4); + print("После добавления элемента 4 в хвост deque = $deque"); + deque.addFirst(1); + print("После добавления элемента 1 в голову deque = $deque"); + + /* Извлечение элемента из очереди */ + final int popLast = deque.removeLast(); + print("Извлеченный из хвоста элемент = $popLast, deque после извлечения из хвоста = $deque"); + final int popFirst = deque.removeFirst(); + print("Извлеченный из головы элемент = $popFirst, deque после извлечения из головы = $deque"); + + /* Получение длины двусторонней очереди */ + final int size = deque.length; + print("Длина двусторонней очереди size = $size"); + + /* Проверка, пуста ли двусторонняя очередь */ + final bool isEmpty = deque.isEmpty; + print("Пуста ли двусторонняя очередь = $isEmpty"); +} diff --git a/ru/codes/dart/chapter_stack_and_queue/linkedlist_deque.dart b/ru/codes/dart/chapter_stack_and_queue/linkedlist_deque.dart new file mode 100644 index 000000000..43bafda60 --- /dev/null +++ b/ru/codes/dart/chapter_stack_and_queue/linkedlist_deque.dart @@ -0,0 +1,167 @@ +/** + * File: linkedlist_deque.dart + * Created Time: 2023-03-28 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Узел двусвязного списка */ +class ListNode { + int val; // Значение узла + ListNode? next; // Ссылка на узел-преемник + ListNode? prev; // Ссылка на узел-предшественник + + ListNode(this.val, {this.next, this.prev}); +} + +/* Двусторонняя очередь на основе двусвязного списка */ +class LinkedListDeque { + late ListNode? _front; // Головной узел _front + late ListNode? _rear; // Хвостовой узел _rear + int _queSize = 0; // Длина двусторонней очереди + + LinkedListDeque() { + this._front = null; + this._rear = null; + } + + /* Получить длину двусторонней очереди */ + int size() { + return this._queSize; + } + + /* Проверка, пуста ли двусторонняя очередь */ + bool isEmpty() { + return size() == 0; + } + + /* Операция добавления в очередь */ + void push(int _num, bool isFront) { + final ListNode node = ListNode(_num); + if (isEmpty()) { + // Если связный список пуст, пусть _front и _rear оба указывают на node + _front = _rear = node; + } else if (isFront) { + // Операция добавления в голову очереди + // Добавить node в начало связного списка + _front!.prev = node; + node.next = _front; + _front = node; // Обновить головной узел + } else { + // Операция добавления в хвост очереди + // Добавить node в конец связного списка + _rear!.next = node; + node.prev = _rear; + _rear = node; // Обновить хвостовой узел + } + _queSize++; // Обновить длину очереди + } + + /* Добавление в голову очереди */ + void pushFirst(int _num) { + push(_num, true); + } + + /* Добавление в хвост очереди */ + void pushLast(int _num) { + push(_num, false); + } + + /* Операция извлечения из очереди */ + int? pop(bool isFront) { + // Если очередь пуста, сразу вернуть null + if (isEmpty()) { + return null; + } + final int val; + if (isFront) { + // Операция извлечения из головы очереди + val = _front!.val; // Временно сохранить значение головного узла + // Удалить головной узел + ListNode? fNext = _front!.next; + if (fNext != null) { + fNext.prev = null; + _front!.next = null; + } + _front = fNext; // Обновить головной узел + } else { + // Операция извлечения из хвоста очереди + val = _rear!.val; // Временно сохранить значение хвостового узла + // Удалить хвостовой узел + ListNode? rPrev = _rear!.prev; + if (rPrev != null) { + rPrev.next = null; + _rear!.prev = null; + } + _rear = rPrev; // Обновить хвостовой узел + } + _queSize--; // Обновить длину очереди + return val; + } + + /* Извлечение из головы очереди */ + int? popFirst() { + return pop(true); + } + + /* Извлечение из хвоста очереди */ + int? popLast() { + return pop(false); + } + + /* Доступ к элементу в начале очереди */ + int? peekFirst() { + return _front?.val; + } + + /* Доступ к элементу в конце очереди */ + int? peekLast() { + return _rear?.val; + } + + /* Вернуть массив для вывода */ + List toArray() { + ListNode? node = _front; + final List res = []; + for (int i = 0; i < _queSize; i++) { + res.add(node!.val); + node = node.next; + } + return res; + } +} + +/* Driver Code */ +void main() { + /* Инициализация двусторонней очереди */ + final LinkedListDeque deque = LinkedListDeque(); + deque.pushLast(3); + deque.pushLast(2); + deque.pushLast(5); + print("Двусторонняя очередь deque = ${deque.toArray()}"); + + /* Доступ к элементу */ + int? peekFirst = deque.peekFirst(); + print("Первый элемент peekFirst = $peekFirst"); + int? peekLast = deque.peekLast(); + print("Последний элемент peekLast = $peekLast"); + + /* Добавление элемента в очередь */ + deque.pushLast(4); + print("После добавления элемента 4 в хвост deque = ${deque.toArray()}"); + deque.pushFirst(1); + print("После добавления элемента 1 в голову deque = ${deque.toArray()}"); + + /* Извлечение элемента из очереди */ + int? popLast = deque.popLast(); + print("Извлеченный из хвоста элемент = $popLast, deque после извлечения из хвоста = ${deque.toArray()}"); + int? popFirst = deque.popFirst(); + print("Извлеченный из головы элемент = $popFirst, deque после извлечения из головы = ${deque.toArray()}"); + + /* Получение длины двусторонней очереди */ + int size = deque.size(); + print("Длина двусторонней очереди size = $size"); + + /* Проверка, пуста ли двусторонняя очередь */ + bool isEmpty = deque.isEmpty(); + print("Пуста ли двусторонняя очередь = $isEmpty"); +} diff --git a/ru/codes/dart/chapter_stack_and_queue/linkedlist_queue.dart b/ru/codes/dart/chapter_stack_and_queue/linkedlist_queue.dart new file mode 100644 index 000000000..7d839ae5c --- /dev/null +++ b/ru/codes/dart/chapter_stack_and_queue/linkedlist_queue.dart @@ -0,0 +1,103 @@ +/** + * File: linkedlist_queue.dart + * Created Time: 2023-03-28 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../utils/list_node.dart'; + +/* Очередь на основе связного списка */ +class LinkedListQueue { + ListNode? _front; // Головной узел _front + ListNode? _rear; // Хвостовой узел _rear + int _queSize = 0; // Длина очереди + + LinkedListQueue() { + _front = null; + _rear = null; + } + + /* Получение длины очереди */ + int size() { + return _queSize; + } + + /* Проверка, пуста ли очередь */ + bool isEmpty() { + return _queSize == 0; + } + + /* Поместить в очередь */ + void push(int _num) { + // Добавить _num после хвостового узла + final node = ListNode(_num); + // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел + if (_front == null) { + _front = node; + _rear = node; + } else { + // Если очередь не пуста, добавить этот узел после хвостового узла + _rear!.next = node; + _rear = node; + } + _queSize++; + } + + /* Извлечь из очереди */ + int pop() { + final int _num = peek(); + // Удалить головной узел + _front = _front!.next; + _queSize--; + return _num; + } + + /* Доступ к элементу в начале очереди */ + int peek() { + if (_queSize == 0) { + throw Exception('очередь пуста'); + } + return _front!.val; + } + + /* Преобразовать связный список в Array и вернуть */ + List toArray() { + ListNode? node = _front; + final List queue = []; + while (node != null) { + queue.add(node.val); + node = node.next; + } + return queue; + } +} + +/* Driver Code */ +void main() { + /* Инициализация очереди */ + final queue = LinkedListQueue(); + + /* Добавление элемента в очередь */ + queue.push(1); + queue.push(3); + queue.push(2); + queue.push(5); + queue.push(4); + print("Очередь queue = ${queue.toArray()}"); + + /* Доступ к элементу в начале очереди */ + final int peek = queue.peek(); + print("Первый элемент peek = $peek"); + + /* Извлечение элемента из очереди */ + final int pop = queue.pop(); + print("Извлеченный элемент pop = $pop, queue после извлечения = ${queue.toArray()}"); + + /* Получение длины очереди */ + final int size = queue.size(); + print("Длина очереди size = $size"); + + /* Проверка, пуста ли очередь */ + final bool isEmpty = queue.isEmpty(); + print("Пуста ли очередь = $isEmpty"); +} diff --git a/ru/codes/dart/chapter_stack_and_queue/linkedlist_stack.dart b/ru/codes/dart/chapter_stack_and_queue/linkedlist_stack.dart new file mode 100644 index 000000000..e538d0bca --- /dev/null +++ b/ru/codes/dart/chapter_stack_and_queue/linkedlist_stack.dart @@ -0,0 +1,93 @@ +/** + * File: linkedlist_stack.dart + * Created Time: 2023-03-27 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../utils/list_node.dart'; + +/* Стек на основе класса связного списка */ +class LinkedListStack { + ListNode? _stackPeek; // Использовать головной узел как вершину стека + int _stkSize = 0; // Длина стека + + LinkedListStack() { + _stackPeek = null; + } + + /* Получение длины стека */ + int size() { + return _stkSize; + } + + /* Проверка, пуст ли стек */ + bool isEmpty() { + return _stkSize == 0; + } + + /* Поместить в стек */ + void push(int _num) { + final ListNode node = ListNode(_num); + node.next = _stackPeek; + _stackPeek = node; + _stkSize++; + } + + /* Извлечь из стека */ + int pop() { + final int _num = peek(); + _stackPeek = _stackPeek!.next; + _stkSize--; + return _num; + } + + /* Доступ к верхнему элементу стека */ + int peek() { + if (_stackPeek == null) { + throw Exception("стек пуст"); + } + return _stackPeek!.val; + } + + /* Преобразовать связный список в List и вернуть */ + List toList() { + ListNode? node = _stackPeek; + List list = []; + while (node != null) { + list.add(node.val); + node = node.next; + } + list = list.reversed.toList(); + return list; + } +} + +/* Driver Code */ +void main() { + /* Инициализация стека */ + final LinkedListStack stack = LinkedListStack(); + + /* Помещение элемента в стек */ + stack.push(1); + stack.push(3); + stack.push(2); + stack.push(5); + stack.push(4); + print("Стек stack = ${stack.toList()}"); + + /* Доступ к верхнему элементу стека */ + final int peek = stack.peek(); + print("Верхний элемент peek = $peek"); + + /* Извлечение элемента из стека */ + final int pop = stack.pop(); + print("Извлеченный элемент pop = $pop, stack после извлечения = ${stack.toList()}"); + + /* Получение длины стека */ + final int size = stack.size(); + print("Длина стека size = $size"); + + /* Проверка на пустоту */ + final bool isEmpty = stack.isEmpty(); + print("Пуст ли стек = $isEmpty"); +} diff --git a/ru/codes/dart/chapter_stack_and_queue/queue.dart b/ru/codes/dart/chapter_stack_and_queue/queue.dart new file mode 100644 index 000000000..0d483178a --- /dev/null +++ b/ru/codes/dart/chapter_stack_and_queue/queue.dart @@ -0,0 +1,37 @@ +/** + * File: queue.dart + * Created Time: 2023-03-28 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import 'dart:collection'; + +void main() { + /* Инициализация очереди */ + // В Dart двусторонняя очередь Queue обычно рассматривается как обычная очередь + final Queue queue = Queue(); + + /* Добавление элемента в очередь */ + queue.add(1); + queue.add(3); + queue.add(2); + queue.add(5); + queue.add(4); + print("Очередь queue = $queue"); + + /* Доступ к элементу в начале очереди */ + final int peek = queue.first; + print("Первый элемент peek = $peek"); + + /* Извлечение элемента из очереди */ + final int pop = queue.removeFirst(); + print("Извлеченный элемент pop = $pop, queue после извлечения = $queue"); + + /* Получить длину очереди */ + final int size = queue.length; + print("Длина очереди size = $size"); + + /* Проверка, пуста ли очередь */ + final bool isEmpty = queue.isEmpty; + print("Пуста ли очередь = $isEmpty"); +} diff --git a/ru/codes/dart/chapter_stack_and_queue/stack.dart b/ru/codes/dart/chapter_stack_and_queue/stack.dart new file mode 100644 index 000000000..cf1911b7a --- /dev/null +++ b/ru/codes/dart/chapter_stack_and_queue/stack.dart @@ -0,0 +1,35 @@ +/** + * File: stack.dart + * Created Time: 2023-03-27 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +void main() { + /* Инициализация стека */ + // В Dart нет встроенного класса стека, поэтому List можно использовать как стек + final List stack = []; + + /* Помещение элемента в стек */ + stack.add(1); + stack.add(3); + stack.add(2); + stack.add(5); + stack.add(4); + print("Стек stack = $stack"); + + /* Доступ к верхнему элементу стека */ + final int peek = stack.last; + print("Верхний элемент peek = $peek"); + + /* Извлечение элемента из стека */ + final int pop = stack.removeLast(); + print("Извлеченный элемент pop = $pop, stack после извлечения = $stack"); + + /* Получение длины стека */ + final int size = stack.length; + print("Длина стека size = $size"); + + /* Проверка на пустоту */ + final bool isEmpty = stack.isEmpty; + print("Пуст ли стек = $isEmpty"); +} diff --git a/ru/codes/dart/chapter_tree/array_binary_tree.dart b/ru/codes/dart/chapter_tree/array_binary_tree.dart new file mode 100644 index 000000000..8f802233f --- /dev/null +++ b/ru/codes/dart/chapter_tree/array_binary_tree.dart @@ -0,0 +1,152 @@ +/** + * File: array_binary_tree.dart + * Created Time: 2023-08-15 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../utils/print_util.dart'; +import '../utils/tree_node.dart'; + +/* Класс двоичного дерева в массивном представлении */ +class ArrayBinaryTree { + late List _tree; + + /* Конструктор */ + ArrayBinaryTree(this._tree); + + /* Вместимость списка */ + int size() { + return _tree.length; + } + + /* Получить значение узла с индексом i */ + int? val(int i) { + // Если индекс выходит за границы, вернуть null, обозначающий пустую позицию + if (i < 0 || i >= size()) { + return null; + } + return _tree[i]; + } + + /* Получить индекс левого дочернего узла узла с индексом i */ + int? left(int i) { + return 2 * i + 1; + } + + /* Получить индекс правого дочернего узла узла с индексом i */ + int? right(int i) { + return 2 * i + 2; + } + + /* Получить индекс родительского узла узла с индексом i */ + int? parent(int i) { + return (i - 1) ~/ 2; + } + + /* Обход в ширину */ + List levelOrder() { + List res = []; + for (int i = 0; i < size(); i++) { + if (val(i) != null) { + res.add(val(i)!); + } + } + return res; + } + + /* Обход в глубину */ + void dfs(int i, String order, List res) { + // Если это пустая позиция, вернуть + if (val(i) == null) { + return; + } + // Предварительный обход + if (order == 'pre') { + res.add(val(i)); + } + dfs(left(i)!, order, res); + // Симметричный обход + if (order == 'in') { + res.add(val(i)); + } + dfs(right(i)!, order, res); + // Обратный обход + if (order == 'post') { + res.add(val(i)); + } + } + + /* Предварительный обход */ + List preOrder() { + List res = []; + dfs(0, 'pre', res); + return res; + } + + /* Симметричный обход */ + List inOrder() { + List res = []; + dfs(0, 'in', res); + return res; + } + + /* Обратный обход */ + List postOrder() { + List res = []; + dfs(0, 'post', res); + return res; + } +} + +/* Driver Code */ +void main() { + // Инициализировать двоичное дерево + // Здесь используется функция, напрямую строящая двоичное дерево из массива + List arr = [ + 1, + 2, + 3, + 4, + null, + 6, + 7, + 8, + 9, + null, + null, + 12, + null, + null, + 15 + ]; + + TreeNode? root = listToTree(arr); + print("\nИнициализация двоичного дерева\n"); + print("Массивное представление двоичного дерева:"); + print(arr); + print("Связное представление двоичного дерева:"); + printTree(root); + + // Класс двоичного дерева в массивном представлении + ArrayBinaryTree abt = ArrayBinaryTree(arr); + + // Доступ к узлу + int i = 1; + int? l = abt.left(i); + int? r = abt.right(i); + int? p = abt.parent(i); + print("\nТекущий узел: индекс = $i, значение = ${abt.val(i)}"); + print("Индекс левого дочернего узла = $l, значение = ${(l == null ? "null" : abt.val(l))}"); + print("Индекс правого дочернего узла = $r, значение = ${(r == null ? "null" : abt.val(r))}"); + print("Индекс родительского узла = $p, значение = ${(p == null ? "null" : abt.val(p))}"); + + // Обходить дерево + List res = abt.levelOrder(); + print("\nОбход в ширину = $res"); + res = abt.preOrder(); + print("Предварительный обход = $res"); + res = abt.inOrder(); + print("Симметричный обход = $res"); + res = abt.postOrder(); + print("Обратный обход = $res"); +} diff --git a/ru/codes/dart/chapter_tree/avl_tree.dart b/ru/codes/dart/chapter_tree/avl_tree.dart new file mode 100644 index 000000000..6cc00f117 --- /dev/null +++ b/ru/codes/dart/chapter_tree/avl_tree.dart @@ -0,0 +1,218 @@ +/** + * File: avl_tree.dart + * Created Time: 2023-04-04 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import 'dart:math'; +import '../utils/print_util.dart'; +import '../utils/tree_node.dart'; + +class AVLTree { + TreeNode? root; + + /* Конструктор */ + AVLTree() { + root = null; + } + + /* Получить высоту узла */ + int height(TreeNode? node) { + // Высота пустого узла равна -1, высота листового узла равна 0 + return node == null ? -1 : node.height; + } + + /* Обновить высоту узла */ + void updateHeight(TreeNode? node) { + // Высота узла равна высоте более высокого поддерева + 1 + node!.height = max(height(node.left), height(node.right)) + 1; + } + + /* Получить коэффициент баланса */ + int balanceFactor(TreeNode? node) { + // Коэффициент баланса пустого узла равен 0 + if (node == null) return 0; + // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева + return height(node.left) - height(node.right); + } + + /* Операция правого вращения */ + TreeNode? rightRotate(TreeNode? node) { + TreeNode? child = node!.left; + TreeNode? grandChild = child!.right; + // Выполнить правое вращение узла node вокруг child + child.right = node; + node.left = grandChild; + // Обновить высоту узла + updateHeight(node); + updateHeight(child); + // Вернуть корневой узел поддерева после вращения + return child; + } + + /* Операция левого вращения */ + TreeNode? leftRotate(TreeNode? node) { + TreeNode? child = node!.right; + TreeNode? grandChild = child!.left; + // Выполнить левое вращение узла node вокруг child + child.left = node; + node.right = grandChild; + // Обновить высоту узла + updateHeight(node); + updateHeight(child); + // Вернуть корневой узел поддерева после вращения + return child; + } + + /* Выполнить вращение, чтобы снова сбалансировать поддерево */ + TreeNode? rotate(TreeNode? node) { + // Получить коэффициент баланса узла node + int factor = balanceFactor(node); + // Левосторонне перекошенное дерево + if (factor > 1) { + if (balanceFactor(node!.left) >= 0) { + // Правое вращение + return rightRotate(node); + } else { + // Сначала левое вращение, затем правое + node.left = leftRotate(node.left); + return rightRotate(node); + } + } + // Правосторонне перекошенное дерево + if (factor < -1) { + if (balanceFactor(node!.right) <= 0) { + // Левое вращение + return leftRotate(node); + } else { + // Сначала правое вращение, затем левое + node.right = rightRotate(node.right); + return leftRotate(node); + } + } + // Дерево сбалансировано, вращение не требуется, вернуть сразу + return node; + } + + /* Вставка узла */ + void insert(int val) { + root = insertHelper(root, val); + } + + /* Рекурсивная вставка узла (вспомогательный метод) */ + TreeNode? insertHelper(TreeNode? node, int val) { + if (node == null) return TreeNode(val); + /* 1. Найти позицию вставки и вставить узел */ + if (val < node.val) + node.left = insertHelper(node.left, val); + else if (val > node.val) + node.right = insertHelper(node.right, val); + else + return node; // Повторяющийся узел не вставлять, сразу вернуть + updateHeight(node); // Обновить высоту узла + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = rotate(node); + // Вернуть корневой узел поддерева + return node; + } + + /* Удаление узла */ + void remove(int val) { + root = removeHelper(root, val); + } + + /* Рекурсивное удаление узла (вспомогательный метод) */ + TreeNode? removeHelper(TreeNode? node, int val) { + if (node == null) return null; + /* 1. Найти узел и удалить его */ + if (val < node.val) + node.left = removeHelper(node.left, val); + else if (val > node.val) + node.right = removeHelper(node.right, val); + else { + if (node.left == null || node.right == null) { + TreeNode? child = node.left ?? node.right; + // Число дочерних узлов = 0, удалить node и сразу вернуть + if (child == null) + return null; + // Число дочерних узлов = 1, удалить node напрямую + else + node = child; + } else { + // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел + TreeNode? temp = node.right; + while (temp!.left != null) { + temp = temp.left; + } + node.right = removeHelper(node.right, temp.val); + node.val = temp.val; + } + } + updateHeight(node); // Обновить высоту узла + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = rotate(node); + // Вернуть корневой узел поддерева + return node; + } + + /* Поиск узла */ + TreeNode? search(int val) { + TreeNode? cur = root; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Целевой узел находится в правом поддереве cur + if (val < cur.val) + cur = cur.left; + // Целевой узел находится в левом поддереве cur + else if (val > cur.val) + cur = cur.right; + // Целевой узел равен текущему узлу + else + break; + } + return cur; + } +} + +void testInsert(AVLTree tree, int val) { + tree.insert(val); + print("\nПосле вставки узла $val AVL-дерево имеет вид"); + printTree(tree.root); +} + +void testRemove(AVLTree tree, int val) { + tree.remove(val); + print("\nПосле удаления узла $val AVL-дерево имеет вид"); + printTree(tree.root); +} + +/* Driver Code */ +void main() { + /* Инициализация пустого AVL-дерева */ + AVLTree avlTree = AVLTree(); + /* Вставка узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после вставки узла + testInsert(avlTree, 1); + testInsert(avlTree, 2); + testInsert(avlTree, 3); + testInsert(avlTree, 4); + testInsert(avlTree, 5); + testInsert(avlTree, 8); + testInsert(avlTree, 7); + testInsert(avlTree, 9); + testInsert(avlTree, 10); + testInsert(avlTree, 6); + + /* Вставка повторяющегося узла */ + testInsert(avlTree, 7); + + /* Удаление узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после удаления узла + testRemove(avlTree, 8); // Удаление узла степени 0 + testRemove(avlTree, 5); // Удаление узла степени 1 + testRemove(avlTree, 4); // Удаление узла степени 2 + + /* Поиск узла */ + TreeNode? node = avlTree.search(7); + print("\nНайденный объект узла = $node, значение узла = ${node!.val}"); +} diff --git a/ru/codes/dart/chapter_tree/binary_search_tree.dart b/ru/codes/dart/chapter_tree/binary_search_tree.dart new file mode 100644 index 000000000..ca70894c9 --- /dev/null +++ b/ru/codes/dart/chapter_tree/binary_search_tree.dart @@ -0,0 +1,153 @@ +/** + * File: binary_search_tree.dart + * Created Time: 2023-04-04 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../utils/print_util.dart'; +import '../utils/tree_node.dart'; + +/* Двоичное дерево поиска */ +class BinarySearchTree { + late TreeNode? _root; + + /* Конструктор */ + BinarySearchTree() { + // Инициализировать пустое дерево + _root = null; + } + + /* Получить корневой узел двоичного дерева */ + TreeNode? getRoot() { + return _root; + } + + /* Поиск узла */ + TreeNode? search(int _num) { + TreeNode? cur = _root; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Целевой узел находится в правом поддереве cur + if (cur.val < _num) + cur = cur.right; + // Целевой узел находится в левом поддереве cur + else if (cur.val > _num) + cur = cur.left; + // Найти целевой узел и выйти из цикла + else + break; + } + // Вернуть целевой узел + return cur; + } + + /* Вставка узла */ + void insert(int _num) { + // Если дерево пусто, инициализировать корневой узел + if (_root == null) { + _root = TreeNode(_num); + return; + } + TreeNode? cur = _root; + TreeNode? pre = null; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Найти повторяющийся узел и сразу вернуть + if (cur.val == _num) return; + pre = cur; + // Позиция вставки находится в правом поддереве cur + if (cur.val < _num) + cur = cur.right; + // Позиция вставки находится в левом поддереве cur + else + cur = cur.left; + } + // Вставка узла + TreeNode? node = TreeNode(_num); + if (pre!.val < _num) + pre.right = node; + else + pre.left = node; + } + + /* Удаление узла */ + void remove(int _num) { + // Если дерево пусто, сразу вернуть + if (_root == null) return; + TreeNode? cur = _root; + TreeNode? pre = null; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Найти узел для удаления и выйти из цикла + if (cur.val == _num) break; + pre = cur; + // Узел для удаления находится в правом поддереве cur + if (cur.val < _num) + cur = cur.right; + // Узел для удаления находится в левом поддереве cur + else + cur = cur.left; + } + // Если удаляемого узла нет, сразу вернуть + if (cur == null) return; + // Число дочерних узлов = 0 или 1 + if (cur.left == null || cur.right == null) { + // Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел + TreeNode? child = cur.left ?? cur.right; + // Удалить узел cur + if (cur != _root) { + if (pre!.left == cur) + pre.left = child; + else + pre.right = child; + } else { + // Если удаляемый узел является корнем, заново назначить корневой узел + _root = child; + } + } else { + // Число дочерних узлов = 2 + // Получить следующий узел после cur в симметричном обходе + TreeNode? tmp = cur.right; + while (tmp!.left != null) { + tmp = tmp.left; + } + // Рекурсивно удалить узел tmp + remove(tmp.val); + // Перезаписать cur значением tmp + cur.val = tmp.val; + } + } +} + +/* Driver Code */ +void main() { + /* Инициализация двоичного дерева поиска */ + BinarySearchTree bst = BinarySearchTree(); + // Обратите внимание: разные порядки вставки порождают разные двоичные деревья; данная последовательность может построить совершенное двоичное дерево + List nums = [8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15]; + for (int _num in nums) { + bst.insert(_num); + } + print("\nИсходное двоичное дерево\n"); + printTree(bst.getRoot()); + + /* Поиск узла */ + TreeNode? node = bst.search(7); + print("\nНайденный объект узла = $node, значение узла = ${node?.val}"); + + /* Вставка узла */ + bst.insert(16); + print("\nПосле вставки узла 16 двоичное дерево имеет вид\n"); + printTree(bst.getRoot()); + + /* Удаление узла */ + bst.remove(1); + print("\nПосле удаления узла 1 двоичное дерево имеет вид\n"); + printTree(bst.getRoot()); + bst.remove(2); + print("\nПосле удаления узла 2 двоичное дерево имеет вид\n"); + printTree(bst.getRoot()); + bst.remove(4); + print("\nПосле удаления узла 4 двоичное дерево имеет вид\n"); + printTree(bst.getRoot()); +} diff --git a/ru/codes/dart/chapter_tree/binary_tree.dart b/ru/codes/dart/chapter_tree/binary_tree.dart new file mode 100644 index 000000000..77f80b612 --- /dev/null +++ b/ru/codes/dart/chapter_tree/binary_tree.dart @@ -0,0 +1,37 @@ +/** + * File: binary_tree.dart + * Created Time: 2023-04-03 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../utils/print_util.dart'; +import '../utils/tree_node.dart'; + +void main() { + /* Инициализация двоичного дерева */ + // Инициализировать узлы дерева + TreeNode n1 = TreeNode(1); + TreeNode n2 = TreeNode(2); + TreeNode n3 = TreeNode(3); + TreeNode n4 = TreeNode(4); + TreeNode n5 = TreeNode(5); + // Построить связи между узлами (указатели) + n1.left = n2; + n1.right = n3; + n2.left = n4; + n2.right = n5; + print("\nИнициализация двоичного дерева\n"); + printTree(n1); + + /* Вставка и удаление узлов */ + TreeNode p = TreeNode(0); + // Вставить узел p между n1 -> n2 + n1.left = p; + p.left = n2; + print("\nПосле вставки узла P\n"); + printTree(n1); + // Удалить узел P + n1.left = n2; + print("\nПосле удаления узла P\n"); + printTree(n1); +} diff --git a/ru/codes/dart/chapter_tree/binary_tree_bfs.dart b/ru/codes/dart/chapter_tree/binary_tree_bfs.dart new file mode 100644 index 000000000..2fbd6f8bc --- /dev/null +++ b/ru/codes/dart/chapter_tree/binary_tree_bfs.dart @@ -0,0 +1,38 @@ +/** + * File: binary_tree_bfs.dart + * Created Time: 2023-04-03 + * Author: liuyuxin (gvenusleo@gmai.com) + */ + +import 'dart:collection'; +import '../utils/print_util.dart'; +import '../utils/tree_node.dart'; + +/* Обход в ширину */ +List levelOrder(TreeNode? root) { + // Инициализировать очередь и добавить корневой узел + Queue queue = Queue(); + queue.add(root); + // Инициализировать список для хранения последовательности обхода + List res = []; + while (queue.isNotEmpty) { + TreeNode? node = queue.removeFirst(); // Извлечение из очереди + res.add(node!.val); // Сохранить значение узла + if (node.left != null) queue.add(node.left); // Поместить левый дочерний узел в очередь + if (node.right != null) queue.add(node.right); // Поместить правый дочерний узел в очередь + } + return res; +} + +/* Driver Code */ +void main() { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из массива + TreeNode? root = listToTree([1, 2, 3, 4, 5, 6, 7]); + print("\nИнициализация двоичного дерева\n"); + printTree(root); + + // Обход в ширину + List res = levelOrder(root); + print("\nПоследовательность печати узлов при обходе в ширину = $res"); +} diff --git a/ru/codes/dart/chapter_tree/binary_tree_dfs.dart b/ru/codes/dart/chapter_tree/binary_tree_dfs.dart new file mode 100644 index 000000000..dc3b20f2c --- /dev/null +++ b/ru/codes/dart/chapter_tree/binary_tree_dfs.dart @@ -0,0 +1,62 @@ +/** + * File: binary_tree_dfs.dart + * Created Time: 2023-04-04 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +import '../utils/print_util.dart'; +import '../utils/tree_node.dart'; + +// Инициализировать список для хранения последовательности обхода +List list = []; + +/* Предварительный обход */ +void preOrder(TreeNode? node) { + if (node == null) return; + // Порядок обхода: корень -> левое поддерево -> правое поддерево + list.add(node.val); + preOrder(node.left); + preOrder(node.right); +} + +/* Симметричный обход */ +void inOrder(TreeNode? node) { + if (node == null) return; + // Порядок обхода: левое поддерево -> корень -> правое поддерево + inOrder(node.left); + list.add(node.val); + inOrder(node.right); +} + +/* Обратный обход */ +void postOrder(TreeNode? node) { + if (node == null) return; + // Порядок обхода: левое поддерево -> правое поддерево -> корень + postOrder(node.left); + postOrder(node.right); + list.add(node.val); +} + +/* Driver Code */ +void main() { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из массива + TreeNode? root = listToTree([1, 2, 3, 4, 5, 6, 7]); + print("\nИнициализация двоичного дерева\n"); + printTree(root); + + /* Предварительный обход */ + list.clear(); + preOrder(root); + print("\nПоследовательность печати узлов при предварительном обходе = $list"); + + /* Симметричный обход */ + list.clear(); + inOrder(root); + print("\nПоследовательность печати узлов при симметричном обходе = $list"); + + /* Обратный обход */ + list.clear(); + postOrder(root); + print("\nПоследовательность печати узлов при обратном обходе = $list"); +} diff --git a/ru/codes/dart/utils/list_node.dart b/ru/codes/dart/utils/list_node.dart new file mode 100644 index 000000000..8425b4db5 --- /dev/null +++ b/ru/codes/dart/utils/list_node.dart @@ -0,0 +1,24 @@ +/** + * File: list_node.dart + * Created Time: 2023-01-23 + * Author: Jefferson (JeffersonHuang77@gmail.com) + */ + +/* Узел связного списка */ +class ListNode { + int val; + ListNode? next; + + ListNode(this.val, [this.next]); +} + +/* Десериализовать список в связный список */ +ListNode? listToLinkedList(List list) { + ListNode dum = ListNode(0); + ListNode? head = dum; + for (int val in list) { + head?.next = ListNode(val); + head = head?.next; + } + return dum.next; +} diff --git a/ru/codes/dart/utils/print_util.dart b/ru/codes/dart/utils/print_util.dart new file mode 100644 index 000000000..d6d383854 --- /dev/null +++ b/ru/codes/dart/utils/print_util.dart @@ -0,0 +1,90 @@ +/** + * File: print_util.dart + * Created Time: 2023-01-23 + * Author: Jefferson (JeffersonHuang77@gmail.com) + */ + +import 'dart:io'; + +import 'list_node.dart'; +import 'tree_node.dart'; + +class Trunk { + Trunk? prev; + String str; + + Trunk(this.prev, this.str); +} + +/* Вывести матрицу (Array) */ +void printMatrix(List> matrix) { + print("["); + for (List row in matrix) { + print(" $row,"); + } + print("]"); +} + +/* Вывести связный список */ +void printLinkedList(ListNode? head) { + List list = []; + + while (head != null) { + list.add('${head.val}'); + head = head.next; + } + + print(list.join(' -> ')); +} + +/** + * Вывести двоичное дерево + * Этот вывод дерева заимствован из TECHIE DELIGHT + * https://www.techiedelight.com/c-program-print-binary-tree/ + */ +void printTree(TreeNode? root, [Trunk? prev = null, bool isRight = false]) { + if (root == null) { + return; + } + + String prev_str = ' '; + Trunk trunk = Trunk(prev, prev_str); + + printTree(root.right, trunk, true); + + if (prev == null) { + trunk.str = '———'; + } else if (isRight) { + trunk.str = '/———'; + prev_str = ' |'; + } else { + trunk.str = '\\———'; + prev.str = prev_str; + } + showTrunks(trunk); + print(' ${root.val}'); + + if (prev != null) { + prev.str = prev_str; + } + trunk.str = ' |'; + + printTree(root.left, trunk, false); +} + +void showTrunks(Trunk? p) { + if (p == null) { + return; + } + + showTrunks(p.prev); + stdout.write(p.str); +} + +/* Вывести кучу */ +void printHeap(List heap) { + print("Массивное представление кучи: $heap"); + print("Древовидное представление кучи:"); + TreeNode? root = listToTree(heap); + printTree(root); +} diff --git a/ru/codes/dart/utils/tree_node.dart b/ru/codes/dart/utils/tree_node.dart new file mode 100644 index 000000000..0db8c1ee4 --- /dev/null +++ b/ru/codes/dart/utils/tree_node.dart @@ -0,0 +1,50 @@ +/** + * File: tree_node.dart + * Created Time: 2023-2-12 + * Author: Jefferson (JeffersonHuang77@gmail.com) + */ + +/* Класс узла двоичного дерева */ +class TreeNode { + int val; // Значение узла + int height; // Высота узла + TreeNode? left; // Ссылка на левый дочерний узел + TreeNode? right; // Ссылка на правый дочерний узел + + /* Конструктор */ + TreeNode(this.val, [this.height = 0, this.left, this.right]); +} + +/* Десериализовать список в двоичное дерево: рекурсия */ +TreeNode? listToTreeDFS(List arr, int i) { + if (i < 0 || i >= arr.length || arr[i] == null) { + return null; + } + TreeNode? root = TreeNode(arr[i]!); + root.left = listToTreeDFS(arr, 2 * i + 1); + root.right = listToTreeDFS(arr, 2 * i + 2); + return root; +} + +/* Десериализовать список в двоичное дерево */ +TreeNode? listToTree(List arr) { + return listToTreeDFS(arr, 0); +} + +/* Сериализовать двоичное дерево в список: рекурсия */ +void treeToListDFS(TreeNode? root, int i, List res) { + if (root == null) return; + while (i >= res.length) { + res.add(null); + } + res[i] = root.val; + treeToListDFS(root.left, 2 * i + 1, res); + treeToListDFS(root.right, 2 * i + 2, res); +} + +/* Сериализовать двоичное дерево в список */ +List treeToList(TreeNode? root) { + List res = []; + treeToListDFS(root, 0, res); + return res; +} diff --git a/ru/codes/dart/utils/vertex.dart b/ru/codes/dart/utils/vertex.dart new file mode 100644 index 000000000..03fb10c1d --- /dev/null +++ b/ru/codes/dart/utils/vertex.dart @@ -0,0 +1,29 @@ +/** + * File: Vertex.dart + * Created Time: 2023-05-15 + * Author: liuyuxin (gvenusleo@gmail.com) + */ + +/* Класс вершины */ +class Vertex { + int val; + Vertex(this.val); + + /* На вход подается список значений vals, на выходе возвращается список вершин vets */ + static List valsToVets(List vals) { + List vets = []; + for (int i in vals) { + vets.add(Vertex(i)); + } + return vets; + } + + /* На вход подается список вершин vets, на выходе возвращается список значений vals */ + static List vetsToVals(List vets) { + List vals = []; + for (Vertex vet in vets) { + vals.add(vet.val); + } + return vals; + } +} diff --git a/ru/codes/docker-compose.yml b/ru/codes/docker-compose.yml new file mode 100644 index 000000000..cfeb4e559 --- /dev/null +++ b/ru/codes/docker-compose.yml @@ -0,0 +1,12 @@ +version: '3.8' +services: + hello-algo-code: + build: + context: . + args: + # Set the languages to be installed, separated by spaces + LANGS: "python cpp java csharp" + image: hello-algo-code + container_name: hello-algo-code + stdin_open: true + tty: true diff --git a/ru/codes/go/chapter_array_and_linkedlist/array.go b/ru/codes/go/chapter_array_and_linkedlist/array.go new file mode 100644 index 000000000..07fbb2b3d --- /dev/null +++ b/ru/codes/go/chapter_array_and_linkedlist/array.go @@ -0,0 +1,79 @@ +// File: array.go +// Created Time: 2022-12-29 +// Author: GuoWei (gongguowei01@gmail.com), cathay (cathaycchen@gmail.com) + +package chapter_array_and_linkedlist + +import ( + "math/rand" +) + +/* Случайный доступ к элементу */ +func randomAccess(nums []int) (randomNum int) { + // Случайным образом выбрать число из интервала [0, nums.length) + randomIndex := rand.Intn(len(nums)) + // Получить и вернуть случайный элемент + randomNum = nums[randomIndex] + return +} + +/* Увеличить длину массива */ +func extend(nums []int, enlarge int) []int { + // Инициализировать массив увеличенной длины + res := make([]int, len(nums)+enlarge) + // Скопировать все элементы исходного массива в новый массив + for i, num := range nums { + res[i] = num + } + // Вернуть новый массив после расширения + return res +} + +/* Вставить элемент num по индексу index в массив */ +func insert(nums []int, num int, index int) { + // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад + for i := len(nums) - 1; i > index; i-- { + nums[i] = nums[i-1] + } + // Присвоить num элементу по индексу index + nums[index] = num +} + +/* Удалить элемент по индексу index */ +func remove(nums []int, index int) { + // Сдвинуть все элементы после индекса index на одну позицию вперед + for i := index; i < len(nums)-1; i++ { + nums[i] = nums[i+1] + } +} + +/* Обход массива */ +func traverse(nums []int) { + count := 0 + // Обход массива по индексам + for i := 0; i < len(nums); i++ { + count += nums[i] + } + count = 0 + // Непосредственно обходить элементы массива + for _, num := range nums { + count += num + } + // Одновременно обходить индексы и элементы данных + for i, num := range nums { + count += nums[i] + count += num + } +} + +/* Найти заданный элемент в массиве */ +func find(nums []int, target int) (index int) { + index = -1 + for i := 0; i < len(nums); i++ { + if nums[i] == target { + index = i + break + } + } + return +} diff --git a/ru/codes/go/chapter_array_and_linkedlist/array_test.go b/ru/codes/go/chapter_array_and_linkedlist/array_test.go new file mode 100644 index 000000000..67b1e8c5b --- /dev/null +++ b/ru/codes/go/chapter_array_and_linkedlist/array_test.go @@ -0,0 +1,50 @@ +// File: array_test.go +// Created Time: 2022-12-29 +// Author: GuoWei (gongguowei01@gmail.com), cathay (cathaycchen@gmail.com) + +package chapter_array_and_linkedlist + +/** + * Мы рассматриваем срез Slice в Go как массив Array. Это позволяет + * снизить порог понимания и сосредоточиться на структурах данных и алгоритмах. + */ + +import ( + "fmt" + "testing" +) + +/* Driver Code */ +func TestArray(t *testing.T) { + /* Инициализация массива */ + var arr [5]int + fmt.Println("Массив arr =", arr) + // В Go при указании длины ([5]int) получается массив, а без указания длины ([]int) — срез + // Так как массивы в Go имеют длину, определяемую на этапе компиляции, для задания длины можно использовать только константы + // Для удобства реализации функции расширения extend() ниже срез (Slice) рассматривается как массив (Array) + nums := []int{1, 3, 2, 5, 4} + fmt.Println("Массив nums =", nums) + + /* Случайный доступ */ + randomNum := randomAccess(nums) + fmt.Println("Случайный элемент из nums =", randomNum) + + /* Расширение длины */ + nums = extend(nums, 3) + fmt.Println("После увеличения длины массива до 8 nums =", nums) + + /* Вставка элемента */ + insert(nums, 6, 3) + fmt.Println("После вставки числа 6 по индексу 3 nums =", nums) + + /* Удаление элемента */ + remove(nums, 2) + fmt.Println("После удаления элемента по индексу 2 nums =", nums) + + /* Обход массива */ + traverse(nums) + + /* Поиск элемента */ + index := find(nums, 3) + fmt.Println("Поиск элемента 3 в nums: индекс =", index) +} diff --git a/ru/codes/go/chapter_array_and_linkedlist/linked_list.go b/ru/codes/go/chapter_array_and_linkedlist/linked_list.go new file mode 100644 index 000000000..e0d8e54cc --- /dev/null +++ b/ru/codes/go/chapter_array_and_linkedlist/linked_list.go @@ -0,0 +1,51 @@ +// File: linked_list.go +// Created Time: 2022-12-29 +// Author: cathay (cathaycchen@gmail.com) + +package chapter_array_and_linkedlist + +import ( + . "github.com/krahets/hello-algo/pkg" +) + +/* Вставить узел P после узла n0 в связном списке */ +func insertNode(n0 *ListNode, P *ListNode) { + n1 := n0.Next + P.Next = n1 + n0.Next = P +} + +/* Удалить первый узел после узла n0 в связном списке */ +func removeItem(n0 *ListNode) { + if n0.Next == nil { + return + } + // n0 -> P -> n1 + P := n0.Next + n1 := P.Next + n0.Next = n1 +} + +/* Доступ к узлу связного списка по индексу index */ +func access(head *ListNode, index int) *ListNode { + for i := 0; i < index; i++ { + if head == nil { + return nil + } + head = head.Next + } + return head +} + +/* Найти в связном списке первый узел со значением target */ +func findNode(head *ListNode, target int) int { + index := 0 + for head != nil { + if head.Val == target { + return index + } + head = head.Next + index++ + } + return -1 +} diff --git a/ru/codes/go/chapter_array_and_linkedlist/linked_list_test.go b/ru/codes/go/chapter_array_and_linkedlist/linked_list_test.go new file mode 100644 index 000000000..3946c5a02 --- /dev/null +++ b/ru/codes/go/chapter_array_and_linkedlist/linked_list_test.go @@ -0,0 +1,48 @@ +// File: linked_list_test.go +// Created Time: 2022-12-29 +// Author: cathay (cathaycchen@gmail.com) + +package chapter_array_and_linkedlist + +import ( + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestLinkedList(t *testing.T) { + /* Инициализировать связный список 1 -> 3 -> 2 -> 5 -> 4 */ + // Инициализация всех узлов + n0 := NewListNode(1) + n1 := NewListNode(3) + n2 := NewListNode(2) + n3 := NewListNode(5) + n4 := NewListNode(4) + + // Построить ссылки между узлами + n0.Next = n1 + n1.Next = n2 + n2.Next = n3 + n3.Next = n4 + fmt.Println("Исходный связный список") + PrintLinkedList(n0) + + /* Вставка узла */ + insertNode(n0, NewListNode(0)) + fmt.Println("Связный список после вставки узла") + PrintLinkedList(n0) + + /* Удаление узла */ + removeItem(n0) + fmt.Println("Связный список после удаления узла") + PrintLinkedList(n0) + + /* Доступ к узлу */ + node := access(n0, 3) + fmt.Println("Значение узла по индексу 3 в связном списке =", node) + + /* Поиск узла */ + index := findNode(n0, 2) + fmt.Println("Индекс узла со значением 2 в связном списке =", index) +} diff --git a/ru/codes/go/chapter_array_and_linkedlist/list_test.go b/ru/codes/go/chapter_array_and_linkedlist/list_test.go new file mode 100644 index 000000000..1b6ccff91 --- /dev/null +++ b/ru/codes/go/chapter_array_and_linkedlist/list_test.go @@ -0,0 +1,66 @@ +// File: list_test.go +// Created Time: 2022-12-18 +// Author: msk397 (machangxinq@gmail.com) + +package chapter_array_and_linkedlist + +import ( + "fmt" + "sort" + "testing" +) + +/* Driver Code */ +func TestList(t *testing.T) { + /* Инициализация списка */ + nums := []int{1, 3, 2, 5, 4} + fmt.Println("Список nums =", nums) + + /* Доступ к элементу */ + num := nums[1] // Обратиться к элементу по индексу 1 + fmt.Println("Элемент по индексу 1: num =", num) + + /* Обновление элемента */ + nums[1] = 0 // Обновить элемент по индексу 1 до 0 + fmt.Println("После обновления элемента по индексу 1 до 0 nums =", nums) + + /* Очистить список */ + nums = nil + fmt.Println("После очистки списка nums =", nums) + + /* Добавление элемента в конец */ + nums = append(nums, 1) + nums = append(nums, 3) + nums = append(nums, 2) + nums = append(nums, 5) + nums = append(nums, 4) + fmt.Println("После добавления элементов nums =", nums) + + /* Вставка элемента в середину */ + nums = append(nums[:3], append([]int{6}, nums[3:]...)...) // Вставить число 6 по индексу 3 + fmt.Println("После вставки числа 6 по индексу 3 nums =", nums) + + /* Удаление элемента */ + nums = append(nums[:3], nums[4:]...) // Удалить элемент по индексу 3 + fmt.Println("После удаления элемента по индексу 3 nums =", nums) + + /* Обходить список по индексам */ + count := 0 + for i := 0; i < len(nums); i++ { + count += nums[i] + } + /* Непосредственно обходить элементы списка */ + count = 0 + for _, x := range nums { + count += x + } + + /* Объединить два списка */ + nums1 := []int{6, 8, 7, 10, 9} + nums = append(nums, nums1...) // Присоединить список nums1 после nums + fmt.Println("После конкатенации списка nums1 к nums nums =", nums) + + /* Отсортировать список */ + sort.Ints(nums) // После сортировки элементы списка располагаются по возрастанию + fmt.Println("После сортировки списка nums =", nums) +} diff --git a/ru/codes/go/chapter_array_and_linkedlist/my_list.go b/ru/codes/go/chapter_array_and_linkedlist/my_list.go new file mode 100644 index 000000000..eeb278bc2 --- /dev/null +++ b/ru/codes/go/chapter_array_and_linkedlist/my_list.go @@ -0,0 +1,109 @@ +// File: my_list.go +// Created Time: 2022-12-18 +// Author: msk397 (machangxinq@gmail.com) + +package chapter_array_and_linkedlist + +/* Класс списка */ +type myList struct { + arrCapacity int + arr []int + arrSize int + extendRatio int +} + +/* Конструктор */ +func newMyList() *myList { + return &myList{ + arrCapacity: 10, // Вместимость списка + arr: make([]int, 10), // Массив (для хранения элементов списка) + arrSize: 0, // Длина списка (текущее число элементов) + extendRatio: 2, // Коэффициент увеличения списка при каждом расширении + } +} + +/* Получить длину списка (текущее число элементов) */ +func (l *myList) size() int { + return l.arrSize +} + +/* Получить вместимость списка */ +func (l *myList) capacity() int { + return l.arrCapacity +} + +/* Доступ к элементу */ +func (l *myList) get(index int) int { + // Если индекс выходит за границы, выбрасывается исключение; далее аналогично + if index < 0 || index >= l.arrSize { + panic("индекс выходит за границы") + } + return l.arr[index] +} + +/* Обновление элемента */ +func (l *myList) set(num, index int) { + if index < 0 || index >= l.arrSize { + panic("индекс выходит за границы") + } + l.arr[index] = num +} + +/* Добавление элемента в конец */ +func (l *myList) add(num int) { + // При превышении вместимости по числу элементов запускается расширение + if l.arrSize == l.arrCapacity { + l.extendCapacity() + } + l.arr[l.arrSize] = num + // Обновить число элементов + l.arrSize++ +} + +/* Вставка элемента в середину */ +func (l *myList) insert(num, index int) { + if index < 0 || index >= l.arrSize { + panic("индекс выходит за границы") + } + // При превышении вместимости по числу элементов запускается расширение + if l.arrSize == l.arrCapacity { + l.extendCapacity() + } + // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад + for j := l.arrSize - 1; j >= index; j-- { + l.arr[j+1] = l.arr[j] + } + l.arr[index] = num + // Обновить число элементов + l.arrSize++ +} + +/* Удаление элемента */ +func (l *myList) remove(index int) int { + if index < 0 || index >= l.arrSize { + panic("индекс выходит за границы") + } + num := l.arr[index] + // Сдвинуть все элементы после индекса index на одну позицию вперед + for j := index; j < l.arrSize-1; j++ { + l.arr[j] = l.arr[j+1] + } + // Обновить число элементов + l.arrSize-- + // Вернуть удаленный элемент + return num +} + +/* Расширение списка */ +func (l *myList) extendCapacity() { + // Создать новый массив длиной в extendRatio раз больше исходного и скопировать в него исходный массив + l.arr = append(l.arr, make([]int, l.arrCapacity*(l.extendRatio-1))...) + // Обновить вместимость списка + l.arrCapacity = len(l.arr) +} + +/* Вернуть список фактической длины */ +func (l *myList) toArray() []int { + // Преобразовывать только элементы списка в пределах фактической длины + return l.arr[:l.arrSize] +} diff --git a/ru/codes/go/chapter_array_and_linkedlist/my_list_test.go b/ru/codes/go/chapter_array_and_linkedlist/my_list_test.go new file mode 100644 index 000000000..0ad6f8c33 --- /dev/null +++ b/ru/codes/go/chapter_array_and_linkedlist/my_list_test.go @@ -0,0 +1,46 @@ +// File: my_list_test.go +// Created Time: 2022-12-18 +// Author: msk397 (machangxinq@gmail.com) + +package chapter_array_and_linkedlist + +import ( + "fmt" + "testing" +) + +/* Driver Code */ +func TestMyList(t *testing.T) { + /* Инициализация списка */ + nums := newMyList() + /* Добавление элемента в конец */ + nums.add(1) + nums.add(3) + nums.add(2) + nums.add(5) + nums.add(4) + fmt.Printf("Список nums = %v, вместимость = %v, длина = %v\n", nums.toArray(), nums.capacity(), nums.size()) + + /* Вставка элемента в середину */ + nums.insert(6, 3) + fmt.Printf("После вставки числа 6 по индексу 3 nums = %v\n", nums.toArray()) + + /* Удаление элемента */ + nums.remove(3) + fmt.Printf("После удаления элемента по индексу 3 nums = %v\n", nums.toArray()) + + /* Доступ к элементу */ + num := nums.get(1) + fmt.Printf("Элемент по индексу 1: num = %v\n", num) + + /* Обновление элемента */ + nums.set(0, 1) + fmt.Printf("После обновления элемента по индексу 1 до 0 nums = %v\n", nums.toArray()) + + /* Проверка механизма расширения */ + for i := 0; i < 10; i++ { + // При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения + nums.add(i) + } + fmt.Printf("Список nums после увеличения вместимости = %v, вместимость = %v, длина = %v\n", nums.toArray(), nums.capacity(), nums.size()) +} diff --git a/ru/codes/go/chapter_backtracking/n_queens.go b/ru/codes/go/chapter_backtracking/n_queens.go new file mode 100644 index 000000000..bec68189e --- /dev/null +++ b/ru/codes/go/chapter_backtracking/n_queens.go @@ -0,0 +1,57 @@ +// File: n_queens.go +// Created Time: 2023-05-09 +// Author: Reanon (793584285@qq.com) + +package chapter_backtracking + +/* Алгоритм бэктрекинга: n ферзей */ +func backtrack(row, n int, state *[][]string, res *[][][]string, cols, diags1, diags2 *[]bool) { + // Когда все строки уже обработаны, записать решение + if row == n { + newState := make([][]string, len(*state)) + for i, _ := range newState { + newState[i] = make([]string, len((*state)[0])) + copy(newState[i], (*state)[i]) + + } + *res = append(*res, newState) + return + } + // Обойти все столбцы + for col := 0; col < n; col++ { + // Вычислить главную и побочную диагонали, соответствующие этой клетке + diag1 := row - col + n - 1 + diag2 := row + col + // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей + if !(*cols)[col] && !(*diags1)[diag1] && !(*diags2)[diag2] { + // Попытка: поставить ферзя в эту клетку + (*state)[row][col] = "Q" + (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = true, true, true + // Перейти к размещению следующей строки + backtrack(row+1, n, state, res, cols, diags1, diags2) + // Откат: восстановить эту клетку как пустую + (*state)[row][col] = "#" + (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = false, false, false + } + } +} + +/* Решить задачу о n ферзях */ +func nQueens(n int) [][][]string { + // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку + state := make([][]string, n) + for i := 0; i < n; i++ { + row := make([]string, n) + for i := 0; i < n; i++ { + row[i] = "#" + } + state[i] = row + } + // Отмечать, есть ли ферзь в столбце + cols := make([]bool, n) + diags1 := make([]bool, 2*n-1) + diags2 := make([]bool, 2*n-1) + res := make([][][]string, 0) + backtrack(0, n, &state, &res, &cols, &diags1, &diags2) + return res +} diff --git a/ru/codes/go/chapter_backtracking/n_queens_test.go b/ru/codes/go/chapter_backtracking/n_queens_test.go new file mode 100644 index 000000000..2219a6e9c --- /dev/null +++ b/ru/codes/go/chapter_backtracking/n_queens_test.go @@ -0,0 +1,24 @@ +// File: n_queens_test.go +// Created Time: 2023-05-14 +// Author: Reanon (793584285@qq.com) + +package chapter_backtracking + +import ( + "fmt" + "testing" +) + +func TestNQueens(t *testing.T) { + n := 4 + res := nQueens(n) + + fmt.Println("Размер входной доски =", n) + fmt.Println("Количество способов расстановки ферзей:", len(res)) + for _, state := range res { + fmt.Println("--------------------") + for _, row := range state { + fmt.Println(row) + } + } +} diff --git a/ru/codes/go/chapter_backtracking/permutation_test.go b/ru/codes/go/chapter_backtracking/permutation_test.go new file mode 100644 index 000000000..590328da7 --- /dev/null +++ b/ru/codes/go/chapter_backtracking/permutation_test.go @@ -0,0 +1,33 @@ +// File: permutation_test.go +// Created Time: 2023-05-09 +// Author: Reanon (793584285@qq.com) + +package chapter_backtracking + +import ( + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestPermutationI(t *testing.T) { + /* Все перестановки I */ + nums := []int{1, 2, 3} + fmt.Printf("Входной массив nums = ") + PrintSlice(nums) + + res := permutationsI(nums) + fmt.Printf("Все перестановки res = ") + fmt.Println(res) +} + +func TestPermutationII(t *testing.T) { + nums := []int{1, 2, 2} + fmt.Printf("Входной массив nums = ") + PrintSlice(nums) + + res := permutationsII(nums) + fmt.Printf("Все перестановки res = ") + fmt.Println(res) +} diff --git a/ru/codes/go/chapter_backtracking/permutations_i.go b/ru/codes/go/chapter_backtracking/permutations_i.go new file mode 100644 index 000000000..80e71ac07 --- /dev/null +++ b/ru/codes/go/chapter_backtracking/permutations_i.go @@ -0,0 +1,38 @@ +// File: permutations_i.go +// Created Time: 2023-05-14 +// Author: Reanon (793584285@qq.com) + +package chapter_backtracking + +/* Алгоритм бэктрекинга: все перестановки I */ +func backtrackI(state *[]int, choices *[]int, selected *[]bool, res *[][]int) { + // Когда длина состояния равна числу элементов, записать решение + if len(*state) == len(*choices) { + newState := append([]int{}, *state...) + *res = append(*res, newState) + } + // Перебор всех вариантов выбора + for i := 0; i < len(*choices); i++ { + choice := (*choices)[i] + // Отсечение: нельзя выбирать один и тот же элемент повторно + if !(*selected)[i] { + // Попытка: сделать выбор и обновить состояние + (*selected)[i] = true + *state = append(*state, choice) + // Перейти к следующему выбору + backtrackI(state, choices, selected, res) + // Откат: отменить выбор и восстановить предыдущее состояние + (*selected)[i] = false + *state = (*state)[:len(*state)-1] + } + } +} + +/* Все перестановки I */ +func permutationsI(nums []int) [][]int { + res := make([][]int, 0) + state := make([]int, 0) + selected := make([]bool, len(nums)) + backtrackI(&state, &nums, &selected, &res) + return res +} diff --git a/ru/codes/go/chapter_backtracking/permutations_ii.go b/ru/codes/go/chapter_backtracking/permutations_ii.go new file mode 100644 index 000000000..c020e93fe --- /dev/null +++ b/ru/codes/go/chapter_backtracking/permutations_ii.go @@ -0,0 +1,41 @@ +// File: permutations_ii.go +// Created Time: 2023-05-14 +// Author: Reanon (793584285@qq.com) + +package chapter_backtracking + +/* Алгоритм бэктрекинга: все перестановки II */ +func backtrackII(state *[]int, choices *[]int, selected *[]bool, res *[][]int) { + // Когда длина состояния равна числу элементов, записать решение + if len(*state) == len(*choices) { + newState := append([]int{}, *state...) + *res = append(*res, newState) + } + // Перебор всех вариантов выбора + duplicated := make(map[int]struct{}, 0) + for i := 0; i < len(*choices); i++ { + choice := (*choices)[i] + // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы + if _, ok := duplicated[choice]; !ok && !(*selected)[i] { + // Попробовать: сделать выбор, обновить состояние + // Записать значение уже выбранного элемента + duplicated[choice] = struct{}{} + (*selected)[i] = true + *state = append(*state, choice) + // Перейти к следующему выбору + backtrackII(state, choices, selected, res) + // Откат: отменить выбор и восстановить предыдущее состояние + (*selected)[i] = false + *state = (*state)[:len(*state)-1] + } + } +} + +/* Все перестановки II */ +func permutationsII(nums []int) [][]int { + res := make([][]int, 0) + state := make([]int, 0) + selected := make([]bool, len(nums)) + backtrackII(&state, &nums, &selected, &res) + return res +} diff --git a/ru/codes/go/chapter_backtracking/preorder_traversal_i_compact.go b/ru/codes/go/chapter_backtracking/preorder_traversal_i_compact.go new file mode 100644 index 000000000..23596177f --- /dev/null +++ b/ru/codes/go/chapter_backtracking/preorder_traversal_i_compact.go @@ -0,0 +1,22 @@ +// File: preorder_traversal_i_compact.go +// Created Time: 2023-05-09 +// Author: Reanon (793584285@qq.com) + +package chapter_backtracking + +import ( + . "github.com/krahets/hello-algo/pkg" +) + +/* Предварительный обход: пример 1 */ +func preOrderI(root *TreeNode, res *[]*TreeNode) { + if root == nil { + return + } + if (root.Val).(int) == 7 { + // Записать решение + *res = append(*res, root) + } + preOrderI(root.Left, res) + preOrderI(root.Right, res) +} diff --git a/ru/codes/go/chapter_backtracking/preorder_traversal_ii_compact.go b/ru/codes/go/chapter_backtracking/preorder_traversal_ii_compact.go new file mode 100644 index 000000000..a028c4076 --- /dev/null +++ b/ru/codes/go/chapter_backtracking/preorder_traversal_ii_compact.go @@ -0,0 +1,26 @@ +// File: preorder_traversal_ii_compact.go +// Created Time: 2023-05-09 +// Author: Reanon (793584285@qq.com) + +package chapter_backtracking + +import ( + . "github.com/krahets/hello-algo/pkg" +) + +/* Предварительный обход: пример 2 */ +func preOrderII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) { + if root == nil { + return + } + // Попытка + *path = append(*path, root) + if root.Val.(int) == 7 { + // Записать решение + *res = append(*res, append([]*TreeNode{}, *path...)) + } + preOrderII(root.Left, res, path) + preOrderII(root.Right, res, path) + // Откат + *path = (*path)[:len(*path)-1] +} diff --git a/ru/codes/go/chapter_backtracking/preorder_traversal_iii_compact.go b/ru/codes/go/chapter_backtracking/preorder_traversal_iii_compact.go new file mode 100644 index 000000000..bacead63b --- /dev/null +++ b/ru/codes/go/chapter_backtracking/preorder_traversal_iii_compact.go @@ -0,0 +1,27 @@ +// File: preorder_traversal_iii_compact.go +// Created Time: 2023-05-09 +// Author: Reanon (793584285@qq.com) + +package chapter_backtracking + +import ( + . "github.com/krahets/hello-algo/pkg" +) + +/* Предварительный обход: пример 3 */ +func preOrderIII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) { + // Отсечение + if root == nil || root.Val == 3 { + return + } + // Попытка + *path = append(*path, root) + if root.Val.(int) == 7 { + // Записать решение + *res = append(*res, append([]*TreeNode{}, *path...)) + } + preOrderIII(root.Left, res, path) + preOrderIII(root.Right, res, path) + // Откат + *path = (*path)[:len(*path)-1] +} diff --git a/ru/codes/go/chapter_backtracking/preorder_traversal_iii_template.go b/ru/codes/go/chapter_backtracking/preorder_traversal_iii_template.go new file mode 100644 index 000000000..9fefdd93d --- /dev/null +++ b/ru/codes/go/chapter_backtracking/preorder_traversal_iii_template.go @@ -0,0 +1,57 @@ +// File: preorder_traversal_iii_template.go +// Created Time: 2023-05-09 +// Author: Reanon (793584285@qq.com) + +package chapter_backtracking + +import ( + . "github.com/krahets/hello-algo/pkg" +) + +/* Проверить, является ли текущее состояние решением */ +func isSolution(state *[]*TreeNode) bool { + return len(*state) != 0 && (*state)[len(*state)-1].Val == 7 +} + +/* Записать решение */ +func recordSolution(state *[]*TreeNode, res *[][]*TreeNode) { + *res = append(*res, append([]*TreeNode{}, *state...)) +} + +/* Проверить, допустим ли этот выбор в текущем состоянии */ +func isValid(state *[]*TreeNode, choice *TreeNode) bool { + return choice != nil && choice.Val != 3 +} + +/* Обновить состояние */ +func makeChoice(state *[]*TreeNode, choice *TreeNode) { + *state = append(*state, choice) +} + +/* Восстановить состояние */ +func undoChoice(state *[]*TreeNode, choice *TreeNode) { + *state = (*state)[:len(*state)-1] +} + +/* Алгоритм бэктрекинга: пример 3 */ +func backtrackIII(state *[]*TreeNode, choices *[]*TreeNode, res *[][]*TreeNode) { + // Проверить, является ли текущее состояние решением + if isSolution(state) { + // Записать решение + recordSolution(state, res) + } + // Перебор всех вариантов выбора + for _, choice := range *choices { + // Отсечение: проверить допустимость выбора + if isValid(state, choice) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state, choice) + // Перейти к следующему выбору + temp := make([]*TreeNode, 0) + temp = append(temp, choice.Left, choice.Right) + backtrackIII(state, &temp, res) + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state, choice) + } + } +} diff --git a/ru/codes/go/chapter_backtracking/preorder_traversal_test.go b/ru/codes/go/chapter_backtracking/preorder_traversal_test.go new file mode 100644 index 000000000..f15709b89 --- /dev/null +++ b/ru/codes/go/chapter_backtracking/preorder_traversal_test.go @@ -0,0 +1,91 @@ +// File: preorder_traversal_i_compact_test.go +// Created Time: 2023-05-09 +// Author: Reanon (793584285@qq.com) + +package chapter_backtracking + +import ( + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestPreorderTraversalICompact(t *testing.T) { + /* Инициализация двоичного дерева */ + root := SliceToTree([]any{1, 7, 3, 4, 5, 6, 7}) + fmt.Println("\nИнициализация двоичного дерева") + PrintTree(root) + + // Предварительный обход + res := make([]*TreeNode, 0) + preOrderI(root, &res) + + fmt.Println("\nВсе узлы со значением 7") + for _, node := range res { + fmt.Printf("%v ", node.Val) + } + fmt.Println() +} + +func TestPreorderTraversalIICompact(t *testing.T) { + /* Инициализация двоичного дерева */ + root := SliceToTree([]any{1, 7, 3, 4, 5, 6, 7}) + fmt.Println("\nИнициализация двоичного дерева") + PrintTree(root) + + // Предварительный обход + path := make([]*TreeNode, 0) + res := make([][]*TreeNode, 0) + preOrderII(root, &res, &path) + + fmt.Println("\nВсе пути от корня к узлу 7") + for _, path := range res { + for _, node := range path { + fmt.Printf("%v ", node.Val) + } + fmt.Println() + } +} + +func TestPreorderTraversalIIICompact(t *testing.T) { + /* Инициализация двоичного дерева */ + root := SliceToTree([]any{1, 7, 3, 4, 5, 6, 7}) + fmt.Println("\nИнициализация двоичного дерева") + PrintTree(root) + + // Предварительный обход + path := make([]*TreeNode, 0) + res := make([][]*TreeNode, 0) + preOrderIII(root, &res, &path) + + fmt.Println("\nВсе пути от корня к узлу 7, не содержащие узлов со значением 3") + for _, path := range res { + for _, node := range path { + fmt.Printf("%v ", node.Val) + } + fmt.Println() + } +} + +func TestPreorderTraversalIIITemplate(t *testing.T) { + /* Инициализация двоичного дерева */ + root := SliceToTree([]any{1, 7, 3, 4, 5, 6, 7}) + fmt.Println("\nИнициализация двоичного дерева") + PrintTree(root) + + // Алгоритм бэктрекинга + res := make([][]*TreeNode, 0) + state := make([]*TreeNode, 0) + choices := make([]*TreeNode, 0) + choices = append(choices, root) + backtrackIII(&state, &choices, &res) + + fmt.Println("\nВсе пути от корня к узлу 7, не содержащие узлов со значением 3") + for _, path := range res { + for _, node := range path { + fmt.Printf("%v ", node.Val) + } + fmt.Println() + } +} diff --git a/ru/codes/go/chapter_backtracking/subset_sum_i.go b/ru/codes/go/chapter_backtracking/subset_sum_i.go new file mode 100644 index 000000000..1a4f01d60 --- /dev/null +++ b/ru/codes/go/chapter_backtracking/subset_sum_i.go @@ -0,0 +1,42 @@ +// File: subset_sum_i.go +// Created Time: 2023-06-24 +// Author: Reanon (793584285@qq.com) + +package chapter_backtracking + +import "sort" + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +func backtrackSubsetSumI(start, target int, state, choices *[]int, res *[][]int) { + // Если сумма подмножества равна target, записать решение + if target == 0 { + newState := append([]int{}, *state...) + *res = append(*res, newState) + return + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + for i := start; i < len(*choices); i++ { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if target-(*choices)[i] < 0 { + break + } + // Попытка: сделать выбор и обновить target и start + *state = append(*state, (*choices)[i]) + // Перейти к следующему выбору + backtrackSubsetSumI(i, target-(*choices)[i], state, choices, res) + // Откат: отменить выбор и восстановить предыдущее состояние + *state = (*state)[:len(*state)-1] + } +} + +/* Решить задачу суммы подмножеств I */ +func subsetSumI(nums []int, target int) [][]int { + state := make([]int, 0) // Состояние (подмножество) + sort.Ints(nums) // Отсортировать nums + start := 0 // Стартовая вершина обхода + res := make([][]int, 0) // Список результатов (список подмножеств) + backtrackSubsetSumI(start, target, &state, &nums, &res) + return res +} diff --git a/ru/codes/go/chapter_backtracking/subset_sum_i_naive.go b/ru/codes/go/chapter_backtracking/subset_sum_i_naive.go new file mode 100644 index 000000000..2c2490206 --- /dev/null +++ b/ru/codes/go/chapter_backtracking/subset_sum_i_naive.go @@ -0,0 +1,37 @@ +// File: subset_sum_i_naive.go +// Created Time: 2023-06-24 +// Author: Reanon (793584285@qq.com) + +package chapter_backtracking + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +func backtrackSubsetSumINaive(total, target int, state, choices *[]int, res *[][]int) { + // Если сумма подмножества равна target, записать решение + if target == total { + newState := append([]int{}, *state...) + *res = append(*res, newState) + return + } + // Перебор всех вариантов выбора + for i := 0; i < len(*choices); i++ { + // Отсечение: если сумма подмножества превышает target, пропустить этот выбор + if total+(*choices)[i] > target { + continue + } + // Попытка: сделать выбор и обновить элемент и total + *state = append(*state, (*choices)[i]) + // Перейти к следующему выбору + backtrackSubsetSumINaive(total+(*choices)[i], target, state, choices, res) + // Откат: отменить выбор и восстановить предыдущее состояние + *state = (*state)[:len(*state)-1] + } +} + +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */ +func subsetSumINaive(nums []int, target int) [][]int { + state := make([]int, 0) // Состояние (подмножество) + total := 0 // Сумма подмножеств + res := make([][]int, 0) // Список результатов (список подмножеств) + backtrackSubsetSumINaive(total, target, &state, &nums, &res) + return res +} diff --git a/ru/codes/go/chapter_backtracking/subset_sum_ii.go b/ru/codes/go/chapter_backtracking/subset_sum_ii.go new file mode 100644 index 000000000..ed644fcff --- /dev/null +++ b/ru/codes/go/chapter_backtracking/subset_sum_ii.go @@ -0,0 +1,47 @@ +// File: subset_sum_ii.go +// Created Time: 2023-06-24 +// Author: Reanon (793584285@qq.com) + +package chapter_backtracking + +import "sort" + +/* Алгоритм бэктрекинга: сумма подмножеств II */ +func backtrackSubsetSumII(start, target int, state, choices *[]int, res *[][]int) { + // Если сумма подмножества равна target, записать решение + if target == 0 { + newState := append([]int{}, *state...) + *res = append(*res, newState) + return + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента + for i := start; i < len(*choices); i++ { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if target-(*choices)[i] < 0 { + break + } + // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить + if i > start && (*choices)[i] == (*choices)[i-1] { + continue + } + // Попытка: сделать выбор и обновить target и start + *state = append(*state, (*choices)[i]) + // Перейти к следующему выбору + backtrackSubsetSumII(i+1, target-(*choices)[i], state, choices, res) + // Откат: отменить выбор и восстановить предыдущее состояние + *state = (*state)[:len(*state)-1] + } +} + +/* Решить задачу суммы подмножеств II */ +func subsetSumII(nums []int, target int) [][]int { + state := make([]int, 0) // Состояние (подмножество) + sort.Ints(nums) // Отсортировать nums + start := 0 // Стартовая вершина обхода + res := make([][]int, 0) // Список результатов (список подмножеств) + backtrackSubsetSumII(start, target, &state, &nums, &res) + return res +} diff --git a/ru/codes/go/chapter_backtracking/subset_sum_test.go b/ru/codes/go/chapter_backtracking/subset_sum_test.go new file mode 100644 index 000000000..b8b2652be --- /dev/null +++ b/ru/codes/go/chapter_backtracking/subset_sum_test.go @@ -0,0 +1,56 @@ +// File: subset_sum_test.go +// Created Time: 2023-06-24 +// Author: Reanon (793584285@qq.com) + +package chapter_backtracking + +import ( + "fmt" + "strconv" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestSubsetSumINaive(t *testing.T) { + nums := []int{3, 4, 5} + target := 9 + res := subsetSumINaive(nums, target) + + fmt.Printf("target = " + strconv.Itoa(target) + ", входной массив nums = ") + PrintSlice(nums) + + fmt.Println("Все подмножества с суммой " + strconv.Itoa(target) + ": res = ") + for i := range res { + PrintSlice(res[i]) + } + fmt.Println("Обратите внимание: результат этого метода содержит повторяющиеся множества") +} + +func TestSubsetSumI(t *testing.T) { + nums := []int{3, 4, 5} + target := 9 + res := subsetSumI(nums, target) + + fmt.Printf("target = " + strconv.Itoa(target) + ", входной массив nums = ") + PrintSlice(nums) + + fmt.Println("Все подмножества с суммой " + strconv.Itoa(target) + ": res = ") + for i := range res { + PrintSlice(res[i]) + } +} + +func TestSubsetSumII(t *testing.T) { + nums := []int{4, 4, 5} + target := 9 + res := subsetSumII(nums, target) + + fmt.Printf("target = " + strconv.Itoa(target) + ", входной массив nums = ") + PrintSlice(nums) + + fmt.Println("Все подмножества с суммой " + strconv.Itoa(target) + ": res = ") + for i := range res { + PrintSlice(res[i]) + } +} diff --git a/ru/codes/go/chapter_computational_complexity/iteration.go b/ru/codes/go/chapter_computational_complexity/iteration.go new file mode 100644 index 000000000..157e6eb59 --- /dev/null +++ b/ru/codes/go/chapter_computational_complexity/iteration.go @@ -0,0 +1,59 @@ +// File: iteration.go +// Created Time: 2023-08-28 +// Author: Reanon (793584285@qq.com) + +package chapter_computational_complexity + +import "fmt" + +/* Цикл for */ +func forLoop(n int) int { + res := 0 + // Циклическое суммирование 1, 2, ..., n-1, n + for i := 1; i <= n; i++ { + res += i + } + return res +} + +/* Цикл while */ +func whileLoop(n int) int { + res := 0 + // Инициализация условной переменной + i := 1 + // Циклическое суммирование 1, 2, ..., n-1, n + for i <= n { + res += i + // Обновить условную переменную + i++ + } + return res +} + +/* Цикл while (двойное обновление) */ +func whileLoopII(n int) int { + res := 0 + // Инициализация условной переменной + i := 1 + // Циклическое суммирование 1, 4, 10, ... + for i <= n { + res += i + // Обновить условную переменную + i++ + i *= 2 + } + return res +} + +/* Двойной цикл for */ +func nestedForLoop(n int) string { + res := "" + // Цикл по i = 1, 2, ..., n-1, n + for i := 1; i <= n; i++ { + for j := 1; j <= n; j++ { + // Цикл по j = 1, 2, ..., n-1, n + res += fmt.Sprintf("(%d, %d), ", i, j) + } + } + return res +} diff --git a/ru/codes/go/chapter_computational_complexity/iteration_test.go b/ru/codes/go/chapter_computational_complexity/iteration_test.go new file mode 100644 index 000000000..901418d2a --- /dev/null +++ b/ru/codes/go/chapter_computational_complexity/iteration_test.go @@ -0,0 +1,26 @@ +// File: iteration_test.go +// Created Time: 2023-08-28 +// Author: Reanon (793584285@qq.com) + +package chapter_computational_complexity + +import ( + "fmt" + "testing" +) + +/* Driver Code */ +func TestIteration(t *testing.T) { + n := 5 + res := forLoop(n) + fmt.Println("\nРезультат суммирования в цикле for res = ", res) + + res = whileLoop(n) + fmt.Println("\nРезультат суммирования в цикле while res = ", res) + + res = whileLoopII(n) + fmt.Println("\nРезультат суммирования в цикле while (двойное обновление) res = ", res) + + resStr := nestedForLoop(n) + fmt.Println("\nРезультат обхода в двойном цикле for ", resStr) +} diff --git a/ru/codes/go/chapter_computational_complexity/recursion.go b/ru/codes/go/chapter_computational_complexity/recursion.go new file mode 100644 index 000000000..4a9bdac39 --- /dev/null +++ b/ru/codes/go/chapter_computational_complexity/recursion.go @@ -0,0 +1,61 @@ +// File: recursion.go +// Created Time: 2023-08-28 +// Author: Reanon (793584285@qq.com) + +package chapter_computational_complexity + +import "container/list" + +/* Рекурсия */ +func recur(n int) int { + // Условие завершения + if n == 1 { + return 1 + } + // Рекурсия: рекурсивный вызов + res := recur(n - 1) + // Возврат: вернуть результат + return n + res +} + +/* Имитация рекурсии итерацией */ +func forLoopRecur(n int) int { + // Использовать явный стек для имитации системного стека вызовов + stack := list.New() + res := 0 + // Рекурсия: рекурсивный вызов + for i := n; i > 0; i-- { + // Имитировать «рекурсию» с помощью операции помещения в стек + stack.PushBack(i) + } + // Возврат: вернуть результат + for stack.Len() != 0 { + // Имитировать «возврат» с помощью операции извлечения из стека + res += stack.Back().Value.(int) + stack.Remove(stack.Back()) + } + // res = 1+2+3+...+n + return res +} + +/* Хвостовая рекурсия */ +func tailRecur(n int, res int) int { + // Условие завершения + if n == 0 { + return res + } + // Хвостовой рекурсивный вызов + return tailRecur(n-1, res+n) +} + +/* Последовательность Фибоначчи: рекурсия */ +func fib(n int) int { + // Условие завершения: f(1) = 0, f(2) = 1 + if n == 1 || n == 2 { + return n - 1 + } + // Рекурсивный вызов f(n) = f(n-1) + f(n-2) + res := fib(n-1) + fib(n-2) + // Вернуть результат f(n) + return res +} diff --git a/ru/codes/go/chapter_computational_complexity/recursion_test.go b/ru/codes/go/chapter_computational_complexity/recursion_test.go new file mode 100644 index 000000000..6ac15f4a7 --- /dev/null +++ b/ru/codes/go/chapter_computational_complexity/recursion_test.go @@ -0,0 +1,26 @@ +// File: recursion_test.go +// Created Time: 2023-08-28 +// Author: Reanon (793584285@qq.com) + +package chapter_computational_complexity + +import ( + "fmt" + "testing" +) + +/* Driver Code */ +func TestRecursion(t *testing.T) { + n := 5 + res := recur(n) + fmt.Println("\nРезультат суммирования в рекурсивной функции res = ", res) + + res = forLoopRecur(n) + fmt.Println("\nРезультат суммирования при имитации рекурсии итерацией res = ", res) + + res = tailRecur(n, 0) + fmt.Println("\nРезультат суммирования в хвостовой рекурсии res = ", res) + + res = fib(n) + fmt.Println("\nЧлен последовательности Фибоначчи с номером", n, "=", res) +} diff --git a/ru/codes/go/chapter_computational_complexity/space_complexity.go b/ru/codes/go/chapter_computational_complexity/space_complexity.go new file mode 100644 index 000000000..bd6e24fca --- /dev/null +++ b/ru/codes/go/chapter_computational_complexity/space_complexity.go @@ -0,0 +1,106 @@ +// File: space_complexity.go +// Created Time: 2022-12-15 +// Author: cathay (cathaycchen@gmail.com) + +package chapter_computational_complexity + +import ( + "fmt" + "strconv" + + . "github.com/krahets/hello-algo/pkg" +) + +/* Структура */ +type node struct { + val int + next *node +} + +/* Создать структуру node */ +func newNode(val int) *node { + return &node{val: val} +} + +/* Функция */ +func function() int { + // Выполнить некоторые операции... + return 0 +} + +/* Постоянная сложность */ +func spaceConstant(n int) { + // Константы, переменные и объекты занимают O(1) памяти + const a = 0 + b := 0 + nums := make([]int, 10000) + node := newNode(0) + // Переменные в цикле занимают O(1) памяти + var c int + for i := 0; i < n; i++ { + c = 0 + } + // Функции в цикле занимают O(1) памяти + for i := 0; i < n; i++ { + function() + } + b += 0 + c += 0 + nums[0] = 0 + node.val = 0 +} + +/* Линейная сложность */ +func spaceLinear(n int) { + // Массив длины n занимает O(n) памяти + _ = make([]int, n) + // Список длины n занимает O(n) памяти + var nodes []*node + for i := 0; i < n; i++ { + nodes = append(nodes, newNode(i)) + } + // Хеш-таблица длины n занимает O(n) памяти + m := make(map[int]string, n) + for i := 0; i < n; i++ { + m[i] = strconv.Itoa(i) + } +} + +/* Линейная сложность (рекурсивная реализация) */ +func spaceLinearRecur(n int) { + fmt.Println("Рекурсия n =", n) + if n == 1 { + return + } + spaceLinearRecur(n - 1) +} + +/* Квадратичная сложность */ +func spaceQuadratic(n int) { + // Матрица занимает O(n^2) памяти + numMatrix := make([][]int, n) + for i := 0; i < n; i++ { + numMatrix[i] = make([]int, n) + } +} + +/* Квадратичная сложность (рекурсивная реализация) */ +func spaceQuadraticRecur(n int) int { + if n <= 0 { + return 0 + } + nums := make([]int, n) + fmt.Printf("В рекурсии n = %d, длина nums = %d\n", n, len(nums)) + return spaceQuadraticRecur(n - 1) +} + +/* Экспоненциальная сложность (построение полного двоичного дерева) */ +func buildTree(n int) *TreeNode { + if n == 0 { + return nil + } + root := NewTreeNode(0) + root.Left = buildTree(n - 1) + root.Right = buildTree(n - 1) + return root +} diff --git a/ru/codes/go/chapter_computational_complexity/space_complexity_test.go b/ru/codes/go/chapter_computational_complexity/space_complexity_test.go new file mode 100644 index 000000000..351aec6e6 --- /dev/null +++ b/ru/codes/go/chapter_computational_complexity/space_complexity_test.go @@ -0,0 +1,26 @@ +// File: space_complexity_test.go +// Created Time: 2022-12-15 +// Author: cathay (cathaycchen@gmail.com) + +package chapter_computational_complexity + +import ( + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestSpaceComplexity(t *testing.T) { + n := 5 + // Постоянная сложность + spaceConstant(n) + // Линейная сложность + spaceLinear(n) + spaceLinearRecur(n) + // Квадратичная сложность + spaceQuadratic(n) + spaceQuadraticRecur(n) + // Экспоненциальная сложность + root := buildTree(n) + PrintTree(root) +} diff --git a/ru/codes/go/chapter_computational_complexity/time_complexity.go b/ru/codes/go/chapter_computational_complexity/time_complexity.go new file mode 100644 index 000000000..4f4cd790c --- /dev/null +++ b/ru/codes/go/chapter_computational_complexity/time_complexity.go @@ -0,0 +1,130 @@ +// File: time_complexity.go +// Created Time: 2022-12-13 +// Author: msk397 (machangxinq@gmail.com) + +package chapter_computational_complexity + +/* Постоянная сложность */ +func constant(n int) int { + count := 0 + size := 100000 + for i := 0; i < size; i++ { + count++ + } + return count +} + +/* Линейная сложность */ +func linear(n int) int { + count := 0 + for i := 0; i < n; i++ { + count++ + } + return count +} + +/* Линейная сложность (обход массива) */ +func arrayTraversal(nums []int) int { + count := 0 + // Число итераций пропорционально длине массива + for range nums { + count++ + } + return count +} + +/* Квадратичная сложность */ +func quadratic(n int) int { + count := 0 + // Число итераций квадратично зависит от размера данных n + for i := 0; i < n; i++ { + for j := 0; j < n; j++ { + count++ + } + } + return count +} + +/* Квадратичная сложность (пузырьковая сортировка) */ +func bubbleSort(nums []int) int { + count := 0 // Счетчик + // Внешний цикл: неотсортированный диапазон [0, i] + for i := len(nums) - 1; i > 0; i-- { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for j := 0; j < i; j++ { + if nums[j] > nums[j+1] { + // Поменять местами nums[j] и nums[j + 1] + tmp := nums[j] + nums[j] = nums[j+1] + nums[j+1] = tmp + count += 3 // Обмен элементов включает 3 элементарные операции + } + } + } + return count +} + +/* Экспоненциальная сложность (итеративная реализация) */ +func exponential(n int) int { + count, base := 0, 1 + // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1) + for i := 0; i < n; i++ { + for j := 0; j < base; j++ { + count++ + } + base *= 2 + } + // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1 + return count +} + +/* Экспоненциальная сложность (рекурсивная реализация) */ +func expRecur(n int) int { + if n == 1 { + return 1 + } + return expRecur(n-1) + expRecur(n-1) + 1 +} + +/* Логарифмическая сложность (итеративная реализация) */ +func logarithmic(n int) int { + count := 0 + for n > 1 { + n = n / 2 + count++ + } + return count +} + +/* Логарифмическая сложность (рекурсивная реализация) */ +func logRecur(n int) int { + if n <= 1 { + return 0 + } + return logRecur(n/2) + 1 +} + +/* Линейно-логарифмическая сложность */ +func linearLogRecur(n int) int { + if n <= 1 { + return 1 + } + count := linearLogRecur(n/2) + linearLogRecur(n/2) + for i := 0; i < n; i++ { + count++ + } + return count +} + +/* Факториальная сложность (рекурсивная реализация) */ +func factorialRecur(n int) int { + if n == 0 { + return 1 + } + count := 0 + // Из одного получается n + for i := 0; i < n; i++ { + count += factorialRecur(n - 1) + } + return count +} diff --git a/ru/codes/go/chapter_computational_complexity/time_complexity_test.go b/ru/codes/go/chapter_computational_complexity/time_complexity_test.go new file mode 100644 index 000000000..261f32e49 --- /dev/null +++ b/ru/codes/go/chapter_computational_complexity/time_complexity_test.go @@ -0,0 +1,48 @@ +// File: time_complexity_test.go +// Created Time: 2022-12-13 +// Author: msk397 (machangxinq@gmail.com) + +package chapter_computational_complexity + +import ( + "fmt" + "testing" +) + +func TestTimeComplexity(t *testing.T) { + n := 8 + fmt.Println("Размер входных данных n =", n) + + count := constant(n) + fmt.Println("Число операций константной сложности =", count) + + count = linear(n) + fmt.Println("Число операций линейной сложности =", count) + count = arrayTraversal(make([]int, n)) + fmt.Println("Число операций линейной сложности (обход массива) =", count) + + count = quadratic(n) + fmt.Println("Число операций квадратичной сложности =", count) + nums := make([]int, n) + for i := 0; i < n; i++ { + nums[i] = n - i + } + count = bubbleSort(nums) + fmt.Println("Число операций квадратичной сложности (пузырьковая сортировка) =", count) + + count = exponential(n) + fmt.Println("Число операций экспоненциальной сложности (итеративная реализация) =", count) + count = expRecur(n) + fmt.Println("Число операций экспоненциальной сложности (рекурсивная реализация) =", count) + + count = logarithmic(n) + fmt.Println("Число операций логарифмической сложности (итеративная реализация) =", count) + count = logRecur(n) + fmt.Println("Число операций логарифмической сложности (рекурсивная реализация) =", count) + + count = linearLogRecur(n) + fmt.Println("Число операций линейно-логарифмической сложности (рекурсивная реализация) =", count) + + count = factorialRecur(n) + fmt.Println("Число операций факториальной сложности (рекурсивная реализация) =", count) +} diff --git a/ru/codes/go/chapter_computational_complexity/worst_best_time_complexity.go b/ru/codes/go/chapter_computational_complexity/worst_best_time_complexity.go new file mode 100644 index 000000000..4f5d3a8e8 --- /dev/null +++ b/ru/codes/go/chapter_computational_complexity/worst_best_time_complexity.go @@ -0,0 +1,35 @@ +// File: worst_best_time_complexity.go +// Created Time: 2022-12-13 +// Author: msk397 (machangxinq@gmail.com), cathay (cathaycchen@gmail.com) + +package chapter_computational_complexity + +import ( + "math/rand" +) + +/* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */ +func randomNumbers(n int) []int { + nums := make([]int, n) + // Создать массив nums = { 1, 2, 3, ..., n } + for i := 0; i < n; i++ { + nums[i] = i + 1 + } + // Случайно перемешать элементы массива + rand.Shuffle(len(nums), func(i, j int) { + nums[i], nums[j] = nums[j], nums[i] + }) + return nums +} + +/* Найти индекс числа 1 в массиве nums */ +func findOne(nums []int) int { + for i := 0; i < len(nums); i++ { + // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1) + // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n) + if nums[i] == 1 { + return i + } + } + return -1 +} diff --git a/ru/codes/go/chapter_computational_complexity/worst_best_time_complexity_test.go b/ru/codes/go/chapter_computational_complexity/worst_best_time_complexity_test.go new file mode 100644 index 000000000..d6965e6e3 --- /dev/null +++ b/ru/codes/go/chapter_computational_complexity/worst_best_time_complexity_test.go @@ -0,0 +1,20 @@ +// File: worst_best_time_complexity_test.go +// Created Time: 2022-12-13 +// Author: msk397 (machangxinq@gmail.com), cathay (cathaycchen@gmail.com) + +package chapter_computational_complexity + +import ( + "fmt" + "testing" +) + +func TestWorstBestTimeComplexity(t *testing.T) { + for i := 0; i < 10; i++ { + n := 100 + nums := randomNumbers(n) + index := findOne(nums) + fmt.Println("\nМассив [1, 2, ..., n] после перемешивания =", nums) + fmt.Println("Индекс числа 1 =", index) + } +} diff --git a/ru/codes/go/chapter_divide_and_conquer/binary_search_recur.go b/ru/codes/go/chapter_divide_and_conquer/binary_search_recur.go new file mode 100644 index 000000000..4e1daa6a8 --- /dev/null +++ b/ru/codes/go/chapter_divide_and_conquer/binary_search_recur.go @@ -0,0 +1,34 @@ +// File: binary_search_recur.go +// Created Time: 2023-07-19 +// Author: hongyun-robot (1836017030@qq.com) + +package chapter_divide_and_conquer + +/* Бинарный поиск: задача f(i, j) */ +func dfs(nums []int, target, i, j int) int { + // Если интервал пуст, это означает отсутствие целевого элемента, вернуть -1 + if i > j { + return -1 + } + // Вычислить средний индекс + m := i + ((j - i) >> 1) + // Сравнить середину и целевой элемент + if nums[m] < target { + // Если меньше, рекурсивно обрабатывать правую половину массива + // Рекурсивная подзадача f(m+1, j) + return dfs(nums, target, m+1, j) + } else if nums[m] > target { + // Если больше, рекурсивно обработать левую половину массива + // Рекурсивная подзадача f(i, m-1) + return dfs(nums, target, i, m-1) + } else { + // Целевой элемент найден, вернуть его индекс + return m + } +} + +/* Бинарный поиск */ +func binarySearch(nums []int, target int) int { + n := len(nums) + return dfs(nums, target, 0, n-1) +} diff --git a/ru/codes/go/chapter_divide_and_conquer/binary_search_recur_test.go b/ru/codes/go/chapter_divide_and_conquer/binary_search_recur_test.go new file mode 100644 index 000000000..68586d576 --- /dev/null +++ b/ru/codes/go/chapter_divide_and_conquer/binary_search_recur_test.go @@ -0,0 +1,20 @@ +// File: binary_search_recur_test.go +// Created Time: 2023-07-19 +// Author: hongyun-robot (1836017030@qq.com) + +package chapter_divide_and_conquer + +import ( + "fmt" + "testing" +) + +func TestBinarySearch(t *testing.T) { + nums := []int{1, 3, 6, 8, 12, 15, 23, 26, 31, 35} + target := 6 + noTarget := 99 + targetIndex := binarySearch(nums, target) + fmt.Println("Индекс целевого элемента 6 = ", targetIndex) + noTargetIndex := binarySearch(nums, noTarget) + fmt.Println("Индекс отсутствующего целевого элемента =", noTargetIndex) +} diff --git a/ru/codes/go/chapter_divide_and_conquer/build_tree.go b/ru/codes/go/chapter_divide_and_conquer/build_tree.go new file mode 100644 index 000000000..c372bf03c --- /dev/null +++ b/ru/codes/go/chapter_divide_and_conquer/build_tree.go @@ -0,0 +1,37 @@ +// File: build_tree.go +// Created Time: 2023-07-20 +// Author: hongyun-robot (1836017030@qq.com) + +package chapter_divide_and_conquer + +import . "github.com/krahets/hello-algo/pkg" + +/* Построить двоичное дерево: разделяй и властвуй */ +func dfsBuildTree(preorder []int, inorderMap map[int]int, i, l, r int) *TreeNode { + // Завершить при пустом диапазоне поддерева + if r-l < 0 { + return nil + } + // Инициализировать корневой узел + root := NewTreeNode(preorder[i]) + // Найти m, чтобы разделить левое и правое поддеревья + m := inorderMap[preorder[i]] + // Подзадача: построить левое поддерево + root.Left = dfsBuildTree(preorder, inorderMap, i+1, l, m-1) + // Подзадача: построить правое поддерево + root.Right = dfsBuildTree(preorder, inorderMap, i+1+m-l, m+1, r) + // Вернуть корневой узел + return root +} + +/* Построить двоичное дерево */ +func buildTree(preorder, inorder []int) *TreeNode { + // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам + inorderMap := make(map[int]int, len(inorder)) + for i := 0; i < len(inorder); i++ { + inorderMap[inorder[i]] = i + } + + root := dfsBuildTree(preorder, inorderMap, 0, 0, len(inorder)-1) + return root +} diff --git a/ru/codes/go/chapter_divide_and_conquer/build_tree_test.go b/ru/codes/go/chapter_divide_and_conquer/build_tree_test.go new file mode 100644 index 000000000..3d7a890c6 --- /dev/null +++ b/ru/codes/go/chapter_divide_and_conquer/build_tree_test.go @@ -0,0 +1,25 @@ +// File: build_tree_test.go +// Created Time: 2023-07-20 +// Author: hongyun-robot (1836017030@qq.com) + +package chapter_divide_and_conquer + +import ( + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestBuildTree(t *testing.T) { + preorder := []int{3, 9, 2, 1, 7} + inorder := []int{9, 3, 1, 2, 7} + fmt.Print("Предварительный обход = ") + PrintSlice(preorder) + fmt.Print("Симметричный обход = ") + PrintSlice(inorder) + + root := buildTree(preorder, inorder) + fmt.Println("Построенное двоичное дерево:") + PrintTree(root) +} diff --git a/ru/codes/go/chapter_divide_and_conquer/hanota.go b/ru/codes/go/chapter_divide_and_conquer/hanota.go new file mode 100644 index 000000000..1361041af --- /dev/null +++ b/ru/codes/go/chapter_divide_and_conquer/hanota.go @@ -0,0 +1,39 @@ +// File: hanota.go +// Created Time: 2023-07-21 +// Author: hongyun-robot (1836017030@qq.com) + +package chapter_divide_and_conquer + +import "container/list" + +/* Переместить один диск */ +func move(src, tar *list.List) { + // Снять диск с вершины src + pan := src.Back() + // Положить диск на вершину tar + tar.PushBack(pan.Value) + // Убрать верхний диск из src + src.Remove(pan) +} + +/* Решить задачу Ханойской башни f(i) */ +func dfsHanota(i int, src, buf, tar *list.List) { + // Если в src остался только один диск, сразу переместить его в tar + if i == 1 { + move(src, tar) + return + } + // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar + dfsHanota(i-1, src, tar, buf) + // Подзадача f(1): переместить оставшийся один диск из src в tar + move(src, tar) + // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src + dfsHanota(i-1, buf, src, tar) +} + +/* Решить задачу Ханойской башни */ +func solveHanota(A, B, C *list.List) { + n := A.Len() + // Переместить верхние n дисков из A в C с помощью B + dfsHanota(n, A, B, C) +} diff --git a/ru/codes/go/chapter_divide_and_conquer/hanota_test.go b/ru/codes/go/chapter_divide_and_conquer/hanota_test.go new file mode 100644 index 000000000..3f65c9e5a --- /dev/null +++ b/ru/codes/go/chapter_divide_and_conquer/hanota_test.go @@ -0,0 +1,40 @@ +// File: hanota_test.go +// Created Time: 2023-07-21 +// Author: hongyun-robot (1836017030@qq.com) + +package chapter_divide_and_conquer + +import ( + "container/list" + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestHanota(t *testing.T) { + // Хвост списка соответствует вершине столбца + A := list.New() + for i := 5; i > 0; i-- { + A.PushBack(i) + } + B := list.New() + C := list.New() + fmt.Println("Исходное состояние:") + fmt.Print("A = ") + PrintList(A) + fmt.Print("B = ") + PrintList(B) + fmt.Print("C = ") + PrintList(C) + + solveHanota(A, B, C) + + fmt.Println("После завершения перемещения дисков:") + fmt.Print("A = ") + PrintList(A) + fmt.Print("B = ") + PrintList(B) + fmt.Print("C = ") + PrintList(C) +} diff --git a/ru/codes/go/chapter_dynamic_programming/climbing_stairs_backtrack.go b/ru/codes/go/chapter_dynamic_programming/climbing_stairs_backtrack.go new file mode 100644 index 000000000..6f4f17210 --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/climbing_stairs_backtrack.go @@ -0,0 +1,36 @@ +// File: climbing_stairs_backtrack.go +// Created Time: 2023-07-18 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +/* Бэктрекинг */ +func backtrack(choices []int, state, n int, res []int) { + // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1 + if state == n { + res[0] = res[0] + 1 + } + // Перебор всех вариантов выбора + for _, choice := range choices { + // Отсечение: нельзя выходить за n-ю ступень + if state+choice > n { + continue + } + // Попытка: сделать выбор и обновить состояние + backtrack(choices, state+choice, n, res) + // Откат + } +} + +/* Подъем по лестнице: бэктрекинг */ +func climbingStairsBacktrack(n int) int { + // Можно подняться на 1 или 2 ступени + choices := []int{1, 2} + // Начать подъем с 0-й ступени + state := 0 + res := make([]int, 1) + // Использовать res[0] для хранения числа решений + res[0] = 0 + backtrack(choices, state, n, res) + return res[0] +} diff --git a/ru/codes/go/chapter_dynamic_programming/climbing_stairs_constraint_dp.go b/ru/codes/go/chapter_dynamic_programming/climbing_stairs_constraint_dp.go new file mode 100644 index 000000000..de0b59780 --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/climbing_stairs_constraint_dp.go @@ -0,0 +1,25 @@ +// File: climbing_stairs_constraint_dp.go +// Created Time: 2023-07-18 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +/* Подъем по лестнице с ограничениями: динамическое программирование */ +func climbingStairsConstraintDP(n int) int { + if n == 1 || n == 2 { + return 1 + } + // Инициализация таблицы dp для хранения решений подзадач + dp := make([][3]int, n+1) + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1][1] = 1 + dp[1][2] = 0 + dp[2][1] = 0 + dp[2][2] = 1 + // Переход состояний: постепенное решение больших подзадач через меньшие + for i := 3; i <= n; i++ { + dp[i][1] = dp[i-1][2] + dp[i][2] = dp[i-2][1] + dp[i-2][2] + } + return dp[n][1] + dp[n][2] +} diff --git a/ru/codes/go/chapter_dynamic_programming/climbing_stairs_dfs.go b/ru/codes/go/chapter_dynamic_programming/climbing_stairs_dfs.go new file mode 100644 index 000000000..a4a4b3ad3 --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/climbing_stairs_dfs.go @@ -0,0 +1,21 @@ +// File: climbing_stairs_dfs.go +// Created Time: 2023-07-18 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +/* Поиск */ +func dfs(i int) int { + // dp[1] и dp[2] уже известны, вернуть их + if i == 1 || i == 2 { + return i + } + // dp[i] = dp[i-1] + dp[i-2] + count := dfs(i-1) + dfs(i-2) + return count +} + +/* Подъем по лестнице: поиск */ +func climbingStairsDFS(n int) int { + return dfs(n) +} diff --git a/ru/codes/go/chapter_dynamic_programming/climbing_stairs_dfs_mem.go b/ru/codes/go/chapter_dynamic_programming/climbing_stairs_dfs_mem.go new file mode 100644 index 000000000..ba3e55d77 --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/climbing_stairs_dfs_mem.go @@ -0,0 +1,32 @@ +// File: climbing_stairs_dfs_mem.go +// Created Time: 2023-07-18 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +/* Поиск с мемоизацией */ +func dfsMem(i int, mem []int) int { + // dp[1] и dp[2] уже известны, вернуть их + if i == 1 || i == 2 { + return i + } + // Если запись dp[i] существует, сразу вернуть ее + if mem[i] != -1 { + return mem[i] + } + // dp[i] = dp[i-1] + dp[i-2] + count := dfsMem(i-1, mem) + dfsMem(i-2, mem) + // Сохранить dp[i] + mem[i] = count + return count +} + +/* Подъем по лестнице: поиск с мемоизацией */ +func climbingStairsDFSMem(n int) int { + // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи + mem := make([]int, n+1) + for i := range mem { + mem[i] = -1 + } + return dfsMem(n, mem) +} diff --git a/ru/codes/go/chapter_dynamic_programming/climbing_stairs_dp.go b/ru/codes/go/chapter_dynamic_programming/climbing_stairs_dp.go new file mode 100644 index 000000000..1a41fa1e0 --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/climbing_stairs_dp.go @@ -0,0 +1,35 @@ +// File: climbing_stairs_dp.go +// Created Time: 2023-07-18 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +/* Подъем по лестнице: динамическое программирование */ +func climbingStairsDP(n int) int { + if n == 1 || n == 2 { + return n + } + // Инициализация таблицы dp для хранения решений подзадач + dp := make([]int, n+1) + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = 1 + dp[2] = 2 + // Переход состояний: постепенное решение больших подзадач через меньшие + for i := 3; i <= n; i++ { + dp[i] = dp[i-1] + dp[i-2] + } + return dp[n] +} + +/* Подъем по лестнице: динамическое программирование с оптимизацией памяти */ +func climbingStairsDPComp(n int) int { + if n == 1 || n == 2 { + return n + } + a, b := 1, 2 + // Переход состояний: постепенное решение больших подзадач через меньшие + for i := 3; i <= n; i++ { + a, b = b, a+b + } + return b +} diff --git a/ru/codes/go/chapter_dynamic_programming/climbing_stairs_test.go b/ru/codes/go/chapter_dynamic_programming/climbing_stairs_test.go new file mode 100644 index 000000000..e1dd0d05a --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/climbing_stairs_test.go @@ -0,0 +1,57 @@ +// File: climbing_stairs_test.go +// Created Time: 2023-07-18 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +import ( + "fmt" + "testing" +) + +func TestClimbingStairsBacktrack(t *testing.T) { + n := 9 + res := climbingStairsBacktrack(n) + fmt.Printf("Количество способов подняться по лестнице из %d ступеней: %d\n", n, res) +} + +func TestClimbingStairsDFS(t *testing.T) { + n := 9 + res := climbingStairsDFS(n) + fmt.Printf("Количество способов подняться по лестнице из %d ступеней: %d\n", n, res) +} + +func TestClimbingStairsDFSMem(t *testing.T) { + n := 9 + res := climbingStairsDFSMem(n) + fmt.Printf("Количество способов подняться по лестнице из %d ступеней: %d\n", n, res) +} + +func TestClimbingStairsDP(t *testing.T) { + n := 9 + res := climbingStairsDP(n) + fmt.Printf("Количество способов подняться по лестнице из %d ступеней: %d\n", n, res) +} + +func TestClimbingStairsDPComp(t *testing.T) { + n := 9 + res := climbingStairsDPComp(n) + fmt.Printf("Количество способов подняться по лестнице из %d ступеней: %d\n", n, res) +} + +func TestClimbingStairsConstraintDP(t *testing.T) { + n := 9 + res := climbingStairsConstraintDP(n) + fmt.Printf("Количество способов подняться по лестнице из %d ступеней: %d\n", n, res) +} + +func TestMinCostClimbingStairsDPComp(t *testing.T) { + cost := []int{0, 1, 10, 1, 1, 1, 10, 1, 1, 10, 1} + fmt.Printf("Список стоимостей ступеней = %v\n", cost) + + res := minCostClimbingStairsDP(cost) + fmt.Printf("Минимальная стоимость подъема по лестнице = %d\n", res) + + res = minCostClimbingStairsDPComp(cost) + fmt.Printf("Минимальная стоимость подъема по лестнице = %d\n", res) +} diff --git a/ru/codes/go/chapter_dynamic_programming/coin_change.go b/ru/codes/go/chapter_dynamic_programming/coin_change.go new file mode 100644 index 000000000..5135a6de4 --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/coin_change.go @@ -0,0 +1,66 @@ +// File: coin_change.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +import "math" + +/* Размен монет: динамическое программирование */ +func coinChangeDP(coins []int, amt int) int { + n := len(coins) + max := amt + 1 + // Инициализация таблицы dp + dp := make([][]int, n+1) + for i := 0; i <= n; i++ { + dp[i] = make([]int, amt+1) + } + // Переход состояний: первая строка и первый столбец + for a := 1; a <= amt; a++ { + dp[0][a] = max + } + // Переход состояний: остальные строки и столбцы + for i := 1; i <= n; i++ { + for a := 1; a <= amt; a++ { + if coins[i-1] > a { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i-1][a] + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[i][a] = int(math.Min(float64(dp[i-1][a]), float64(dp[i][a-coins[i-1]]+1))) + } + } + } + if dp[n][amt] != max { + return dp[n][amt] + } + return -1 +} + +/* Размен монет: динамическое программирование */ +func coinChangeDPComp(coins []int, amt int) int { + n := len(coins) + max := amt + 1 + // Инициализация таблицы dp + dp := make([]int, amt+1) + for i := 1; i <= amt; i++ { + dp[i] = max + } + // Переход состояний + for i := 1; i <= n; i++ { + // Прямой обход + for a := 1; a <= amt; a++ { + if coins[i-1] > a { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a] + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[a] = int(math.Min(float64(dp[a]), float64(dp[a-coins[i-1]]+1))) + } + } + } + if dp[amt] != max { + return dp[amt] + } + return -1 +} diff --git a/ru/codes/go/chapter_dynamic_programming/coin_change_ii.go b/ru/codes/go/chapter_dynamic_programming/coin_change_ii.go new file mode 100644 index 000000000..d56def0c5 --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/coin_change_ii.go @@ -0,0 +1,54 @@ +// File: coin_change_ii.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +/* Размен монет II: динамическое программирование */ +func coinChangeIIDP(coins []int, amt int) int { + n := len(coins) + // Инициализация таблицы dp + dp := make([][]int, n+1) + for i := 0; i <= n; i++ { + dp[i] = make([]int, amt+1) + } + // Инициализация первого столбца + for i := 0; i <= n; i++ { + dp[i][0] = 1 + } + // Переход состояний: остальные строки и столбцы + for i := 1; i <= n; i++ { + for a := 1; a <= amt; a++ { + if coins[i-1] > a { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i-1][a] + } else { + // Сумма двух решений: не брать или взять монету i + dp[i][a] = dp[i-1][a] + dp[i][a-coins[i-1]] + } + } + } + return dp[n][amt] +} + +/* Размен монет II: динамическое программирование с оптимизацией памяти */ +func coinChangeIIDPComp(coins []int, amt int) int { + n := len(coins) + // Инициализация таблицы dp + dp := make([]int, amt+1) + dp[0] = 1 + // Переход состояний + for i := 1; i <= n; i++ { + // Прямой обход + for a := 1; a <= amt; a++ { + if coins[i-1] > a { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a] + } else { + // Сумма двух решений: не брать или взять монету i + dp[a] = dp[a] + dp[a-coins[i-1]] + } + } + } + return dp[amt] +} diff --git a/ru/codes/go/chapter_dynamic_programming/coin_change_test.go b/ru/codes/go/chapter_dynamic_programming/coin_change_test.go new file mode 100644 index 000000000..9a04a0983 --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/coin_change_test.go @@ -0,0 +1,23 @@ +// File: coin_change_test.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +import ( + "fmt" + "testing" +) + +func TestCoinChange(t *testing.T) { + coins := []int{1, 2, 5} + amt := 4 + + // Динамическое программирование + res := coinChangeDP(coins, amt) + fmt.Printf("Минимальное число монет для набора целевой суммы = %d\n", res) + + // Динамическое программирование с оптимизацией памяти + res = coinChangeDPComp(coins, amt) + fmt.Printf("Минимальное число монет для набора целевой суммы = %d\n", res) +} diff --git a/ru/codes/go/chapter_dynamic_programming/edit_distance.go b/ru/codes/go/chapter_dynamic_programming/edit_distance.go new file mode 100644 index 000000000..54e89a57d --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/edit_distance.go @@ -0,0 +1,129 @@ +// File: edit_distance.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +/* Редакционное расстояние: полный перебор */ +func editDistanceDFS(s string, t string, i int, j int) int { + // Если s и t пусты, вернуть 0 + if i == 0 && j == 0 { + return 0 + } + // Если s пусто, вернуть длину t + if i == 0 { + return j + } + // Если t пусто, вернуть длину s + if j == 0 { + return i + } + // Если два символа равны, сразу пропустить их + if s[i-1] == t[j-1] { + return editDistanceDFS(s, t, i-1, j-1) + } + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + insert := editDistanceDFS(s, t, i, j-1) + deleted := editDistanceDFS(s, t, i-1, j) + replace := editDistanceDFS(s, t, i-1, j-1) + // Вернуть минимальное число шагов редактирования + return MinInt(MinInt(insert, deleted), replace) + 1 +} + +/* Редакционное расстояние: поиск с мемоизацией */ +func editDistanceDFSMem(s string, t string, mem [][]int, i int, j int) int { + // Если s и t пусты, вернуть 0 + if i == 0 && j == 0 { + return 0 + } + // Если s пусто, вернуть длину t + if i == 0 { + return j + } + // Если t пусто, вернуть длину s + if j == 0 { + return i + } + // Если запись уже есть, сразу вернуть ее + if mem[i][j] != -1 { + return mem[i][j] + } + // Если два символа равны, сразу пропустить их + if s[i-1] == t[j-1] { + return editDistanceDFSMem(s, t, mem, i-1, j-1) + } + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + insert := editDistanceDFSMem(s, t, mem, i, j-1) + deleted := editDistanceDFSMem(s, t, mem, i-1, j) + replace := editDistanceDFSMem(s, t, mem, i-1, j-1) + // Сохранить и вернуть минимальное число шагов редактирования + mem[i][j] = MinInt(MinInt(insert, deleted), replace) + 1 + return mem[i][j] +} + +/* Редакционное расстояние: динамическое программирование */ +func editDistanceDP(s string, t string) int { + n := len(s) + m := len(t) + dp := make([][]int, n+1) + for i := 0; i <= n; i++ { + dp[i] = make([]int, m+1) + } + // Переход состояний: первая строка и первый столбец + for i := 1; i <= n; i++ { + dp[i][0] = i + } + for j := 1; j <= m; j++ { + dp[0][j] = j + } + // Переход состояний: остальные строки и столбцы + for i := 1; i <= n; i++ { + for j := 1; j <= m; j++ { + if s[i-1] == t[j-1] { + // Если два символа равны, сразу пропустить их + dp[i][j] = dp[i-1][j-1] + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[i][j] = MinInt(MinInt(dp[i][j-1], dp[i-1][j]), dp[i-1][j-1]) + 1 + } + } + } + return dp[n][m] +} + +/* Редакционное расстояние: динамическое программирование с оптимизацией памяти */ +func editDistanceDPComp(s string, t string) int { + n := len(s) + m := len(t) + dp := make([]int, m+1) + // Переход состояний: первая строка + for j := 1; j <= m; j++ { + dp[j] = j + } + // Переход состояний: остальные строки + for i := 1; i <= n; i++ { + // Переход состояний: первый столбец + leftUp := dp[0] // Временно сохранить dp[i-1, j-1] + dp[0] = i + // Переход состояний: остальные столбцы + for j := 1; j <= m; j++ { + temp := dp[j] + if s[i-1] == t[j-1] { + // Если два символа равны, сразу пропустить их + dp[j] = leftUp + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[j] = MinInt(MinInt(dp[j-1], dp[j]), leftUp) + 1 + } + leftUp = temp // Обновить до значения dp[i-1, j-1] для следующей итерации + } + } + return dp[m] +} + +func MinInt(a, b int) int { + if a < b { + return a + } + return b +} diff --git a/ru/codes/go/chapter_dynamic_programming/edit_distance_test.go b/ru/codes/go/chapter_dynamic_programming/edit_distance_test.go new file mode 100644 index 000000000..efe94ef23 --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/edit_distance_test.go @@ -0,0 +1,40 @@ +// File: edit_distance_test.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +import ( + "fmt" + "testing" +) + +func TestEditDistanceDFS(test *testing.T) { + s := "bag" + t := "pack" + n := len(s) + m := len(t) + + // Полный перебор + res := editDistanceDFS(s, t, n, m) + fmt.Printf("Чтобы преобразовать %s в %s, нужно минимум %d шагов\n", s, t, res) + + // Поиск с мемоизацией + mem := make([][]int, n+1) + for i := 0; i <= n; i++ { + mem[i] = make([]int, m+1) + for j := 0; j <= m; j++ { + mem[i][j] = -1 + } + } + res = editDistanceDFSMem(s, t, mem, n, m) + fmt.Printf("Чтобы преобразовать %s в %s, нужно минимум %d шагов\n", s, t, res) + + // Динамическое программирование + res = editDistanceDP(s, t) + fmt.Printf("Чтобы преобразовать %s в %s, нужно минимум %d шагов\n", s, t, res) + + // Динамическое программирование с оптимизацией памяти + res = editDistanceDPComp(s, t) + fmt.Printf("Чтобы преобразовать %s в %s, нужно минимум %d шагов\n", s, t, res) +} diff --git a/ru/codes/go/chapter_dynamic_programming/knapsack.go b/ru/codes/go/chapter_dynamic_programming/knapsack.go new file mode 100644 index 000000000..83590fbaf --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/knapsack.go @@ -0,0 +1,87 @@ +// File: knapsack.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +import "math" + +/* Рюкзак 0-1: полный перебор */ +func knapsackDFS(wgt, val []int, i, c int) int { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if i == 0 || c == 0 { + return 0 + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if wgt[i-1] > c { + return knapsackDFS(wgt, val, i-1, c) + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + no := knapsackDFS(wgt, val, i-1, c) + yes := knapsackDFS(wgt, val, i-1, c-wgt[i-1]) + val[i-1] + // Вернуть вариант с большей стоимостью из двух возможных + return int(math.Max(float64(no), float64(yes))) +} + +/* Рюкзак 0-1: поиск с мемоизацией */ +func knapsackDFSMem(wgt, val []int, mem [][]int, i, c int) int { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if i == 0 || c == 0 { + return 0 + } + // Если запись уже есть, вернуть сразу + if mem[i][c] != -1 { + return mem[i][c] + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if wgt[i-1] > c { + return knapsackDFSMem(wgt, val, mem, i-1, c) + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + no := knapsackDFSMem(wgt, val, mem, i-1, c) + yes := knapsackDFSMem(wgt, val, mem, i-1, c-wgt[i-1]) + val[i-1] + // Вернуть вариант с большей стоимостью из двух возможных + mem[i][c] = int(math.Max(float64(no), float64(yes))) + return mem[i][c] +} + +/* Рюкзак 0-1: динамическое программирование */ +func knapsackDP(wgt, val []int, cap int) int { + n := len(wgt) + // Инициализация таблицы dp + dp := make([][]int, n+1) + for i := 0; i <= n; i++ { + dp[i] = make([]int, cap+1) + } + // Переход состояний + for i := 1; i <= n; i++ { + for c := 1; c <= cap; c++ { + if wgt[i-1] > c { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i-1][c] + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i-1][c-wgt[i-1]]+val[i-1]))) + } + } + } + return dp[n][cap] +} + +/* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */ +func knapsackDPComp(wgt, val []int, cap int) int { + n := len(wgt) + // Инициализация таблицы dp + dp := make([]int, cap+1) + // Переход состояний + for i := 1; i <= n; i++ { + // Обход в обратном порядке + for c := cap; c >= 1; c-- { + if wgt[i-1] <= c { + // Большее из двух решений: не брать или взять предмет i + dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1]))) + } + } + } + return dp[cap] +} diff --git a/ru/codes/go/chapter_dynamic_programming/knapsack_test.go b/ru/codes/go/chapter_dynamic_programming/knapsack_test.go new file mode 100644 index 000000000..8f6c07354 --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/knapsack_test.go @@ -0,0 +1,54 @@ +// File: knapsack_test.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +import ( + "fmt" + "testing" +) + +func TestKnapsack(t *testing.T) { + wgt := []int{10, 20, 30, 40, 50} + val := []int{50, 120, 150, 210, 240} + c := 50 + n := len(wgt) + + // Полный перебор + res := knapsackDFS(wgt, val, n, c) + fmt.Printf("Максимальная стоимость предметов без превышения вместимости рюкзака = %d\n", res) + + // Поиск с мемоизацией + mem := make([][]int, n+1) + for i := 0; i <= n; i++ { + mem[i] = make([]int, c+1) + for j := 0; j <= c; j++ { + mem[i][j] = -1 + } + } + res = knapsackDFSMem(wgt, val, mem, n, c) + fmt.Printf("Максимальная стоимость предметов без превышения вместимости рюкзака = %d\n", res) + + // Динамическое программирование + res = knapsackDP(wgt, val, c) + fmt.Printf("Максимальная стоимость предметов без превышения вместимости рюкзака = %d\n", res) + + // Динамическое программирование с оптимизацией памяти + res = knapsackDPComp(wgt, val, c) + fmt.Printf("Максимальная стоимость предметов без превышения вместимости рюкзака = %d\n", res) +} + +func TestUnboundedKnapsack(t *testing.T) { + wgt := []int{1, 2, 3} + val := []int{5, 11, 15} + c := 4 + + // Динамическое программирование + res := unboundedKnapsackDP(wgt, val, c) + fmt.Printf("Максимальная стоимость предметов без превышения вместимости рюкзака = %d\n", res) + + // Динамическое программирование с оптимизацией памяти + res = unboundedKnapsackDPComp(wgt, val, c) + fmt.Printf("Максимальная стоимость предметов без превышения вместимости рюкзака = %d\n", res) +} diff --git a/ru/codes/go/chapter_dynamic_programming/min_cost_climbing_stairs_dp.go b/ru/codes/go/chapter_dynamic_programming/min_cost_climbing_stairs_dp.go new file mode 100644 index 000000000..e401597ef --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/min_cost_climbing_stairs_dp.go @@ -0,0 +1,52 @@ +// File: min_cost_climbing_stairs_dp.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +/* Минимальная стоимость подъема по лестнице: динамическое программирование */ +func minCostClimbingStairsDP(cost []int) int { + n := len(cost) - 1 + if n == 1 || n == 2 { + return cost[n] + } + min := func(a, b int) int { + if a < b { + return a + } + return b + } + // Инициализация таблицы dp для хранения решений подзадач + dp := make([]int, n+1) + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = cost[1] + dp[2] = cost[2] + // Переход состояний: постепенное решение больших подзадач через меньшие + for i := 3; i <= n; i++ { + dp[i] = min(dp[i-1], dp[i-2]) + cost[i] + } + return dp[n] +} + +/* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */ +func minCostClimbingStairsDPComp(cost []int) int { + n := len(cost) - 1 + if n == 1 || n == 2 { + return cost[n] + } + min := func(a, b int) int { + if a < b { + return a + } + return b + } + // Начальное состояние: заранее задать решения наименьших подзадач + a, b := cost[1], cost[2] + // Переход состояний: постепенное решение больших подзадач через меньшие + for i := 3; i <= n; i++ { + tmp := b + b = min(a, tmp) + cost[i] + a = tmp + } + return b +} diff --git a/ru/codes/go/chapter_dynamic_programming/min_path_sum.go b/ru/codes/go/chapter_dynamic_programming/min_path_sum.go new file mode 100644 index 000000000..b0d7c2812 --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/min_path_sum.go @@ -0,0 +1,94 @@ +// File: min_path_sum.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +import "math" + +/* Минимальная сумма пути: полный перебор */ +func minPathSumDFS(grid [][]int, i, j int) int { + // Если это верхняя левая ячейка, завершить поиск + if i == 0 && j == 0 { + return grid[0][0] + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if i < 0 || j < 0 { + return math.MaxInt + } + // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1) + up := minPathSumDFS(grid, i-1, j) + left := minPathSumDFS(grid, i, j-1) + // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + return int(math.Min(float64(left), float64(up))) + grid[i][j] +} + +/* Минимальная сумма пути: поиск с мемоизацией */ +func minPathSumDFSMem(grid, mem [][]int, i, j int) int { + // Если это верхняя левая ячейка, завершить поиск + if i == 0 && j == 0 { + return grid[0][0] + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if i < 0 || j < 0 { + return math.MaxInt + } + // Если запись уже есть, вернуть сразу + if mem[i][j] != -1 { + return mem[i][j] + } + // Минимальная стоимость пути для левой и верхней ячеек + up := minPathSumDFSMem(grid, mem, i-1, j) + left := minPathSumDFSMem(grid, mem, i, j-1) + // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + mem[i][j] = int(math.Min(float64(left), float64(up))) + grid[i][j] + return mem[i][j] +} + +/* Минимальная сумма пути: динамическое программирование */ +func minPathSumDP(grid [][]int) int { + n, m := len(grid), len(grid[0]) + // Инициализация таблицы dp + dp := make([][]int, n) + for i := 0; i < n; i++ { + dp[i] = make([]int, m) + } + dp[0][0] = grid[0][0] + // Переход состояний: первая строка + for j := 1; j < m; j++ { + dp[0][j] = dp[0][j-1] + grid[0][j] + } + // Переход состояний: первый столбец + for i := 1; i < n; i++ { + dp[i][0] = dp[i-1][0] + grid[i][0] + } + // Переход состояний: остальные строки и столбцы + for i := 1; i < n; i++ { + for j := 1; j < m; j++ { + dp[i][j] = int(math.Min(float64(dp[i][j-1]), float64(dp[i-1][j]))) + grid[i][j] + } + } + return dp[n-1][m-1] +} + +/* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */ +func minPathSumDPComp(grid [][]int) int { + n, m := len(grid), len(grid[0]) + // Инициализация таблицы dp + dp := make([]int, m) + // Переход состояний: первая строка + dp[0] = grid[0][0] + for j := 1; j < m; j++ { + dp[j] = dp[j-1] + grid[0][j] + } + // Переход состояний: остальные строки и столбцы + for i := 1; i < n; i++ { + // Переход состояний: первый столбец + dp[0] = dp[0] + grid[i][0] + // Переход состояний: остальные столбцы + for j := 1; j < m; j++ { + dp[j] = int(math.Min(float64(dp[j-1]), float64(dp[j]))) + grid[i][j] + } + } + return dp[m-1] +} diff --git a/ru/codes/go/chapter_dynamic_programming/min_path_sum_test.go b/ru/codes/go/chapter_dynamic_programming/min_path_sum_test.go new file mode 100644 index 000000000..c3f8f8c99 --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/min_path_sum_test.go @@ -0,0 +1,43 @@ +// File: min_path_sum_test.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +import ( + "fmt" + "testing" +) + +func TestMinPathSum(t *testing.T) { + grid := [][]int{ + {1, 3, 1, 5}, + {2, 2, 4, 2}, + {5, 3, 2, 1}, + {4, 3, 5, 2}, + } + n, m := len(grid), len(grid[0]) + + // Полный перебор + res := minPathSumDFS(grid, n-1, m-1) + fmt.Printf("Минимальная сумма пути из левого верхнего угла в правый нижний = %d\n", res) + + // Поиск с мемоизацией + mem := make([][]int, n) + for i := 0; i < n; i++ { + mem[i] = make([]int, m) + for j := 0; j < m; j++ { + mem[i][j] = -1 + } + } + res = minPathSumDFSMem(grid, mem, n-1, m-1) + fmt.Printf("Минимальная сумма пути из левого верхнего угла в правый нижний = %d\n", res) + + // Динамическое программирование + res = minPathSumDP(grid) + fmt.Printf("Минимальная сумма пути из левого верхнего угла в правый нижний = %d\n", res) + + // Динамическое программирование с оптимизацией памяти + res = minPathSumDPComp(grid) + fmt.Printf("Минимальная сумма пути из левого верхнего угла в правый нижний = %d\n", res) +} diff --git a/ru/codes/go/chapter_dynamic_programming/unbounded_knapsack.go b/ru/codes/go/chapter_dynamic_programming/unbounded_knapsack.go new file mode 100644 index 000000000..4f88abe63 --- /dev/null +++ b/ru/codes/go/chapter_dynamic_programming/unbounded_knapsack.go @@ -0,0 +1,50 @@ +// File: unbounded_knapsack.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_dynamic_programming + +import "math" + +/* Полный рюкзак: динамическое программирование */ +func unboundedKnapsackDP(wgt, val []int, cap int) int { + n := len(wgt) + // Инициализация таблицы dp + dp := make([][]int, n+1) + for i := 0; i <= n; i++ { + dp[i] = make([]int, cap+1) + } + // Переход состояний + for i := 1; i <= n; i++ { + for c := 1; c <= cap; c++ { + if wgt[i-1] > c { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i-1][c] + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i][c-wgt[i-1]]+val[i-1]))) + } + } + } + return dp[n][cap] +} + +/* Полный рюкзак: динамическое программирование с оптимизацией памяти */ +func unboundedKnapsackDPComp(wgt, val []int, cap int) int { + n := len(wgt) + // Инициализация таблицы dp + dp := make([]int, cap+1) + // Переход состояний + for i := 1; i <= n; i++ { + for c := 1; c <= cap; c++ { + if wgt[i-1] > c { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c] + } else { + // Большее из двух решений: не брать или взять предмет i + dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1]))) + } + } + } + return dp[cap] +} diff --git a/ru/codes/go/chapter_graph/graph_adjacency_list.go b/ru/codes/go/chapter_graph/graph_adjacency_list.go new file mode 100644 index 000000000..e80a656df --- /dev/null +++ b/ru/codes/go/chapter_graph/graph_adjacency_list.go @@ -0,0 +1,100 @@ +// File: graph_adjacency_list.go +// Created Time: 2023-01-31 +// Author: Reanon (793584285@qq.com) + +package chapter_graph + +import ( + "fmt" + "strconv" + "strings" + + . "github.com/krahets/hello-algo/pkg" +) + +/* Класс неориентированного графа на основе списка смежности */ +type graphAdjList struct { + // Список смежности, где key — вершина, а value — все смежные ей вершины + adjList map[Vertex][]Vertex +} + +/* Конструктор */ +func newGraphAdjList(edges [][]Vertex) *graphAdjList { + g := &graphAdjList{ + adjList: make(map[Vertex][]Vertex), + } + // Добавить все вершины и ребра + for _, edge := range edges { + g.addVertex(edge[0]) + g.addVertex(edge[1]) + g.addEdge(edge[0], edge[1]) + } + return g +} + +/* Получить число вершин */ +func (g *graphAdjList) size() int { + return len(g.adjList) +} + +/* Добавление ребра */ +func (g *graphAdjList) addEdge(vet1 Vertex, vet2 Vertex) { + _, ok1 := g.adjList[vet1] + _, ok2 := g.adjList[vet2] + if !ok1 || !ok2 || vet1 == vet2 { + panic("error") + } + // Добавить ребро vet1 - vet2, добавив анонимную struct{} + g.adjList[vet1] = append(g.adjList[vet1], vet2) + g.adjList[vet2] = append(g.adjList[vet2], vet1) +} + +/* Удаление ребра */ +func (g *graphAdjList) removeEdge(vet1 Vertex, vet2 Vertex) { + _, ok1 := g.adjList[vet1] + _, ok2 := g.adjList[vet2] + if !ok1 || !ok2 || vet1 == vet2 { + panic("error") + } + // Удалить ребро vet1 - vet2 + g.adjList[vet1] = DeleteSliceElms(g.adjList[vet1], vet2) + g.adjList[vet2] = DeleteSliceElms(g.adjList[vet2], vet1) +} + +/* Добавление вершины */ +func (g *graphAdjList) addVertex(vet Vertex) { + _, ok := g.adjList[vet] + if ok { + return + } + // Добавить новый список в список смежности + g.adjList[vet] = make([]Vertex, 0) +} + +/* Удаление вершины */ +func (g *graphAdjList) removeVertex(vet Vertex) { + _, ok := g.adjList[vet] + if !ok { + panic("error") + } + // Удалить из списка смежности список, соответствующий вершине vet + delete(g.adjList, vet) + // Обойти списки других вершин и удалить все ребра, содержащие vet + for v, list := range g.adjList { + g.adjList[v] = DeleteSliceElms(list, vet) + } +} + +/* Вывести список смежности */ +func (g *graphAdjList) print() { + var builder strings.Builder + fmt.Printf("Список смежности = \n") + for k, v := range g.adjList { + builder.WriteString("\t\t" + strconv.Itoa(k.Val) + ": ") + for _, vet := range v { + builder.WriteString(strconv.Itoa(vet.Val) + " ") + } + fmt.Println(builder.String()) + builder.Reset() + } +} diff --git a/ru/codes/go/chapter_graph/graph_adjacency_list_test.go b/ru/codes/go/chapter_graph/graph_adjacency_list_test.go new file mode 100644 index 000000000..372d28e2b --- /dev/null +++ b/ru/codes/go/chapter_graph/graph_adjacency_list_test.go @@ -0,0 +1,45 @@ +// File: graph_adjacency_list_test.go +// Created Time: 2023-01-31 +// Author: Reanon (793584285@qq.com) + +package chapter_graph + +import ( + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestGraphAdjList(t *testing.T) { + /* Инициализация неориентированного графа */ + v := ValsToVets([]int{1, 3, 2, 5, 4}) + edges := [][]Vertex{{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 := newGraphAdjList(edges) + fmt.Println("Граф после инициализации:") + graph.print() + + /* Добавление ребра */ + // Вершины 1 и 2 соответствуют v[0] и v[2] + graph.addEdge(v[0], v[2]) + fmt.Println("\nГраф после добавления ребра 1-2") + graph.print() + + /* Удаление ребра */ + // Вершины 1 и 3 соответствуют v[0] и v[1] + graph.removeEdge(v[0], v[1]) + fmt.Println("\nГраф после удаления ребра 1-3") + graph.print() + + /* Добавление вершины */ + v5 := NewVertex(6) + graph.addVertex(v5) + fmt.Println("\nГраф после добавления вершины 6") + graph.print() + + /* Удаление вершины */ + // Вершина 3 соответствует v[1] + graph.removeVertex(v[1]) + fmt.Println("\nГраф после удаления вершины 3") + graph.print() +} diff --git a/ru/codes/go/chapter_graph/graph_adjacency_matrix.go b/ru/codes/go/chapter_graph/graph_adjacency_matrix.go new file mode 100644 index 000000000..c550f3401 --- /dev/null +++ b/ru/codes/go/chapter_graph/graph_adjacency_matrix.go @@ -0,0 +1,102 @@ +// File: graph_adjacency_matrix.go +// Created Time: 2023-01-31 +// Author: Reanon (793584285@qq.com) + +package chapter_graph + +import "fmt" + +/* Класс неориентированного графа на основе матрицы смежности */ +type graphAdjMat struct { + // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин» + vertices []int + // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин» + adjMat [][]int +} + +/* Конструктор */ +func newGraphAdjMat(vertices []int, edges [][]int) *graphAdjMat { + // Добавление вершины + n := len(vertices) + adjMat := make([][]int, n) + for i := range adjMat { + adjMat[i] = make([]int, n) + } + // Инициализировать граф + g := &graphAdjMat{ + vertices: vertices, + adjMat: adjMat, + } + // Добавить ребра + // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices + for i := range edges { + g.addEdge(edges[i][0], edges[i][1]) + } + return g +} + +/* Получить число вершин */ +func (g *graphAdjMat) size() int { + return len(g.vertices) +} + +/* Добавление вершины */ +func (g *graphAdjMat) addVertex(val int) { + n := g.size() + // Добавить значение новой вершины в список вершин + g.vertices = append(g.vertices, val) + // Добавить строку в матрицу смежности + newRow := make([]int, n) + g.adjMat = append(g.adjMat, newRow) + // Добавить столбец в матрицу смежности + for i := range g.adjMat { + g.adjMat[i] = append(g.adjMat[i], 0) + } +} + +/* Удаление вершины */ +func (g *graphAdjMat) removeVertex(index int) { + if index >= g.size() { + return + } + // Удалить вершину с индексом index из списка вершин + g.vertices = append(g.vertices[:index], g.vertices[index+1:]...) + // Удалить строку с индексом index из матрицы смежности + g.adjMat = append(g.adjMat[:index], g.adjMat[index+1:]...) + // Удалить столбец с индексом index из матрицы смежности + for i := range g.adjMat { + g.adjMat[i] = append(g.adjMat[i][:index], g.adjMat[i][index+1:]...) + } +} + +/* Добавление ребра */ +// Параметры i и j соответствуют индексам элементов vertices +func (g *graphAdjMat) addEdge(i, j int) { + // Обработка выхода индекса за границы и случая равенства + if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j { + fmt.Errorf("%s", "Index Out Of Bounds Exception") + } + // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i) + g.adjMat[i][j] = 1 + g.adjMat[j][i] = 1 +} + +/* Удаление ребра */ +// Параметры i и j соответствуют индексам элементов vertices +func (g *graphAdjMat) removeEdge(i, j int) { + // Обработка выхода индекса за границы и случая равенства + if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j { + fmt.Errorf("%s", "Index Out Of Bounds Exception") + } + g.adjMat[i][j] = 0 + g.adjMat[j][i] = 0 +} + +/* Вывести матрицу смежности */ +func (g *graphAdjMat) print() { + fmt.Printf("\tСписок вершин = %v\n", g.vertices) + fmt.Printf("\tМатрица смежности = \n") + for i := range g.adjMat { + fmt.Printf("\t\t\t%v\n", g.adjMat[i]) + } +} diff --git a/ru/codes/go/chapter_graph/graph_adjacency_matrix_test.go b/ru/codes/go/chapter_graph/graph_adjacency_matrix_test.go new file mode 100644 index 000000000..a9916d402 --- /dev/null +++ b/ru/codes/go/chapter_graph/graph_adjacency_matrix_test.go @@ -0,0 +1,43 @@ +// File: graph_adjacency_matrix_test.go +// Created Time: 2023-01-31 +// Author: Reanon (793584285@qq.com) + +package chapter_graph + +import ( + "fmt" + "testing" +) + +func TestGraphAdjMat(t *testing.T) { + /* Инициализация неориентированного графа */ + // Обратите внимание: элементы edges представляют индексы вершин, то есть соответствуют индексам элементов vertices + vertices := []int{1, 3, 2, 5, 4} + edges := [][]int{{0, 1}, {1, 2}, {2, 3}, {0, 3}, {2, 4}, {3, 4}} + graph := newGraphAdjMat(vertices, edges) + fmt.Println("Граф после инициализации:") + graph.print() + + /* Добавление ребра */ + // Индексы вершин 1 и 2 равны 0 и 2 соответственно + graph.addEdge(0, 2) + fmt.Println("Граф после добавления ребра 1-2") + graph.print() + + /* Удаление ребра */ + // Индексы вершин 1 и 3 равны 0 и 1 соответственно + graph.removeEdge(0, 1) + fmt.Println("Граф после удаления ребра 1-3") + graph.print() + + /* Добавление вершины */ + graph.addVertex(6) + fmt.Println("Граф после добавления вершины 6") + graph.print() + + /* Удаление вершины */ + // Индекс вершины 3 равен 1 + graph.removeVertex(1) + fmt.Println("Граф после удаления вершины 3") + graph.print() +} diff --git a/ru/codes/go/chapter_graph/graph_bfs.go b/ru/codes/go/chapter_graph/graph_bfs.go new file mode 100644 index 000000000..4d39b9f01 --- /dev/null +++ b/ru/codes/go/chapter_graph/graph_bfs.go @@ -0,0 +1,41 @@ +// File: graph_bfs.go +// Created Time: 2023-02-18 +// Author: Reanon (793584285@qq.com) + +package chapter_graph + +import ( + . "github.com/krahets/hello-algo/pkg" +) + +/* Обход в ширину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +func graphBFS(g *graphAdjList, startVet Vertex) []Vertex { + // Последовательность обхода вершин + res := make([]Vertex, 0) + // Хеш-множество для хранения уже посещенных вершин + visited := make(map[Vertex]struct{}) + visited[startVet] = struct{}{} + // Очередь используется для реализации BFS, срез используется для имитации очереди + queue := make([]Vertex, 0) + queue = append(queue, startVet) + // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины + for len(queue) > 0 { + // Извлечь головную вершину из очереди + vet := queue[0] + queue = queue[1:] + // Отметить посещенную вершину + res = append(res, vet) + // Обойти все смежные вершины данной вершины + for _, adjVet := range g.adjList[vet] { + _, isExist := visited[adjVet] + // Помещать в очередь только непосещенные вершины + if !isExist { + queue = append(queue, adjVet) + visited[adjVet] = struct{}{} + } + } + } + // Вернуть последовательность обхода вершин + return res +} diff --git a/ru/codes/go/chapter_graph/graph_bfs_test.go b/ru/codes/go/chapter_graph/graph_bfs_test.go new file mode 100644 index 000000000..276fc51c6 --- /dev/null +++ b/ru/codes/go/chapter_graph/graph_bfs_test.go @@ -0,0 +1,29 @@ +// File: graph_bfs_test.go +// Created Time: 2023-02-18 +// Author: Reanon (793584285@qq.com) + +package chapter_graph + +import ( + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestGraphBFS(t *testing.T) { + /* Инициализация неориентированного графа */ + vets := ValsToVets([]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}) + edges := [][]Vertex{ + {vets[0], vets[1]}, {vets[0], vets[3]}, {vets[1], vets[2]}, {vets[1], vets[4]}, + {vets[2], vets[5]}, {vets[3], vets[4]}, {vets[3], vets[6]}, {vets[4], vets[5]}, + {vets[4], vets[7]}, {vets[5], vets[8]}, {vets[6], vets[7]}, {vets[7], vets[8]}} + graph := newGraphAdjList(edges) + fmt.Println("Граф после инициализации:") + graph.print() + + /* Обход в ширину */ + res := graphBFS(graph, vets[0]) + fmt.Println("Последовательность вершин при обходе в ширину (BFS):") + PrintSlice(VetsToVals(res)) +} diff --git a/ru/codes/go/chapter_graph/graph_dfs.go b/ru/codes/go/chapter_graph/graph_dfs.go new file mode 100644 index 000000000..4a3dd8d53 --- /dev/null +++ b/ru/codes/go/chapter_graph/graph_dfs.go @@ -0,0 +1,36 @@ +// File: graph_dfs.go +// Created Time: 2023-02-18 +// Author: Reanon (793584285@qq.com) + +package chapter_graph + +import ( + . "github.com/krahets/hello-algo/pkg" +) + +/* Вспомогательная функция обхода в глубину */ +func dfs(g *graphAdjList, visited map[Vertex]struct{}, res *[]Vertex, vet Vertex) { + // Операция append возвращает новую ссылку, поэтому исходную ссылку нужно заново присвоить новому срезу + *res = append(*res, vet) + visited[vet] = struct{}{} + // Обойти все смежные вершины данной вершины + for _, adjVet := range g.adjList[vet] { + _, isExist := visited[adjVet] + // Рекурсивно обходить смежные вершины + if !isExist { + dfs(g, visited, res, adjVet) + } + } +} + +/* Обход в глубину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +func graphDFS(g *graphAdjList, startVet Vertex) []Vertex { + // Последовательность обхода вершин + res := make([]Vertex, 0) + // Хеш-множество для хранения уже посещенных вершин + visited := make(map[Vertex]struct{}) + dfs(g, visited, &res, startVet) + // Вернуть последовательность обхода вершин + return res +} diff --git a/ru/codes/go/chapter_graph/graph_dfs_test.go b/ru/codes/go/chapter_graph/graph_dfs_test.go new file mode 100644 index 000000000..1c52162d1 --- /dev/null +++ b/ru/codes/go/chapter_graph/graph_dfs_test.go @@ -0,0 +1,28 @@ +// File: graph_dfs_test.go +// Created Time: 2023-02-18 +// Author: Reanon (793584285@qq.com) + +package chapter_graph + +import ( + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestGraphDFS(t *testing.T) { + /* Инициализация неориентированного графа */ + vets := ValsToVets([]int{0, 1, 2, 3, 4, 5, 6}) + edges := [][]Vertex{ + {vets[0], vets[1]}, {vets[0], vets[3]}, {vets[1], vets[2]}, + {vets[2], vets[5]}, {vets[4], vets[5]}, {vets[5], vets[6]}} + graph := newGraphAdjList(edges) + fmt.Println("Граф после инициализации:") + graph.print() + + /* Обход в глубину */ + res := graphDFS(graph, vets[0]) + fmt.Println("Последовательность вершин при обходе в глубину (DFS):") + PrintSlice(VetsToVals(res)) +} diff --git a/ru/codes/go/chapter_greedy/coin_change_greedy.go b/ru/codes/go/chapter_greedy/coin_change_greedy.go new file mode 100644 index 000000000..2eb023681 --- /dev/null +++ b/ru/codes/go/chapter_greedy/coin_change_greedy.go @@ -0,0 +1,27 @@ +// File: coin_change_greedy.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_greedy + +/* Размен монет: жадный алгоритм */ +func coinChangeGreedy(coins []int, amt int) int { + // Предположить, что список coins упорядочен + i := len(coins) - 1 + count := 0 + // Циклически выполнять жадный выбор, пока не останется суммы + for amt > 0 { + // Найти монету, которая меньше остатка суммы и наиболее к нему близка + for i > 0 && coins[i] > amt { + i-- + } + // Выбрать coins[i] + amt -= coins[i] + count++ + } + // Если допустимое решение не найдено, вернуть -1 + if amt != 0 { + return -1 + } + return count +} diff --git a/ru/codes/go/chapter_greedy/coin_change_greedy_test.go b/ru/codes/go/chapter_greedy/coin_change_greedy_test.go new file mode 100644 index 000000000..813eb700d --- /dev/null +++ b/ru/codes/go/chapter_greedy/coin_change_greedy_test.go @@ -0,0 +1,35 @@ +// File: coin_change_greedy_test.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_greedy + +import ( + "fmt" + "testing" +) + +func TestCoinChangeGreedy(t *testing.T) { + // Жадный подход: гарантирует нахождение глобально оптимального решения + coins := []int{1, 5, 10, 20, 50, 100} + amt := 186 + res := coinChangeGreedy(coins, amt) + fmt.Printf("coins = %v, amt = %d\n", coins, amt) + fmt.Printf("Минимальное число монет для набора суммы %d = %d\n", amt, res) + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = []int{1, 20, 50} + amt = 60 + res = coinChangeGreedy(coins, amt) + fmt.Printf("coins = %v, amt = %d\n", coins, amt) + fmt.Printf("Минимальное число монет для набора суммы %d = %d\n", amt, res) + fmt.Println("На самом деле минимум равен 3: 20 + 20 + 20") + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = []int{1, 49, 50} + amt = 98 + res = coinChangeGreedy(coins, amt) + fmt.Printf("coins = %v, amt = %d\n", coins, amt) + fmt.Printf("Минимальное число монет для набора суммы %d = %d\n", amt, res) + fmt.Println("На самом деле минимум равен 2: 49 + 49") +} diff --git a/ru/codes/go/chapter_greedy/fractional_knapsack.go b/ru/codes/go/chapter_greedy/fractional_knapsack.go new file mode 100644 index 000000000..3612acbdc --- /dev/null +++ b/ru/codes/go/chapter_greedy/fractional_knapsack.go @@ -0,0 +1,41 @@ +// File: fractional_knapsack.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_greedy + +import "sort" + +/* Предмет */ +type Item struct { + w int // Вес предмета + v int // Стоимость предмета +} + +/* Дробный рюкзак: жадный алгоритм */ +func fractionalKnapsack(wgt []int, val []int, cap int) float64 { + // Создать список предметов с двумя свойствами: вес и стоимость + items := make([]Item, len(wgt)) + for i := 0; i < len(wgt); i++ { + items[i] = Item{wgt[i], val[i]} + } + // Отсортировать по удельной стоимости item.v / item.w в порядке убывания + sort.Slice(items, func(i, j int) bool { + return float64(items[i].v)/float64(items[i].w) > float64(items[j].v)/float64(items[j].w) + }) + // Циклический жадный выбор + res := 0.0 + for _, item := range items { + if item.w <= cap { + // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком + res += float64(item.v) + cap -= item.w + } else { + // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета + res += float64(item.v) / float64(item.w) * float64(cap) + // Свободной вместимости больше не осталось, поэтому выйти из цикла + break + } + } + return res +} diff --git a/ru/codes/go/chapter_greedy/fractional_knapsack_test.go b/ru/codes/go/chapter_greedy/fractional_knapsack_test.go new file mode 100644 index 000000000..cbe052592 --- /dev/null +++ b/ru/codes/go/chapter_greedy/fractional_knapsack_test.go @@ -0,0 +1,20 @@ +// File: fractional_knapsack_test.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_greedy + +import ( + "fmt" + "testing" +) + +func TestFractionalKnapsack(t *testing.T) { + wgt := []int{10, 20, 30, 40, 50} + val := []int{50, 120, 150, 210, 240} + capacity := 50 + + // Жадный алгоритм + res := fractionalKnapsack(wgt, val, capacity) + fmt.Println("Максимальная стоимость предметов без превышения вместимости рюкзака =", res) +} diff --git a/ru/codes/go/chapter_greedy/max_capacity.go b/ru/codes/go/chapter_greedy/max_capacity.go new file mode 100644 index 000000000..7319ce81f --- /dev/null +++ b/ru/codes/go/chapter_greedy/max_capacity.go @@ -0,0 +1,28 @@ +// File: max_capacity.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_greedy + +import "math" + +/* Максимальная вместимость: жадный алгоритм */ +func maxCapacity(ht []int) int { + // Инициализировать i и j так, чтобы они располагались по двум концам массива + i, j := 0, len(ht)-1 + // Начальная максимальная вместимость равна 0 + res := 0 + // Выполнять жадный выбор в цикле, пока две доски не встретятся + for i < j { + // Обновить максимальную вместимость + capacity := int(math.Min(float64(ht[i]), float64(ht[j]))) * (j - i) + res = int(math.Max(float64(res), float64(capacity))) + // Сдвигать внутрь более короткую сторону + if ht[i] < ht[j] { + i++ + } else { + j-- + } + } + return res +} diff --git a/ru/codes/go/chapter_greedy/max_capacity_test.go b/ru/codes/go/chapter_greedy/max_capacity_test.go new file mode 100644 index 000000000..c4b700990 --- /dev/null +++ b/ru/codes/go/chapter_greedy/max_capacity_test.go @@ -0,0 +1,18 @@ +// File: max_capacity_test.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_greedy + +import ( + "fmt" + "testing" +) + +func TestMaxCapacity(t *testing.T) { + ht := []int{3, 8, 5, 2, 7, 7, 3, 4} + + // Жадный алгоритм + res := maxCapacity(ht) + fmt.Println("Максимальная вместимость =", res) +} diff --git a/ru/codes/go/chapter_greedy/max_product_cutting.go b/ru/codes/go/chapter_greedy/max_product_cutting.go new file mode 100644 index 000000000..5762c2efb --- /dev/null +++ b/ru/codes/go/chapter_greedy/max_product_cutting.go @@ -0,0 +1,28 @@ +// File: max_product_cutting.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_greedy + +import "math" + +/* Максимальное произведение разрезания: жадный алгоритм */ +func maxProductCutting(n int) int { + // Когда n <= 3, обязательно нужно выделить одну 1 + if n <= 3 { + return 1 * (n - 1) + } + // Жадно выделить множители 3, где a — число троек, а b — остаток + a := n / 3 + b := n % 3 + if b == 1 { + // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2 + return int(math.Pow(3, float64(a-1))) * 2 * 2 + } + if b == 2 { + // Если остаток равен 2, ничего не делать + return int(math.Pow(3, float64(a))) * 2 + } + // Если остаток равен 0, ничего не делать + return int(math.Pow(3, float64(a))) +} diff --git a/ru/codes/go/chapter_greedy/max_product_cutting_test.go b/ru/codes/go/chapter_greedy/max_product_cutting_test.go new file mode 100644 index 000000000..cbe5bbb64 --- /dev/null +++ b/ru/codes/go/chapter_greedy/max_product_cutting_test.go @@ -0,0 +1,17 @@ +// File: max_product_cutting_test.go +// Created Time: 2023-07-23 +// Author: Reanon (793584285@qq.com) + +package chapter_greedy + +import ( + "fmt" + "testing" +) + +func TestMaxProductCutting(t *testing.T) { + n := 58 + // Жадный алгоритм + res := maxProductCutting(n) + fmt.Println("Максимальное произведение после разрезания =", res) +} diff --git a/ru/codes/go/chapter_hashing/array_hash_map.go b/ru/codes/go/chapter_hashing/array_hash_map.go new file mode 100644 index 000000000..66b109ca4 --- /dev/null +++ b/ru/codes/go/chapter_hashing/array_hash_map.go @@ -0,0 +1,97 @@ +// File: array_hash_map.go +// Created Time: 2022-12-14 +// Author: msk397 (machangxinq@gmail.com) + +package chapter_hashing + +import "fmt" + +/* Пара ключ-значение */ +type pair struct { + key int + val string +} + +/* Хеш-таблица на основе массива */ +type arrayHashMap struct { + buckets []*pair +} + +/* Инициализация хеш-таблицы */ +func newArrayHashMap() *arrayHashMap { + // Инициализировать массив, содержащий 100 корзин + buckets := make([]*pair, 100) + return &arrayHashMap{buckets: buckets} +} + +/* Хеш-функция */ +func (a *arrayHashMap) hashFunc(key int) int { + index := key % 100 + return index +} + +/* Операция поиска */ +func (a *arrayHashMap) get(key int) string { + index := a.hashFunc(key) + pair := a.buckets[index] + if pair == nil { + return "Not Found" + } + return pair.val +} + +/* Операция добавления */ +func (a *arrayHashMap) put(key int, val string) { + pair := &pair{key: key, val: val} + index := a.hashFunc(key) + a.buckets[index] = pair +} + +/* Операция удаления */ +func (a *arrayHashMap) remove(key int) { + index := a.hashFunc(key) + // Присвоить nil, что означает удаление + a.buckets[index] = nil +} + +/* Получить все ключи */ +func (a *arrayHashMap) pairSet() []*pair { + var pairs []*pair + for _, pair := range a.buckets { + if pair != nil { + pairs = append(pairs, pair) + } + } + return pairs +} + +/* Получить все ключи */ +func (a *arrayHashMap) keySet() []int { + var keys []int + for _, pair := range a.buckets { + if pair != nil { + keys = append(keys, pair.key) + } + } + return keys +} + +/* Получить все значения */ +func (a *arrayHashMap) valueSet() []string { + var values []string + for _, pair := range a.buckets { + if pair != nil { + values = append(values, pair.val) + } + } + return values +} + +/* Вывести хеш-таблицу */ +func (a *arrayHashMap) print() { + for _, pair := range a.buckets { + if pair != nil { + fmt.Println(pair.key, "->", pair.val) + } + } +} diff --git a/ru/codes/go/chapter_hashing/array_hash_map_test.go b/ru/codes/go/chapter_hashing/array_hash_map_test.go new file mode 100644 index 000000000..88cd3e5a2 --- /dev/null +++ b/ru/codes/go/chapter_hashing/array_hash_map_test.go @@ -0,0 +1,52 @@ +// File: array_hash_map_test.go +// Created Time: 2022-12-14 +// Author: msk397 (machangxinq@gmail.com) + +package chapter_hashing + +import ( + "fmt" + "testing" +) + +func TestArrayHashMap(t *testing.T) { + /* Инициализация хеш-таблицы */ + hmap := newArrayHashMap() + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + hmap.put(12836, "Сяо Ха") + hmap.put(15937, "Сяо Ло") + hmap.put(16750, "Сяо Суань") + hmap.put(13276, "Сяо Фа") + hmap.put(10583, "Сяо Я") + fmt.Println("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение") + hmap.print() + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + name := hmap.get(15937) + fmt.Println("\nДля номера 15937 найдено имя " + name) + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + hmap.remove(10583) + fmt.Println("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение") + hmap.print() + + /* Обход хеш-таблицы */ + fmt.Println("\nОтдельный обход пар ключ-значение") + for _, kv := range hmap.pairSet() { + fmt.Println(kv.key, " -> ", kv.val) + } + + fmt.Println("\nОтдельный обход ключей") + for _, key := range hmap.keySet() { + fmt.Println(key) + } + + fmt.Println("\nОтдельный обход значений") + for _, val := range hmap.valueSet() { + fmt.Println(val) + } +} diff --git a/ru/codes/go/chapter_hashing/hash_collision_test.go b/ru/codes/go/chapter_hashing/hash_collision_test.go new file mode 100644 index 000000000..156f85e31 --- /dev/null +++ b/ru/codes/go/chapter_hashing/hash_collision_test.go @@ -0,0 +1,62 @@ +// File: hash_collision_test.go +// Created Time: 2022-12-14 +// Author: msk397 (machangxinq@gmail.com) + +package chapter_hashing + +import ( + "fmt" + "testing" +) + +func TestHashMapChaining(t *testing.T) { + /* Инициализация хеш-таблицы */ + hmap := newHashMapChaining() + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + hmap.put(12836, "Сяо Ха") + hmap.put(15937, "Сяо Ло") + hmap.put(16750, "Сяо Суань") + hmap.put(13276, "Сяо Фа") + hmap.put(10583, "Сяо Я") + fmt.Println("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение") + hmap.print() + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + name := hmap.get(15937) + fmt.Println("\nДля номера 15937 найдено имя", name) + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + hmap.remove(12836) + fmt.Println("\nПосле удаления 12836 хеш-таблица имеет вид\nКлюч -> Значение") + hmap.print() +} + +func TestHashMapOpenAddressing(t *testing.T) { + /* Инициализация хеш-таблицы */ + hmap := newHashMapOpenAddressing() + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + hmap.put(12836, "Сяо Ха") + hmap.put(15937, "Сяо Ло") + hmap.put(16750, "Сяо Суань") + hmap.put(13276, "Сяо Фа") + hmap.put(10583, "Сяо Я") + fmt.Println("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение") + hmap.print() + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + name := hmap.get(13276) + fmt.Println("\nДля номера 13276 найдено имя", name) + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + hmap.remove(16750) + fmt.Println("\nПосле удаления 16750 хеш-таблица имеет вид\nКлюч -> Значение") + hmap.print() +} diff --git a/ru/codes/go/chapter_hashing/hash_map_chaining.go b/ru/codes/go/chapter_hashing/hash_map_chaining.go new file mode 100644 index 000000000..ebfcff19f --- /dev/null +++ b/ru/codes/go/chapter_hashing/hash_map_chaining.go @@ -0,0 +1,134 @@ +// File: hash_map_chaining.go +// Created Time: 2023-06-23 +// Author: Reanon (793584285@qq.com) + +package chapter_hashing + +import ( + "fmt" + "strconv" + "strings" +) + +/* Хеш-таблица с цепочками */ +type hashMapChaining struct { + size int // Число пар ключ-значение + capacity int // Вместимость хеш-таблицы + loadThres float64 // Порог коэффициента загрузки для запуска расширения + extendRatio int // Коэффициент расширения + buckets [][]pair // Массив корзин +} + +/* Конструктор */ +func newHashMapChaining() *hashMapChaining { + buckets := make([][]pair, 4) + for i := 0; i < 4; i++ { + buckets[i] = make([]pair, 0) + } + return &hashMapChaining{ + size: 0, + capacity: 4, + loadThres: 2.0 / 3.0, + extendRatio: 2, + buckets: buckets, + } +} + +/* Хеш-функция */ +func (m *hashMapChaining) hashFunc(key int) int { + return key % m.capacity +} + +/* Коэффициент загрузки */ +func (m *hashMapChaining) loadFactor() float64 { + return float64(m.size) / float64(m.capacity) +} + +/* Операция поиска */ +func (m *hashMapChaining) get(key int) string { + idx := m.hashFunc(key) + bucket := m.buckets[idx] + // Обойти корзину; если найден key, вернуть соответствующее val + for _, p := range bucket { + if p.key == key { + return p.val + } + } + // Если key не найден, вернуть пустую строку + return "" +} + +/* Операция добавления */ +func (m *hashMapChaining) put(key int, val string) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if m.loadFactor() > m.loadThres { + m.extend() + } + idx := m.hashFunc(key) + // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть + for i := range m.buckets[idx] { + if m.buckets[idx][i].key == key { + m.buckets[idx][i].val = val + return + } + } + // Если такого key нет, добавить пару ключ-значение в конец + p := pair{ + key: key, + val: val, + } + m.buckets[idx] = append(m.buckets[idx], p) + m.size += 1 +} + +/* Операция удаления */ +func (m *hashMapChaining) remove(key int) { + idx := m.hashFunc(key) + // Обойти корзину и удалить из нее пару ключ-значение + for i, p := range m.buckets[idx] { + if p.key == key { + // Удаление из среза + m.buckets[idx] = append(m.buckets[idx][:i], m.buckets[idx][i+1:]...) + m.size -= 1 + break + } + } +} + +/* Расширить хеш-таблицу */ +func (m *hashMapChaining) extend() { + // Временно сохранить исходную хеш-таблицу + tmpBuckets := make([][]pair, len(m.buckets)) + for i := 0; i < len(m.buckets); i++ { + tmpBuckets[i] = make([]pair, len(m.buckets[i])) + copy(tmpBuckets[i], m.buckets[i]) + } + // Инициализация новой хеш-таблицы после расширения + m.capacity *= m.extendRatio + m.buckets = make([][]pair, m.capacity) + for i := 0; i < m.capacity; i++ { + m.buckets[i] = make([]pair, 0) + } + m.size = 0 + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for _, bucket := range tmpBuckets { + for _, p := range bucket { + m.put(p.key, p.val) + } + } +} + +/* Вывести хеш-таблицу */ +func (m *hashMapChaining) print() { + var builder strings.Builder + + for _, bucket := range m.buckets { + builder.WriteString("[") + for _, p := range bucket { + builder.WriteString(strconv.Itoa(p.key) + " -> " + p.val + " ") + } + builder.WriteString("]") + fmt.Println(builder.String()) + builder.Reset() + } +} diff --git a/ru/codes/go/chapter_hashing/hash_map_open_addressing.go b/ru/codes/go/chapter_hashing/hash_map_open_addressing.go new file mode 100644 index 000000000..e1c078d3a --- /dev/null +++ b/ru/codes/go/chapter_hashing/hash_map_open_addressing.go @@ -0,0 +1,126 @@ +// File: hash_map_open_addressing.go +// Created Time: 2023-06-23 +// Author: Reanon (793584285@qq.com) + +package chapter_hashing + +import ( + "fmt" +) + +/* Хеш-таблица с открытой адресацией */ +type hashMapOpenAddressing struct { + size int // Число пар ключ-значение + capacity int // Вместимость хеш-таблицы + loadThres float64 // Порог коэффициента загрузки для запуска расширения + extendRatio int // Коэффициент расширения + buckets []*pair // Массив корзин + TOMBSTONE *pair // Удалить метку +} + +/* Конструктор */ +func newHashMapOpenAddressing() *hashMapOpenAddressing { + return &hashMapOpenAddressing{ + size: 0, + capacity: 4, + loadThres: 2.0 / 3.0, + extendRatio: 2, + buckets: make([]*pair, 4), + TOMBSTONE: &pair{-1, "-1"}, + } +} + +/* Хеш-функция */ +func (h *hashMapOpenAddressing) hashFunc(key int) int { + return key % h.capacity // Вычислить хеш-значение по ключу +} + +/* Коэффициент загрузки */ +func (h *hashMapOpenAddressing) loadFactor() float64 { + return float64(h.size) / float64(h.capacity) // Вычислить текущий коэффициент загрузки +} + +/* Найти индекс корзины, соответствующий key */ +func (h *hashMapOpenAddressing) findBucket(key int) int { + index := h.hashFunc(key) // Получить начальный индекс + firstTombstone := -1 // Запомнить положение первого TOMBSTONE + for h.buckets[index] != nil { + if h.buckets[index].key == key { + if firstTombstone != -1 { + // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс + h.buckets[firstTombstone] = h.buckets[index] + h.buckets[index] = h.TOMBSTONE + return firstTombstone // Вернуть индекс корзины после перемещения + } + return index // Вернуть найденный индекс + } + if firstTombstone == -1 && h.buckets[index] == h.TOMBSTONE { + firstTombstone = index // Запомнить положение первой метки удаления + } + index = (index + 1) % h.capacity // Линейное пробирование: при выходе за хвост вернуться к началу + } + // Если key не существует, вернуть индекс точки добавления + if firstTombstone != -1 { + return firstTombstone + } + return index +} + +/* Операция поиска */ +func (h *hashMapOpenAddressing) get(key int) string { + index := h.findBucket(key) // Найти индекс корзины, соответствующий key + if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE { + return h.buckets[index].val // Если пара ключ-значение найдена, вернуть соответствующее val + } + return "" // Если пара ключ-значение не существует, вернуть "" +} + +/* Операция добавления */ +func (h *hashMapOpenAddressing) put(key int, val string) { + if h.loadFactor() > h.loadThres { + h.extend() // Когда коэффициент загрузки превышает порог, выполнить расширение + } + index := h.findBucket(key) // Найти индекс корзины, соответствующий key + if h.buckets[index] == nil || h.buckets[index] == h.TOMBSTONE { + h.buckets[index] = &pair{key, val} // Если пары ключ-значение нет, добавить ее + h.size++ + } else { + h.buckets[index].val = val // Если пара ключ-значение найдена, перезаписать val + } +} + +/* Операция удаления */ +func (h *hashMapOpenAddressing) remove(key int) { + index := h.findBucket(key) // Найти индекс корзины, соответствующий key + if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE { + h.buckets[index] = h.TOMBSTONE // Если пара ключ-значение найдена, заменить ее меткой удаления + h.size-- + } +} + +/* Расширить хеш-таблицу */ +func (h *hashMapOpenAddressing) extend() { + oldBuckets := h.buckets // Временно сохранить исходную хеш-таблицу + h.capacity *= h.extendRatio // Обновить емкость + h.buckets = make([]*pair, h.capacity) // Инициализация новой хеш-таблицы после расширения + h.size = 0 // Сбросить размер + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for _, pair := range oldBuckets { + if pair != nil && pair != h.TOMBSTONE { + h.put(pair.key, pair.val) + } + } +} + +/* Вывести хеш-таблицу */ +func (h *hashMapOpenAddressing) print() { + for _, pair := range h.buckets { + if pair == nil { + fmt.Println("nil") + } else if pair == h.TOMBSTONE { + fmt.Println("TOMBSTONE") + } else { + fmt.Printf("%d -> %s\n", pair.key, pair.val) + } + } +} diff --git a/ru/codes/go/chapter_hashing/hash_map_test.go b/ru/codes/go/chapter_hashing/hash_map_test.go new file mode 100644 index 000000000..7cbb56c7e --- /dev/null +++ b/ru/codes/go/chapter_hashing/hash_map_test.go @@ -0,0 +1,74 @@ +// File: hash_map_test.go +// Created Time: 2022-12-14 +// Author: msk397 (machangxinq@gmail.com) + +package chapter_hashing + +import ( + "fmt" + "strconv" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestHashMap(t *testing.T) { + /* Инициализация хеш-таблицы */ + hmap := make(map[int]string) + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + hmap[12836] = "Сяо Ха" + hmap[15937] = "Сяо Ло" + hmap[16750] = "Сяо Суань" + hmap[13276] = "Сяо Фа" + hmap[10583] = "Сяо Я" + fmt.Println("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение") + PrintMap(hmap) + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + name := hmap[15937] + fmt.Println("\nДля номера 15937 найдено имя", name) + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + delete(hmap, 10583) + fmt.Println("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение") + PrintMap(hmap) + + /* Обход хеш-таблицы */ + // Перебрать пары ключ-значение key->value + fmt.Println("\nОтдельный обход пар ключ-значение") + for key, value := range hmap { + fmt.Println(key, "->", value) + } + // Отдельно обходить ключи key + fmt.Println("\nОтдельный обход ключей") + for key := range hmap { + fmt.Println(key) + } + // Отдельно обходить значения value + fmt.Println("\nОтдельный обход значений") + for _, value := range hmap { + fmt.Println(value) + } +} + +func TestSimpleHash(t *testing.T) { + var hash int + + key := "Hello Algo" + + hash = addHash(key) + fmt.Println("Хеш-сумма сложением = " + strconv.Itoa(hash)) + + hash = mulHash(key) + fmt.Println("Хеш-сумма умножением = " + strconv.Itoa(hash)) + + hash = xorHash(key) + fmt.Println("Хеш-сумма XOR = " + strconv.Itoa(hash)) + + hash = rotHash(key) + fmt.Println("Хеш-сумма с циклическим сдвигом = " + strconv.Itoa(hash)) +} diff --git a/ru/codes/go/chapter_hashing/simple_hash.go b/ru/codes/go/chapter_hashing/simple_hash.go new file mode 100644 index 000000000..e9567ccb4 --- /dev/null +++ b/ru/codes/go/chapter_hashing/simple_hash.go @@ -0,0 +1,55 @@ +// File: simple_hash.go +// Created Time: 2023-06-23 +// Author: Reanon (793584285@qq.com) + +package chapter_hashing + +import "fmt" + +/* Аддитивное хеширование */ +func addHash(key string) int { + var hash int64 + var modulus int64 + + modulus = 1000000007 + for _, b := range []byte(key) { + hash = (hash + int64(b)) % modulus + } + return int(hash) +} + +/* Мультипликативное хеширование */ +func mulHash(key string) int { + var hash int64 + var modulus int64 + + modulus = 1000000007 + for _, b := range []byte(key) { + hash = (31*hash + int64(b)) % modulus + } + return int(hash) +} + +/* XOR-хеширование */ +func xorHash(key string) int { + hash := 0 + modulus := 1000000007 + for _, b := range []byte(key) { + fmt.Println(int(b)) + hash ^= int(b) + hash = (31*hash + int(b)) % modulus + } + return hash & modulus +} + +/* Хеширование с циклическим сдвигом */ +func rotHash(key string) int { + var hash int64 + var modulus int64 + + modulus = 1000000007 + for _, b := range []byte(key) { + hash = ((hash << 4) ^ (hash >> 28) ^ int64(b)) % modulus + } + return int(hash) +} diff --git a/ru/codes/go/chapter_heap/heap.go b/ru/codes/go/chapter_heap/heap.go new file mode 100644 index 000000000..b5ef628e0 --- /dev/null +++ b/ru/codes/go/chapter_heap/heap.go @@ -0,0 +1,45 @@ +// File: heap.go +// Created Time: 2023-01-12 +// Author: Reanon (793584285@qq.com) + +package chapter_heap + +// В Go можно построить максимальную кучу для целых чисел, реализовав heap.Interface +// Для реализации heap.Interface одновременно требуется реализовать sort.Interface +type intHeap []any + +// Функция Push интерфейса heap.Interface, реализующая добавление элемента в кучу +func (h *intHeap) Push(x any) { + // Push и Pop используют pointer receiver в качестве параметра + // Потому что они не только изменяют содержимое среза, но и меняют его длину. + *h = append(*h, x.(int)) +} + +// Функция Pop интерфейса heap.Interface, реализующая извлечение элемента с вершины кучи +func (h *intHeap) Pop() any { + // Элемент, который нужно удалить из кучи, хранится в конце + last := (*h)[len(*h)-1] + *h = (*h)[:len(*h)-1] + return last +} + +// Функция Len интерфейса sort.Interface +func (h *intHeap) Len() int { + return len(*h) +} + +// Функция Less интерфейса sort.Interface +func (h *intHeap) Less(i, j int) bool { + // При реализации минимальной кучи нужно изменить знак сравнения на «меньше» + return (*h)[i].(int) > (*h)[j].(int) +} + +// Функция Swap интерфейса sort.Interface +func (h *intHeap) Swap(i, j int) { + (*h)[i], (*h)[j] = (*h)[j], (*h)[i] +} + +// Top: получить элемент на вершине кучи +func (h *intHeap) Top() any { + return (*h)[0] +} diff --git a/ru/codes/go/chapter_heap/heap_test.go b/ru/codes/go/chapter_heap/heap_test.go new file mode 100644 index 000000000..e96783a74 --- /dev/null +++ b/ru/codes/go/chapter_heap/heap_test.go @@ -0,0 +1,101 @@ +// File: heap_test.go +// Created Time: 2023-01-12 +// Author: Reanon (793584285@qq.com) + +package chapter_heap + +import ( + "container/heap" + "fmt" + "strconv" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func testPush(h *intHeap, val int) { + // Вызвать функции heap.Interface для добавления элемента + heap.Push(h, val) + fmt.Printf("\nПосле добавления элемента %d в кучу\n", val) + PrintHeap(*h) +} + +func testPop(h *intHeap) { + // Вызвать функции heap.Interface для удаления элемента + val := heap.Pop(h) + fmt.Printf("\nПосле извлечения элемента вершины кучи %d\n", val) + PrintHeap(*h) +} + +func TestHeap(t *testing.T) { + /* Инициализация кучи */ + // Инициализация максимальной кучи + maxHeap := &intHeap{} + heap.Init(maxHeap) + /* Добавление элемента в кучу */ + testPush(maxHeap, 1) + testPush(maxHeap, 3) + testPush(maxHeap, 2) + testPush(maxHeap, 5) + testPush(maxHeap, 4) + + /* Получение элемента с вершины кучи */ + top := maxHeap.Top() + fmt.Printf("Элемент на вершине кучи = %d\n", top) + + /* Извлечение элемента с вершины кучи */ + testPop(maxHeap) + testPop(maxHeap) + testPop(maxHeap) + testPop(maxHeap) + testPop(maxHeap) + + /* Получение размера кучи */ + size := len(*maxHeap) + fmt.Printf("Количество элементов в куче = %d\n", size) + + /* Проверка, пуста ли куча */ + isEmpty := len(*maxHeap) == 0 + fmt.Printf("Пуста ли куча: %t\n", isEmpty) +} + +func TestMyHeap(t *testing.T) { + /* Инициализация кучи */ + // Инициализация максимальной кучи + maxHeap := newMaxHeap([]any{9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2}) + fmt.Printf("После построения кучи из входного массива\n") + maxHeap.print() + + /* Получение элемента с вершины кучи */ + peek := maxHeap.peek() + fmt.Printf("\nЭлемент на вершине кучи = %d\n", peek) + + /* Добавление элемента в кучу */ + val := 7 + maxHeap.push(val) + fmt.Printf("\nПосле добавления элемента %d в кучу\n", val) + maxHeap.print() + + /* Извлечение элемента с вершины кучи */ + peek = maxHeap.pop() + fmt.Printf("\nПосле извлечения элемента вершины кучи %d\n", peek) + maxHeap.print() + + /* Получение размера кучи */ + size := maxHeap.size() + fmt.Printf("\nКоличество элементов в куче = %d\n", size) + + /* Проверка, пуста ли куча */ + isEmpty := maxHeap.isEmpty() + fmt.Printf("\nПуста ли куча: %t\n", isEmpty) +} + +func TestTopKHeap(t *testing.T) { + /* Инициализация кучи */ + // Инициализация максимальной кучи + nums := []int{1, 7, 6, 3, 2} + k := 3 + res := topKHeap(nums, k) + fmt.Printf("Наибольшие " + strconv.Itoa(k) + " элементов") + PrintHeap(*res) +} diff --git a/ru/codes/go/chapter_heap/my_heap.go b/ru/codes/go/chapter_heap/my_heap.go new file mode 100644 index 000000000..739afed55 --- /dev/null +++ b/ru/codes/go/chapter_heap/my_heap.go @@ -0,0 +1,140 @@ +// File: my_heap.go +// Created Time: 2023-01-12 +// Author: Reanon (793584285@qq.com) + +package chapter_heap + +import ( + "fmt" + + . "github.com/krahets/hello-algo/pkg" +) + +type maxHeap struct { + // Использовать срез вместо массива, чтобы не учитывать проблему расширения + data []any +} + +/* Конструктор, создающий пустую кучу */ +func newHeap() *maxHeap { + return &maxHeap{ + data: make([]any, 0), + } +} + +/* Конструктор, строящий кучу по срезу */ +func newMaxHeap(nums []any) *maxHeap { + // Добавить элементы списка в кучу без изменений + h := &maxHeap{data: nums} + for i := h.parent(len(h.data) - 1); i >= 0; i-- { + // Выполнить heapify для всех узлов, кроме листовых + h.siftDown(i) + } + return h +} + +/* Получить индекс левого дочернего узла */ +func (h *maxHeap) left(i int) int { + return 2*i + 1 +} + +/* Получить индекс правого дочернего узла */ +func (h *maxHeap) right(i int) int { + return 2*i + 2 +} + +/* Получить индекс родительского узла */ +func (h *maxHeap) parent(i int) int { + // Округление вниз при делении + return (i - 1) / 2 +} + +/* Поменять элементы местами */ +func (h *maxHeap) swap(i, j int) { + h.data[i], h.data[j] = h.data[j], h.data[i] +} + +/* Получение размера кучи */ +func (h *maxHeap) size() int { + return len(h.data) +} + +/* Проверка, пуста ли куча */ +func (h *maxHeap) isEmpty() bool { + return len(h.data) == 0 +} + +/* Доступ к элементу на вершине кучи */ +func (h *maxHeap) peek() any { + return h.data[0] +} + +/* Добавление элемента в кучу */ +func (h *maxHeap) push(val any) { + // Добавление узла + h.data = append(h.data, val) + // Просеивание снизу вверх + h.siftUp(len(h.data) - 1) +} + +/* Начиная с узла i, выполнить просеивание снизу вверх */ +func (h *maxHeap) siftUp(i int) { + for true { + // Получение родительского узла для узла i + p := h.parent(i) + // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления» + if p < 0 || h.data[i].(int) <= h.data[p].(int) { + break + } + // Поменять два узла местами + h.swap(i, p) + // Циклическое просеивание вверх + i = p + } +} + +/* Извлечение элемента из кучи */ +func (h *maxHeap) pop() any { + // Обработка пустого случая + if h.isEmpty() { + fmt.Println("error") + return nil + } + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + h.swap(0, h.size()-1) + // Удаление узла + val := h.data[len(h.data)-1] + h.data = h.data[:len(h.data)-1] + // Просеивание сверху вниз + h.siftDown(0) + + // Вернуть элемент с вершины кучи + return val +} + +/* Начиная с узла i, выполнить просеивание сверху вниз */ +func (h *maxHeap) siftDown(i int) { + for true { + // Определить узел с максимальным значением среди i, l и r и обозначить его как max + l, r, max := h.left(i), h.right(i), i + if l < h.size() && h.data[l].(int) > h.data[max].(int) { + max = l + } + if r < h.size() && h.data[r].(int) > h.data[max].(int) { + max = r + } + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if max == i { + break + } + // Поменять два узла местами + h.swap(i, max) + // Циклическое просеивание вниз + i = max + } +} + +/* Вывести кучу (двоичное дерево) */ +func (h *maxHeap) print() { + PrintHeap(h.data) +} diff --git a/ru/codes/go/chapter_heap/top_k.go b/ru/codes/go/chapter_heap/top_k.go new file mode 100644 index 000000000..d1cb01dd1 --- /dev/null +++ b/ru/codes/go/chapter_heap/top_k.go @@ -0,0 +1,51 @@ +// File: top_k.go +// Created Time: 2023-06-24 +// Author: Reanon (793584285@qq.com) + +package chapter_heap + +import "container/heap" + +type minHeap []any + +func (h *minHeap) Len() int { return len(*h) } +func (h *minHeap) Less(i, j int) bool { return (*h)[i].(int) < (*h)[j].(int) } +func (h *minHeap) Swap(i, j int) { (*h)[i], (*h)[j] = (*h)[j], (*h)[i] } + +// Метод Push интерфейса heap.Interface, реализующий добавление элемента в кучу +func (h *minHeap) Push(x any) { + *h = append(*h, x.(int)) +} + +// Метод Pop интерфейса heap.Interface, реализующий извлечение элемента с вершины кучи +func (h *minHeap) Pop() any { + // Элемент, который нужно удалить из кучи, хранится в конце + last := (*h)[len(*h)-1] + *h = (*h)[:len(*h)-1] + return last +} + +// Top: получить элемент на вершине кучи +func (h *minHeap) Top() any { + return (*h)[0] +} + +/* Найти k наибольших элементов массива с помощью кучи */ +func topKHeap(nums []int, k int) *minHeap { + // Инициализация минимальной кучи + h := &minHeap{} + heap.Init(h) + // Поместить первые k элементов массива в кучу + for i := 0; i < k; i++ { + heap.Push(h, nums[i]) + } + // Начиная с элемента k+1, поддерживать длину кучи равной k + for i := k; i < len(nums); i++ { + // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу + if nums[i] > h.Top().(int) { + heap.Pop(h) + heap.Push(h, nums[i]) + } + } + return h +} diff --git a/ru/codes/go/chapter_searching/binary_search.go b/ru/codes/go/chapter_searching/binary_search.go new file mode 100644 index 000000000..37672f9f0 --- /dev/null +++ b/ru/codes/go/chapter_searching/binary_search.go @@ -0,0 +1,43 @@ +// File: binary_search.go +// Created Time: 2022-12-05 +// Author: Slone123c (274325721@qq.com) + +package chapter_searching + +/* Бинарный поиск (двусторонне замкнутый интервал) */ +func binarySearch(nums []int, target int) int { + // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно + i, j := 0, len(nums)-1 + // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст) + for i <= j { + m := i + (j-i)/2 // Вычислить индекс середины m + if nums[m] < target { // Это означает, что target находится в интервале [m+1, j] + i = m + 1 + } else if nums[m] > target { // Это означает, что target находится в интервале [i, m-1] + j = m - 1 + } else { // Целевой элемент найден, вернуть его индекс + return m + } + } + // Целевой элемент не найден, вернуть -1 + return -1 +} + +/* Бинарный поиск (лево замкнутый, право открытый интервал) */ +func binarySearchLCRO(nums []int, target int) int { + // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно + i, j := 0, len(nums) + // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст) + for i < j { + m := i + (j-i)/2 // Вычислить индекс середины m + if nums[m] < target { // Это означает, что target находится в интервале [m+1, j) + i = m + 1 + } else if nums[m] > target { // Это означает, что target находится в интервале [i, m) + j = m + } else { // Целевой элемент найден, вернуть его индекс + return m + } + } + // Целевой элемент не найден, вернуть -1 + return -1 +} diff --git a/ru/codes/go/chapter_searching/binary_search_edge.go b/ru/codes/go/chapter_searching/binary_search_edge.go new file mode 100644 index 000000000..d532c5859 --- /dev/null +++ b/ru/codes/go/chapter_searching/binary_search_edge.go @@ -0,0 +1,31 @@ +// File: binary_search_edge.go +// Created Time: 2023-08-23 +// Author: Reanon (793584285@qq.com) + +package chapter_searching + +/* Бинарный поиск самого левого target */ +func binarySearchLeftEdge(nums []int, target int) int { + // Эквивалентно поиску точки вставки target + i := binarySearchInsertion(nums, target) + // target не найден, вернуть -1 + if i == len(nums) || nums[i] != target { + return -1 + } + // Найти target и вернуть индекс i + return i +} + +/* Бинарный поиск самого правого target */ +func binarySearchRightEdge(nums []int, target int) int { + // Преобразовать задачу в поиск самого левого target + 1 + i := binarySearchInsertion(nums, target+1) + // j указывает на самый правый target, а i — на первый элемент больше target + j := i - 1 + // target не найден, вернуть -1 + if j == -1 || nums[j] != target { + return -1 + } + // Найти target и вернуть индекс j + return j +} diff --git a/ru/codes/go/chapter_searching/binary_search_insertion.go b/ru/codes/go/chapter_searching/binary_search_insertion.go new file mode 100644 index 000000000..e5722dc4b --- /dev/null +++ b/ru/codes/go/chapter_searching/binary_search_insertion.go @@ -0,0 +1,49 @@ +// File: binary_search_insertion.go +// Created Time: 2023-08-23 +// Author: Reanon (793584285@qq.com) + +package chapter_searching + +/* Бинарный поиск точки вставки (без повторяющихся элементов) */ +func binarySearchInsertionSimple(nums []int, target int) int { + // Инициализировать двусторонне замкнутый интервал [0, n-1] + i, j := 0, len(nums)-1 + for i <= j { + // Вычислить индекс середины m + m := i + (j-i)/2 + if nums[m] < target { + // target находится в интервале [m+1, j] + i = m + 1 + } else if nums[m] > target { + // target находится в интервале [i, m-1] + j = m - 1 + } else { + // Найти target и вернуть точку вставки m + return m + } + } + // target не найден, вернуть точку вставки i + return i +} + +/* Бинарный поиск точки вставки (с повторяющимися элементами) */ +func binarySearchInsertion(nums []int, target int) int { + // Инициализировать двусторонне замкнутый интервал [0, n-1] + i, j := 0, len(nums)-1 + for i <= j { + // Вычислить индекс середины m + m := i + (j-i)/2 + if nums[m] < target { + // target находится в интервале [m+1, j] + i = m + 1 + } else if nums[m] > target { + // target находится в интервале [i, m-1] + j = m - 1 + } else { + // Первый элемент меньше target находится в интервале [i, m-1] + j = m - 1 + } + } + // Вернуть точку вставки i + return i +} diff --git a/ru/codes/go/chapter_searching/binary_search_test.go b/ru/codes/go/chapter_searching/binary_search_test.go new file mode 100644 index 000000000..a523d2732 --- /dev/null +++ b/ru/codes/go/chapter_searching/binary_search_test.go @@ -0,0 +1,61 @@ +// File: binary_search_test.go +// Created Time: 2022-12-05 +// Author: Slone123c (274325721@qq.com) + +package chapter_searching + +import ( + "fmt" + "testing" +) + +func TestBinarySearch(t *testing.T) { + var ( + target = 6 + nums = []int{1, 3, 6, 8, 12, 15, 23, 26, 31, 35} + expected = 2 + ) + // Выполнить бинарный поиск в массиве + actual := binarySearch(nums, target) + fmt.Println("Индекс целевого элемента 6 =", actual) + if actual != expected { + t.Errorf("Индекс целевого элемента 6 = %d, должно быть %d", actual, expected) + } +} + +func TestBinarySearchEdge(t *testing.T) { + // Массив с повторяющимися элементами + nums := []int{1, 3, 6, 8, 12, 15, 23, 26, 31, 35} + fmt.Println("\nМассив nums =", nums) + + // Бинарный поиск левой и правой границы + for _, target := range []int{6, 7} { + index := binarySearchLeftEdge(nums, target) + fmt.Println("Индекс самого левого элемента", target, "равен", index) + + index = binarySearchRightEdge(nums, target) + fmt.Println("Индекс самого правого элемента", target, "равен", index) + } +} + +func TestBinarySearchInsertion(t *testing.T) { + // Массив без повторяющихся элементов + nums := []int{1, 3, 6, 8, 12, 15, 23, 26, 31, 35} + fmt.Println("Массив nums =", nums) + + // Бинарный поиск точки вставки + for _, target := range []int{6, 9} { + index := binarySearchInsertionSimple(nums, target) + fmt.Println("Индекс позиции вставки элемента", target, "равен", index) + } + + // Массив с повторяющимися элементами + nums = []int{1, 3, 6, 6, 6, 6, 6, 10, 12, 15} + fmt.Println("\nМассив nums =", nums) + + // Бинарный поиск точки вставки + for _, target := range []int{2, 6, 20} { + index := binarySearchInsertion(nums, target) + fmt.Println("Индекс позиции вставки элемента", target, "равен", index) + } +} diff --git a/ru/codes/go/chapter_searching/hashing_search.go b/ru/codes/go/chapter_searching/hashing_search.go new file mode 100644 index 000000000..e64ccc2ae --- /dev/null +++ b/ru/codes/go/chapter_searching/hashing_search.go @@ -0,0 +1,29 @@ +// File: hashing_search.go +// Created Time: 2022-12-12 +// Author: Slone123c (274325721@qq.com) + +package chapter_searching + +import . "github.com/krahets/hello-algo/pkg" + +/* Хеш-поиск (массив) */ +func hashingSearchArray(m map[int]int, target int) int { + // key хеш-таблицы: целевой элемент, value: индекс + // Если такого key нет в хеш-таблице, вернуть -1 + if index, ok := m[target]; ok { + return index + } else { + return -1 + } +} + +/* Хеш-поиск (связный список) */ +func hashingSearchLinkedList(m map[int]*ListNode, target int) *ListNode { + // key хеш-таблицы: значение целевого узла, value: объект узла + // Если такого key нет в хеш-таблице, вернуть nil + if node, ok := m[target]; ok { + return node + } else { + return nil + } +} diff --git a/ru/codes/go/chapter_searching/hashing_search_test.go b/ru/codes/go/chapter_searching/hashing_search_test.go new file mode 100644 index 000000000..d9bd5fef3 --- /dev/null +++ b/ru/codes/go/chapter_searching/hashing_search_test.go @@ -0,0 +1,36 @@ +// File: hashing_search_test.go +// Created Time: 2022-12-12 +// Author: Slone123c (274325721@qq.com) + +package chapter_searching + +import ( + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestHashingSearch(t *testing.T) { + target := 3 + /* Хеш-поиск (массив) */ + nums := []int{1, 5, 3, 2, 4, 7, 5, 9, 10, 8} + // Инициализация хеш-таблицы + m := make(map[int]int) + for i := 0; i < len(nums); i++ { + m[nums[i]] = i + } + index := hashingSearchArray(m, target) + fmt.Println("Индекс целевого элемента 3 = ", index) + + /* Хеш-поиск (связный список) */ + head := ArrayToLinkedList(nums) + // Инициализация хеш-таблицы + m1 := make(map[int]*ListNode) + for head != nil { + m1[head.Val] = head + head = head.Next + } + node := hashingSearchLinkedList(m1, target) + fmt.Println("Объект узла со значением 3 =", node) +} diff --git a/ru/codes/go/chapter_searching/linear_search.go b/ru/codes/go/chapter_searching/linear_search.go new file mode 100644 index 000000000..83b22fa70 --- /dev/null +++ b/ru/codes/go/chapter_searching/linear_search.go @@ -0,0 +1,36 @@ +// File: linear_search.go +// Created Time: 2022-11-25 +// Author: Reanon (793584285@qq.com) + +package chapter_searching + +import ( + . "github.com/krahets/hello-algo/pkg" +) + +/* Линейный поиск (массив) */ +func linearSearchArray(nums []int, target int) int { + // Обход массива + for i := 0; i < len(nums); i++ { + // Целевой элемент найден, вернуть его индекс + if nums[i] == target { + return i + } + } + // Целевой элемент не найден, вернуть -1 + return -1 +} + +/* Линейный поиск (связный список) */ +func linearSearchLinkedList(node *ListNode, target int) *ListNode { + // Обойти связный список + for node != nil { + // Найти целевой узел и вернуть его + if node.Val == target { + return node + } + node = node.Next + } + // Целевой элемент не найден, вернуть nil + return nil +} diff --git a/ru/codes/go/chapter_searching/linear_search_test.go b/ru/codes/go/chapter_searching/linear_search_test.go new file mode 100644 index 000000000..1ec55702f --- /dev/null +++ b/ru/codes/go/chapter_searching/linear_search_test.go @@ -0,0 +1,26 @@ +// File: linear_search_test.go +// Created Time: 2022-11-25 +// Author: Reanon (793584285@qq.com) + +package chapter_searching + +import ( + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestLinearSearch(t *testing.T) { + target := 3 + nums := []int{1, 5, 3, 2, 4, 7, 5, 9, 10, 8} + + // Выполнить линейный поиск в массиве + index := linearSearchArray(nums, target) + fmt.Println("Индекс целевого элемента 3 =", index) + + // Выполнить линейный поиск в связном списке + head := ArrayToLinkedList(nums) + node := linearSearchLinkedList(head, target) + fmt.Println("Объект узла со значением 3 =", node) +} diff --git a/ru/codes/go/chapter_searching/two_sum.go b/ru/codes/go/chapter_searching/two_sum.go new file mode 100644 index 000000000..795de6fda --- /dev/null +++ b/ru/codes/go/chapter_searching/two_sum.go @@ -0,0 +1,33 @@ +// File: two_sum.go +// Created Time: 2022-11-25 +// Author: reanon (793584285@qq.com) + +package chapter_searching + +/* Метод 1: полный перебор */ +func twoSumBruteForce(nums []int, target int) []int { + size := len(nums) + // Два вложенных цикла, временная сложность O(n^2) + for i := 0; i < size-1; i++ { + for j := i + 1; j < size; j++ { + if nums[i]+nums[j] == target { + return []int{i, j} + } + } + } + return nil +} + +/* Метод 2: вспомогательная хеш-таблица */ +func twoSumHashTable(nums []int, target int) []int { + // Вспомогательная хеш-таблица, пространственная сложность O(n) + hashTable := map[int]int{} + // Один цикл, временная сложность O(n) + for idx, val := range nums { + if preIdx, ok := hashTable[target-val]; ok { + return []int{preIdx, idx} + } + hashTable[val] = idx + } + return nil +} diff --git a/ru/codes/go/chapter_searching/two_sum_test.go b/ru/codes/go/chapter_searching/two_sum_test.go new file mode 100644 index 000000000..95eba1e2b --- /dev/null +++ b/ru/codes/go/chapter_searching/two_sum_test.go @@ -0,0 +1,24 @@ +// File: two_sum_test.go +// Created Time: 2022-11-25 +// Author: reanon (793584285@qq.com) + +package chapter_searching + +import ( + "fmt" + "testing" +) + +func TestTwoSum(t *testing.T) { + // ======= Test Case ======= + nums := []int{2, 7, 11, 15} + target := 13 + + // ====== Основной код ====== + // Метод 1: решение полным перебором + res := twoSumBruteForce(nums, target) + fmt.Println("Результат метода 1 res =", res) + // Способ 2: хеш-таблица + res = twoSumHashTable(nums, target) + fmt.Println("Результат метода 2 res =", res) +} diff --git a/ru/codes/go/chapter_sorting/bubble_sort.go b/ru/codes/go/chapter_sorting/bubble_sort.go new file mode 100644 index 000000000..eaf536da9 --- /dev/null +++ b/ru/codes/go/chapter_sorting/bubble_sort.go @@ -0,0 +1,38 @@ +// File: bubble_sort.go +// Created Time: 2022-12-06 +// Author: Slone123c (274325721@qq.com) + +package chapter_sorting + +/* Пузырьковая сортировка */ +func bubbleSort(nums []int) { + // Внешний цикл: неотсортированный диапазон [0, i] + for i := len(nums) - 1; i > 0; i-- { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for j := 0; j < i; j++ { + if nums[j] > nums[j+1] { + // Поменять местами nums[j] и nums[j + 1] + nums[j], nums[j+1] = nums[j+1], nums[j] + } + } + } +} + +/* Пузырьковая сортировка (оптимизация флагом) */ +func bubbleSortWithFlag(nums []int) { + // Внешний цикл: неотсортированный диапазон [0, i] + for i := len(nums) - 1; i > 0; i-- { + flag := false // Инициализировать флаг + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for j := 0; j < i; j++ { + if nums[j] > nums[j+1] { + // Поменять местами nums[j] и nums[j + 1] + nums[j], nums[j+1] = nums[j+1], nums[j] + flag = true // Записать обмен элементов + } + } + if flag == false { // На этой итерации «всплытия» не было ни одного обмена, сразу выйти + break + } + } +} diff --git a/ru/codes/go/chapter_sorting/bubble_sort_test.go b/ru/codes/go/chapter_sorting/bubble_sort_test.go new file mode 100644 index 000000000..3c5f2ed93 --- /dev/null +++ b/ru/codes/go/chapter_sorting/bubble_sort_test.go @@ -0,0 +1,20 @@ +// File: bubble_sort_test.go +// Created Time: 2022-12-06 +// Author: Slone123c (274325721@qq.com) + +package chapter_sorting + +import ( + "fmt" + "testing" +) + +func TestBubbleSort(t *testing.T) { + nums := []int{4, 1, 3, 1, 5, 2} + bubbleSort(nums) + fmt.Println("После пузырьковой сортировки nums =", nums) + + nums1 := []int{4, 1, 3, 1, 5, 2} + bubbleSortWithFlag(nums1) + fmt.Println("После пузырьковой сортировки nums1 =", nums1) +} diff --git a/ru/codes/go/chapter_sorting/bucket_sort.go b/ru/codes/go/chapter_sorting/bucket_sort.go new file mode 100644 index 000000000..8b1396183 --- /dev/null +++ b/ru/codes/go/chapter_sorting/bucket_sort.go @@ -0,0 +1,37 @@ +// File: bucket_sort.go +// Created Time: 2023-03-27 +// Author: Reanon (793584285@qq.com) + +package chapter_sorting + +import "sort" + +/* Сортировка корзинами */ +func bucketSort(nums []float64) { + // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину + k := len(nums) / 2 + buckets := make([][]float64, k) + for i := 0; i < k; i++ { + buckets[i] = make([]float64, 0) + } + // 1. Распределить элементы массива по корзинам + for _, num := range nums { + // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1] + i := int(num * float64(k)) + // Добавить num в корзину i + buckets[i] = append(buckets[i], num) + } + // 2. Выполнить сортировку внутри каждой корзины + for i := 0; i < k; i++ { + // Использовать встроенную функцию сортировки среза; ее также можно заменить другим алгоритмом сортировки + sort.Float64s(buckets[i]) + } + // 3. Обойти корзины и объединить результаты + i := 0 + for _, bucket := range buckets { + for _, num := range bucket { + nums[i] = num + i++ + } + } +} diff --git a/ru/codes/go/chapter_sorting/bucket_sort_test.go b/ru/codes/go/chapter_sorting/bucket_sort_test.go new file mode 100644 index 000000000..18dcdb144 --- /dev/null +++ b/ru/codes/go/chapter_sorting/bucket_sort_test.go @@ -0,0 +1,17 @@ +// File: bucket_sort_test.go +// Created Time: 2023-03-27 +// Author: Reanon (793584285@qq.com) + +package chapter_sorting + +import ( + "fmt" + "testing" +) + +func TestBucketSort(t *testing.T) { + // Пусть входные данные — числа с плавающей точкой из диапазона [0, 1) + nums := []float64{0.49, 0.96, 0.82, 0.09, 0.57, 0.43, 0.91, 0.75, 0.15, 0.37} + bucketSort(nums) + fmt.Println("После сортировки корзинами nums =", nums) +} diff --git a/ru/codes/go/chapter_sorting/counting_sort.go b/ru/codes/go/chapter_sorting/counting_sort.go new file mode 100644 index 000000000..b9ceee1c6 --- /dev/null +++ b/ru/codes/go/chapter_sorting/counting_sort.go @@ -0,0 +1,68 @@ +// File: counting_sort.go +// Created Time: 2023-03-20 +// Author: Reanon (793584285@qq.com) + +package chapter_sorting + +type CountingSort struct{} + +/* Сортировка подсчетом */ +// Простая реализация, не подходит для сортировки объектов +func countingSortNaive(nums []int) { + // 1. Найти максимальный элемент массива m + m := 0 + for _, num := range nums { + if num > m { + m = num + } + } + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + counter := make([]int, m+1) + for _, num := range nums { + counter[num]++ + } + // 3. Обойти counter и заполнить исходный массив nums элементами + for i, num := 0, 0; num < m+1; num++ { + for j := 0; j < counter[num]; j++ { + nums[i] = num + i++ + } + } +} + +/* Сортировка подсчетом */ +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой +func countingSort(nums []int) { + // 1. Найти максимальный элемент массива m + m := 0 + for _, num := range nums { + if num > m { + m = num + } + } + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + counter := make([]int, m+1) + for _, num := range nums { + counter[num]++ + } + // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс» + // То есть counter[num]-1 — это индекс последнего появления num в res + for i := 0; i < m; i++ { + counter[i+1] += counter[i] + } + // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res + // Инициализировать массив res для хранения результата + n := len(nums) + res := make([]int, n) + for i := n - 1; i >= 0; i-- { + num := nums[i] + // Поместить num по соответствующему индексу + res[counter[num]-1] = num + // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num + counter[num]-- + } + // Перезаписать исходный массив nums массивом результата res + copy(nums, res) +} diff --git a/ru/codes/go/chapter_sorting/counting_sort_test.go b/ru/codes/go/chapter_sorting/counting_sort_test.go new file mode 100644 index 000000000..c34192d9b --- /dev/null +++ b/ru/codes/go/chapter_sorting/counting_sort_test.go @@ -0,0 +1,20 @@ +// File: counting_sort_test.go +// Created Time: 2023-03-20 +// Author: Reanon (793584285@qq.com) + +package chapter_sorting + +import ( + "fmt" + "testing" +) + +func TestCountingSort(t *testing.T) { + nums := []int{1, 0, 1, 2, 0, 4, 0, 2, 2, 4} + countingSortNaive(nums) + fmt.Println("После сортировки подсчетом (объекты не поддерживаются) nums =", nums) + + nums1 := []int{1, 0, 1, 2, 0, 4, 0, 2, 2, 4} + countingSort(nums1) + fmt.Println("После сортировки подсчетом nums1 =", nums1) +} diff --git a/ru/codes/go/chapter_sorting/heap_sort.go b/ru/codes/go/chapter_sorting/heap_sort.go new file mode 100644 index 000000000..d1811376d --- /dev/null +++ b/ru/codes/go/chapter_sorting/heap_sort.go @@ -0,0 +1,44 @@ +// File: heap_sort.go +// Created Time: 2023-05-29 +// Author: Reanon (793584285@qq.com) + +package chapter_sorting + +/* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */ +func siftDown(nums *[]int, n, i int) { + for true { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + l := 2*i + 1 + r := 2*i + 2 + ma := i + if l < n && (*nums)[l] > (*nums)[ma] { + ma = l + } + if r < n && (*nums)[r] > (*nums)[ma] { + ma = r + } + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if ma == i { + break + } + // Поменять два узла местами + (*nums)[i], (*nums)[ma] = (*nums)[ma], (*nums)[i] + // Циклическое просеивание вниз + i = ma + } +} + +/* Сортировка кучей */ +func heapSort(nums *[]int) { + // Построение кучи: выполнить heapify для всех узлов, кроме листовых + for i := len(*nums)/2 - 1; i >= 0; i-- { + siftDown(nums, len(*nums), i) + } + // Извлекать максимальный элемент из кучи в течение n-1 итераций + for i := len(*nums) - 1; i > 0; i-- { + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + (*nums)[0], (*nums)[i] = (*nums)[i], (*nums)[0] + // Начиная с корневого узла, выполнить просеивание сверху вниз + siftDown(nums, i, 0) + } +} diff --git a/ru/codes/go/chapter_sorting/heap_sort_test.go b/ru/codes/go/chapter_sorting/heap_sort_test.go new file mode 100644 index 000000000..6ea18ea66 --- /dev/null +++ b/ru/codes/go/chapter_sorting/heap_sort_test.go @@ -0,0 +1,16 @@ +// File: heap_sort_test.go +// Created Time: 2023-05-29 +// Author: Reanon (793584285@qq.com) + +package chapter_sorting + +import ( + "fmt" + "testing" +) + +func TestHeapSort(t *testing.T) { + nums := []int{4, 1, 3, 1, 5, 2} + heapSort(&nums) + fmt.Println("После сортировки кучей nums =", nums) +} diff --git a/ru/codes/go/chapter_sorting/insertion_sort.go b/ru/codes/go/chapter_sorting/insertion_sort.go new file mode 100644 index 000000000..9885fa3c7 --- /dev/null +++ b/ru/codes/go/chapter_sorting/insertion_sort.go @@ -0,0 +1,20 @@ +// File: insertion_sort.go +// Created Time: 2022-12-12 +// Author: msk397 (machangxinq@gmail.com) + +package chapter_sorting + +/* Сортировка вставками */ +func insertionSort(nums []int) { + // Внешний цикл: отсортированный диапазон [0, i-1] + for i := 1; i < len(nums); i++ { + base := nums[i] + j := i - 1 + // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1] + for j >= 0 && nums[j] > base { + nums[j+1] = nums[j] // Сдвинуть nums[j] на одну позицию вправо + j-- + } + nums[j+1] = base // Поместить base в правильную позицию + } +} diff --git a/ru/codes/go/chapter_sorting/insertion_sort_test.go b/ru/codes/go/chapter_sorting/insertion_sort_test.go new file mode 100644 index 000000000..bd02b42b0 --- /dev/null +++ b/ru/codes/go/chapter_sorting/insertion_sort_test.go @@ -0,0 +1,16 @@ +// File: insertion_sort_test.go +// Created Time: 2022-12-12 +// Author: msk397 (machangxinq@gmail.com) + +package chapter_sorting + +import ( + "fmt" + "testing" +) + +func TestInsertionSort(t *testing.T) { + nums := []int{4, 1, 3, 1, 5, 2} + insertionSort(nums) + fmt.Println("После сортировки вставками nums =", nums) +} diff --git a/ru/codes/go/chapter_sorting/merge_sort.go b/ru/codes/go/chapter_sorting/merge_sort.go new file mode 100644 index 000000000..79aacb062 --- /dev/null +++ b/ru/codes/go/chapter_sorting/merge_sort.go @@ -0,0 +1,54 @@ +// File: merge_sort.go +// Created Time: 2022-12-13 +// Author: msk397 (machangxinq@gmail.com) + +package chapter_sorting + +/* Объединить левый и правый подмассивы */ +func merge(nums []int, left, mid, right int) { + // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right] + // Создать временный массив tmp для хранения результата слияния + tmp := make([]int, right-left+1) + // Инициализировать начальные индексы левого и правого подмассивов + i, j, k := left, mid+1, 0 + // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив + for i <= mid && j <= right { + if nums[i] <= nums[j] { + tmp[k] = nums[i] + i++ + } else { + tmp[k] = nums[j] + j++ + } + k++ + } + // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив + for i <= mid { + tmp[k] = nums[i] + i++ + k++ + } + for j <= right { + tmp[k] = nums[j] + j++ + k++ + } + // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums + for k := 0; k < len(tmp); k++ { + nums[left+k] = tmp[k] + } +} + +/* Сортировка слиянием */ +func mergeSort(nums []int, left, right int) { + // Условие завершения + if left >= right { + return + } + // Этап разбиения + mid := left + (right - left) / 2 + mergeSort(nums, left, mid) + mergeSort(nums, mid+1, right) + // Этап слияния + merge(nums, left, mid, right) +} diff --git a/ru/codes/go/chapter_sorting/merge_sort_test.go b/ru/codes/go/chapter_sorting/merge_sort_test.go new file mode 100644 index 000000000..c5b8e19c4 --- /dev/null +++ b/ru/codes/go/chapter_sorting/merge_sort_test.go @@ -0,0 +1,16 @@ +// File: merge_sort_test.go +// Created Time: 2022-12-13 +// Author: msk397 (machangxinq@gmail.com) + +package chapter_sorting + +import ( + "fmt" + "testing" +) + +func TestMergeSort(t *testing.T) { + nums := []int{7, 3, 2, 6, 0, 1, 5, 4} + mergeSort(nums, 0, len(nums)-1) + fmt.Println("После сортировки слиянием nums =", nums) +} diff --git a/ru/codes/go/chapter_sorting/quick_sort.go b/ru/codes/go/chapter_sorting/quick_sort.go new file mode 100644 index 000000000..73384679f --- /dev/null +++ b/ru/codes/go/chapter_sorting/quick_sort.go @@ -0,0 +1,130 @@ +// File: quick_sort.go +// Created Time: 2022-12-12 +// Author: msk397 (machangxinq@gmail.com) + +package chapter_sorting + +// Быстрая сортировка +type quickSort struct{} + +// Быстрая сортировка (оптимизация медианным опорным элементом) +type quickSortMedian struct{} + +// Быстрая сортировка (оптимизация глубины рекурсии) +type quickSortTailCall struct{} + +/* Разбиение с опорными указателями */ +func (q *quickSort) partition(nums []int, left, right int) int { + // Взять nums[left] в качестве опорного элемента + i, j := left, right + for i < j { + for i < j && nums[j] >= nums[left] { + j-- // Идти справа налево в поисках первого элемента меньше опорного + } + for i < j && nums[i] <= nums[left] { + i++ // Идти слева направо в поисках первого элемента больше опорного + } + // Обмен элементов + nums[i], nums[j] = nums[j], nums[i] + } + // Переместить опорный элемент на границу двух подмассивов + nums[i], nums[left] = nums[left], nums[i] + return i // Вернуть индекс опорного элемента +} + +/* Быстрая сортировка */ +func (q *quickSort) quickSort(nums []int, left, right int) { + // Завершить рекурсию, когда длина подмассива равна 1 + if left >= right { + return + } + // Разбиение с опорными указателями + pivot := q.partition(nums, left, right) + // Рекурсивно обработать левый и правый подмассивы + q.quickSort(nums, left, pivot-1) + q.quickSort(nums, pivot+1, right) +} + +/* Выбрать медиану из трех кандидатов */ +func (q *quickSortMedian) medianThree(nums []int, left, mid, right int) int { + l, m, r := nums[left], nums[mid], nums[right] + if (l <= m && m <= r) || (r <= m && m <= l) { + return mid // m находится между l и r + } + if (m <= l && l <= r) || (r <= l && l <= m) { + return left // l находится между m и r + } + return right +} + +/* Разбиение с опорными указателями (медиана трех) */ +func (q *quickSortMedian) partition(nums []int, left, right int) int { + // Взять nums[left] в качестве опорного элемента + med := q.medianThree(nums, left, (left+right)/2, right) + // Переместить медиану в крайний левый элемент массива + nums[left], nums[med] = nums[med], nums[left] + // Взять nums[left] в качестве опорного элемента + i, j := left, right + for i < j { + for i < j && nums[j] >= nums[left] { + j-- // Идти справа налево в поисках первого элемента меньше опорного + } + for i < j && nums[i] <= nums[left] { + i++ // Идти слева направо в поисках первого элемента больше опорного + } + // Обмен элементов + nums[i], nums[j] = nums[j], nums[i] + } + // Переместить опорный элемент на границу двух подмассивов + nums[i], nums[left] = nums[left], nums[i] + return i // Вернуть индекс опорного элемента +} + +/* Быстрая сортировка */ +func (q *quickSortMedian) quickSort(nums []int, left, right int) { + // Завершить рекурсию, когда длина подмассива равна 1 + if left >= right { + return + } + // Разбиение с опорными указателями + pivot := q.partition(nums, left, right) + // Рекурсивно обработать левый и правый подмассивы + q.quickSort(nums, left, pivot-1) + q.quickSort(nums, pivot+1, right) +} + +/* Разбиение с опорными указателями */ +func (q *quickSortTailCall) partition(nums []int, left, right int) int { + // Взять nums[left] в качестве опорного элемента + i, j := left, right + for i < j { + for i < j && nums[j] >= nums[left] { + j-- // Идти справа налево в поисках первого элемента меньше опорного + } + for i < j && nums[i] <= nums[left] { + i++ // Идти слева направо в поисках первого элемента больше опорного + } + // Обмен элементов + nums[i], nums[j] = nums[j], nums[i] + } + // Переместить опорный элемент на границу двух подмассивов + nums[i], nums[left] = nums[left], nums[i] + return i // Вернуть индекс опорного элемента +} + +/* Быстрая сортировка (оптимизация глубины рекурсии) */ +func (q *quickSortTailCall) quickSort(nums []int, left, right int) { + // Завершить, когда длина подмассива равна 1 + for left < right { + // Операция разбиения с опорными указателями + pivot := q.partition(nums, left, right) + // Выполнить быструю сортировку для более короткого из двух подмассивов + if pivot-left < right-pivot { + q.quickSort(nums, left, pivot-1) // Рекурсивно отсортировать левый подмассив + left = pivot + 1 // Оставшийся неотсортированный диапазон: [pivot + 1, right] + } else { + q.quickSort(nums, pivot+1, right) // Рекурсивно отсортировать правый подмассив + right = pivot - 1 // Оставшийся неотсортированный диапазон: [left, pivot - 1] + } + } +} diff --git a/ru/codes/go/chapter_sorting/quick_sort_test.go b/ru/codes/go/chapter_sorting/quick_sort_test.go new file mode 100644 index 000000000..31610ece7 --- /dev/null +++ b/ru/codes/go/chapter_sorting/quick_sort_test.go @@ -0,0 +1,34 @@ +// File: quick_sort_test.go +// Created Time: 2022-12-12 +// Author: msk397 (machangxinq@gmail.com) + +package chapter_sorting + +import ( + "fmt" + "testing" +) + +// Быстрая сортировка +func TestQuickSort(t *testing.T) { + q := quickSort{} + nums := []int{4, 1, 3, 1, 5, 2} + q.quickSort(nums, 0, len(nums)-1) + fmt.Println("После быстрой сортировки nums =", nums) +} + +// Быстрая сортировка (оптимизация медианным опорным элементом) +func TestQuickSortMedian(t *testing.T) { + q := quickSortMedian{} + nums := []int{4, 1, 3, 1, 5, 2} + q.quickSort(nums, 0, len(nums)-1) + fmt.Println("После быстрой сортировки (оптимизация медианным опорным элементом) nums =", nums) +} + +// Быстрая сортировка (оптимизация глубины рекурсии) +func TestQuickSortTailCall(t *testing.T) { + q := quickSortTailCall{} + nums := []int{4, 1, 3, 1, 5, 2} + q.quickSort(nums, 0, len(nums)-1) + fmt.Println("После быстрой сортировки (оптимизация глубины рекурсии) nums =", nums) +} diff --git a/ru/codes/go/chapter_sorting/radix_sort.go b/ru/codes/go/chapter_sorting/radix_sort.go new file mode 100644 index 000000000..a408d3a61 --- /dev/null +++ b/ru/codes/go/chapter_sorting/radix_sort.go @@ -0,0 +1,60 @@ +// File: radix_sort.go +// Created Time: 2023-01-18 +// Author: Reanon (793584285@qq.com) + +package chapter_sorting + +import "math" + +/* Получить k-й разряд элемента num, где exp = 10^(k-1) */ +func digit(num, exp int) int { + // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени + return (num / exp) % 10 +} + +/* Сортировка подсчетом (сортировка по k-му разряду nums) */ +func countingSortDigit(nums []int, exp int) { + // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10 + counter := make([]int, 10) + n := len(nums) + // Подсчитать число появлений каждой цифры от 0 до 9 + for i := 0; i < n; i++ { + d := digit(nums[i], exp) // Получить k-й разряд nums[i], обозначив его как d + counter[d]++ // Подсчитать число появлений цифры d + } + // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива» + for i := 1; i < 10; i++ { + counter[i] += counter[i-1] + } + // Выполняя обратный проход, заполнить res элементами по статистике в корзинах + res := make([]int, n) + for i := n - 1; i >= 0; i-- { + d := digit(nums[i], exp) + j := counter[d] - 1 // Получить индекс j цифры d в массиве + res[j] = nums[i] // Поместить текущий элемент по индексу j + counter[d]-- // Уменьшить количество d на 1 + } + // Перезаписать исходный массив nums результатом + for i := 0; i < n; i++ { + nums[i] = res[i] + } +} + +/* Поразрядная сортировка */ +func radixSort(nums []int) { + // Получить максимальный элемент массива, чтобы определить максимальное число разрядов + max := math.MinInt + for _, num := range nums { + if num > max { + max = num + } + } + // Проходить разряды от младшего к старшему + for exp := 1; max >= exp; exp *= 10 { + // Выполнить сортировку подсчетом по k-му разряду элементов массива + // k = 1 -> exp = 1 + // k = 2 -> exp = 10 + // то есть exp = 10^(k-1) + countingSortDigit(nums, exp) + } +} diff --git a/ru/codes/go/chapter_sorting/radix_sort_test.go b/ru/codes/go/chapter_sorting/radix_sort_test.go new file mode 100644 index 000000000..8dffc02dd --- /dev/null +++ b/ru/codes/go/chapter_sorting/radix_sort_test.go @@ -0,0 +1,18 @@ +// File: radix_sort_test.go +// Created Time: 2023-01-18 +// Author: Reanon (793584285@qq.com) + +package chapter_sorting + +import ( + "fmt" + "testing" +) + +func TestRadixSort(t *testing.T) { + /* Поразрядная сортировка */ + nums := []int{10546151, 35663510, 42865989, 34862445, 81883077, + 88906420, 72429244, 30524779, 82060337, 63832996} + radixSort(nums) + fmt.Println("После поразрядной сортировки nums =", nums) +} diff --git a/ru/codes/go/chapter_sorting/selection_sort.go b/ru/codes/go/chapter_sorting/selection_sort.go new file mode 100644 index 000000000..322ee52d5 --- /dev/null +++ b/ru/codes/go/chapter_sorting/selection_sort.go @@ -0,0 +1,24 @@ +// File: selection_sort.go +// Created Time: 2023-05-29 +// Author: Reanon (793584285@qq.com) + +package chapter_sorting + +/* Сортировка выбором */ +func selectionSort(nums []int) { + n := len(nums) + // Внешний цикл: неотсортированный диапазон [i, n-1] + for i := 0; i < n-1; i++ { + // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне + k := i + for j := i + 1; j < n; j++ { + if nums[j] < nums[k] { + // Записать индекс минимального элемента + k = j + } + } + // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона + nums[i], nums[k] = nums[k], nums[i] + + } +} diff --git a/ru/codes/go/chapter_sorting/selection_sort_test.go b/ru/codes/go/chapter_sorting/selection_sort_test.go new file mode 100644 index 000000000..b09333cec --- /dev/null +++ b/ru/codes/go/chapter_sorting/selection_sort_test.go @@ -0,0 +1,16 @@ +// File: selection_sort_test.go +// Created Time: 2023-05-29 +// Author: Reanon (793584285@qq.com) + +package chapter_sorting + +import ( + "fmt" + "testing" +) + +func TestSelectionSort(t *testing.T) { + nums := []int{4, 1, 3, 1, 5, 2} + selectionSort(nums) + fmt.Println("После сортировки выбором nums =", nums) +} diff --git a/ru/codes/go/chapter_stack_and_queue/array_deque.go b/ru/codes/go/chapter_stack_and_queue/array_deque.go new file mode 100644 index 000000000..7ccf3950e --- /dev/null +++ b/ru/codes/go/chapter_stack_and_queue/array_deque.go @@ -0,0 +1,121 @@ +// File: array_deque.go +// Created Time: 2023-03-13 +// Author: Reanon (793584285@qq.com) + +package chapter_stack_and_queue + +import "fmt" + +/* Двусторонняя очередь на основе кольцевого массива */ +type arrayDeque struct { + nums []int // Массив для хранения элементов двусторонней очереди + front int // Указатель head, указывающий на первый элемент очереди + queSize int // Длина двусторонней очереди + queCapacity int // Вместимость очереди (то есть максимальное число элементов) +} + +/* Инициализация очереди */ +func newArrayDeque(queCapacity int) *arrayDeque { + return &arrayDeque{ + nums: make([]int, queCapacity), + queCapacity: queCapacity, + front: 0, + queSize: 0, + } +} + +/* Получение длины двусторонней очереди */ +func (q *arrayDeque) size() int { + return q.queSize +} + +/* Проверка, пуста ли двусторонняя очередь */ +func (q *arrayDeque) isEmpty() bool { + return q.queSize == 0 +} + +/* Вычислить индекс в кольцевом массиве */ +func (q *arrayDeque) index(i int) int { + // С помощью операции взятия по модулю соединить начало и конец массива + // Когда i выходит за конец массива, он возвращается в начало + // Когда i выходит за начало массива, он возвращается в конец + return (i + q.queCapacity) % q.queCapacity +} + +/* Добавление в голову очереди */ +func (q *arrayDeque) pushFirst(num int) { + if q.queSize == q.queCapacity { + fmt.Println("Двусторонняя очередь заполнена") + return + } + // Указатель головы сдвигается на одну позицию влево + // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост + q.front = q.index(q.front - 1) + // Добавить num в голову очереди + q.nums[q.front] = num + q.queSize++ +} + +/* Добавление в хвост очереди */ +func (q *arrayDeque) pushLast(num int) { + if q.queSize == q.queCapacity { + fmt.Println("Двусторонняя очередь заполнена") + return + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + rear := q.index(q.front + q.queSize) + // Добавить num в хвост очереди + q.nums[rear] = num + q.queSize++ +} + +/* Извлечение из головы очереди */ +func (q *arrayDeque) popFirst() any { + num := q.peekFirst() + if num == nil { + return nil + } + // Указатель головы сдвигается на одну позицию назад + q.front = q.index(q.front + 1) + q.queSize-- + return num +} + +/* Извлечение из хвоста очереди */ +func (q *arrayDeque) popLast() any { + num := q.peekLast() + if num == nil { + return nil + } + q.queSize-- + return num +} + +/* Доступ к элементу в начале очереди */ +func (q *arrayDeque) peekFirst() any { + if q.isEmpty() { + return nil + } + return q.nums[q.front] +} + +/* Доступ к элементу в конце очереди */ +func (q *arrayDeque) peekLast() any { + if q.isEmpty() { + return nil + } + // Вычислить индекс хвостового элемента + last := q.index(q.front + q.queSize - 1) + return q.nums[last] +} + +/* Получить Slice для вывода */ +func (q *arrayDeque) toSlice() []int { + // Преобразовывать только элементы списка в пределах фактической длины + res := make([]int, q.queSize) + for i, j := 0, q.front; i < q.queSize; i++ { + res[i] = q.nums[q.index(j)] + j++ + } + return res +} diff --git a/ru/codes/go/chapter_stack_and_queue/array_queue.go b/ru/codes/go/chapter_stack_and_queue/array_queue.go new file mode 100644 index 000000000..2ae70a16c --- /dev/null +++ b/ru/codes/go/chapter_stack_and_queue/array_queue.go @@ -0,0 +1,78 @@ +// File: array_queue.go +// Created Time: 2022-11-28 +// Author: Reanon (793584285@qq.com) + +package chapter_stack_and_queue + +/* Очередь на основе кольцевого массива */ +type arrayQueue struct { + nums []int // Массив для хранения элементов очереди + front int // Указатель head, указывающий на первый элемент очереди + queSize int // Длина очереди + queCapacity int // Вместимость очереди (то есть максимальное число элементов) +} + +/* Инициализация очереди */ +func newArrayQueue(queCapacity int) *arrayQueue { + return &arrayQueue{ + nums: make([]int, queCapacity), + queCapacity: queCapacity, + front: 0, + queSize: 0, + } +} + +/* Получение длины очереди */ +func (q *arrayQueue) size() int { + return q.queSize +} + +/* Проверка, пуста ли очередь */ +func (q *arrayQueue) isEmpty() bool { + return q.queSize == 0 +} + +/* Поместить в очередь */ +func (q *arrayQueue) push(num int) { + // Когда rear == queCapacity, очередь заполнена + if q.queSize == q.queCapacity { + return + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива + rear := (q.front + q.queSize) % q.queCapacity + // Добавить num в хвост очереди + q.nums[rear] = num + q.queSize++ +} + +/* Извлечь из очереди */ +func (q *arrayQueue) pop() any { + num := q.peek() + if num == nil { + return nil + } + + // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива + q.front = (q.front + 1) % q.queCapacity + q.queSize-- + return num +} + +/* Доступ к элементу в начале очереди */ +func (q *arrayQueue) peek() any { + if q.isEmpty() { + return nil + } + return q.nums[q.front] +} + +/* Получить Slice для вывода */ +func (q *arrayQueue) toSlice() []int { + rear := (q.front + q.queSize) + if rear >= q.queCapacity { + rear %= q.queCapacity + return append(q.nums[q.front:], q.nums[:rear]...) + } + return q.nums[q.front:rear] +} diff --git a/ru/codes/go/chapter_stack_and_queue/array_stack.go b/ru/codes/go/chapter_stack_and_queue/array_stack.go new file mode 100644 index 000000000..9b0ef6c70 --- /dev/null +++ b/ru/codes/go/chapter_stack_and_queue/array_stack.go @@ -0,0 +1,55 @@ +// File: array_stack.go +// Created Time: 2022-11-26 +// Author: Reanon (793584285@qq.com) + +package chapter_stack_and_queue + +/* Стек на основе массива */ +type arrayStack struct { + data []int // Данные +} + +/* Инициализация стека */ +func newArrayStack() *arrayStack { + return &arrayStack{ + // Установить длину стека равной 0, а емкость равной 16 + data: make([]int, 0, 16), + } +} + +/* Длина стека */ +func (s *arrayStack) size() int { + return len(s.data) +} + +/* Пуст ли стек */ +func (s *arrayStack) isEmpty() bool { + return s.size() == 0 +} + +/* Поместить в стек */ +func (s *arrayStack) push(v int) { + // Срез автоматически расширяется + s.data = append(s.data, v) +} + +/* Извлечь из стека */ +func (s *arrayStack) pop() any { + val := s.peek() + s.data = s.data[:len(s.data)-1] + return val +} + +/* Получить элемент на вершине стека */ +func (s *arrayStack) peek() any { + if s.isEmpty() { + return nil + } + val := s.data[len(s.data)-1] + return val +} + +/* Получить Slice для вывода */ +func (s *arrayStack) toSlice() []int { + return s.data +} diff --git a/ru/codes/go/chapter_stack_and_queue/deque_test.go b/ru/codes/go/chapter_stack_and_queue/deque_test.go new file mode 100644 index 000000000..0b0be8681 --- /dev/null +++ b/ru/codes/go/chapter_stack_and_queue/deque_test.go @@ -0,0 +1,141 @@ +// File: deque_test.go +// Created Time: 2022-11-29 +// Author: Reanon (793584285@qq.com) + +package chapter_stack_and_queue + +import ( + "container/list" + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestDeque(t *testing.T) { + /* Инициализация двусторонней очереди */ + // В Go list используется как двусторонняя очередь + deque := list.New() + + /* Добавление элемента в очередь */ + deque.PushBack(2) + deque.PushBack(5) + deque.PushBack(4) + deque.PushFront(3) + deque.PushFront(1) + fmt.Print("Двусторонняя очередь deque = ") + PrintList(deque) + + /* Доступ к элементу */ + front := deque.Front() + fmt.Println("Первый элемент front =", front.Value) + rear := deque.Back() + fmt.Println("Последний элемент rear =", rear.Value) + + /* Извлечение элемента из очереди */ + deque.Remove(front) + fmt.Print("Извлеченный из головы элемент front = ", front.Value, ", deque после извлечения из головы = ") + PrintList(deque) + deque.Remove(rear) + fmt.Print("Извлеченный из хвоста элемент rear = ", rear.Value, ", deque после извлечения из хвоста = ") + PrintList(deque) + + /* Получение длины двусторонней очереди */ + size := deque.Len() + fmt.Println("Длина двусторонней очереди size =", size) + + /* Проверка, пуста ли двусторонняя очередь */ + isEmpty := deque.Len() == 0 + fmt.Println("Пуста ли двусторонняя очередь =", isEmpty) +} + +func TestArrayDeque(t *testing.T) { + /* Инициализация двусторонней очереди */ + // В Go list используется как двусторонняя очередь + deque := newArrayDeque(16) + + /* Добавление элемента в очередь */ + deque.pushLast(3) + deque.pushLast(2) + deque.pushLast(5) + fmt.Print("Двусторонняя очередь deque = ") + PrintSlice(deque.toSlice()) + + /* Доступ к элементу */ + peekFirst := deque.peekFirst() + fmt.Println("Первый элемент peekFirst =", peekFirst) + peekLast := deque.peekLast() + fmt.Println("Последний элемент peekLast =", peekLast) + + /* Добавление элемента в очередь */ + deque.pushLast(4) + fmt.Print("После добавления элемента 4 в хвост deque = ") + PrintSlice(deque.toSlice()) + deque.pushFirst(1) + fmt.Print("После добавления элемента 1 в голову deque = ") + PrintSlice(deque.toSlice()) + + /* Извлечение элемента из очереди */ + popFirst := deque.popFirst() + fmt.Print("Извлеченный из головы элемент popFirst = ", popFirst, ", deque после извлечения из головы = ") + PrintSlice(deque.toSlice()) + popLast := deque.popLast() + fmt.Print("Извлеченный из хвоста элемент popLast = ", popLast, ", deque после извлечения из хвоста = ") + PrintSlice(deque.toSlice()) + + /* Получение длины двусторонней очереди */ + size := deque.size() + fmt.Println("Длина двусторонней очереди size =", size) + + /* Проверка, пуста ли двусторонняя очередь */ + isEmpty := deque.isEmpty() + fmt.Println("Пуста ли двусторонняя очередь =", isEmpty) +} + +func TestLinkedListDeque(t *testing.T) { + // Инициализация очереди + deque := newLinkedListDeque() + + // Добавление элемента в очередь + deque.pushLast(2) + deque.pushLast(5) + deque.pushLast(4) + deque.pushFirst(3) + deque.pushFirst(1) + fmt.Print("Очередь deque = ") + PrintList(deque.toList()) + + // Доступ к элементу в начале очереди + front := deque.peekFirst() + fmt.Println("Первый элемент front =", front) + rear := deque.peekLast() + fmt.Println("Последний элемент rear =", rear) + + // Извлечение элемента из очереди + popFirst := deque.popFirst() + fmt.Print("Извлеченный из головы элемент popFirst = ", popFirst, ", deque после извлечения из головы = ") + PrintList(deque.toList()) + popLast := deque.popLast() + fmt.Print("Извлеченный из хвоста элемент popLast = ", popLast, ", deque после извлечения из хвоста = ") + PrintList(deque.toList()) + + // Получить длину очереди + size := deque.size() + fmt.Println("Длина очереди size =", size) + + // Проверка на пустоту + isEmpty := deque.isEmpty() + fmt.Println("Пуста ли очередь =", isEmpty) +} + +// BenchmarkLinkedListDeque 67.92 ns/op in Mac M1 Pro +func BenchmarkLinkedListDeque(b *testing.B) { + deque := newLinkedListDeque() + // use b.N for looping + for i := 0; i < b.N; i++ { + deque.pushLast(777) + } + for i := 0; i < b.N; i++ { + deque.popFirst() + } +} diff --git a/ru/codes/go/chapter_stack_and_queue/linkedlist_deque.go b/ru/codes/go/chapter_stack_and_queue/linkedlist_deque.go new file mode 100644 index 000000000..5a3e7a7d5 --- /dev/null +++ b/ru/codes/go/chapter_stack_and_queue/linkedlist_deque.go @@ -0,0 +1,85 @@ +// File: linkedlist_deque.go +// Created Time: 2022-11-29 +// Author: Reanon (793584285@qq.com) + +package chapter_stack_and_queue + +import ( + "container/list" +) + +/* Двусторонняя очередь на основе двусвязного списка */ +type linkedListDeque struct { + // Использовать встроенный пакет list + data *list.List +} + +/* Инициализировать двустороннюю очередь */ +func newLinkedListDeque() *linkedListDeque { + return &linkedListDeque{ + data: list.New(), + } +} + +/* Поместить элемент в голову очереди */ +func (s *linkedListDeque) pushFirst(value any) { + s.data.PushFront(value) +} + +/* Поместить элемент в хвост очереди */ +func (s *linkedListDeque) pushLast(value any) { + s.data.PushBack(value) +} + +/* Извлечь элемент из головы очереди */ +func (s *linkedListDeque) popFirst() any { + if s.isEmpty() { + return nil + } + e := s.data.Front() + s.data.Remove(e) + return e.Value +} + +/* Извлечь элемент из хвоста очереди */ +func (s *linkedListDeque) popLast() any { + if s.isEmpty() { + return nil + } + e := s.data.Back() + s.data.Remove(e) + return e.Value +} + +/* Доступ к элементу в начале очереди */ +func (s *linkedListDeque) peekFirst() any { + if s.isEmpty() { + return nil + } + e := s.data.Front() + return e.Value +} + +/* Доступ к элементу в конце очереди */ +func (s *linkedListDeque) peekLast() any { + if s.isEmpty() { + return nil + } + e := s.data.Back() + return e.Value +} + +/* Получение длины очереди */ +func (s *linkedListDeque) size() int { + return s.data.Len() +} + +/* Проверка, пуста ли очередь */ +func (s *linkedListDeque) isEmpty() bool { + return s.data.Len() == 0 +} + +/* Получить List для вывода */ +func (s *linkedListDeque) toList() *list.List { + return s.data +} diff --git a/ru/codes/go/chapter_stack_and_queue/linkedlist_queue.go b/ru/codes/go/chapter_stack_and_queue/linkedlist_queue.go new file mode 100644 index 000000000..279f62b82 --- /dev/null +++ b/ru/codes/go/chapter_stack_and_queue/linkedlist_queue.go @@ -0,0 +1,61 @@ +// File: linkedlist_queue.go +// Created Time: 2022-11-28 +// Author: Reanon (793584285@qq.com) + +package chapter_stack_and_queue + +import ( + "container/list" +) + +/* Очередь на основе связного списка */ +type linkedListQueue struct { + // Использовать встроенный пакет list для реализации очереди + data *list.List +} + +/* Инициализация очереди */ +func newLinkedListQueue() *linkedListQueue { + return &linkedListQueue{ + data: list.New(), + } +} + +/* Поместить в очередь */ +func (s *linkedListQueue) push(value any) { + s.data.PushBack(value) +} + +/* Извлечь из очереди */ +func (s *linkedListQueue) pop() any { + if s.isEmpty() { + return nil + } + e := s.data.Front() + s.data.Remove(e) + return e.Value +} + +/* Доступ к элементу в начале очереди */ +func (s *linkedListQueue) peek() any { + if s.isEmpty() { + return nil + } + e := s.data.Front() + return e.Value +} + +/* Получение длины очереди */ +func (s *linkedListQueue) size() int { + return s.data.Len() +} + +/* Проверка, пуста ли очередь */ +func (s *linkedListQueue) isEmpty() bool { + return s.data.Len() == 0 +} + +/* Получить List для вывода */ +func (s *linkedListQueue) toList() *list.List { + return s.data +} diff --git a/ru/codes/go/chapter_stack_and_queue/linkedlist_stack.go b/ru/codes/go/chapter_stack_and_queue/linkedlist_stack.go new file mode 100644 index 000000000..00c2737a1 --- /dev/null +++ b/ru/codes/go/chapter_stack_and_queue/linkedlist_stack.go @@ -0,0 +1,61 @@ +// File: linkedlist_stack.go +// Created Time: 2022-11-28 +// Author: Reanon (793584285@qq.com) + +package chapter_stack_and_queue + +import ( + "container/list" +) + +/* Стек на основе связного списка */ +type linkedListStack struct { + // Использовать встроенный пакет list для реализации стека + data *list.List +} + +/* Инициализация стека */ +func newLinkedListStack() *linkedListStack { + return &linkedListStack{ + data: list.New(), + } +} + +/* Поместить в стек */ +func (s *linkedListStack) push(value int) { + s.data.PushBack(value) +} + +/* Извлечь из стека */ +func (s *linkedListStack) pop() any { + if s.isEmpty() { + return nil + } + e := s.data.Back() + s.data.Remove(e) + return e.Value +} + +/* Доступ к верхнему элементу стека */ +func (s *linkedListStack) peek() any { + if s.isEmpty() { + return nil + } + e := s.data.Back() + return e.Value +} + +/* Получение длины стека */ +func (s *linkedListStack) size() int { + return s.data.Len() +} + +/* Проверка, пуст ли стек */ +func (s *linkedListStack) isEmpty() bool { + return s.data.Len() == 0 +} + +/* Получить List для вывода */ +func (s *linkedListStack) toList() *list.List { + return s.data +} diff --git a/ru/codes/go/chapter_stack_and_queue/queue_test.go b/ru/codes/go/chapter_stack_and_queue/queue_test.go new file mode 100644 index 000000000..526c9a2e6 --- /dev/null +++ b/ru/codes/go/chapter_stack_and_queue/queue_test.go @@ -0,0 +1,146 @@ +// File: queue_test.go +// Created Time: 2022-11-28 +// Author: Reanon (793584285@qq.com) + +package chapter_stack_and_queue + +import ( + "container/list" + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestQueue(t *testing.T) { + /* Инициализация очереди */ + // В Go list используется как очередь + queue := list.New() + + /* Добавление элемента в очередь */ + queue.PushBack(1) + queue.PushBack(3) + queue.PushBack(2) + queue.PushBack(5) + queue.PushBack(4) + fmt.Print("Очередь queue = ") + PrintList(queue) + + /* Доступ к элементу в начале очереди */ + peek := queue.Front() + fmt.Println("Первый элемент peek =", peek.Value) + + /* Извлечение элемента из очереди */ + pop := queue.Front() + queue.Remove(pop) + fmt.Print("Извлеченный элемент pop = ", pop.Value, ", queue после извлечения = ") + PrintList(queue) + + /* Получение длины очереди */ + size := queue.Len() + fmt.Println("Длина очереди size =", size) + + /* Проверка, пуста ли очередь */ + isEmpty := queue.Len() == 0 + fmt.Println("Пуста ли очередь =", isEmpty) +} + +func TestArrayQueue(t *testing.T) { + + // Инициализировать очередь, используя общий интерфейс очереди + capacity := 10 + queue := newArrayQueue(capacity) + if queue.pop() != nil { + t.Errorf("want:%v,got:%v", nil, queue.pop()) + } + + // Добавление элемента в очередь + queue.push(1) + queue.push(3) + queue.push(2) + queue.push(5) + queue.push(4) + fmt.Print("Очередь queue = ") + PrintSlice(queue.toSlice()) + + // Доступ к элементу в начале очереди + peek := queue.peek() + fmt.Println("Первый элемент peek =", peek) + + // Извлечение элемента из очереди + pop := queue.pop() + fmt.Print("Извлеченный элемент pop = ", pop, ", queue после извлечения = ") + PrintSlice(queue.toSlice()) + + // Получить длину очереди + size := queue.size() + fmt.Println("Длина очереди size =", size) + + // Проверка на пустоту + isEmpty := queue.isEmpty() + fmt.Println("Пуста ли очередь =", isEmpty) + + /* Проверка кольцевого массива */ + for i := 0; i < 10; i++ { + queue.push(i) + queue.pop() + fmt.Print("После ", i, "-го раунда операций enqueue и dequeue queue =") + PrintSlice(queue.toSlice()) + } +} + +func TestLinkedListQueue(t *testing.T) { + // Инициализировать очередь + queue := newLinkedListQueue() + + // Добавление элемента в очередь + queue.push(1) + queue.push(3) + queue.push(2) + queue.push(5) + queue.push(4) + fmt.Print("Очередь queue = ") + PrintList(queue.toList()) + + // Доступ к элементу в начале очереди + peek := queue.peek() + fmt.Println("Первый элемент peek =", peek) + + // Извлечение элемента из очереди + pop := queue.pop() + fmt.Print("Извлеченный элемент pop = ", pop, ", queue после извлечения = ") + PrintList(queue.toList()) + + // Получить длину очереди + size := queue.size() + fmt.Println("Длина очереди size =", size) + + // Проверка на пустоту + isEmpty := queue.isEmpty() + fmt.Println("Пуста ли очередь =", isEmpty) +} + +// BenchmarkArrayQueue 8 ns/op in Mac M1 Pro +func BenchmarkArrayQueue(b *testing.B) { + capacity := 1000 + queue := newArrayQueue(capacity) + // use b.N for looping + for i := 0; i < b.N; i++ { + queue.push(777) + } + for i := 0; i < b.N; i++ { + queue.pop() + } +} + +// BenchmarkLinkedQueue 62.66 ns/op in Mac M1 Pro +func BenchmarkLinkedQueue(b *testing.B) { + queue := newLinkedListQueue() + // use b.N for looping + for i := 0; i < b.N; i++ { + queue.push(777) + } + for i := 0; i < b.N; i++ { + queue.pop() + } +} diff --git a/ru/codes/go/chapter_stack_and_queue/stack_test.go b/ru/codes/go/chapter_stack_and_queue/stack_test.go new file mode 100644 index 000000000..d170ef05f --- /dev/null +++ b/ru/codes/go/chapter_stack_and_queue/stack_test.go @@ -0,0 +1,130 @@ +// File: stack_test.go +// Created Time: 2022-11-28 +// Author: Reanon (793584285@qq.com) + +package chapter_stack_and_queue + +import ( + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestStack(t *testing.T) { + /* Инициализация стека */ + // В Go рекомендуется использовать Slice как стек + var stack []int + + /* Помещение элемента в стек */ + stack = append(stack, 1) + stack = append(stack, 3) + stack = append(stack, 2) + stack = append(stack, 5) + stack = append(stack, 4) + fmt.Print("Стек stack = ") + PrintSlice(stack) + + /* Доступ к верхнему элементу стека */ + peek := stack[len(stack)-1] + fmt.Println("Верхний элемент peek =", peek) + + /* Извлечение элемента из стека */ + pop := stack[len(stack)-1] + stack = stack[:len(stack)-1] + fmt.Print("Извлеченный элемент pop = ", pop, ", stack после извлечения = ") + PrintSlice(stack) + + /* Получение длины стека */ + size := len(stack) + fmt.Println("Длина стека size =", size) + + /* Проверка на пустоту */ + isEmpty := len(stack) == 0 + fmt.Println("Пуст ли стек =", isEmpty) +} + +func TestArrayStack(t *testing.T) { + // Инициализировать стек, используя интерфейс + stack := newArrayStack() + + // Помещение элемента в стек + stack.push(1) + stack.push(3) + stack.push(2) + stack.push(5) + stack.push(4) + fmt.Print("Стек stack = ") + PrintSlice(stack.toSlice()) + + // Доступ к верхнему элементу стека + peek := stack.peek() + fmt.Println("Верхний элемент peek =", peek) + + // Извлечение элемента из стека + pop := stack.pop() + fmt.Print("Извлеченный элемент pop = ", pop, ", stack после извлечения = ") + PrintSlice(stack.toSlice()) + + // Получение длины стека + size := stack.size() + fmt.Println("Длина стека size =", size) + + // Проверка на пустоту + isEmpty := stack.isEmpty() + fmt.Println("Пуст ли стек =", isEmpty) +} + +func TestLinkedListStack(t *testing.T) { + // Инициализация стека + stack := newLinkedListStack() + // Помещение элемента в стек + stack.push(1) + stack.push(3) + stack.push(2) + stack.push(5) + stack.push(4) + fmt.Print("Стек stack = ") + PrintList(stack.toList()) + + // Доступ к верхнему элементу стека + peek := stack.peek() + fmt.Println("Верхний элемент peek =", peek) + + // Извлечение элемента из стека + pop := stack.pop() + fmt.Print("Извлеченный элемент pop = ", pop, ", stack после извлечения = ") + PrintList(stack.toList()) + + // Получение длины стека + size := stack.size() + fmt.Println("Длина стека size =", size) + + // Проверка на пустоту + isEmpty := stack.isEmpty() + fmt.Println("Пуст ли стек =", isEmpty) +} + +// BenchmarkArrayStack 8 ns/op in Mac M1 Pro +func BenchmarkArrayStack(b *testing.B) { + stack := newArrayStack() + // use b.N for looping + for i := 0; i < b.N; i++ { + stack.push(777) + } + for i := 0; i < b.N; i++ { + stack.pop() + } +} + +// BenchmarkLinkedListStack 65.02 ns/op in Mac M1 Pro +func BenchmarkLinkedListStack(b *testing.B) { + stack := newLinkedListStack() + // use b.N for looping + for i := 0; i < b.N; i++ { + stack.push(777) + } + for i := 0; i < b.N; i++ { + stack.pop() + } +} diff --git a/ru/codes/go/chapter_tree/array_binary_tree.go b/ru/codes/go/chapter_tree/array_binary_tree.go new file mode 100644 index 000000000..43d324964 --- /dev/null +++ b/ru/codes/go/chapter_tree/array_binary_tree.go @@ -0,0 +1,101 @@ +// File: array_binary_tree.go +// Created Time: 2023-07-24 +// Author: Reanon (793584285@qq.com) + +package chapter_tree + +/* Класс двоичного дерева в массивном представлении */ +type arrayBinaryTree struct { + tree []any +} + +/* Конструктор */ +func newArrayBinaryTree(arr []any) *arrayBinaryTree { + return &arrayBinaryTree{ + tree: arr, + } +} + +/* Вместимость списка */ +func (abt *arrayBinaryTree) size() int { + return len(abt.tree) +} + +/* Получить значение узла с индексом i */ +func (abt *arrayBinaryTree) val(i int) any { + // Если индекс выходит за границы, вернуть null, обозначающий пустую позицию + if i < 0 || i >= abt.size() { + return nil + } + return abt.tree[i] +} + +/* Получить индекс левого дочернего узла узла с индексом i */ +func (abt *arrayBinaryTree) left(i int) int { + return 2*i + 1 +} + +/* Получить индекс правого дочернего узла узла с индексом i */ +func (abt *arrayBinaryTree) right(i int) int { + return 2*i + 2 +} + +/* Получить индекс родительского узла узла с индексом i */ +func (abt *arrayBinaryTree) parent(i int) int { + return (i - 1) / 2 +} + +/* Обход в ширину */ +func (abt *arrayBinaryTree) levelOrder() []any { + var res []any + // Непосредственно обходить массив + for i := 0; i < abt.size(); i++ { + if abt.val(i) != nil { + res = append(res, abt.val(i)) + } + } + return res +} + +/* Обход в глубину */ +func (abt *arrayBinaryTree) dfs(i int, order string, res *[]any) { + // Если это пустая позиция, вернуть + if abt.val(i) == nil { + return + } + // Предварительный обход + if order == "pre" { + *res = append(*res, abt.val(i)) + } + abt.dfs(abt.left(i), order, res) + // Симметричный обход + if order == "in" { + *res = append(*res, abt.val(i)) + } + abt.dfs(abt.right(i), order, res) + // Обратный обход + if order == "post" { + *res = append(*res, abt.val(i)) + } +} + +/* Предварительный обход */ +func (abt *arrayBinaryTree) preOrder() []any { + var res []any + abt.dfs(0, "pre", &res) + return res +} + +/* Симметричный обход */ +func (abt *arrayBinaryTree) inOrder() []any { + var res []any + abt.dfs(0, "in", &res) + return res +} + +/* Обратный обход */ +func (abt *arrayBinaryTree) postOrder() []any { + var res []any + abt.dfs(0, "post", &res) + return res +} diff --git a/ru/codes/go/chapter_tree/array_binary_tree_test.go b/ru/codes/go/chapter_tree/array_binary_tree_test.go new file mode 100644 index 000000000..cbe4c0134 --- /dev/null +++ b/ru/codes/go/chapter_tree/array_binary_tree_test.go @@ -0,0 +1,47 @@ +// File: array_binary_tree_test.go +// Created Time: 2023-07-24 +// Author: Reanon (793584285@qq.com) + +package chapter_tree + +import ( + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestArrayBinaryTree(t *testing.T) { + // Инициализировать двоичное дерево + // Здесь используется функция, напрямую строящая двоичное дерево из массива + arr := []any{1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15} + root := SliceToTree(arr) + fmt.Println("\nИнициализация двоичного дерева") + fmt.Println("Массивное представление двоичного дерева:") + fmt.Println(arr) + fmt.Println("Связное представление двоичного дерева:") + PrintTree(root) + + // Класс двоичного дерева в массивном представлении + abt := newArrayBinaryTree(arr) + + // Доступ к узлу + i := 1 + l := abt.left(i) + r := abt.right(i) + p := abt.parent(i) + fmt.Println("\nТекущий узел: индекс =", i, ", значение =", abt.val(i)) + fmt.Println("Индекс левого дочернего узла =", l, ", значение =", abt.val(l)) + fmt.Println("Индекс правого дочернего узла =", r, ", значение =", abt.val(r)) + fmt.Println("Индекс родительского узла =", p, ", значение =", abt.val(p)) + + // Обходить дерево + res := abt.levelOrder() + fmt.Println("\nОбход в ширину =", res) + res = abt.preOrder() + fmt.Println("Предварительный обход =", res) + res = abt.inOrder() + fmt.Println("Симметричный обход =", res) + res = abt.postOrder() + fmt.Println("Обратный обход =", res) +} diff --git a/ru/codes/go/chapter_tree/avl_tree.go b/ru/codes/go/chapter_tree/avl_tree.go new file mode 100644 index 000000000..72237b0e7 --- /dev/null +++ b/ru/codes/go/chapter_tree/avl_tree.go @@ -0,0 +1,200 @@ +// File: avl_tree.go +// Created Time: 2023-01-08 +// Author: Reanon (793584285@qq.com) + +package chapter_tree + +import . "github.com/krahets/hello-algo/pkg" + +/* AVL-дерево */ +type aVLTree struct { + // Корневой узел + root *TreeNode +} + +func newAVLTree() *aVLTree { + return &aVLTree{root: nil} +} + +/* Получить высоту узла */ +func (t *aVLTree) height(node *TreeNode) int { + // Высота пустого узла равна -1, высота листового узла равна 0 + if node != nil { + return node.Height + } + return -1 +} + +/* Обновить высоту узла */ +func (t *aVLTree) updateHeight(node *TreeNode) { + lh := t.height(node.Left) + rh := t.height(node.Right) + // Высота узла равна высоте более высокого поддерева + 1 + if lh > rh { + node.Height = lh + 1 + } else { + node.Height = rh + 1 + } +} + +/* Получить коэффициент баланса */ +func (t *aVLTree) balanceFactor(node *TreeNode) int { + // Коэффициент баланса пустого узла равен 0 + if node == nil { + return 0 + } + // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева + return t.height(node.Left) - t.height(node.Right) +} + +/* Операция правого вращения */ +func (t *aVLTree) rightRotate(node *TreeNode) *TreeNode { + child := node.Left + grandChild := child.Right + // Выполнить правое вращение узла node вокруг child + child.Right = node + node.Left = grandChild + // Обновить высоту узла + t.updateHeight(node) + t.updateHeight(child) + // Вернуть корневой узел поддерева после вращения + return child +} + +/* Операция левого вращения */ +func (t *aVLTree) leftRotate(node *TreeNode) *TreeNode { + child := node.Right + grandChild := child.Left + // Выполнить левое вращение узла node вокруг child + child.Left = node + node.Right = grandChild + // Обновить высоту узла + t.updateHeight(node) + t.updateHeight(child) + // Вернуть корневой узел поддерева после вращения + return child +} + +/* Выполнить вращение, чтобы снова сбалансировать поддерево */ +func (t *aVLTree) rotate(node *TreeNode) *TreeNode { + // Получить коэффициент баланса узла node + // В Go рекомендуется использовать короткие имена переменных, здесь bf обозначает t.balanceFactor + bf := t.balanceFactor(node) + // Левосторонне перекошенное дерево + if bf > 1 { + if t.balanceFactor(node.Left) >= 0 { + // Правое вращение + return t.rightRotate(node) + } else { + // Сначала левое вращение, затем правое + node.Left = t.leftRotate(node.Left) + return t.rightRotate(node) + } + } + // Правосторонне перекошенное дерево + if bf < -1 { + if t.balanceFactor(node.Right) <= 0 { + // Левое вращение + return t.leftRotate(node) + } else { + // Сначала правое вращение, затем левое + node.Right = t.rightRotate(node.Right) + return t.leftRotate(node) + } + } + // Дерево сбалансировано, вращение не требуется, вернуть сразу + return node +} + +/* Вставка узла */ +func (t *aVLTree) insert(val int) { + t.root = t.insertHelper(t.root, val) +} + +/* Рекурсивная вставка узла (вспомогательная функция) */ +func (t *aVLTree) insertHelper(node *TreeNode, val int) *TreeNode { + if node == nil { + return NewTreeNode(val) + } + /* 1. Найти позицию вставки и вставить узел */ + if val < node.Val.(int) { + node.Left = t.insertHelper(node.Left, val) + } else if val > node.Val.(int) { + node.Right = t.insertHelper(node.Right, val) + } else { + // Повторяющийся узел не вставлять, сразу вернуть + return node + } + // Обновить высоту узла + t.updateHeight(node) + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = t.rotate(node) + // Вернуть корневой узел поддерева + return node +} + +/* Удаление узла */ +func (t *aVLTree) remove(val int) { + t.root = t.removeHelper(t.root, val) +} + +/* Рекурсивное удаление узла (вспомогательная функция) */ +func (t *aVLTree) removeHelper(node *TreeNode, val int) *TreeNode { + if node == nil { + return nil + } + /* 1. Найти узел и удалить его */ + if val < node.Val.(int) { + node.Left = t.removeHelper(node.Left, val) + } else if val > node.Val.(int) { + node.Right = t.removeHelper(node.Right, val) + } else { + if node.Left == nil || node.Right == nil { + child := node.Left + if node.Right != nil { + child = node.Right + } + if child == nil { + // Число дочерних узлов = 0, удалить node и сразу вернуть + return nil + } else { + // Число дочерних узлов = 1, удалить node напрямую + node = child + } + } else { + // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел + temp := node.Right + for temp.Left != nil { + temp = temp.Left + } + node.Right = t.removeHelper(node.Right, temp.Val.(int)) + node.Val = temp.Val + } + } + // Обновить высоту узла + t.updateHeight(node) + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = t.rotate(node) + // Вернуть корневой узел поддерева + return node +} + +/* Поиск узла */ +func (t *aVLTree) search(val int) *TreeNode { + cur := t.root + // Искать в цикле и выйти после прохода за листовой узел + for cur != nil { + if cur.Val.(int) < val { + // Целевой узел находится в правом поддереве cur + cur = cur.Right + } else if cur.Val.(int) > val { + // Целевой узел находится в левом поддереве cur + cur = cur.Left + } else { + // Найти целевой узел и выйти из цикла + break + } + } + // Вернуть целевой узел + return cur +} diff --git a/ru/codes/go/chapter_tree/avl_tree_test.go b/ru/codes/go/chapter_tree/avl_tree_test.go new file mode 100644 index 000000000..4df4a66ea --- /dev/null +++ b/ru/codes/go/chapter_tree/avl_tree_test.go @@ -0,0 +1,54 @@ +// File: avl_tree_test.go +// Created Time: 2023-01-08 +// Author: Reanon (793584285@qq.com) + +package chapter_tree + +import ( + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestAVLTree(t *testing.T) { + /* Инициализация пустого AVL-дерева */ + tree := newAVLTree() + /* Вставка узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после вставки узла + testInsert(tree, 1) + testInsert(tree, 2) + testInsert(tree, 3) + testInsert(tree, 4) + testInsert(tree, 5) + testInsert(tree, 8) + testInsert(tree, 7) + testInsert(tree, 9) + testInsert(tree, 10) + testInsert(tree, 6) + + /* Вставка повторяющегося узла */ + testInsert(tree, 7) + + /* Удаление узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после удаления узла + testRemove(tree, 8) // Удаление узла степени 0 + testRemove(tree, 5) // Удаление узла степени 1 + testRemove(tree, 4) // Удаление узла степени 2 + + /* Поиск узла */ + node := tree.search(7) + fmt.Printf("\nНайденный объект узла = %#v, значение узла = %d\n", node, node.Val) +} + +func testInsert(tree *aVLTree, val int) { + tree.insert(val) + fmt.Printf("\nПосле вставки узла %d AVL-дерево имеет вид\n", val) + PrintTree(tree.root) +} + +func testRemove(tree *aVLTree, val int) { + tree.remove(val) + fmt.Printf("\nПосле удаления узла %d AVL-дерево имеет вид\n", val) + PrintTree(tree.root) +} diff --git a/ru/codes/go/chapter_tree/binary_search_tree.go b/ru/codes/go/chapter_tree/binary_search_tree.go new file mode 100644 index 000000000..55b924419 --- /dev/null +++ b/ru/codes/go/chapter_tree/binary_search_tree.go @@ -0,0 +1,142 @@ +// File: binary_search_tree.go +// Created Time: 2022-11-26 +// Author: Reanon (793584285@qq.com) + +package chapter_tree + +import ( + . "github.com/krahets/hello-algo/pkg" +) + +type binarySearchTree struct { + root *TreeNode +} + +func newBinarySearchTree() *binarySearchTree { + bst := &binarySearchTree{} + // Инициализировать пустое дерево + bst.root = nil + return bst +} + +/* Получить корневой узел */ +func (bst *binarySearchTree) getRoot() *TreeNode { + return bst.root +} + +/* Поиск узла */ +func (bst *binarySearchTree) search(num int) *TreeNode { + node := bst.root + // Искать в цикле и выйти после прохода за листовой узел + for node != nil { + if node.Val.(int) < num { + // Целевой узел находится в правом поддереве cur + node = node.Right + } else if node.Val.(int) > num { + // Целевой узел находится в левом поддереве cur + node = node.Left + } else { + // Найти целевой узел и выйти из цикла + break + } + } + // Вернуть целевой узел + return node +} + +/* Вставка узла */ +func (bst *binarySearchTree) insert(num int) { + cur := bst.root + // Если дерево пусто, инициализировать корневой узел + if cur == nil { + bst.root = NewTreeNode(num) + return + } + // Позиция узла, предшествующего вставляемому + var pre *TreeNode = nil + // Искать в цикле и выйти после прохода за листовой узел + for cur != nil { + if cur.Val == num { + return + } + pre = cur + if cur.Val.(int) < num { + cur = cur.Right + } else { + cur = cur.Left + } + } + // Вставка узла + node := NewTreeNode(num) + if pre.Val.(int) < num { + pre.Right = node + } else { + pre.Left = node + } +} + +/* Удаление узла */ +func (bst *binarySearchTree) remove(num int) { + cur := bst.root + // Если дерево пусто, сразу вернуть + if cur == nil { + return + } + // Позиция узла, предшествующего удаляемому + var pre *TreeNode = nil + // Искать в цикле и выйти после прохода за листовой узел + for cur != nil { + if cur.Val == num { + break + } + pre = cur + if cur.Val.(int) < num { + // Удаляемый узел находится в правом поддереве + cur = cur.Right + } else { + // Удаляемый узел находится в левом поддереве + cur = cur.Left + } + } + // Если узел для удаления отсутствует, сразу вернуть + if cur == nil { + return + } + // Число дочерних узлов равно 0 или 1 + if cur.Left == nil || cur.Right == nil { + var child *TreeNode = nil + // Извлечь дочерний узел удаляемого узла + if cur.Left != nil { + child = cur.Left + } else { + child = cur.Right + } + // Удалить узел cur + if cur != bst.root { + if pre.Left == cur { + pre.Left = child + } else { + pre.Right = child + } + } else { + // Если удаляемый узел является корнем, заново назначить корневой узел + bst.root = child + } + // Число дочерних узлов равно 2 + } else { + // Получить следующий после cur узел в симметричном обходе для удаляемого узла + tmp := cur.Right + for tmp.Left != nil { + tmp = tmp.Left + } + // Рекурсивно удалить узел tmp + bst.remove(tmp.Val.(int)) + // Перезаписать cur значением tmp + cur.Val = tmp.Val + } +} + +/* Вывести двоичное дерево поиска */ +func (bst *binarySearchTree) print() { + PrintTree(bst.root) +} diff --git a/ru/codes/go/chapter_tree/binary_search_tree_test.go b/ru/codes/go/chapter_tree/binary_search_tree_test.go new file mode 100644 index 000000000..529c24e79 --- /dev/null +++ b/ru/codes/go/chapter_tree/binary_search_tree_test.go @@ -0,0 +1,45 @@ +// File: binary_search_tree_test.go +// Created Time: 2022-11-26 +// Author: Reanon (793584285@qq.com) + +package chapter_tree + +import ( + "fmt" + "testing" +) + +func TestBinarySearchTree(t *testing.T) { + bst := newBinarySearchTree() + nums := []int{8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15} + // Обратите внимание: разные порядки вставки порождают разные двоичные деревья; данная последовательность может построить совершенное двоичное дерево + for _, num := range nums { + bst.insert(num) + } + fmt.Println("\nИсходное двоичное дерево:") + bst.print() + + // Получить корневой узел + node := bst.getRoot() + fmt.Println("\nКорневой узел двоичного дерева:", node.Val) + + // Поиск узла + node = bst.search(7) + fmt.Println("Найденный объект узла =", node, ", значение узла =", node.Val) + + // Вставка узла + bst.insert(16) + fmt.Println("\nПосле вставки узла 16 двоичное дерево имеет вид:") + bst.print() + + // Удаление узла + bst.remove(1) + fmt.Println("\nПосле удаления узла 1 двоичное дерево имеет вид:") + bst.print() + bst.remove(2) + fmt.Println("\nПосле удаления узла 2 двоичное дерево имеет вид:") + bst.print() + bst.remove(4) + fmt.Println("\nПосле удаления узла 4 двоичное дерево имеет вид:") + bst.print() +} diff --git a/ru/codes/go/chapter_tree/binary_tree_bfs.go b/ru/codes/go/chapter_tree/binary_tree_bfs.go new file mode 100644 index 000000000..0df49c9ee --- /dev/null +++ b/ru/codes/go/chapter_tree/binary_tree_bfs.go @@ -0,0 +1,35 @@ +// File: binary_tree_bfs.go +// Created Time: 2022-11-26 +// Author: Reanon (793584285@qq.com) + +package chapter_tree + +import ( + "container/list" + + . "github.com/krahets/hello-algo/pkg" +) + +/* Обход в ширину */ +func levelOrder(root *TreeNode) []any { + // Инициализировать очередь и добавить корневой узел + queue := list.New() + queue.PushBack(root) + // Инициализировать срез для хранения последовательности обхода + nums := make([]any, 0) + for queue.Len() > 0 { + // Извлечение из очереди + node := queue.Remove(queue.Front()).(*TreeNode) + // Сохранить значение узла + nums = append(nums, node.Val) + if node.Left != nil { + // Поместить левый дочерний узел в очередь + queue.PushBack(node.Left) + } + if node.Right != nil { + // Поместить правый дочерний узел в очередь + queue.PushBack(node.Right) + } + } + return nums +} diff --git a/ru/codes/go/chapter_tree/binary_tree_bfs_test.go b/ru/codes/go/chapter_tree/binary_tree_bfs_test.go new file mode 100644 index 000000000..00798be41 --- /dev/null +++ b/ru/codes/go/chapter_tree/binary_tree_bfs_test.go @@ -0,0 +1,24 @@ +// File: binary_tree_bfs_test.go +// Created Time: 2022-11-26 +// Author: Reanon (793584285@qq.com) + +package chapter_tree + +import ( + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestLevelOrder(t *testing.T) { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из массива + root := SliceToTree([]any{1, 2, 3, 4, 5, 6, 7}) + fmt.Println("\nИнициализация двоичного дерева:") + PrintTree(root) + + // Обход в ширину + nums := levelOrder(root) + fmt.Println("\nПоследовательность печати узлов при обходе в ширину =", nums) +} diff --git a/ru/codes/go/chapter_tree/binary_tree_dfs.go b/ru/codes/go/chapter_tree/binary_tree_dfs.go new file mode 100644 index 000000000..044c901ea --- /dev/null +++ b/ru/codes/go/chapter_tree/binary_tree_dfs.go @@ -0,0 +1,44 @@ +// File: binary_tree_dfs.go +// Created Time: 2022-11-26 +// Author: Reanon (793584285@qq.com) + +package chapter_tree + +import ( + . "github.com/krahets/hello-algo/pkg" +) + +var nums []any + +/* Предварительный обход */ +func preOrder(node *TreeNode) { + if node == nil { + return + } + // Порядок обхода: корень -> левое поддерево -> правое поддерево + nums = append(nums, node.Val) + preOrder(node.Left) + preOrder(node.Right) +} + +/* Симметричный обход */ +func inOrder(node *TreeNode) { + if node == nil { + return + } + // Порядок обхода: левое поддерево -> корень -> правое поддерево + inOrder(node.Left) + nums = append(nums, node.Val) + inOrder(node.Right) +} + +/* Обратный обход */ +func postOrder(node *TreeNode) { + if node == nil { + return + } + // Порядок обхода: левое поддерево -> правое поддерево -> корень + postOrder(node.Left) + postOrder(node.Right) + nums = append(nums, node.Val) +} diff --git a/ru/codes/go/chapter_tree/binary_tree_dfs_test.go b/ru/codes/go/chapter_tree/binary_tree_dfs_test.go new file mode 100644 index 000000000..ccf9a61e2 --- /dev/null +++ b/ru/codes/go/chapter_tree/binary_tree_dfs_test.go @@ -0,0 +1,35 @@ +// File: binary_tree_dfs_test.go +// Created Time: 2022-11-26 +// Author: Reanon (793584285@qq.com) + +package chapter_tree + +import ( + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestPreInPostOrderTraversal(t *testing.T) { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из массива + root := SliceToTree([]any{1, 2, 3, 4, 5, 6, 7}) + fmt.Println("\nИнициализация двоичного дерева:") + PrintTree(root) + + // Предварительный обход + nums = nil + preOrder(root) + fmt.Println("\nПоследовательность печати узлов при предварительном обходе =", nums) + + // Симметричный обход + nums = nil + inOrder(root) + fmt.Println("\nПоследовательность печати узлов при симметричном обходе =", nums) + + // Обратный обход + nums = nil + postOrder(root) + fmt.Println("\nПоследовательность печати узлов при обратном обходе =", nums) +} diff --git a/ru/codes/go/chapter_tree/binary_tree_test.go b/ru/codes/go/chapter_tree/binary_tree_test.go new file mode 100644 index 000000000..7a545c431 --- /dev/null +++ b/ru/codes/go/chapter_tree/binary_tree_test.go @@ -0,0 +1,41 @@ +// File: binary_tree_test.go +// Created Time: 2022-11-25 +// Author: Reanon (793584285@qq.com) + +package chapter_tree + +import ( + "fmt" + "testing" + + . "github.com/krahets/hello-algo/pkg" +) + +func TestBinaryTree(t *testing.T) { + /* Инициализация двоичного дерева */ + // Инициализация узла + n1 := NewTreeNode(1) + n2 := NewTreeNode(2) + n3 := NewTreeNode(3) + n4 := NewTreeNode(4) + n5 := NewTreeNode(5) + // Построить связи между узлами (указатели) + n1.Left = n2 + n1.Right = n3 + n2.Left = n4 + n2.Right = n5 + fmt.Println("Инициализация двоичного дерева") + PrintTree(n1) + + /* Вставка и удаление узлов */ + // Вставка узла + p := NewTreeNode(0) + n1.Left = p + p.Left = n2 + fmt.Println("После вставки узла P") + PrintTree(n1) + // Удаление узла + n1.Left = n2 + fmt.Println("После удаления узла P") + PrintTree(n1) +} diff --git a/ru/codes/go/go.mod b/ru/codes/go/go.mod new file mode 100644 index 000000000..34f5dac20 --- /dev/null +++ b/ru/codes/go/go.mod @@ -0,0 +1,3 @@ +module github.com/krahets/hello-algo + +go 1.19 diff --git a/ru/codes/go/pkg/list_node.go b/ru/codes/go/pkg/list_node.go new file mode 100644 index 000000000..3964b166e --- /dev/null +++ b/ru/codes/go/pkg/list_node.go @@ -0,0 +1,31 @@ +// File: list_node.go +// Created Time: 2022-11-25 +// Author: Reanon (793584285@qq.com) + +package pkg + +// ListNode: узел связного списка +type ListNode struct { + Next *ListNode + Val int +} + +// NewListNode: конструктор узла связного списка +func NewListNode(v int) *ListNode { + return &ListNode{ + Next: nil, + Val: v, + } +} + +// ArrayToLinkedList десериализует массив в связный список +func ArrayToLinkedList(arr []int) *ListNode { + // dummy header of linked list + dummy := NewListNode(0) + node := dummy + for _, val := range arr { + node.Next = NewListNode(val) + node = node.Next + } + return dummy.Next +} diff --git a/ru/codes/go/pkg/list_node_test.go b/ru/codes/go/pkg/list_node_test.go new file mode 100644 index 000000000..e61d8d5bf --- /dev/null +++ b/ru/codes/go/pkg/list_node_test.go @@ -0,0 +1,16 @@ +// File: list_node_test.go +// Created Time: 2022-11-25 +// Author: Reanon (793584285@qq.com) + +package pkg + +import ( + "testing" +) + +func TestListNode(t *testing.T) { + arr := []int{2, 3, 5, 6, 7} + head := ArrayToLinkedList(arr) + + PrintLinkedList(head) +} diff --git a/ru/codes/go/pkg/print_utils.go b/ru/codes/go/pkg/print_utils.go new file mode 100644 index 000000000..46d933a52 --- /dev/null +++ b/ru/codes/go/pkg/print_utils.go @@ -0,0 +1,118 @@ +// File: print_utils.go +// Created Time: 2022-12-03 +// Author: Reanon (793584285@qq.com), krahets (krahets@163.com), msk397 (machangxinq@gmail.com) + +package pkg + +import ( + "container/list" + "fmt" + "strconv" + "strings" +) + +// PrintSlice: вывести срез +func PrintSlice[T any](nums []T) { + fmt.Printf("%v", nums) + fmt.Println() +} + +// PrintList: вывести список +func PrintList(list *list.List) { + if list.Len() == 0 { + fmt.Print("[]\n") + return + } + e := list.Front() + // Преобразование к string повлияет на эффективность + fmt.Print("[") + for e.Next() != nil { + fmt.Print(e.Value, " ") + e = e.Next() + } + fmt.Print(e.Value, "]\n") +} + +// PrintMap: вывести хеш-таблицу +func PrintMap[K comparable, V any](m map[K]V) { + for key, value := range m { + fmt.Println(key, "->", value) + } +} + +// PrintHeap: вывести кучу +func PrintHeap(h []any) { + fmt.Printf("Массивное представление кучи:") + fmt.Printf("%v", h) + fmt.Printf("\nДревовидное представление кучи:\n") + root := SliceToTree(h) + PrintTree(root) +} + +// PrintLinkedList: вывести связный список +func PrintLinkedList(node *ListNode) { + if node == nil { + return + } + var builder strings.Builder + for node.Next != nil { + builder.WriteString(strconv.Itoa(node.Val) + " -> ") + node = node.Next + } + builder.WriteString(strconv.Itoa(node.Val)) + fmt.Println(builder.String()) +} + +// PrintTree: вывести двоичное дерево +func PrintTree(root *TreeNode) { + printTreeHelper(root, nil, false) +} + +// printTreeHelper: вывести двоичное дерево +// Этот вывод дерева заимствован из TECHIE DELIGHT +// https://www.techiedelight.com/c-program-print-binary-tree/ +func printTreeHelper(root *TreeNode, prev *trunk, isRight bool) { + if root == nil { + return + } + prevStr := " " + trunk := newTrunk(prev, prevStr) + printTreeHelper(root.Right, trunk, true) + if prev == nil { + trunk.str = "———" + } else if isRight { + trunk.str = "/———" + prevStr = " |" + } else { + trunk.str = "\\———" + prev.str = prevStr + } + showTrunk(trunk) + fmt.Println(root.Val) + if prev != nil { + prev.str = prevStr + } + trunk.str = " |" + printTreeHelper(root.Left, trunk, false) +} + +type trunk struct { + prev *trunk + str string +} + +func newTrunk(prev *trunk, str string) *trunk { + return &trunk{ + prev: prev, + str: str, + } +} + +func showTrunk(t *trunk) { + if t == nil { + return + } + + showTrunk(t.prev) + fmt.Print(t.str) +} diff --git a/ru/codes/go/pkg/tree_node.go b/ru/codes/go/pkg/tree_node.go new file mode 100644 index 000000000..877bdf546 --- /dev/null +++ b/ru/codes/go/pkg/tree_node.go @@ -0,0 +1,78 @@ +// File: tree_node.go +// Created Time: 2022-11-25 +// Author: Reanon (793584285@qq.com) + +package pkg + +// TreeNode: узел двоичного дерева +type TreeNode struct { + Val any // Значение узла + Height int // Высота узла + Left *TreeNode // Ссылка на левый дочерний узел + Right *TreeNode // Ссылка на правый дочерний узел +} + +// NewTreeNode: конструктор узла двоичного дерева +func NewTreeNode(v any) *TreeNode { + return &TreeNode{ + Val: v, + Height: 0, + Left: nil, + Right: nil, + } +} + +// Правила кодирования сериализации см.: +// https://www.hello-algo.com/chapter_tree/array_representation_of_tree/ +// Представление двоичного дерева массивом: +// [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15] +// Представление двоичного дерева связным списком: +// +// /——— 15 +// /——— 7 +// /——— 3 +// | \——— 6 +// | \——— 12 +// +// ——— 1 +// +// \——— 2 +// | /——— 9 +// \——— 4 +// \——— 8 + +// SliceToTreeDFS десериализует список в двоичное дерево: рекурсия +func SliceToTreeDFS(arr []any, i int) *TreeNode { + if i < 0 || i >= len(arr) || arr[i] == nil { + return nil + } + root := NewTreeNode(arr[i]) + root.Left = SliceToTreeDFS(arr, 2*i+1) + root.Right = SliceToTreeDFS(arr, 2*i+2) + return root +} + +// SliceToTree десериализует срез в двоичное дерево +func SliceToTree(arr []any) *TreeNode { + return SliceToTreeDFS(arr, 0) +} + +// TreeToSliceDFS сериализует двоичное дерево в срез: рекурсия +func TreeToSliceDFS(root *TreeNode, i int, res *[]any) { + if root == nil { + return + } + for i >= len(*res) { + *res = append(*res, nil) + } + (*res)[i] = root.Val + TreeToSliceDFS(root.Left, 2*i+1, res) + TreeToSliceDFS(root.Right, 2*i+2, res) +} + +// TreeToSlice сериализует двоичное дерево в срез +func TreeToSlice(root *TreeNode) []any { + var res []any + TreeToSliceDFS(root, 0, &res) + return res +} diff --git a/ru/codes/go/pkg/tree_node_test.go b/ru/codes/go/pkg/tree_node_test.go new file mode 100644 index 000000000..043aab099 --- /dev/null +++ b/ru/codes/go/pkg/tree_node_test.go @@ -0,0 +1,21 @@ +// File: tree_node_test.go +// Created Time: 2022-11-25 +// Author: Reanon (793584285@qq.com) + +package pkg + +import ( + "fmt" + "testing" +) + +func TestTreeNode(t *testing.T) { + arr := []any{1, 2, 3, nil, 5, 6, nil} + node := SliceToTree(arr) + + // print tree + PrintTree(node) + + // tree to arr + fmt.Println(TreeToSlice(node)) +} diff --git a/ru/codes/go/pkg/vertex.go b/ru/codes/go/pkg/vertex.go new file mode 100644 index 000000000..a065f20a9 --- /dev/null +++ b/ru/codes/go/pkg/vertex.go @@ -0,0 +1,55 @@ +// File: vertex.go +// Created Time: 2023-02-18 +// Author: Reanon (793584285@qq.com) + +package pkg + +// Vertex: класс вершины +type Vertex struct { + Val int +} + +// NewVertex: конструктор вершины +func NewVertex(val int) Vertex { + return Vertex{ + Val: val, + } +} + +// ValsToVets десериализует список значений в список вершин +func ValsToVets(vals []int) []Vertex { + vets := make([]Vertex, len(vals)) + for i := 0; i < len(vals); i++ { + vets[i] = NewVertex(vals[i]) + } + return vets +} + +// VetsToVals сериализует список вершин в список значений +func VetsToVals(vets []Vertex) []int { + vals := make([]int, len(vets)) + for i := range vets { + vals[i] = vets[i].Val + } + return vals +} + +// DeleteSliceElms удаляет указанный элемент из среза +func DeleteSliceElms[T any](a []T, elms ...T) []T { + if len(a) == 0 || len(elms) == 0 { + return a + } + // Сначала преобразовать элементы в set + m := make(map[any]struct{}) + for _, v := range elms { + m[v] = struct{}{} + } + // Отфильтровать указанный элемент + res := make([]T, 0, len(a)) + for _, v := range a { + if _, ok := m[v]; !ok { + res = append(res, v) + } + } + return res +} diff --git a/ru/codes/java/.gitignore b/ru/codes/java/.gitignore new file mode 100644 index 000000000..378eac25d --- /dev/null +++ b/ru/codes/java/.gitignore @@ -0,0 +1 @@ +build diff --git a/ru/codes/java/chapter_array_and_linkedlist/array.java b/ru/codes/java/chapter_array_and_linkedlist/array.java new file mode 100644 index 000000000..a23338b00 --- /dev/null +++ b/ru/codes/java/chapter_array_and_linkedlist/array.java @@ -0,0 +1,105 @@ +/** + * File: array.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_array_and_linkedlist; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + +public class array { + /* Случайный доступ к элементу */ + static int randomAccess(int[] nums) { + // Случайным образом выбрать число из интервала [0, nums.length) + int randomIndex = ThreadLocalRandom.current().nextInt(0, nums.length); + // Получить и вернуть случайный элемент + int randomNum = nums[randomIndex]; + return randomNum; + } + + /* Увеличить длину массива */ + static int[] extend(int[] nums, int enlarge) { + // Инициализировать массив увеличенной длины + int[] res = new int[nums.length + enlarge]; + // Скопировать все элементы исходного массива в новый массив + for (int i = 0; i < nums.length; i++) { + res[i] = nums[i]; + } + // Вернуть новый массив после расширения + return res; + } + + /* Вставить элемент num по индексу index в массив */ + static void insert(int[] nums, int num, int index) { + // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад + for (int i = nums.length - 1; i > index; i--) { + nums[i] = nums[i - 1]; + } + // Присвоить num элементу по индексу index + nums[index] = num; + } + + /* Удалить элемент по индексу index */ + static void remove(int[] nums, int index) { + // Сдвинуть все элементы после индекса index на одну позицию вперед + for (int i = index; i < nums.length - 1; i++) { + nums[i] = nums[i + 1]; + } + } + + /* Обход массива */ + static void traverse(int[] nums) { + int count = 0; + // Обход массива по индексам + for (int i = 0; i < nums.length; i++) { + count += nums[i]; + } + // Непосредственно обходить элементы массива + for (int num : nums) { + count += num; + } + } + + /* Найти заданный элемент в массиве */ + static int find(int[] nums, int target) { + for (int i = 0; i < nums.length; i++) { + if (nums[i] == target) + return i; + } + return -1; + } + + /* Driver Code */ + public static void main(String[] args) { + /* Инициализация массива */ + int[] arr = new int[5]; + System.out.println("Массив arr = " + Arrays.toString(arr)); + int[] nums = { 1, 3, 2, 5, 4 }; + System.out.println("Массив nums = " + Arrays.toString(nums)); + + /* Случайный доступ */ + int randomNum = randomAccess(nums); + System.out.println("Случайный элемент из nums = " + randomNum); + + /* Расширение длины */ + nums = extend(nums, 3); + System.out.println("После увеличения длины массива до 8 nums = " + Arrays.toString(nums)); + + /* Вставка элемента */ + insert(nums, 6, 3); + System.out.println("После вставки числа 6 по индексу 3 nums = " + Arrays.toString(nums)); + + /* Удаление элемента */ + remove(nums, 2); + System.out.println("После удаления элемента по индексу 2 nums = " + Arrays.toString(nums)); + + /* Обход массива */ + traverse(nums); + + /* Поиск элемента */ + int index = find(nums, 3); + System.out.println("Поиск элемента 3 в nums: индекс = " + index); + } +} diff --git a/ru/codes/java/chapter_array_and_linkedlist/linked_list.java b/ru/codes/java/chapter_array_and_linkedlist/linked_list.java new file mode 100644 index 000000000..7b74e5e7b --- /dev/null +++ b/ru/codes/java/chapter_array_and_linkedlist/linked_list.java @@ -0,0 +1,86 @@ +/** + * File: linked_list.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_array_and_linkedlist; + +import utils.*; + +public class linked_list { + /* Вставить узел P после узла n0 в связном списке */ + static void insert(ListNode n0, ListNode P) { + ListNode n1 = n0.next; + P.next = n1; + n0.next = P; + } + + /* Удалить первый узел после узла n0 в связном списке */ + static void remove(ListNode n0) { + if (n0.next == null) + return; + // n0 -> P -> n1 + ListNode P = n0.next; + ListNode n1 = P.next; + n0.next = n1; + } + + /* Доступ к узлу связного списка по индексу index */ + static ListNode access(ListNode head, int index) { + for (int i = 0; i < index; i++) { + if (head == null) + return null; + head = head.next; + } + return head; + } + + /* Найти в связном списке первый узел со значением target */ + static int find(ListNode head, int target) { + int index = 0; + while (head != null) { + if (head.val == target) + return index; + head = head.next; + index++; + } + return -1; + } + + /* Driver Code */ + public static void main(String[] args) { + /* Инициализация связного списка */ + // Инициализация всех узлов + ListNode n0 = new ListNode(1); + ListNode n1 = new ListNode(3); + ListNode n2 = new ListNode(2); + ListNode n3 = new ListNode(5); + ListNode n4 = new ListNode(4); + // Построить ссылки между узлами + n0.next = n1; + n1.next = n2; + n2.next = n3; + n3.next = n4; + System.out.println("Исходный связный список"); + PrintUtil.printLinkedList(n0); + + /* Вставка узла */ + insert(n0, new ListNode(0)); + System.out.println("Связный список после вставки узла"); + PrintUtil.printLinkedList(n0); + + /* Удаление узла */ + remove(n0); + System.out.println("Связный список после удаления узла"); + PrintUtil.printLinkedList(n0); + + /* Доступ к узлу */ + ListNode node = access(n0, 3); + System.out.println("Значение узла по индексу 3 в связном списке = " + node.val); + + /* Поиск узла */ + int index = find(n0, 2); + System.out.println("Индекс узла со значением 2 в связном списке = " + index); + } +} diff --git a/ru/codes/java/chapter_array_and_linkedlist/list.java b/ru/codes/java/chapter_array_and_linkedlist/list.java new file mode 100644 index 000000000..cbb5c4beb --- /dev/null +++ b/ru/codes/java/chapter_array_and_linkedlist/list.java @@ -0,0 +1,66 @@ +/** + * File: list.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_array_and_linkedlist; + +import java.util.*; + +public class list { + public static void main(String[] args) { + /* Инициализация списка */ + // Обратите внимание: тип элементов массива int[] — это обертка Integer[] + Integer[] numbers = new Integer[] { 1, 3, 2, 5, 4 }; + List nums = new ArrayList<>(Arrays.asList(numbers)); + System.out.println("Список nums = " + nums); + + /* Доступ к элементу */ + int num = nums.get(1); + System.out.println("Элемент по индексу 1: num = " + num); + + /* Обновление элемента */ + nums.set(1, 0); + System.out.println("После обновления элемента по индексу 1 до 0 nums = " + nums); + + /* Очистить список */ + nums.clear(); + System.out.println("После очистки списка nums = " + nums); + + /* Добавление элемента в конец */ + nums.add(1); + nums.add(3); + nums.add(2); + nums.add(5); + nums.add(4); + System.out.println("После добавления элементов nums = " + nums); + + /* Вставка элемента в середину */ + nums.add(3, 6); + System.out.println("После вставки числа 6 по индексу 3 nums = " + nums); + + /* Удаление элемента */ + nums.remove(3); + System.out.println("После удаления элемента по индексу 3 nums = " + nums); + + /* Обходить список по индексам */ + int count = 0; + for (int i = 0; i < nums.size(); i++) { + count += nums.get(i); + } + /* Непосредственно обходить элементы списка */ + for (int x : nums) { + count += x; + } + + /* Объединить два списка */ + List nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 })); + nums.addAll(nums1); + System.out.println("После конкатенации списка nums1 к nums nums = " + nums); + + /* Отсортировать список */ + Collections.sort(nums); + System.out.println("После сортировки списка nums = " + nums); + } +} diff --git a/ru/codes/java/chapter_array_and_linkedlist/my_list.java b/ru/codes/java/chapter_array_and_linkedlist/my_list.java new file mode 100644 index 000000000..db42a96da --- /dev/null +++ b/ru/codes/java/chapter_array_and_linkedlist/my_list.java @@ -0,0 +1,147 @@ +/** + * File: my_list.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_array_and_linkedlist; + +import java.util.*; + +/* Класс списка */ +class MyList { + private int[] arr; // Массив (для хранения элементов списка) + private int capacity = 10; // Вместимость списка + private int size = 0; // Длина списка (текущее число элементов) + private int extendRatio = 2; // Коэффициент увеличения списка при каждом расширении + + /* Конструктор */ + public MyList() { + arr = new int[capacity]; + } + + /* Получить длину списка (текущее число элементов) */ + public int size() { + return size; + } + + /* Получить вместимость списка */ + public int capacity() { + return capacity; + } + + /* Доступ к элементу */ + public int get(int index) { + // Если индекс выходит за границы, выбрасывается исключение; далее аналогично + if (index < 0 || index >= size) + throw new IndexOutOfBoundsException("индекс выходит за границы"); + return arr[index]; + } + + /* Обновление элемента */ + public void set(int index, int num) { + if (index < 0 || index >= size) + throw new IndexOutOfBoundsException("индекс выходит за границы"); + arr[index] = num; + } + + /* Добавление элемента в конец */ + public void add(int num) { + // При превышении вместимости по числу элементов запускается расширение + if (size == capacity()) + extendCapacity(); + arr[size] = num; + // Обновить число элементов + size++; + } + + /* Вставка элемента в середину */ + public void insert(int index, int num) { + if (index < 0 || index >= size) + throw new IndexOutOfBoundsException("индекс выходит за границы"); + // При превышении вместимости по числу элементов запускается расширение + if (size == capacity()) + extendCapacity(); + // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад + for (int j = size - 1; j >= index; j--) { + arr[j + 1] = arr[j]; + } + arr[index] = num; + // Обновить число элементов + size++; + } + + /* Удаление элемента */ + public int remove(int index) { + if (index < 0 || index >= size) + throw new IndexOutOfBoundsException("индекс выходит за границы"); + int num = arr[index]; + // Сдвинуть все элементы после индекса index на одну позицию вперед + for (int j = index; j < size - 1; j++) { + arr[j] = arr[j + 1]; + } + // Обновить число элементов + size--; + // Вернуть удаленный элемент + return num; + } + + /* Расширение списка */ + public void extendCapacity() { + // Создать новый массив длиной в extendRatio раз больше исходного и скопировать в него исходный массив + arr = Arrays.copyOf(arr, capacity() * extendRatio); + // Обновить вместимость списка + capacity = arr.length; + } + + /* Преобразовать список в массив */ + public int[] toArray() { + int size = size(); + // Преобразовывать только элементы списка в пределах фактической длины + int[] arr = new int[size]; + for (int i = 0; i < size; i++) { + arr[i] = get(i); + } + return arr; + } +} + +public class my_list { + /* Driver Code */ + public static void main(String[] args) { + /* Инициализация списка */ + MyList nums = new MyList(); + /* Добавление элемента в конец */ + nums.add(1); + nums.add(3); + nums.add(2); + nums.add(5); + nums.add(4); + System.out.println("Список nums = " + Arrays.toString(nums.toArray()) + + ", вместимость = " + nums.capacity() + " , длина = " + nums.size()); + + /* Вставка элемента в середину */ + nums.insert(3, 6); + System.out.println("После вставки числа 6 по индексу 3 nums = " + Arrays.toString(nums.toArray())); + + /* Удаление элемента */ + nums.remove(3); + System.out.println("После удаления элемента по индексу 3 nums = " + Arrays.toString(nums.toArray())); + + /* Доступ к элементу */ + int num = nums.get(1); + System.out.println("Элемент по индексу 1: num = " + num); + + /* Обновление элемента */ + nums.set(1, 0); + System.out.println("После обновления элемента по индексу 1 до 0 nums = " + Arrays.toString(nums.toArray())); + + /* Проверка механизма расширения */ + for (int i = 0; i < 10; i++) { + // При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения + nums.add(i); + } + System.out.println("Список nums после увеличения вместимости = " + Arrays.toString(nums.toArray()) + + ", вместимость = " + nums.capacity() + " , длина = " + nums.size()); + } +} diff --git a/ru/codes/java/chapter_backtracking/n_queens.java b/ru/codes/java/chapter_backtracking/n_queens.java new file mode 100644 index 000000000..0f1aaedf0 --- /dev/null +++ b/ru/codes/java/chapter_backtracking/n_queens.java @@ -0,0 +1,77 @@ +/** + * File: n_queens.java + * Created Time: 2023-05-04 + * Author: krahets (krahets@163.com) + */ + +package chapter_backtracking; + +import java.util.*; + +public class n_queens { + /* Алгоритм бэктрекинга: n ферзей */ + public static void backtrack(int row, int n, List> state, List>> res, + boolean[] cols, boolean[] diags1, boolean[] diags2) { + // Когда все строки уже обработаны, записать решение + if (row == n) { + List> copyState = new ArrayList<>(); + for (List sRow : state) { + copyState.add(new ArrayList<>(sRow)); + } + res.add(copyState); + return; + } + // Обойти все столбцы + for (int col = 0; col < n; col++) { + // Вычислить главную и побочную диагонали, соответствующие этой клетке + int diag1 = row - col + n - 1; + int diag2 = row + col; + // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей + if (!cols[col] && !diags1[diag1] && !diags2[diag2]) { + // Попытка: поставить ферзя в эту клетку + state.get(row).set(col, "Q"); + cols[col] = diags1[diag1] = diags2[diag2] = true; + // Перейти к размещению следующей строки + backtrack(row + 1, n, state, res, cols, diags1, diags2); + // Откат: восстановить эту клетку как пустую + state.get(row).set(col, "#"); + cols[col] = diags1[diag1] = diags2[diag2] = false; + } + } + } + + /* Решить задачу о n ферзях */ + public static List>> nQueens(int n) { + // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку + List> state = new ArrayList<>(); + for (int i = 0; i < n; i++) { + List row = new ArrayList<>(); + for (int j = 0; j < n; j++) { + row.add("#"); + } + state.add(row); + } + boolean[] cols = new boolean[n]; // Отмечать, есть ли ферзь в столбце + boolean[] diags1 = new boolean[2 * n - 1]; // Отмечать наличие ферзя на главной диагонали + boolean[] diags2 = new boolean[2 * n - 1]; // Отмечать наличие ферзя на побочной диагонали + List>> res = new ArrayList<>(); + + backtrack(0, n, state, res, cols, diags1, diags2); + + return res; + } + + public static void main(String[] args) { + int n = 4; + List>> res = nQueens(n); + + System.out.println("Размер входной доски = " + n); + System.out.println("Количество способов расстановки ферзей: " + res.size()); + for (List> state : res) { + System.out.println("--------------------"); + for (List row : state) { + System.out.println(row); + } + } + } +} diff --git a/ru/codes/java/chapter_backtracking/permutations_i.java b/ru/codes/java/chapter_backtracking/permutations_i.java new file mode 100644 index 000000000..9d799a949 --- /dev/null +++ b/ru/codes/java/chapter_backtracking/permutations_i.java @@ -0,0 +1,51 @@ +/** + * File: permutations_i.java + * Created Time: 2023-04-24 + * Author: krahets (krahets@163.com) + */ + +package chapter_backtracking; + +import java.util.*; + +public class permutations_i { + /* Алгоритм бэктрекинга: все перестановки I */ + public static void backtrack(List state, int[] choices, boolean[] selected, List> res) { + // Когда длина состояния равна числу элементов, записать решение + if (state.size() == choices.length) { + res.add(new ArrayList(state)); + return; + } + // Перебор всех вариантов выбора + for (int i = 0; i < choices.length; i++) { + int choice = choices[i]; + // Отсечение: нельзя выбирать один и тот же элемент повторно + if (!selected[i]) { + // Попытка: сделать выбор и обновить состояние + selected[i] = true; + state.add(choice); + // Перейти к следующему выбору + backtrack(state, choices, selected, res); + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false; + state.remove(state.size() - 1); + } + } + } + + /* Все перестановки I */ + static List> permutationsI(int[] nums) { + List> res = new ArrayList>(); + backtrack(new ArrayList(), nums, new boolean[nums.length], res); + return res; + } + + public static void main(String[] args) { + int[] nums = { 1, 2, 3 }; + + List> res = permutationsI(nums); + + System.out.println("Входной массив nums = " + Arrays.toString(nums)); + System.out.println("Все перестановки res = " + res); + } +} diff --git a/ru/codes/java/chapter_backtracking/permutations_ii.java b/ru/codes/java/chapter_backtracking/permutations_ii.java new file mode 100644 index 000000000..dd3c898e7 --- /dev/null +++ b/ru/codes/java/chapter_backtracking/permutations_ii.java @@ -0,0 +1,53 @@ +/** + * File: permutations_ii.java + * Created Time: 2023-04-24 + * Author: krahets (krahets@163.com) + */ + +package chapter_backtracking; + +import java.util.*; + +public class permutations_ii { + /* Алгоритм бэктрекинга: все перестановки II */ + static void backtrack(List state, int[] choices, boolean[] selected, List> res) { + // Когда длина состояния равна числу элементов, записать решение + if (state.size() == choices.length) { + res.add(new ArrayList(state)); + return; + } + // Перебор всех вариантов выбора + Set duplicated = new HashSet(); + for (int i = 0; i < choices.length; i++) { + int choice = choices[i]; + // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы + if (!selected[i] && !duplicated.contains(choice)) { + // Попытка: сделать выбор и обновить состояние + duplicated.add(choice); // Записать значения уже выбранных элементов + selected[i] = true; + state.add(choice); + // Перейти к следующему выбору + backtrack(state, choices, selected, res); + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false; + state.remove(state.size() - 1); + } + } + } + + /* Все перестановки II */ + static List> permutationsII(int[] nums) { + List> res = new ArrayList>(); + backtrack(new ArrayList(), nums, new boolean[nums.length], res); + return res; + } + + public static void main(String[] args) { + int[] nums = { 1, 2, 2 }; + + List> res = permutationsII(nums); + + System.out.println("Входной массив nums = " + Arrays.toString(nums)); + System.out.println("Все перестановки res = " + res); + } +} diff --git a/ru/codes/java/chapter_backtracking/preorder_traversal_i_compact.java b/ru/codes/java/chapter_backtracking/preorder_traversal_i_compact.java new file mode 100644 index 000000000..9f8067756 --- /dev/null +++ b/ru/codes/java/chapter_backtracking/preorder_traversal_i_compact.java @@ -0,0 +1,44 @@ +/** + * File: preorder_traversal_i_compact.java + * Created Time: 2023-04-16 + * Author: krahets (krahets@163.com) + */ + +package chapter_backtracking; + +import utils.*; +import java.util.*; + +public class preorder_traversal_i_compact { + static List res; + + /* Предварительный обход: пример 1 */ + static void preOrder(TreeNode root) { + if (root == null) { + return; + } + if (root.val == 7) { + // Записать решение + res.add(root); + } + preOrder(root.left); + preOrder(root.right); + } + + public static void main(String[] args) { + TreeNode root = TreeNode.listToTree(Arrays.asList(1, 7, 3, 4, 5, 6, 7)); + System.out.println("\nИнициализация двоичного дерева"); + PrintUtil.printTree(root); + + // Предварительный обход + res = new ArrayList<>(); + preOrder(root); + + System.out.println("\nВсе узлы со значением 7"); + List vals = new ArrayList<>(); + for (TreeNode node : res) { + vals.add(node.val); + } + System.out.println(vals); + } +} diff --git a/ru/codes/java/chapter_backtracking/preorder_traversal_ii_compact.java b/ru/codes/java/chapter_backtracking/preorder_traversal_ii_compact.java new file mode 100644 index 000000000..4b8796b5c --- /dev/null +++ b/ru/codes/java/chapter_backtracking/preorder_traversal_ii_compact.java @@ -0,0 +1,52 @@ +/** + * File: preorder_traversal_ii_compact.java + * Created Time: 2023-04-16 + * Author: krahets (krahets@163.com) + */ + +package chapter_backtracking; + +import utils.*; +import java.util.*; + +public class preorder_traversal_ii_compact { + static List path; + static List> res; + + /* Предварительный обход: пример 2 */ + static void preOrder(TreeNode root) { + if (root == null) { + return; + } + // Попытка + path.add(root); + if (root.val == 7) { + // Записать решение + res.add(new ArrayList<>(path)); + } + preOrder(root.left); + preOrder(root.right); + // Откат + path.remove(path.size() - 1); + } + + public static void main(String[] args) { + TreeNode root = TreeNode.listToTree(Arrays.asList(1, 7, 3, 4, 5, 6, 7)); + System.out.println("\nИнициализация двоичного дерева"); + PrintUtil.printTree(root); + + // Предварительный обход + path = new ArrayList<>(); + res = new ArrayList<>(); + preOrder(root); + + System.out.println("\nВсе пути от корня к узлу 7"); + for (List path : res) { + List vals = new ArrayList<>(); + for (TreeNode node : path) { + vals.add(node.val); + } + System.out.println(vals); + } + } +} diff --git a/ru/codes/java/chapter_backtracking/preorder_traversal_iii_compact.java b/ru/codes/java/chapter_backtracking/preorder_traversal_iii_compact.java new file mode 100644 index 000000000..1a517e235 --- /dev/null +++ b/ru/codes/java/chapter_backtracking/preorder_traversal_iii_compact.java @@ -0,0 +1,53 @@ +/** + * File: preorder_traversal_iii_compact.java + * Created Time: 2023-04-16 + * Author: krahets (krahets@163.com) + */ + +package chapter_backtracking; + +import utils.*; +import java.util.*; + +public class preorder_traversal_iii_compact { + static List path; + static List> res; + + /* Предварительный обход: пример 3 */ + static void preOrder(TreeNode root) { + // Отсечение + if (root == null || root.val == 3) { + return; + } + // Попытка + path.add(root); + if (root.val == 7) { + // Записать решение + res.add(new ArrayList<>(path)); + } + preOrder(root.left); + preOrder(root.right); + // Откат + path.remove(path.size() - 1); + } + + public static void main(String[] args) { + TreeNode root = TreeNode.listToTree(Arrays.asList(1, 7, 3, 4, 5, 6, 7)); + System.out.println("\nИнициализация двоичного дерева"); + PrintUtil.printTree(root); + + // Предварительный обход + path = new ArrayList<>(); + res = new ArrayList<>(); + preOrder(root); + + System.out.println("\nВсе пути от корня к узлу 7, не содержащие узлов со значением 3"); + for (List path : res) { + List vals = new ArrayList<>(); + for (TreeNode node : path) { + vals.add(node.val); + } + System.out.println(vals); + } + } +} diff --git a/ru/codes/java/chapter_backtracking/preorder_traversal_iii_template.java b/ru/codes/java/chapter_backtracking/preorder_traversal_iii_template.java new file mode 100644 index 000000000..596aee259 --- /dev/null +++ b/ru/codes/java/chapter_backtracking/preorder_traversal_iii_template.java @@ -0,0 +1,77 @@ +/** + * File: preorder_traversal_iii_template.java + * Created Time: 2023-04-16 + * Author: krahets (krahets@163.com) + */ + +package chapter_backtracking; + +import utils.*; +import java.util.*; + +public class preorder_traversal_iii_template { + /* Проверить, является ли текущее состояние решением */ + static boolean isSolution(List state) { + return !state.isEmpty() && state.get(state.size() - 1).val == 7; + } + + /* Записать решение */ + static void recordSolution(List state, List> res) { + res.add(new ArrayList<>(state)); + } + + /* Проверить, допустим ли этот выбор в текущем состоянии */ + static boolean isValid(List state, TreeNode choice) { + return choice != null && choice.val != 3; + } + + /* Обновить состояние */ + static void makeChoice(List state, TreeNode choice) { + state.add(choice); + } + + /* Восстановить состояние */ + static void undoChoice(List state, TreeNode choice) { + state.remove(state.size() - 1); + } + + /* Алгоритм бэктрекинга: пример 3 */ + static void backtrack(List state, List choices, List> res) { + // Проверить, является ли текущее состояние решением + if (isSolution(state)) { + // Записать решение + recordSolution(state, res); + } + // Перебор всех вариантов выбора + for (TreeNode choice : choices) { + // Отсечение: проверить допустимость выбора + if (isValid(state, choice)) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state, choice); + // Перейти к следующему выбору + backtrack(state, Arrays.asList(choice.left, choice.right), res); + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state, choice); + } + } + } + + public static void main(String[] args) { + TreeNode root = TreeNode.listToTree(Arrays.asList(1, 7, 3, 4, 5, 6, 7)); + System.out.println("\nИнициализация двоичного дерева"); + PrintUtil.printTree(root); + + // Алгоритм бэктрекинга + List> res = new ArrayList<>(); + backtrack(new ArrayList<>(), Arrays.asList(root), res); + + System.out.println("\nВсе пути от корня к узлу 7, в которых путь не содержит узлов со значением 3"); + for (List path : res) { + List vals = new ArrayList<>(); + for (TreeNode node : path) { + vals.add(node.val); + } + System.out.println(vals); + } + } +} diff --git a/ru/codes/java/chapter_backtracking/subset_sum_i.java b/ru/codes/java/chapter_backtracking/subset_sum_i.java new file mode 100644 index 000000000..b9fe28ff0 --- /dev/null +++ b/ru/codes/java/chapter_backtracking/subset_sum_i.java @@ -0,0 +1,55 @@ +/** + * File: subset_sum_i.java + * Created Time: 2023-06-21 + * Author: krahets (krahets@163.com) + */ + +package chapter_backtracking; + +import java.util.*; + +public class subset_sum_i { + /* Алгоритм бэктрекинга: сумма подмножеств I */ + static void backtrack(List state, int target, int[] choices, int start, List> res) { + // Если сумма подмножества равна target, записать решение + if (target == 0) { + res.add(new ArrayList<>(state)); + return; + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + for (int i = start; i < choices.length; i++) { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if (target - choices[i] < 0) { + break; + } + // Попытка: сделать выбор и обновить target и start + state.add(choices[i]); + // Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.remove(state.size() - 1); + } + } + + /* Решить задачу суммы подмножеств I */ + static List> subsetSumI(int[] nums, int target) { + List state = new ArrayList<>(); // Состояние (подмножество) + Arrays.sort(nums); // Отсортировать nums + int start = 0; // Стартовая вершина обхода + List> res = new ArrayList<>(); // Список результатов (список подмножеств) + backtrack(state, target, nums, start, res); + return res; + } + + public static void main(String[] args) { + int[] nums = { 3, 4, 5 }; + int target = 9; + + List> res = subsetSumI(nums, target); + + System.out.println("Входной массив nums = " + Arrays.toString(nums) + ", target = " + target); + System.out.println("Все подмножества с суммой " + target + ": res = " + res); + } +} diff --git a/ru/codes/java/chapter_backtracking/subset_sum_i_naive.java b/ru/codes/java/chapter_backtracking/subset_sum_i_naive.java new file mode 100644 index 000000000..f08962a77 --- /dev/null +++ b/ru/codes/java/chapter_backtracking/subset_sum_i_naive.java @@ -0,0 +1,53 @@ +/** + * File: subset_sum_i_naive.java + * Created Time: 2023-06-21 + * Author: krahets (krahets@163.com) + */ + +package chapter_backtracking; + +import java.util.*; + +public class subset_sum_i_naive { + /* Алгоритм бэктрекинга: сумма подмножеств I */ + static void backtrack(List state, int target, int total, int[] choices, List> res) { + // Если сумма подмножества равна target, записать решение + if (total == target) { + res.add(new ArrayList<>(state)); + return; + } + // Перебор всех вариантов выбора + for (int i = 0; i < choices.length; i++) { + // Отсечение: если сумма подмножества превышает target, пропустить этот выбор + if (total + choices[i] > target) { + continue; + } + // Попытка: сделать выбор и обновить элемент и total + state.add(choices[i]); + // Перейти к следующему выбору + backtrack(state, target, total + choices[i], choices, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.remove(state.size() - 1); + } + } + + /* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */ + static List> subsetSumINaive(int[] nums, int target) { + List state = new ArrayList<>(); // Состояние (подмножество) + int total = 0; // Сумма подмножеств + List> res = new ArrayList<>(); // Список результатов (список подмножеств) + backtrack(state, target, total, nums, res); + return res; + } + + public static void main(String[] args) { + int[] nums = { 3, 4, 5 }; + int target = 9; + + List> res = subsetSumINaive(nums, target); + + System.out.println("Входной массив nums = " + Arrays.toString(nums) + ", target = " + target); + System.out.println("Все подмножества с суммой " + target + ": res = " + res); + System.out.println("Обратите внимание: результат этого метода содержит повторяющиеся множества"); + } +} diff --git a/ru/codes/java/chapter_backtracking/subset_sum_ii.java b/ru/codes/java/chapter_backtracking/subset_sum_ii.java new file mode 100644 index 000000000..78cf9d1ef --- /dev/null +++ b/ru/codes/java/chapter_backtracking/subset_sum_ii.java @@ -0,0 +1,60 @@ +/** + * File: subset_sum_ii.java + * Created Time: 2023-06-21 + * Author: krahets (krahets@163.com) + */ + +package chapter_backtracking; + +import java.util.*; + +public class subset_sum_ii { + /* Алгоритм бэктрекинга: сумма подмножеств II */ + static void backtrack(List state, int target, int[] choices, int start, List> res) { + // Если сумма подмножества равна target, записать решение + if (target == 0) { + res.add(new ArrayList<>(state)); + return; + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента + for (int i = start; i < choices.length; i++) { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if (target - choices[i] < 0) { + break; + } + // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить + if (i > start && choices[i] == choices[i - 1]) { + continue; + } + // Попытка: сделать выбор и обновить target и start + state.add(choices[i]); + // Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i + 1, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.remove(state.size() - 1); + } + } + + /* Решить задачу суммы подмножеств II */ + static List> subsetSumII(int[] nums, int target) { + List state = new ArrayList<>(); // Состояние (подмножество) + Arrays.sort(nums); // Отсортировать nums + int start = 0; // Стартовая вершина обхода + List> res = new ArrayList<>(); // Список результатов (список подмножеств) + backtrack(state, target, nums, start, res); + return res; + } + + public static void main(String[] args) { + int[] nums = { 4, 4, 5 }; + int target = 9; + + List> res = subsetSumII(nums, target); + + System.out.println("Входной массив nums = " + Arrays.toString(nums) + ", target = " + target); + System.out.println("Все подмножества с суммой " + target + ": res = " + res); + } +} diff --git a/ru/codes/java/chapter_computational_complexity/iteration.java b/ru/codes/java/chapter_computational_complexity/iteration.java new file mode 100644 index 000000000..4abf6a735 --- /dev/null +++ b/ru/codes/java/chapter_computational_complexity/iteration.java @@ -0,0 +1,76 @@ +/** + * File: iteration.java + * Created Time: 2023-08-24 + * Author: krahets (krahets@163.com) + */ + +package chapter_computational_complexity; + +public class iteration { + /* Цикл for */ + static int forLoop(int n) { + int res = 0; + // Циклическое суммирование 1, 2, ..., n-1, n + for (int i = 1; i <= n; i++) { + res += i; + } + return res; + } + + /* Цикл while */ + static int whileLoop(int n) { + int res = 0; + int i = 1; // Инициализация условной переменной + // Циклическое суммирование 1, 2, ..., n-1, n + while (i <= n) { + res += i; + i++; // Обновить условную переменную + } + return res; + } + + /* Цикл while (двойное обновление) */ + static int whileLoopII(int n) { + int res = 0; + int i = 1; // Инициализация условной переменной + // Циклическое суммирование 1, 4, 10, ... + while (i <= n) { + res += i; + // Обновить условную переменную + i++; + i *= 2; + } + return res; + } + + /* Двойной цикл for */ + static String nestedForLoop(int n) { + StringBuilder res = new StringBuilder(); + // Цикл по i = 1, 2, ..., n-1, n + for (int i = 1; i <= n; i++) { + // Цикл по j = 1, 2, ..., n-1, n + for (int j = 1; j <= n; j++) { + res.append("(" + i + ", " + j + "), "); + } + } + return res.toString(); + } + + /* Driver Code */ + public static void main(String[] args) { + int n = 5; + int res; + + res = forLoop(n); + System.out.println("\nРезультат суммирования в цикле for res = " + res); + + res = whileLoop(n); + System.out.println("\nРезультат суммирования в цикле while res = " + res); + + res = whileLoopII(n); + System.out.println("\nРезультат суммирования в цикле while (двойное обновление) res = " + res); + + String resStr = nestedForLoop(n); + System.out.println("\nРезультат обхода в двойном цикле for " + resStr); + } +} diff --git a/ru/codes/java/chapter_computational_complexity/recursion.java b/ru/codes/java/chapter_computational_complexity/recursion.java new file mode 100644 index 000000000..050a6fe10 --- /dev/null +++ b/ru/codes/java/chapter_computational_complexity/recursion.java @@ -0,0 +1,79 @@ +/** + * File: recursion.java + * Created Time: 2023-08-24 + * Author: krahets (krahets@163.com) + */ + +package chapter_computational_complexity; + +import java.util.Stack; + +public class recursion { + /* Рекурсия */ + static int recur(int n) { + // Условие завершения + if (n == 1) + return 1; + // Рекурсия: рекурсивный вызов + int res = recur(n - 1); + // Возврат: вернуть результат + return n + res; + } + + /* Имитация рекурсии итерацией */ + static int forLoopRecur(int n) { + // Использовать явный стек для имитации системного стека вызовов + Stack stack = new Stack<>(); + int res = 0; + // Рекурсия: рекурсивный вызов + for (int i = n; i > 0; i--) { + // Имитировать «рекурсию» с помощью операции помещения в стек + stack.push(i); + } + // Возврат: вернуть результат + while (!stack.isEmpty()) { + // Имитировать «возврат» с помощью операции извлечения из стека + res += stack.pop(); + } + // res = 1+2+3+...+n + return res; + } + + /* Хвостовая рекурсия */ + static int tailRecur(int n, int res) { + // Условие завершения + if (n == 0) + return res; + // Хвостовой рекурсивный вызов + return tailRecur(n - 1, res + n); + } + + /* Последовательность Фибоначчи: рекурсия */ + static int fib(int n) { + // Условие завершения: f(1) = 0, f(2) = 1 + if (n == 1 || n == 2) + return n - 1; + // Рекурсивный вызов f(n) = f(n-1) + f(n-2) + int res = fib(n - 1) + fib(n - 2); + // Вернуть результат f(n) + return res; + } + + /* Driver Code */ + public static void main(String[] args) { + int n = 5; + int res; + + res = recur(n); + System.out.println("\nРезультат суммирования в рекурсивной функции res = " + res); + + res = forLoopRecur(n); + System.out.println("\nРезультат суммирования при имитации рекурсии итерацией res = " + res); + + res = tailRecur(n, 0); + System.out.println("\nРезультат суммирования в хвостовой рекурсии res = " + res); + + res = fib(n); + System.out.println("\nЧлен последовательности Фибоначчи с номером " + n + " = " + res); + } +} diff --git a/ru/codes/java/chapter_computational_complexity/space_complexity.java b/ru/codes/java/chapter_computational_complexity/space_complexity.java new file mode 100644 index 000000000..347bcc64e --- /dev/null +++ b/ru/codes/java/chapter_computational_complexity/space_complexity.java @@ -0,0 +1,110 @@ +/** + * File: space_complexity.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_computational_complexity; + +import utils.*; +import java.util.*; + +public class space_complexity { + /* Функция */ + static int function() { + // Выполнить некоторые операции + return 0; + } + + /* Постоянная сложность */ + static void constant(int n) { + // Константы, переменные и объекты занимают O(1) памяти + final int a = 0; + int b = 0; + int[] nums = new int[10000]; + ListNode node = new ListNode(0); + // Переменные в цикле занимают O(1) памяти + for (int i = 0; i < n; i++) { + int c = 0; + } + // Функции в цикле занимают O(1) памяти + for (int i = 0; i < n; i++) { + function(); + } + } + + /* Линейная сложность */ + static void linear(int n) { + // Массив длины n занимает O(n) памяти + int[] nums = new int[n]; + // Список длины n занимает O(n) памяти + List nodes = new ArrayList<>(); + for (int i = 0; i < n; i++) { + nodes.add(new ListNode(i)); + } + // Хеш-таблица длины n занимает O(n) памяти + Map map = new HashMap<>(); + for (int i = 0; i < n; i++) { + map.put(i, String.valueOf(i)); + } + } + + /* Линейная сложность (рекурсивная реализация) */ + static void linearRecur(int n) { + System.out.println("Рекурсия n = " + n); + if (n == 1) + return; + linearRecur(n - 1); + } + + /* Квадратичная сложность */ + static void quadratic(int n) { + // Матрица занимает O(n^2) памяти + int[][] numMatrix = new int[n][n]; + // Двумерный список занимает O(n^2) памяти + List> numList = new ArrayList<>(); + for (int i = 0; i < n; i++) { + List tmp = new ArrayList<>(); + for (int j = 0; j < n; j++) { + tmp.add(0); + } + numList.add(tmp); + } + } + + /* Квадратичная сложность (рекурсивная реализация) */ + static int quadraticRecur(int n) { + if (n <= 0) + return 0; + // Длина массива nums равна n, n-1, ..., 2, 1 + int[] nums = new int[n]; + System.out.println("В рекурсии n = " + n + ", длина nums = " + nums.length); + return quadraticRecur(n - 1); + } + + /* Экспоненциальная сложность (построение полного двоичного дерева) */ + static TreeNode buildTree(int n) { + if (n == 0) + return null; + TreeNode root = new TreeNode(0); + root.left = buildTree(n - 1); + root.right = buildTree(n - 1); + return root; + } + + /* Driver Code */ + public static void main(String[] args) { + int n = 5; + // Постоянная сложность + constant(n); + // Линейная сложность + linear(n); + linearRecur(n); + // Квадратичная сложность + quadratic(n); + quadraticRecur(n); + // Экспоненциальная сложность + TreeNode root = buildTree(n); + PrintUtil.printTree(root); + } +} diff --git a/ru/codes/java/chapter_computational_complexity/time_complexity.java b/ru/codes/java/chapter_computational_complexity/time_complexity.java new file mode 100644 index 000000000..e9707ccd8 --- /dev/null +++ b/ru/codes/java/chapter_computational_complexity/time_complexity.java @@ -0,0 +1,167 @@ +/** + * File: time_complexity.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_computational_complexity; + +public class time_complexity { + /* Постоянная сложность */ + static int constant(int n) { + int count = 0; + int size = 100000; + for (int i = 0; i < size; i++) + count++; + return count; + } + + /* Линейная сложность */ + static int linear(int n) { + int count = 0; + for (int i = 0; i < n; i++) + count++; + return count; + } + + /* Линейная сложность (обход массива) */ + static int arrayTraversal(int[] nums) { + int count = 0; + // Число итераций пропорционально длине массива + for (int num : nums) { + count++; + } + return count; + } + + /* Квадратичная сложность */ + static int quadratic(int n) { + int count = 0; + // Число итераций квадратично зависит от размера данных n + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + count++; + } + } + return count; + } + + /* Квадратичная сложность (пузырьковая сортировка) */ + static int bubbleSort(int[] nums) { + int count = 0; // Счетчик + // Внешний цикл: неотсортированный диапазон [0, i] + for (int i = nums.length - 1; i > 0; i--) { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (int j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + int tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + count += 3; // Обмен элементов включает 3 элементарные операции + } + } + } + return count; + } + + /* Экспоненциальная сложность (итеративная реализация) */ + static int exponential(int n) { + int count = 0, base = 1; + // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1) + for (int i = 0; i < n; i++) { + for (int j = 0; j < base; j++) { + count++; + } + base *= 2; + } + // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1 + return count; + } + + /* Экспоненциальная сложность (рекурсивная реализация) */ + static int expRecur(int n) { + if (n == 1) + return 1; + return expRecur(n - 1) + expRecur(n - 1) + 1; + } + + /* Логарифмическая сложность (итеративная реализация) */ + static int logarithmic(int n) { + int count = 0; + while (n > 1) { + n = n / 2; + count++; + } + return count; + } + + /* Логарифмическая сложность (рекурсивная реализация) */ + static int logRecur(int n) { + if (n <= 1) + return 0; + return logRecur(n / 2) + 1; + } + + /* Линейно-логарифмическая сложность */ + static int linearLogRecur(int n) { + if (n <= 1) + return 1; + int count = linearLogRecur(n / 2) + linearLogRecur(n / 2); + for (int i = 0; i < n; i++) { + count++; + } + return count; + } + + /* Факториальная сложность (рекурсивная реализация) */ + static int factorialRecur(int n) { + if (n == 0) + return 1; + int count = 0; + // Из одного получается n + for (int i = 0; i < n; i++) { + count += factorialRecur(n - 1); + } + return count; + } + + /* Driver Code */ + public static void main(String[] args) { + // Можно изменить n и запустить программу, чтобы увидеть, как меняется число операций при разных сложностях + int n = 8; + System.out.println("Размер входных данных n = " + n); + + int count = constant(n); + System.out.println("Число операций константной сложности = " + count); + + count = linear(n); + System.out.println("Число операций линейной сложности = " + count); + count = arrayTraversal(new int[n]); + System.out.println("Число операций линейной сложности (обход массива) = " + count); + + count = quadratic(n); + System.out.println("Число операций квадратичной сложности = " + count); + int[] nums = new int[n]; + for (int i = 0; i < n; i++) + nums[i] = n - i; // [n,n-1,...,2,1] + count = bubbleSort(nums); + System.out.println("Число операций квадратичной сложности (пузырьковая сортировка) = " + count); + + count = exponential(n); + System.out.println("Число операций экспоненциальной сложности (итеративная реализация) = " + count); + count = expRecur(n); + System.out.println("Число операций экспоненциальной сложности (рекурсивная реализация) = " + count); + + count = logarithmic(n); + System.out.println("Число операций логарифмической сложности (итеративная реализация) = " + count); + count = logRecur(n); + System.out.println("Число операций логарифмической сложности (рекурсивная реализация) = " + count); + + count = linearLogRecur(n); + System.out.println("Число операций линейно-логарифмической сложности (рекурсивная реализация) = " + count); + + count = factorialRecur(n); + System.out.println("Число операций факториальной сложности (рекурсивная реализация) = " + count); + } +} diff --git a/ru/codes/java/chapter_computational_complexity/worst_best_time_complexity.java b/ru/codes/java/chapter_computational_complexity/worst_best_time_complexity.java new file mode 100644 index 000000000..3dff2614b --- /dev/null +++ b/ru/codes/java/chapter_computational_complexity/worst_best_time_complexity.java @@ -0,0 +1,50 @@ +/** + * File: worst_best_time_complexity.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_computational_complexity; + +import java.util.*; + +public class worst_best_time_complexity { + /* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */ + static int[] randomNumbers(int n) { + Integer[] nums = new Integer[n]; + // Создать массив nums = { 1, 2, 3, ..., n } + for (int i = 0; i < n; i++) { + nums[i] = i + 1; + } + // Случайно перемешать элементы массива + Collections.shuffle(Arrays.asList(nums)); + // Integer[] -> int[] + int[] res = new int[n]; + for (int i = 0; i < n; i++) { + res[i] = nums[i]; + } + return res; + } + + /* Найти индекс числа 1 в массиве nums */ + static int findOne(int[] nums) { + for (int i = 0; i < nums.length; i++) { + // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1) + // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n) + if (nums[i] == 1) + return i; + } + return -1; + } + + /* Driver Code */ + public static void main(String[] args) { + for (int i = 0; i < 10; i++) { + int n = 100; + int[] nums = randomNumbers(n); + int index = findOne(nums); + System.out.println("\nМассив [1, 2, ..., n] после перемешивания = " + Arrays.toString(nums)); + System.out.println("Индекс числа 1 = " + index); + } + } +} diff --git a/ru/codes/java/chapter_divide_and_conquer/binary_search_recur.java b/ru/codes/java/chapter_divide_and_conquer/binary_search_recur.java new file mode 100644 index 000000000..55a2640b9 --- /dev/null +++ b/ru/codes/java/chapter_divide_and_conquer/binary_search_recur.java @@ -0,0 +1,45 @@ +/** + * File: binary_search_recur.java + * Created Time: 2023-07-17 + * Author: krahets (krahets@163.com) + */ + +package chapter_divide_and_conquer; + +public class binary_search_recur { + /* Бинарный поиск: задача f(i, j) */ + static int dfs(int[] nums, int target, int i, int j) { + // Если интервал пуст, целевой элемент отсутствует, вернуть -1 + if (i > j) { + return -1; + } + // Вычислить индекс середины m + int m = (i + j) / 2; + if (nums[m] < target) { + // Рекурсивная подзадача f(m+1, j) + return dfs(nums, target, m + 1, j); + } else if (nums[m] > target) { + // Рекурсивная подзадача f(i, m-1) + return dfs(nums, target, i, m - 1); + } else { + // Целевой элемент найден, вернуть его индекс + return m; + } + } + + /* Бинарный поиск */ + static int binarySearch(int[] nums, int target) { + int n = nums.length; + // Решить задачу f(0, n-1) + return dfs(nums, target, 0, n - 1); + } + + public static void main(String[] args) { + int target = 6; + int[] nums = { 1, 3, 6, 8, 12, 15, 23, 26, 31, 35 }; + + // Бинарный поиск (двусторонне замкнутый интервал) + int index = binarySearch(nums, target); + System.out.println("Индекс целевого элемента 6 = " + index); + } +} diff --git a/ru/codes/java/chapter_divide_and_conquer/build_tree.java b/ru/codes/java/chapter_divide_and_conquer/build_tree.java new file mode 100644 index 000000000..a0faeab3b --- /dev/null +++ b/ru/codes/java/chapter_divide_and_conquer/build_tree.java @@ -0,0 +1,51 @@ +/** + * File: build_tree.java + * Created Time: 2023-07-17 + * Author: krahets (krahets@163.com) + */ + +package chapter_divide_and_conquer; + +import utils.*; +import java.util.*; + +public class build_tree { + /* Построить двоичное дерево: разделяй и властвуй */ + static TreeNode dfs(int[] preorder, Map inorderMap, int i, int l, int r) { + // Завершить при пустом диапазоне поддерева + if (r - l < 0) + return null; + // Инициализировать корневой узел + TreeNode root = new TreeNode(preorder[i]); + // Найти m, чтобы разделить левое и правое поддеревья + int m = inorderMap.get(preorder[i]); + // Подзадача: построить левое поддерево + root.left = dfs(preorder, inorderMap, i + 1, l, m - 1); + // Подзадача: построить правое поддерево + root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r); + // Вернуть корневой узел + return root; + } + + /* Построить двоичное дерево */ + static TreeNode buildTree(int[] preorder, int[] inorder) { + // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам + Map inorderMap = new HashMap<>(); + for (int i = 0; i < inorder.length; i++) { + inorderMap.put(inorder[i], i); + } + TreeNode root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1); + return root; + } + + public static void main(String[] args) { + int[] preorder = { 3, 9, 2, 1, 7 }; + int[] inorder = { 9, 3, 1, 2, 7 }; + System.out.println("Предварительный обход = " + Arrays.toString(preorder)); + System.out.println("Симметричный обход = " + Arrays.toString(inorder)); + + TreeNode root = buildTree(preorder, inorder); + System.out.println("Построенное двоичное дерево:"); + PrintUtil.printTree(root); + } +} diff --git a/ru/codes/java/chapter_divide_and_conquer/hanota.java b/ru/codes/java/chapter_divide_and_conquer/hanota.java new file mode 100644 index 000000000..34b425ce4 --- /dev/null +++ b/ru/codes/java/chapter_divide_and_conquer/hanota.java @@ -0,0 +1,59 @@ +/** + * File: hanota.java + * Created Time: 2023-07-17 + * Author: krahets (krahets@163.com) + */ + +package chapter_divide_and_conquer; + +import java.util.*; + +public class hanota { + /* Переместить один диск */ + static void move(List src, List tar) { + // Снять диск с вершины src + Integer pan = src.remove(src.size() - 1); + // Положить диск на вершину tar + tar.add(pan); + } + + /* Решить задачу Ханойской башни f(i) */ + static void dfs(int i, List src, List buf, List tar) { + // Если в src остался только один диск, сразу переместить его в tar + if (i == 1) { + move(src, tar); + return; + } + // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar + dfs(i - 1, src, tar, buf); + // Подзадача f(1): переместить оставшийся один диск из src в tar + move(src, tar); + // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src + dfs(i - 1, buf, src, tar); + } + + /* Решить задачу Ханойской башни */ + static void solveHanota(List A, List B, List C) { + int n = A.size(); + // Переместить верхние n дисков из A в C с помощью B + dfs(n, A, B, C); + } + + public static void main(String[] args) { + // Хвост списка соответствует вершине столбца + List A = new ArrayList<>(Arrays.asList(5, 4, 3, 2, 1)); + List B = new ArrayList<>(); + List C = new ArrayList<>(); + System.out.println("Исходное состояние:"); + System.out.println("A = " + A); + System.out.println("B = " + B); + System.out.println("C = " + C); + + solveHanota(A, B, C); + + System.out.println("После завершения перемещения дисков:"); + System.out.println("A = " + A); + System.out.println("B = " + B); + System.out.println("C = " + C); + } +} diff --git a/ru/codes/java/chapter_dynamic_programming/climbing_stairs_backtrack.java b/ru/codes/java/chapter_dynamic_programming/climbing_stairs_backtrack.java new file mode 100644 index 000000000..8fad40129 --- /dev/null +++ b/ru/codes/java/chapter_dynamic_programming/climbing_stairs_backtrack.java @@ -0,0 +1,44 @@ +/** + * File: climbing_stairs_backtrack.java + * Created Time: 2023-06-30 + * Author: krahets (krahets@163.com) + */ + +package chapter_dynamic_programming; + +import java.util.*; + +public class climbing_stairs_backtrack { + /* Бэктрекинг */ + public static void backtrack(List choices, int state, int n, List res) { + // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1 + if (state == n) + res.set(0, res.get(0) + 1); + // Перебор всех вариантов выбора + for (Integer choice : choices) { + // Отсечение: нельзя выходить за n-ю ступень + if (state + choice > n) + continue; + // Попытка: сделать выбор и обновить состояние + backtrack(choices, state + choice, n, res); + // Откат + } + } + + /* Подъем по лестнице: бэктрекинг */ + public static int climbingStairsBacktrack(int n) { + List choices = Arrays.asList(1, 2); // Можно подняться на 1 или 2 ступени + int state = 0; // Начать подъем с 0-й ступени + List res = new ArrayList<>(); + res.add(0); // Использовать res[0] для хранения числа решений + backtrack(choices, state, n, res); + return res.get(0); + } + + public static void main(String[] args) { + int n = 9; + + int res = climbingStairsBacktrack(n); + System.out.println(String.format("Количество способов подняться по лестнице из %d ступеней: %d", n, res)); + } +} diff --git a/ru/codes/java/chapter_dynamic_programming/climbing_stairs_constraint_dp.java b/ru/codes/java/chapter_dynamic_programming/climbing_stairs_constraint_dp.java new file mode 100644 index 000000000..c39b9ed9b --- /dev/null +++ b/ru/codes/java/chapter_dynamic_programming/climbing_stairs_constraint_dp.java @@ -0,0 +1,36 @@ +/** + * File: climbing_stairs_constraint_dp.java + * Created Time: 2023-07-01 + * Author: krahets (krahets@163.com) + */ + +package chapter_dynamic_programming; + +public class climbing_stairs_constraint_dp { + /* Подъем по лестнице с ограничениями: динамическое программирование */ + static int climbingStairsConstraintDP(int n) { + if (n == 1 || n == 2) { + return 1; + } + // Инициализация таблицы dp для хранения решений подзадач + int[][] dp = new int[n + 1][3]; + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1][1] = 1; + dp[1][2] = 0; + dp[2][1] = 0; + dp[2][2] = 1; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (int i = 3; i <= n; i++) { + dp[i][1] = dp[i - 1][2]; + dp[i][2] = dp[i - 2][1] + dp[i - 2][2]; + } + return dp[n][1] + dp[n][2]; + } + + public static void main(String[] args) { + int n = 9; + + int res = climbingStairsConstraintDP(n); + System.out.println(String.format("Количество способов подняться по лестнице из %d ступеней: %d", n, res)); + } +} diff --git a/ru/codes/java/chapter_dynamic_programming/climbing_stairs_dfs.java b/ru/codes/java/chapter_dynamic_programming/climbing_stairs_dfs.java new file mode 100644 index 000000000..c0c1cda07 --- /dev/null +++ b/ru/codes/java/chapter_dynamic_programming/climbing_stairs_dfs.java @@ -0,0 +1,31 @@ +/** + * File: climbing_stairs_dfs.java + * Created Time: 2023-06-30 + * Author: krahets (krahets@163.com) + */ + +package chapter_dynamic_programming; + +public class climbing_stairs_dfs { + /* Поиск */ + public static int dfs(int i) { + // dp[1] и dp[2] уже известны, вернуть их + if (i == 1 || i == 2) + return i; + // dp[i] = dp[i-1] + dp[i-2] + int count = dfs(i - 1) + dfs(i - 2); + return count; + } + + /* Подъем по лестнице: поиск */ + public static int climbingStairsDFS(int n) { + return dfs(n); + } + + public static void main(String[] args) { + int n = 9; + + int res = climbingStairsDFS(n); + System.out.println(String.format("Количество способов подняться по лестнице из %d ступеней: %d", n, res)); + } +} diff --git a/ru/codes/java/chapter_dynamic_programming/climbing_stairs_dfs_mem.java b/ru/codes/java/chapter_dynamic_programming/climbing_stairs_dfs_mem.java new file mode 100644 index 000000000..3b1f69816 --- /dev/null +++ b/ru/codes/java/chapter_dynamic_programming/climbing_stairs_dfs_mem.java @@ -0,0 +1,41 @@ +/** + * File: climbing_stairs_dfs_mem.java + * Created Time: 2023-06-30 + * Author: krahets (krahets@163.com) + */ + +package chapter_dynamic_programming; + +import java.util.Arrays; + +public class climbing_stairs_dfs_mem { + /* Поиск с мемоизацией */ + public static int dfs(int i, int[] mem) { + // dp[1] и dp[2] уже известны, вернуть их + if (i == 1 || i == 2) + return i; + // Если запись dp[i] существует, сразу вернуть ее + if (mem[i] != -1) + return mem[i]; + // dp[i] = dp[i-1] + dp[i-2] + int count = dfs(i - 1, mem) + dfs(i - 2, mem); + // Сохранить dp[i] + mem[i] = count; + return count; + } + + /* Подъем по лестнице: поиск с мемоизацией */ + public static int climbingStairsDFSMem(int n) { + // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи + int[] mem = new int[n + 1]; + Arrays.fill(mem, -1); + return dfs(n, mem); + } + + public static void main(String[] args) { + int n = 9; + + int res = climbingStairsDFSMem(n); + System.out.println(String.format("Количество способов подняться по лестнице из %d ступеней: %d", n, res)); + } +} \ No newline at end of file diff --git a/ru/codes/java/chapter_dynamic_programming/climbing_stairs_dp.java b/ru/codes/java/chapter_dynamic_programming/climbing_stairs_dp.java new file mode 100644 index 000000000..3e11a2110 --- /dev/null +++ b/ru/codes/java/chapter_dynamic_programming/climbing_stairs_dp.java @@ -0,0 +1,48 @@ +/** + * File: climbing_stairs_dp.java + * Created Time: 2023-06-30 + * Author: krahets (krahets@163.com) + */ + +package chapter_dynamic_programming; + +public class climbing_stairs_dp { + /* Подъем по лестнице: динамическое программирование */ + public static int climbingStairsDP(int n) { + if (n == 1 || n == 2) + return n; + // Инициализация таблицы dp для хранения решений подзадач + int[] dp = new int[n + 1]; + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = 1; + dp[2] = 2; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (int i = 3; i <= n; i++) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + return dp[n]; + } + + /* Подъем по лестнице: динамическое программирование с оптимизацией памяти */ + public static int climbingStairsDPComp(int n) { + if (n == 1 || n == 2) + return n; + int a = 1, b = 2; + for (int i = 3; i <= n; i++) { + int tmp = b; + b = a + b; + a = tmp; + } + return b; + } + + public static void main(String[] args) { + int n = 9; + + int res = climbingStairsDP(n); + System.out.println(String.format("Количество способов подняться по лестнице из %d ступеней: %d", n, res)); + + res = climbingStairsDPComp(n); + System.out.println(String.format("Количество способов подняться по лестнице из %d ступеней: %d", n, res)); + } +} diff --git a/ru/codes/java/chapter_dynamic_programming/coin_change.java b/ru/codes/java/chapter_dynamic_programming/coin_change.java new file mode 100644 index 000000000..ce8f3d4dd --- /dev/null +++ b/ru/codes/java/chapter_dynamic_programming/coin_change.java @@ -0,0 +1,72 @@ +/** + * File: coin_change.java + * Created Time: 2023-07-11 + * Author: krahets (krahets@163.com) + */ + +package chapter_dynamic_programming; + +import java.util.Arrays; + +public class coin_change { + /* Размен монет: динамическое программирование */ + static int coinChangeDP(int[] coins, int amt) { + int n = coins.length; + int MAX = amt + 1; + // Инициализация таблицы dp + int[][] dp = new int[n + 1][amt + 1]; + // Переход состояний: первая строка и первый столбец + for (int a = 1; a <= amt; a++) { + dp[0][a] = MAX; + } + // Переход состояний: остальные строки и столбцы + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1); + } + } + } + return dp[n][amt] != MAX ? dp[n][amt] : -1; + } + + /* Размен монет: динамическое программирование с оптимизацией памяти */ + static int coinChangeDPComp(int[] coins, int amt) { + int n = coins.length; + int MAX = amt + 1; + // Инициализация таблицы dp + int[] dp = new int[amt + 1]; + Arrays.fill(dp, MAX); + dp[0] = 0; + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1); + } + } + } + return dp[amt] != MAX ? dp[amt] : -1; + } + + public static void main(String[] args) { + int[] coins = { 1, 2, 5 }; + int amt = 4; + + // Динамическое программирование + int res = coinChangeDP(coins, amt); + System.out.println("Минимальное число монет для набора целевой суммы = " + res); + + // Динамическое программирование с оптимизацией памяти + res = coinChangeDPComp(coins, amt); + System.out.println("Минимальное число монет для набора целевой суммы = " + res); + } +} diff --git a/ru/codes/java/chapter_dynamic_programming/coin_change_ii.java b/ru/codes/java/chapter_dynamic_programming/coin_change_ii.java new file mode 100644 index 000000000..b772cb770 --- /dev/null +++ b/ru/codes/java/chapter_dynamic_programming/coin_change_ii.java @@ -0,0 +1,67 @@ +/** + * File: coin_change_ii.java + * Created Time: 2023-07-11 + * Author: krahets (krahets@163.com) + */ + +package chapter_dynamic_programming; + +public class coin_change_ii { + /* Размен монет II: динамическое программирование */ + static int coinChangeIIDP(int[] coins, int amt) { + int n = coins.length; + // Инициализация таблицы dp + int[][] dp = new int[n + 1][amt + 1]; + // Инициализация первого столбца + for (int i = 0; i <= n; i++) { + dp[i][0] = 1; + } + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a]; + } else { + // Сумма двух решений: не брать или взять монету i + dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]; + } + } + } + return dp[n][amt]; + } + + /* Размен монет II: динамическое программирование с оптимизацией памяти */ + static int coinChangeIIDPComp(int[] coins, int amt) { + int n = coins.length; + // Инициализация таблицы dp + int[] dp = new int[amt + 1]; + dp[0] = 1; + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Сумма двух решений: не брать или взять монету i + dp[a] = dp[a] + dp[a - coins[i - 1]]; + } + } + } + return dp[amt]; + } + + public static void main(String[] args) { + int[] coins = { 1, 2, 5 }; + int amt = 5; + + // Динамическое программирование + int res = coinChangeIIDP(coins, amt); + System.out.println("Количество комбинаций монет для набора целевой суммы = " + res); + + // Динамическое программирование с оптимизацией памяти + res = coinChangeIIDPComp(coins, amt); + System.out.println("Количество комбинаций монет для набора целевой суммы = " + res); + } +} diff --git a/ru/codes/java/chapter_dynamic_programming/edit_distance.java b/ru/codes/java/chapter_dynamic_programming/edit_distance.java new file mode 100644 index 000000000..fb665218c --- /dev/null +++ b/ru/codes/java/chapter_dynamic_programming/edit_distance.java @@ -0,0 +1,139 @@ +/** + * File: edit_distance.java + * Created Time: 2023-07-13 + * Author: krahets (krahets@163.com) + */ + +package chapter_dynamic_programming; + +import java.util.Arrays; + +public class edit_distance { + /* Редакционное расстояние: полный перебор */ + static int editDistanceDFS(String s, String t, int i, int j) { + // Если s и t пусты, вернуть 0 + if (i == 0 && j == 0) + return 0; + // Если s пусто, вернуть длину t + if (i == 0) + return j; + // Если t пусто, вернуть длину s + if (j == 0) + return i; + // Если два символа равны, сразу пропустить их + if (s.charAt(i - 1) == t.charAt(j - 1)) + return editDistanceDFS(s, t, i - 1, j - 1); + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + int insert = editDistanceDFS(s, t, i, j - 1); + int delete = editDistanceDFS(s, t, i - 1, j); + int replace = editDistanceDFS(s, t, i - 1, j - 1); + // Вернуть минимальное число шагов редактирования + return Math.min(Math.min(insert, delete), replace) + 1; + } + + /* Редакционное расстояние: поиск с мемоизацией */ + static int editDistanceDFSMem(String s, String t, int[][] mem, int i, int j) { + // Если s и t пусты, вернуть 0 + if (i == 0 && j == 0) + return 0; + // Если s пусто, вернуть длину t + if (i == 0) + return j; + // Если t пусто, вернуть длину s + if (j == 0) + return i; + // Если запись уже есть, сразу вернуть ее + if (mem[i][j] != -1) + return mem[i][j]; + // Если два символа равны, сразу пропустить их + if (s.charAt(i - 1) == t.charAt(j - 1)) + return editDistanceDFSMem(s, t, mem, i - 1, j - 1); + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + int insert = editDistanceDFSMem(s, t, mem, i, j - 1); + int delete = editDistanceDFSMem(s, t, mem, i - 1, j); + int replace = editDistanceDFSMem(s, t, mem, i - 1, j - 1); + // Сохранить и вернуть минимальное число шагов редактирования + mem[i][j] = Math.min(Math.min(insert, delete), replace) + 1; + return mem[i][j]; + } + + /* Редакционное расстояние: динамическое программирование */ + static int editDistanceDP(String s, String t) { + int n = s.length(), m = t.length(); + int[][] dp = new int[n + 1][m + 1]; + // Переход состояний: первая строка и первый столбец + for (int i = 1; i <= n; i++) { + dp[i][0] = i; + } + for (int j = 1; j <= m; j++) { + dp[0][j] = j; + } + // Переход состояний: остальные строки и столбцы + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= m; j++) { + if (s.charAt(i - 1) == t.charAt(j - 1)) { + // Если два символа равны, сразу пропустить их + dp[i][j] = dp[i - 1][j - 1]; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1; + } + } + } + return dp[n][m]; + } + + /* Редакционное расстояние: динамическое программирование с оптимизацией памяти */ + static int editDistanceDPComp(String s, String t) { + int n = s.length(), m = t.length(); + int[] dp = new int[m + 1]; + // Переход состояний: первая строка + for (int j = 1; j <= m; j++) { + dp[j] = j; + } + // Переход состояний: остальные строки + for (int i = 1; i <= n; i++) { + // Переход состояний: первый столбец + int leftup = dp[0]; // Временно сохранить dp[i-1, j-1] + dp[0] = i; + // Переход состояний: остальные столбцы + for (int j = 1; j <= m; j++) { + int temp = dp[j]; + if (s.charAt(i - 1) == t.charAt(j - 1)) { + // Если два символа равны, сразу пропустить их + dp[j] = leftup; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[j] = Math.min(Math.min(dp[j - 1], dp[j]), leftup) + 1; + } + leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации + } + } + return dp[m]; + } + + public static void main(String[] args) { + String s = "bag"; + String t = "pack"; + int n = s.length(), m = t.length(); + + // Полный перебор + int res = editDistanceDFS(s, t, n, m); + System.out.println("Чтобы преобразовать " + s + " в " + t + ", нужно минимум " + res + " шагов"); + + // Поиск с мемоизацией + int[][] mem = new int[n + 1][m + 1]; + for (int[] row : mem) + Arrays.fill(row, -1); + res = editDistanceDFSMem(s, t, mem, n, m); + System.out.println("Чтобы преобразовать " + s + " в " + t + ", нужно минимум " + res + " шагов"); + + // Динамическое программирование + res = editDistanceDP(s, t); + System.out.println("Чтобы преобразовать " + s + " в " + t + ", нужно минимум " + res + " шагов"); + + // Динамическое программирование с оптимизацией памяти + res = editDistanceDPComp(s, t); + System.out.println("Чтобы преобразовать " + s + " в " + t + ", нужно минимум " + res + " шагов"); + } +} diff --git a/ru/codes/java/chapter_dynamic_programming/knapsack.java b/ru/codes/java/chapter_dynamic_programming/knapsack.java new file mode 100644 index 000000000..b76b2e015 --- /dev/null +++ b/ru/codes/java/chapter_dynamic_programming/knapsack.java @@ -0,0 +1,116 @@ +/** + * File: knapsack.java + * Created Time: 2023-07-10 + * Author: krahets (krahets@163.com) + */ + +package chapter_dynamic_programming; + +import java.util.Arrays; + +public class knapsack { + + /* Рюкзак 0-1: полный перебор */ + static int knapsackDFS(int[] wgt, int[] val, int i, int c) { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i == 0 || c == 0) { + return 0; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (wgt[i - 1] > c) { + return knapsackDFS(wgt, val, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + int no = knapsackDFS(wgt, val, i - 1, c); + int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]; + // Вернуть вариант с большей стоимостью из двух возможных + return Math.max(no, yes); + } + + /* Рюкзак 0-1: поиск с мемоизацией */ + static int knapsackDFSMem(int[] wgt, int[] val, int[][] mem, int i, int c) { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i == 0 || c == 0) { + return 0; + } + // Если запись уже есть, вернуть сразу + if (mem[i][c] != -1) { + return mem[i][c]; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (wgt[i - 1] > c) { + return knapsackDFSMem(wgt, val, mem, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + int no = knapsackDFSMem(wgt, val, mem, i - 1, c); + int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]; + // Сохранить и вернуть вариант с большей стоимостью из двух решений + mem[i][c] = Math.max(no, yes); + return mem[i][c]; + } + + /* Рюкзак 0-1: динамическое программирование */ + static int knapsackDP(int[] wgt, int[] val, int cap) { + int n = wgt.length; + // Инициализация таблицы dp + int[][] dp = new int[n + 1][cap + 1]; + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = Math.max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[n][cap]; + } + + /* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */ + static int knapsackDPComp(int[] wgt, int[] val, int cap) { + int n = wgt.length; + // Инициализация таблицы dp + int[] dp = new int[cap + 1]; + // Переход состояний + for (int i = 1; i <= n; i++) { + // Обход в обратном порядке + for (int c = cap; c >= 1; c--) { + if (wgt[i - 1] <= c) { + // Большее из двух решений: не брать или взять предмет i + dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[cap]; + } + + public static void main(String[] args) { + int[] wgt = { 10, 20, 30, 40, 50 }; + int[] val = { 50, 120, 150, 210, 240 }; + int cap = 50; + int n = wgt.length; + + // Полный перебор + int res = knapsackDFS(wgt, val, n, cap); + System.out.println("Максимальная стоимость предметов без превышения вместимости рюкзака = " + res); + + // Поиск с мемоизацией + int[][] mem = new int[n + 1][cap + 1]; + for (int[] row : mem) { + Arrays.fill(row, -1); + } + res = knapsackDFSMem(wgt, val, mem, n, cap); + System.out.println("Максимальная стоимость предметов без превышения вместимости рюкзака = " + res); + + // Динамическое программирование + res = knapsackDP(wgt, val, cap); + System.out.println("Максимальная стоимость предметов без превышения вместимости рюкзака = " + res); + + // Динамическое программирование с оптимизацией памяти + res = knapsackDPComp(wgt, val, cap); + System.out.println("Максимальная стоимость предметов без превышения вместимости рюкзака = " + res); + } +} diff --git a/ru/codes/java/chapter_dynamic_programming/min_cost_climbing_stairs_dp.java b/ru/codes/java/chapter_dynamic_programming/min_cost_climbing_stairs_dp.java new file mode 100644 index 000000000..8354c0916 --- /dev/null +++ b/ru/codes/java/chapter_dynamic_programming/min_cost_climbing_stairs_dp.java @@ -0,0 +1,53 @@ +/** + * File: min_cost_climbing_stairs_dp.java + * Created Time: 2023-06-30 + * Author: krahets (krahets@163.com) + */ + +package chapter_dynamic_programming; + +import java.util.Arrays; + +public class min_cost_climbing_stairs_dp { + /* Минимальная стоимость подъема по лестнице: динамическое программирование */ + public static int minCostClimbingStairsDP(int[] cost) { + int n = cost.length - 1; + if (n == 1 || n == 2) + return cost[n]; + // Инициализация таблицы dp для хранения решений подзадач + int[] dp = new int[n + 1]; + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = cost[1]; + dp[2] = cost[2]; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (int i = 3; i <= n; i++) { + dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i]; + } + return dp[n]; + } + + /* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */ + public static int minCostClimbingStairsDPComp(int[] cost) { + int n = cost.length - 1; + if (n == 1 || n == 2) + return cost[n]; + int a = cost[1], b = cost[2]; + for (int i = 3; i <= n; i++) { + int tmp = b; + b = Math.min(a, tmp) + cost[i]; + a = tmp; + } + return b; + } + + public static void main(String[] args) { + int[] cost = { 0, 1, 10, 1, 1, 1, 10, 1, 1, 10, 1 }; + System.out.println(String.format("Список стоимостей ступеней = %s", Arrays.toString(cost))); + + int res = minCostClimbingStairsDP(cost); + System.out.println(String.format("Минимальная стоимость подъема по лестнице = %d", res)); + + res = minCostClimbingStairsDPComp(cost); + System.out.println(String.format("Минимальная стоимость подъема по лестнице = %d", res)); + } +} diff --git a/ru/codes/java/chapter_dynamic_programming/min_path_sum.java b/ru/codes/java/chapter_dynamic_programming/min_path_sum.java new file mode 100644 index 000000000..e2ecdee32 --- /dev/null +++ b/ru/codes/java/chapter_dynamic_programming/min_path_sum.java @@ -0,0 +1,125 @@ +/** + * File: min_path_sum.java + * Created Time: 2023-07-10 + * Author: krahets (krahets@163.com) + */ + +package chapter_dynamic_programming; + +import java.util.Arrays; + +public class min_path_sum { + /* Минимальная сумма пути: полный перебор */ + static int minPathSumDFS(int[][] grid, int i, int j) { + // Если это верхняя левая ячейка, завершить поиск + if (i == 0 && j == 0) { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 || j < 0) { + return Integer.MAX_VALUE; + } + // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1) + int up = minPathSumDFS(grid, i - 1, j); + int left = minPathSumDFS(grid, i, j - 1); + // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + return Math.min(left, up) + grid[i][j]; + } + + /* Минимальная сумма пути: поиск с мемоизацией */ + static int minPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) { + // Если это верхняя левая ячейка, завершить поиск + if (i == 0 && j == 0) { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 || j < 0) { + return Integer.MAX_VALUE; + } + // Если запись уже есть, вернуть сразу + if (mem[i][j] != -1) { + return mem[i][j]; + } + // Минимальная стоимость пути для левой и верхней ячеек + int up = minPathSumDFSMem(grid, mem, i - 1, j); + int left = minPathSumDFSMem(grid, mem, i, j - 1); + // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + mem[i][j] = Math.min(left, up) + grid[i][j]; + return mem[i][j]; + } + + /* Минимальная сумма пути: динамическое программирование */ + static int minPathSumDP(int[][] grid) { + int n = grid.length, m = grid[0].length; + // Инициализация таблицы dp + int[][] dp = new int[n][m]; + dp[0][0] = grid[0][0]; + // Переход состояний: первая строка + for (int j = 1; j < m; j++) { + dp[0][j] = dp[0][j - 1] + grid[0][j]; + } + // Переход состояний: первый столбец + for (int i = 1; i < n; i++) { + dp[i][0] = dp[i - 1][0] + grid[i][0]; + } + // Переход состояний: остальные строки и столбцы + for (int i = 1; i < n; i++) { + for (int j = 1; j < m; j++) { + dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]; + } + } + return dp[n - 1][m - 1]; + } + + /* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */ + static int minPathSumDPComp(int[][] grid) { + int n = grid.length, m = grid[0].length; + // Инициализация таблицы dp + int[] dp = new int[m]; + // Переход состояний: первая строка + dp[0] = grid[0][0]; + for (int j = 1; j < m; j++) { + dp[j] = dp[j - 1] + grid[0][j]; + } + // Переход состояний: остальные строки + for (int i = 1; i < n; i++) { + // Переход состояний: первый столбец + dp[0] = dp[0] + grid[i][0]; + // Переход состояний: остальные столбцы + for (int j = 1; j < m; j++) { + dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j]; + } + } + return dp[m - 1]; + } + + public static void main(String[] args) { + int[][] grid = { + { 1, 3, 1, 5 }, + { 2, 2, 4, 2 }, + { 5, 3, 2, 1 }, + { 4, 3, 5, 2 } + }; + int n = grid.length, m = grid[0].length; + + // Полный перебор + int res = minPathSumDFS(grid, n - 1, m - 1); + System.out.println("Минимальная сумма пути из левого верхнего угла в правый нижний = " + res); + + // Поиск с мемоизацией + int[][] mem = new int[n][m]; + for (int[] row : mem) { + Arrays.fill(row, -1); + } + res = minPathSumDFSMem(grid, mem, n - 1, m - 1); + System.out.println("Минимальная сумма пути из левого верхнего угла в правый нижний = " + res); + + // Динамическое программирование + res = minPathSumDP(grid); + System.out.println("Минимальная сумма пути из левого верхнего угла в правый нижний = " + res); + + // Динамическое программирование с оптимизацией памяти + res = minPathSumDPComp(grid); + System.out.println("Минимальная сумма пути из левого верхнего угла в правый нижний = " + res); + } +} diff --git a/ru/codes/java/chapter_dynamic_programming/unbounded_knapsack.java b/ru/codes/java/chapter_dynamic_programming/unbounded_knapsack.java new file mode 100644 index 000000000..d926e7f79 --- /dev/null +++ b/ru/codes/java/chapter_dynamic_programming/unbounded_knapsack.java @@ -0,0 +1,63 @@ +/** + * File: unbounded_knapsack.java + * Created Time: 2023-07-11 + * Author: krahets (krahets@163.com) + */ + +package chapter_dynamic_programming; + +public class unbounded_knapsack { + /* Полный рюкзак: динамическое программирование */ + static int unboundedKnapsackDP(int[] wgt, int[] val, int cap) { + int n = wgt.length; + // Инициализация таблицы dp + int[][] dp = new int[n + 1][cap + 1]; + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = Math.max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[n][cap]; + } + + /* Полный рюкзак: динамическое программирование с оптимизацией памяти */ + static int unboundedKnapsackDPComp(int[] wgt, int[] val, int cap) { + int n = wgt.length; + // Инициализация таблицы dp + int[] dp = new int[cap + 1]; + // Переход состояний + for (int i = 1; i <= n; i++) { + for (int c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[cap]; + } + + public static void main(String[] args) { + int[] wgt = { 1, 2, 3 }; + int[] val = { 5, 11, 15 }; + int cap = 4; + + // Динамическое программирование + int res = unboundedKnapsackDP(wgt, val, cap); + System.out.println("Максимальная стоимость предметов без превышения вместимости рюкзака = " + res); + + // Динамическое программирование с оптимизацией памяти + res = unboundedKnapsackDPComp(wgt, val, cap); + System.out.println("Максимальная стоимость предметов без превышения вместимости рюкзака = " + res); + } +} diff --git a/ru/codes/java/chapter_graph/graph_adjacency_list.java b/ru/codes/java/chapter_graph/graph_adjacency_list.java new file mode 100644 index 000000000..622f64a29 --- /dev/null +++ b/ru/codes/java/chapter_graph/graph_adjacency_list.java @@ -0,0 +1,117 @@ +/** + * File: graph_adjacency_list.java + * Created Time: 2023-01-26 + * Author: krahets (krahets@163.com) + */ + +package chapter_graph; + +import java.util.*; +import utils.*; + +/* Класс неориентированного графа на основе списка смежности */ +class GraphAdjList { + // Список смежности, где key — вершина, а value — все смежные ей вершины + Map> adjList; + + /* Конструктор */ + public GraphAdjList(Vertex[][] edges) { + this.adjList = new HashMap<>(); + // Добавить все вершины и ребра + for (Vertex[] edge : edges) { + addVertex(edge[0]); + addVertex(edge[1]); + addEdge(edge[0], edge[1]); + } + } + + /* Получить число вершин */ + public int size() { + return adjList.size(); + } + + /* Добавление ребра */ + public void addEdge(Vertex vet1, Vertex vet2) { + if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2) + throw new IllegalArgumentException(); + // Добавить ребро vet1 - vet2 + adjList.get(vet1).add(vet2); + adjList.get(vet2).add(vet1); + } + + /* Удаление ребра */ + public void removeEdge(Vertex vet1, Vertex vet2) { + if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2) + throw new IllegalArgumentException(); + // Удалить ребро vet1 - vet2 + adjList.get(vet1).remove(vet2); + adjList.get(vet2).remove(vet1); + } + + /* Добавление вершины */ + public void addVertex(Vertex vet) { + if (adjList.containsKey(vet)) + return; + // Добавить новый список в список смежности + adjList.put(vet, new ArrayList<>()); + } + + /* Удаление вершины */ + public void removeVertex(Vertex vet) { + if (!adjList.containsKey(vet)) + throw new IllegalArgumentException(); + // Удалить из списка смежности список, соответствующий вершине vet + adjList.remove(vet); + // Обойти списки других вершин и удалить все ребра, содержащие vet + for (List list : adjList.values()) { + list.remove(vet); + } + } + + /* Вывести список смежности */ + public void print() { + System.out.println("Список смежности ="); + for (Map.Entry> pair : adjList.entrySet()) { + List tmp = new ArrayList<>(); + for (Vertex vertex : pair.getValue()) + tmp.add(vertex.val); + System.out.println(pair.getKey().val + ": " + tmp + ","); + } + } +} + +public class graph_adjacency_list { + public static void main(String[] args) { + /* Инициализация неориентированного графа */ + Vertex[] v = Vertex.valsToVets(new int[] { 1, 3, 2, 5, 4 }); + Vertex[][] 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] } }; + GraphAdjList graph = new GraphAdjList(edges); + System.out.println("\nГраф после инициализации"); + graph.print(); + + /* Добавление ребра */ + // Вершины 1 и 2 соответствуют v[0] и v[2] + graph.addEdge(v[0], v[2]); + System.out.println("\nГраф после добавления ребра 1-2"); + graph.print(); + + /* Удаление ребра */ + // Вершины 1 и 3 соответствуют v[0] и v[1] + graph.removeEdge(v[0], v[1]); + System.out.println("\nГраф после удаления ребра 1-3"); + graph.print(); + + /* Добавление вершины */ + Vertex v5 = new Vertex(6); + graph.addVertex(v5); + System.out.println("\nГраф после добавления вершины 6"); + graph.print(); + + /* Удаление вершины */ + // Вершина 3 соответствует v[1] + graph.removeVertex(v[1]); + System.out.println("\nГраф после удаления вершины 3"); + graph.print(); + } +} diff --git a/ru/codes/java/chapter_graph/graph_adjacency_matrix.java b/ru/codes/java/chapter_graph/graph_adjacency_matrix.java new file mode 100644 index 000000000..aefaafc71 --- /dev/null +++ b/ru/codes/java/chapter_graph/graph_adjacency_matrix.java @@ -0,0 +1,131 @@ +/** + * File: graph_adjacency_matrix.java + * Created Time: 2023-01-26 + * Author: krahets (krahets@163.com) + */ + +package chapter_graph; + +import utils.*; +import java.util.*; + +/* Класс неориентированного графа на основе матрицы смежности */ +class GraphAdjMat { + List vertices; // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин» + List> adjMat; // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин» + + /* Конструктор */ + public GraphAdjMat(int[] vertices, int[][] edges) { + this.vertices = new ArrayList<>(); + this.adjMat = new ArrayList<>(); + // Добавление вершины + for (int val : vertices) { + addVertex(val); + } + // Добавить ребра + // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices + for (int[] e : edges) { + addEdge(e[0], e[1]); + } + } + + /* Получить число вершин */ + public int size() { + return vertices.size(); + } + + /* Добавление вершины */ + public void addVertex(int val) { + int n = size(); + // Добавить значение новой вершины в список вершин + vertices.add(val); + // Добавить строку в матрицу смежности + List newRow = new ArrayList<>(n); + for (int j = 0; j < n; j++) { + newRow.add(0); + } + adjMat.add(newRow); + // Добавить столбец в матрицу смежности + for (List row : adjMat) { + row.add(0); + } + } + + /* Удаление вершины */ + public void removeVertex(int index) { + if (index >= size()) + throw new IndexOutOfBoundsException(); + // Удалить вершину с индексом index из списка вершин + vertices.remove(index); + // Удалить строку с индексом index из матрицы смежности + adjMat.remove(index); + // Удалить столбец с индексом index из матрицы смежности + for (List row : adjMat) { + row.remove(index); + } + } + + /* Добавление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + public void addEdge(int i, int j) { + // Обработка выхода индекса за границы и случая равенства + if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) + throw new IndexOutOfBoundsException(); + // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i) + adjMat.get(i).set(j, 1); + adjMat.get(j).set(i, 1); + } + + /* Удаление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + public void removeEdge(int i, int j) { + // Обработка выхода индекса за границы и случая равенства + if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) + throw new IndexOutOfBoundsException(); + adjMat.get(i).set(j, 0); + adjMat.get(j).set(i, 0); + } + + /* Вывести матрицу смежности */ + public void print() { + System.out.print("Список вершин = "); + System.out.println(vertices); + System.out.println("Матрица смежности ="); + PrintUtil.printMatrix(adjMat); + } +} + +public class graph_adjacency_matrix { + public static void main(String[] args) { + /* Инициализация неориентированного графа */ + // Обратите внимание: элементы edges представляют индексы вершин, то есть соответствуют индексам элементов vertices + int[] vertices = { 1, 3, 2, 5, 4 }; + int[][] edges = { { 0, 1 }, { 0, 3 }, { 1, 2 }, { 2, 3 }, { 2, 4 }, { 3, 4 } }; + GraphAdjMat graph = new GraphAdjMat(vertices, edges); + System.out.println("\nГраф после инициализации"); + graph.print(); + + /* Добавление ребра */ + // Индексы вершин 1 и 2 равны 0 и 2 соответственно + graph.addEdge(0, 2); + System.out.println("\nГраф после добавления ребра 1-2"); + graph.print(); + + /* Удаление ребра */ + // Индексы вершин 1 и 3 равны 0 и 1 соответственно + graph.removeEdge(0, 1); + System.out.println("\nГраф после удаления ребра 1-3"); + graph.print(); + + /* Добавление вершины */ + graph.addVertex(6); + System.out.println("\nГраф после добавления вершины 6"); + graph.print(); + + /* Удаление вершины */ + // Индекс вершины 3 равен 1 + graph.removeVertex(1); + System.out.println("\nГраф после удаления вершины 3"); + graph.print(); + } +} diff --git a/ru/codes/java/chapter_graph/graph_bfs.java b/ru/codes/java/chapter_graph/graph_bfs.java new file mode 100644 index 000000000..f06b29ed9 --- /dev/null +++ b/ru/codes/java/chapter_graph/graph_bfs.java @@ -0,0 +1,55 @@ +/** + * File: graph_bfs.java + * Created Time: 2023-02-12 + * Author: krahets (krahets@163.com) + */ + +package chapter_graph; + +import java.util.*; +import utils.*; + +public class graph_bfs { + /* Обход в ширину */ + // Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины + static List graphBFS(GraphAdjList graph, Vertex startVet) { + // Последовательность обхода вершин + List res = new ArrayList<>(); + // Хеш-множество для хранения уже посещенных вершин + Set visited = new HashSet<>(); + visited.add(startVet); + // Очередь используется для реализации BFS + Queue que = new LinkedList<>(); + que.offer(startVet); + // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины + while (!que.isEmpty()) { + Vertex vet = que.poll(); // Извлечь головную вершину из очереди + res.add(vet); // Отметить посещенную вершину + // Обойти все смежные вершины данной вершины + for (Vertex adjVet : graph.adjList.get(vet)) { + if (visited.contains(adjVet)) + continue; // Пропустить уже посещенную вершину + que.offer(adjVet); // Помещать в очередь только непосещенные вершины + visited.add(adjVet); // Отметить эту вершину как посещенную + } + } + // Вернуть последовательность обхода вершин + return res; + } + + public static void main(String[] args) { + /* Инициализация неориентированного графа */ + Vertex[] v = Vertex.valsToVets(new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }); + Vertex[][] 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] } }; + GraphAdjList graph = new GraphAdjList(edges); + System.out.println("\nГраф после инициализации"); + graph.print(); + + /* Обход в ширину */ + List res = graphBFS(graph, v[0]); + System.out.println("\nПоследовательность вершин при обходе в ширину (BFS)"); + System.out.println(Vertex.vetsToVals(res)); + } +} diff --git a/ru/codes/java/chapter_graph/graph_dfs.java b/ru/codes/java/chapter_graph/graph_dfs.java new file mode 100644 index 000000000..4ac3ba949 --- /dev/null +++ b/ru/codes/java/chapter_graph/graph_dfs.java @@ -0,0 +1,51 @@ +/** + * File: graph_dfs.java + * Created Time: 2023-02-12 + * Author: krahets (krahets@163.com) + */ + +package chapter_graph; + +import java.util.*; +import utils.*; + +public class graph_dfs { + /* Вспомогательная функция обхода в глубину */ + static void dfs(GraphAdjList graph, Set visited, List res, Vertex vet) { + res.add(vet); // Отметить посещенную вершину + visited.add(vet); // Отметить эту вершину как посещенную + // Обойти все смежные вершины данной вершины + for (Vertex adjVet : graph.adjList.get(vet)) { + if (visited.contains(adjVet)) + continue; // Пропустить уже посещенную вершину + // Рекурсивно обходить смежные вершины + dfs(graph, visited, res, adjVet); + } + } + + /* Обход в глубину */ + // Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины + static List graphDFS(GraphAdjList graph, Vertex startVet) { + // Последовательность обхода вершин + List res = new ArrayList<>(); + // Хеш-множество для хранения уже посещенных вершин + Set visited = new HashSet<>(); + dfs(graph, visited, res, startVet); + return res; + } + + public static void main(String[] args) { + /* Инициализация неориентированного графа */ + Vertex[] v = Vertex.valsToVets(new int[] { 0, 1, 2, 3, 4, 5, 6 }); + Vertex[][] 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] } }; + GraphAdjList graph = new GraphAdjList(edges); + System.out.println("\nГраф после инициализации"); + graph.print(); + + /* Обход в глубину */ + List res = graphDFS(graph, v[0]); + System.out.println("\nПоследовательность вершин при обходе в глубину (DFS)"); + System.out.println(Vertex.vetsToVals(res)); + } +} diff --git a/ru/codes/java/chapter_greedy/coin_change_greedy.java b/ru/codes/java/chapter_greedy/coin_change_greedy.java new file mode 100644 index 000000000..97d3e2e85 --- /dev/null +++ b/ru/codes/java/chapter_greedy/coin_change_greedy.java @@ -0,0 +1,55 @@ +/** + * File: coin_change_greedy.java + * Created Time: 2023-07-20 + * Author: krahets (krahets@163.com) + */ + +package chapter_greedy; + +import java.util.Arrays; + +public class coin_change_greedy { + /* Размен монет: жадный алгоритм */ + static int coinChangeGreedy(int[] coins, int amt) { + // Предположить, что список coins упорядочен + int i = coins.length - 1; + int count = 0; + // Циклически выполнять жадный выбор, пока не останется суммы + while (amt > 0) { + // Найти монету, которая меньше остатка суммы и наиболее к нему близка + while (i > 0 && coins[i] > amt) { + i--; + } + // Выбрать coins[i] + amt -= coins[i]; + count++; + } + // Если допустимое решение не найдено, вернуть -1 + return amt == 0 ? count : -1; + } + + public static void main(String[] args) { + // Жадный подход: гарантирует нахождение глобально оптимального решения + int[] coins = { 1, 5, 10, 20, 50, 100 }; + int amt = 186; + int res = coinChangeGreedy(coins, amt); + System.out.println("\ncoins = " + Arrays.toString(coins) + ", amt = " + amt); + System.out.println("Минимальное число монет для набора суммы " + amt + " = " + res); + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = new int[] { 1, 20, 50 }; + amt = 60; + res = coinChangeGreedy(coins, amt); + System.out.println("\ncoins = " + Arrays.toString(coins) + ", amt = " + amt); + System.out.println("Минимальное число монет для набора суммы " + amt + " = " + res); + System.out.println("На самом деле минимум равен 3: 20 + 20 + 20"); + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = new int[] { 1, 49, 50 }; + amt = 98; + res = coinChangeGreedy(coins, amt); + System.out.println("\ncoins = " + Arrays.toString(coins) + ", amt = " + amt); + System.out.println("Минимальное число монет для набора суммы " + amt + " = " + res); + System.out.println("На самом деле минимум равен 2: 49 + 49"); + } +} diff --git a/ru/codes/java/chapter_greedy/fractional_knapsack.java b/ru/codes/java/chapter_greedy/fractional_knapsack.java new file mode 100644 index 000000000..ef1278c21 --- /dev/null +++ b/ru/codes/java/chapter_greedy/fractional_knapsack.java @@ -0,0 +1,59 @@ +/** + * File: fractional_knapsack.java + * Created Time: 2023-07-20 + * Author: krahets (krahets@163.com) + */ + +package chapter_greedy; + +import java.util.Arrays; +import java.util.Comparator; + +/* Предмет */ +class Item { + int w; // Вес предмета + int v; // Стоимость предмета + + public Item(int w, int v) { + this.w = w; + this.v = v; + } +} + +public class fractional_knapsack { + /* Дробный рюкзак: жадный алгоритм */ + static double fractionalKnapsack(int[] wgt, int[] val, int cap) { + // Создать список предметов с двумя свойствами: вес и стоимость + Item[] items = new Item[wgt.length]; + for (int i = 0; i < wgt.length; i++) { + items[i] = new Item(wgt[i], val[i]); + } + // Отсортировать по удельной стоимости item.v / item.w в порядке убывания + Arrays.sort(items, Comparator.comparingDouble(item -> -((double) item.v / item.w))); + // Циклический жадный выбор + double res = 0; + for (Item item : items) { + if (item.w <= cap) { + // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком + res += item.v; + cap -= item.w; + } else { + // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета + res += (double) item.v / item.w * cap; + // Свободной вместимости больше не осталось, поэтому выйти из цикла + break; + } + } + return res; + } + + public static void main(String[] args) { + int[] wgt = { 10, 20, 30, 40, 50 }; + int[] val = { 50, 120, 150, 210, 240 }; + int cap = 50; + + // Жадный алгоритм + double res = fractionalKnapsack(wgt, val, cap); + System.out.println("Максимальная стоимость предметов без превышения вместимости рюкзака = " + res); + } +} diff --git a/ru/codes/java/chapter_greedy/max_capacity.java b/ru/codes/java/chapter_greedy/max_capacity.java new file mode 100644 index 000000000..ba49a1405 --- /dev/null +++ b/ru/codes/java/chapter_greedy/max_capacity.java @@ -0,0 +1,38 @@ +/** + * File: max_capacity.java + * Created Time: 2023-07-21 + * Author: krahets (krahets@163.com) + */ + +package chapter_greedy; + +public class max_capacity { + /* Максимальная вместимость: жадный алгоритм */ + static int maxCapacity(int[] ht) { + // Инициализировать i и j так, чтобы они располагались по двум концам массива + int i = 0, j = ht.length - 1; + // Начальная максимальная вместимость равна 0 + int res = 0; + // Выполнять жадный выбор в цикле, пока две доски не встретятся + while (i < j) { + // Обновить максимальную вместимость + int cap = Math.min(ht[i], ht[j]) * (j - i); + res = Math.max(res, cap); + // Сдвигать внутрь более короткую сторону + if (ht[i] < ht[j]) { + i++; + } else { + j--; + } + } + return res; + } + + public static void main(String[] args) { + int[] ht = { 3, 8, 5, 2, 7, 7, 3, 4 }; + + // Жадный алгоритм + int res = maxCapacity(ht); + System.out.println("Максимальная вместимость = " + res); + } +} diff --git a/ru/codes/java/chapter_greedy/max_product_cutting.java b/ru/codes/java/chapter_greedy/max_product_cutting.java new file mode 100644 index 000000000..e4cb1deb1 --- /dev/null +++ b/ru/codes/java/chapter_greedy/max_product_cutting.java @@ -0,0 +1,40 @@ +/** + * File: max_product_cutting.java + * Created Time: 2023-07-21 + * Author: krahets (krahets@163.com) + */ + +package chapter_greedy; + +import java.lang.Math; + +public class max_product_cutting { + /* Максимальное произведение разрезания: жадный алгоритм */ + public static int maxProductCutting(int n) { + // Когда n <= 3, обязательно нужно выделить одну 1 + if (n <= 3) { + return 1 * (n - 1); + } + // Жадно выделить множители 3, где a — число троек, а b — остаток + int a = n / 3; + int b = n % 3; + if (b == 1) { + // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2 + return (int) Math.pow(3, a - 1) * 2 * 2; + } + if (b == 2) { + // Если остаток равен 2, ничего не делать + return (int) Math.pow(3, a) * 2; + } + // Если остаток равен 0, ничего не делать + return (int) Math.pow(3, a); + } + + public static void main(String[] args) { + int n = 58; + + // Жадный алгоритм + int res = maxProductCutting(n); + System.out.println("Максимальное произведение после разрезания = " + res); + } +} diff --git a/ru/codes/java/chapter_hashing/array_hash_map.java b/ru/codes/java/chapter_hashing/array_hash_map.java new file mode 100644 index 000000000..3596c2e14 --- /dev/null +++ b/ru/codes/java/chapter_hashing/array_hash_map.java @@ -0,0 +1,141 @@ +/** + * File: array_hash_map.java + * Created Time: 2022-12-04 + * Author: krahets (krahets@163.com) + */ + +package chapter_hashing; + +import java.util.*; + +/* Пара ключ-значение */ +class Pair { + public int key; + public String val; + + public Pair(int key, String val) { + this.key = key; + this.val = val; + } +} + +/* Хеш-таблица на основе массива */ +class ArrayHashMap { + private List buckets; + + public ArrayHashMap() { + // Инициализировать массив, содержащий 100 корзин + buckets = new ArrayList<>(); + for (int i = 0; i < 100; i++) { + buckets.add(null); + } + } + + /* Хеш-функция */ + private int hashFunc(int key) { + int index = key % 100; + return index; + } + + /* Операция поиска */ + public String get(int key) { + int index = hashFunc(key); + Pair pair = buckets.get(index); + if (pair == null) + return null; + return pair.val; + } + + /* Операция добавления */ + public void put(int key, String val) { + Pair pair = new Pair(key, val); + int index = hashFunc(key); + buckets.set(index, pair); + } + + /* Операция удаления */ + public void remove(int key) { + int index = hashFunc(key); + // Присвоить null, что означает удаление + buckets.set(index, null); + } + + /* Получить все пары ключ-значение */ + public List pairSet() { + List pairSet = new ArrayList<>(); + for (Pair pair : buckets) { + if (pair != null) + pairSet.add(pair); + } + return pairSet; + } + + /* Получить все ключи */ + public List keySet() { + List keySet = new ArrayList<>(); + for (Pair pair : buckets) { + if (pair != null) + keySet.add(pair.key); + } + return keySet; + } + + /* Получить все значения */ + public List valueSet() { + List valueSet = new ArrayList<>(); + for (Pair pair : buckets) { + if (pair != null) + valueSet.add(pair.val); + } + return valueSet; + } + + /* Вывести хеш-таблицу */ + public void print() { + for (Pair kv : pairSet()) { + System.out.println(kv.key + " -> " + kv.val); + } + } +} + +public class array_hash_map { + public static void main(String[] args) { + /* Инициализация хеш-таблицы */ + ArrayHashMap map = new ArrayHashMap(); + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.put(12836, "Сяо Ха"); + map.put(15937, "Сяо Ло"); + map.put(16750, "Сяо Суань"); + map.put(13276, "Сяо Фа"); + map.put(10583, "Сяо Я"); + System.out.println("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение"); + map.print(); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + String name = map.get(15937); + System.out.println("\nДля номера 15937 найдено имя " + name); + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(10583); + System.out.println("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение"); + map.print(); + + /* Обход хеш-таблицы */ + System.out.println("\nОтдельный обход пар ключ-значение"); + for (Pair kv : map.pairSet()) { + System.out.println(kv.key + " -> " + kv.val); + } + System.out.println("\nОтдельный обход ключей"); + for (int key : map.keySet()) { + System.out.println(key); + } + System.out.println("\nОтдельный обход значений"); + for (String val : map.valueSet()) { + System.out.println(val); + } + } +} diff --git a/ru/codes/java/chapter_hashing/built_in_hash.java b/ru/codes/java/chapter_hashing/built_in_hash.java new file mode 100644 index 000000000..efa17ef98 --- /dev/null +++ b/ru/codes/java/chapter_hashing/built_in_hash.java @@ -0,0 +1,38 @@ +/** + * File: built_in_hash.java + * Created Time: 2023-06-21 + * Author: krahets (krahets@163.com) + */ + +package chapter_hashing; + +import utils.*; +import java.util.*; + +public class built_in_hash { + public static void main(String[] args) { + int num = 3; + int hashNum = Integer.hashCode(num); + System.out.println("Хеш-значение целого числа " + num + " = " + hashNum); + + boolean bol = true; + int hashBol = Boolean.hashCode(bol); + System.out.println("Хеш-значение булева значения " + bol + " = " + hashBol); + + double dec = 3.14159; + int hashDec = Double.hashCode(dec); + System.out.println("Хеш-значение десятичного числа " + dec + " = " + hashDec); + + String str = "Hello Algo"; + int hashStr = str.hashCode(); + System.out.println("Хеш-значение строки " + str + " = " + hashStr); + + Object[] arr = { 12836, "Сяо Ха" }; + int hashTup = Arrays.hashCode(arr); + System.out.println("Хеш-значение массива " + Arrays.toString(arr) + " = " + hashTup); + + ListNode obj = new ListNode(0); + int hashObj = obj.hashCode(); + System.out.println("Хеш-значение объекта узла " + obj + " = " + hashObj); + } +} diff --git a/ru/codes/java/chapter_hashing/hash_map.java b/ru/codes/java/chapter_hashing/hash_map.java new file mode 100644 index 000000000..cec11d78f --- /dev/null +++ b/ru/codes/java/chapter_hashing/hash_map.java @@ -0,0 +1,52 @@ +/** + * File: hash_map.java + * Created Time: 2022-12-04 + * Author: krahets (krahets@163.com) + */ + +package chapter_hashing; + +import java.util.*; +import utils.*; + +public class hash_map { + public static void main(String[] args) { + /* Инициализация хеш-таблицы */ + Map map = new HashMap<>(); + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.put(12836, "Сяо Ха"); + map.put(15937, "Сяо Ло"); + map.put(16750, "Сяо Суань"); + map.put(13276, "Сяо Фа"); + map.put(10583, "Сяо Я"); + System.out.println("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение"); + PrintUtil.printHashMap(map); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + String name = map.get(15937); + System.out.println("\nДля номера 15937 найдено имя " + name); + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(10583); + System.out.println("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение"); + PrintUtil.printHashMap(map); + + /* Обход хеш-таблицы */ + System.out.println("\nОтдельный обход пар ключ-значение"); + for (Map.Entry kv : map.entrySet()) { + System.out.println(kv.getKey() + " -> " + kv.getValue()); + } + System.out.println("\nОтдельный обход ключей"); + for (int key : map.keySet()) { + System.out.println(key); + } + System.out.println("\nОтдельный обход значений"); + for (String val : map.values()) { + System.out.println(val); + } + } +} diff --git a/ru/codes/java/chapter_hashing/hash_map_chaining.java b/ru/codes/java/chapter_hashing/hash_map_chaining.java new file mode 100644 index 000000000..579c59c5a --- /dev/null +++ b/ru/codes/java/chapter_hashing/hash_map_chaining.java @@ -0,0 +1,148 @@ +/** + * File: hash_map_chaining.java + * Created Time: 2023-06-13 + * Author: krahets (krahets@163.com) + */ + +package chapter_hashing; + +import java.util.ArrayList; +import java.util.List; + +/* Хеш-таблица с цепочками */ +class HashMapChaining { + int size; // Число пар ключ-значение + int capacity; // Вместимость хеш-таблицы + double loadThres; // Порог коэффициента загрузки для запуска расширения + int extendRatio; // Коэффициент расширения + List> buckets; // Массив корзин + + /* Конструктор */ + public HashMapChaining() { + size = 0; + capacity = 4; + loadThres = 2.0 / 3.0; + extendRatio = 2; + buckets = new ArrayList<>(capacity); + for (int i = 0; i < capacity; i++) { + buckets.add(new ArrayList<>()); + } + } + + /* Хеш-функция */ + int hashFunc(int key) { + return key % capacity; + } + + /* Коэффициент загрузки */ + double loadFactor() { + return (double) size / capacity; + } + + /* Операция поиска */ + String get(int key) { + int index = hashFunc(key); + List bucket = buckets.get(index); + // Обойти корзину; если найден key, вернуть соответствующее val + for (Pair pair : bucket) { + if (pair.key == key) { + return pair.val; + } + } + // Если key не найден, вернуть null + return null; + } + + /* Операция добавления */ + void put(int key, String val) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if (loadFactor() > loadThres) { + extend(); + } + int index = hashFunc(key); + List bucket = buckets.get(index); + // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть + for (Pair pair : bucket) { + if (pair.key == key) { + pair.val = val; + return; + } + } + // Если такого key нет, добавить пару ключ-значение в конец + Pair pair = new Pair(key, val); + bucket.add(pair); + size++; + } + + /* Операция удаления */ + void remove(int key) { + int index = hashFunc(key); + List bucket = buckets.get(index); + // Обойти корзину и удалить из нее пару ключ-значение + for (Pair pair : bucket) { + if (pair.key == key) { + bucket.remove(pair); + size--; + break; + } + } + } + + /* Расширить хеш-таблицу */ + void extend() { + // Временно сохранить исходную хеш-таблицу + List> bucketsTmp = buckets; + // Инициализация новой хеш-таблицы после расширения + capacity *= extendRatio; + buckets = new ArrayList<>(capacity); + for (int i = 0; i < capacity; i++) { + buckets.add(new ArrayList<>()); + } + size = 0; + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for (List bucket : bucketsTmp) { + for (Pair pair : bucket) { + put(pair.key, pair.val); + } + } + } + + /* Вывести хеш-таблицу */ + void print() { + for (List bucket : buckets) { + List res = new ArrayList<>(); + for (Pair pair : bucket) { + res.add(pair.key + " -> " + pair.val); + } + System.out.println(res); + } + } +} + +public class hash_map_chaining { + public static void main(String[] args) { + /* Инициализация хеш-таблицы */ + HashMapChaining map = new HashMapChaining(); + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.put(12836, "Сяо Ха"); + map.put(15937, "Сяо Ло"); + map.put(16750, "Сяо Суань"); + map.put(13276, "Сяо Фа"); + map.put(10583, "Сяо Я"); + System.out.println("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение"); + map.print(); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + String name = map.get(13276); + System.out.println("\nДля номера 13276 найдено имя " + name); + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(12836); + System.out.println("\nПосле удаления 12836 хеш-таблица имеет вид\nКлюч -> Значение"); + map.print(); + } +} diff --git a/ru/codes/java/chapter_hashing/hash_map_open_addressing.java b/ru/codes/java/chapter_hashing/hash_map_open_addressing.java new file mode 100644 index 000000000..ab2ad5dad --- /dev/null +++ b/ru/codes/java/chapter_hashing/hash_map_open_addressing.java @@ -0,0 +1,158 @@ +/** + * File: hash_map_open_addressing.java + * Created Time: 2023-06-13 + * Author: krahets (krahets@163.com) + */ + +package chapter_hashing; + +/* Хеш-таблица с открытой адресацией */ +class HashMapOpenAddressing { + private int size; // Число пар ключ-значение + private int capacity = 4; // Вместимость хеш-таблицы + private final double loadThres = 2.0 / 3.0; // Порог коэффициента загрузки для запуска расширения + private final int extendRatio = 2; // Коэффициент расширения + private Pair[] buckets; // Массив корзин + private final Pair TOMBSTONE = new Pair(-1, "-1"); // Удалить метку + + /* Конструктор */ + public HashMapOpenAddressing() { + size = 0; + buckets = new Pair[capacity]; + } + + /* Хеш-функция */ + private int hashFunc(int key) { + return key % capacity; + } + + /* Коэффициент загрузки */ + private double loadFactor() { + return (double) size / capacity; + } + + /* Найти индекс корзины, соответствующий key */ + private int findBucket(int key) { + int index = hashFunc(key); + int firstTombstone = -1; + // Выполнять линейное пробирование и завершить при встрече с пустой корзиной + while (buckets[index] != null) { + // Если встретился key, вернуть соответствующий индекс корзины + if (buckets[index].key == key) { + // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс + if (firstTombstone != -1) { + buckets[firstTombstone] = buckets[index]; + buckets[index] = TOMBSTONE; + return firstTombstone; // Вернуть индекс корзины после перемещения + } + return index; // Вернуть индекс корзины + } + // Записать первую встретившуюся метку удаления + if (firstTombstone == -1 && buckets[index] == TOMBSTONE) { + firstTombstone = index; + } + // Вычислить индекс корзины; при выходе за конец вернуться к началу + index = (index + 1) % capacity; + } + // Если key не существует, вернуть индекс точки добавления + return firstTombstone == -1 ? index : firstTombstone; + } + + /* Операция поиска */ + public String get(int key) { + // Найти индекс корзины, соответствующий key + int index = findBucket(key); + // Если пара ключ-значение найдена, вернуть соответствующее val + if (buckets[index] != null && buckets[index] != TOMBSTONE) { + return buckets[index].val; + } + // Если пары ключ-значение не существует, вернуть null + return null; + } + + /* Операция добавления */ + public void put(int key, String val) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if (loadFactor() > loadThres) { + extend(); + } + // Найти индекс корзины, соответствующий key + int index = findBucket(key); + // Если пара ключ-значение найдена, перезаписать val и вернуть + if (buckets[index] != null && buckets[index] != TOMBSTONE) { + buckets[index].val = val; + return; + } + // Если пары ключ-значение нет, добавить ее + buckets[index] = new Pair(key, val); + size++; + } + + /* Операция удаления */ + public void remove(int key) { + // Найти индекс корзины, соответствующий key + int index = findBucket(key); + // Если пара ключ-значение найдена, заменить ее меткой удаления + if (buckets[index] != null && buckets[index] != TOMBSTONE) { + buckets[index] = TOMBSTONE; + size--; + } + } + + /* Расширить хеш-таблицу */ + private void extend() { + // Временно сохранить исходную хеш-таблицу + Pair[] bucketsTmp = buckets; + // Инициализация новой хеш-таблицы после расширения + capacity *= extendRatio; + buckets = new Pair[capacity]; + size = 0; + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for (Pair pair : bucketsTmp) { + if (pair != null && pair != TOMBSTONE) { + put(pair.key, pair.val); + } + } + } + + /* Вывести хеш-таблицу */ + public void print() { + for (Pair pair : buckets) { + if (pair == null) { + System.out.println("null"); + } else if (pair == TOMBSTONE) { + System.out.println("TOMBSTONE"); + } else { + System.out.println(pair.key + " -> " + pair.val); + } + } + } +} + +public class hash_map_open_addressing { + public static void main(String[] args) { + // Инициализация хеш-таблицы + HashMapOpenAddressing hashmap = new HashMapOpenAddressing(); + + // Операция добавления + // Добавить пару (key, val) в хеш-таблицу + hashmap.put(12836, "Сяо Ха"); + hashmap.put(15937, "Сяо Ло"); + hashmap.put(16750, "Сяо Суань"); + hashmap.put(13276, "Сяо Фа"); + hashmap.put(10583, "Сяо Я"); + System.out.println("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение"); + hashmap.print(); + + // Операция поиска + // Передать ключ key в хеш-таблицу и получить значение val + String name = hashmap.get(13276); + System.out.println("\nДля номера 13276 найдено имя " + name); + + // Операция удаления + // Удалить пару (key, val) из хеш-таблицы + hashmap.remove(16750); + System.out.println("\nПосле удаления 16750 хеш-таблица имеет вид\nКлюч -> Значение"); + hashmap.print(); + } +} diff --git a/ru/codes/java/chapter_hashing/simple_hash.java b/ru/codes/java/chapter_hashing/simple_hash.java new file mode 100644 index 000000000..2e5e5c906 --- /dev/null +++ b/ru/codes/java/chapter_hashing/simple_hash.java @@ -0,0 +1,65 @@ +/** + * File: simple_hash.java + * Created Time: 2023-06-21 + * Author: krahets (krahets@163.com) + */ + +package chapter_hashing; + +public class simple_hash { + /* Аддитивное хеширование */ + static int addHash(String key) { + long hash = 0; + final int MODULUS = 1000000007; + for (char c : key.toCharArray()) { + hash = (hash + (int) c) % MODULUS; + } + return (int) hash; + } + + /* Мультипликативное хеширование */ + static int mulHash(String key) { + long hash = 0; + final int MODULUS = 1000000007; + for (char c : key.toCharArray()) { + hash = (31 * hash + (int) c) % MODULUS; + } + return (int) hash; + } + + /* XOR-хеширование */ + static int xorHash(String key) { + int hash = 0; + final int MODULUS = 1000000007; + for (char c : key.toCharArray()) { + hash ^= (int) c; + } + return hash & MODULUS; + } + + /* Хеширование с циклическим сдвигом */ + static int rotHash(String key) { + long hash = 0; + final int MODULUS = 1000000007; + for (char c : key.toCharArray()) { + hash = ((hash << 4) ^ (hash >> 28) ^ (int) c) % MODULUS; + } + return (int) hash; + } + + public static void main(String[] args) { + String key = "Hello Algo"; + + int hash = addHash(key); + System.out.println("Хеш-сумма сложением = " + hash); + + hash = mulHash(key); + System.out.println("Хеш-сумма умножением = " + hash); + + hash = xorHash(key); + System.out.println("Хеш-сумма XOR = " + hash); + + hash = rotHash(key); + System.out.println("Хеш-сумма с циклическим сдвигом = " + hash); + } +} diff --git a/ru/codes/java/chapter_heap/heap.java b/ru/codes/java/chapter_heap/heap.java new file mode 100644 index 000000000..a20409d64 --- /dev/null +++ b/ru/codes/java/chapter_heap/heap.java @@ -0,0 +1,66 @@ +/** + * File: heap.java + * Created Time: 2023-01-07 + * Author: krahets (krahets@163.com) + */ + +package chapter_heap; + +import utils.*; +import java.util.*; + +public class heap { + public static void testPush(Queue heap, int val) { + heap.offer(val); // Добавление элемента в кучу + System.out.format("\nПосле добавления элемента %d в кучу\n", val); + PrintUtil.printHeap(heap); + } + + public static void testPop(Queue heap) { + int val = heap.poll(); // Извлечение элемента с вершины кучи + System.out.format("\nПосле удаления элемента %d с вершины кучи\n", val); + PrintUtil.printHeap(heap); + } + + public static void main(String[] args) { + /* Инициализация кучи */ + // Инициализация минимальной кучи + Queue minHeap = new PriorityQueue<>(); + // Инициализация максимальной кучи (достаточно изменить Comparator с помощью lambda-выражения) + Queue maxHeap = new PriorityQueue<>((a, b) -> b - a); + + System.out.println("\nНиже приведен тестовый пример для max-heap"); + + /* Добавление элемента в кучу */ + testPush(maxHeap, 1); + testPush(maxHeap, 3); + testPush(maxHeap, 2); + testPush(maxHeap, 5); + testPush(maxHeap, 4); + + /* Получение элемента с вершины кучи */ + int peek = maxHeap.peek(); + System.out.format("\nЭлемент на вершине кучи = %d\n", peek); + + /* Извлечение элемента с вершины кучи */ + testPop(maxHeap); + testPop(maxHeap); + testPop(maxHeap); + testPop(maxHeap); + testPop(maxHeap); + + /* Получение размера кучи */ + int size = maxHeap.size(); + System.out.format("\nКоличество элементов в куче = %d\n", size); + + /* Проверка, пуста ли куча */ + boolean isEmpty = maxHeap.isEmpty(); + System.out.format("\nПуста ли куча: %b\n", isEmpty); + + /* Построить кучу по входному списку */ + // Временная сложность равна O(n), а не O(nlogn) + minHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4)); + System.out.println("\nПосле построения min-heap из входного списка"); + PrintUtil.printHeap(minHeap); + } +} diff --git a/ru/codes/java/chapter_heap/my_heap.java b/ru/codes/java/chapter_heap/my_heap.java new file mode 100644 index 000000000..b844e1d74 --- /dev/null +++ b/ru/codes/java/chapter_heap/my_heap.java @@ -0,0 +1,159 @@ +/** + * File: my_heap.java + * Created Time: 2023-01-07 + * Author: krahets (krahets@163.com) + */ + +package chapter_heap; + +import utils.*; +import java.util.*; + +/* Максимальная куча */ +class MaxHeap { + // Использовать список вместо массива, чтобы не учитывать проблему расширения + private List maxHeap; + + /* Конструктор, строящий кучу по входному списку */ + public MaxHeap(List nums) { + // Добавить элементы списка в кучу без изменений + maxHeap = new ArrayList<>(nums); + // Выполнить heapify для всех узлов, кроме листовых + for (int i = parent(size() - 1); i >= 0; i--) { + siftDown(i); + } + } + + /* Получить индекс левого дочернего узла */ + private int left(int i) { + return 2 * i + 1; + } + + /* Получить индекс правого дочернего узла */ + private int right(int i) { + return 2 * i + 2; + } + + /* Получить индекс родительского узла */ + private int parent(int i) { + return (i - 1) / 2; // Округление вниз при делении + } + + /* Поменять элементы местами */ + private void swap(int i, int j) { + int tmp = maxHeap.get(i); + maxHeap.set(i, maxHeap.get(j)); + maxHeap.set(j, tmp); + } + + /* Получение размера кучи */ + public int size() { + return maxHeap.size(); + } + + /* Проверка, пуста ли куча */ + public boolean isEmpty() { + return size() == 0; + } + + /* Доступ к элементу на вершине кучи */ + public int peek() { + return maxHeap.get(0); + } + + /* Добавление элемента в кучу */ + public void push(int val) { + // Добавление узла + maxHeap.add(val); + // Просеивание снизу вверх + siftUp(size() - 1); + } + + /* Начиная с узла i, выполнить просеивание снизу вверх */ + private void siftUp(int i) { + while (true) { + // Получение родительского узла для узла i + int p = parent(i); + // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления» + if (p < 0 || maxHeap.get(i) <= maxHeap.get(p)) + break; + // Поменять два узла местами + swap(i, p); + // Циклическое просеивание вверх + i = p; + } + } + + /* Извлечение элемента из кучи */ + public int pop() { + // Обработка пустого случая + if (isEmpty()) + throw new IndexOutOfBoundsException(); + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + swap(0, size() - 1); + // Удаление узла + int val = maxHeap.remove(size() - 1); + // Просеивание сверху вниз + siftDown(0); + // Вернуть элемент с вершины кучи + return val; + } + + /* Начиная с узла i, выполнить просеивание сверху вниз */ + private void siftDown(int i) { + while (true) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + int l = left(i), r = right(i), ma = i; + if (l < size() && maxHeap.get(l) > maxHeap.get(ma)) + ma = l; + if (r < size() && maxHeap.get(r) > maxHeap.get(ma)) + ma = r; + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (ma == i) + break; + // Поменять два узла местами + swap(i, ma); + // Циклическое просеивание вниз + i = ma; + } + } + + /* Вывести кучу (двоичное дерево) */ + public void print() { + Queue queue = new PriorityQueue<>((a, b) -> { return b - a; }); + queue.addAll(maxHeap); + PrintUtil.printHeap(queue); + } +} + +public class my_heap { + public static void main(String[] args) { + /* Инициализация максимальной кучи */ + MaxHeap maxHeap = new MaxHeap(Arrays.asList(9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2)); + System.out.println("\nПосле построения кучи из входного списка"); + maxHeap.print(); + + /* Получение элемента с вершины кучи */ + int peek = maxHeap.peek(); + System.out.format("\nЭлемент на вершине кучи = %d\n", peek); + + /* Добавление элемента в кучу */ + int val = 7; + maxHeap.push(val); + System.out.format("\nПосле добавления элемента %d в кучу\n", val); + maxHeap.print(); + + /* Извлечение элемента с вершины кучи */ + peek = maxHeap.pop(); + System.out.format("\nПосле удаления элемента %d с вершины кучи\n", peek); + maxHeap.print(); + + /* Получение размера кучи */ + int size = maxHeap.size(); + System.out.format("\nКоличество элементов в куче = %d\n", size); + + /* Проверка, пуста ли куча */ + boolean isEmpty = maxHeap.isEmpty(); + System.out.format("\nПуста ли куча: %b\n", isEmpty); + } +} diff --git a/ru/codes/java/chapter_heap/top_k.java b/ru/codes/java/chapter_heap/top_k.java new file mode 100644 index 000000000..33d022958 --- /dev/null +++ b/ru/codes/java/chapter_heap/top_k.java @@ -0,0 +1,40 @@ +/** + * File: top_k.java + * Created Time: 2023-06-12 + * Author: krahets (krahets@163.com) + */ + +package chapter_heap; + +import utils.*; +import java.util.*; + +public class top_k { + /* Найти k наибольших элементов массива с помощью кучи */ + static Queue topKHeap(int[] nums, int k) { + // Инициализация минимальной кучи + Queue heap = new PriorityQueue(); + // Поместить первые k элементов массива в кучу + for (int i = 0; i < k; i++) { + heap.offer(nums[i]); + } + // Начиная с элемента k+1, поддерживать длину кучи равной k + for (int i = k; i < nums.length; i++) { + // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу + if (nums[i] > heap.peek()) { + heap.poll(); + heap.offer(nums[i]); + } + } + return heap; + } + + public static void main(String[] args) { + int[] nums = { 1, 7, 6, 3, 2 }; + int k = 3; + + Queue res = topKHeap(nums, k); + System.out.println("Наибольшие " + k + " элементов"); + PrintUtil.printHeap(res); + } +} diff --git a/ru/codes/java/chapter_searching/binary_search.java b/ru/codes/java/chapter_searching/binary_search.java new file mode 100644 index 000000000..dbf2d2bd0 --- /dev/null +++ b/ru/codes/java/chapter_searching/binary_search.java @@ -0,0 +1,58 @@ +/** + * File: binary_search.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_searching; + +public class binary_search { + /* Бинарный поиск (двусторонне замкнутый интервал) */ + static int binarySearch(int[] nums, int target) { + // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно + int i = 0, j = nums.length - 1; + // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст) + while (i <= j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) // Это означает, что target находится в интервале [m+1, j] + i = m + 1; + else if (nums[m] > target) // Это означает, что target находится в интервале [i, m-1] + j = m - 1; + else // Целевой элемент найден, вернуть его индекс + return m; + } + // Целевой элемент не найден, вернуть -1 + return -1; + } + + /* Бинарный поиск (лево замкнутый, право открытый интервал) */ + static int binarySearchLCRO(int[] nums, int target) { + // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно + int i = 0, j = nums.length; + // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст) + while (i < j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) // Это означает, что target находится в интервале [m+1, j) + i = m + 1; + else if (nums[m] > target) // Это означает, что target находится в интервале [i, m) + j = m; + else // Целевой элемент найден, вернуть его индекс + return m; + } + // Целевой элемент не найден, вернуть -1 + return -1; + } + + public static void main(String[] args) { + int target = 6; + int[] nums = { 1, 3, 6, 8, 12, 15, 23, 26, 31, 35 }; + + /* Бинарный поиск (двусторонне замкнутый интервал) */ + int index = binarySearch(nums, target); + System.out.println("Индекс целевого элемента 6 = " + index); + + /* Бинарный поиск (лево замкнутый, право открытый интервал) */ + index = binarySearchLCRO(nums, target); + System.out.println("Индекс целевого элемента 6 = " + index); + } +} diff --git a/ru/codes/java/chapter_searching/binary_search_edge.java b/ru/codes/java/chapter_searching/binary_search_edge.java new file mode 100644 index 000000000..5faec635b --- /dev/null +++ b/ru/codes/java/chapter_searching/binary_search_edge.java @@ -0,0 +1,49 @@ +/** + * File: binary_search_edge.java + * Created Time: 2023-08-04 + * Author: krahets (krahets@163.com) + */ + +package chapter_searching; + +public class binary_search_edge { + /* Бинарный поиск самого левого target */ + static int binarySearchLeftEdge(int[] nums, int target) { + // Эквивалентно поиску точки вставки target + int i = binary_search_insertion.binarySearchInsertion(nums, target); + // target не найден, вернуть -1 + if (i == nums.length || nums[i] != target) { + return -1; + } + // Найти target и вернуть индекс i + return i; + } + + /* Бинарный поиск самого правого target */ + static int binarySearchRightEdge(int[] nums, int target) { + // Преобразовать задачу в поиск самого левого target + 1 + int i = binary_search_insertion.binarySearchInsertion(nums, target + 1); + // j указывает на самый правый target, а i — на первый элемент больше target + int j = i - 1; + // target не найден, вернуть -1 + if (j == -1 || nums[j] != target) { + return -1; + } + // Найти target и вернуть индекс j + return j; + } + + public static void main(String[] args) { + // Массив с повторяющимися элементами + int[] nums = { 1, 3, 6, 6, 6, 6, 6, 10, 12, 15 }; + System.out.println("\nМассив nums = " + java.util.Arrays.toString(nums)); + + // Бинарный поиск левой и правой границы + for (int target : new int[] { 6, 7 }) { + int index = binarySearchLeftEdge(nums, target); + System.out.println("Индекс самого левого элемента " + target + " равен " + index); + index = binarySearchRightEdge(nums, target); + System.out.println("Индекс самого правого элемента " + target + " равен " + index); + } + } +} diff --git a/ru/codes/java/chapter_searching/binary_search_insertion.java b/ru/codes/java/chapter_searching/binary_search_insertion.java new file mode 100644 index 000000000..e358c8c06 --- /dev/null +++ b/ru/codes/java/chapter_searching/binary_search_insertion.java @@ -0,0 +1,63 @@ +/** + * File: binary_search_insertion.java + * Created Time: 2023-08-04 + * Author: krahets (krahets@163.com) + */ + +package chapter_searching; + +class binary_search_insertion { + /* Бинарный поиск точки вставки (без повторяющихся элементов) */ + static int binarySearchInsertionSimple(int[] nums, int target) { + int i = 0, j = nums.length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) { + i = m + 1; // target находится в интервале [m+1, j] + } else if (nums[m] > target) { + j = m - 1; // target находится в интервале [i, m-1] + } else { + return m; // Найти target и вернуть точку вставки m + } + } + // target не найден, вернуть точку вставки i + return i; + } + + /* Бинарный поиск точки вставки (с повторяющимися элементами) */ + static int binarySearchInsertion(int[] nums, int target) { + int i = 0, j = nums.length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + int m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums[m] < target) { + i = m + 1; // target находится в интервале [m+1, j] + } else if (nums[m] > target) { + j = m - 1; // target находится в интервале [i, m-1] + } else { + j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1] + } + } + // Вернуть точку вставки i + return i; + } + + public static void main(String[] args) { + // Массив без повторяющихся элементов + int[] nums = { 1, 3, 6, 8, 12, 15, 23, 26, 31, 35 }; + System.out.println("\nМассив nums = " + java.util.Arrays.toString(nums)); + // Бинарный поиск точки вставки + for (int target : new int[] { 6, 9 }) { + int index = binarySearchInsertionSimple(nums, target); + System.out.println("Индекс позиции вставки элемента " + target + " равен " + index); + } + + // Массив с повторяющимися элементами + nums = new int[] { 1, 3, 6, 6, 6, 6, 6, 10, 12, 15 }; + System.out.println("\nМассив nums = " + java.util.Arrays.toString(nums)); + // Бинарный поиск точки вставки + for (int target : new int[] { 2, 6, 20 }) { + int index = binarySearchInsertion(nums, target); + System.out.println("Индекс позиции вставки элемента " + target + " равен " + index); + } + } +} diff --git a/ru/codes/java/chapter_searching/hashing_search.java b/ru/codes/java/chapter_searching/hashing_search.java new file mode 100644 index 000000000..9362cf12c --- /dev/null +++ b/ru/codes/java/chapter_searching/hashing_search.java @@ -0,0 +1,51 @@ +/** + * File: hashing_search.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_searching; + +import utils.*; +import java.util.*; + +public class hashing_search { + /* Хеш-поиск (массив) */ + static int hashingSearchArray(Map map, int target) { + // key хеш-таблицы: целевой элемент, value: индекс + // Если такого key нет в хеш-таблице, вернуть -1 + return map.getOrDefault(target, -1); + } + + /* Хеш-поиск (связный список) */ + static ListNode hashingSearchLinkedList(Map map, int target) { + // key хеш-таблицы: значение целевого узла, value: объект узла + // Если такого key нет в хеш-таблице, вернуть null + return map.getOrDefault(target, null); + } + + public static void main(String[] args) { + int target = 3; + + /* Хеш-поиск (массив) */ + int[] nums = { 1, 5, 3, 2, 4, 7, 5, 9, 10, 8 }; + // Инициализация хеш-таблицы + Map map = new HashMap<>(); + for (int i = 0; i < nums.length; i++) { + map.put(nums[i], i); // key: элемент, value: индекс + } + int index = hashingSearchArray(map, target); + System.out.println("Индекс целевого элемента 3 = " + index); + + /* Хеш-поиск (связный список) */ + ListNode head = ListNode.arrToLinkedList(nums); + // Инициализация хеш-таблицы + Map map1 = new HashMap<>(); + while (head != null) { + map1.put(head.val, head); // key: значение узла, value: узел + head = head.next; + } + ListNode node = hashingSearchLinkedList(map1, target); + System.out.println("Объект узла со значением 3 = " + node); + } +} diff --git a/ru/codes/java/chapter_searching/linear_search.java b/ru/codes/java/chapter_searching/linear_search.java new file mode 100644 index 000000000..59b6c0778 --- /dev/null +++ b/ru/codes/java/chapter_searching/linear_search.java @@ -0,0 +1,50 @@ +/** + * File: linear_search.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_searching; + +import utils.*; + +public class linear_search { + /* Линейный поиск (массив) */ + static int linearSearchArray(int[] nums, int target) { + // Обход массива + for (int i = 0; i < nums.length; i++) { + // Целевой элемент найден, вернуть его индекс + if (nums[i] == target) + return i; + } + // Целевой элемент не найден, вернуть -1 + return -1; + } + + /* Линейный поиск (связный список) */ + static ListNode linearSearchLinkedList(ListNode head, int target) { + // Обойти связный список + while (head != null) { + // Найти целевой узел и вернуть его + if (head.val == target) + return head; + head = head.next; + } + // Целевой узел не найден, вернуть null + return null; + } + + public static void main(String[] args) { + int target = 3; + + /* Выполнить линейный поиск в массиве */ + int[] nums = { 1, 5, 3, 2, 4, 7, 5, 9, 10, 8 }; + int index = linearSearchArray(nums, target); + System.out.println("Индекс целевого элемента 3 = " + index); + + /* Выполнить линейный поиск в связном списке */ + ListNode head = ListNode.arrToLinkedList(nums); + ListNode node = linearSearchLinkedList(head, target); + System.out.println("Объект узла со значением 3 = " + node); + } +} diff --git a/ru/codes/java/chapter_searching/two_sum.java b/ru/codes/java/chapter_searching/two_sum.java new file mode 100644 index 000000000..5a8df3ad9 --- /dev/null +++ b/ru/codes/java/chapter_searching/two_sum.java @@ -0,0 +1,53 @@ +/** + * File: two_sum.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_searching; + +import java.util.*; + +public class two_sum { + /* Метод 1: полный перебор */ + static int[] twoSumBruteForce(int[] nums, int target) { + int size = nums.length; + // Два вложенных цикла, временная сложность O(n^2) + for (int i = 0; i < size - 1; i++) { + for (int j = i + 1; j < size; j++) { + if (nums[i] + nums[j] == target) + return new int[] { i, j }; + } + } + return new int[0]; + } + + /* Метод 2: вспомогательная хеш-таблица */ + static int[] twoSumHashTable(int[] nums, int target) { + int size = nums.length; + // Вспомогательная хеш-таблица, пространственная сложность O(n) + Map dic = new HashMap<>(); + // Один цикл, временная сложность O(n) + for (int i = 0; i < size; i++) { + if (dic.containsKey(target - nums[i])) { + return new int[] { dic.get(target - nums[i]), i }; + } + dic.put(nums[i], i); + } + return new int[0]; + } + + public static void main(String[] args) { + // ======= Test Case ======= + int[] nums = { 2, 7, 11, 15 }; + int target = 13; + + // ====== Основной код ====== + // Метод 1 + int[] res = twoSumBruteForce(nums, target); + System.out.println("Результат метода 1 res = " + Arrays.toString(res)); + // Метод 2 + res = twoSumHashTable(nums, target); + System.out.println("Результат метода 2 res = " + Arrays.toString(res)); + } +} diff --git a/ru/codes/java/chapter_sorting/bubble_sort.java b/ru/codes/java/chapter_sorting/bubble_sort.java new file mode 100644 index 000000000..f4668af94 --- /dev/null +++ b/ru/codes/java/chapter_sorting/bubble_sort.java @@ -0,0 +1,57 @@ +/** + * File: bubble_sort.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_sorting; + +import java.util.*; + +public class bubble_sort { + /* Пузырьковая сортировка */ + static void bubbleSort(int[] nums) { + // Внешний цикл: неотсортированный диапазон [0, i] + for (int i = nums.length - 1; i > 0; i--) { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (int j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + int tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + } + } + } + } + + /* Пузырьковая сортировка (оптимизация флагом) */ + static void bubbleSortWithFlag(int[] nums) { + // Внешний цикл: неотсортированный диапазон [0, i] + for (int i = nums.length - 1; i > 0; i--) { + boolean flag = false; // Инициализировать флаг + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (int j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + int tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + flag = true; // Записать обмен элементов + } + } + if (!flag) + break; // На этой итерации «всплытия» не было ни одного обмена, сразу выйти + } + } + + public static void main(String[] args) { + int[] nums = { 4, 1, 3, 1, 5, 2 }; + bubbleSort(nums); + System.out.println("После пузырьковой сортировки nums = " + Arrays.toString(nums)); + + int[] nums1 = { 4, 1, 3, 1, 5, 2 }; + bubbleSortWithFlag(nums1); + System.out.println("После пузырьковой сортировки nums1 = " + Arrays.toString(nums1)); + } +} diff --git a/ru/codes/java/chapter_sorting/bucket_sort.java b/ru/codes/java/chapter_sorting/bucket_sort.java new file mode 100644 index 000000000..10e70f654 --- /dev/null +++ b/ru/codes/java/chapter_sorting/bucket_sort.java @@ -0,0 +1,47 @@ +/** + * File: bucket_sort.java + * Created Time: 2023-03-17 + * Author: krahets (krahets@163.com) + */ + +package chapter_sorting; + +import java.util.*; + +public class bucket_sort { + /* Сортировка корзинами */ + static void bucketSort(float[] nums) { + // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину + int k = nums.length / 2; + List> buckets = new ArrayList<>(); + for (int i = 0; i < k; i++) { + buckets.add(new ArrayList<>()); + } + // 1. Распределить элементы массива по корзинам + for (float num : nums) { + // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1] + int i = (int) (num * k); + // Добавить num в корзину i + buckets.get(i).add(num); + } + // 2. Выполнить сортировку внутри каждой корзины + for (List bucket : buckets) { + // Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки + Collections.sort(bucket); + } + // 3. Обойти корзины и объединить результаты + int i = 0; + for (List bucket : buckets) { + for (float num : bucket) { + nums[i++] = num; + } + } + } + + public static void main(String[] args) { + // Пусть входные данные — числа с плавающей точкой из диапазона [0, 1) + float[] nums = { 0.49f, 0.96f, 0.82f, 0.09f, 0.57f, 0.43f, 0.91f, 0.75f, 0.15f, 0.37f }; + bucketSort(nums); + System.out.println("После сортировки корзинами nums = " + Arrays.toString(nums)); + } +} diff --git a/ru/codes/java/chapter_sorting/counting_sort.java b/ru/codes/java/chapter_sorting/counting_sort.java new file mode 100644 index 000000000..dc60f3159 --- /dev/null +++ b/ru/codes/java/chapter_sorting/counting_sort.java @@ -0,0 +1,78 @@ +/** + * File: counting_sort.java + * Created Time: 2023-03-17 + * Author: krahets (krahets@163.com) + */ + +package chapter_sorting; + +import java.util.*; + +public class counting_sort { + /* Сортировка подсчетом */ + // Простая реализация, не подходит для сортировки объектов + static void countingSortNaive(int[] nums) { + // 1. Найти максимальный элемент массива m + int m = 0; + for (int num : nums) { + m = Math.max(m, num); + } + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + int[] counter = new int[m + 1]; + for (int num : nums) { + counter[num]++; + } + // 3. Обойти counter и заполнить исходный массив nums элементами + int i = 0; + for (int num = 0; num < m + 1; num++) { + for (int j = 0; j < counter[num]; j++, i++) { + nums[i] = num; + } + } + } + + /* Сортировка подсчетом */ + // Полная реализация, позволяет сортировать объекты и является стабильной сортировкой + static void countingSort(int[] nums) { + // 1. Найти максимальный элемент массива m + int m = 0; + for (int num : nums) { + m = Math.max(m, num); + } + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + int[] counter = new int[m + 1]; + for (int num : nums) { + counter[num]++; + } + // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс» + // То есть counter[num]-1 — это индекс последнего появления num в res + for (int i = 0; i < m; i++) { + counter[i + 1] += counter[i]; + } + // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res + // Инициализировать массив res для хранения результата + int n = nums.length; + int[] res = new int[n]; + for (int i = n - 1; i >= 0; i--) { + int num = nums[i]; + res[counter[num] - 1] = num; // Поместить num по соответствующему индексу + counter[num]--; // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num + } + // Перезаписать исходный массив nums массивом результата res + for (int i = 0; i < n; i++) { + nums[i] = res[i]; + } + } + + public static void main(String[] args) { + int[] nums = { 1, 0, 1, 2, 0, 4, 0, 2, 2, 4 }; + countingSortNaive(nums); + System.out.println("После сортировки подсчетом (объекты не поддерживаются) nums = " + Arrays.toString(nums)); + + int[] nums1 = { 1, 0, 1, 2, 0, 4, 0, 2, 2, 4 }; + countingSort(nums1); + System.out.println("После сортировки подсчетом nums1 = " + Arrays.toString(nums1)); + } +} diff --git a/ru/codes/java/chapter_sorting/heap_sort.java b/ru/codes/java/chapter_sorting/heap_sort.java new file mode 100644 index 000000000..b3518e554 --- /dev/null +++ b/ru/codes/java/chapter_sorting/heap_sort.java @@ -0,0 +1,57 @@ +/** + * File: heap_sort.java + * Created Time: 2023-05-26 + * Author: krahets (krahets@163.com) + */ + +package chapter_sorting; + +import java.util.Arrays; + +public class heap_sort { + /* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */ + public static void siftDown(int[] nums, int n, int i) { + while (true) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + int l = 2 * i + 1; + int r = 2 * i + 2; + int ma = i; + if (l < n && nums[l] > nums[ma]) + ma = l; + if (r < n && nums[r] > nums[ma]) + ma = r; + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (ma == i) + break; + // Поменять два узла местами + int temp = nums[i]; + nums[i] = nums[ma]; + nums[ma] = temp; + // Циклическое просеивание вниз + i = ma; + } + } + + /* Сортировка кучей */ + public static void heapSort(int[] nums) { + // Построение кучи: выполнить heapify для всех узлов, кроме листовых + for (int i = nums.length / 2 - 1; i >= 0; i--) { + siftDown(nums, nums.length, i); + } + // Извлекать максимальный элемент из кучи в течение n-1 итераций + for (int i = nums.length - 1; i > 0; i--) { + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + int tmp = nums[0]; + nums[0] = nums[i]; + nums[i] = tmp; + // Начиная с корневого узла, выполнить просеивание сверху вниз + siftDown(nums, i, 0); + } + } + + public static void main(String[] args) { + int[] nums = { 4, 1, 3, 1, 5, 2 }; + heapSort(nums); + System.out.println("После сортировки кучей nums = " + Arrays.toString(nums)); + } +} diff --git a/ru/codes/java/chapter_sorting/insertion_sort.java b/ru/codes/java/chapter_sorting/insertion_sort.java new file mode 100644 index 000000000..0886a05bd --- /dev/null +++ b/ru/codes/java/chapter_sorting/insertion_sort.java @@ -0,0 +1,31 @@ +/** + * File: insertion_sort.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_sorting; + +import java.util.*; + +public class insertion_sort { + /* Сортировка вставками */ + static void insertionSort(int[] nums) { + // Внешний цикл: отсортированный диапазон [0, i-1] + for (int i = 1; i < nums.length; i++) { + int base = nums[i], j = i - 1; + // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1] + while (j >= 0 && nums[j] > base) { + nums[j + 1] = nums[j]; // Сдвинуть nums[j] на одну позицию вправо + j--; + } + nums[j + 1] = base; // Поместить base в правильную позицию + } + } + + public static void main(String[] args) { + int[] nums = { 4, 1, 3, 1, 5, 2 }; + insertionSort(nums); + System.out.println("После сортировки вставками nums = " + Arrays.toString(nums)); + } +} diff --git a/ru/codes/java/chapter_sorting/merge_sort.java b/ru/codes/java/chapter_sorting/merge_sort.java new file mode 100644 index 000000000..6bccd5629 --- /dev/null +++ b/ru/codes/java/chapter_sorting/merge_sort.java @@ -0,0 +1,58 @@ +/** + * File: merge_sort.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_sorting; + +import java.util.*; + +public class merge_sort { + /* Объединить левый и правый подмассивы */ + static void merge(int[] nums, int left, int mid, int right) { + // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right] + // Создать временный массив tmp для хранения результата слияния + int[] tmp = new int[right - left + 1]; + // Инициализировать начальные индексы левого и правого подмассивов + int i = left, j = mid + 1, k = 0; + // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив + while (i <= mid && j <= right) { + if (nums[i] <= nums[j]) + tmp[k++] = nums[i++]; + else + tmp[k++] = nums[j++]; + } + // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив + while (i <= mid) { + tmp[k++] = nums[i++]; + } + while (j <= right) { + tmp[k++] = nums[j++]; + } + // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums + for (k = 0; k < tmp.length; k++) { + nums[left + k] = tmp[k]; + } + } + + /* Сортировка слиянием */ + static void mergeSort(int[] nums, int left, int right) { + // Условие завершения + if (left >= right) + return; // Завершить рекурсию, когда длина подмассива равна 1 + // Этап разбиения + int mid = left + (right - left) / 2; // Вычислить середину + mergeSort(nums, left, mid); // Рекурсивно обработать левый подмассив + mergeSort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив + // Этап слияния + merge(nums, left, mid, right); + } + + public static void main(String[] args) { + /* Сортировка слиянием */ + int[] nums = { 7, 3, 2, 6, 0, 1, 5, 4 }; + mergeSort(nums, 0, nums.length - 1); + System.out.println("После сортировки слиянием nums = " + Arrays.toString(nums)); + } +} diff --git a/ru/codes/java/chapter_sorting/quick_sort.java b/ru/codes/java/chapter_sorting/quick_sort.java new file mode 100644 index 000000000..70ad5e3f7 --- /dev/null +++ b/ru/codes/java/chapter_sorting/quick_sort.java @@ -0,0 +1,158 @@ +/** + * File: quick_sort.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_sorting; + +import java.util.*; + +/* Класс быстрой сортировки */ +class QuickSort { + /* Обмен элементов */ + static void swap(int[] nums, int i, int j) { + int tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + /* Разбиение с опорными указателями */ + static int partition(int[] nums, int left, int right) { + // Взять nums[left] в качестве опорного элемента + int i = left, j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) + j--; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) + i++; // Идти слева направо в поисках первого элемента больше опорного + swap(nums, i, j); // Поменять эти два элемента местами + } + swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка */ + public static void quickSort(int[] nums, int left, int right) { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) + return; + // Разбиение с опорными указателями + int pivot = partition(nums, left, right); + // Рекурсивно обработать левый и правый подмассивы + quickSort(nums, left, pivot - 1); + quickSort(nums, pivot + 1, right); + } +} + +/* Класс быстрой сортировки (оптимизация медианным опорным элементом) */ +class QuickSortMedian { + /* Обмен элементов */ + static void swap(int[] nums, int i, int j) { + int tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + /* Выбрать медиану из трех кандидатов */ + static int medianThree(int[] nums, int left, int mid, int right) { + int l = nums[left], m = nums[mid], r = nums[right]; + if ((l <= m && m <= r) || (r <= m && m <= l)) + return mid; // m находится между l и r + if ((m <= l && l <= r) || (r <= l && l <= m)) + return left; // l находится между m и r + return right; + } + + /* Разбиение с опорными указателями (медиана трех) */ + static int partition(int[] nums, int left, int right) { + // Выбрать медиану из трех кандидатов + int med = medianThree(nums, left, (left + right) / 2, right); + // Переместить медиану в крайний левый элемент массива + swap(nums, left, med); + // Взять nums[left] в качестве опорного элемента + int i = left, j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) + j--; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) + i++; // Идти слева направо в поисках первого элемента больше опорного + swap(nums, i, j); // Поменять эти два элемента местами + } + swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка */ + public static void quickSort(int[] nums, int left, int right) { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) + return; + // Разбиение с опорными указателями + int pivot = partition(nums, left, right); + // Рекурсивно обработать левый и правый подмассивы + quickSort(nums, left, pivot - 1); + quickSort(nums, pivot + 1, right); + } +} + +/* Класс быстрой сортировки (оптимизация глубины рекурсии) */ +class QuickSortTailCall { + /* Обмен элементов */ + static void swap(int[] nums, int i, int j) { + int tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + /* Разбиение с опорными указателями */ + static int partition(int[] nums, int left, int right) { + // Взять nums[left] в качестве опорного элемента + int i = left, j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) + j--; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) + i++; // Идти слева направо в поисках первого элемента больше опорного + swap(nums, i, j); // Поменять эти два элемента местами + } + swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка (оптимизация глубины рекурсии) */ + public static void quickSort(int[] nums, int left, int right) { + // Завершить, когда длина подмассива равна 1 + while (left < right) { + // Операция разбиения с опорными указателями + int pivot = partition(nums, left, right); + // Выполнить быструю сортировку для более короткого из двух подмассивов + if (pivot - left < right - pivot) { + quickSort(nums, left, pivot - 1); // Рекурсивно отсортировать левый подмассив + left = pivot + 1; // Оставшийся неотсортированный диапазон: [pivot + 1, right] + } else { + quickSort(nums, pivot + 1, right); // Рекурсивно отсортировать правый подмассив + right = pivot - 1; // Оставшийся неотсортированный диапазон: [left, pivot - 1] + } + } + } +} + +public class quick_sort { + public static void main(String[] args) { + /* Быстрая сортировка */ + int[] nums = { 2, 4, 1, 0, 3, 5 }; + QuickSort.quickSort(nums, 0, nums.length - 1); + System.out.println("После быстрой сортировки nums = " + Arrays.toString(nums)); + + /* Быстрая сортировка (оптимизация медианным опорным элементом) */ + int[] nums1 = { 2, 4, 1, 0, 3, 5 }; + QuickSortMedian.quickSort(nums1, 0, nums1.length - 1); + System.out.println("После быстрой сортировки (оптимизация медианным опорным элементом) nums1 = " + Arrays.toString(nums1)); + + /* Быстрая сортировка (оптимизация глубины рекурсии) */ + int[] nums2 = { 2, 4, 1, 0, 3, 5 }; + QuickSortTailCall.quickSort(nums2, 0, nums2.length - 1); + System.out.println("После быстрой сортировки (оптимизация глубины рекурсии) nums2 = " + Arrays.toString(nums2)); + } +} diff --git a/ru/codes/java/chapter_sorting/radix_sort.java b/ru/codes/java/chapter_sorting/radix_sort.java new file mode 100644 index 000000000..ac1dbfe6d --- /dev/null +++ b/ru/codes/java/chapter_sorting/radix_sort.java @@ -0,0 +1,69 @@ +/** + * File: radix_sort.java + * Created Time: 2023-01-17 + * Author: krahets (krahets@163.com) + */ + +package chapter_sorting; + +import java.util.*; + +public class radix_sort { + /* Получить k-й разряд элемента num, где exp = 10^(k-1) */ + static int digit(int num, int exp) { + // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени + return (num / exp) % 10; + } + + /* Сортировка подсчетом (сортировка по k-му разряду nums) */ + static void countingSortDigit(int[] nums, int exp) { + // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10 + int[] counter = new int[10]; + int n = nums.length; + // Подсчитать число появлений каждой цифры от 0 до 9 + for (int i = 0; i < n; i++) { + int d = digit(nums[i], exp); // Получить k-й разряд nums[i], обозначив его как d + counter[d]++; // Подсчитать число появлений цифры d + } + // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива» + for (int i = 1; i < 10; i++) { + counter[i] += counter[i - 1]; + } + // Выполняя обратный проход, заполнить res элементами по статистике в корзинах + int[] res = new int[n]; + for (int i = n - 1; i >= 0; i--) { + int d = digit(nums[i], exp); + int j = counter[d] - 1; // Получить индекс j цифры d в массиве + res[j] = nums[i]; // Поместить текущий элемент по индексу j + counter[d]--; // Уменьшить количество d на 1 + } + // Перезаписать исходный массив nums результатом + for (int i = 0; i < n; i++) + nums[i] = res[i]; + } + + /* Поразрядная сортировка */ + static void radixSort(int[] nums) { + // Получить максимальный элемент массива, чтобы определить максимальное число разрядов + int m = Integer.MIN_VALUE; + for (int num : nums) + if (num > m) + m = num; + // Проходить разряды от младшего к старшему + for (int exp = 1; exp <= m; exp *= 10) { + // Выполнить сортировку подсчетом по k-му разряду элементов массива + // k = 1 -> exp = 1 + // k = 2 -> exp = 10 + // то есть exp = 10^(k-1) + countingSortDigit(nums, exp); + } + } + + public static void main(String[] args) { + // Поразрядная сортировка + int[] nums = { 10546151, 35663510, 42865989, 34862445, 81883077, + 88906420, 72429244, 30524779, 82060337, 63832996 }; + radixSort(nums); + System.out.println("После поразрядной сортировки nums = " + Arrays.toString(nums)); + } +} diff --git a/ru/codes/java/chapter_sorting/selection_sort.java b/ru/codes/java/chapter_sorting/selection_sort.java new file mode 100644 index 000000000..b6e8be197 --- /dev/null +++ b/ru/codes/java/chapter_sorting/selection_sort.java @@ -0,0 +1,35 @@ +/** + * File: selection_sort.java + * Created Time: 2023-05-23 + * Author: krahets (krahets@163.com) + */ + +package chapter_sorting; + +import java.util.Arrays; + +public class selection_sort { + /* Сортировка выбором */ + public static void selectionSort(int[] nums) { + int n = nums.length; + // Внешний цикл: неотсортированный диапазон [i, n-1] + for (int i = 0; i < n - 1; i++) { + // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне + int k = i; + for (int j = i + 1; j < n; j++) { + if (nums[j] < nums[k]) + k = j; // Записать индекс минимального элемента + } + // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона + int temp = nums[i]; + nums[i] = nums[k]; + nums[k] = temp; + } + } + + public static void main(String[] args) { + int[] nums = { 4, 1, 3, 1, 5, 2 }; + selectionSort(nums); + System.out.println("После сортировки выбором nums = " + Arrays.toString(nums)); + } +} diff --git a/ru/codes/java/chapter_stack_and_queue/array_deque.java b/ru/codes/java/chapter_stack_and_queue/array_deque.java new file mode 100644 index 000000000..f8443bcd4 --- /dev/null +++ b/ru/codes/java/chapter_stack_and_queue/array_deque.java @@ -0,0 +1,151 @@ +/** + * File: array_deque.java + * Created Time: 2023-02-16 + * Author: krahets (krahets@163.com), FangYuan33 (374072213@qq.com) + */ + +package chapter_stack_and_queue; + +import java.util.*; + +/* Двусторонняя очередь на основе кольцевого массива */ +class ArrayDeque { + private int[] nums; // Массив для хранения элементов двусторонней очереди + private int front; // Указатель head, указывающий на первый элемент очереди + private int queSize; // Длина двусторонней очереди + + /* Конструктор */ + public ArrayDeque(int capacity) { + this.nums = new int[capacity]; + front = queSize = 0; + } + + /* Получить вместимость двусторонней очереди */ + public int capacity() { + return nums.length; + } + + /* Получение длины двусторонней очереди */ + public int size() { + return queSize; + } + + /* Проверка, пуста ли двусторонняя очередь */ + public boolean isEmpty() { + return queSize == 0; + } + + /* Вычислить индекс в кольцевом массиве */ + private int index(int i) { + // С помощью операции взятия по модулю соединить начало и конец массива + // Когда i выходит за конец массива, он возвращается в начало + // Когда i выходит за начало массива, он возвращается в конец + return (i + capacity()) % capacity(); + } + + /* Добавление в голову очереди */ + public void pushFirst(int num) { + if (queSize == capacity()) { + System.out.println("Двусторонняя очередь заполнена"); + return; + } + // Указатель головы сдвигается на одну позицию влево + // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост + front = index(front - 1); + // Добавить num в голову очереди + nums[front] = num; + queSize++; + } + + /* Добавление в хвост очереди */ + public void pushLast(int num) { + if (queSize == capacity()) { + System.out.println("Двусторонняя очередь заполнена"); + return; + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + int rear = index(front + queSize); + // Добавить num в хвост очереди + nums[rear] = num; + queSize++; + } + + /* Извлечение из головы очереди */ + public int popFirst() { + int num = peekFirst(); + // Указатель головы сдвигается на одну позицию назад + front = index(front + 1); + queSize--; + return num; + } + + /* Извлечение из хвоста очереди */ + public int popLast() { + int num = peekLast(); + queSize--; + return num; + } + + /* Доступ к элементу в начале очереди */ + public int peekFirst() { + if (isEmpty()) + throw new IndexOutOfBoundsException(); + return nums[front]; + } + + /* Доступ к элементу в конце очереди */ + public int peekLast() { + if (isEmpty()) + throw new IndexOutOfBoundsException(); + // Вычислить индекс хвостового элемента + int last = index(front + queSize - 1); + return nums[last]; + } + + /* Вернуть массив для вывода */ + public int[] toArray() { + // Преобразовывать только элементы списка в пределах фактической длины + int[] res = new int[queSize]; + for (int i = 0, j = front; i < queSize; i++, j++) { + res[i] = nums[index(j)]; + } + return res; + } +} + +public class array_deque { + public static void main(String[] args) { + /* Инициализация двусторонней очереди */ + ArrayDeque deque = new ArrayDeque(10); + deque.pushLast(3); + deque.pushLast(2); + deque.pushLast(5); + System.out.println("Двусторонняя очередь deque = " + Arrays.toString(deque.toArray())); + + /* Доступ к элементу */ + int peekFirst = deque.peekFirst(); + System.out.println("Первый элемент peekFirst = " + peekFirst); + int peekLast = deque.peekLast(); + System.out.println("Последний элемент peekLast = " + peekLast); + + /* Добавление элемента в очередь */ + deque.pushLast(4); + System.out.println("После добавления элемента 4 в хвост deque = " + Arrays.toString(deque.toArray())); + deque.pushFirst(1); + System.out.println("После добавления элемента 1 в голову deque = " + Arrays.toString(deque.toArray())); + + /* Извлечение элемента из очереди */ + int popLast = deque.popLast(); + System.out.println("Извлеченный из хвоста элемент = " + popLast + ", deque после извлечения из хвоста = " + Arrays.toString(deque.toArray())); + int popFirst = deque.popFirst(); + System.out.println("Извлеченный из головы элемент = " + popFirst + ", deque после извлечения из головы = " + Arrays.toString(deque.toArray())); + + /* Получение длины двусторонней очереди */ + int size = deque.size(); + System.out.println("Длина двусторонней очереди size = " + size); + + /* Проверка, пуста ли двусторонняя очередь */ + boolean isEmpty = deque.isEmpty(); + System.out.println("Пуста ли двусторонняя очередь = " + isEmpty); + } +} diff --git a/ru/codes/java/chapter_stack_and_queue/array_queue.java b/ru/codes/java/chapter_stack_and_queue/array_queue.java new file mode 100644 index 000000000..f13148abf --- /dev/null +++ b/ru/codes/java/chapter_stack_and_queue/array_queue.java @@ -0,0 +1,115 @@ +/** + * File: array_queue.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_stack_and_queue; + +import java.util.*; + +/* Очередь на основе кольцевого массива */ +class ArrayQueue { + private int[] nums; // Массив для хранения элементов очереди + private int front; // Указатель head, указывающий на первый элемент очереди + private int queSize; // Длина очереди + + public ArrayQueue(int capacity) { + nums = new int[capacity]; + front = queSize = 0; + } + + /* Получить вместимость очереди */ + public int capacity() { + return nums.length; + } + + /* Получение длины очереди */ + public int size() { + return queSize; + } + + /* Проверка, пуста ли очередь */ + public boolean isEmpty() { + return queSize == 0; + } + + /* Поместить в очередь */ + public void push(int num) { + if (queSize == capacity()) { + System.out.println("Очередь заполнена"); + return; + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива + int rear = (front + queSize) % capacity(); + // Добавить num в хвост очереди + nums[rear] = num; + queSize++; + } + + /* Извлечь из очереди */ + public int pop() { + int num = peek(); + // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива + front = (front + 1) % capacity(); + queSize--; + return num; + } + + /* Доступ к элементу в начале очереди */ + public int peek() { + if (isEmpty()) + throw new IndexOutOfBoundsException(); + return nums[front]; + } + + /* Вернуть массив */ + public int[] toArray() { + // Преобразовывать только элементы списка в пределах фактической длины + int[] res = new int[queSize]; + for (int i = 0, j = front; i < queSize; i++, j++) { + res[i] = nums[j % capacity()]; + } + return res; + } +} + +public class array_queue { + public static void main(String[] args) { + /* Инициализация очереди */ + int capacity = 10; + ArrayQueue queue = new ArrayQueue(capacity); + + /* Добавление элемента в очередь */ + queue.push(1); + queue.push(3); + queue.push(2); + queue.push(5); + queue.push(4); + System.out.println("Очередь queue = " + Arrays.toString(queue.toArray())); + + /* Доступ к элементу в начале очереди */ + int peek = queue.peek(); + System.out.println("Первый элемент peek = " + peek); + + /* Извлечение элемента из очереди */ + int pop = queue.pop(); + System.out.println("Извлеченный элемент pop = " + pop + ", queue после извлечения = " + Arrays.toString(queue.toArray())); + + /* Получение длины очереди */ + int size = queue.size(); + System.out.println("Длина очереди size = " + size); + + /* Проверка, пуста ли очередь */ + boolean isEmpty = queue.isEmpty(); + System.out.println("Пуста ли очередь = " + isEmpty); + + /* Проверка кольцевого массива */ + for (int i = 0; i < 10; i++) { + queue.push(i); + queue.pop(); + System.out.println("После " + i + "-го раунда операций enqueue и dequeue queue = " + Arrays.toString(queue.toArray())); + } + } +} diff --git a/ru/codes/java/chapter_stack_and_queue/array_stack.java b/ru/codes/java/chapter_stack_and_queue/array_stack.java new file mode 100644 index 000000000..8d0071aec --- /dev/null +++ b/ru/codes/java/chapter_stack_and_queue/array_stack.java @@ -0,0 +1,84 @@ +/** + * File: array_stack.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_stack_and_queue; + +import java.util.*; + +/* Стек на основе массива */ +class ArrayStack { + private ArrayList stack; + + public ArrayStack() { + // Инициализация списка (динамического массива) + stack = new ArrayList<>(); + } + + /* Получение длины стека */ + public int size() { + return stack.size(); + } + + /* Проверка, пуст ли стек */ + public boolean isEmpty() { + return size() == 0; + } + + /* Поместить в стек */ + public void push(int num) { + stack.add(num); + } + + /* Извлечь из стека */ + public int pop() { + if (isEmpty()) + throw new IndexOutOfBoundsException(); + return stack.remove(size() - 1); + } + + /* Доступ к верхнему элементу стека */ + public int peek() { + if (isEmpty()) + throw new IndexOutOfBoundsException(); + return stack.get(size() - 1); + } + + /* Преобразовать List в Array и вернуть */ + public Object[] toArray() { + return stack.toArray(); + } +} + +public class array_stack { + public static void main(String[] args) { + /* Инициализация стека */ + ArrayStack stack = new ArrayStack(); + + /* Помещение элемента в стек */ + stack.push(1); + stack.push(3); + stack.push(2); + stack.push(5); + stack.push(4); + System.out.println("Стек stack = " + Arrays.toString(stack.toArray())); + + /* Доступ к верхнему элементу стека */ + int peek = stack.peek(); + System.out.println("Верхний элемент peek = " + peek); + + /* Извлечение элемента из стека */ + int pop = stack.pop(); + System.out.println("Извлеченный элемент pop = " + pop + ", stack после извлечения = " + Arrays.toString(stack.toArray())); + + /* Получение длины стека */ + int size = stack.size(); + System.out.println("Длина стека size = " + size); + + /* Проверка на пустоту */ + boolean isEmpty = stack.isEmpty(); + System.out.println("Пуст ли стек = " + isEmpty); + } +} diff --git a/ru/codes/java/chapter_stack_and_queue/deque.java b/ru/codes/java/chapter_stack_and_queue/deque.java new file mode 100644 index 000000000..707961e6c --- /dev/null +++ b/ru/codes/java/chapter_stack_and_queue/deque.java @@ -0,0 +1,46 @@ +/** + * File: deque.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_stack_and_queue; + +import java.util.*; + +public class deque { + public static void main(String[] args) { + /* Инициализация двусторонней очереди */ + Deque deque = new LinkedList<>(); + deque.offerLast(3); + deque.offerLast(2); + deque.offerLast(5); + System.out.println("Двусторонняя очередь deque = " + deque); + + /* Доступ к элементу */ + int peekFirst = deque.peekFirst(); + System.out.println("Первый элемент peekFirst = " + peekFirst); + int peekLast = deque.peekLast(); + System.out.println("Последний элемент peekLast = " + peekLast); + + /* Добавление элемента в очередь */ + deque.offerLast(4); + System.out.println("После добавления элемента 4 в хвост deque = " + deque); + deque.offerFirst(1); + System.out.println("После добавления элемента 1 в голову deque = " + deque); + + /* Извлечение элемента из очереди */ + int popLast = deque.pollLast(); + System.out.println("Извлеченный из хвоста элемент = " + popLast + ", deque после извлечения из хвоста = " + deque); + int popFirst = deque.pollFirst(); + System.out.println("Извлеченный из головы элемент = " + popFirst + ", deque после извлечения из головы = " + deque); + + /* Получение длины двусторонней очереди */ + int size = deque.size(); + System.out.println("Длина двусторонней очереди size = " + size); + + /* Проверка, пуста ли двусторонняя очередь */ + boolean isEmpty = deque.isEmpty(); + System.out.println("Пуста ли двусторонняя очередь = " + isEmpty); + } +} diff --git a/ru/codes/java/chapter_stack_and_queue/linkedlist_deque.java b/ru/codes/java/chapter_stack_and_queue/linkedlist_deque.java new file mode 100644 index 000000000..f16d01034 --- /dev/null +++ b/ru/codes/java/chapter_stack_and_queue/linkedlist_deque.java @@ -0,0 +1,175 @@ +/** + * File: linkedlist_deque.java + * Created Time: 2023-01-20 + * Author: krahets (krahets@163.com) + */ + +package chapter_stack_and_queue; + +import java.util.*; + +/* Узел двусвязного списка */ +class ListNode { + int val; // Значение узла + ListNode next; // Ссылка на узел-преемник + ListNode prev; // Ссылка на узел-предшественник + + ListNode(int val) { + this.val = val; + prev = next = null; + } +} + +/* Двусторонняя очередь на основе двусвязного списка */ +class LinkedListDeque { + private ListNode front, rear; // Головной узел front, хвостовой узел rear + private int queSize = 0; // Длина двусторонней очереди + + public LinkedListDeque() { + front = rear = null; + } + + /* Получение длины двусторонней очереди */ + public int size() { + return queSize; + } + + /* Проверка, пуста ли двусторонняя очередь */ + public boolean isEmpty() { + return size() == 0; + } + + /* Операция добавления в очередь */ + private void push(int num, boolean isFront) { + ListNode node = new ListNode(num); + // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node + if (isEmpty()) + front = rear = node; + // Операция добавления в голову очереди + else if (isFront) { + // Добавить node в голову списка + front.prev = node; + node.next = front; + front = node; // Обновить головной узел + // Операция добавления в хвост очереди + } else { + // Добавить node в хвост списка + rear.next = node; + node.prev = rear; + rear = node; // Обновить хвостовой узел + } + queSize++; // Обновить длину очереди + } + + /* Добавление в голову очереди */ + public void pushFirst(int num) { + push(num, true); + } + + /* Добавление в хвост очереди */ + public void pushLast(int num) { + push(num, false); + } + + /* Операция извлечения из очереди */ + private int pop(boolean isFront) { + if (isEmpty()) + throw new IndexOutOfBoundsException(); + int val; + // Операция извлечения из головы очереди + if (isFront) { + val = front.val; // Временно сохранить значение головного узла + // Удалить головной узел + ListNode fNext = front.next; + if (fNext != null) { + fNext.prev = null; + front.next = null; + } + front = fNext; // Обновить головной узел + // Операция извлечения из хвоста очереди + } else { + val = rear.val; // Временно сохранить значение хвостового узла + // Удалить хвостовой узел + ListNode rPrev = rear.prev; + if (rPrev != null) { + rPrev.next = null; + rear.prev = null; + } + rear = rPrev; // Обновить хвостовой узел + } + queSize--; // Обновить длину очереди + return val; + } + + /* Извлечение из головы очереди */ + public int popFirst() { + return pop(true); + } + + /* Извлечение из хвоста очереди */ + public int popLast() { + return pop(false); + } + + /* Доступ к элементу в начале очереди */ + public int peekFirst() { + if (isEmpty()) + throw new IndexOutOfBoundsException(); + return front.val; + } + + /* Доступ к элементу в конце очереди */ + public int peekLast() { + if (isEmpty()) + throw new IndexOutOfBoundsException(); + return rear.val; + } + + /* Вернуть массив для вывода */ + public int[] toArray() { + ListNode node = front; + int[] res = new int[size()]; + for (int i = 0; i < res.length; i++) { + res[i] = node.val; + node = node.next; + } + return res; + } +} + +public class linkedlist_deque { + public static void main(String[] args) { + /* Инициализация двусторонней очереди */ + LinkedListDeque deque = new LinkedListDeque(); + deque.pushLast(3); + deque.pushLast(2); + deque.pushLast(5); + System.out.println("Двусторонняя очередь deque = " + Arrays.toString(deque.toArray())); + + /* Доступ к элементу */ + int peekFirst = deque.peekFirst(); + System.out.println("Первый элемент peekFirst = " + peekFirst); + int peekLast = deque.peekLast(); + System.out.println("Последний элемент peekLast = " + peekLast); + + /* Добавление элемента в очередь */ + deque.pushLast(4); + System.out.println("После добавления элемента 4 в хвост deque = " + Arrays.toString(deque.toArray())); + deque.pushFirst(1); + System.out.println("После добавления элемента 1 в голову deque = " + Arrays.toString(deque.toArray())); + + /* Извлечение элемента из очереди */ + int popLast = deque.popLast(); + System.out.println("Извлеченный из хвоста элемент = " + popLast + ", deque после извлечения из хвоста = " + Arrays.toString(deque.toArray())); + int popFirst = deque.popFirst(); + System.out.println("Извлеченный из головы элемент = " + popFirst + ", deque после извлечения из головы = " + Arrays.toString(deque.toArray())); + + /* Получение длины двусторонней очереди */ + int size = deque.size(); + System.out.println("Длина двусторонней очереди size = " + size); + + /* Проверка, пуста ли двусторонняя очередь */ + boolean isEmpty = deque.isEmpty(); + System.out.println("Пуста ли двусторонняя очередь = " + isEmpty); + } +} diff --git a/ru/codes/java/chapter_stack_and_queue/linkedlist_queue.java b/ru/codes/java/chapter_stack_and_queue/linkedlist_queue.java new file mode 100644 index 000000000..8f4b76b0e --- /dev/null +++ b/ru/codes/java/chapter_stack_and_queue/linkedlist_queue.java @@ -0,0 +1,104 @@ +/** + * File: linkedlist_queue.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_stack_and_queue; + +import java.util.*; + +/* Очередь на основе связного списка */ +class LinkedListQueue { + private ListNode front, rear; // Головной узел front, хвостовой узел rear + private int queSize = 0; + + public LinkedListQueue() { + front = null; + rear = null; + } + + /* Получение длины очереди */ + public int size() { + return queSize; + } + + /* Проверка, пуста ли очередь */ + public boolean isEmpty() { + return size() == 0; + } + + /* Поместить в очередь */ + public void push(int num) { + // Добавить num после хвостового узла + ListNode node = new ListNode(num); + // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел + if (front == null) { + front = node; + rear = node; + // Если очередь не пуста, добавить этот узел после хвостового узла + } else { + rear.next = node; + rear = node; + } + queSize++; + } + + /* Извлечь из очереди */ + public int pop() { + int num = peek(); + // Удалить головной узел + front = front.next; + queSize--; + return num; + } + + /* Доступ к элементу в начале очереди */ + public int peek() { + if (isEmpty()) + throw new IndexOutOfBoundsException(); + return front.val; + } + + /* Преобразовать связный список в Array и вернуть */ + public int[] toArray() { + ListNode node = front; + int[] res = new int[size()]; + for (int i = 0; i < res.length; i++) { + res[i] = node.val; + node = node.next; + } + return res; + } +} + +public class linkedlist_queue { + public static void main(String[] args) { + /* Инициализация очереди */ + LinkedListQueue queue = new LinkedListQueue(); + + /* Добавление элемента в очередь */ + queue.push(1); + queue.push(3); + queue.push(2); + queue.push(5); + queue.push(4); + System.out.println("Очередь queue = " + Arrays.toString(queue.toArray())); + + /* Доступ к элементу в начале очереди */ + int peek = queue.peek(); + System.out.println("Первый элемент peek = " + peek); + + /* Извлечение элемента из очереди */ + int pop = queue.pop(); + System.out.println("Извлеченный элемент pop = " + pop + ", queue после извлечения = " + Arrays.toString(queue.toArray())); + + /* Получение длины очереди */ + int size = queue.size(); + System.out.println("Длина очереди size = " + size); + + /* Проверка, пуста ли очередь */ + boolean isEmpty = queue.isEmpty(); + System.out.println("Пуста ли очередь = " + isEmpty); + } +} diff --git a/ru/codes/java/chapter_stack_and_queue/linkedlist_stack.java b/ru/codes/java/chapter_stack_and_queue/linkedlist_stack.java new file mode 100644 index 000000000..08a912539 --- /dev/null +++ b/ru/codes/java/chapter_stack_and_queue/linkedlist_stack.java @@ -0,0 +1,95 @@ +/** + * File: linkedlist_stack.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_stack_and_queue; + +import java.util.*; +import utils.*; + +/* Стек на основе связного списка */ +class LinkedListStack { + private ListNode stackPeek; // Использовать головной узел как вершину стека + private int stkSize = 0; // Длина стека + + public LinkedListStack() { + stackPeek = null; + } + + /* Получение длины стека */ + public int size() { + return stkSize; + } + + /* Проверка, пуст ли стек */ + public boolean isEmpty() { + return size() == 0; + } + + /* Поместить в стек */ + public void push(int num) { + ListNode node = new ListNode(num); + node.next = stackPeek; + stackPeek = node; + stkSize++; + } + + /* Извлечь из стека */ + public int pop() { + int num = peek(); + stackPeek = stackPeek.next; + stkSize--; + return num; + } + + /* Доступ к верхнему элементу стека */ + public int peek() { + if (isEmpty()) + throw new IndexOutOfBoundsException(); + return stackPeek.val; + } + + /* Преобразовать List в Array и вернуть */ + public int[] toArray() { + ListNode node = stackPeek; + int[] res = new int[size()]; + for (int i = res.length - 1; i >= 0; i--) { + res[i] = node.val; + node = node.next; + } + return res; + } +} + +public class linkedlist_stack { + public static void main(String[] args) { + /* Инициализация стека */ + LinkedListStack stack = new LinkedListStack(); + + /* Помещение элемента в стек */ + stack.push(1); + stack.push(3); + stack.push(2); + stack.push(5); + stack.push(4); + System.out.println("Стек stack = " + Arrays.toString(stack.toArray())); + + /* Доступ к верхнему элементу стека */ + int peek = stack.peek(); + System.out.println("Верхний элемент peek = " + peek); + + /* Извлечение элемента из стека */ + int pop = stack.pop(); + System.out.println("Извлеченный элемент pop = " + pop + ", stack после извлечения = " + Arrays.toString(stack.toArray())); + + /* Получение длины стека */ + int size = stack.size(); + System.out.println("Длина стека size = " + size); + + /* Проверка на пустоту */ + boolean isEmpty = stack.isEmpty(); + System.out.println("Пуст ли стек = " + isEmpty); + } +} diff --git a/ru/codes/java/chapter_stack_and_queue/queue.java b/ru/codes/java/chapter_stack_and_queue/queue.java new file mode 100644 index 000000000..867ca8acf --- /dev/null +++ b/ru/codes/java/chapter_stack_and_queue/queue.java @@ -0,0 +1,40 @@ +/** + * File: queue.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_stack_and_queue; + +import java.util.*; + +public class queue { + public static void main(String[] args) { + /* Инициализация очереди */ + Queue queue = new LinkedList<>(); + + /* Добавление элемента в очередь */ + queue.offer(1); + queue.offer(3); + queue.offer(2); + queue.offer(5); + queue.offer(4); + System.out.println("Очередь queue = " + queue); + + /* Доступ к элементу в начале очереди */ + int peek = queue.peek(); + System.out.println("Первый элемент peek = " + peek); + + /* Извлечение элемента из очереди */ + int pop = queue.poll(); + System.out.println("Извлеченный элемент pop = " + pop + ", queue после извлечения = " + queue); + + /* Получение длины очереди */ + int size = queue.size(); + System.out.println("Длина очереди size = " + size); + + /* Проверка, пуста ли очередь */ + boolean isEmpty = queue.isEmpty(); + System.out.println("Пуста ли очередь = " + isEmpty); + } +} diff --git a/ru/codes/java/chapter_stack_and_queue/stack.java b/ru/codes/java/chapter_stack_and_queue/stack.java new file mode 100644 index 000000000..5247613b5 --- /dev/null +++ b/ru/codes/java/chapter_stack_and_queue/stack.java @@ -0,0 +1,40 @@ +/** + * File: stack.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_stack_and_queue; + +import java.util.*; + +public class stack { + public static void main(String[] args) { + /* Инициализация стека */ + Stack stack = new Stack<>(); + + /* Помещение элемента в стек */ + stack.push(1); + stack.push(3); + stack.push(2); + stack.push(5); + stack.push(4); + System.out.println("Стек stack = " + stack); + + /* Доступ к верхнему элементу стека */ + int peek = stack.peek(); + System.out.println("Верхний элемент peek = " + peek); + + /* Извлечение элемента из стека */ + int pop = stack.pop(); + System.out.println("Извлеченный элемент pop = " + pop + ", stack после извлечения = " + stack); + + /* Получение длины стека */ + int size = stack.size(); + System.out.println("Длина стека size = " + size); + + /* Проверка на пустоту */ + boolean isEmpty = stack.isEmpty(); + System.out.println("Пуст ли стек = " + isEmpty); + } +} diff --git a/ru/codes/java/chapter_tree/array_binary_tree.java b/ru/codes/java/chapter_tree/array_binary_tree.java new file mode 100644 index 000000000..b32a46a8d --- /dev/null +++ b/ru/codes/java/chapter_tree/array_binary_tree.java @@ -0,0 +1,136 @@ +/** + * File: array_binary_tree.java + * Created Time: 2023-07-19 + * Author: krahets (krahets@163.com) + */ + +package chapter_tree; + +import utils.*; +import java.util.*; + +/* Класс двоичного дерева в массивном представлении */ +class ArrayBinaryTree { + private List tree; + + /* Конструктор */ + public ArrayBinaryTree(List arr) { + tree = new ArrayList<>(arr); + } + + /* Вместимость списка */ + public int size() { + return tree.size(); + } + + /* Получить значение узла с индексом i */ + public Integer val(int i) { + // Если индекс выходит за границы, вернуть null, обозначающий пустую позицию + if (i < 0 || i >= size()) + return null; + return tree.get(i); + } + + /* Получить индекс левого дочернего узла узла с индексом i */ + public Integer left(int i) { + return 2 * i + 1; + } + + /* Получить индекс правого дочернего узла узла с индексом i */ + public Integer right(int i) { + return 2 * i + 2; + } + + /* Получить индекс родительского узла узла с индексом i */ + public Integer parent(int i) { + return (i - 1) / 2; + } + + /* Обход в ширину */ + public List levelOrder() { + List res = new ArrayList<>(); + // Непосредственно обходить массив + for (int i = 0; i < size(); i++) { + if (val(i) != null) + res.add(val(i)); + } + return res; + } + + /* Обход в глубину */ + private void dfs(Integer i, String order, List res) { + // Если это пустая позиция, вернуть + if (val(i) == null) + return; + // Предварительный обход + if ("pre".equals(order)) + res.add(val(i)); + dfs(left(i), order, res); + // Симметричный обход + if ("in".equals(order)) + res.add(val(i)); + dfs(right(i), order, res); + // Обратный обход + if ("post".equals(order)) + res.add(val(i)); + } + + /* Предварительный обход */ + public List preOrder() { + List res = new ArrayList<>(); + dfs(0, "pre", res); + return res; + } + + /* Симметричный обход */ + public List inOrder() { + List res = new ArrayList<>(); + dfs(0, "in", res); + return res; + } + + /* Обратный обход */ + public List postOrder() { + List res = new ArrayList<>(); + dfs(0, "post", res); + return res; + } +} + +public class array_binary_tree { + public static void main(String[] args) { + // Инициализировать двоичное дерево + // Здесь используется функция, напрямую строящая двоичное дерево из массива + List arr = Arrays.asList(1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15); + + TreeNode root = TreeNode.listToTree(arr); + System.out.println("\nИнициализация двоичного дерева\n"); + System.out.println("Массивное представление двоичного дерева:"); + System.out.println(arr); + System.out.println("Связное представление двоичного дерева:"); + PrintUtil.printTree(root); + + // Класс двоичного дерева в массивном представлении + ArrayBinaryTree abt = new ArrayBinaryTree(arr); + + // Доступ к узлу + int i = 1; + Integer l = abt.left(i); + Integer r = abt.right(i); + Integer p = abt.parent(i); + System.out.println("\nТекущий узел: индекс = " + i + " , значение = " + abt.val(i)); + System.out.println("Индекс левого дочернего узла = " + l + " , значение = " + (l == null ? "null" : abt.val(l))); + System.out.println("Индекс правого дочернего узла = " + r + " , значение = " + (r == null ? "null" : abt.val(r))); + System.out.println("Индекс родительского узла = " + p + " , значение = " + (p == null ? "null" : abt.val(p))); + + // Обходить дерево + List res = abt.levelOrder(); + System.out.println("\nОбход в ширину =" + res); + res = abt.preOrder(); + System.out.println("Предварительный обход =" + res); + res = abt.inOrder(); + System.out.println("Симметричный обход =" + res); + res = abt.postOrder(); + System.out.println("Обратный обход =" + res); + } +} diff --git a/ru/codes/java/chapter_tree/avl_tree.java b/ru/codes/java/chapter_tree/avl_tree.java new file mode 100644 index 000000000..7eb0780f1 --- /dev/null +++ b/ru/codes/java/chapter_tree/avl_tree.java @@ -0,0 +1,220 @@ +/** + * File: avl_tree.java + * Created Time: 2022-12-10 + * Author: krahets (krahets@163.com) + */ + +package chapter_tree; + +import utils.*; + +/* AVL-дерево */ +class AVLTree { + TreeNode root; // Корневой узел + + /* Получить высоту узла */ + public int height(TreeNode node) { + // Высота пустого узла равна -1, высота листового узла равна 0 + return node == null ? -1 : node.height; + } + + /* Обновить высоту узла */ + private void updateHeight(TreeNode node) { + // Высота узла равна высоте более высокого поддерева + 1 + node.height = Math.max(height(node.left), height(node.right)) + 1; + } + + /* Получить коэффициент баланса */ + public int balanceFactor(TreeNode node) { + // Коэффициент баланса пустого узла равен 0 + if (node == null) + return 0; + // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева + return height(node.left) - height(node.right); + } + + /* Операция правого вращения */ + private TreeNode rightRotate(TreeNode node) { + TreeNode child = node.left; + TreeNode grandChild = child.right; + // Выполнить правое вращение узла node вокруг child + child.right = node; + node.left = grandChild; + // Обновить высоту узла + updateHeight(node); + updateHeight(child); + // Вернуть корневой узел поддерева после вращения + return child; + } + + /* Операция левого вращения */ + private TreeNode leftRotate(TreeNode node) { + TreeNode child = node.right; + TreeNode grandChild = child.left; + // Выполнить левое вращение узла node вокруг child + child.left = node; + node.right = grandChild; + // Обновить высоту узла + updateHeight(node); + updateHeight(child); + // Вернуть корневой узел поддерева после вращения + return child; + } + + /* Выполнить вращение, чтобы снова сбалансировать поддерево */ + private TreeNode rotate(TreeNode node) { + // Получить коэффициент баланса узла node + int balanceFactor = balanceFactor(node); + // Левосторонне перекошенное дерево + if (balanceFactor > 1) { + if (balanceFactor(node.left) >= 0) { + // Правое вращение + return rightRotate(node); + } else { + // Сначала левое вращение, затем правое + node.left = leftRotate(node.left); + return rightRotate(node); + } + } + // Правосторонне перекошенное дерево + if (balanceFactor < -1) { + if (balanceFactor(node.right) <= 0) { + // Левое вращение + return leftRotate(node); + } else { + // Сначала правое вращение, затем левое + node.right = rightRotate(node.right); + return leftRotate(node); + } + } + // Дерево сбалансировано, вращение не требуется, вернуть сразу + return node; + } + + /* Вставка узла */ + public void insert(int val) { + root = insertHelper(root, val); + } + + /* Рекурсивная вставка узла (вспомогательный метод) */ + private TreeNode insertHelper(TreeNode node, int val) { + if (node == null) + return new TreeNode(val); + /* 1. Найти позицию вставки и вставить узел */ + if (val < node.val) + node.left = insertHelper(node.left, val); + else if (val > node.val) + node.right = insertHelper(node.right, val); + else + return node; // Повторяющийся узел не вставлять, сразу вернуть + updateHeight(node); // Обновить высоту узла + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = rotate(node); + // Вернуть корневой узел поддерева + return node; + } + + /* Удаление узла */ + public void remove(int val) { + root = removeHelper(root, val); + } + + /* Рекурсивное удаление узла (вспомогательный метод) */ + private TreeNode removeHelper(TreeNode node, int val) { + if (node == null) + return null; + /* 1. Найти узел и удалить его */ + if (val < node.val) + node.left = removeHelper(node.left, val); + else if (val > node.val) + node.right = removeHelper(node.right, val); + else { + if (node.left == null || node.right == null) { + TreeNode child = node.left != null ? node.left : node.right; + // Число дочерних узлов = 0, удалить node и сразу вернуть + if (child == null) + return null; + // Число дочерних узлов = 1, удалить node напрямую + else + node = child; + } else { + // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел + TreeNode temp = node.right; + while (temp.left != null) { + temp = temp.left; + } + node.right = removeHelper(node.right, temp.val); + node.val = temp.val; + } + } + updateHeight(node); // Обновить высоту узла + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = rotate(node); + // Вернуть корневой узел поддерева + return node; + } + + /* Поиск узла */ + public TreeNode search(int val) { + TreeNode cur = root; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Целевой узел находится в правом поддереве cur + if (cur.val < val) + cur = cur.right; + // Целевой узел находится в левом поддереве cur + else if (cur.val > val) + cur = cur.left; + // Найти целевой узел и выйти из цикла + else + break; + } + // Вернуть целевой узел + return cur; + } +} + +public class avl_tree { + static void testInsert(AVLTree tree, int val) { + tree.insert(val); + System.out.println("\nПосле вставки узла " + val + " AVL-дерево имеет вид"); + PrintUtil.printTree(tree.root); + } + + static void testRemove(AVLTree tree, int val) { + tree.remove(val); + System.out.println("\nПосле удаления узла " + val + " AVL-дерево имеет вид"); + PrintUtil.printTree(tree.root); + } + + public static void main(String[] args) { + /* Инициализация пустого AVL-дерева */ + AVLTree avlTree = new AVLTree(); + + /* Вставка узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после вставки узла + testInsert(avlTree, 1); + testInsert(avlTree, 2); + testInsert(avlTree, 3); + testInsert(avlTree, 4); + testInsert(avlTree, 5); + testInsert(avlTree, 8); + testInsert(avlTree, 7); + testInsert(avlTree, 9); + testInsert(avlTree, 10); + testInsert(avlTree, 6); + + /* Вставка повторяющегося узла */ + testInsert(avlTree, 7); + + /* Удаление узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после удаления узла + testRemove(avlTree, 8); // Удаление узла степени 0 + testRemove(avlTree, 5); // Удаление узла степени 1 + testRemove(avlTree, 4); // Удаление узла степени 2 + + /* Поиск узла */ + TreeNode node = avlTree.search(7); + System.out.println("\nНайденный объект узла = " + node + ", значение узла = " + node.val); + } +} diff --git a/ru/codes/java/chapter_tree/binary_search_tree.java b/ru/codes/java/chapter_tree/binary_search_tree.java new file mode 100644 index 000000000..1a8513ea6 --- /dev/null +++ b/ru/codes/java/chapter_tree/binary_search_tree.java @@ -0,0 +1,158 @@ +/** + * File: binary_search_tree.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_tree; + +import utils.*; + +/* Двоичное дерево поиска */ +class BinarySearchTree { + private TreeNode root; + + /* Конструктор */ + public BinarySearchTree() { + // Инициализировать пустое дерево + root = null; + } + + /* Получить корневой узел двоичного дерева */ + public TreeNode getRoot() { + return root; + } + + /* Поиск узла */ + public TreeNode search(int num) { + TreeNode cur = root; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Целевой узел находится в правом поддереве cur + if (cur.val < num) + cur = cur.right; + // Целевой узел находится в левом поддереве cur + else if (cur.val > num) + cur = cur.left; + // Найти целевой узел и выйти из цикла + else + break; + } + // Вернуть целевой узел + return cur; + } + + /* Вставка узла */ + public void insert(int num) { + // Если дерево пусто, инициализировать корневой узел + if (root == null) { + root = new TreeNode(num); + return; + } + TreeNode cur = root, pre = null; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Найти повторяющийся узел и сразу вернуть + if (cur.val == num) + return; + pre = cur; + // Позиция вставки находится в правом поддереве cur + if (cur.val < num) + cur = cur.right; + // Позиция вставки находится в левом поддереве cur + else + cur = cur.left; + } + // Вставка узла + TreeNode node = new TreeNode(num); + if (pre.val < num) + pre.right = node; + else + pre.left = node; + } + + /* Удаление узла */ + public void remove(int num) { + // Если дерево пусто, сразу вернуть + if (root == null) + return; + TreeNode cur = root, pre = null; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Найти узел для удаления и выйти из цикла + if (cur.val == num) + break; + pre = cur; + // Узел для удаления находится в правом поддереве cur + if (cur.val < num) + cur = cur.right; + // Узел для удаления находится в левом поддереве cur + else + cur = cur.left; + } + // Если узел для удаления отсутствует, сразу вернуть + if (cur == null) + return; + // Число дочерних узлов = 0 или 1 + if (cur.left == null || cur.right == null) { + // Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел + TreeNode child = cur.left != null ? cur.left : cur.right; + // Удалить узел cur + if (cur != root) { + if (pre.left == cur) + pre.left = child; + else + pre.right = child; + } else { + // Если удаляемый узел является корнем, заново назначить корневой узел + root = child; + } + } + // Число дочерних узлов = 2 + else { + // Получить следующий узел после cur в симметричном обходе + TreeNode tmp = cur.right; + while (tmp.left != null) { + tmp = tmp.left; + } + // Рекурсивно удалить узел tmp + remove(tmp.val); + // Перезаписать cur значением tmp + cur.val = tmp.val; + } + } +} + +public class binary_search_tree { + public static void main(String[] args) { + /* Инициализация двоичного дерева поиска */ + BinarySearchTree bst = new BinarySearchTree(); + // Обратите внимание: разные порядки вставки порождают разные двоичные деревья; данная последовательность может построить совершенное двоичное дерево + int[] nums = { 8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15 }; + for (int num : nums) { + bst.insert(num); + } + System.out.println("\nИсходное двоичное дерево\n"); + PrintUtil.printTree(bst.getRoot()); + + /* Поиск узла */ + TreeNode node = bst.search(7); + System.out.println("\nНайденный объект узла = " + node + ", значение узла = " + node.val); + + /* Вставка узла */ + bst.insert(16); + System.out.println("\nПосле вставки узла 16 двоичное дерево имеет вид\n"); + PrintUtil.printTree(bst.getRoot()); + + /* Удаление узла */ + bst.remove(1); + System.out.println("\nПосле удаления узла 1 двоичное дерево имеет вид\n"); + PrintUtil.printTree(bst.getRoot()); + bst.remove(2); + System.out.println("\nПосле удаления узла 2 двоичное дерево имеет вид\n"); + PrintUtil.printTree(bst.getRoot()); + bst.remove(4); + System.out.println("\nПосле удаления узла 4 двоичное дерево имеет вид\n"); + PrintUtil.printTree(bst.getRoot()); + } +} diff --git a/ru/codes/java/chapter_tree/binary_tree.java b/ru/codes/java/chapter_tree/binary_tree.java new file mode 100644 index 000000000..76e8a2cc7 --- /dev/null +++ b/ru/codes/java/chapter_tree/binary_tree.java @@ -0,0 +1,40 @@ +/** + * File: binary_tree.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_tree; + +import utils.*; + +public class binary_tree { + public static void main(String[] args) { + /* Инициализация двоичного дерева */ + // Инициализация узла + TreeNode n1 = new TreeNode(1); + TreeNode n2 = new TreeNode(2); + TreeNode n3 = new TreeNode(3); + TreeNode n4 = new TreeNode(4); + TreeNode n5 = new TreeNode(5); + // Построить связи между узлами (указатели) + n1.left = n2; + n1.right = n3; + n2.left = n4; + n2.right = n5; + System.out.println("\nИнициализация двоичного дерева\n"); + PrintUtil.printTree(n1); + + /* Вставка и удаление узлов */ + TreeNode P = new TreeNode(0); + // Вставить узел P между n1 -> n2 + n1.left = P; + P.left = n2; + System.out.println("\nПосле вставки узла P\n"); + PrintUtil.printTree(n1); + // Удалить узел P + n1.left = n2; + System.out.println("\nПосле удаления узла P\n"); + PrintUtil.printTree(n1); + } +} diff --git a/ru/codes/java/chapter_tree/binary_tree_bfs.java b/ru/codes/java/chapter_tree/binary_tree_bfs.java new file mode 100644 index 000000000..8fd21442a --- /dev/null +++ b/ru/codes/java/chapter_tree/binary_tree_bfs.java @@ -0,0 +1,42 @@ +/** + * File: binary_tree_bfs.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_tree; + +import utils.*; +import java.util.*; + +public class binary_tree_bfs { + /* Обход в ширину */ + static List levelOrder(TreeNode root) { + // Инициализировать очередь и добавить корневой узел + Queue queue = new LinkedList<>(); + queue.add(root); + // Инициализировать список для хранения последовательности обхода + List list = new ArrayList<>(); + while (!queue.isEmpty()) { + TreeNode node = queue.poll(); // Извлечение из очереди + list.add(node.val); // Сохранить значение узла + if (node.left != null) + queue.offer(node.left); // Поместить левый дочерний узел в очередь + if (node.right != null) + queue.offer(node.right); // Поместить правый дочерний узел в очередь + } + return list; + } + + public static void main(String[] args) { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из массива + TreeNode root = TreeNode.listToTree(Arrays.asList(1, 2, 3, 4, 5, 6, 7)); + System.out.println("\nИнициализация двоичного дерева\n"); + PrintUtil.printTree(root); + + /* Обход в ширину */ + List list = levelOrder(root); + System.out.println("\nПоследовательность печати узлов при обходе в ширину = " + list); + } +} diff --git a/ru/codes/java/chapter_tree/binary_tree_dfs.java b/ru/codes/java/chapter_tree/binary_tree_dfs.java new file mode 100644 index 000000000..f3ba8ddc8 --- /dev/null +++ b/ru/codes/java/chapter_tree/binary_tree_dfs.java @@ -0,0 +1,68 @@ +/** + * File: binary_tree_dfs.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package chapter_tree; + +import utils.*; +import java.util.*; + +public class binary_tree_dfs { + // Инициализировать список для хранения последовательности обхода + static ArrayList list = new ArrayList<>(); + + /* Предварительный обход */ + static void preOrder(TreeNode root) { + if (root == null) + return; + // Порядок обхода: корень -> левое поддерево -> правое поддерево + list.add(root.val); + preOrder(root.left); + preOrder(root.right); + } + + /* Симметричный обход */ + static void inOrder(TreeNode root) { + if (root == null) + return; + // Порядок обхода: левое поддерево -> корень -> правое поддерево + inOrder(root.left); + list.add(root.val); + inOrder(root.right); + } + + /* Обратный обход */ + static void postOrder(TreeNode root) { + if (root == null) + return; + // Порядок обхода: левое поддерево -> правое поддерево -> корень + postOrder(root.left); + postOrder(root.right); + list.add(root.val); + } + + public static void main(String[] args) { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из массива + TreeNode root = TreeNode.listToTree(Arrays.asList(1, 2, 3, 4, 5, 6, 7)); + System.out.println("\nИнициализация двоичного дерева\n"); + PrintUtil.printTree(root); + + /* Предварительный обход */ + list.clear(); + preOrder(root); + System.out.println("\nПоследовательность печати узлов при предварительном обходе = " + list); + + /* Симметричный обход */ + list.clear(); + inOrder(root); + System.out.println("\nПоследовательность печати узлов при симметричном обходе = " + list); + + /* Обратный обход */ + list.clear(); + postOrder(root); + System.out.println("\nПоследовательность печати узлов при обратном обходе = " + list); + } +} diff --git a/ru/codes/java/utils/ListNode.java b/ru/codes/java/utils/ListNode.java new file mode 100644 index 000000000..b960fdf8f --- /dev/null +++ b/ru/codes/java/utils/ListNode.java @@ -0,0 +1,28 @@ +/** + * File: ListNode.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package utils; + +/* Узел связного списка */ +public class ListNode { + public int val; + public ListNode next; + + public ListNode(int x) { + val = x; + } + + /* Десериализовать список в связный список */ + public static ListNode arrToLinkedList(int[] arr) { + ListNode dum = new ListNode(0); + ListNode head = dum; + for (int val : arr) { + head.next = new ListNode(val); + head = head.next; + } + return dum.next; + } +} diff --git a/ru/codes/java/utils/PrintUtil.java b/ru/codes/java/utils/PrintUtil.java new file mode 100644 index 000000000..325b5f160 --- /dev/null +++ b/ru/codes/java/utils/PrintUtil.java @@ -0,0 +1,116 @@ +/** + * File: PrintUtil.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package utils; + +import java.util.*; + +class Trunk { + Trunk prev; + String str; + + Trunk(Trunk prev, String str) { + this.prev = prev; + this.str = str; + } +}; + +public class PrintUtil { + /* Вывести матрицу (Array) */ + public static void printMatrix(T[][] matrix) { + System.out.println("["); + for (T[] row : matrix) { + System.out.println(" " + row + ","); + } + System.out.println("]"); + } + + /* Вывести матрицу (List) */ + public static void printMatrix(List> matrix) { + System.out.println("["); + for (List row : matrix) { + System.out.println(" " + row + ","); + } + System.out.println("]"); + } + + /* Вывести связный список */ + public static void printLinkedList(ListNode head) { + List list = new ArrayList<>(); + while (head != null) { + list.add(String.valueOf(head.val)); + head = head.next; + } + System.out.println(String.join(" -> ", list)); + } + + /* Вывести двоичное дерево */ + public static void printTree(TreeNode root) { + printTree(root, null, false); + } + + /** + * Вывести двоичное дерево + * Этот вывод дерева заимствован из TECHIE DELIGHT + * https://www.techiedelight.com/c-program-print-binary-tree/ + */ + public static void printTree(TreeNode root, Trunk prev, boolean isRight) { + if (root == null) { + return; + } + + String prev_str = " "; + Trunk trunk = new Trunk(prev, prev_str); + + printTree(root.right, trunk, true); + + if (prev == null) { + trunk.str = "———"; + } else if (isRight) { + trunk.str = "/———"; + prev_str = " |"; + } else { + trunk.str = "\\———"; + prev.str = prev_str; + } + + showTrunks(trunk); + System.out.println(" " + root.val); + + if (prev != null) { + prev.str = prev_str; + } + trunk.str = " |"; + + printTree(root.left, trunk, false); + } + + public static void showTrunks(Trunk p) { + if (p == null) { + return; + } + + showTrunks(p.prev); + System.out.print(p.str); + } + + /* Вывести хеш-таблицу */ + public static void printHashMap(Map map) { + for (Map.Entry kv : map.entrySet()) { + System.out.println(kv.getKey() + " -> " + kv.getValue()); + } + } + + /* Вывести кучу (приоритетную очередь) */ + public static void printHeap(Queue queue) { + List list = new ArrayList<>(queue); + System.out.print("Массивное представление кучи:"); + System.out.println(list); + System.out.println("Древовидное представление кучи:"); + TreeNode root = TreeNode.listToTree(list); + printTree(root); + } +} diff --git a/ru/codes/java/utils/TreeNode.java b/ru/codes/java/utils/TreeNode.java new file mode 100644 index 000000000..0f341a9c7 --- /dev/null +++ b/ru/codes/java/utils/TreeNode.java @@ -0,0 +1,73 @@ +/** + * File: TreeNode.java + * Created Time: 2022-11-25 + * Author: krahets (krahets@163.com) + */ + +package utils; + +import java.util.*; + +/* Класс узла двоичного дерева */ +public class TreeNode { + public int val; // Значение узла + public int height; // Высота узла + public TreeNode left; // Ссылка на левый дочерний узел + public TreeNode right; // Ссылка на правый дочерний узел + + /* Конструктор */ + public TreeNode(int x) { + val = x; + } + + // Правила кодирования сериализации см.: + // https://www.hello-algo.com/chapter_tree/array_representation_of_tree/ + // Массивное представление двоичного дерева: + // [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15] + // Связное представление двоичного дерева: + // /——— 15 + // /——— 7 + // /——— 3 + // | \——— 6 + // | \——— 12 + // ——— 1 + // \——— 2 + // | /——— 9 + // \——— 4 + // \——— 8 + + /* Десериализовать список в двоичное дерево: рекурсия */ + private static TreeNode listToTreeDFS(List arr, int i) { + if (i < 0 || i >= arr.size() || arr.get(i) == null) { + return null; + } + TreeNode root = new TreeNode(arr.get(i)); + root.left = listToTreeDFS(arr, 2 * i + 1); + root.right = listToTreeDFS(arr, 2 * i + 2); + return root; + } + + /* Десериализовать список в двоичное дерево */ + public static TreeNode listToTree(List arr) { + return listToTreeDFS(arr, 0); + } + + /* Сериализовать двоичное дерево в список: рекурсия */ + private static void treeToListDFS(TreeNode root, int i, List res) { + if (root == null) + return; + while (i >= res.size()) { + res.add(null); + } + res.set(i, root.val); + treeToListDFS(root.left, 2 * i + 1, res); + treeToListDFS(root.right, 2 * i + 2, res); + } + + /* Сериализовать двоичное дерево в список */ + public static List treeToList(TreeNode root) { + List res = new ArrayList<>(); + treeToListDFS(root, 0, res); + return res; + } +} diff --git a/ru/codes/java/utils/Vertex.java b/ru/codes/java/utils/Vertex.java new file mode 100644 index 000000000..266b2d83c --- /dev/null +++ b/ru/codes/java/utils/Vertex.java @@ -0,0 +1,36 @@ +/** + * File: Vertex.java + * Created Time: 2023-02-15 + * Author: krahets (krahets@163.com) + */ + +package utils; + +import java.util.*; + +/* Класс вершины */ +public class Vertex { + public int val; + + public Vertex(int val) { + this.val = val; + } + + /* На вход подается список значений vals, на выходе возвращается список вершин vets */ + public static Vertex[] valsToVets(int[] vals) { + Vertex[] vets = new Vertex[vals.length]; + for (int i = 0; i < vals.length; i++) { + vets[i] = new Vertex(vals[i]); + } + return vets; + } + + /* На вход подается список вершин vets, на выходе возвращается список значений vals */ + public static List vetsToVals(List vets) { + List vals = new ArrayList<>(); + for (Vertex vet : vets) { + vals.add(vet.val); + } + return vals; + } +} diff --git a/ru/codes/javascript/.prettierrc b/ru/codes/javascript/.prettierrc new file mode 100644 index 000000000..3f4aa8cb6 --- /dev/null +++ b/ru/codes/javascript/.prettierrc @@ -0,0 +1,6 @@ +{ + "tabWidth": 4, + "useTabs": false, + "semi": true, + "singleQuote": true +} diff --git a/ru/codes/javascript/chapter_array_and_linkedlist/array.js b/ru/codes/javascript/chapter_array_and_linkedlist/array.js new file mode 100644 index 000000000..2fcc45e7d --- /dev/null +++ b/ru/codes/javascript/chapter_array_and_linkedlist/array.js @@ -0,0 +1,97 @@ +/** + * File: array.js + * Created Time: 2022-11-27 + * Author: IsChristina (christinaxia77@foxmail.com) + */ + +/* Случайный доступ к элементу */ +function randomAccess(nums) { + // Случайным образом выбрать число из интервала [0, nums.length) + const random_index = Math.floor(Math.random() * nums.length); + // Получить и вернуть случайный элемент + const random_num = nums[random_index]; + return random_num; +} + +/* Увеличить длину массива */ +// Обратите внимание: Array в JavaScript — это динамический массив, его можно расширять напрямую +// Для удобства обучения в этой функции Array рассматривается как массив неизменяемой длины +function extend(nums, enlarge) { + // Инициализировать массив увеличенной длины + const res = new Array(nums.length + enlarge).fill(0); + // Скопировать все элементы исходного массива в новый массив + for (let i = 0; i < nums.length; i++) { + res[i] = nums[i]; + } + // Вернуть новый массив после расширения + return res; +} + +/* Вставить элемент num по индексу index в массив */ +function insert(nums, num, index) { + // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад + for (let i = nums.length - 1; i > index; i--) { + nums[i] = nums[i - 1]; + } + // Присвоить num элементу по индексу index + nums[index] = num; +} + +/* Удалить элемент по индексу index */ +function remove(nums, index) { + // Сдвинуть все элементы после индекса index на одну позицию вперед + for (let i = index; i < nums.length - 1; i++) { + nums[i] = nums[i + 1]; + } +} + +/* Обход массива */ +function traverse(nums) { + let count = 0; + // Обход массива по индексам + for (let i = 0; i < nums.length; i++) { + count += nums[i]; + } + // Непосредственно обходить элементы массива + for (const num of nums) { + count += num; + } +} + +/* Найти заданный элемент в массиве */ +function find(nums, target) { + for (let i = 0; i < nums.length; i++) { + if (nums[i] === target) return i; + } + return -1; +} + +/* Driver Code */ +/* Инициализация массива */ +const arr = new Array(5).fill(0); +console.log('Массив arr =', arr); +let nums = [1, 3, 2, 5, 4]; +console.log('Массив nums =', nums); + +/* Случайный доступ */ +let random_num = randomAccess(nums); +console.log('Случайный элемент из nums =', random_num); + +/* Расширение длины */ +nums = extend(nums, 3); +console.log('После увеличения длины массива до 8 nums =', nums); + +/* Вставка элемента */ +insert(nums, 6, 3); +console.log('После вставки числа 6 по индексу 3 nums =', nums); + +/* Удаление элемента */ +remove(nums, 2); +console.log('После удаления элемента по индексу 2 nums =', nums); + +/* Обход массива */ +traverse(nums); + +/* Поиск элемента */ +let index = find(nums, 3); +console.log('Поиск элемента 3 в nums: индекс =', index); diff --git a/ru/codes/javascript/chapter_array_and_linkedlist/linked_list.js b/ru/codes/javascript/chapter_array_and_linkedlist/linked_list.js new file mode 100644 index 000000000..c31c77b5d --- /dev/null +++ b/ru/codes/javascript/chapter_array_and_linkedlist/linked_list.js @@ -0,0 +1,82 @@ +/** + * File: linked_list.js + * Created Time: 2022-12-12 + * Author: IsChristina (christinaxia77@foxmail.com), Justin (xiefahit@gmail.com) + */ + +const { printLinkedList } = require('../modules/PrintUtil'); +const { ListNode } = require('../modules/ListNode'); + +/* Вставить узел P после узла n0 в связном списке */ +function insert(n0, P) { + const n1 = n0.next; + P.next = n1; + n0.next = P; +} + +/* Удалить первый узел после узла n0 в связном списке */ +function remove(n0) { + if (!n0.next) return; + // n0 -> P -> n1 + const P = n0.next; + const n1 = P.next; + n0.next = n1; +} + +/* Доступ к узлу связного списка по индексу index */ +function access(head, index) { + for (let i = 0; i < index; i++) { + if (!head) { + return null; + } + head = head.next; + } + return head; +} + +/* Найти в связном списке первый узел со значением target */ +function find(head, target) { + let index = 0; + while (head !== null) { + if (head.val === target) { + return index; + } + head = head.next; + index += 1; + } + return -1; +} + +/* Driver Code */ +/* Инициализация связного списка */ +// Инициализация всех узлов +const n0 = new ListNode(1); +const n1 = new ListNode(3); +const n2 = new ListNode(2); +const n3 = new ListNode(5); +const n4 = new ListNode(4); +// Построить ссылки между узлами +n0.next = n1; +n1.next = n2; +n2.next = n3; +n3.next = n4; +console.log('Исходный связный список'); +printLinkedList(n0); + +/* Вставка узла */ +insert(n0, new ListNode(0)); +console.log('Связный список после вставки узла'); +printLinkedList(n0); + +/* Удаление узла */ +remove(n0); +console.log('Связный список после удаления узла'); +printLinkedList(n0); + +/* Доступ к узлу */ +const node = access(n0, 3); +console.log('Значение узла по индексу 3 в связном списке = ' + node.val); + +/* Поиск узла */ +const index = find(n0, 2); +console.log('Индекс узла со значением 2 в связном списке = ' + index); diff --git a/ru/codes/javascript/chapter_array_and_linkedlist/list.js b/ru/codes/javascript/chapter_array_and_linkedlist/list.js new file mode 100644 index 000000000..0f76e6e89 --- /dev/null +++ b/ru/codes/javascript/chapter_array_and_linkedlist/list.js @@ -0,0 +1,57 @@ +/** + * File: list.js + * Created Time: 2022-12-12 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Инициализация списка */ +const nums = [1, 3, 2, 5, 4]; +console.log(`Список nums = ${nums}`); + +/* Доступ к элементу */ +const num = nums[1]; +console.log(`Элемент по индексу 1: num = ${num}`); + +/* Обновление элемента */ +nums[1] = 0; +console.log(`После обновления элемента по индексу 1 до 0 nums = ${nums}`); + +/* Очистить список */ +nums.length = 0; +console.log(`После очистки списка nums = ${nums}`); + +/* Добавление элемента в конец */ +nums.push(1); +nums.push(3); +nums.push(2); +nums.push(5); +nums.push(4); +console.log(`После добавления элементов nums = ${nums}`); + +/* Вставка элемента в середину */ +nums.splice(3, 0, 6); +console.log(`После вставки числа 6 по индексу 3 nums = ${nums}`); + +/* Удаление элемента */ +nums.splice(3, 1); +console.log(`После удаления элемента по индексу 3 nums = ${nums}`); + +/* Обходить список по индексам */ +let count = 0; +for (let i = 0; i < nums.length; i++) { + count += nums[i]; +} +/* Непосредственно обходить элементы списка */ +count = 0; +for (const x of nums) { + count += x; +} + +/* Объединить два списка */ +const nums1 = [6, 8, 7, 10, 9]; +nums.push(...nums1); +console.log(`После конкатенации списка nums1 к nums nums = ${nums}`); + +/* Отсортировать список */ +nums.sort((a, b) => a - b); +console.log(`После сортировки списка nums = ${nums}`); diff --git a/ru/codes/javascript/chapter_array_and_linkedlist/my_list.js b/ru/codes/javascript/chapter_array_and_linkedlist/my_list.js new file mode 100644 index 000000000..a75ff76bc --- /dev/null +++ b/ru/codes/javascript/chapter_array_and_linkedlist/my_list.js @@ -0,0 +1,141 @@ +/** + * File: my_list.js + * Created Time: 2022-12-12 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Класс списка */ +class MyList { + #arr = new Array(); // Массив (для хранения элементов списка) + #capacity = 10; // Вместимость списка + #size = 0; // Длина списка (текущее число элементов) + #extendRatio = 2; // Коэффициент увеличения списка при каждом расширении + + /* Конструктор */ + constructor() { + this.#arr = new Array(this.#capacity); + } + + /* Получить длину списка (текущее число элементов) */ + size() { + return this.#size; + } + + /* Получить вместимость списка */ + capacity() { + return this.#capacity; + } + + /* Доступ к элементу */ + get(index) { + // Если индекс выходит за границы, выбрасывается исключение; далее аналогично + if (index < 0 || index >= this.#size) throw new Error('индекс выходит за границы'); + return this.#arr[index]; + } + + /* Обновление элемента */ + set(index, num) { + if (index < 0 || index >= this.#size) throw new Error('индекс выходит за границы'); + this.#arr[index] = num; + } + + /* Добавление элемента в конец */ + add(num) { + // Если длина равна вместимости, требуется расширение + if (this.#size === this.#capacity) { + this.extendCapacity(); + } + // Добавить новый элемент в конец списка + this.#arr[this.#size] = num; + this.#size++; + } + + /* Вставка элемента в середину */ + insert(index, num) { + if (index < 0 || index >= this.#size) throw new Error('индекс выходит за границы'); + // При превышении вместимости по числу элементов запускается расширение + if (this.#size === this.#capacity) { + this.extendCapacity(); + } + // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад + for (let j = this.#size - 1; j >= index; j--) { + this.#arr[j + 1] = this.#arr[j]; + } + // Обновить число элементов + this.#arr[index] = num; + this.#size++; + } + + /* Удаление элемента */ + remove(index) { + if (index < 0 || index >= this.#size) throw new Error('индекс выходит за границы'); + let num = this.#arr[index]; + // Сдвинуть все элементы после индекса index на одну позицию вперед + for (let j = index; j < this.#size - 1; j++) { + this.#arr[j] = this.#arr[j + 1]; + } + // Обновить число элементов + this.#size--; + // Вернуть удаленный элемент + return num; + } + + /* Расширение списка */ + extendCapacity() { + // Создать новый массив длиной в extendRatio раз больше исходного и скопировать в него исходный массив + this.#arr = this.#arr.concat( + new Array(this.capacity() * (this.#extendRatio - 1)) + ); + // Обновить вместимость списка + this.#capacity = this.#arr.length; + } + + /* Преобразовать список в массив */ + toArray() { + let size = this.size(); + // Преобразовывать только элементы списка в пределах фактической длины + const arr = new Array(size); + for (let i = 0; i < size; i++) { + arr[i] = this.get(i); + } + return arr; + } +} + +/* Driver Code */ +/* Инициализация списка */ +const nums = new MyList(); +/* Добавление элемента в конец */ +nums.add(1); +nums.add(3); +nums.add(2); +nums.add(5); +nums.add(4); +console.log( + `Список nums = ${nums.toArray()}, вместимость = ${nums.capacity()}, длина = ${nums.size()}` +); + +/* Вставка элемента в середину */ +nums.insert(3, 6); +console.log(`После вставки числа 6 по индексу 3 nums = ${nums.toArray()}`); + +/* Удаление элемента */ +nums.remove(3); +console.log(`После удаления элемента по индексу 3 nums = ${nums.toArray()}`); + +/* Доступ к элементу */ +const num = nums.get(1); +console.log(`Элемент по индексу 1: num = ${num}`); + +/* Обновление элемента */ +nums.set(1, 0); +console.log(`После обновления элемента по индексу 1 до 0 nums = ${nums.toArray()}`); + +/* Проверка механизма расширения */ +for (let i = 0; i < 10; i++) { + // При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения + nums.add(i); +} +console.log( + `Список nums после увеличения вместимости = ${nums.toArray()}, вместимость = ${nums.capacity()}, длина = ${nums.size()}` +); diff --git a/ru/codes/javascript/chapter_backtracking/n_queens.js b/ru/codes/javascript/chapter_backtracking/n_queens.js new file mode 100644 index 000000000..373c7c470 --- /dev/null +++ b/ru/codes/javascript/chapter_backtracking/n_queens.js @@ -0,0 +1,55 @@ +/** + * File: n_queens.js + * Created Time: 2023-05-13 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Алгоритм бэктрекинга: n ферзей */ +function backtrack(row, n, state, res, cols, diags1, diags2) { + // Когда все строки уже обработаны, записать решение + if (row === n) { + res.push(state.map((row) => row.slice())); + return; + } + // Обойти все столбцы + for (let col = 0; col < n; col++) { + // Вычислить главную и побочную диагонали, соответствующие этой клетке + const diag1 = row - col + n - 1; + const diag2 = row + col; + // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей + if (!cols[col] && !diags1[diag1] && !diags2[diag2]) { + // Попытка: поставить ферзя в эту клетку + state[row][col] = 'Q'; + cols[col] = diags1[diag1] = diags2[diag2] = true; + // Перейти к размещению следующей строки + backtrack(row + 1, n, state, res, cols, diags1, diags2); + // Откат: восстановить эту клетку как пустую + state[row][col] = '#'; + cols[col] = diags1[diag1] = diags2[diag2] = false; + } + } +} + +/* Решить задачу о n ферзях */ +function nQueens(n) { + // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку + const state = Array.from({ length: n }, () => Array(n).fill('#')); + const cols = Array(n).fill(false); // Отмечать, есть ли ферзь в столбце + const diags1 = Array(2 * n - 1).fill(false); // Отмечать наличие ферзя на главной диагонали + const diags2 = Array(2 * n - 1).fill(false); // Отмечать наличие ферзя на побочной диагонали + const res = []; + + backtrack(0, n, state, res, cols, diags1, diags2); + return res; +} + +// Driver Code +const n = 4; +const res = nQueens(n); + +console.log(`Размер входной доски = ${n}`); +console.log(`Количество способов расстановки ферзей: ${res.length}`); +res.forEach((state) => { + console.log('--------------------'); + state.forEach((row) => console.log(row)); +}); diff --git a/ru/codes/javascript/chapter_backtracking/permutations_i.js b/ru/codes/javascript/chapter_backtracking/permutations_i.js new file mode 100644 index 000000000..d88f64cd3 --- /dev/null +++ b/ru/codes/javascript/chapter_backtracking/permutations_i.js @@ -0,0 +1,42 @@ +/** + * File: permutations_i.js + * Created Time: 2023-05-13 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Алгоритм бэктрекинга: все перестановки I */ +function backtrack(state, choices, selected, res) { + // Когда длина состояния равна числу элементов, записать решение + if (state.length === choices.length) { + res.push([...state]); + return; + } + // Перебор всех вариантов выбора + choices.forEach((choice, i) => { + // Отсечение: нельзя выбирать один и тот же элемент повторно + if (!selected[i]) { + // Попытка: сделать выбор и обновить состояние + selected[i] = true; + state.push(choice); + // Перейти к следующему выбору + backtrack(state, choices, selected, res); + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false; + state.pop(); + } + }); +} + +/* Все перестановки I */ +function permutationsI(nums) { + const res = []; + backtrack([], nums, Array(nums.length).fill(false), res); + return res; +} + +// Driver Code +const nums = [1, 2, 3]; +const res = permutationsI(nums); + +console.log(`Входной массив nums = ${JSON.stringify(nums)}`); +console.log(`Все перестановки res = ${JSON.stringify(res)}`); diff --git a/ru/codes/javascript/chapter_backtracking/permutations_ii.js b/ru/codes/javascript/chapter_backtracking/permutations_ii.js new file mode 100644 index 000000000..e76e5dbab --- /dev/null +++ b/ru/codes/javascript/chapter_backtracking/permutations_ii.js @@ -0,0 +1,44 @@ +/** + * File: permutations_ii.js + * Created Time: 2023-05-13 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Алгоритм бэктрекинга: все перестановки II */ +function backtrack(state, choices, selected, res) { + // Когда длина состояния равна числу элементов, записать решение + if (state.length === choices.length) { + res.push([...state]); + return; + } + // Перебор всех вариантов выбора + const duplicated = new Set(); + choices.forEach((choice, i) => { + // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы + if (!selected[i] && !duplicated.has(choice)) { + // Попытка: сделать выбор и обновить состояние + duplicated.add(choice); // Записать значения уже выбранных элементов + selected[i] = true; + state.push(choice); + // Перейти к следующему выбору + backtrack(state, choices, selected, res); + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false; + state.pop(); + } + }); +} + +/* Все перестановки II */ +function permutationsII(nums) { + const res = []; + backtrack([], nums, Array(nums.length).fill(false), res); + return res; +} + +// Driver Code +const nums = [1, 2, 2]; +const res = permutationsII(nums); + +console.log(`Входной массив nums = ${JSON.stringify(nums)}`); +console.log(`Все перестановки res = ${JSON.stringify(res)}`); diff --git a/ru/codes/javascript/chapter_backtracking/preorder_traversal_i_compact.js b/ru/codes/javascript/chapter_backtracking/preorder_traversal_i_compact.js new file mode 100644 index 000000000..2eb4db267 --- /dev/null +++ b/ru/codes/javascript/chapter_backtracking/preorder_traversal_i_compact.js @@ -0,0 +1,33 @@ +/** + * File: preorder_traversal_i_compact.js + * Created Time: 2023-05-09 + * Author: Justin (xiefahit@gmail.com) + */ + +const { arrToTree } = require('../modules/TreeNode'); +const { printTree } = require('../modules/PrintUtil'); + +/* Предварительный обход: пример 1 */ +function preOrder(root, res) { + if (root === null) { + return; + } + if (root.val === 7) { + // Записать решение + res.push(root); + } + preOrder(root.left, res); + preOrder(root.right, res); +} + +// Driver Code +const root = arrToTree([1, 7, 3, 4, 5, 6, 7]); +console.log('\nИнициализация двоичного дерева'); +printTree(root); + +// Предварительный обход +const res = []; +preOrder(root, res); + +console.log('\nВсе узлы со значением 7'); +console.log(res.map((node) => node.val)); diff --git a/ru/codes/javascript/chapter_backtracking/preorder_traversal_ii_compact.js b/ru/codes/javascript/chapter_backtracking/preorder_traversal_ii_compact.js new file mode 100644 index 000000000..fec859dab --- /dev/null +++ b/ru/codes/javascript/chapter_backtracking/preorder_traversal_ii_compact.js @@ -0,0 +1,40 @@ +/** + * File: preorder_traversal_ii_compact.js + * Created Time: 2023-05-09 + * Author: Justin (xiefahit@gmail.com) + */ + +const { arrToTree } = require('../modules/TreeNode'); +const { printTree } = require('../modules/PrintUtil'); + +/* Предварительный обход: пример 2 */ +function preOrder(root, path, res) { + if (root === null) { + return; + } + // Попытка + path.push(root); + if (root.val === 7) { + // Записать решение + res.push([...path]); + } + preOrder(root.left, path, res); + preOrder(root.right, path, res); + // Откат + path.pop(); +} + +// Driver Code +const root = arrToTree([1, 7, 3, 4, 5, 6, 7]); +console.log('\nИнициализация двоичного дерева'); +printTree(root); + +// Предварительный обход +const path = []; +const res = []; +preOrder(root, path, res); + +console.log('\nВсе пути от корня к узлу 7'); +res.forEach((path) => { + console.log(path.map((node) => node.val)); +}); diff --git a/ru/codes/javascript/chapter_backtracking/preorder_traversal_iii_compact.js b/ru/codes/javascript/chapter_backtracking/preorder_traversal_iii_compact.js new file mode 100644 index 000000000..3f59d80c9 --- /dev/null +++ b/ru/codes/javascript/chapter_backtracking/preorder_traversal_iii_compact.js @@ -0,0 +1,41 @@ +/** + * File: preorder_traversal_iii_compact.js + * Created Time: 2023-05-09 + * Author: Justin (xiefahit@gmail.com) + */ + +const { arrToTree } = require('../modules/TreeNode'); +const { printTree } = require('../modules/PrintUtil'); + +/* Предварительный обход: пример 3 */ +function preOrder(root, path, res) { + // Отсечение + if (root === null || root.val === 3) { + return; + } + // Попытка + path.push(root); + if (root.val === 7) { + // Записать решение + res.push([...path]); + } + preOrder(root.left, path, res); + preOrder(root.right, path, res); + // Откат + path.pop(); +} + +// Driver Code +const root = arrToTree([1, 7, 3, 4, 5, 6, 7]); +console.log('\nИнициализация двоичного дерева'); +printTree(root); + +// Предварительный обход +const path = []; +const res = []; +preOrder(root, path, res); + +console.log('\nВсе пути от корня к узлу 7, не содержащие узлов со значением 3'); +res.forEach((path) => { + console.log(path.map((node) => node.val)); +}); diff --git a/ru/codes/javascript/chapter_backtracking/preorder_traversal_iii_template.js b/ru/codes/javascript/chapter_backtracking/preorder_traversal_iii_template.js new file mode 100644 index 000000000..9a64962f0 --- /dev/null +++ b/ru/codes/javascript/chapter_backtracking/preorder_traversal_iii_template.js @@ -0,0 +1,68 @@ +/** + * File: preorder_traversal_iii_template.js + * Created Time: 2023-05-09 + * Author: Justin (xiefahit@gmail.com) + */ + +const { arrToTree } = require('../modules/TreeNode'); +const { printTree } = require('../modules/PrintUtil'); + +/* Проверить, является ли текущее состояние решением */ +function isSolution(state) { + return state && state[state.length - 1]?.val === 7; +} + +/* Записать решение */ +function recordSolution(state, res) { + res.push([...state]); +} + +/* Проверить, допустим ли этот выбор в текущем состоянии */ +function isValid(state, choice) { + return choice !== null && choice.val !== 3; +} + +/* Обновить состояние */ +function makeChoice(state, choice) { + state.push(choice); +} + +/* Восстановить состояние */ +function undoChoice(state) { + state.pop(); +} + +/* Алгоритм бэктрекинга: пример 3 */ +function backtrack(state, choices, res) { + // Проверить, является ли текущее состояние решением + if (isSolution(state)) { + // Записать решение + recordSolution(state, res); + } + // Перебор всех вариантов выбора + for (const choice of choices) { + // Отсечение: проверить допустимость выбора + if (isValid(state, choice)) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state, choice); + // Перейти к следующему выбору + backtrack(state, [choice.left, choice.right], res); + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state); + } + } +} + +// Driver Code +const root = arrToTree([1, 7, 3, 4, 5, 6, 7]); +console.log('\nИнициализация двоичного дерева'); +printTree(root); + +// Алгоритм бэктрекинга +const res = []; +backtrack([], [root], res); + +console.log('\nВсе пути от корня к узлу 7, в которых путь не содержит узлов со значением 3'); +res.forEach((path) => { + console.log(path.map((node) => node.val)); +}); diff --git a/ru/codes/javascript/chapter_backtracking/subset_sum_i.js b/ru/codes/javascript/chapter_backtracking/subset_sum_i.js new file mode 100644 index 000000000..db4ad898b --- /dev/null +++ b/ru/codes/javascript/chapter_backtracking/subset_sum_i.js @@ -0,0 +1,46 @@ +/** + * File: subset_sum_i.js + * Created Time: 2023-07-30 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +function backtrack(state, target, choices, start, res) { + // Если сумма подмножества равна target, записать решение + if (target === 0) { + res.push([...state]); + return; + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + for (let i = start; i < choices.length; i++) { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if (target - choices[i] < 0) { + break; + } + // Попытка: сделать выбор и обновить target и start + state.push(choices[i]); + // Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.pop(); + } +} + +/* Решить задачу суммы подмножеств I */ +function subsetSumI(nums, target) { + const state = []; // Состояние (подмножество) + nums.sort((a, b) => a - b); // Отсортировать nums + const start = 0; // Стартовая вершина обхода + const res = []; // Список результатов (список подмножеств) + backtrack(state, target, nums, start, res); + return res; +} + +/* Driver Code */ +const nums = [3, 4, 5]; +const target = 9; +const res = subsetSumI(nums, target); +console.log(`Входной массив nums = ${JSON.stringify(nums)}, target = ${target}`); +console.log(`Все подмножества с суммой ${target}: res = ${JSON.stringify(res)}`); diff --git a/ru/codes/javascript/chapter_backtracking/subset_sum_i_naive.js b/ru/codes/javascript/chapter_backtracking/subset_sum_i_naive.js new file mode 100644 index 000000000..a50d8c1ee --- /dev/null +++ b/ru/codes/javascript/chapter_backtracking/subset_sum_i_naive.js @@ -0,0 +1,44 @@ +/** + * File: subset_sum_i_naive.js + * Created Time: 2023-07-30 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +function backtrack(state, target, total, choices, res) { + // Если сумма подмножества равна target, записать решение + if (total === target) { + res.push([...state]); + return; + } + // Перебор всех вариантов выбора + for (let i = 0; i < choices.length; i++) { + // Отсечение: если сумма подмножества превышает target, пропустить этот выбор + if (total + choices[i] > target) { + continue; + } + // Попытка: сделать выбор и обновить элемент и total + state.push(choices[i]); + // Перейти к следующему выбору + backtrack(state, target, total + choices[i], choices, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.pop(); + } +} + +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */ +function subsetSumINaive(nums, target) { + const state = []; // Состояние (подмножество) + const total = 0; // Сумма подмножеств + const res = []; // Список результатов (список подмножеств) + backtrack(state, target, total, nums, res); + return res; +} + +/* Driver Code */ +const nums = [3, 4, 5]; +const target = 9; +const res = subsetSumINaive(nums, target); +console.log(`Входной массив nums = ${JSON.stringify(nums)}, target = ${target}`); +console.log(`Все подмножества с суммой ${target}: res = ${JSON.stringify(res)}`); +console.log('Обратите внимание: результат этого метода содержит повторяющиеся множества'); diff --git a/ru/codes/javascript/chapter_backtracking/subset_sum_ii.js b/ru/codes/javascript/chapter_backtracking/subset_sum_ii.js new file mode 100644 index 000000000..b6dc15177 --- /dev/null +++ b/ru/codes/javascript/chapter_backtracking/subset_sum_ii.js @@ -0,0 +1,51 @@ +/** + * File: subset_sum_ii.js + * Created Time: 2023-07-30 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Алгоритм бэктрекинга: сумма подмножеств II */ +function backtrack(state, target, choices, start, res) { + // Если сумма подмножества равна target, записать решение + if (target === 0) { + res.push([...state]); + return; + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента + for (let i = start; i < choices.length; i++) { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if (target - choices[i] < 0) { + break; + } + // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить + if (i > start && choices[i] === choices[i - 1]) { + continue; + } + // Попытка: сделать выбор и обновить target и start + state.push(choices[i]); + // Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i + 1, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.pop(); + } +} + +/* Решить задачу суммы подмножеств II */ +function subsetSumII(nums, target) { + const state = []; // Состояние (подмножество) + nums.sort((a, b) => a - b); // Отсортировать nums + const start = 0; // Стартовая вершина обхода + const res = []; // Список результатов (список подмножеств) + backtrack(state, target, nums, start, res); + return res; +} + +/* Driver Code */ +const nums = [4, 4, 5]; +const target = 9; +const res = subsetSumII(nums, target); +console.log(`Входной массив nums = ${JSON.stringify(nums)}, target = ${target}`); +console.log(`Все подмножества с суммой ${target}: res = ${JSON.stringify(res)}`); diff --git a/ru/codes/javascript/chapter_computational_complexity/iteration.js b/ru/codes/javascript/chapter_computational_complexity/iteration.js new file mode 100644 index 000000000..3bae20b95 --- /dev/null +++ b/ru/codes/javascript/chapter_computational_complexity/iteration.js @@ -0,0 +1,70 @@ +/** + * File: iteration.js + * Created Time: 2023-08-28 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Цикл for */ +function forLoop(n) { + let res = 0; + // Циклическое суммирование 1, 2, ..., n-1, n + for (let i = 1; i <= n; i++) { + res += i; + } + return res; +} + +/* Цикл while */ +function whileLoop(n) { + let res = 0; + let i = 1; // Инициализация условной переменной + // Циклическое суммирование 1, 2, ..., n-1, n + while (i <= n) { + res += i; + i++; // Обновить условную переменную + } + return res; +} + +/* Цикл while (двойное обновление) */ +function whileLoopII(n) { + let res = 0; + let i = 1; // Инициализация условной переменной + // Циклическое суммирование 1, 4, 10, ... + while (i <= n) { + res += i; + // Обновить условную переменную + i++; + i *= 2; + } + return res; +} + +/* Двойной цикл for */ +function nestedForLoop(n) { + let res = ''; + // Цикл по i = 1, 2, ..., n-1, n + for (let i = 1; i <= n; i++) { + // Цикл по j = 1, 2, ..., n-1, n + for (let j = 1; j <= n; j++) { + res += `(${i}, ${j}), `; + } + } + return res; +} + +/* Driver Code */ +const n = 5; +let res; + +res = forLoop(n); +console.log(`Результат суммирования в цикле for res = ${res}`); + +res = whileLoop(n); +console.log(`Результат суммирования в цикле while res = ${res}`); + +res = whileLoopII(n); +console.log(`Результат суммирования в цикле while (двойное обновление) res = ${res}`); + +const resStr = nestedForLoop(n); +console.log(`Результат обхода в двойном цикле for ${resStr}`); diff --git a/ru/codes/javascript/chapter_computational_complexity/recursion.js b/ru/codes/javascript/chapter_computational_complexity/recursion.js new file mode 100644 index 000000000..0c9493b37 --- /dev/null +++ b/ru/codes/javascript/chapter_computational_complexity/recursion.js @@ -0,0 +1,69 @@ +/** + * File: recursion.js + * Created Time: 2023-08-28 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Рекурсия */ +function recur(n) { + // Условие завершения + if (n === 1) return 1; + // Рекурсия: рекурсивный вызов + const res = recur(n - 1); + // Возврат: вернуть результат + return n + res; +} + +/* Имитация рекурсии итерацией */ +function forLoopRecur(n) { + // Использовать явный стек для имитации системного стека вызовов + const stack = []; + let res = 0; + // Рекурсия: рекурсивный вызов + for (let i = n; i > 0; i--) { + // Имитировать «рекурсию» с помощью операции помещения в стек + stack.push(i); + } + // Возврат: вернуть результат + while (stack.length) { + // Имитировать «возврат» с помощью операции извлечения из стека + res += stack.pop(); + } + // res = 1+2+3+...+n + return res; +} + +/* Хвостовая рекурсия */ +function tailRecur(n, res) { + // Условие завершения + if (n === 0) return res; + // Хвостовой рекурсивный вызов + return tailRecur(n - 1, res + n); +} + +/* Последовательность Фибоначчи: рекурсия */ +function fib(n) { + // Условие завершения: f(1) = 0, f(2) = 1 + if (n === 1 || n === 2) return n - 1; + // Рекурсивный вызов f(n) = f(n-1) + f(n-2) + const res = fib(n - 1) + fib(n - 2); + // Вернуть результат f(n) + return res; +} + +/* Driver Code */ +const n = 5; +let res; + +res = recur(n); +console.log(`Результат суммирования в рекурсивной функции res = ${res}`); + +res = forLoopRecur(n); +console.log(`Результат суммирования при имитации рекурсии итерацией res = ${res}`); + +res = tailRecur(n, 0); +console.log(`Результат суммирования в хвостовой рекурсии res = ${res}`); + +res = fib(n); +console.log(`Член последовательности Фибоначчи с номером ${n} = ${res}`); + diff --git a/ru/codes/javascript/chapter_computational_complexity/space_complexity.js b/ru/codes/javascript/chapter_computational_complexity/space_complexity.js new file mode 100644 index 000000000..66e1f739d --- /dev/null +++ b/ru/codes/javascript/chapter_computational_complexity/space_complexity.js @@ -0,0 +1,103 @@ +/** + * File: space_complexity.js + * Created Time: 2023-02-05 + * Author: Justin (xiefahit@gmail.com) + */ + +const { ListNode } = require('../modules/ListNode'); +const { TreeNode } = require('../modules/TreeNode'); +const { printTree } = require('../modules/PrintUtil'); + +/* Функция */ +function constFunc() { + // Выполнить некоторые операции + return 0; +} + +/* Постоянная сложность */ +function constant(n) { + // Константы, переменные и объекты занимают O(1) памяти + const a = 0; + const b = 0; + const nums = new Array(10000); + const node = new ListNode(0); + // Переменные в цикле занимают O(1) памяти + for (let i = 0; i < n; i++) { + const c = 0; + } + // Функции в цикле занимают O(1) памяти + for (let i = 0; i < n; i++) { + constFunc(); + } +} + +/* Линейная сложность */ +function linear(n) { + // Массив длины n занимает O(n) памяти + const nums = new Array(n); + // Список длины n занимает O(n) памяти + const nodes = []; + for (let i = 0; i < n; i++) { + nodes.push(new ListNode(i)); + } + // Хеш-таблица длины n занимает O(n) памяти + const map = new Map(); + for (let i = 0; i < n; i++) { + map.set(i, i.toString()); + } +} + +/* Линейная сложность (рекурсивная реализация) */ +function linearRecur(n) { + console.log(`Рекурсия n = ${n}`); + if (n === 1) return; + linearRecur(n - 1); +} + +/* Квадратичная сложность */ +function quadratic(n) { + // Матрица занимает O(n^2) памяти + const numMatrix = Array(n) + .fill(null) + .map(() => Array(n).fill(null)); + // Двумерный список занимает O(n^2) памяти + const numList = []; + for (let i = 0; i < n; i++) { + const tmp = []; + for (let j = 0; j < n; j++) { + tmp.push(0); + } + numList.push(tmp); + } +} + +/* Квадратичная сложность (рекурсивная реализация) */ +function quadraticRecur(n) { + if (n <= 0) return 0; + const nums = new Array(n); + console.log(`В рекурсии n = ${n} длина nums = ${nums.length}`); + return quadraticRecur(n - 1); +} + +/* Экспоненциальная сложность (построение полного двоичного дерева) */ +function buildTree(n) { + if (n === 0) return null; + const root = new TreeNode(0); + root.left = buildTree(n - 1); + root.right = buildTree(n - 1); + return root; +} + +/* Driver Code */ +const n = 5; +// Постоянная сложность +constant(n); +// Линейная сложность +linear(n); +linearRecur(n); +// Квадратичная сложность +quadratic(n); +quadraticRecur(n); +// Экспоненциальная сложность +const root = buildTree(n); +printTree(root); diff --git a/ru/codes/javascript/chapter_computational_complexity/time_complexity.js b/ru/codes/javascript/chapter_computational_complexity/time_complexity.js new file mode 100644 index 000000000..e2c6ef6ba --- /dev/null +++ b/ru/codes/javascript/chapter_computational_complexity/time_complexity.js @@ -0,0 +1,155 @@ +/** + * File: time_complexity.js + * Created Time: 2023-01-02 + * Author: RiverTwilight (contact@rene.wang) + */ + +/* Постоянная сложность */ +function constant(n) { + let count = 0; + const size = 100000; + for (let i = 0; i < size; i++) count++; + return count; +} + +/* Линейная сложность */ +function linear(n) { + let count = 0; + for (let i = 0; i < n; i++) count++; + return count; +} + +/* Линейная сложность (обход массива) */ +function arrayTraversal(nums) { + let count = 0; + // Число итераций пропорционально длине массива + for (let i = 0; i < nums.length; i++) { + count++; + } + return count; +} + +/* Квадратичная сложность */ +function quadratic(n) { + let count = 0; + // Число итераций квадратично зависит от размера данных n + for (let i = 0; i < n; i++) { + for (let j = 0; j < n; j++) { + count++; + } + } + return count; +} + +/* Квадратичная сложность (пузырьковая сортировка) */ +function bubbleSort(nums) { + let count = 0; // Счетчик + // Внешний цикл: неотсортированный диапазон [0, i] + for (let i = nums.length - 1; i > 0; i--) { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (let j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + let tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + count += 3; // Обмен элементов включает 3 элементарные операции + } + } + } + return count; +} + +/* Экспоненциальная сложность (итеративная реализация) */ +function exponential(n) { + let count = 0, + base = 1; + // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1) + for (let i = 0; i < n; i++) { + for (let j = 0; j < base; j++) { + count++; + } + base *= 2; + } + // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1 + return count; +} + +/* Экспоненциальная сложность (рекурсивная реализация) */ +function expRecur(n) { + if (n === 1) return 1; + return expRecur(n - 1) + expRecur(n - 1) + 1; +} + +/* Логарифмическая сложность (итеративная реализация) */ +function logarithmic(n) { + let count = 0; + while (n > 1) { + n = n / 2; + count++; + } + return count; +} + +/* Логарифмическая сложность (рекурсивная реализация) */ +function logRecur(n) { + if (n <= 1) return 0; + return logRecur(n / 2) + 1; +} + +/* Линейно-логарифмическая сложность */ +function linearLogRecur(n) { + if (n <= 1) return 1; + let count = linearLogRecur(n / 2) + linearLogRecur(n / 2); + for (let i = 0; i < n; i++) { + count++; + } + return count; +} + +/* Факториальная сложность (рекурсивная реализация) */ +function factorialRecur(n) { + if (n === 0) return 1; + let count = 0; + // Из одного получается n + for (let i = 0; i < n; i++) { + count += factorialRecur(n - 1); + } + return count; +} + +/* Driver Code */ +// Можно изменить n и запустить программу, чтобы увидеть, как меняется число операций при разных сложностях +const n = 8; +console.log('Размер входных данных n = ' + n); + +let count = constant(n); +console.log('Число операций константной сложности = ' + count); + +count = linear(n); +console.log('Число операций линейной сложности = ' + count); +count = arrayTraversal(new Array(n)); +console.log('Число операций линейной сложности (обход массива) = ' + count); + +count = quadratic(n); +console.log('Число операций квадратичной сложности = ' + count); +let nums = new Array(n); +for (let i = 0; i < n; i++) nums[i] = n - i; // [n,n-1,...,2,1] +count = bubbleSort(nums); +console.log('Число операций квадратичной сложности (пузырьковая сортировка) = ' + count); + +count = exponential(n); +console.log('Число операций экспоненциальной сложности (итеративная реализация) = ' + count); +count = expRecur(n); +console.log('Число операций экспоненциальной сложности (рекурсивная реализация) = ' + count); + +count = logarithmic(n); +console.log('Число операций логарифмической сложности (итеративная реализация) = ' + count); +count = logRecur(n); +console.log('Число операций логарифмической сложности (рекурсивная реализация) = ' + count); + +count = linearLogRecur(n); +console.log('Число операций линейно-логарифмической сложности (рекурсивная реализация) = ' + count); + +count = factorialRecur(n); +console.log('Число операций факториальной сложности (рекурсивная реализация) = ' + count); diff --git a/ru/codes/javascript/chapter_computational_complexity/worst_best_time_complexity.js b/ru/codes/javascript/chapter_computational_complexity/worst_best_time_complexity.js new file mode 100644 index 000000000..216aa9025 --- /dev/null +++ b/ru/codes/javascript/chapter_computational_complexity/worst_best_time_complexity.js @@ -0,0 +1,43 @@ +/** + * File: worst_best_time_complexity.js + * Created Time: 2023-01-05 + * Author: RiverTwilight (contact@rene.wang) + */ + +/* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */ +function randomNumbers(n) { + const nums = Array(n); + // Создать массив nums = { 1, 2, 3, ..., n } + for (let i = 0; i < n; i++) { + nums[i] = i + 1; + } + // Случайно перемешать элементы массива + for (let i = 0; i < n; i++) { + const r = Math.floor(Math.random() * (i + 1)); + const temp = nums[i]; + nums[i] = nums[r]; + nums[r] = temp; + } + return nums; +} + +/* Найти индекс числа 1 в массиве nums */ +function findOne(nums) { + for (let i = 0; i < nums.length; i++) { + // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1) + // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n) + if (nums[i] === 1) { + return i; + } + } + return -1; +} + +/* Driver Code */ +for (let i = 0; i < 10; i++) { + const n = 100; + const nums = randomNumbers(n); + const index = findOne(nums); + console.log('\nМассив [1, 2, ..., n] после перемешивания = [' + nums.join(', ') + ']'); + console.log('Индекс числа 1 = ' + index); +} diff --git a/ru/codes/javascript/chapter_divide_and_conquer/binary_search_recur.js b/ru/codes/javascript/chapter_divide_and_conquer/binary_search_recur.js new file mode 100644 index 000000000..5913fcafc --- /dev/null +++ b/ru/codes/javascript/chapter_divide_and_conquer/binary_search_recur.js @@ -0,0 +1,39 @@ +/** + * File: binary_search_recur.js + * Created Time: 2023-07-30 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Бинарный поиск: задача f(i, j) */ +function dfs(nums, target, i, j) { + // Если интервал пуст, целевой элемент отсутствует, вернуть -1 + if (i > j) { + return -1; + } + // Вычислить индекс середины m + const m = i + ((j - i) >> 1); + if (nums[m] < target) { + // Рекурсивная подзадача f(m+1, j) + return dfs(nums, target, m + 1, j); + } else if (nums[m] > target) { + // Рекурсивная подзадача f(i, m-1) + return dfs(nums, target, i, m - 1); + } else { + // Целевой элемент найден, вернуть его индекс + return m; + } +} + +/* Бинарный поиск */ +function binarySearch(nums, target) { + const n = nums.length; + // Решить задачу f(0, n-1) + return dfs(nums, target, 0, n - 1); +} + +/* Driver Code */ +const target = 6; +const nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; +// Бинарный поиск (двусторонне замкнутый интервал) +const index = binarySearch(nums, target); +console.log(`Индекс целевого элемента 6 = ${index}`); diff --git a/ru/codes/javascript/chapter_divide_and_conquer/build_tree.js b/ru/codes/javascript/chapter_divide_and_conquer/build_tree.js new file mode 100644 index 000000000..71122ed6f --- /dev/null +++ b/ru/codes/javascript/chapter_divide_and_conquer/build_tree.js @@ -0,0 +1,44 @@ +/** + * File: build_tree.js + * Created Time: 2023-07-30 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +const { printTree } = require('../modules/PrintUtil'); +const { TreeNode } = require('../modules/TreeNode'); + +/* Построить двоичное дерево: разделяй и властвуй */ +function dfs(preorder, inorderMap, i, l, r) { + // Завершить при пустом диапазоне поддерева + if (r - l < 0) return null; + // Инициализировать корневой узел + const root = new TreeNode(preorder[i]); + // Найти m, чтобы разделить левое и правое поддеревья + const m = inorderMap.get(preorder[i]); + // Подзадача: построить левое поддерево + root.left = dfs(preorder, inorderMap, i + 1, l, m - 1); + // Подзадача: построить правое поддерево + root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r); + // Вернуть корневой узел + return root; +} + +/* Построить двоичное дерево */ +function buildTree(preorder, inorder) { + // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам + let inorderMap = new Map(); + for (let i = 0; i < inorder.length; i++) { + inorderMap.set(inorder[i], i); + } + const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1); + return root; +} + +/* Driver Code */ +const preorder = [3, 9, 2, 1, 7]; +const inorder = [9, 3, 1, 2, 7]; +console.log('Предварительный обход = ' + JSON.stringify(preorder)); +console.log('Симметричный обход = ' + JSON.stringify(inorder)); +const root = buildTree(preorder, inorder); +console.log('Построенное двоичное дерево:'); +printTree(root); diff --git a/ru/codes/javascript/chapter_divide_and_conquer/hanota.js b/ru/codes/javascript/chapter_divide_and_conquer/hanota.js new file mode 100644 index 000000000..672aad719 --- /dev/null +++ b/ru/codes/javascript/chapter_divide_and_conquer/hanota.js @@ -0,0 +1,52 @@ +/** + * File: hanota.js + * Created Time: 2023-07-30 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Переместить один диск */ +function move(src, tar) { + // Снять диск с вершины src + const pan = src.pop(); + // Положить диск на вершину tar + tar.push(pan); +} + +/* Решить задачу Ханойской башни f(i) */ +function dfs(i, src, buf, tar) { + // Если в src остался только один диск, сразу переместить его в tar + if (i === 1) { + move(src, tar); + return; + } + // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar + dfs(i - 1, src, tar, buf); + // Подзадача f(1): переместить оставшийся один диск из src в tar + move(src, tar); + // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src + dfs(i - 1, buf, src, tar); +} + +/* Решить задачу Ханойской башни */ +function solveHanota(A, B, C) { + const n = A.length; + // Переместить верхние n дисков из A в C с помощью B + dfs(n, A, B, C); +} + +/* Driver Code */ +// Хвост списка соответствует вершине столбца +const A = [5, 4, 3, 2, 1]; +const B = []; +const C = []; +console.log('Исходное состояние:'); +console.log(`A = ${JSON.stringify(A)}`); +console.log(`B = ${JSON.stringify(B)}`); +console.log(`C = ${JSON.stringify(C)}`); + +solveHanota(A, B, C); + +console.log('После завершения перемещения дисков:'); +console.log(`A = ${JSON.stringify(A)}`); +console.log(`B = ${JSON.stringify(B)}`); +console.log(`C = ${JSON.stringify(C)}`); diff --git a/ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_backtrack.js b/ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_backtrack.js new file mode 100644 index 000000000..dcba9f613 --- /dev/null +++ b/ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_backtrack.js @@ -0,0 +1,34 @@ +/** + * File: climbing_stairs_backtrack.js + * Created Time: 2023-07-26 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Бэктрекинг */ +function backtrack(choices, state, n, res) { + // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1 + if (state === n) res.set(0, res.get(0) + 1); + // Перебор всех вариантов выбора + for (const choice of choices) { + // Отсечение: нельзя выходить за n-ю ступень + if (state + choice > n) continue; + // Попытка: сделать выбор и обновить состояние + backtrack(choices, state + choice, n, res); + // Откат + } +} + +/* Подъем по лестнице: бэктрекинг */ +function climbingStairsBacktrack(n) { + const choices = [1, 2]; // Можно подняться на 1 или 2 ступени + const state = 0; // Начать подъем с 0-й ступени + const res = new Map(); + res.set(0, 0); // Использовать res[0] для хранения числа решений + backtrack(choices, state, n, res); + return res.get(0); +} + +/* Driver Code */ +const n = 9; +const res = climbingStairsBacktrack(n); +console.log(`Количество способов подняться по лестнице из ${n} ступеней = ${res}`); diff --git a/ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_constraint_dp.js b/ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_constraint_dp.js new file mode 100644 index 000000000..7d075e9fb --- /dev/null +++ b/ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_constraint_dp.js @@ -0,0 +1,30 @@ +/** + * File: climbing_stairs_constraint_dp.js + * Created Time: 2023-08-23 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Подъем по лестнице с ограничениями: динамическое программирование */ +function climbingStairsConstraintDP(n) { + if (n === 1 || n === 2) { + return 1; + } + // Инициализация таблицы dp для хранения решений подзадач + const dp = Array.from(new Array(n + 1), () => new Array(3)); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1][1] = 1; + dp[1][2] = 0; + dp[2][1] = 0; + dp[2][2] = 1; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (let i = 3; i <= n; i++) { + dp[i][1] = dp[i - 1][2]; + dp[i][2] = dp[i - 2][1] + dp[i - 2][2]; + } + return dp[n][1] + dp[n][2]; +} + +/* Driver Code */ +const n = 9; +const res = climbingStairsConstraintDP(n); +console.log(`Количество способов подняться по лестнице из ${n} ступеней = ${res}`); diff --git a/ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_dfs.js b/ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_dfs.js new file mode 100644 index 000000000..7644adc52 --- /dev/null +++ b/ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_dfs.js @@ -0,0 +1,24 @@ +/** + * File: climbing_stairs_dfs.js + * Created Time: 2023-07-26 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Поиск */ +function dfs(i) { + // dp[1] и dp[2] уже известны, вернуть их + if (i === 1 || i === 2) return i; + // dp[i] = dp[i-1] + dp[i-2] + const count = dfs(i - 1) + dfs(i - 2); + return count; +} + +/* Подъем по лестнице: поиск */ +function climbingStairsDFS(n) { + return dfs(n); +} + +/* Driver Code */ +const n = 9; +const res = climbingStairsDFS(n); +console.log(`Количество способов подняться по лестнице из ${n} ступеней = ${res}`); diff --git a/ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_dfs_mem.js b/ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_dfs_mem.js new file mode 100644 index 000000000..6a7fb0f14 --- /dev/null +++ b/ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_dfs_mem.js @@ -0,0 +1,30 @@ +/** + * File: climbing_stairs_dfs_mem.js + * Created Time: 2023-07-26 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Поиск с мемоизацией */ +function dfs(i, mem) { + // dp[1] и dp[2] уже известны, вернуть их + if (i === 1 || i === 2) return i; + // Если запись dp[i] существует, сразу вернуть ее + if (mem[i] != -1) return mem[i]; + // dp[i] = dp[i-1] + dp[i-2] + const count = dfs(i - 1, mem) + dfs(i - 2, mem); + // Сохранить dp[i] + mem[i] = count; + return count; +} + +/* Подъем по лестнице: поиск с мемоизацией */ +function climbingStairsDFSMem(n) { + // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи + const mem = new Array(n + 1).fill(-1); + return dfs(n, mem); +} + +/* Driver Code */ +const n = 9; +const res = climbingStairsDFSMem(n); +console.log(`Количество способов подняться по лестнице из ${n} ступеней = ${res}`); diff --git a/ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_dp.js b/ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_dp.js new file mode 100644 index 000000000..547908cb4 --- /dev/null +++ b/ru/codes/javascript/chapter_dynamic_programming/climbing_stairs_dp.js @@ -0,0 +1,40 @@ +/** + * File: climbing_stairs_dp.js + * Created Time: 2023-07-26 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Подъем по лестнице: динамическое программирование */ +function climbingStairsDP(n) { + if (n === 1 || n === 2) return n; + // Инициализация таблицы dp для хранения решений подзадач + const dp = new Array(n + 1).fill(-1); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = 1; + dp[2] = 2; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (let i = 3; i <= n; i++) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + return dp[n]; +} + +/* Подъем по лестнице: динамическое программирование с оптимизацией памяти */ +function climbingStairsDPComp(n) { + if (n === 1 || n === 2) return n; + let a = 1, + b = 2; + for (let i = 3; i <= n; i++) { + const tmp = b; + b = a + b; + a = tmp; + } + return b; +} + +/* Driver Code */ +const n = 9; +let res = climbingStairsDP(n); +console.log(`Количество способов подняться по лестнице из ${n} ступеней = ${res}`); +res = climbingStairsDPComp(n); +console.log(`Количество способов подняться по лестнице из ${n} ступеней = ${res}`); diff --git a/ru/codes/javascript/chapter_dynamic_programming/coin_change.js b/ru/codes/javascript/chapter_dynamic_programming/coin_change.js new file mode 100644 index 000000000..cc915ed7e --- /dev/null +++ b/ru/codes/javascript/chapter_dynamic_programming/coin_change.js @@ -0,0 +1,66 @@ +/** + * File: coin_change.js + * Created Time: 2023-08-23 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Размен монет: динамическое программирование */ +function coinChangeDP(coins, amt) { + const n = coins.length; + const MAX = amt + 1; + // Инициализация таблицы dp + const dp = Array.from({ length: n + 1 }, () => + Array.from({ length: amt + 1 }, () => 0) + ); + // Переход состояний: первая строка и первый столбец + for (let a = 1; a <= amt; a++) { + dp[0][a] = MAX; + } + // Переход состояний: остальные строки и столбцы + for (let i = 1; i <= n; i++) { + for (let a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1); + } + } + } + return dp[n][amt] !== MAX ? dp[n][amt] : -1; +} + +/* Размен монет: динамическое программирование с оптимизацией памяти */ +function coinChangeDPComp(coins, amt) { + const n = coins.length; + const MAX = amt + 1; + // Инициализация таблицы dp + const dp = Array.from({ length: amt + 1 }, () => MAX); + dp[0] = 0; + // Переход состояний + for (let i = 1; i <= n; i++) { + for (let a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1); + } + } + } + return dp[amt] !== MAX ? dp[amt] : -1; +} + +/* Driver Code */ +const coins = [1, 2, 5]; +const amt = 4; + +// Динамическое программирование +let res = coinChangeDP(coins, amt); +console.log(`Минимальное число монет для набора целевой суммы = ${res}`); + +// Динамическое программирование с оптимизацией памяти +res = coinChangeDPComp(coins, amt); +console.log(`Минимальное число монет для набора целевой суммы = ${res}`); diff --git a/ru/codes/javascript/chapter_dynamic_programming/coin_change_ii.js b/ru/codes/javascript/chapter_dynamic_programming/coin_change_ii.js new file mode 100644 index 000000000..24256f0b7 --- /dev/null +++ b/ru/codes/javascript/chapter_dynamic_programming/coin_change_ii.js @@ -0,0 +1,64 @@ +/** + * File: coin_change_ii.js + * Created Time: 2023-08-23 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Размен монет II: динамическое программирование */ +function coinChangeIIDP(coins, amt) { + const n = coins.length; + // Инициализация таблицы dp + const dp = Array.from({ length: n + 1 }, () => + Array.from({ length: amt + 1 }, () => 0) + ); + // Инициализация первого столбца + for (let i = 0; i <= n; i++) { + dp[i][0] = 1; + } + // Переход состояний + for (let i = 1; i <= n; i++) { + for (let a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a]; + } else { + // Сумма двух решений: не брать или взять монету i + dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]; + } + } + } + return dp[n][amt]; +} + +/* Размен монет II: динамическое программирование с оптимизацией памяти */ +function coinChangeIIDPComp(coins, amt) { + const n = coins.length; + // Инициализация таблицы dp + const dp = Array.from({ length: amt + 1 }, () => 0); + dp[0] = 1; + // Переход состояний + for (let i = 1; i <= n; i++) { + for (let a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Сумма двух решений: не брать или взять монету i + dp[a] = dp[a] + dp[a - coins[i - 1]]; + } + } + } + return dp[amt]; +} + +/* Driver Code */ +const coins = [1, 2, 5]; +const amt = 5; + +// Динамическое программирование +let res = coinChangeIIDP(coins, amt); +console.log(`Количество комбинаций монет для набора целевой суммы = ${res}`); + +// Динамическое программирование с оптимизацией памяти +res = coinChangeIIDPComp(coins, amt); +console.log(`Количество комбинаций монет для набора целевой суммы = ${res}`); diff --git a/ru/codes/javascript/chapter_dynamic_programming/edit_distance.js b/ru/codes/javascript/chapter_dynamic_programming/edit_distance.js new file mode 100644 index 000000000..4f0de16da --- /dev/null +++ b/ru/codes/javascript/chapter_dynamic_programming/edit_distance.js @@ -0,0 +1,135 @@ +/** + * File: edit_distance.js + * Created Time: 2023-08-23 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Редакционное расстояние: полный перебор */ +function editDistanceDFS(s, t, i, j) { + // Если s и t пусты, вернуть 0 + if (i === 0 && j === 0) return 0; + + // Если s пусто, вернуть длину t + if (i === 0) return j; + + // Если t пусто, вернуть длину s + if (j === 0) return i; + + // Если два символа равны, сразу пропустить их + if (s.charAt(i - 1) === t.charAt(j - 1)) + return editDistanceDFS(s, t, i - 1, j - 1); + + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + const insert = editDistanceDFS(s, t, i, j - 1); + const del = editDistanceDFS(s, t, i - 1, j); + const replace = editDistanceDFS(s, t, i - 1, j - 1); + // Вернуть минимальное число шагов редактирования + return Math.min(insert, del, replace) + 1; +} + +/* Редакционное расстояние: поиск с мемоизацией */ +function editDistanceDFSMem(s, t, mem, i, j) { + // Если s и t пусты, вернуть 0 + if (i === 0 && j === 0) return 0; + + // Если s пусто, вернуть длину t + if (i === 0) return j; + + // Если t пусто, вернуть длину s + if (j === 0) return i; + + // Если запись уже есть, сразу вернуть ее + if (mem[i][j] !== -1) return mem[i][j]; + + // Если два символа равны, сразу пропустить их + if (s.charAt(i - 1) === t.charAt(j - 1)) + return editDistanceDFSMem(s, t, mem, i - 1, j - 1); + + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + const insert = editDistanceDFSMem(s, t, mem, i, j - 1); + const del = editDistanceDFSMem(s, t, mem, i - 1, j); + const replace = editDistanceDFSMem(s, t, mem, i - 1, j - 1); + // Сохранить и вернуть минимальное число шагов редактирования + mem[i][j] = Math.min(insert, del, replace) + 1; + return mem[i][j]; +} + +/* Редакционное расстояние: динамическое программирование */ +function editDistanceDP(s, t) { + const n = s.length, + m = t.length; + const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0)); + // Переход состояний: первая строка и первый столбец + for (let i = 1; i <= n; i++) { + dp[i][0] = i; + } + for (let j = 1; j <= m; j++) { + dp[0][j] = j; + } + // Переход состояний: остальные строки и столбцы + for (let i = 1; i <= n; i++) { + for (let j = 1; j <= m; j++) { + if (s.charAt(i - 1) === t.charAt(j - 1)) { + // Если два символа равны, сразу пропустить их + dp[i][j] = dp[i - 1][j - 1]; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[i][j] = + Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1; + } + } + } + return dp[n][m]; +} + +/* Редакционное расстояние: динамическое программирование с оптимизацией памяти */ +function editDistanceDPComp(s, t) { + const n = s.length, + m = t.length; + const dp = new Array(m + 1).fill(0); + // Переход состояний: первая строка + for (let j = 1; j <= m; j++) { + dp[j] = j; + } + // Переход состояний: остальные строки + for (let i = 1; i <= n; i++) { + // Переход состояний: первый столбец + let leftup = dp[0]; // Временно сохранить dp[i-1, j-1] + dp[0] = i; + // Переход состояний: остальные столбцы + for (let j = 1; j <= m; j++) { + const temp = dp[j]; + if (s.charAt(i - 1) === t.charAt(j - 1)) { + // Если два символа равны, сразу пропустить их + dp[j] = leftup; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1; + } + leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации + } + } + return dp[m]; +} + +const s = 'bag'; +const t = 'pack'; +const n = s.length, + m = t.length; + +// Полный перебор +let res = editDistanceDFS(s, t, n, m); +console.log(`Чтобы преобразовать ${s} в ${t}, нужно минимум ${res} шагов`); + +// Поиск с мемоизацией +const mem = Array.from(new Array(n + 1), () => new Array(m + 1).fill(-1)); +res = editDistanceDFSMem(s, t, mem, n, m); +console.log(`Чтобы преобразовать ${s} в ${t}, нужно минимум ${res} шагов`); + +// Динамическое программирование +res = editDistanceDP(s, t); +console.log(`Чтобы преобразовать ${s} в ${t}, нужно минимум ${res} шагов`); + +// Динамическое программирование с оптимизацией памяти +res = editDistanceDPComp(s, t); +console.log(`Чтобы преобразовать ${s} в ${t}, нужно минимум ${res} шагов`); diff --git a/ru/codes/javascript/chapter_dynamic_programming/knapsack.js b/ru/codes/javascript/chapter_dynamic_programming/knapsack.js new file mode 100644 index 000000000..1a5508cd4 --- /dev/null +++ b/ru/codes/javascript/chapter_dynamic_programming/knapsack.js @@ -0,0 +1,113 @@ +/** + * File: knapsack.js + * Created Time: 2023-08-23 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Рюкзак 0-1: полный перебор */ +function knapsackDFS(wgt, val, i, c) { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i === 0 || c === 0) { + return 0; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (wgt[i - 1] > c) { + return knapsackDFS(wgt, val, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + const no = knapsackDFS(wgt, val, i - 1, c); + const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]; + // Вернуть вариант с большей стоимостью из двух возможных + return Math.max(no, yes); +} + +/* Рюкзак 0-1: поиск с мемоизацией */ +function knapsackDFSMem(wgt, val, mem, i, c) { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i === 0 || c === 0) { + return 0; + } + // Если запись уже есть, вернуть сразу + if (mem[i][c] !== -1) { + return mem[i][c]; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (wgt[i - 1] > c) { + return knapsackDFSMem(wgt, val, mem, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + const no = knapsackDFSMem(wgt, val, mem, i - 1, c); + const yes = + knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]; + // Сохранить и вернуть вариант с большей стоимостью из двух решений + mem[i][c] = Math.max(no, yes); + return mem[i][c]; +} + +/* Рюкзак 0-1: динамическое программирование */ +function knapsackDP(wgt, val, cap) { + const n = wgt.length; + // Инициализация таблицы dp + const dp = Array(n + 1) + .fill(0) + .map(() => Array(cap + 1).fill(0)); + // Переход состояний + for (let i = 1; i <= n; i++) { + for (let c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = Math.max( + dp[i - 1][c], + dp[i - 1][c - wgt[i - 1]] + val[i - 1] + ); + } + } + } + return dp[n][cap]; +} + +/* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */ +function knapsackDPComp(wgt, val, cap) { + const n = wgt.length; + // Инициализация таблицы dp + const dp = Array(cap + 1).fill(0); + // Переход состояний + for (let i = 1; i <= n; i++) { + // Обход в обратном порядке + for (let c = cap; c >= 1; c--) { + if (wgt[i - 1] <= c) { + // Большее из двух решений: не брать или взять предмет i + dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[cap]; +} + +/* Driver Code */ +const wgt = [10, 20, 30, 40, 50]; +const val = [50, 120, 150, 210, 240]; +const cap = 50; +const n = wgt.length; + +// Полный перебор +let res = knapsackDFS(wgt, val, n, cap); +console.log(`Максимальная стоимость предметов без превышения вместимости рюкзака = ${res}`); + +// Поиск с мемоизацией +const mem = Array.from({ length: n + 1 }, () => + Array.from({ length: cap + 1 }, () => -1) +); +res = knapsackDFSMem(wgt, val, mem, n, cap); +console.log(`Максимальная стоимость предметов без превышения вместимости рюкзака = ${res}`); + +// Динамическое программирование +res = knapsackDP(wgt, val, cap); +console.log(`Максимальная стоимость предметов без превышения вместимости рюкзака = ${res}`); + +// Динамическое программирование с оптимизацией памяти +res = knapsackDPComp(wgt, val, cap); +console.log(`Максимальная стоимость предметов без превышения вместимости рюкзака = ${res}`); diff --git a/ru/codes/javascript/chapter_dynamic_programming/min_cost_climbing_stairs_dp.js b/ru/codes/javascript/chapter_dynamic_programming/min_cost_climbing_stairs_dp.js new file mode 100644 index 000000000..0f45f71e1 --- /dev/null +++ b/ru/codes/javascript/chapter_dynamic_programming/min_cost_climbing_stairs_dp.js @@ -0,0 +1,49 @@ +/** + * File: min_cost_climbing_stairs_dp.js + * Created Time: 2023-08-23 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Минимальная стоимость подъема по лестнице: динамическое программирование */ +function minCostClimbingStairsDP(cost) { + const n = cost.length - 1; + if (n === 1 || n === 2) { + return cost[n]; + } + // Инициализация таблицы dp для хранения решений подзадач + const dp = new Array(n + 1); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = cost[1]; + dp[2] = cost[2]; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (let i = 3; i <= n; i++) { + dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i]; + } + return dp[n]; +} + +/* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */ +function minCostClimbingStairsDPComp(cost) { + const n = cost.length - 1; + if (n === 1 || n === 2) { + return cost[n]; + } + let a = cost[1], + b = cost[2]; + for (let i = 3; i <= n; i++) { + const tmp = b; + b = Math.min(a, tmp) + cost[i]; + a = tmp; + } + return b; +} + +/* Driver Code */ +const cost = [0, 1, 10, 1, 1, 1, 10, 1, 1, 10, 1]; +console.log('Список стоимостей ступеней =', cost); + +let res = minCostClimbingStairsDP(cost); +console.log(`Минимальная стоимость подъема по лестнице = ${res}`); + +res = minCostClimbingStairsDPComp(cost); +console.log(`Минимальная стоимость подъема по лестнице = ${res}`); diff --git a/ru/codes/javascript/chapter_dynamic_programming/min_path_sum.js b/ru/codes/javascript/chapter_dynamic_programming/min_path_sum.js new file mode 100644 index 000000000..1b5629149 --- /dev/null +++ b/ru/codes/javascript/chapter_dynamic_programming/min_path_sum.js @@ -0,0 +1,121 @@ +/** + * File: min_path_sum.js + * Created Time: 2023-08-23 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Минимальная сумма пути: полный перебор */ +function minPathSumDFS(grid, i, j) { + // Если это верхняя левая ячейка, завершить поиск + if (i === 0 && j === 0) { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 || j < 0) { + return Infinity; + } + // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1) + const up = minPathSumDFS(grid, i - 1, j); + const left = minPathSumDFS(grid, i, j - 1); + // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + return Math.min(left, up) + grid[i][j]; +} + +/* Минимальная сумма пути: поиск с мемоизацией */ +function minPathSumDFSMem(grid, mem, i, j) { + // Если это верхняя левая ячейка, завершить поиск + if (i === 0 && j === 0) { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 || j < 0) { + return Infinity; + } + // Если запись уже есть, вернуть сразу + if (mem[i][j] !== -1) { + return mem[i][j]; + } + // Минимальная стоимость пути для левой и верхней ячеек + const up = minPathSumDFSMem(grid, mem, i - 1, j); + const left = minPathSumDFSMem(grid, mem, i, j - 1); + // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + mem[i][j] = Math.min(left, up) + grid[i][j]; + return mem[i][j]; +} + +/* Минимальная сумма пути: динамическое программирование */ +function minPathSumDP(grid) { + const n = grid.length, + m = grid[0].length; + // Инициализация таблицы dp + const dp = Array.from({ length: n }, () => + Array.from({ length: m }, () => 0) + ); + dp[0][0] = grid[0][0]; + // Переход состояний: первая строка + for (let j = 1; j < m; j++) { + dp[0][j] = dp[0][j - 1] + grid[0][j]; + } + // Переход состояний: первый столбец + for (let i = 1; i < n; i++) { + dp[i][0] = dp[i - 1][0] + grid[i][0]; + } + // Переход состояний: остальные строки и столбцы + for (let i = 1; i < n; i++) { + for (let j = 1; j < m; j++) { + dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]; + } + } + return dp[n - 1][m - 1]; +} + +/* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */ +function minPathSumDPComp(grid) { + const n = grid.length, + m = grid[0].length; + // Инициализация таблицы dp + const dp = new Array(m); + // Переход состояний: первая строка + dp[0] = grid[0][0]; + for (let j = 1; j < m; j++) { + dp[j] = dp[j - 1] + grid[0][j]; + } + // Переход состояний: остальные строки + for (let i = 1; i < n; i++) { + // Переход состояний: первый столбец + dp[0] = dp[0] + grid[i][0]; + // Переход состояний: остальные столбцы + for (let j = 1; j < m; j++) { + dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j]; + } + } + return dp[m - 1]; +} + +/* Driver Code */ +const grid = [ + [1, 3, 1, 5], + [2, 2, 4, 2], + [5, 3, 2, 1], + [4, 3, 5, 2], +]; +const n = grid.length, + m = grid[0].length; +// Полный перебор +let res = minPathSumDFS(grid, n - 1, m - 1); +console.log(`Минимальная сумма пути из левого верхнего угла в правый нижний = ${res}`); + +// Поиск с мемоизацией +const mem = Array.from({ length: n }, () => + Array.from({ length: m }, () => -1) +); +res = minPathSumDFSMem(grid, mem, n - 1, m - 1); +console.log(`Минимальная сумма пути из левого верхнего угла в правый нижний = ${res}`); + +// Динамическое программирование +res = minPathSumDP(grid); +console.log(`Минимальная сумма пути из левого верхнего угла в правый нижний = ${res}`); + +// Динамическое программирование с оптимизацией памяти +res = minPathSumDPComp(grid); +console.log(`Минимальная сумма пути из левого верхнего угла в правый нижний = ${res}`); diff --git a/ru/codes/javascript/chapter_dynamic_programming/unbounded_knapsack.js b/ru/codes/javascript/chapter_dynamic_programming/unbounded_knapsack.js new file mode 100644 index 000000000..dbd623260 --- /dev/null +++ b/ru/codes/javascript/chapter_dynamic_programming/unbounded_knapsack.js @@ -0,0 +1,63 @@ +/** + * File: unbounded_knapsack.js + * Created Time: 2023-08-23 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Полный рюкзак: динамическое программирование */ +function unboundedKnapsackDP(wgt, val, cap) { + const n = wgt.length; + // Инициализация таблицы dp + const dp = Array.from({ length: n + 1 }, () => + Array.from({ length: cap + 1 }, () => 0) + ); + // Переход состояний + for (let i = 1; i <= n; i++) { + for (let c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = Math.max( + dp[i - 1][c], + dp[i][c - wgt[i - 1]] + val[i - 1] + ); + } + } + } + return dp[n][cap]; +} + +/* Полный рюкзак: динамическое программирование с оптимизацией памяти */ +function unboundedKnapsackDPComp(wgt, val, cap) { + const n = wgt.length; + // Инициализация таблицы dp + const dp = Array.from({ length: cap + 1 }, () => 0); + // Переход состояний + for (let i = 1; i <= n; i++) { + for (let c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[cap]; +} + +/* Driver Code */ +const wgt = [1, 2, 3]; +const val = [5, 11, 15]; +const cap = 4; + +// Динамическое программирование +let res = unboundedKnapsackDP(wgt, val, cap); +console.log(`Максимальная стоимость предметов без превышения вместимости рюкзака = ${res}`); + +// Динамическое программирование с оптимизацией памяти +res = unboundedKnapsackDPComp(wgt, val, cap); +console.log(`Максимальная стоимость предметов без превышения вместимости рюкзака = ${res}`); diff --git a/ru/codes/javascript/chapter_graph/graph_adjacency_list.js b/ru/codes/javascript/chapter_graph/graph_adjacency_list.js new file mode 100644 index 000000000..0e0598979 --- /dev/null +++ b/ru/codes/javascript/chapter_graph/graph_adjacency_list.js @@ -0,0 +1,142 @@ +/** + * File: graph_adjacency_list.js + * Created Time: 2023-02-09 + * Author: Justin (xiefahit@gmail.com) + */ + +const { Vertex } = require('../modules/Vertex'); + +/* Класс неориентированного графа на основе списка смежности */ +class GraphAdjList { + // Список смежности, где key — вершина, а value — все смежные ей вершины + adjList; + + /* Конструктор */ + constructor(edges) { + this.adjList = new Map(); + // Добавить все вершины и ребра + for (const edge of edges) { + this.addVertex(edge[0]); + this.addVertex(edge[1]); + this.addEdge(edge[0], edge[1]); + } + } + + /* Получить число вершин */ + size() { + return this.adjList.size; + } + + /* Добавление ребра */ + addEdge(vet1, vet2) { + if ( + !this.adjList.has(vet1) || + !this.adjList.has(vet2) || + vet1 === vet2 + ) { + throw new Error('Illegal Argument Exception'); + } + // Добавить ребро vet1 - vet2 + this.adjList.get(vet1).push(vet2); + this.adjList.get(vet2).push(vet1); + } + + /* Удаление ребра */ + removeEdge(vet1, vet2) { + if ( + !this.adjList.has(vet1) || + !this.adjList.has(vet2) || + vet1 === vet2 || + this.adjList.get(vet1).indexOf(vet2) === -1 + ) { + throw new Error('Illegal Argument Exception'); + } + // Удалить ребро vet1 - vet2 + this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1); + this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1); + } + + /* Добавление вершины */ + addVertex(vet) { + if (this.adjList.has(vet)) return; + // Добавить новый список в список смежности + this.adjList.set(vet, []); + } + + /* Удаление вершины */ + removeVertex(vet) { + if (!this.adjList.has(vet)) { + throw new Error('Illegal Argument Exception'); + } + // Удалить из списка смежности список, соответствующий вершине vet + this.adjList.delete(vet); + // Обойти списки других вершин и удалить все ребра, содержащие vet + for (const set of this.adjList.values()) { + const index = set.indexOf(vet); + if (index > -1) { + set.splice(index, 1); + } + } + } + + /* Вывести список смежности */ + print() { + console.log('Список смежности ='); + for (const [key, value] of this.adjList) { + const tmp = []; + for (const vertex of value) { + tmp.push(vertex.val); + } + console.log(key.val + ': ' + tmp.join()); + } + } +} + +if (require.main === module) { + /* Driver Code */ + /* Инициализация неориентированного графа */ + const v0 = new Vertex(1), + v1 = new Vertex(3), + v2 = new Vertex(2), + v3 = new Vertex(5), + v4 = new Vertex(4); + const edges = [ + [v0, v1], + [v1, v2], + [v2, v3], + [v0, v3], + [v2, v4], + [v3, v4], + ]; + const graph = new GraphAdjList(edges); + console.log('\nГраф после инициализации'); + graph.print(); + + /* Добавление ребра */ + // Вершины 1 и 2 соответствуют v0 и v2 + graph.addEdge(v0, v2); + console.log('\nГраф после добавления ребра 1-2'); + graph.print(); + + /* Удаление ребра */ + // Вершины 1 и 3 соответствуют v0 и v1 + graph.removeEdge(v0, v1); + console.log('\nГраф после удаления ребра 1-3'); + graph.print(); + + /* Добавление вершины */ + const v5 = new Vertex(6); + graph.addVertex(v5); + console.log('\nГраф после добавления вершины 6'); + graph.print(); + + /* Удаление вершины */ + // Вершина 3 соответствует v1 + graph.removeVertex(v1); + console.log('\nГраф после удаления вершины 3'); + graph.print(); +} + +module.exports = { + GraphAdjList, +}; diff --git a/ru/codes/javascript/chapter_graph/graph_adjacency_matrix.js b/ru/codes/javascript/chapter_graph/graph_adjacency_matrix.js new file mode 100644 index 000000000..2d18e6549 --- /dev/null +++ b/ru/codes/javascript/chapter_graph/graph_adjacency_matrix.js @@ -0,0 +1,132 @@ +/** + * File: graph_adjacency_matrix.js + * Created Time: 2023-02-09 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +/* Класс неориентированного графа на основе матрицы смежности */ +class GraphAdjMat { + vertices; // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин» + adjMat; // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин» + + /* Конструктор */ + constructor(vertices, edges) { + this.vertices = []; + this.adjMat = []; + // Добавление вершины + for (const val of vertices) { + this.addVertex(val); + } + // Добавить ребра + // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices + for (const e of edges) { + this.addEdge(e[0], e[1]); + } + } + + /* Получить число вершин */ + size() { + return this.vertices.length; + } + + /* Добавление вершины */ + addVertex(val) { + const n = this.size(); + // Добавить значение новой вершины в список вершин + this.vertices.push(val); + // Добавить строку в матрицу смежности + const newRow = []; + for (let j = 0; j < n; j++) { + newRow.push(0); + } + this.adjMat.push(newRow); + // Добавить столбец в матрицу смежности + for (const row of this.adjMat) { + row.push(0); + } + } + + /* Удаление вершины */ + removeVertex(index) { + if (index >= this.size()) { + throw new RangeError('Index Out Of Bounds Exception'); + } + // Удалить вершину с индексом index из списка вершин + this.vertices.splice(index, 1); + + // Удалить строку с индексом index из матрицы смежности + this.adjMat.splice(index, 1); + // Удалить столбец с индексом index из матрицы смежности + for (const row of this.adjMat) { + row.splice(index, 1); + } + } + + /* Добавление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + addEdge(i, j) { + // Обработка выхода индекса за границы и случая равенства + if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) { + throw new RangeError('Index Out Of Bounds Exception'); + } + // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) === (j, i) + this.adjMat[i][j] = 1; + this.adjMat[j][i] = 1; + } + + /* Удаление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + removeEdge(i, j) { + // Обработка выхода индекса за границы и случая равенства + if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) { + throw new RangeError('Index Out Of Bounds Exception'); + } + this.adjMat[i][j] = 0; + this.adjMat[j][i] = 0; + } + + /* Вывести матрицу смежности */ + print() { + console.log('Список вершин = ', this.vertices); + console.log('Матрица смежности =', this.adjMat); + } +} + +/* Driver Code */ +/* Инициализация неориентированного графа */ +// Обратите внимание: элементы edges представляют индексы вершин, то есть соответствуют индексам элементов vertices +const vertices = [1, 3, 2, 5, 4]; +const edges = [ + [0, 1], + [1, 2], + [2, 3], + [0, 3], + [2, 4], + [3, 4], +]; +const graph = new GraphAdjMat(vertices, edges); +console.log('\nГраф после инициализации'); +graph.print(); + +/* Добавление ребра */ +// Индексы вершин 1 и 2 равны 0 и 2 соответственно +graph.addEdge(0, 2); +console.log('\nГраф после добавления ребра 1-2'); +graph.print(); + +/* Удаление ребра */ +// Индексы вершин 1 и 3 равны 0 и 1 соответственно +graph.removeEdge(0, 1); +console.log('\nГраф после удаления ребра 1-3'); +graph.print(); + +/* Добавление вершины */ +graph.addVertex(6); +console.log('\nГраф после добавления вершины 6'); +graph.print(); + +/* Удаление вершины */ +// Индекс вершины 3 равен 1 +graph.removeVertex(1); +console.log('\nГраф после удаления вершины 3'); +graph.print(); diff --git a/ru/codes/javascript/chapter_graph/graph_bfs.js b/ru/codes/javascript/chapter_graph/graph_bfs.js new file mode 100644 index 000000000..51770146d --- /dev/null +++ b/ru/codes/javascript/chapter_graph/graph_bfs.js @@ -0,0 +1,61 @@ +/** + * File: graph_bfs.js + * Created Time: 2023-02-21 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +const { GraphAdjList } = require('./graph_adjacency_list'); +const { Vertex } = require('../modules/Vertex'); + +/* Обход в ширину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +function graphBFS(graph, startVet) { + // Последовательность обхода вершин + const res = []; + // Хеш-множество для хранения уже посещенных вершин + const visited = new Set(); + visited.add(startVet); + // Очередь используется для реализации BFS + const que = [startVet]; + // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины + while (que.length) { + const vet = que.shift(); // Извлечь головную вершину из очереди + res.push(vet); // Отметить посещенную вершину + // Обойти все смежные вершины данной вершины + for (const adjVet of graph.adjList.get(vet) ?? []) { + if (visited.has(adjVet)) { + continue; // Пропустить уже посещенную вершину + } + que.push(adjVet); // Помещать в очередь только непосещенные вершины + visited.add(adjVet); // Отметить эту вершину как посещенную + } + } + // Вернуть последовательность обхода вершин + return res; +} + +/* Driver Code */ +/* Инициализация неориентированного графа */ +const v = Vertex.valsToVets([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); +const 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]], +]; +const graph = new GraphAdjList(edges); +console.log('\nГраф после инициализации'); +graph.print(); + +/* Обход в ширину */ +const res = graphBFS(graph, v[0]); +console.log('\nПоследовательность вершин при обходе в ширину (BFS)'); +console.log(Vertex.vetsToVals(res)); diff --git a/ru/codes/javascript/chapter_graph/graph_dfs.js b/ru/codes/javascript/chapter_graph/graph_dfs.js new file mode 100644 index 000000000..38f4314d9 --- /dev/null +++ b/ru/codes/javascript/chapter_graph/graph_dfs.js @@ -0,0 +1,54 @@ +/** + * File: graph_dfs.js + * Created Time: 2023-02-21 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +const { Vertex } = require('../modules/Vertex'); +const { GraphAdjList } = require('./graph_adjacency_list'); + +/* Обход в глубину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +function dfs(graph, visited, res, vet) { + res.push(vet); // Отметить посещенную вершину + visited.add(vet); // Отметить эту вершину как посещенную + // Обойти все смежные вершины данной вершины + for (const adjVet of graph.adjList.get(vet)) { + if (visited.has(adjVet)) { + continue; // Пропустить уже посещенную вершину + } + // Рекурсивно обходить смежные вершины + dfs(graph, visited, res, adjVet); + } +} + +/* Обход в глубину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +function graphDFS(graph, startVet) { + // Последовательность обхода вершин + const res = []; + // Хеш-множество для хранения уже посещенных вершин + const visited = new Set(); + dfs(graph, visited, res, startVet); + return res; +} + +/* Driver Code */ +/* Инициализация неориентированного графа */ +const v = Vertex.valsToVets([0, 1, 2, 3, 4, 5, 6]); +const 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]], +]; +const graph = new GraphAdjList(edges); +console.log('\nГраф после инициализации'); +graph.print(); + +/* Обход в глубину */ +const res = graphDFS(graph, v[0]); +console.log('\nПоследовательность вершин при обходе в глубину (DFS)'); +console.log(Vertex.vetsToVals(res)); diff --git a/ru/codes/javascript/chapter_greedy/coin_change_greedy.js b/ru/codes/javascript/chapter_greedy/coin_change_greedy.js new file mode 100644 index 000000000..783e137cc --- /dev/null +++ b/ru/codes/javascript/chapter_greedy/coin_change_greedy.js @@ -0,0 +1,48 @@ +/** + * File: coin_change_greedy.js + * Created Time: 2023-09-02 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Размен монет: жадный алгоритм */ +function coinChangeGreedy(coins, amt) { + // Предположить, что массив coins упорядочен + let i = coins.length - 1; + let count = 0; + // Циклически выполнять жадный выбор, пока не останется суммы + while (amt > 0) { + // Найти монету, которая меньше остатка суммы и наиболее к нему близка + while (i > 0 && coins[i] > amt) { + i--; + } + // Выбрать coins[i] + amt -= coins[i]; + count++; + } + // Если допустимое решение не найдено, вернуть -1 + return amt === 0 ? count : -1; +} + +/* Driver Code */ +// Жадный подход: гарантирует нахождение глобально оптимального решения +let coins = [1, 5, 10, 20, 50, 100]; +let amt = 186; +let res = coinChangeGreedy(coins, amt); +console.log(`\ncoins = ${coins}, amt = ${amt}`); +console.log(`Минимальное число монет для набора суммы ${amt} = ${res}`); + +// Жадный подход: не гарантирует нахождение глобально оптимального решения +coins = [1, 20, 50]; +amt = 60; +res = coinChangeGreedy(coins, amt); +console.log(`\ncoins = ${coins}, amt = ${amt}`); +console.log(`Минимальное число монет для набора суммы ${amt} = ${res}`); +console.log('На самом деле минимум равен 3: 20 + 20 + 20'); + +// Жадный подход: не гарантирует нахождение глобально оптимального решения +coins = [1, 49, 50]; +amt = 98; +res = coinChangeGreedy(coins, amt); +console.log(`\ncoins = ${coins}, amt = ${amt}`); +console.log(`Минимальное число монет для набора суммы ${amt} = ${res}`); +console.log('На самом деле минимум равен 2: 49 + 49'); diff --git a/ru/codes/javascript/chapter_greedy/fractional_knapsack.js b/ru/codes/javascript/chapter_greedy/fractional_knapsack.js new file mode 100644 index 000000000..4a27077d0 --- /dev/null +++ b/ru/codes/javascript/chapter_greedy/fractional_knapsack.js @@ -0,0 +1,46 @@ +/** + * File: fractional_knapsack.js + * Created Time: 2023-09-02 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Предмет */ +class Item { + constructor(w, v) { + this.w = w; // Вес предмета + this.v = v; // Стоимость предмета + } +} + +/* Дробный рюкзак: жадный алгоритм */ +function fractionalKnapsack(wgt, val, cap) { + // Создать список предметов с двумя свойствами: вес и стоимость + const items = wgt.map((w, i) => new Item(w, val[i])); + // Отсортировать по удельной стоимости item.v / item.w в порядке убывания + items.sort((a, b) => b.v / b.w - a.v / a.w); + // Циклический жадный выбор + let res = 0; + for (const item of items) { + if (item.w <= cap) { + // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком + res += item.v; + cap -= item.w; + } else { + // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета + res += (item.v / item.w) * cap; + // Свободной вместимости больше не осталось, поэтому выйти из цикла + break; + } + } + return res; +} + +/* Driver Code */ +const wgt = [10, 20, 30, 40, 50]; +const val = [50, 120, 150, 210, 240]; +const cap = 50; +const n = wgt.length; + +// Жадный алгоритм +const res = fractionalKnapsack(wgt, val, cap); +console.log(`Максимальная стоимость предметов без превышения вместимости рюкзака = ${res}`); diff --git a/ru/codes/javascript/chapter_greedy/max_capacity.js b/ru/codes/javascript/chapter_greedy/max_capacity.js new file mode 100644 index 000000000..0de17158b --- /dev/null +++ b/ru/codes/javascript/chapter_greedy/max_capacity.js @@ -0,0 +1,34 @@ +/** + * File: max_capacity.js + * Created Time: 2023-09-02 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Максимальная вместимость: жадный алгоритм */ +function maxCapacity(ht) { + // Инициализировать i и j так, чтобы они располагались по двум концам массива + let i = 0, + j = ht.length - 1; + // Начальная максимальная вместимость равна 0 + let res = 0; + // Выполнять жадный выбор в цикле, пока две доски не встретятся + while (i < j) { + // Обновить максимальную вместимость + const cap = Math.min(ht[i], ht[j]) * (j - i); + res = Math.max(res, cap); + // Сдвигать внутрь более короткую сторону + if (ht[i] < ht[j]) { + i += 1; + } else { + j -= 1; + } + } + return res; +} + +/* Driver Code */ +const ht = [3, 8, 5, 2, 7, 7, 3, 4]; + +// Жадный алгоритм +const res = maxCapacity(ht); +console.log(`Максимальная вместимость = ${res}`); diff --git a/ru/codes/javascript/chapter_greedy/max_product_cutting.js b/ru/codes/javascript/chapter_greedy/max_product_cutting.js new file mode 100644 index 000000000..a3eda2849 --- /dev/null +++ b/ru/codes/javascript/chapter_greedy/max_product_cutting.js @@ -0,0 +1,33 @@ +/** + * File: max_product_cutting.js + * Created Time: 2023-09-02 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Максимальное произведение разрезания: жадный алгоритм */ +function maxProductCutting(n) { + // Когда n <= 3, обязательно нужно выделить одну 1 + if (n <= 3) { + return 1 * (n - 1); + } + // Жадно выделить множители 3, где a — число троек, а b — остаток + let a = Math.floor(n / 3); + let b = n % 3; + if (b === 1) { + // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2 + return Math.pow(3, a - 1) * 2 * 2; + } + if (b === 2) { + // Если остаток равен 2, ничего не делать + return Math.pow(3, a) * 2; + } + // Если остаток равен 0, ничего не делать + return Math.pow(3, a); +} + +/* Driver Code */ +let n = 58; + +// Жадный алгоритм +let res = maxProductCutting(n); +console.log(`Максимальное произведение после разрезания = ${res}`); diff --git a/ru/codes/javascript/chapter_hashing/array_hash_map.js b/ru/codes/javascript/chapter_hashing/array_hash_map.js new file mode 100644 index 000000000..0b09773c9 --- /dev/null +++ b/ru/codes/javascript/chapter_hashing/array_hash_map.js @@ -0,0 +1,128 @@ +/** + * File: array_hash_map.js + * Created Time: 2022-12-26 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Пара ключ-значение Number -> String */ +class Pair { + constructor(key, val) { + this.key = key; + this.val = val; + } +} + +/* Хеш-таблица на основе массива */ +class ArrayHashMap { + #buckets; + constructor() { + // Инициализировать массив, содержащий 100 корзин + this.#buckets = new Array(100).fill(null); + } + + /* Хеш-функция */ + #hashFunc(key) { + return key % 100; + } + + /* Операция поиска */ + get(key) { + let index = this.#hashFunc(key); + let pair = this.#buckets[index]; + if (pair === null) return null; + return pair.val; + } + + /* Операция добавления */ + set(key, val) { + let index = this.#hashFunc(key); + this.#buckets[index] = new Pair(key, val); + } + + /* Операция удаления */ + delete(key) { + let index = this.#hashFunc(key); + // Присвоить null, что означает удаление + this.#buckets[index] = null; + } + + /* Получить все пары ключ-значение */ + entries() { + let arr = []; + for (let i = 0; i < this.#buckets.length; i++) { + if (this.#buckets[i]) { + arr.push(this.#buckets[i]); + } + } + return arr; + } + + /* Получить все ключи */ + keys() { + let arr = []; + for (let i = 0; i < this.#buckets.length; i++) { + if (this.#buckets[i]) { + arr.push(this.#buckets[i].key); + } + } + return arr; + } + + /* Получить все значения */ + values() { + let arr = []; + for (let i = 0; i < this.#buckets.length; i++) { + if (this.#buckets[i]) { + arr.push(this.#buckets[i].val); + } + } + return arr; + } + + /* Вывести хеш-таблицу */ + print() { + let pairSet = this.entries(); + for (const pair of pairSet) { + console.info(`${pair.key} -> ${pair.val}`); + } + } +} + +/* Driver Code */ +/* Инициализация хеш-таблицы */ +const map = new ArrayHashMap(); +/* Операция добавления */ +// Добавить пару (key, value) в хеш-таблицу +map.set(12836, 'Сяо Ха'); +map.set(15937, 'Сяо Ло'); +map.set(16750, 'Сяо Суань'); +map.set(13276, 'Сяо Фа'); +map.set(10583, 'Сяо Я'); +console.info('\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение'); +map.print(); + +/* Операция поиска */ +// Ввести в хеш-таблицу ключ key и получить значение value +let name = map.get(15937); +console.info('\nПо номеру 15937 найдено имя ' + name); + +/* Операция удаления */ +// Удалить пару (key, value) из хеш-таблицы +map.delete(10583); +console.info('\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение'); +map.print(); + +/* Обход хеш-таблицы */ +console.info('\nОтдельный обход пар ключ-значение'); +for (const pair of map.entries()) { + if (!pair) continue; + console.info(pair.key + ' -> ' + pair.val); +} +console.info('\nОтдельный обход ключей'); +for (const key of map.keys()) { + console.info(key); +} +console.info('\nОтдельный обход значений'); +for (const val of map.values()) { + console.info(val); +} diff --git a/ru/codes/javascript/chapter_hashing/hash_map.js b/ru/codes/javascript/chapter_hashing/hash_map.js new file mode 100644 index 000000000..d4896ee6a --- /dev/null +++ b/ru/codes/javascript/chapter_hashing/hash_map.js @@ -0,0 +1,44 @@ +/** + * File: hash_map.js + * Created Time: 2022-12-26 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Driver Code */ +/* Инициализация хеш-таблицы */ +const map = new Map(); + +/* Операция добавления */ +// Добавить пару (key, value) в хеш-таблицу +map.set(12836, 'Сяо Ха'); +map.set(15937, 'Сяо Ло'); +map.set(16750, 'Сяо Суань'); +map.set(13276, 'Сяо Фа'); +map.set(10583, 'Сяо Я'); +console.info('\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение'); +console.info(map); + +/* Операция поиска */ +// Ввести в хеш-таблицу ключ key и получить значение value +let name = map.get(15937); +console.info('\nПо номеру 15937 найдено имя ' + name); + +/* Операция удаления */ +// Удалить пару (key, value) из хеш-таблицы +map.delete(10583); +console.info('\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение'); +console.info(map); + +/* Обход хеш-таблицы */ +console.info('\nОтдельный обход пар ключ-значение'); +for (const [k, v] of map.entries()) { + console.info(k + ' -> ' + v); +} +console.info('\nОтдельный обход ключей'); +for (const k of map.keys()) { + console.info(k); +} +console.info('\nОтдельный обход значений'); +for (const v of map.values()) { + console.info(v); +} diff --git a/ru/codes/javascript/chapter_hashing/hash_map_chaining.js b/ru/codes/javascript/chapter_hashing/hash_map_chaining.js new file mode 100644 index 000000000..dad6c5978 --- /dev/null +++ b/ru/codes/javascript/chapter_hashing/hash_map_chaining.js @@ -0,0 +1,142 @@ +/** + * File: hash_map_chaining.js + * Created Time: 2023-08-06 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Пара ключ-значение Number -> String */ +class Pair { + constructor(key, val) { + this.key = key; + this.val = val; + } +} + +/* Хеш-таблица с цепочками */ +class HashMapChaining { + #size; // Число пар ключ-значение + #capacity; // Вместимость хеш-таблицы + #loadThres; // Порог коэффициента загрузки для запуска расширения + #extendRatio; // Коэффициент расширения + #buckets; // Массив корзин + + /* Конструктор */ + constructor() { + this.#size = 0; + this.#capacity = 4; + this.#loadThres = 2.0 / 3.0; + this.#extendRatio = 2; + this.#buckets = new Array(this.#capacity).fill(null).map((x) => []); + } + + /* Хеш-функция */ + #hashFunc(key) { + return key % this.#capacity; + } + + /* Коэффициент загрузки */ + #loadFactor() { + return this.#size / this.#capacity; + } + + /* Операция поиска */ + get(key) { + const index = this.#hashFunc(key); + const bucket = this.#buckets[index]; + // Обойти корзину; если найден key, вернуть соответствующее val + for (const pair of bucket) { + if (pair.key === key) { + return pair.val; + } + } + // Если key не найден, вернуть null + return null; + } + + /* Операция добавления */ + put(key, val) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if (this.#loadFactor() > this.#loadThres) { + this.#extend(); + } + const index = this.#hashFunc(key); + const bucket = this.#buckets[index]; + // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть + for (const pair of bucket) { + if (pair.key === key) { + pair.val = val; + return; + } + } + // Если такого key нет, добавить пару ключ-значение в конец + const pair = new Pair(key, val); + bucket.push(pair); + this.#size++; + } + + /* Операция удаления */ + remove(key) { + const index = this.#hashFunc(key); + let bucket = this.#buckets[index]; + // Обойти корзину и удалить из нее пару ключ-значение + for (let i = 0; i < bucket.length; i++) { + if (bucket[i].key === key) { + bucket.splice(i, 1); + this.#size--; + break; + } + } + } + + /* Расширить хеш-таблицу */ + #extend() { + // Временно сохранить исходную хеш-таблицу + const bucketsTmp = this.#buckets; + // Инициализация новой хеш-таблицы после расширения + this.#capacity *= this.#extendRatio; + this.#buckets = new Array(this.#capacity).fill(null).map((x) => []); + this.#size = 0; + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for (const bucket of bucketsTmp) { + for (const pair of bucket) { + this.put(pair.key, pair.val); + } + } + } + + /* Вывести хеш-таблицу */ + print() { + for (const bucket of this.#buckets) { + let res = []; + for (const pair of bucket) { + res.push(pair.key + ' -> ' + pair.val); + } + console.log(res); + } + } +} + +/* Driver Code */ +/* Инициализация хеш-таблицы */ +const map = new HashMapChaining(); + +/* Операция добавления */ +// Добавить пару (key, value) в хеш-таблицу +map.put(12836, 'Сяо Ха'); +map.put(15937, 'Сяо Ло'); +map.put(16750, 'Сяо Суань'); +map.put(13276, 'Сяо Фа'); +map.put(10583, 'Сяо Я'); +console.log('\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение'); +map.print(); + +/* Операция поиска */ +// Ввести в хеш-таблицу ключ key и получить значение value +const name = map.get(13276); +console.log('\nДля номера 13276 найдено имя ' + name); + +/* Операция удаления */ +// Удалить пару (key, value) из хеш-таблицы +map.remove(12836); +console.log('\nПосле удаления 12836 хеш-таблица имеет вид\nКлюч -> Значение'); +map.print(); diff --git a/ru/codes/javascript/chapter_hashing/hash_map_open_addressing.js b/ru/codes/javascript/chapter_hashing/hash_map_open_addressing.js new file mode 100644 index 000000000..073fbfb76 --- /dev/null +++ b/ru/codes/javascript/chapter_hashing/hash_map_open_addressing.js @@ -0,0 +1,177 @@ +/** + * File: hashMapOpenAddressing.js + * Created Time: 2023-06-13 + * Author: yuan0221 (yl1452491917@gmail.com), krahets (krahets@163.com) + */ + +/* Пара ключ-значение Number -> String */ +class Pair { + constructor(key, val) { + this.key = key; + this.val = val; + } +} + +/* Хеш-таблица с открытой адресацией */ +class HashMapOpenAddressing { + #size; // Число пар ключ-значение + #capacity; // Вместимость хеш-таблицы + #loadThres; // Порог коэффициента загрузки для запуска расширения + #extendRatio; // Коэффициент расширения + #buckets; // Массив корзин + #TOMBSTONE; // Удалить метку + + /* Конструктор */ + constructor() { + this.#size = 0; // Число пар ключ-значение + this.#capacity = 4; // Вместимость хеш-таблицы + this.#loadThres = 2.0 / 3.0; // Порог коэффициента загрузки для запуска расширения + this.#extendRatio = 2; // Коэффициент расширения + this.#buckets = Array(this.#capacity).fill(null); // Массив корзин + this.#TOMBSTONE = new Pair(-1, '-1'); // Удалить метку + } + + /* Хеш-функция */ + #hashFunc(key) { + return key % this.#capacity; + } + + /* Коэффициент загрузки */ + #loadFactor() { + return this.#size / this.#capacity; + } + + /* Найти индекс корзины, соответствующий key */ + #findBucket(key) { + let index = this.#hashFunc(key); + let firstTombstone = -1; + // Выполнять линейное пробирование и завершить при встрече с пустой корзиной + while (this.#buckets[index] !== null) { + // Если встретился key, вернуть соответствующий индекс корзины + if (this.#buckets[index].key === key) { + // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс + if (firstTombstone !== -1) { + this.#buckets[firstTombstone] = this.#buckets[index]; + this.#buckets[index] = this.#TOMBSTONE; + return firstTombstone; // Вернуть индекс корзины после перемещения + } + return index; // Вернуть индекс корзины + } + // Записать первую встретившуюся метку удаления + if ( + firstTombstone === -1 && + this.#buckets[index] === this.#TOMBSTONE + ) { + firstTombstone = index; + } + // Вычислить индекс корзины; при выходе за конец вернуться к началу + index = (index + 1) % this.#capacity; + } + // Если key не существует, вернуть индекс точки добавления + return firstTombstone === -1 ? index : firstTombstone; + } + + /* Операция поиска */ + get(key) { + // Найти индекс корзины, соответствующий key + const index = this.#findBucket(key); + // Если пара ключ-значение найдена, вернуть соответствующее val + if ( + this.#buckets[index] !== null && + this.#buckets[index] !== this.#TOMBSTONE + ) { + return this.#buckets[index].val; + } + // Если пары ключ-значение не существует, вернуть null + return null; + } + + /* Операция добавления */ + put(key, val) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if (this.#loadFactor() > this.#loadThres) { + this.#extend(); + } + // Найти индекс корзины, соответствующий key + const index = this.#findBucket(key); + // Если пара ключ-значение найдена, перезаписать val и вернуть + if ( + this.#buckets[index] !== null && + this.#buckets[index] !== this.#TOMBSTONE + ) { + this.#buckets[index].val = val; + return; + } + // Если пары ключ-значение нет, добавить ее + this.#buckets[index] = new Pair(key, val); + this.#size++; + } + + /* Операция удаления */ + remove(key) { + // Найти индекс корзины, соответствующий key + const index = this.#findBucket(key); + // Если пара ключ-значение найдена, заменить ее меткой удаления + if ( + this.#buckets[index] !== null && + this.#buckets[index] !== this.#TOMBSTONE + ) { + this.#buckets[index] = this.#TOMBSTONE; + this.#size--; + } + } + + /* Расширить хеш-таблицу */ + #extend() { + // Временно сохранить исходную хеш-таблицу + const bucketsTmp = this.#buckets; + // Инициализация новой хеш-таблицы после расширения + this.#capacity *= this.#extendRatio; + this.#buckets = Array(this.#capacity).fill(null); + this.#size = 0; + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for (const pair of bucketsTmp) { + if (pair !== null && pair !== this.#TOMBSTONE) { + this.put(pair.key, pair.val); + } + } + } + + /* Вывести хеш-таблицу */ + print() { + for (const pair of this.#buckets) { + if (pair === null) { + console.log('null'); + } else if (pair === this.#TOMBSTONE) { + console.log('TOMBSTONE'); + } else { + console.log(pair.key + ' -> ' + pair.val); + } + } + } +} + +/* Driver Code */ +// Инициализация хеш-таблицы +const hashmap = new HashMapOpenAddressing(); + +// Операция добавления +// Добавить пару (key, val) в хеш-таблицу +hashmap.put(12836, 'Сяо Ха'); +hashmap.put(15937, 'Сяо Ло'); +hashmap.put(16750, 'Сяо Суань'); +hashmap.put(13276, 'Сяо Фа'); +hashmap.put(10583, 'Сяо Я'); +console.log('\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение'); +hashmap.print(); + +// Операция поиска +// Передать ключ key в хеш-таблицу и получить значение val +const name = hashmap.get(13276); +console.log('\nДля номера 13276 найдено имя ' + name); + +// Операция удаления +// Удалить пару (key, val) из хеш-таблицы +hashmap.remove(16750); +console.log('\nПосле удаления 16750 хеш-таблица имеет вид\nКлюч -> Значение'); +hashmap.print(); diff --git a/ru/codes/javascript/chapter_hashing/simple_hash.js b/ru/codes/javascript/chapter_hashing/simple_hash.js new file mode 100644 index 000000000..86248321d --- /dev/null +++ b/ru/codes/javascript/chapter_hashing/simple_hash.js @@ -0,0 +1,60 @@ +/** + * File: simple_hash.js + * Created Time: 2023-08-06 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Аддитивное хеширование */ +function addHash(key) { + let hash = 0; + const MODULUS = 1000000007; + for (const c of key) { + hash = (hash + c.charCodeAt(0)) % MODULUS; + } + return hash; +} + +/* Мультипликативное хеширование */ +function mulHash(key) { + let hash = 0; + const MODULUS = 1000000007; + for (const c of key) { + hash = (31 * hash + c.charCodeAt(0)) % MODULUS; + } + return hash; +} + +/* XOR-хеширование */ +function xorHash(key) { + let hash = 0; + const MODULUS = 1000000007; + for (const c of key) { + hash ^= c.charCodeAt(0); + } + return hash % MODULUS; +} + +/* Хеширование с циклическим сдвигом */ +function rotHash(key) { + let hash = 0; + const MODULUS = 1000000007; + for (const c of key) { + hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS; + } + return hash; +} + +/* Driver Code */ +const key = 'Hello Algo'; + +let hash = addHash(key); +console.log('Хеш-сумма сложением = ' + hash); + +hash = mulHash(key); +console.log('Хеш-сумма умножением = ' + hash); + +hash = xorHash(key); +console.log('Хеш-сумма XOR = ' + hash); + +hash = rotHash(key); +console.log('Хеш-сумма с циклическим сдвигом = ' + hash); diff --git a/ru/codes/javascript/chapter_heap/my_heap.js b/ru/codes/javascript/chapter_heap/my_heap.js new file mode 100644 index 000000000..717f4e38c --- /dev/null +++ b/ru/codes/javascript/chapter_heap/my_heap.js @@ -0,0 +1,158 @@ +/** + * File: my_heap.js + * Created Time: 2023-02-06 + * Author: what-is-me (whatisme@outlook.jp) + */ + +const { printHeap } = require('../modules/PrintUtil'); + +/* Класс максимальной кучи */ +class MaxHeap { + #maxHeap; + + /* Конструктор, создающий пустую кучу или строящий кучу по входному списку */ + constructor(nums) { + // Добавить элементы списка в кучу без изменений + this.#maxHeap = nums === undefined ? [] : [...nums]; + // Выполнить heapify для всех узлов, кроме листовых + for (let i = this.#parent(this.size() - 1); i >= 0; i--) { + this.#siftDown(i); + } + } + + /* Получить индекс левого дочернего узла */ + #left(i) { + return 2 * i + 1; + } + + /* Получить индекс правого дочернего узла */ + #right(i) { + return 2 * i + 2; + } + + /* Получить индекс родительского узла */ + #parent(i) { + return Math.floor((i - 1) / 2); // Округление вниз при делении + } + + /* Поменять элементы местами */ + #swap(i, j) { + const tmp = this.#maxHeap[i]; + this.#maxHeap[i] = this.#maxHeap[j]; + this.#maxHeap[j] = tmp; + } + + /* Получение размера кучи */ + size() { + return this.#maxHeap.length; + } + + /* Проверка, пуста ли куча */ + isEmpty() { + return this.size() === 0; + } + + /* Доступ к элементу на вершине кучи */ + peek() { + return this.#maxHeap[0]; + } + + /* Добавление элемента в кучу */ + push(val) { + // Добавление узла + this.#maxHeap.push(val); + // Просеивание снизу вверх + this.#siftUp(this.size() - 1); + } + + /* Начиная с узла i, выполнить просеивание снизу вверх */ + #siftUp(i) { + while (true) { + // Получение родительского узла для узла i + const p = this.#parent(i); + // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления» + if (p < 0 || this.#maxHeap[i] <= this.#maxHeap[p]) break; + // Поменять два узла местами + this.#swap(i, p); + // Циклическое просеивание вверх + i = p; + } + } + + /* Извлечение элемента из кучи */ + pop() { + // Обработка пустого случая + if (this.isEmpty()) throw new Error('куча пуста'); + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + this.#swap(0, this.size() - 1); + // Удаление узла + const val = this.#maxHeap.pop(); + // Просеивание сверху вниз + this.#siftDown(0); + // Вернуть элемент с вершины кучи + return val; + } + + /* Начиная с узла i, выполнить просеивание сверху вниз */ + #siftDown(i) { + while (true) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + const l = this.#left(i), + r = this.#right(i); + let ma = i; + if (l < this.size() && this.#maxHeap[l] > this.#maxHeap[ma]) ma = l; + if (r < this.size() && this.#maxHeap[r] > this.#maxHeap[ma]) ma = r; + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (ma === i) break; + // Поменять два узла местами + this.#swap(i, ma); + // Циклическое просеивание вниз + i = ma; + } + } + + /* Вывести кучу (двоичное дерево) */ + print() { + printHeap(this.#maxHeap); + } + + /* Извлечь элементы из кучи */ + getMaxHeap() { + return this.#maxHeap; + } +} + +/* Driver Code */ +if (require.main === module) { + /* Инициализация максимальной кучи */ + const maxHeap = new MaxHeap([9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2]); + console.log('\nПосле построения кучи из входного списка'); + maxHeap.print(); + + /* Получение элемента с вершины кучи */ + let peek = maxHeap.peek(); + console.log(`\nЭлемент на вершине кучи = ${peek}`); + + /* Добавление элемента в кучу */ + let val = 7; + maxHeap.push(val); + console.log(`\nПосле добавления элемента ${val} в кучу`); + maxHeap.print(); + + /* Извлечение элемента с вершины кучи */ + peek = maxHeap.pop(); + console.log(`\nПосле извлечения элемента вершины кучи ${peek}`); + maxHeap.print(); + + /* Получение размера кучи */ + let size = maxHeap.size(); + console.log(`\nКоличество элементов в куче = ${size}`); + + /* Проверка, пуста ли куча */ + let isEmpty = maxHeap.isEmpty(); + console.log(`\nПуста ли куча: ${isEmpty}`); +} + +module.exports = { + MaxHeap, +}; diff --git a/ru/codes/javascript/chapter_heap/top_k.js b/ru/codes/javascript/chapter_heap/top_k.js new file mode 100644 index 000000000..55e3e8031 --- /dev/null +++ b/ru/codes/javascript/chapter_heap/top_k.js @@ -0,0 +1,58 @@ +/** + * File: top_k.js + * Created Time: 2023-08-13 + * Author: Justin (xiefahit@gmail.com) + */ + +const { MaxHeap } = require('./my_heap'); + +/* Добавление элемента в кучу */ +function pushMinHeap(maxHeap, val) { + // Инвертировать знак элемента + maxHeap.push(-val); +} + +/* Извлечение элемента из кучи */ +function popMinHeap(maxHeap) { + // Инвертировать знак элемента + return -maxHeap.pop(); +} + +/* Доступ к элементу на вершине кучи */ +function peekMinHeap(maxHeap) { + // Инвертировать знак элемента + return -maxHeap.peek(); +} + +/* Извлечь элементы из кучи */ +function getMinHeap(maxHeap) { + // Инвертировать знак элемента + return maxHeap.getMaxHeap().map((num) => -num); +} + +/* Найти k наибольших элементов массива с помощью кучи */ +function topKHeap(nums, k) { + // Инициализация минимальной кучи + // Обратите внимание: мы инвертируем все элементы кучи, чтобы с помощью максимальной кучи имитировать минимальную + const maxHeap = new MaxHeap([]); + // Поместить первые k элементов массива в кучу + for (let i = 0; i < k; i++) { + pushMinHeap(maxHeap, nums[i]); + } + // Начиная с элемента k+1, поддерживать длину кучи равной k + for (let i = k; i < nums.length; i++) { + // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу + if (nums[i] > peekMinHeap(maxHeap)) { + popMinHeap(maxHeap); + pushMinHeap(maxHeap, nums[i]); + } + } + // Вернуть элементы кучи + return getMinHeap(maxHeap); +} + +/* Driver Code */ +const nums = [1, 7, 6, 3, 2]; +const k = 3; +const res = topKHeap(nums, k); +console.log(`Наибольшие ${k} элементов`, res); diff --git a/ru/codes/javascript/chapter_searching/binary_search.js b/ru/codes/javascript/chapter_searching/binary_search.js new file mode 100644 index 000000000..826289256 --- /dev/null +++ b/ru/codes/javascript/chapter_searching/binary_search.js @@ -0,0 +1,60 @@ +/** + * File: binary_search.js + * Created Time: 2022-12-22 + * Author: JoseHung (szhong@link.cuhk.edu.hk) + */ + +/* Бинарный поиск (двусторонне замкнутый интервал) */ +function binarySearch(nums, target) { + // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно + let i = 0, + j = nums.length - 1; + // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст) + while (i <= j) { + // Вычислить индекс середины m, используя parseInt() для округления вниз + const m = parseInt(i + (j - i) / 2); + if (nums[m] < target) + // Это означает, что target находится в интервале [m+1, j] + i = m + 1; + else if (nums[m] > target) + // Это означает, что target находится в интервале [i, m-1] + j = m - 1; + else return m; // Целевой элемент найден, вернуть его индекс + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +/* Бинарный поиск (лево замкнутый, право открытый интервал) */ +function binarySearchLCRO(nums, target) { + // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно + let i = 0, + j = nums.length; + // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст) + while (i < j) { + // Вычислить индекс середины m, используя parseInt() для округления вниз + const m = parseInt(i + (j - i) / 2); + if (nums[m] < target) + // Это означает, что target находится в интервале [m+1, j) + i = m + 1; + else if (nums[m] > target) + // Это означает, что target находится в интервале [i, m) + j = m; + // Целевой элемент найден, вернуть его индекс + else return m; + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +/* Driver Code */ +const target = 6; +const nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; + +/* Бинарный поиск (двусторонне замкнутый интервал) */ +let index = binarySearch(nums, target); +console.log('Индекс целевого элемента 6 = ' + index); + +/* Бинарный поиск (лево замкнутый, право открытый интервал) */ +index = binarySearchLCRO(nums, target); +console.log('Индекс целевого элемента 6 = ' + index); diff --git a/ru/codes/javascript/chapter_searching/binary_search_edge.js b/ru/codes/javascript/chapter_searching/binary_search_edge.js new file mode 100644 index 000000000..2e8718aa3 --- /dev/null +++ b/ru/codes/javascript/chapter_searching/binary_search_edge.js @@ -0,0 +1,45 @@ +/** + * File: binary_search_edge.js + * Created Time: 2023-08-22 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +const { binarySearchInsertion } = require('./binary_search_insertion.js'); + +/* Бинарный поиск самого левого target */ +function binarySearchLeftEdge(nums, target) { + // Эквивалентно поиску точки вставки target + const i = binarySearchInsertion(nums, target); + // target не найден, вернуть -1 + if (i === nums.length || nums[i] !== target) { + return -1; + } + // Найти target и вернуть индекс i + return i; +} + +/* Бинарный поиск самого правого target */ +function binarySearchRightEdge(nums, target) { + // Преобразовать задачу в поиск самого левого target + 1 + const i = binarySearchInsertion(nums, target + 1); + // j указывает на самый правый target, а i — на первый элемент больше target + const j = i - 1; + // target не найден, вернуть -1 + if (j === -1 || nums[j] !== target) { + return -1; + } + // Найти target и вернуть индекс j + return j; +} + +/* Driver Code */ +// Массив с повторяющимися элементами +const nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15]; +console.log('\nМассив nums = ' + nums); +// Бинарный поиск левой и правой границы +for (const target of [6, 7]) { + let index = binarySearchLeftEdge(nums, target); + console.log('Индекс самого левого элемента ' + target + ' равен ' + index); + index = binarySearchRightEdge(nums, target); + console.log('Индекс самого правого элемента ' + target + ' равен ' + index); +} diff --git a/ru/codes/javascript/chapter_searching/binary_search_insertion.js b/ru/codes/javascript/chapter_searching/binary_search_insertion.js new file mode 100644 index 000000000..d877ec081 --- /dev/null +++ b/ru/codes/javascript/chapter_searching/binary_search_insertion.js @@ -0,0 +1,64 @@ +/** + * File: binary_search_insertion.js + * Created Time: 2023-08-22 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Бинарный поиск точки вставки (без повторяющихся элементов) */ +function binarySearchInsertionSimple(nums, target) { + let i = 0, + j = nums.length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + const m = Math.floor(i + (j - i) / 2); // Вычислить индекс середины m, используя Math.floor() для округления вниз + if (nums[m] < target) { + i = m + 1; // target находится в интервале [m+1, j] + } else if (nums[m] > target) { + j = m - 1; // target находится в интервале [i, m-1] + } else { + return m; // Найти target и вернуть точку вставки m + } + } + // target не найден, вернуть точку вставки i + return i; +} + +/* Бинарный поиск точки вставки (с повторяющимися элементами) */ +function binarySearchInsertion(nums, target) { + let i = 0, + j = nums.length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + const m = Math.floor(i + (j - i) / 2); // Вычислить индекс середины m, используя Math.floor() для округления вниз + if (nums[m] < target) { + i = m + 1; // target находится в интервале [m+1, j] + } else if (nums[m] > target) { + j = m - 1; // target находится в интервале [i, m-1] + } else { + j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1] + } + } + // Вернуть точку вставки i + return i; +} + +/* Driver Code */ +// Массив без повторяющихся элементов +let nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; +console.log('\nМассив nums = ' + nums); +// Бинарный поиск точки вставки +for (const target of [6, 9]) { + const index = binarySearchInsertionSimple(nums, target); + console.log('Индекс позиции вставки элемента ' + target + ' равен ' + index); +} + +// Массив с повторяющимися элементами +nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15]; +console.log('\nМассив nums = ' + nums); +// Бинарный поиск точки вставки +for (const target of [2, 6, 20]) { + const index = binarySearchInsertion(nums, target); + console.log('Индекс позиции вставки элемента ' + target + ' равен ' + index); +} + +module.exports = { + binarySearchInsertion, +}; diff --git a/ru/codes/javascript/chapter_searching/hashing_search.js b/ru/codes/javascript/chapter_searching/hashing_search.js new file mode 100644 index 000000000..3e4bc7466 --- /dev/null +++ b/ru/codes/javascript/chapter_searching/hashing_search.js @@ -0,0 +1,45 @@ +/** + * File: hashing_search.js + * Created Time: 2022-12-29 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +const { arrToLinkedList } = require('../modules/ListNode'); + +/* Хеш-поиск (массив) */ +function hashingSearchArray(map, target) { + // key хеш-таблицы: целевой элемент, value: индекс + // Если такого key нет в хеш-таблице, вернуть -1 + return map.has(target) ? map.get(target) : -1; +} + +/* Хеш-поиск (связный список) */ +function hashingSearchLinkedList(map, target) { + // key хеш-таблицы: значение целевого узла, value: объект узла + // Если такого key нет в хеш-таблице, вернуть null + return map.has(target) ? map.get(target) : null; +} + +/* Driver Code */ +const target = 3; + +/* Хеш-поиск (массив) */ +const nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8]; +// Инициализация хеш-таблицы +const map = new Map(); +for (let i = 0; i < nums.length; i++) { + map.set(nums[i], i); // key: элемент, value: индекс +} +const index = hashingSearchArray(map, target); +console.log('Индекс целевого элемента 3 = ' + index); + +/* Хеш-поиск (связный список) */ +let head = arrToLinkedList(nums); +// Инициализация хеш-таблицы +const map1 = new Map(); +while (head != null) { + map1.set(head.val, head); // key: значение узла, value: узел + head = head.next; +} +const node = hashingSearchLinkedList(map1, target); +console.log('Объект узла со значением 3 =', node); diff --git a/ru/codes/javascript/chapter_searching/linear_search.js b/ru/codes/javascript/chapter_searching/linear_search.js new file mode 100644 index 000000000..abbc6bdfd --- /dev/null +++ b/ru/codes/javascript/chapter_searching/linear_search.js @@ -0,0 +1,47 @@ +/** + * File: linear_search.js + * Created Time: 2022-12-22 + * Author: JoseHung (szhong@link.cuhk.edu.hk) + */ + +const { ListNode, arrToLinkedList } = require('../modules/ListNode'); + +/* Линейный поиск (массив) */ +function linearSearchArray(nums, target) { + // Обход массива + for (let i = 0; i < nums.length; i++) { + // Целевой элемент найден, вернуть его индекс + if (nums[i] === target) { + return i; + } + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +/* Линейный поиск (связный список) */ +function linearSearchLinkedList(head, target) { + // Обойти связный список + while (head) { + // Найти целевой узел и вернуть его + if (head.val === target) { + return head; + } + head = head.next; + } + // Целевой узел не найден, вернуть null + return null; +} + +/* Driver Code */ +const target = 3; + +/* Выполнить линейный поиск в массиве */ +const nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8]; +const index = linearSearchArray(nums, target); +console.log('Индекс целевого элемента 3 = ' + index); + +/* Выполнить линейный поиск в связном списке */ +const head = arrToLinkedList(nums); +const node = linearSearchLinkedList(head, target); +console.log('Объект узла со значением 3 = ', node); diff --git a/ru/codes/javascript/chapter_searching/two_sum.js b/ru/codes/javascript/chapter_searching/two_sum.js new file mode 100644 index 000000000..74a3ea9fe --- /dev/null +++ b/ru/codes/javascript/chapter_searching/two_sum.js @@ -0,0 +1,46 @@ +/** + * File: two_sum.js + * Created Time: 2022-12-15 + * Author: gyt95 (gytkwan@gmail.com) + */ + +/* Метод 1: полный перебор */ +function twoSumBruteForce(nums, target) { + const n = nums.length; + // Два вложенных цикла, временная сложность O(n^2) + for (let i = 0; i < n; i++) { + for (let j = i + 1; j < n; j++) { + if (nums[i] + nums[j] === target) { + return [i, j]; + } + } + } + return []; +} + +/* Метод 2: вспомогательная хеш-таблица */ +function twoSumHashTable(nums, target) { + // Вспомогательная хеш-таблица, пространственная сложность O(n) + let m = {}; + // Один цикл, временная сложность O(n) + for (let i = 0; i < nums.length; i++) { + if (m[target - nums[i]] !== undefined) { + return [m[target - nums[i]], i]; + } else { + m[nums[i]] = i; + } + } + return []; +} + +/* Driver Code */ +// Метод 1 +const nums = [2, 7, 11, 15], + target = 13; + +let res = twoSumBruteForce(nums, target); +console.log('Результат метода 1 res = ', res); + +// Метод 2 +res = twoSumHashTable(nums, target); +console.log('Результат метода 2 res = ', res); diff --git a/ru/codes/javascript/chapter_sorting/bubble_sort.js b/ru/codes/javascript/chapter_sorting/bubble_sort.js new file mode 100644 index 000000000..21984de06 --- /dev/null +++ b/ru/codes/javascript/chapter_sorting/bubble_sort.js @@ -0,0 +1,49 @@ +/** + * File: bubble_sort.js + * Created Time: 2022-12-01 + * Author: IsChristina (christinaxia77@foxmail.com) + */ + +/* Пузырьковая сортировка */ +function bubbleSort(nums) { + // Внешний цикл: неотсортированный диапазон [0, i] + for (let i = nums.length - 1; i > 0; i--) { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (let j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + let tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + } + } + } +} + +/* Пузырьковая сортировка (оптимизация флагом) */ +function bubbleSortWithFlag(nums) { + // Внешний цикл: неотсортированный диапазон [0, i] + for (let i = nums.length - 1; i > 0; i--) { + let flag = false; // Инициализировать флаг + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (let j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + let tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + flag = true; // Записать обмен элементов + } + } + if (!flag) break; // На этой итерации «всплытия» не было ни одного обмена, сразу выйти + } +} + +/* Driver Code */ +const nums = [4, 1, 3, 1, 5, 2]; +bubbleSort(nums); +console.log('После пузырьковой сортировки nums =', nums); + +const nums1 = [4, 1, 3, 1, 5, 2]; +bubbleSortWithFlag(nums1); +console.log('После пузырьковой сортировки nums =', nums1); diff --git a/ru/codes/javascript/chapter_sorting/bucket_sort.js b/ru/codes/javascript/chapter_sorting/bucket_sort.js new file mode 100644 index 000000000..facbd63e3 --- /dev/null +++ b/ru/codes/javascript/chapter_sorting/bucket_sort.js @@ -0,0 +1,39 @@ +/** + * File: bucket_sort.js + * Created Time: 2023-04-08 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Сортировка корзинами */ +function bucketSort(nums) { + // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину + const k = nums.length / 2; + const buckets = []; + for (let i = 0; i < k; i++) { + buckets.push([]); + } + // 1. Распределить элементы массива по корзинам + for (const num of nums) { + // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1] + const i = Math.floor(num * k); + // Добавить num в корзину i + buckets[i].push(num); + } + // 2. Выполнить сортировку внутри каждой корзины + for (const bucket of buckets) { + // Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки + bucket.sort((a, b) => a - b); + } + // 3. Обойти корзины и объединить результаты + let i = 0; + for (const bucket of buckets) { + for (const num of bucket) { + nums[i++] = num; + } + } +} + +/* Driver Code */ +const nums = [0.49, 0.96, 0.82, 0.09, 0.57, 0.43, 0.91, 0.75, 0.15, 0.37]; +bucketSort(nums); +console.log('После сортировки корзинами nums =', nums); diff --git a/ru/codes/javascript/chapter_sorting/counting_sort.js b/ru/codes/javascript/chapter_sorting/counting_sort.js new file mode 100644 index 000000000..a59f191dc --- /dev/null +++ b/ru/codes/javascript/chapter_sorting/counting_sort.js @@ -0,0 +1,65 @@ +/** + * File: counting_sort.js + * Created Time: 2023-04-08 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Сортировка подсчетом */ +// Простая реализация, не подходит для сортировки объектов +function countingSortNaive(nums) { + // 1. Найти максимальный элемент массива m + let m = Math.max(...nums); + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + const counter = new Array(m + 1).fill(0); + for (const num of nums) { + counter[num]++; + } + // 3. Обойти counter и заполнить исходный массив nums элементами + let i = 0; + for (let num = 0; num < m + 1; num++) { + for (let j = 0; j < counter[num]; j++, i++) { + nums[i] = num; + } + } +} + +/* Сортировка подсчетом */ +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой +function countingSort(nums) { + // 1. Найти максимальный элемент массива m + let m = Math.max(...nums); + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + const counter = new Array(m + 1).fill(0); + for (const num of nums) { + counter[num]++; + } + // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс» + // То есть counter[num]-1 — это индекс последнего появления num в res + for (let i = 0; i < m; i++) { + counter[i + 1] += counter[i]; + } + // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res + // Инициализировать массив res для хранения результата + const n = nums.length; + const res = new Array(n); + for (let i = n - 1; i >= 0; i--) { + const num = nums[i]; + res[counter[num] - 1] = num; // Поместить num по соответствующему индексу + counter[num]--; // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num + } + // Перезаписать исходный массив nums массивом результата res + for (let i = 0; i < n; i++) { + nums[i] = res[i]; + } +} + +/* Driver Code */ +const nums = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4]; +countingSortNaive(nums); +console.log('После сортировки подсчетом (объекты не поддерживаются) nums =', nums); + +const nums1 = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4]; +countingSort(nums1); +console.log('После сортировки подсчетом nums1 =', nums1); diff --git a/ru/codes/javascript/chapter_sorting/heap_sort.js b/ru/codes/javascript/chapter_sorting/heap_sort.js new file mode 100644 index 000000000..189d2eac4 --- /dev/null +++ b/ru/codes/javascript/chapter_sorting/heap_sort.js @@ -0,0 +1,49 @@ +/** + * File: heap_sort.js + * Created Time: 2023-06-04 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */ +function siftDown(nums, n, i) { + while (true) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + let l = 2 * i + 1; + let r = 2 * i + 2; + let ma = i; + if (l < n && nums[l] > nums[ma]) { + ma = l; + } + if (r < n && nums[r] > nums[ma]) { + ma = r; + } + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (ma === i) { + break; + } + // Поменять два узла местами + [nums[i], nums[ma]] = [nums[ma], nums[i]]; + // Циклическое просеивание вниз + i = ma; + } +} + +/* Сортировка кучей */ +function heapSort(nums) { + // Построение кучи: выполнить heapify для всех узлов, кроме листовых + for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) { + siftDown(nums, nums.length, i); + } + // Извлекать максимальный элемент из кучи в течение n-1 итераций + for (let i = nums.length - 1; i > 0; i--) { + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + [nums[0], nums[i]] = [nums[i], nums[0]]; + // Начиная с корневого узла, выполнить просеивание сверху вниз + siftDown(nums, i, 0); + } +} + +/* Driver Code */ +const nums = [4, 1, 3, 1, 5, 2]; +heapSort(nums); +console.log('После сортировки кучей nums =', nums); diff --git a/ru/codes/javascript/chapter_sorting/insertion_sort.js b/ru/codes/javascript/chapter_sorting/insertion_sort.js new file mode 100644 index 000000000..cd86e2abb --- /dev/null +++ b/ru/codes/javascript/chapter_sorting/insertion_sort.js @@ -0,0 +1,25 @@ +/** + * File: insertion_sort.js + * Created Time: 2022-12-01 + * Author: IsChristina (christinaxia77@foxmail.com) + */ + +/* Сортировка вставками */ +function insertionSort(nums) { + // Внешний цикл: отсортированный диапазон [0, i-1] + for (let i = 1; i < nums.length; i++) { + let base = nums[i], + j = i - 1; + // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1] + while (j >= 0 && nums[j] > base) { + nums[j + 1] = nums[j]; // Сдвинуть nums[j] на одну позицию вправо + j--; + } + nums[j + 1] = base; // Поместить base в правильную позицию + } +} + +/* Driver Code */ +const nums = [4, 1, 3, 1, 5, 2]; +insertionSort(nums); +console.log('После сортировки вставками nums =', nums); diff --git a/ru/codes/javascript/chapter_sorting/merge_sort.js b/ru/codes/javascript/chapter_sorting/merge_sort.js new file mode 100644 index 000000000..1e6c16f88 --- /dev/null +++ b/ru/codes/javascript/chapter_sorting/merge_sort.js @@ -0,0 +1,52 @@ +/** + * File: merge_sort.js + * Created Time: 2022-12-01 + * Author: IsChristina (christinaxia77@foxmail.com) + */ + +/* Объединить левый и правый подмассивы */ +function merge(nums, left, mid, right) { + // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right] + // Создать временный массив tmp для хранения результата слияния + const tmp = new Array(right - left + 1); + // Инициализировать начальные индексы левого и правого подмассивов + let i = left, + j = mid + 1, + k = 0; + // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив + while (i <= mid && j <= right) { + if (nums[i] <= nums[j]) { + tmp[k++] = nums[i++]; + } else { + tmp[k++] = nums[j++]; + } + } + // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив + while (i <= mid) { + tmp[k++] = nums[i++]; + } + while (j <= right) { + tmp[k++] = nums[j++]; + } + // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums + for (k = 0; k < tmp.length; k++) { + nums[left + k] = tmp[k]; + } +} + +/* Сортировка слиянием */ +function mergeSort(nums, left, right) { + // Условие завершения + if (left >= right) return; // Завершить рекурсию, когда длина подмассива равна 1 + // Этап разбиения + let mid = Math.floor(left + (right - left) / 2); // Вычислить середину + mergeSort(nums, left, mid); // Рекурсивно обработать левый подмассив + mergeSort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив + // Этап слияния + merge(nums, left, mid, right); +} + +/* Driver Code */ +const nums = [7, 3, 2, 6, 0, 1, 5, 4]; +mergeSort(nums, 0, nums.length - 1); +console.log('После сортировки слиянием nums =', nums); diff --git a/ru/codes/javascript/chapter_sorting/quick_sort.js b/ru/codes/javascript/chapter_sorting/quick_sort.js new file mode 100644 index 000000000..35361deb2 --- /dev/null +++ b/ru/codes/javascript/chapter_sorting/quick_sort.js @@ -0,0 +1,161 @@ +/** + * File: quick_sort.js + * Created Time: 2022-12-01 + * Author: IsChristina (christinaxia77@foxmail.com) + */ + +/* Класс быстрой сортировки */ +class QuickSort { + /* Обмен элементов */ + swap(nums, i, j) { + let tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + /* Разбиение с опорными указателями */ + partition(nums, left, right) { + // Взять nums[left] в качестве опорного элемента + let i = left, + j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) { + j -= 1; // Идти справа налево в поисках первого элемента меньше опорного + } + while (i < j && nums[i] <= nums[left]) { + i += 1; // Идти слева направо в поисках первого элемента больше опорного + } + // Обмен элементов + this.swap(nums, i, j); // Поменять эти два элемента местами + } + this.swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка */ + quickSort(nums, left, right) { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) return; + // Разбиение с опорными указателями + const pivot = this.partition(nums, left, right); + // Рекурсивно обработать левый и правый подмассивы + this.quickSort(nums, left, pivot - 1); + this.quickSort(nums, pivot + 1, right); + } +} + +/* Класс быстрой сортировки (оптимизация медианным опорным элементом) */ +class QuickSortMedian { + /* Обмен элементов */ + swap(nums, i, j) { + let tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + /* Выбрать медиану из трех кандидатов */ + medianThree(nums, left, mid, right) { + let l = nums[left], + m = nums[mid], + r = nums[right]; + // m находится между l и r + if ((l <= m && m <= r) || (r <= m && m <= l)) return mid; + // l находится между m и r + if ((m <= l && l <= r) || (r <= l && l <= m)) return left; + return right; + } + + /* Разбиение с опорными указателями (медиана трех) */ + partition(nums, left, right) { + // Выбрать медиану из трех кандидатов + let med = this.medianThree( + nums, + left, + Math.floor((left + right) / 2), + right + ); + // Переместить медиану в крайний левый элемент массива + this.swap(nums, left, med); + // Взять nums[left] в качестве опорного элемента + let i = left, + j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) j--; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) i++; // Идти слева направо в поисках первого элемента больше опорного + this.swap(nums, i, j); // Поменять эти два элемента местами + } + this.swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка */ + quickSort(nums, left, right) { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) return; + // Разбиение с опорными указателями + const pivot = this.partition(nums, left, right); + // Рекурсивно обработать левый и правый подмассивы + this.quickSort(nums, left, pivot - 1); + this.quickSort(nums, pivot + 1, right); + } +} + +/* Класс быстрой сортировки (оптимизация глубины рекурсии) */ +class QuickSortTailCall { + /* Обмен элементов */ + swap(nums, i, j) { + let tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + /* Разбиение с опорными указателями */ + partition(nums, left, right) { + // Взять nums[left] в качестве опорного элемента + let i = left, + j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) j--; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) i++; // Идти слева направо в поисках первого элемента больше опорного + this.swap(nums, i, j); // Поменять эти два элемента местами + } + this.swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка (оптимизация глубины рекурсии) */ + quickSort(nums, left, right) { + // Завершить, когда длина подмассива равна 1 + while (left < right) { + // Операция разбиения с опорными указателями + let pivot = this.partition(nums, left, right); + // Выполнить быструю сортировку для более короткого из двух подмассивов + if (pivot - left < right - pivot) { + this.quickSort(nums, left, pivot - 1); // Рекурсивно отсортировать левый подмассив + left = pivot + 1; // Оставшийся неотсортированный диапазон: [pivot + 1, right] + } else { + this.quickSort(nums, pivot + 1, right); // Рекурсивно отсортировать правый подмассив + right = pivot - 1; // Оставшийся неотсортированный диапазон: [left, pivot - 1] + } + } + } +} + +/* Driver Code */ +/* Быстрая сортировка */ +const nums = [2, 4, 1, 0, 3, 5]; +const quickSort = new QuickSort(); +quickSort.quickSort(nums, 0, nums.length - 1); +console.log('После быстрой сортировки nums =', nums); + +/* Быстрая сортировка (оптимизация медианным опорным элементом) */ +const nums1 = [2, 4, 1, 0, 3, 5]; +const quickSortMedian = new QuickSortMedian(); +quickSortMedian.quickSort(nums1, 0, nums1.length - 1); +console.log('После быстрой сортировки (оптимизация медианным опорным элементом) nums =', nums1); + +/* Быстрая сортировка (оптимизация глубины рекурсии) */ +const nums2 = [2, 4, 1, 0, 3, 5]; +const quickSortTailCall = new QuickSortTailCall(); +quickSortTailCall.quickSort(nums2, 0, nums2.length - 1); +console.log('После быстрой сортировки (оптимизация глубины рекурсии) nums =', nums2); diff --git a/ru/codes/javascript/chapter_sorting/radix_sort.js b/ru/codes/javascript/chapter_sorting/radix_sort.js new file mode 100644 index 000000000..068fa4334 --- /dev/null +++ b/ru/codes/javascript/chapter_sorting/radix_sort.js @@ -0,0 +1,61 @@ +/** + * File: radix_sort.js + * Created Time: 2023-04-08 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Получить k-й разряд элемента num, где exp = 10^(k-1) */ +function digit(num, exp) { + // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени + return Math.floor(num / exp) % 10; +} + +/* Сортировка подсчетом (сортировка по k-му разряду nums) */ +function countingSortDigit(nums, exp) { + // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10 + const counter = new Array(10).fill(0); + const n = nums.length; + // Подсчитать число появлений каждой цифры от 0 до 9 + for (let i = 0; i < n; i++) { + const d = digit(nums[i], exp); // Получить k-й разряд nums[i], обозначив его как d + counter[d]++; // Подсчитать число появлений цифры d + } + // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива» + for (let i = 1; i < 10; i++) { + counter[i] += counter[i - 1]; + } + // Выполняя обратный проход, заполнить res элементами по статистике в корзинах + const res = new Array(n).fill(0); + for (let i = n - 1; i >= 0; i--) { + const d = digit(nums[i], exp); + const j = counter[d] - 1; // Получить индекс j цифры d в массиве + res[j] = nums[i]; // Поместить текущий элемент по индексу j + counter[d]--; // Уменьшить количество d на 1 + } + // Перезаписать исходный массив nums результатом + for (let i = 0; i < n; i++) { + nums[i] = res[i]; + } +} + +/* Поразрядная сортировка */ +function radixSort(nums) { + // Получить максимальный элемент массива, чтобы определить максимальное число разрядов + let m = Math.max(... nums); + // Проходить разряды от младшего к старшему + for (let exp = 1; exp <= m; exp *= 10) { + // Выполнить сортировку подсчетом по k-му разряду элементов массива + // k = 1 -> exp = 1 + // k = 2 -> exp = 10 + // то есть exp = 10^(k-1) + countingSortDigit(nums, exp); + } +} + +/* Driver Code */ +const nums = [ + 10546151, 35663510, 42865989, 34862445, 81883077, 88906420, 72429244, + 30524779, 82060337, 63832996, +]; +radixSort(nums); +console.log('После поразрядной сортировки nums =', nums); diff --git a/ru/codes/javascript/chapter_sorting/selection_sort.js b/ru/codes/javascript/chapter_sorting/selection_sort.js new file mode 100644 index 000000000..1ee743a5d --- /dev/null +++ b/ru/codes/javascript/chapter_sorting/selection_sort.js @@ -0,0 +1,27 @@ +/** + * File: selection_sort.js + * Created Time: 2023-06-04 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Сортировка выбором */ +function selectionSort(nums) { + let n = nums.length; + // Внешний цикл: неотсортированный диапазон [i, n-1] + for (let i = 0; i < n - 1; i++) { + // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне + let k = i; + for (let j = i + 1; j < n; j++) { + if (nums[j] < nums[k]) { + k = j; // Записать индекс минимального элемента + } + } + // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона + [nums[i], nums[k]] = [nums[k], nums[i]]; + } +} + +/* Driver Code */ +const nums = [4, 1, 3, 1, 5, 2]; +selectionSort(nums); +console.log('После сортировки выбором nums =', nums); diff --git a/ru/codes/javascript/chapter_stack_and_queue/array_deque.js b/ru/codes/javascript/chapter_stack_and_queue/array_deque.js new file mode 100644 index 000000000..796b2c2c6 --- /dev/null +++ b/ru/codes/javascript/chapter_stack_and_queue/array_deque.js @@ -0,0 +1,156 @@ +/** + * File: array_deque.js + * Created Time: 2023-02-28 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +/* Двусторонняя очередь на основе кольцевого массива */ +class ArrayDeque { + #nums; // Массив для хранения элементов двусторонней очереди + #front; // Указатель head, указывающий на первый элемент очереди + #queSize; // Длина двусторонней очереди + + /* Конструктор */ + constructor(capacity) { + this.#nums = new Array(capacity); + this.#front = 0; + this.#queSize = 0; + } + + /* Получить вместимость двусторонней очереди */ + capacity() { + return this.#nums.length; + } + + /* Получение длины двусторонней очереди */ + size() { + return this.#queSize; + } + + /* Проверка, пуста ли двусторонняя очередь */ + isEmpty() { + return this.#queSize === 0; + } + + /* Вычислить индекс в кольцевом массиве */ + index(i) { + // С помощью операции взятия по модулю соединить начало и конец массива + // Когда i выходит за конец массива, он возвращается в начало + // Когда i выходит за начало массива, он возвращается в конец + return (i + this.capacity()) % this.capacity(); + } + + /* Добавление в голову очереди */ + pushFirst(num) { + if (this.#queSize === this.capacity()) { + console.log('Двусторонняя очередь заполнена'); + return; + } + // Указатель головы сдвигается на одну позицию влево + // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост + this.#front = this.index(this.#front - 1); + // Добавить num в голову очереди + this.#nums[this.#front] = num; + this.#queSize++; + } + + /* Добавление в хвост очереди */ + pushLast(num) { + if (this.#queSize === this.capacity()) { + console.log('Двусторонняя очередь заполнена'); + return; + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + const rear = this.index(this.#front + this.#queSize); + // Добавить num в хвост очереди + this.#nums[rear] = num; + this.#queSize++; + } + + /* Извлечение из головы очереди */ + popFirst() { + const num = this.peekFirst(); + // Указатель головы сдвигается на одну позицию назад + this.#front = this.index(this.#front + 1); + this.#queSize--; + return num; + } + + /* Извлечение из хвоста очереди */ + popLast() { + const num = this.peekLast(); + this.#queSize--; + return num; + } + + /* Доступ к элементу в начале очереди */ + peekFirst() { + if (this.isEmpty()) throw new Error('The Deque Is Empty.'); + return this.#nums[this.#front]; + } + + /* Доступ к элементу в конце очереди */ + peekLast() { + if (this.isEmpty()) throw new Error('The Deque Is Empty.'); + // Вычислить индекс хвостового элемента + const last = this.index(this.#front + this.#queSize - 1); + return this.#nums[last]; + } + + /* Вернуть массив для вывода */ + toArray() { + // Преобразовывать только элементы списка в пределах фактической длины + const res = []; + for (let i = 0, j = this.#front; i < this.#queSize; i++, j++) { + res[i] = this.#nums[this.index(j)]; + } + return res; + } +} + +/* Driver Code */ +/* Инициализация двусторонней очереди */ +const capacity = 5; +const deque = new ArrayDeque(capacity); +deque.pushLast(3); +deque.pushLast(2); +deque.pushLast(5); +console.log('Двусторонняя очередь deque = [' + deque.toArray() + ']'); + +/* Доступ к элементу */ +const peekFirst = deque.peekFirst(); +console.log('Первый элемент peekFirst = ' + peekFirst); +const peekLast = deque.peekLast(); +console.log('Последний элемент peekLast = ' + peekLast); + +/* Добавление элемента в очередь */ +deque.pushLast(4); +console.log('После добавления элемента 4 в хвост deque = [' + deque.toArray() + ']'); +deque.pushFirst(1); +console.log('После добавления элемента 1 в голову deque = [' + deque.toArray() + ']'); + +/* Извлечение элемента из очереди */ +const popLast = deque.popLast(); +console.log( + 'Извлеченный из хвоста элемент = ' + + popLast + + ', deque после извлечения из хвоста = [' + + deque.toArray() + + ']' +); +const popFirst = deque.popFirst(); +console.log( + 'Извлеченный из головы элемент = ' + + popFirst + + ', deque после извлечения из головы = [' + + deque.toArray() + + ']' +); + +/* Получение длины двусторонней очереди */ +const size = deque.size(); +console.log('Длина двусторонней очереди size = ' + size); + +/* Проверка, пуста ли двусторонняя очередь */ +const isEmpty = deque.isEmpty(); +console.log('Пуста ли двусторонняя очередь = ' + isEmpty); diff --git a/ru/codes/javascript/chapter_stack_and_queue/array_queue.js b/ru/codes/javascript/chapter_stack_and_queue/array_queue.js new file mode 100644 index 000000000..cc83d5e13 --- /dev/null +++ b/ru/codes/javascript/chapter_stack_and_queue/array_queue.js @@ -0,0 +1,106 @@ +/** + * File: array_queue.js + * Created Time: 2022-12-13 + * Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com) + */ + +/* Очередь на основе кольцевого массива */ +class ArrayQueue { + #nums; // Массив для хранения элементов очереди + #front = 0; // Указатель head, указывающий на первый элемент очереди + #queSize = 0; // Длина очереди + + constructor(capacity) { + this.#nums = new Array(capacity); + } + + /* Получить вместимость очереди */ + get capacity() { + return this.#nums.length; + } + + /* Получение длины очереди */ + get size() { + return this.#queSize; + } + + /* Проверка, пуста ли очередь */ + isEmpty() { + return this.#queSize === 0; + } + + /* Поместить в очередь */ + push(num) { + if (this.size === this.capacity) { + console.log('Очередь заполнена'); + return; + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива + const rear = (this.#front + this.size) % this.capacity; + // Добавить num в хвост очереди + this.#nums[rear] = num; + this.#queSize++; + } + + /* Извлечь из очереди */ + pop() { + const num = this.peek(); + // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива + this.#front = (this.#front + 1) % this.capacity; + this.#queSize--; + return num; + } + + /* Доступ к элементу в начале очереди */ + peek() { + if (this.isEmpty()) throw new Error('очередь пуста'); + return this.#nums[this.#front]; + } + + /* Вернуть Array */ + toArray() { + // Преобразовывать только элементы списка в пределах фактической длины + const arr = new Array(this.size); + for (let i = 0, j = this.#front; i < this.size; i++, j++) { + arr[i] = this.#nums[j % this.capacity]; + } + return arr; + } +} + +/* Driver Code */ +/* Инициализация очереди */ +const capacity = 10; +const queue = new ArrayQueue(capacity); + +/* Добавление элемента в очередь */ +queue.push(1); +queue.push(3); +queue.push(2); +queue.push(5); +queue.push(4); +console.log('Очередь queue =', queue.toArray()); + +/* Доступ к элементу в начале очереди */ +const peek = queue.peek(); +console.log('Первый элемент peek = ' + peek); + +/* Извлечение элемента из очереди */ +const pop = queue.pop(); +console.log('Извлеченный элемент pop = ' + pop + ', queue после извлечения =', queue.toArray()); + +/* Получение длины очереди */ +const size = queue.size; +console.log('Длина очереди size = ' + size); + +/* Проверка, пуста ли очередь */ +const isEmpty = queue.isEmpty(); +console.log('Пуста ли очередь = ' + isEmpty); + +/* Проверка кольцевого массива */ +for (let i = 0; i < 10; i++) { + queue.push(i); + queue.pop(); + console.log('После ' + i + '-го раунда операций enqueue и dequeue queue =', queue.toArray()); +} diff --git a/ru/codes/javascript/chapter_stack_and_queue/array_stack.js b/ru/codes/javascript/chapter_stack_and_queue/array_stack.js new file mode 100644 index 000000000..f133ddcb2 --- /dev/null +++ b/ru/codes/javascript/chapter_stack_and_queue/array_stack.js @@ -0,0 +1,75 @@ +/** + * File: array_stack.js + * Created Time: 2022-12-09 + * Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com) + */ + +/* Стек на основе массива */ +class ArrayStack { + #stack; + constructor() { + this.#stack = []; + } + + /* Получение длины стека */ + get size() { + return this.#stack.length; + } + + /* Проверка, пуст ли стек */ + isEmpty() { + return this.#stack.length === 0; + } + + /* Поместить в стек */ + push(num) { + this.#stack.push(num); + } + + /* Извлечь из стека */ + pop() { + if (this.isEmpty()) throw new Error('стек пуст'); + return this.#stack.pop(); + } + + /* Доступ к верхнему элементу стека */ + top() { + if (this.isEmpty()) throw new Error('стек пуст'); + return this.#stack[this.#stack.length - 1]; + } + + /* Вернуть Array */ + toArray() { + return this.#stack; + } +} + +/* Driver Code */ +/* Инициализация стека */ +const stack = new ArrayStack(); + +/* Помещение элемента в стек */ +stack.push(1); +stack.push(3); +stack.push(2); +stack.push(5); +stack.push(4); +console.log('Стек stack = '); +console.log(stack.toArray()); + +/* Доступ к верхнему элементу стека */ +const top = stack.top(); +console.log('Верхний элемент top = ' + top); + +/* Извлечение элемента из стека */ +const pop = stack.pop(); +console.log('Извлеченный элемент pop = ' + pop + ', stack после извлечения = '); +console.log(stack.toArray()); + +/* Получение длины стека */ +const size = stack.size; +console.log('Длина стека size = ' + size); + +/* Проверка на пустоту */ +const isEmpty = stack.isEmpty(); +console.log('Пуст ли стек = ' + isEmpty); diff --git a/ru/codes/javascript/chapter_stack_and_queue/deque.js b/ru/codes/javascript/chapter_stack_and_queue/deque.js new file mode 100644 index 000000000..95ff3ce84 --- /dev/null +++ b/ru/codes/javascript/chapter_stack_and_queue/deque.js @@ -0,0 +1,44 @@ +/** + * File: deque.js + * Created Time: 2023-01-17 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +/* Driver Code */ +/* Инициализация двусторонней очереди */ +// В JavaScript нет встроенной двусторонней очереди, поэтому Array можно использовать как двустороннюю очередь +const deque = []; + +/* Добавление элемента в очередь */ +deque.push(2); +deque.push(5); +deque.push(4); +// Обратите внимание: поскольку используется массив, временная сложность метода unshift() равна O(n) +deque.unshift(3); +deque.unshift(1); +console.log('Двусторонняя очередь deque = ', deque); + +/* Доступ к элементу */ +const peekFirst = deque[0]; +console.log('Первый элемент peekFirst = ' + peekFirst); +const peekLast = deque[deque.length - 1]; +console.log('Последний элемент peekLast = ' + peekLast); + +/* Извлечение элемента из очереди */ +// Обратите внимание: поскольку используется массив, временная сложность метода shift() равна O(n) +const popFront = deque.shift(); +console.log( + 'Извлеченный из головы элемент popFront = ' + popFront + ', deque после извлечения из головы = ' + deque +); +const popBack = deque.pop(); +console.log( + 'Извлеченный из хвоста элемент popBack = ' + popBack + ', deque после извлечения из хвоста = ' + deque +); + +/* Получение длины двусторонней очереди */ +const size = deque.length; +console.log('Длина двусторонней очереди size = ' + size); + +/* Проверка, пуста ли двусторонняя очередь */ +const isEmpty = size === 0; +console.log('Пуста ли двусторонняя очередь = ' + isEmpty); diff --git a/ru/codes/javascript/chapter_stack_and_queue/linkedlist_deque.js b/ru/codes/javascript/chapter_stack_and_queue/linkedlist_deque.js new file mode 100644 index 000000000..d2293aa66 --- /dev/null +++ b/ru/codes/javascript/chapter_stack_and_queue/linkedlist_deque.js @@ -0,0 +1,167 @@ +/** + * File: linkedlist_deque.js + * Created Time: 2023-02-04 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +/* Узел двусвязного списка */ +class ListNode { + prev; // Ссылка на узел-предшественник (указатель) + next; // Ссылка на узел-преемник (указатель) + val; // Значение узла + + constructor(val) { + this.val = val; + this.next = null; + this.prev = null; + } +} + +/* Двусторонняя очередь на основе двусвязного списка */ +class LinkedListDeque { + #front; // Головной узел front + #rear; // Хвостовой узел rear + #queSize; // Длина двусторонней очереди + + constructor() { + this.#front = null; + this.#rear = null; + this.#queSize = 0; + } + + /* Операция добавления в хвост очереди */ + pushLast(val) { + const node = new ListNode(val); + // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node + if (this.#queSize === 0) { + this.#front = node; + this.#rear = node; + } else { + // Добавить node в хвост списка + this.#rear.next = node; + node.prev = this.#rear; + this.#rear = node; // Обновить хвостовой узел + } + this.#queSize++; + } + + /* Операция добавления в голову очереди */ + pushFirst(val) { + const node = new ListNode(val); + // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node + if (this.#queSize === 0) { + this.#front = node; + this.#rear = node; + } else { + // Добавить node в голову списка + this.#front.prev = node; + node.next = this.#front; + this.#front = node; // Обновить головной узел + } + this.#queSize++; + } + + /* Операция извлечения из хвоста очереди */ + popLast() { + if (this.#queSize === 0) { + return null; + } + const value = this.#rear.val; // Сохранить значение хвостового узла + // Удалить хвостовой узел + let temp = this.#rear.prev; + if (temp !== null) { + temp.next = null; + this.#rear.prev = null; + } + this.#rear = temp; // Обновить хвостовой узел + this.#queSize--; + return value; + } + + /* Операция извлечения из головы очереди */ + popFirst() { + if (this.#queSize === 0) { + return null; + } + const value = this.#front.val; // Сохранить значение хвостового узла + // Удалить головной узел + let temp = this.#front.next; + if (temp !== null) { + temp.prev = null; + this.#front.next = null; + } + this.#front = temp; // Обновить головной узел + this.#queSize--; + return value; + } + + /* Доступ к элементу в конце очереди */ + peekLast() { + return this.#queSize === 0 ? null : this.#rear.val; + } + + /* Доступ к элементу в начале очереди */ + peekFirst() { + return this.#queSize === 0 ? null : this.#front.val; + } + + /* Получение длины двусторонней очереди */ + size() { + return this.#queSize; + } + + /* Проверка, пуста ли двусторонняя очередь */ + isEmpty() { + return this.#queSize === 0; + } + + /* Вывести двустороннюю очередь */ + print() { + const arr = []; + let temp = this.#front; + while (temp !== null) { + arr.push(temp.val); + temp = temp.next; + } + console.log('[' + arr.join(', ') + ']'); + } +} + +/* Driver Code */ +/* Инициализация двусторонней очереди */ +const linkedListDeque = new LinkedListDeque(); +linkedListDeque.pushLast(3); +linkedListDeque.pushLast(2); +linkedListDeque.pushLast(5); +console.log('Двусторонняя очередь linkedListDeque = '); +linkedListDeque.print(); + +/* Доступ к элементу */ +const peekFirst = linkedListDeque.peekFirst(); +console.log('Первый элемент peekFirst = ' + peekFirst); +const peekLast = linkedListDeque.peekLast(); +console.log('Последний элемент peekLast = ' + peekLast); + +/* Добавление элемента в очередь */ +linkedListDeque.pushLast(4); +console.log('После добавления элемента 4 в хвост linkedListDeque = '); +linkedListDeque.print(); +linkedListDeque.pushFirst(1); +console.log('После добавления элемента 1 в голову linkedListDeque = '); +linkedListDeque.print(); + +/* Извлечение элемента из очереди */ +const popLast = linkedListDeque.popLast(); +console.log('Извлеченный из хвоста элемент = ' + popLast + ', linkedListDeque после извлечения из хвоста = '); +linkedListDeque.print(); +const popFirst = linkedListDeque.popFirst(); +console.log('Извлеченный из головы элемент = ' + popFirst + ', linkedListDeque после извлечения из головы = '); +linkedListDeque.print(); + +/* Получение длины двусторонней очереди */ +const size = linkedListDeque.size(); +console.log('Длина двусторонней очереди size = ' + size); + +/* Проверка, пуста ли двусторонняя очередь */ +const isEmpty = linkedListDeque.isEmpty(); +console.log('Пуста ли двусторонняя очередь = ' + isEmpty); diff --git a/ru/codes/javascript/chapter_stack_and_queue/linkedlist_queue.js b/ru/codes/javascript/chapter_stack_and_queue/linkedlist_queue.js new file mode 100644 index 000000000..083c095aa --- /dev/null +++ b/ru/codes/javascript/chapter_stack_and_queue/linkedlist_queue.js @@ -0,0 +1,99 @@ +/** + * File: linkedlist_queue.js + * Created Time: 2022-12-20 + * Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com) + */ + +const { ListNode } = require('../modules/ListNode'); + +/* Очередь на основе связного списка */ +class LinkedListQueue { + #front; // Головной узел #front + #rear; // Хвостовой узел #rear + #queSize = 0; + + constructor() { + this.#front = null; + this.#rear = null; + } + + /* Получение длины очереди */ + get size() { + return this.#queSize; + } + + /* Проверка, пуста ли очередь */ + isEmpty() { + return this.size === 0; + } + + /* Поместить в очередь */ + push(num) { + // Добавить num после хвостового узла + const node = new ListNode(num); + // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел + if (!this.#front) { + this.#front = node; + this.#rear = node; + // Если очередь не пуста, добавить этот узел после хвостового узла + } else { + this.#rear.next = node; + this.#rear = node; + } + this.#queSize++; + } + + /* Извлечь из очереди */ + pop() { + const num = this.peek(); + // Удалить головной узел + this.#front = this.#front.next; + this.#queSize--; + return num; + } + + /* Доступ к элементу в начале очереди */ + peek() { + if (this.size === 0) throw new Error('очередь пуста'); + return this.#front.val; + } + + /* Преобразовать связный список в Array и вернуть */ + toArray() { + let node = this.#front; + const res = new Array(this.size); + for (let i = 0; i < res.length; i++) { + res[i] = node.val; + node = node.next; + } + return res; + } +} + +/* Driver Code */ +/* Инициализация очереди */ +const queue = new LinkedListQueue(); + +/* Добавление элемента в очередь */ +queue.push(1); +queue.push(3); +queue.push(2); +queue.push(5); +queue.push(4); +console.log('Очередь queue = ' + queue.toArray()); + +/* Доступ к элементу в начале очереди */ +const peek = queue.peek(); +console.log('Первый элемент peek = ' + peek); + +/* Извлечение элемента из очереди */ +const pop = queue.pop(); +console.log('Извлеченный элемент pop = ' + pop + ', queue после извлечения = ' + queue.toArray()); + +/* Получение длины очереди */ +const size = queue.size; +console.log('Длина очереди size = ' + size); + +/* Проверка, пуста ли очередь */ +const isEmpty = queue.isEmpty(); +console.log('Пуста ли очередь = ' + isEmpty); diff --git a/ru/codes/javascript/chapter_stack_and_queue/linkedlist_stack.js b/ru/codes/javascript/chapter_stack_and_queue/linkedlist_stack.js new file mode 100644 index 000000000..d4c3c15cb --- /dev/null +++ b/ru/codes/javascript/chapter_stack_and_queue/linkedlist_stack.js @@ -0,0 +1,88 @@ +/** + * File: linkedlist_stack.js + * Created Time: 2022-12-22 + * Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com) + */ + +const { ListNode } = require('../modules/ListNode'); + +/* Стек на основе связного списка */ +class LinkedListStack { + #stackPeek; // Использовать головной узел как вершину стека + #stkSize = 0; // Длина стека + + constructor() { + this.#stackPeek = null; + } + + /* Получение длины стека */ + get size() { + return this.#stkSize; + } + + /* Проверка, пуст ли стек */ + isEmpty() { + return this.size === 0; + } + + /* Поместить в стек */ + push(num) { + const node = new ListNode(num); + node.next = this.#stackPeek; + this.#stackPeek = node; + this.#stkSize++; + } + + /* Извлечь из стека */ + pop() { + const num = this.peek(); + this.#stackPeek = this.#stackPeek.next; + this.#stkSize--; + return num; + } + + /* Доступ к верхнему элементу стека */ + peek() { + if (!this.#stackPeek) throw new Error('стек пуст'); + return this.#stackPeek.val; + } + + /* Преобразовать связный список в Array и вернуть */ + toArray() { + let node = this.#stackPeek; + const res = new Array(this.size); + for (let i = res.length - 1; i >= 0; i--) { + res[i] = node.val; + node = node.next; + } + return res; + } +} + +/* Driver Code */ +/* Инициализация стека */ +const stack = new LinkedListStack(); + +/* Помещение элемента в стек */ +stack.push(1); +stack.push(3); +stack.push(2); +stack.push(5); +stack.push(4); +console.log('Стек stack = ' + stack.toArray()); + +/* Доступ к верхнему элементу стека */ +const peek = stack.peek(); +console.log('Верхний элемент peek = ' + peek); + +/* Извлечение элемента из стека */ +const pop = stack.pop(); +console.log('Извлеченный элемент pop = ' + pop + ', stack после извлечения = ' + stack.toArray()); + +/* Получение длины стека */ +const size = stack.size; +console.log('Длина стека size = ' + size); + +/* Проверка на пустоту */ +const isEmpty = stack.isEmpty(); +console.log('Пуст ли стек = ' + isEmpty); diff --git a/ru/codes/javascript/chapter_stack_and_queue/queue.js b/ru/codes/javascript/chapter_stack_and_queue/queue.js new file mode 100644 index 000000000..765de1c22 --- /dev/null +++ b/ru/codes/javascript/chapter_stack_and_queue/queue.js @@ -0,0 +1,35 @@ +/** + * File: queue.js + * Created Time: 2022-12-05 + * Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com) + */ + +/* Driver Code */ +/* Инициализация очереди */ +// В JavaScript нет встроенной очереди, поэтому Array можно использовать как очередь +const queue = []; + +/* Добавление элемента в очередь */ +queue.push(1); +queue.push(3); +queue.push(2); +queue.push(5); +queue.push(4); +console.log('Очередь queue =', queue); + +/* Доступ к элементу в начале очереди */ +const peek = queue[0]; +console.log('Первый элемент peek =', peek); + +/* Извлечение элемента из очереди */ +// В основе лежит массив, поэтому временная сложность метода shift() равна O(n) +const pop = queue.shift(); +console.log('Извлеченный элемент pop =', pop, ', queue после извлечения = ', queue); + +/* Получение длины очереди */ +const size = queue.length; +console.log('Длина очереди size =', size); + +/* Проверка, пуста ли очередь */ +const isEmpty = queue.length === 0; +console.log('Пуста ли очередь = ', isEmpty); diff --git a/ru/codes/javascript/chapter_stack_and_queue/stack.js b/ru/codes/javascript/chapter_stack_and_queue/stack.js new file mode 100644 index 000000000..537f864b5 --- /dev/null +++ b/ru/codes/javascript/chapter_stack_and_queue/stack.js @@ -0,0 +1,35 @@ +/** + * File: stack.js + * Created Time: 2022-12-04 + * Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com) + */ + +/* Driver Code */ +/* Инициализация стека */ +// В JavaScript нет встроенного класса стека, поэтому Array можно использовать как стек +const stack = []; + +/* Помещение элемента в стек */ +stack.push(1); +stack.push(3); +stack.push(2); +stack.push(5); +stack.push(4); +console.log('Стек stack =', stack); + +/* Доступ к верхнему элементу стека */ +const peek = stack[stack.length - 1]; +console.log('Верхний элемент peek =', peek); + +/* Извлечение элемента из стека */ +const pop = stack.pop(); +console.log('Извлеченный элемент pop =', pop); +console.log('stack после извлечения =', stack); + +/* Получение длины стека */ +const size = stack.length; +console.log('Длина стека size =', size); + +/* Проверка на пустоту */ +const isEmpty = stack.length === 0; +console.log('Пуст ли стек =', isEmpty); diff --git a/ru/codes/javascript/chapter_tree/array_binary_tree.js b/ru/codes/javascript/chapter_tree/array_binary_tree.js new file mode 100644 index 000000000..b65468c54 --- /dev/null +++ b/ru/codes/javascript/chapter_tree/array_binary_tree.js @@ -0,0 +1,147 @@ +/** + * File: array_binary_tree.js + * Created Time: 2023-08-06 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +const { arrToTree } = require('../modules/TreeNode'); +const { printTree } = require('../modules/PrintUtil'); + +/* Класс двоичного дерева в массивном представлении */ +class ArrayBinaryTree { + #tree; + + /* Конструктор */ + constructor(arr) { + this.#tree = arr; + } + + /* Вместимость списка */ + size() { + return this.#tree.length; + } + + /* Получить значение узла с индексом i */ + val(i) { + // Если индекс выходит за границы, вернуть null, обозначающий пустую позицию + if (i < 0 || i >= this.size()) return null; + return this.#tree[i]; + } + + /* Получить индекс левого дочернего узла узла с индексом i */ + left(i) { + return 2 * i + 1; + } + + /* Получить индекс правого дочернего узла узла с индексом i */ + right(i) { + return 2 * i + 2; + } + + /* Получить индекс родительского узла узла с индексом i */ + parent(i) { + return Math.floor((i - 1) / 2); // Округление вниз при делении + } + + /* Обход в ширину */ + levelOrder() { + let res = []; + // Непосредственно обходить массив + for (let i = 0; i < this.size(); i++) { + if (this.val(i) !== null) res.push(this.val(i)); + } + return res; + } + + /* Обход в глубину */ + #dfs(i, order, res) { + // Если это пустая позиция, вернуть + if (this.val(i) === null) return; + // Предварительный обход + if (order === 'pre') res.push(this.val(i)); + this.#dfs(this.left(i), order, res); + // Симметричный обход + if (order === 'in') res.push(this.val(i)); + this.#dfs(this.right(i), order, res); + // Обратный обход + if (order === 'post') res.push(this.val(i)); + } + + /* Предварительный обход */ + preOrder() { + const res = []; + this.#dfs(0, 'pre', res); + return res; + } + + /* Симметричный обход */ + inOrder() { + const res = []; + this.#dfs(0, 'in', res); + return res; + } + + /* Обратный обход */ + postOrder() { + const res = []; + this.#dfs(0, 'post', res); + return res; + } +} + +/* Driver Code */ +// Инициализировать двоичное дерево +// Здесь используется функция, напрямую строящая двоичное дерево из массива +const arr = Array.of( + 1, + 2, + 3, + 4, + null, + 6, + 7, + 8, + 9, + null, + null, + 12, + null, + null, + 15 +); + +const root = arrToTree(arr); +console.log('\nИнициализация двоичного дерева\n'); +console.log('Массивное представление двоичного дерева:'); +console.log(arr); +console.log('Связное представление двоичного дерева:'); +printTree(root); + +// Класс двоичного дерева в массивном представлении +const abt = new ArrayBinaryTree(arr); + +// Доступ к узлу +const i = 1; +const l = abt.left(i); +const r = abt.right(i); +const p = abt.parent(i); +console.log('\nТекущий узел: индекс = ' + i + ', значение = ' + abt.val(i)); +console.log( + 'Индекс левого дочернего узла = ' + l + ', значение = ' + (l === null ? 'null' : abt.val(l)) +); +console.log( + 'Индекс правого дочернего узла = ' + r + ', значение = ' + (r === null ? 'null' : abt.val(r)) +); +console.log( + 'Индекс родительского узла = ' + p + ', значение = ' + (p === null ? 'null' : abt.val(p)) +); + +// Обходить дерево +let res = abt.levelOrder(); +console.log('\nОбход в ширину: ' + res); +res = abt.preOrder(); +console.log('Предварительный обход: ' + res); +res = abt.inOrder(); +console.log('Симметричный обход: ' + res); +res = abt.postOrder(); +console.log('Обратный обход: ' + res); diff --git a/ru/codes/javascript/chapter_tree/avl_tree.js b/ru/codes/javascript/chapter_tree/avl_tree.js new file mode 100644 index 000000000..050b1d507 --- /dev/null +++ b/ru/codes/javascript/chapter_tree/avl_tree.js @@ -0,0 +1,208 @@ +/** + * File: avl_tree.js + * Created Time: 2023-02-05 + * Author: what-is-me (whatisme@outlook.jp) + */ + +const { TreeNode } = require('../modules/TreeNode'); +const { printTree } = require('../modules/PrintUtil'); + +/* AVL-дерево */ +class AVLTree { + /* Конструктор */ + constructor() { + this.root = null; // Корневой узел + } + + /* Получить высоту узла */ + height(node) { + // Высота пустого узла равна -1, высота листового узла равна 0 + return node === null ? -1 : node.height; + } + + /* Обновить высоту узла */ + #updateHeight(node) { + // Высота узла равна высоте более высокого поддерева + 1 + node.height = + Math.max(this.height(node.left), this.height(node.right)) + 1; + } + + /* Получить коэффициент баланса */ + balanceFactor(node) { + // Коэффициент баланса пустого узла равен 0 + if (node === null) return 0; + // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева + return this.height(node.left) - this.height(node.right); + } + + /* Операция правого вращения */ + #rightRotate(node) { + const child = node.left; + const grandChild = child.right; + // Выполнить правое вращение узла node вокруг child + child.right = node; + node.left = grandChild; + // Обновить высоту узла + this.#updateHeight(node); + this.#updateHeight(child); + // Вернуть корневой узел поддерева после вращения + return child; + } + + /* Операция левого вращения */ + #leftRotate(node) { + const child = node.right; + const grandChild = child.left; + // Выполнить левое вращение узла node вокруг child + child.left = node; + node.right = grandChild; + // Обновить высоту узла + this.#updateHeight(node); + this.#updateHeight(child); + // Вернуть корневой узел поддерева после вращения + return child; + } + + /* Выполнить вращение, чтобы снова сбалансировать поддерево */ + #rotate(node) { + // Получить коэффициент баланса узла node + const balanceFactor = this.balanceFactor(node); + // Левосторонне перекошенное дерево + if (balanceFactor > 1) { + if (this.balanceFactor(node.left) >= 0) { + // Правое вращение + return this.#rightRotate(node); + } else { + // Сначала левое вращение, затем правое + node.left = this.#leftRotate(node.left); + return this.#rightRotate(node); + } + } + // Правосторонне перекошенное дерево + if (balanceFactor < -1) { + if (this.balanceFactor(node.right) <= 0) { + // Левое вращение + return this.#leftRotate(node); + } else { + // Сначала правое вращение, затем левое + node.right = this.#rightRotate(node.right); + return this.#leftRotate(node); + } + } + // Дерево сбалансировано, вращение не требуется, вернуть сразу + return node; + } + + /* Вставка узла */ + insert(val) { + this.root = this.#insertHelper(this.root, val); + } + + /* Рекурсивная вставка узла (вспомогательный метод) */ + #insertHelper(node, val) { + if (node === null) return new TreeNode(val); + /* 1. Найти позицию вставки и вставить узел */ + if (val < node.val) node.left = this.#insertHelper(node.left, val); + else if (val > node.val) + node.right = this.#insertHelper(node.right, val); + else return node; // Повторяющийся узел не вставлять, сразу вернуть + this.#updateHeight(node); // Обновить высоту узла + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = this.#rotate(node); + // Вернуть корневой узел поддерева + return node; + } + + /* Удаление узла */ + remove(val) { + this.root = this.#removeHelper(this.root, val); + } + + /* Рекурсивное удаление узла (вспомогательный метод) */ + #removeHelper(node, val) { + if (node === null) return null; + /* 1. Найти узел и удалить его */ + if (val < node.val) node.left = this.#removeHelper(node.left, val); + else if (val > node.val) + node.right = this.#removeHelper(node.right, val); + else { + if (node.left === null || node.right === null) { + const child = node.left !== null ? node.left : node.right; + // Число дочерних узлов = 0, удалить node и сразу вернуть + if (child === null) return null; + // Число дочерних узлов = 1, удалить node напрямую + else node = child; + } else { + // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел + let temp = node.right; + while (temp.left !== null) { + temp = temp.left; + } + node.right = this.#removeHelper(node.right, temp.val); + node.val = temp.val; + } + } + this.#updateHeight(node); // Обновить высоту узла + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = this.#rotate(node); + // Вернуть корневой узел поддерева + return node; + } + + /* Поиск узла */ + search(val) { + let cur = this.root; + // Искать в цикле и выйти после прохода за листовой узел + while (cur !== null) { + // Целевой узел находится в правом поддереве cur + if (cur.val < val) cur = cur.right; + // Целевой узел находится в левом поддереве cur + else if (cur.val > val) cur = cur.left; + // Найти целевой узел и выйти из цикла + else break; + } + // Вернуть целевой узел + return cur; + } +} + +function testInsert(tree, val) { + tree.insert(val); + console.log('\nПосле вставки узла ' + val + ' AVL-дерево имеет вид'); + printTree(tree.root); +} + +function testRemove(tree, val) { + tree.remove(val); + console.log('\nПосле удаления узла ' + val + ' AVL-дерево имеет вид'); + printTree(tree.root); +} + +/* Driver Code */ +/* Инициализация пустого AVL-дерева */ +const avlTree = new AVLTree(); +/* Вставка узла */ +// Обратите внимание, как AVL-дерево сохраняет баланс после вставки узла +testInsert(avlTree, 1); +testInsert(avlTree, 2); +testInsert(avlTree, 3); +testInsert(avlTree, 4); +testInsert(avlTree, 5); +testInsert(avlTree, 8); +testInsert(avlTree, 7); +testInsert(avlTree, 9); +testInsert(avlTree, 10); +testInsert(avlTree, 6); + +/* Вставка повторяющегося узла */ +testInsert(avlTree, 7); + +/* Удаление узла */ +// Обратите внимание, как AVL-дерево сохраняет баланс после удаления узла +testRemove(avlTree, 8); // Удаление узла степени 0 +testRemove(avlTree, 5); // Удаление узла степени 1 +testRemove(avlTree, 4); // Удаление узла степени 2 + +/* Поиск узла */ +const node = avlTree.search(7); +console.log('\nНайденный объект узла =', node, ', значение узла = ' + node.val); diff --git a/ru/codes/javascript/chapter_tree/binary_search_tree.js b/ru/codes/javascript/chapter_tree/binary_search_tree.js new file mode 100644 index 000000000..8b428fb68 --- /dev/null +++ b/ru/codes/javascript/chapter_tree/binary_search_tree.js @@ -0,0 +1,139 @@ +/** + * File: binary_search_tree.js + * Created Time: 2022-12-04 + * Author: IsChristina (christinaxia77@foxmail.com) + */ + +const { TreeNode } = require('../modules/TreeNode'); +const { printTree } = require('../modules/PrintUtil'); + +/* Двоичное дерево поиска */ +class BinarySearchTree { + /* Конструктор */ + constructor() { + // Инициализировать пустое дерево + this.root = null; + } + + /* Получить корневой узел двоичного дерева */ + getRoot() { + return this.root; + } + + /* Поиск узла */ + search(num) { + let cur = this.root; + // Искать в цикле и выйти после прохода за листовой узел + while (cur !== null) { + // Целевой узел находится в правом поддереве cur + if (cur.val < num) cur = cur.right; + // Целевой узел находится в левом поддереве cur + else if (cur.val > num) cur = cur.left; + // Найти целевой узел и выйти из цикла + else break; + } + // Вернуть целевой узел + return cur; + } + + /* Вставка узла */ + insert(num) { + // Если дерево пусто, инициализировать корневой узел + if (this.root === null) { + this.root = new TreeNode(num); + return; + } + let cur = this.root, + pre = null; + // Искать в цикле и выйти после прохода за листовой узел + while (cur !== null) { + // Найти повторяющийся узел и сразу вернуть + if (cur.val === num) return; + pre = cur; + // Позиция вставки находится в правом поддереве cur + if (cur.val < num) cur = cur.right; + // Позиция вставки находится в левом поддереве cur + else cur = cur.left; + } + // Вставка узла + const node = new TreeNode(num); + if (pre.val < num) pre.right = node; + else pre.left = node; + } + + /* Удаление узла */ + remove(num) { + // Если дерево пусто, сразу вернуть + if (this.root === null) return; + let cur = this.root, + pre = null; + // Искать в цикле и выйти после прохода за листовой узел + while (cur !== null) { + // Найти узел для удаления и выйти из цикла + if (cur.val === num) break; + pre = cur; + // Узел для удаления находится в правом поддереве cur + if (cur.val < num) cur = cur.right; + // Узел для удаления находится в левом поддереве cur + else cur = cur.left; + } + // Если узел для удаления отсутствует, сразу вернуть + if (cur === null) return; + // Число дочерних узлов = 0 или 1 + if (cur.left === null || cur.right === null) { + // Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел + const child = cur.left !== null ? cur.left : cur.right; + // Удалить узел cur + if (cur !== this.root) { + if (pre.left === cur) pre.left = child; + else pre.right = child; + } else { + // Если удаляемый узел является корнем, заново назначить корневой узел + this.root = child; + } + } + // Число дочерних узлов = 2 + else { + // Получить следующий узел после cur в симметричном обходе + let tmp = cur.right; + while (tmp.left !== null) { + tmp = tmp.left; + } + // Рекурсивно удалить узел tmp + this.remove(tmp.val); + // Перезаписать cur значением tmp + cur.val = tmp.val; + } + } +} + +/* Driver Code */ +/* Инициализация двоичного дерева поиска */ +const bst = new BinarySearchTree(); +// Обратите внимание: разные порядки вставки порождают разные двоичные деревья; данная последовательность может построить совершенное двоичное дерево +const nums = [8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15]; +for (const num of nums) { + bst.insert(num); +} +console.log('\nИсходное двоичное дерево\n'); +printTree(bst.getRoot()); + +/* Поиск узла */ +const node = bst.search(7); +console.log('\nНайденный объект узла = ' + node + ', значение узла = ' + node.val); + +/* Вставка узла */ +bst.insert(16); +console.log('\nПосле вставки узла 16 двоичное дерево имеет вид\n'); +printTree(bst.getRoot()); + +/* Удаление узла */ +bst.remove(1); +console.log('\nПосле удаления узла 1 двоичное дерево имеет вид\n'); +printTree(bst.getRoot()); +bst.remove(2); +console.log('\nПосле удаления узла 2 двоичное дерево имеет вид\n'); +printTree(bst.getRoot()); +bst.remove(4); +console.log('\nПосле удаления узла 4 двоичное дерево имеет вид\n'); +printTree(bst.getRoot()); diff --git a/ru/codes/javascript/chapter_tree/binary_tree.js b/ru/codes/javascript/chapter_tree/binary_tree.js new file mode 100644 index 000000000..d38bfd90a --- /dev/null +++ b/ru/codes/javascript/chapter_tree/binary_tree.js @@ -0,0 +1,35 @@ +/** + * File: binary_tree.js + * Created Time: 2022-12-04 + * Author: IsChristina (christinaxia77@foxmail.com) + */ + +const { TreeNode } = require('../modules/TreeNode'); +const { printTree } = require('../modules/PrintUtil'); + +/* Инициализация двоичного дерева */ +// Инициализация узла +let n1 = new TreeNode(1), + n2 = new TreeNode(2), + n3 = new TreeNode(3), + n4 = new TreeNode(4), + n5 = new TreeNode(5); +// Построить связи между узлами (указатели) +n1.left = n2; +n1.right = n3; +n2.left = n4; +n2.right = n5; +console.log('\nИнициализация двоичного дерева\n'); +printTree(n1); + +/* Вставка и удаление узлов */ +const P = new TreeNode(0); +// Вставить узел P между n1 -> n2 +n1.left = P; +P.left = n2; +console.log('\nПосле вставки узла P\n'); +printTree(n1); +// Удалить узел P +n1.left = n2; +console.log('\nПосле удаления узла P\n'); +printTree(n1); diff --git a/ru/codes/javascript/chapter_tree/binary_tree_bfs.js b/ru/codes/javascript/chapter_tree/binary_tree_bfs.js new file mode 100644 index 000000000..3432be0f5 --- /dev/null +++ b/ru/codes/javascript/chapter_tree/binary_tree_bfs.js @@ -0,0 +1,34 @@ +/** + * File: binary_tree_bfs.js + * Created Time: 2022-12-04 + * Author: IsChristina (christinaxia77@foxmail.com) + */ + +const { arrToTree } = require('../modules/TreeNode'); +const { printTree } = require('../modules/PrintUtil'); + +/* Обход в ширину */ +function levelOrder(root) { + // Инициализировать очередь и добавить корневой узел + const queue = [root]; + // Инициализировать список для хранения последовательности обхода + const list = []; + while (queue.length) { + let node = queue.shift(); // Извлечение из очереди + list.push(node.val); // Сохранить значение узла + if (node.left) queue.push(node.left); // Поместить левый дочерний узел в очередь + if (node.right) queue.push(node.right); // Поместить правый дочерний узел в очередь + } + return list; +} + +/* Driver Code */ +/* Инициализация двоичного дерева */ +// Здесь используется функция, напрямую строящая двоичное дерево из массива +const root = arrToTree([1, 2, 3, 4, 5, 6, 7]); +console.log('\nИнициализация двоичного дерева\n'); +printTree(root); + +/* Обход в ширину */ +const list = levelOrder(root); +console.log('\nПоследовательность печати узлов при обходе в ширину = ' + list); diff --git a/ru/codes/javascript/chapter_tree/binary_tree_dfs.js b/ru/codes/javascript/chapter_tree/binary_tree_dfs.js new file mode 100644 index 000000000..247655543 --- /dev/null +++ b/ru/codes/javascript/chapter_tree/binary_tree_dfs.js @@ -0,0 +1,60 @@ +/** + * File: binary_tree_dfs.js + * Created Time: 2022-12-04 + * Author: IsChristina (christinaxia77@foxmail.com) + */ + +const { arrToTree } = require('../modules/TreeNode'); +const { printTree } = require('../modules/PrintUtil'); + +// Инициализировать список для хранения последовательности обхода +const list = []; + +/* Предварительный обход */ +function preOrder(root) { + if (root === null) return; + // Порядок обхода: корень -> левое поддерево -> правое поддерево + list.push(root.val); + preOrder(root.left); + preOrder(root.right); +} + +/* Симметричный обход */ +function inOrder(root) { + if (root === null) return; + // Порядок обхода: левое поддерево -> корень -> правое поддерево + inOrder(root.left); + list.push(root.val); + inOrder(root.right); +} + +/* Обратный обход */ +function postOrder(root) { + if (root === null) return; + // Порядок обхода: левое поддерево -> правое поддерево -> корень + postOrder(root.left); + postOrder(root.right); + list.push(root.val); +} + +/* Driver Code */ +/* Инициализация двоичного дерева */ +// Здесь используется функция, напрямую строящая двоичное дерево из массива +const root = arrToTree([1, 2, 3, 4, 5, 6, 7]); +console.log('\nИнициализация двоичного дерева\n'); +printTree(root); + +/* Предварительный обход */ +list.length = 0; +preOrder(root); +console.log('\nПоследовательность печати узлов при предварительном обходе = ' + list); + +/* Симметричный обход */ +list.length = 0; +inOrder(root); +console.log('\nПоследовательность печати узлов при симметричном обходе = ' + list); + +/* Обратный обход */ +list.length = 0; +postOrder(root); +console.log('\nПоследовательность печати узлов при обратном обходе = ' + list); diff --git a/ru/codes/javascript/modules/ListNode.js b/ru/codes/javascript/modules/ListNode.js new file mode 100644 index 000000000..5944e9d2e --- /dev/null +++ b/ru/codes/javascript/modules/ListNode.js @@ -0,0 +1,31 @@ +/** + * File: ListNode.js + * Created Time: 2022-12-12 + * Author: IsChristina (christinaxia77@foxmail.com) + */ + +/* Узел связного списка */ +class ListNode { + val; // Значение узла + next; // Ссылка (указатель) на следующий узел + constructor(val, next) { + this.val = val === undefined ? 0 : val; + this.next = next === undefined ? null : next; + } +} + +/* Десериализовать список в связный список */ +function arrToLinkedList(arr) { + const dum = new ListNode(0); + let head = dum; + for (const val of arr) { + head.next = new ListNode(val); + head = head.next; + } + return dum.next; +} + +module.exports = { + ListNode, + arrToLinkedList, +}; diff --git a/ru/codes/javascript/modules/PrintUtil.js b/ru/codes/javascript/modules/PrintUtil.js new file mode 100644 index 000000000..9d92d9d32 --- /dev/null +++ b/ru/codes/javascript/modules/PrintUtil.js @@ -0,0 +1,86 @@ +/** + * File: PrintUtil.js + * Created Time: 2022-12-04 + * Author: IsChristina (christinaxia77@foxmail.com) + */ + +const { arrToTree } = require('./TreeNode'); + +/* Вывести связный список */ +function printLinkedList(head) { + let list = []; + while (head !== null) { + list.push(head.val.toString()); + head = head.next; + } + console.log(list.join(' -> ')); +} + +function Trunk(prev, str) { + this.prev = prev; + this.str = str; +} + +/** + * Вывести двоичное дерево + * Этот вывод дерева заимствован из TECHIE DELIGHT + * https://www.techiedelight.com/c-program-print-binary-tree/ + */ +function printTree(root) { + printTree(root, null, false); +} + +/* Вывести двоичное дерево */ +function printTree(root, prev, isRight) { + if (root === null) { + return; + } + + let prev_str = ' '; + let trunk = new Trunk(prev, prev_str); + + printTree(root.right, trunk, true); + + if (!prev) { + trunk.str = '———'; + } else if (isRight) { + trunk.str = '/———'; + prev_str = ' |'; + } else { + trunk.str = '\\———'; + prev.str = prev_str; + } + + showTrunks(trunk); + console.log(' ' + root.val); + + if (prev) { + prev.str = prev_str; + } + trunk.str = ' |'; + + printTree(root.left, trunk, false); +} + +function showTrunks(p) { + if (!p) { + return; + } + + showTrunks(p.prev); + process.stdout.write(p.str); +} + +/* Вывести кучу */ +function printHeap(arr) { + console.log('Массивное представление кучи:'); + console.log(arr); + console.log('Древовидное представление кучи:'); + printTree(arrToTree(arr)); +} + +module.exports = { + printLinkedList, + printTree, + printHeap, +}; diff --git a/ru/codes/javascript/modules/TreeNode.js b/ru/codes/javascript/modules/TreeNode.js new file mode 100644 index 000000000..28e2747f5 --- /dev/null +++ b/ru/codes/javascript/modules/TreeNode.js @@ -0,0 +1,35 @@ +/** + * File: TreeNode.js + * Created Time: 2022-12-04 + * Author: IsChristina (christinaxia77@foxmail.com) + */ + +/* Узел двоичного дерева */ +class TreeNode { + val; // Значение узла + left; // Указатель на левый дочерний узел + right; // Указатель на правый дочерний узел + height; // Высота узла + constructor(val, left, right, height) { + this.val = val === undefined ? 0 : val; + this.left = left === undefined ? null : left; + this.right = right === undefined ? null : right; + this.height = height === undefined ? 0 : height; + } +} + +/* Десериализовать массив в двоичное дерево */ +function arrToTree(arr, i = 0) { + if (i < 0 || i >= arr.length || arr[i] === null) { + return null; + } + let root = new TreeNode(arr[i]); + root.left = arrToTree(arr, 2 * i + 1); + root.right = arrToTree(arr, 2 * i + 2); + return root; +} + +module.exports = { + TreeNode, + arrToTree, +}; diff --git a/ru/codes/javascript/modules/Vertex.js b/ru/codes/javascript/modules/Vertex.js new file mode 100644 index 000000000..3a9e17f16 --- /dev/null +++ b/ru/codes/javascript/modules/Vertex.js @@ -0,0 +1,35 @@ +/** + * File: Vertex.js + * Created Time: 2023-02-15 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +/* Класс вершины */ +class Vertex { + val; + constructor(val) { + this.val = val; + } + + /* На вход подается список значений vals, на выходе возвращается список вершин vets */ + static valsToVets(vals) { + const vets = []; + for (let i = 0; i < vals.length; i++) { + vets[i] = new Vertex(vals[i]); + } + return vets; + } + + /* На вход подается список вершин vets, на выходе возвращается список значений vals */ + static vetsToVals(vets) { + const vals = []; + for (const vet of vets) { + vals.push(vet.val); + } + return vals; + } +} + +module.exports = { + Vertex, +}; diff --git a/ru/codes/javascript/test_all.js b/ru/codes/javascript/test_all.js new file mode 100644 index 000000000..b43ef49f5 --- /dev/null +++ b/ru/codes/javascript/test_all.js @@ -0,0 +1,63 @@ +import { bold, brightRed } from 'jsr:@std/fmt/colors'; +import { expandGlob } from 'jsr:@std/fs'; +import { relative, resolve } from 'jsr:@std/path'; + +/** + * @typedef {import('jsr:@std/fs').WalkEntry} WalkEntry + * @type {WalkEntry[]} + */ +const entries = []; + +for await (const entry of expandGlob( + resolve(import.meta.dirname, './chapter_*/*.js') +)) { + entries.push(entry); +} + +/** @type {{ status: Promise; stderr: ReadableStream; }[]} */ +const processes = []; + +for (const file of entries) { + const execute = new Deno.Command('node', { + args: [relative(import.meta.dirname, file.path)], + cwd: import.meta.dirname, + stdin: 'piped', + stdout: 'piped', + stderr: 'piped', + }); + + const process = execute.spawn(); + processes.push({ status: process.status, stderr: process.stderr }); +} + +const results = await Promise.all( + processes.map(async (item) => { + const status = await item.status; + return { status, stderr: item.stderr }; + }) +); + +/** @type {ReadableStream[]} */ +const errors = []; + +for (const result of results) { + if (!result.status.success) { + errors.push(result.stderr); + } +} + +console.log(`Tested ${entries.length} files`); +console.log(`Found exception in ${errors.length} files`); + +if (errors.length) { + console.log(); + + for (const error of errors) { + const reader = error.getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + console.log(`${bold(brightRed('error'))}: ${decoder.decode(value)}`); + } + + throw new Error('Test failed'); +} diff --git a/ru/codes/kotlin/chapter_array_and_linkedlist/array.kt b/ru/codes/kotlin/chapter_array_and_linkedlist/array.kt new file mode 100644 index 000000000..4031bf16b --- /dev/null +++ b/ru/codes/kotlin/chapter_array_and_linkedlist/array.kt @@ -0,0 +1,102 @@ +/** + * File: array.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_array_and_linkedlist + +import java.util.concurrent.ThreadLocalRandom + +/* Случайный доступ к элементу */ +fun randomAccess(nums: IntArray): Int { + // Случайным образом выбрать число из интервала [0, nums.size) + val randomIndex = ThreadLocalRandom.current().nextInt(0, nums.size) + // Получить и вернуть случайный элемент + val randomNum = nums[randomIndex] + return randomNum +} + +/* Увеличить длину массива */ +fun extend(nums: IntArray, enlarge: Int): IntArray { + // Инициализировать массив увеличенной длины + val res = IntArray(nums.size + enlarge) + // Скопировать все элементы исходного массива в новый массив + for (i in nums.indices) { + res[i] = nums[i] + } + // Вернуть новый массив после расширения + return res +} + +/* Вставить элемент num по индексу index в массив */ +fun insert(nums: IntArray, num: Int, index: Int) { + // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад + for (i in nums.size - 1 downTo index + 1) { + nums[i] = nums[i - 1] + } + // Присвоить num элементу по индексу index + nums[index] = num +} + +/* Удалить элемент по индексу index */ +fun remove(nums: IntArray, index: Int) { + // Сдвинуть все элементы после индекса index на одну позицию вперед + for (i in index.. P -> n1 + val p = n0.next + val n1 = p?.next + n0.next = n1 +} + +/* Доступ к узлу связного списка по индексу index */ +fun access(head: ListNode?, index: Int): ListNode? { + var h = head + for (i in 0..= size) + throw IndexOutOfBoundsException("индекс выходит за границы") + return arr[index] + } + + /* Обновление элемента */ + fun set(index: Int, num: Int) { + if (index < 0 || index >= size) + throw IndexOutOfBoundsException("индекс выходит за границы") + arr[index] = num + } + + /* Добавление элемента в конец */ + fun add(num: Int) { + // При превышении вместимости по числу элементов запускается расширение + if (size == capacity()) + extendCapacity() + arr[size] = num + // Обновить число элементов + size++ + } + + /* Вставка элемента в середину */ + fun insert(index: Int, num: Int) { + if (index < 0 || index >= size) + throw IndexOutOfBoundsException("индекс выходит за границы") + // При превышении вместимости по числу элементов запускается расширение + if (size == capacity()) + extendCapacity() + // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад + for (j in size - 1 downTo index) + arr[j + 1] = arr[j] + arr[index] = num + // Обновить число элементов + size++ + } + + /* Удаление элемента */ + fun remove(index: Int): Int { + if (index < 0 || index >= size) + throw IndexOutOfBoundsException("индекс выходит за границы") + val num = arr[index] + // Сдвинуть все элементы после индекса index на одну позицию вперед + for (j in index..>, + res: MutableList>?>, + cols: BooleanArray, + diags1: BooleanArray, + diags2: BooleanArray +) { + // Когда все строки уже обработаны, записать решение + if (row == n) { + val copyState = mutableListOf>() + for (sRow in state) { + copyState.add(sRow.toMutableList()) + } + res.add(copyState) + return + } + // Обойти все столбцы + for (col in 0..>?> { + // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку + val state = mutableListOf>() + for (i in 0..() + for (j in 0..>?>() + + backtrack(0, n, state, res, cols, diags1, diags2) + + return res +} + +/* Driver Code */ +fun main() { + val n = 4 + val res = nQueens(n) + + println("Размер входной доски = $n") + println("Количество способов расстановки ферзей: ${res.size}") + for (state in res) { + println("--------------------") + for (row in state!!) { + println(row) + } + } +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_backtracking/permutations_i.kt b/ru/codes/kotlin/chapter_backtracking/permutations_i.kt new file mode 100644 index 000000000..4901f4932 --- /dev/null +++ b/ru/codes/kotlin/chapter_backtracking/permutations_i.kt @@ -0,0 +1,53 @@ +/** + * File: permutations_i.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_backtracking.permutations_i + +/* Алгоритм бэктрекинга: все перестановки I */ +fun backtrack( + state: MutableList, + choices: IntArray, + selected: BooleanArray, + res: MutableList?> +) { + // Когда длина состояния равна числу элементов, записать решение + if (state.size == choices.size) { + res.add(state.toMutableList()) + return + } + // Перебор всех вариантов выбора + for (i in choices.indices) { + val choice = choices[i] + // Отсечение: нельзя выбирать один и тот же элемент повторно + if (!selected[i]) { + // Попытка: сделать выбор и обновить состояние + selected[i] = true + state.add(choice) + // Перейти к следующему выбору + backtrack(state, choices, selected, res) + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false + state.removeAt(state.size - 1) + } + } +} + +/* Все перестановки I */ +fun permutationsI(nums: IntArray): MutableList?> { + val res = mutableListOf?>() + backtrack(mutableListOf(), nums, BooleanArray(nums.size), res) + return res +} + +/* Driver Code */ +fun main() { + val nums = intArrayOf(1, 2, 3) + + val res = permutationsI(nums) + + println("Входной массив nums = ${nums.contentToString()}") + println("Все перестановки res = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_backtracking/permutations_ii.kt b/ru/codes/kotlin/chapter_backtracking/permutations_ii.kt new file mode 100644 index 000000000..d44a8307c --- /dev/null +++ b/ru/codes/kotlin/chapter_backtracking/permutations_ii.kt @@ -0,0 +1,54 @@ +/** + * File: permutations_ii.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_backtracking.permutations_ii + +/* Алгоритм бэктрекинга: все перестановки II */ +fun backtrack( + state: MutableList, + choices: IntArray, + selected: BooleanArray, + res: MutableList?> +) { + // Когда длина состояния равна числу элементов, записать решение + if (state.size == choices.size) { + res.add(state.toMutableList()) + return + } + // Перебор всех вариантов выбора + val duplicated = HashSet() + for (i in choices.indices) { + val choice = choices[i] + // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы + if (!selected[i] && !duplicated.contains(choice)) { + // Попытка: сделать выбор и обновить состояние + duplicated.add(choice) // Записать значения уже выбранных элементов + selected[i] = true + state.add(choice) + // Перейти к следующему выбору + backtrack(state, choices, selected, res) + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false + state.removeAt(state.size - 1) + } + } +} + +/* Все перестановки II */ +fun permutationsII(nums: IntArray): MutableList?> { + val res = mutableListOf?>() + backtrack(mutableListOf(), nums, BooleanArray(nums.size), res) + return res +} + +/* Driver Code */ +fun main() { + val nums = intArrayOf(1, 2, 2) + val res = permutationsII(nums) + + println("Входной массив nums = ${nums.contentToString()}") + println("Все перестановки res = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_backtracking/preorder_traversal_i_compact.kt b/ru/codes/kotlin/chapter_backtracking/preorder_traversal_i_compact.kt new file mode 100644 index 000000000..97e7c7d06 --- /dev/null +++ b/ru/codes/kotlin/chapter_backtracking/preorder_traversal_i_compact.kt @@ -0,0 +1,43 @@ +/** + * File: preorder_traversal_i_compact.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_backtracking.preorder_traversal_i_compact + +import utils.TreeNode +import utils.printTree + +var res: MutableList? = null + +/* Предварительный обход: пример 1 */ +fun preOrder(root: TreeNode?) { + if (root == null) { + return + } + if (root._val == 7) { + // Записать решение + res!!.add(root) + } + preOrder(root.left) + preOrder(root.right) +} + +/* Driver Code */ +fun main() { + val root = TreeNode.listToTree(mutableListOf(1, 7, 3, 4, 5, 6, 7)) + println("\nИнициализация двоичного дерева") + printTree(root) + + // Предварительный обход + res = mutableListOf() + preOrder(root) + + println("\nВсе узлы со значением 7") + val vals = mutableListOf() + for (node in res!!) { + vals.add(node._val) + } + println(vals) +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_backtracking/preorder_traversal_ii_compact.kt b/ru/codes/kotlin/chapter_backtracking/preorder_traversal_ii_compact.kt new file mode 100644 index 000000000..0771a7533 --- /dev/null +++ b/ru/codes/kotlin/chapter_backtracking/preorder_traversal_ii_compact.kt @@ -0,0 +1,51 @@ +/** + * File: preorder_traversal_ii_compact.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_backtracking.preorder_traversal_ii_compact + +import utils.TreeNode +import utils.printTree + +var path: MutableList? = null +var res: MutableList>? = null + +/* Предварительный обход: пример 2 */ +fun preOrder(root: TreeNode?) { + if (root == null) { + return + } + // Попытка + path!!.add(root) + if (root._val == 7) { + // Записать решение + res!!.add(path!!.toMutableList()) + } + preOrder(root.left) + preOrder(root.right) + // Откат + path!!.removeAt(path!!.size - 1) +} + +/* Driver Code */ +fun main() { + val root = TreeNode.listToTree(mutableListOf(1, 7, 3, 4, 5, 6, 7)) + println("\nИнициализация двоичного дерева") + printTree(root) + + // Предварительный обход + path = mutableListOf() + res = mutableListOf() + preOrder(root) + + println("\nВсе пути от корня к узлу 7") + for (path in res!!) { + val _vals = mutableListOf() + for (node in path) { + _vals.add(node._val) + } + println(_vals) + } +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_backtracking/preorder_traversal_iii_compact.kt b/ru/codes/kotlin/chapter_backtracking/preorder_traversal_iii_compact.kt new file mode 100644 index 000000000..e1a3e315f --- /dev/null +++ b/ru/codes/kotlin/chapter_backtracking/preorder_traversal_iii_compact.kt @@ -0,0 +1,52 @@ +/** + * File: preorder_traversal_iii_compact.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_backtracking.preorder_traversal_iii_compact + +import utils.TreeNode +import utils.printTree + +var path: MutableList? = null +var res: MutableList>? = null + +/* Предварительный обход: пример 3 */ +fun preOrder(root: TreeNode?) { + // Отсечение + if (root == null || root._val == 3) { + return + } + // Попытка + path!!.add(root) + if (root._val == 7) { + // Записать решение + res!!.add(path!!.toMutableList()) + } + preOrder(root.left) + preOrder(root.right) + // Откат + path!!.removeAt(path!!.size - 1) +} + +/* Driver Code */ +fun main() { + val root = TreeNode.listToTree(mutableListOf(1, 7, 3, 4, 5, 6, 7)) + println("\nИнициализация двоичного дерева") + printTree(root) + + // Предварительный обход + path = mutableListOf() + res = mutableListOf() + preOrder(root) + + println("\nВсе пути от корня к узлу 7, не содержащие узлов со значением 3") + for (path in res!!) { + val _vals = mutableListOf() + for (node in path) { + _vals.add(node._val) + } + println(_vals) + } +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_backtracking/preorder_traversal_iii_template.kt b/ru/codes/kotlin/chapter_backtracking/preorder_traversal_iii_template.kt new file mode 100644 index 000000000..59bad00ba --- /dev/null +++ b/ru/codes/kotlin/chapter_backtracking/preorder_traversal_iii_template.kt @@ -0,0 +1,82 @@ +/** + * File: preorder_traversal_iii_template.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_backtracking.preorder_traversal_iii_template + +import utils.TreeNode +import utils.printTree + +/* Проверить, является ли текущее состояние решением */ +fun isSolution(state: MutableList): Boolean { + return state.isNotEmpty() && state[state.size - 1]?._val == 7 +} + +/* Записать решение */ +fun recordSolution(state: MutableList?, res: MutableList?>) { + res.add(state!!.toMutableList()) +} + +/* Проверить, допустим ли этот выбор в текущем состоянии */ +fun isValid(state: MutableList?, choice: TreeNode?): Boolean { + return choice != null && choice._val != 3 +} + +/* Обновить состояние */ +fun makeChoice(state: MutableList, choice: TreeNode?) { + state.add(choice) +} + +/* Восстановить состояние */ +fun undoChoice(state: MutableList, choice: TreeNode?) { + state.removeLast() +} + +/* Алгоритм бэктрекинга: пример 3 */ +fun backtrack( + state: MutableList, + choices: MutableList, + res: MutableList?> +) { + // Проверить, является ли текущее состояние решением + if (isSolution(state)) { + // Записать решение + recordSolution(state, res) + } + // Перебор всех вариантов выбора + for (choice in choices) { + // Отсечение: проверить допустимость выбора + if (isValid(state, choice)) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state, choice) + // Перейти к следующему выбору + backtrack(state, mutableListOf(choice!!.left, choice.right), res) + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state, choice) + } + } +} + +/* Driver Code */ +fun main() { + val root = TreeNode.listToTree(mutableListOf(1, 7, 3, 4, 5, 6, 7)) + println("\nИнициализация двоичного дерева") + printTree(root) + + // Алгоритм бэктрекинга + val res = mutableListOf?>() + backtrack(mutableListOf(), mutableListOf(root), res) + + println("\nВсе пути от корня к узлу 7, в которых путь не содержит узлов со значением 3") + for (path in res) { + val vals = mutableListOf() + for (node in path!!) { + if (node != null) { + vals.add(node._val) + } + } + println(vals) + } +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_backtracking/subset_sum_i.kt b/ru/codes/kotlin/chapter_backtracking/subset_sum_i.kt new file mode 100644 index 000000000..9d21737f0 --- /dev/null +++ b/ru/codes/kotlin/chapter_backtracking/subset_sum_i.kt @@ -0,0 +1,58 @@ +/** + * File: subset_sum_i.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_backtracking.subset_sum_i + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +fun backtrack( + state: MutableList, + target: Int, + choices: IntArray, + start: Int, + res: MutableList?> +) { + // Если сумма подмножества равна target, записать решение + if (target == 0) { + res.add(state.toMutableList()) + return + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + for (i in start..?> { + val state = mutableListOf() // Состояние (подмножество) + nums.sort() // Отсортировать nums + val start = 0 // Стартовая вершина обхода + val res = mutableListOf?>() // Список результатов (список подмножеств) + backtrack(state, target, nums, start, res) + return res +} + +/* Driver Code */ +fun main() { + val nums = intArrayOf(3, 4, 5) + val target = 9 + + val res = subsetSumI(nums, target) + + println("Входной массив nums = ${nums.contentToString()}, target = $target") + println("Все подмножества с суммой $target: res = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_backtracking/subset_sum_i_naive.kt b/ru/codes/kotlin/chapter_backtracking/subset_sum_i_naive.kt new file mode 100644 index 000000000..98f1e6eb4 --- /dev/null +++ b/ru/codes/kotlin/chapter_backtracking/subset_sum_i_naive.kt @@ -0,0 +1,55 @@ +/** + * File: subset_sum_i_native.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_backtracking.subset_sum_i_naive + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +fun backtrack( + state: MutableList, + target: Int, + total: Int, + choices: IntArray, + res: MutableList?> +) { + // Если сумма подмножества равна target, записать решение + if (total == target) { + res.add(state.toMutableList()) + return + } + // Перебор всех вариантов выбора + for (i in choices.indices) { + // Отсечение: если сумма подмножества превышает target, пропустить этот выбор + if (total + choices[i] > target) { + continue + } + // Попытка: сделать выбор и обновить элемент и total + state.add(choices[i]) + // Перейти к следующему выбору + backtrack(state, target, total + choices[i], choices, res) + // Откат: отменить выбор и восстановить предыдущее состояние + state.removeAt(state.size - 1) + } +} + +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */ +fun subsetSumINaive(nums: IntArray, target: Int): MutableList?> { + val state = mutableListOf() // Состояние (подмножество) + val total = 0 // Сумма подмножеств + val res = mutableListOf?>() // Список результатов (список подмножеств) + backtrack(state, target, total, nums, res) + return res +} + +/* Driver Code */ +fun main() { + val nums = intArrayOf(3, 4, 5) + val target = 9 + val res = subsetSumINaive(nums, target) + + println("Входной массив nums = ${nums.contentToString()}, target = $target") + println("Все подмножества с суммой $target: res = $res") + println("Обратите внимание: результат этого метода содержит повторяющиеся множества") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_backtracking/subset_sum_ii.kt b/ru/codes/kotlin/chapter_backtracking/subset_sum_ii.kt new file mode 100644 index 000000000..57eef2baf --- /dev/null +++ b/ru/codes/kotlin/chapter_backtracking/subset_sum_ii.kt @@ -0,0 +1,62 @@ +/** + * File: subset_sum_ii.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_backtracking.subset_sum_ii + +/* Алгоритм бэктрекинга: сумма подмножеств II */ +fun backtrack( + state: MutableList, + target: Int, + choices: IntArray, + start: Int, + res: MutableList?> +) { + // Если сумма подмножества равна target, записать решение + if (target == 0) { + res.add(state.toMutableList()) + return + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента + for (i in start.. start && choices[i] == choices[i - 1]) { + continue + } + // Попытка: сделать выбор и обновить target и start + state.add(choices[i]) + // Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i + 1, res) + // Откат: отменить выбор и восстановить предыдущее состояние + state.removeAt(state.size - 1) + } +} + +/* Решить задачу суммы подмножеств II */ +fun subsetSumII(nums: IntArray, target: Int): MutableList?> { + val state = mutableListOf() // Состояние (подмножество) + nums.sort() // Отсортировать nums + val start = 0 // Стартовая вершина обхода + val res = mutableListOf?>() // Список результатов (список подмножеств) + backtrack(state, target, nums, start, res) + return res +} + +/* Driver Code */ +fun main() { + val nums = intArrayOf(4, 4, 5) + val target = 9 + val res = subsetSumII(nums, target) + + println("Входной массив nums = ${nums.contentToString()}, target = $target") + println("Все подмножества с суммой $target: res = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_computational_complexity/iteration.kt b/ru/codes/kotlin/chapter_computational_complexity/iteration.kt new file mode 100644 index 000000000..972db258a --- /dev/null +++ b/ru/codes/kotlin/chapter_computational_complexity/iteration.kt @@ -0,0 +1,74 @@ +/** + * File: iteration.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_computational_complexity.iteration + +/* Цикл for */ +fun forLoop(n: Int): Int { + var res = 0 + // Циклическое суммирование 1, 2, ..., n-1, n + for (i in 1..n) { + res += i + } + return res +} + +/* Цикл while */ +fun whileLoop(n: Int): Int { + var res = 0 + var i = 1 // Инициализация условной переменной + // Циклическое суммирование 1, 2, ..., n-1, n + while (i <= n) { + res += i + i++ // Обновить условную переменную + } + return res +} + +/* Цикл while (двойное обновление) */ +fun whileLoopII(n: Int): Int { + var res = 0 + var i = 1 // Инициализация условной переменной + // Циклическое суммирование 1, 4, 10, ... + while (i <= n) { + res += i + // Обновить условную переменную + i++ + i *= 2 + } + return res +} + +/* Двойной цикл for */ +fun nestedForLoop(n: Int): String { + val res = StringBuilder() + // Цикл по i = 1, 2, ..., n-1, n + for (i in 1..n) { + // Цикл по j = 1, 2, ..., n-1, n + for (j in 1..n) { + res.append(" ($i, $j), ") + } + } + return res.toString() +} + +/* Driver Code */ +fun main() { + val n = 5 + var res: Int + + res = forLoop(n) + println("\nРезультат суммирования в цикле for res = $res") + + res = whileLoop(n) + println("\nРезультат суммирования в цикле while res = $res") + + res = whileLoopII(n) + println("\nРезультат суммирования в цикле while (двойное обновление) res = $res") + + val resStr = nestedForLoop(n) + println("\nРезультат обхода в двойном цикле for $resStr") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_computational_complexity/recursion.kt b/ru/codes/kotlin/chapter_computational_complexity/recursion.kt new file mode 100644 index 000000000..babf945d2 --- /dev/null +++ b/ru/codes/kotlin/chapter_computational_complexity/recursion.kt @@ -0,0 +1,78 @@ +/** + * File: recursion.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_computational_complexity.recursion + +import java.util.* + +/* Рекурсия */ +fun recur(n: Int): Int { + // Условие завершения + if (n == 1) + return 1 + // Рекурсивный шаг: рекурсивный вызов + val res = recur(n - 1) + // Возврат: вернуть результат + return n + res +} + +/* Имитация рекурсии итерацией */ +fun forLoopRecur(n: Int): Int { + // Использовать явный стек для имитации системного стека вызовов + val stack = Stack() + var res = 0 + // Рекурсивный шаг: рекурсивный вызов + for (i in n downTo 0) { + // Имитировать «рекурсию» с помощью операции помещения в стек + stack.push(i) + } + // Возврат: вернуть результат + while (stack.isNotEmpty()) { + // Имитировать «возврат» с помощью операции извлечения из стека + res += stack.pop() + } + // res = 1+2+3+...+n + return res +} + +/* Хвостовая рекурсия */ +tailrec fun tailRecur(n: Int, res: Int): Int { + // Добавить ключевое слово tailrec, чтобы включить оптимизацию хвостовой рекурсии + // Условие завершения + if (n == 0) + return res + // Хвостовой рекурсивный вызов + return tailRecur(n - 1, res + n) +} + +/* Последовательность Фибоначчи: рекурсия */ +fun fib(n: Int): Int { + // Условие завершения: f(1) = 0, f(2) = 1 + if (n == 1 || n == 2) + return n - 1 + // Рекурсивный вызов f(n) = f(n-1) + f(n-2) + val res = fib(n - 1) + fib(n - 2) + // Вернуть результат f(n) + return res +} + +/* Driver Code */ +fun main() { + val n = 5 + var res: Int + + res = recur(n) + println("\nРезультат суммирования в рекурсивной функции res = $res") + + res = forLoopRecur(n) + println("\nРезультат суммирования при имитации рекурсии итерацией res = $res") + + res = tailRecur(n, 0) + println("\nРезультат суммирования в хвостовой рекурсии res = $res") + + res = fib(n) + println("\nЧлен последовательности Фибоначчи с номером $n = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_computational_complexity/space_complexity.kt b/ru/codes/kotlin/chapter_computational_complexity/space_complexity.kt new file mode 100644 index 000000000..309934910 --- /dev/null +++ b/ru/codes/kotlin/chapter_computational_complexity/space_complexity.kt @@ -0,0 +1,109 @@ +/** + * File: space_complexity.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_computational_complexity.space_complexity + +import utils.ListNode +import utils.TreeNode +import utils.printTree + +/* Функция */ +fun function(): Int { + // Выполнить некоторые операции + return 0 +} + +/* Постоянная сложность */ +fun constant(n: Int) { + // Константы, переменные и объекты занимают O(1) памяти + val a = 0 + var b = 0 + val nums = Array(10000) { 0 } + val node = ListNode(0) + // Переменные в цикле занимают O(1) памяти + for (i in 0..() + for (i in 0..() + for (i in 0..?>(n) + // Двумерный список занимает O(n^2) памяти + val numList = mutableListOf>() + for (i in 0..() + for (j in 0.. nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + val temp = nums[j] + nums[j] = nums[j + 1] + nums[j + 1] = temp + count += 3 // Обмен элементов включает 3 элементарные операции + } + } + } + return count +} + +/* Экспоненциальная сложность (итеративная реализация) */ +fun exponential(n: Int): Int { + var count = 0 + var base = 1 + // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1) + for (i in 0.. 1) { + n1 /= 2 + count++ + } + return count +} + +/* Логарифмическая сложность (рекурсивная реализация) */ +fun logRecur(n: Int): Int { + if (n <= 1) + return 0 + return logRecur(n / 2) + 1 +} + +/* Линейно-логарифмическая сложность */ +fun linearLogRecur(n: Int): Int { + if (n <= 1) + return 1 + var count = linearLogRecur(n / 2) + linearLogRecur(n / 2) + for (i in 0.. { + val nums = IntArray(n) + // Создать массив nums = { 1, 2, 3, ..., n } + for (i in 0..(n) + for (i in 0..): Int { + for (i in nums.indices) { + // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1) + // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n) + if (nums[i] == 1) + return i + } + return -1 +} + +/* Driver Code */ +fun main() { + for (i in 0..9) { + val n = 100 + val nums = randomNumbers(n) + val index = findOne(nums) + println("\nМассив [1, 2, ..., n] после перемешивания = ${nums.contentToString()}") + println("Индекс числа 1 = $index") + } +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_divide_and_conquer/binary_search_recur.kt b/ru/codes/kotlin/chapter_divide_and_conquer/binary_search_recur.kt new file mode 100644 index 000000000..a4e3d0d6f --- /dev/null +++ b/ru/codes/kotlin/chapter_divide_and_conquer/binary_search_recur.kt @@ -0,0 +1,49 @@ +/** + * File: binary_search_recur.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_divide_and_conquer.binary_search_recur + +/* Бинарный поиск: задача f(i, j) */ +fun dfs( + nums: IntArray, + target: Int, + i: Int, + j: Int +): Int { + // Если интервал пуст, целевой элемент отсутствует, вернуть -1 + if (i > j) { + return -1 + } + // Вычислить индекс середины m + val m = (i + j) / 2 + return if (nums[m] < target) { + // Рекурсивная подзадача f(m+1, j) + dfs(nums, target, m + 1, j) + } else if (nums[m] > target) { + // Рекурсивная подзадача f(i, m-1) + dfs(nums, target, i, m - 1) + } else { + // Целевой элемент найден, вернуть его индекс + m + } +} + +/* Бинарный поиск */ +fun binarySearch(nums: IntArray, target: Int): Int { + val n = nums.size + // Решить задачу f(0, n-1) + return dfs(nums, target, 0, n - 1) +} + +/* Driver Code */ +fun main() { + val target = 6 + val nums = intArrayOf(1, 3, 6, 8, 12, 15, 23, 26, 31, 35) + + // Бинарный поиск (двусторонне замкнутый интервал) + val index = binarySearch(nums, target) + println("Индекс целевого элемента 6 = $index") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_divide_and_conquer/build_tree.kt b/ru/codes/kotlin/chapter_divide_and_conquer/build_tree.kt new file mode 100644 index 000000000..8695ce7fc --- /dev/null +++ b/ru/codes/kotlin/chapter_divide_and_conquer/build_tree.kt @@ -0,0 +1,55 @@ +/** + * File: build_tree.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_divide_and_conquer.build_tree + +import utils.TreeNode +import utils.printTree + +/* Построить двоичное дерево: разделяй и властвуй */ +fun dfs( + preorder: IntArray, + inorderMap: Map, + i: Int, + l: Int, + r: Int +): TreeNode? { + // Завершить при пустом диапазоне поддерева + if (r - l < 0) return null + // Инициализировать корневой узел + val root = TreeNode(preorder[i]) + // Найти m, чтобы разделить левое и правое поддеревья + val m = inorderMap[preorder[i]]!! + // Подзадача: построить левое поддерево + root.left = dfs(preorder, inorderMap, i + 1, l, m - 1) + // Подзадача: построить правое поддерево + root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r) + // Вернуть корневой узел + return root +} + +/* Построить двоичное дерево */ +fun buildTree(preorder: IntArray, inorder: IntArray): TreeNode? { + // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам + val inorderMap = HashMap() + for (i in inorder.indices) { + inorderMap[inorder[i]] = i + } + val root = dfs(preorder, inorderMap, 0, 0, inorder.size - 1) + return root +} + +/* Driver Code */ +fun main() { + val preorder = intArrayOf(3, 9, 2, 1, 7) + val inorder = intArrayOf(9, 3, 1, 2, 7) + println("Предварительный обход = ${preorder.contentToString()}") + println("Симметричный обход = ${inorder.contentToString()}") + + val root = buildTree(preorder, inorder) + println("Построенное двоичное дерево:") + printTree(root) +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_divide_and_conquer/hanota.kt b/ru/codes/kotlin/chapter_divide_and_conquer/hanota.kt new file mode 100644 index 000000000..dd1fdcc05 --- /dev/null +++ b/ru/codes/kotlin/chapter_divide_and_conquer/hanota.kt @@ -0,0 +1,56 @@ +/** + * File: hanota.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_divide_and_conquer.hanota + +/* Переместить один диск */ +fun move(src: MutableList, tar: MutableList) { + // Снять диск с вершины src + val pan = src.removeAt(src.size - 1) + // Положить диск на вершину tar + tar.add(pan) +} + +/* Решить задачу Ханойской башни f(i) */ +fun dfs(i: Int, src: MutableList, buf: MutableList, tar: MutableList) { + // Если в src остался только один диск, сразу переместить его в tar + if (i == 1) { + move(src, tar) + return + } + // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar + dfs(i - 1, src, tar, buf) + // Подзадача f(1): переместить оставшийся один диск из src в tar + move(src, tar) + // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src + dfs(i - 1, buf, src, tar) +} + +/* Решить задачу Ханойской башни */ +fun solveHanota(A: MutableList, B: MutableList, C: MutableList) { + val n = A.size + // Переместить верхние n дисков из A в C с помощью B + dfs(n, A, B, C) +} + +/* Driver Code */ +fun main() { + // Хвост списка соответствует вершине столбца + val A = mutableListOf(5, 4, 3, 2, 1) + val B = mutableListOf() + val C = mutableListOf() + println("Исходное состояние:") + println("A = $A") + println("B = $B") + println("C = $C") + + solveHanota(A, B, C) + + println("После завершения перемещения дисков:") + println("A = $A") + println("B = $B") + println("C = $C") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_backtrack.kt b/ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_backtrack.kt new file mode 100644 index 000000000..e124e20c3 --- /dev/null +++ b/ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_backtrack.kt @@ -0,0 +1,45 @@ +/** + * File: climbing_stairs_backtrack.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_dynamic_programming + +/* Бэктрекинг */ +fun backtrack( + choices: MutableList, + state: Int, + n: Int, + res: MutableList +) { + // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1 + if (state == n) + res[0] = res[0] + 1 + // Перебор всех вариантов выбора + for (choice in choices) { + // Отсечение: нельзя выходить за n-ю ступень + if (state + choice > n) continue + // Попытка: сделать выбор и обновить состояние + backtrack(choices, state + choice, n, res) + // Откат + } +} + +/* Подъем по лестнице: бэктрекинг */ +fun climbingStairsBacktrack(n: Int): Int { + val choices = mutableListOf(1, 2) // Можно подняться на 1 или 2 ступени + val state = 0 // Начать подъем с 0-й ступени + val res = mutableListOf() + res.add(0) // Использовать res[0] для хранения числа решений + backtrack(choices, state, n, res) + return res[0] +} + +/* Driver Code */ +fun main() { + val n = 9 + + val res = climbingStairsBacktrack(n) + println("Количество способов подняться по лестнице из $n ступеней = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_constraint_dp.kt b/ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_constraint_dp.kt new file mode 100644 index 000000000..4892c0e0a --- /dev/null +++ b/ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_constraint_dp.kt @@ -0,0 +1,35 @@ +/** + * File: climbing_stairs_constraint_dp.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_dynamic_programming + +/* Подъем по лестнице с ограничениями: динамическое программирование */ +fun climbingStairsConstraintDP(n: Int): Int { + if (n == 1 || n == 2) { + return 1 + } + // Инициализация таблицы dp для хранения решений подзадач + val dp = Array(n + 1) { IntArray(3) } + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1][1] = 1 + dp[1][2] = 0 + dp[2][1] = 0 + dp[2][2] = 1 + // Переход состояний: постепенное решение больших подзадач через меньшие + for (i in 3..n) { + dp[i][1] = dp[i - 1][2] + dp[i][2] = dp[i - 2][1] + dp[i - 2][2] + } + return dp[n][1] + dp[n][2] +} + +/* Driver Code */ +fun main() { + val n = 9 + + val res = climbingStairsConstraintDP(n) + println("Количество способов подняться по лестнице из $n ступеней = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_dfs.kt b/ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_dfs.kt new file mode 100644 index 000000000..53805209d --- /dev/null +++ b/ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_dfs.kt @@ -0,0 +1,29 @@ +/** + * File: climbing_stairs_dfs.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_dynamic_programming + +/* Поиск */ +fun dfs(i: Int): Int { + // dp[1] и dp[2] уже известны, вернуть их + if (i == 1 || i == 2) return i + // dp[i] = dp[i-1] + dp[i-2] + val count = dfs(i - 1) + dfs(i - 2) + return count +} + +/* Подъем по лестнице: поиск */ +fun climbingStairsDFS(n: Int): Int { + return dfs(n) +} + +/* Driver Code */ +fun main() { + val n = 9 + + val res = climbingStairsDFS(n) + println("Количество способов подняться по лестнице из $n ступеней = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_dfs_mem.kt b/ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_dfs_mem.kt new file mode 100644 index 000000000..91895b683 --- /dev/null +++ b/ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_dfs_mem.kt @@ -0,0 +1,36 @@ +/** + * File: climbing_stairs_dfs_mem.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_dynamic_programming + +/* Поиск с мемоизацией */ +fun dfs(i: Int, mem: IntArray): Int { + // dp[1] и dp[2] уже известны, вернуть их + if (i == 1 || i == 2) return i + // Если запись dp[i] существует, сразу вернуть ее + if (mem[i] != -1) return mem[i] + // dp[i] = dp[i-1] + dp[i-2] + val count = dfs(i - 1, mem) + dfs(i - 2, mem) + // Сохранить dp[i] + mem[i] = count + return count +} + +/* Подъем по лестнице: поиск с мемоизацией */ +fun climbingStairsDFSMem(n: Int): Int { + // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи + val mem = IntArray(n + 1) + mem.fill(-1) + return dfs(n, mem) +} + +/* Driver Code */ +fun main() { + val n = 9 + + val res = climbingStairsDFSMem(n) + println("Количество способов подняться по лестнице из $n ступеней = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_dp.kt b/ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_dp.kt new file mode 100644 index 000000000..a2587b975 --- /dev/null +++ b/ru/codes/kotlin/chapter_dynamic_programming/climbing_stairs_dp.kt @@ -0,0 +1,46 @@ +/** + * File: climbing_stairs_dp.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_dynamic_programming + +/* Подъем по лестнице: динамическое программирование */ +fun climbingStairsDP(n: Int): Int { + if (n == 1 || n == 2) return n + // Инициализация таблицы dp для хранения решений подзадач + val dp = IntArray(n + 1) + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = 1 + dp[2] = 2 + // Переход состояний: постепенное решение больших подзадач через меньшие + for (i in 3..n) { + dp[i] = dp[i - 1] + dp[i - 2] + } + return dp[n] +} + +/* Подъем по лестнице: динамическое программирование с оптимизацией памяти */ +fun climbingStairsDPComp(n: Int): Int { + if (n == 1 || n == 2) return n + var a = 1 + var b = 2 + for (i in 3..n) { + val temp = b + b += a + a = temp + } + return b +} + +/* Driver Code */ +fun main() { + val n = 9 + + var res = climbingStairsDP(n) + println("Количество способов подняться по лестнице из $n ступеней = $res") + + res = climbingStairsDPComp(n) + println("Количество способов подняться по лестнице из $n ступеней = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_dynamic_programming/coin_change.kt b/ru/codes/kotlin/chapter_dynamic_programming/coin_change.kt new file mode 100644 index 000000000..c192027fa --- /dev/null +++ b/ru/codes/kotlin/chapter_dynamic_programming/coin_change.kt @@ -0,0 +1,71 @@ +/** + * File: coin_change.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_dynamic_programming + +import kotlin.math.min + +/* Размен монет: динамическое программирование */ +fun coinChangeDP(coins: IntArray, amt: Int): Int { + val n = coins.size + val MAX = amt + 1 + // Инициализация таблицы dp + val dp = Array(n + 1) { IntArray(amt + 1) } + // Переход состояний: первая строка и первый столбец + for (a in 1..amt) { + dp[0][a] = MAX + } + // Переход состояний: остальные строки и столбцы + for (i in 1..n) { + for (a in 1..amt) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a] + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1) + } + } + } + return if (dp[n][amt] != MAX) dp[n][amt] else -1 +} + +/* Размен монет: динамическое программирование с оптимизацией памяти */ +fun coinChangeDPComp(coins: IntArray, amt: Int): Int { + val n = coins.size + val MAX = amt + 1 + // Инициализация таблицы dp + val dp = IntArray(amt + 1) + dp.fill(MAX) + dp[0] = 0 + // Переход состояний + for (i in 1..n) { + for (a in 1..amt) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a] + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1) + } + } + } + return if (dp[amt] != MAX) dp[amt] else -1 +} + +/* Driver Code */ +fun main() { + val coins = intArrayOf(1, 2, 5) + val amt = 4 + + // Динамическое программирование + var res = coinChangeDP(coins, amt) + println("Минимальное число монет для набора целевой суммы = $res") + + // Динамическое программирование с оптимизацией памяти + res = coinChangeDPComp(coins, amt) + println("Минимальное число монет для набора целевой суммы = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_dynamic_programming/coin_change_ii.kt b/ru/codes/kotlin/chapter_dynamic_programming/coin_change_ii.kt new file mode 100644 index 000000000..010381607 --- /dev/null +++ b/ru/codes/kotlin/chapter_dynamic_programming/coin_change_ii.kt @@ -0,0 +1,66 @@ +/** + * File: coin_change_ii.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_dynamic_programming + +/* Размен монет II: динамическое программирование */ +fun coinChangeIIDP(coins: IntArray, amt: Int): Int { + val n = coins.size + // Инициализация таблицы dp + val dp = Array(n + 1) { IntArray(amt + 1) } + // Инициализация первого столбца + for (i in 0..n) { + dp[i][0] = 1 + } + // Переход состояний + for (i in 1..n) { + for (a in 1..amt) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a] + } else { + // Сумма двух решений: не брать или взять монету i + dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]] + } + } + } + return dp[n][amt] +} + +/* Размен монет II: динамическое программирование с оптимизацией памяти */ +fun coinChangeIIDPComp(coins: IntArray, amt: Int): Int { + val n = coins.size + // Инициализация таблицы dp + val dp = IntArray(amt + 1) + dp[0] = 1 + // Переход состояний + for (i in 1..n) { + for (a in 1..amt) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a] + } else { + // Сумма двух решений: не брать или взять монету i + dp[a] = dp[a] + dp[a - coins[i - 1]] + } + } + } + return dp[amt] +} + +/* Driver Code */ +fun main() { + val coins = intArrayOf(1, 2, 5) + val amt = 5 + + // Динамическое программирование + var res = coinChangeIIDP(coins, amt) + println("Количество комбинаций монет для набора целевой суммы = $res") + + // Динамическое программирование с оптимизацией памяти + res = coinChangeIIDPComp(coins, amt) + println("Количество комбинаций монет для набора целевой суммы = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_dynamic_programming/edit_distance.kt b/ru/codes/kotlin/chapter_dynamic_programming/edit_distance.kt new file mode 100644 index 000000000..3f3752f54 --- /dev/null +++ b/ru/codes/kotlin/chapter_dynamic_programming/edit_distance.kt @@ -0,0 +1,143 @@ +/** + * File: edit_distance.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_dynamic_programming + +import kotlin.math.min + +/* Редакционное расстояние: полный перебор */ +fun editDistanceDFS( + s: String, + t: String, + i: Int, + j: Int +): Int { + // Если s и t пусты, вернуть 0 + if (i == 0 && j == 0) return 0 + // Если s пусто, вернуть длину t + if (i == 0) return j + // Если t пусто, вернуть длину s + if (j == 0) return i + // Если два символа равны, сразу пропустить их + if (s[i - 1] == t[j - 1]) return editDistanceDFS(s, t, i - 1, j - 1) + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + val insert = editDistanceDFS(s, t, i, j - 1) + val delete = editDistanceDFS(s, t, i - 1, j) + val replace = editDistanceDFS(s, t, i - 1, j - 1) + // Вернуть минимальное число шагов редактирования + return min(min(insert, delete), replace) + 1 +} + +/* Редакционное расстояние: поиск с мемоизацией */ +fun editDistanceDFSMem( + s: String, + t: String, + mem: Array, + i: Int, + j: Int +): Int { + // Если s и t пусты, вернуть 0 + if (i == 0 && j == 0) return 0 + // Если s пусто, вернуть длину t + if (i == 0) return j + // Если t пусто, вернуть длину s + if (j == 0) return i + // Если запись уже есть, сразу вернуть ее + if (mem[i][j] != -1) return mem[i][j] + // Если два символа равны, сразу пропустить их + if (s[i - 1] == t[j - 1]) return editDistanceDFSMem(s, t, mem, i - 1, j - 1) + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + val insert = editDistanceDFSMem(s, t, mem, i, j - 1) + val delete = editDistanceDFSMem(s, t, mem, i - 1, j) + val replace = editDistanceDFSMem(s, t, mem, i - 1, j - 1) + // Сохранить и вернуть минимальное число шагов редактирования + mem[i][j] = min(min(insert, delete), replace) + 1 + return mem[i][j] +} + +/* Редакционное расстояние: динамическое программирование */ +fun editDistanceDP(s: String, t: String): Int { + val n = s.length + val m = t.length + val dp = Array(n + 1) { IntArray(m + 1) } + // Переход состояний: первая строка и первый столбец + for (i in 1..n) { + dp[i][0] = i + } + for (j in 1..m) { + dp[0][j] = j + } + // Переход состояний: остальные строки и столбцы + for (i in 1..n) { + for (j in 1..m) { + if (s[i - 1] == t[j - 1]) { + // Если два символа равны, сразу пропустить их + dp[i][j] = dp[i - 1][j - 1] + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1 + } + } + } + return dp[n][m] +} + +/* Редакционное расстояние: динамическое программирование с оптимизацией памяти */ +fun editDistanceDPComp(s: String, t: String): Int { + val n = s.length + val m = t.length + val dp = IntArray(m + 1) + // Переход состояний: первая строка + for (j in 1..m) { + dp[j] = j + } + // Переход состояний: остальные строки + for (i in 1..n) { + // Переход состояний: первый столбец + var leftup = dp[0] // Временно сохранить dp[i-1, j-1] + dp[0] = i + // Переход состояний: остальные столбцы + for (j in 1..m) { + val temp = dp[j] + if (s[i - 1] == t[j - 1]) { + // Если два символа равны, сразу пропустить их + dp[j] = leftup + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1 + } + leftup = temp // Обновить до значения dp[i-1, j-1] для следующей итерации + } + } + return dp[m] +} + +/* Driver Code */ +fun main() { + val s = "bag" + val t = "pack" + val n = s.length + val m = t.length + + // Полный перебор + var res = editDistanceDFS(s, t, n, m) + println("Чтобы преобразовать $s в $t, нужно минимум $res шагов") + + // Поиск с мемоизацией + val mem = Array(n + 1) { IntArray(m + 1) } + for (row in mem) + row.fill(-1) + res = editDistanceDFSMem(s, t, mem, n, m) + println("Чтобы преобразовать $s в $t, нужно минимум $res шагов") + + // Динамическое программирование + res = editDistanceDP(s, t) + println("Чтобы преобразовать $s в $t, нужно минимум $res шагов") + + // Динамическое программирование с оптимизацией памяти + res = editDistanceDPComp(s, t) + println("Чтобы преобразовать $s в $t, нужно минимум $res шагов") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_dynamic_programming/knapsack.kt b/ru/codes/kotlin/chapter_dynamic_programming/knapsack.kt new file mode 100644 index 000000000..0ac960621 --- /dev/null +++ b/ru/codes/kotlin/chapter_dynamic_programming/knapsack.kt @@ -0,0 +1,125 @@ +/** + * File: knapsack.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_dynamic_programming + +import kotlin.math.max + +/* Рюкзак 0-1: полный перебор */ +fun knapsackDFS( + wgt: IntArray, + _val: IntArray, + i: Int, + c: Int +): Int { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i == 0 || c == 0) { + return 0 + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (wgt[i - 1] > c) { + return knapsackDFS(wgt, _val, i - 1, c) + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + val no = knapsackDFS(wgt, _val, i - 1, c) + val yes = knapsackDFS(wgt, _val, i - 1, c - wgt[i - 1]) + _val[i - 1] + // Вернуть вариант с большей стоимостью из двух возможных + return max(no, yes) +} + +/* Рюкзак 0-1: поиск с мемоизацией */ +fun knapsackDFSMem( + wgt: IntArray, + _val: IntArray, + mem: Array, + i: Int, + c: Int +): Int { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i == 0 || c == 0) { + return 0 + } + // Если запись уже есть, вернуть сразу + if (mem[i][c] != -1) { + return mem[i][c] + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (wgt[i - 1] > c) { + return knapsackDFSMem(wgt, _val, mem, i - 1, c) + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + val no = knapsackDFSMem(wgt, _val, mem, i - 1, c) + val yes = knapsackDFSMem(wgt, _val, mem, i - 1, c - wgt[i - 1]) + _val[i - 1] + // Сохранить и вернуть вариант с большей стоимостью из двух решений + mem[i][c] = max(no, yes) + return mem[i][c] +} + +/* Рюкзак 0-1: динамическое программирование */ +fun knapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int { + val n = wgt.size + // Инициализация таблицы dp + val dp = Array(n + 1) { IntArray(cap + 1) } + // Переход состояний + for (i in 1..n) { + for (c in 1..cap) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c] + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + _val[i - 1]) + } + } + } + return dp[n][cap] +} + +/* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */ +fun knapsackDPComp(wgt: IntArray, _val: IntArray, cap: Int): Int { + val n = wgt.size + // Инициализация таблицы dp + val dp = IntArray(cap + 1) + // Переход состояний + for (i in 1..n) { + // Обход в обратном порядке + for (c in cap downTo 1) { + if (wgt[i - 1] <= c) { + // Большее из двух решений: не брать или взять предмет i + dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1]) + } + } + } + return dp[cap] +} + +/* Driver Code */ +fun main() { + val wgt = intArrayOf(10, 20, 30, 40, 50) + val _val = intArrayOf(50, 120, 150, 210, 240) + val cap = 50 + val n = wgt.size + + // Полный перебор + var res = knapsackDFS(wgt, _val, n, cap) + println("Максимальная стоимость предметов без превышения вместимости рюкзака = $res") + + // Поиск с мемоизацией + val mem = Array(n + 1) { IntArray(cap + 1) } + for (row in mem) { + row.fill(-1) + } + res = knapsackDFSMem(wgt, _val, mem, n, cap) + println("Максимальная стоимость предметов без превышения вместимости рюкзака = $res") + + // Динамическое программирование + res = knapsackDP(wgt, _val, cap) + println("Максимальная стоимость предметов без превышения вместимости рюкзака = $res") + + // Динамическое программирование с оптимизацией памяти + res = knapsackDPComp(wgt, _val, cap) + println("Максимальная стоимость предметов без превышения вместимости рюкзака = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_dynamic_programming/min_cost_climbing_stairs_dp.kt b/ru/codes/kotlin/chapter_dynamic_programming/min_cost_climbing_stairs_dp.kt new file mode 100644 index 000000000..11f039e9e --- /dev/null +++ b/ru/codes/kotlin/chapter_dynamic_programming/min_cost_climbing_stairs_dp.kt @@ -0,0 +1,51 @@ +/** + * File: min_cost_climbing_stairs_dp.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_dynamic_programming + +import kotlin.math.min + +/* Минимальная стоимость подъема по лестнице: динамическое программирование */ +fun minCostClimbingStairsDP(cost: IntArray): Int { + val n = cost.size - 1 + if (n == 1 || n == 2) return cost[n] + // Инициализация таблицы dp для хранения решений подзадач + val dp = IntArray(n + 1) + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = cost[1] + dp[2] = cost[2] + // Переход состояний: постепенное решение больших подзадач через меньшие + for (i in 3..n) { + dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i] + } + return dp[n] +} + +/* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */ +fun minCostClimbingStairsDPComp(cost: IntArray): Int { + val n = cost.size - 1 + if (n == 1 || n == 2) return cost[n] + var a = cost[1] + var b = cost[2] + for (i in 3..n) { + val tmp = b + b = min(a, tmp) + cost[i] + a = tmp + } + return b +} + +/* Driver Code */ +fun main() { + val cost = intArrayOf(0, 1, 10, 1, 1, 1, 10, 1, 1, 10, 1) + println("Список стоимостей ступеней = ${cost.contentToString()}") + + var res = minCostClimbingStairsDP(cost) + println("Минимальная стоимость подъема по лестнице = $res") + + res = minCostClimbingStairsDPComp(cost) + println("Минимальная стоимость подъема по лестнице = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_dynamic_programming/min_path_sum.kt b/ru/codes/kotlin/chapter_dynamic_programming/min_path_sum.kt new file mode 100644 index 000000000..2e512f115 --- /dev/null +++ b/ru/codes/kotlin/chapter_dynamic_programming/min_path_sum.kt @@ -0,0 +1,132 @@ +/** + * File: min_path_sum.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_dynamic_programming + +import kotlin.math.min + +/* Минимальная сумма пути: полный перебор */ +fun minPathSumDFS(grid: Array, i: Int, j: Int): Int { + // Если это верхняя левая ячейка, завершить поиск + if (i == 0 && j == 0) { + return grid[0][0] + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 || j < 0) { + return Int.MAX_VALUE + } + // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1) + val up = minPathSumDFS(grid, i - 1, j) + val left = minPathSumDFS(grid, i, j - 1) + // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + return min(left, up) + grid[i][j] +} + +/* Минимальная сумма пути: поиск с мемоизацией */ +fun minPathSumDFSMem( + grid: Array, + mem: Array, + i: Int, + j: Int +): Int { + // Если это верхняя левая ячейка, завершить поиск + if (i == 0 && j == 0) { + return grid[0][0] + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 || j < 0) { + return Int.MAX_VALUE + } + // Если запись уже есть, вернуть сразу + if (mem[i][j] != -1) { + return mem[i][j] + } + // Минимальная стоимость пути для левой и верхней ячеек + val up = minPathSumDFSMem(grid, mem, i - 1, j) + val left = minPathSumDFSMem(grid, mem, i, j - 1) + // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + mem[i][j] = min(left, up) + grid[i][j] + return mem[i][j] +} + +/* Минимальная сумма пути: динамическое программирование */ +fun minPathSumDP(grid: Array): Int { + val n = grid.size + val m = grid[0].size + // Инициализация таблицы dp + val dp = Array(n) { IntArray(m) } + dp[0][0] = grid[0][0] + // Переход состояний: первая строка + for (j in 1..): Int { + val n = grid.size + val m = grid[0].size + // Инициализация таблицы dp + val dp = IntArray(m) + // Переход состояний: первая строка + dp[0] = grid[0][0] + for (j in 1.. c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c] + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + _val[i - 1]) + } + } + } + return dp[n][cap] +} + +/* Полный рюкзак: динамическое программирование с оптимизацией памяти */ +fun unboundedKnapsackDPComp( + wgt: IntArray, + _val: IntArray, + cap: Int +): Int { + val n = wgt.size + // Инициализация таблицы dp + val dp = IntArray(cap + 1) + // Переход состояний + for (i in 1..n) { + for (c in 1..cap) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c] + } else { + // Большее из двух решений: не брать или взять предмет i + dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1]) + } + } + } + return dp[cap] +} + +/* Driver Code */ +fun main() { + val wgt = intArrayOf(1, 2, 3) + val _val = intArrayOf(5, 11, 15) + val cap = 4 + + // Динамическое программирование + var res = unboundedKnapsackDP(wgt, _val, cap) + println("Максимальная стоимость предметов без превышения вместимости рюкзака = $res") + + // Динамическое программирование с оптимизацией памяти + res = unboundedKnapsackDPComp(wgt, _val, cap) + println("Максимальная стоимость предметов без превышения вместимости рюкзака = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_graph/graph_adjacency_list.kt b/ru/codes/kotlin/chapter_graph/graph_adjacency_list.kt new file mode 100644 index 000000000..5276b4936 --- /dev/null +++ b/ru/codes/kotlin/chapter_graph/graph_adjacency_list.kt @@ -0,0 +1,121 @@ +/** + * File: graph_adjacency_list.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_graph + +import utils.Vertex + +/* Класс неориентированного графа на основе списка смежности */ +class GraphAdjList(edges: Array>) { + // Список смежности, где key — вершина, а value — все смежные ей вершины + val adjList = HashMap>() + + /* Конструктор */ + init { + // Добавить все вершины и ребра + for (edge in edges) { + addVertex(edge[0]!!) + addVertex(edge[1]!!) + addEdge(edge[0]!!, edge[1]!!) + } + } + + /* Получить число вершин */ + fun size(): Int { + return adjList.size + } + + /* Добавление ребра */ + fun addEdge(vet1: Vertex, vet2: Vertex) { + if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2) + throw IllegalArgumentException() + // Добавить ребро vet1 - vet2 + adjList[vet1]?.add(vet2) + adjList[vet2]?.add(vet1) + } + + /* Удаление ребра */ + fun removeEdge(vet1: Vertex, vet2: Vertex) { + if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2) + throw IllegalArgumentException() + // Удалить ребро vet1 - vet2 + adjList[vet1]?.remove(vet2) + adjList[vet2]?.remove(vet1) + } + + /* Добавление вершины */ + fun addVertex(vet: Vertex) { + if (adjList.containsKey(vet)) + return + // Добавить новый список в список смежности + adjList[vet] = mutableListOf() + } + + /* Удаление вершины */ + fun removeVertex(vet: Vertex) { + if (!adjList.containsKey(vet)) + throw IllegalArgumentException() + // Удалить из списка смежности список, соответствующий вершине vet + adjList.remove(vet) + // Обойти списки других вершин и удалить все ребра, содержащие vet + for (list in adjList.values) { + list.remove(vet) + } + } + + /* Вывести список смежности */ + fun print() { + println("Список смежности =") + for (pair in adjList.entries) { + val tmp = mutableListOf() + for (vertex in pair.value) { + tmp.add(vertex._val) + } + println("${pair.key._val}: $tmp,") + } + } +} + +/* Driver Code */ +fun main() { + /* Инициализация неориентированного графа */ + val v = Vertex.valsToVets(intArrayOf(1, 3, 2, 5, 4)) + val edges = arrayOf( + arrayOf(v[0], v[1]), + arrayOf(v[0], v[3]), + arrayOf(v[1], v[2]), + arrayOf(v[2], v[3]), + arrayOf(v[2], v[4]), + arrayOf(v[3], v[4]) + ) + val graph = GraphAdjList(edges) + println("\nГраф после инициализации") + graph.print() + + /* Добавление ребра */ + // Вершины 1 и 2 соответствуют v[0] и v[2] + graph.addEdge(v[0]!!, v[2]!!) + println("\nГраф после добавления ребра 1-2") + graph.print() + + /* Удаление ребра */ + // Вершины 1 и 3 соответствуют v[0] и v[1] + graph.removeEdge(v[0]!!, v[1]!!) + println("\nГраф после удаления ребра 1-3") + graph.print() + + /* Добавление вершины */ + val v5 = Vertex(6) + graph.addVertex(v5) + println("\nГраф после добавления вершины 6") + graph.print() + + /* Удаление вершины */ + // Вершина 3 соответствует v[1] + graph.removeVertex(v[1]!!) + println("\nГраф после удаления вершины 3") + graph.print() +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_graph/graph_adjacency_matrix.kt b/ru/codes/kotlin/chapter_graph/graph_adjacency_matrix.kt new file mode 100644 index 000000000..80df8b20c --- /dev/null +++ b/ru/codes/kotlin/chapter_graph/graph_adjacency_matrix.kt @@ -0,0 +1,134 @@ +/** + * File: graph_adjacency_matrix.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_graph + +import utils.printMatrix + +/* Класс неориентированного графа на основе матрицы смежности */ +class GraphAdjMat(vertices: IntArray, edges: Array) { + val vertices = mutableListOf() // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин» + val adjMat = mutableListOf>() // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин» + + /* Конструктор */ + init { + // Добавление вершины + for (vertex in vertices) { + addVertex(vertex) + } + // Добавить ребра + // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices + for (edge in edges) { + addEdge(edge[0], edge[1]) + } + } + + /* Получить число вершин */ + fun size(): Int { + return vertices.size + } + + /* Добавление вершины */ + fun addVertex(_val: Int) { + val n = size() + // Добавить значение новой вершины в список вершин + vertices.add(_val) + // Добавить строку в матрицу смежности + val newRow = mutableListOf() + for (j in 0..= size()) + throw IndexOutOfBoundsException() + // Удалить вершину с индексом index из списка вершин + vertices.removeAt(index) + // Удалить строку с индексом index из матрицы смежности + adjMat.removeAt(index) + // Удалить столбец с индексом index из матрицы смежности + for (row in adjMat) { + row.removeAt(index) + } + } + + /* Добавление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + fun addEdge(i: Int, j: Int) { + // Обработка выхода индекса за границы и случая равенства + if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) + throw IndexOutOfBoundsException() + // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i) + adjMat[i][j] = 1 + adjMat[j][i] = 1 + } + + /* Удаление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + fun removeEdge(i: Int, j: Int) { + // Обработка выхода индекса за границы и случая равенства + if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) + throw IndexOutOfBoundsException() + adjMat[i][j] = 0 + adjMat[j][i] = 0 + } + + /* Вывести матрицу смежности */ + fun print() { + print("Список вершин = ") + println(vertices) + println("Матрица смежности =") + printMatrix(adjMat) + } +} + +/* Driver Code */ +fun main() { + /* Инициализация неориентированного графа */ + // Обратите внимание: элементы edges представляют индексы вершин, то есть соответствуют индексам элементов vertices + val vertices = intArrayOf(1, 3, 2, 5, 4) + val edges = arrayOf( + intArrayOf(0, 1), + intArrayOf(0, 3), + intArrayOf(1, 2), + intArrayOf(2, 3), + intArrayOf(2, 4), + intArrayOf(3, 4) + ) + val graph = GraphAdjMat(vertices, edges) + println("\nГраф после инициализации") + graph.print() + + /* Добавление ребра */ + // Индексы вершин 1 и 2 равны 0 и 2 соответственно + graph.addEdge(0, 2) + println("\nГраф после добавления ребра 1-2") + graph.print() + + /* Удаление ребра */ + // Индексы вершин 1 и 3 равны 0 и 1 соответственно + graph.removeEdge(0, 1) + println("\nГраф после удаления ребра 1-3") + graph.print() + + /* Добавление вершины */ + graph.addVertex(6) + println("\nГраф после добавления вершины 6") + graph.print() + + /* Удаление вершины */ + // Индекс вершины 3 равен 1 + graph.removeVertex(1) + println("\nГраф после удаления вершины 3") + graph.print() +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_graph/graph_bfs.kt b/ru/codes/kotlin/chapter_graph/graph_bfs.kt new file mode 100644 index 000000000..29cd1f1ef --- /dev/null +++ b/ru/codes/kotlin/chapter_graph/graph_bfs.kt @@ -0,0 +1,65 @@ +/** + * File: graph_bfs.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_graph + +import utils.Vertex +import java.util.* + +/* Обход в ширину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +fun graphBFS(graph: GraphAdjList, startVet: Vertex): MutableList { + // Последовательность обхода вершин + val res = mutableListOf() + // Хеш-множество для хранения уже посещенных вершин + val visited = HashSet() + visited.add(startVet) + // Очередь используется для реализации BFS + val que = LinkedList() + que.offer(startVet) + // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины + while (!que.isEmpty()) { + val vet = que.poll() // Извлечь головную вершину из очереди + res.add(vet) // Отметить посещенную вершину + // Обойти все смежные вершины данной вершины + for (adjVet in graph.adjList[vet]!!) { + if (visited.contains(adjVet)) + continue // Пропустить уже посещенную вершину + que.offer(adjVet) // Помещать в очередь только непосещенные вершины + visited.add(adjVet) // Отметить эту вершину как посещенную + } + } + // Вернуть последовательность обхода вершин + return res +} + +/* Driver Code */ +fun main() { + /* Инициализация неориентированного графа */ + val v = Vertex.valsToVets(intArrayOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)) + val edges = arrayOf( + arrayOf(v[0], v[1]), + arrayOf(v[0], v[3]), + arrayOf(v[1], v[2]), + arrayOf(v[1], v[4]), + arrayOf(v[2], v[5]), + arrayOf(v[3], v[4]), + arrayOf(v[3], v[6]), + arrayOf(v[4], v[5]), + arrayOf(v[4], v[7]), + arrayOf(v[5], v[8]), + arrayOf(v[6], v[7]), + arrayOf(v[7], v[8]) + ) + val graph = GraphAdjList(edges) + println("\nГраф после инициализации") + graph.print() + + /* Обход в ширину */ + val res = graphBFS(graph, v[0]!!) + println("\nПоследовательность вершин при обходе в ширину (BFS)") + println(Vertex.vetsToVals(res)) +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_graph/graph_dfs.kt b/ru/codes/kotlin/chapter_graph/graph_dfs.kt new file mode 100644 index 000000000..9010cbef0 --- /dev/null +++ b/ru/codes/kotlin/chapter_graph/graph_dfs.kt @@ -0,0 +1,60 @@ +/** + * File: graph_dfs.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_graph + +import utils.Vertex + +/* Вспомогательная функция обхода в глубину */ +fun dfs( + graph: GraphAdjList, + visited: MutableSet, + res: MutableList, + vet: Vertex? +) { + res.add(vet) // Отметить посещенную вершину + visited.add(vet) // Отметить эту вершину как посещенную + // Обойти все смежные вершины данной вершины + for (adjVet in graph.adjList[vet]!!) { + if (visited.contains(adjVet)) + continue // Пропустить уже посещенную вершину + // Рекурсивно обходить смежные вершины + dfs(graph, visited, res, adjVet) + } +} + +/* Обход в глубину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +fun graphDFS(graph: GraphAdjList, startVet: Vertex?): MutableList { + // Последовательность обхода вершин + val res = mutableListOf() + // Хеш-множество для хранения уже посещенных вершин + val visited = HashSet() + dfs(graph, visited, res, startVet) + return res +} + +/* Driver Code */ +fun main() { + /* Инициализация неориентированного графа */ + val v = Vertex.valsToVets(intArrayOf(0, 1, 2, 3, 4, 5, 6)) + val edges = arrayOf( + arrayOf(v[0], v[1]), + arrayOf(v[0], v[3]), + arrayOf(v[1], v[2]), + arrayOf(v[2], v[5]), + arrayOf(v[4], v[5]), + arrayOf(v[5], v[6]) + ) + val graph = GraphAdjList(edges) + println("\nГраф после инициализации") + graph.print() + + /* Обход в глубину */ + val res = graphDFS(graph, v[0]) + println("\nПоследовательность вершин при обходе в глубину (DFS)") + println(Vertex.vetsToVals(res)) +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_greedy/coin_change_greedy.kt b/ru/codes/kotlin/chapter_greedy/coin_change_greedy.kt new file mode 100644 index 000000000..b8bd4cd8c --- /dev/null +++ b/ru/codes/kotlin/chapter_greedy/coin_change_greedy.kt @@ -0,0 +1,53 @@ +/** + * File: coin_change_greedy.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_greedy + +/* Размен монет: жадный алгоритм */ +fun coinChangeGreedy(coins: IntArray, amt: Int): Int { + // Предположить, что список coins упорядочен + var am = amt + var i = coins.size - 1 + var count = 0 + // Циклически выполнять жадный выбор, пока не останется суммы + while (am > 0) { + // Найти монету, которая меньше остатка суммы и наиболее к нему близка + while (i > 0 && coins[i] > am) { + i-- + } + // Выбрать coins[i] + am -= coins[i] + count++ + } + // Если допустимое решение не найдено, вернуть -1 + return if (am == 0) count else -1 +} + +/* Driver Code */ +fun main() { + // Жадный подход: гарантирует нахождение глобально оптимального решения + var coins = intArrayOf(1, 5, 10, 20, 50, 100) + var amt = 186 + var res = coinChangeGreedy(coins, amt) + println("\ncoins = ${coins.contentToString()}, amt = $amt") + println("Минимальное число монет для набора суммы $amt = $res") + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = intArrayOf(1, 20, 50) + amt = 60 + res = coinChangeGreedy(coins, amt) + println("\ncoins = ${coins.contentToString()}, amt = $amt") + println("Минимальное число монет для набора суммы $amt = $res") + println("На самом деле минимум равен 3: 20 + 20 + 20") + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = intArrayOf(1, 49, 50) + amt = 98 + res = coinChangeGreedy(coins, amt) + println("\ncoins = ${coins.contentToString()}, amt = $amt") + println("Минимальное число монет для набора суммы $amt = $res") + println("На самом деле минимум равен 2: 49 + 49") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_greedy/fractional_knapsack.kt b/ru/codes/kotlin/chapter_greedy/fractional_knapsack.kt new file mode 100644 index 000000000..392a5d6f3 --- /dev/null +++ b/ru/codes/kotlin/chapter_greedy/fractional_knapsack.kt @@ -0,0 +1,51 @@ +/** + * File: fractional_knapsack.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_greedy + +/* Предмет */ +class Item( + val w: Int, // Предмет + val v: Int // Стоимость предмета +) + +/* Дробный рюкзак: жадный алгоритм */ +fun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double { + // Создать список предметов с двумя свойствами: вес и стоимость + var cap = c + val items = arrayOfNulls(wgt.size) + for (i in wgt.indices) { + items[i] = Item(wgt[i], _val[i]) + } + // Отсортировать по удельной стоимости item.v / item.w в порядке убывания + items.sortBy { item: Item? -> -(item!!.v.toDouble() / item.w) } + // Циклический жадный выбор + var res = 0.0 + for (item in items) { + if (item!!.w <= cap) { + // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком + res += item.v + cap -= item.w + } else { + // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета + res += item.v.toDouble() / item.w * cap + // Свободной вместимости больше не осталось, поэтому выйти из цикла + break + } + } + return res +} + +/* Driver Code */ +fun main() { + val wgt = intArrayOf(10, 20, 30, 40, 50) + val _val = intArrayOf(50, 120, 150, 210, 240) + val cap = 50 + + // Жадный алгоритм + val res = fractionalKnapsack(wgt, _val, cap) + println("Максимальная стоимость предметов без превышения вместимости рюкзака = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_greedy/max_capacity.kt b/ru/codes/kotlin/chapter_greedy/max_capacity.kt new file mode 100644 index 000000000..6691163c6 --- /dev/null +++ b/ru/codes/kotlin/chapter_greedy/max_capacity.kt @@ -0,0 +1,41 @@ +/** + * File: max_capacity.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_greedy + +import kotlin.math.max +import kotlin.math.min + +/* Максимальная вместимость: жадный алгоритм */ +fun maxCapacity(ht: IntArray): Int { + // Инициализировать i и j так, чтобы они располагались по двум концам массива + var i = 0 + var j = ht.size - 1 + // Начальная максимальная вместимость равна 0 + var res = 0 + // Выполнять жадный выбор в цикле, пока две доски не встретятся + while (i < j) { + // Обновить максимальную вместимость + val cap = min(ht[i], ht[j]) * (j - i) + res = max(res, cap) + // Сдвигать внутрь более короткую сторону + if (ht[i] < ht[j]) { + i++ + } else { + j-- + } + } + return res +} + +/* Driver Code */ +fun main() { + val ht = intArrayOf(3, 8, 5, 2, 7, 7, 3, 4) + + // Жадный алгоритм + val res = maxCapacity(ht) + println("Максимальная вместимость = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_greedy/max_product_cutting.kt b/ru/codes/kotlin/chapter_greedy/max_product_cutting.kt new file mode 100644 index 000000000..8292abaf9 --- /dev/null +++ b/ru/codes/kotlin/chapter_greedy/max_product_cutting.kt @@ -0,0 +1,39 @@ +/** + * File: max_product_cutting.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_greedy + +import kotlin.math.pow + +/* Максимальное произведение разрезания: жадный алгоритм */ +fun maxProductCutting(n: Int): Int { + // Когда n <= 3, обязательно нужно выделить одну 1 + if (n <= 3) { + return 1 * (n - 1) + } + // Жадно выделить множители 3, где a — число троек, а b — остаток + val a = n / 3 + val b = n % 3 + if (b == 1) { + // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2 + return 3.0.pow((a - 1)).toInt() * 2 * 2 + } + if (b == 2) { + // Если остаток равен 2, ничего не делать + return 3.0.pow(a).toInt() * 2 * 2 + } + // Если остаток равен 0, ничего не делать + return 3.0.pow(a).toInt() +} + +/* Driver Code */ +fun main() { + val n = 58 + + // Жадный алгоритм + val res = maxProductCutting(n) + println("Максимальное произведение после разрезания = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_hashing/array_hash_map.kt b/ru/codes/kotlin/chapter_hashing/array_hash_map.kt new file mode 100644 index 000000000..f0a0d638e --- /dev/null +++ b/ru/codes/kotlin/chapter_hashing/array_hash_map.kt @@ -0,0 +1,126 @@ +/** + * File: array_hash_map.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_hashing + +/* Пара ключ-значение */ +class Pair( + var key: Int, + var _val: String +) + +/* Хеш-таблица на основе массива */ +class ArrayHashMap { + // Инициализировать массив, содержащий 100 корзин + private val buckets = arrayOfNulls(100) + + /* Хеш-функция */ + fun hashFunc(key: Int): Int { + val index = key % 100 + return index + } + + /* Операция поиска */ + fun get(key: Int): String? { + val index = hashFunc(key) + val pair = buckets[index] ?: return null + return pair._val + } + + /* Операция добавления */ + fun put(key: Int, _val: String) { + val pair = Pair(key, _val) + val index = hashFunc(key) + buckets[index] = pair + } + + /* Операция удаления */ + fun remove(key: Int) { + val index = hashFunc(key) + // Присвоить null, что означает удаление + buckets[index] = null + } + + /* Получить все пары ключ-значение */ + fun pairSet(): MutableList { + val pairSet = mutableListOf() + for (pair in buckets) { + if (pair != null) + pairSet.add(pair) + } + return pairSet + } + + /* Получить все ключи */ + fun keySet(): MutableList { + val keySet = mutableListOf() + for (pair in buckets) { + if (pair != null) + keySet.add(pair.key) + } + return keySet + } + + /* Получить все значения */ + fun valueSet(): MutableList { + val valueSet = mutableListOf() + for (pair in buckets) { + if (pair != null) + valueSet.add(pair._val) + } + return valueSet + } + + /* Вывести хеш-таблицу */ + fun print() { + for (kv in pairSet()) { + val key = kv.key + val _val = kv._val + println("$key -> $_val") + } + } +} + +/* Driver Code */ +fun main() { + /* Инициализация хеш-таблицы */ + val map = ArrayHashMap() + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.put(12836, "Сяо Ха") + map.put(15937, "Сяо Ло") + map.put(16750, "Сяо Суань") + map.put(13276, "Сяо Фа") + map.put(10583, "Сяо Я") + println("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение") + map.print() + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + val name = map.get(15937) + println("\nДля номера 15937 найдено имя $name") + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(10583) + println("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение") + map.print() + + /* Обход хеш-таблицы */ + println("\nОтдельный обход пар ключ-значение") + for (kv in map.pairSet()) { + println("${kv.key} -> ${kv._val}") + } + println("\nОтдельный обход ключей") + for (key in map.keySet()) { + println(key) + } + println("\nОтдельный обход значений") + for (_val in map.valueSet()) { + println(_val) + } +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_hashing/built_in_hash.kt b/ru/codes/kotlin/chapter_hashing/built_in_hash.kt new file mode 100644 index 000000000..ce05bed1f --- /dev/null +++ b/ru/codes/kotlin/chapter_hashing/built_in_hash.kt @@ -0,0 +1,36 @@ +/** + * File: built_in_hash.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_hashing + +import utils.ListNode + +/* Driver Code */ +fun main() { + val num = 3 + val hashNum = num.hashCode() + println("Хеш-значение целого числа $num = $hashNum") + + val bol = true + val hashBol = bol.hashCode() + println("Хеш-значение булева значения $bol = $hashBol") + + val dec = 3.14159 + val hashDec = dec.hashCode() + println("Хеш-значение десятичного числа $dec = $hashDec") + + val str = "Hello Algo" + val hashStr = str.hashCode() + println("Хеш-значение строки $str = $hashStr") + + val arr = arrayOf(12836, "Сяо Ха") + val hashTup = arr.contentHashCode() + println("Хеш-значение массива ${arr.contentToString()} = $hashTup") + + val obj = ListNode(0) + val hashObj = obj.hashCode() + println("Хеш-значение объекта узла $obj = $hashObj") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_hashing/hash_map.kt b/ru/codes/kotlin/chapter_hashing/hash_map.kt new file mode 100644 index 000000000..b5bd934be --- /dev/null +++ b/ru/codes/kotlin/chapter_hashing/hash_map.kt @@ -0,0 +1,50 @@ +/** + * File: hash_map.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_hashing + +import utils.printHashMap + +/* Driver Code */ +fun main() { + /* Инициализация хеш-таблицы */ + val map = HashMap() + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map[12836] = "Сяо Ха" + map[15937] = "Сяо Ло" + map[16750] = "Сяо Суань" + map[13276] = "Сяо Фа" + map[10583] = "Сяо Я" + println("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение") + printHashMap(map) + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + val name = map[15937] + println("\nДля номера 15937 найдено имя $name") + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(10583) + println("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение") + printHashMap(map) + + /* Обход хеш-таблицы */ + println("\nОтдельный обход пар ключ-значение") + for ((key, value) in map) { + println("$key -> $value") + } + println("\nОтдельный обход ключей") + for (key in map.keys) { + println(key) + } + println("\nОтдельный обход значений") + for (_val in map.values) { + println(_val) + } +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_hashing/hash_map_chaining.kt b/ru/codes/kotlin/chapter_hashing/hash_map_chaining.kt new file mode 100644 index 000000000..a1141fc8b --- /dev/null +++ b/ru/codes/kotlin/chapter_hashing/hash_map_chaining.kt @@ -0,0 +1,145 @@ +/** + * File: hash_map_chaining.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_hashing + +/* Хеш-таблица с цепочками */ +class HashMapChaining { + var size: Int // Число пар ключ-значение + var capacity: Int // Вместимость хеш-таблицы + val loadThres: Double // Порог коэффициента загрузки для запуска расширения + val extendRatio: Int // Коэффициент расширения + var buckets: MutableList> // Массив корзин + + /* Конструктор */ + init { + size = 0 + capacity = 4 + loadThres = 2.0 / 3.0 + extendRatio = 2 + buckets = mutableListOf() + for (i in 0.. loadThres) { + extend() + } + val index = hashFunc(key) + val bucket = buckets[index] + // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть + for (pair in bucket) { + if (pair.key == key) { + pair._val = _val + return + } + } + // Если такого key нет, добавить пару ключ-значение в конец + val pair = Pair(key, _val) + bucket.add(pair) + size++ + } + + /* Операция удаления */ + fun remove(key: Int) { + val index = hashFunc(key) + val bucket = buckets[index] + // Обойти корзину и удалить из нее пару ключ-значение + for (pair in bucket) { + if (pair.key == key) { + bucket.remove(pair) + size-- + break + } + } + } + + /* Расширить хеш-таблицу */ + fun extend() { + // Временно сохранить исходную хеш-таблицу + val bucketsTmp = buckets + // Инициализация новой хеш-таблицы после расширения + capacity *= extendRatio + // mutablelist не имеет фиксированного размера + buckets = mutableListOf() + for (i in 0..() + for (pair in bucket) { + val k = pair.key + val v = pair._val + res.add("$k -> $v") + } + println(res) + } + } +} + +/* Driver Code */ +fun main() { + /* Инициализация хеш-таблицы */ + val map = HashMapChaining() + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.put(12836, "Сяо Ха") + map.put(15937, "Сяо Ло") + map.put(16750, "Сяо Суань") + map.put(13276, "Сяо Фа") + map.put(10583, "Сяо Я") + println("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение") + map.print() + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + val name = map.get(13276) + println("\nДля номера 13276 найдено имя $name") + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(12836) + println("\nПосле удаления 12836 хеш-таблица имеет вид\nКлюч -> Значение") + map.print() +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_hashing/hash_map_open_addressing.kt b/ru/codes/kotlin/chapter_hashing/hash_map_open_addressing.kt new file mode 100644 index 000000000..f9f73a9aa --- /dev/null +++ b/ru/codes/kotlin/chapter_hashing/hash_map_open_addressing.kt @@ -0,0 +1,161 @@ +/** + * File: hash_map_open_addressing.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_hashing + +/* Хеш-таблица с открытой адресацией */ +class HashMapOpenAddressing { + private var size: Int // Число пар ключ-значение + private var capacity: Int // Вместимость хеш-таблицы + private val loadThres: Double // Порог коэффициента загрузки для запуска расширения + private val extendRatio: Int // Коэффициент расширения + private var buckets: Array // Массив корзин + private val TOMBSTONE: Pair // Удалить метку + + /* Конструктор */ + init { + size = 0 + capacity = 4 + loadThres = 2.0 / 3.0 + extendRatio = 2 + buckets = arrayOfNulls(capacity) + TOMBSTONE = Pair(-1, "-1") + } + + /* Хеш-функция */ + fun hashFunc(key: Int): Int { + return key % capacity + } + + /* Коэффициент загрузки */ + fun loadFactor(): Double { + return (size / capacity).toDouble() + } + + /* Найти индекс корзины, соответствующий key */ + fun findBucket(key: Int): Int { + var index = hashFunc(key) + var firstTombstone = -1 + // Выполнять линейное пробирование и завершить при встрече с пустой корзиной + while (buckets[index] != null) { + // Если встретился key, вернуть соответствующий индекс корзины + if (buckets[index]?.key == key) { + // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс + if (firstTombstone != -1) { + buckets[firstTombstone] = buckets[index] + buckets[index] = TOMBSTONE + return firstTombstone // Вернуть индекс корзины после перемещения + } + return index // Вернуть индекс корзины + } + // Записать первую встретившуюся метку удаления + if (firstTombstone == -1 && buckets[index] == TOMBSTONE) { + firstTombstone = index + } + // Вычислить индекс корзины; при выходе за конец вернуться к началу + index = (index + 1) % capacity + } + // Если key не существует, вернуть индекс точки добавления + return if (firstTombstone == -1) index else firstTombstone + } + + /* Операция поиска */ + fun get(key: Int): String? { + // Найти индекс корзины, соответствующий key + val index = findBucket(key) + // Если пара ключ-значение найдена, вернуть соответствующее val + if (buckets[index] != null && buckets[index] != TOMBSTONE) { + return buckets[index]?._val + } + // Если пары ключ-значение не существует, вернуть null + return null + } + + /* Операция добавления */ + fun put(key: Int, _val: String) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if (loadFactor() > loadThres) { + extend() + } + // Найти индекс корзины, соответствующий key + val index = findBucket(key) + // Если пара ключ-значение найдена, перезаписать val и вернуть + if (buckets[index] != null && buckets[index] != TOMBSTONE) { + buckets[index]!!._val = _val + return + } + // Если пары ключ-значение нет, добавить ее + buckets[index] = Pair(key, _val) + size++ + } + + /* Операция удаления */ + fun remove(key: Int) { + // Найти индекс корзины, соответствующий key + val index = findBucket(key) + // Если пара ключ-значение найдена, заменить ее меткой удаления + if (buckets[index] != null && buckets[index] != TOMBSTONE) { + buckets[index] = TOMBSTONE + size-- + } + } + + /* Расширить хеш-таблицу */ + fun extend() { + // Временно сохранить исходную хеш-таблицу + val bucketsTmp = buckets + // Инициализация новой хеш-таблицы после расширения + capacity *= extendRatio + buckets = arrayOfNulls(capacity) + size = 0 + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for (pair in bucketsTmp) { + if (pair != null && pair != TOMBSTONE) { + put(pair.key, pair._val) + } + } + } + + /* Вывести хеш-таблицу */ + fun print() { + for (pair in buckets) { + if (pair == null) { + println("null") + } else if (pair == TOMBSTONE) { + println("TOMESTOME") + } else { + println("${pair.key} -> ${pair._val}") + } + } + } +} + +/* Driver Code */ +fun main() { + // Инициализация хеш-таблицы + val hashmap = HashMapOpenAddressing() + + // Операция добавления + // Добавить пару (key, val) в хеш-таблицу + hashmap.put(12836, "Сяо Ха") + hashmap.put(15937, "Сяо Ло") + hashmap.put(16750, "Сяо Суань") + hashmap.put(13276, "Сяо Фа") + hashmap.put(10583, "Сяо Я") + println("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение") + hashmap.print() + + // Операция поиска + // Передать ключ key в хеш-таблицу и получить значение val + val name = hashmap.get(13276) + println("\nДля номера 13276 найдено имя $name") + + // Операция удаления + // Удалить пару (key, val) из хеш-таблицы + hashmap.remove(16750) + println("\nПосле удаления 16750 хеш-таблица имеет вид\nКлюч -> Значение") + hashmap.print() +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_hashing/simple_hash.kt b/ru/codes/kotlin/chapter_hashing/simple_hash.kt new file mode 100644 index 000000000..1c00107ec --- /dev/null +++ b/ru/codes/kotlin/chapter_hashing/simple_hash.kt @@ -0,0 +1,64 @@ +/** + * File: simple_hash.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_hashing + +/* Аддитивное хеширование */ +fun addHash(key: String): Int { + var hash = 0L + val MODULUS = 1000000007 + for (c in key.toCharArray()) { + hash = (hash + c.code) % MODULUS + } + return hash.toInt() +} + +/* Мультипликативное хеширование */ +fun mulHash(key: String): Int { + var hash = 0L + val MODULUS = 1000000007 + for (c in key.toCharArray()) { + hash = (31 * hash + c.code) % MODULUS + } + return hash.toInt() +} + +/* XOR-хеширование */ +fun xorHash(key: String): Int { + var hash = 0 + val MODULUS = 1000000007 + for (c in key.toCharArray()) { + hash = hash xor c.code + } + return hash and MODULUS +} + +/* Хеширование с циклическим сдвигом */ +fun rotHash(key: String): Int { + var hash = 0L + val MODULUS = 1000000007 + for (c in key.toCharArray()) { + hash = ((hash shl 4) xor (hash shr 28) xor c.code.toLong()) % MODULUS + } + return hash.toInt() +} + +/* Driver Code */ +fun main() { + val key = "Hello Algo" + + var hash = addHash(key) + println("Хеш-сумма сложением = $hash") + + hash = mulHash(key) + println("Хеш-сумма умножением = $hash") + + hash = xorHash(key) + println("Хеш-сумма XOR = $hash") + + hash = rotHash(key) + println("Хеш-сумма с циклическим сдвигом = $hash") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_heap/heap.kt b/ru/codes/kotlin/chapter_heap/heap.kt new file mode 100644 index 000000000..418b63912 --- /dev/null +++ b/ru/codes/kotlin/chapter_heap/heap.kt @@ -0,0 +1,66 @@ +/** + * File: heap.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_heap + +import utils.printHeap +import java.util.* + +fun testPush(heap: Queue, _val: Int) { + heap.offer(_val) // Добавление элемента в кучу + print("\nПосле добавления элемента $_val в кучу\n") + printHeap(heap) +} + +fun testPop(heap: Queue) { + val _val = heap.poll() // Извлечение элемента с вершины кучи + print("\nПосле извлечения элемента вершины кучи $_val\n") + printHeap(heap) +} + +/* Driver Code */ +fun main() { + /* Инициализация кучи */ + // Инициализация минимальной кучи + var minHeap = PriorityQueue() + + // Инициализация максимальной кучи (достаточно изменить Comparator с помощью lambda-выражения) + val maxHeap = PriorityQueue { a: Int, b: Int -> b - a } + + println("\nНиже приведен тестовый пример для max-heap") + + /* Добавление элемента в кучу */ + testPush(maxHeap, 1) + testPush(maxHeap, 3) + testPush(maxHeap, 2) + testPush(maxHeap, 5) + testPush(maxHeap, 4) + + /* Получение элемента с вершины кучи */ + val peek = maxHeap.peek() + print("\nЭлемент на вершине кучи = $peek\n") + + /* Извлечение элемента с вершины кучи */ + testPop(maxHeap) + testPop(maxHeap) + testPop(maxHeap) + testPop(maxHeap) + testPop(maxHeap) + + /* Получение размера кучи */ + val size = maxHeap.size + print("\nКоличество элементов в куче = $size\n") + + /* Проверка, пуста ли куча */ + val isEmpty = maxHeap.isEmpty() + print("\nПуста ли куча: $isEmpty\n") + + /* Построить кучу по входному списку */ + // Временная сложность равна O(n), а не O(nlogn) + minHeap = PriorityQueue(mutableListOf(1, 3, 2, 5, 4)) + println("\nПосле построения min-heap из входного списка") + printHeap(minHeap) +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_heap/my_heap.kt b/ru/codes/kotlin/chapter_heap/my_heap.kt new file mode 100644 index 000000000..f349f2671 --- /dev/null +++ b/ru/codes/kotlin/chapter_heap/my_heap.kt @@ -0,0 +1,160 @@ +/** + * File: my_heap.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_heap + +import utils.printHeap +import java.util.* + +/* Максимальная куча */ +class MaxHeap(nums: MutableList?) { + // Использовать список вместо массива, чтобы не учитывать проблему расширения + private val maxHeap = mutableListOf() + + /* Конструктор, строящий кучу по входному списку */ + init { + // Добавить элементы списка в кучу без изменений + maxHeap.addAll(nums!!) + // Выполнить heapify для всех узлов, кроме листовых + for (i in parent(size() - 1) downTo 0) { + siftDown(i) + } + } + + /* Получить индекс левого дочернего узла */ + private fun left(i: Int): Int { + return 2 * i + 1 + } + + /* Получить индекс правого дочернего узла */ + private fun right(i: Int): Int { + return 2 * i + 2 + } + + /* Получить индекс родительского узла */ + private fun parent(i: Int): Int { + return (i - 1) / 2 // Округление вниз при делении + } + + /* Поменять элементы местами */ + private fun swap(i: Int, j: Int) { + val temp = maxHeap[i] + maxHeap[i] = maxHeap[j] + maxHeap[j] = temp + } + + /* Получение размера кучи */ + fun size(): Int { + return maxHeap.size + } + + /* Проверка, пуста ли куча */ + fun isEmpty(): Boolean { + /* Проверка, пуста ли куча */ + return size() == 0 + } + + /* Доступ к элементу на вершине кучи */ + fun peek(): Int { + return maxHeap[0] + } + + /* Добавление элемента в кучу */ + fun push(_val: Int) { + // Добавление узла + maxHeap.add(_val) + // Просеивание снизу вверх + siftUp(size() - 1) + } + + /* Начиная с узла i, выполнить просеивание снизу вверх */ + private fun siftUp(it: Int) { + // Параметры функций в Kotlin неизменяемы, поэтому создается временная переменная + var i = it + while (true) { + // Получение родительского узла для узла i + val p = parent(i) + // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления» + if (p < 0 || maxHeap[i] <= maxHeap[p]) break + // Поменять два узла местами + swap(i, p) + // Циклическое просеивание вверх + i = p + } + } + + /* Извлечение элемента из кучи */ + fun pop(): Int { + // Обработка пустого случая + if (isEmpty()) throw IndexOutOfBoundsException() + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + swap(0, size() - 1) + // Удаление узла + val _val = maxHeap.removeAt(size() - 1) + // Просеивание сверху вниз + siftDown(0) + // Вернуть элемент с вершины кучи + return _val + } + + /* Начиная с узла i, выполнить просеивание сверху вниз */ + private fun siftDown(it: Int) { + // Параметры функций в Kotlin неизменяемы, поэтому создается временная переменная + var i = it + while (true) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + val l = left(i) + val r = right(i) + var ma = i + if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l + if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (ma == i) break + // Поменять два узла местами + swap(i, ma) + // Циклическое просеивание вниз + i = ma + } + } + + /* Вывести кучу (двоичное дерево) */ + fun print() { + val queue = PriorityQueue { a: Int, b: Int -> b - a } + queue.addAll(maxHeap) + printHeap(queue) + } +} + +/* Driver Code */ +fun main() { + /* Инициализация максимальной кучи */ + val maxHeap = MaxHeap(mutableListOf(9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2)) + println("\nПосле построения кучи из входного списка") + maxHeap.print() + + /* Получение элемента с вершины кучи */ + var peek = maxHeap.peek() + print("\nЭлемент на вершине кучи = $peek\n") + + /* Добавление элемента в кучу */ + val _val = 7 + maxHeap.push(_val) + print("\nПосле добавления элемента $_val в кучу\n") + maxHeap.print() + + /* Извлечение элемента с вершины кучи */ + peek = maxHeap.pop() + print("\nПосле извлечения элемента вершины кучи $peek\n") + maxHeap.print() + + /* Получение размера кучи */ + val size = maxHeap.size() + print("\nКоличество элементов в куче = $size\n") + + /* Проверка, пуста ли куча */ + val isEmpty = maxHeap.isEmpty() + print("\nПуста ли куча: $isEmpty\n") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_heap/top_k.kt b/ru/codes/kotlin/chapter_heap/top_k.kt new file mode 100644 index 000000000..df82d7084 --- /dev/null +++ b/ru/codes/kotlin/chapter_heap/top_k.kt @@ -0,0 +1,38 @@ +/** + * File: top_k.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_heap + +import utils.printHeap +import java.util.* + +/* Найти k наибольших элементов массива с помощью кучи */ +fun topKHeap(nums: IntArray, k: Int): Queue { + // Инициализация минимальной кучи + val heap = PriorityQueue() + // Поместить первые k элементов массива в кучу + for (i in 0.. heap.peek()) { + heap.poll() + heap.offer(nums[i]) + } + } + return heap +} + +/* Driver Code */ +fun main() { + val nums = intArrayOf(1, 7, 6, 3, 2) + val k = 3 + val res = topKHeap(nums, k) + println("Наибольшие $k элементов") + printHeap(res) +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_searching/binary_search.kt b/ru/codes/kotlin/chapter_searching/binary_search.kt new file mode 100644 index 000000000..8883f7053 --- /dev/null +++ b/ru/codes/kotlin/chapter_searching/binary_search.kt @@ -0,0 +1,59 @@ +/** + * File: binary_search.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_searching + +/* Бинарный поиск (двусторонне замкнутый интервал) */ +fun binarySearch(nums: IntArray, target: Int): Int { + // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно + var i = 0 + var j = nums.size - 1 + // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст) + while (i <= j) { + val m = i + (j - i) / 2 // Вычислить индекс середины m + if (nums[m] < target) // Это означает, что target находится в интервале [m+1, j] + i = m + 1 + else if (nums[m] > target) // Это означает, что target находится в интервале [i, m-1] + j = m - 1 + else // Целевой элемент найден, вернуть его индекс + return m + } + // Целевой элемент не найден, вернуть -1 + return -1 +} + +/* Бинарный поиск (лево замкнутый, право открытый интервал) */ +fun binarySearchLCRO(nums: IntArray, target: Int): Int { + // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно + var i = 0 + var j = nums.size + // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст) + while (i < j) { + val m = i + (j - i) / 2 // Вычислить индекс середины m + if (nums[m] < target) // Это означает, что target находится в интервале [m+1, j) + i = m + 1 + else if (nums[m] > target) // Это означает, что target находится в интервале [i, m) + j = m + else // Целевой элемент найден, вернуть его индекс + return m + } + // Целевой элемент не найден, вернуть -1 + return -1 +} + +/* Driver Code */ +fun main() { + val target = 6 + val nums = intArrayOf(1, 3, 6, 8, 12, 15, 23, 26, 31, 35) + + /* Бинарный поиск (двусторонне замкнутый интервал) */ + var index = binarySearch(nums, target) + println("Индекс целевого элемента 6 = $index") + + /* Бинарный поиск (лево замкнутый, право открытый интервал) */ + index = binarySearchLCRO(nums, target) + println("Индекс целевого элемента 6 = $index") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_searching/binary_search_edge.kt b/ru/codes/kotlin/chapter_searching/binary_search_edge.kt new file mode 100644 index 000000000..8d18bc8e5 --- /dev/null +++ b/ru/codes/kotlin/chapter_searching/binary_search_edge.kt @@ -0,0 +1,48 @@ +/** + * File: binary_search_edge.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_searching + +/* Бинарный поиск самого левого target */ +fun binarySearchLeftEdge(nums: IntArray, target: Int): Int { + // Эквивалентно поиску точки вставки target + val i = binarySearchInsertion(nums, target) + // target не найден, вернуть -1 + if (i == nums.size || nums[i] != target) { + return -1 + } + // Найти target и вернуть индекс i + return i +} + +/* Бинарный поиск самого правого target */ +fun binarySearchRightEdge(nums: IntArray, target: Int): Int { + // Преобразовать задачу в поиск самого левого target + 1 + val i = binarySearchInsertion(nums, target + 1) + // j указывает на самый правый target, а i — на первый элемент больше target + val j = i - 1 + // target не найден, вернуть -1 + if (j == -1 || nums[j] != target) { + return -1 + } + // Найти target и вернуть индекс j + return j +} + +/* Driver Code */ +fun main() { + // Массив с повторяющимися элементами + val nums = intArrayOf(1, 3, 6, 6, 6, 6, 6, 10, 12, 15) + println("\nМассив nums = ${nums.contentToString()}") + + // Бинарный поиск левой и правой границы + for (target in intArrayOf(6, 7)) { + var index = binarySearchLeftEdge(nums, target) + println("Индекс самого левого элемента $target равен $index") + index = binarySearchRightEdge(nums, target) + println("Индекс самого правого элемента $target равен $index") + } +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_searching/binary_search_insertion.kt b/ru/codes/kotlin/chapter_searching/binary_search_insertion.kt new file mode 100644 index 000000000..6e5710701 --- /dev/null +++ b/ru/codes/kotlin/chapter_searching/binary_search_insertion.kt @@ -0,0 +1,65 @@ +/** + * File: binary_search_insertion.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_searching + +/* Бинарный поиск точки вставки (без повторяющихся элементов) */ +fun binarySearchInsertionSimple(nums: IntArray, target: Int): Int { + var i = 0 + var j = nums.size - 1 // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + val m = i + (j - i) / 2 // Вычислить индекс середины m + if (nums[m] < target) { + i = m + 1 // target находится в интервале [m+1, j] + } else if (nums[m] > target) { + j = m - 1 // target находится в интервале [i, m-1] + } else { + return m // Найти target и вернуть точку вставки m + } + } + // target не найден, вернуть точку вставки i + return i +} + +/* Бинарный поиск точки вставки (с повторяющимися элементами) */ +fun binarySearchInsertion(nums: IntArray, target: Int): Int { + var i = 0 + var j = nums.size - 1 // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + val m = i + (j - i) / 2 // Вычислить индекс середины m + if (nums[m] < target) { + i = m + 1 // target находится в интервале [m+1, j] + } else if (nums[m] > target) { + j = m - 1 // target находится в интервале [i, m-1] + } else { + j = m - 1 // Первый элемент меньше target находится в интервале [i, m-1] + } + } + // Вернуть точку вставки i + return i +} + +/* Driver Code */ +fun main() { + // Массив без повторяющихся элементов + var nums = intArrayOf(1, 3, 6, 8, 12, 15, 23, 26, 31, 35) + println("\nМассив nums = ${nums.contentToString()}") + // Бинарный поиск точки вставки + for (target in intArrayOf(6, 9)) { + val index = binarySearchInsertionSimple(nums, target) + println("Индекс позиции вставки элемента $target равен $index") + } + + // Массив с повторяющимися элементами + nums = intArrayOf(1, 3, 6, 6, 6, 6, 6, 10, 12, 15) + println("\nМассив nums = ${nums.contentToString()}") + + // Бинарный поиск точки вставки + for (target in intArrayOf(2, 6, 20)) { + val index = binarySearchInsertion(nums, target) + println("Индекс позиции вставки элемента $target равен $index") + } +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_searching/hashing_search.kt b/ru/codes/kotlin/chapter_searching/hashing_search.kt new file mode 100644 index 000000000..604d322dd --- /dev/null +++ b/ru/codes/kotlin/chapter_searching/hashing_search.kt @@ -0,0 +1,49 @@ +/** + * File: hashing_search.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_searching + +import utils.ListNode + +/* Хеш-поиск (массив) */ +fun hashingSearchArray(map: Map, target: Int): Int { + // key хеш-таблицы: целевой элемент, _val: индекс + // Если такого key нет в хеш-таблице, вернуть -1 + return map.getOrDefault(target, -1) +} + +/* Хеш-поиск (связный список) */ +fun hashingSearchLinkedList(map: Map, target: Int): ListNode? { + // key хеш-таблицы: значение целевого узла, _val: объект узла + // Если такого key нет в хеш-таблице, вернуть null + return map.getOrDefault(target, null) +} + +/* Driver Code */ +fun main() { + val target = 3 + + /* Хеш-поиск (массив) */ + val nums = intArrayOf(1, 5, 3, 2, 4, 7, 5, 9, 10, 8) + // Инициализация хеш-таблицы + val map = HashMap() + for (i in nums.indices) { + map[nums[i]] = i // key: элемент, _val: индекс + } + val index = hashingSearchArray(map, target) + println("Индекс целевого элемента 3 = $index") + + /* Хеш-поиск (связный список) */ + var head = ListNode.arrToLinkedList(nums) + // Инициализация хеш-таблицы + val map1 = HashMap() + while (head != null) { + map1[head._val] = head // key: значение узла, _val: узел + head = head.next + } + val node = hashingSearchLinkedList(map1, target) + println("Объект узла со значением 3 = $node") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_searching/linear_search.kt b/ru/codes/kotlin/chapter_searching/linear_search.kt new file mode 100644 index 000000000..b522e5d08 --- /dev/null +++ b/ru/codes/kotlin/chapter_searching/linear_search.kt @@ -0,0 +1,50 @@ +/** + * File: linear_search.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_searching + +import utils.ListNode + +/* Линейный поиск (массив) */ +fun linearSearchArray(nums: IntArray, target: Int): Int { + // Обход массива + for (i in nums.indices) { + // Целевой элемент найден, вернуть его индекс + if (nums[i] == target) + return i + } + // Целевой элемент не найден, вернуть -1 + return -1 +} + +/* Линейный поиск (связный список) */ +fun linearSearchLinkedList(h: ListNode?, target: Int): ListNode? { + // Обойти связный список + var head = h + while (head != null) { + // Найти целевой узел и вернуть его + if (head._val == target) + return head + head = head.next + } + // Целевой узел не найден, вернуть null + return null +} + +/* Driver Code */ +fun main() { + val target = 3 + + /* Выполнить линейный поиск в массиве */ + val nums = intArrayOf(1, 5, 3, 2, 4, 7, 5, 9, 10, 8) + val index = linearSearchArray(nums, target) + println("Индекс целевого элемента 3 = $index") + + /* Выполнить линейный поиск в связном списке */ + val head = ListNode.arrToLinkedList(nums) + val node = linearSearchLinkedList(head, target) + println("Объект узла со значением 3 = $node") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_searching/two_sum.kt b/ru/codes/kotlin/chapter_searching/two_sum.kt new file mode 100644 index 000000000..2fcbbe3fa --- /dev/null +++ b/ru/codes/kotlin/chapter_searching/two_sum.kt @@ -0,0 +1,49 @@ +/** + * File: two_sum.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_searching + +/* Метод 1: полный перебор */ +fun twoSumBruteForce(nums: IntArray, target: Int): IntArray { + val size = nums.size + // Два вложенных цикла, временная сложность O(n^2) + for (i in 0..() + // Один цикл, временная сложность O(n) + for (i in 0.. nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + val temp = nums[j] + nums[j] = nums[j + 1] + nums[j + 1] = temp + } + } + } +} + +/* Пузырьковая сортировка (оптимизация флагом) */ +fun bubbleSortWithFlag(nums: IntArray) { + // Внешний цикл: неотсортированный диапазон [0, i] + for (i in nums.size - 1 downTo 1) { + var flag = false // Инициализировать флаг + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (j in 0.. nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + val temp = nums[j] + nums[j] = nums[j + 1] + nums[j + 1] = temp + flag = true // Записать обмен элементов + } + } + if (!flag) break // На этой итерации «всплытия» не было ни одного обмена, сразу выйти + } +} + +/* Driver Code */ +fun main() { + val nums = intArrayOf(4, 1, 3, 1, 5, 2) + bubbleSort(nums) + println("После пузырьковой сортировки nums = ${nums.contentToString()}") + + val nums1 = intArrayOf(4, 1, 3, 1, 5, 2) + bubbleSortWithFlag(nums1) + println("После пузырьковой сортировки nums1 = ${nums1.contentToString()}") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_sorting/bucket_sort.kt b/ru/codes/kotlin/chapter_sorting/bucket_sort.kt new file mode 100644 index 000000000..e06d5ba5a --- /dev/null +++ b/ru/codes/kotlin/chapter_sorting/bucket_sort.kt @@ -0,0 +1,44 @@ +/** + * File: bucket_sort.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_sorting + +/* Сортировка корзинами */ +fun bucketSort(nums: FloatArray) { + // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину + val k = nums.size / 2 + val buckets = mutableListOf>() + for (i in 0.. nums[ma]) + ma = l + if (r < n && nums[r] > nums[ma]) + ma = r + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (ma == i) + break + // Поменять два узла местами + val temp = nums[i] + nums[i] = nums[ma] + nums[ma] = temp + // Циклическое просеивание вниз + i = ma + } +} + +/* Сортировка кучей */ +fun heapSort(nums: IntArray) { + // Построение кучи: выполнить heapify для всех узлов, кроме листовых + for (i in nums.size / 2 - 1 downTo 0) { + siftDown(nums, nums.size, i) + } + // Извлекать максимальный элемент из кучи в течение n-1 итераций + for (i in nums.size - 1 downTo 1) { + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + val temp = nums[0] + nums[0] = nums[i] + nums[i] = temp + // Начиная с корневого узла, выполнить просеивание сверху вниз + siftDown(nums, i, 0) + } +} + +/* Driver Code */ +fun main() { + val nums = intArrayOf(4, 1, 3, 1, 5, 2) + heapSort(nums) + println("После сортировки кучей nums = ${nums.contentToString()}") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_sorting/insertion_sort.kt b/ru/codes/kotlin/chapter_sorting/insertion_sort.kt new file mode 100644 index 000000000..33bcb1d0f --- /dev/null +++ b/ru/codes/kotlin/chapter_sorting/insertion_sort.kt @@ -0,0 +1,29 @@ +/** + * File: insertion_sort.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_sorting + +/* Сортировка вставками */ +fun insertionSort(nums: IntArray) { + // Внешний цикл: отсортированные элементы равны 1, 2, ..., n + for (i in nums.indices) { + val base = nums[i] + var j = i - 1 + // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1] + while (j >= 0 && nums[j] > base) { + nums[j + 1] = nums[j] // Сдвинуть nums[j] на одну позицию вправо + j-- + } + nums[j + 1] = base // Поместить base в правильную позицию + } +} + +/* Driver Code */ +fun main() { + val nums = intArrayOf(4, 1, 3, 1, 5, 2) + insertionSort(nums) + println("После сортировки вставками nums = ${nums.contentToString()}") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_sorting/merge_sort.kt b/ru/codes/kotlin/chapter_sorting/merge_sort.kt new file mode 100644 index 000000000..3a0d3b64b --- /dev/null +++ b/ru/codes/kotlin/chapter_sorting/merge_sort.kt @@ -0,0 +1,56 @@ +/** + * File: merge_sort.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_sorting + +/* Объединить левый и правый подмассивы */ +fun merge(nums: IntArray, left: Int, mid: Int, right: Int) { + // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right] + // Создать временный массив tmp для хранения результата слияния + val tmp = IntArray(right - left + 1) + // Инициализировать начальные индексы левого и правого подмассивов + var i = left + var j = mid + 1 + var k = 0 + // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив + while (i <= mid && j <= right) { + if (nums[i] <= nums[j]) + tmp[k++] = nums[i++] + else + tmp[k++] = nums[j++] + } + // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив + while (i <= mid) { + tmp[k++] = nums[i++] + } + while (j <= right) { + tmp[k++] = nums[j++] + } + // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums + for (l in tmp.indices) { + nums[left + l] = tmp[l] + } +} + +/* Сортировка слиянием */ +fun mergeSort(nums: IntArray, left: Int, right: Int) { + // Условие завершения + if (left >= right) return // Завершить рекурсию, когда длина подмассива равна 1 + // Этап разбиения + val mid = left + (right - left) / 2 // Вычислить середину + mergeSort(nums, left, mid) // Рекурсивно обработать левый подмассив + mergeSort(nums, mid + 1, right) // Рекурсивно обработать правый подмассив + // Этап слияния + merge(nums, left, mid, right) +} + +/* Driver Code */ +fun main() { + /* Сортировка слиянием */ + val nums = intArrayOf(7, 3, 2, 6, 0, 1, 5, 4) + mergeSort(nums, 0, nums.size - 1) + println("После сортировки слиянием nums = ${nums.contentToString()}") +} diff --git a/ru/codes/kotlin/chapter_sorting/quick_sort.kt b/ru/codes/kotlin/chapter_sorting/quick_sort.kt new file mode 100644 index 000000000..16df5080a --- /dev/null +++ b/ru/codes/kotlin/chapter_sorting/quick_sort.kt @@ -0,0 +1,121 @@ +/** + * File: quick_sort.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_sorting + +/* Обмен элементов */ +fun swap(nums: IntArray, i: Int, j: Int) { + val temp = nums[i] + nums[i] = nums[j] + nums[j] = temp +} + +/* Разбиение с опорными указателями */ +fun partition(nums: IntArray, left: Int, right: Int): Int { + // Взять nums[left] в качестве опорного элемента + var i = left + var j = right + while (i < j) { + while (i < j && nums[j] >= nums[left]) + j-- // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) + i++ // Идти слева направо в поисках первого элемента больше опорного + swap(nums, i, j) // Поменять эти два элемента местами + } + swap(nums, i, left) // Переместить опорный элемент на границу двух подмассивов + return i // Вернуть индекс опорного элемента +} + +/* Быстрая сортировка */ +fun quickSort(nums: IntArray, left: Int, right: Int) { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) return + // Разбиение с опорными указателями + val pivot = partition(nums, left, right) + // Рекурсивно обработать левый и правый подмассивы + quickSort(nums, left, pivot - 1) + quickSort(nums, pivot + 1, right) +} + +/* Выбрать медиану из трех кандидатов */ +fun medianThree(nums: IntArray, left: Int, mid: Int, right: Int): Int { + val l = nums[left] + val m = nums[mid] + val r = nums[right] + if ((m in l..r) || (m in r..l)) + return mid // m находится между l и r + if ((l in m..r) || (l in r..m)) + return left // l находится между m и r + return right +} + +/* Разбиение с опорными указателями (медиана трех) */ +fun partitionMedian(nums: IntArray, left: Int, right: Int): Int { + // Выбрать медиану из трех кандидатов + val med = medianThree(nums, left, (left + right) / 2, right) + // Переместить медиану в крайний левый элемент массива + swap(nums, left, med) + // Взять nums[left] в качестве опорного элемента + var i = left + var j = right + while (i < j) { + while (i < j && nums[j] >= nums[left]) + j-- // Идти справа налево в поисках первого элемента меньше опорного + while (i < j && nums[i] <= nums[left]) + i++ // Идти слева направо в поисках первого элемента больше опорного + swap(nums, i, j) // Поменять эти два элемента местами + } + swap(nums, i, left) // Переместить опорный элемент на границу двух подмассивов + return i // Вернуть индекс опорного элемента +} + +/* Быстрая сортировка */ +fun quickSortMedian(nums: IntArray, left: Int, right: Int) { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) return + // Разбиение с опорными указателями + val pivot = partitionMedian(nums, left, right) + // Рекурсивно обработать левый и правый подмассивы + quickSort(nums, left, pivot - 1) + quickSort(nums, pivot + 1, right) +} + +/* Быстрая сортировка (оптимизация глубины рекурсии) */ +fun quickSortTailCall(nums: IntArray, left: Int, right: Int) { + // Завершить, когда длина подмассива равна 1 + var l = left + var r = right + while (l < r) { + // Операция разбиения с опорными указателями + val pivot = partition(nums, l, r) + // Выполнить быструю сортировку для более короткого из двух подмассивов + if (pivot - l < r - pivot) { + quickSort(nums, l, pivot - 1) // Рекурсивно отсортировать левый подмассив + l = pivot + 1 // Оставшийся неотсортированный диапазон: [pivot + 1, right] + } else { + quickSort(nums, pivot + 1, r) // Рекурсивно отсортировать правый подмассив + r = pivot - 1 // Оставшийся неотсортированный диапазон: [left, pivot - 1] + } + } +} + +/* Driver Code */ +fun main() { + /* Быстрая сортировка */ + val nums = intArrayOf(2, 4, 1, 0, 3, 5) + quickSort(nums, 0, nums.size - 1) + println("После быстрой сортировки nums = ${nums.contentToString()}") + + /* Быстрая сортировка (оптимизация медианным опорным элементом) */ + val nums1 = intArrayOf(2, 4, 1, 0, 3, 5) + quickSortMedian(nums1, 0, nums1.size - 1) + println("После быстрой сортировки (оптимизация медианным опорным элементом) nums1 = ${nums1.contentToString()}") + + /* Быстрая сортировка (оптимизация глубины рекурсии) */ + val nums2 = intArrayOf(2, 4, 1, 0, 3, 5) + quickSortTailCall(nums2, 0, nums2.size - 1) + println("После быстрой сортировки (оптимизация глубины рекурсии) nums2 = ${nums2.contentToString()}") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_sorting/radix_sort.kt b/ru/codes/kotlin/chapter_sorting/radix_sort.kt new file mode 100644 index 000000000..e5219d589 --- /dev/null +++ b/ru/codes/kotlin/chapter_sorting/radix_sort.kt @@ -0,0 +1,68 @@ +/** + * File: radix_sort.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_sorting + +/* Получить k-й разряд элемента num, где exp = 10^(k-1) */ +fun digit(num: Int, exp: Int): Int { + // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени + return (num / exp) % 10 +} + +/* Сортировка подсчетом (сортировка по k-му разряду nums) */ +fun countingSortDigit(nums: IntArray, exp: Int) { + // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10 + val counter = IntArray(10) + val n = nums.size + // Подсчитать число появлений каждой цифры от 0 до 9 + for (i in 0.. m) m = num + var exp = 1 + // Проходить разряды от младшего к старшему + while (exp <= m) { + // Выполнить сортировку подсчетом по k-му разряду элементов массива + // k = 1 -> exp = 1 + // k = 2 -> exp = 10 + // то есть exp = 10^(k-1) + countingSortDigit(nums, exp) + exp *= 10 + } +} + +/* Driver Code */ +fun main() { + // Поразрядная сортировка + val nums = intArrayOf( + 10546151, 35663510, 42865989, 34862445, 81883077, + 88906420, 72429244, 30524779, 82060337, 63832996 + ) + radixSort(nums) + println("После поразрядной сортировки nums = ${nums.contentToString()}") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_sorting/selection_sort.kt b/ru/codes/kotlin/chapter_sorting/selection_sort.kt new file mode 100644 index 000000000..a85478cda --- /dev/null +++ b/ru/codes/kotlin/chapter_sorting/selection_sort.kt @@ -0,0 +1,32 @@ +/** + * File: selection_sort.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_sorting + +/* Сортировка выбором */ +fun selectionSort(nums: IntArray) { + val n = nums.size + // Внешний цикл: неотсортированный диапазон [i, n-1] + for (i in 0..() + + /* Получение длины стека */ + fun size(): Int { + return stack.size + } + + /* Проверка, пуст ли стек */ + fun isEmpty(): Boolean { + return size() == 0 + } + + /* Поместить в стек */ + fun push(num: Int) { + stack.add(num) + } + + /* Извлечь из стека */ + fun pop(): Int { + if (isEmpty()) throw IndexOutOfBoundsException() + return stack.removeAt(size() - 1) + } + + /* Доступ к верхнему элементу стека */ + fun peek(): Int { + if (isEmpty()) throw IndexOutOfBoundsException() + return stack[size() - 1] + } + + /* Преобразовать List в Array и вернуть */ + fun toArray(): Array { + return stack.toTypedArray() + } +} + +/* Driver Code */ +fun main() { + /* Инициализация стека */ + val stack = ArrayStack() + + /* Помещение элемента в стек */ + stack.push(1) + stack.push(3) + stack.push(2) + stack.push(5) + stack.push(4) + println("Стек stack = ${stack.toArray().contentToString()}") + + /* Доступ к верхнему элементу стека */ + val peek = stack.peek() + println("Верхний элемент peek = $peek") + + /* Извлечение элемента из стека */ + val pop = stack.pop() + println("Извлеченный элемент pop = $pop, stack после извлечения = ${stack.toArray().contentToString()}") + + /* Получение длины стека */ + val size = stack.size() + println("Длина стека size = $size") + + /* Проверка на пустоту */ + val isEmpty = stack.isEmpty() + println("Пуст ли стек = $isEmpty") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_stack_and_queue/deque.kt b/ru/codes/kotlin/chapter_stack_and_queue/deque.kt new file mode 100644 index 000000000..7ca3d51cb --- /dev/null +++ b/ru/codes/kotlin/chapter_stack_and_queue/deque.kt @@ -0,0 +1,45 @@ +/** + * File: deque.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_stack_and_queue + +import java.util.* + +/* Driver Code */ +fun main() { + /* Инициализация двусторонней очереди */ + val deque = LinkedList() + deque.offerLast(3) + deque.offerLast(2) + deque.offerLast(5) + println("Двусторонняя очередь deque = $deque") + + /* Доступ к элементу */ + val peekFirst = deque.peekFirst() + println("Первый элемент peekFirst = $peekFirst") + val peekLast = deque.peekLast() + println("Последний элемент peekLast = $peekLast") + + /* Добавление элемента в очередь */ + deque.offerLast(4) + println("После добавления элемента 4 в хвост deque = $deque") + deque.offerFirst(1) + println("После добавления элемента 1 в голову deque = $deque") + + /* Извлечение элемента из очереди */ + val popLast = deque.pollLast() + println("Извлеченный из хвоста элемент = $popLast, deque после извлечения из хвоста = $deque") + val popFirst = deque.pollFirst() + println("Извлеченный из головы элемент = $popFirst, deque после извлечения из головы = $deque") + + /* Получение длины двусторонней очереди */ + val size = deque.size + println("Длина двусторонней очереди size = $size") + + /* Проверка, пуста ли двусторонняя очередь */ + val isEmpty = deque.isEmpty() + println("Пуста ли двусторонняя очередь = $isEmpty") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_stack_and_queue/linkedlist_deque.kt b/ru/codes/kotlin/chapter_stack_and_queue/linkedlist_deque.kt new file mode 100644 index 000000000..60ee5381d --- /dev/null +++ b/ru/codes/kotlin/chapter_stack_and_queue/linkedlist_deque.kt @@ -0,0 +1,163 @@ +/** + * File: linkedlist_deque.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_stack_and_queue + +/* Узел двусвязного списка */ +class ListNode(var _val: Int) { + // Значение узла + var next: ListNode? = null // Ссылка на узел-преемник + var prev: ListNode? = null // Ссылка на узел-предшественник +} + +/* Двусторонняя очередь на основе двусвязного списка */ +class LinkedListDeque { + private var front: ListNode? = null // Головной узел front + private var rear: ListNode? = null // Хвостовой узел rear + private var queSize: Int = 0 // Длина двусторонней очереди + + /* Получение длины двусторонней очереди */ + fun size(): Int { + return queSize + } + + /* Проверка, пуста ли двусторонняя очередь */ + fun isEmpty(): Boolean { + return size() == 0 + } + + /* Операция добавления в очередь */ + fun push(num: Int, isFront: Boolean) { + val node = ListNode(num) + // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node + if (isEmpty()) { + rear = node + front = rear + // Операция добавления в голову очереди + } else if (isFront) { + // Добавить node в голову списка + front?.prev = node + node.next = front + front = node // Обновить головной узел + // Операция добавления в хвост очереди + } else { + // Добавить node в хвост списка + rear?.next = node + node.prev = rear + rear = node // Обновить хвостовой узел + } + queSize++ // Обновить длину очереди + } + + /* Добавление в голову очереди */ + fun pushFirst(num: Int) { + push(num, true) + } + + /* Добавление в хвост очереди */ + fun pushLast(num: Int) { + push(num, false) + } + + /* Операция извлечения из очереди */ + fun pop(isFront: Boolean): Int { + if (isEmpty()) + throw IndexOutOfBoundsException() + val _val: Int + // Операция извлечения из головы очереди + if (isFront) { + _val = front!!._val // Временно сохранить значение головного узла + // Удалить головной узел + val fNext = front!!.next + if (fNext != null) { + fNext.prev = null + front!!.next = null + } + front = fNext // Обновить головной узел + // Операция извлечения из хвоста очереди + } else { + _val = rear!!._val // Временно сохранить значение хвостового узла + // Удалить хвостовой узел + val rPrev = rear!!.prev + if (rPrev != null) { + rPrev.next = null + rear!!.prev = null + } + rear = rPrev // Обновить хвостовой узел + } + queSize-- // Обновить длину очереди + return _val + } + + /* Извлечение из головы очереди */ + fun popFirst(): Int { + return pop(true) + } + + /* Извлечение из хвоста очереди */ + fun popLast(): Int { + return pop(false) + } + + /* Доступ к элементу в начале очереди */ + fun peekFirst(): Int { + if (isEmpty()) throw IndexOutOfBoundsException() + return front!!._val + } + + /* Доступ к элементу в конце очереди */ + fun peekLast(): Int { + if (isEmpty()) throw IndexOutOfBoundsException() + return rear!!._val + } + + /* Вернуть массив для вывода */ + fun toArray(): IntArray { + var node = front + val res = IntArray(size()) + for (i in res.indices) { + res[i] = node!!._val + node = node.next + } + return res + } +} + +/* Driver Code */ +fun main() { + /* Инициализация двусторонней очереди */ + val deque = LinkedListDeque() + deque.pushLast(3) + deque.pushLast(2) + deque.pushLast(5) + println("Двусторонняя очередь deque = ${deque.toArray().contentToString()}") + + /* Доступ к элементу */ + val peekFirst = deque.peekFirst() + println("Первый элемент peekFirst = $peekFirst") + val peekLast = deque.peekLast() + println("Последний элемент peekLast = $peekLast") + + /* Добавление элемента в очередь */ + deque.pushLast(4) + println("После добавления элемента 4 в хвост deque = ${deque.toArray().contentToString()}") + deque.pushFirst(1) + println("После добавления элемента 1 в голову deque = ${deque.toArray().contentToString()}") + + /* Извлечение элемента из очереди */ + val popLast = deque.popLast() + println("Извлеченный из хвоста элемент = ${popLast}, deque после извлечения из хвоста = ${deque.toArray().contentToString()}") + val popFirst = deque.popFirst() + println("Извлеченный из головы элемент = ${popFirst}, deque после извлечения из головы = ${deque.toArray().contentToString()}") + + /* Получение длины двусторонней очереди */ + val size = deque.size() + println("Длина двусторонней очереди size = $size") + + /* Проверка, пуста ли двусторонняя очередь */ + val isEmpty = deque.isEmpty() + println("Пуста ли двусторонняя очередь = $isEmpty") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_stack_and_queue/linkedlist_queue.kt b/ru/codes/kotlin/chapter_stack_and_queue/linkedlist_queue.kt new file mode 100644 index 000000000..cfa2ad477 --- /dev/null +++ b/ru/codes/kotlin/chapter_stack_and_queue/linkedlist_queue.kt @@ -0,0 +1,98 @@ +/** + * File: linkedlist_queue.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_stack_and_queue + +/* Очередь на основе связного списка */ +class LinkedListQueue( + // Головной узел front, хвостовой узел rear + private var front: ListNode? = null, + private var rear: ListNode? = null, + private var queSize: Int = 0 +) { + + /* Получение длины очереди */ + fun size(): Int { + return queSize + } + + /* Проверка, пуста ли очередь */ + fun isEmpty(): Boolean { + return size() == 0 + } + + /* Поместить в очередь */ + fun push(num: Int) { + // Добавить num после хвостового узла + val node = ListNode(num) + // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел + if (front == null) { + front = node + rear = node + // Если очередь не пуста, добавить этот узел после хвостового узла + } else { + rear?.next = node + rear = node + } + queSize++ + } + + /* Извлечь из очереди */ + fun pop(): Int { + val num = peek() + // Удалить головной узел + front = front?.next + queSize-- + return num + } + + /* Доступ к элементу в начале очереди */ + fun peek(): Int { + if (isEmpty()) throw IndexOutOfBoundsException() + return front!!._val + } + + /* Преобразовать связный список в Array и вернуть */ + fun toArray(): IntArray { + var node = front + val res = IntArray(size()) + for (i in res.indices) { + res[i] = node!!._val + node = node.next + } + return res + } +} + +/* Driver Code */ +fun main() { + /* Инициализация очереди */ + val queue = LinkedListQueue() + + /* Добавление элемента в очередь */ + queue.push(1) + queue.push(3) + queue.push(2) + queue.push(5) + queue.push(4) + println("Очередь queue = ${queue.toArray().contentToString()}") + + /* Доступ к элементу в начале очереди */ + val peek = queue.peek() + println("Первый элемент peek = $peek") + + /* Извлечение элемента из очереди */ + val pop = queue.pop() + println("Извлеченный элемент pop = $pop, queue после извлечения = ${queue.toArray().contentToString()}") + + /* Получение длины очереди */ + val size = queue.size() + println("Длина очереди size = $size") + + /* Проверка, пуста ли очередь */ + val isEmpty = queue.isEmpty() + println("Пуста ли очередь = $isEmpty") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_stack_and_queue/linkedlist_stack.kt b/ru/codes/kotlin/chapter_stack_and_queue/linkedlist_stack.kt new file mode 100644 index 000000000..ab4e41a73 --- /dev/null +++ b/ru/codes/kotlin/chapter_stack_and_queue/linkedlist_stack.kt @@ -0,0 +1,87 @@ +/** + * File: linkedlist_stack.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_stack_and_queue + +/* Стек на основе связного списка */ +class LinkedListStack( + private var stackPeek: ListNode? = null, // Использовать головной узел как вершину стека + private var stkSize: Int = 0 // Длина стека +) { + + /* Получение длины стека */ + fun size(): Int { + return stkSize + } + + /* Проверка, пуст ли стек */ + fun isEmpty(): Boolean { + return size() == 0 + } + + /* Поместить в стек */ + fun push(num: Int) { + val node = ListNode(num) + node.next = stackPeek + stackPeek = node + stkSize++ + } + + /* Извлечь из стека */ + fun pop(): Int? { + val num = peek() + stackPeek = stackPeek?.next + stkSize-- + return num + } + + /* Доступ к верхнему элементу стека */ + fun peek(): Int? { + if (isEmpty()) throw IndexOutOfBoundsException() + return stackPeek?._val + } + + /* Преобразовать List в Array и вернуть */ + fun toArray(): IntArray { + var node = stackPeek + val res = IntArray(size()) + for (i in res.size - 1 downTo 0) { + res[i] = node?._val!! + node = node.next + } + return res + } +} + +/* Driver Code */ +fun main() { + /* Инициализация стека */ + val stack = LinkedListStack() + + /* Помещение элемента в стек */ + stack.push(1) + stack.push(3) + stack.push(2) + stack.push(5) + stack.push(4) + println("Стек stack = ${stack.toArray().contentToString()}") + + /* Доступ к верхнему элементу стека */ + val peek = stack.peek()!! + println("Верхний элемент peek = $peek") + + /* Извлечение элемента из стека */ + val pop = stack.pop()!! + println("Извлеченный элемент pop = $pop, stack после извлечения = ${stack.toArray().contentToString()}") + + /* Получение длины стека */ + val size = stack.size() + println("Длина стека size = $size") + + /* Проверка на пустоту */ + val isEmpty = stack.isEmpty() + println("Пуст ли стек = $isEmpty") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_stack_and_queue/queue.kt b/ru/codes/kotlin/chapter_stack_and_queue/queue.kt new file mode 100644 index 000000000..08013d55c --- /dev/null +++ b/ru/codes/kotlin/chapter_stack_and_queue/queue.kt @@ -0,0 +1,39 @@ +/** + * File: queue.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_stack_and_queue + +import java.util.* + +/* Driver Code */ +fun main() { + /* Инициализация очереди */ + val queue = LinkedList() + + /* Добавление элемента в очередь */ + queue.offer(1) + queue.offer(3) + queue.offer(2) + queue.offer(5) + queue.offer(4) + println("Очередь queue = $queue") + + /* Доступ к элементу в начале очереди */ + val peek = queue.peek() + println("Первый элемент peek = $peek") + + /* Извлечение элемента из очереди */ + val pop = queue.poll() + println("Извлеченный элемент pop = $pop, queue после извлечения = $queue") + + /* Получение длины очереди */ + val size = queue.size + println("Длина очереди size = $size") + + /* Проверка, пуста ли очередь */ + val isEmpty = queue.isEmpty() + println("Пуста ли очередь = $isEmpty") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_stack_and_queue/stack.kt b/ru/codes/kotlin/chapter_stack_and_queue/stack.kt new file mode 100644 index 000000000..0acd3db8c --- /dev/null +++ b/ru/codes/kotlin/chapter_stack_and_queue/stack.kt @@ -0,0 +1,39 @@ +/** + * File: stack.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_stack_and_queue + +import java.util.* + +/* Driver Code */ +fun main() { + /* Инициализация стека */ + val stack = Stack() + + /* Помещение элемента в стек */ + stack.push(1) + stack.push(3) + stack.push(2) + stack.push(5) + stack.push(4) + println("Стек stack = $stack") + + /* Доступ к верхнему элементу стека */ + val peek = stack.peek() + println("Верхний элемент peek = $peek") + + /* Извлечение элемента из стека */ + val pop = stack.pop() + println("Извлеченный элемент pop = $pop, stack после извлечения = $stack") + + /* Получение длины стека */ + val size = stack.size + println("Длина стека size = $size") + + /* Проверка на пустоту */ + val isEmpty = stack.isEmpty() + println("Пуст ли стек = $isEmpty") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_tree/array_binary_tree.kt b/ru/codes/kotlin/chapter_tree/array_binary_tree.kt new file mode 100644 index 000000000..11a5e33af --- /dev/null +++ b/ru/codes/kotlin/chapter_tree/array_binary_tree.kt @@ -0,0 +1,127 @@ +/** + * File: array_binary_tree.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_tree + +import utils.TreeNode +import utils.printTree + +/* Класс двоичного дерева в массивном представлении */ +class ArrayBinaryTree(private val tree: MutableList) { + /* Вместимость списка */ + fun size(): Int { + return tree.size + } + + /* Получить значение узла с индексом i */ + fun _val(i: Int): Int? { + // Если индекс выходит за границы, вернуть null, обозначающий пустую позицию + if (i < 0 || i >= size()) return null + return tree[i] + } + + /* Получить индекс левого дочернего узла узла с индексом i */ + fun left(i: Int): Int { + return 2 * i + 1 + } + + /* Получить индекс правого дочернего узла узла с индексом i */ + fun right(i: Int): Int { + return 2 * i + 2 + } + + /* Получить индекс родительского узла узла с индексом i */ + fun parent(i: Int): Int { + return (i - 1) / 2 + } + + /* Обход в ширину */ + fun levelOrder(): MutableList { + val res = mutableListOf() + // Непосредственно обходить массив + for (i in 0..) { + // Если это пустая позиция, вернуть + if (_val(i) == null) + return + // Предварительный обход + if ("pre" == order) + res.add(_val(i)) + dfs(left(i), order, res) + // Симметричный обход + if ("in" == order) + res.add(_val(i)) + dfs(right(i), order, res) + // Обратный обход + if ("post" == order) + res.add(_val(i)) + } + + /* Предварительный обход */ + fun preOrder(): MutableList { + val res = mutableListOf() + dfs(0, "pre", res) + return res + } + + /* Симметричный обход */ + fun inOrder(): MutableList { + val res = mutableListOf() + dfs(0, "in", res) + return res + } + + /* Обратный обход */ + fun postOrder(): MutableList { + val res = mutableListOf() + dfs(0, "post", res) + return res + } +} + +/* Driver Code */ +fun main() { + // Инициализировать двоичное дерево + // Здесь используется функция, напрямую строящая двоичное дерево из списка + val arr = mutableListOf(1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15) + + val root = TreeNode.listToTree(arr) + println("\nИнициализация двоичного дерева\n") + println("Массивное представление двоичного дерева:") + println(arr) + println("Связное представление двоичного дерева:") + printTree(root) + + // Класс двоичного дерева в массивном представлении + val abt = ArrayBinaryTree(arr) + + // Доступ к узлу + val i = 1 + val l = abt.left(i) + val r = abt.right(i) + val p = abt.parent(i) + println("Текущий узел: индекс = $i, значение = ${abt._val(i)}") + println("Индекс левого дочернего узла = $l, значение = ${abt._val(l)}") + println("Индекс правого дочернего узла = $r, значение = ${abt._val(r)}") + println("Индекс родительского узла = $p, значение = ${abt._val(p)}") + + // Обходить дерево + var res = abt.levelOrder() + println("\nОбход в ширину = $res") + res = abt.preOrder() + println("Предварительный обход = $res") + res = abt.inOrder() + println("Симметричный обход = $res") + res = abt.postOrder() + println("Обратный обход = $res") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_tree/avl_tree.kt b/ru/codes/kotlin/chapter_tree/avl_tree.kt new file mode 100644 index 000000000..5394734b7 --- /dev/null +++ b/ru/codes/kotlin/chapter_tree/avl_tree.kt @@ -0,0 +1,223 @@ +/** + * File: avl_tree.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_tree + +import utils.TreeNode +import utils.printTree +import kotlin.math.max + +/* AVL-дерево */ +class AVLTree { + var root: TreeNode? = null // Корневой узел + + /* Получить высоту узла */ + fun height(node: TreeNode?): Int { + // Высота пустого узла равна -1, высота листового узла равна 0 + return node?.height ?: -1 + } + + /* Обновить высоту узла */ + private fun updateHeight(node: TreeNode?) { + // Высота узла равна высоте более высокого поддерева + 1 + node?.height = max(height(node?.left), height(node?.right)) + 1 + } + + /* Получить коэффициент баланса */ + fun balanceFactor(node: TreeNode?): Int { + // Коэффициент баланса пустого узла равен 0 + if (node == null) return 0 + // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева + return height(node.left) - height(node.right) + } + + /* Операция правого вращения */ + private fun rightRotate(node: TreeNode?): TreeNode { + val child = node!!.left + val grandChild = child!!.right + // Выполнить правое вращение узла node вокруг child + child.right = node + node.left = grandChild + // Обновить высоту узла + updateHeight(node) + updateHeight(child) + // Вернуть корневой узел поддерева после вращения + return child + } + + /* Операция левого вращения */ + private fun leftRotate(node: TreeNode?): TreeNode { + val child = node!!.right + val grandChild = child!!.left + // Выполнить левое вращение узла node вокруг child + child.left = node + node.right = grandChild + // Обновить высоту узла + updateHeight(node) + updateHeight(child) + // Вернуть корневой узел поддерева после вращения + return child + } + + /* Выполнить вращение, чтобы снова сбалансировать поддерево */ + private fun rotate(node: TreeNode): TreeNode { + // Получить коэффициент баланса узла node + val balanceFactor = balanceFactor(node) + // Левосторонне перекошенное дерево + if (balanceFactor > 1) { + if (balanceFactor(node.left) >= 0) { + // Правое вращение + return rightRotate(node) + } else { + // Сначала левое вращение, затем правое + node.left = leftRotate(node.left) + return rightRotate(node) + } + } + // Правосторонне перекошенное дерево + if (balanceFactor < -1) { + if (balanceFactor(node.right) <= 0) { + // Левое вращение + return leftRotate(node) + } else { + // Сначала правое вращение, затем левое + node.right = rightRotate(node.right) + return leftRotate(node) + } + } + // Дерево сбалансировано, вращение не требуется, вернуть сразу + return node + } + + /* Вставка узла */ + fun insert(_val: Int) { + root = insertHelper(root, _val) + } + + /* Рекурсивная вставка узла (вспомогательный метод) */ + private fun insertHelper(n: TreeNode?, _val: Int): TreeNode { + if (n == null) + return TreeNode(_val) + var node = n + /* 1. Найти позицию вставки и вставить узел */ + if (_val < node._val) + node.left = insertHelper(node.left, _val) + else if (_val > node._val) + node.right = insertHelper(node.right, _val) + else + return node // Повторяющийся узел не вставлять, сразу вернуть + updateHeight(node) // Обновить высоту узла + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = rotate(node) + // Вернуть корневой узел поддерева + return node + } + + /* Удаление узла */ + fun remove(_val: Int) { + root = removeHelper(root, _val) + } + + /* Рекурсивное удаление узла (вспомогательный метод) */ + private fun removeHelper(n: TreeNode?, _val: Int): TreeNode? { + var node = n ?: return null + /* 1. Найти узел и удалить его */ + if (_val < node._val) + node.left = removeHelper(node.left, _val) + else if (_val > node._val) + node.right = removeHelper(node.right, _val) + else { + if (node.left == null || node.right == null) { + val child = if (node.left != null) + node.left + else + node.right + // Число дочерних узлов = 0, удалить node и сразу вернуть + if (child == null) + return null + // Число дочерних узлов = 1, удалить node напрямую + else + node = child + } else { + // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел + var temp = node.right + while (temp!!.left != null) { + temp = temp.left + } + node.right = removeHelper(node.right, temp._val) + node._val = temp._val + } + } + updateHeight(node) // Обновить высоту узла + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = rotate(node) + // Вернуть корневой узел поддерева + return node + } + + /* Поиск узла */ + fun search(_val: Int): TreeNode? { + var cur = root + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Целевой узел находится в правом поддереве cur + cur = if (cur._val < _val) + cur.right!! + // Целевой узел находится в левом поддереве cur + else if (cur._val > _val) + cur.left + // Найти целевой узел и выйти из цикла + else + break + } + // Вернуть целевой узел + return cur + } +} + +fun testInsert(tree: AVLTree, _val: Int) { + tree.insert(_val) + println("\nПосле вставки узла $_val AVL-дерево имеет вид") + printTree(tree.root) +} + +fun testRemove(tree: AVLTree, _val: Int) { + tree.remove(_val) + println("\nПосле удаления узла $_val AVL-дерево имеет вид") + printTree(tree.root) +} + +/* Driver Code */ +fun main() { + /* Инициализация пустого AVL-дерева */ + val avlTree = AVLTree() + + /* Вставка узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после вставки узла + testInsert(avlTree, 1) + testInsert(avlTree, 2) + testInsert(avlTree, 3) + testInsert(avlTree, 4) + testInsert(avlTree, 5) + testInsert(avlTree, 8) + testInsert(avlTree, 7) + testInsert(avlTree, 9) + testInsert(avlTree, 10) + testInsert(avlTree, 6) + + /* Вставка повторяющегося узла */ + testInsert(avlTree, 7) + + /* Удаление узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после удаления узла + testRemove(avlTree, 8) // Удаление узла степени 0 + testRemove(avlTree, 5) // Удаление узла степени 1 + testRemove(avlTree, 4) // Удаление узла степени 2 + + /* Поиск узла */ + val node = avlTree.search(7) + println("\nНайденный объект узла = $node, значение узла = ${node?._val}") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_tree/binary_search_tree.kt b/ru/codes/kotlin/chapter_tree/binary_search_tree.kt new file mode 100644 index 000000000..e4f62f43a --- /dev/null +++ b/ru/codes/kotlin/chapter_tree/binary_search_tree.kt @@ -0,0 +1,157 @@ +/** + * File: binary_search_tree.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_tree + +import utils.TreeNode +import utils.printTree + +/* Двоичное дерево поиска */ +class BinarySearchTree { + // Инициализировать пустое дерево + private var root: TreeNode? = null + + /* Получить корневой узел двоичного дерева */ + fun getRoot(): TreeNode? { + return root + } + + /* Поиск узла */ + fun search(num: Int): TreeNode? { + var cur = root + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Целевой узел находится в правом поддереве cur + cur = if (cur._val < num) + cur.right + // Целевой узел находится в левом поддереве cur + else if (cur._val > num) + cur.left + // Найти целевой узел и выйти из цикла + else + break + } + // Вернуть целевой узел + return cur + } + + /* Вставка узла */ + fun insert(num: Int) { + // Если дерево пусто, инициализировать корневой узел + if (root == null) { + root = TreeNode(num) + return + } + var cur = root + var pre: TreeNode? = null + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Найти повторяющийся узел и сразу вернуть + if (cur._val == num) + return + pre = cur + // Позиция вставки находится в правом поддереве cur + cur = if (cur._val < num) + cur.right + // Позиция вставки находится в левом поддереве cur + else + cur.left + } + // Вставка узла + val node = TreeNode(num) + if (pre?._val!! < num) + pre.right = node + else + pre.left = node + } + + /* Удаление узла */ + fun remove(num: Int) { + // Если дерево пусто, сразу вернуть + if (root == null) + return + var cur = root + var pre: TreeNode? = null + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Найти узел для удаления и выйти из цикла + if (cur._val == num) + break + pre = cur + // Узел для удаления находится в правом поддереве cur + cur = if (cur._val < num) + cur.right + // Узел для удаления находится в левом поддереве cur + else + cur.left + } + // Если узел для удаления отсутствует, сразу вернуть + if (cur == null) + return + // Число дочерних узлов = 0 или 1 + if (cur.left == null || cur.right == null) { + // Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел + val child = if (cur.left != null) + cur.left + else + cur.right + // Удалить узел cur + if (cur != root) { + if (pre!!.left == cur) + pre.left = child + else + pre.right = child + } else { + // Если удаляемый узел является корнем, заново назначить корневой узел + root = child + } + // Число дочерних узлов = 2 + } else { + // Получить следующий узел после cur в симметричном обходе + var tmp = cur.right + while (tmp!!.left != null) { + tmp = tmp.left + } + // Рекурсивно удалить узел tmp + remove(tmp._val) + // Перезаписать cur значением tmp + cur._val = tmp._val + } + } +} + +/* Driver Code */ +fun main() { + /* Инициализация двоичного дерева поиска */ + val bst = BinarySearchTree() + // Обратите внимание: разные порядки вставки порождают разные двоичные деревья; данная последовательность может построить совершенное двоичное дерево + val nums = intArrayOf(8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15) + for (num in nums) { + bst.insert(num) + } + println("\nИсходное двоичное дерево\n") + printTree(bst.getRoot()) + + /* Поиск узла */ + val node = bst.search(7) + println("Найденный объект узла = $node, значение узла = ${node?._val}") + + /* Вставка узла */ + bst.insert(16) + println("\nПосле вставки узла 16 двоичное дерево имеет вид\n") + printTree(bst.getRoot()) + + /* Удаление узла */ + bst.remove(1) + println("\nПосле удаления узла 1 двоичное дерево имеет вид\n") + printTree(bst.getRoot()) + bst.remove(2) + println("\nПосле удаления узла 2 двоичное дерево имеет вид\n") + printTree(bst.getRoot()) + bst.remove(4) + println("\nПосле удаления узла 4 двоичное дерево имеет вид\n") + printTree(bst.getRoot()) +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_tree/binary_tree.kt b/ru/codes/kotlin/chapter_tree/binary_tree.kt new file mode 100644 index 000000000..d97ce3846 --- /dev/null +++ b/ru/codes/kotlin/chapter_tree/binary_tree.kt @@ -0,0 +1,40 @@ +/** + * File: binary_tree.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_tree + +import utils.TreeNode +import utils.printTree + +/* Driver Code */ +fun main() { + /* Инициализация двоичного дерева */ + // Инициализация узла + val n1 = TreeNode(1) + val n2 = TreeNode(2) + val n3 = TreeNode(3) + val n4 = TreeNode(4) + val n5 = TreeNode(5) + // Построить связи между узлами (указатели) + n1.left = n2 + n1.right = n3 + n2.left = n4 + n2.right = n5 + println("\nИнициализация двоичного дерева\n") + printTree(n1) + + /* Вставка и удаление узлов */ + val P = TreeNode(0) + // Вставить узел P между n1 -> n2 + n1.left = P + P.left = n2 + println("\nПосле вставки узла P\n") + printTree(n1) + // Удалить узел P + n1.left = n2 + println("\nПосле удаления узла P\n") + printTree(n1) +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_tree/binary_tree_bfs.kt b/ru/codes/kotlin/chapter_tree/binary_tree_bfs.kt new file mode 100644 index 000000000..f8afdf7a0 --- /dev/null +++ b/ru/codes/kotlin/chapter_tree/binary_tree_bfs.kt @@ -0,0 +1,42 @@ +/** + * File: binary_tree_bfs.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_tree + +import utils.TreeNode +import utils.printTree +import java.util.* + +/* Обход в ширину */ +fun levelOrder(root: TreeNode?): MutableList { + // Инициализировать очередь и добавить корневой узел + val queue = LinkedList() + queue.add(root) + // Инициализировать список для хранения последовательности обхода + val list = mutableListOf() + while (queue.isNotEmpty()) { + val node = queue.poll() // Извлечение из очереди + list.add(node?._val!!) // Сохранить значение узла + if (node.left != null) + queue.offer(node.left) // Поместить левый дочерний узел в очередь + if (node.right != null) + queue.offer(node.right) // Поместить правый дочерний узел в очередь + } + return list +} + +/* Driver Code */ +fun main() { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из списка + val root = TreeNode.listToTree(mutableListOf(1, 2, 3, 4, 5, 6, 7)) + println("\nИнициализация двоичного дерева\n") + printTree(root) + + /* Обход в ширину */ + val list = levelOrder(root) + println("\nПоследовательность печати узлов при обходе в ширину = $list") +} \ No newline at end of file diff --git a/ru/codes/kotlin/chapter_tree/binary_tree_dfs.kt b/ru/codes/kotlin/chapter_tree/binary_tree_dfs.kt new file mode 100644 index 000000000..aee0f1383 --- /dev/null +++ b/ru/codes/kotlin/chapter_tree/binary_tree_dfs.kt @@ -0,0 +1,64 @@ +/** + * File: binary_tree_dfs.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package chapter_tree + +import utils.TreeNode +import utils.printTree + +// Инициализировать список для хранения последовательности обхода +var list = mutableListOf() + +/* Предварительный обход */ +fun preOrder(root: TreeNode?) { + if (root == null) return + // Порядок обхода: корень -> левое поддерево -> правое поддерево + list.add(root._val) + preOrder(root.left) + preOrder(root.right) +} + +/* Симметричный обход */ +fun inOrder(root: TreeNode?) { + if (root == null) return + // Порядок обхода: левое поддерево -> корень -> правое поддерево + inOrder(root.left) + list.add(root._val) + inOrder(root.right) +} + +/* Обратный обход */ +fun postOrder(root: TreeNode?) { + if (root == null) return + // Порядок обхода: левое поддерево -> правое поддерево -> корень + postOrder(root.left) + postOrder(root.right) + list.add(root._val) +} + +/* Driver Code */ +fun main() { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из списка + val root = TreeNode.listToTree(mutableListOf(1, 2, 3, 4, 5, 6, 7)) + println("\nИнициализация двоичного дерева\n") + printTree(root) + + /* Предварительный обход */ + list.clear() + preOrder(root) + println("\nПоследовательность печати узлов при предварительном обходе = $list") + + /* Симметричный обход */ + list.clear() + inOrder(root) + println("\nПоследовательность печати узлов при симметричном обходе = $list") + + /* Обратный обход */ + list.clear() + postOrder(root) + println("\nПоследовательность печати узлов при обратном обходе = $list") +} \ No newline at end of file diff --git a/ru/codes/kotlin/utils/ListNode.kt b/ru/codes/kotlin/utils/ListNode.kt new file mode 100644 index 000000000..c19397faf --- /dev/null +++ b/ru/codes/kotlin/utils/ListNode.kt @@ -0,0 +1,25 @@ +/** + * File: ListNode.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package utils + +/* Узел связного списка */ +class ListNode(var _val: Int) { + var next: ListNode? = null + + companion object { + /* Десериализовать список в связный список */ + fun arrToLinkedList(arr: IntArray): ListNode? { + val dum = ListNode(0) + var head = dum + for (_val in arr) { + head.next = ListNode(_val) + head = head.next!! + } + return dum.next + } + } +} \ No newline at end of file diff --git a/ru/codes/kotlin/utils/PrintUtil.kt b/ru/codes/kotlin/utils/PrintUtil.kt new file mode 100644 index 000000000..69ccc1dd1 --- /dev/null +++ b/ru/codes/kotlin/utils/PrintUtil.kt @@ -0,0 +1,107 @@ +/** + * File: PrintUtil.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package utils + +import java.util.* + +class Trunk(var prev: Trunk?, var str: String) + +/* Вывести матрицу (Array) */ +fun printMatrix(matrix: Array>) { + println("[") + for (row in matrix) { + println(" $row,") + } + println("]") +} + +/* Вывести матрицу (List) */ +fun printMatrix(matrix: MutableList>) { + println("[") + for (row in matrix) { + println(" $row,") + } + println("]") +} + +/* Вывести связный список */ +fun printLinkedList(h: ListNode?) { + var head = h + val list = mutableListOf() + while (head != null) { + list.add(head._val.toString()) + head = head.next + } + println(list.joinToString(separator = " -> ")) +} + +/* Вывести двоичное дерево */ +fun printTree(root: TreeNode?) { + printTree(root, null, false) +} + +/** + * Вывести двоичное дерево + * Этот вывод дерева заимствован из TECHIE DELIGHT + * https://www.techiedelight.com/c-program-print-binary-tree/ + */ +fun printTree(root: TreeNode?, prev: Trunk?, isRight: Boolean) { + if (root == null) { + return + } + + var prevStr = " " + val trunk = Trunk(prev, prevStr) + + printTree(root.right, trunk, true) + + if (prev == null) { + trunk.str = "———" + } else if (isRight) { + trunk.str = "/———" + prevStr = " |" + } else { + trunk.str = "\\———" + prev.str = prevStr + } + + showTrunks(trunk) + println(" ${root._val}") + + if (prev != null) { + prev.str = prevStr + } + trunk.str = " |" + + printTree(root.left, trunk, false) +} + +fun showTrunks(p: Trunk?) { + if (p == null) { + return + } + showTrunks(p.prev) + print(p.str) +} + +/* Вывести хеш-таблицу */ +fun printHashMap(map: Map) { + for ((key, value) in map) { + println("${key.toString()} -> $value") + } +} + +/* Вывести кучу */ +fun printHeap(queue: Queue?) { + val list = mutableListOf() + queue?.let { list.addAll(it) } + print("Массивное представление кучи:") + println(list) + println("Древовидное представление кучи:") + val root = TreeNode.listToTree(list) + printTree(root) +} \ No newline at end of file diff --git a/ru/codes/kotlin/utils/TreeNode.kt b/ru/codes/kotlin/utils/TreeNode.kt new file mode 100644 index 000000000..86c86f098 --- /dev/null +++ b/ru/codes/kotlin/utils/TreeNode.kt @@ -0,0 +1,69 @@ +/** + * File: TreeNode.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package utils + +/* Класс узла двоичного дерева */ +/* Конструктор */ +class TreeNode( + var _val: Int // Значение узла +) { + var height: Int = 0 // Высота узла + var left: TreeNode? = null // Ссылка на левый дочерний узел + var right: TreeNode? = null // Ссылка на правый дочерний узел + + // Правила кодирования сериализации см.: + // https://www.hello-algo.com/chapter_tree/array_representation_of_tree/ + // Массивное представление двоичного дерева: + // [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15] + // Связное представление двоичного дерева: + // /——— 15 + // /——— 7 + // /——— 3 + // | \——— 6 + // | \——— 12 + // ——— 1 + // \——— 2 + // | /——— 9 + // \——— 4 + // \——— 8 + + /* Десериализовать список в двоичное дерево: рекурсия */ + companion object { + private fun listToTreeDFS(arr: MutableList, i: Int): TreeNode? { + if (i < 0 || i >= arr.size || arr[i] == null) { + return null + } + val root = TreeNode(arr[i]!!) + root.left = listToTreeDFS(arr, 2 * i + 1) + root.right = listToTreeDFS(arr, 2 * i + 2) + return root + } + + /* Десериализовать список в двоичное дерево */ + fun listToTree(arr: MutableList): TreeNode? { + return listToTreeDFS(arr, 0) + } + + /* Сериализовать двоичное дерево в список: рекурсия */ + private fun treeToListDFS(root: TreeNode?, i: Int, res: MutableList) { + if (root == null) return + while (i >= res.size) { + res.add(null) + } + res[i] = root._val + treeToListDFS(root.left, 2 * i + 1, res) + treeToListDFS(root.right, 2 * i + 2, res) + } + + /* Сериализовать двоичное дерево в список */ + fun treeToList(root: TreeNode?): MutableList { + val res = mutableListOf() + treeToListDFS(root, 0, res) + return res + } + } +} \ No newline at end of file diff --git a/ru/codes/kotlin/utils/Vertex.kt b/ru/codes/kotlin/utils/Vertex.kt new file mode 100644 index 000000000..3134bd276 --- /dev/null +++ b/ru/codes/kotlin/utils/Vertex.kt @@ -0,0 +1,30 @@ +/** + * File: Vertex.kt + * Created Time: 2024-01-25 + * Author: curtishd (1023632660@qq.com) + */ + +package utils + +/* Класс вершины */ +class Vertex(val _val: Int) { + companion object { + /* На вход подается список значений vals, на выходе возвращается список вершин vets */ + fun valsToVets(vals: IntArray): Array { + val vets = arrayOfNulls(vals.size) + for (i in vals.indices) { + vets[i] = Vertex(vals[i]) + } + return vets + } + + /* На вход подается список вершин vets, на выходе возвращается список значений vals */ + fun vetsToVals(vets: MutableList): MutableList { + val vals = mutableListOf() + for (vet in vets) { + vals.add(vet!!._val) + } + return vals + } + } +} \ No newline at end of file diff --git a/ru/codes/python/.gitignore b/ru/codes/python/.gitignore new file mode 100644 index 000000000..bee8a64b7 --- /dev/null +++ b/ru/codes/python/.gitignore @@ -0,0 +1 @@ +__pycache__ diff --git a/ru/codes/python/chapter_array_and_linkedlist/array.py b/ru/codes/python/chapter_array_and_linkedlist/array.py new file mode 100644 index 000000000..15955c67f --- /dev/null +++ b/ru/codes/python/chapter_array_and_linkedlist/array.py @@ -0,0 +1,100 @@ +""" +File: array.py +Created Time: 2022-11-25 +Author: krahets (krahets@163.com) +""" + +import random + + +def random_access(nums: list[int]) -> int: + """Случайный доступ к элементу""" + # Случайным образом выбрать число из интервала [0, len(nums)-1] + random_index = random.randint(0, len(nums) - 1) + # Получить и вернуть случайный элемент + random_num = nums[random_index] + return random_num + + +# Обратите внимание: list в Python — это динамический массив, его можно расширять напрямую +# Для удобства обучения в этой функции list рассматривается как массив неизменяемой длины +def extend(nums: list[int], enlarge: int) -> list[int]: + """Увеличить длину массива""" + # Инициализировать массив увеличенной длины + res = [0] * (len(nums) + enlarge) + # Скопировать все элементы исходного массива в новый массив + for i in range(len(nums)): + res[i] = nums[i] + # Вернуть новый массив после расширения + return res + + +def insert(nums: list[int], num: int, index: int): + """Вставить элемент num по индексу index в массив""" + # Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад + for i in range(len(nums) - 1, index, -1): + nums[i] = nums[i - 1] + # Присвоить num элементу по индексу index + nums[index] = num + + +def remove(nums: list[int], index: int): + """Удалить элемент по индексу index""" + # Сдвинуть все элементы после индекса index на одну позицию вперед + for i in range(index, len(nums) - 1): + nums[i] = nums[i + 1] + + +def traverse(nums: list[int]): + """Обход массива""" + count = 0 + # Обход массива по индексам + for i in range(len(nums)): + count += nums[i] + # Непосредственно обходить элементы массива + for num in nums: + count += num + # Одновременно обходить индексы и элементы данных + for i, num in enumerate(nums): + count += nums[i] + count += num + + +def find(nums: list[int], target: int) -> int: + """Найти заданный элемент в массиве""" + for i in range(len(nums)): + if nums[i] == target: + return i + return -1 + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация массива + arr = [0] * 5 + print("Массив arr =", arr) + nums = [1, 3, 2, 5, 4] + print("Массив nums =", nums) + + # Случайный доступ + random_num: int = random_access(nums) + print("Случайный элемент из nums =", random_num) + + # Расширение длины + nums: list[int] = extend(nums, 3) + print("После увеличения длины массива до 8 nums =", nums) + + # Вставка элемента + insert(nums, 6, 3) + print("После вставки числа 6 по индексу 3 nums =", nums) + + # Удаление элемента + remove(nums, 2) + print("После удаления элемента по индексу 2 nums =", nums) + + # Обход массива + traverse(nums) + + # Поиск элемента + index: int = find(nums, 3) + print("Поиск элемента 3 в nums: индекс =", index) diff --git a/ru/codes/python/chapter_array_and_linkedlist/linked_list.py b/ru/codes/python/chapter_array_and_linkedlist/linked_list.py new file mode 100644 index 000000000..f10174edc --- /dev/null +++ b/ru/codes/python/chapter_array_and_linkedlist/linked_list.py @@ -0,0 +1,85 @@ +""" +File: linked_list.py +Created Time: 2022-11-25 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import ListNode, print_linked_list + + +def insert(n0: ListNode, P: ListNode): + """Вставить узел P после узла n0 в связном списке""" + n1 = n0.next + P.next = n1 + n0.next = P + + +def remove(n0: ListNode): + """Удалить первый узел после узла n0 в связном списке""" + if not n0.next: + return + # n0 -> P -> n1 + P = n0.next + n1 = P.next + n0.next = n1 + + +def access(head: ListNode, index: int) -> ListNode | None: + """Доступ к узлу связного списка по индексу index""" + for _ in range(index): + if not head: + return None + head = head.next + return head + + +def find(head: ListNode, target: int) -> int: + """Найти в связном списке первый узел со значением target""" + index = 0 + while head: + if head.val == target: + return index + head = head.next + index += 1 + return -1 + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация связного списка + # Инициализация всех узлов + n0 = ListNode(1) + n1 = ListNode(3) + n2 = ListNode(2) + n3 = ListNode(5) + n4 = ListNode(4) + # Построить ссылки между узлами + n0.next = n1 + n1.next = n2 + n2.next = n3 + n3.next = n4 + print("Исходный связный список") + print_linked_list(n0) + + # Вставка узла + p = ListNode(0) + insert(n0, p) + print("Связный список после вставки узла") + print_linked_list(n0) + + # Удаление узла + remove(n0) + print("Связный список после удаления узла") + print_linked_list(n0) + + # Доступ к узлу + node: ListNode = access(n0, 3) + print("Значение узла по индексу 3 в связном списке = {}".format(node.val)) + + # Поиск узла + index: int = find(n0, 2) + print("Индекс узла со значением 2 в связном списке = {}".format(index)) diff --git a/ru/codes/python/chapter_array_and_linkedlist/list.py b/ru/codes/python/chapter_array_and_linkedlist/list.py new file mode 100644 index 000000000..0a77fadd5 --- /dev/null +++ b/ru/codes/python/chapter_array_and_linkedlist/list.py @@ -0,0 +1,56 @@ +""" +File: list.py +Created Time: 2022-11-25 +Author: krahets (krahets@163.com) +""" + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация списка + nums: list[int] = [1, 3, 2, 5, 4] + print("\nСписок nums =", nums) + + # Доступ к элементу + x: int = nums[1] + print("\nЭлемент по индексу 1: x =", x) + + # Обновление элемента + nums[1] = 0 + print("\nПосле обновления элемента по индексу 1 до 0 nums =", nums) + + # Очистить список + nums.clear() + print("\nПосле очистки списка nums =", nums) + + # Добавление элемента в конец + nums.append(1) + nums.append(3) + nums.append(2) + nums.append(5) + nums.append(4) + print("\nПосле добавления элементов nums =", nums) + + # Вставка элемента в середину + nums.insert(3, 6) + print("\nПосле вставки числа 6 по индексу 3 nums =", nums) + + # Удаление элемента + nums.pop(3) + print("\nПосле удаления элемента по индексу 3 nums =", nums) + + # Обходить список по индексам + count = 0 + for i in range(len(nums)): + count += nums[i] + # Непосредственно обходить элементы списка + for num in nums: + count += num + + # Объединить два списка + nums1 = [6, 8, 7, 10, 9] + nums += nums1 + print("\nПосле конкатенации списка nums1 к nums nums =", nums) + + # Отсортировать список + nums.sort() + print("\nПосле сортировки списка nums =", nums) diff --git a/ru/codes/python/chapter_array_and_linkedlist/my_list.py b/ru/codes/python/chapter_array_and_linkedlist/my_list.py new file mode 100644 index 000000000..08450f713 --- /dev/null +++ b/ru/codes/python/chapter_array_and_linkedlist/my_list.py @@ -0,0 +1,118 @@ +""" +File: my_list.py +Created Time: 2022-11-25 +Author: krahets (krahets@163.com) +""" + + +class MyList: + """Класс списка""" + + def __init__(self): + """Конструктор""" + self._capacity: int = 10 # Вместимость списка + self._arr: list[int] = [0] * self._capacity # Массив (для хранения элементов списка) + self._size: int = 0 # Длина списка (текущее число элементов) + self._extend_ratio: int = 2 # Коэффициент увеличения списка при каждом расширении + + def size(self) -> int: + """Получить длину списка (текущее число элементов)""" + return self._size + + def capacity(self) -> int: + """Получить вместимость списка""" + return self._capacity + + def get(self, index: int) -> int: + """Доступ к элементу""" + # Если индекс выходит за границы, выбрасывается исключение; далее аналогично + if index < 0 or index >= self._size: + raise IndexError("индекс выходит за границы") + return self._arr[index] + + def set(self, num: int, index: int): + """Обновление элемента""" + if index < 0 or index >= self._size: + raise IndexError("индекс выходит за границы") + self._arr[index] = num + + def add(self, num: int): + """Добавление элемента в конец""" + # При превышении вместимости по числу элементов запускается расширение + if self.size() == self.capacity(): + self.extend_capacity() + self._arr[self._size] = num + self._size += 1 + + def insert(self, num: int, index: int): + """Вставка элемента в середину""" + if index < 0 or index >= self._size: + raise IndexError("индекс выходит за границы") + # При превышении вместимости по числу элементов запускается расширение + if self._size == self.capacity(): + self.extend_capacity() + # Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад + for j in range(self._size - 1, index - 1, -1): + self._arr[j + 1] = self._arr[j] + self._arr[index] = num + # Обновить число элементов + self._size += 1 + + def remove(self, index: int) -> int: + """Удаление элемента""" + if index < 0 or index >= self._size: + raise IndexError("индекс выходит за границы") + num = self._arr[index] + # Сдвинуть все элементы после индекса index на одну позицию вперед + for j in range(index, self._size - 1): + self._arr[j] = self._arr[j + 1] + # Обновить число элементов + self._size -= 1 + # Вернуть удаленный элемент + return num + + def extend_capacity(self): + """Расширение списка""" + # Создать новый массив длиной в _extend_ratio раз больше исходного массива и скопировать в него исходный массив + self._arr = self._arr + [0] * self.capacity() * (self._extend_ratio - 1) + # Обновить вместимость списка + self._capacity = len(self._arr) + + def to_array(self) -> list[int]: + """Вернуть список фактической длины""" + return self._arr[: self._size] + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация списка + nums = MyList() + # Добавление элемента в конец + nums.add(1) + nums.add(3) + nums.add(2) + nums.add(5) + nums.add(4) + print(f"Список nums = {nums.to_array()}, вместимость = {nums.capacity()}, длина = {nums.size()}") + + # Вставка элемента в середину + nums.insert(6, index=3) + print("После вставки числа 6 по индексу 3 nums =", nums.to_array()) + + # Удаление элемента + nums.remove(3) + print("После удаления элемента по индексу 3 nums =", nums.to_array()) + + # Доступ к элементу + num = nums.get(1) + print("Элемент по индексу 1: num =", num) + + # Обновление элемента + nums.set(0, 1) + print("После обновления элемента по индексу 1 до 0 nums =", nums.to_array()) + + # Проверка механизма расширения + for i in range(10): + # При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения + nums.add(i) + print(f"Список nums после увеличения вместимости = {nums.to_array()}, вместимость = {nums.capacity()}, длина = {nums.size()}") diff --git a/ru/codes/python/chapter_backtracking/n_queens.py b/ru/codes/python/chapter_backtracking/n_queens.py new file mode 100644 index 000000000..4b33c9ccb --- /dev/null +++ b/ru/codes/python/chapter_backtracking/n_queens.py @@ -0,0 +1,62 @@ +""" +File: n_queens.py +Created Time: 2023-04-26 +Author: krahets (krahets@163.com) +""" + + +def backtrack( + row: int, + n: int, + state: list[list[str]], + res: list[list[list[str]]], + cols: list[bool], + diags1: list[bool], + diags2: list[bool], +): + """Алгоритм бэктрекинга: n ферзей""" + # Когда все строки уже обработаны, записать решение + if row == n: + res.append([list(row) for row in state]) + return + # Обойти все столбцы + for col in range(n): + # Вычислить главную и побочную диагонали, соответствующие этой клетке + diag1 = row - col + n - 1 + diag2 = row + col + # Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей + if not cols[col] and not diags1[diag1] and not diags2[diag2]: + # Попытка: поставить ферзя в эту клетку + state[row][col] = "Q" + cols[col] = diags1[diag1] = diags2[diag2] = True + # Перейти к размещению следующей строки + backtrack(row + 1, n, state, res, cols, diags1, diags2) + # Откат: восстановить эту клетку как пустую + state[row][col] = "#" + cols[col] = diags1[diag1] = diags2[diag2] = False + + +def n_queens(n: int) -> list[list[list[str]]]: + """Решить задачу о n ферзях""" + # Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку + state = [["#" for _ in range(n)] for _ in range(n)] + cols = [False] * n # Отмечать, есть ли ферзь в столбце + diags1 = [False] * (2 * n - 1) # Отмечать наличие ферзя на главной диагонали + diags2 = [False] * (2 * n - 1) # Отмечать наличие ферзя на побочной диагонали + res = [] + backtrack(0, n, state, res, cols, diags1, diags2) + + return res + + +"""Driver Code""" +if __name__ == "__main__": + n = 4 + res = n_queens(n) + + print(f"Размер входной доски = {n}") + print(f"Количество способов расстановки ферзей: {len(res)}") + for state in res: + print("--------------------") + for row in state: + print(row) diff --git a/ru/codes/python/chapter_backtracking/permutations_i.py b/ru/codes/python/chapter_backtracking/permutations_i.py new file mode 100644 index 000000000..b0d8391dd --- /dev/null +++ b/ru/codes/python/chapter_backtracking/permutations_i.py @@ -0,0 +1,44 @@ +""" +File: permutations_i.py +Created Time: 2023-04-15 +Author: krahets (krahets@163.com) +""" + + +def backtrack( + state: list[int], choices: list[int], selected: list[bool], res: list[list[int]] +): + """Алгоритм бэктрекинга: все перестановки I""" + # Когда длина состояния равна числу элементов, записать решение + if len(state) == len(choices): + res.append(list(state)) + return + # Перебор всех вариантов выбора + for i, choice in enumerate(choices): + # Отсечение: нельзя выбирать один и тот же элемент повторно + if not selected[i]: + # Попытка: сделать выбор и обновить состояние + selected[i] = True + state.append(choice) + # Перейти к следующему выбору + backtrack(state, choices, selected, res) + # Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = False + state.pop() + + +def permutations_i(nums: list[int]) -> list[list[int]]: + """Все перестановки I""" + res = [] + backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res) + return res + + +"""Driver Code""" +if __name__ == "__main__": + nums = [1, 2, 3] + + res = permutations_i(nums) + + print(f"Входной массив nums = {nums}") + print(f"Все перестановки res = {res}") diff --git a/ru/codes/python/chapter_backtracking/permutations_ii.py b/ru/codes/python/chapter_backtracking/permutations_ii.py new file mode 100644 index 000000000..0bd9399c0 --- /dev/null +++ b/ru/codes/python/chapter_backtracking/permutations_ii.py @@ -0,0 +1,46 @@ +""" +File: permutations_ii.py +Created Time: 2023-04-15 +Author: krahets (krahets@163.com) +""" + + +def backtrack( + state: list[int], choices: list[int], selected: list[bool], res: list[list[int]] +): + """Алгоритм бэктрекинга: все перестановки II""" + # Когда длина состояния равна числу элементов, записать решение + if len(state) == len(choices): + res.append(list(state)) + return + # Перебор всех вариантов выбора + duplicated = set[int]() + for i, choice in enumerate(choices): + # Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы + if not selected[i] and choice not in duplicated: + # Попытка: сделать выбор и обновить состояние + duplicated.add(choice) # Записать значения уже выбранных элементов + selected[i] = True + state.append(choice) + # Перейти к следующему выбору + backtrack(state, choices, selected, res) + # Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = False + state.pop() + + +def permutations_ii(nums: list[int]) -> list[list[int]]: + """Все перестановки II""" + res = [] + backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res) + return res + + +"""Driver Code""" +if __name__ == "__main__": + nums = [1, 2, 2] + + res = permutations_ii(nums) + + print(f"Входной массив nums = {nums}") + print(f"Все перестановки res = {res}") diff --git a/ru/codes/python/chapter_backtracking/preorder_traversal_i_compact.py b/ru/codes/python/chapter_backtracking/preorder_traversal_i_compact.py new file mode 100644 index 000000000..1319cb3f0 --- /dev/null +++ b/ru/codes/python/chapter_backtracking/preorder_traversal_i_compact.py @@ -0,0 +1,36 @@ +""" +File: preorder_traversal_i_compact.py +Created Time: 2023-04-15 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import TreeNode, print_tree, list_to_tree + + +def pre_order(root: TreeNode): + """Предварительный обход: пример 1""" + if root is None: + return + if root.val == 7: + # Записать решение + res.append(root) + pre_order(root.left) + pre_order(root.right) + + +"""Driver Code""" +if __name__ == "__main__": + root = list_to_tree([1, 7, 3, 4, 5, 6, 7]) + print("\nИнициализация двоичного дерева") + print_tree(root) + + # Предварительный обход + res = list[TreeNode]() + pre_order(root) + + print("\nВсе узлы со значением 7") + print([node.val for node in res]) diff --git a/ru/codes/python/chapter_backtracking/preorder_traversal_ii_compact.py b/ru/codes/python/chapter_backtracking/preorder_traversal_ii_compact.py new file mode 100644 index 000000000..cffb4506d --- /dev/null +++ b/ru/codes/python/chapter_backtracking/preorder_traversal_ii_compact.py @@ -0,0 +1,42 @@ +""" +File: preorder_traversal_ii_compact.py +Created Time: 2023-04-15 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import TreeNode, print_tree, list_to_tree + + +def pre_order(root: TreeNode): + """Предварительный обход: пример 2""" + if root is None: + return + # Попытка + path.append(root) + if root.val == 7: + # Записать решение + res.append(list(path)) + pre_order(root.left) + pre_order(root.right) + # Откат + path.pop() + + +"""Driver Code""" +if __name__ == "__main__": + root = list_to_tree([1, 7, 3, 4, 5, 6, 7]) + print("\nИнициализация двоичного дерева") + print_tree(root) + + # Предварительный обход + path = list[TreeNode]() + res = list[list[TreeNode]]() + pre_order(root) + + print("\nВсе пути от корня к узлу 7") + for path in res: + print([node.val for node in path]) diff --git a/ru/codes/python/chapter_backtracking/preorder_traversal_iii_compact.py b/ru/codes/python/chapter_backtracking/preorder_traversal_iii_compact.py new file mode 100644 index 000000000..c9ea1135f --- /dev/null +++ b/ru/codes/python/chapter_backtracking/preorder_traversal_iii_compact.py @@ -0,0 +1,43 @@ +""" +File: preorder_traversal_iii_compact.py +Created Time: 2023-04-15 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import TreeNode, print_tree, list_to_tree + + +def pre_order(root: TreeNode): + """Предварительный обход: пример 3""" + # Отсечение + if root is None or root.val == 3: + return + # Попытка + path.append(root) + if root.val == 7: + # Записать решение + res.append(list(path)) + pre_order(root.left) + pre_order(root.right) + # Откат + path.pop() + + +"""Driver Code""" +if __name__ == "__main__": + root = list_to_tree([1, 7, 3, 4, 5, 6, 7]) + print("\nИнициализация двоичного дерева") + print_tree(root) + + # Предварительный обход + path = list[TreeNode]() + res = list[list[TreeNode]]() + pre_order(root) + + print("\nВсе пути от корня к узлу 7, не содержащие узлов со значением 3") + for path in res: + print([node.val for node in path]) diff --git a/ru/codes/python/chapter_backtracking/preorder_traversal_iii_template.py b/ru/codes/python/chapter_backtracking/preorder_traversal_iii_template.py new file mode 100644 index 000000000..6c510b93c --- /dev/null +++ b/ru/codes/python/chapter_backtracking/preorder_traversal_iii_template.py @@ -0,0 +1,71 @@ +""" +File: preorder_traversal_iii_template.py +Created Time: 2023-04-15 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import TreeNode, print_tree, list_to_tree + + +def is_solution(state: list[TreeNode]) -> bool: + """Проверить, является ли текущее состояние решением""" + return state and state[-1].val == 7 + + +def record_solution(state: list[TreeNode], res: list[list[TreeNode]]): + """Записать решение""" + res.append(list(state)) + + +def is_valid(state: list[TreeNode], choice: TreeNode) -> bool: + """Проверить, допустим ли этот выбор в текущем состоянии""" + return choice is not None and choice.val != 3 + + +def make_choice(state: list[TreeNode], choice: TreeNode): + """Обновить состояние""" + state.append(choice) + + +def undo_choice(state: list[TreeNode], choice: TreeNode): + """Восстановить состояние""" + state.pop() + + +def backtrack( + state: list[TreeNode], choices: list[TreeNode], res: list[list[TreeNode]] +): + """Алгоритм бэктрекинга: пример 3""" + # Проверить, является ли текущее состояние решением + if is_solution(state): + # Записать решение + record_solution(state, res) + # Перебор всех вариантов выбора + for choice in choices: + # Отсечение: проверить допустимость выбора + if is_valid(state, choice): + # Попытка: сделать выбор и обновить состояние + make_choice(state, choice) + # Перейти к следующему выбору + backtrack(state, [choice.left, choice.right], res) + # Откат: отменить выбор и восстановить предыдущее состояние + undo_choice(state, choice) + + +"""Driver Code""" +if __name__ == "__main__": + root = list_to_tree([1, 7, 3, 4, 5, 6, 7]) + print("\nИнициализация двоичного дерева") + print_tree(root) + + # Алгоритм бэктрекинга + res = [] + backtrack(state=[], choices=[root], res=res) + + print("\nВсе пути от корня к узлу 7, в которых путь не содержит узлов со значением 3") + for path in res: + print([node.val for node in path]) diff --git a/ru/codes/python/chapter_backtracking/subset_sum_i.py b/ru/codes/python/chapter_backtracking/subset_sum_i.py new file mode 100644 index 000000000..74539ecff --- /dev/null +++ b/ru/codes/python/chapter_backtracking/subset_sum_i.py @@ -0,0 +1,48 @@ +""" +File: subset_sum_i.py +Created Time: 2023-06-17 +Author: krahets (krahets@163.com) +""" + + +def backtrack( + state: list[int], target: int, choices: list[int], start: int, res: list[list[int]] +): + """Алгоритм бэктрекинга: сумма подмножеств I""" + # Если сумма подмножества равна target, записать решение + if target == 0: + res.append(list(state)) + return + # Обойти все варианты выбора + # Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + for i in range(start, len(choices)): + # Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + # Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if target - choices[i] < 0: + break + # Попытка: сделать выбор и обновить target и start + state.append(choices[i]) + # Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i, res) + # Откат: отменить выбор и восстановить предыдущее состояние + state.pop() + + +def subset_sum_i(nums: list[int], target: int) -> list[list[int]]: + """Решить задачу суммы подмножеств I""" + state = [] # Состояние (подмножество) + nums.sort() # Отсортировать nums + start = 0 # Стартовая вершина обхода + res = [] # Список результатов (список подмножеств) + backtrack(state, target, nums, start, res) + return res + + +"""Driver Code""" +if __name__ == "__main__": + nums = [3, 4, 5] + target = 9 + res = subset_sum_i(nums, target) + + print(f"Входной массив nums = {nums}, target = {target}") + print(f"Все подмножества с суммой {target}: res = {res}") diff --git a/ru/codes/python/chapter_backtracking/subset_sum_i_naive.py b/ru/codes/python/chapter_backtracking/subset_sum_i_naive.py new file mode 100644 index 000000000..1a993f900 --- /dev/null +++ b/ru/codes/python/chapter_backtracking/subset_sum_i_naive.py @@ -0,0 +1,50 @@ +""" +File: subset_sum_i_naive.py +Created Time: 2023-06-17 +Author: krahets (krahets@163.com) +""" + + +def backtrack( + state: list[int], + target: int, + total: int, + choices: list[int], + res: list[list[int]], +): + """Алгоритм бэктрекинга: сумма подмножеств I""" + # Если сумма подмножества равна target, записать решение + if total == target: + res.append(list(state)) + return + # Перебор всех вариантов выбора + for i in range(len(choices)): + # Отсечение: если сумма подмножества превышает target, пропустить этот выбор + if total + choices[i] > target: + continue + # Попытка: сделать выбор и обновить элемент и total + state.append(choices[i]) + # Перейти к следующему выбору + backtrack(state, target, total + choices[i], choices, res) + # Откат: отменить выбор и восстановить предыдущее состояние + state.pop() + + +def subset_sum_i_naive(nums: list[int], target: int) -> list[list[int]]: + """Решить задачу суммы подмножеств I (с повторяющимися подмножествами)""" + state = [] # Состояние (подмножество) + total = 0 # Сумма подмножеств + res = [] # Список результатов (список подмножеств) + backtrack(state, target, total, nums, res) + return res + + +"""Driver Code""" +if __name__ == "__main__": + nums = [3, 4, 5] + target = 9 + res = subset_sum_i_naive(nums, target) + + print(f"Входной массив nums = {nums}, target = {target}") + print(f"Все подмножества с суммой {target}: res = {res}") + print(f"Обратите внимание: результат этого метода содержит повторяющиеся множества") diff --git a/ru/codes/python/chapter_backtracking/subset_sum_ii.py b/ru/codes/python/chapter_backtracking/subset_sum_ii.py new file mode 100644 index 000000000..017c12a0f --- /dev/null +++ b/ru/codes/python/chapter_backtracking/subset_sum_ii.py @@ -0,0 +1,52 @@ +""" +File: subset_sum_ii.py +Created Time: 2023-06-17 +Author: krahets (krahets@163.com) +""" + + +def backtrack( + state: list[int], target: int, choices: list[int], start: int, res: list[list[int]] +): + """Алгоритм бэктрекинга: сумма подмножеств II""" + # Если сумма подмножества равна target, записать решение + if target == 0: + res.append(list(state)) + return + # Обойти все варианты выбора + # Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + # Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента + for i in range(start, len(choices)): + # Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + # Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if target - choices[i] < 0: + break + # Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить + if i > start and choices[i] == choices[i - 1]: + continue + # Попытка: сделать выбор и обновить target и start + state.append(choices[i]) + # Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i + 1, res) + # Откат: отменить выбор и восстановить предыдущее состояние + state.pop() + + +def subset_sum_ii(nums: list[int], target: int) -> list[list[int]]: + """Решить задачу суммы подмножеств II""" + state = [] # Состояние (подмножество) + nums.sort() # Отсортировать nums + start = 0 # Стартовая вершина обхода + res = [] # Список результатов (список подмножеств) + backtrack(state, target, nums, start, res) + return res + + +"""Driver Code""" +if __name__ == "__main__": + nums = [4, 4, 5] + target = 9 + res = subset_sum_ii(nums, target) + + print(f"Входной массив nums = {nums}, target = {target}") + print(f"Все подмножества с суммой {target}: res = {res}") diff --git a/ru/codes/python/chapter_computational_complexity/iteration.py b/ru/codes/python/chapter_computational_complexity/iteration.py new file mode 100644 index 000000000..e8aea5535 --- /dev/null +++ b/ru/codes/python/chapter_computational_complexity/iteration.py @@ -0,0 +1,65 @@ +""" +File: iteration.py +Created Time: 2023-08-24 +Author: krahets (krahets@163.com) +""" + + +def for_loop(n: int) -> int: + """Цикл for""" + res = 0 + # Циклическое суммирование 1, 2, ..., n-1, n + for i in range(1, n + 1): + res += i + return res + + +def while_loop(n: int) -> int: + """Цикл while""" + res = 0 + i = 1 # Инициализация условной переменной + # Циклическое суммирование 1, 2, ..., n-1, n + while i <= n: + res += i + i += 1 # Обновить условную переменную + return res + + +def while_loop_ii(n: int) -> int: + """Цикл while (двойное обновление)""" + res = 0 + i = 1 # Инициализация условной переменной + # Циклическое суммирование 1, 4, 10, ... + while i <= n: + res += i + # Обновить условную переменную + i += 1 + i *= 2 + return res + + +def nested_for_loop(n: int) -> str: + """Двойной цикл for""" + res = "" + # Цикл по i = 1, 2, ..., n-1, n + for i in range(1, n + 1): + # Цикл по j = 1, 2, ..., n-1, n + for j in range(1, n + 1): + res += f"({i}, {j}), " + return res + + +"""Driver Code""" +if __name__ == "__main__": + n = 5 + res = for_loop(n) + print(f"\nРезультат суммирования в цикле for res = {res}") + + res = while_loop(n) + print(f"\nРезультат суммирования в цикле while res = {res}") + + res = while_loop_ii(n) + print(f"\nРезультат суммирования в цикле while (двойное обновление) res = {res}") + + res = nested_for_loop(n) + print(f"\nРезультат обхода в двойном цикле for {res}") diff --git a/ru/codes/python/chapter_computational_complexity/recursion.py b/ru/codes/python/chapter_computational_complexity/recursion.py new file mode 100644 index 000000000..242457a2c --- /dev/null +++ b/ru/codes/python/chapter_computational_complexity/recursion.py @@ -0,0 +1,69 @@ +""" +File: recursion.py +Created Time: 2023-08-24 +Author: krahets (krahets@163.com) +""" + + +def recur(n: int) -> int: + """Рекурсия""" + # Условие завершения + if n == 1: + return 1 + # Рекурсия: рекурсивный вызов + res = recur(n - 1) + # Возврат: вернуть результат + return n + res + + +def for_loop_recur(n: int) -> int: + """Имитация рекурсии итерацией""" + # Использовать явный стек для имитации системного стека вызовов + stack = [] + res = 0 + # Рекурсия: рекурсивный вызов + for i in range(n, 0, -1): + # Имитировать «рекурсию» с помощью операции помещения в стек + stack.append(i) + # Возврат: вернуть результат + while stack: + # Имитировать «возврат» с помощью операции извлечения из стека + res += stack.pop() + # res = 1+2+3+...+n + return res + + +def tail_recur(n, res): + """Хвостовая рекурсия""" + # Условие завершения + if n == 0: + return res + # Хвостовой рекурсивный вызов + return tail_recur(n - 1, res + n) + + +def fib(n: int) -> int: + """Последовательность Фибоначчи: рекурсия""" + # Условие завершения: f(1) = 0, f(2) = 1 + if n == 1 or n == 2: + return n - 1 + # Рекурсивный вызов f(n) = f(n-1) + f(n-2) + res = fib(n - 1) + fib(n - 2) + # Вернуть результат f(n) + return res + + +"""Driver Code""" +if __name__ == "__main__": + n = 5 + res = recur(n) + print(f"\nРезультат суммирования в рекурсивной функции res = {res}") + + res = for_loop_recur(n) + print(f"\nРезультат суммирования при имитации рекурсии res = {res}") + + res = tail_recur(n, 0) + print(f"\nРезультат суммирования в хвостовой рекурсии res = {res}") + + res = fib(n) + print(f"\nЧлен последовательности Фибоначчи с номером {n} = {res}") diff --git a/ru/codes/python/chapter_computational_complexity/space_complexity.py b/ru/codes/python/chapter_computational_complexity/space_complexity.py new file mode 100644 index 000000000..00b488898 --- /dev/null +++ b/ru/codes/python/chapter_computational_complexity/space_complexity.py @@ -0,0 +1,90 @@ +""" +File: space_complexity.py +Created Time: 2022-11-25 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import ListNode, TreeNode, print_tree + + +def function() -> int: + """Функция""" + # Выполнить некоторые операции + return 0 + + +def constant(n: int): + """Постоянная сложность""" + # Константы, переменные и объекты занимают O(1) памяти + a = 0 + nums = [0] * 10000 + node = ListNode(0) + # Переменные в цикле занимают O(1) памяти + for _ in range(n): + c = 0 + # Функции в цикле занимают O(1) памяти + for _ in range(n): + function() + + +def linear(n: int): + """Линейная сложность""" + # Список длины n занимает O(n) памяти + nums = [0] * n + # Хеш-таблица длины n занимает O(n) памяти + hmap = dict[int, str]() + for i in range(n): + hmap[i] = str(i) + + +def linear_recur(n: int): + """Линейная сложность (рекурсивная реализация)""" + print("Рекурсия n =", n) + if n == 1: + return + linear_recur(n - 1) + + +def quadratic(n: int): + """Квадратичная сложность""" + # Двумерный список занимает O(n^2) памяти + num_matrix = [[0] * n for _ in range(n)] + + +def quadratic_recur(n: int) -> int: + """Квадратичная сложность (рекурсивная реализация)""" + if n <= 0: + return 0 + # Длина массива nums равна n, n-1, ..., 2, 1 + nums = [0] * n + return quadratic_recur(n - 1) + + +def build_tree(n: int) -> TreeNode | None: + """Экспоненциальная сложность (построение полного двоичного дерева)""" + if n == 0: + return None + root = TreeNode(0) + root.left = build_tree(n - 1) + root.right = build_tree(n - 1) + return root + + +"""Driver Code""" +if __name__ == "__main__": + n = 5 + # Постоянная сложность + constant(n) + # Линейная сложность + linear(n) + linear_recur(n) + # Квадратичная сложность + quadratic(n) + quadratic_recur(n) + # Экспоненциальная сложность + root = build_tree(n) + print_tree(root) diff --git a/ru/codes/python/chapter_computational_complexity/time_complexity.py b/ru/codes/python/chapter_computational_complexity/time_complexity.py new file mode 100644 index 000000000..8cbc62191 --- /dev/null +++ b/ru/codes/python/chapter_computational_complexity/time_complexity.py @@ -0,0 +1,153 @@ +""" +File: time_complexity.py +Created Time: 2022-11-25 +Author: krahets (krahets@163.com) +""" + + +def constant(n: int) -> int: + """Постоянная сложность""" + count = 0 + size = 100000 + for _ in range(size): + count += 1 + return count + + +def linear(n: int) -> int: + """Линейная сложность""" + count = 0 + for _ in range(n): + count += 1 + return count + + +def array_traversal(nums: list[int]) -> int: + """Линейная сложность (обход массива)""" + count = 0 + # Число итераций пропорционально длине массива + for num in nums: + count += 1 + return count + + +def quadratic(n: int) -> int: + """Квадратичная сложность""" + count = 0 + # Число итераций квадратично зависит от размера данных n + for i in range(n): + for j in range(n): + count += 1 + return count + + +def bubble_sort(nums: list[int]) -> int: + """Квадратичная сложность (пузырьковая сортировка)""" + count = 0 # Счетчик + # Внешний цикл: неотсортированный диапазон [0, i] + for i in range(len(nums) - 1, 0, -1): + # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for j in range(i): + if nums[j] > nums[j + 1]: + # Поменять местами nums[j] и nums[j + 1] + tmp: int = nums[j] + nums[j] = nums[j + 1] + nums[j + 1] = tmp + count += 3 # Обмен элементов включает 3 элементарные операции + return count + + +def exponential(n: int) -> int: + """Экспоненциальная сложность (итеративная реализация)""" + count = 0 + base = 1 + # На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1) + for _ in range(n): + for _ in range(base): + count += 1 + base *= 2 + # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1 + return count + + +def exp_recur(n: int) -> int: + """Экспоненциальная сложность (рекурсивная реализация)""" + if n == 1: + return 1 + return exp_recur(n - 1) + exp_recur(n - 1) + 1 + + +def logarithmic(n: int) -> int: + """Логарифмическая сложность (итеративная реализация)""" + count = 0 + while n > 1: + n = n / 2 + count += 1 + return count + + +def log_recur(n: int) -> int: + """Логарифмическая сложность (рекурсивная реализация)""" + if n <= 1: + return 0 + return log_recur(n / 2) + 1 + + +def linear_log_recur(n: int) -> int: + """Линейно-логарифмическая сложность""" + if n <= 1: + return 1 + # Разделение надвое: размер подзадачи уменьшается вдвое + count = linear_log_recur(n // 2) + linear_log_recur(n // 2) + # Текущая подзадача содержит n операций + for _ in range(n): + count += 1 + return count + + +def factorial_recur(n: int) -> int: + """Факториальная сложность (рекурсивная реализация)""" + if n == 0: + return 1 + count = 0 + # Из одного получается n + for _ in range(n): + count += factorial_recur(n - 1) + return count + + +"""Driver Code""" +if __name__ == "__main__": + # Можно изменить n и запустить программу, чтобы увидеть, как меняется число операций при разных сложностях + n = 8 + print("Размер входных данных n =", n) + + count = constant(n) + print("Число операций константной сложности =", count) + + count = linear(n) + print("Число операций линейной сложности =", count) + count = array_traversal([0] * n) + print("Число операций линейной сложности (обход массива) =", count) + + count = quadratic(n) + print("Число операций квадратичной сложности =", count) + nums = [i for i in range(n, 0, -1)] # [n, n-1, ..., 2, 1] + count = bubble_sort(nums) + print("Число операций квадратичной сложности (пузырьковая сортировка) =", count) + + count = exponential(n) + print("Число операций экспоненциальной сложности (итеративная реализация) =", count) + count = exp_recur(n) + print("Число операций экспоненциальной сложности (рекурсивная реализация) =", count) + + count = logarithmic(n) + print("Число операций логарифмической сложности (итеративная реализация) =", count) + count = log_recur(n) + print("Число операций логарифмической сложности (рекурсивная реализация) =", count) + + count = linear_log_recur(n) + print("Число операций линейно-логарифмической сложности (рекурсивная реализация) =", count) + + count = factorial_recur(n) + print("Число операций факториальной сложности (рекурсивная реализация) =", count) diff --git a/ru/codes/python/chapter_computational_complexity/worst_best_time_complexity.py b/ru/codes/python/chapter_computational_complexity/worst_best_time_complexity.py new file mode 100644 index 000000000..ccf307d25 --- /dev/null +++ b/ru/codes/python/chapter_computational_complexity/worst_best_time_complexity.py @@ -0,0 +1,36 @@ +""" +File: worst_best_time_complexity.py +Created Time: 2022-11-25 +Author: krahets (krahets@163.com) +""" + +import random + + +def random_numbers(n: int) -> list[int]: + """Сгенерировать массив с элементами 1, 2, ..., n в случайном порядке""" + # Создать массив nums =: 1, 2, 3, ..., n + nums = [i for i in range(1, n + 1)] + # Случайно перемешать элементы массива + random.shuffle(nums) + return nums + + +def find_one(nums: list[int]) -> int: + """Найти индекс числа 1 в массиве nums""" + for i in range(len(nums)): + # Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1) + # Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n) + if nums[i] == 1: + return i + return -1 + + +"""Driver Code""" +if __name__ == "__main__": + for i in range(10): + n = 100 + nums: list[int] = random_numbers(n) + index: int = find_one(nums) + print("\nМассив [1, 2, ..., n] после перемешивания =", nums) + print("Индекс числа 1 =", index) diff --git a/ru/codes/python/chapter_divide_and_conquer/binary_search_recur.py b/ru/codes/python/chapter_divide_and_conquer/binary_search_recur.py new file mode 100644 index 000000000..c556e5994 --- /dev/null +++ b/ru/codes/python/chapter_divide_and_conquer/binary_search_recur.py @@ -0,0 +1,40 @@ +""" +File: binary_search_recur.py +Created Time: 2023-07-17 +Author: krahets (krahets@163.com) +""" + + +def dfs(nums: list[int], target: int, i: int, j: int) -> int: + """Бинарный поиск: задача f(i, j)""" + # Если интервал пуст, целевой элемент отсутствует, вернуть -1 + if i > j: + return -1 + # Вычислить индекс середины m + m = (i + j) // 2 + if nums[m] < target: + # Рекурсивная подзадача f(m+1, j) + return dfs(nums, target, m + 1, j) + elif nums[m] > target: + # Рекурсивная подзадача f(i, m-1) + return dfs(nums, target, i, m - 1) + else: + # Целевой элемент найден, вернуть его индекс + return m + + +def binary_search(nums: list[int], target: int) -> int: + """Бинарный поиск""" + n = len(nums) + # Решить задачу f(0, n-1) + return dfs(nums, target, 0, n - 1) + + +"""Driver Code""" +if __name__ == "__main__": + target = 6 + nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35] + + # Бинарный поиск (двусторонне замкнутый интервал) + index = binary_search(nums, target) + print("Индекс целевого элемента 6 = ", index) diff --git a/ru/codes/python/chapter_divide_and_conquer/build_tree.py b/ru/codes/python/chapter_divide_and_conquer/build_tree.py new file mode 100644 index 000000000..94c1d1e46 --- /dev/null +++ b/ru/codes/python/chapter_divide_and_conquer/build_tree.py @@ -0,0 +1,54 @@ +""" +File: build_tree.py +Created Time: 2023-07-15 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import TreeNode, print_tree + + +def dfs( + preorder: list[int], + inorder_map: dict[int, int], + i: int, + l: int, + r: int, +) -> TreeNode | None: + """Построить двоичное дерево: разделяй и властвуй""" + # Завершить при пустом диапазоне поддерева + if r - l < 0: + return None + # Инициализировать корневой узел + root = TreeNode(preorder[i]) + # Найти m, чтобы разделить левое и правое поддеревья + m = inorder_map[preorder[i]] + # Подзадача: построить левое поддерево + root.left = dfs(preorder, inorder_map, i + 1, l, m - 1) + # Подзадача: построить правое поддерево + root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r) + # Вернуть корневой узел + return root + + +def build_tree(preorder: list[int], inorder: list[int]) -> TreeNode | None: + """Построить двоичное дерево""" + # Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам + inorder_map = {val: i for i, val in enumerate(inorder)} + root = dfs(preorder, inorder_map, 0, 0, len(inorder) - 1) + return root + + +"""Driver Code""" +if __name__ == "__main__": + preorder = [3, 9, 2, 1, 7] + inorder = [9, 3, 1, 2, 7] + print(f"Предварительный обход = {preorder}") + print(f"Симметричный обход = {inorder}") + + root = build_tree(preorder, inorder) + print("Построенное двоичное дерево:") + print_tree(root) diff --git a/ru/codes/python/chapter_divide_and_conquer/hanota.py b/ru/codes/python/chapter_divide_and_conquer/hanota.py new file mode 100644 index 000000000..74699ef41 --- /dev/null +++ b/ru/codes/python/chapter_divide_and_conquer/hanota.py @@ -0,0 +1,53 @@ +""" +File: hanota.py +Created Time: 2023-07-16 +Author: krahets (krahets@163.com) +""" + + +def move(src: list[int], tar: list[int]): + """Переместить один диск""" + # Снять диск с вершины src + pan = src.pop() + # Положить диск на вершину tar + tar.append(pan) + + +def dfs(i: int, src: list[int], buf: list[int], tar: list[int]): + """Решить задачу Ханойской башни f(i)""" + # Если в src остался только один диск, сразу переместить его в tar + if i == 1: + move(src, tar) + return + # Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar + dfs(i - 1, src, tar, buf) + # Подзадача f(1): переместить оставшийся один диск из src в tar + move(src, tar) + # Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src + dfs(i - 1, buf, src, tar) + + +def solve_hanota(A: list[int], B: list[int], C: list[int]): + """Решить задачу Ханойской башни""" + n = len(A) + # Переместить верхние n дисков из A в C с помощью B + dfs(n, A, B, C) + + +"""Driver Code""" +if __name__ == "__main__": + # Хвост списка соответствует вершине столбца + A = [5, 4, 3, 2, 1] + B = [] + C = [] + print("Исходное состояние:") + print(f"A = {A}") + print(f"B = {B}") + print(f"C = {C}") + + solve_hanota(A, B, C) + + print("После завершения перемещения дисков:") + print(f"A = {A}") + print(f"B = {B}") + print(f"C = {C}") diff --git a/ru/codes/python/chapter_dynamic_programming/climbing_stairs_backtrack.py b/ru/codes/python/chapter_dynamic_programming/climbing_stairs_backtrack.py new file mode 100644 index 000000000..7ef5f7f69 --- /dev/null +++ b/ru/codes/python/chapter_dynamic_programming/climbing_stairs_backtrack.py @@ -0,0 +1,37 @@ +""" +File: climbing_stairs_backtrack.py +Created Time: 2023-06-30 +Author: krahets (krahets@163.com) +""" + + +def backtrack(choices: list[int], state: int, n: int, res: list[int]) -> int: + """Бэктрекинг""" + # Когда подъем достигает n-й ступени, число вариантов увеличивается на 1 + if state == n: + res[0] += 1 + # Перебор всех вариантов выбора + for choice in choices: + # Отсечение: нельзя выходить за n-ю ступень + if state + choice > n: + continue + # Попытка: сделать выбор и обновить состояние + backtrack(choices, state + choice, n, res) + # Откат + + +def climbing_stairs_backtrack(n: int) -> int: + """Подъем по лестнице: бэктрекинг""" + choices = [1, 2] # Можно подняться на 1 или 2 ступени + state = 0 # Начать подъем с 0-й ступени + res = [0] # Использовать res[0] для хранения числа решений + backtrack(choices, state, n, res) + return res[0] + + +"""Driver Code""" +if __name__ == "__main__": + n = 9 + + res = climbing_stairs_backtrack(n) + print(f"Количество способов подняться по лестнице из {n} ступеней = {res}") diff --git a/ru/codes/python/chapter_dynamic_programming/climbing_stairs_constraint_dp.py b/ru/codes/python/chapter_dynamic_programming/climbing_stairs_constraint_dp.py new file mode 100644 index 000000000..ead4b32a2 --- /dev/null +++ b/ru/codes/python/chapter_dynamic_programming/climbing_stairs_constraint_dp.py @@ -0,0 +1,29 @@ +""" +File: climbing_stairs_constraint_dp.py +Created Time: 2023-06-30 +Author: krahets (krahets@163.com) +""" + + +def climbing_stairs_constraint_dp(n: int) -> int: + """Подъем по лестнице с ограничениями: динамическое программирование""" + if n == 1 or n == 2: + return 1 + # Инициализация таблицы dp для хранения решений подзадач + dp = [[0] * 3 for _ in range(n + 1)] + # Начальное состояние: заранее задать решения наименьших подзадач + dp[1][1], dp[1][2] = 1, 0 + dp[2][1], dp[2][2] = 0, 1 + # Переход состояний: постепенное решение больших подзадач через меньшие + for i in range(3, n + 1): + dp[i][1] = dp[i - 1][2] + dp[i][2] = dp[i - 2][1] + dp[i - 2][2] + return dp[n][1] + dp[n][2] + + +"""Driver Code""" +if __name__ == "__main__": + n = 9 + + res = climbing_stairs_constraint_dp(n) + print(f"Количество способов подняться по лестнице из {n} ступеней = {res}") diff --git a/ru/codes/python/chapter_dynamic_programming/climbing_stairs_dfs.py b/ru/codes/python/chapter_dynamic_programming/climbing_stairs_dfs.py new file mode 100644 index 000000000..ae5a6c8e6 --- /dev/null +++ b/ru/codes/python/chapter_dynamic_programming/climbing_stairs_dfs.py @@ -0,0 +1,28 @@ +""" +File: climbing_stairs_dfs.py +Created Time: 2023-06-30 +Author: krahets (krahets@163.com) +""" + + +def dfs(i: int) -> int: + """Поиск""" + # dp[1] и dp[2] уже известны, вернуть их + if i == 1 or i == 2: + return i + # dp[i] = dp[i-1] + dp[i-2] + count = dfs(i - 1) + dfs(i - 2) + return count + + +def climbing_stairs_dfs(n: int) -> int: + """Подъем по лестнице: поиск""" + return dfs(n) + + +"""Driver Code""" +if __name__ == "__main__": + n = 9 + + res = climbing_stairs_dfs(n) + print(f"Количество способов подняться по лестнице из {n} ступеней = {res}") diff --git a/ru/codes/python/chapter_dynamic_programming/climbing_stairs_dfs_mem.py b/ru/codes/python/chapter_dynamic_programming/climbing_stairs_dfs_mem.py new file mode 100644 index 000000000..bf8dd88a3 --- /dev/null +++ b/ru/codes/python/chapter_dynamic_programming/climbing_stairs_dfs_mem.py @@ -0,0 +1,35 @@ +""" +File: climbing_stairs_dfs_mem.py +Created Time: 2023-06-30 +Author: krahets (krahets@163.com) +""" + + +def dfs(i: int, mem: list[int]) -> int: + """Поиск с мемоизацией""" + # dp[1] и dp[2] уже известны, вернуть их + if i == 1 or i == 2: + return i + # Если запись dp[i] существует, сразу вернуть ее + if mem[i] != -1: + return mem[i] + # dp[i] = dp[i-1] + dp[i-2] + count = dfs(i - 1, mem) + dfs(i - 2, mem) + # Сохранить dp[i] + mem[i] = count + return count + + +def climbing_stairs_dfs_mem(n: int) -> int: + """Подъем по лестнице: поиск с мемоизацией""" + # mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи + mem = [-1] * (n + 1) + return dfs(n, mem) + + +"""Driver Code""" +if __name__ == "__main__": + n = 9 + + res = climbing_stairs_dfs_mem(n) + print(f"Количество способов подняться по лестнице из {n} ступеней = {res}") diff --git a/ru/codes/python/chapter_dynamic_programming/climbing_stairs_dp.py b/ru/codes/python/chapter_dynamic_programming/climbing_stairs_dp.py new file mode 100644 index 000000000..2d8153dba --- /dev/null +++ b/ru/codes/python/chapter_dynamic_programming/climbing_stairs_dp.py @@ -0,0 +1,40 @@ +""" +File: climbing_stairs_dp.py +Created Time: 2023-06-30 +Author: krahets (krahets@163.com) +""" + + +def climbing_stairs_dp(n: int) -> int: + """Подъем по лестнице: динамическое программирование""" + if n == 1 or n == 2: + return n + # Инициализация таблицы dp для хранения решений подзадач + dp = [0] * (n + 1) + # Начальное состояние: заранее задать решения наименьших подзадач + dp[1], dp[2] = 1, 2 + # Переход состояний: постепенное решение больших подзадач через меньшие + for i in range(3, n + 1): + dp[i] = dp[i - 1] + dp[i - 2] + return dp[n] + + +def climbing_stairs_dp_comp(n: int) -> int: + """Подъем по лестнице: динамическое программирование с оптимизацией памяти""" + if n == 1 or n == 2: + return n + a, b = 1, 2 + for _ in range(3, n + 1): + a, b = b, a + b + return b + + +"""Driver Code""" +if __name__ == "__main__": + n = 9 + + res = climbing_stairs_dp(n) + print(f"Количество способов подняться по лестнице из {n} ступеней = {res}") + + res = climbing_stairs_dp_comp(n) + print(f"Количество способов подняться по лестнице из {n} ступеней = {res}") diff --git a/ru/codes/python/chapter_dynamic_programming/coin_change.py b/ru/codes/python/chapter_dynamic_programming/coin_change.py new file mode 100644 index 000000000..6fc9873d5 --- /dev/null +++ b/ru/codes/python/chapter_dynamic_programming/coin_change.py @@ -0,0 +1,60 @@ +""" +File: coin_change.py +Created Time: 2023-07-10 +Author: krahets (krahets@163.com) +""" + + +def coin_change_dp(coins: list[int], amt: int) -> int: + """Размен монет: динамическое программирование""" + n = len(coins) + MAX = amt + 1 + # Инициализация таблицы dp + dp = [[0] * (amt + 1) for _ in range(n + 1)] + # Переход состояний: первая строка и первый столбец + for a in range(1, amt + 1): + dp[0][a] = MAX + # Переход состояний: остальные строки и столбцы + for i in range(1, n + 1): + for a in range(1, amt + 1): + if coins[i - 1] > a: + # Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a] + else: + # Меньшее из двух решений: не брать или взять монету i + dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1) + return dp[n][amt] if dp[n][amt] != MAX else -1 + + +def coin_change_dp_comp(coins: list[int], amt: int) -> int: + """Размен монет: динамическое программирование с оптимизацией памяти""" + n = len(coins) + MAX = amt + 1 + # Инициализация таблицы dp + dp = [MAX] * (amt + 1) + dp[0] = 0 + # Переход состояний + for i in range(1, n + 1): + # Прямой обход + for a in range(1, amt + 1): + if coins[i - 1] > a: + # Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a] + else: + # Меньшее из двух решений: не брать или взять монету i + dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1) + return dp[amt] if dp[amt] != MAX else -1 + + +"""Driver Code""" +if __name__ == "__main__": + coins = [1, 2, 5] + amt = 4 + + # Динамическое программирование + res = coin_change_dp(coins, amt) + print(f"Минимальное число монет для набора целевой суммы = {res}") + + # Динамическое программирование с оптимизацией памяти + res = coin_change_dp_comp(coins, amt) + print(f"Минимальное число монет для набора целевой суммы = {res}") diff --git a/ru/codes/python/chapter_dynamic_programming/coin_change_ii.py b/ru/codes/python/chapter_dynamic_programming/coin_change_ii.py new file mode 100644 index 000000000..85aa6c29b --- /dev/null +++ b/ru/codes/python/chapter_dynamic_programming/coin_change_ii.py @@ -0,0 +1,58 @@ +""" +File: coin_change_ii.py +Created Time: 2023-07-10 +Author: krahets (krahets@163.com) +""" + + +def coin_change_ii_dp(coins: list[int], amt: int) -> int: + """Размен монет II: динамическое программирование""" + n = len(coins) + # Инициализация таблицы dp + dp = [[0] * (amt + 1) for _ in range(n + 1)] + # Инициализация первого столбца + for i in range(n + 1): + dp[i][0] = 1 + # Переход состояний + for i in range(1, n + 1): + for a in range(1, amt + 1): + if coins[i - 1] > a: + # Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a] + else: + # Сумма двух решений: не брать или взять монету i + dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]] + return dp[n][amt] + + +def coin_change_ii_dp_comp(coins: list[int], amt: int) -> int: + """Размен монет II: динамическое программирование с оптимизацией памяти""" + n = len(coins) + # Инициализация таблицы dp + dp = [0] * (amt + 1) + dp[0] = 1 + # Переход состояний + for i in range(1, n + 1): + # Прямой обход + for a in range(1, amt + 1): + if coins[i - 1] > a: + # Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a] + else: + # Сумма двух решений: не брать или взять монету i + dp[a] = dp[a] + dp[a - coins[i - 1]] + return dp[amt] + + +"""Driver Code""" +if __name__ == "__main__": + coins = [1, 2, 5] + amt = 5 + + # Динамическое программирование + res = coin_change_ii_dp(coins, amt) + print(f"Количество комбинаций монет для набора целевой суммы = {res}") + + # Динамическое программирование с оптимизацией памяти + res = coin_change_ii_dp_comp(coins, amt) + print(f"Количество комбинаций монет для набора целевой суммы = {res}") diff --git a/ru/codes/python/chapter_dynamic_programming/edit_distance.py b/ru/codes/python/chapter_dynamic_programming/edit_distance.py new file mode 100644 index 000000000..522b4ba6e --- /dev/null +++ b/ru/codes/python/chapter_dynamic_programming/edit_distance.py @@ -0,0 +1,123 @@ +""" +File: edit_distancde.py +Created Time: 2023-07-04 +Author: krahets (krahets@163.com) +""" + + +def edit_distance_dfs(s: str, t: str, i: int, j: int) -> int: + """Редакционное расстояние: полный перебор""" + # Если s и t пусты, вернуть 0 + if i == 0 and j == 0: + return 0 + # Если s пусто, вернуть длину t + if i == 0: + return j + # Если t пусто, вернуть длину s + if j == 0: + return i + # Если два символа равны, сразу пропустить их + if s[i - 1] == t[j - 1]: + return edit_distance_dfs(s, t, i - 1, j - 1) + # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + insert = edit_distance_dfs(s, t, i, j - 1) + delete = edit_distance_dfs(s, t, i - 1, j) + replace = edit_distance_dfs(s, t, i - 1, j - 1) + # Вернуть минимальное число шагов редактирования + return min(insert, delete, replace) + 1 + + +def edit_distance_dfs_mem(s: str, t: str, mem: list[list[int]], i: int, j: int) -> int: + """Редакционное расстояние: поиск с мемоизацией""" + # Если s и t пусты, вернуть 0 + if i == 0 and j == 0: + return 0 + # Если s пусто, вернуть длину t + if i == 0: + return j + # Если t пусто, вернуть длину s + if j == 0: + return i + # Если запись уже есть, сразу вернуть ее + if mem[i][j] != -1: + return mem[i][j] + # Если два символа равны, сразу пропустить их + if s[i - 1] == t[j - 1]: + return edit_distance_dfs_mem(s, t, mem, i - 1, j - 1) + # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + insert = edit_distance_dfs_mem(s, t, mem, i, j - 1) + delete = edit_distance_dfs_mem(s, t, mem, i - 1, j) + replace = edit_distance_dfs_mem(s, t, mem, i - 1, j - 1) + # Сохранить и вернуть минимальное число шагов редактирования + mem[i][j] = min(insert, delete, replace) + 1 + return mem[i][j] + + +def edit_distance_dp(s: str, t: str) -> int: + """Редакционное расстояние: динамическое программирование""" + n, m = len(s), len(t) + dp = [[0] * (m + 1) for _ in range(n + 1)] + # Переход состояний: первая строка и первый столбец + for i in range(1, n + 1): + dp[i][0] = i + for j in range(1, m + 1): + dp[0][j] = j + # Переход состояний: остальные строки и столбцы + for i in range(1, n + 1): + for j in range(1, m + 1): + if s[i - 1] == t[j - 1]: + # Если два символа равны, сразу пропустить их + dp[i][j] = dp[i - 1][j - 1] + else: + # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1 + return dp[n][m] + + +def edit_distance_dp_comp(s: str, t: str) -> int: + """Редакционное расстояние: динамическое программирование с оптимизацией памяти""" + n, m = len(s), len(t) + dp = [0] * (m + 1) + # Переход состояний: первая строка + for j in range(1, m + 1): + dp[j] = j + # Переход состояний: остальные строки + for i in range(1, n + 1): + # Переход состояний: первый столбец + leftup = dp[0] # Временно сохранить dp[i-1, j-1] + dp[0] += 1 + # Переход состояний: остальные столбцы + for j in range(1, m + 1): + temp = dp[j] + if s[i - 1] == t[j - 1]: + # Если два символа равны, сразу пропустить их + dp[j] = leftup + else: + # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[j] = min(dp[j - 1], dp[j], leftup) + 1 + leftup = temp # Обновить до значения dp[i-1, j-1] для следующей итерации + return dp[m] + + +"""Driver Code""" +if __name__ == "__main__": + s = "bag" + t = "pack" + n, m = len(s), len(t) + + # Полный перебор + res = edit_distance_dfs(s, t, n, m) + print(f"Чтобы преобразовать {s} в {t}, нужно минимум {res} шагов") + + # Поиск с мемоизацией + mem = [[-1] * (m + 1) for _ in range(n + 1)] + res = edit_distance_dfs_mem(s, t, mem, n, m) + print(f"Чтобы преобразовать {s} в {t}, нужно минимум {res} шагов") + + # Динамическое программирование + res = edit_distance_dp(s, t) + print(f"Чтобы преобразовать {s} в {t}, нужно минимум {res} шагов") + + # Динамическое программирование с оптимизацией памяти + res = edit_distance_dp_comp(s, t) + print(f"Чтобы преобразовать {s} в {t}, нужно минимум {res} шагов") diff --git a/ru/codes/python/chapter_dynamic_programming/knapsack.py b/ru/codes/python/chapter_dynamic_programming/knapsack.py new file mode 100644 index 000000000..fd78f4fc6 --- /dev/null +++ b/ru/codes/python/chapter_dynamic_programming/knapsack.py @@ -0,0 +1,101 @@ +""" +File: knapsack.py +Created Time: 2023-07-03 +Author: krahets (krahets@163.com) +""" + + +def knapsack_dfs(wgt: list[int], val: list[int], i: int, c: int) -> int: + """Рюкзак 0-1: полный перебор""" + # Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if i == 0 or c == 0: + return 0 + # Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if wgt[i - 1] > c: + return knapsack_dfs(wgt, val, i - 1, c) + # Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + no = knapsack_dfs(wgt, val, i - 1, c) + yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1] + # Вернуть вариант с большей стоимостью из двух возможных + return max(no, yes) + + +def knapsack_dfs_mem( + wgt: list[int], val: list[int], mem: list[list[int]], i: int, c: int +) -> int: + """Рюкзак 0-1: поиск с мемоизацией""" + # Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if i == 0 or c == 0: + return 0 + # Если запись уже есть, вернуть сразу + if mem[i][c] != -1: + return mem[i][c] + # Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if wgt[i - 1] > c: + return knapsack_dfs_mem(wgt, val, mem, i - 1, c) + # Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + no = knapsack_dfs_mem(wgt, val, mem, i - 1, c) + yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1] + # Сохранить и вернуть вариант с большей стоимостью из двух решений + mem[i][c] = max(no, yes) + return mem[i][c] + + +def knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int: + """Рюкзак 0-1: динамическое программирование""" + n = len(wgt) + # Инициализация таблицы dp + dp = [[0] * (cap + 1) for _ in range(n + 1)] + # Переход состояний + for i in range(1, n + 1): + for c in range(1, cap + 1): + if wgt[i - 1] > c: + # Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c] + else: + # Большее из двух решений: не брать или взять предмет i + dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]) + return dp[n][cap] + + +def knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int: + """Рюкзак 0-1: динамическое программирование с оптимизацией памяти""" + n = len(wgt) + # Инициализация таблицы dp + dp = [0] * (cap + 1) + # Переход состояний + for i in range(1, n + 1): + # Обход в обратном порядке + for c in range(cap, 0, -1): + if wgt[i - 1] > c: + # Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c] + else: + # Большее из двух решений: не брать или взять предмет i + dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]) + return dp[cap] + + +"""Driver Code""" +if __name__ == "__main__": + wgt = [10, 20, 30, 40, 50] + val = [50, 120, 150, 210, 240] + cap = 50 + n = len(wgt) + + # Полный перебор + res = knapsack_dfs(wgt, val, n, cap) + print(f"Максимальная стоимость предметов без превышения вместимости рюкзака = {res}") + + # Поиск с мемоизацией + mem = [[-1] * (cap + 1) for _ in range(n + 1)] + res = knapsack_dfs_mem(wgt, val, mem, n, cap) + print(f"Максимальная стоимость предметов без превышения вместимости рюкзака = {res}") + + # Динамическое программирование + res = knapsack_dp(wgt, val, cap) + print(f"Максимальная стоимость предметов без превышения вместимости рюкзака = {res}") + + # Динамическое программирование с оптимизацией памяти + res = knapsack_dp_comp(wgt, val, cap) + print(f"Максимальная стоимость предметов без превышения вместимости рюкзака = {res}") diff --git a/ru/codes/python/chapter_dynamic_programming/min_cost_climbing_stairs_dp.py b/ru/codes/python/chapter_dynamic_programming/min_cost_climbing_stairs_dp.py new file mode 100644 index 000000000..41da56fa6 --- /dev/null +++ b/ru/codes/python/chapter_dynamic_programming/min_cost_climbing_stairs_dp.py @@ -0,0 +1,43 @@ +""" +File: min_cost_climbing_stairs_dp.py +Created Time: 2023-06-30 +Author: krahets (krahets@163.com) +""" + + +def min_cost_climbing_stairs_dp(cost: list[int]) -> int: + """Минимальная стоимость подъема по лестнице: динамическое программирование""" + n = len(cost) - 1 + if n == 1 or n == 2: + return cost[n] + # Инициализация таблицы dp для хранения решений подзадач + dp = [0] * (n + 1) + # Начальное состояние: заранее задать решения наименьших подзадач + dp[1], dp[2] = cost[1], cost[2] + # Переход состояний: постепенное решение больших подзадач через меньшие + for i in range(3, n + 1): + dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i] + return dp[n] + + +def min_cost_climbing_stairs_dp_comp(cost: list[int]) -> int: + """Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти""" + n = len(cost) - 1 + if n == 1 or n == 2: + return cost[n] + a, b = cost[1], cost[2] + for i in range(3, n + 1): + a, b = b, min(a, b) + cost[i] + return b + + +"""Driver Code""" +if __name__ == "__main__": + cost = [0, 1, 10, 1, 1, 1, 10, 1, 1, 10, 1] + print(f"Список стоимостей ступеней = {cost}") + + res = min_cost_climbing_stairs_dp(cost) + print(f"Минимальная стоимость подъема по лестнице = {res}") + + res = min_cost_climbing_stairs_dp_comp(cost) + print(f"Минимальная стоимость подъема по лестнице = {res}") diff --git a/ru/codes/python/chapter_dynamic_programming/min_path_sum.py b/ru/codes/python/chapter_dynamic_programming/min_path_sum.py new file mode 100644 index 000000000..006631cec --- /dev/null +++ b/ru/codes/python/chapter_dynamic_programming/min_path_sum.py @@ -0,0 +1,104 @@ +""" +File: min_path_sum.py +Created Time: 2023-07-04 +Author: krahets (krahets@163.com) +""" + +from math import inf + + +def min_path_sum_dfs(grid: list[list[int]], i: int, j: int) -> int: + """Минимальная сумма пути: полный перебор""" + # Если это верхняя левая ячейка, завершить поиск + if i == 0 and j == 0: + return grid[0][0] + # Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if i < 0 or j < 0: + return inf + # Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1) + up = min_path_sum_dfs(grid, i - 1, j) + left = min_path_sum_dfs(grid, i, j - 1) + # Вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + return min(left, up) + grid[i][j] + + +def min_path_sum_dfs_mem( + grid: list[list[int]], mem: list[list[int]], i: int, j: int +) -> int: + """Минимальная сумма пути: поиск с мемоизацией""" + # Если это верхняя левая ячейка, завершить поиск + if i == 0 and j == 0: + return grid[0][0] + # Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if i < 0 or j < 0: + return inf + # Если запись уже есть, вернуть сразу + if mem[i][j] != -1: + return mem[i][j] + # Минимальная стоимость пути для левой и верхней ячеек + up = min_path_sum_dfs_mem(grid, mem, i - 1, j) + left = min_path_sum_dfs_mem(grid, mem, i, j - 1) + # Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + mem[i][j] = min(left, up) + grid[i][j] + return mem[i][j] + + +def min_path_sum_dp(grid: list[list[int]]) -> int: + """Минимальная сумма пути: динамическое программирование""" + n, m = len(grid), len(grid[0]) + # Инициализация таблицы dp + dp = [[0] * m for _ in range(n)] + dp[0][0] = grid[0][0] + # Переход состояний: первая строка + for j in range(1, m): + dp[0][j] = dp[0][j - 1] + grid[0][j] + # Переход состояний: первый столбец + for i in range(1, n): + dp[i][0] = dp[i - 1][0] + grid[i][0] + # Переход состояний: остальные строки и столбцы + for i in range(1, n): + for j in range(1, m): + dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j] + return dp[n - 1][m - 1] + + +def min_path_sum_dp_comp(grid: list[list[int]]) -> int: + """Минимальная сумма пути: динамическое программирование с оптимизацией памяти""" + n, m = len(grid), len(grid[0]) + # Инициализация таблицы dp + dp = [0] * m + # Переход состояний: первая строка + dp[0] = grid[0][0] + for j in range(1, m): + dp[j] = dp[j - 1] + grid[0][j] + # Переход состояний: остальные строки + for i in range(1, n): + # Переход состояний: первый столбец + dp[0] = dp[0] + grid[i][0] + # Переход состояний: остальные столбцы + for j in range(1, m): + dp[j] = min(dp[j - 1], dp[j]) + grid[i][j] + return dp[m - 1] + + +"""Driver Code""" +if __name__ == "__main__": + grid = [[1, 3, 1, 5], [2, 2, 4, 2], [5, 3, 2, 1], [4, 3, 5, 2]] + n, m = len(grid), len(grid[0]) + + # Полный перебор + res = min_path_sum_dfs(grid, n - 1, m - 1) + print(f"Минимальная сумма пути из левого верхнего угла в правый нижний = {res}") + + # Поиск с мемоизацией + mem = [[-1] * m for _ in range(n)] + res = min_path_sum_dfs_mem(grid, mem, n - 1, m - 1) + print(f"Минимальная сумма пути из левого верхнего угла в правый нижний = {res}") + + # Динамическое программирование + res = min_path_sum_dp(grid) + print(f"Минимальная сумма пути из левого верхнего угла в правый нижний = {res}") + + # Динамическое программирование с оптимизацией памяти + res = min_path_sum_dp_comp(grid) + print(f"Минимальная сумма пути из левого верхнего угла в правый нижний = {res}") diff --git a/ru/codes/python/chapter_dynamic_programming/unbounded_knapsack.py b/ru/codes/python/chapter_dynamic_programming/unbounded_knapsack.py new file mode 100644 index 000000000..2db554835 --- /dev/null +++ b/ru/codes/python/chapter_dynamic_programming/unbounded_knapsack.py @@ -0,0 +1,55 @@ +""" +File: unbounded_knapsack.py +Created Time: 2023-07-10 +Author: krahets (krahets@163.com) +""" + + +def unbounded_knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int: + """Полный рюкзак: динамическое программирование""" + n = len(wgt) + # Инициализация таблицы dp + dp = [[0] * (cap + 1) for _ in range(n + 1)] + # Переход состояний + for i in range(1, n + 1): + for c in range(1, cap + 1): + if wgt[i - 1] > c: + # Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c] + else: + # Большее из двух решений: не брать или взять предмет i + dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]) + return dp[n][cap] + + +def unbounded_knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int: + """Полный рюкзак: динамическое программирование с оптимизацией памяти""" + n = len(wgt) + # Инициализация таблицы dp + dp = [0] * (cap + 1) + # Переход состояний + for i in range(1, n + 1): + # Прямой обход + for c in range(1, cap + 1): + if wgt[i - 1] > c: + # Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c] + else: + # Большее из двух решений: не брать или взять предмет i + dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]) + return dp[cap] + + +"""Driver Code""" +if __name__ == "__main__": + wgt = [1, 2, 3] + val = [5, 11, 15] + cap = 4 + + # Динамическое программирование + res = unbounded_knapsack_dp(wgt, val, cap) + print(f"Максимальная стоимость предметов без превышения вместимости рюкзака = {res}") + + # Динамическое программирование с оптимизацией памяти + res = unbounded_knapsack_dp_comp(wgt, val, cap) + print(f"Максимальная стоимость предметов без превышения вместимости рюкзака = {res}") diff --git a/ru/codes/python/chapter_graph/graph_adjacency_list.py b/ru/codes/python/chapter_graph/graph_adjacency_list.py new file mode 100644 index 000000000..a38fbb940 --- /dev/null +++ b/ru/codes/python/chapter_graph/graph_adjacency_list.py @@ -0,0 +1,111 @@ +""" +File: graph_adjacency_list.py +Created Time: 2023-02-23 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import Vertex, vals_to_vets + + +class GraphAdjList: + """Класс неориентированного графа на основе списка смежности""" + + def __init__(self, edges: list[list[Vertex]]): + """Конструктор""" + # Список смежности, где key — вершина, а value — все смежные ей вершины + self.adj_list = dict[Vertex, list[Vertex]]() + # Добавить все вершины и ребра + for edge in edges: + self.add_vertex(edge[0]) + self.add_vertex(edge[1]) + self.add_edge(edge[0], edge[1]) + + def size(self) -> int: + """Получить число вершин""" + return len(self.adj_list) + + def add_edge(self, vet1: Vertex, vet2: Vertex): + """Добавление ребра""" + if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2: + raise ValueError() + # Добавить ребро vet1 - vet2 + self.adj_list[vet1].append(vet2) + self.adj_list[vet2].append(vet1) + + def remove_edge(self, vet1: Vertex, vet2: Vertex): + """Удаление ребра""" + if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2: + raise ValueError() + # Удалить ребро vet1 - vet2 + self.adj_list[vet1].remove(vet2) + self.adj_list[vet2].remove(vet1) + + def add_vertex(self, vet: Vertex): + """Добавление вершины""" + if vet in self.adj_list: + return + # Добавить новый список в список смежности + self.adj_list[vet] = [] + + def remove_vertex(self, vet: Vertex): + """Удаление вершины""" + if vet not in self.adj_list: + raise ValueError() + # Удалить из списка смежности список, соответствующий вершине vet + self.adj_list.pop(vet) + # Обойти списки других вершин и удалить все ребра, содержащие vet + for vertex in self.adj_list: + if vet in self.adj_list[vertex]: + self.adj_list[vertex].remove(vet) + + def print(self): + """Вывести список смежности""" + print("Список смежности =") + for vertex in self.adj_list: + tmp = [v.val for v in self.adj_list[vertex]] + print(f"{vertex.val}: {tmp},") + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация неориентированного графа + 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(edges) + print("\nГраф после инициализации") + graph.print() + + # Добавить ребро + # Вершины 1 и 2, то есть v[0] и v[2] + graph.add_edge(v[0], v[2]) + print("\nГраф после добавления ребра 1-2") + graph.print() + + # Удалить ребро + # Вершины 1 и 3 соответствуют v[0] и v[1] + graph.remove_edge(v[0], v[1]) + print("\nГраф после удаления ребра 1-3") + graph.print() + + # Добавление вершины + v5 = Vertex(6) + graph.add_vertex(v5) + print("\nГраф после добавления вершины 6") + graph.print() + + # Удаление вершины + # Вершина 3 соответствует v[1] + graph.remove_vertex(v[1]) + print("\nГраф после удаления вершины 3") + graph.print() diff --git a/ru/codes/python/chapter_graph/graph_adjacency_matrix.py b/ru/codes/python/chapter_graph/graph_adjacency_matrix.py new file mode 100644 index 000000000..90bd374de --- /dev/null +++ b/ru/codes/python/chapter_graph/graph_adjacency_matrix.py @@ -0,0 +1,116 @@ +""" +File: graph_adjacency_matrix.py +Created Time: 2023-02-23 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import Vertex, print_matrix + + +class GraphAdjMat: + """Класс неориентированного графа на основе матрицы смежности""" + + def __init__(self, vertices: list[int], edges: list[list[int]]): + """Конструктор""" + # Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин» + self.vertices: list[int] = [] + # Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин» + self.adj_mat: list[list[int]] = [] + # Добавление вершины + for val in vertices: + self.add_vertex(val) + # Добавить ребра + # Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices + for e in edges: + self.add_edge(e[0], e[1]) + + def size(self) -> int: + """Получить число вершин""" + return len(self.vertices) + + def add_vertex(self, val: int): + """Добавление вершины""" + n = self.size() + # Добавить значение новой вершины в список вершин + self.vertices.append(val) + # Добавить строку в матрицу смежности + new_row = [0] * n + self.adj_mat.append(new_row) + # Добавить столбец в матрицу смежности + for row in self.adj_mat: + row.append(0) + + def remove_vertex(self, index: int): + """Удаление вершины""" + if index >= self.size(): + raise IndexError() + # Удалить вершину с индексом index из списка вершин + self.vertices.pop(index) + # Удалить строку с индексом index из матрицы смежности + self.adj_mat.pop(index) + # Удалить столбец с индексом index из матрицы смежности + for row in self.adj_mat: + row.pop(index) + + def add_edge(self, i: int, j: int): + """Добавление ребра""" + # Параметры i и j соответствуют индексам элементов vertices + # Обработка выхода индекса за границы и случая равенства + if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j: + raise IndexError() + # В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i) + self.adj_mat[i][j] = 1 + self.adj_mat[j][i] = 1 + + def remove_edge(self, i: int, j: int): + """Удаление ребра""" + # Параметры i и j соответствуют индексам элементов vertices + # Обработка выхода индекса за границы и случая равенства + if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j: + raise IndexError() + self.adj_mat[i][j] = 0 + self.adj_mat[j][i] = 0 + + def print(self): + """Вывести матрицу смежности""" + print("Список вершин =", self.vertices) + print("Матрица смежности =") + print_matrix(self.adj_mat) + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация неориентированного графа + # Обратите внимание: элементы edges представляют индексы вершин, то есть соответствуют индексам элементов vertices + vertices = [1, 3, 2, 5, 4] + edges = [[0, 1], [0, 3], [1, 2], [2, 3], [2, 4], [3, 4]] + graph = GraphAdjMat(vertices, edges) + print("\nГраф после инициализации") + graph.print() + + # Добавление ребра + # Индексы вершин 1 и 2 равны 0 и 2 соответственно + graph.add_edge(0, 2) + print("\nГраф после добавления ребра 1-2") + graph.print() + + # Удалить ребро + # Индексы вершин 1 и 3 равны 0 и 1 + graph.remove_edge(0, 1) + print("\nГраф после удаления ребра 1-3") + graph.print() + + # Добавление вершины + graph.add_vertex(6) + print("\nГраф после добавления вершины 6") + graph.print() + + # Удаление вершины + # Индекс вершины 3 равен 1 + graph.remove_vertex(1) + print("\nГраф после удаления вершины 3") + graph.print() diff --git a/ru/codes/python/chapter_graph/graph_bfs.py b/ru/codes/python/chapter_graph/graph_bfs.py new file mode 100644 index 000000000..92ece63eb --- /dev/null +++ b/ru/codes/python/chapter_graph/graph_bfs.py @@ -0,0 +1,64 @@ +""" +File: graph_bfs.py +Created Time: 2023-02-23 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import Vertex, vals_to_vets, vets_to_vals +from collections import deque +from graph_adjacency_list import GraphAdjList + + +def graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]: + """Обход в ширину""" + # Использовать список смежности для представления графа, чтобы получать все смежные вершины заданной вершины + # Последовательность обхода вершин + res = [] + # Хеш-множество для хранения уже посещенных вершин + visited = set[Vertex]([start_vet]) + # Очередь используется для реализации BFS + que = deque[Vertex]([start_vet]) + # Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины + while len(que) > 0: + vet = que.popleft() # Извлечь головную вершину из очереди + res.append(vet) # Отметить посещенную вершину + # Обойти все смежные вершины данной вершины + for adj_vet in graph.adj_list[vet]: + if adj_vet in visited: + continue # Пропустить уже посещенную вершину + que.append(adj_vet) # Помещать в очередь только непосещенные вершины + visited.add(adj_vet) # Отметить эту вершину как посещенную + # Вернуть последовательность обхода вершин + return res + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация неориентированного графа + 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(edges) + print("\nГраф после инициализации") + graph.print() + + # Обход в ширину + res = graph_bfs(graph, v[0]) + print("\nПоследовательность вершин при обходе в ширину (BFS)") + print(vets_to_vals(res)) diff --git a/ru/codes/python/chapter_graph/graph_dfs.py b/ru/codes/python/chapter_graph/graph_dfs.py new file mode 100644 index 000000000..86fb28446 --- /dev/null +++ b/ru/codes/python/chapter_graph/graph_dfs.py @@ -0,0 +1,57 @@ +""" +File: graph_dfs.py +Created Time: 2023-02-23 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import Vertex, vets_to_vals, vals_to_vets +from graph_adjacency_list import GraphAdjList + + +def dfs(graph: GraphAdjList, visited: set[Vertex], res: list[Vertex], vet: Vertex): + """Вспомогательная функция обхода в глубину""" + res.append(vet) # Отметить посещенную вершину + visited.add(vet) # Отметить эту вершину как посещенную + # Обойти все смежные вершины данной вершины + for adjVet in graph.adj_list[vet]: + if adjVet in visited: + continue # Пропустить уже посещенную вершину + # Рекурсивно обходить смежные вершины + dfs(graph, visited, res, adjVet) + + +def graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]: + """Обход в глубину""" + # Использовать список смежности для представления графа, чтобы получать все смежные вершины заданной вершины + # Последовательность обхода вершин + res = [] + # Хеш-множество для хранения уже посещенных вершин + visited = set[Vertex]() + dfs(graph, visited, res, start_vet) + return res + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация неориентированного графа + 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(edges) + print("\nГраф после инициализации") + graph.print() + + # Обход в глубину + res = graph_dfs(graph, v[0]) + print("\nПоследовательность вершин при обходе в глубину (DFS)") + print(vets_to_vals(res)) diff --git a/ru/codes/python/chapter_greedy/coin_change_greedy.py b/ru/codes/python/chapter_greedy/coin_change_greedy.py new file mode 100644 index 000000000..9f82fdc49 --- /dev/null +++ b/ru/codes/python/chapter_greedy/coin_change_greedy.py @@ -0,0 +1,48 @@ +""" +File: coin_change_greedy.py +Created Time: 2023-07-18 +Author: krahets (krahets@163.com) +""" + + +def coin_change_greedy(coins: list[int], amt: int) -> int: + """Размен монет: жадный алгоритм""" + # Предположить, что список coins упорядочен + i = len(coins) - 1 + count = 0 + # Циклически выполнять жадный выбор, пока не останется суммы + while amt > 0: + # Найти монету, которая меньше остатка суммы и наиболее к нему близка + while i > 0 and coins[i] > amt: + i -= 1 + # Выбрать coins[i] + amt -= coins[i] + count += 1 + # Если допустимое решение не найдено, вернуть -1 + return count if amt == 0 else -1 + + +"""Driver Code""" +if __name__ == "__main__": + # Жадный подход: гарантирует нахождение глобально оптимального решения + coins = [1, 5, 10, 20, 50, 100] + amt = 186 + res = coin_change_greedy(coins, amt) + print(f"\ncoins = {coins}, amt = {amt}") + print(f"Минимальное число монет для набора суммы {amt} = {res}") + + # Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = [1, 20, 50] + amt = 60 + res = coin_change_greedy(coins, amt) + print(f"\ncoins = {coins}, amt = {amt}") + print(f"Минимальное число монет для набора суммы {amt} = {res}") + print(f"На самом деле минимум равен 3: 20 + 20 + 20") + + # Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = [1, 49, 50] + amt = 98 + res = coin_change_greedy(coins, amt) + print(f"\ncoins = {coins}, amt = {amt}") + print(f"Минимальное число монет для набора суммы {amt} = {res}") + print(f"На самом деле минимум равен 2: 49 + 49") diff --git a/ru/codes/python/chapter_greedy/fractional_knapsack.py b/ru/codes/python/chapter_greedy/fractional_knapsack.py new file mode 100644 index 000000000..c91416aec --- /dev/null +++ b/ru/codes/python/chapter_greedy/fractional_knapsack.py @@ -0,0 +1,46 @@ +""" +File: fractional_knapsack.py +Created Time: 2023-07-19 +Author: krahets (krahets@163.com) +""" + + +class Item: + """Предмет""" + + def __init__(self, w: int, v: int): + self.w = w # Вес предмета + self.v = v # Стоимость предмета + + +def fractional_knapsack(wgt: list[int], val: list[int], cap: int) -> int: + """Дробный рюкзак: жадный алгоритм""" + # Создать список предметов с двумя свойствами: вес и стоимость + items = [Item(w, v) for w, v in zip(wgt, val)] + # Отсортировать по удельной стоимости item.v / item.w в порядке убывания + items.sort(key=lambda item: item.v / item.w, reverse=True) + # Циклический жадный выбор + res = 0 + for item in items: + if item.w <= cap: + # Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком + res += item.v + cap -= item.w + else: + # Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета + res += (item.v / item.w) * cap + # Свободной вместимости больше не осталось, поэтому выйти из цикла + break + return res + + +"""Driver Code""" +if __name__ == "__main__": + wgt = [10, 20, 30, 40, 50] + val = [50, 120, 150, 210, 240] + cap = 50 + n = len(wgt) + + # Жадный алгоритм + res = fractional_knapsack(wgt, val, cap) + print(f"Максимальная стоимость предметов без превышения вместимости рюкзака = {res}") diff --git a/ru/codes/python/chapter_greedy/max_capacity.py b/ru/codes/python/chapter_greedy/max_capacity.py new file mode 100644 index 000000000..d94a3df4d --- /dev/null +++ b/ru/codes/python/chapter_greedy/max_capacity.py @@ -0,0 +1,33 @@ +""" +File: max_capacity.py +Created Time: 2023-07-21 +Author: krahets (krahets@163.com) +""" + + +def max_capacity(ht: list[int]) -> int: + """Максимальная вместимость: жадный алгоритм""" + # Инициализировать i и j так, чтобы они располагались по двум концам массива + i, j = 0, len(ht) - 1 + # Начальная максимальная вместимость равна 0 + res = 0 + # Выполнять жадный выбор в цикле, пока две доски не встретятся + while i < j: + # Обновить максимальную вместимость + cap = min(ht[i], ht[j]) * (j - i) + res = max(res, cap) + # Сдвигать внутрь более короткую сторону + if ht[i] < ht[j]: + i += 1 + else: + j -= 1 + return res + + +"""Driver Code""" +if __name__ == "__main__": + ht = [3, 8, 5, 2, 7, 7, 3, 4] + + # Жадный алгоритм + res = max_capacity(ht) + print(f"Максимальная вместимость = {res}") diff --git a/ru/codes/python/chapter_greedy/max_product_cutting.py b/ru/codes/python/chapter_greedy/max_product_cutting.py new file mode 100644 index 000000000..f51ac647f --- /dev/null +++ b/ru/codes/python/chapter_greedy/max_product_cutting.py @@ -0,0 +1,33 @@ +""" +File: max_product_cutting.py +Created Time: 2023-07-21 +Author: krahets (krahets@163.com) +""" + +import math + + +def max_product_cutting(n: int) -> int: + """Максимальное произведение разрезания: жадный алгоритм""" + # Когда n <= 3, обязательно нужно выделить одну 1 + if n <= 3: + return 1 * (n - 1) + # Жадно выделить множители 3, где a — число троек, а b — остаток + a, b = n // 3, n % 3 + if b == 1: + # Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2 + return int(math.pow(3, a - 1)) * 2 * 2 + if b == 2: + # Если остаток равен 2, ничего не делать + return int(math.pow(3, a)) * 2 + # Если остаток равен 0, ничего не делать + return int(math.pow(3, a)) + + +"""Driver Code""" +if __name__ == "__main__": + n = 58 + + # Жадный алгоритм + res = max_product_cutting(n) + print(f"Максимальное произведение после разрезания = {res}") diff --git a/ru/codes/python/chapter_hashing/array_hash_map.py b/ru/codes/python/chapter_hashing/array_hash_map.py new file mode 100644 index 000000000..1cfb9176f --- /dev/null +++ b/ru/codes/python/chapter_hashing/array_hash_map.py @@ -0,0 +1,117 @@ +""" +File: array_hash_map.py +Created Time: 2022-12-14 +Author: msk397 (machangxinq@gmail.com) +""" + + +class Pair: + """Пара ключ-значение""" + + def __init__(self, key: int, val: str): + self.key = key + self.val = val + + +class ArrayHashMap: + """Хеш-таблица на основе массива""" + + def __init__(self): + """Конструктор""" + # Инициализировать массив, содержащий 100 корзин + self.buckets: list[Pair | None] = [None] * 100 + + def hash_func(self, key: int) -> int: + """Хеш-функция""" + index = key % 100 + return index + + def get(self, key: int) -> str | None: + """Операция поиска""" + index: int = self.hash_func(key) + pair: Pair = self.buckets[index] + if pair is None: + return None + return pair.val + + def put(self, key: int, val: str): + """Операции добавления и обновления""" + pair = Pair(key, val) + index: int = self.hash_func(key) + self.buckets[index] = pair + + def remove(self, key: int): + """Операция удаления""" + index: int = self.hash_func(key) + # Присвоить None, что означает удаление + self.buckets[index] = None + + def entry_set(self) -> list[Pair]: + """Получить все пары ключ-значение""" + result: list[Pair] = [] + for pair in self.buckets: + if pair is not None: + result.append(pair) + return result + + def key_set(self) -> list[int]: + """Получить все ключи""" + result = [] + for pair in self.buckets: + if pair is not None: + result.append(pair.key) + return result + + def value_set(self) -> list[str]: + """Получить все значения""" + result = [] + for pair in self.buckets: + if pair is not None: + result.append(pair.val) + return result + + def print(self): + """Вывести хеш-таблицу""" + for pair in self.buckets: + if pair is not None: + print(pair.key, "->", pair.val) + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация хеш-таблицы + hmap = ArrayHashMap() + + # Операция добавления + # Добавить пару (key, value) в хеш-таблицу + hmap.put(12836, "Сяо Ха") + hmap.put(15937, "Сяо Ло") + hmap.put(16750, "Сяо Суань") + hmap.put(13276, "Сяо Фа") + hmap.put(10583, "Сяо Я") + print("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение") + hmap.print() + + # Операция поиска + # Передать ключ key в хеш-таблицу и получить значение value + name = hmap.get(15937) + print("\nДля номера 15937 найдено имя " + name) + + # Операция удаления + # Удалить пару (key, value) из хеш-таблицы + hmap.remove(10583) + print("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение") + hmap.print() + + # Обход хеш-таблицы + print("\nОтдельный обход пар ключ-значение") + for pair in hmap.entry_set(): + print(pair.key, "->", pair.val) + + print("\nОтдельный обход ключей") + for key in hmap.key_set(): + print(key) + + print("\nОтдельный обход значений") + for val in hmap.value_set(): + print(val) diff --git a/ru/codes/python/chapter_hashing/built_in_hash.py b/ru/codes/python/chapter_hashing/built_in_hash.py new file mode 100644 index 000000000..85dc95db4 --- /dev/null +++ b/ru/codes/python/chapter_hashing/built_in_hash.py @@ -0,0 +1,37 @@ +""" +File: built_in_hash.py +Created Time: 2023-06-15 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import ListNode + +"""Driver Code""" +if __name__ == "__main__": + num = 3 + hash_num = hash(num) + print(f"Хеш-значение целого числа {num} = {hash_num}") + + bol = True + hash_bol = hash(bol) + print(f"Хеш-значение булева значения {bol} = {hash_bol}") + + dec = 3.14159 + hash_dec = hash(dec) + print(f"Хеш-значение десятичного числа {dec} = {hash_dec}") + + str = "Hello Algo" + hash_str = hash(str) + print(f"Хеш-значение строки {str} = {hash_str}") + + tup = (12836, "Сяо Ха") + hash_tup = hash(tup) + print(f"Хеш-значение кортежа {tup} = {hash(hash_tup)}") + + obj = ListNode(0) + hash_obj = hash(obj) + print(f"Хеш-значение объекта узла {obj} = {hash_obj}") diff --git a/ru/codes/python/chapter_hashing/hash_map.py b/ru/codes/python/chapter_hashing/hash_map.py new file mode 100644 index 000000000..48ebc1f89 --- /dev/null +++ b/ru/codes/python/chapter_hashing/hash_map.py @@ -0,0 +1,50 @@ +""" +File: hash_map.py +Created Time: 2022-12-14 +Author: msk397 (machangxinq@gmail.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import print_dict + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация хеш-таблицы + hmap = dict[int, str]() + + # Операция добавления + # Добавить пару (key, value) в хеш-таблицу + hmap[12836] = "Сяо Ха" + hmap[15937] = "Сяо Ло" + hmap[16750] = "Сяо Суань" + hmap[13276] = "Сяо Фа" + hmap[10583] = "Сяо Я" + print("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение") + print_dict(hmap) + + # Операция поиска + # Передать ключ key в хеш-таблицу и получить значение value + name: str = hmap[15937] + print("\nДля номера 15937 найдено имя " + name) + + # Операция удаления + # Удалить пару (key, value) из хеш-таблицы + hmap.pop(10583) + print("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение") + print_dict(hmap) + + # Обход хеш-таблицы + print("\nОтдельный обход пар ключ-значение") + for key, value in hmap.items(): + print(key, "->", value) + + print("\nОтдельный обход ключей") + for key in hmap.keys(): + print(key) + + print("\nОтдельный обход значений") + for val in hmap.values(): + print(val) diff --git a/ru/codes/python/chapter_hashing/hash_map_chaining.py b/ru/codes/python/chapter_hashing/hash_map_chaining.py new file mode 100644 index 000000000..32a653833 --- /dev/null +++ b/ru/codes/python/chapter_hashing/hash_map_chaining.py @@ -0,0 +1,118 @@ +""" +File: hash_map_chaining.py +Created Time: 2023-06-13 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from chapter_hashing.array_hash_map import Pair + + +class HashMapChaining: + """Хеш-таблица с цепочками""" + + def __init__(self): + """Конструктор""" + self.size = 0 # Число пар ключ-значение + self.capacity = 4 # Вместимость хеш-таблицы + self.load_thres = 2.0 / 3.0 # Порог коэффициента загрузки для запуска расширения + self.extend_ratio = 2 # Коэффициент расширения + self.buckets = [[] for _ in range(self.capacity)] # Массив корзин + + def hash_func(self, key: int) -> int: + """Хеш-функция""" + return key % self.capacity + + def load_factor(self) -> float: + """Коэффициент загрузки""" + return self.size / self.capacity + + def get(self, key: int) -> str | None: + """Операция поиска""" + index = self.hash_func(key) + bucket = self.buckets[index] + # Обойти корзину; если найден key, вернуть соответствующее val + for pair in bucket: + if pair.key == key: + return pair.val + # Если key не найден, вернуть None + return None + + def put(self, key: int, val: str): + """Операция добавления""" + # Когда коэффициент загрузки превышает порог, выполнить расширение + if self.load_factor() > self.load_thres: + self.extend() + index = self.hash_func(key) + bucket = self.buckets[index] + # Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть + for pair in bucket: + if pair.key == key: + pair.val = val + return + # Если такого key нет, добавить пару ключ-значение в конец + pair = Pair(key, val) + bucket.append(pair) + self.size += 1 + + def remove(self, key: int): + """Операция удаления""" + index = self.hash_func(key) + bucket = self.buckets[index] + # Обойти корзину и удалить из нее пару ключ-значение + for pair in bucket: + if pair.key == key: + bucket.remove(pair) + self.size -= 1 + break + + def extend(self): + """Расширить хеш-таблицу""" + # Временно сохранить исходную хеш-таблицу + buckets = self.buckets + # Инициализация новой хеш-таблицы после расширения + self.capacity *= self.extend_ratio + self.buckets = [[] for _ in range(self.capacity)] + self.size = 0 + # Перенести пары ключ-значение из исходной хеш-таблицы в новую + for bucket in buckets: + for pair in bucket: + self.put(pair.key, pair.val) + + def print(self): + """Вывести хеш-таблицу""" + for bucket in self.buckets: + res = [] + for pair in bucket: + res.append(str(pair.key) + " -> " + pair.val) + print(res) + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация хеш-таблицы + hashmap = HashMapChaining() + + # Операция добавления + # Добавить пару (key, value) в хеш-таблицу + hashmap.put(12836, "Сяо Ха") + hashmap.put(15937, "Сяо Ло") + hashmap.put(16750, "Сяо Суань") + hashmap.put(13276, "Сяо Фа") + hashmap.put(10583, "Сяо Я") + print("\nПосле завершения добавления хеш-таблица имеет вид\n[Key1 -> Value1, Key2 -> Value2, ...]") + hashmap.print() + + # Операция поиска + # Передать ключ key в хеш-таблицу и получить значение value + name = hashmap.get(13276) + print("\nДля номера 13276 найдено имя " + name) + + # Операция удаления + # Удалить пару (key, value) из хеш-таблицы + hashmap.remove(12836) + print("\nПосле удаления 12836 хеш-таблица имеет вид\n[Key1 -> Value1, Key2 -> Value2, ...]") + hashmap.print() diff --git a/ru/codes/python/chapter_hashing/hash_map_open_addressing.py b/ru/codes/python/chapter_hashing/hash_map_open_addressing.py new file mode 100644 index 000000000..1f9bf3da7 --- /dev/null +++ b/ru/codes/python/chapter_hashing/hash_map_open_addressing.py @@ -0,0 +1,138 @@ +""" +File: hash_map_open_addressing.py +Created Time: 2023-06-13 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from chapter_hashing.array_hash_map import Pair + + +class HashMapOpenAddressing: + """Хеш-таблица с открытой адресацией""" + + def __init__(self): + """Конструктор""" + self.size = 0 # Число пар ключ-значение + self.capacity = 4 # Вместимость хеш-таблицы + self.load_thres = 2.0 / 3.0 # Порог коэффициента загрузки для запуска расширения + self.extend_ratio = 2 # Коэффициент расширения + self.buckets: list[Pair | None] = [None] * self.capacity # Массив корзин + self.TOMBSTONE = Pair(-1, "-1") # Удалить метку + + def hash_func(self, key: int) -> int: + """Хеш-функция""" + return key % self.capacity + + def load_factor(self) -> float: + """Коэффициент загрузки""" + return self.size / self.capacity + + def find_bucket(self, key: int) -> int: + """Найти индекс корзины, соответствующий key""" + index = self.hash_func(key) + first_tombstone = -1 + # Выполнять линейное пробирование и завершить при встрече с пустой корзиной + while self.buckets[index] is not None: + # Если встретился key, вернуть соответствующий индекс корзины + if self.buckets[index].key == key: + # Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс + if first_tombstone != -1: + self.buckets[first_tombstone] = self.buckets[index] + self.buckets[index] = self.TOMBSTONE + return first_tombstone # Вернуть индекс корзины после перемещения + return index # Вернуть индекс корзины + # Записать первую встретившуюся метку удаления + if first_tombstone == -1 and self.buckets[index] is self.TOMBSTONE: + first_tombstone = index + # Вычислить индекс корзины; при выходе за конец вернуться к началу + index = (index + 1) % self.capacity + # Если key не существует, вернуть индекс точки добавления + return index if first_tombstone == -1 else first_tombstone + + def get(self, key: int) -> str: + """Операция поиска""" + # Найти индекс корзины, соответствующий key + index = self.find_bucket(key) + # Если пара ключ-значение найдена, вернуть соответствующее val + if self.buckets[index] not in [None, self.TOMBSTONE]: + return self.buckets[index].val + # Если пара ключ-значение не существует, вернуть None + return None + + def put(self, key: int, val: str): + """Операция добавления""" + # Когда коэффициент загрузки превышает порог, выполнить расширение + if self.load_factor() > self.load_thres: + self.extend() + # Найти индекс корзины, соответствующий key + index = self.find_bucket(key) + # Если пара ключ-значение найдена, перезаписать val и вернуть + if self.buckets[index] not in [None, self.TOMBSTONE]: + self.buckets[index].val = val + return + # Если пары ключ-значение нет, добавить ее + self.buckets[index] = Pair(key, val) + self.size += 1 + + def remove(self, key: int): + """Операция удаления""" + # Найти индекс корзины, соответствующий key + index = self.find_bucket(key) + # Если пара ключ-значение найдена, заменить ее меткой удаления + if self.buckets[index] not in [None, self.TOMBSTONE]: + self.buckets[index] = self.TOMBSTONE + self.size -= 1 + + def extend(self): + """Расширить хеш-таблицу""" + # Временно сохранить исходную хеш-таблицу + buckets_tmp = self.buckets + # Инициализация новой хеш-таблицы после расширения + self.capacity *= self.extend_ratio + self.buckets = [None] * self.capacity + self.size = 0 + # Перенести пары ключ-значение из исходной хеш-таблицы в новую + for pair in buckets_tmp: + if pair not in [None, self.TOMBSTONE]: + self.put(pair.key, pair.val) + + def print(self): + """Вывести хеш-таблицу""" + for pair in self.buckets: + if pair is None: + print("None") + elif pair is self.TOMBSTONE: + print("TOMBSTONE") + else: + print(pair.key, "->", pair.val) + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация хеш-таблицы + hashmap = HashMapOpenAddressing() + + # Операция добавления + # Добавить пару (key, val) в хеш-таблицу + hashmap.put(12836, "Сяо Ха") + hashmap.put(15937, "Сяо Ло") + hashmap.put(16750, "Сяо Суань") + hashmap.put(13276, "Сяо Фа") + hashmap.put(10583, "Сяо Я") + print("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение") + hashmap.print() + + # Операция поиска + # Передать ключ key в хеш-таблицу и получить значение val + name = hashmap.get(13276) + print("\nДля номера 13276 найдено имя " + name) + + # Операция удаления + # Удалить пару (key, val) из хеш-таблицы + hashmap.remove(16750) + print("\nПосле удаления 16750 хеш-таблица имеет вид\nКлюч -> Значение") + hashmap.print() diff --git a/ru/codes/python/chapter_hashing/simple_hash.py b/ru/codes/python/chapter_hashing/simple_hash.py new file mode 100644 index 000000000..dedfebe0b --- /dev/null +++ b/ru/codes/python/chapter_hashing/simple_hash.py @@ -0,0 +1,58 @@ +""" +File: simple_hash.py +Created Time: 2023-06-15 +Author: krahets (krahets@163.com) +""" + + +def add_hash(key: str) -> int: + """Аддитивное хеширование""" + hash = 0 + modulus = 1000000007 + for c in key: + hash += ord(c) + return hash % modulus + + +def mul_hash(key: str) -> int: + """Мультипликативное хеширование""" + hash = 0 + modulus = 1000000007 + for c in key: + hash = 31 * hash + ord(c) + return hash % modulus + + +def xor_hash(key: str) -> int: + """XOR-хеширование""" + hash = 0 + modulus = 1000000007 + for c in key: + hash ^= ord(c) + return hash % modulus + + +def rot_hash(key: str) -> int: + """Хеширование с циклическим сдвигом""" + hash = 0 + modulus = 1000000007 + for c in key: + hash = (hash << 4) ^ (hash >> 28) ^ ord(c) + return hash % modulus + + +"""Driver Code""" +if __name__ == "__main__": + key = "Hello Algo" + + hash = add_hash(key) + print(f"Хеш-сумма сложением = {hash}") + + hash = mul_hash(key) + print(f"Хеш-сумма умножением = {hash}") + + hash = xor_hash(key) + print(f"Хеш-сумма XOR = {hash}") + + hash = rot_hash(key) + print(f"Хеш-сумма с циклическим сдвигом = {hash}") diff --git a/ru/codes/python/chapter_heap/heap.py b/ru/codes/python/chapter_heap/heap.py new file mode 100644 index 000000000..bf3a1d2f2 --- /dev/null +++ b/ru/codes/python/chapter_heap/heap.py @@ -0,0 +1,71 @@ +""" +File: heap.py +Created Time: 2023-02-23 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import print_heap + +import heapq + + +def test_push(heap: list, val: int, flag: int = 1): + heapq.heappush(heap, flag * val) # Добавление элемента в кучу + print(f"\nПосле добавления элемента {val} в кучу") + print_heap([flag * val for val in heap]) + + +def test_pop(heap: list, flag: int = 1): + val = flag * heapq.heappop(heap) # Извлечение элемента с вершины кучи + print(f"\nПосле извлечения элемента вершины кучи {val}") + print_heap([flag * val for val in heap]) + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация минимальной кучи + min_heap, flag = [], 1 + # Инициализация максимальной кучи + max_heap, flag = [], -1 + + print("\nНиже приведен тестовый пример для max-heap") + # Модуль heapq в Python по умолчанию реализует минимальную кучу + # Можно помещать в кучу отрицательные элементы, чтобы инвертировать отношение порядка и таким образом реализовать максимальную кучу + # В этом примере flag = 1 соответствует минимальной куче, а flag = -1 — максимальной куче + + # Добавление элемента в кучу + test_push(max_heap, 1, flag) + test_push(max_heap, 3, flag) + test_push(max_heap, 2, flag) + test_push(max_heap, 5, flag) + test_push(max_heap, 4, flag) + + # Получение элемента с вершины кучи + peek: int = flag * max_heap[0] + print(f"\nЭлемент на вершине кучи = {peek}") + + # Извлечение элемента с вершины кучи + test_pop(max_heap, flag) + test_pop(max_heap, flag) + test_pop(max_heap, flag) + test_pop(max_heap, flag) + test_pop(max_heap, flag) + + # Получение размера кучи + size: int = len(max_heap) + print(f"\nКоличество элементов в куче = {size}") + + # Проверка, пуста ли куча + is_empty: bool = not max_heap + print(f"\nПуста ли куча: {is_empty}") + + # Создать кучу по входному списку + # Временная сложность равна O(n), а не O(nlogn) + min_heap = [1, 3, 2, 5, 4] + heapq.heapify(min_heap) + print("\nПосле построения min-heap из входного списка") + print_heap(min_heap) diff --git a/ru/codes/python/chapter_heap/my_heap.py b/ru/codes/python/chapter_heap/my_heap.py new file mode 100644 index 000000000..05252b0de --- /dev/null +++ b/ru/codes/python/chapter_heap/my_heap.py @@ -0,0 +1,137 @@ +""" +File: my_heap.py +Created Time: 2023-02-23 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import print_heap + + +class MaxHeap: + """Максимальная куча""" + + def __init__(self, nums: list[int]): + """Конструктор, строящий кучу по входному списку""" + # Добавить элементы списка в кучу без изменений + self.max_heap = nums + # Выполнить heapify для всех узлов, кроме листовых + for i in range(self.parent(self.size() - 1), -1, -1): + self.sift_down(i) + + def left(self, i: int) -> int: + """Получить индекс левого дочернего узла""" + return 2 * i + 1 + + def right(self, i: int) -> int: + """Получить индекс правого дочернего узла""" + return 2 * i + 2 + + def parent(self, i: int) -> int: + """Получить индекс родительского узла""" + return (i - 1) // 2 # Округление вниз при делении + + def swap(self, i: int, j: int): + """Поменять элементы местами""" + self.max_heap[i], self.max_heap[j] = self.max_heap[j], self.max_heap[i] + + def size(self) -> int: + """Получение размера кучи""" + return len(self.max_heap) + + def is_empty(self) -> bool: + """Проверка, пуста ли куча""" + return self.size() == 0 + + def peek(self) -> int: + """Доступ к элементу на вершине кучи""" + return self.max_heap[0] + + def push(self, val: int): + """Добавление элемента в кучу""" + # Добавление узла + self.max_heap.append(val) + # Просеивание снизу вверх + self.sift_up(self.size() - 1) + + def sift_up(self, i: int): + """Начиная с узла i, выполнить просеивание снизу вверх""" + while True: + # Получение родительского узла для узла i + p = self.parent(i) + # Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления» + if p < 0 or self.max_heap[i] <= self.max_heap[p]: + break + # Поменять два узла местами + self.swap(i, p) + # Циклическое просеивание вверх + i = p + + def pop(self) -> int: + """Извлечение элемента из кучи""" + # Обработка пустого случая + if self.is_empty(): + raise IndexError("куча пуста") + # Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + self.swap(0, self.size() - 1) + # Удаление узла + val = self.max_heap.pop() + # Просеивание сверху вниз + self.sift_down(0) + # Вернуть элемент с вершины кучи + return val + + def sift_down(self, i: int): + """Начиная с узла i, выполнить просеивание сверху вниз""" + while True: + # Определить узел с максимальным значением среди i, l и r и обозначить его как ma + l, r, ma = self.left(i), self.right(i), i + if l < self.size() and self.max_heap[l] > self.max_heap[ma]: + ma = l + if r < self.size() and self.max_heap[r] > self.max_heap[ma]: + ma = r + # Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if ma == i: + break + # Поменять два узла местами + self.swap(i, ma) + # Циклическое просеивание вниз + i = ma + + def print(self): + """Вывести кучу (двоичное дерево)""" + print_heap(self.max_heap) + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация максимальной кучи + max_heap = MaxHeap([9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2]) + print("\nПосле построения кучи из входного списка") + max_heap.print() + + # Получение элемента с вершины кучи + peek = max_heap.peek() + print(f"\nЭлемент на вершине кучи = {peek}") + + # Добавление элемента в кучу + val = 7 + max_heap.push(val) + print(f"\nПосле добавления элемента {val} в кучу") + max_heap.print() + + # Извлечение элемента с вершины кучи + peek = max_heap.pop() + print(f"\nПосле извлечения элемента вершины кучи {peek}") + max_heap.print() + + # Получение размера кучи + size = max_heap.size() + print(f"\nКоличество элементов в куче = {size}") + + # Проверка, пуста ли куча + is_empty = max_heap.is_empty() + print(f"\nПуста ли куча: {is_empty}") diff --git a/ru/codes/python/chapter_heap/top_k.py b/ru/codes/python/chapter_heap/top_k.py new file mode 100644 index 000000000..e8d36ad0d --- /dev/null +++ b/ru/codes/python/chapter_heap/top_k.py @@ -0,0 +1,39 @@ +""" +File: top_k.py +Created Time: 2023-06-10 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import print_heap + +import heapq + + +def top_k_heap(nums: list[int], k: int) -> list[int]: + """Найти k наибольших элементов массива с помощью кучи""" + # Инициализация минимальной кучи + heap = [] + # Поместить первые k элементов массива в кучу + for i in range(k): + heapq.heappush(heap, nums[i]) + # Начиная с элемента k+1, поддерживать длину кучи равной k + for i in range(k, len(nums)): + # Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу + if nums[i] > heap[0]: + heapq.heappop(heap) + heapq.heappush(heap, nums[i]) + return heap + + +"""Driver Code""" +if __name__ == "__main__": + nums = [1, 7, 6, 3, 2] + k = 3 + + res = top_k_heap(nums, k) + print(f"Наибольшие {k} элементов") + print_heap(res) diff --git a/ru/codes/python/chapter_searching/binary_search.py b/ru/codes/python/chapter_searching/binary_search.py new file mode 100644 index 000000000..2a7177656 --- /dev/null +++ b/ru/codes/python/chapter_searching/binary_search.py @@ -0,0 +1,52 @@ +""" +File: binary_search.py +Created Time: 2022-11-26 +Author: timi (xisunyy@163.com) +""" + + +def binary_search(nums: list[int], target: int) -> int: + """Бинарный поиск (двусторонне замкнутый интервал)""" + # Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно + i, j = 0, len(nums) - 1 + # Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст) + while i <= j: + # Теоретически числа в Python могут быть сколь угодно большими (ограничены только объемом памяти), поэтому не нужно учитывать переполнение больших чисел + m = (i + j) // 2 # Вычислить индекс середины m + if nums[m] < target: + i = m + 1 # Это означает, что target находится в интервале [m+1, j] + elif nums[m] > target: + j = m - 1 # Это означает, что target находится в интервале [i, m-1] + else: + return m # Целевой элемент найден, вернуть его индекс + return -1 # Целевой элемент не найден, вернуть -1 + + +def binary_search_lcro(nums: list[int], target: int) -> int: + """Бинарный поиск (лево замкнутый, право открытый интервал)""" + # Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно + i, j = 0, len(nums) + # Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст) + while i < j: + m = (i + j) // 2 # Вычислить индекс середины m + if nums[m] < target: + i = m + 1 # Это означает, что target находится в интервале [m+1, j) + elif nums[m] > target: + j = m # Это означает, что target находится в интервале [i, m) + else: + return m # Целевой элемент найден, вернуть его индекс + return -1 # Целевой элемент не найден, вернуть -1 + + +"""Driver Code""" +if __name__ == "__main__": + target = 6 + nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35] + + # Бинарный поиск (двусторонне замкнутый интервал) + index = binary_search(nums, target) + print("Индекс целевого элемента 6 = ", index) + + # Бинарный поиск (лево замкнутый, право открытый интервал) + index = binary_search_lcro(nums, target) + print("Индекс целевого элемента 6 = ", index) diff --git a/ru/codes/python/chapter_searching/binary_search_edge.py b/ru/codes/python/chapter_searching/binary_search_edge.py new file mode 100644 index 000000000..05f1684bb --- /dev/null +++ b/ru/codes/python/chapter_searching/binary_search_edge.py @@ -0,0 +1,49 @@ +""" +File: binary_search_edge.py +Created Time: 2023-08-04 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from binary_search_insertion import binary_search_insertion + + +def binary_search_left_edge(nums: list[int], target: int) -> int: + """Бинарный поиск самого левого target""" + # Эквивалентно поиску точки вставки target + i = binary_search_insertion(nums, target) + # target не найден, вернуть -1 + if i == len(nums) or nums[i] != target: + return -1 + # Найти target и вернуть индекс i + return i + + +def binary_search_right_edge(nums: list[int], target: int) -> int: + """Бинарный поиск самого правого target""" + # Преобразовать задачу в поиск самого левого target + 1 + i = binary_search_insertion(nums, target + 1) + # j указывает на самый правый target, а i — на первый элемент больше target + j = i - 1 + # target не найден, вернуть -1 + if j == -1 or nums[j] != target: + return -1 + # Найти target и вернуть индекс j + return j + + +"""Driver Code""" +if __name__ == "__main__": + # Массив с повторяющимися элементами + nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15] + print(f"\nМассив nums = {nums}") + + # Бинарный поиск левой и правой границы + for target in [6, 7]: + index = binary_search_left_edge(nums, target) + print(f"Индекс самого левого элемента {target} равен {index}") + index = binary_search_right_edge(nums, target) + print(f"Индекс самого правого элемента {target} равен {index}") diff --git a/ru/codes/python/chapter_searching/binary_search_insertion.py b/ru/codes/python/chapter_searching/binary_search_insertion.py new file mode 100644 index 000000000..971a4c337 --- /dev/null +++ b/ru/codes/python/chapter_searching/binary_search_insertion.py @@ -0,0 +1,54 @@ +""" +File: binary_search_insertion.py +Created Time: 2023-08-04 +Author: krahets (krahets@163.com) +""" + + +def binary_search_insertion_simple(nums: list[int], target: int) -> int: + """Бинарный поиск точки вставки (без повторяющихся элементов)""" + i, j = 0, len(nums) - 1 # Инициализировать двусторонне замкнутый интервал [0, n-1] + while i <= j: + m = (i + j) // 2 # Вычислить индекс середины m + if nums[m] < target: + i = m + 1 # target находится в интервале [m+1, j] + elif nums[m] > target: + j = m - 1 # target находится в интервале [i, m-1] + else: + return m # Найти target и вернуть точку вставки m + # target не найден, вернуть точку вставки i + return i + + +def binary_search_insertion(nums: list[int], target: int) -> int: + """Бинарный поиск точки вставки (с повторяющимися элементами)""" + i, j = 0, len(nums) - 1 # Инициализировать двусторонне замкнутый интервал [0, n-1] + while i <= j: + m = (i + j) // 2 # Вычислить индекс середины m + if nums[m] < target: + i = m + 1 # target находится в интервале [m+1, j] + elif nums[m] > target: + j = m - 1 # target находится в интервале [i, m-1] + else: + j = m - 1 # Первый элемент меньше target находится в интервале [i, m-1] + # Вернуть точку вставки i + return i + + +"""Driver Code""" +if __name__ == "__main__": + # Массив без повторяющихся элементов + nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35] + print(f"\nМассив nums = {nums}") + # Бинарный поиск точки вставки + for target in [6, 9]: + index = binary_search_insertion_simple(nums, target) + print(f"Индекс позиции вставки элемента {target} равен {index}") + + # Массив с повторяющимися элементами + nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15] + print(f"\nМассив nums = {nums}") + # Бинарный поиск точки вставки + for target in [2, 6, 20]: + index = binary_search_insertion(nums, target) + print(f"Индекс позиции вставки элемента {target} равен {index}") diff --git a/ru/codes/python/chapter_searching/hashing_search.py b/ru/codes/python/chapter_searching/hashing_search.py new file mode 100644 index 000000000..1dbe0fe73 --- /dev/null +++ b/ru/codes/python/chapter_searching/hashing_search.py @@ -0,0 +1,51 @@ +""" +File: hashing_search.py +Created Time: 2022-11-26 +Author: timi (xisunyy@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import ListNode, list_to_linked_list + + +def hashing_search_array(hmap: dict[int, int], target: int) -> int: + """Хеш-поиск (массив)""" + # key хеш-таблицы: целевой элемент, value: индекс + # Если такого key нет в хеш-таблице, вернуть -1 + return hmap.get(target, -1) + + +def hashing_search_linkedlist( + hmap: dict[int, ListNode], target: int +) -> ListNode | None: + """Хеш-поиск (связный список)""" + # key хеш-таблицы: целевой элемент, value: объект узла + # Если такого key нет в хеш-таблице, вернуть None + return hmap.get(target, None) + + +"""Driver Code""" +if __name__ == "__main__": + target = 3 + + # Хеш-поиск (массив) + nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8] + # Инициализация хеш-таблицы + map0 = dict[int, int]() + for i in range(len(nums)): + map0[nums[i]] = i # key: элемент, value: индекс + index: int = hashing_search_array(map0, target) + print("Индекс целевого элемента 3 =", index) + + # Хеш-поиск (связный список) + head: ListNode = list_to_linked_list(nums) + # Инициализация хеш-таблицы + map1 = dict[int, ListNode]() + while head: + map1[head.val] = head # key: значение узла, value: узел + head = head.next + node: ListNode = hashing_search_linkedlist(map1, target) + print("Объект узла со значением 3 =", node) diff --git a/ru/codes/python/chapter_searching/linear_search.py b/ru/codes/python/chapter_searching/linear_search.py new file mode 100644 index 000000000..397fe1d7d --- /dev/null +++ b/ru/codes/python/chapter_searching/linear_search.py @@ -0,0 +1,45 @@ +""" +File: linear_search.py +Created Time: 2022-11-26 +Author: timi (xisunyy@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import ListNode, list_to_linked_list + + +def linear_search_array(nums: list[int], target: int) -> int: + """Линейный поиск (массив)""" + # Обход массива + for i in range(len(nums)): + if nums[i] == target: # Целевой элемент найден, вернуть его индекс + return i + return -1 # Целевой элемент не найден, вернуть -1 + + +def linear_search_linkedlist(head: ListNode, target: int) -> ListNode | None: + """Линейный поиск (связный список)""" + # Обойти связный список + while head: + if head.val == target: # Найти целевой узел и вернуть его + return head + head = head.next + return None # Целевой узел не найден, вернуть None + + +"""Driver Code""" +if __name__ == "__main__": + target = 3 + + # Выполнить линейный поиск в массиве + nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8] + index: int = linear_search_array(nums, target) + print("Индекс целевого элемента 3 =", index) + + # Выполнить линейный поиск в связном списке + head: ListNode = list_to_linked_list(nums) + node: ListNode | None = linear_search_linkedlist(head, target) + print("Объект узла со значением 3 =", node) diff --git a/ru/codes/python/chapter_searching/two_sum.py b/ru/codes/python/chapter_searching/two_sum.py new file mode 100644 index 000000000..3e7a583ec --- /dev/null +++ b/ru/codes/python/chapter_searching/two_sum.py @@ -0,0 +1,42 @@ +""" +File: two_sum.py +Created Time: 2022-11-25 +Author: krahets (krahets@163.com) +""" + + +def two_sum_brute_force(nums: list[int], target: int) -> list[int]: + """Метод 1: полный перебор""" + # Два вложенных цикла, временная сложность O(n^2) + for i in range(len(nums) - 1): + for j in range(i + 1, len(nums)): + if nums[i] + nums[j] == target: + return [i, j] + return [] + + +def two_sum_hash_table(nums: list[int], target: int) -> list[int]: + """Метод 2: вспомогательная хеш-таблица""" + # Вспомогательная хеш-таблица, пространственная сложность O(n) + dic = {} + # Один цикл, временная сложность O(n) + for i in range(len(nums)): + if target - nums[i] in dic: + return [dic[target - nums[i]], i] + dic[nums[i]] = i + return [] + + +"""Driver Code""" +if __name__ == "__main__": + # ======= Test Case ======= + nums = [2, 7, 11, 15] + target = 13 + + # ====== Основной код ====== + # Метод 1 + res: list[int] = two_sum_brute_force(nums, target) + print("Результат метода 1 res =", res) + # Метод 2 + res: list[int] = two_sum_hash_table(nums, target) + print("Результат метода 2 res =", res) diff --git a/ru/codes/python/chapter_sorting/bubble_sort.py b/ru/codes/python/chapter_sorting/bubble_sort.py new file mode 100644 index 000000000..6412448bc --- /dev/null +++ b/ru/codes/python/chapter_sorting/bubble_sort.py @@ -0,0 +1,44 @@ +""" +File: bubble_sort.py +Created Time: 2022-11-25 +Author: timi (xisunyy@163.com) +""" + + +def bubble_sort(nums: list[int]): + """Пузырьковая сортировка""" + n = len(nums) + # Внешний цикл: неотсортированный диапазон [0, i] + for i in range(n - 1, 0, -1): + # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for j in range(i): + if nums[j] > nums[j + 1]: + # Поменять местами nums[j] и nums[j + 1] + nums[j], nums[j + 1] = nums[j + 1], nums[j] + + +def bubble_sort_with_flag(nums: list[int]): + """Пузырьковая сортировка (оптимизация флагом)""" + n = len(nums) + # Внешний цикл: неотсортированный диапазон [0, i] + for i in range(n - 1, 0, -1): + flag = False # Инициализировать флаг + # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for j in range(i): + if nums[j] > nums[j + 1]: + # Поменять местами nums[j] и nums[j + 1] + nums[j], nums[j + 1] = nums[j + 1], nums[j] + flag = True # Записать обмен элементов + if not flag: + break # На этой итерации «всплытия» не было ни одного обмена, сразу выйти + + +"""Driver Code""" +if __name__ == "__main__": + nums = [4, 1, 3, 1, 5, 2] + bubble_sort(nums) + print("После пузырьковой сортировки nums =", nums) + + nums1 = [4, 1, 3, 1, 5, 2] + bubble_sort_with_flag(nums1) + print("После пузырьковой сортировки nums =", nums1) diff --git a/ru/codes/python/chapter_sorting/bucket_sort.py b/ru/codes/python/chapter_sorting/bucket_sort.py new file mode 100644 index 000000000..2f77de939 --- /dev/null +++ b/ru/codes/python/chapter_sorting/bucket_sort.py @@ -0,0 +1,35 @@ +""" +File: bucket_sort.py +Created Time: 2023-03-30 +Author: krahets (krahets@163.com) +""" + + +def bucket_sort(nums: list[float]): + """Сортировка корзинами""" + # Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину + k = len(nums) // 2 + buckets = [[] for _ in range(k)] + # 1. Распределить элементы массива по корзинам + for num in nums: + # Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1] + i = int(num * k) + # Добавить num в корзину i + buckets[i].append(num) + # 2. Выполнить сортировку внутри каждой корзины + for bucket in buckets: + # Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки + bucket.sort() + # 3. Обойти корзины и объединить результаты + i = 0 + for bucket in buckets: + for num in bucket: + nums[i] = num + i += 1 + + +if __name__ == "__main__": + # Пусть входные данные — числа с плавающей точкой из диапазона [0, 1) + nums = [0.49, 0.96, 0.82, 0.09, 0.57, 0.43, 0.91, 0.75, 0.15, 0.37] + bucket_sort(nums) + print("После сортировки корзинами nums =", nums) diff --git a/ru/codes/python/chapter_sorting/counting_sort.py b/ru/codes/python/chapter_sorting/counting_sort.py new file mode 100644 index 000000000..ca4d9972f --- /dev/null +++ b/ru/codes/python/chapter_sorting/counting_sort.py @@ -0,0 +1,62 @@ +""" +File: counting_sort.py +Created Time: 2023-03-21 +Author: krahets (krahets@163.com) +""" + + +def counting_sort_naive(nums: list[int]): + """Сортировка подсчетом""" + # Простая реализация, не подходит для сортировки объектов + # 1. Найти максимальный элемент массива m + m = max(nums) + # 2. Подсчитать число появлений каждой цифры + # counter[num] обозначает число появлений num + counter = [0] * (m + 1) + for num in nums: + counter[num] += 1 + # 3. Обойти counter и заполнить исходный массив nums элементами + i = 0 + for num in range(m + 1): + for _ in range(counter[num]): + nums[i] = num + i += 1 + + +def counting_sort(nums: list[int]): + """Сортировка подсчетом""" + # Полная реализация, позволяет сортировать объекты и является стабильной сортировкой + # 1. Найти максимальный элемент массива m + m = max(nums) + # 2. Подсчитать число появлений каждой цифры + # counter[num] обозначает число появлений num + counter = [0] * (m + 1) + for num in nums: + counter[num] += 1 + # 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс» + # То есть counter[num]-1 — это индекс последнего появления num в res + for i in range(m): + counter[i + 1] += counter[i] + # 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res + # Инициализировать массив res для хранения результата + n = len(nums) + res = [0] * n + for i in range(n - 1, -1, -1): + num = nums[i] + res[counter[num] - 1] = num # Поместить num по соответствующему индексу + counter[num] -= 1 # Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num + # Перезаписать исходный массив nums массивом результата res + for i in range(n): + nums[i] = res[i] + + +"""Driver Code""" +if __name__ == "__main__": + nums = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4] + + counting_sort_naive(nums) + print(f"После сортировки подсчетом (объекты не поддерживаются) nums = {nums}") + + nums1 = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4] + counting_sort(nums1) + print(f"После сортировки подсчетом nums1 = {nums1}") diff --git a/ru/codes/python/chapter_sorting/heap_sort.py b/ru/codes/python/chapter_sorting/heap_sort.py new file mode 100644 index 000000000..9f1816b40 --- /dev/null +++ b/ru/codes/python/chapter_sorting/heap_sort.py @@ -0,0 +1,45 @@ +""" +File: heap_sort.py +Created Time: 2023-05-24 +Author: krahets (krahets@163.com) +""" + + +def sift_down(nums: list[int], n: int, i: int): + """Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз""" + while True: + # Определить узел с максимальным значением среди i, l и r и обозначить его как ma + l = 2 * i + 1 + r = 2 * i + 2 + ma = i + if l < n and nums[l] > nums[ma]: + ma = l + if r < n and nums[r] > nums[ma]: + ma = r + # Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if ma == i: + break + # Поменять два узла местами + nums[i], nums[ma] = nums[ma], nums[i] + # Циклическое просеивание вниз + i = ma + + +def heap_sort(nums: list[int]): + """Сортировка кучей""" + # Построение кучи: выполнить heapify для всех узлов, кроме листовых + for i in range(len(nums) // 2 - 1, -1, -1): + sift_down(nums, len(nums), i) + # Извлекать максимальный элемент из кучи в течение n-1 итераций + for i in range(len(nums) - 1, 0, -1): + # Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + nums[0], nums[i] = nums[i], nums[0] + # Начиная с корневого узла, выполнить просеивание сверху вниз + sift_down(nums, i, 0) + + +"""Driver Code""" +if __name__ == "__main__": + nums = [4, 1, 3, 1, 5, 2] + heap_sort(nums) + print("После сортировки кучей nums =", nums) diff --git a/ru/codes/python/chapter_sorting/insertion_sort.py b/ru/codes/python/chapter_sorting/insertion_sort.py new file mode 100644 index 000000000..9828f1324 --- /dev/null +++ b/ru/codes/python/chapter_sorting/insertion_sort.py @@ -0,0 +1,25 @@ +""" +File: insertion_sort.py +Created Time: 2022-11-25 +Author: timi (xisunyy@163.com) +""" + + +def insertion_sort(nums: list[int]): + """Сортировка вставками""" + # Внешний цикл: отсортированный диапазон [0, i-1] + for i in range(1, len(nums)): + base = nums[i] + j = i - 1 + # Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1] + while j >= 0 and nums[j] > base: + nums[j + 1] = nums[j] # Сдвинуть nums[j] на одну позицию вправо + j -= 1 + nums[j + 1] = base # Поместить base в правильную позицию + + +"""Driver Code""" +if __name__ == "__main__": + nums = [4, 1, 3, 1, 5, 2] + insertion_sort(nums) + print("После сортировки вставками nums =", nums) diff --git a/ru/codes/python/chapter_sorting/merge_sort.py b/ru/codes/python/chapter_sorting/merge_sort.py new file mode 100644 index 000000000..36fa4c36d --- /dev/null +++ b/ru/codes/python/chapter_sorting/merge_sort.py @@ -0,0 +1,55 @@ +""" +File: merge_sort.py +Created Time: 2022-11-25 +Author: timi (xisunyy@163.com), krahets (krahets@163.com) +""" + + +def merge(nums: list[int], left: int, mid: int, right: int): + """Объединить левый и правый подмассивы""" + # Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right] + # Создать временный массив tmp для хранения результата слияния + tmp = [0] * (right - left + 1) + # Инициализировать начальные индексы левого и правого подмассивов + i, j, k = left, mid + 1, 0 + # Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив + while i <= mid and j <= right: + if nums[i] <= nums[j]: + tmp[k] = nums[i] + i += 1 + else: + tmp[k] = nums[j] + j += 1 + k += 1 + # Скопировать оставшиеся элементы левого и правого подмассивов во временный массив + while i <= mid: + tmp[k] = nums[i] + i += 1 + k += 1 + while j <= right: + tmp[k] = nums[j] + j += 1 + k += 1 + # Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums + for k in range(0, len(tmp)): + nums[left + k] = tmp[k] + + +def merge_sort(nums: list[int], left: int, right: int): + """Сортировка слиянием""" + # Условие завершения + if left >= right: + return # Завершить рекурсию, когда длина подмассива равна 1 + # Этап разбиения + mid = (left + right) // 2 # Вычислить середину + merge_sort(nums, left, mid) # Рекурсивно обработать левый подмассив + merge_sort(nums, mid + 1, right) # Рекурсивно обработать правый подмассив + # Этап слияния + merge(nums, left, mid, right) + + +"""Driver Code""" +if __name__ == "__main__": + nums = [7, 3, 2, 6, 0, 1, 5, 4] + merge_sort(nums, 0, len(nums) - 1) + print("После сортировки слиянием nums =", nums) diff --git a/ru/codes/python/chapter_sorting/quick_sort.py b/ru/codes/python/chapter_sorting/quick_sort.py new file mode 100644 index 000000000..e32b3dc27 --- /dev/null +++ b/ru/codes/python/chapter_sorting/quick_sort.py @@ -0,0 +1,129 @@ +""" +File: quick_sort.py +Created Time: 2022-11-25 +Author: timi (xisunyy@163.com) +""" + + +class QuickSort: + """Класс быстрой сортировки""" + + def partition(self, nums: list[int], left: int, right: int) -> int: + """Разбиение с опорными указателями""" + # Взять nums[left] в качестве опорного элемента + i, j = left, right + while i < j: + while i < j and nums[j] >= nums[left]: + j -= 1 # Идти справа налево в поисках первого элемента меньше опорного + while i < j and nums[i] <= nums[left]: + i += 1 # Идти слева направо в поисках первого элемента больше опорного + # Обмен элементов + nums[i], nums[j] = nums[j], nums[i] + # Переместить опорный элемент на границу двух подмассивов + nums[i], nums[left] = nums[left], nums[i] + return i # Вернуть индекс опорного элемента + + def quick_sort(self, nums: list[int], left: int, right: int): + """Быстрая сортировка""" + # Завершить рекурсию, когда длина подмассива равна 1 + if left >= right: + return + # Разбиение с опорными указателями + pivot = self.partition(nums, left, right) + # Рекурсивно обработать левый и правый подмассивы + self.quick_sort(nums, left, pivot - 1) + self.quick_sort(nums, pivot + 1, right) + + +class QuickSortMedian: + """Класс быстрой сортировки (оптимизация медианным опорным элементом)""" + + def median_three(self, nums: list[int], left: int, mid: int, right: int) -> int: + """Выбрать медиану из трех кандидатов""" + l, m, r = nums[left], nums[mid], nums[right] + if (l <= m <= r) or (r <= m <= l): + return mid # m находится между l и r + if (m <= l <= r) or (r <= l <= m): + return left # l находится между m и r + return right + + def partition(self, nums: list[int], left: int, right: int) -> int: + """Разбиение с опорными указателями (медиана трех)""" + # Взять nums[left] в качестве опорного элемента + med = self.median_three(nums, left, (left + right) // 2, right) + # Переместить медиану в крайний левый элемент массива + nums[left], nums[med] = nums[med], nums[left] + # Взять nums[left] в качестве опорного элемента + i, j = left, right + while i < j: + while i < j and nums[j] >= nums[left]: + j -= 1 # Идти справа налево в поисках первого элемента меньше опорного + while i < j and nums[i] <= nums[left]: + i += 1 # Идти слева направо в поисках первого элемента больше опорного + # Обмен элементов + nums[i], nums[j] = nums[j], nums[i] + # Переместить опорный элемент на границу двух подмассивов + nums[i], nums[left] = nums[left], nums[i] + return i # Вернуть индекс опорного элемента + + def quick_sort(self, nums: list[int], left: int, right: int): + """Быстрая сортировка""" + # Завершить рекурсию, когда длина подмассива равна 1 + if left >= right: + return + # Разбиение с опорными указателями + pivot = self.partition(nums, left, right) + # Рекурсивно обработать левый и правый подмассивы + self.quick_sort(nums, left, pivot - 1) + self.quick_sort(nums, pivot + 1, right) + + +class QuickSortTailCall: + """Класс быстрой сортировки (оптимизация глубины рекурсии)""" + + def partition(self, nums: list[int], left: int, right: int) -> int: + """Разбиение с опорными указателями""" + # Взять nums[left] в качестве опорного элемента + i, j = left, right + while i < j: + while i < j and nums[j] >= nums[left]: + j -= 1 # Идти справа налево в поисках первого элемента меньше опорного + while i < j and nums[i] <= nums[left]: + i += 1 # Идти слева направо в поисках первого элемента больше опорного + # Обмен элементов + nums[i], nums[j] = nums[j], nums[i] + # Переместить опорный элемент на границу двух подмассивов + nums[i], nums[left] = nums[left], nums[i] + return i # Вернуть индекс опорного элемента + + def quick_sort(self, nums: list[int], left: int, right: int): + """Быстрая сортировка (оптимизация глубины рекурсии)""" + # Завершить, когда длина подмассива равна 1 + while left < right: + # Операция разбиения с опорными указателями + pivot = self.partition(nums, left, right) + # Выполнить быструю сортировку для более короткого из двух подмассивов + if pivot - left < right - pivot: + self.quick_sort(nums, left, pivot - 1) # Рекурсивно отсортировать левый подмассив + left = pivot + 1 # Оставшийся неотсортированный диапазон: [pivot + 1, right] + else: + self.quick_sort(nums, pivot + 1, right) # Рекурсивно отсортировать правый подмассив + right = pivot - 1 # Оставшийся неотсортированный диапазон: [left, pivot - 1] + + +"""Driver Code""" +if __name__ == "__main__": + # Быстрая сортировка + nums = [2, 4, 1, 0, 3, 5] + QuickSort().quick_sort(nums, 0, len(nums) - 1) + print("После быстрой сортировки nums =", nums) + + # Быстрая сортировка (оптимизация медианным опорным элементом) + nums1 = [2, 4, 1, 0, 3, 5] + QuickSortMedian().quick_sort(nums1, 0, len(nums1) - 1) + print("После быстрой сортировки (оптимизация медианным опорным элементом) nums =", nums1) + + # Быстрая сортировка (оптимизация глубины рекурсии) + nums2 = [2, 4, 1, 0, 3, 5] + QuickSortTailCall().quick_sort(nums2, 0, len(nums2) - 1) + print("После быстрой сортировки (оптимизация глубины рекурсии) nums =", nums2) diff --git a/ru/codes/python/chapter_sorting/radix_sort.py b/ru/codes/python/chapter_sorting/radix_sort.py new file mode 100644 index 000000000..c7f4d000a --- /dev/null +++ b/ru/codes/python/chapter_sorting/radix_sort.py @@ -0,0 +1,69 @@ +""" +File: radix_sort.py +Created Time: 2023-03-26 +Author: krahets (krahets@163.com) +""" + + +def digit(num: int, exp: int) -> int: + """Получить k-й разряд элемента num, где exp = 10^(k-1)""" + # Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени + return (num // exp) % 10 + + +def counting_sort_digit(nums: list[int], exp: int): + """Сортировка подсчетом (сортировка по k-му разряду nums)""" + # Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10 + counter = [0] * 10 + n = len(nums) + # Подсчитать число появлений каждой цифры от 0 до 9 + for i in range(n): + d = digit(nums[i], exp) # Получить k-й разряд nums[i], обозначив его как d + counter[d] += 1 # Подсчитать число появлений цифры d + # Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива» + for i in range(1, 10): + counter[i] += counter[i - 1] + # Выполняя обратный проход, заполнить res элементами по статистике в корзинах + res = [0] * n + for i in range(n - 1, -1, -1): + d = digit(nums[i], exp) + j = counter[d] - 1 # Получить индекс j цифры d в массиве + res[j] = nums[i] # Поместить текущий элемент по индексу j + counter[d] -= 1 # Уменьшить количество d на 1 + # Перезаписать исходный массив nums результатом + for i in range(n): + nums[i] = res[i] + + +def radix_sort(nums: list[int]): + """Поразрядная сортировка""" + # Получить максимальный элемент массива, чтобы определить максимальное число разрядов + m = max(nums) + # Проходить разряды от младшего к старшему + exp = 1 + while exp <= m: + # Выполнить сортировку подсчетом по k-му разряду элементов массива + # k = 1 -> exp = 1 + # k = 2 -> exp = 10 + # то есть exp = 10^(k-1) + counting_sort_digit(nums, exp) + exp *= 10 + + +"""Driver Code""" +if __name__ == "__main__": + # Поразрядная сортировка + nums = [ + 10546151, + 35663510, + 42865989, + 34862445, + 81883077, + 88906420, + 72429244, + 30524779, + 82060337, + 63832996, + ] + radix_sort(nums) + print("После поразрядной сортировки nums =", nums) diff --git a/ru/codes/python/chapter_sorting/selection_sort.py b/ru/codes/python/chapter_sorting/selection_sort.py new file mode 100644 index 000000000..7562a5486 --- /dev/null +++ b/ru/codes/python/chapter_sorting/selection_sort.py @@ -0,0 +1,26 @@ +""" +File: selection_sort.py +Created Time: 2023-05-22 +Author: krahets (krahets@163.com) +""" + + +def selection_sort(nums: list[int]): + """Сортировка выбором""" + n = len(nums) + # Внешний цикл: неотсортированный диапазон [i, n-1] + for i in range(n - 1): + # Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне + k = i + for j in range(i + 1, n): + if nums[j] < nums[k]: + k = j # Записать индекс минимального элемента + # Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона + nums[i], nums[k] = nums[k], nums[i] + + +"""Driver Code""" +if __name__ == "__main__": + nums = [4, 1, 3, 1, 5, 2] + selection_sort(nums) + print("После сортировки выбором nums =", nums) diff --git a/ru/codes/python/chapter_stack_and_queue/array_deque.py b/ru/codes/python/chapter_stack_and_queue/array_deque.py new file mode 100644 index 000000000..9eb4630fb --- /dev/null +++ b/ru/codes/python/chapter_stack_and_queue/array_deque.py @@ -0,0 +1,129 @@ +""" +File: array_deque.py +Created Time: 2023-03-01 +Author: krahets (krahets@163.com) +""" + + +class ArrayDeque: + """Двусторонняя очередь на основе кольцевого массива""" + + def __init__(self, capacity: int): + """Конструктор""" + self._nums: list[int] = [0] * capacity + self._front: int = 0 + self._size: int = 0 + + def capacity(self) -> int: + """Получить вместимость двусторонней очереди""" + return len(self._nums) + + def size(self) -> int: + """Получение длины двусторонней очереди""" + return self._size + + def is_empty(self) -> bool: + """Проверка, пуста ли двусторонняя очередь""" + return self._size == 0 + + def index(self, i: int) -> int: + """Вычислить индекс в кольцевом массиве""" + # С помощью операции взятия по модулю соединить начало и конец массива + # Когда i выходит за конец массива, он возвращается в начало + # Когда i выходит за начало массива, он возвращается в конец + return (i + self.capacity()) % self.capacity() + + def push_first(self, num: int): + """Добавление в голову очереди""" + if self._size == self.capacity(): + print("Двусторонняя очередь заполнена") + return + # Указатель головы сдвигается на одну позицию влево + # С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост + self._front = self.index(self._front - 1) + # Добавить num в голову очереди + self._nums[self._front] = num + self._size += 1 + + def push_last(self, num: int): + """Добавление в хвост очереди""" + if self._size == self.capacity(): + print("Двусторонняя очередь заполнена") + return + # Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + rear = self.index(self._front + self._size) + # Добавить num в хвост очереди + self._nums[rear] = num + self._size += 1 + + def pop_first(self) -> int: + """Извлечение из головы очереди""" + num = self.peek_first() + # Указатель головы сдвигается на одну позицию назад + self._front = self.index(self._front + 1) + self._size -= 1 + return num + + def pop_last(self) -> int: + """Извлечение из хвоста очереди""" + num = self.peek_last() + self._size -= 1 + return num + + def peek_first(self) -> int: + """Доступ к элементу в начале очереди""" + if self.is_empty(): + raise IndexError("двусторонняя очередь пуста") + return self._nums[self._front] + + def peek_last(self) -> int: + """Доступ к элементу в конце очереди""" + if self.is_empty(): + raise IndexError("двусторонняя очередь пуста") + # Вычислить индекс хвостового элемента + last = self.index(self._front + self._size - 1) + return self._nums[last] + + def to_array(self) -> list[int]: + """Вернуть массив для вывода""" + # Преобразовывать только элементы списка в пределах фактической длины + res = [] + for i in range(self._size): + res.append(self._nums[self.index(self._front + i)]) + return res + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация двусторонней очереди + deque = ArrayDeque(10) + deque.push_last(3) + deque.push_last(2) + deque.push_last(5) + print("Двусторонняя очередь deque =", deque.to_array()) + + # Доступ к элементу + peek_first: int = deque.peek_first() + print("Первый элемент peek_first =", peek_first) + peek_last: int = deque.peek_last() + print("Последний элемент peek_last =", peek_last) + + # Добавление элемента в очередь + deque.push_last(4) + print("После добавления элемента 4 в хвост deque =", deque.to_array()) + deque.push_first(1) + print("После добавления элемента 1 в голову deque =", deque.to_array()) + + # Извлечение элемента из очереди + pop_last: int = deque.pop_last() + print("Извлеченный из хвоста элемент =", pop_last, ", deque после извлечения из хвоста =", deque.to_array()) + pop_first: int = deque.pop_first() + print("Извлеченный из головы элемент =", pop_first, ", deque после извлечения из головы =", deque.to_array()) + + # Получение длины двусторонней очереди + size: int = deque.size() + print("Длина двусторонней очереди size =", size) + + # Проверка, пуста ли двусторонняя очередь + is_empty: bool = deque.is_empty() + print("Пуста ли двусторонняя очередь =", is_empty) diff --git a/ru/codes/python/chapter_stack_and_queue/array_queue.py b/ru/codes/python/chapter_stack_and_queue/array_queue.py new file mode 100644 index 000000000..2164c5c26 --- /dev/null +++ b/ru/codes/python/chapter_stack_and_queue/array_queue.py @@ -0,0 +1,98 @@ +""" +File: array_queue.py +Created Time: 2022-12-01 +Author: Peng Chen (pengchzn@gmail.com) +""" + + +class ArrayQueue: + """Очередь на основе кольцевого массива""" + + def __init__(self, size: int): + """Конструктор""" + self._nums: list[int] = [0] * size # Массив для хранения элементов очереди + self._front: int = 0 # Указатель head, указывающий на первый элемент очереди + self._size: int = 0 # Длина очереди + + def capacity(self) -> int: + """Получить вместимость очереди""" + return len(self._nums) + + def size(self) -> int: + """Получение длины очереди""" + return self._size + + def is_empty(self) -> bool: + """Проверка, пуста ли очередь""" + return self._size == 0 + + def push(self, num: int): + """Поместить в очередь""" + if self._size == self.capacity(): + raise IndexError("очередь заполнена") + # Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + # С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива + rear: int = (self._front + self._size) % self.capacity() + # Добавить num в хвост очереди + self._nums[rear] = num + self._size += 1 + + def pop(self) -> int: + """Извлечь из очереди""" + num: int = self.peek() + # Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива + self._front = (self._front + 1) % self.capacity() + self._size -= 1 + return num + + def peek(self) -> int: + """Доступ к элементу в начале очереди""" + if self.is_empty(): + raise IndexError("очередь пуста") + return self._nums[self._front] + + def to_list(self) -> list[int]: + """Вернуть список для вывода""" + res = [0] * self.size() + j: int = self._front + for i in range(self.size()): + res[i] = self._nums[(j % self.capacity())] + j += 1 + return res + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация очереди + queue = ArrayQueue(10) + + # Добавление элемента в очередь + queue.push(1) + queue.push(3) + queue.push(2) + queue.push(5) + queue.push(4) + print("Очередь queue =", queue.to_list()) + + # Доступ к элементу в начале очереди + peek: int = queue.peek() + print("Первый элемент peek =", peek) + + # Извлечение элемента из очереди + pop: int = queue.pop() + print("Извлеченный элемент pop =", pop) + print("queue после извлечения =", queue.to_list()) + + # Получение длины очереди + size: int = queue.size() + print("Длина очереди size =", size) + + # Проверка, пуста ли очередь + is_empty: bool = queue.is_empty() + print("Пуста ли очередь =", is_empty) + + # Проверка кольцевого массива + for i in range(10): + queue.push(i) + queue.pop() + print("После", i, "-го раунда операций enqueue и dequeue queue =", queue.to_list()) diff --git a/ru/codes/python/chapter_stack_and_queue/array_stack.py b/ru/codes/python/chapter_stack_and_queue/array_stack.py new file mode 100644 index 000000000..b04d3cf9c --- /dev/null +++ b/ru/codes/python/chapter_stack_and_queue/array_stack.py @@ -0,0 +1,72 @@ +""" +File: array_stack.py +Created Time: 2022-11-29 +Author: Peng Chen (pengchzn@gmail.com) +""" + + +class ArrayStack: + """Стек на основе массива""" + + def __init__(self): + """Конструктор""" + self._stack: list[int] = [] + + def size(self) -> int: + """Получение длины стека""" + return len(self._stack) + + def is_empty(self) -> bool: + """Проверка, пуст ли стек""" + return self.size() == 0 + + def push(self, item: int): + """Поместить в стек""" + self._stack.append(item) + + def pop(self) -> int: + """Извлечь из стека""" + if self.is_empty(): + raise IndexError("стек пуст") + return self._stack.pop() + + def peek(self) -> int: + """Доступ к верхнему элементу стека""" + if self.is_empty(): + raise IndexError("стек пуст") + return self._stack[-1] + + def to_list(self) -> list[int]: + """Вернуть список для вывода""" + return self._stack + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация стека + stack = ArrayStack() + + # Помещение элемента в стек + stack.push(1) + stack.push(3) + stack.push(2) + stack.push(5) + stack.push(4) + print("Стек stack =", stack.to_list()) + + # Доступ к верхнему элементу стека + peek: int = stack.peek() + print("Верхний элемент peek =", peek) + + # Извлечение элемента из стека + pop: int = stack.pop() + print("Извлеченный элемент pop =", pop) + print("stack после извлечения =", stack.to_list()) + + # Получение длины стека + size: int = stack.size() + print("Длина стека size =", size) + + # Проверка на пустоту + is_empty: bool = stack.is_empty() + print("Пуст ли стек =", is_empty) diff --git a/ru/codes/python/chapter_stack_and_queue/deque.py b/ru/codes/python/chapter_stack_and_queue/deque.py new file mode 100644 index 000000000..d8993189a --- /dev/null +++ b/ru/codes/python/chapter_stack_and_queue/deque.py @@ -0,0 +1,42 @@ +""" +File: deque.py +Created Time: 2022-11-29 +Author: Peng Chen (pengchzn@gmail.com) +""" + +from collections import deque + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация двусторонней очереди + deq: deque[int] = deque() + + # Добавление элемента в очередь + deq.append(2) # Добавить в хвост очереди + deq.append(5) + deq.append(4) + deq.appendleft(3) # Добавить в голову очереди + deq.appendleft(1) + print("Двусторонняя очередь deque =", deq) + + # Доступ к элементу + front: int = deq[0] # Элемент в голове очереди + print("Первый элемент front =", front) + rear: int = deq[-1] # Элемент в хвосте очереди + print("Последний элемент rear =", rear) + + # Извлечение элемента из очереди + pop_front: int = deq.popleft() # Извлечь элемент из головы очереди + print("Извлеченный из головы элемент pop_front =", pop_front) + print("deque после извлечения из головы =", deq) + pop_rear: int = deq.pop() # Извлечь элемент из хвоста очереди + print("Извлеченный из хвоста элемент pop_rear =", pop_rear) + print("deque после извлечения из хвоста =", deq) + + # Получение длины двусторонней очереди + size: int = len(deq) + print("Длина двусторонней очереди size =", size) + + # Проверка, пуста ли двусторонняя очередь + is_empty: bool = len(deq) == 0 + print("Пуста ли двусторонняя очередь =", is_empty) diff --git a/ru/codes/python/chapter_stack_and_queue/linkedlist_deque.py b/ru/codes/python/chapter_stack_and_queue/linkedlist_deque.py new file mode 100644 index 000000000..481ce94c7 --- /dev/null +++ b/ru/codes/python/chapter_stack_and_queue/linkedlist_deque.py @@ -0,0 +1,151 @@ +""" +File: linkedlist_deque.py +Created Time: 2023-03-01 +Author: krahets (krahets@163.com) +""" + + +class ListNode: + """Узел двусвязного списка""" + + def __init__(self, val: int): + """Конструктор""" + self.val: int = val + self.next: ListNode | None = None # Ссылка на узел-преемник + self.prev: ListNode | None = None # Ссылка на узел-предшественник + + +class LinkedListDeque: + """Двусторонняя очередь на основе двусвязного списка""" + + def __init__(self): + """Конструктор""" + self._front: ListNode | None = None # Головной узел front + self._rear: ListNode | None = None # Хвостовой узел rear + self._size: int = 0 # Длина двусторонней очереди + + def size(self) -> int: + """Получение длины двусторонней очереди""" + return self._size + + def is_empty(self) -> bool: + """Проверка, пуста ли двусторонняя очередь""" + return self._size == 0 + + def push(self, num: int, is_front: bool): + """Операция добавления в очередь""" + node = ListNode(num) + # Если связный список пуст, сделать так, чтобы и front, и rear указывали на node + if self.is_empty(): + self._front = self._rear = node + # Операция добавления в голову очереди + elif is_front: + # Добавить node в голову списка + self._front.prev = node + node.next = self._front + self._front = node # Обновить головной узел + # Операция добавления в хвост очереди + else: + # Добавить node в хвост списка + self._rear.next = node + node.prev = self._rear + self._rear = node # Обновить хвостовой узел + self._size += 1 # Обновить длину очереди + + def push_first(self, num: int): + """Добавление в голову очереди""" + self.push(num, True) + + def push_last(self, num: int): + """Добавление в хвост очереди""" + self.push(num, False) + + def pop(self, is_front: bool) -> int: + """Операция извлечения из очереди""" + if self.is_empty(): + raise IndexError("двусторонняя очередь пуста") + # Операция извлечения из головы очереди + if is_front: + val: int = self._front.val # Временно сохранить значение головного узла + # Удалить головной узел + fnext: ListNode | None = self._front.next + if fnext is not None: + fnext.prev = None + self._front.next = None + self._front = fnext # Обновить головной узел + # Операция извлечения из хвоста очереди + else: + val: int = self._rear.val # Временно сохранить значение хвостового узла + # Удалить хвостовой узел + rprev: ListNode | None = self._rear.prev + if rprev is not None: + rprev.next = None + self._rear.prev = None + self._rear = rprev # Обновить хвостовой узел + self._size -= 1 # Обновить длину очереди + return val + + def pop_first(self) -> int: + """Извлечение из головы очереди""" + return self.pop(True) + + def pop_last(self) -> int: + """Извлечение из хвоста очереди""" + return self.pop(False) + + def peek_first(self) -> int: + """Доступ к элементу в начале очереди""" + if self.is_empty(): + raise IndexError("двусторонняя очередь пуста") + return self._front.val + + def peek_last(self) -> int: + """Доступ к элементу в конце очереди""" + if self.is_empty(): + raise IndexError("двусторонняя очередь пуста") + return self._rear.val + + def to_array(self) -> list[int]: + """Вернуть массив для вывода""" + node = self._front + res = [0] * self.size() + for i in range(self.size()): + res[i] = node.val + node = node.next + return res + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация двусторонней очереди + deque = LinkedListDeque() + deque.push_last(3) + deque.push_last(2) + deque.push_last(5) + print("Двусторонняя очередь deque =", deque.to_array()) + + # Доступ к элементу + peek_first: int = deque.peek_first() + print("Первый элемент peek_first =", peek_first) + peek_last: int = deque.peek_last() + print("Последний элемент peek_last =", peek_last) + + # Добавление элемента в очередь + deque.push_last(4) + print("После добавления элемента 4 в хвост deque =", deque.to_array()) + deque.push_first(1) + print("После добавления элемента 1 в голову deque =", deque.to_array()) + + # Извлечение элемента из очереди + pop_last: int = deque.pop_last() + print("Извлеченный из хвоста элемент =", pop_last, ", deque после извлечения из хвоста =", deque.to_array()) + pop_first: int = deque.pop_first() + print("Извлеченный из головы элемент =", pop_first, ", deque после извлечения из головы =", deque.to_array()) + + # Получение длины двусторонней очереди + size: int = deque.size() + print("Длина двусторонней очереди size =", size) + + # Проверка, пуста ли двусторонняя очередь + is_empty: bool = deque.is_empty() + print("Пуста ли двусторонняя очередь =", is_empty) diff --git a/ru/codes/python/chapter_stack_and_queue/linkedlist_queue.py b/ru/codes/python/chapter_stack_and_queue/linkedlist_queue.py new file mode 100644 index 000000000..98e63ae60 --- /dev/null +++ b/ru/codes/python/chapter_stack_and_queue/linkedlist_queue.py @@ -0,0 +1,97 @@ +""" +File: linkedlist_queue.py +Created Time: 2022-12-01 +Author: Peng Chen (pengchzn@gmail.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import ListNode + + +class LinkedListQueue: + """Очередь на основе связного списка""" + + def __init__(self): + """Конструктор""" + self._front: ListNode | None = None # Головной узел front + self._rear: ListNode | None = None # Хвостовой узел rear + self._size: int = 0 + + def size(self) -> int: + """Получение длины очереди""" + return self._size + + def is_empty(self) -> bool: + """Проверка, пуста ли очередь""" + return self._size == 0 + + def push(self, num: int): + """Поместить в очередь""" + # Добавить num после хвостового узла + node = ListNode(num) + # Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел + if self._front is None: + self._front = node + self._rear = node + # Если очередь не пуста, добавить этот узел после хвостового узла + else: + self._rear.next = node + self._rear = node + self._size += 1 + + def pop(self) -> int: + """Извлечь из очереди""" + num = self.peek() + # Удалить головной узел + self._front = self._front.next + self._size -= 1 + return num + + def peek(self) -> int: + """Доступ к элементу в начале очереди""" + if self.is_empty(): + raise IndexError("очередь пуста") + return self._front.val + + def to_list(self) -> list[int]: + """Преобразовать в список для вывода""" + queue = [] + temp = self._front + while temp: + queue.append(temp.val) + temp = temp.next + return queue + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация очереди + queue = LinkedListQueue() + + # Добавление элемента в очередь + queue.push(1) + queue.push(3) + queue.push(2) + queue.push(5) + queue.push(4) + print("Очередь queue =", queue.to_list()) + + # Доступ к элементу в начале очереди + peek: int = queue.peek() + print("Первый элемент front =", peek) + + # Извлечение элемента из очереди + pop_front: int = queue.pop() + print("Извлеченный элемент pop =", pop_front) + print("queue после извлечения =", queue.to_list()) + + # Получение длины очереди + size: int = queue.size() + print("Длина очереди size =", size) + + # Проверка, пуста ли очередь + is_empty: bool = queue.is_empty() + print("Пуста ли очередь =", is_empty) diff --git a/ru/codes/python/chapter_stack_and_queue/linkedlist_stack.py b/ru/codes/python/chapter_stack_and_queue/linkedlist_stack.py new file mode 100644 index 000000000..8ac670d34 --- /dev/null +++ b/ru/codes/python/chapter_stack_and_queue/linkedlist_stack.py @@ -0,0 +1,89 @@ +""" +File: linkedlist_stack.py +Created Time: 2022-11-29 +Author: Peng Chen (pengchzn@gmail.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import ListNode + + +class LinkedListStack: + """Стек на основе связного списка""" + + def __init__(self): + """Конструктор""" + self._peek: ListNode | None = None + self._size: int = 0 + + def size(self) -> int: + """Получение длины стека""" + return self._size + + def is_empty(self) -> bool: + """Проверка, пуст ли стек""" + return self._size == 0 + + def push(self, val: int): + """Поместить в стек""" + node = ListNode(val) + node.next = self._peek + self._peek = node + self._size += 1 + + def pop(self) -> int: + """Извлечь из стека""" + num = self.peek() + self._peek = self._peek.next + self._size -= 1 + return num + + def peek(self) -> int: + """Доступ к верхнему элементу стека""" + if self.is_empty(): + raise IndexError("стек пуст") + return self._peek.val + + def to_list(self) -> list[int]: + """Преобразовать в список для вывода""" + arr = [] + node = self._peek + while node: + arr.append(node.val) + node = node.next + arr.reverse() + return arr + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация стека + stack = LinkedListStack() + + # Помещение элемента в стек + stack.push(1) + stack.push(3) + stack.push(2) + stack.push(5) + stack.push(4) + print("Стек stack =", stack.to_list()) + + # Доступ к верхнему элементу стека + peek: int = stack.peek() + print("Верхний элемент peek =", peek) + + # Извлечение элемента из стека + pop: int = stack.pop() + print("Извлеченный элемент pop =", pop) + print("stack после извлечения =", stack.to_list()) + + # Получение длины стека + size: int = stack.size() + print("Длина стека size =", size) + + # Проверка на пустоту + is_empty: bool = stack.is_empty() + print("Пуст ли стек =", is_empty) diff --git a/ru/codes/python/chapter_stack_and_queue/queue.py b/ru/codes/python/chapter_stack_and_queue/queue.py new file mode 100644 index 000000000..d68864d96 --- /dev/null +++ b/ru/codes/python/chapter_stack_and_queue/queue.py @@ -0,0 +1,39 @@ +""" +File: queue.py +Created Time: 2022-11-29 +Author: Peng Chen (pengchzn@gmail.com) +""" + +from collections import deque + +"""Driver Code""" +if __name__ == "__main__": + # Инициализировать очередь + # В Python мы обычно рассматриваем двустороннюю очередь deque как очередь + # Хотя queue.Queue() — это «настоящий» класс очереди, им не очень удобно пользоваться + que: deque[int] = deque() + + # Добавление элемента в очередь + que.append(1) + que.append(3) + que.append(2) + que.append(5) + que.append(4) + print("Очередь que =", que) + + # Доступ к элементу в начале очереди + front: int = que[0] + print("Первый элемент front =", front) + + # Извлечение элемента из очереди + pop: int = que.popleft() + print("Извлеченный элемент pop =", pop) + print("que после извлечения =", que) + + # Получение длины очереди + size: int = len(que) + print("Длина очереди size =", size) + + # Проверка, пуста ли очередь + is_empty: bool = len(que) == 0 + print("Пуста ли очередь =", is_empty) diff --git a/ru/codes/python/chapter_stack_and_queue/stack.py b/ru/codes/python/chapter_stack_and_queue/stack.py new file mode 100644 index 000000000..cb8c42f82 --- /dev/null +++ b/ru/codes/python/chapter_stack_and_queue/stack.py @@ -0,0 +1,36 @@ +""" +File: stack.py +Created Time: 2022-11-29 +Author: Peng Chen (pengchzn@gmail.com) +""" + +"""Driver Code""" +if __name__ == "__main__": + # Инициализировать стек + # В Python нет встроенного класса стека, поэтому list можно использовать как стек + stack: list[int] = [] + + # Помещение элемента в стек + stack.append(1) + stack.append(3) + stack.append(2) + stack.append(5) + stack.append(4) + print("Стек stack =", stack) + + # Доступ к верхнему элементу стека + peek: int = stack[-1] + print("Верхний элемент peek =", peek) + + # Извлечение элемента из стека + pop: int = stack.pop() + print("Извлеченный элемент pop =", pop) + print("stack после извлечения =", stack) + + # Получение длины стека + size: int = len(stack) + print("Длина стека size =", size) + + # Проверка на пустоту + is_empty: bool = len(stack) == 0 + print("Пуст ли стек =", is_empty) diff --git a/ru/codes/python/chapter_tree/array_binary_tree.py b/ru/codes/python/chapter_tree/array_binary_tree.py new file mode 100644 index 000000000..42bdf5d23 --- /dev/null +++ b/ru/codes/python/chapter_tree/array_binary_tree.py @@ -0,0 +1,119 @@ +""" +File: array_binary_tree.py +Created Time: 2023-07-19 +Author: krahets (krahets@163.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import TreeNode, list_to_tree, print_tree + + +class ArrayBinaryTree: + """Класс двоичного дерева в массивном представлении""" + + def __init__(self, arr: list[int | None]): + """Конструктор""" + self._tree = list(arr) + + def size(self): + """Вместимость списка""" + return len(self._tree) + + def val(self, i: int) -> int | None: + """Получить значение узла с индексом i""" + # Если индекс выходит за границы, вернуть None, обозначающий пустую позицию + if i < 0 or i >= self.size(): + return None + return self._tree[i] + + def left(self, i: int) -> int | None: + """Получить индекс левого дочернего узла узла с индексом i""" + return 2 * i + 1 + + def right(self, i: int) -> int | None: + """Получить индекс правого дочернего узла узла с индексом i""" + return 2 * i + 2 + + def parent(self, i: int) -> int | None: + """Получить индекс родительского узла узла с индексом i""" + return (i - 1) // 2 + + def level_order(self) -> list[int]: + """Обход в ширину""" + self.res = [] + # Непосредственно обходить массив + for i in range(self.size()): + if self.val(i) is not None: + self.res.append(self.val(i)) + return self.res + + def dfs(self, i: int, order: str): + """Обход в глубину""" + if self.val(i) is None: + return + # Предварительный обход + if order == "pre": + self.res.append(self.val(i)) + self.dfs(self.left(i), order) + # Симметричный обход + if order == "in": + self.res.append(self.val(i)) + self.dfs(self.right(i), order) + # Обратный обход + if order == "post": + self.res.append(self.val(i)) + + def pre_order(self) -> list[int]: + """Предварительный обход""" + self.res = [] + self.dfs(0, order="pre") + return self.res + + def in_order(self) -> list[int]: + """Симметричный обход""" + self.res = [] + self.dfs(0, order="in") + return self.res + + def post_order(self) -> list[int]: + """Обратный обход""" + self.res = [] + self.dfs(0, order="post") + return self.res + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализировать двоичное дерево + # Здесь используется функция, напрямую строящая двоичное дерево из массива + arr = [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15] + root = list_to_tree(arr) + print("\nИнициализация двоичного дерева\n") + print("Массивное представление двоичного дерева:") + print(arr) + print("Связное представление двоичного дерева:") + print_tree(root) + + # Класс двоичного дерева в массивном представлении + abt = ArrayBinaryTree(arr) + + # Доступ к узлу + i = 1 + l, r, p = abt.left(i), abt.right(i), abt.parent(i) + print(f"\nТекущий узел: индекс = {i}, значение = {abt.val(i)}") + print(f"Индекс левого дочернего узла = {l}, значение = {abt.val(l)}") + print(f"Индекс правого дочернего узла = {r}, значение = {abt.val(r)}") + print(f"Индекс родительского узла = {p}, значение = {abt.val(p)}") + + # Обходить дерево + res = abt.level_order() + print("\nОбход в ширину:", res) + res = abt.pre_order() + print("Предварительный обход:", res) + res = abt.in_order() + print("Симметричный обход:", res) + res = abt.post_order() + print("Обратный обход:", res) diff --git a/ru/codes/python/chapter_tree/avl_tree.py b/ru/codes/python/chapter_tree/avl_tree.py new file mode 100644 index 000000000..b8ac7a966 --- /dev/null +++ b/ru/codes/python/chapter_tree/avl_tree.py @@ -0,0 +1,200 @@ +""" +File: avl_tree.py +Created Time: 2022-12-20 +Author: a16su (lpluls001@gmail.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import TreeNode, print_tree + + +class AVLTree: + """AVL-дерево""" + + def __init__(self): + """Конструктор""" + self._root = None + + def get_root(self) -> TreeNode | None: + """Получить корневой узел двоичного дерева""" + return self._root + + def height(self, node: TreeNode | None) -> int: + """Получить высоту узла""" + # Высота пустого узла равна -1, высота листового узла равна 0 + if node is not None: + return node.height + return -1 + + def update_height(self, node: TreeNode | None): + """Обновить высоту узла""" + # Высота узла равна высоте более высокого поддерева + 1 + node.height = max([self.height(node.left), self.height(node.right)]) + 1 + + def balance_factor(self, node: TreeNode | None) -> int: + """Получить коэффициент баланса""" + # Коэффициент баланса пустого узла равен 0 + if node is None: + return 0 + # Коэффициент баланса узла = высота левого поддерева - высота правого поддерева + return self.height(node.left) - self.height(node.right) + + def right_rotate(self, node: TreeNode | None) -> TreeNode | None: + """Операция правого вращения""" + child = node.left + grand_child = child.right + # Выполнить правое вращение узла node вокруг child + child.right = node + node.left = grand_child + # Обновить высоту узла + self.update_height(node) + self.update_height(child) + # Вернуть корневой узел поддерева после вращения + return child + + def left_rotate(self, node: TreeNode | None) -> TreeNode | None: + """Операция левого вращения""" + child = node.right + grand_child = child.left + # Выполнить левое вращение узла node вокруг child + child.left = node + node.right = grand_child + # Обновить высоту узла + self.update_height(node) + self.update_height(child) + # Вернуть корневой узел поддерева после вращения + return child + + def rotate(self, node: TreeNode | None) -> TreeNode | None: + """Выполнить вращение, чтобы снова сбалансировать поддерево""" + # Получить коэффициент баланса узла node + balance_factor = self.balance_factor(node) + # Левосторонне перекошенное дерево + if balance_factor > 1: + if self.balance_factor(node.left) >= 0: + # Правое вращение + return self.right_rotate(node) + else: + # Сначала левое вращение, затем правое + node.left = self.left_rotate(node.left) + return self.right_rotate(node) + # Правосторонне перекошенное дерево + elif balance_factor < -1: + if self.balance_factor(node.right) <= 0: + # Левое вращение + return self.left_rotate(node) + else: + # Сначала правое вращение, затем левое + node.right = self.right_rotate(node.right) + return self.left_rotate(node) + # Дерево сбалансировано, вращение не требуется, вернуть сразу + return node + + def insert(self, val): + """Вставка узла""" + self._root = self.insert_helper(self._root, val) + + def insert_helper(self, node: TreeNode | None, val: int) -> TreeNode: + """Рекурсивная вставка узла (вспомогательный метод)""" + if node is None: + return TreeNode(val) + # 1. Найти позицию вставки и вставить узел + if val < node.val: + node.left = self.insert_helper(node.left, val) + elif val > node.val: + node.right = self.insert_helper(node.right, val) + else: + # Повторяющийся узел не вставлять, сразу вернуть + return node + # Обновить высоту узла + self.update_height(node) + # 2. Выполнить вращение, чтобы снова сбалансировать поддерево + return self.rotate(node) + + def remove(self, val: int): + """Удаление узла""" + self._root = self.remove_helper(self._root, val) + + def remove_helper(self, node: TreeNode | None, val: int) -> TreeNode | None: + """Рекурсивное удаление узла (вспомогательный метод)""" + if node is None: + return None + # 1. Найти узел и удалить его + if val < node.val: + node.left = self.remove_helper(node.left, val) + elif val > node.val: + node.right = self.remove_helper(node.right, val) + else: + if node.left is None or node.right is None: + child = node.left or node.right + # Число дочерних узлов = 0, удалить node и сразу вернуть + if child is None: + return None + # Число дочерних узлов = 1, удалить node напрямую + else: + node = child + else: + # Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел + temp = node.right + while temp.left is not None: + temp = temp.left + node.right = self.remove_helper(node.right, temp.val) + node.val = temp.val + # Обновить высоту узла + self.update_height(node) + # 2. Выполнить вращение, чтобы снова сбалансировать поддерево + return self.rotate(node) + + def search(self, val: int) -> TreeNode | None: + """Поиск узла""" + cur = self._root + # Искать в цикле и выйти после прохода за листовой узел + while cur is not None: + # Целевой узел находится в правом поддереве cur + if cur.val < val: + cur = cur.right + # Целевой узел находится в левом поддереве cur + elif cur.val > val: + cur = cur.left + # Найти целевой узел и выйти из цикла + else: + break + # Вернуть целевой узел + return cur + + +"""Driver Code""" +if __name__ == "__main__": + + def test_insert(tree: AVLTree, val: int): + tree.insert(val) + print("\nПосле вставки узла {} AVL-дерево имеет вид".format(val)) + print_tree(tree.get_root()) + + def test_remove(tree: AVLTree, val: int): + tree.remove(val) + print("\nПосле удаления узла {} AVL-дерево имеет вид".format(val)) + print_tree(tree.get_root()) + + # Инициализация пустого AVL-дерева + avl_tree = AVLTree() + + # Вставка узла + # Обратите внимание, как AVL-дерево сохраняет баланс после вставки узла + for val in [1, 2, 3, 4, 5, 8, 7, 9, 10, 6]: + test_insert(avl_tree, val) + + # Вставка повторяющегося узла + test_insert(avl_tree, 7) + + # Удаление узла + # Обратите внимание, как AVL-дерево сохраняет баланс после удаления узла + test_remove(avl_tree, 8) # Удаление узла степени 0 + test_remove(avl_tree, 5) # Удаление узла степени 1 + test_remove(avl_tree, 4) # Удаление узла степени 2 + + result_node = avl_tree.search(7) + print("\nНайденный объект узла = {}, значение узла = {}".format(result_node, result_node.val)) diff --git a/ru/codes/python/chapter_tree/binary_search_tree.py b/ru/codes/python/chapter_tree/binary_search_tree.py new file mode 100644 index 000000000..3453bfd35 --- /dev/null +++ b/ru/codes/python/chapter_tree/binary_search_tree.py @@ -0,0 +1,146 @@ +""" +File: binary_search_tree.py +Created Time: 2022-12-20 +Author: a16su (lpluls001@gmail.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import TreeNode, print_tree + + +class BinarySearchTree: + """Двоичное дерево поиска""" + + def __init__(self): + """Конструктор""" + # Инициализировать пустое дерево + self._root = None + + def get_root(self) -> TreeNode | None: + """Получить корневой узел двоичного дерева""" + return self._root + + def search(self, num: int) -> TreeNode | None: + """Поиск узла""" + cur = self._root + # Искать в цикле и выйти после прохода за листовой узел + while cur is not None: + # Целевой узел находится в правом поддереве cur + if cur.val < num: + cur = cur.right + # Целевой узел находится в левом поддереве cur + elif cur.val > num: + cur = cur.left + # Найти целевой узел и выйти из цикла + else: + break + return cur + + def insert(self, num: int): + """Вставка узла""" + # Если дерево пусто, инициализировать корневой узел + if self._root is None: + self._root = TreeNode(num) + return + # Искать в цикле и выйти после прохода за листовой узел + cur, pre = self._root, None + while cur is not None: + # Найти повторяющийся узел и сразу вернуть + if cur.val == num: + return + pre = cur + # Позиция вставки находится в правом поддереве cur + if cur.val < num: + cur = cur.right + # Позиция вставки находится в левом поддереве cur + else: + cur = cur.left + # Вставка узла + node = TreeNode(num) + if pre.val < num: + pre.right = node + else: + pre.left = node + + def remove(self, num: int): + """Удаление узла""" + # Если дерево пусто, сразу вернуть + if self._root is None: + return + # Искать в цикле и выйти после прохода за листовой узел + cur, pre = self._root, None + while cur is not None: + # Найти узел для удаления и выйти из цикла + if cur.val == num: + break + pre = cur + # Узел для удаления находится в правом поддереве cur + if cur.val < num: + cur = cur.right + # Узел для удаления находится в левом поддереве cur + else: + cur = cur.left + # Если узел для удаления отсутствует, сразу вернуть + if cur is None: + return + + # Число дочерних узлов = 0 или 1 + if cur.left is None or cur.right is None: + # Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел + child = cur.left or cur.right + # Удалить узел cur + if cur != self._root: + if pre.left == cur: + pre.left = child + else: + pre.right = child + else: + # Если удаляемый узел является корнем, заново назначить корневой узел + self._root = child + # Число дочерних узлов = 2 + else: + # Получить следующий узел после cur в симметричном обходе + tmp: TreeNode = cur.right + while tmp.left is not None: + tmp = tmp.left + # Рекурсивно удалить узел tmp + self.remove(tmp.val) + # Перезаписать cur значением tmp + cur.val = tmp.val + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация двоичного дерева поиска + bst = BinarySearchTree() + nums = [8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15] + # Обратите внимание: разные порядки вставки порождают разные двоичные деревья; данная последовательность может построить совершенное двоичное дерево + for num in nums: + bst.insert(num) + print("\nИсходное двоичное дерево\n") + print_tree(bst.get_root()) + + # Поиск узла + node = bst.search(7) + print("\nНайденный объект узла = {}, значение узла = {}".format(node, node.val)) + + # Вставка узла + bst.insert(16) + print("\nПосле вставки узла 16 двоичное дерево имеет вид\n") + print_tree(bst.get_root()) + + # Удаление узла + bst.remove(1) + print("\nПосле удаления узла 1 двоичное дерево имеет вид\n") + print_tree(bst.get_root()) + + bst.remove(2) + print("\nПосле удаления узла 2 двоичное дерево имеет вид\n") + print_tree(bst.get_root()) + + bst.remove(4) + print("\nПосле удаления узла 4 двоичное дерево имеет вид\n") + print_tree(bst.get_root()) diff --git a/ru/codes/python/chapter_tree/binary_tree.py b/ru/codes/python/chapter_tree/binary_tree.py new file mode 100644 index 000000000..fe4ff8cff --- /dev/null +++ b/ru/codes/python/chapter_tree/binary_tree.py @@ -0,0 +1,41 @@ +""" +File: binary_tree.py +Created Time: 2022-12-20 +Author: a16su (lpluls001@gmail.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import TreeNode, print_tree + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализация двоичного дерева + # Инициализация узлов + n1 = TreeNode(val=1) + n2 = TreeNode(val=2) + n3 = TreeNode(val=3) + n4 = TreeNode(val=4) + n5 = TreeNode(val=5) + # Построить связи между узлами (указатели) + n1.left = n2 + n1.right = n3 + n2.left = n4 + n2.right = n5 + print("\nИнициализация двоичного дерева\n") + print_tree(n1) + + # Вставка и удаление узлов + P = TreeNode(0) + # Вставить узел P между n1 -> n2 + n1.left = P + P.left = n2 + print("\nПосле вставки узла P\n") + print_tree(n1) + # Удаление узла + n1.left = n2 + print("\nПосле удаления узла P\n") + print_tree(n1) diff --git a/ru/codes/python/chapter_tree/binary_tree_bfs.py b/ru/codes/python/chapter_tree/binary_tree_bfs.py new file mode 100644 index 000000000..b7f09ee46 --- /dev/null +++ b/ru/codes/python/chapter_tree/binary_tree_bfs.py @@ -0,0 +1,42 @@ +""" +File: binary_tree_bfs.py +Created Time: 2022-12-20 +Author: a16su (lpluls001@gmail.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import TreeNode, list_to_tree, print_tree +from collections import deque + + +def level_order(root: TreeNode | None) -> list[int]: + """Обход в ширину""" + # Инициализировать очередь и добавить корневой узел + queue: deque[TreeNode] = deque() + queue.append(root) + # Инициализировать список для хранения последовательности обхода + res = [] + while queue: + node: TreeNode = queue.popleft() # Извлечение из очереди + res.append(node.val) # Сохранить значение узла + if node.left is not None: + queue.append(node.left) # Поместить левый дочерний узел в очередь + if node.right is not None: + queue.append(node.right) # Поместить правый дочерний узел в очередь + return res + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализировать двоичное дерево + # Здесь используется функция, напрямую строящая двоичное дерево из массива + root: TreeNode = list_to_tree(arr=[1, 2, 3, 4, 5, 6, 7]) + print("\nИнициализация двоичного дерева\n") + print_tree(root) + + # Обход в ширину + res: list[int] = level_order(root) + print("\nПоследовательность печати узлов при обходе в ширину = ", res) diff --git a/ru/codes/python/chapter_tree/binary_tree_dfs.py b/ru/codes/python/chapter_tree/binary_tree_dfs.py new file mode 100644 index 000000000..aad2ffd34 --- /dev/null +++ b/ru/codes/python/chapter_tree/binary_tree_dfs.py @@ -0,0 +1,65 @@ +""" +File: binary_tree_dfs.py +Created Time: 2022-12-20 +Author: a16su (lpluls001@gmail.com) +""" + +import sys +from pathlib import Path + +sys.path.append(str(Path(__file__).parent.parent)) +from modules import TreeNode, list_to_tree, print_tree + + +def pre_order(root: TreeNode | None): + """Предварительный обход""" + if root is None: + return + # Порядок обхода: корень -> левое поддерево -> правое поддерево + res.append(root.val) + pre_order(root=root.left) + pre_order(root=root.right) + + +def in_order(root: TreeNode | None): + """Симметричный обход""" + if root is None: + return + # Порядок обхода: левое поддерево -> корень -> правое поддерево + in_order(root=root.left) + res.append(root.val) + in_order(root=root.right) + + +def post_order(root: TreeNode | None): + """Обратный обход""" + if root is None: + return + # Порядок обхода: левое поддерево -> правое поддерево -> корень + post_order(root=root.left) + post_order(root=root.right) + res.append(root.val) + + +"""Driver Code""" +if __name__ == "__main__": + # Инициализировать двоичное дерево + # Здесь используется функция, напрямую строящая двоичное дерево из массива + root = list_to_tree(arr=[1, 2, 3, 4, 5, 6, 7]) + print("\nИнициализация двоичного дерева\n") + print_tree(root) + + # Предварительный обход + res = [] + pre_order(root) + print("\nПоследовательность печати узлов при предварительном обходе = ", res) + + # Симметричный обход + res.clear() + in_order(root) + print("\nПоследовательность печати узлов при симметричном обходе = ", res) + + # Обратный обход + res.clear() + post_order(root) + print("\nПоследовательность печати узлов при обратном обходе = ", res) diff --git a/ru/codes/python/modules/__init__.py b/ru/codes/python/modules/__init__.py new file mode 100644 index 000000000..b10799e3c --- /dev/null +++ b/ru/codes/python/modules/__init__.py @@ -0,0 +1,19 @@ +# Follow the PEP 585 - Type Hinting Generics In Standard Collections +# https://peps.python.org/pep-0585/ +from __future__ import annotations + +# Import common libs here to simplify the code by `from module import *` +from .list_node import ( + ListNode, + list_to_linked_list, + linked_list_to_list, +) +from .tree_node import TreeNode, list_to_tree, tree_to_list +from .vertex import Vertex, vals_to_vets, vets_to_vals +from .print_util import ( + print_matrix, + print_linked_list, + print_tree, + print_dict, + print_heap, +) diff --git a/ru/codes/python/modules/list_node.py b/ru/codes/python/modules/list_node.py new file mode 100644 index 000000000..252e5b250 --- /dev/null +++ b/ru/codes/python/modules/list_node.py @@ -0,0 +1,32 @@ +""" +File: list_node.py +Created Time: 2021-12-11 +Author: krahets (krahets@163.com) +""" + + +class ListNode: + """Класс узла связного списка""" + + def __init__(self, val: int): + self.val: int = val # Значение узла + self.next: ListNode | None = None # Ссылка на узел-преемник + + +def list_to_linked_list(arr: list[int]) -> ListNode | None: + """Десериализовать список в связный список""" + dum = head = ListNode(0) + for a in arr: + node = ListNode(a) + head.next = node + head = head.next + return dum.next + + +def linked_list_to_list(head: ListNode | None) -> list[int]: + """Сериализовать связный список в список""" + arr: list[int] = [] + while head: + arr.append(head.val) + head = head.next + return arr diff --git a/ru/codes/python/modules/print_util.py b/ru/codes/python/modules/print_util.py new file mode 100644 index 000000000..d50c63ba8 --- /dev/null +++ b/ru/codes/python/modules/print_util.py @@ -0,0 +1,81 @@ +""" +File: print_util.py +Created Time: 2021-12-11 +Author: krahets (krahets@163.com), msk397 (machangxinq@gmail.com) +""" + +from .tree_node import TreeNode, list_to_tree +from .list_node import ListNode, linked_list_to_list + + +def print_matrix(mat: list[list[int]]): + """Вывести матрицу""" + s = [] + for arr in mat: + s.append(" " + str(arr)) + print("[\n" + ",\n".join(s) + "\n]") + + +def print_linked_list(head: ListNode | None): + """Вывести связный список""" + arr: list[int] = linked_list_to_list(head) + print(" -> ".join([str(a) for a in arr])) + + +class Trunk: + def __init__(self, prev, string: str | None = None): + self.prev = prev + self.str = string + + +def show_trunks(p: Trunk | None): + if p is None: + return + show_trunks(p.prev) + print(p.str, end="") + + +def print_tree( + root: TreeNode | None, prev: Trunk | None = None, is_right: bool = False +): + """ +Вывести двоичное дерево +Этот вывод дерева заимствован из TECHIE DELIGHT +https://www.techiedelight.com/c-program-print-binary-tree/ +""" + if root is None: + return + + prev_str = " " + trunk = Trunk(prev, prev_str) + print_tree(root.right, trunk, True) + + if prev is None: + trunk.str = "———" + elif is_right: + trunk.str = "/———" + prev_str = " |" + else: + trunk.str = "\———" + prev.str = prev_str + + show_trunks(trunk) + print(" " + str(root.val)) + if prev: + prev.str = prev_str + trunk.str = " |" + print_tree(root.left, trunk, False) + + +def print_dict(hmap: dict): + """Вывести словарь""" + for key, value in hmap.items(): + print(key, "->", value) + + +def print_heap(heap: list[int]): + """Вывести кучу""" + print("Массивное представление кучи:", heap) + print("Древовидное представление кучи:") + root: TreeNode | None = list_to_tree(heap) + print_tree(root) diff --git a/ru/codes/python/modules/tree_node.py b/ru/codes/python/modules/tree_node.py new file mode 100644 index 000000000..23b396ef2 --- /dev/null +++ b/ru/codes/python/modules/tree_node.py @@ -0,0 +1,69 @@ +""" +File: tree_node.py +Created Time: 2021-12-11 +Author: krahets (krahets@163.com) +""" + +from collections import deque + + +class TreeNode: + """Класс узла двоичного дерева""" + + def __init__(self, val: int = 0): + self.val: int = val # Значение узла + self.height: int = 0 # Высота узла + self.left: TreeNode | None = None # Ссылка на левый дочерний узел + self.right: TreeNode | None = None # Ссылка на правый дочерний узел + + # Правила кодирования сериализации см.: + # https://www.hello-algo.com/chapter_tree/array_representation_of_tree/ + # Массивное представление двоичного дерева: + # [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15] + # Связное представление двоичного дерева: + # /——— 15 + # /——— 7 + # /——— 3 + # | \——— 6 + # | \——— 12 + # ——— 1 + # \——— 2 + # | /——— 9 + # \——— 4 + # \——— 8 + + +def list_to_tree_dfs(arr: list[int], i: int) -> TreeNode | None: + """Десериализовать список в двоичное дерево: рекурсия""" + # Если индекс выходит за длину массива или соответствующий элемент равен None, вернуть None + if i < 0 or i >= len(arr) or arr[i] is None: + return None + # Построить текущий узел + root = TreeNode(arr[i]) + # Рекурсивно построить левое и правое поддеревья + root.left = list_to_tree_dfs(arr, 2 * i + 1) + root.right = list_to_tree_dfs(arr, 2 * i + 2) + return root + + +def list_to_tree(arr: list[int]) -> TreeNode | None: + """Десериализовать список в двоичное дерево""" + return list_to_tree_dfs(arr, 0) + + +def tree_to_list_dfs(root: TreeNode, i: int, res: list[int]) -> list[int]: + """Сериализовать двоичное дерево в список: рекурсия""" + if root is None: + return + if i >= len(res): + res += [None] * (i - len(res) + 1) + res[i] = root.val + tree_to_list_dfs(root.left, 2 * i + 1, res) + tree_to_list_dfs(root.right, 2 * i + 2, res) + + +def tree_to_list(root: TreeNode | None) -> list[int]: + """Сериализовать двоичное дерево в список""" + res = [] + tree_to_list_dfs(root, 0, res) + return res diff --git a/ru/codes/python/modules/vertex.py b/ru/codes/python/modules/vertex.py new file mode 100644 index 000000000..29e96f479 --- /dev/null +++ b/ru/codes/python/modules/vertex.py @@ -0,0 +1,20 @@ +# File: vertex.py +# Created Time: 2023-02-23 +# Author: krahets (krahets@163.com) + + +class Vertex: + """Класс вершины""" + + def __init__(self, val: int): + self.val = val + + +def vals_to_vets(vals: list[int]) -> list["Vertex"]: + """На вход подается список значений vals, на выходе возвращается список вершин vets""" + return [Vertex(val) for val in vals] + + +def vets_to_vals(vets: list["Vertex"]) -> list[int]: + """На вход подается список вершин vets, на выходе возвращается список значений vals""" + return [vet.val for vet in vets] diff --git a/ru/codes/python/test_all.py b/ru/codes/python/test_all.py new file mode 100644 index 000000000..7c585de87 --- /dev/null +++ b/ru/codes/python/test_all.py @@ -0,0 +1,33 @@ +import os +import glob +import subprocess + +env = os.environ.copy() +env["PYTHONIOENCODING"] = "utf-8" + +if __name__ == "__main__": + # find source code files + src_paths = sorted(glob.glob("chapter_*/*.py")) + errors = [] + + # run python code + for src_path in src_paths: + process = subprocess.Popen( + ["python", src_path], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + env=env, + encoding='utf-8' + ) + # Wait for the process to complete, and get the output and error messages + stdout, stderr = process.communicate() + # Check the exit status + exit_status = process.returncode + if exit_status != 0: + errors.append(stderr) + + print(f"Tested {len(src_paths)} files") + print(f"Found exception in {len(errors)} files") + if len(errors) > 0: + raise RuntimeError("\n\n".join(errors)) diff --git a/ru/codes/pythontutor/chapter_array_and_linkedlist/array.md b/ru/codes/pythontutor/chapter_array_and_linkedlist/array.md new file mode 100644 index 000000000..d6aa1ae0b --- /dev/null +++ b/ru/codes/pythontutor/chapter_array_and_linkedlist/array.md @@ -0,0 +1,23 @@ + + + +https://pythontutor.com/render.html#code=import%20random%0A%0Adef%20random_access%28nums%3A%20list%5Bint%5D%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A1%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%20%D0%BA%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%83%22%22%22%0A%20%20%20%20%23%20%D0%A1%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D0%BC%20%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%BC%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D0%B8%D0%B7%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B0%20%5B0%2C%20len%28nums%29-1%5D%0A%20%20%20%20random_index%20%3D%20random.randint%280%2C%20len%28nums%29%20-%201%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B8%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%0A%20%20%20%20random_num%20%3D%20nums%5Brandom_index%5D%0A%20%20%20%20return%20random_num%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20print%28%22%D0%9C%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20nums%20%3D%22%2C%20nums%29%0A%0A%20%20%20%20%23%20%D0%A1%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%0A%20%20%20%20random_num%3A%20int%20%3D%20random_access%28nums%29%0A%20%20%20%20print%28%22%D0%A1%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20nums%20%3D%22%2C%20random_num%29&cumulative=false&curInstr=7&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20insert%28nums%3A%20list%5Bint%5D%2C%20num%3A%20int%2C%20index%3A%20int%29%3A%0A%20%20%20%20%22%22%22%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20num%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%20index%20%D0%B2%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%22%22%22%0A%20%20%20%20%23%20%D0%A1%D0%B4%D0%B2%D0%B8%D0%BD%D1%83%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D1%81%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%BE%D0%BC%20index%20%D0%B8%20%D0%B2%D1%81%D0%B5%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B8%D0%B5%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D0%BD%D0%B0%20%D0%BE%D0%B4%D0%BD%D1%83%20%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8E%20%D0%BD%D0%B0%D0%B7%D0%B0%D0%B4%0A%20%20%20%20for%20i%20in%20range%28len%28nums%29%20-%201%2C%20index%2C%20-1%29%3A%0A%20%20%20%20%20%20%20%20nums%5Bi%5D%20%3D%20nums%5Bi%20-%201%5D%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%B8%D1%81%D0%B2%D0%BE%D0%B8%D1%82%D1%8C%20num%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%83%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%20index%0A%20%20%20%20nums%5Bindex%5D%20%3D%20num%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20print%28%22%D0%9C%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20nums%20%3D%22%2C%20nums%29%0A%0A%20%20%20%20%23%20%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%0A%20%20%20%20insert%28nums%2C%206%2C%203%29%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%20%D1%87%D0%B8%D1%81%D0%BB%D0%B0%206%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%203%20nums%20%3D%22%2C%20nums%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20remove%28nums%3A%20list%5Bint%5D%2C%20index%3A%20int%29%3A%0A%20%20%20%20%22%22%22%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%20index%22%22%22%0A%20%20%20%20%23%20%D0%A1%D0%B4%D0%B2%D0%B8%D0%BD%D1%83%D1%82%D1%8C%20%D0%B2%D1%81%D0%B5%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%20index%20%D0%BD%D0%B0%20%D0%BE%D0%B4%D0%BD%D1%83%20%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8E%20%D0%B2%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%0A%20%20%20%20for%20i%20in%20range%28index%2C%20len%28nums%29%20-%201%29%3A%0A%20%20%20%20%20%20%20%20nums%5Bi%5D%20%3D%20nums%5Bi%20%2B%201%5D%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20print%28%22%D0%9C%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20nums%20%3D%22%2C%20nums%29%0A%0A%20%20%20%20%23%20%D0%A3%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%0A%20%20%20%20remove%28nums%2C%202%29%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%202%20nums%20%3D%22%2C%20nums%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20traverse%28nums%3A%20list%5Bint%5D%29%3A%0A%20%20%20%20%22%22%22%D0%9E%D0%B1%D1%85%D0%BE%D0%B4%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%22%22%22%0A%20%20%20%20count%20%3D%200%0A%20%20%20%20%23%20%D0%9E%D0%B1%D1%85%D0%BE%D0%B4%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%D0%BC%0A%20%20%20%20for%20i%20in%20range%28len%28nums%29%29%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D%20nums%5Bi%5D%0A%20%20%20%20%23%20%D0%9D%D0%B5%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%0A%20%20%20%20for%20num%20in%20nums%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D%20num%0A%20%20%20%20%23%20%D0%9E%D0%B4%D0%BD%D0%BE%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B%20%D0%B8%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%0A%20%20%20%20for%20i%2C%20num%20in%20enumerate%28nums%29%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D%20nums%5Bi%5D%0A%20%20%20%20%20%20%20%20count%20%2B%3D%20num%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20print%28%22%D0%9C%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20nums%20%3D%22%2C%20nums%29%0A%0A%20%20%20%20%23%20%D0%9E%D0%B1%D1%85%D0%BE%D0%B4%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%0A%20%20%20%20traverse%28nums%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20find%28nums%3A%20list%5Bint%5D%2C%20target%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9D%D0%B0%D0%B9%D1%82%D0%B8%20%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B5%22%22%22%0A%20%20%20%20for%20i%20in%20range%28len%28nums%29%29%3A%0A%20%20%20%20%20%20%20%20if%20nums%5Bi%5D%20%3D%3D%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20i%0A%20%20%20%20return%20-1%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20print%28%22%D0%9C%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20nums%20%3D%22%2C%20nums%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%B8%D1%81%D0%BA%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%0A%20%20%20%20index%3A%20int%20%3D%20find%28nums%2C%203%29%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D0%B8%D1%81%D0%BA%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%203%20%D0%B2%20nums%3A%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%3D%22%2C%20index%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=%23%20%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D0%B5%20%D0%B2%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B5%3A%20list%20%D0%B2%20Python%20%E2%80%94%20%D1%8D%D1%82%D0%BE%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%2C%20%D0%B5%D0%B3%D0%BE%20%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D1%8F%D1%82%D1%8C%20%D0%BD%D0%B0%D0%BF%D1%80%D1%8F%D0%BC%D1%83%D1%8E%0A%23%20%D0%94%D0%BB%D1%8F%20%D1%83%D0%B4%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B0%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%20%D1%8D%D1%82%D0%BE%D0%B9%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20list%20%D1%80%D0%B0%D1%81%D1%81%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D0%B2%D0%B0%D0%B5%D1%82%D1%81%D1%8F%20%D0%BA%D0%B0%D0%BA%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20%D0%BD%D0%B5%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D1%8F%D0%B5%D0%BC%D0%BE%D0%B9%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B%0Adef%20extend%28nums%3A%20list%5Bint%5D%2C%20enlarge%3A%20int%29%20-%3E%20list%5Bint%5D%3A%0A%20%20%20%20%22%22%22%D0%A3%D0%B2%D0%B5%D0%BB%D0%B8%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%83%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%22%22%22%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20%D1%83%D0%B2%D0%B5%D0%BB%D0%B8%D1%87%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B%0A%20%20%20%20res%20%3D%20%5B0%5D%20%2A%20%28len%28nums%29%20%2B%20enlarge%29%0A%20%20%20%20%23%20%D0%A1%D0%BA%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B2%D1%81%D0%B5%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%20%D0%B2%20%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%0A%20%20%20%20for%20i%20in%20range%28len%28nums%29%29%3A%0A%20%20%20%20%20%20%20%20res%5Bi%5D%20%3D%20nums%5Bi%5D%0A%20%20%20%20%23%20%D0%92%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D1%8F%0A%20%20%20%20return%20res%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20print%28%22%D0%9C%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20nums%20%3D%22%2C%20nums%29%0A%0A%20%20%20%20%23%20%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B%0A%20%20%20%20nums%20%3D%20extend%28nums%2C%203%29%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D1%83%D0%B2%D0%B5%D0%BB%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%20%D0%B4%D0%BE%208%20nums%20%3D%22%2C%20nums%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_array_and_linkedlist/linked_list.md b/ru/codes/pythontutor/chapter_array_and_linkedlist/linked_list.md new file mode 100644 index 000000000..f70ba6c57 --- /dev/null +++ b/ru/codes/pythontutor/chapter_array_and_linkedlist/linked_list.md @@ -0,0 +1,17 @@ + + + +https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D1%83%D0%B7%D0%B5%D0%BB-%D0%BF%D1%80%D0%B5%D0%B5%D0%BC%D0%BD%D0%B8%D0%BA%0A%0Adef%20insert%28n0%3A%20ListNode%2C%20P%3A%20ListNode%29%3A%0A%20%20%20%20%22%22%22%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%83%D0%B7%D0%B5%D0%BB%20P%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%20n0%20%D0%B2%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D0%BC%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B5%22%22%22%0A%20%20%20%20n1%20%3D%20n0.next%0A%20%20%20%20P.next%20%3D%20n1%0A%20%20%20%20n0.next%20%3D%20P%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B2%D1%81%D0%B5%D1%85%20%D1%83%D0%B7%D0%BB%D0%BE%D0%B2%0A%20%20%20%20n0%20%3D%20ListNode%281%29%0A%20%20%20%20n1%20%3D%20ListNode%283%29%0A%20%20%20%20n2%20%3D%20ListNode%282%29%0A%20%20%20%20n3%20%3D%20ListNode%285%29%0A%20%20%20%20n4%20%3D%20ListNode%284%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%83%D0%B7%D0%BB%D0%B0%D0%BC%D0%B8%0A%20%20%20%20n0.next%20%3D%20n1%0A%20%20%20%20n1.next%20%3D%20n2%0A%20%20%20%20n2.next%20%3D%20n3%0A%20%20%20%20n3.next%20%3D%20n4%0A%0A%20%20%20%20%23%20%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20p%20%3D%20ListNode%280%29%0A%20%20%20%20insert%28n0%2C%20p%29&cumulative=false&curInstr=39&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D1%83%D0%B7%D0%B5%D0%BB-%D0%BF%D1%80%D0%B5%D0%B5%D0%BC%D0%BD%D0%B8%D0%BA%0A%0Adef%20remove%28n0%3A%20ListNode%29%3A%0A%20%20%20%20%22%22%22%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%20n0%20%D0%B2%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D0%BC%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B5%22%22%22%0A%20%20%20%20if%20not%20n0.next%3A%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20%23%20n0%20-%3E%20P%20-%3E%20n1%0A%20%20%20%20P%20%3D%20n0.next%0A%20%20%20%20n1%20%3D%20P.next%0A%20%20%20%20n0.next%20%3D%20n1%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B2%D1%81%D0%B5%D1%85%20%D1%83%D0%B7%D0%BB%D0%BE%D0%B2%0A%20%20%20%20n0%20%3D%20ListNode%281%29%0A%20%20%20%20n1%20%3D%20ListNode%283%29%0A%20%20%20%20n2%20%3D%20ListNode%282%29%0A%20%20%20%20n3%20%3D%20ListNode%285%29%0A%20%20%20%20n4%20%3D%20ListNode%284%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%83%D0%B7%D0%BB%D0%B0%D0%BC%D0%B8%0A%20%20%20%20n0.next%20%3D%20n1%0A%20%20%20%20n1.next%20%3D%20n2%0A%20%20%20%20n2.next%20%3D%20n3%0A%20%20%20%20n3.next%20%3D%20n4%0A%0A%20%20%20%20%23%20%D0%A3%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20remove%28n0%29&cumulative=false&curInstr=34&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D1%83%D0%B7%D0%B5%D0%BB-%D0%BF%D1%80%D0%B5%D0%B5%D0%BC%D0%BD%D0%B8%D0%BA%0A%0Adef%20access%28head%3A%20ListNode%2C%20index%3A%20int%29%20-%3E%20ListNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%D0%94%D0%BE%D1%81%D1%82%D1%83%D0%BF%20%D0%BA%20%D1%83%D0%B7%D0%BB%D1%83%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%20index%22%22%22%0A%20%20%20%20for%20_%20in%20range%28index%29%3A%0A%20%20%20%20%20%20%20%20if%20not%20head%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%20%20%20%20head%20%3D%20head.next%0A%20%20%20%20return%20head%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B2%D1%81%D0%B5%D1%85%20%D1%83%D0%B7%D0%BB%D0%BE%D0%B2%0A%20%20%20%20n0%20%3D%20ListNode%281%29%0A%20%20%20%20n1%20%3D%20ListNode%283%29%0A%20%20%20%20n2%20%3D%20ListNode%282%29%0A%20%20%20%20n3%20%3D%20ListNode%285%29%0A%20%20%20%20n4%20%3D%20ListNode%284%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%83%D0%B7%D0%BB%D0%B0%D0%BC%D0%B8%0A%20%20%20%20n0.next%20%3D%20n1%0A%20%20%20%20n1.next%20%3D%20n2%0A%20%20%20%20n2.next%20%3D%20n3%0A%20%20%20%20n3.next%20%3D%20n4%0A%0A%20%20%20%20%23%20%D0%94%D0%BE%D1%81%D1%82%D1%83%D0%BF%20%D0%BA%20%D1%83%D0%B7%D0%BB%D1%83%0A%20%20%20%20node%20%3D%20access%28n0%2C%203%29%0A%20%20%20%20print%28%22%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%203%20%D0%B2%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D0%BC%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B5%20%3D%20%7B%7D%22.format%28node.val%29%29&cumulative=false&curInstr=34&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D1%83%D0%B7%D0%B5%D0%BB-%D0%BF%D1%80%D0%B5%D0%B5%D0%BC%D0%BD%D0%B8%D0%BA%0A%0Adef%20find%28head%3A%20ListNode%2C%20target%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9D%D0%B0%D0%B9%D1%82%D0%B8%20%D0%B2%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D0%BC%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B5%20%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%20%D1%81%D0%BE%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC%20target%22%22%22%0A%20%20%20%20index%20%3D%200%0A%20%20%20%20while%20head%3A%0A%20%20%20%20%20%20%20%20if%20head.val%20%3D%3D%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20index%0A%20%20%20%20%20%20%20%20head%20%3D%20head.next%0A%20%20%20%20%20%20%20%20index%20%2B%3D%201%0A%20%20%20%20return%20-1%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B2%D1%81%D0%B5%D1%85%20%D1%83%D0%B7%D0%BB%D0%BE%D0%B2%0A%20%20%20%20n0%20%3D%20ListNode%281%29%0A%20%20%20%20n1%20%3D%20ListNode%283%29%0A%20%20%20%20n2%20%3D%20ListNode%282%29%0A%20%20%20%20n3%20%3D%20ListNode%285%29%0A%20%20%20%20n4%20%3D%20ListNode%284%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%83%D0%B7%D0%BB%D0%B0%D0%BC%D0%B8%0A%20%20%20%20n0.next%20%3D%20n1%0A%20%20%20%20n1.next%20%3D%20n2%0A%20%20%20%20n2.next%20%3D%20n3%0A%20%20%20%20n3.next%20%3D%20n4%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%B8%D1%81%D0%BA%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20index%20%3D%20find%28n0%2C%202%29%0A%20%20%20%20print%28%22%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D1%81%D0%BE%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC%202%20%D0%B2%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D0%BC%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B5%20%3D%20%7B%7D%22.format%28index%29%29&cumulative=false&curInstr=34&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_array_and_linkedlist/my_list.md b/ru/codes/pythontutor/chapter_array_and_linkedlist/my_list.md new file mode 100644 index 000000000..65213d968 --- /dev/null +++ b/ru/codes/pythontutor/chapter_array_and_linkedlist/my_list.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20MyList%3A%0A%0A%20%20%20%20def%20__init__%28self%29%3A%0A%20%20%20%20%20%20%20%20self._capacity%3A%20int%20%3D%2010%0A%20%20%20%20%20%20%20%20self._arr%3A%20list%5Bint%5D%20%3D%20%5B0%5D%20%2A%20self._capacity%0A%20%20%20%20%20%20%20%20self._size%3A%20int%20%3D%200%0A%20%20%20%20%20%20%20%20self._extend_ratio%3A%20int%20%3D%202%0A%0A%20%20%20%20def%20size%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%20self._size%0A%0A%20%20%20%20def%20capacity%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%20self._capacity%0A%0A%20%20%20%20def%20get%28self%2C%20index%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20if%20index%20%3C%200%20or%20index%20%3E%3D%20self._size%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20IndexError%28%27%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D0%B2%D1%8B%D1%85%D0%BE%D0%B4%D0%B8%D1%82%20%D0%B7%D0%B0%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B%27%29%0A%20%20%20%20%20%20%20%20return%20self._arr%5Bindex%5D%0A%0A%20%20%20%20def%20set%28self%2C%20num%3A%20int%2C%20index%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20if%20index%20%3C%200%20or%20index%20%3E%3D%20self._size%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20IndexError%28%27%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D0%B2%D1%8B%D1%85%D0%BE%D0%B4%D0%B8%D1%82%20%D0%B7%D0%B0%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B%27%29%0A%20%20%20%20%20%20%20%20self._arr%5Bindex%5D%20%3D%20num%0A%0A%20%20%20%20def%20add%28self%2C%20num%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20if%20self.size%28%29%20%3D%3D%20self.capacity%28%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.extend_capacity%28%29%0A%20%20%20%20%20%20%20%20self._arr%5Bself._size%5D%20%3D%20num%0A%20%20%20%20%20%20%20%20self._size%20%2B%3D%201%0A%0A%20%20%20%20def%20insert%28self%2C%20num%3A%20int%2C%20index%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20if%20index%20%3C%200%20or%20index%20%3E%3D%20self._size%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20IndexError%28%27%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D0%B2%D1%8B%D1%85%D0%BE%D0%B4%D0%B8%D1%82%20%D0%B7%D0%B0%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B%27%29%0A%20%20%20%20%20%20%20%20%20%20%20%20self.extend_capacity%28%29%0A%20%20%20%20%20%20%20%20for%20j%20in%20range%28self._size%20-%201%2C%20index%20-%201%2C%20-1%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self._arr%5Bj%20%2B%201%5D%20%3D%20self._arr%5Bj%5D%0A%20%20%20%20%20%20%20%20self._arr%5Bindex%5D%20%3D%20num%0A%20%20%20%20%20%20%20%20self._size%20%2B%3D%201%0A%0A%20%20%20%20def%20remove%28self%2C%20index%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20if%20index%20%3C%200%20or%20index%20%3E%3D%20self._size%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20IndexError%28%27%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D0%B2%D1%8B%D1%85%D0%BE%D0%B4%D0%B8%D1%82%20%D0%B7%D0%B0%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B%27%29%0A%20%20%20%20%20%20%20%20num%20%3D%20self._arr%5Bindex%5D%0A%20%20%20%20%20%20%20%20for%20j%20in%20range%28index%2C%20self._size%20-%201%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self._arr%5Bj%5D%20%3D%20self._arr%5Bj%20%2B%201%5D%0A%20%20%20%20%20%20%20%20self._size%20-%3D%201%0A%20%20%20%20%20%20%20%20return%20num%0A%0A%20%20%20%20def%20extend_capacity%28self%29%3A%0A%20%20%20%20%20%20%20%20self._arr%20%3D%20self._arr%20%2B%20%5B0%5D%20%2A%20self.capacity%28%29%20%2A%20%28self._extend_ratio%20-%201%29%0A%20%20%20%20%20%20%20%20self._capacity%20%3D%20len%28self._arr%29%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20nums%20%3D%20MyList%28%29%0A%20%20%20%20nums.add%281%29%0A%20%20%20%20nums.add%283%29%0A%20%20%20%20nums.add%282%29%0A%20%20%20%20nums.add%285%29%0A%20%20%20%20nums.add%284%29%0A%20%20%20%20nums.insert%286%2C%20index%3D3%29%0A%20%20%20%20nums.remove%283%29%0A%20%20%20%20num%20%3D%20nums.get%281%29%0A%20%20%20%20nums.set%280%2C%201%29%0A%20%20%20%20for%20i%20in%20range%2810%29%3A%0A%20%20%20%20%20%20%20%20nums.add%28i%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_backtracking/n_queens.md b/ru/codes/pythontutor/chapter_backtracking/n_queens.md new file mode 100644 index 000000000..cc5b87227 --- /dev/null +++ b/ru/codes/pythontutor/chapter_backtracking/n_queens.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20backtrack%28row%3A%20int%2C%20n%3A%20int%2C%20state%3A%20list%5Blist%5Bstr%5D%5D%2C%20res%3A%20list%5Blist%5Blist%5Bstr%5D%5D%5D%2C%20cols%3A%20list%5Bbool%5D%2C%20diags1%3A%20list%5Bbool%5D%2C%20diags2%3A%20list%5Bbool%5D%29%3A%0A%20%20%20%20if%20row%20%3D%3D%20n%3A%0A%20%20%20%20%20%20%20%20res.append%28%5Blist%28row%29%20for%20row%20in%20state%5D%29%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20for%20col%20in%20range%28n%29%3A%0A%20%20%20%20%20%20%20%20diag1%20%3D%20row%20-%20col%20%2B%20n%20-%201%0A%20%20%20%20%20%20%20%20diag2%20%3D%20row%20%2B%20col%0A%20%20%20%20%20%20%20%20if%20not%20cols%5Bcol%5D%20and%20%28not%20diags1%5Bdiag1%5D%29%20and%20%28not%20diags2%5Bdiag2%5D%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20state%5Brow%5D%5Bcol%5D%20%3D%20%27Q%27%0A%20%20%20%20%20%20%20%20%20%20%20%20cols%5Bcol%5D%20%3D%20diags1%5Bdiag1%5D%20%3D%20diags2%5Bdiag2%5D%20%3D%20True%0A%20%20%20%20%20%20%20%20%20%20%20%20backtrack%28row%20%2B%201%2C%20n%2C%20state%2C%20res%2C%20cols%2C%20diags1%2C%20diags2%29%0A%20%20%20%20%20%20%20%20%20%20%20%20state%5Brow%5D%5Bcol%5D%20%3D%20%27%23%27%0A%20%20%20%20%20%20%20%20%20%20%20%20cols%5Bcol%5D%20%3D%20diags1%5Bdiag1%5D%20%3D%20diags2%5Bdiag2%5D%20%3D%20False%0A%0Adef%20n_queens%28n%3A%20int%29%20-%3E%20list%5Blist%5Blist%5Bstr%5D%5D%5D%3A%0A%20%20%20%20state%20%3D%20%5B%5B%27%23%27%20for%20_%20in%20range%28n%29%5D%20for%20_%20in%20range%28n%29%5D%0A%20%20%20%20cols%20%3D%20%5BFalse%5D%20%2A%20n%0A%20%20%20%20diags1%20%3D%20%5BFalse%5D%20%2A%20%282%20%2A%20n%20-%201%29%0A%20%20%20%20diags2%20%3D%20%5BFalse%5D%20%2A%20%282%20%2A%20n%20-%201%29%0A%20%20%20%20res%20%3D%20%5B%5D%0A%20%20%20%20backtrack%280%2C%20n%2C%20state%2C%20res%2C%20cols%2C%20diags1%2C%20diags2%29%0A%20%20%20%20return%20res%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20n%20%3D%204%0A%20%20%20%20res%20%3D%20n_queens%28n%29%0A%20%20%20%20print%28f%27%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D0%BE%D0%B9%20%D0%B4%D0%BE%D1%81%D0%BA%D0%B8%20%3D%20%7Bn%7D%27%29%0A%20%20%20%20print%28f%27%D0%9A%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE%20%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BE%D0%B2%20%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8%20%D1%84%D0%B5%D1%80%D0%B7%D0%B5%D0%B9%3A%20%7Blen%28res%29%7D%27%29%0A%20%20%20%20for%20state%20in%20res%3A%0A%20%20%20%20%20%20%20%20print%28%27--------------------%27%29%0A%20%20%20%20%20%20%20%20for%20row%20in%20state%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28row%29&cumulative=false&curInstr=61&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_backtracking/permutations_i.md b/ru/codes/pythontutor/chapter_backtracking/permutations_i.md new file mode 100644 index 000000000..fa2931d92 --- /dev/null +++ b/ru/codes/pythontutor/chapter_backtracking/permutations_i.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20backtrack%28%0A%20%20%20%20state%3A%20list%5Bint%5D%2C%20choices%3A%20list%5Bint%5D%2C%20selected%3A%20list%5Bbool%5D%2C%20res%3A%20list%5Blist%5Bint%5D%5D%0A%29%3A%0A%20%20%20%20%22%22%22%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%20%D0%B1%D1%8D%D0%BA%D1%82%D1%80%D0%B5%D0%BA%D0%B8%D0%BD%D0%B3%D0%B0%3A%20%D0%B2%D1%81%D0%B5%20%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8%20I%22%22%22%0A%20%20%20%20%23%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D0%B4%D0%BB%D0%B8%D0%BD%D0%B0%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F%20%D1%80%D0%B0%D0%B2%D0%BD%D0%B0%20%D1%87%D0%B8%D1%81%D0%BB%D1%83%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%2C%20%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%0A%20%20%20%20if%20len%28state%29%20%3D%3D%20len%28choices%29%3A%0A%20%20%20%20%20%20%20%20res.append%28list%28state%29%29%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%B1%D0%BE%D1%80%20%D0%B2%D1%81%D0%B5%D1%85%20%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D0%BE%D0%B2%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0%0A%20%20%20%20for%20i%2C%20choice%20in%20enumerate%28choices%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%9E%D1%82%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%3A%20%D0%BD%D0%B5%D0%BB%D1%8C%D0%B7%D1%8F%20%D0%B2%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D1%82%D1%8C%20%D0%BE%D0%B4%D0%B8%D0%BD%20%D0%B8%20%D1%82%D0%BE%D1%82%20%D0%B6%D0%B5%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D0%BD%D0%BE%0A%20%20%20%20%20%20%20%20if%20not%20selected%5Bi%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%BE%D0%BF%D1%8B%D1%82%D0%BA%D0%B0%3A%20%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%20%D0%B8%20%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5%0A%20%20%20%20%20%20%20%20%20%20%20%20selected%5Bi%5D%20%3D%20True%0A%20%20%20%20%20%20%20%20%20%20%20%20state.append%28choice%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%B9%D1%82%D0%B8%20%D0%BA%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%BC%D1%83%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D1%83%0A%20%20%20%20%20%20%20%20%20%20%20%20backtrack%28state%2C%20choices%2C%20selected%2C%20res%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%9E%D1%82%D0%BA%D0%B0%D1%82%3A%20%D0%BE%D1%82%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%20%D0%B8%20%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D1%8B%D0%B4%D1%83%D1%89%D0%B5%D0%B5%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5%0A%20%20%20%20%20%20%20%20%20%20%20%20selected%5Bi%5D%20%3D%20False%0A%20%20%20%20%20%20%20%20%20%20%20%20state.pop%28%29%0A%0A%0Adef%20permutations_i%28nums%3A%20list%5Bint%5D%29%20-%3E%20list%5Blist%5Bint%5D%5D%3A%0A%20%20%20%20%22%22%22%D0%92%D1%81%D0%B5%20%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8%20I%22%22%22%0A%20%20%20%20res%20%3D%20%5B%5D%0A%20%20%20%20backtrack%28state%3D%5B%5D%2C%20choices%3Dnums%2C%20selected%3D%5BFalse%5D%20%2A%20len%28nums%29%2C%20res%3Dres%29%0A%20%20%20%20return%20res%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20nums%20%3D%20%5B1%2C%202%2C%203%5D%0A%0A%20%20%20%20res%20%3D%20permutations_i%28nums%29%0A%0A%20%20%20%20print%28f%22%D0%92%D1%85%D0%BE%D0%B4%D0%BD%D0%BE%D0%B9%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20nums%20%3D%20%7Bnums%7D%22%29%0A%20%20%20%20print%28f%22%D0%92%D1%81%D0%B5%20%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8%20res%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=13&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_backtracking/permutations_ii.md b/ru/codes/pythontutor/chapter_backtracking/permutations_ii.md new file mode 100644 index 000000000..c7af6e540 --- /dev/null +++ b/ru/codes/pythontutor/chapter_backtracking/permutations_ii.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20backtrack%28%0A%20%20%20%20state%3A%20list%5Bint%5D%2C%20choices%3A%20list%5Bint%5D%2C%20selected%3A%20list%5Bbool%5D%2C%20res%3A%20list%5Blist%5Bint%5D%5D%0A%29%3A%0A%20%20%20%20%22%22%22%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%20%D0%B1%D1%8D%D0%BA%D1%82%D1%80%D0%B5%D0%BA%D0%B8%D0%BD%D0%B3%D0%B0%3A%20%D0%B2%D1%81%D0%B5%20%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8%20II%22%22%22%0A%20%20%20%20%23%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D0%B4%D0%BB%D0%B8%D0%BD%D0%B0%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F%20%D1%80%D0%B0%D0%B2%D0%BD%D0%B0%20%D1%87%D0%B8%D1%81%D0%BB%D1%83%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%2C%20%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%0A%20%20%20%20if%20len%28state%29%20%3D%3D%20len%28choices%29%3A%0A%20%20%20%20%20%20%20%20res.append%28list%28state%29%29%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%B1%D0%BE%D1%80%20%D0%B2%D1%81%D0%B5%D1%85%20%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D0%BE%D0%B2%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0%0A%20%20%20%20duplicated%20%3D%20set%5Bint%5D%28%29%0A%20%20%20%20for%20i%2C%20choice%20in%20enumerate%28choices%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%9E%D1%82%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%3A%20%D0%BD%D0%B5%D0%BB%D1%8C%D0%B7%D1%8F%20%D0%B2%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D1%82%D1%8C%20%D0%BE%D0%B4%D0%B8%D0%BD%20%D0%B8%20%D1%82%D0%BE%D1%82%20%D0%B6%D0%B5%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D0%BD%D0%BE%20%D0%B8%20%D0%BD%D0%B5%D0%BB%D1%8C%D0%B7%D1%8F%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D0%BD%D0%BE%20%D0%B2%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D1%82%D1%8C%20%D1%80%D0%B0%D0%B2%D0%BD%D1%8B%D0%B5%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%0A%20%20%20%20%20%20%20%20if%20not%20selected%5Bi%5D%20and%20choice%20not%20in%20duplicated%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%BE%D0%BF%D1%8B%D1%82%D0%BA%D0%B0%3A%20%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%20%D0%B8%20%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5%0A%20%20%20%20%20%20%20%20%20%20%20%20duplicated.add%28choice%29%20%20%23%20%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%83%D0%B6%D0%B5%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%0A%20%20%20%20%20%20%20%20%20%20%20%20selected%5Bi%5D%20%3D%20True%0A%20%20%20%20%20%20%20%20%20%20%20%20state.append%28choice%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%B9%D1%82%D0%B8%20%D0%BA%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%BC%D1%83%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D1%83%0A%20%20%20%20%20%20%20%20%20%20%20%20backtrack%28state%2C%20choices%2C%20selected%2C%20res%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%9E%D1%82%D0%BA%D0%B0%D1%82%3A%20%D0%BE%D1%82%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%20%D0%B8%20%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D1%8B%D0%B4%D1%83%D1%89%D0%B5%D0%B5%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5%0A%20%20%20%20%20%20%20%20%20%20%20%20selected%5Bi%5D%20%3D%20False%0A%20%20%20%20%20%20%20%20%20%20%20%20state.pop%28%29%0A%0A%0Adef%20permutations_ii%28nums%3A%20list%5Bint%5D%29%20-%3E%20list%5Blist%5Bint%5D%5D%3A%0A%20%20%20%20%22%22%22%D0%92%D1%81%D0%B5%20%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8%20II%22%22%22%0A%20%20%20%20res%20%3D%20%5B%5D%0A%20%20%20%20backtrack%28state%3D%5B%5D%2C%20choices%3Dnums%2C%20selected%3D%5BFalse%5D%20%2A%20len%28nums%29%2C%20res%3Dres%29%0A%20%20%20%20return%20res%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20nums%20%3D%20%5B1%2C%202%2C%202%5D%0A%0A%20%20%20%20res%20%3D%20permutations_ii%28nums%29%0A%0A%20%20%20%20print%28f%22%D0%92%D1%85%D0%BE%D0%B4%D0%BD%D0%BE%D0%B9%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20nums%20%3D%20%7Bnums%7D%22%29%0A%20%20%20%20print%28f%22%D0%92%D1%81%D0%B5%20%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8%20res%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=13&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_backtracking/preorder_traversal_i_compact.md b/ru/codes/pythontutor/chapter_backtracking/preorder_traversal_i_compact.md new file mode 100644 index 000000000..0d0fb0462 --- /dev/null +++ b/ru/codes/pythontutor/chapter_backtracking/preorder_traversal_i_compact.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0%22%22%22%0A%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%20%3D%200%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0Adef%20list_to_tree_dfs%28arr%3A%20list%5Bint%5D%2C%20i%3A%20int%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%D0%94%D0%B5%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%B2%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%3A%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F%22%22%22%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D0%B2%D1%8B%D1%85%D0%BE%D0%B4%D0%B8%D1%82%20%D0%B7%D0%B0%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%83%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%20%D0%B8%D0%BB%D0%B8%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%20None%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20None%0A%20%20%20%20if%20i%20%3C%200%20or%20i%20%3E%3D%20len%28arr%29%20or%20arr%5Bi%5D%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20root%20%3D%20TreeNode%28arr%5Bi%5D%29%0A%20%20%20%20%23%20%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%BE%20%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B5%20%D0%B8%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B5%20%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F%0A%20%20%20%20root.left%20%3D%20list_to_tree_dfs%28arr%2C%202%20%2A%20i%20%2B%201%29%0A%20%20%20%20root.right%20%3D%20list_to_tree_dfs%28arr%2C%202%20%2A%20i%20%2B%202%29%0A%20%20%20%20return%20root%0A%0Adef%20list_to_tree%28arr%3A%20list%5Bint%5D%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%D0%94%D0%B5%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%B2%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%22%22%22%0A%20%20%20%20return%20list_to_tree_dfs%28arr%2C%200%29%0A%0A%0Adef%20pre_order%28root%3A%20TreeNode%29%3A%0A%20%20%20%20%22%22%22%D0%9F%D1%80%D0%B5%D0%B4%D0%B2%D0%B0%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%3A%20%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%201%22%22%22%0A%20%20%20%20if%20root%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20if%20root.val%20%3D%3D%207%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%0A%20%20%20%20%20%20%20%20res.append%28root%29%0A%20%20%20%20pre_order%28root.left%29%0A%20%20%20%20pre_order%28root.right%29%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20root%20%3D%20list_to_tree%28%5B1%2C%207%2C%203%2C%204%2C%205%2C%206%2C%207%5D%29%0A%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%B5%D0%B4%D0%B2%D0%B0%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%0A%20%20%20%20res%20%3D%20list%5BTreeNode%5D%28%29%0A%20%20%20%20pre_order%28root%29%0A%0A%20%20%20%20print%28%22%5Cn%D0%92%D1%81%D0%B5%20%D1%83%D0%B7%D0%BB%D1%8B%20%D1%81%D0%BE%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC%207%22%29%0A%20%20%20%20print%28%5Bnode.val%20for%20node%20in%20res%5D%29&cumulative=false&curInstr=126&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_backtracking/preorder_traversal_ii_compact.md b/ru/codes/pythontutor/chapter_backtracking/preorder_traversal_ii_compact.md new file mode 100644 index 000000000..13360bed8 --- /dev/null +++ b/ru/codes/pythontutor/chapter_backtracking/preorder_traversal_ii_compact.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0%22%22%22%0A%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%20%3D%200%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0Adef%20list_to_tree_dfs%28arr%3A%20list%5Bint%5D%2C%20i%3A%20int%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%D0%94%D0%B5%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%B2%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%3A%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F%22%22%22%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D0%B2%D1%8B%D1%85%D0%BE%D0%B4%D0%B8%D1%82%20%D0%B7%D0%B0%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%83%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%20%D0%B8%D0%BB%D0%B8%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%20None%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20None%0A%20%20%20%20if%20i%20%3C%200%20or%20i%20%3E%3D%20len%28arr%29%20or%20arr%5Bi%5D%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20root%20%3D%20TreeNode%28arr%5Bi%5D%29%0A%20%20%20%20%23%20%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%BE%20%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B5%20%D0%B8%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B5%20%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F%0A%20%20%20%20root.left%20%3D%20list_to_tree_dfs%28arr%2C%202%20%2A%20i%20%2B%201%29%0A%20%20%20%20root.right%20%3D%20list_to_tree_dfs%28arr%2C%202%20%2A%20i%20%2B%202%29%0A%20%20%20%20return%20root%0A%0Adef%20list_to_tree%28arr%3A%20list%5Bint%5D%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%D0%94%D0%B5%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%B2%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%22%22%22%0A%20%20%20%20return%20list_to_tree_dfs%28arr%2C%200%29%0A%0A%0Adef%20pre_order%28root%3A%20TreeNode%29%3A%0A%20%20%20%20%22%22%22%D0%9F%D1%80%D0%B5%D0%B4%D0%B2%D0%B0%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%3A%20%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%202%22%22%22%0A%20%20%20%20if%20root%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BF%D1%8B%D1%82%D0%BA%D0%B0%0A%20%20%20%20path.append%28root%29%0A%20%20%20%20if%20root.val%20%3D%3D%207%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%0A%20%20%20%20%20%20%20%20res.append%28list%28path%29%29%0A%20%20%20%20pre_order%28root.left%29%0A%20%20%20%20pre_order%28root.right%29%0A%20%20%20%20%23%20%D0%9E%D1%82%D0%BA%D0%B0%D1%82%0A%20%20%20%20path.pop%28%29%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20root%20%3D%20list_to_tree%28%5B1%2C%207%2C%203%2C%204%2C%205%2C%206%2C%207%5D%29%0A%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%B5%D0%B4%D0%B2%D0%B0%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%0A%20%20%20%20path%20%3D%20list%5BTreeNode%5D%28%29%0A%20%20%20%20res%20%3D%20list%5Blist%5BTreeNode%5D%5D%28%29%0A%20%20%20%20pre_order%28root%29%0A%0A%20%20%20%20print%28%22%5Cn%D0%92%D1%81%D0%B5%20%D0%BF%D1%83%D1%82%D0%B8%20%D0%BE%D1%82%20%D0%BA%D0%BE%D1%80%D0%BD%D1%8F%20%D0%BA%20%D1%83%D0%B7%D0%BB%D1%83%207%22%29%0A%20%20%20%20for%20path%20in%20res%3A%0A%20%20%20%20%20%20%20%20print%28%5Bnode.val%20for%20node%20in%20path%5D%29&cumulative=false&curInstr=126&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_backtracking/preorder_traversal_iii_compact.md b/ru/codes/pythontutor/chapter_backtracking/preorder_traversal_iii_compact.md new file mode 100644 index 000000000..3bfaedab9 --- /dev/null +++ b/ru/codes/pythontutor/chapter_backtracking/preorder_traversal_iii_compact.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0%22%22%22%0A%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%20%3D%200%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0Adef%20list_to_tree_dfs%28arr%3A%20list%5Bint%5D%2C%20i%3A%20int%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%D0%94%D0%B5%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%B2%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%3A%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F%22%22%22%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D0%B2%D1%8B%D1%85%D0%BE%D0%B4%D0%B8%D1%82%20%D0%B7%D0%B0%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%83%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%20%D0%B8%D0%BB%D0%B8%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%20None%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20None%0A%20%20%20%20if%20i%20%3C%200%20or%20i%20%3E%3D%20len%28arr%29%20or%20arr%5Bi%5D%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20root%20%3D%20TreeNode%28arr%5Bi%5D%29%0A%20%20%20%20%23%20%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%BE%20%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B5%20%D0%B8%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B5%20%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F%0A%20%20%20%20root.left%20%3D%20list_to_tree_dfs%28arr%2C%202%20%2A%20i%20%2B%201%29%0A%20%20%20%20root.right%20%3D%20list_to_tree_dfs%28arr%2C%202%20%2A%20i%20%2B%202%29%0A%20%20%20%20return%20root%0A%0Adef%20list_to_tree%28arr%3A%20list%5Bint%5D%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%D0%94%D0%B5%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%B2%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%22%22%22%0A%20%20%20%20return%20list_to_tree_dfs%28arr%2C%200%29%0A%0A%0Adef%20pre_order%28root%3A%20TreeNode%29%3A%0A%20%20%20%20%22%22%22%D0%9F%D1%80%D0%B5%D0%B4%D0%B2%D0%B0%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%3A%20%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%203%22%22%22%0A%20%20%20%20%23%20%D0%9E%D1%82%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%0A%20%20%20%20if%20root%20is%20None%20or%20root.val%20%3D%3D%203%3A%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BF%D1%8B%D1%82%D0%BA%D0%B0%0A%20%20%20%20path.append%28root%29%0A%20%20%20%20if%20root.val%20%3D%3D%207%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%0A%20%20%20%20%20%20%20%20res.append%28list%28path%29%29%0A%20%20%20%20pre_order%28root.left%29%0A%20%20%20%20pre_order%28root.right%29%0A%20%20%20%20%23%20%D0%9E%D1%82%D0%BA%D0%B0%D1%82%0A%20%20%20%20path.pop%28%29%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20root%20%3D%20list_to_tree%28%5B1%2C%207%2C%203%2C%204%2C%205%2C%206%2C%207%5D%29%0A%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%B5%D0%B4%D0%B2%D0%B0%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%0A%20%20%20%20path%20%3D%20list%5BTreeNode%5D%28%29%0A%20%20%20%20res%20%3D%20list%5Blist%5BTreeNode%5D%5D%28%29%0A%20%20%20%20pre_order%28root%29%0A%0A%20%20%20%20print%28%22%5Cn%D0%92%D1%81%D0%B5%20%D0%BF%D1%83%D1%82%D0%B8%20%D0%BE%D1%82%20%D0%BA%D0%BE%D1%80%D0%BD%D1%8F%20%D0%BA%20%D1%83%D0%B7%D0%BB%D1%83%207%2C%20%D0%BD%D0%B5%20%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D1%89%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%BE%D0%B2%20%D1%81%D0%BE%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC%203%22%29%0A%20%20%20%20for%20path%20in%20res%3A%0A%20%20%20%20%20%20%20%20print%28%5Bnode.val%20for%20node%20in%20path%5D%29&cumulative=false&curInstr=126&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_backtracking/preorder_traversal_iii_template.md b/ru/codes/pythontutor/chapter_backtracking/preorder_traversal_iii_template.md new file mode 100644 index 000000000..1d485838b --- /dev/null +++ b/ru/codes/pythontutor/chapter_backtracking/preorder_traversal_iii_template.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%3D0%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%0A%0Adef%20list_to_tree_dfs%28arr%3A%20list%5Bint%5D%2C%20i%3A%20int%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20if%20i%20%3C%200%20or%20i%20%3E%3D%20len%28arr%29%20or%20arr%5Bi%5D%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20root%20%3D%20TreeNode%28arr%5Bi%5D%29%0A%20%20%20%20root.left%20%3D%20list_to_tree_dfs%28arr%2C%202%20%2A%20i%20%2B%201%29%0A%20%20%20%20root.right%20%3D%20list_to_tree_dfs%28arr%2C%202%20%2A%20i%20%2B%202%29%0A%20%20%20%20return%20root%0A%0Adef%20list_to_tree%28arr%3A%20list%5Bint%5D%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20return%20list_to_tree_dfs%28arr%2C%200%29%0A%0Adef%20is_solution%28state%3A%20list%5BTreeNode%5D%29%20-%3E%20bool%3A%0A%20%20%20%20return%20state%20and%20state%5B-1%5D.val%20%3D%3D%207%0A%0Adef%20record_solution%28state%3A%20list%5BTreeNode%5D%2C%20res%3A%20list%5Blist%5BTreeNode%5D%5D%29%3A%0A%20%20%20%20res.append%28list%28state%29%29%0A%0Adef%20is_valid%28state%3A%20list%5BTreeNode%5D%2C%20choice%3A%20TreeNode%29%20-%3E%20bool%3A%0A%20%20%20%20return%20choice%20is%20not%20None%20and%20choice.val%20%21%3D%203%0A%0Adef%20make_choice%28state%3A%20list%5BTreeNode%5D%2C%20choice%3A%20TreeNode%29%3A%0A%20%20%20%20state.append%28choice%29%0A%0Adef%20undo_choice%28state%3A%20list%5BTreeNode%5D%2C%20choice%3A%20TreeNode%29%3A%0A%20%20%20%20state.pop%28%29%0A%0Adef%20backtrack%28state%3A%20list%5BTreeNode%5D%2C%20choices%3A%20list%5BTreeNode%5D%2C%20res%3A%20list%5Blist%5BTreeNode%5D%5D%29%3A%0A%20%20%20%20if%20is_solution%28state%29%3A%0A%20%20%20%20%20%20%20%20record_solution%28state%2C%20res%29%0A%20%20%20%20for%20choice%20in%20choices%3A%0A%20%20%20%20%20%20%20%20if%20is_valid%28state%2C%20choice%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20make_choice%28state%2C%20choice%29%0A%20%20%20%20%20%20%20%20%20%20%20%20backtrack%28state%2C%20%5Bchoice.left%2C%20choice.right%5D%2C%20res%29%0A%20%20%20%20%20%20%20%20%20%20%20%20undo_choice%28state%2C%20choice%29%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20root%20%3D%20list_to_tree%28%5B1%2C%207%2C%203%2C%204%2C%205%2C%206%2C%207%5D%29%0A%20%20%20%20res%20%3D%20%5B%5D%0A%20%20%20%20backtrack%28state%3D%5B%5D%2C%20choices%3D%5Broot%5D%2C%20res%3Dres%29%0A%20%20%20%20print%28%27%5Cn%D0%92%D1%8B%D0%B2%D0%B5%D1%81%D1%82%D0%B8%20%D0%B2%D1%81%D0%B5%20%D0%BF%D1%83%D1%82%D0%B8%27%29%0A%20%20%20%20for%20path%20in%20res%3A%0A%20%20%20%20%20%20%20%20print%28%5Bnode.val%20for%20node%20in%20path%5D%29&cumulative=false&curInstr=138&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_backtracking/subset_sum_i.md b/ru/codes/pythontutor/chapter_backtracking/subset_sum_i.md new file mode 100644 index 000000000..c72cb3c38 --- /dev/null +++ b/ru/codes/pythontutor/chapter_backtracking/subset_sum_i.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20backtrack%28%0A%20%20%20%20state%3A%20list%5Bint%5D%2C%20target%3A%20int%2C%20choices%3A%20list%5Bint%5D%2C%20start%3A%20int%2C%20res%3A%20list%5Blist%5Bint%5D%5D%0A%29%3A%0A%20%20%20%20%22%22%22%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%20%D0%B1%D1%8D%D0%BA%D1%82%D1%80%D0%B5%D0%BA%D0%B8%D0%BD%D0%B3%D0%B0%3A%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%20I%22%22%22%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%20%D1%80%D0%B0%D0%B2%D0%BD%D0%B0%20target%2C%20%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%0A%20%20%20%20if%20target%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20res.append%28list%28state%29%29%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20%23%20%D0%9E%D0%B1%D0%BE%D0%B9%D1%82%D0%B8%20%D0%B2%D1%81%D0%B5%20%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D1%8B%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0%0A%20%20%20%20%23%20%D0%9E%D1%82%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%202%3A%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%82%D1%8C%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%20%D1%81%20start%2C%20%D1%87%D1%82%D0%BE%D0%B1%D1%8B%20%D0%B8%D0%B7%D0%B1%D0%B5%D0%B6%D0%B0%D1%82%D1%8C%20%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%8E%D1%89%D0%B8%D1%85%D1%81%D1%8F%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%0A%20%20%20%20for%20i%20in%20range%28start%2C%20len%28choices%29%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%9E%D1%82%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%201%3A%20%D0%B5%D1%81%D0%BB%D0%B8%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B0%D0%B5%D1%82%20target%2C%20%D0%BD%D0%B5%D0%BC%D0%B5%D0%B4%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B8%D1%82%D1%8C%20%D1%86%D0%B8%D0%BA%D0%BB%0A%20%20%20%20%20%20%20%20%23%20%D0%AD%D1%82%D0%BE%20%D1%81%D0%B2%D1%8F%D0%B7%D0%B0%D0%BD%D0%BE%20%D1%81%20%D1%82%D0%B5%D0%BC%2C%20%D1%87%D1%82%D0%BE%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20%D1%83%D0%B6%D0%B5%20%D0%BE%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%2C%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B8%D0%B5%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%2C%20%D0%B8%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%20%D1%82%D0%BE%D1%87%D0%BD%D0%BE%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%81%D0%B8%D1%82%20target%0A%20%20%20%20%20%20%20%20if%20target%20-%20choices%5Bi%5D%20%3C%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%BE%D0%BF%D1%8B%D1%82%D0%BA%D0%B0%3A%20%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%20%D0%B8%20%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20target%20%D0%B8%20start%0A%20%20%20%20%20%20%20%20state.append%28choices%5Bi%5D%29%0A%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%B9%D1%82%D0%B8%20%D0%BA%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%BC%D1%83%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D1%83%0A%20%20%20%20%20%20%20%20backtrack%28state%2C%20target%20-%20choices%5Bi%5D%2C%20choices%2C%20i%2C%20res%29%0A%20%20%20%20%20%20%20%20%23%20%D0%9E%D1%82%D0%BA%D0%B0%D1%82%3A%20%D0%BE%D1%82%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%20%D0%B8%20%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D1%8B%D0%B4%D1%83%D1%89%D0%B5%D0%B5%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5%0A%20%20%20%20%20%20%20%20state.pop%28%29%0A%0A%0Adef%20subset_sum_i%28nums%3A%20list%5Bint%5D%2C%20target%3A%20int%29%20-%3E%20list%5Blist%5Bint%5D%5D%3A%0A%20%20%20%20%22%22%22%D0%A0%D0%B5%D1%88%D0%B8%D1%82%D1%8C%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D1%83%20%D1%81%D1%83%D0%BC%D0%BC%D1%8B%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%20I%22%22%22%0A%20%20%20%20state%20%3D%20%5B%5D%20%20%23%20%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5%20%28%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE%29%0A%20%20%20%20nums.sort%28%29%20%20%23%20%D0%9E%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20nums%0A%20%20%20%20start%20%3D%200%20%20%23%20%D0%A1%D1%82%D0%B0%D1%80%D1%82%D0%BE%D0%B2%D0%B0%D1%8F%20%D0%B2%D0%B5%D1%80%D1%88%D0%B8%D0%BD%D0%B0%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B0%0A%20%20%20%20res%20%3D%20%5B%5D%20%20%23%20%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%BE%D0%B2%20%28%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%29%0A%20%20%20%20backtrack%28state%2C%20target%2C%20nums%2C%20start%2C%20res%29%0A%20%20%20%20return%20res%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20nums%20%3D%20%5B3%2C%204%2C%205%5D%0A%20%20%20%20target%20%3D%209%0A%20%20%20%20res%20%3D%20subset_sum_i%28nums%2C%20target%29%0A%0A%20%20%20%20print%28f%22%D0%92%D1%85%D0%BE%D0%B4%D0%BD%D0%BE%D0%B9%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20nums%20%3D%20%7Bnums%7D%2C%20target%20%3D%20%7Btarget%7D%22%29%0A%20%20%20%20print%28f%22%D0%92%D1%81%D0%B5%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%20%D1%81%20%D1%81%D1%83%D0%BC%D0%BC%D0%BE%D0%B9%20%7Btarget%7D%3A%20res%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=16&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_backtracking/subset_sum_i_naive.md b/ru/codes/pythontutor/chapter_backtracking/subset_sum_i_naive.md new file mode 100644 index 000000000..6b5ab1bd5 --- /dev/null +++ b/ru/codes/pythontutor/chapter_backtracking/subset_sum_i_naive.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20backtrack%28%0A%20%20%20%20state%3A%20list%5Bint%5D%2C%0A%20%20%20%20target%3A%20int%2C%0A%20%20%20%20total%3A%20int%2C%0A%20%20%20%20choices%3A%20list%5Bint%5D%2C%0A%20%20%20%20res%3A%20list%5Blist%5Bint%5D%5D%2C%0A%29%3A%0A%20%20%20%20%22%22%22%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%20%D0%B1%D1%8D%D0%BA%D1%82%D1%80%D0%B5%D0%BA%D0%B8%D0%BD%D0%B3%D0%B0%3A%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%20I%22%22%22%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%20%D1%80%D0%B0%D0%B2%D0%BD%D0%B0%20target%2C%20%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%0A%20%20%20%20if%20total%20%3D%3D%20target%3A%0A%20%20%20%20%20%20%20%20res.append%28list%28state%29%29%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%B1%D0%BE%D1%80%20%D0%B2%D1%81%D0%B5%D1%85%20%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D0%BE%D0%B2%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0%0A%20%20%20%20for%20i%20in%20range%28len%28choices%29%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%9E%D1%82%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%3A%20%D0%B5%D1%81%D0%BB%D0%B8%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B0%D0%B5%D1%82%20target%2C%20%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D1%8D%D1%82%D0%BE%D1%82%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%0A%20%20%20%20%20%20%20%20if%20total%20%2B%20choices%5Bi%5D%20%3E%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%BE%D0%BF%D1%8B%D1%82%D0%BA%D0%B0%3A%20%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%20%D0%B8%20%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%20total%0A%20%20%20%20%20%20%20%20state.append%28choices%5Bi%5D%29%0A%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%B9%D1%82%D0%B8%20%D0%BA%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%BC%D1%83%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D1%83%0A%20%20%20%20%20%20%20%20backtrack%28state%2C%20target%2C%20total%20%2B%20choices%5Bi%5D%2C%20choices%2C%20res%29%0A%20%20%20%20%20%20%20%20%23%20%D0%9E%D1%82%D0%BA%D0%B0%D1%82%3A%20%D0%BE%D1%82%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%20%D0%B8%20%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D1%8B%D0%B4%D1%83%D1%89%D0%B5%D0%B5%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5%0A%20%20%20%20%20%20%20%20state.pop%28%29%0A%0A%0Adef%20subset_sum_i_naive%28nums%3A%20list%5Bint%5D%2C%20target%3A%20int%29%20-%3E%20list%5Blist%5Bint%5D%5D%3A%0A%20%20%20%20%22%22%22%D0%A0%D0%B5%D1%88%D0%B8%D1%82%D1%8C%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D1%83%20%D1%81%D1%83%D0%BC%D0%BC%D1%8B%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%20I%20%28%D1%81%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%8E%D1%89%D0%B8%D0%BC%D0%B8%D1%81%D1%8F%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%D0%BC%D0%B8%29%22%22%22%0A%20%20%20%20state%20%3D%20%5B%5D%20%20%23%20%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5%20%28%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE%29%0A%20%20%20%20total%20%3D%200%20%20%23%20%D0%A1%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%0A%20%20%20%20res%20%3D%20%5B%5D%20%20%23%20%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%BE%D0%B2%20%28%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%29%0A%20%20%20%20backtrack%28state%2C%20target%2C%20total%2C%20nums%2C%20res%29%0A%20%20%20%20return%20res%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20nums%20%3D%20%5B3%2C%204%2C%205%5D%0A%20%20%20%20target%20%3D%209%0A%20%20%20%20res%20%3D%20subset_sum_i_naive%28nums%2C%20target%29%0A%0A%20%20%20%20print%28f%22%D0%92%D1%85%D0%BE%D0%B4%D0%BD%D0%BE%D0%B9%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20nums%20%3D%20%7Bnums%7D%2C%20target%20%3D%20%7Btarget%7D%22%29%0A%20%20%20%20print%28f%22%D0%92%D1%81%D0%B5%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%20%D1%81%20%D1%81%D1%83%D0%BC%D0%BC%D0%BE%D0%B9%20%7Btarget%7D%3A%20res%20%3D%20%7Bres%7D%22%29%0A%20%20%20%20print%28f%22%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D0%B5%20%D0%B2%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B5%3A%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%20%D1%8D%D1%82%D0%BE%D0%B3%D0%BE%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0%20%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D1%82%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%8E%D1%89%D0%B8%D0%B5%D1%81%D1%8F%20%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%22%29&cumulative=false&curInstr=16&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_backtracking/subset_sum_ii.md b/ru/codes/pythontutor/chapter_backtracking/subset_sum_ii.md new file mode 100644 index 000000000..634040f9f --- /dev/null +++ b/ru/codes/pythontutor/chapter_backtracking/subset_sum_ii.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20backtrack%28state%3A%20list%5Bint%5D%2C%20target%3A%20int%2C%20choices%3A%20list%5Bint%5D%2C%20start%3A%20int%2C%20res%3A%20list%5Blist%5Bint%5D%5D%29%3A%0A%20%20%20%20if%20target%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20res.append%28list%28state%29%29%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20for%20i%20in%20range%28start%2C%20len%28choices%29%29%3A%0A%20%20%20%20%20%20%20%20if%20target%20-%20choices%5Bi%5D%20%3C%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20if%20i%20%3E%20start%20and%20choices%5Bi%5D%20%3D%3D%20choices%5Bi%20-%201%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20state.append%28choices%5Bi%5D%29%0A%20%20%20%20%20%20%20%20backtrack%28state%2C%20target%20-%20choices%5Bi%5D%2C%20choices%2C%20i%20%2B%201%2C%20res%29%0A%20%20%20%20%20%20%20%20state.pop%28%29%0A%0Adef%20subset_sum_ii%28nums%3A%20list%5Bint%5D%2C%20target%3A%20int%29%20-%3E%20list%5Blist%5Bint%5D%5D%3A%0A%20%20%20%20state%20%3D%20%5B%5D%0A%20%20%20%20nums.sort%28%29%0A%20%20%20%20start%20%3D%200%0A%20%20%20%20res%20%3D%20%5B%5D%0A%20%20%20%20backtrack%28state%2C%20target%2C%20nums%2C%20start%2C%20res%29%0A%20%20%20%20return%20res%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20nums%20%3D%20%5B4%2C%204%2C%205%5D%0A%20%20%20%20target%20%3D%209%0A%20%20%20%20res%20%3D%20subset_sum_ii%28nums%2C%20target%29%0A%20%20%20%20print%28f%27%D0%92%D1%85%D0%BE%D0%B4%D0%BD%D0%BE%D0%B9%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20nums%20%3D%20%7Bnums%7D%2C%20target%20%3D%20%7Btarget%7D%27%29%0A%20%20%20%20print%28f%27%D0%92%D1%81%D0%B5%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%20%D1%81%20%D1%81%D1%83%D0%BC%D0%BC%D0%BE%D0%B9%20%7Btarget%7D%3A%20res%20%3D%20%7Bres%7D%27%29&cumulative=false&curInstr=16&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_computational_complexity/iteration.md b/ru/codes/pythontutor/chapter_computational_complexity/iteration.md new file mode 100644 index 000000000..f69849e66 --- /dev/null +++ b/ru/codes/pythontutor/chapter_computational_complexity/iteration.md @@ -0,0 +1,29 @@ + + + +https://pythontutor.com/render.html#code=def%20for_loop%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A6%D0%B8%D0%BA%D0%BB%20for%22%22%22%0A%20%20%20%20res%20%3D%200%0A%20%20%20%20%23%20%D0%A6%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D1%81%D1%83%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%201%2C%202%2C%20...%2C%20n-1%2C%20n%0A%20%20%20%20for%20i%20in%20range%281%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20res%20%2B%3D%20i%0A%20%20%20%20return%20res%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20res%20%3D%20for_loop%28n%29%0A%20%20%20%20print%28f%22%5Cn%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%20%D1%81%D1%83%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%B2%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B5%20for%20res%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D& + + +https://pythontutor.com/render.html#code=def%20while_loop%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A6%D0%B8%D0%BA%D0%BB%20while%22%22%22%0A%20%20%20%20res%20%3D%200%0A%20%20%20%20i%20%3D%201%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%BD%D0%BE%D0%B9%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9%0A%20%20%20%20%23%20%D0%A6%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D1%81%D1%83%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%201%2C%202%2C%20...%2C%20n-1%2C%20n%0A%20%20%20%20while%20i%20%3C%3D%20n%3A%0A%20%20%20%20%20%20%20%20res%20%2B%3D%20i%0A%20%20%20%20%20%20%20%20i%20%2B%3D%201%20%20%23%20%D0%9E%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%BD%D1%83%D1%8E%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%83%D1%8E%0A%20%20%20%20return%20res%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20res%20%3D%20while_loop%28n%29%0A%20%20%20%20print%28f%22%5Cn%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%20%D1%81%D1%83%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%B2%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B5%20while%20res%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20while_loop_ii%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A6%D0%B8%D0%BA%D0%BB%20while%20%28%D0%B4%D0%B2%D0%BE%D0%B9%D0%BD%D0%BE%D0%B5%20%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%29%22%22%22%0A%20%20%20%20res%20%3D%200%0A%20%20%20%20i%20%3D%201%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%BD%D0%BE%D0%B9%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9%0A%20%20%20%20%23%20%D0%A6%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D1%81%D1%83%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%201%2C%204%2C%2010%2C%20...%0A%20%20%20%20while%20i%20%3C%3D%20n%3A%0A%20%20%20%20%20%20%20%20res%20%2B%3D%20i%0A%20%20%20%20%20%20%20%20%23%20%D0%9E%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%BD%D1%83%D1%8E%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%83%D1%8E%0A%20%20%20%20%20%20%20%20i%20%2B%3D%201%0A%20%20%20%20%20%20%20%20i%20%2A%3D%202%0A%20%20%20%20return%20res%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20res%20%3D%20while_loop_ii%28n%29%0A%20%20%20%20print%28f%22%5Cn%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%20%D1%81%D1%83%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%B2%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B5%20while%20%28%D0%B4%D0%B2%D0%BE%D0%B9%D0%BD%D0%BE%D0%B5%20%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%29%20res%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20nested_for_loop%28n%3A%20int%29%20-%3E%20str%3A%0A%20%20%20%20%22%22%22%D0%94%D0%B2%D0%BE%D0%B9%D0%BD%D0%BE%D0%B9%20%D1%86%D0%B8%D0%BA%D0%BB%20for%22%22%22%0A%20%20%20%20res%20%3D%20%22%22%0A%20%20%20%20%23%20%D0%A6%D0%B8%D0%BA%D0%BB%20%D0%BF%D0%BE%20i%20%3D%201%2C%202%2C%20...%2C%20n-1%2C%20n%0A%20%20%20%20for%20i%20in%20range%281%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%A6%D0%B8%D0%BA%D0%BB%20%D0%BF%D0%BE%20j%20%3D%201%2C%202%2C%20...%2C%20n-1%2C%20n%0A%20%20%20%20%20%20%20%20for%20j%20in%20range%281%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20res%20%2B%3D%20f%22%28%7Bi%7D%2C%20%7Bj%7D%29%2C%20%22%0A%20%20%20%20return%20res%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20res%20%3D%20nested_for_loop%28n%29%0A%20%20%20%20print%28f%22%5Cn%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B0%20%D0%B2%20%D0%B4%D0%B2%D0%BE%D0%B9%D0%BD%D0%BE%D0%BC%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B5%20for%20%7Bres%7D%22%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20recur%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F%22%22%22%0A%20%20%20%20%23%20%D0%A3%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D0%B5%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%0A%20%20%20%20if%20n%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20return%201%0A%20%20%20%20%23%20%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F%3A%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%0A%20%20%20%20res%20%3D%20recur%28n%20-%201%29%0A%20%20%20%20%23%20%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%3A%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%0A%20%20%20%20return%20n%20%2B%20res%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20res%20%3D%20recur%28n%29%0A%20%20%20%20print%28f%22%5Cn%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%20%D1%81%D1%83%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%B2%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%BE%D0%B9%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20res%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20tail_recur%28n%2C%20res%29%3A%0A%20%20%20%20%22%22%22%D0%A5%D0%B2%D0%BE%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F%22%22%22%0A%20%20%20%20%23%20%D0%A3%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D0%B5%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%0A%20%20%20%20if%20n%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20return%20res%0A%20%20%20%20%23%20%D0%A5%D0%B2%D0%BE%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%0A%20%20%20%20return%20tail_recur%28n%20-%201%2C%20res%20%2B%20n%29%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20res%20%3D%20tail_recur%28n%2C%200%29%0A%20%20%20%20print%28f%22%5Cn%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%20%D1%81%D1%83%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%B2%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8%20res%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20fib%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8%3A%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F%22%22%22%0A%20%20%20%20%23%20%D0%A3%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D0%B5%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%3A%20f%281%29%20%3D%200%2C%20f%282%29%20%3D%201%0A%20%20%20%20if%20n%20%3D%3D%201%20or%20n%20%3D%3D%202%3A%0A%20%20%20%20%20%20%20%20return%20n%20-%201%0A%20%20%20%20%23%20%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%20f%28n%29%20%3D%20f%28n-1%29%20%2B%20f%28n-2%29%0A%20%20%20%20res%20%3D%20fib%28n%20-%201%29%20%2B%20fib%28n%20-%202%29%0A%20%20%20%20%23%20%D0%92%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%20f%28n%29%0A%20%20%20%20return%20res%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20res%20%3D%20fib%28n%29%0A%20%20%20%20print%28f%22%5Cn%D0%A7%D0%BB%D0%B5%D0%BD%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8%20%D1%81%20%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%BE%D0%BC%20%7Bn%7D%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20for_loop_recur%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%98%D0%BC%D0%B8%D1%82%D0%B0%D1%86%D0%B8%D1%8F%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8%20%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%22%22%22%0A%20%20%20%20%23%20%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%8F%D0%B2%D0%BD%D1%8B%D0%B9%20%D1%81%D1%82%D0%B5%D0%BA%20%D0%B4%D0%BB%D1%8F%20%D0%B8%D0%BC%D0%B8%D1%82%D0%B0%D1%86%D0%B8%D0%B8%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%BE%D0%B2%0A%20%20%20%20stack%20%3D%20%5B%5D%0A%20%20%20%20res%20%3D%200%0A%20%20%20%20%23%20%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F%3A%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%0A%20%20%20%20for%20i%20in%20range%28n%2C%200%2C%20-1%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%98%D0%BC%D0%B8%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%C2%AB%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8E%C2%BB%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8%20%D0%BF%D0%BE%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%20%D1%81%D1%82%D0%B5%D0%BA%0A%20%20%20%20%20%20%20%20stack.append%28i%29%0A%20%20%20%20%23%20%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%3A%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%0A%20%20%20%20while%20stack%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%98%D0%BC%D0%B8%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%C2%AB%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%C2%BB%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B8%D0%B7%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%0A%20%20%20%20%20%20%20%20res%20%2B%3D%20stack.pop%28%29%0A%20%20%20%20%23%20res%20%3D%201%2B2%2B3%2B...%2Bn%0A%20%20%20%20return%20res%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20res%20%3D%20for_loop_recur%28n%29%0A%20%20%20%20print%28f%22%5Cn%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%20%D1%81%D1%83%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%BF%D1%80%D0%B8%20%D0%B8%D0%BC%D0%B8%D1%82%D0%B0%D1%86%D0%B8%D0%B8%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8%20res%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_computational_complexity/recursion.md b/ru/codes/pythontutor/chapter_computational_complexity/recursion.md new file mode 100644 index 000000000..bf686c970 --- /dev/null +++ b/ru/codes/pythontutor/chapter_computational_complexity/recursion.md @@ -0,0 +1,17 @@ + + + +https://pythontutor.com/render.html#code=def%20recur%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F%22%22%22%0A%20%20%20%20%23%20%D0%A3%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D0%B5%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%0A%20%20%20%20if%20n%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20return%201%0A%20%20%20%20%23%20%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F%3A%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%0A%20%20%20%20res%20%3D%20recur%28n%20-%201%29%0A%20%20%20%20%23%20%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%3A%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%0A%20%20%20%20return%20n%20%2B%20res%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20res%20%3D%20recur%28n%29%0A%20%20%20%20print%28f%22%5Cn%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%20%D1%81%D1%83%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%B2%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%BE%D0%B9%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20res%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20tail_recur%28n%2C%20res%29%3A%0A%20%20%20%20%22%22%22%D0%A5%D0%B2%D0%BE%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F%22%22%22%0A%20%20%20%20%23%20%D0%A3%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D0%B5%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%0A%20%20%20%20if%20n%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20return%20res%0A%20%20%20%20%23%20%D0%A5%D0%B2%D0%BE%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%0A%20%20%20%20return%20tail_recur%28n%20-%201%2C%20res%20%2B%20n%29%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20res%20%3D%20tail_recur%28n%2C%200%29%0A%20%20%20%20print%28f%22%5Cn%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%20%D1%81%D1%83%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%B2%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8%20res%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20fib%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8%3A%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F%22%22%22%0A%20%20%20%20%23%20%D0%A3%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D0%B5%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%3A%20f%281%29%20%3D%200%2C%20f%282%29%20%3D%201%0A%20%20%20%20if%20n%20%3D%3D%201%20or%20n%20%3D%3D%202%3A%0A%20%20%20%20%20%20%20%20return%20n%20-%201%0A%20%20%20%20%23%20%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%20f%28n%29%20%3D%20f%28n-1%29%20%2B%20f%28n-2%29%0A%20%20%20%20res%20%3D%20fib%28n%20-%201%29%20%2B%20fib%28n%20-%202%29%0A%20%20%20%20%23%20%D0%92%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%20f%28n%29%0A%20%20%20%20return%20res%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20res%20%3D%20fib%28n%29%0A%20%20%20%20print%28f%22%5Cn%D0%A7%D0%BB%D0%B5%D0%BD%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8%20%D1%81%20%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%BE%D0%BC%20%7Bn%7D%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20for_loop_recur%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%98%D0%BC%D0%B8%D1%82%D0%B0%D1%86%D0%B8%D1%8F%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8%20%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%22%22%22%0A%20%20%20%20%23%20%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%8F%D0%B2%D0%BD%D1%8B%D0%B9%20%D1%81%D1%82%D0%B5%D0%BA%20%D0%B4%D0%BB%D1%8F%20%D0%B8%D0%BC%D0%B8%D1%82%D0%B0%D1%86%D0%B8%D0%B8%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%BE%D0%B2%0A%20%20%20%20stack%20%3D%20%5B%5D%0A%20%20%20%20res%20%3D%200%0A%20%20%20%20%23%20%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F%3A%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%0A%20%20%20%20for%20i%20in%20range%28n%2C%200%2C%20-1%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%98%D0%BC%D0%B8%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%C2%AB%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8E%C2%BB%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8%20%D0%BF%D0%BE%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%20%D1%81%D1%82%D0%B5%D0%BA%0A%20%20%20%20%20%20%20%20stack.append%28i%29%0A%20%20%20%20%23%20%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%3A%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%0A%20%20%20%20while%20stack%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%98%D0%BC%D0%B8%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%C2%AB%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%C2%BB%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B8%D0%B7%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%0A%20%20%20%20%20%20%20%20res%20%2B%3D%20stack.pop%28%29%0A%20%20%20%20%23%20res%20%3D%201%2B2%2B3%2B...%2Bn%0A%20%20%20%20return%20res%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20res%20%3D%20for_loop_recur%28n%29%0A%20%20%20%20print%28f%22%5Cn%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%20%D1%81%D1%83%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%BF%D1%80%D0%B8%20%D0%B8%D0%BC%D0%B8%D1%82%D0%B0%D1%86%D0%B8%D0%B8%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8%20res%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_computational_complexity/space_complexity.md b/ru/codes/pythontutor/chapter_computational_complexity/space_complexity.md new file mode 100644 index 000000000..bd2d835ee --- /dev/null +++ b/ru/codes/pythontutor/chapter_computational_complexity/space_complexity.md @@ -0,0 +1,23 @@ + + + +https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D1%83%D0%B7%D0%B5%D0%BB-%D0%BF%D1%80%D0%B5%D0%B5%D0%BC%D0%BD%D0%B8%D0%BA%0A%0Adef%20function%28%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%22%22%22%0A%20%20%20%20%23%20%D0%92%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D1%8C%20%D0%BD%D0%B5%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8%0A%20%20%20%20return%200%0A%0Adef%20constant%28n%3A%20int%29%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%22%22%22%0A%20%20%20%20%23%20%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82%D1%8B%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%B8%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20%D0%B7%D0%B0%D0%BD%D0%B8%D0%BC%D0%B0%D1%8E%D1%82%20O%281%29%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%0A%20%20%20%20a%20%3D%200%0A%20%20%20%20nums%20%3D%20%5B0%5D%20%2A%2010%0A%20%20%20%20node%20%3D%20ListNode%280%29%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%B2%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B5%20%D0%B7%D0%B0%D0%BD%D0%B8%D0%BC%D0%B0%D1%8E%D1%82%20O%281%29%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%0A%20%20%20%20for%20_%20in%20range%28n%29%3A%0A%20%20%20%20%20%20%20%20c%20%3D%200%0A%20%20%20%20%23%20%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20%D0%B2%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B5%20%D0%B7%D0%B0%D0%BD%D0%B8%D0%BC%D0%B0%D1%8E%D1%82%20O%281%29%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%0A%20%20%20%20for%20_%20in%20range%28n%29%3A%0A%20%20%20%20%20%20%20%20function%28%29%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%0A%20%20%20%20constant%28n%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20linear%28n%3A%20int%29%3A%0A%20%20%20%20%22%22%22%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%22%22%22%0A%20%20%20%20%23%20%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B%20n%20%D0%B7%D0%B0%D0%BD%D0%B8%D0%BC%D0%B0%D0%B5%D1%82%20O%28n%29%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%0A%20%20%20%20nums%20%3D%20%5B0%5D%20%2A%20n%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B%20n%20%D0%B7%D0%B0%D0%BD%D0%B8%D0%BC%D0%B0%D0%B5%D1%82%20O%28n%29%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%0A%20%20%20%20hmap%20%3D%20dict%5Bint%2C%20str%5D%28%29%0A%20%20%20%20for%20i%20in%20range%28n%29%3A%0A%20%20%20%20%20%20%20%20hmap%5Bi%5D%20%3D%20str%28i%29%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20%23%20%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%0A%20%20%20%20linear%28n%29&cumulative=false&curInstr=20&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20linear_recur%28n%3A%20int%29%3A%0A%20%20%20%20%22%22%22%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%28%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%29%22%22%22%0A%20%20%20%20print%28%22%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F%20n%20%3D%22%2C%20n%29%0A%20%20%20%20if%20n%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20linear_recur%28n%20-%201%29%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20%23%20%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%0A%20%20%20%20linear_recur%28n%29&cumulative=false&curInstr=25&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20quadratic%28n%3A%20int%29%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%22%22%22%0A%20%20%20%20%23%20%D0%94%D0%B2%D1%83%D0%BC%D0%B5%D1%80%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%B7%D0%B0%D0%BD%D0%B8%D0%BC%D0%B0%D0%B5%D1%82%20O%28n%5E2%29%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%0A%20%20%20%20num_matrix%20%3D%20%5B%5B0%5D%20%2A%20n%20for%20_%20in%20range%28n%29%5D%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20%23%20%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%0A%20%20%20%20quadratic%28n%29&cumulative=false&curInstr=16&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20quadratic_recur%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%28%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%29%22%22%22%0A%20%20%20%20if%20n%20%3C%3D%200%3A%0A%20%20%20%20%20%20%20%20return%200%0A%20%20%20%20%23%20%D0%94%D0%BB%D0%B8%D0%BD%D0%B0%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%20nums%20%D1%80%D0%B0%D0%B2%D0%BD%D0%B0%20n%2C%20n-1%2C%20...%2C%202%2C%201%0A%20%20%20%20nums%20%3D%20%5B0%5D%20%2A%20n%0A%20%20%20%20return%20quadratic_recur%28n%20-%201%29%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20%23%20%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%0A%20%20%20%20quadratic_recur%28n%29&cumulative=false&curInstr=28&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%20%3D%200%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0Adef%20build_tree%28n%3A%20int%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%D0%AD%D0%BA%D1%81%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%28%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0%29%22%22%22%0A%20%20%20%20if%20n%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20root%20%3D%20TreeNode%280%29%0A%20%20%20%20root.left%20%3D%20build_tree%28n%20-%201%29%0A%20%20%20%20root.right%20%3D%20build_tree%28n%20-%201%29%0A%20%20%20%20return%20root%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%205%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20%23%20%D0%AD%D0%BA%D1%81%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%0A%20%20%20%20root%20%3D%20build_tree%28n%29&cumulative=false&curInstr=507&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_computational_complexity/time_complexity.md b/ru/codes/pythontutor/chapter_computational_complexity/time_complexity.md new file mode 100644 index 000000000..c83c6651d --- /dev/null +++ b/ru/codes/pythontutor/chapter_computational_complexity/time_complexity.md @@ -0,0 +1,38 @@ + + + +https://pythontutor.com/render.html#code=def%20constant%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%22%22%22%0A%20%20%20%20count%20%3D%200%0A%20%20%20%20size%20%3D%2010%0A%20%20%20%20for%20_%20in%20range%28size%29%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D%201%0A%20%20%20%20return%20count%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%208%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20count%20%3D%20constant%28n%29%0A%20%20%20%20print%28%22%D0%A7%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9%20%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82%D0%BD%D0%BE%D0%B9%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%3D%22%2C%20count%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20linear%28n%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%22%22%22%0A%20%20%20%20count%20%3D%200%0A%20%20%20%20for%20_%20in%20range%28n%29%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D%201%0A%20%20%20%20return%20count%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%208%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20count%20%3D%20linear%28n%29%0A%20%20%20%20print%28%22%D0%A7%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9%20%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%BE%D0%B9%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%3D%22%2C%20count%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20array_traversal%28nums%3A%20list%5Bint%5D%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%28%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%29%22%22%22%0A%20%20%20%20count%20%3D%200%0A%20%20%20%20%23%20%D0%A7%D0%B8%D1%81%D0%BB%D0%BE%20%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9%20%D0%BF%D1%80%D0%BE%D0%BF%D0%BE%D1%80%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%20%D0%B4%D0%BB%D0%B8%D0%BD%D0%B5%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%0A%20%20%20%20for%20num%20in%20nums%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D%201%0A%20%20%20%20return%20count%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%208%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20count%20%3D%20array_traversal%28%5B0%5D%20%2A%20n%29%0A%20%20%20%20print%28%22%D0%A7%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9%20%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%BE%D0%B9%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%28%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%29%20%3D%22%2C%20count%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20quadratic%28n%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%22%22%22%0A%20%20%20%20count%20%3D%200%0A%20%20%20%20%23%20%D0%A7%D0%B8%D1%81%D0%BB%D0%BE%20%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9%20%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D0%BE%20%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D1%82%20%D0%BE%D1%82%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%0A%20%20%20%20for%20i%20in%20range%28n%29%3A%0A%20%20%20%20%20%20%20%20for%20j%20in%20range%28n%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20count%20%2B%3D%201%0A%20%20%20%20return%20count%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%208%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20count%20%3D%20quadratic%28n%29%0A%20%20%20%20print%28%22%D0%A7%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9%20%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D0%BE%D0%B9%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%3D%22%2C%20count%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20bubble_sort%28nums%3A%20list%5Bint%5D%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%28%D0%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%B2%D0%B0%D1%8F%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%29%22%22%22%0A%20%20%20%20count%20%3D%200%20%20%23%20%D0%A1%D1%87%D0%B5%D1%82%D1%87%D0%B8%D0%BA%0A%20%20%20%20%23%20%D0%92%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D0%B9%20%D1%86%D0%B8%D0%BA%D0%BB%3A%20%D0%BD%D0%B5%D0%BE%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%20%5B0%2C%20i%5D%0A%20%20%20%20for%20i%20in%20range%28len%28nums%29%20-%201%2C%200%2C%20-1%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%92%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B8%D0%B9%20%D1%86%D0%B8%D0%BA%D0%BB%3A%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BD%D0%B5%D0%BE%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B0%20%5B0%2C%20i%5D%20%D0%B2%20%D0%B5%D0%B3%D0%BE%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%BA%D0%BE%D0%BD%D0%B5%D1%86%0A%20%20%20%20%20%20%20%20for%20j%20in%20range%28i%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20nums%5Bj%5D%20%3E%20nums%5Bj%20%2B%201%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D0%BD%D1%8F%D1%82%D1%8C%20%D0%BC%D0%B5%D1%81%D1%82%D0%B0%D0%BC%D0%B8%20nums%5Bj%5D%20%D0%B8%20nums%5Bj%20%2B%201%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tmp%20%3D%20nums%5Bj%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nums%5Bj%5D%20%3D%20nums%5Bj%20%2B%201%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nums%5Bj%20%2B%201%5D%20%3D%20tmp%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20count%20%2B%3D%203%20%20%23%20%D0%9E%D0%B1%D0%BC%D0%B5%D0%BD%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%20%D0%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B0%D0%B5%D1%82%203%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%BD%D1%8B%D0%B5%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8%0A%20%20%20%20return%20count%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%208%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20nums%20%3D%20%5Bi%20for%20i%20in%20range%28n%2C%200%2C%20-1%29%5D%20%20%23%20%5Bn%2C%20n-1%2C%20...%2C%202%2C%201%5D%0A%20%20%20%20count%20%3D%20bubble_sort%28nums%29%0A%20%20%20%20print%28%22%D0%A7%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9%20%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%BD%D0%BE%D0%B9%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%28%D0%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%B2%D0%B0%D1%8F%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%29%20%3D%22%2C%20count%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20exponential%28n%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%AD%D0%BA%D1%81%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%28%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%29%22%22%22%0A%20%20%20%20count%20%3D%200%0A%20%20%20%20base%20%3D%201%0A%20%20%20%20%23%20%D0%9D%D0%B0%20%D0%BA%D0%B0%D0%B6%D0%B4%D0%BE%D0%BC%20%D1%88%D0%B0%D0%B3%D0%B5%20%D0%BA%D0%BB%D0%B5%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%81%D1%8F%20%D0%BD%D0%B0%D0%B4%D0%B2%D0%BE%D0%B5%2C%20%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D1%83%D1%8F%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C%201%2C%202%2C%204%2C%208%2C%20...%2C%202%5E%28n-1%29%0A%20%20%20%20for%20_%20in%20range%28n%29%3A%0A%20%20%20%20%20%20%20%20for%20_%20in%20range%28base%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20count%20%2B%3D%201%0A%20%20%20%20%20%20%20%20base%20%2A%3D%202%0A%20%20%20%20%23%20count%20%3D%201%20%2B%202%20%2B%204%20%2B%208%20%2B%20..%20%2B%202%5E%28n-1%29%20%3D%202%5En%20-%201%0A%20%20%20%20return%20count%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%208%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20count%20%3D%20exponential%28n%29%0A%20%20%20%20print%28%22%D0%A7%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9%20%D1%8D%D0%BA%D1%81%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%28%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%29%20%3D%22%2C%20count%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20exp_recur%28n%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%AD%D0%BA%D1%81%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%28%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%29%22%22%22%0A%20%20%20%20if%20n%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20return%201%0A%20%20%20%20return%20exp_recur%28n%20-%201%29%20%2B%20exp_recur%28n%20-%201%29%20%2B%201%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%207%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20count%20%3D%20exp_recur%28n%29%0A%20%20%20%20print%28%22%D0%A7%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9%20%D1%8D%D0%BA%D1%81%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%28%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%29%20%3D%22%2C%20count%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20logarithmic%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9B%D0%BE%D0%B3%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%28%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%29%22%22%22%0A%20%20%20%20count%20%3D%200%0A%20%20%20%20while%20n%20%3E%201%3A%0A%20%20%20%20%20%20%20%20n%20%3D%20n%20%2F%202%0A%20%20%20%20%20%20%20%20count%20%2B%3D%201%0A%20%20%20%20return%20count%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%208%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20count%20%3D%20logarithmic%28n%29%0A%20%20%20%20print%28%22%D0%A7%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9%20%D0%BB%D0%BE%D0%B3%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%28%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%29%20%3D%22%2C%20count%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20log_recur%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9B%D0%BE%D0%B3%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%28%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%29%22%22%22%0A%20%20%20%20if%20n%20%3C%3D%201%3A%0A%20%20%20%20%20%20%20%20return%200%0A%20%20%20%20return%20log_recur%28n%20%2F%202%29%20%2B%201%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%208%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20count%20%3D%20log_recur%28n%29%0A%20%20%20%20print%28%22%D0%A7%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9%20%D0%BB%D0%BE%D0%B3%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%28%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%29%20%3D%22%2C%20count%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20linear_log_recur%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%BE-%D0%BB%D0%BE%D0%B3%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%22%22%22%0A%20%20%20%20if%20n%20%3C%3D%201%3A%0A%20%20%20%20%20%20%20%20return%201%0A%20%20%20%20count%20%3D%20linear_log_recur%28n%20%2F%2F%202%29%20%2B%20linear_log_recur%28n%20%2F%2F%202%29%0A%20%20%20%20for%20_%20in%20range%28n%29%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D%201%0A%20%20%20%20return%20count%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%208%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20count%20%3D%20linear_log_recur%28n%29%0A%20%20%20%20print%28%22%D0%A7%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9%20%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%BE-%D0%BB%D0%BE%D0%B3%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%28%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%29%20%3D%22%2C%20count%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20factorial_recur%28n%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A4%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%28%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%29%22%22%22%0A%20%20%20%20if%20n%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20return%201%0A%20%20%20%20count%20%3D%200%0A%20%20%20%20%23%20%D0%98%D0%B7%20%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B0%D0%B5%D1%82%D1%81%D1%8F%20n%0A%20%20%20%20for%20_%20in%20range%28n%29%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D%20factorial_recur%28n%20-%201%29%0A%20%20%20%20return%20count%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%204%0A%20%20%20%20print%28%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D1%85%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20n%20%3D%22%2C%20n%29%0A%0A%20%20%20%20count%20%3D%20factorial_recur%28n%29%0A%20%20%20%20print%28%22%D0%A7%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9%20%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%28%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%29%20%3D%22%2C%20count%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_computational_complexity/worst_best_time_complexity.md b/ru/codes/pythontutor/chapter_computational_complexity/worst_best_time_complexity.md new file mode 100644 index 000000000..3e199562a --- /dev/null +++ b/ru/codes/pythontutor/chapter_computational_complexity/worst_best_time_complexity.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=import%20random%0A%0Adef%20random_numbers%28n%3A%20int%29%20-%3E%20list%5Bint%5D%3A%0A%20%20%20%20%22%22%22%D0%A1%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20%D1%81%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D0%BC%D0%B8%201%2C%202%2C%20...%2C%20n%20%D0%B2%20%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE%D0%BC%20%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B5%22%22%22%0A%20%20%20%20%23%20%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20nums%20%3D%3A%201%2C%202%2C%203%2C%20...%2C%20n%0A%20%20%20%20nums%20%3D%20%5Bi%20for%20i%20in%20range%281%2C%20n%20%2B%201%29%5D%0A%20%20%20%20%23%20%D0%A1%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%88%D0%B0%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%0A%20%20%20%20random.shuffle%28nums%29%0A%20%20%20%20return%20nums%0A%0Adef%20find_one%28nums%3A%20list%5Bint%5D%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9D%D0%B0%D0%B9%D1%82%D0%B8%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%87%D0%B8%D1%81%D0%BB%D0%B0%201%20%D0%B2%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B5%20nums%22%22%22%0A%20%20%20%20for%20i%20in%20range%28len%28nums%29%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%201%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B5%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%2C%20%D0%B4%D0%BE%D1%81%D1%82%D0%B8%D0%B3%D0%B0%D0%B5%D1%82%D1%81%D1%8F%20%D0%BB%D1%83%D1%87%D1%88%D0%B0%D1%8F%20%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20O%281%29%0A%20%20%20%20%20%20%20%20%23%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%201%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%BA%D0%BE%D0%BD%D1%86%D0%B5%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%2C%20%D0%B4%D0%BE%D1%81%D1%82%D0%B8%D0%B3%D0%B0%D0%B5%D1%82%D1%81%D1%8F%20%D1%85%D1%83%D0%B4%D1%88%D0%B0%D1%8F%20%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20O%28n%29%0A%20%20%20%20%20%20%20%20if%20nums%5Bi%5D%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20i%0A%20%20%20%20return%20-1%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%2010%0A%20%20%20%20nums%20%3D%20random_numbers%28n%29%0A%20%20%20%20index%20%3D%20find_one%28nums%29%0A%20%20%20%20print%28%22%5Cn%D0%9C%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20%5B1%2C%202%2C%20...%2C%20n%5D%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%88%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%3D%22%2C%20nums%29%0A%20%20%20%20print%28%22%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%87%D0%B8%D1%81%D0%BB%D0%B0%201%20%3D%22%2C%20index%29&cumulative=false&curInstr=25&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_divide_and_conquer/binary_search_recur.md b/ru/codes/pythontutor/chapter_divide_and_conquer/binary_search_recur.md new file mode 100644 index 000000000..0853e0800 --- /dev/null +++ b/ru/codes/pythontutor/chapter_divide_and_conquer/binary_search_recur.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20dfs%28nums%3A%20list%5Bint%5D%2C%20target%3A%20int%2C%20i%3A%20int%2C%20j%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%3A%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%20f%28i%2C%20j%29%22%22%22%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%20%D0%BF%D1%83%D1%81%D1%82%2C%20%D1%86%D0%B5%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BE%D1%82%D1%81%D1%83%D1%82%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20-1%0A%20%20%20%20if%20i%20%3E%20j%3A%0A%20%20%20%20%20%20%20%20return%20-1%0A%20%20%20%20%23%20%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%81%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%BD%D1%8B%20m%0A%20%20%20%20m%20%3D%20%28i%20%2B%20j%29%20%2F%2F%202%0A%20%20%20%20if%20nums%5Bm%5D%20%3C%20target%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%BF%D0%BE%D0%B4%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%20f%28m%2B1%2C%20j%29%0A%20%20%20%20%20%20%20%20return%20dfs%28nums%2C%20target%2C%20m%20%2B%201%2C%20j%29%0A%20%20%20%20elif%20nums%5Bm%5D%20%3E%20target%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%BF%D0%BE%D0%B4%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%20f%28i%2C%20m-1%29%0A%20%20%20%20%20%20%20%20return%20dfs%28nums%2C%20target%2C%20i%2C%20m%20-%201%29%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%A6%D0%B5%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BD%D0%B0%D0%B9%D0%B4%D0%B5%D0%BD%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%B5%D0%B3%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%0A%20%20%20%20%20%20%20%20return%20m%0A%0Adef%20binary_search%28nums%3A%20list%5Bint%5D%2C%20target%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%22%22%22%0A%20%20%20%20n%20%3D%20len%28nums%29%0A%20%20%20%20%23%20%D0%A0%D0%B5%D1%88%D0%B8%D1%82%D1%8C%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D1%83%20f%280%2C%20n-1%29%0A%20%20%20%20return%20dfs%28nums%2C%20target%2C%200%2C%20n%20-%201%29%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20target%20%3D%206%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%206%2C%208%2C%2012%2C%2015%2C%2023%2C%2026%2C%2031%2C%2035%5D%0A%0A%20%20%20%20%23%20%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%28%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B5%20%D0%B7%D0%B0%D0%BC%D0%BA%D0%BD%D1%83%D1%82%D1%8B%D0%B9%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%29%0A%20%20%20%20index%20%3D%20binary_search%28nums%2C%20target%29%0A%20%20%20%20print%28%22%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%86%D0%B5%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%206%20%3D%20%22%2C%20index%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_divide_and_conquer/build_tree.md b/ru/codes/pythontutor/chapter_divide_and_conquer/build_tree.md new file mode 100644 index 000000000..a49029c2d --- /dev/null +++ b/ru/codes/pythontutor/chapter_divide_and_conquer/build_tree.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%20%3D%200%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0Adef%20dfs%28%0A%20%20%20%20preorder%3A%20list%5Bint%5D%2C%0A%20%20%20%20inorder_map%3A%20dict%5Bint%2C%20int%5D%2C%0A%20%20%20%20i%3A%20int%2C%0A%20%20%20%20l%3A%20int%2C%0A%20%20%20%20r%3A%20int%2C%0A%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%3A%20%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9%20%D0%B8%20%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9%22%22%22%0A%20%20%20%20%23%20%D0%97%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B8%D1%82%D1%8C%20%D0%BF%D1%80%D0%B8%20%D0%BF%D1%83%D1%81%D1%82%D0%BE%D0%BC%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B5%20%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0%0A%20%20%20%20if%20r%20-%20l%20%3C%200%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BA%D0%BE%D1%80%D0%BD%D0%B5%D0%B2%D0%BE%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20root%20%3D%20TreeNode%28preorder%5Bi%5D%29%0A%20%20%20%20%23%20%D0%9D%D0%B0%D0%B9%D1%82%D0%B8%20m%2C%20%D1%87%D1%82%D0%BE%D0%B1%D1%8B%20%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B5%20%D0%B8%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B5%20%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F%0A%20%20%20%20m%20%3D%20inorder_map%5Bpreorder%5Bi%5D%5D%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%B4%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%3A%20%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B5%20%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%0A%20%20%20%20root.left%20%3D%20dfs%28preorder%2C%20inorder_map%2C%20i%20%2B%201%2C%20l%2C%20m%20-%201%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%B4%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%3A%20%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B5%20%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%0A%20%20%20%20root.right%20%3D%20dfs%28preorder%2C%20inorder_map%2C%20i%20%2B%201%20%2B%20m%20-%20l%2C%20m%20%2B%201%2C%20r%29%0A%20%20%20%20%23%20%D0%92%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%BA%D0%BE%D1%80%D0%BD%D0%B5%D0%B2%D0%BE%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20return%20root%0A%0A%0Adef%20build_tree%28preorder%3A%20list%5Bint%5D%2C%20inorder%3A%20list%5Bint%5D%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%22%22%22%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%20%D0%B4%D0%BB%D1%8F%20%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D0%B8%D1%8F%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%20inorder%20%D0%B8%D1%85%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%D0%BC%0A%20%20%20%20inorder_map%20%3D%20%7Bval%3A%20i%20for%20i%2C%20val%20in%20enumerate%28inorder%29%7D%0A%20%20%20%20root%20%3D%20dfs%28preorder%2C%20inorder_map%2C%200%2C%200%2C%20len%28inorder%29%20-%201%29%0A%20%20%20%20return%20root%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20preorder%20%3D%20%5B3%2C%209%2C%202%2C%201%2C%207%5D%0A%20%20%20%20inorder%20%3D%20%5B9%2C%203%2C%201%2C%202%2C%207%5D%0A%20%20%20%20print%28f%22%D0%9F%D1%80%D0%B5%D0%B4%D0%B2%D0%B0%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%20%3D%20%7Bpreorder%7D%22%29%0A%20%20%20%20print%28f%22%D0%A1%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D1%8B%D0%B9%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%20%3D%20%7Binorder%7D%22%29%0A%20%20%20%20root%20%3D%20build_tree%28preorder%2C%20inorder%29&cumulative=false&curInstr=21&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_divide_and_conquer/hanota.md b/ru/codes/pythontutor/chapter_divide_and_conquer/hanota.md new file mode 100644 index 000000000..bd302fc25 --- /dev/null +++ b/ru/codes/pythontutor/chapter_divide_and_conquer/hanota.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20move%28src%3A%20list%5Bint%5D%2C%20tar%3A%20list%5Bint%5D%29%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%BE%D0%B4%D0%B8%D0%BD%20%D0%B4%D0%B8%D1%81%D0%BA%22%22%22%0A%20%20%20%20%23%20%D0%A1%D0%BD%D1%8F%D1%82%D1%8C%20%D0%B4%D0%B8%D1%81%D0%BA%20%D1%81%20%D0%B2%D0%B5%D1%80%D1%88%D0%B8%D0%BD%D1%8B%20src%0A%20%20%20%20pan%20%3D%20src.pop%28%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D0%BE%D0%B6%D0%B8%D1%82%D1%8C%20%D0%B4%D0%B8%D1%81%D0%BA%20%D0%BD%D0%B0%20%D0%B2%D0%B5%D1%80%D1%88%D0%B8%D0%BD%D1%83%20tar%0A%20%20%20%20tar.append%28pan%29%0A%0A%0Adef%20dfs%28i%3A%20int%2C%20src%3A%20list%5Bint%5D%2C%20buf%3A%20list%5Bint%5D%2C%20tar%3A%20list%5Bint%5D%29%3A%0A%20%20%20%20%22%22%22%D0%A0%D0%B5%D1%88%D0%B8%D1%82%D1%8C%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D1%83%20%D0%A5%D0%B0%D0%BD%D0%BE%D0%B9%D1%81%D0%BA%D0%BE%D0%B9%20%D0%B1%D0%B0%D1%88%D0%BD%D0%B8%20f%28i%29%22%22%22%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B2%20src%20%D0%BE%D1%81%D1%82%D0%B0%D0%BB%D1%81%D1%8F%20%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D0%BE%D0%B4%D0%B8%D0%BD%20%D0%B4%D0%B8%D1%81%D0%BA%2C%20%D1%81%D1%80%D0%B0%D0%B7%D1%83%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%B5%D0%B3%D0%BE%20%D0%B2%20tar%0A%20%20%20%20if%20i%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20move%28src%2C%20tar%29%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%B4%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%20f%28i-1%29%3A%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B5%20i-1%20%D0%B4%D0%B8%D1%81%D0%BA%D0%BE%D0%B2%20%D0%B8%D0%B7%20src%20%D0%B2%20buf%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20tar%0A%20%20%20%20dfs%28i%20-%201%2C%20src%2C%20tar%2C%20buf%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%B4%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%20f%281%29%3A%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D1%88%D0%B8%D0%B9%D1%81%D1%8F%20%D0%BE%D0%B4%D0%B8%D0%BD%20%D0%B4%D0%B8%D1%81%D0%BA%20%D0%B8%D0%B7%20src%20%D0%B2%20tar%0A%20%20%20%20move%28src%2C%20tar%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%B4%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%20f%28i-1%29%3A%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B5%20i-1%20%D0%B4%D0%B8%D1%81%D0%BA%D0%BE%D0%B2%20%D0%B8%D0%B7%20buf%20%D0%B2%20tar%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20src%0A%20%20%20%20dfs%28i%20-%201%2C%20buf%2C%20src%2C%20tar%29%0A%0A%0Adef%20solve_hanota%28A%3A%20list%5Bint%5D%2C%20B%3A%20list%5Bint%5D%2C%20C%3A%20list%5Bint%5D%29%3A%0A%20%20%20%20%22%22%22%D0%A0%D0%B5%D1%88%D0%B8%D1%82%D1%8C%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D1%83%20%D0%A5%D0%B0%D0%BD%D0%BE%D0%B9%D1%81%D0%BA%D0%BE%D0%B9%20%D0%B1%D0%B0%D1%88%D0%BD%D0%B8%22%22%22%0A%20%20%20%20n%20%3D%20len%28A%29%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B5%20n%20%D0%B4%D0%B8%D1%81%D0%BA%D0%BE%D0%B2%20%D0%B8%D0%B7%20A%20%D0%B2%20C%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20B%0A%20%20%20%20dfs%28n%2C%20A%2C%20B%2C%20C%29%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%A5%D0%B2%D0%BE%D1%81%D1%82%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%20%D0%B2%D0%B5%D1%80%D1%88%D0%B8%D0%BD%D0%B5%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D0%B0%0A%20%20%20%20A%20%3D%20%5B5%2C%204%2C%203%2C%202%2C%201%5D%0A%20%20%20%20B%20%3D%20%5B%5D%0A%20%20%20%20C%20%3D%20%5B%5D%0A%20%20%20%20print%28%22%D0%98%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%BE%D0%B5%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5%3A%22%29%0A%20%20%20%20print%28f%22A%20%3D%20%7BA%7D%22%29%0A%20%20%20%20print%28f%22B%20%3D%20%7BB%7D%22%29%0A%20%20%20%20print%28f%22C%20%3D%20%7BC%7D%22%29%0A%0A%20%20%20%20solve_hanota%28A%2C%20B%2C%20C%29%0A%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B4%D0%B8%D1%81%D0%BA%D0%BE%D0%B2%3A%22%29%0A%20%20%20%20print%28f%22A%20%3D%20%7BA%7D%22%29%0A%20%20%20%20print%28f%22B%20%3D%20%7BB%7D%22%29%0A%20%20%20%20print%28f%22C%20%3D%20%7BC%7D%22%29&cumulative=false&curInstr=12&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_backtrack.md b/ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_backtrack.md new file mode 100644 index 000000000..49721d443 --- /dev/null +++ b/ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_backtrack.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20backtrack%28choices%3A%20list%5Bint%5D%2C%20state%3A%20int%2C%20n%3A%20int%2C%20res%3A%20list%5Bint%5D%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%91%D1%8D%D0%BA%D1%82%D1%80%D0%B5%D0%BA%D0%B8%D0%BD%D0%B3%22%22%22%0A%20%20%20%20%23%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D0%BF%D0%BE%D0%B4%D1%8A%D0%B5%D0%BC%20%D0%B4%D0%BE%D1%81%D1%82%D0%B8%D0%B3%D0%B0%D0%B5%D1%82%20n-%D0%B9%20%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%D0%B8%2C%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D0%BE%D0%B2%20%D1%83%D0%B2%D0%B5%D0%BB%D0%B8%D1%87%D0%B8%D0%B2%D0%B0%D0%B5%D1%82%D1%81%D1%8F%20%D0%BD%D0%B0%201%0A%20%20%20%20if%20state%20%3D%3D%20n%3A%0A%20%20%20%20%20%20%20%20res%5B0%5D%20%2B%3D%201%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%B1%D0%BE%D1%80%20%D0%B2%D1%81%D0%B5%D1%85%20%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D0%BE%D0%B2%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0%0A%20%20%20%20for%20choice%20in%20choices%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%9E%D1%82%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%3A%20%D0%BD%D0%B5%D0%BB%D1%8C%D0%B7%D1%8F%20%D0%B2%D1%8B%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%8C%20%D0%B7%D0%B0%20n-%D1%8E%20%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%D1%8C%0A%20%20%20%20%20%20%20%20if%20state%20%2B%20choice%20%3E%20n%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%BE%D0%BF%D1%8B%D1%82%D0%BA%D0%B0%3A%20%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%20%D0%B8%20%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5%0A%20%20%20%20%20%20%20%20backtrack%28choices%2C%20state%20%2B%20choice%2C%20n%2C%20res%29%0A%20%20%20%20%20%20%20%20%23%20%D0%9E%D1%82%D0%BA%D0%B0%D1%82%0A%0A%0Adef%20climbing_stairs_backtrack%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%BE%D0%B4%D1%8A%D0%B5%D0%BC%20%D0%BF%D0%BE%20%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B5%3A%20%D0%B1%D1%8D%D0%BA%D1%82%D1%80%D0%B5%D0%BA%D0%B8%D0%BD%D0%B3%22%22%22%0A%20%20%20%20choices%20%3D%20%5B1%2C%202%5D%20%20%23%20%D0%9C%D0%BE%D0%B6%D0%BD%D0%BE%20%D0%BF%D0%BE%D0%B4%D0%BD%D1%8F%D1%82%D1%8C%D1%81%D1%8F%20%D0%BD%D0%B0%201%20%D0%B8%D0%BB%D0%B8%202%20%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%D0%B8%0A%20%20%20%20state%20%3D%200%20%20%23%20%D0%9D%D0%B0%D1%87%D0%B0%D1%82%D1%8C%20%D0%BF%D0%BE%D0%B4%D1%8A%D0%B5%D0%BC%20%D1%81%200-%D0%B9%20%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%D0%B8%0A%20%20%20%20res%20%3D%20%5B0%5D%20%20%23%20%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20res%5B0%5D%20%D0%B4%D0%BB%D1%8F%20%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%87%D0%B8%D1%81%D0%BB%D0%B0%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%0A%20%20%20%20backtrack%28choices%2C%20state%2C%20n%2C%20res%29%0A%20%20%20%20return%20res%5B0%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%204%0A%0A%20%20%20%20res%20%3D%20climbing_stairs_backtrack%28n%29%0A%20%20%20%20print%28f%22%D0%9A%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE%20%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BE%D0%B2%20%D0%BF%D0%BE%D0%B4%D0%BD%D1%8F%D1%82%D1%8C%D1%81%D1%8F%20%D0%BF%D0%BE%20%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B5%20%D0%B8%D0%B7%20%7Bn%7D%20%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%D0%B5%D0%B9%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_constraint_dp.md b/ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_constraint_dp.md new file mode 100644 index 000000000..d242a27aa --- /dev/null +++ b/ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_constraint_dp.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20climbing_stairs_constraint_dp%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%BE%D0%B4%D1%8A%D0%B5%D0%BC%20%D0%BF%D0%BE%20%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B5%20%D1%81%20%D0%BE%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%22%22%22%0A%20%20%20%20if%20n%20%3D%3D%201%20or%20n%20%3D%3D%202%3A%0A%20%20%20%20%20%20%20%20return%201%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%20dp%20%D0%B4%D0%BB%D1%8F%20%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%BF%D0%BE%D0%B4%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%0A%20%20%20%20dp%20%3D%20%5B%5B0%5D%20%2A%203%20for%20_%20in%20range%28n%20%2B%201%29%5D%0A%20%20%20%20%23%20%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5%3A%20%D0%B7%D0%B0%D1%80%D0%B0%D0%BD%D0%B5%D0%B5%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D1%8C%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BD%D0%B0%D0%B8%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B8%D1%85%20%D0%BF%D0%BE%D0%B4%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%0A%20%20%20%20dp%5B1%5D%5B1%5D%2C%20dp%5B1%5D%5B2%5D%20%3D%201%2C%200%0A%20%20%20%20dp%5B2%5D%5B1%5D%2C%20dp%5B2%5D%5B2%5D%20%3D%200%2C%201%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BF%D0%BE%D1%81%D1%82%D0%B5%D0%BF%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B8%D1%85%20%D0%BF%D0%BE%D0%B4%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%20%D1%87%D0%B5%D1%80%D0%B5%D0%B7%20%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B8%D0%B5%0A%20%20%20%20for%20i%20in%20range%283%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20dp%5Bi%5D%5B1%5D%20%3D%20dp%5Bi%20-%201%5D%5B2%5D%0A%20%20%20%20%20%20%20%20dp%5Bi%5D%5B2%5D%20%3D%20dp%5Bi%20-%202%5D%5B1%5D%20%2B%20dp%5Bi%20-%202%5D%5B2%5D%0A%20%20%20%20return%20dp%5Bn%5D%5B1%5D%20%2B%20dp%5Bn%5D%5B2%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%209%0A%0A%20%20%20%20res%20%3D%20climbing_stairs_constraint_dp%28n%29%0A%20%20%20%20print%28f%22%D0%9A%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE%20%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BE%D0%B2%20%D0%BF%D0%BE%D0%B4%D0%BD%D1%8F%D1%82%D1%8C%D1%81%D1%8F%20%D0%BF%D0%BE%20%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B5%20%D0%B8%D0%B7%20%7Bn%7D%20%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%D0%B5%D0%B9%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_dfs.md b/ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_dfs.md new file mode 100644 index 000000000..f8b317ddd --- /dev/null +++ b/ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_dfs.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20dfs%28i%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%BE%D0%B8%D1%81%D0%BA%22%22%22%0A%20%20%20%20%23%20dp%5B1%5D%20%D0%B8%20dp%5B2%5D%20%D1%83%D0%B6%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%BD%D1%8B%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%B8%D1%85%0A%20%20%20%20if%20i%20%3D%3D%201%20or%20i%20%3D%3D%202%3A%0A%20%20%20%20%20%20%20%20return%20i%0A%20%20%20%20%23%20dp%5Bi%5D%20%3D%20dp%5Bi-1%5D%20%2B%20dp%5Bi-2%5D%0A%20%20%20%20count%20%3D%20dfs%28i%20-%201%29%20%2B%20dfs%28i%20-%202%29%0A%20%20%20%20return%20count%0A%0A%0Adef%20climbing_stairs_dfs%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%BE%D0%B4%D1%8A%D0%B5%D0%BC%20%D0%BF%D0%BE%20%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B5%3A%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%22%22%22%0A%20%20%20%20return%20dfs%28n%29%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%209%0A%0A%20%20%20%20res%20%3D%20climbing_stairs_dfs%28n%29%0A%20%20%20%20print%28f%22%D0%9A%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE%20%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BE%D0%B2%20%D0%BF%D0%BE%D0%B4%D0%BD%D1%8F%D1%82%D1%8C%D1%81%D1%8F%20%D0%BF%D0%BE%20%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B5%20%D0%B8%D0%B7%20%7Bn%7D%20%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%D0%B5%D0%B9%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_dfs_mem.md b/ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_dfs_mem.md new file mode 100644 index 000000000..f310faf45 --- /dev/null +++ b/ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_dfs_mem.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20dfs%28i%3A%20int%2C%20mem%3A%20list%5Bint%5D%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%BE%D0%B8%D1%81%D0%BA%20%D1%81%20%D0%BC%D0%B5%D0%BC%D0%BE%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%22%22%22%0A%20%20%20%20%23%20dp%5B1%5D%20%D0%B8%20dp%5B2%5D%20%D1%83%D0%B6%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%BD%D1%8B%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%B8%D1%85%0A%20%20%20%20if%20i%20%3D%3D%201%20or%20i%20%3D%3D%202%3A%0A%20%20%20%20%20%20%20%20return%20i%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C%20dp%5Bi%5D%20%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%2C%20%D1%81%D1%80%D0%B0%D0%B7%D1%83%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%B5%D0%B5%0A%20%20%20%20if%20mem%5Bi%5D%20%21%3D%20-1%3A%0A%20%20%20%20%20%20%20%20return%20mem%5Bi%5D%0A%20%20%20%20%23%20dp%5Bi%5D%20%3D%20dp%5Bi-1%5D%20%2B%20dp%5Bi-2%5D%0A%20%20%20%20count%20%3D%20dfs%28i%20-%201%2C%20mem%29%20%2B%20dfs%28i%20-%202%2C%20mem%29%0A%20%20%20%20%23%20%D0%A1%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C%20dp%5Bi%5D%0A%20%20%20%20mem%5Bi%5D%20%3D%20count%0A%20%20%20%20return%20count%0A%0A%0Adef%20climbing_stairs_dfs_mem%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%BE%D0%B4%D1%8A%D0%B5%D0%BC%20%D0%BF%D0%BE%20%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B5%3A%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%D1%81%20%D0%BC%D0%B5%D0%BC%D0%BE%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%22%22%22%0A%20%20%20%20%23%20mem%5Bi%5D%20%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BE%D0%B2%20%D0%BF%D0%BE%D0%B4%D0%BD%D1%8F%D1%82%D1%8C%D1%81%D1%8F%20%D0%BD%D0%B0%20i-%D1%8E%20%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%D1%8C%2C%20-1%20%D0%BE%D0%B7%D0%BD%D0%B0%D1%87%D0%B0%D0%B5%D1%82%20%D0%BE%D1%82%D1%81%D1%83%D1%82%D1%81%D1%82%D0%B2%D0%B8%D0%B5%20%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B8%0A%20%20%20%20mem%20%3D%20%5B-1%5D%20%2A%20%28n%20%2B%201%29%0A%20%20%20%20return%20dfs%28n%2C%20mem%29%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%209%0A%0A%20%20%20%20res%20%3D%20climbing_stairs_dfs_mem%28n%29%0A%20%20%20%20print%28f%22%D0%9A%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE%20%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BE%D0%B2%20%D0%BF%D0%BE%D0%B4%D0%BD%D1%8F%D1%82%D1%8C%D1%81%D1%8F%20%D0%BF%D0%BE%20%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B5%20%D0%B8%D0%B7%20%7Bn%7D%20%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%D0%B5%D0%B9%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_dp.md b/ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_dp.md new file mode 100644 index 000000000..9f2cd5ac7 --- /dev/null +++ b/ru/codes/pythontutor/chapter_dynamic_programming/climbing_stairs_dp.md @@ -0,0 +1,11 @@ + + + +https://pythontutor.com/render.html#code=def%20climbing_stairs_dp%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%BE%D0%B4%D1%8A%D0%B5%D0%BC%20%D0%BF%D0%BE%20%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B5%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%22%22%22%0A%20%20%20%20if%20n%20%3D%3D%201%20or%20n%20%3D%3D%202%3A%0A%20%20%20%20%20%20%20%20return%20n%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%20dp%20%D0%B4%D0%BB%D1%8F%20%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%BF%D0%BE%D0%B4%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%0A%20%20%20%20dp%20%3D%20%5B0%5D%20%2A%20%28n%20%2B%201%29%0A%20%20%20%20%23%20%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5%3A%20%D0%B7%D0%B0%D1%80%D0%B0%D0%BD%D0%B5%D0%B5%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D1%8C%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BD%D0%B0%D0%B8%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B8%D1%85%20%D0%BF%D0%BE%D0%B4%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%0A%20%20%20%20dp%5B1%5D%2C%20dp%5B2%5D%20%3D%201%2C%202%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BF%D0%BE%D1%81%D1%82%D0%B5%D0%BF%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B8%D1%85%20%D0%BF%D0%BE%D0%B4%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%20%D1%87%D0%B5%D1%80%D0%B5%D0%B7%20%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B8%D0%B5%0A%20%20%20%20for%20i%20in%20range%283%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20dp%5Bi%5D%20%3D%20dp%5Bi%20-%201%5D%20%2B%20dp%5Bi%20-%202%5D%0A%20%20%20%20return%20dp%5Bn%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%209%0A%0A%20%20%20%20res%20%3D%20climbing_stairs_dp%28n%29%0A%20%20%20%20print%28f%22%D0%9A%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE%20%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BE%D0%B2%20%D0%BF%D0%BE%D0%B4%D0%BD%D1%8F%D1%82%D1%8C%D1%81%D1%8F%20%D0%BF%D0%BE%20%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B5%20%D0%B8%D0%B7%20%7Bn%7D%20%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%D0%B5%D0%B9%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20climbing_stairs_dp_comp%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%BE%D0%B4%D1%8A%D0%B5%D0%BC%20%D0%BF%D0%BE%20%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B5%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%22%22%22%0A%20%20%20%20if%20n%20%3D%3D%201%20or%20n%20%3D%3D%202%3A%0A%20%20%20%20%20%20%20%20return%20n%0A%20%20%20%20a%2C%20b%20%3D%201%2C%202%0A%20%20%20%20for%20_%20in%20range%283%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20a%2C%20b%20%3D%20b%2C%20a%20%2B%20b%0A%20%20%20%20return%20b%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%209%0A%0A%20%20%20%20res%20%3D%20climbing_stairs_dp_comp%28n%29%0A%20%20%20%20print%28f%22%D0%9A%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE%20%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BE%D0%B2%20%D0%BF%D0%BE%D0%B4%D0%BD%D1%8F%D1%82%D1%8C%D1%81%D1%8F%20%D0%BF%D0%BE%20%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B5%20%D0%B8%D0%B7%20%7Bn%7D%20%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%D0%B5%D0%B9%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_dynamic_programming/coin_change.md b/ru/codes/pythontutor/chapter_dynamic_programming/coin_change.md new file mode 100644 index 000000000..12b9d822e --- /dev/null +++ b/ru/codes/pythontutor/chapter_dynamic_programming/coin_change.md @@ -0,0 +1,11 @@ + + + +https://pythontutor.com/render.html#code=def%20coin_change_dp%28coins%3A%20list%5Bint%5D%2C%20amt%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D0%BD%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%22%22%22%0A%20%20%20%20n%20%3D%20len%28coins%29%0A%20%20%20%20MAX%20%3D%20amt%20%2B%201%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%20dp%0A%20%20%20%20dp%20%3D%20%5B%5B0%5D%20%2A%20%28amt%20%2B%201%29%20for%20_%20in%20range%28n%20%2B%201%29%5D%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BF%D0%B5%D1%80%D0%B2%D0%B0%D1%8F%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0%20%D0%B8%20%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D0%B5%D1%86%0A%20%20%20%20for%20a%20in%20range%281%2C%20amt%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20dp%5B0%5D%5Ba%5D%20%3D%20MAX%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BE%D1%81%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%20%D0%B8%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D1%8B%0A%20%20%20%20for%20i%20in%20range%281%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20for%20a%20in%20range%281%2C%20amt%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20coins%5Bi%20-%201%5D%20%3E%20a%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D1%86%D0%B5%D0%BB%D0%B5%D0%B2%D0%B0%D1%8F%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B0%2C%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%D1%83%20i%20%D0%BD%D0%B5%20%D0%B2%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D1%82%D1%8C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bi%5D%5Ba%5D%20%3D%20dp%5Bi%20-%201%5D%5Ba%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%9C%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%B5%20%D0%B8%D0%B7%20%D0%B4%D0%B2%D1%83%D1%85%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%3A%20%D0%BD%D0%B5%20%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D0%B8%D0%BB%D0%B8%20%D0%B2%D0%B7%D1%8F%D1%82%D1%8C%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%D1%83%20i%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bi%5D%5Ba%5D%20%3D%20min%28dp%5Bi%20-%201%5D%5Ba%5D%2C%20dp%5Bi%5D%5Ba%20-%20coins%5Bi%20-%201%5D%5D%20%2B%201%29%0A%20%20%20%20return%20dp%5Bn%5D%5Bamt%5D%20if%20dp%5Bn%5D%5Bamt%5D%20%21%3D%20MAX%20else%20-1%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20coins%20%3D%20%5B1%2C%202%2C%205%5D%0A%20%20%20%20amt%20%3D%204%0A%0A%20%20%20%20%23%20%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%0A%20%20%20%20res%20%3D%20coin_change_dp%28coins%2C%20amt%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%20%D1%86%D0%B5%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9%20%D1%81%D1%83%D0%BC%D0%BC%D1%8B%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20coin_change_dp_comp%28coins%3A%20list%5Bint%5D%2C%20amt%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D0%BD%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%22%22%22%0A%20%20%20%20n%20%3D%20len%28coins%29%0A%20%20%20%20MAX%20%3D%20amt%20%2B%201%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%20dp%0A%20%20%20%20dp%20%3D%20%5BMAX%5D%20%2A%20%28amt%20%2B%201%29%0A%20%20%20%20dp%5B0%5D%20%3D%200%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%0A%20%20%20%20for%20i%20in%20range%281%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%9F%D1%80%D1%8F%D0%BC%D0%BE%D0%B9%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%0A%20%20%20%20%20%20%20%20for%20a%20in%20range%281%2C%20amt%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20coins%5Bi%20-%201%5D%20%3E%20a%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D1%86%D0%B5%D0%BB%D0%B5%D0%B2%D0%B0%D1%8F%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B0%2C%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%D1%83%20i%20%D0%BD%D0%B5%20%D0%B2%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D1%82%D1%8C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Ba%5D%20%3D%20dp%5Ba%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%9C%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%B5%20%D0%B8%D0%B7%20%D0%B4%D0%B2%D1%83%D1%85%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%3A%20%D0%BD%D0%B5%20%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D0%B8%D0%BB%D0%B8%20%D0%B2%D0%B7%D1%8F%D1%82%D1%8C%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%D1%83%20i%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Ba%5D%20%3D%20min%28dp%5Ba%5D%2C%20dp%5Ba%20-%20coins%5Bi%20-%201%5D%5D%20%2B%201%29%0A%20%20%20%20return%20dp%5Bamt%5D%20if%20dp%5Bamt%5D%20%21%3D%20MAX%20else%20-1%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20coins%20%3D%20%5B1%2C%202%2C%205%5D%0A%20%20%20%20amt%20%3D%204%0A%0A%20%20%20%20%23%20%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%0A%20%20%20%20res%20%3D%20coin_change_dp_comp%28coins%2C%20amt%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%20%D1%86%D0%B5%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9%20%D1%81%D1%83%D0%BC%D0%BC%D1%8B%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_dynamic_programming/coin_change_ii.md b/ru/codes/pythontutor/chapter_dynamic_programming/coin_change_ii.md new file mode 100644 index 000000000..5f4a9fe43 --- /dev/null +++ b/ru/codes/pythontutor/chapter_dynamic_programming/coin_change_ii.md @@ -0,0 +1,11 @@ + + + +https://pythontutor.com/render.html#code=def%20coin_change_ii_dp%28coins%3A%20list%5Bint%5D%2C%20amt%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D0%BD%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%20II%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%22%22%22%0A%20%20%20%20n%20%3D%20len%28coins%29%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%20dp%0A%20%20%20%20dp%20%3D%20%5B%5B0%5D%20%2A%20%28amt%20%2B%201%29%20for%20_%20in%20range%28n%20%2B%201%29%5D%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D0%B0%0A%20%20%20%20for%20i%20in%20range%28n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20dp%5Bi%5D%5B0%5D%20%3D%201%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%0A%20%20%20%20for%20i%20in%20range%281%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20for%20a%20in%20range%281%2C%20amt%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20coins%5Bi%20-%201%5D%20%3E%20a%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D1%86%D0%B5%D0%BB%D0%B5%D0%B2%D0%B0%D1%8F%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B0%2C%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%D1%83%20i%20%D0%BD%D0%B5%20%D0%B2%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D1%82%D1%8C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bi%5D%5Ba%5D%20%3D%20dp%5Bi%20-%201%5D%5Ba%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%A1%D1%83%D0%BC%D0%BC%D0%B0%20%D0%B4%D0%B2%D1%83%D1%85%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%3A%20%D0%BD%D0%B5%20%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D0%B8%D0%BB%D0%B8%20%D0%B2%D0%B7%D1%8F%D1%82%D1%8C%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%D1%83%20i%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bi%5D%5Ba%5D%20%3D%20dp%5Bi%20-%201%5D%5Ba%5D%20%2B%20dp%5Bi%5D%5Ba%20-%20coins%5Bi%20-%201%5D%5D%0A%20%20%20%20return%20dp%5Bn%5D%5Bamt%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20coins%20%3D%20%5B1%2C%202%2C%205%5D%0A%20%20%20%20amt%20%3D%205%0A%0A%20%20%20%20%23%20%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%0A%20%20%20%20res%20%3D%20coin_change_ii_dp%28coins%2C%20amt%29%0A%20%20%20%20print%28f%22%D0%9A%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE%20%D0%BA%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D0%B9%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%20%D1%86%D0%B5%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9%20%D1%81%D1%83%D0%BC%D0%BC%D1%8B%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20coin_change_ii_dp_comp%28coins%3A%20list%5Bint%5D%2C%20amt%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D0%BD%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%20II%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%22%22%22%0A%20%20%20%20n%20%3D%20len%28coins%29%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%20dp%0A%20%20%20%20dp%20%3D%20%5B0%5D%20%2A%20%28amt%20%2B%201%29%0A%20%20%20%20dp%5B0%5D%20%3D%201%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%0A%20%20%20%20for%20i%20in%20range%281%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%9F%D1%80%D1%8F%D0%BC%D0%BE%D0%B9%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%0A%20%20%20%20%20%20%20%20for%20a%20in%20range%281%2C%20amt%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20coins%5Bi%20-%201%5D%20%3E%20a%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D1%86%D0%B5%D0%BB%D0%B5%D0%B2%D0%B0%D1%8F%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B0%2C%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%D1%83%20i%20%D0%BD%D0%B5%20%D0%B2%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D1%82%D1%8C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Ba%5D%20%3D%20dp%5Ba%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%A1%D1%83%D0%BC%D0%BC%D0%B0%20%D0%B4%D0%B2%D1%83%D1%85%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%3A%20%D0%BD%D0%B5%20%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D0%B8%D0%BB%D0%B8%20%D0%B2%D0%B7%D1%8F%D1%82%D1%8C%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%D1%83%20i%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Ba%5D%20%3D%20dp%5Ba%5D%20%2B%20dp%5Ba%20-%20coins%5Bi%20-%201%5D%5D%0A%20%20%20%20return%20dp%5Bamt%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20coins%20%3D%20%5B1%2C%202%2C%205%5D%0A%20%20%20%20amt%20%3D%205%0A%0A%20%20%20%20%23%20%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%0A%20%20%20%20res%20%3D%20coin_change_ii_dp_comp%28coins%2C%20amt%29%0A%20%20%20%20print%28f%22%D0%9A%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE%20%D0%BA%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D0%B9%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%20%D1%86%D0%B5%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9%20%D1%81%D1%83%D0%BC%D0%BC%D1%8B%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_dynamic_programming/edit_distance.md b/ru/codes/pythontutor/chapter_dynamic_programming/edit_distance.md new file mode 100644 index 000000000..681dac182 --- /dev/null +++ b/ru/codes/pythontutor/chapter_dynamic_programming/edit_distance.md @@ -0,0 +1,11 @@ + + + +https://pythontutor.com/render.html#code=def%20edit_distance_dp%28s%3A%20str%2C%20t%3A%20str%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5%20%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%22%22%22%0A%20%20%20%20n%2C%20m%20%3D%20len%28s%29%2C%20len%28t%29%0A%20%20%20%20dp%20%3D%20%5B%5B0%5D%20%2A%20%28m%20%2B%201%29%20for%20_%20in%20range%28n%20%2B%201%29%5D%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BF%D0%B5%D1%80%D0%B2%D0%B0%D1%8F%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0%20%D0%B8%20%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D0%B5%D1%86%0A%20%20%20%20for%20i%20in%20range%281%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20dp%5Bi%5D%5B0%5D%20%3D%20i%0A%20%20%20%20for%20j%20in%20range%281%2C%20m%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20dp%5B0%5D%5Bj%5D%20%3D%20j%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BE%D1%81%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%20%D0%B8%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D1%8B%0A%20%20%20%20for%20i%20in%20range%281%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20for%20j%20in%20range%281%2C%20m%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20s%5Bi%20-%201%5D%20%3D%3D%20t%5Bj%20-%201%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B4%D0%B2%D0%B0%20%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%B0%20%D1%80%D0%B0%D0%B2%D0%BD%D1%8B%2C%20%D1%81%D1%80%D0%B0%D0%B7%D1%83%20%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%B8%D1%85%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bi%5D%5Bj%5D%20%3D%20dp%5Bi%20-%201%5D%5Bj%20-%201%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D1%88%D0%B0%D0%B3%D0%BE%D0%B2%20%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%3D%20%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D1%88%D0%B0%D0%B3%D0%BE%D0%B2%20%D0%B4%D0%BB%D1%8F%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%2C%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B8%20%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D1%8B%20%2B%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bi%5D%5Bj%5D%20%3D%20min%28dp%5Bi%5D%5Bj%20-%201%5D%2C%20dp%5Bi%20-%201%5D%5Bj%5D%2C%20dp%5Bi%20-%201%5D%5Bj%20-%201%5D%29%20%2B%201%0A%20%20%20%20return%20dp%5Bn%5D%5Bm%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20s%20%3D%20%22bag%22%0A%20%20%20%20t%20%3D%20%22pack%22%0A%20%20%20%20n%2C%20m%20%3D%20len%28s%29%2C%20len%28t%29%0A%0A%20%20%20%20%23%20%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%0A%20%20%20%20res%20%3D%20edit_distance_dp%28s%2C%20t%29%0A%20%20%20%20print%28f%22%D0%A7%D1%82%D0%BE%D0%B1%D1%8B%20%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%7Bs%7D%20%D0%B2%20%7Bt%7D%2C%20%D0%BD%D1%83%D0%B6%D0%BD%D0%BE%20%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D1%83%D0%BC%20%7Bres%7D%20%D1%88%D0%B0%D0%B3%D0%BE%D0%B2%22%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20edit_distance_dp_comp%28s%3A%20str%2C%20t%3A%20str%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5%20%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%22%22%22%0A%20%20%20%20n%2C%20m%20%3D%20len%28s%29%2C%20len%28t%29%0A%20%20%20%20dp%20%3D%20%5B0%5D%20%2A%20%28m%20%2B%201%29%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BF%D0%B5%D1%80%D0%B2%D0%B0%D1%8F%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0%0A%20%20%20%20for%20j%20in%20range%281%2C%20m%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20dp%5Bj%5D%20%3D%20j%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BE%D1%81%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%0A%20%20%20%20for%20i%20in%20range%281%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D0%B5%D1%86%0A%20%20%20%20%20%20%20%20leftup%20%3D%20dp%5B0%5D%20%20%23%20%D0%92%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%20%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C%20dp%5Bi-1%2C%20j-1%5D%0A%20%20%20%20%20%20%20%20dp%5B0%5D%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BE%D1%81%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D1%8B%0A%20%20%20%20%20%20%20%20for%20j%20in%20range%281%2C%20m%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20temp%20%3D%20dp%5Bj%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20s%5Bi%20-%201%5D%20%3D%3D%20t%5Bj%20-%201%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B4%D0%B2%D0%B0%20%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%B0%20%D1%80%D0%B0%D0%B2%D0%BD%D1%8B%2C%20%D1%81%D1%80%D0%B0%D0%B7%D1%83%20%D0%BF%D1%80%D0%BE%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%B8%D1%85%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bj%5D%20%3D%20leftup%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D1%88%D0%B0%D0%B3%D0%BE%D0%B2%20%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%3D%20%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D1%88%D0%B0%D0%B3%D0%BE%D0%B2%20%D0%B4%D0%BB%D1%8F%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%2C%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B8%20%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D1%8B%20%2B%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bj%5D%20%3D%20min%28dp%5Bj%20-%201%5D%2C%20dp%5Bj%5D%2C%20leftup%29%20%2B%201%0A%20%20%20%20%20%20%20%20%20%20%20%20leftup%20%3D%20temp%20%20%23%20%D0%9E%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BE%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20dp%5Bi-1%2C%20j-1%5D%20%D0%B4%D0%BB%D1%8F%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9%20%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8%0A%20%20%20%20return%20dp%5Bm%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20s%20%3D%20%22bag%22%0A%20%20%20%20t%20%3D%20%22pack%22%0A%20%20%20%20n%2C%20m%20%3D%20len%28s%29%2C%20len%28t%29%0A%0A%20%20%20%20%23%20%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%0A%20%20%20%20res%20%3D%20edit_distance_dp_comp%28s%2C%20t%29%0A%20%20%20%20print%28f%22%D0%A7%D1%82%D0%BE%D0%B1%D1%8B%20%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%7Bs%7D%20%D0%B2%20%7Bt%7D%2C%20%D0%BD%D1%83%D0%B6%D0%BD%D0%BE%20%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D1%83%D0%BC%20%7Bres%7D%20%D1%88%D0%B0%D0%B3%D0%BE%D0%B2%22%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_dynamic_programming/knapsack.md b/ru/codes/pythontutor/chapter_dynamic_programming/knapsack.md new file mode 100644 index 000000000..0fd4a5095 --- /dev/null +++ b/ru/codes/pythontutor/chapter_dynamic_programming/knapsack.md @@ -0,0 +1,17 @@ + + + +https://pythontutor.com/render.html#code=def%20knapsack_dfs%28wgt%3A%20list%5Bint%5D%2C%20val%3A%20list%5Bint%5D%2C%20i%3A%20int%2C%20c%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A0%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%200-1%3A%20%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B1%D0%BE%D1%80%22%22%22%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B2%D1%81%D0%B5%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D1%8B%20%D1%83%D0%B6%D0%B5%20%D1%80%D0%B0%D1%81%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B5%D0%BD%D1%8B%20%D0%B8%D0%BB%D0%B8%20%D0%B2%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B5%20%D0%BD%D0%B5%20%D0%BE%D1%81%D1%82%D0%B0%D0%BB%D0%BE%D1%81%D1%8C%20%D0%BC%D0%B5%D1%81%D1%82%D0%B0%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%200%0A%20%20%20%20if%20i%20%3D%3D%200%20or%20c%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20return%200%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B0%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B0%2C%20%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D0%BD%D0%B5%20%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%20%D0%B2%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%0A%20%20%20%20if%20wgt%5Bi%20-%201%5D%20%3E%20c%3A%0A%20%20%20%20%20%20%20%20return%20knapsack_dfs%28wgt%2C%20val%2C%20i%20-%201%2C%20c%29%0A%20%20%20%20%23%20%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D1%8C%20%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%83%D1%8E%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%B4%D0%BB%D1%8F%20%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B5%D0%B2%2C%20%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%20i%20%D0%BD%D0%B5%20%D0%BA%D0%BB%D0%B0%D0%B4%D1%83%D1%82%20%D0%B8%20%D0%BA%D0%BB%D0%B0%D0%B4%D1%83%D1%82%0A%20%20%20%20no%20%3D%20knapsack_dfs%28wgt%2C%20val%2C%20i%20-%201%2C%20c%29%0A%20%20%20%20yes%20%3D%20knapsack_dfs%28wgt%2C%20val%2C%20i%20-%201%2C%20c%20-%20wgt%5Bi%20-%201%5D%29%20%2B%20val%5Bi%20-%201%5D%0A%20%20%20%20%23%20%D0%92%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%20%D1%81%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%D0%B9%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%D1%8E%20%D0%B8%D0%B7%20%D0%B4%D0%B2%D1%83%D1%85%20%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D1%8B%D1%85%0A%20%20%20%20return%20max%28no%2C%20yes%29%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20wgt%20%3D%20%5B10%2C%2020%2C%2030%2C%2040%2C%2050%5D%0A%20%20%20%20val%20%3D%20%5B50%2C%20120%2C%20150%2C%20210%2C%20240%5D%0A%20%20%20%20cap%20%3D%2050%0A%20%20%20%20n%20%3D%20len%28wgt%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B1%D0%BE%D1%80%0A%20%20%20%20res%20%3D%20knapsack_dfs%28wgt%2C%20val%2C%20n%2C%20cap%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2%20%D0%B1%D0%B5%D0%B7%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B0%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=7&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20knapsack_dfs_mem%28%0A%20%20%20%20wgt%3A%20list%5Bint%5D%2C%20val%3A%20list%5Bint%5D%2C%20mem%3A%20list%5Blist%5Bint%5D%5D%2C%20i%3A%20int%2C%20c%3A%20int%0A%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A0%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%200-1%3A%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%D1%81%20%D0%BC%D0%B5%D0%BC%D0%BE%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%22%22%22%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B2%D1%81%D0%B5%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D1%8B%20%D1%83%D0%B6%D0%B5%20%D1%80%D0%B0%D1%81%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B5%D0%BD%D1%8B%20%D0%B8%D0%BB%D0%B8%20%D0%B2%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B5%20%D0%BD%D0%B5%20%D0%BE%D1%81%D1%82%D0%B0%D0%BB%D0%BE%D1%81%D1%8C%20%D0%BC%D0%B5%D1%81%D1%82%D0%B0%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%200%0A%20%20%20%20if%20i%20%3D%3D%200%20or%20c%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20return%200%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C%20%D1%83%D0%B6%D0%B5%20%D0%B5%D1%81%D1%82%D1%8C%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%81%D1%80%D0%B0%D0%B7%D1%83%0A%20%20%20%20if%20mem%5Bi%5D%5Bc%5D%20%21%3D%20-1%3A%0A%20%20%20%20%20%20%20%20return%20mem%5Bi%5D%5Bc%5D%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B0%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B0%2C%20%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D0%BD%D0%B5%20%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%20%D0%B2%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%0A%20%20%20%20if%20wgt%5Bi%20-%201%5D%20%3E%20c%3A%0A%20%20%20%20%20%20%20%20return%20knapsack_dfs_mem%28wgt%2C%20val%2C%20mem%2C%20i%20-%201%2C%20c%29%0A%20%20%20%20%23%20%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D1%8C%20%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%83%D1%8E%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%B4%D0%BB%D1%8F%20%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B5%D0%B2%2C%20%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%20i%20%D0%BD%D0%B5%20%D0%BA%D0%BB%D0%B0%D0%B4%D1%83%D1%82%20%D0%B8%20%D0%BA%D0%BB%D0%B0%D0%B4%D1%83%D1%82%0A%20%20%20%20no%20%3D%20knapsack_dfs_mem%28wgt%2C%20val%2C%20mem%2C%20i%20-%201%2C%20c%29%0A%20%20%20%20yes%20%3D%20knapsack_dfs_mem%28wgt%2C%20val%2C%20mem%2C%20i%20-%201%2C%20c%20-%20wgt%5Bi%20-%201%5D%29%20%2B%20val%5Bi%20-%201%5D%0A%20%20%20%20%23%20%D0%A1%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B8%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%20%D1%81%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%D0%B9%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%D1%8E%20%D0%B8%D0%B7%20%D0%B4%D0%B2%D1%83%D1%85%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%0A%20%20%20%20mem%5Bi%5D%5Bc%5D%20%3D%20max%28no%2C%20yes%29%0A%20%20%20%20return%20mem%5Bi%5D%5Bc%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20wgt%20%3D%20%5B10%2C%2020%2C%2030%2C%2040%2C%2050%5D%0A%20%20%20%20val%20%3D%20%5B50%2C%20120%2C%20150%2C%20210%2C%20240%5D%0A%20%20%20%20cap%20%3D%2050%0A%20%20%20%20n%20%3D%20len%28wgt%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%B8%D1%81%D0%BA%20%D1%81%20%D0%BC%D0%B5%D0%BC%D0%BE%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%0A%20%20%20%20mem%20%3D%20%5B%5B-1%5D%20%2A%20%28cap%20%2B%201%29%20for%20_%20in%20range%28n%20%2B%201%29%5D%0A%20%20%20%20res%20%3D%20knapsack_dfs_mem%28wgt%2C%20val%2C%20mem%2C%20n%2C%20cap%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2%20%D0%B1%D0%B5%D0%B7%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B0%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=20&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20knapsack_dp%28wgt%3A%20list%5Bint%5D%2C%20val%3A%20list%5Bint%5D%2C%20cap%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A0%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%200-1%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%22%22%22%0A%20%20%20%20n%20%3D%20len%28wgt%29%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%20dp%0A%20%20%20%20dp%20%3D%20%5B%5B0%5D%20%2A%20%28cap%20%2B%201%29%20for%20_%20in%20range%28n%20%2B%201%29%5D%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%0A%20%20%20%20for%20i%20in%20range%281%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20for%20c%20in%20range%281%2C%20cap%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20wgt%5Bi%20-%201%5D%20%3E%20c%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B0%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B0%2C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%20i%20%D0%BD%D0%B5%20%D0%B2%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D1%82%D1%8C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bi%5D%5Bc%5D%20%3D%20dp%5Bi%20-%201%5D%5Bc%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%D0%B5%20%D0%B8%D0%B7%20%D0%B4%D0%B2%D1%83%D1%85%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%3A%20%D0%BD%D0%B5%20%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D0%B8%D0%BB%D0%B8%20%D0%B2%D0%B7%D1%8F%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%20i%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bi%5D%5Bc%5D%20%3D%20max%28dp%5Bi%20-%201%5D%5Bc%5D%2C%20dp%5Bi%20-%201%5D%5Bc%20-%20wgt%5Bi%20-%201%5D%5D%20%2B%20val%5Bi%20-%201%5D%29%0A%20%20%20%20return%20dp%5Bn%5D%5Bcap%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20wgt%20%3D%20%5B10%2C%2020%2C%2030%2C%2040%2C%2050%5D%0A%20%20%20%20val%20%3D%20%5B50%2C%20120%2C%20150%2C%20210%2C%20240%5D%0A%20%20%20%20cap%20%3D%2050%0A%20%20%20%20n%20%3D%20len%28wgt%29%0A%0A%20%20%20%20%23%20%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%0A%20%20%20%20res%20%3D%20knapsack_dp%28wgt%2C%20val%2C%20cap%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2%20%D0%B1%D0%B5%D0%B7%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B0%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=7&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20knapsack_dp_comp%28wgt%3A%20list%5Bint%5D%2C%20val%3A%20list%5Bint%5D%2C%20cap%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A0%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%200-1%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%22%22%22%0A%20%20%20%20n%20%3D%20len%28wgt%29%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%20dp%0A%20%20%20%20dp%20%3D%20%5B0%5D%20%2A%20%28cap%20%2B%201%29%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%0A%20%20%20%20for%20i%20in%20range%281%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%9E%D0%B1%D1%85%D0%BE%D0%B4%20%D0%B2%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%BC%20%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B5%0A%20%20%20%20%20%20%20%20for%20c%20in%20range%28cap%2C%200%2C%20-1%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20wgt%5Bi%20-%201%5D%20%3E%20c%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B0%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B0%2C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%20i%20%D0%BD%D0%B5%20%D0%B2%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D1%82%D1%8C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bc%5D%20%3D%20dp%5Bc%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%D0%B5%20%D0%B8%D0%B7%20%D0%B4%D0%B2%D1%83%D1%85%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%3A%20%D0%BD%D0%B5%20%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D0%B8%D0%BB%D0%B8%20%D0%B2%D0%B7%D1%8F%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%20i%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bc%5D%20%3D%20max%28dp%5Bc%5D%2C%20dp%5Bc%20-%20wgt%5Bi%20-%201%5D%5D%20%2B%20val%5Bi%20-%201%5D%29%0A%20%20%20%20return%20dp%5Bcap%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20wgt%20%3D%20%5B10%2C%2020%2C%2030%2C%2040%2C%2050%5D%0A%20%20%20%20val%20%3D%20%5B50%2C%20120%2C%20150%2C%20210%2C%20240%5D%0A%20%20%20%20cap%20%3D%2050%0A%20%20%20%20n%20%3D%20len%28wgt%29%0A%0A%20%20%20%20%23%20%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%0A%20%20%20%20res%20%3D%20knapsack_dp_comp%28wgt%2C%20val%2C%20cap%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2%20%D0%B1%D0%B5%D0%B7%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B0%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=7&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_dynamic_programming/min_cost_climbing_stairs_dp.md b/ru/codes/pythontutor/chapter_dynamic_programming/min_cost_climbing_stairs_dp.md new file mode 100644 index 000000000..589402c87 --- /dev/null +++ b/ru/codes/pythontutor/chapter_dynamic_programming/min_cost_climbing_stairs_dp.md @@ -0,0 +1,11 @@ + + + +https://pythontutor.com/render.html#code=def%20min_cost_climbing_stairs_dp%28cost%3A%20list%5Bint%5D%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D0%BE%D0%B4%D1%8A%D0%B5%D0%BC%D0%B0%20%D0%BF%D0%BE%20%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B5%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%22%22%22%0A%20%20%20%20n%20%3D%20len%28cost%29%20-%201%0A%20%20%20%20if%20n%20%3D%3D%201%20or%20n%20%3D%3D%202%3A%0A%20%20%20%20%20%20%20%20return%20cost%5Bn%5D%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%20dp%20%D0%B4%D0%BB%D1%8F%20%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%BF%D0%BE%D0%B4%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%0A%20%20%20%20dp%20%3D%20%5B0%5D%20%2A%20%28n%20%2B%201%29%0A%20%20%20%20%23%20%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5%3A%20%D0%B7%D0%B0%D1%80%D0%B0%D0%BD%D0%B5%D0%B5%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D1%8C%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BD%D0%B0%D0%B8%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B8%D1%85%20%D0%BF%D0%BE%D0%B4%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%0A%20%20%20%20dp%5B1%5D%2C%20dp%5B2%5D%20%3D%20cost%5B1%5D%2C%20cost%5B2%5D%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BF%D0%BE%D1%81%D1%82%D0%B5%D0%BF%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B8%D1%85%20%D0%BF%D0%BE%D0%B4%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%20%D1%87%D0%B5%D1%80%D0%B5%D0%B7%20%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B8%D0%B5%0A%20%20%20%20for%20i%20in%20range%283%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20dp%5Bi%5D%20%3D%20min%28dp%5Bi%20-%201%5D%2C%20dp%5Bi%20-%202%5D%29%20%2B%20cost%5Bi%5D%0A%20%20%20%20return%20dp%5Bn%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20cost%20%3D%20%5B0%2C%201%2C%2010%2C%201%2C%201%2C%201%2C%2010%2C%201%2C%201%2C%2010%2C%201%5D%0A%20%20%20%20print%28f%22%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9%20%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%D0%B5%D0%B9%20%3D%20%7Bcost%7D%22%29%0A%0A%20%20%20%20res%20%3D%20min_cost_climbing_stairs_dp%28cost%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D0%BE%D0%B4%D1%8A%D0%B5%D0%BC%D0%B0%20%D0%BF%D0%BE%20%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B5%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20min_cost_climbing_stairs_dp_comp%28cost%3A%20list%5Bint%5D%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D0%BE%D0%B4%D1%8A%D0%B5%D0%BC%D0%B0%20%D0%BF%D0%BE%20%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B5%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%22%22%22%0A%20%20%20%20n%20%3D%20len%28cost%29%20-%201%0A%20%20%20%20if%20n%20%3D%3D%201%20or%20n%20%3D%3D%202%3A%0A%20%20%20%20%20%20%20%20return%20cost%5Bn%5D%0A%20%20%20%20a%2C%20b%20%3D%20cost%5B1%5D%2C%20cost%5B2%5D%0A%20%20%20%20for%20i%20in%20range%283%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20a%2C%20b%20%3D%20b%2C%20min%28a%2C%20b%29%20%2B%20cost%5Bi%5D%0A%20%20%20%20return%20b%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20cost%20%3D%20%5B0%2C%201%2C%2010%2C%201%2C%201%2C%201%2C%2010%2C%201%2C%201%2C%2010%2C%201%5D%0A%20%20%20%20print%28f%22%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9%20%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%D0%B5%D0%B9%20%3D%20%7Bcost%7D%22%29%0A%0A%20%20%20%20res%20%3D%20min_cost_climbing_stairs_dp_comp%28cost%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D0%BE%D0%B4%D1%8A%D0%B5%D0%BC%D0%B0%20%D0%BF%D0%BE%20%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B5%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_dynamic_programming/min_path_sum.md b/ru/codes/pythontutor/chapter_dynamic_programming/min_path_sum.md new file mode 100644 index 000000000..6db438bc7 --- /dev/null +++ b/ru/codes/pythontutor/chapter_dynamic_programming/min_path_sum.md @@ -0,0 +1,17 @@ + + + +https://pythontutor.com/render.html#code=from%20math%20import%20inf%0A%0Adef%20min_path_sum_dfs%28grid%3A%20list%5Blist%5Bint%5D%5D%2C%20i%3A%20int%2C%20j%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D1%83%D1%82%D0%B8%3A%20%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B1%D0%BE%D1%80%22%22%22%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D1%8D%D1%82%D0%BE%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D1%8F%D1%8F%20%D0%BB%D0%B5%D0%B2%D0%B0%D1%8F%20%D1%8F%D1%87%D0%B5%D0%B9%D0%BA%D0%B0%2C%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B8%D1%82%D1%8C%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%0A%20%20%20%20if%20i%20%3D%3D%200%20and%20j%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20return%20grid%5B0%5D%5B0%5D%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%20%D0%B8%D0%BB%D0%B8%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D0%B0%20%D0%B2%D1%8B%D1%85%D0%BE%D0%B4%D1%8F%D1%82%20%D0%B7%D0%B0%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%2B%E2%88%9E%0A%20%20%20%20if%20i%20%3C%200%20or%20j%20%3C%200%3A%0A%20%20%20%20%20%20%20%20return%20inf%0A%20%20%20%20%23%20%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D1%8C%20%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%83%D1%8E%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D1%83%D1%82%D0%B8%20%D0%B8%D0%B7%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D0%B3%D0%BE%20%D1%83%D0%B3%D0%BB%D0%B0%20%D0%B4%D0%BE%20%28i-1%2C%20j%29%20%D0%B8%20%28i%2C%20j-1%29%0A%20%20%20%20up%20%3D%20min_path_sum_dfs%28grid%2C%20i%20-%201%2C%20j%29%0A%20%20%20%20left%20%3D%20min_path_sum_dfs%28grid%2C%20i%2C%20j%20-%201%29%0A%20%20%20%20%23%20%D0%92%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%83%D1%8E%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D1%83%D1%82%D0%B8%20%D0%B8%D0%B7%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D0%B3%D0%BE%20%D1%83%D0%B3%D0%BB%D0%B0%20%D0%B4%D0%BE%20%28i%2C%20j%29%0A%20%20%20%20return%20min%28left%2C%20up%29%20%2B%20grid%5Bi%5D%5Bj%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20grid%20%3D%20%5B%5B1%2C%203%2C%201%2C%205%5D%2C%20%5B2%2C%202%2C%204%2C%202%5D%2C%20%5B5%2C%203%2C%202%2C%201%5D%2C%20%5B4%2C%203%2C%205%2C%202%5D%5D%0A%20%20%20%20n%2C%20m%20%3D%20len%28grid%29%2C%20len%28grid%5B0%5D%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B1%D0%BE%D1%80%0A%20%20%20%20res%20%3D%20min_path_sum_dfs%28grid%2C%20n%20-%201%2C%20m%20-%201%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D1%83%D1%82%D0%B8%20%D0%B8%D0%B7%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D0%B3%D0%BE%20%D1%83%D0%B3%D0%BB%D0%B0%20%D0%B2%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%BD%D0%B8%D0%B6%D0%BD%D0%B8%D0%B9%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=from%20math%20import%20inf%0A%0Adef%20min_path_sum_dfs_mem%28%0A%20%20%20%20grid%3A%20list%5Blist%5Bint%5D%5D%2C%20mem%3A%20list%5Blist%5Bint%5D%5D%2C%20i%3A%20int%2C%20j%3A%20int%0A%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D1%83%D1%82%D0%B8%3A%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%D1%81%20%D0%BC%D0%B5%D0%BC%D0%BE%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%22%22%22%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D1%8D%D1%82%D0%BE%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D1%8F%D1%8F%20%D0%BB%D0%B5%D0%B2%D0%B0%D1%8F%20%D1%8F%D1%87%D0%B5%D0%B9%D0%BA%D0%B0%2C%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B8%D1%82%D1%8C%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%0A%20%20%20%20if%20i%20%3D%3D%200%20and%20j%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20return%20grid%5B0%5D%5B0%5D%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%20%D0%B8%D0%BB%D0%B8%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D0%B0%20%D0%B2%D1%8B%D1%85%D0%BE%D0%B4%D1%8F%D1%82%20%D0%B7%D0%B0%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%2B%E2%88%9E%0A%20%20%20%20if%20i%20%3C%200%20or%20j%20%3C%200%3A%0A%20%20%20%20%20%20%20%20return%20inf%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C%20%D1%83%D0%B6%D0%B5%20%D0%B5%D1%81%D1%82%D1%8C%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%81%D1%80%D0%B0%D0%B7%D1%83%0A%20%20%20%20if%20mem%5Bi%5D%5Bj%5D%20%21%3D%20-1%3A%0A%20%20%20%20%20%20%20%20return%20mem%5Bi%5D%5Bj%5D%0A%20%20%20%20%23%20%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D1%83%D1%82%D0%B8%20%D0%B4%D0%BB%D1%8F%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9%20%D0%B8%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D0%B9%20%D1%8F%D1%87%D0%B5%D0%B5%D0%BA%0A%20%20%20%20up%20%3D%20min_path_sum_dfs_mem%28grid%2C%20mem%2C%20i%20-%201%2C%20j%29%0A%20%20%20%20left%20%3D%20min_path_sum_dfs_mem%28grid%2C%20mem%2C%20i%2C%20j%20-%201%29%0A%20%20%20%20%23%20%D0%A1%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B8%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%83%D1%8E%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D1%83%D1%82%D0%B8%20%D0%B8%D0%B7%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D0%B3%D0%BE%20%D1%83%D0%B3%D0%BB%D0%B0%20%D0%B4%D0%BE%20%28i%2C%20j%29%0A%20%20%20%20mem%5Bi%5D%5Bj%5D%20%3D%20min%28left%2C%20up%29%20%2B%20grid%5Bi%5D%5Bj%5D%0A%20%20%20%20return%20mem%5Bi%5D%5Bj%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20grid%20%3D%20%5B%5B1%2C%203%2C%201%2C%205%5D%2C%20%5B2%2C%202%2C%204%2C%202%5D%2C%20%5B5%2C%203%2C%202%2C%201%5D%2C%20%5B4%2C%203%2C%205%2C%202%5D%5D%0A%20%20%20%20n%2C%20m%20%3D%20len%28grid%29%2C%20len%28grid%5B0%5D%29%0A%0A%20%20%20%23%20%D0%9F%D0%BE%D0%B8%D1%81%D0%BA%20%D1%81%20%D0%BC%D0%B5%D0%BC%D0%BE%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%0A%20%20%20%20mem%20%3D%20%5B%5B-1%5D%20%2A%20m%20for%20_%20in%20range%28n%29%5D%0A%20%20%20%20res%20%3D%20min_path_sum_dfs_mem%28grid%2C%20mem%2C%20n%20-%201%2C%20m%20-%201%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D1%83%D1%82%D0%B8%20%D0%B8%D0%B7%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D0%B3%D0%BE%20%D1%83%D0%B3%D0%BB%D0%B0%20%D0%B2%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%BD%D0%B8%D0%B6%D0%BD%D0%B8%D0%B9%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=16&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=from%20math%20import%20inf%0A%0Adef%20min_path_sum_dp%28grid%3A%20list%5Blist%5Bint%5D%5D%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D1%83%D1%82%D0%B8%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%22%22%22%0A%20%20%20%20n%2C%20m%20%3D%20len%28grid%29%2C%20len%28grid%5B0%5D%29%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%20dp%0A%20%20%20%20dp%20%3D%20%5B%5B0%5D%20%2A%20m%20for%20_%20in%20range%28n%29%5D%0A%20%20%20%20dp%5B0%5D%5B0%5D%20%3D%20grid%5B0%5D%5B0%5D%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BF%D0%B5%D1%80%D0%B2%D0%B0%D1%8F%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0%0A%20%20%20%20for%20j%20in%20range%281%2C%20m%29%3A%0A%20%20%20%20%20%20%20%20dp%5B0%5D%5Bj%5D%20%3D%20dp%5B0%5D%5Bj%20-%201%5D%20%2B%20grid%5B0%5D%5Bj%5D%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D0%B5%D1%86%0A%20%20%20%20for%20i%20in%20range%281%2C%20n%29%3A%0A%20%20%20%20%20%20%20%20dp%5Bi%5D%5B0%5D%20%3D%20dp%5Bi%20-%201%5D%5B0%5D%20%2B%20grid%5Bi%5D%5B0%5D%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BE%D1%81%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%20%D0%B8%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D1%8B%0A%20%20%20%20for%20i%20in%20range%281%2C%20n%29%3A%0A%20%20%20%20%20%20%20%20for%20j%20in%20range%281%2C%20m%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bi%5D%5Bj%5D%20%3D%20min%28dp%5Bi%5D%5Bj%20-%201%5D%2C%20dp%5Bi%20-%201%5D%5Bj%5D%29%20%2B%20grid%5Bi%5D%5Bj%5D%0A%20%20%20%20return%20dp%5Bn%20-%201%5D%5Bm%20-%201%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20grid%20%3D%20%5B%5B1%2C%203%2C%201%2C%205%5D%2C%20%5B2%2C%202%2C%204%2C%202%5D%2C%20%5B5%2C%203%2C%202%2C%201%5D%2C%20%5B4%2C%203%2C%205%2C%202%5D%5D%0A%20%20%20%20n%2C%20m%20%3D%20len%28grid%29%2C%20len%28grid%5B0%5D%29%0A%0A%20%20%20%20%23%20%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%0A%20%20%20%20res%20%3D%20min_path_sum_dp%28grid%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D1%83%D1%82%D0%B8%20%D0%B8%D0%B7%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D0%B3%D0%BE%20%D1%83%D0%B3%D0%BB%D0%B0%20%D0%B2%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%BD%D0%B8%D0%B6%D0%BD%D0%B8%D0%B9%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=from%20math%20import%20inf%0A%0Adef%20min_path_sum_dp_comp%28grid%3A%20list%5Blist%5Bint%5D%5D%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D1%83%D1%82%D0%B8%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%22%22%22%0A%20%20%20%20n%2C%20m%20%3D%20len%28grid%29%2C%20len%28grid%5B0%5D%29%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%20dp%0A%20%20%20%20dp%20%3D%20%5B0%5D%20%2A%20m%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BF%D0%B5%D1%80%D0%B2%D0%B0%D1%8F%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0%0A%20%20%20%20dp%5B0%5D%20%3D%20grid%5B0%5D%5B0%5D%0A%20%20%20%20for%20j%20in%20range%281%2C%20m%29%3A%0A%20%20%20%20%20%20%20%20dp%5Bj%5D%20%3D%20dp%5Bj%20-%201%5D%20%2B%20grid%5B0%5D%5Bj%5D%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BE%D1%81%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%0A%20%20%20%20for%20i%20in%20range%281%2C%20n%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D0%B5%D1%86%0A%20%20%20%20%20%20%20%20dp%5B0%5D%20%3D%20dp%5B0%5D%20%2B%20grid%5Bi%5D%5B0%5D%0A%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%3A%20%D0%BE%D1%81%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D1%8B%0A%20%20%20%20%20%20%20%20for%20j%20in%20range%281%2C%20m%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bj%5D%20%3D%20min%28dp%5Bj%20-%201%5D%2C%20dp%5Bj%5D%29%20%2B%20grid%5Bi%5D%5Bj%5D%0A%20%20%20%20return%20dp%5Bm%20-%201%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20grid%20%3D%20%5B%5B1%2C%203%2C%201%2C%205%5D%2C%20%5B2%2C%202%2C%204%2C%202%5D%2C%20%5B5%2C%203%2C%202%2C%201%5D%2C%20%5B4%2C%203%2C%205%2C%202%5D%5D%0A%20%20%20%20n%2C%20m%20%3D%20len%28grid%29%2C%20len%28grid%5B0%5D%29%0A%0A%20%20%20%20%23%20%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%0A%20%20%20%20res%20%3D%20min_path_sum_dp_comp%28grid%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D0%BF%D1%83%D1%82%D0%B8%20%D0%B8%D0%B7%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D0%B3%D0%BE%20%D1%83%D0%B3%D0%BB%D0%B0%20%D0%B2%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%BD%D0%B8%D0%B6%D0%BD%D0%B8%D0%B9%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_dynamic_programming/unbounded_knapsack.md b/ru/codes/pythontutor/chapter_dynamic_programming/unbounded_knapsack.md new file mode 100644 index 000000000..c3a1dd2cd --- /dev/null +++ b/ru/codes/pythontutor/chapter_dynamic_programming/unbounded_knapsack.md @@ -0,0 +1,11 @@ + + + +https://pythontutor.com/render.html#code=def%20unbounded_knapsack_dp%28wgt%3A%20list%5Bint%5D%2C%20val%3A%20list%5Bint%5D%2C%20cap%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%22%22%22%0A%20%20%20%20n%20%3D%20len%28wgt%29%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%20dp%0A%20%20%20%20dp%20%3D%20%5B%5B0%5D%20%2A%20%28cap%20%2B%201%29%20for%20_%20in%20range%28n%20%2B%201%29%5D%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%0A%20%20%20%20for%20i%20in%20range%281%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20for%20c%20in%20range%281%2C%20cap%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20wgt%5Bi%20-%201%5D%20%3E%20c%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B0%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B0%2C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%20i%20%D0%BD%D0%B5%20%D0%B2%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D1%82%D1%8C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bi%5D%5Bc%5D%20%3D%20dp%5Bi%20-%201%5D%5Bc%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%D0%B5%20%D0%B8%D0%B7%20%D0%B4%D0%B2%D1%83%D1%85%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%3A%20%D0%BD%D0%B5%20%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D0%B8%D0%BB%D0%B8%20%D0%B2%D0%B7%D1%8F%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%20i%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bi%5D%5Bc%5D%20%3D%20max%28dp%5Bi%20-%201%5D%5Bc%5D%2C%20dp%5Bi%5D%5Bc%20-%20wgt%5Bi%20-%201%5D%5D%20%2B%20val%5Bi%20-%201%5D%29%0A%20%20%20%20return%20dp%5Bn%5D%5Bcap%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20wgt%20%3D%20%5B1%2C%202%2C%203%5D%0A%20%20%20%20val%20%3D%20%5B5%2C%2011%2C%2015%5D%0A%20%20%20%20cap%20%3D%204%0A%0A%20%20%20%20%23%20%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%0A%20%20%20%20res%20%3D%20unbounded_knapsack_dp%28wgt%2C%20val%2C%20cap%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2%20%D0%B1%D0%B5%D0%B7%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B0%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20unbounded_knapsack_dp_comp%28wgt%3A%20list%5Bint%5D%2C%20val%3A%20list%5Bint%5D%2C%20cap%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%3A%20%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%22%22%22%0A%20%20%20%20n%20%3D%20len%28wgt%29%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%20dp%0A%20%20%20%20dp%20%3D%20%5B0%5D%20%2A%20%28cap%20%2B%201%29%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9%0A%20%20%20%20for%20i%20in%20range%281%2C%20n%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%9F%D1%80%D1%8F%D0%BC%D0%BE%D0%B9%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%0A%20%20%20%20%20%20%20%20for%20c%20in%20range%281%2C%20cap%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20wgt%5Bi%20-%201%5D%20%3E%20c%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B0%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B0%2C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%20i%20%D0%BD%D0%B5%20%D0%B2%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D1%82%D1%8C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bc%5D%20%3D%20dp%5Bc%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%D0%B5%20%D0%B8%D0%B7%20%D0%B4%D0%B2%D1%83%D1%85%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%3A%20%D0%BD%D0%B5%20%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D0%B8%D0%BB%D0%B8%20%D0%B2%D0%B7%D1%8F%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%20i%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dp%5Bc%5D%20%3D%20max%28dp%5Bc%5D%2C%20dp%5Bc%20-%20wgt%5Bi%20-%201%5D%5D%20%2B%20val%5Bi%20-%201%5D%29%0A%20%20%20%20return%20dp%5Bcap%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20wgt%20%3D%20%5B1%2C%202%2C%203%5D%0A%20%20%20%20val%20%3D%20%5B5%2C%2011%2C%2015%5D%0A%20%20%20%20cap%20%3D%204%0A%0A%20%20%20%20%23%20%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%0A%20%20%20%20res%20%3D%20unbounded_knapsack_dp_comp%28wgt%2C%20val%2C%20cap%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2%20%D0%B1%D0%B5%D0%B7%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B0%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_graph/graph_adjacency_list.md b/ru/codes/pythontutor/chapter_graph/graph_adjacency_list.md new file mode 100644 index 000000000..3171c6637 --- /dev/null +++ b/ru/codes/pythontutor/chapter_graph/graph_adjacency_list.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20Vertex%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%20%3D%20val%0A%0Adef%20vals_to_vets%28vals%3A%20list%5Bint%5D%29%20-%3E%20list%5B%27Vertex%27%5D%3A%0A%20%20%20%20return%20%5BVertex%28val%29%20for%20val%20in%20vals%5D%0A%0Aclass%20GraphAdjList%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20edges%3A%20list%5Blist%5BVertex%5D%5D%29%3A%0A%20%20%20%20%20%20%20%20self.adj_list%20%3D%20dict%5BVertex%2C%20list%5BVertex%5D%5D%28%29%0A%20%20%20%20%20%20%20%20for%20edge%20in%20edges%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.add_vertex%28edge%5B0%5D%29%0A%20%20%20%20%20%20%20%20%20%20%20%20self.add_vertex%28edge%5B1%5D%29%0A%20%20%20%20%20%20%20%20%20%20%20%20self.add_edge%28edge%5B0%5D%2C%20edge%5B1%5D%29%0A%0A%20%20%20%20def%20size%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%20len%28self.adj_list%29%0A%0A%20%20%20%20def%20add_edge%28self%2C%20vet1%3A%20Vertex%2C%20vet2%3A%20Vertex%29%3A%0A%20%20%20%20%20%20%20%20if%20vet1%20not%20in%20self.adj_list%20or%20vet2%20not%20in%20self.adj_list%20or%20vet1%20%3D%3D%20vet2%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20ValueError%28%29%0A%20%20%20%20%20%20%20%20self.adj_list%5Bvet1%5D.append%28vet2%29%0A%20%20%20%20%20%20%20%20self.adj_list%5Bvet2%5D.append%28vet1%29%0A%0A%20%20%20%20def%20remove_edge%28self%2C%20vet1%3A%20Vertex%2C%20vet2%3A%20Vertex%29%3A%0A%20%20%20%20%20%20%20%20if%20vet1%20not%20in%20self.adj_list%20or%20vet2%20not%20in%20self.adj_list%20or%20vet1%20%3D%3D%20vet2%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20ValueError%28%29%0A%20%20%20%20%20%20%20%20self.adj_list%5Bvet1%5D.remove%28vet2%29%0A%20%20%20%20%20%20%20%20self.adj_list%5Bvet2%5D.remove%28vet1%29%0A%0A%20%20%20%20def%20add_vertex%28self%2C%20vet%3A%20Vertex%29%3A%0A%20%20%20%20%20%20%20%20if%20vet%20in%20self.adj_list%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20self.adj_list%5Bvet%5D%20%3D%20%5B%5D%0A%0A%20%20%20%20def%20remove_vertex%28self%2C%20vet%3A%20Vertex%29%3A%0A%20%20%20%20%20%20%20%20if%20vet%20not%20in%20self.adj_list%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20ValueError%28%29%0A%20%20%20%20%20%20%20%20self.adj_list.pop%28vet%29%0A%20%20%20%20%20%20%20%20for%20vertex%20in%20self.adj_list%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20vet%20in%20self.adj_list%5Bvertex%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.adj_list%5Bvertex%5D.remove%28vet%29%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20v%20%3D%20vals_to_vets%28%5B1%2C%203%2C%202%2C%205%2C%204%5D%29%0A%20%20%20%20edges%20%3D%20%5B%5Bv%5B0%5D%2C%20v%5B1%5D%5D%2C%20%5Bv%5B0%5D%2C%20v%5B3%5D%5D%2C%20%5Bv%5B1%5D%2C%20v%5B2%5D%5D%2C%20%5Bv%5B2%5D%2C%20v%5B3%5D%5D%2C%20%5Bv%5B2%5D%2C%20v%5B4%5D%5D%2C%20%5Bv%5B3%5D%2C%20v%5B4%5D%5D%5D%0A%20%20%20%20graph%20%3D%20GraphAdjList%28edges%29%0A%20%20%20%20del%20edges%0A%20%20%20%20graph.add_edge%28v%5B0%5D%2C%20v%5B2%5D%29%0A%20%20%20%20graph.remove_edge%28v%5B0%5D%2C%20v%5B1%5D%29%0A%20%20%20%20v5%20%3D%20Vertex%286%29%0A%20%20%20%20graph.add_vertex%28v5%29%0A%20%20%20%20graph.remove_vertex%28v%5B1%5D%29&cumulative=false&curInstr=39&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_graph/graph_adjacency_matrix.md b/ru/codes/pythontutor/chapter_graph/graph_adjacency_matrix.md new file mode 100644 index 000000000..76b2c4f58 --- /dev/null +++ b/ru/codes/pythontutor/chapter_graph/graph_adjacency_matrix.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20GraphAdjMat%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20vertices%3A%20list%5Bint%5D%2C%20edges%3A%20list%5Blist%5Bint%5D%5D%29%3A%0A%20%20%20%20%20%20%20%20self.vertices%3A%20list%5Bint%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20self.adj_mat%3A%20list%5Blist%5Bint%5D%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20val%20in%20vertices%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.add_vertex%28val%29%0A%20%20%20%20%20%20%20%20for%20e%20in%20edges%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.add_edge%28e%5B0%5D%2C%20e%5B1%5D%29%0A%0A%20%20%20%20def%20size%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%20len%28self.vertices%29%0A%0A%20%20%20%20def%20add_vertex%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20n%20%3D%20self.size%28%29%0A%20%20%20%20%20%20%20%20self.vertices.append%28val%29%0A%20%20%20%20%20%20%20%20new_row%20%3D%20%5B0%5D%20%2A%20n%0A%20%20%20%20%20%20%20%20self.adj_mat.append%28new_row%29%0A%20%20%20%20%20%20%20%20for%20row%20in%20self.adj_mat%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20row.append%280%29%0A%0A%20%20%20%20def%20remove_vertex%28self%2C%20index%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20if%20index%20%3E%3D%20self.size%28%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20IndexError%28%29%0A%20%20%20%20%20%20%20%20self.vertices.pop%28index%29%0A%20%20%20%20%20%20%20%20self.adj_mat.pop%28index%29%0A%20%20%20%20%20%20%20%20for%20row%20in%20self.adj_mat%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20row.pop%28index%29%0A%0A%20%20%20%20def%20add_edge%28self%2C%20i%3A%20int%2C%20j%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20if%20i%20%3C%200%20or%20j%20%3C%200%20or%20i%20%3E%3D%20self.size%28%29%20or%20%28j%20%3E%3D%20self.size%28%29%29%20or%20%28i%20%3D%3D%20j%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20IndexError%28%29%0A%20%20%20%20%20%20%20%20self.adj_mat%5Bi%5D%5Bj%5D%20%3D%201%0A%20%20%20%20%20%20%20%20self.adj_mat%5Bj%5D%5Bi%5D%20%3D%201%0A%0A%20%20%20%20def%20remove_edge%28self%2C%20i%3A%20int%2C%20j%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20if%20i%20%3C%200%20or%20j%20%3C%200%20or%20i%20%3E%3D%20self.size%28%29%20or%20%28j%20%3E%3D%20self.size%28%29%29%20or%20%28i%20%3D%3D%20j%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20IndexError%28%29%0A%20%20%20%20%20%20%20%20self.adj_mat%5Bi%5D%5Bj%5D%20%3D%200%0A%20%20%20%20%20%20%20%20self.adj_mat%5Bj%5D%5Bi%5D%20%3D%200%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20vertices%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20edges%20%3D%20%5B%5B0%2C%201%5D%2C%20%5B0%2C%203%5D%2C%20%5B1%2C%202%5D%2C%20%5B2%2C%203%5D%2C%20%5B2%2C%204%5D%2C%20%5B3%2C%204%5D%5D%0A%20%20%20%20graph%20%3D%20GraphAdjMat%28vertices%2C%20edges%29%0A%20%20%20%20graph.add_edge%280%2C%202%29%0A%20%20%20%20graph.remove_edge%280%2C%201%29%0A%20%20%20%20graph.add_vertex%286%29%0A%20%20%20%20graph.remove_vertex%281%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_graph/graph_bfs.md b/ru/codes/pythontutor/chapter_graph/graph_bfs.md new file mode 100644 index 000000000..040cc0a25 --- /dev/null +++ b/ru/codes/pythontutor/chapter_graph/graph_bfs.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=from%20collections%20import%20deque%0A%0Aclass%20Vertex%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%20%3D%20val%0A%0Adef%20vals_to_vets%28vals%3A%20list%5Bint%5D%29%20-%3E%20list%5B%27Vertex%27%5D%3A%0A%20%20%20%20return%20%5BVertex%28val%29%20for%20val%20in%20vals%5D%0A%0Aclass%20GraphAdjList%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20edges%3A%20list%5Blist%5BVertex%5D%5D%29%3A%0A%20%20%20%20%20%20%20%20self.adj_list%20%3D%20dict%5BVertex%2C%20list%5BVertex%5D%5D%28%29%0A%20%20%20%20%20%20%20%20for%20edge%20in%20edges%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.add_vertex%28edge%5B0%5D%29%0A%20%20%20%20%20%20%20%20%20%20%20%20self.add_vertex%28edge%5B1%5D%29%0A%20%20%20%20%20%20%20%20%20%20%20%20self.add_edge%28edge%5B0%5D%2C%20edge%5B1%5D%29%0A%0A%20%20%20%20def%20add_edge%28self%2C%20vet1%3A%20Vertex%2C%20vet2%3A%20Vertex%29%3A%0A%20%20%20%20%20%20%20%20if%20vet1%20not%20in%20self.adj_list%20or%20vet2%20not%20in%20self.adj_list%20or%20vet1%20%3D%3D%20vet2%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20ValueError%28%29%0A%20%20%20%20%20%20%20%20self.adj_list%5Bvet1%5D.append%28vet2%29%0A%20%20%20%20%20%20%20%20self.adj_list%5Bvet2%5D.append%28vet1%29%0A%0A%20%20%20%20def%20add_vertex%28self%2C%20vet%3A%20Vertex%29%3A%0A%20%20%20%20%20%20%20%20if%20vet%20in%20self.adj_list%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20self.adj_list%5Bvet%5D%20%3D%20%5B%5D%0A%0Adef%20graph_bfs%28graph%3A%20GraphAdjList%2C%20start_vet%3A%20Vertex%29%20-%3E%20list%5BVertex%5D%3A%0A%20%20%20%20res%20%3D%20%5B%5D%0A%20%20%20%20visited%20%3D%20set%5BVertex%5D%28%5Bstart_vet%5D%29%0A%20%20%20%20que%20%3D%20deque%5BVertex%5D%28%5Bstart_vet%5D%29%0A%20%20%20%20while%20len%28que%29%20%3E%200%3A%0A%20%20%20%20%20%20%20%20vet%20%3D%20que.popleft%28%29%0A%20%20%20%20%20%20%20%20res.append%28vet%29%0A%20%20%20%20%20%20%20%20for%20adj_vet%20in%20graph.adj_list%5Bvet%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20adj_vet%20in%20visited%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20que.append%28adj_vet%29%0A%20%20%20%20%20%20%20%20%20%20%20%20visited.add%28adj_vet%29%0A%20%20%20%20return%20res%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20v%20%3D%20vals_to_vets%28%5B0%2C%201%2C%202%2C%203%2C%204%5D%29%0A%20%20%20%20edges%20%3D%20%5B%5Bv%5B0%5D%2C%20v%5B1%5D%5D%2C%20%5Bv%5B0%5D%2C%20v%5B3%5D%5D%2C%20%5Bv%5B1%5D%2C%20v%5B2%5D%5D%2C%20%5Bv%5B1%5D%2C%20v%5B4%5D%5D%2C%20%5Bv%5B3%5D%2C%20v%5B4%5D%5D%5D%0A%20%20%20%20graph%20%3D%20GraphAdjList%28edges%29%0A%20%20%20%20del%20edges%0A%20%20%20%20res%20%3D%20graph_bfs%28graph%2C%20v%5B0%5D%29&cumulative=false&curInstr=131&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_graph/graph_dfs.md b/ru/codes/pythontutor/chapter_graph/graph_dfs.md new file mode 100644 index 000000000..199e80143 --- /dev/null +++ b/ru/codes/pythontutor/chapter_graph/graph_dfs.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20Vertex%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%20%3D%20val%0A%0Adef%20vals_to_vets%28vals%3A%20list%5Bint%5D%29%20-%3E%20list%5B%27Vertex%27%5D%3A%0A%20%20%20%20return%20%5BVertex%28val%29%20for%20val%20in%20vals%5D%0A%0Aclass%20GraphAdjList%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20edges%3A%20list%5Blist%5BVertex%5D%5D%29%3A%0A%20%20%20%20%20%20%20%20self.adj_list%20%3D%20dict%5BVertex%2C%20list%5BVertex%5D%5D%28%29%0A%20%20%20%20%20%20%20%20for%20edge%20in%20edges%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.add_vertex%28edge%5B0%5D%29%0A%20%20%20%20%20%20%20%20%20%20%20%20self.add_vertex%28edge%5B1%5D%29%0A%20%20%20%20%20%20%20%20%20%20%20%20self.add_edge%28edge%5B0%5D%2C%20edge%5B1%5D%29%0A%0A%20%20%20%20def%20add_edge%28self%2C%20vet1%3A%20Vertex%2C%20vet2%3A%20Vertex%29%3A%0A%20%20%20%20%20%20%20%20if%20vet1%20not%20in%20self.adj_list%20or%20vet2%20not%20in%20self.adj_list%20or%20vet1%20%3D%3D%20vet2%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20ValueError%28%29%0A%20%20%20%20%20%20%20%20self.adj_list%5Bvet1%5D.append%28vet2%29%0A%20%20%20%20%20%20%20%20self.adj_list%5Bvet2%5D.append%28vet1%29%0A%0A%20%20%20%20def%20add_vertex%28self%2C%20vet%3A%20Vertex%29%3A%0A%20%20%20%20%20%20%20%20if%20vet%20in%20self.adj_list%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20self.adj_list%5Bvet%5D%20%3D%20%5B%5D%0A%0Adef%20dfs%28graph%3A%20GraphAdjList%2C%20visited%3A%20set%5BVertex%5D%2C%20res%3A%20list%5BVertex%5D%2C%20vet%3A%20Vertex%29%3A%0A%20%20%20%20res.append%28vet%29%0A%20%20%20%20visited.add%28vet%29%0A%20%20%20%20for%20adjVet%20in%20graph.adj_list%5Bvet%5D%3A%0A%20%20%20%20%20%20%20%20if%20adjVet%20in%20visited%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20dfs%28graph%2C%20visited%2C%20res%2C%20adjVet%29%0A%0Adef%20graph_dfs%28graph%3A%20GraphAdjList%2C%20start_vet%3A%20Vertex%29%20-%3E%20list%5BVertex%5D%3A%0A%20%20%20%20res%20%3D%20%5B%5D%0A%20%20%20%20visited%20%3D%20set%5BVertex%5D%28%29%0A%20%20%20%20dfs%28graph%2C%20visited%2C%20res%2C%20start_vet%29%0A%20%20%20%20return%20res%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20v%20%3D%20vals_to_vets%28%5B0%2C%201%2C%202%2C%203%2C%204%5D%29%0A%20%20%20%20edges%20%3D%20%5B%5Bv%5B0%5D%2C%20v%5B1%5D%5D%2C%20%5Bv%5B0%5D%2C%20v%5B3%5D%5D%2C%20%5Bv%5B1%5D%2C%20v%5B2%5D%5D%2C%20%5Bv%5B1%5D%2C%20v%5B4%5D%5D%2C%20%5Bv%5B3%5D%2C%20v%5B4%5D%5D%5D%0A%20%20%20%20graph%20%3D%20GraphAdjList%28edges%29%0A%20%20%20%20res%20%3D%20graph_dfs%28graph%2C%20v%5B0%5D%29&cumulative=false&curInstr=130&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_greedy/coin_change_greedy.md b/ru/codes/pythontutor/chapter_greedy/coin_change_greedy.md new file mode 100644 index 000000000..c816060f4 --- /dev/null +++ b/ru/codes/pythontutor/chapter_greedy/coin_change_greedy.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20coin_change_greedy%28coins%3A%20list%5Bint%5D%2C%20amt%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D0%BD%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%3A%20%D0%B6%D0%B0%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%22%22%22%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%B5%D0%B4%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B8%D1%82%D1%8C%2C%20%D1%87%D1%82%D0%BE%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20coins%20%D1%83%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D1%87%D0%B5%D0%BD%0A%20%20%20%20i%20%3D%20len%28coins%29%20-%201%0A%20%20%20%20count%20%3D%200%0A%20%20%20%20%23%20%D0%A6%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%20%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D1%8F%D1%82%D1%8C%20%D0%B6%D0%B0%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%2C%20%D0%BF%D0%BE%D0%BA%D0%B0%20%D0%BD%D0%B5%20%D0%BE%D1%81%D1%82%D0%B0%D0%BD%D0%B5%D1%82%D1%81%D1%8F%20%D1%81%D1%83%D0%BC%D0%BC%D1%8B%0A%20%20%20%20while%20amt%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%9D%D0%B0%D0%B9%D1%82%D0%B8%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%D1%83%2C%20%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%B0%D1%8F%20%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%20%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B0%20%D1%81%D1%83%D0%BC%D0%BC%D1%8B%20%D0%B8%20%D0%BD%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5%20%D0%BA%20%D0%BD%D0%B5%D0%BC%D1%83%20%D0%B1%D0%BB%D0%B8%D0%B7%D0%BA%D0%B0%0A%20%20%20%20%20%20%20%20while%20i%20%3E%200%20and%20coins%5Bi%5D%20%3E%20amt%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20-%3D%201%0A%20%20%20%20%20%20%20%20%23%20%D0%92%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20coins%5Bi%5D%0A%20%20%20%20%20%20%20%20amt%20-%3D%20coins%5Bi%5D%0A%20%20%20%20%20%20%20%20count%20%2B%3D%201%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B4%D0%BE%D0%BF%D1%83%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D0%B5%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BD%D0%B5%20%D0%BD%D0%B0%D0%B9%D0%B4%D0%B5%D0%BD%D0%BE%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20-1%0A%20%20%20%20return%20count%20if%20amt%20%3D%3D%200%20else%20-1%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%96%D0%B0%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%3A%20%D0%B3%D0%B0%D1%80%D0%B0%D0%BD%D1%82%D0%B8%D1%80%D1%83%D0%B5%D1%82%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B3%D0%BB%D0%BE%D0%B1%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%0A%20%20%20%20coins%20%3D%20%5B1%2C%205%2C%2010%2C%2020%2C%2050%2C%20100%5D%0A%20%20%20%20amt%20%3D%20186%0A%20%20%20%20res%20%3D%20coin_change_greedy%28coins%2C%20amt%29%0A%20%20%20%20print%28f%22%5Cncoins%20%3D%20%7Bcoins%7D%2C%20amt%20%3D%20%7Bamt%7D%22%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%20%D1%81%D1%83%D0%BC%D0%BC%D1%8B%20%7Bamt%7D%20%3D%20%7Bres%7D%22%29%0A%0A%20%20%20%20%23%20%D0%96%D0%B0%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%3A%20%D0%BD%D0%B5%20%D0%B3%D0%B0%D1%80%D0%B0%D0%BD%D1%82%D0%B8%D1%80%D1%83%D0%B5%D1%82%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B3%D0%BB%D0%BE%D0%B1%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%0A%20%20%20%20coins%20%3D%20%5B1%2C%2020%2C%2050%5D%0A%20%20%20%20amt%20%3D%2060%0A%20%20%20%20res%20%3D%20coin_change_greedy%28coins%2C%20amt%29%0A%20%20%20%20print%28f%22%5Cncoins%20%3D%20%7Bcoins%7D%2C%20amt%20%3D%20%7Bamt%7D%22%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BC%D0%BE%D0%BD%D0%B5%D1%82%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%20%D1%81%D1%83%D0%BC%D0%BC%D1%8B%20%7Bamt%7D%20%3D%20%7Bres%7D%22%29%0A%20%20%20%20print%28f%22%D0%9D%D0%B0%20%D1%81%D0%B0%D0%BC%D0%BE%D0%BC%20%D0%B4%D0%B5%D0%BB%D0%B5%20%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D1%83%D0%BC%20%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%203%3A%2020%20%2B%2020%20%2B%2020%22%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_greedy/fractional_knapsack.md b/ru/codes/pythontutor/chapter_greedy/fractional_knapsack.md new file mode 100644 index 000000000..5561e7dc3 --- /dev/null +++ b/ru/codes/pythontutor/chapter_greedy/fractional_knapsack.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20Item%3A%0A%20%20%20%20%22%22%22%D0%9F%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20w%3A%20int%2C%20v%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.w%20%3D%20w%20%20%23%20%D0%92%D0%B5%D1%81%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%B0%0A%20%20%20%20%20%20%20%20self.v%20%3D%20v%20%20%23%20%D0%A1%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%B0%0A%0Adef%20fractional_knapsack%28wgt%3A%20list%5Bint%5D%2C%20val%3A%20list%5Bint%5D%2C%20cap%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%94%D1%80%D0%BE%D0%B1%D0%BD%D1%8B%D0%B9%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%3A%20%D0%B6%D0%B0%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%22%22%22%0A%20%20%20%20%23%20%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2%20%D1%81%20%D0%B4%D0%B2%D1%83%D0%BC%D1%8F%20%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0%D0%BC%D0%B8%3A%20%D0%B2%D0%B5%D1%81%20%D0%B8%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%0A%20%20%20%20items%20%3D%20%5BItem%28w%2C%20v%29%20for%20w%2C%20v%20in%20zip%28wgt%2C%20val%29%5D%0A%20%20%20%20%23%20%D0%9E%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BF%D0%BE%20%D1%83%D0%B4%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8%20item.v%20%2F%20item.w%20%D0%B2%20%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B5%20%D1%83%D0%B1%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%0A%20%20%20%20items.sort%28key%3Dlambda%20item%3A%20item.v%20%2F%20item.w%2C%20reverse%3DTrue%29%0A%20%20%20%20%23%20%D0%A6%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D0%B6%D0%B0%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%0A%20%20%20%20res%20%3D%200%0A%20%20%20%20for%20item%20in%20items%3A%0A%20%20%20%20%20%20%20%20if%20item.w%20%3C%3D%20cap%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D1%88%D0%B5%D0%B9%D1%81%D1%8F%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8%20%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BE%D1%87%D0%BD%D0%BE%2C%20%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B8%D1%82%D1%8C%20%D0%B2%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%20%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B9%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%20%D1%86%D0%B5%D0%BB%D0%B8%D0%BA%D0%BE%D0%BC%0A%20%20%20%20%20%20%20%20%20%20%20%20res%20%2B%3D%20item.v%0A%20%20%20%20%20%20%20%20%20%20%20%20cap%20-%3D%20item.w%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D1%88%D0%B5%D0%B9%D1%81%D1%8F%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8%20%D0%BD%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BE%D1%87%D0%BD%D0%BE%2C%20%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B8%D1%82%D1%8C%20%D0%B2%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%20%D1%87%D0%B0%D1%81%D1%82%D1%8C%20%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B5%D0%B3%D0%BE%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%B0%0A%20%20%20%20%20%20%20%20%20%20%20%20res%20%2B%3D%20%28item.v%20%2F%20item.w%29%20%2A%20cap%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%A1%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%BE%D0%B9%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%20%D0%BD%D0%B5%20%D0%BE%D1%81%D1%82%D0%B0%D0%BB%D0%BE%D1%81%D1%8C%2C%20%D0%BF%D0%BE%D1%8D%D1%82%D0%BE%D0%BC%D1%83%20%D0%B2%D1%8B%D0%B9%D1%82%D0%B8%20%D0%B8%D0%B7%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20return%20res%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20wgt%20%3D%20%5B10%2C%2020%2C%2030%2C%2040%2C%2050%5D%0A%20%20%20%20val%20%3D%20%5B50%2C%20120%2C%20150%2C%20210%2C%20240%5D%0A%20%20%20%20cap%20%3D%2050%0A%20%20%20%20n%20%3D%20len%28wgt%29%0A%0A%20%20%20%20%23%20%D0%96%D0%B0%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%0A%20%20%20%20res%20%3D%20fractional_knapsack%28wgt%2C%20val%2C%20cap%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2%20%D0%B1%D0%B5%D0%B7%20%D0%BF%D1%80%D0%B5%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8%20%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B0%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=8&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_greedy/max_capacity.md b/ru/codes/pythontutor/chapter_greedy/max_capacity.md new file mode 100644 index 000000000..6ad9dda0c --- /dev/null +++ b/ru/codes/pythontutor/chapter_greedy/max_capacity.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20max_capacity%28ht%3A%20list%5Bint%5D%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%3A%20%D0%B6%D0%B0%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%22%22%22%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20i%20%D0%B8%20j%20%D1%82%D0%B0%D0%BA%2C%20%D1%87%D1%82%D0%BE%D0%B1%D1%8B%20%D0%BE%D0%BD%D0%B8%20%D1%80%D0%B0%D1%81%D0%BF%D0%BE%D0%BB%D0%B0%D0%B3%D0%B0%D0%BB%D0%B8%D1%81%D1%8C%20%D0%BF%D0%BE%20%D0%B4%D0%B2%D1%83%D0%BC%20%D0%BA%D0%BE%D0%BD%D1%86%D0%B0%D0%BC%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%0A%20%20%20%20i%2C%20j%20%3D%200%2C%20len%28ht%29%20-%201%0A%20%20%20%20%23%20%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%D1%80%D0%B0%D0%B2%D0%BD%D0%B0%200%0A%20%20%20%20res%20%3D%200%0A%20%20%20%20%23%20%D0%92%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D1%8F%D1%82%D1%8C%20%D0%B6%D0%B0%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%20%D0%B2%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B5%2C%20%D0%BF%D0%BE%D0%BA%D0%B0%20%D0%B4%D0%B2%D0%B5%20%D0%B4%D0%BE%D1%81%D0%BA%D0%B8%20%D0%BD%D0%B5%20%D0%B2%D1%81%D1%82%D1%80%D0%B5%D1%82%D1%8F%D1%82%D1%81%D1%8F%0A%20%20%20%20while%20i%20%3C%20j%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%9E%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%83%D1%8E%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%0A%20%20%20%20%20%20%20%20cap%20%3D%20min%28ht%5Bi%5D%2C%20ht%5Bj%5D%29%20%2A%20%28j%20-%20i%29%0A%20%20%20%20%20%20%20%20res%20%3D%20max%28res%2C%20cap%29%0A%20%20%20%20%20%20%20%20%23%20%D0%A1%D0%B4%D0%B2%D0%B8%D0%B3%D0%B0%D1%82%D1%8C%20%D0%B2%D0%BD%D1%83%D1%82%D1%80%D1%8C%20%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5%20%D0%BA%D0%BE%D1%80%D0%BE%D1%82%D0%BA%D1%83%D1%8E%20%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D1%83%0A%20%20%20%20%20%20%20%20if%20ht%5Bi%5D%20%3C%20ht%5Bj%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%2B%3D%201%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20-%3D%201%0A%20%20%20%20return%20res%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20ht%20%3D%20%5B3%2C%208%2C%205%2C%202%2C%207%2C%207%2C%203%2C%204%5D%0A%0A%20%20%20%20%23%20%D0%96%D0%B0%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%0A%20%20%20%20res%20%3D%20max_capacity%28ht%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_greedy/max_product_cutting.md b/ru/codes/pythontutor/chapter_greedy/max_product_cutting.md new file mode 100644 index 000000000..ea3df384c --- /dev/null +++ b/ru/codes/pythontutor/chapter_greedy/max_product_cutting.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=import%20math%0A%0Adef%20max_product_cutting%28n%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%BD%D0%B8%D1%8F%3A%20%D0%B6%D0%B0%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%22%22%22%0A%20%20%20%20%23%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20n%20%3C%3D%203%2C%20%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%20%D0%BD%D1%83%D0%B6%D0%BD%D0%BE%20%D0%B2%D1%8B%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C%20%D0%BE%D0%B4%D0%BD%D1%83%201%0A%20%20%20%20if%20n%20%3C%3D%203%3A%0A%20%20%20%20%20%20%20%20return%201%20%2A%20%28n%20-%201%29%0A%20%20%20%20%23%20%D0%96%D0%B0%D0%B4%D0%BD%D0%BE%20%D0%B2%D1%8B%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C%20%D0%BC%D0%BD%D0%BE%D0%B6%D0%B8%D1%82%D0%B5%D0%BB%D0%B8%203%2C%20%D0%B3%D0%B4%D0%B5%20a%20%E2%80%94%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D1%82%D1%80%D0%BE%D0%B5%D0%BA%2C%20%D0%B0%20b%20%E2%80%94%20%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BE%D0%BA%0A%20%20%20%20a%2C%20b%20%3D%20n%20%2F%2F%203%2C%20n%20%25%203%0A%20%20%20%20if%20b%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BE%D0%BA%20%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%201%2C%20%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BE%D0%B4%D0%BD%D1%83%20%D0%BF%D0%B0%D1%80%D1%83%201%20%2A%203%20%D0%B2%202%20%2A%202%0A%20%20%20%20%20%20%20%20return%20int%28math.pow%283%2C%20a%20-%201%29%29%20%2A%202%20%2A%202%0A%20%20%20%20if%20b%20%3D%3D%202%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BE%D0%BA%20%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%202%2C%20%D0%BD%D0%B8%D1%87%D0%B5%D0%B3%D0%BE%20%D0%BD%D0%B5%20%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C%0A%20%20%20%20%20%20%20%20return%20int%28math.pow%283%2C%20a%29%29%20%2A%202%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BE%D0%BA%20%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%200%2C%20%D0%BD%D0%B8%D1%87%D0%B5%D0%B3%D0%BE%20%D0%BD%D0%B5%20%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C%0A%20%20%20%20return%20int%28math.pow%283%2C%20a%29%29%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20n%20%3D%2058%0A%0A%20%20%20%20%23%20%D0%96%D0%B0%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%0A%20%20%20%20res%20%3D%20max_product_cutting%28n%29%0A%20%20%20%20print%28f%22%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B7%D0%B0%D0%BD%D0%B8%D1%8F%20%3D%20%7Bres%7D%22%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_hashing/array_hash_map.md b/ru/codes/pythontutor/chapter_hashing/array_hash_map.md new file mode 100644 index 000000000..61f0b4e47 --- /dev/null +++ b/ru/codes/pythontutor/chapter_hashing/array_hash_map.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20Pair%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20key%3A%20int%2C%20val%3A%20str%29%3A%0A%20%20%20%20%20%20%20%20self.key%20%3D%20key%0A%20%20%20%20%20%20%20%20self.val%20%3D%20val%0A%0Aclass%20ArrayHashMap%3A%0A%0A%20%20%20%20def%20__init__%28self%29%3A%0A%20%20%20%20%20%20%20%20self.buckets%3A%20list%5BPair%20%7C%20None%5D%20%3D%20%5BNone%5D%20%2A%2020%0A%0A%20%20%20%20def%20hash_func%28self%2C%20key%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20index%20%3D%20key%20%25%2020%0A%20%20%20%20%20%20%20%20return%20index%0A%0A%20%20%20%20def%20get%28self%2C%20key%3A%20int%29%20-%3E%20str%3A%0A%20%20%20%20%20%20%20%20index%3A%20int%20%3D%20self.hash_func%28key%29%0A%20%20%20%20%20%20%20%20pair%3A%20Pair%20%3D%20self.buckets%5Bindex%5D%0A%20%20%20%20%20%20%20%20if%20pair%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%20%20%20%20return%20pair.val%0A%0A%20%20%20%20def%20put%28self%2C%20key%3A%20int%2C%20val%3A%20str%29%3A%0A%20%20%20%20%20%20%20%20pair%20%3D%20Pair%28key%2C%20val%29%0A%20%20%20%20%20%20%20%20index%3A%20int%20%3D%20self.hash_func%28key%29%0A%20%20%20%20%20%20%20%20self.buckets%5Bindex%5D%20%3D%20pair%0A%0A%20%20%20%20def%20remove%28self%2C%20key%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20index%3A%20int%20%3D%20self.hash_func%28key%29%0A%20%20%20%20%20%20%20%20self.buckets%5Bindex%5D%20%3D%20None%0A%0A%20%20%20%20def%20entry_set%28self%29%20-%3E%20list%5BPair%5D%3A%0A%20%20%20%20%20%20%20%20result%3A%20list%5BPair%5D%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20pair%20in%20self.buckets%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20pair%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result.append%28pair%29%0A%20%20%20%20%20%20%20%20return%20result%0A%0A%20%20%20%20def%20key_set%28self%29%20-%3E%20list%5Bint%5D%3A%0A%20%20%20%20%20%20%20%20result%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20pair%20in%20self.buckets%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20pair%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result.append%28pair.key%29%0A%20%20%20%20%20%20%20%20return%20result%0A%0A%20%20%20%20def%20value_set%28self%29%20-%3E%20list%5Bstr%5D%3A%0A%20%20%20%20%20%20%20%20result%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20pair%20in%20self.buckets%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20pair%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result.append%28pair.val%29%0A%20%20%20%20%20%20%20%20return%20result%0A%0A%20%20%20%20def%20print%28self%29%3A%0A%20%20%20%20%20%20%20%20for%20pair%20in%20self.buckets%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20pair%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print%28pair.key%2C%20%27-%3E%27%2C%20pair.val%29%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20hmap%20%3D%20ArrayHashMap%28%29%0A%20%20%20%20hmap.put%2812836%2C%20%27%D0%A1%D1%8F%D0%BE%20%D0%A5%D0%B0%27%29%0A%20%20%20%20hmap.put%2815937%2C%20%27%D0%A1%D1%8F%D0%BE%20%D0%9B%D0%BE%27%29%0A%20%20%20%20hmap.put%2816750%2C%20%27%D0%A1%D1%8F%D0%BE%20%D0%A1%D1%83%D0%B0%D0%BD%D1%8C%27%29%0A%20%20%20%20hmap.put%2813276%2C%20%27%D0%A1%D1%8F%D0%BE%20%D0%A4%D0%B0%27%29%0A%20%20%20%20hmap.put%2810583%2C%20%27%D0%A1%D1%8F%D0%BE%20%D0%AF%27%29%0A%20%20%20%20name%20%3D%20hmap.get%2815937%29%0A%20%20%20%20hmap.remove%2810583%29%0A%20%20%20%20print%28%27%5Cn%D0%9E%D1%82%D0%B4%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%20%D0%BF%D0%B0%D1%80%20%D0%BA%D0%BB%D1%8E%D1%87-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%27%29%0A%20%20%20%20for%20pair%20in%20hmap.entry_set%28%29%3A%0A%20%20%20%20%20%20%20%20print%28pair.key%2C%20%27-%3E%27%2C%20pair.val%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_hashing/hash_map_chaining.md b/ru/codes/pythontutor/chapter_hashing/hash_map_chaining.md new file mode 100644 index 000000000..8f384391e --- /dev/null +++ b/ru/codes/pythontutor/chapter_hashing/hash_map_chaining.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20Pair%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20key%3A%20int%2C%20val%3A%20str%29%3A%0A%20%20%20%20%20%20%20%20self.key%20%3D%20key%0A%20%20%20%20%20%20%20%20self.val%20%3D%20val%0A%0Aclass%20HashMapChaining%3A%0A%0A%20%20%20%20def%20__init__%28self%29%3A%0A%20%20%20%20%20%20%20%20self.size%20%3D%200%0A%20%20%20%20%20%20%20%20self.capacity%20%3D%204%0A%20%20%20%20%20%20%20%20self.load_thres%20%3D%202.0%20%2F%203.0%0A%20%20%20%20%20%20%20%20self.extend_ratio%20%3D%202%0A%20%20%20%20%20%20%20%20self.buckets%20%3D%20%5B%5B%5D%20for%20_%20in%20range%28self.capacity%29%5D%0A%0A%20%20%20%20def%20hash_func%28self%2C%20key%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%20key%20%25%20self.capacity%0A%0A%20%20%20%20def%20load_factor%28self%29%20-%3E%20float%3A%0A%20%20%20%20%20%20%20%20return%20self.size%20%2F%20self.capacity%0A%0A%20%20%20%20def%20get%28self%2C%20key%3A%20int%29%20-%3E%20str%20%7C%20None%3A%0A%20%20%20%20%20%20%20%20index%20%3D%20self.hash_func%28key%29%0A%20%20%20%20%20%20%20%20bucket%20%3D%20self.buckets%5Bindex%5D%0A%20%20%20%20%20%20%20%20for%20pair%20in%20bucket%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20pair.key%20%3D%3D%20key%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20pair.val%0A%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20def%20put%28self%2C%20key%3A%20int%2C%20val%3A%20str%29%3A%0A%20%20%20%20%20%20%20%20if%20self.load_factor%28%29%20%3E%20self.load_thres%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.extend%28%29%0A%20%20%20%20%20%20%20%20index%20%3D%20self.hash_func%28key%29%0A%20%20%20%20%20%20%20%20bucket%20%3D%20self.buckets%5Bindex%5D%0A%20%20%20%20%20%20%20%20for%20pair%20in%20bucket%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20pair.key%20%3D%3D%20key%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pair.val%20%3D%20val%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20pair%20%3D%20Pair%28key%2C%20val%29%0A%20%20%20%20%20%20%20%20bucket.append%28pair%29%0A%20%20%20%20%20%20%20%20self.size%20%2B%3D%201%0A%0A%20%20%20%20def%20remove%28self%2C%20key%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20index%20%3D%20self.hash_func%28key%29%0A%20%20%20%20%20%20%20%20bucket%20%3D%20self.buckets%5Bindex%5D%0A%20%20%20%20%20%20%20%20for%20pair%20in%20bucket%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20pair.key%20%3D%3D%20key%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bucket.remove%28pair%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.size%20-%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%0A%20%20%20%20def%20extend%28self%29%3A%0A%20%20%20%20%20%20%20%20buckets%20%3D%20self.buckets%0A%20%20%20%20%20%20%20%20self.capacity%20%2A%3D%20self.extend_ratio%0A%20%20%20%20%20%20%20%20self.buckets%20%3D%20%5B%5B%5D%20for%20_%20in%20range%28self.capacity%29%5D%0A%20%20%20%20%20%20%20%20self.size%20%3D%200%0A%20%20%20%20%20%20%20%20for%20bucket%20in%20buckets%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20pair%20in%20bucket%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.put%28pair.key%2C%20pair.val%29%0A%0A%20%20%20%20def%20print%28self%29%3A%0A%20%20%20%20%20%20%20%20for%20bucket%20in%20self.buckets%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20res%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20pair%20in%20bucket%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20res.append%28str%28pair.key%29%20%2B%20%27%20-%3E%20%27%20%2B%20pair.val%29%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28res%29%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20hashmap%20%3D%20HashMapChaining%28%29%0A%20%20%20%20hashmap.put%2812836%2C%20%27%D0%A1%D1%8F%D0%BE%20%D0%A5%D0%B0%27%29%0A%20%20%20%20hashmap.put%2815937%2C%20%27%D0%A1%D1%8F%D0%BE%20%D0%9B%D0%BE%27%29%0A%20%20%20%20hashmap.put%2816750%2C%20%27%D0%A1%D1%8F%D0%BE%20%D0%A1%D1%83%D0%B0%D0%BD%D1%8C%27%29%0A%20%20%20%20hashmap.put%2813276%2C%20%27%D0%A1%D1%8F%D0%BE%20%D0%A4%D0%B0%27%29%0A%20%20%20%20hashmap.put%2810583%2C%20%27%D0%A1%D1%8F%D0%BE%20%D0%AF%27%29%0A%20%20%20%20name%20%3D%20hashmap.get%2813276%29%0A%20%20%20%20hashmap.remove%2812836%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_hashing/simple_hash.md b/ru/codes/pythontutor/chapter_hashing/simple_hash.md new file mode 100644 index 000000000..26c584154 --- /dev/null +++ b/ru/codes/pythontutor/chapter_hashing/simple_hash.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20add_hash%28key%3A%20str%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%90%D0%B4%D0%B4%D0%B8%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5%20%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%22%22%22%0A%20%20%20%20hash%20%3D%200%0A%20%20%20%20modulus%20%3D%201000000007%0A%20%20%20%20for%20c%20in%20key%3A%0A%20%20%20%20%20%20%20%20hash%20%2B%3D%20ord%28c%29%0A%20%20%20%20return%20hash%20%25%20modulus%0A%0A%0Adef%20mul_hash%28key%3A%20str%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%9C%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D0%BF%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5%20%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%22%22%22%0A%20%20%20%20hash%20%3D%200%0A%20%20%20%20modulus%20%3D%201000000007%0A%20%20%20%20for%20c%20in%20key%3A%0A%20%20%20%20%20%20%20%20hash%20%3D%2031%20%2A%20hash%20%2B%20ord%28c%29%0A%20%20%20%20return%20hash%20%25%20modulus%0A%0A%0Adef%20xor_hash%28key%3A%20str%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22XOR-%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%22%22%22%0A%20%20%20%20hash%20%3D%200%0A%20%20%20%20modulus%20%3D%201000000007%0A%20%20%20%20for%20c%20in%20key%3A%0A%20%20%20%20%20%20%20%20hash%20%5E%3D%20ord%28c%29%0A%20%20%20%20return%20hash%20%25%20modulus%0A%0A%0Adef%20rot_hash%28key%3A%20str%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A5%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%BC%20%D1%81%D0%B4%D0%B2%D0%B8%D0%B3%D0%BE%D0%BC%22%22%22%0A%20%20%20%20hash%20%3D%200%0A%20%20%20%20modulus%20%3D%201000000007%0A%20%20%20%20for%20c%20in%20key%3A%0A%20%20%20%20%20%20%20%20hash%20%3D%20%28hash%20%3C%3C%204%29%20%5E%20%28hash%20%3E%3E%2028%29%20%5E%20ord%28c%29%0A%20%20%20%20return%20hash%20%25%20modulus%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20key%20%3D%20%22Hello%20Algo%22%0A%0A%20%20%20%20hash%20%3D%20add_hash%28key%29%0A%20%20%20%20print%28f%22%D0%A5%D0%B5%D1%88-%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D1%81%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC%20%3D%20%7Bhash%7D%22%29%0A%0A%20%20%20%20hash%20%3D%20mul_hash%28key%29%0A%20%20%20%20print%28f%22%D0%A5%D0%B5%D1%88-%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D1%83%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC%20%3D%20%7Bhash%7D%22%29%0A%0A%20%20%20%20hash%20%3D%20xor_hash%28key%29%0A%20%20%20%20print%28f%22%D0%A5%D0%B5%D1%88-%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20XOR%20%3D%20%7Bhash%7D%22%29%0A%0A%20%20%20%20hash%20%3D%20rot_hash%28key%29%0A%20%20%20%20print%28f%22%D0%A5%D0%B5%D1%88-%D1%81%D1%83%D0%BC%D0%BC%D0%B0%20%D1%81%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%BC%20%D1%81%D0%B4%D0%B2%D0%B8%D0%B3%D0%BE%D0%BC%20%3D%20%7Bhash%7D%22%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_heap/my_heap.md b/ru/codes/pythontutor/chapter_heap/my_heap.md new file mode 100644 index 000000000..3140e7736 --- /dev/null +++ b/ru/codes/pythontutor/chapter_heap/my_heap.md @@ -0,0 +1,20 @@ + + + +https://pythontutor.com/render.html#code=class%20MaxHeap%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20nums%3A%20list%5Bint%5D%29%3A%0A%20%20%20%20%20%20%20%20self.max_heap%20%3D%20nums%0A%20%20%20%20%20%20%20%20for%20i%20in%20range%28self.parent%28self.size%28%29%20-%201%29%2C%20-1%2C%20-1%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.sift_down%28i%29%0A%0A%20%20%20%20def%20left%28self%2C%20i%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%202%20%2A%20i%20%2B%201%0A%0A%20%20%20%20def%20right%28self%2C%20i%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%202%20%2A%20i%20%2B%202%0A%0A%20%20%20%20def%20parent%28self%2C%20i%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%20%28i%20-%201%29%20%2F%2F%202%0A%0A%20%20%20%20def%20swap%28self%2C%20i%3A%20int%2C%20j%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20%28self.max_heap%5Bi%5D%2C%20self.max_heap%5Bj%5D%29%20%3D%20%28self.max_heap%5Bj%5D%2C%20self.max_heap%5Bi%5D%29%0A%0A%20%20%20%20def%20size%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%20len%28self.max_heap%29%0A%0A%20%20%20%20def%20sift_down%28self%2C%20i%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20while%20True%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%28l%2C%20r%2C%20ma%29%20%3D%20%28self.left%28i%29%2C%20self.right%28i%29%2C%20i%29%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20l%20%3C%20self.size%28%29%20and%20self.max_heap%5Bl%5D%20%3E%20self.max_heap%5Bma%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ma%20%3D%20l%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20r%20%3C%20self.size%28%29%20and%20self.max_heap%5Br%5D%20%3E%20self.max_heap%5Bma%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ma%20%3D%20r%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20ma%20%3D%3D%20i%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20%20%20%20%20self.swap%28i%2C%20ma%29%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%3D%20ma%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20max_heap%20%3D%20MaxHeap%28%5B1%2C%202%2C%203%2C%204%2C%205%5D%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + + + + +https://pythontutor.com/render.html#code=class%20MaxHeap%3A%0A%20%20%20%20%22%22%22%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D0%BA%D1%83%D1%87%D0%B0%22%22%22%0A%0A%20%20%20%20def%20__init__%28self%2C%20nums%3A%20list%5Bint%5D%29%3A%0A%20%20%20%20%20%20%20%20%22%22%22%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80%22%22%22%0A%20%20%20%20%20%20%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%20%D0%B2%20%D0%BA%D1%83%D1%87%D1%83%20%D0%B1%D0%B5%D0%B7%20%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9%0A%20%20%20%20%20%20%20%20self.max_heap%20%3D%20nums%0A%0A%20%20%20%20def%20left%28self%2C%20i%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20%22%22%22%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B5%D0%B3%D0%BE%20%D1%83%D0%B7%D0%BB%D0%B0%22%22%22%0A%20%20%20%20%20%20%20%20return%202%20%2A%20i%20%2B%201%0A%0A%20%20%20%20def%20right%28self%2C%20i%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20%22%22%22%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B5%D0%B3%D0%BE%20%D1%83%D0%B7%D0%BB%D0%B0%22%22%22%0A%20%20%20%20%20%20%20%20return%202%20%2A%20i%20%2B%202%0A%0A%20%20%20%20def%20parent%28self%2C%20i%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20%22%22%22%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%80%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%BE%D0%B3%D0%BE%20%D1%83%D0%B7%D0%BB%D0%B0%22%22%22%0A%20%20%20%20%20%20%20%20return%20%28i%20-%201%29%20%2F%2F%202%20%20%23%20%D0%9E%D0%BA%D1%80%D1%83%D0%B3%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B2%D0%BD%D0%B8%D0%B7%20%D0%BF%D1%80%D0%B8%20%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B8%0A%0A%20%20%20%20def%20size%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20%22%22%22%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0%20%D0%BA%D1%83%D1%87%D0%B8%22%22%22%0A%20%20%20%20%20%20%20%20return%20len%28self.max_heap%29%0A%0A%20%20%20%20def%20is_empty%28self%29%20-%3E%20bool%3A%0A%20%20%20%20%20%20%20%20%22%22%22%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0%2C%20%D0%BF%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%BA%D1%83%D1%87%D0%B0%22%22%22%0A%20%20%20%20%20%20%20%20return%20self.size%28%29%20%3D%3D%200%0A%0A%20%20%20%20def%20peek%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20%22%22%22%D0%94%D0%BE%D1%81%D1%82%D1%83%D0%BF%20%D0%BA%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%83%20%D0%BD%D0%B0%20%D0%B2%D0%B5%D1%80%D1%88%D0%B8%D0%BD%D0%B5%20%D0%BA%D1%83%D1%87%D0%B8%22%22%22%0A%20%20%20%20%20%20%20%20return%20self.max_heap%5B0%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9%20%D0%BA%D1%83%D1%87%D0%B8%0A%20%20%20%20%23%20%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D0%B5%20%D0%B2%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B5%3A%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D0%BE%D0%B9%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20%D1%83%D0%B6%D0%B5%20%D1%8F%D0%B2%D0%BB%D1%8F%D0%B5%D1%82%D1%81%D1%8F%20%D0%BA%D0%BE%D1%80%D1%80%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%D0%B9%20%D0%BA%D1%83%D1%87%D0%B5%D0%B9%0A%20%20%20%20max_heap%20%3D%20MaxHeap%28%5B9%2C%208%2C%206%2C%206%2C%207%2C%205%2C%202%2C%201%2C%204%2C%203%2C%206%2C%202%5D%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20%D1%81%20%D0%B2%D0%B5%D1%80%D1%88%D0%B8%D0%BD%D1%8B%20%D0%BA%D1%83%D1%87%D0%B8%0A%20%20%20%20peek%20%3D%20max_heap.peek%28%29%0A%20%20%20%20print%28f%22%5Cn%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BD%D0%B0%20%D0%B2%D0%B5%D1%80%D1%88%D0%B8%D0%BD%D0%B5%20%D0%BA%D1%83%D1%87%D0%B8%20%3D%20%7Bpeek%7D%22%29&cumulative=false&curInstr=7&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=class%20MaxHeap%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20nums%3A%20list%5Bint%5D%29%3A%0A%20%20%20%20%20%20%20%20self.max_heap%20%3D%20nums%0A%0A%20%20%20%20def%20left%28self%2C%20i%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%202%20%2A%20i%20%2B%201%0A%0A%20%20%20%20def%20right%28self%2C%20i%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%202%20%2A%20i%20%2B%202%0A%0A%20%20%20%20def%20parent%28self%2C%20i%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%20%28i%20-%201%29%20%2F%2F%202%0A%0A%20%20%20%20def%20swap%28self%2C%20i%3A%20int%2C%20j%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20%28self.max_heap%5Bi%5D%2C%20self.max_heap%5Bj%5D%29%20%3D%20%28self.max_heap%5Bj%5D%2C%20self.max_heap%5Bi%5D%29%0A%0A%20%20%20%20def%20size%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%20len%28self.max_heap%29%0A%0A%20%20%20%20def%20is_empty%28self%29%20-%3E%20bool%3A%0A%20%20%20%20%20%20%20%20return%20self.size%28%29%20%3D%3D%200%0A%0A%20%20%20%20def%20push%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.max_heap.append%28val%29%0A%20%20%20%20%20%20%20%20self.sift_up%28self.size%28%29%20-%201%29%0A%0A%20%20%20%20def%20sift_up%28self%2C%20i%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20while%20True%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20p%20%3D%20self.parent%28i%29%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20p%20%3C%200%20or%20self.max_heap%5Bi%5D%20%3C%3D%20self.max_heap%5Bp%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20%20%20%20%20self.swap%28i%2C%20p%29%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%3D%20p%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20max_heap%20%3D%20MaxHeap%28%5B9%2C%208%2C%206%2C%206%2C%207%2C%205%2C%202%2C%201%2C%204%2C%203%2C%206%2C%202%5D%29%0A%20%20%20%20val%20%3D%207%0A%20%20%20%20max_heap.push%28val%29&cumulative=false&curInstr=8&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=class%20MaxHeap%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20nums%3A%20list%5Bint%5D%29%3A%0A%20%20%20%20%20%20%20%20self.max_heap%20%3D%20nums%0A%0A%20%20%20%20def%20left%28self%2C%20i%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%202%20%2A%20i%20%2B%201%0A%0A%20%20%20%20def%20right%28self%2C%20i%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%202%20%2A%20i%20%2B%202%0A%0A%20%20%20%20def%20parent%28self%2C%20i%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%20%28i%20-%201%29%20%2F%2F%202%0A%0A%20%20%20%20def%20swap%28self%2C%20i%3A%20int%2C%20j%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20%28self.max_heap%5Bi%5D%2C%20self.max_heap%5Bj%5D%29%20%3D%20%28self.max_heap%5Bj%5D%2C%20self.max_heap%5Bi%5D%29%0A%0A%20%20%20%20def%20size%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%20len%28self.max_heap%29%0A%0A%20%20%20%20def%20is_empty%28self%29%20-%3E%20bool%3A%0A%20%20%20%20%20%20%20%20return%20self.size%28%29%20%3D%3D%200%0A%0A%20%20%20%20def%20pop%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20if%20self.is_empty%28%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20IndexError%28%27%D0%BA%D1%83%D1%87%D0%B0%20%D0%BF%D1%83%D1%81%D1%82%D0%B0%27%29%0A%20%20%20%20%20%20%20%20self.swap%280%2C%20self.size%28%29%20-%201%29%0A%20%20%20%20%20%20%20%20val%20%3D%20self.max_heap.pop%28%29%0A%20%20%20%20%20%20%20%20self.sift_down%280%29%0A%20%20%20%20%20%20%20%20return%20val%0A%0A%20%20%20%20def%20sift_down%28self%2C%20i%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20while%20True%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%28l%2C%20r%2C%20ma%29%20%3D%20%28self.left%28i%29%2C%20self.right%28i%29%2C%20i%29%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20l%20%3C%20self.size%28%29%20and%20self.max_heap%5Bl%5D%20%3E%20self.max_heap%5Bma%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ma%20%3D%20l%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20r%20%3C%20self.size%28%29%20and%20self.max_heap%5Br%5D%20%3E%20self.max_heap%5Bma%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ma%20%3D%20r%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20ma%20%3D%3D%20i%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20%20%20%20%20self.swap%28i%2C%20ma%29%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%3D%20ma%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20max_heap%20%3D%20MaxHeap%28%5B9%2C%208%2C%207%2C%206%2C%207%2C%206%2C%202%2C%201%2C%204%2C%203%2C%206%2C%202%2C%205%5D%29%0A%20%20%20%20peek%20%3D%20max_heap.pop%28%29&cumulative=false&curInstr=8&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_heap/top_k.md b/ru/codes/pythontutor/chapter_heap/top_k.md new file mode 100644 index 000000000..7b49b6b0f --- /dev/null +++ b/ru/codes/pythontutor/chapter_heap/top_k.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=import%20heapq%0A%0Adef%20top_k_heap%28nums%3A%20list%5Bint%5D%2C%20k%3A%20int%29%20-%3E%20list%5Bint%5D%3A%0A%20%20%20%20%22%22%22%D0%9D%D0%B0%D0%B9%D1%82%D0%B8%20k%20%D0%BD%D0%B0%D0%B8%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B8%D1%85%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20%D0%BA%D1%83%D1%87%D0%B8%22%22%22%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9%20%D0%BA%D1%83%D1%87%D0%B8%0A%20%20%20%20heap%20%3D%20%5B%5D%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B5%20k%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%20%D0%B2%20%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20for%20i%20in%20range%28k%29%3A%0A%20%20%20%20%20%20%20%20heapq.heappush%28heap%2C%20nums%5Bi%5D%29%0A%20%20%20%20%23%20%D0%9D%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8F%20%D1%81%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20k%2B1%2C%20%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%83%20%D0%BA%D1%83%D1%87%D0%B8%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%D0%B9%20k%0A%20%20%20%20for%20i%20in%20range%28k%2C%20len%28nums%29%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20%D0%BD%D0%B0%20%D0%B2%D0%B5%D1%80%D1%88%D0%B8%D0%BD%D0%B5%20%D0%BA%D1%83%D1%87%D0%B8%2C%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D0%B2%D0%B5%D1%80%D1%88%D0%B8%D0%BD%D1%83%20%D0%BA%D1%83%D1%87%D0%B8%20%D0%B8%20%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20%20%20%20%20if%20nums%5Bi%5D%20%3E%20heap%5B0%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20heapq.heappop%28heap%29%0A%20%20%20%20%20%20%20%20%20%20%20%20heapq.heappush%28heap%2C%20nums%5Bi%5D%29%0A%20%20%20%20return%20heap%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20nums%20%3D%20%5B1%2C%207%2C%206%2C%203%2C%202%5D%0A%20%20%20%20k%20%3D%203%0A%0A%20%20%20%20res%20%3D%20top_k_heap%28nums%2C%20k%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_searching/binary_search.md b/ru/codes/pythontutor/chapter_searching/binary_search.md new file mode 100644 index 000000000..bf47eae34 --- /dev/null +++ b/ru/codes/pythontutor/chapter_searching/binary_search.md @@ -0,0 +1,11 @@ + + + +https://pythontutor.com/render.html#code=def%20binary_search%28nums%3A%20list%5Bint%5D%2C%20target%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%28%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B5%20%D0%B7%D0%B0%D0%BC%D0%BA%D0%BD%D1%83%D1%82%D1%8B%D0%B9%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%29%22%22%22%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B5%20%D0%B7%D0%B0%D0%BC%D0%BA%D0%BD%D1%83%D1%82%D1%8B%D0%B9%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%20%5B0%2C%20n-1%5D%2C%20%D1%82%D0%BE%20%D0%B5%D1%81%D1%82%D1%8C%20i%20%D0%B8%20j%20%D1%83%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D1%8E%D1%82%20%D0%BD%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D0%B8%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%0A%20%20%20%20i%2C%20j%20%3D%200%2C%20len%28nums%29%20-%201%0A%20%20%20%20%23%20%D0%A6%D0%B8%D0%BA%D0%BB%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B0%D0%B5%D1%82%D1%81%D1%8F%2C%20%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0%20%D0%BF%D1%83%D1%81%D1%82%20%28%D0%BF%D1%80%D0%B8%20i%20%3E%20j%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%20%D0%BF%D1%83%D1%81%D1%82%29%0A%20%20%20%20while%20i%20%3C%3D%20j%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%20%D1%87%D0%B8%D1%81%D0%BB%D0%B0%20%D0%B2%20Python%20%D0%BC%D0%BE%D0%B3%D1%83%D1%82%20%D0%B1%D1%8B%D1%82%D1%8C%20%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%20%D1%83%D0%B3%D0%BE%D0%B4%D0%BD%D0%BE%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B8%D0%BC%D0%B8%20%28%D0%BE%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D1%8B%20%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BC%D0%BE%D0%BC%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%29%2C%20%D0%BF%D0%BE%D1%8D%D1%82%D0%BE%D0%BC%D1%83%20%D0%BD%D0%B5%20%D0%BD%D1%83%D0%B6%D0%BD%D0%BE%20%D1%83%D1%87%D0%B8%D1%82%D1%8B%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B8%D1%85%20%D1%87%D0%B8%D1%81%D0%B5%D0%BB%0A%20%20%20%20%20%20%20%20m%20%3D%20%28i%20%2B%20j%29%20%2F%2F%202%20%20%23%20%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%81%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%BD%D1%8B%20m%0A%20%20%20%20%20%20%20%20if%20nums%5Bm%5D%20%3C%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%3D%20m%20%2B%201%20%20%23%20%D0%AD%D1%82%D0%BE%20%D0%BE%D0%B7%D0%BD%D0%B0%D1%87%D0%B0%D0%B5%D1%82%2C%20%D1%87%D1%82%D0%BE%20target%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5%20%5Bm%2B1%2C%20j%5D%0A%20%20%20%20%20%20%20%20elif%20nums%5Bm%5D%20%3E%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20%3D%20m%20-%201%20%20%23%20%D0%AD%D1%82%D0%BE%20%D0%BE%D0%B7%D0%BD%D0%B0%D1%87%D0%B0%D0%B5%D1%82%2C%20%D1%87%D1%82%D0%BE%20target%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5%20%5Bi%2C%20m-1%5D%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20m%20%20%23%20%D0%A6%D0%B5%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BD%D0%B0%D0%B9%D0%B4%D0%B5%D0%BD%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%B5%D0%B3%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%0A%20%20%20%20return%20-1%20%20%23%20%D0%A6%D0%B5%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BD%D0%B5%20%D0%BD%D0%B0%D0%B9%D0%B4%D0%B5%D0%BD%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20-1%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20target%20%3D%206%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%206%2C%208%2C%2012%2C%2015%2C%2023%2C%2026%2C%2031%2C%2035%5D%0A%0A%20%20%20%20%23%20%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%28%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B5%20%D0%B7%D0%B0%D0%BC%D0%BA%D0%BD%D1%83%D1%82%D1%8B%D0%B9%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%29%0A%20%20%20%20index%20%3D%20binary_search%28nums%2C%20target%29%0A%20%20%20%20print%28%22%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%86%D0%B5%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%206%20%3D%20%22%2C%20index%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20binary_search_lcro%28nums%3A%20list%5Bint%5D%2C%20target%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%28%D0%BB%D0%B5%D0%B2%D0%BE%20%D0%B7%D0%B0%D0%BC%D0%BA%D0%BD%D1%83%D1%82%D1%8B%D0%B9%2C%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%20%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D1%8B%D0%B9%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%29%22%22%22%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BB%D0%B5%D0%B2%D0%BE%20%D0%B7%D0%B0%D0%BC%D0%BA%D0%BD%D1%83%D1%82%D1%8B%D0%B9%2C%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%20%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D1%8B%D0%B9%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%20%5B0%2C%20n%29%2C%20%D1%82%D0%BE%20%D0%B5%D1%81%D1%82%D1%8C%20i%20%D0%B8%20j%20%D1%83%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D1%8E%D1%82%20%D0%BD%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%20%D0%B8%20%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8E%20%D1%81%D1%80%D0%B0%D0%B7%D1%83%20%D0%B7%D0%B0%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%BC%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%BC%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%0A%20%20%20%20i%2C%20j%20%3D%200%2C%20len%28nums%29%0A%20%20%20%20%23%20%D0%A6%D0%B8%D0%BA%D0%BB%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B0%D0%B5%D1%82%D1%81%D1%8F%2C%20%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0%20%D0%BF%D1%83%D1%81%D1%82%20%28%D0%BF%D1%80%D0%B8%20i%20%3D%20j%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%20%D0%BF%D1%83%D1%81%D1%82%29%0A%20%20%20%20while%20i%20%3C%20j%3A%0A%20%20%20%20%20%20%20%20m%20%3D%20%28i%20%2B%20j%29%20%2F%2F%202%20%20%23%20%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%81%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%BD%D1%8B%20m%0A%20%20%20%20%20%20%20%20if%20nums%5Bm%5D%20%3C%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%3D%20m%20%2B%201%20%20%23%20%D0%AD%D1%82%D0%BE%20%D0%BE%D0%B7%D0%BD%D0%B0%D1%87%D0%B0%D0%B5%D1%82%2C%20%D1%87%D1%82%D0%BE%20target%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5%20%5Bm%2B1%2C%20j%29%0A%20%20%20%20%20%20%20%20elif%20nums%5Bm%5D%20%3E%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20%3D%20m%20%20%23%20%D0%AD%D1%82%D0%BE%20%D0%BE%D0%B7%D0%BD%D0%B0%D1%87%D0%B0%D0%B5%D1%82%2C%20%D1%87%D1%82%D0%BE%20target%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5%20%5Bi%2C%20m%29%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20m%20%20%23%20%D0%A6%D0%B5%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BD%D0%B0%D0%B9%D0%B4%D0%B5%D0%BD%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%B5%D0%B3%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%0A%20%20%20%20return%20-1%20%20%23%20%D0%A6%D0%B5%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BD%D0%B5%20%D0%BD%D0%B0%D0%B9%D0%B4%D0%B5%D0%BD%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20-1%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20target%20%3D%206%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%206%2C%208%2C%2012%2C%2015%2C%2023%2C%2026%2C%2031%2C%2035%5D%0A%0A%20%20%20%20%23%20%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%28%D0%BB%D0%B5%D0%B2%D0%BE%20%D0%B7%D0%B0%D0%BC%D0%BA%D0%BD%D1%83%D1%82%D1%8B%D0%B9%2C%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%20%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D1%8B%D0%B9%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%29%0A%20%20%20%20index%20%3D%20binary_search_lcro%28nums%2C%20target%29%0A%20%20%20%20print%28%22%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%86%D0%B5%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%206%20%3D%20%22%2C%20index%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_searching/binary_search_edge.md b/ru/codes/pythontutor/chapter_searching/binary_search_edge.md new file mode 100644 index 000000000..bf0145ace --- /dev/null +++ b/ru/codes/pythontutor/chapter_searching/binary_search_edge.md @@ -0,0 +1,11 @@ + + + +https://pythontutor.com/render.html#code=def%20binary_search_insertion%28nums%3A%20list%5Bint%5D%2C%20target%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%D1%82%D0%BE%D1%87%D0%BA%D0%B8%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%20%28%D1%81%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%8E%D1%89%D0%B8%D0%BC%D0%B8%D1%81%D1%8F%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D0%BC%D0%B8%29%22%22%22%0A%20%20%20%20i%2C%20j%20%3D%200%2C%20len%28nums%29%20-%201%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B5%20%D0%B7%D0%B0%D0%BC%D0%BA%D0%BD%D1%83%D1%82%D1%8B%D0%B9%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%20%5B0%2C%20n-1%5D%0A%20%20%20%20while%20i%20%3C%3D%20j%3A%0A%20%20%20%20%20%20%20%20m%20%3D%20%28i%20%2B%20j%29%20%2F%2F%202%20%20%23%20%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%81%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%BD%D1%8B%20m%0A%20%20%20%20%20%20%20%20if%20nums%5Bm%5D%20%3C%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%3D%20m%20%2B%201%20%20%23%20target%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5%20%5Bm%2B1%2C%20j%5D%0A%20%20%20%20%20%20%20%20elif%20nums%5Bm%5D%20%3E%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20%3D%20m%20-%201%20%20%23%20target%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5%20%5Bi%2C%20m-1%5D%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20%3D%20m%20-%201%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%20target%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5%20%5Bi%2C%20m-1%5D%0A%20%20%20%20%23%20%D0%92%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%82%D0%BE%D1%87%D0%BA%D1%83%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%20i%0A%20%20%20%20return%20i%0A%0Adef%20binary_search_left_edge%28nums%3A%20list%5Bint%5D%2C%20target%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%D1%81%D0%B0%D0%BC%D0%BE%D0%B3%D0%BE%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20target%22%22%22%0A%20%20%20%20%23%20%D0%AD%D0%BA%D0%B2%D0%B8%D0%B2%D0%B0%D0%BB%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D1%83%20%D1%82%D0%BE%D1%87%D0%BA%D0%B8%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%20target%0A%20%20%20%20i%20%3D%20binary_search_insertion%28nums%2C%20target%29%0A%20%20%20%20%23%20target%20%D0%BD%D0%B5%20%D0%BD%D0%B0%D0%B9%D0%B4%D0%B5%D0%BD%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20-1%0A%20%20%20%20if%20i%20%3D%3D%20len%28nums%29%20or%20nums%5Bi%5D%20%21%3D%20target%3A%0A%20%20%20%20%20%20%20%20return%20-1%0A%20%20%20%20%23%20%D0%9D%D0%B0%D0%B9%D1%82%D0%B8%20target%20%D0%B8%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20i%0A%20%20%20%20return%20i%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%9C%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20%D1%81%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%8E%D1%89%D0%B8%D0%BC%D0%B8%D1%81%D1%8F%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D0%BC%D0%B8%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%206%2C%206%2C%206%2C%206%2C%206%2C%2010%2C%2012%2C%2015%5D%0A%20%20%20%20%23%20%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9%20%D0%B8%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B9%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B%0A%20%20%20%20target%20%3D%206%0A%20%20%20%20index%20%3D%20binary_search_left_edge%28nums%2C%20target%29%0A%20%20%20%20print%28f%22%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%81%D0%B0%D0%BC%D0%BE%D0%B3%D0%BE%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20%7Btarget%7D%20%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%20%7Bindex%7D%22%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20binary_search_insertion%28nums%3A%20list%5Bint%5D%2C%20target%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%D1%82%D0%BE%D1%87%D0%BA%D0%B8%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%20%28%D1%81%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%8E%D1%89%D0%B8%D0%BC%D0%B8%D1%81%D1%8F%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D0%BC%D0%B8%29%22%22%22%0A%20%20%20%20i%2C%20j%20%3D%200%2C%20len%28nums%29%20-%201%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B5%20%D0%B7%D0%B0%D0%BC%D0%BA%D0%BD%D1%83%D1%82%D1%8B%D0%B9%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%20%5B0%2C%20n-1%5D%0A%20%20%20%20while%20i%20%3C%3D%20j%3A%0A%20%20%20%20%20%20%20%20m%20%3D%20%28i%20%2B%20j%29%20%2F%2F%202%20%20%23%20%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%81%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%BD%D1%8B%20m%0A%20%20%20%20%20%20%20%20if%20nums%5Bm%5D%20%3C%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%3D%20m%20%2B%201%20%20%23%20target%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5%20%5Bm%2B1%2C%20j%5D%0A%20%20%20%20%20%20%20%20elif%20nums%5Bm%5D%20%3E%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20%3D%20m%20-%201%20%20%23%20target%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5%20%5Bi%2C%20m-1%5D%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20%3D%20m%20-%201%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%20target%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5%20%5Bi%2C%20m-1%5D%0A%20%20%20%20%23%20%D0%92%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%82%D0%BE%D1%87%D0%BA%D1%83%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%20i%0A%20%20%20%20return%20i%0A%0Adef%20binary_search_right_edge%28nums%3A%20list%5Bint%5D%2C%20target%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%D1%81%D0%B0%D0%BC%D0%BE%D0%B3%D0%BE%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B3%D0%BE%20target%22%22%22%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D1%83%20%D0%B2%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%D1%81%D0%B0%D0%BC%D0%BE%D0%B3%D0%BE%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20target%20%2B%201%0A%20%20%20%20i%20%3D%20binary_search_insertion%28nums%2C%20target%20%2B%201%29%0A%20%20%20%20%23%20j%20%D1%83%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%B0%D0%BC%D1%8B%D0%B9%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20target%2C%20%D0%B0%20i%20%E2%80%94%20%D0%BD%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%20target%0A%20%20%20%20j%20%3D%20i%20-%201%0A%20%20%20%20%23%20target%20%D0%BD%D0%B5%20%D0%BD%D0%B0%D0%B9%D0%B4%D0%B5%D0%BD%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20-1%0A%20%20%20%20if%20j%20%3D%3D%20-1%20or%20nums%5Bj%5D%20%21%3D%20target%3A%0A%20%20%20%20%20%20%20%20return%20-1%0A%20%20%20%20%23%20%D0%9D%D0%B0%D0%B9%D1%82%D0%B8%20target%20%D0%B8%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20j%0A%20%20%20%20return%20j%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%9C%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20%D1%81%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%8E%D1%89%D0%B8%D0%BC%D0%B8%D1%81%D1%8F%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D0%BC%D0%B8%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%206%2C%206%2C%206%2C%206%2C%206%2C%2010%2C%2012%2C%2015%5D%0A%20%20%20%20%23%20%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9%20%D0%B8%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B9%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B%0A%20%20%20%20target%20%3D%206%0A%20%20%20%20index%20%3D%20binary_search_right_edge%28nums%2C%20target%29%0A%20%20%20%20print%28f%22%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%81%D0%B0%D0%BC%D0%BE%D0%B3%D0%BE%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20%7Btarget%7D%20%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%20%7Bindex%7D%22%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_searching/binary_search_insertion.md b/ru/codes/pythontutor/chapter_searching/binary_search_insertion.md new file mode 100644 index 000000000..fe183f3c4 --- /dev/null +++ b/ru/codes/pythontutor/chapter_searching/binary_search_insertion.md @@ -0,0 +1,11 @@ + + + +https://pythontutor.com/render.html#code=def%20binary_search_insertion_simple%28nums%3A%20list%5Bint%5D%2C%20target%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%D1%82%D0%BE%D1%87%D0%BA%D0%B8%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%20%28%D0%B1%D0%B5%D0%B7%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%8E%D1%89%D0%B8%D1%85%D1%81%D1%8F%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%29%22%22%22%0A%20%20%20%20i%2C%20j%20%3D%200%2C%20len%28nums%29%20-%201%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B5%20%D0%B7%D0%B0%D0%BC%D0%BA%D0%BD%D1%83%D1%82%D1%8B%D0%B9%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%20%5B0%2C%20n-1%5D%0A%20%20%20%20while%20i%20%3C%3D%20j%3A%0A%20%20%20%20%20%20%20%20m%20%3D%20%28i%20%2B%20j%29%20%2F%2F%202%20%20%23%20%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%81%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%BD%D1%8B%20m%0A%20%20%20%20%20%20%20%20if%20nums%5Bm%5D%20%3C%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%3D%20m%20%2B%201%20%20%23%20target%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5%20%5Bm%2B1%2C%20j%5D%0A%20%20%20%20%20%20%20%20elif%20nums%5Bm%5D%20%3E%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20%3D%20m%20-%201%20%20%23%20target%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5%20%5Bi%2C%20m-1%5D%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20m%20%20%23%20%D0%9D%D0%B0%D0%B9%D1%82%D0%B8%20target%20%D0%B8%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%82%D0%BE%D1%87%D0%BA%D1%83%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%20m%0A%20%20%20%20%23%20target%20%D0%BD%D0%B5%20%D0%BD%D0%B0%D0%B9%D0%B4%D0%B5%D0%BD%2C%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%82%D0%BE%D1%87%D0%BA%D1%83%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%20i%0A%20%20%20%20return%20i%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%9C%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20%D0%B1%D0%B5%D0%B7%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%8E%D1%89%D0%B8%D1%85%D1%81%D1%8F%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%206%2C%208%2C%2012%2C%2015%2C%2023%2C%2026%2C%2031%2C%2035%5D%0A%20%20%20%20%23%20%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%D1%82%D0%BE%D1%87%D0%BA%D0%B8%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%0A%20%20%20%20target%20%3D%206%0A%20%20%20%20index%20%3D%20binary_search_insertion_simple%28nums%2C%20target%29%0A%20%20%20%20print%28f%22%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D0%B8%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20%7Btarget%7D%20%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%20%7Bindex%7D%22%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20binary_search_insertion%28nums%3A%20list%5Bint%5D%2C%20target%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%D1%82%D0%BE%D1%87%D0%BA%D0%B8%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%20%28%D1%81%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%8E%D1%89%D0%B8%D0%BC%D0%B8%D1%81%D1%8F%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D0%BC%D0%B8%29%22%22%22%0A%20%20%20%20i%2C%20j%20%3D%200%2C%20len%28nums%29%20-%201%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B5%20%D0%B7%D0%B0%D0%BC%D0%BA%D0%BD%D1%83%D1%82%D1%8B%D0%B9%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%20%5B0%2C%20n-1%5D%0A%20%20%20%20while%20i%20%3C%3D%20j%3A%0A%20%20%20%20%20%20%20%20m%20%3D%20%28i%20%2B%20j%29%20%2F%2F%202%20%20%23%20%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%81%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%BD%D1%8B%20m%0A%20%20%20%20%20%20%20%20if%20nums%5Bm%5D%20%3C%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%3D%20m%20%2B%201%20%20%23%20target%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5%20%5Bm%2B1%2C%20j%5D%0A%20%20%20%20%20%20%20%20elif%20nums%5Bm%5D%20%3E%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20%3D%20m%20-%201%20%20%23%20target%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5%20%5Bi%2C%20m-1%5D%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20%3D%20m%20-%201%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%20target%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5%20%5Bi%2C%20m-1%5D%0A%20%20%20%20%23%20%D0%92%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%82%D0%BE%D1%87%D0%BA%D1%83%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%20i%0A%20%20%20%20return%20i%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%9C%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20%D1%81%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%8E%D1%89%D0%B8%D0%BC%D0%B8%D1%81%D1%8F%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D0%BC%D0%B8%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%206%2C%206%2C%206%2C%206%2C%206%2C%2010%2C%2012%2C%2015%5D%0A%20%20%20%20%23%20%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%D1%82%D0%BE%D1%87%D0%BA%D0%B8%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%0A%20%20%20%20target%20%3D%206%0A%20%20%20%20index%20%3D%20binary_search_insertion%28nums%2C%20target%29%0A%20%20%20%20print%28f%22%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D0%B8%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20%7Btarget%7D%20%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%20%7Bindex%7D%22%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_searching/two_sum.md b/ru/codes/pythontutor/chapter_searching/two_sum.md new file mode 100644 index 000000000..bb7ccdf62 --- /dev/null +++ b/ru/codes/pythontutor/chapter_searching/two_sum.md @@ -0,0 +1,11 @@ + + + +https://pythontutor.com/render.html#code=def%20two_sum_brute_force%28nums%3A%20list%5Bint%5D%2C%20target%3A%20int%29%20-%3E%20list%5Bint%5D%3A%0A%20%20%20%20%22%22%22%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%201%3A%20%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B1%D0%BE%D1%80%22%22%22%0A%20%20%20%20%23%20%D0%94%D0%B2%D0%B0%20%D0%B2%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B0%2C%20%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20O%28n%5E2%29%0A%20%20%20%20for%20i%20in%20range%28len%28nums%29%20-%201%29%3A%0A%20%20%20%20%20%20%20%20for%20j%20in%20range%28i%20%2B%201%2C%20len%28nums%29%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20nums%5Bi%5D%20%2B%20nums%5Bj%5D%20%3D%3D%20target%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%5Bi%2C%20j%5D%0A%20%20%20%20return%20%5B%5D%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20nums%20%3D%20%5B2%2C%207%2C%2011%2C%2015%5D%0A%20%20%20%20target%20%3D%2013%0A%20%20%20%20res%20%3D%20two_sum_brute_force%28nums%2C%20target%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20two_sum_hash_table%28nums%3A%20list%5Bint%5D%2C%20target%3A%20int%29%20-%3E%20list%5Bint%5D%3A%0A%20%20%20%20%22%22%22%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%202%3A%20%D0%B2%D1%81%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0%22%22%22%0A%20%20%20%20%23%20%D0%92%D1%81%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0%2C%20%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20O%28n%29%0A%20%20%20%20dic%20%3D%20%7B%7D%0A%20%20%20%20%23%20%D0%9E%D0%B4%D0%B8%D0%BD%20%D1%86%D0%B8%D0%BA%D0%BB%2C%20%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20O%28n%29%0A%20%20%20%20for%20i%20in%20range%28len%28nums%29%29%3A%0A%20%20%20%20%20%20%20%20if%20target%20-%20nums%5Bi%5D%20in%20dic%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%5Bdic%5Btarget%20-%20nums%5Bi%5D%5D%2C%20i%5D%0A%20%20%20%20%20%20%20%20dic%5Bnums%5Bi%5D%5D%20%3D%20i%0A%20%20%20%20return%20%5B%5D%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20nums%20%3D%20%5B2%2C%207%2C%2011%2C%2015%5D%0A%20%20%20%20target%20%3D%2013%0A%20%20%20%20res%20%3D%20two_sum_hash_table%28nums%2C%20target%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_sorting/bubble_sort.md b/ru/codes/pythontutor/chapter_sorting/bubble_sort.md new file mode 100644 index 000000000..b75227efe --- /dev/null +++ b/ru/codes/pythontutor/chapter_sorting/bubble_sort.md @@ -0,0 +1,11 @@ + + + +https://pythontutor.com/render.html#code=def%20bubble_sort%28nums%3A%20list%5Bint%5D%29%3A%0A%20%20%20%20%22%22%22%D0%9F%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%B2%D0%B0%D1%8F%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%22%22%22%0A%20%20%20%20n%20%3D%20len%28nums%29%0A%20%20%20%20%23%20%D0%92%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D0%B9%20%D1%86%D0%B8%D0%BA%D0%BB%3A%20%D0%BD%D0%B5%D0%BE%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%20%5B0%2C%20i%5D%0A%20%20%20%20for%20i%20in%20range%28n%20-%201%2C%200%2C%20-1%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%92%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B8%D0%B9%20%D1%86%D0%B8%D0%BA%D0%BB%3A%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BD%D0%B5%D0%BE%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B0%20%5B0%2C%20i%5D%20%D0%B2%20%D0%B5%D0%B3%D0%BE%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%BA%D0%BE%D0%BD%D0%B5%D1%86%0A%20%20%20%20%20%20%20%20for%20j%20in%20range%28i%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20nums%5Bj%5D%20%3E%20nums%5Bj%20%2B%201%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D0%BD%D1%8F%D1%82%D1%8C%20%D0%BC%D0%B5%D1%81%D1%82%D0%B0%D0%BC%D0%B8%20nums%5Bj%5D%20%D0%B8%20nums%5Bj%20%2B%201%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nums%5Bj%5D%2C%20nums%5Bj%20%2B%201%5D%20%3D%20nums%5Bj%20%2B%201%5D%2C%20nums%5Bj%5D%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20nums%20%3D%20%5B4%2C%201%2C%203%2C%201%2C%205%2C%202%5D%0A%20%20%20%20bubble_sort%28nums%29%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D0%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8%20nums%20%3D%22%2C%20nums%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20bubble_sort_with_flag%28nums%3A%20list%5Bint%5D%29%3A%0A%20%20%20%20%22%22%22%D0%9F%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%B2%D0%B0%D1%8F%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%20%28%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%84%D0%BB%D0%B0%D0%B3%D0%BE%D0%BC%29%22%22%22%0A%20%20%20%20n%20%3D%20len%28nums%29%0A%20%20%20%20%23%20%D0%92%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D0%B9%20%D1%86%D0%B8%D0%BA%D0%BB%3A%20%D0%BD%D0%B5%D0%BE%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%20%5B0%2C%20i%5D%0A%20%20%20%20for%20i%20in%20range%28n%20-%201%2C%200%2C%20-1%29%3A%0A%20%20%20%20%20%20%20%20flag%20%3D%20False%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%84%D0%BB%D0%B0%D0%B3%0A%20%20%20%20%20%20%20%20%23%20%D0%92%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B8%D0%B9%20%D1%86%D0%B8%D0%BA%D0%BB%3A%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BD%D0%B5%D0%BE%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B0%20%5B0%2C%20i%5D%20%D0%B2%20%D0%B5%D0%B3%D0%BE%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%BA%D0%BE%D0%BD%D0%B5%D1%86%0A%20%20%20%20%20%20%20%20for%20j%20in%20range%28i%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20nums%5Bj%5D%20%3E%20nums%5Bj%20%2B%201%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D0%BD%D1%8F%D1%82%D1%8C%20%D0%BC%D0%B5%D1%81%D1%82%D0%B0%D0%BC%D0%B8%20nums%5Bj%5D%20%D0%B8%20nums%5Bj%20%2B%201%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nums%5Bj%5D%2C%20nums%5Bj%20%2B%201%5D%20%3D%20nums%5Bj%20%2B%201%5D%2C%20nums%5Bj%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20flag%20%3D%20True%20%20%23%20%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%0A%20%20%20%20%20%20%20%20if%20not%20flag%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20break%20%20%23%20%D0%9D%D0%B0%20%D1%8D%D1%82%D0%BE%D0%B9%20%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8%20%C2%AB%D0%B2%D1%81%D0%BF%D0%BB%D1%8B%D1%82%D0%B8%D1%8F%C2%BB%20%D0%BD%D0%B5%20%D0%B1%D1%8B%D0%BB%D0%BE%20%D0%BD%D0%B8%20%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD%D0%B0%2C%20%D1%81%D1%80%D0%B0%D0%B7%D1%83%20%D0%B2%D1%8B%D0%B9%D1%82%D0%B8%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20nums%20%3D%20%5B4%2C%201%2C%203%2C%201%2C%205%2C%202%5D%0A%20%20%20%20bubble_sort_with_flag%28nums%29%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D0%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8%20nums%20%3D%22%2C%20nums%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_sorting/bucket_sort.md b/ru/codes/pythontutor/chapter_sorting/bucket_sort.md new file mode 100644 index 000000000..5084d0213 --- /dev/null +++ b/ru/codes/pythontutor/chapter_sorting/bucket_sort.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20bucket_sort%28nums%3A%20list%5Bfloat%5D%29%3A%0A%20%20%20%20%22%22%22%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%BA%D0%BE%D1%80%D0%B7%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%22%22%22%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20k%20%3D%20n%2F2%20%D0%BA%D0%BE%D1%80%D0%B7%D0%B8%D0%BD%2C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BF%D0%BE%D0%BB%D0%B0%D0%B3%D0%B0%D1%8F%20%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%202%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%20%D0%B2%20%D0%BA%D0%B0%D0%B6%D0%B4%D1%83%D1%8E%20%D0%BA%D0%BE%D1%80%D0%B7%D0%B8%D0%BD%D1%83%0A%20%20%20%20k%20%3D%20len%28nums%29%20%2F%2F%202%0A%20%20%20%20buckets%20%3D%20%5B%5B%5D%20for%20_%20in%20range%28k%29%5D%0A%20%20%20%20%23%201.%20%D0%A0%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%20%D0%BF%D0%BE%20%D0%BA%D0%BE%D1%80%D0%B7%D0%B8%D0%BD%D0%B0%D0%BC%0A%20%20%20%20for%20num%20in%20nums%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%92%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B5%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%BB%D0%B5%D0%B6%D0%B0%D1%82%20%D0%B2%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B5%20%5B0%2C%201%29%3B%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20num%20%2A%20k%20%D0%B4%D0%BB%D1%8F%20%D0%BE%D1%82%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%BE%D0%B2%20%5B0%2C%20k-1%5D%0A%20%20%20%20%20%20%20%20i%20%3D%20int%28num%20%2A%20k%29%0A%20%20%20%20%20%20%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20num%20%D0%B2%20%D0%BA%D0%BE%D1%80%D0%B7%D0%B8%D0%BD%D1%83%20i%0A%20%20%20%20%20%20%20%20buckets%5Bi%5D.append%28num%29%0A%20%20%20%20%23%202.%20%D0%92%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D1%83%20%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B8%20%D0%BA%D0%B0%D0%B6%D0%B4%D0%BE%D0%B9%20%D0%BA%D0%BE%D1%80%D0%B7%D0%B8%D0%BD%D1%8B%0A%20%20%20%20for%20bucket%20in%20buckets%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%83%D1%8E%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8E%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8%3B%20%D0%B5%D0%B5%20%D1%82%D0%B0%D0%BA%D0%B6%D0%B5%20%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B4%D1%80%D1%83%D0%B3%D0%B8%D0%BC%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%BC%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8%0A%20%20%20%20%20%20%20%20bucket.sort%28%29%0A%20%20%20%20%23%203.%20%D0%9E%D0%B1%D0%BE%D0%B9%D1%82%D0%B8%20%D0%BA%D0%BE%D1%80%D0%B7%D0%B8%D0%BD%D1%8B%20%D0%B8%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B8%D1%82%D1%8C%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D1%8B%0A%20%20%20%20i%20%3D%200%0A%20%20%20%20for%20bucket%20in%20buckets%3A%0A%20%20%20%20%20%20%20%20for%20num%20in%20bucket%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20nums%5Bi%5D%20%3D%20num%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%2B%3D%201%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%9F%D1%83%D1%81%D1%82%D1%8C%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B5%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5%20%E2%80%94%20%D1%87%D0%B8%D1%81%D0%BB%D0%B0%20%D1%81%20%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%20%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9%20%D0%B8%D0%B7%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B0%20%5B0%2C%201%29%0A%20%20%20%20nums%20%3D%20%5B0.49%2C%200.96%2C%200.82%2C%200.09%2C%200.57%2C%200.43%2C%200.91%2C%200.75%2C%200.15%2C%200.37%5D%0A%20%20%20%20bucket_sort%28nums%29%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8%20%D0%BA%D0%BE%D1%80%D0%B7%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%20nums%20%3D%22%2C%20nums%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_sorting/counting_sort.md b/ru/codes/pythontutor/chapter_sorting/counting_sort.md new file mode 100644 index 000000000..b0079f68e --- /dev/null +++ b/ru/codes/pythontutor/chapter_sorting/counting_sort.md @@ -0,0 +1,11 @@ + + + +https://pythontutor.com/render.html#code=def%20counting_sort_naive%28nums%3A%20list%5Bint%5D%29%3A%0A%20%20%20%20%22%22%22%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%BF%D0%BE%D0%B4%D1%81%D1%87%D0%B5%D1%82%D0%BE%D0%BC%22%22%22%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%BE%D1%81%D1%82%D0%B0%D1%8F%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%2C%20%D0%BD%D0%B5%20%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D0%B8%D1%82%20%D0%B4%D0%BB%D1%8F%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%0A%20%20%20%20%23%201.%20%D0%9D%D0%B0%D0%B9%D1%82%D0%B8%20%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%20m%0A%20%20%20%20m%20%3D%200%0A%20%20%20%20for%20num%20in%20nums%3A%0A%20%20%20%20%20%20%20%20m%20%3D%20max%28m%2C%20num%29%0A%20%20%20%20%23%202.%20%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D0%B8%D1%82%D0%B0%D1%82%D1%8C%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BF%D0%BE%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%BA%D0%B0%D0%B6%D0%B4%D0%BE%D0%B9%20%D1%86%D0%B8%D1%84%D1%80%D1%8B%0A%20%20%20%20%23%20counter%5Bnum%5D%20%D0%BE%D0%B1%D0%BE%D0%B7%D0%BD%D0%B0%D1%87%D0%B0%D0%B5%D1%82%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BF%D0%BE%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9%20num%0A%20%20%20%20counter%20%3D%20%5B0%5D%20%2A%20%28m%20%2B%201%29%0A%20%20%20%20for%20num%20in%20nums%3A%0A%20%20%20%20%20%20%20%20counter%5Bnum%5D%20%2B%3D%201%0A%20%20%20%20%23%203.%20%D0%9E%D0%B1%D0%BE%D0%B9%D1%82%D0%B8%20counter%20%D0%B8%20%D0%B7%D0%B0%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20nums%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D0%BC%D0%B8%0A%20%20%20%20i%20%3D%200%0A%20%20%20%20for%20num%20in%20range%28m%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20for%20_%20in%20range%28counter%5Bnum%5D%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20nums%5Bi%5D%20%3D%20num%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%2B%3D%201%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20nums%20%3D%20%5B1%2C%200%2C%201%2C%202%2C%200%2C%204%2C%200%2C%202%2C%202%2C%204%5D%0A%20%20%20%20counting_sort_naive%28nums%29%0A%20%20%20%20print%28f%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8%20%D0%BF%D0%BE%D0%B4%D1%81%D1%87%D0%B5%D1%82%D0%BE%D0%BC%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20%D0%BD%D0%B5%20%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%B2%D0%B0%D1%8E%D1%82%D1%81%D1%8F%29%20nums%20%3D%20%7Bnums%7D%22%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20counting_sort%28nums%3A%20list%5Bint%5D%29%3A%0A%20%20%20%20%22%22%22%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%BF%D0%BE%D0%B4%D1%81%D1%87%D0%B5%D1%82%D0%BE%D0%BC%22%22%22%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%2C%20%D0%BF%D0%BE%D0%B7%D0%B2%D0%BE%D0%BB%D1%8F%D0%B5%D1%82%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20%D0%B8%20%D1%8F%D0%B2%D0%BB%D1%8F%D0%B5%D1%82%D1%81%D1%8F%20%D1%81%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%BE%D0%B9%0A%20%20%20%20%23%201.%20%D0%9D%D0%B0%D0%B9%D1%82%D0%B8%20%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%20m%0A%20%20%20%20m%20%3D%20max%28nums%29%0A%20%20%20%20%23%202.%20%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D0%B8%D1%82%D0%B0%D1%82%D1%8C%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BF%D0%BE%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%BA%D0%B0%D0%B6%D0%B4%D0%BE%D0%B9%20%D1%86%D0%B8%D1%84%D1%80%D1%8B%0A%20%20%20%20%23%20counter%5Bnum%5D%20%D0%BE%D0%B1%D0%BE%D0%B7%D0%BD%D0%B0%D1%87%D0%B0%D0%B5%D1%82%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BF%D0%BE%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9%20num%0A%20%20%20%20counter%20%3D%20%5B0%5D%20%2A%20%28m%20%2B%201%29%0A%20%20%20%20for%20num%20in%20nums%3A%0A%20%20%20%20%20%20%20%20counter%5Bnum%5D%20%2B%3D%201%0A%20%20%20%20%23%203.%20%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D1%84%D0%B8%D0%BA%D1%81%D0%BD%D1%8B%D0%B5%20%D1%81%D1%83%D0%BC%D0%BC%D1%8B%20counter%20%D0%B8%20%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%C2%AB%D1%87%D0%B8%D1%81%D0%BB%D0%BE%20%D0%BF%D0%BE%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9%C2%BB%20%D0%B2%20%C2%AB%D0%BA%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%C2%BB%0A%20%20%20%20%23%20%D0%A2%D0%BE%20%D0%B5%D1%81%D1%82%D1%8C%20counter%5Bnum%5D-1%20%E2%80%94%20%D1%8D%D1%82%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B5%D0%B3%D0%BE%20%D0%BF%D0%BE%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20num%20%D0%B2%20res%0A%20%20%20%20for%20i%20in%20range%28m%29%3A%0A%20%20%20%20%20%20%20%20counter%5Bi%20%2B%201%5D%20%2B%3D%20counter%5Bi%5D%0A%20%20%20%20%23%204.%20%D0%9E%D0%B1%D0%BE%D0%B9%D1%82%D0%B8%20nums%20%D0%B2%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%BC%20%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B5%20%D0%B8%20%D0%BF%D0%BE%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D0%B2%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20res%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20res%20%D0%B4%D0%BB%D1%8F%20%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0%0A%20%20%20%20n%20%3D%20len%28nums%29%0A%20%20%20%20res%20%3D%20%5B0%5D%20%2A%20n%0A%20%20%20%20for%20i%20in%20range%28n%20-%201%2C%20-1%2C%20-1%29%3A%0A%20%20%20%20%20%20%20%20num%20%3D%20nums%5Bi%5D%0A%20%20%20%20%20%20%20%20res%5Bcounter%5Bnum%5D%20-%201%5D%20%3D%20num%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20num%20%D0%BF%D0%BE%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%89%D0%B5%D0%BC%D1%83%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%0A%20%20%20%20%20%20%20%20counter%5Bnum%5D%20-%3D%201%20%20%23%20%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B8%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D1%84%D0%B8%D0%BA%D1%81%D0%BD%D1%83%D1%8E%20%D1%81%D1%83%D0%BC%D0%BC%D1%83%20%D0%BD%D0%B0%201%2C%20%D1%87%D1%82%D0%BE%D0%B1%D1%8B%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B3%D0%BE%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D1%8F%20num%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20nums%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%BE%D0%BC%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0%20res%0A%20%20%20%20for%20i%20in%20range%28n%29%3A%0A%20%20%20%20%20%20%20%20nums%5Bi%5D%20%3D%20res%5Bi%5D%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20nums%20%3D%20%5B1%2C%200%2C%201%2C%202%2C%200%2C%204%2C%200%2C%202%2C%202%2C%204%5D%0A%20%20%20%20counting_sort%28nums%29%0A%20%20%20%20print%28f%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8%20%D0%BF%D0%BE%D0%B4%D1%81%D1%87%D0%B5%D1%82%D0%BE%D0%BC%20nums%20%3D%20%7Bnums%7D%22%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_sorting/heap_sort.md b/ru/codes/pythontutor/chapter_sorting/heap_sort.md new file mode 100644 index 000000000..254fe2859 --- /dev/null +++ b/ru/codes/pythontutor/chapter_sorting/heap_sort.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20sift_down%28nums%3A%20list%5Bint%5D%2C%20n%3A%20int%2C%20i%3A%20int%29%3A%0A%20%20%20%20%22%22%22%D0%94%D0%BB%D0%B8%D0%BD%D0%B0%20%D0%BA%D1%83%D1%87%D0%B8%20%D1%80%D0%B0%D0%B2%D0%BD%D0%B0%20n%3B%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8F%20%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20i%2C%20%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D1%8C%20%D0%BF%D1%80%D0%BE%D1%81%D0%B5%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%D0%B2%D0%B5%D1%80%D1%85%D1%83%20%D0%B2%D0%BD%D0%B8%D0%B7%22%22%22%0A%20%20%20%20while%20True%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C%20%D1%83%D0%B7%D0%B5%D0%BB%20%D1%81%20%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC%20%D1%81%D1%80%D0%B5%D0%B4%D0%B8%20i%2C%20l%20%D0%B8%20r%20%D0%B8%20%D0%BE%D0%B1%D0%BE%D0%B7%D0%BD%D0%B0%D1%87%D0%B8%D1%82%D1%8C%20%D0%B5%D0%B3%D0%BE%20%D0%BA%D0%B0%D0%BA%20ma%0A%20%20%20%20%20%20%20%20l%20%3D%202%20%2A%20i%20%2B%201%0A%20%20%20%20%20%20%20%20r%20%3D%202%20%2A%20i%20%2B%202%0A%20%20%20%20%20%20%20%20ma%20%3D%20i%0A%20%20%20%20%20%20%20%20if%20l%20%3C%20n%20and%20nums%5Bl%5D%20%3E%20nums%5Bma%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20ma%20%3D%20l%0A%20%20%20%20%20%20%20%20if%20r%20%3C%20n%20and%20nums%5Br%5D%20%3E%20nums%5Bma%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20ma%20%3D%20r%0A%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D1%83%D0%B7%D0%B5%D0%BB%20i%20%D1%83%D0%B6%D0%B5%20%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D0%B5%D0%BD%20%D0%B8%D0%BB%D0%B8%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B%20l%20%D0%B8%20r%20%D0%B2%D0%BD%D0%B5%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%2C%20%D0%B4%D0%B0%D0%BB%D1%8C%D0%BD%D0%B5%D0%B9%D1%88%D0%B5%D0%B5%20%D0%BF%D1%80%D0%BE%D1%81%D0%B5%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BD%D0%B5%20%D1%82%D1%80%D0%B5%D0%B1%D1%83%D0%B5%D1%82%D1%81%D1%8F%2C%20%D0%B2%D1%8B%D0%B9%D1%82%D0%B8%0A%20%20%20%20%20%20%20%20if%20ma%20%3D%3D%20i%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D0%BD%D1%8F%D1%82%D1%8C%20%D0%B4%D0%B2%D0%B0%20%D1%83%D0%B7%D0%BB%D0%B0%20%D0%BC%D0%B5%D1%81%D1%82%D0%B0%D0%BC%D0%B8%0A%20%20%20%20%20%20%20%20nums%5Bi%5D%2C%20nums%5Bma%5D%20%3D%20nums%5Bma%5D%2C%20nums%5Bi%5D%0A%20%20%20%20%20%20%20%20%23%20%D0%A6%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D1%81%D0%B5%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B2%D0%BD%D0%B8%D0%B7%0A%20%20%20%20%20%20%20%20i%20%3D%20ma%0A%0Adef%20heap_sort%28nums%3A%20list%5Bint%5D%29%3A%0A%20%20%20%20%22%22%22%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%BA%D1%83%D1%87%D0%B5%D0%B9%22%22%22%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BA%D1%83%D1%87%D0%B8%3A%20%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D1%8C%20heapify%20%D0%B4%D0%BB%D1%8F%20%D0%B2%D1%81%D0%B5%D1%85%20%D1%83%D0%B7%D0%BB%D0%BE%D0%B2%2C%20%D0%BA%D1%80%D0%BE%D0%BC%D0%B5%20%D0%BB%D0%B8%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D1%85%0A%20%20%20%20for%20i%20in%20range%28len%28nums%29%20%2F%2F%202%20-%201%2C%20-1%2C%20-1%29%3A%0A%20%20%20%20%20%20%20%20sift_down%28nums%2C%20len%28nums%29%2C%20i%29%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D0%BA%D0%B0%D1%82%D1%8C%20%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D0%BA%D1%83%D1%87%D0%B8%20%D0%B2%20%D1%82%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20n-1%20%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B9%0A%20%20%20%20for%20i%20in%20range%28len%28nums%29%20-%201%2C%200%2C%20-1%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D0%BD%D1%8F%D1%82%D1%8C%20%D0%BA%D0%BE%D1%80%D0%BD%D0%B5%D0%B2%D0%BE%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%20%D1%81%20%D1%81%D0%B0%D0%BC%D1%8B%D0%BC%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%BC%20%D0%BB%D0%B8%D1%81%D1%82%D0%BE%D0%BC%20%D0%BC%D0%B5%D1%81%D1%82%D0%B0%D0%BC%D0%B8%20%28%D0%BF%D0%BE%D0%BC%D0%B5%D0%BD%D1%8F%D1%82%D1%8C%20%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D0%B8%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%29%0A%20%20%20%20%20%20%20%20nums%5B0%5D%2C%20nums%5Bi%5D%20%3D%20nums%5Bi%5D%2C%20nums%5B0%5D%0A%20%20%20%20%20%20%20%20%23%20%D0%9D%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8F%20%D1%81%20%D0%BA%D0%BE%D1%80%D0%BD%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%83%D0%B7%D0%BB%D0%B0%2C%20%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D1%8C%20%D0%BF%D1%80%D0%BE%D1%81%D0%B5%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%D0%B2%D0%B5%D1%80%D1%85%D1%83%20%D0%B2%D0%BD%D0%B8%D0%B7%0A%20%20%20%20%20%20%20%20sift_down%28nums%2C%20i%2C%200%29%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20nums%20%3D%20%5B4%2C%201%2C%203%2C%201%2C%205%2C%202%5D%0A%20%20%20%20heap_sort%28nums%29%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8%20%D0%BA%D1%83%D1%87%D0%B5%D0%B9%20nums%20%3D%22%2C%20nums%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_sorting/insertion_sort.md b/ru/codes/pythontutor/chapter_sorting/insertion_sort.md new file mode 100644 index 000000000..5cd1adf55 --- /dev/null +++ b/ru/codes/pythontutor/chapter_sorting/insertion_sort.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20insertion_sort%28nums%3A%20list%5Bint%5D%29%3A%0A%20%20%20%20%22%22%22%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8%22%22%22%0A%20%20%20%20%23%20%D0%92%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D0%B9%20%D1%86%D0%B8%D0%BA%D0%BB%3A%20%D0%BE%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%20%5B0%2C%20i-1%5D%0A%20%20%20%20for%20i%20in%20range%281%2C%20len%28nums%29%29%3A%0A%20%20%20%20%20%20%20%20base%20%3D%20nums%5Bi%5D%0A%20%20%20%20%20%20%20%20j%20%3D%20i%20-%201%0A%20%20%20%20%20%20%20%20%23%20%D0%92%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B8%D0%B9%20%D1%86%D0%B8%D0%BA%D0%BB%3A%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20base%20%D0%B2%20%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%83%D1%8E%20%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8E%20%D0%BE%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B0%20%5B0%2C%20i-1%5D%0A%20%20%20%20%20%20%20%20while%20j%20%3E%3D%200%20and%20nums%5Bj%5D%20%3E%20base%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20nums%5Bj%20%2B%201%5D%20%3D%20nums%5Bj%5D%20%20%23%20%D0%A1%D0%B4%D0%B2%D0%B8%D0%BD%D1%83%D1%82%D1%8C%20nums%5Bj%5D%20%D0%BD%D0%B0%20%D0%BE%D0%B4%D0%BD%D1%83%20%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8E%20%D0%B2%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20-%3D%201%0A%20%20%20%20%20%20%20%20nums%5Bj%20%2B%201%5D%20%3D%20base%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20base%20%D0%B2%20%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%83%D1%8E%20%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8E%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20nums%20%3D%20%5B4%2C%201%2C%203%2C%201%2C%205%2C%202%5D%0A%20%20%20%20insertion_sort%28nums%29%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%D0%BC%D0%B8%20nums%20%3D%22%2C%20nums%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_sorting/merge_sort.md b/ru/codes/pythontutor/chapter_sorting/merge_sort.md new file mode 100644 index 000000000..36029084f --- /dev/null +++ b/ru/codes/pythontutor/chapter_sorting/merge_sort.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20merge%28nums%3A%20list%5Bint%5D%2C%20left%3A%20int%2C%20mid%3A%20int%2C%20right%3A%20int%29%3A%0A%20%20%20%20tmp%20%3D%20%5B0%5D%20%2A%20%28right%20-%20left%20%2B%201%29%0A%20%20%20%20%28i%2C%20j%2C%20k%29%20%3D%20%28left%2C%20mid%20%2B%201%2C%200%29%0A%20%20%20%20while%20i%20%3C%3D%20mid%20and%20j%20%3C%3D%20right%3A%0A%20%20%20%20%20%20%20%20if%20nums%5Bi%5D%20%3C%3D%20nums%5Bj%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20tmp%5Bk%5D%20%3D%20nums%5Bi%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%2B%3D%201%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20tmp%5Bk%5D%20%3D%20nums%5Bj%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20%2B%3D%201%0A%20%20%20%20%20%20%20%20k%20%2B%3D%201%0A%20%20%20%20while%20i%20%3C%3D%20mid%3A%0A%20%20%20%20%20%20%20%20tmp%5Bk%5D%20%3D%20nums%5Bi%5D%0A%20%20%20%20%20%20%20%20i%20%2B%3D%201%0A%20%20%20%20%20%20%20%20k%20%2B%3D%201%0A%20%20%20%20while%20j%20%3C%3D%20right%3A%0A%20%20%20%20%20%20%20%20tmp%5Bk%5D%20%3D%20nums%5Bj%5D%0A%20%20%20%20%20%20%20%20j%20%2B%3D%201%0A%20%20%20%20%20%20%20%20k%20%2B%3D%201%0A%20%20%20%20for%20k%20in%20range%280%2C%20len%28tmp%29%29%3A%0A%20%20%20%20%20%20%20%20nums%5Bleft%20%2B%20k%5D%20%3D%20tmp%5Bk%5D%0A%0Adef%20merge_sort%28nums%3A%20list%5Bint%5D%2C%20left%3A%20int%2C%20right%3A%20int%29%3A%0A%20%20%20%20if%20left%20%3E%3D%20right%3A%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20mid%20%3D%20%28left%20%2B%20right%29%20%2F%2F%202%0A%20%20%20%20merge_sort%28nums%2C%20left%2C%20mid%29%0A%20%20%20%20merge_sort%28nums%2C%20mid%20%2B%201%2C%20right%29%0A%20%20%20%20merge%28nums%2C%20left%2C%20mid%2C%20right%29%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20nums%20%3D%20%5B7%2C%203%2C%202%2C%206%2C%200%2C%201%2C%205%2C%204%5D%0A%20%20%20%20merge_sort%28nums%2C%200%2C%20len%28nums%29%20-%201%29%0A%20%20%20%20print%28%27%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8%20%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC%20nums%20%3D%27%2C%20nums%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_sorting/quick_sort.md b/ru/codes/pythontutor/chapter_sorting/quick_sort.md new file mode 100644 index 000000000..ba8bbb381 --- /dev/null +++ b/ru/codes/pythontutor/chapter_sorting/quick_sort.md @@ -0,0 +1,17 @@ + + + +https://pythontutor.com/render.html#code=def%20partition%28nums%3A%20list%5Bint%5D%2C%20left%3A%20int%2C%20right%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D0%BC%D0%B8%20%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%D0%BC%D0%B8%22%22%22%0A%20%20%20%20%23%20%D0%92%D0%B7%D1%8F%D1%82%D1%8C%20nums%5Bleft%5D%20%D0%B2%20%D0%BA%D0%B0%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%0A%20%20%20%20i%2C%20j%20%3D%20left%2C%20right%0A%20%20%20%20while%20i%20%3C%20j%3A%0A%20%20%20%20%20%20%20%20while%20i%20%3C%20j%20and%20nums%5Bj%5D%20%3E%3D%20nums%5Bleft%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20-%3D%201%20%20%23%20%D0%98%D0%B4%D1%82%D0%B8%20%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%B0%20%D0%BD%D0%B0%D0%BB%D0%B5%D0%B2%D0%BE%20%D0%B2%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0%D1%85%20%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE%0A%20%20%20%20%20%20%20%20while%20i%20%3C%20j%20and%20nums%5Bi%5D%20%3C%3D%20nums%5Bleft%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%2B%3D%201%20%20%23%20%D0%98%D0%B4%D1%82%D0%B8%20%D1%81%D0%BB%D0%B5%D0%B2%D0%B0%20%D0%BD%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%20%D0%B2%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0%D1%85%20%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE%0A%20%20%20%20%20%20%20%20%23%20%D0%9E%D0%B1%D0%BC%D0%B5%D0%BD%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%0A%20%20%20%20%20%20%20%20nums%5Bi%5D%2C%20nums%5Bj%5D%20%3D%20nums%5Bj%5D%2C%20nums%5Bi%5D%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BD%D0%B0%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%83%20%D0%B4%D0%B2%D1%83%D1%85%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%BE%D0%B2%0A%20%20%20%20nums%5Bi%5D%2C%20nums%5Bleft%5D%20%3D%20nums%5Bleft%5D%2C%20nums%5Bi%5D%0A%20%20%20%20return%20i%20%20%23%20%D0%92%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20nums%20%3D%20%5B2%2C%204%2C%201%2C%200%2C%203%2C%205%5D%0A%20%20%20%20partition%28nums%2C%200%2C%20len%28nums%29%20-%201%29%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D0%BC%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%BC%20nums%20%3D%22%2C%20nums%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20partition%28nums%3A%20list%5Bint%5D%2C%20left%3A%20int%2C%20right%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D0%BC%D0%B8%20%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%D0%BC%D0%B8%22%22%22%0A%20%20%20%20%23%20%D0%92%D0%B7%D1%8F%D1%82%D1%8C%20nums%5Bleft%5D%20%D0%B2%20%D0%BA%D0%B0%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%0A%20%20%20%20i%2C%20j%20%3D%20left%2C%20right%0A%20%20%20%20while%20i%20%3C%20j%3A%0A%20%20%20%20%20%20%20%20while%20i%20%3C%20j%20and%20nums%5Bj%5D%20%3E%3D%20nums%5Bleft%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20-%3D%201%20%20%23%20%D0%98%D0%B4%D1%82%D0%B8%20%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%B0%20%D0%BD%D0%B0%D0%BB%D0%B5%D0%B2%D0%BE%20%D0%B2%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0%D1%85%20%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE%0A%20%20%20%20%20%20%20%20while%20i%20%3C%20j%20and%20nums%5Bi%5D%20%3C%3D%20nums%5Bleft%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%2B%3D%201%20%20%23%20%D0%98%D0%B4%D1%82%D0%B8%20%D1%81%D0%BB%D0%B5%D0%B2%D0%B0%20%D0%BD%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%20%D0%B2%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0%D1%85%20%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE%0A%20%20%20%20%20%20%20%20%23%20%D0%9E%D0%B1%D0%BC%D0%B5%D0%BD%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%0A%20%20%20%20%20%20%20%20nums%5Bi%5D%2C%20nums%5Bj%5D%20%3D%20nums%5Bj%5D%2C%20nums%5Bi%5D%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BD%D0%B0%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%83%20%D0%B4%D0%B2%D1%83%D1%85%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%BE%D0%B2%0A%20%20%20%20nums%5Bi%5D%2C%20nums%5Bleft%5D%20%3D%20nums%5Bleft%5D%2C%20nums%5Bi%5D%0A%20%20%20%20return%20i%20%20%23%20%D0%92%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%0A%0Adef%20quick_sort%28nums%3A%20list%5Bint%5D%2C%20left%3A%20int%2C%20right%3A%20int%29%3A%0A%20%20%20%20%22%22%22%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%B0%D1%8F%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%22%22%22%0A%20%20%20%20%23%20%D0%97%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B8%D1%82%D1%8C%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8E%2C%20%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0%20%D0%B4%D0%BB%D0%B8%D0%BD%D0%B0%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%20%D1%80%D0%B0%D0%B2%D0%BD%D0%B0%201%0A%20%20%20%20if%20left%20%3E%3D%20right%3A%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20%23%20%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D0%BC%D0%B8%20%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%D0%BC%D0%B8%0A%20%20%20%20pivot%20%3D%20partition%28nums%2C%20left%2C%20right%29%0A%20%20%20%20%23%20%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%BE%20%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%82%D1%8C%20%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9%20%D0%B8%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D1%8B%0A%20%20%20%20quick_sort%28nums%2C%20left%2C%20pivot%20-%201%29%0A%20%20%20%20quick_sort%28nums%2C%20pivot%20%2B%201%2C%20right%29%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%B0%D1%8F%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%0A%20%20%20%20nums%20%3D%20%5B2%2C%204%2C%201%2C%200%2C%203%2C%205%5D%0A%20%20%20%20quick_sort%28nums%2C%200%2C%20len%28nums%29%20-%201%29%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B9%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8%20nums%20%3D%22%2C%20nums%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20median_three%28nums%3A%20list%5Bint%5D%2C%20left%3A%20int%2C%20mid%3A%20int%2C%20right%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%92%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D0%BC%D0%B5%D0%B4%D0%B8%D0%B0%D0%BD%D1%83%20%D0%B8%D0%B7%20%D1%82%D1%80%D0%B5%D1%85%20%D0%BA%D0%B0%D0%BD%D0%B4%D0%B8%D0%B4%D0%B0%D1%82%D0%BE%D0%B2%22%22%22%0A%20%20%20%20l%2C%20m%2C%20r%20%3D%20nums%5Bleft%5D%2C%20nums%5Bmid%5D%2C%20nums%5Bright%5D%0A%20%20%20%20if%20%28l%20%3C%3D%20m%20%3C%3D%20r%29%20or%20%28r%20%3C%3D%20m%20%3C%3D%20l%29%3A%0A%20%20%20%20%20%20%20%20return%20mid%20%20%23%20m%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20l%20%D0%B8%20r%0A%20%20%20%20if%20%28m%20%3C%3D%20l%20%3C%3D%20r%29%20or%20%28r%20%3C%3D%20l%20%3C%3D%20m%29%3A%0A%20%20%20%20%20%20%20%20return%20left%20%20%23%20l%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20m%20%D0%B8%20r%0A%20%20%20%20return%20right%0A%0Adef%20partition%28nums%3A%20list%5Bint%5D%2C%20left%3A%20int%2C%20right%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D0%BC%D0%B8%20%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%D0%BC%D0%B8%20%28%D0%BC%D0%B5%D0%B4%D0%B8%D0%B0%D0%BD%D0%B0%20%D1%82%D1%80%D0%B5%D1%85%29%22%22%22%0A%20%20%20%20%23%20%D0%92%D0%B7%D1%8F%D1%82%D1%8C%20nums%5Bleft%5D%20%D0%B2%20%D0%BA%D0%B0%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%0A%20%20%20%20med%20%3D%20median_three%28nums%2C%20left%2C%20%28left%20%2B%20right%29%20%2F%2F%202%2C%20right%29%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%BC%D0%B5%D0%B4%D0%B8%D0%B0%D0%BD%D1%83%20%D0%B2%20%D0%BA%D1%80%D0%B0%D0%B9%D0%BD%D0%B8%D0%B9%20%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%0A%20%20%20%20nums%5Bleft%5D%2C%20nums%5Bmed%5D%20%3D%20nums%5Bmed%5D%2C%20nums%5Bleft%5D%0A%20%20%20%20%23%20%D0%92%D0%B7%D1%8F%D1%82%D1%8C%20nums%5Bleft%5D%20%D0%B2%20%D0%BA%D0%B0%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%0A%20%20%20%20i%2C%20j%20%3D%20left%2C%20right%0A%20%20%20%20while%20i%20%3C%20j%3A%0A%20%20%20%20%20%20%20%20while%20i%20%3C%20j%20and%20nums%5Bj%5D%20%3E%3D%20nums%5Bleft%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20-%3D%201%20%20%23%20%D0%98%D0%B4%D1%82%D0%B8%20%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%B0%20%D0%BD%D0%B0%D0%BB%D0%B5%D0%B2%D0%BE%20%D0%B2%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0%D1%85%20%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE%0A%20%20%20%20%20%20%20%20while%20i%20%3C%20j%20and%20nums%5Bi%5D%20%3C%3D%20nums%5Bleft%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%2B%3D%201%20%20%23%20%D0%98%D0%B4%D1%82%D0%B8%20%D1%81%D0%BB%D0%B5%D0%B2%D0%B0%20%D0%BD%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%20%D0%B2%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0%D1%85%20%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE%0A%20%20%20%20%20%20%20%20%23%20%D0%9E%D0%B1%D0%BC%D0%B5%D0%BD%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%0A%20%20%20%20%20%20%20%20nums%5Bi%5D%2C%20nums%5Bj%5D%20%3D%20nums%5Bj%5D%2C%20nums%5Bi%5D%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BD%D0%B0%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%83%20%D0%B4%D0%B2%D1%83%D1%85%20%D0%BF%D0%BE%D0%B4%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%BE%D0%B2%0A%20%20%20%20nums%5Bi%5D%2C%20nums%5Bleft%5D%20%3D%20nums%5Bleft%5D%2C%20nums%5Bi%5D%0A%20%20%20%20return%20i%20%20%23%20%D0%92%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BC%D0%B5%D0%B4%D0%B8%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D0%BC%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%BC%0A%20%20%20%20nums%20%3D%20%5B2%2C%204%2C%201%2C%200%2C%203%2C%205%5D%0A%20%20%20%20partition%28nums%2C%200%2C%20len%28nums%29%20-%201%29%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D0%BC%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%BC%20%28%D0%BC%D0%B5%D0%B4%D0%B8%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%29%20nums%20%3D%22%2C%20nums%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=def%20partition%28nums%3A%20list%5Bint%5D%2C%20left%3A%20int%2C%20right%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%28i%2C%20j%29%20%3D%20%28left%2C%20right%29%0A%20%20%20%20while%20i%20%3C%20j%3A%0A%20%20%20%20%20%20%20%20while%20i%20%3C%20j%20and%20nums%5Bj%5D%20%3E%3D%20nums%5Bleft%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20-%3D%201%0A%20%20%20%20%20%20%20%20while%20i%20%3C%20j%20and%20nums%5Bi%5D%20%3C%3D%20nums%5Bleft%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%28nums%5Bi%5D%2C%20nums%5Bj%5D%29%20%3D%20%28nums%5Bj%5D%2C%20nums%5Bi%5D%29%0A%20%20%20%20%28nums%5Bi%5D%2C%20nums%5Bleft%5D%29%20%3D%20%28nums%5Bleft%5D%2C%20nums%5Bi%5D%29%0A%20%20%20%20return%20i%0A%0Adef%20quick_sort%28nums%3A%20list%5Bint%5D%2C%20left%3A%20int%2C%20right%3A%20int%29%3A%0A%20%20%20%20while%20left%20%3C%20right%3A%0A%20%20%20%20%20%20%20%20pivot%20%3D%20partition%28nums%2C%20left%2C%20right%29%0A%20%20%20%20%20%20%20%20if%20pivot%20-%20left%20%3C%20right%20-%20pivot%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20quick_sort%28nums%2C%20left%2C%20pivot%20-%201%29%0A%20%20%20%20%20%20%20%20%20%20%20%20left%20%3D%20pivot%20%2B%201%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20quick_sort%28nums%2C%20pivot%20%2B%201%2C%20right%29%0A%20%20%20%20%20%20%20%20%20%20%20%20right%20%3D%20pivot%20-%201%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20nums%20%3D%20%5B2%2C%204%2C%201%2C%200%2C%203%2C%205%5D%0A%20%20%20%20quick_sort%28nums%2C%200%2C%20len%28nums%29%20-%201%29%0A%20%20%20%20print%28%27%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B9%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8%20%28%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B5%D0%B9%29%20nums%20%3D%27%2C%20nums%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_sorting/radix_sort.md b/ru/codes/pythontutor/chapter_sorting/radix_sort.md new file mode 100644 index 000000000..909541c8b --- /dev/null +++ b/ru/codes/pythontutor/chapter_sorting/radix_sort.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20digit%28num%3A%20int%2C%20exp%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20return%20num%20%2F%2F%20exp%20%25%2010%0A%0Adef%20counting_sort_digit%28nums%3A%20list%5Bint%5D%2C%20exp%3A%20int%29%3A%0A%20%20%20%20counter%20%3D%20%5B0%5D%20%2A%2010%0A%20%20%20%20n%20%3D%20len%28nums%29%0A%20%20%20%20for%20i%20in%20range%28n%29%3A%0A%20%20%20%20%20%20%20%20d%20%3D%20digit%28nums%5Bi%5D%2C%20exp%29%0A%20%20%20%20%20%20%20%20counter%5Bd%5D%20%2B%3D%201%0A%20%20%20%20for%20i%20in%20range%281%2C%2010%29%3A%0A%20%20%20%20%20%20%20%20counter%5Bi%5D%20%2B%3D%20counter%5Bi%20-%201%5D%0A%20%20%20%20res%20%3D%20%5B0%5D%20%2A%20n%0A%20%20%20%20for%20i%20in%20range%28n%20-%201%2C%20-1%2C%20-1%29%3A%0A%20%20%20%20%20%20%20%20d%20%3D%20digit%28nums%5Bi%5D%2C%20exp%29%0A%20%20%20%20%20%20%20%20j%20%3D%20counter%5Bd%5D%20-%201%0A%20%20%20%20%20%20%20%20res%5Bj%5D%20%3D%20nums%5Bi%5D%0A%20%20%20%20%20%20%20%20counter%5Bd%5D%20-%3D%201%0A%20%20%20%20for%20i%20in%20range%28n%29%3A%0A%20%20%20%20%20%20%20%20nums%5Bi%5D%20%3D%20res%5Bi%5D%0A%0Adef%20radix_sort%28nums%3A%20list%5Bint%5D%29%3A%0A%20%20%20%20m%20%3D%20max%28nums%29%0A%20%20%20%20exp%20%3D%201%0A%20%20%20%20while%20exp%20%3C%3D%20m%3A%0A%20%20%20%20%20%20%20%20counting_sort_digit%28nums%2C%20exp%29%0A%20%20%20%20%20%20%20%20exp%20%2A%3D%2010%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20nums%20%3D%20%5B105%2C%20356%2C%20428%2C%20348%2C%20818%5D%0A%20%20%20%20radix_sort%28nums%29%0A%20%20%20%20print%28%27%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D0%BF%D0%BE%D1%80%D0%B0%D0%B7%D1%80%D1%8F%D0%B4%D0%BD%D0%BE%D0%B9%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8%20nums%20%3D%27%2C%20nums%29&cumulative=false&curInstr=6&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_sorting/selection_sort.md b/ru/codes/pythontutor/chapter_sorting/selection_sort.md new file mode 100644 index 000000000..ccbb7a1e9 --- /dev/null +++ b/ru/codes/pythontutor/chapter_sorting/selection_sort.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=def%20selection_sort%28nums%3A%20list%5Bint%5D%29%3A%0A%20%20%20%20%22%22%22%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC%22%22%22%0A%20%20%20%20n%20%3D%20len%28nums%29%0A%20%20%20%20%23%20%D0%92%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D0%B9%20%D1%86%D0%B8%D0%BA%D0%BB%3A%20%D0%BD%D0%B5%D0%BE%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%20%5Bi%2C%20n-1%5D%0A%20%20%20%20for%20i%20in%20range%28n%20-%201%29%3A%0A%20%20%20%20%20%20%20%20%23%20%D0%92%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B8%D0%B9%20%D1%86%D0%B8%D0%BA%D0%BB%3A%20%D0%BD%D0%B0%D0%B9%D1%82%D0%B8%20%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BD%D0%B5%D0%BE%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%BC%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B5%0A%20%20%20%20%20%20%20%20k%20%3D%20i%0A%20%20%20%20%20%20%20%20for%20j%20in%20range%28i%20%2B%201%2C%20n%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20nums%5Bj%5D%20%3C%20nums%5Bk%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20k%20%3D%20j%20%20%23%20%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%0A%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D0%BD%D1%8F%D1%82%D1%8C%20%D1%8D%D1%82%D0%BE%D1%82%20%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BC%D0%B5%D1%81%D1%82%D0%B0%D0%BC%D0%B8%20%D1%81%20%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%BC%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%BC%20%D0%BD%D0%B5%D0%BE%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B0%0A%20%20%20%20%20%20%20%20nums%5Bi%5D%2C%20nums%5Bk%5D%20%3D%20nums%5Bk%5D%2C%20nums%5Bi%5D%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20nums%20%3D%20%5B4%2C%201%2C%203%2C%201%2C%205%2C%202%5D%0A%20%20%20%20selection_sort%28nums%29%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC%20nums%20%3D%22%2C%20nums%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_stack_and_queue/array_queue.md b/ru/codes/pythontutor/chapter_stack_and_queue/array_queue.md new file mode 100644 index 000000000..bcefe15cc --- /dev/null +++ b/ru/codes/pythontutor/chapter_stack_and_queue/array_queue.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20ArrayQueue%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20size%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self._nums%3A%20list%5Bint%5D%20%3D%20%5B0%5D%20%2A%20size%0A%20%20%20%20%20%20%20%20self._front%3A%20int%20%3D%200%0A%20%20%20%20%20%20%20%20self._size%3A%20int%20%3D%200%0A%0A%20%20%20%20def%20capacity%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%20len%28self._nums%29%0A%0A%20%20%20%20def%20size%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%20self._size%0A%0A%20%20%20%20def%20is_empty%28self%29%20-%3E%20bool%3A%0A%20%20%20%20%20%20%20%20return%20self._size%20%3D%3D%200%0A%0A%20%20%20%20def%20push%28self%2C%20num%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20if%20self._size%20%3D%3D%20self.capacity%28%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20IndexError%28%27%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20%D0%B7%D0%B0%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B0%27%29%0A%20%20%20%20%20%20%20%20rear%3A%20int%20%3D%20%28self._front%20%2B%20self._size%29%20%25%20self.capacity%28%29%0A%20%20%20%20%20%20%20%20self._nums%5Brear%5D%20%3D%20num%0A%20%20%20%20%20%20%20%20self._size%20%2B%3D%201%0A%0A%20%20%20%20def%20pop%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20num%3A%20int%20%3D%20self.peek%28%29%0A%20%20%20%20%20%20%20%20self._front%20%3D%20%28self._front%20%2B%201%29%20%25%20self.capacity%28%29%0A%20%20%20%20%20%20%20%20self._size%20-%3D%201%0A%20%20%20%20%20%20%20%20return%20num%0A%0A%20%20%20%20def%20peek%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20if%20self.is_empty%28%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20IndexError%28%27%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20%D0%BF%D1%83%D1%81%D1%82%D0%B0%27%29%0A%20%20%20%20%20%20%20%20return%20self._nums%5Bself._front%5D%0A%0A%20%20%20%20def%20to_list%28self%29%20-%3E%20list%5Bint%5D%3A%0A%20%20%20%20%20%20%20%20res%20%3D%20%5B0%5D%20%2A%20self.size%28%29%0A%20%20%20%20%20%20%20%20j%3A%20int%20%3D%20self._front%0A%20%20%20%20%20%20%20%20for%20i%20in%20range%28self.size%28%29%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20res%5Bi%5D%20%3D%20self._nums%5Bj%20%25%20self.capacity%28%29%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20j%20%2B%3D%201%0A%20%20%20%20%20%20%20%20return%20res%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20queue%20%3D%20ArrayQueue%2810%29%0A%20%20%20%20queue.push%281%29%0A%20%20%20%20queue.push%283%29%0A%20%20%20%20queue.push%282%29%0A%20%20%20%20queue.push%285%29%0A%20%20%20%20queue.push%284%29%0A%20%20%20%20peek%20%3D%20queue.peek%28%29%0A%20%20%20%20print%28%27%D0%9F%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20peek%20%3D%27%2C%20peek%29%0A%20%20%20%20pop%20%3D%20queue.pop%28%29%0A%20%20%20%20print%28%27%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20pop%20%3D%27%2C%20pop%29%0A%20%20%20%20size%20%3D%20queue.size%28%29%0A%20%20%20%20print%28%27%D0%94%D0%BB%D0%B8%D0%BD%D0%B0%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20size%20%3D%27%2C%20size%29%0A%20%20%20%20is_empty%20%3D%20queue.is_empty%28%29%0A%20%20%20%20print%28%27%D0%9F%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20%3D%27%2C%20is_empty%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_stack_and_queue/array_stack.md b/ru/codes/pythontutor/chapter_stack_and_queue/array_stack.md new file mode 100644 index 000000000..f61ec3bb7 --- /dev/null +++ b/ru/codes/pythontutor/chapter_stack_and_queue/array_stack.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20ArrayStack%3A%0A%20%20%20%20%22%22%22%D0%A1%D1%82%D0%B5%D0%BA%20%D0%BD%D0%B0%20%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%22%22%22%0A%0A%20%20%20%20def%20__init__%28self%29%3A%0A%20%20%20%20%20%20%20%20%22%22%22%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80%22%22%22%0A%20%20%20%20%20%20%20%20self._stack%3A%20list%5Bint%5D%20%3D%20%5B%5D%0A%0A%20%20%20%20def%20size%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20%22%22%22%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%22%22%22%0A%20%20%20%20%20%20%20%20return%20len%28self._stack%29%0A%0A%20%20%20%20def%20is_empty%28self%29%20-%3E%20bool%3A%0A%20%20%20%20%20%20%20%20%22%22%22%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0%2C%20%D0%BF%D1%83%D1%81%D1%82%20%D0%BB%D0%B8%20%D1%81%D1%82%D0%B5%D0%BA%22%22%22%0A%20%20%20%20%20%20%20%20return%20self._stack%20%3D%3D%20%5B%5D%0A%0A%20%20%20%20def%20push%28self%2C%20item%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20%22%22%22%D0%9F%D0%BE%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%B2%20%D1%81%D1%82%D0%B5%D0%BA%22%22%22%0A%20%20%20%20%20%20%20%20self._stack.append%28item%29%0A%0A%20%20%20%20def%20pop%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20%22%22%22%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D0%B8%D0%B7%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%22%22%22%0A%20%20%20%20%20%20%20%20if%20self.is_empty%28%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20IndexError%28%22%D1%81%D1%82%D0%B5%D0%BA%20%D0%BF%D1%83%D1%81%D1%82%22%29%0A%20%20%20%20%20%20%20%20return%20self._stack.pop%28%29%0A%0A%20%20%20%20def%20peek%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20%22%22%22%D0%94%D0%BE%D1%81%D1%82%D1%83%D0%BF%20%D0%BA%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D0%BC%D1%83%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%83%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%22%22%22%0A%20%20%20%20%20%20%20%20if%20self.is_empty%28%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20IndexError%28%22%D1%81%D1%82%D0%B5%D0%BA%20%D0%BF%D1%83%D1%81%D1%82%22%29%0A%20%20%20%20%20%20%20%20return%20self._stack%5B-1%5D%0A%0A%20%20%20%20def%20to_list%28self%29%20-%3E%20list%5Bint%5D%3A%0A%20%20%20%20%20%20%20%20%22%22%22%D0%92%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%B4%D0%BB%D1%8F%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0%22%22%22%0A%20%20%20%20%20%20%20%20return%20self._stack%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%0A%20%20%20%20stack%20%3D%20ArrayStack%28%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20%D0%B2%20%D1%81%D1%82%D0%B5%D0%BA%0A%20%20%20%20stack.push%281%29%0A%20%20%20%20stack.push%283%29%0A%20%20%20%20stack.push%282%29%0A%20%20%20%20stack.push%285%29%0A%20%20%20%20stack.push%284%29%0A%20%20%20%20print%28%22%D0%A1%D1%82%D0%B5%D0%BA%20stack%20%3D%22%2C%20stack.to_list%28%29%29%0A%0A%20%20%20%20%23%20%D0%94%D0%BE%D1%81%D1%82%D1%83%D0%BF%20%D0%BA%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D0%BC%D1%83%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%83%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%0A%20%20%20%20peek%20%3D%20stack.peek%28%29%0A%20%20%20%20print%28%22%D0%92%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20peek%20%3D%22%2C%20peek%29%0A%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20%D0%B8%D0%B7%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%0A%20%20%20%20pop%20%3D%20stack.pop%28%29%0A%20%20%20%20print%28%22%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20pop%20%3D%22%2C%20pop%29%0A%20%20%20%20print%28%22stack%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%3D%22%2C%20stack.to_list%28%29%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%0A%20%20%20%20size%20%3D%20stack.size%28%29%0A%20%20%20%20print%28%22%D0%94%D0%BB%D0%B8%D0%BD%D0%B0%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%20size%20%3D%22%2C%20size%29%0A%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BF%D1%83%D1%81%D1%82%D0%BE%D1%82%D1%83%0A%20%20%20%20is_empty%20%3D%20stack.is_empty%28%29%0A%20%20%20%20print%28%22%D0%9F%D1%83%D1%81%D1%82%20%D0%BB%D0%B8%20%D1%81%D1%82%D0%B5%D0%BA%20%3D%22%2C%20is_empty%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_stack_and_queue/linkedlist_queue.md b/ru/codes/pythontutor/chapter_stack_and_queue/linkedlist_queue.md new file mode 100644 index 000000000..d4fb15b29 --- /dev/null +++ b/ru/codes/pythontutor/chapter_stack_and_queue/linkedlist_queue.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%0A%0Aclass%20LinkedListQueue%3A%0A%0A%20%20%20%20def%20__init__%28self%29%3A%0A%20%20%20%20%20%20%20%20self._front%3A%20ListNode%20%7C%20None%20%3D%20None%0A%20%20%20%20%20%20%20%20self._rear%3A%20ListNode%20%7C%20None%20%3D%20None%0A%20%20%20%20%20%20%20%20self._size%3A%20int%20%3D%200%0A%0A%20%20%20%20def%20size%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%20self._size%0A%0A%20%20%20%20def%20is_empty%28self%29%20-%3E%20bool%3A%0A%20%20%20%20%20%20%20%20return%20not%20self._front%0A%0A%20%20%20%20def%20push%28self%2C%20num%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20node%20%3D%20ListNode%28num%29%0A%20%20%20%20%20%20%20%20if%20self._front%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self._front%20%3D%20node%0A%20%20%20%20%20%20%20%20%20%20%20%20self._rear%20%3D%20node%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self._rear.next%20%3D%20node%0A%20%20%20%20%20%20%20%20%20%20%20%20self._rear%20%3D%20node%0A%20%20%20%20%20%20%20%20self._size%20%2B%3D%201%0A%0A%20%20%20%20def%20pop%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20num%20%3D%20self.peek%28%29%0A%20%20%20%20%20%20%20%20self._front%20%3D%20self._front.next%0A%20%20%20%20%20%20%20%20self._size%20-%3D%201%0A%20%20%20%20%20%20%20%20return%20num%0A%0A%20%20%20%20def%20peek%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20if%20self.is_empty%28%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20IndexError%28%27%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20%D0%BF%D1%83%D1%81%D1%82%D0%B0%27%29%0A%20%20%20%20%20%20%20%20return%20self._front.val%0A%0A%20%20%20%20def%20to_list%28self%29%20-%3E%20list%5Bint%5D%3A%0A%20%20%20%20%20%20%20%20queue%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20temp%20%3D%20self._front%0A%20%20%20%20%20%20%20%20while%20temp%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20queue.append%28temp.val%29%0A%20%20%20%20%20%20%20%20%20%20%20%20temp%20%3D%20temp.next%0A%20%20%20%20%20%20%20%20return%20queue%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20queue%20%3D%20LinkedListQueue%28%29%0A%20%20%20%20queue.push%281%29%0A%20%20%20%20queue.push%283%29%0A%20%20%20%20queue.push%282%29%0A%20%20%20%20queue.push%285%29%0A%20%20%20%20queue.push%284%29%0A%20%20%20%20print%28%27%D0%9E%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20queue%20%3D%27%2C%20queue.to_list%28%29%29%0A%20%20%20%20peek%20%3D%20queue.peek%28%29%0A%20%20%20%20print%28%27%D0%9F%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20front%20%3D%27%2C%20peek%29%0A%20%20%20%20pop_front%20%3D%20queue.pop%28%29%0A%20%20%20%20print%28%27%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20pop%20%3D%27%2C%20pop_front%29%0A%20%20%20%20print%28%27queue%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%3D%27%2C%20queue.to_list%28%29%29%0A%20%20%20%20size%20%3D%20queue.size%28%29%0A%20%20%20%20print%28%27%D0%94%D0%BB%D0%B8%D0%BD%D0%B0%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20size%20%3D%27%2C%20size%29%0A%20%20%20%20is_empty%20%3D%20queue.is_empty%28%29%0A%20%20%20%20print%28%27%D0%9F%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20%3D%27%2C%20is_empty%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_stack_and_queue/linkedlist_stack.md b/ru/codes/pythontutor/chapter_stack_and_queue/linkedlist_stack.md new file mode 100644 index 000000000..4d6c87c9b --- /dev/null +++ b/ru/codes/pythontutor/chapter_stack_and_queue/linkedlist_stack.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%0A%0Aclass%20LinkedListStack%3A%0A%0A%20%20%20%20def%20__init__%28self%29%3A%0A%20%20%20%20%20%20%20%20self._peek%3A%20ListNode%20%7C%20None%20%3D%20None%0A%20%20%20%20%20%20%20%20self._size%3A%20int%20%3D%200%0A%0A%20%20%20%20def%20size%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20return%20self._size%0A%0A%20%20%20%20def%20is_empty%28self%29%20-%3E%20bool%3A%0A%20%20%20%20%20%20%20%20return%20not%20self._peek%0A%0A%20%20%20%20def%20push%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20node%20%3D%20ListNode%28val%29%0A%20%20%20%20%20%20%20%20node.next%20%3D%20self._peek%0A%20%20%20%20%20%20%20%20self._peek%20%3D%20node%0A%20%20%20%20%20%20%20%20self._size%20%2B%3D%201%0A%0A%20%20%20%20def%20pop%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20num%20%3D%20self.peek%28%29%0A%20%20%20%20%20%20%20%20self._peek%20%3D%20self._peek.next%0A%20%20%20%20%20%20%20%20self._size%20-%3D%201%0A%20%20%20%20%20%20%20%20return%20num%0A%0A%20%20%20%20def%20peek%28self%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20if%20self.is_empty%28%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20IndexError%28%27%D1%81%D1%82%D0%B5%D0%BA%20%D0%BF%D1%83%D1%81%D1%82%27%29%0A%20%20%20%20%20%20%20%20return%20self._peek.val%0A%0A%20%20%20%20def%20to_list%28self%29%20-%3E%20list%5Bint%5D%3A%0A%20%20%20%20%20%20%20%20arr%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20node%20%3D%20self._peek%0A%20%20%20%20%20%20%20%20while%20node%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20arr.append%28node.val%29%0A%20%20%20%20%20%20%20%20%20%20%20%20node%20%3D%20node.next%0A%20%20%20%20%20%20%20%20arr.reverse%28%29%0A%20%20%20%20%20%20%20%20return%20arr%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20stack%20%3D%20LinkedListStack%28%29%0A%20%20%20%20stack.push%281%29%0A%20%20%20%20stack.push%283%29%0A%20%20%20%20stack.push%282%29%0A%20%20%20%20stack.push%285%29%0A%20%20%20%20stack.push%284%29%0A%20%20%20%20print%28%27%D0%A1%D1%82%D0%B5%D0%BA%20stack%20%3D%27%2C%20stack.to_list%28%29%29%0A%20%20%20%20peek%20%3D%20stack.peek%28%29%0A%20%20%20%20print%28%27%D0%92%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20peek%20%3D%27%2C%20peek%29%0A%20%20%20%20pop%20%3D%20stack.pop%28%29%0A%20%20%20%20print%28%27%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20pop%20%3D%27%2C%20pop%29%0A%20%20%20%20print%28%27stack%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%3D%27%2C%20stack.to_list%28%29%29%0A%20%20%20%20size%20%3D%20stack.size%28%29%0A%20%20%20%20print%28%27%D0%94%D0%BB%D0%B8%D0%BD%D0%B0%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%20size%20%3D%27%2C%20size%29%0A%20%20%20%20is_empty%20%3D%20stack.is_empty%28%29%0A%20%20%20%20print%28%27%D0%9F%D1%83%D1%81%D1%82%20%D0%BB%D0%B8%20%D1%81%D1%82%D0%B5%D0%BA%20%3D%27%2C%20is_empty%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_tree/array_binary_tree.md b/ru/codes/pythontutor/chapter_tree/array_binary_tree.md new file mode 100644 index 000000000..a6a62b293 --- /dev/null +++ b/ru/codes/pythontutor/chapter_tree/array_binary_tree.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20val%29%3A%0A%20%20%20%20%20%20%20%20self.val%20%3D%20val%0A%20%20%20%20%20%20%20%20self.left%20%3D%20None%0A%20%20%20%20%20%20%20%20self.right%20%3D%20None%0A%0Aclass%20ArrayBinaryTree%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20arr%3A%20list%5Bint%20%7C%20None%5D%29%3A%0A%20%20%20%20%20%20%20%20self._tree%20%3D%20list%28arr%29%0A%0A%20%20%20%20def%20size%28self%29%3A%0A%20%20%20%20%20%20%20%20return%20len%28self._tree%29%0A%0A%20%20%20%20def%20val%28self%2C%20i%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20if%20i%20%3C%200%20or%20i%20%3E%3D%20self.size%28%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%20%20%20%20return%20self._tree%5Bi%5D%0A%0A%20%20%20%20def%20left%28self%2C%20i%3A%20int%29%20-%3E%20int%20%7C%20None%3A%0A%20%20%20%20%20%20%20%20return%202%20%2A%20i%20%2B%201%0A%0A%20%20%20%20def%20right%28self%2C%20i%3A%20int%29%20-%3E%20int%20%7C%20None%3A%0A%20%20%20%20%20%20%20%20return%202%20%2A%20i%20%2B%202%0A%0A%20%20%20%20def%20parent%28self%2C%20i%3A%20int%29%20-%3E%20int%20%7C%20None%3A%0A%20%20%20%20%20%20%20%20return%20%28i%20-%201%29%20%2F%2F%202%0A%0A%20%20%20%20def%20level_order%28self%29%20-%3E%20list%5Bint%5D%3A%0A%20%20%20%20%20%20%20%20self.res%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20i%20in%20range%28self.size%28%29%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20self.val%28i%29%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.res.append%28self.val%28i%29%29%0A%20%20%20%20%20%20%20%20return%20self.res%0A%0A%20%20%20%20def%20dfs%28self%2C%20i%3A%20int%2C%20order%3A%20str%29%3A%0A%20%20%20%20%20%20%20%20if%20self.val%28i%29%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20if%20order%20%3D%3D%20%27pre%27%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.res.append%28self.val%28i%29%29%0A%20%20%20%20%20%20%20%20self.dfs%28self.left%28i%29%2C%20order%29%0A%20%20%20%20%20%20%20%20if%20order%20%3D%3D%20%27in%27%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.res.append%28self.val%28i%29%29%0A%20%20%20%20%20%20%20%20self.dfs%28self.right%28i%29%2C%20order%29%0A%20%20%20%20%20%20%20%20if%20order%20%3D%3D%20%27post%27%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.res.append%28self.val%28i%29%29%0A%0A%20%20%20%20def%20pre_order%28self%29%20-%3E%20list%5Bint%5D%3A%0A%20%20%20%20%20%20%20%20self.res%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20self.dfs%280%2C%20order%3D%27pre%27%29%0A%20%20%20%20%20%20%20%20return%20self.res%0A%0A%20%20%20%20def%20in_order%28self%29%20-%3E%20list%5Bint%5D%3A%0A%20%20%20%20%20%20%20%20self.res%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20self.dfs%280%2C%20order%3D%27in%27%29%0A%20%20%20%20%20%20%20%20return%20self.res%0A%0A%20%20%20%20def%20post_order%28self%29%20-%3E%20list%5Bint%5D%3A%0A%20%20%20%20%20%20%20%20self.res%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20self.dfs%280%2C%20order%3D%27post%27%29%0A%20%20%20%20%20%20%20%20return%20self.res%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20arr%20%3D%20%5B1%2C%202%2C%203%2C%204%2C%20None%2C%206%2C%20None%5D%0A%20%20%20%20abt%20%3D%20ArrayBinaryTree%28arr%29%0A%20%20%20%20i%20%3D%201%0A%20%20%20%20%28l%2C%20r%2C%20p%29%20%3D%20%28abt.left%28i%29%2C%20abt.right%28i%29%2C%20abt.parent%28i%29%29%0A%20%20%20%20res%20%3D%20abt.level_order%28%29%0A%20%20%20%20res%20%3D%20abt.pre_order%28%29%0A%20%20%20%20res%20%3D%20abt.in_order%28%29%0A%20%20%20%20res%20%3D%20abt.post_order%28%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_tree/binary_search_tree.md b/ru/codes/pythontutor/chapter_tree/binary_search_tree.md new file mode 100644 index 000000000..d6584b2f8 --- /dev/null +++ b/ru/codes/pythontutor/chapter_tree/binary_search_tree.md @@ -0,0 +1,14 @@ + + + +https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20val%29%3A%0A%20%20%20%20%20%20%20%20self.val%20%3D%20val%0A%20%20%20%20%20%20%20%20self.left%20%3D%20None%0A%20%20%20%20%20%20%20%20self.right%20%3D%20None%0A%0Aclass%20BinarySearchTree%3A%0A%0A%20%20%20%20def%20__init__%28self%29%3A%0A%20%20%20%20%20%20%20%20self._root%20%3D%20None%0A%0A%20%20%20%20def%20search%28self%2C%20num%3A%20int%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%20%20%20%20cur%20%3D%20self._root%0A%20%20%20%20%20%20%20%20while%20cur%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20cur.val%20%3C%20num%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cur%20%3D%20cur.right%0A%20%20%20%20%20%20%20%20%20%20%20%20elif%20cur.val%20%3E%20num%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cur%20%3D%20cur.left%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20return%20cur%0A%0A%20%20%20%20def%20insert%28self%2C%20num%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20if%20self._root%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self._root%20%3D%20TreeNode%28num%29%0A%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%28cur%2C%20pre%29%20%3D%20%28self._root%2C%20None%29%0A%20%20%20%20%20%20%20%20while%20cur%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20cur.val%20%3D%3D%20num%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%20%20pre%20%3D%20cur%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20cur.val%20%3C%20num%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cur%20%3D%20cur.right%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cur%20%3D%20cur.left%0A%20%20%20%20%20%20%20%20node%20%3D%20TreeNode%28num%29%0A%20%20%20%20%20%20%20%20if%20pre.val%20%3C%20num%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20pre.right%20%3D%20node%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20pre.left%20%3D%20node%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20bst%20%3D%20BinarySearchTree%28%29%0A%20%20%20%20nums%20%3D%20%5B4%2C%202%2C%206%2C%201%2C%203%2C%205%2C%207%5D%0A%20%20%20%20for%20num%20in%20nums%3A%0A%20%20%20%20%20%20%20%20bst.insert%28num%29%0A%20%20%20%20node%20%3D%20bst.search%287%29%0A%20%20%20%20print%28%27%5Cn%D0%9D%D0%B0%D0%B9%D0%B4%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%20%D1%83%D0%B7%D0%BB%D0%B0%20%3D%20%7B%7D%2C%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%20%3D%20%7B%7D%27.format%28node%2C%20node.val%29%29&cumulative=false&curInstr=162&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%29%3A%0A%20%20%20%20%20%20%20%20self.val%20%3D%20val%0A%20%20%20%20%20%20%20%20self.left%20%3D%20None%0A%20%20%20%20%20%20%20%20self.right%20%3D%20None%0A%0A%0Aclass%20BinarySearchTree%3A%0A%20%20%20%20%22%22%22%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0%22%22%22%0A%0A%20%20%20%20def%20__init__%28self%29%3A%0A%20%20%20%20%20%20%20%20%22%22%22%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80%22%22%22%0A%20%20%20%20%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BF%D1%83%D1%81%D1%82%D0%BE%D0%B5%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%0A%20%20%20%20%20%20%20%20self._root%20%3D%20None%0A%0A%20%20%20%20def%20insert%28self%2C%20num%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20%22%22%22%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%20%D1%83%D0%B7%D0%BB%D0%B0%22%22%22%0A%20%20%20%20%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%20%D0%BF%D1%83%D1%81%D1%82%D0%BE%2C%20%D0%B8%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BA%D0%BE%D1%80%D0%BD%D0%B5%D0%B2%D0%BE%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20%20%20%20%20if%20self._root%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self._root%20%3D%20TreeNode%28num%29%0A%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%23%20%D0%98%D1%81%D0%BA%D0%B0%D1%82%D1%8C%20%D0%B2%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B5%20%D0%B8%20%D0%B2%D1%8B%D0%B9%D1%82%D0%B8%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%BF%D1%80%D0%BE%D1%85%D0%BE%D0%B4%D0%B0%20%D0%B7%D0%B0%20%D0%BB%D0%B8%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20%20%20%20%20cur%2C%20pre%20%3D%20self._root%2C%20None%0A%20%20%20%20%20%20%20%20while%20cur%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%9D%D0%B0%D0%B9%D1%82%D0%B8%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%8E%D1%89%D0%B8%D0%B9%D1%81%D1%8F%20%D1%83%D0%B7%D0%B5%D0%BB%20%D0%B8%20%D1%81%D1%80%D0%B0%D0%B7%D1%83%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20cur.val%20%3D%3D%20num%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%20%20pre%20%3D%20cur%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8F%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%BC%20%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5%20cur%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20cur.val%20%3C%20num%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cur%20%3D%20cur.right%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%9F%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8F%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%BC%20%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5%20cur%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cur%20%3D%20cur.left%0A%20%20%20%20%20%20%20%20%23%20%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20node%20%3D%20TreeNode%28num%29%0A%20%20%20%20%20%20%20%20if%20pre.val%20%3C%20num%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20pre.right%20%3D%20node%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20pre.left%20%3D%20node%0A%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0%0A%20%20%20%20bst%20%3D%20BinarySearchTree%28%29%0A%20%20%20%20nums%20%3D%20%5B4%2C%202%2C%206%2C%201%2C%203%2C%205%2C%207%5D%0A%20%20%20%20for%20num%20in%20nums%3A%0A%20%20%20%20%20%20%20%20bst.insert%28num%29%0A%0A%20%20%20%20%23%20%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20bst.insert%2816%29&cumulative=false&curInstr=162&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + + +https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20val%29%3A%0A%20%20%20%20%20%20%20%20self.val%20%3D%20val%0A%20%20%20%20%20%20%20%20self.left%20%3D%20None%0A%20%20%20%20%20%20%20%20self.right%20%3D%20None%0A%0Aclass%20BinarySearchTree%3A%0A%0A%20%20%20%20def%20__init__%28self%29%3A%0A%20%20%20%20%20%20%20%20self._root%20%3D%20None%0A%0A%20%20%20%20def%20insert%28self%2C%20num%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20if%20self._root%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self._root%20%3D%20TreeNode%28num%29%0A%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%28cur%2C%20pre%29%20%3D%20%28self._root%2C%20None%29%0A%20%20%20%20%20%20%20%20while%20cur%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20cur.val%20%3D%3D%20num%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%20%20pre%20%3D%20cur%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20cur.val%20%3C%20num%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cur%20%3D%20cur.right%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cur%20%3D%20cur.left%0A%20%20%20%20%20%20%20%20node%20%3D%20TreeNode%28num%29%0A%20%20%20%20%20%20%20%20if%20pre.val%20%3C%20num%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20pre.right%20%3D%20node%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20pre.left%20%3D%20node%0A%0A%20%20%20%20def%20remove%28self%2C%20num%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20if%20self._root%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%28cur%2C%20pre%29%20%3D%20%28self._root%2C%20None%29%0A%20%20%20%20%20%20%20%20while%20cur%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20cur.val%20%3D%3D%20num%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20%20%20%20%20pre%20%3D%20cur%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20cur.val%20%3C%20num%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cur%20%3D%20cur.right%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cur%20%3D%20cur.left%0A%20%20%20%20%20%20%20%20if%20cur%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20if%20cur.left%20is%20None%20or%20cur.right%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20child%20%3D%20cur.left%20or%20cur.right%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20cur%20%21%3D%20self._root%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20pre.left%20%3D%3D%20cur%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pre.left%20%3D%20child%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pre.right%20%3D%20child%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self._root%20%3D%20child%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20tmp%3A%20TreeNode%20%3D%20cur.right%0A%20%20%20%20%20%20%20%20%20%20%20%20while%20tmp.left%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tmp%20%3D%20tmp.left%0A%20%20%20%20%20%20%20%20%20%20%20%20self.remove%28tmp.val%29%0A%20%20%20%20%20%20%20%20%20%20%20%20cur.val%20%3D%20tmp.val%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20bst%20%3D%20BinarySearchTree%28%29%0A%20%20%20%20nums%20%3D%20%5B4%2C%202%2C%206%2C%201%2C%203%2C%205%2C%207%5D%0A%20%20%20%20for%20num%20in%20nums%3A%0A%20%20%20%20%20%20%20%20bst.insert%28num%29%0A%20%20%20%20bst.remove%281%29%0A%20%20%20%20bst.remove%282%29%0A%20%20%20%20bst.remove%284%29&cumulative=false&curInstr=162&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_tree/binary_tree_bfs.md b/ru/codes/pythontutor/chapter_tree/binary_tree_bfs.md new file mode 100644 index 000000000..580b6e2ad --- /dev/null +++ b/ru/codes/pythontutor/chapter_tree/binary_tree_bfs.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=from%20collections%20import%20deque%0A%0Aclass%20TreeNode%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%0A%0Adef%20list_to_tree_dfs%28arr%3A%20list%5Bint%5D%2C%20i%3A%20int%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20if%20i%20%3C%200%20or%20i%20%3E%3D%20len%28arr%29%20or%20arr%5Bi%5D%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20root%20%3D%20TreeNode%28arr%5Bi%5D%29%0A%20%20%20%20root.left%20%3D%20list_to_tree_dfs%28arr%2C%202%20%2A%20i%20%2B%201%29%0A%20%20%20%20root.right%20%3D%20list_to_tree_dfs%28arr%2C%202%20%2A%20i%20%2B%202%29%0A%20%20%20%20return%20root%0A%0Adef%20list_to_tree%28arr%3A%20list%5Bint%5D%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20return%20list_to_tree_dfs%28arr%2C%200%29%0A%0Adef%20level_order%28root%3A%20TreeNode%20%7C%20None%29%20-%3E%20list%5Bint%5D%3A%0A%20%20%20%20queue%3A%20deque%5BTreeNode%5D%20%3D%20deque%28%29%0A%20%20%20%20queue.append%28root%29%0A%20%20%20%20res%20%3D%20%5B%5D%0A%20%20%20%20while%20queue%3A%0A%20%20%20%20%20%20%20%20node%3A%20TreeNode%20%3D%20queue.popleft%28%29%0A%20%20%20%20%20%20%20%20res.append%28node.val%29%0A%20%20%20%20%20%20%20%20if%20node.left%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20queue.append%28node.left%29%0A%20%20%20%20%20%20%20%20if%20node.right%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20queue.append%28node.right%29%0A%20%20%20%20return%20res%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20root%20%3D%20list_to_tree%28arr%3D%5B1%2C%202%2C%203%2C%204%2C%205%2C%206%2C%207%5D%29%0A%20%20%20%20res%20%3D%20level_order%28root%29%0A%20%20%20%20print%28%27%5Cn%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8%20%D1%83%D0%B7%D0%BB%D0%BE%D0%B2%20%D0%BF%D1%80%D0%B8%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B5%20%D0%B2%20%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83%20%3D%20%27%2C%20res%29&cumulative=false&curInstr=127&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/pythontutor/chapter_tree/binary_tree_dfs.md b/ru/codes/pythontutor/chapter_tree/binary_tree_dfs.md new file mode 100644 index 000000000..510e224e2 --- /dev/null +++ b/ru/codes/pythontutor/chapter_tree/binary_tree_dfs.md @@ -0,0 +1,8 @@ + + + +https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%0A%0Adef%20list_to_tree_dfs%28arr%3A%20list%5Bint%5D%2C%20i%3A%20int%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20if%20i%20%3C%200%20or%20i%20%3E%3D%20len%28arr%29%20or%20arr%5Bi%5D%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20root%20%3D%20TreeNode%28arr%5Bi%5D%29%0A%20%20%20%20root.left%20%3D%20list_to_tree_dfs%28arr%2C%202%20%2A%20i%20%2B%201%29%0A%20%20%20%20root.right%20%3D%20list_to_tree_dfs%28arr%2C%202%20%2A%20i%20%2B%202%29%0A%20%20%20%20return%20root%0A%0Adef%20list_to_tree%28arr%3A%20list%5Bint%5D%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20return%20list_to_tree_dfs%28arr%2C%200%29%0A%0Adef%20pre_order%28root%3A%20TreeNode%20%7C%20None%29%3A%0A%20%20%20%20if%20root%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20res.append%28root.val%29%0A%20%20%20%20pre_order%28root%3Droot.left%29%0A%20%20%20%20pre_order%28root%3Droot.right%29%0A%0Adef%20in_order%28root%3A%20TreeNode%20%7C%20None%29%3A%0A%20%20%20%20if%20root%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20in_order%28root%3Droot.left%29%0A%20%20%20%20res.append%28root.val%29%0A%20%20%20%20in_order%28root%3Droot.right%29%0A%0Adef%20post_order%28root%3A%20TreeNode%20%7C%20None%29%3A%0A%20%20%20%20if%20root%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20post_order%28root%3Droot.left%29%0A%20%20%20%20post_order%28root%3Droot.right%29%0A%20%20%20%20res.append%28root.val%29%0A%27Driver%20Code%27%0Aif%20__name__%20%3D%3D%20%27__main__%27%3A%0A%20%20%20%20root%20%3D%20list_to_tree%28arr%3D%5B1%2C%202%2C%203%2C%204%2C%205%2C%206%2C%207%5D%29%0A%20%20%20%20res%20%3D%20%5B%5D%0A%20%20%20%20pre_order%28root%29%0A%20%20%20%20print%28%27%5Cn%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8%20%D1%83%D0%B7%D0%BB%D0%BE%D0%B2%20%D0%BF%D1%80%D0%B8%20%D0%BF%D1%80%D0%B5%D0%B4%D0%B2%D0%B0%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B5%20%3D%20%27%2C%20res%29%0A%20%20%20%20res.clear%28%29%0A%20%20%20%20in_order%28root%29%0A%20%20%20%20print%28%27%5Cn%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8%20%D1%83%D0%B7%D0%BB%D0%BE%D0%B2%20%D0%BF%D1%80%D0%B8%20%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%BC%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B5%20%3D%20%27%2C%20res%29%0A%20%20%20%20res.clear%28%29%0A%20%20%20%20post_order%28root%29%0A%20%20%20%20print%28%27%5Cn%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%B8%20%D1%83%D0%B7%D0%BB%D0%BE%D0%B2%20%D0%BF%D1%80%D0%B8%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%BC%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B5%20%3D%20%27%2C%20res%29&cumulative=false&curInstr=129&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/codes/ruby/chapter_array_and_linkedlist/array.rb b/ru/codes/ruby/chapter_array_and_linkedlist/array.rb new file mode 100644 index 000000000..125c61b4f --- /dev/null +++ b/ru/codes/ruby/chapter_array_and_linkedlist/array.rb @@ -0,0 +1,108 @@ +=begin +File: array.rb +Created Time: 2024-03-18 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Случайный доступ к элементу ### +def random_access(nums) + # Случайным образом выбрать число из интервала [0, nums.length) + random_index = Random.rand(0...nums.length) + + # Получить и вернуть случайный элемент + nums[random_index] +end + + +# ## Увеличить длину массива ### +# Обратите внимание: Array в Ruby является динамическим массивом и может быть расширен напрямую +# Для удобства обучения эта функция рассматривает Array как массив неизменяемой длины +def extend(nums, enlarge) + # Инициализировать массив увеличенной длины + res = Array.new(nums.length + enlarge, 0) + + # Скопировать все элементы исходного массива в новый массив + for i in 0...nums.length + res[i] = nums[i] + end + + # Вернуть новый массив после расширения + res +end + +# ## Вставка элемента num по индексу index в массив ### +def insert(nums, num, index) + # Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад + for i in (nums.length - 1).downto(index + 1) + nums[i] = nums[i - 1] + end + + # Присвоить num элементу по индексу index + nums[index] = num +end + + +# ## Удаление элемента по индексу index ### +def remove(nums, index) + # Сдвинуть все элементы после индекса index на одну позицию вперед + for i in index...(nums.length - 1) + nums[i] = nums[i + 1] + end +end + +# ## Обход массива ### +def traverse(nums) + count = 0 + + # Обход массива по индексам + for i in 0...nums.length + count += nums[i] + end + + # Непосредственно обходить элементы массива + for num in nums + count += num + end +end + +# ## Поиск заданного элемента в массиве ### +def find(nums, target) + for i in 0...nums.length + return i if nums[i] == target + end + + -1 +end + + +### Driver Code ### +if __FILE__ == $0 + # Инициализация массива + arr = Array.new(5, 0) + puts "Массив arr = #{arr}" + nums = [1, 3, 2, 5, 4] + puts "Массив nums = #{nums}" + + # Случайный доступ + random_num = random_access(nums) + puts "Случайный элемент из nums = #{random_num}" + + # Расширение длины + nums = extend(nums, 3) + puts "После увеличения длины массива до 8 nums = #{nums}" + + # Вставка элемента + insert(nums, 6, 3) + puts "После вставки числа 6 по индексу 3 nums = #{nums}" + + # Удаление элемента + remove(nums, 2) + puts "После удаления элемента по индексу 2 nums = #{nums}" + + # Обход массива + traverse(nums) + + # Поиск элемента + index = find(nums, 3) + puts "Поиск элемента 3 в nums: индекс = #{index}" +end diff --git a/ru/codes/ruby/chapter_array_and_linkedlist/linked_list.rb b/ru/codes/ruby/chapter_array_and_linkedlist/linked_list.rb new file mode 100644 index 000000000..edf998d28 --- /dev/null +++ b/ru/codes/ruby/chapter_array_and_linkedlist/linked_list.rb @@ -0,0 +1,83 @@ +=begin +File: linked_list.rb +Created Time: 2024-03-18 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/list_node' +require_relative '../utils/print_util' + +# ## Вставка узла _p после узла n0 в связном списке ### +# В Ruby `p` — встроенная функция, а `P` — константа, поэтому вместо этого можно использовать `_p` +def insert(n0, _p) + n1 = n0.next + _p.next = n1 + n0.next = _p +end + +# ## Удаление первого узла после узла n0 в связном списке ### +def remove(n0) + return if n0.next.nil? + + # n0 -> remove_node -> n1 + remove_node = n0.next + n1 = remove_node.next + n0.next = n1 +end + +# ## Доступ к узлу связного списка по индексу index ### +def access(head, index) + for i in 0...index + return nil if head.nil? + head = head.next + end + + head +end + +# ## Поиск первого узла со значением target в связном списке ### +def find(head, target) + index = 0 + while head + return index if head.val == target + head = head.next + index += 1 + end + + -1 +end + +### Driver Code ### +if __FILE__ == $0 + # Инициализация связного списка + # Инициализация всех узлов + n0 = ListNode.new(1) + n1 = ListNode.new(3) + n2 = ListNode.new(2) + n3 = ListNode.new(5) + n4 = ListNode.new(4) + # Построить ссылки между узлами + n0.next = n1 + n1.next = n2 + n2.next = n3 + n3.next = n4 + puts "Исходный связный список" + print_linked_list(n0) + + # Вставка узла + insert(n0, ListNode.new(0)) + print_linked_list n0 + + # Удаление узла + remove(n0) + puts "Связный список после удаления узла" + print_linked_list(n0) + + # Доступ к узлу + node = access(n0, 3) + puts "Значение узла по индексу 3 в связном списке = #{node.val}" + + # Поиск узла + index = find(n0, 2) + puts "Индекс узла со значением 2 в связном списке = #{index}" +end diff --git a/ru/codes/ruby/chapter_array_and_linkedlist/list.rb b/ru/codes/ruby/chapter_array_and_linkedlist/list.rb new file mode 100644 index 000000000..296c9f6f2 --- /dev/null +++ b/ru/codes/ruby/chapter_array_and_linkedlist/list.rb @@ -0,0 +1,60 @@ +=begin +File: list.rb +Created Time: 2024-03-18 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +### Driver Code ### +if __FILE__ == $0 + # Инициализация списка + nums = [1, 3, 2, 5, 4] + puts "Список nums = #{nums}" + + # Доступ к элементу + num = nums[1] + puts "Элемент по индексу 1: num = #{num}" + + # Обновление элемента + nums[1] = 0 + puts "После обновления элемента по индексу 1 до 0 nums = #{nums}" + + # Очистить список + nums.clear + puts "После очистки списка nums = #{nums}" + + # Добавление элемента в конец + nums << 1 + nums << 3 + nums << 2 + nums << 5 + nums << 4 + puts "После добавления элементов nums = #{nums}" + + # Вставка элемента в середину + nums.insert(3, 6) + puts "После вставки элемента 6 по индексу 3 nums = #{nums}" + + # Удаление элемента + nums.delete_at(3) + puts "После удаления элемента по индексу 3 nums = #{nums}" + + # Обходить список по индексам + count = 0 + for i in 0...nums.length + count += nums[i] + end + + # Непосредственно обходить элементы списка + count = 0 + nums.each do |x| + count += x + end + + # Объединить два списка + nums1 = [6, 8, 7, 10, 9] + nums += nums1 + puts "После конкатенации списка nums1 к nums nums = #{nums}" + + nums = nums.sort { |a, b| a <=> b } + puts "После сортировки списка nums = #{nums}" +end diff --git a/ru/codes/ruby/chapter_array_and_linkedlist/my_list.rb b/ru/codes/ruby/chapter_array_and_linkedlist/my_list.rb new file mode 100644 index 000000000..db44c65ed --- /dev/null +++ b/ru/codes/ruby/chapter_array_and_linkedlist/my_list.rb @@ -0,0 +1,132 @@ +=begin +File: my_list.rb +Created Time: 2024-03-18 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Класс списка ### +class MyList + attr_reader :size # Получить длину списка (текущее число элементов) + attr_reader :capacity # Получить вместимость списка + + # ## Конструктор ### + def initialize + @capacity = 10 + @size = 0 + @extend_ratio = 2 + @arr = Array.new(capacity) + end + + # ## Доступ к элементу ### + def get(index) + # Если индекс выходит за границы, выбрасывается исключение; далее аналогично + raise IndexError, "индекс выходит за границы" if index < 0 || index >= size + @arr[index] + end + + # ## Доступ к элементу ### + def set(index, num) + raise IndexError, "индекс выходит за границы" if index < 0 || index >= size + @arr[index] = num + end + + # ## Добавление элемента в конец ### + def add(num) + # При превышении вместимости по числу элементов запускается расширение + extend_capacity if size == capacity + @arr[size] = num + + # Обновить число элементов + @size += 1 + end + + # ## Вставка элемента в середину ### + def insert(index, num) + raise IndexError, "индекс выходит за границы" if index < 0 || index >= size + + # При превышении вместимости по числу элементов запускается расширение + extend_capacity if size == capacity + + # Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад + for j in (size - 1).downto(index) + @arr[j + 1] = @arr[j] + end + @arr[index] = num + + # Обновить число элементов + @size += 1 + end + + # ## Удаление элемента ### + def remove(index) + raise IndexError, "индекс выходит за границы" if index < 0 || index >= size + num = @arr[index] + + # Сдвинуть все элементы после индекса index на одну позицию вперед + for j in index...size + @arr[j] = @arr[j + 1] + end + + # Обновить число элементов + @size -= 1 + + # Вернуть удаленный элемент + num + end + + # ## Расширение списка ### + def extend_capacity + # Создать новый массив длиной в extend_ratio раз больше исходного и скопировать в него исходный массив + arr = @arr.dup + Array.new(capacity * (@extend_ratio - 1)) + # Обновить вместимость списка + @capacity = arr.length + end + + # ## Преобразование списка в массив ### + def to_array + sz = size + # Преобразовывать только элементы списка в пределах фактической длины + arr = Array.new(sz) + for i in 0...sz + arr[i] = get(i) + end + arr + end +end + +### Driver Code ### +if __FILE__ == $0 + # Инициализация списка + nums = MyList.new + + # Добавление элемента в конец + nums.add(1) + nums.add(3) + nums.add(2) + nums.add(5) + nums.add(4) + puts "Список nums = #{nums.to_array}, емкость = #{nums.capacity}, длина = #{nums.size}" + + # Вставка элемента в середину + nums.insert(3, 6) + puts "После вставки числа 6 по индексу 3 nums = #{nums.to_array}" + + # Удаление элемента + nums.remove(3) + puts "После удаления элемента по индексу 3 nums = #{nums.to_array}" + + # Доступ к элементу + num = nums.get(1) + puts "Элемент по индексу 1: num = #{num}" + + # Обновление элемента + nums.set(1, 0) + puts "После обновления элемента по индексу 1 до 0 nums = #{nums.to_array}" + + # Проверка механизма расширения + for i in 0...10 + # При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения + nums.add(i) + end + puts "После расширения список nums = #{nums.to_array}, емкость = #{nums.capacity}, длина = #{nums.size}" +end diff --git a/ru/codes/ruby/chapter_backtracking/n_queens.rb b/ru/codes/ruby/chapter_backtracking/n_queens.rb new file mode 100644 index 000000000..3f9a5a439 --- /dev/null +++ b/ru/codes/ruby/chapter_backtracking/n_queens.rb @@ -0,0 +1,61 @@ +=begin +File: n_queens.rb +Created Time: 2024-05-21 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Алгоритм бэктрекинга: n ферзей ### +def backtrack(row, n, state, res, cols, diags1, diags2) + # Когда все строки уже обработаны, записать решение + if row == n + res << state.map { |row| row.dup } + return + end + + # Обойти все столбцы + for col in 0...n + # Вычислить главную и побочную диагонали, соответствующие этой клетке + diag1 = row - col + n - 1 + diag2 = row + col + # Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей + if !cols[col] && !diags1[diag1] && !diags2[diag2] + # Попытка: поставить ферзя в эту клетку + state[row][col] = "Q" + cols[col] = diags1[diag1] = diags2[diag2] = true + # Перейти к размещению следующей строки + backtrack(row + 1, n, state, res, cols, diags1, diags2) + # Откат: восстановить эту клетку как пустую + state[row][col] = "#" + cols[col] = diags1[diag1] = diags2[diag2] = false + end + end +end + +# ## Решить задачу о n ферзях ### +def n_queens(n) + # Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку + state = Array.new(n) { Array.new(n, "#") } + cols = Array.new(n, false) # Отмечать, есть ли ферзь в столбце + diags1 = Array.new(2 * n - 1, false) # Отмечать наличие ферзя на главной диагонали + diags2 = Array.new(2 * n - 1, false) # Отмечать наличие ферзя на побочной диагонали + res = [] + backtrack(0, n, state, res, cols, diags1, diags2) + + res +end + +### Driver Code ### +if __FILE__ == $0 + n = 4 + res = n_queens(n) + + puts "Размер входной доски = #{n}" + puts "Количество способов расстановки ферзей: #{res.length}" + + for state in res + puts "--------------------" + for row in state + p row + end + end +end diff --git a/ru/codes/ruby/chapter_backtracking/permutations_i.rb b/ru/codes/ruby/chapter_backtracking/permutations_i.rb new file mode 100644 index 000000000..73482aa7b --- /dev/null +++ b/ru/codes/ruby/chapter_backtracking/permutations_i.rb @@ -0,0 +1,46 @@ +=begin +File: permutations_i.rb +Created Time: 2024-05-22 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Алгоритм бэктрекинга: все перестановки I ### +def backtrack(state, choices, selected, res) + # Когда длина состояния равна числу элементов, записать решение + if state.length == choices.length + res << state.dup + return + end + + # Перебор всех вариантов выбора + choices.each_with_index do |choice, i| + # Отсечение: нельзя выбирать один и тот же элемент повторно + unless selected[i] + # Попытка: сделать выбор и обновить состояние + selected[i] = true + state << choice + # Перейти к следующему выбору + backtrack(state, choices, selected, res) + # Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false + state.pop + end + end +end + +# ## Все перестановки I ### +def permutations_i(nums) + res = [] + backtrack([], nums, Array.new(nums.length, false), res) + res +end + +### Driver Code ### +if __FILE__ == $0 + nums = [1, 2, 3] + + res = permutations_i(nums) + + puts "Входной массив nums = #{nums}" + puts "Все перестановки res = #{res}" +end diff --git a/ru/codes/ruby/chapter_backtracking/permutations_ii.rb b/ru/codes/ruby/chapter_backtracking/permutations_ii.rb new file mode 100644 index 000000000..146e54cbc --- /dev/null +++ b/ru/codes/ruby/chapter_backtracking/permutations_ii.rb @@ -0,0 +1,48 @@ +=begin +File: permutations_ii.rb +Created Time: 2024-05-22 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Алгоритм бэктрекинга: все перестановки II ### +def backtrack(state, choices, selected, res) + # Когда длина состояния равна числу элементов, записать решение + if state.length == choices.length + res << state.dup + return + end + + # Перебор всех вариантов выбора + duplicated = Set.new + choices.each_with_index do |choice, i| + # Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы + if !selected[i] && !duplicated.include?(choice) + # Попытка: сделать выбор и обновить состояние + duplicated.add(choice) + selected[i] = true + state << choice + # Перейти к следующему выбору + backtrack(state, choices, selected, res) + # Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false + state.pop + end + end +end + +# ## Все перестановки II ### +def permutations_ii(nums) + res = [] + backtrack([], nums, Array.new(nums.length, false), res) + res +end + +### Driver Code ### +if __FILE__ == $0 + nums = [1, 2, 2] + + res = permutations_ii(nums) + + puts "Входной массив nums = #{nums}" + puts "Все перестановки res = #{res}" +end diff --git a/ru/codes/ruby/chapter_backtracking/preorder_traversal_i_compact.rb b/ru/codes/ruby/chapter_backtracking/preorder_traversal_i_compact.rb new file mode 100644 index 000000000..d0f0be8dc --- /dev/null +++ b/ru/codes/ruby/chapter_backtracking/preorder_traversal_i_compact.rb @@ -0,0 +1,33 @@ +=begin +File: preorder_traversal_i_compact.rb +Created Time: 2024-05-22 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/tree_node' +require_relative '../utils/print_util' + +# ## Предварительный обход: пример 1 ### +def pre_order(root) + return unless root + + # Записать решение + $res << root if root.val == 7 + + pre_order(root.left) + pre_order(root.right) +end + +### Driver Code ### +if __FILE__ == $0 + root = arr_to_tree([1, 7, 3, 4, 5, 6, 7]) + puts "\nИнициализация двоичного дерева" + print_tree(root) + + # Предварительный обход + $res = [] + pre_order(root) + + puts "\nВсе узлы со значением 7" + p $res.map { |node| node.val } +end diff --git a/ru/codes/ruby/chapter_backtracking/preorder_traversal_ii_compact.rb b/ru/codes/ruby/chapter_backtracking/preorder_traversal_ii_compact.rb new file mode 100644 index 000000000..247aa0898 --- /dev/null +++ b/ru/codes/ruby/chapter_backtracking/preorder_traversal_ii_compact.rb @@ -0,0 +1,41 @@ +=begin +File: preorder_traversal_ii_compact.rb +Created Time: 2024-05-22 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/tree_node' +require_relative '../utils/print_util' + +# ## Предварительный обход: пример 2 ### +def pre_order(root) + return unless root + + # Попытка + $path << root + + # Записать решение + $res << $path.dup if root.val == 7 + + pre_order(root.left) + pre_order(root.right) + + # Откат + $path.pop +end + +### Driver Code ### +if __FILE__ == $0 + root = arr_to_tree([1, 7, 3, 4, 5, 6, 7]) + puts "\nИнициализация двоичного дерева" + print_tree(root) + + # Предварительный обход + $path, $res = [], [] + pre_order(root) + + puts "\nВсе пути от корня к узлу 7" + for path in $res + p path.map { |node| node.val } + end +end diff --git a/ru/codes/ruby/chapter_backtracking/preorder_traversal_iii_compact.rb b/ru/codes/ruby/chapter_backtracking/preorder_traversal_iii_compact.rb new file mode 100644 index 000000000..f33300445 --- /dev/null +++ b/ru/codes/ruby/chapter_backtracking/preorder_traversal_iii_compact.rb @@ -0,0 +1,42 @@ +=begin +File: preorder_traversal_iii_compact.rb +Created Time: 2024-05-22 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/tree_node' +require_relative '../utils/print_util' + +# ## Предварительный обход: пример 3 ### +def pre_order(root) + # Отсечение + return if !root || root.val == 3 + + # Попытка + $path.append(root) + + # Записать решение + $res << $path.dup if root.val == 7 + + pre_order(root.left) + pre_order(root.right) + + # Откат + $path.pop +end + +### Driver Code ### +if __FILE__ == $0 + root = arr_to_tree([1, 7, 3, 4, 5, 6, 7]) + puts "\nИнициализация двоичного дерева" + print_tree(root) + + # Предварительный обход + $path, $res = [], [] + pre_order(root) + + puts "\nВсе пути от корня к узлу 7, не содержащие узлов со значением 3" + for path in $res + p path.map { |node| node.val } + end +end diff --git a/ru/codes/ruby/chapter_backtracking/preorder_traversal_iii_template.rb b/ru/codes/ruby/chapter_backtracking/preorder_traversal_iii_template.rb new file mode 100644 index 000000000..287f2bf95 --- /dev/null +++ b/ru/codes/ruby/chapter_backtracking/preorder_traversal_iii_template.rb @@ -0,0 +1,68 @@ +=begin +File: preorder_traversal_iii_template.rb +Created Time: 2024-05-22 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/tree_node' +require_relative '../utils/print_util' + +# ## Проверка, является ли текущее состояние решением ### +def is_solution?(state) + !state.empty? && state.last.val == 7 +end + +# ## Записать решение ### +def record_solution(state, res) + res << state.dup +end + +# ## Проверка допустимости этого выбора в текущем состоянии ### +def is_valid?(state, choice) + choice && choice.val != 3 +end + +# ## Обновить состояние ### +def make_choice(state, choice) + state << choice +end + +# ## Восстановить состояние ### +def undo_choice(state, choice) + state.pop +end + +# ## Алгоритм бэктрекинга: пример 3 ### +def backtrack(state, choices, res) + # Проверить, является ли текущее состояние решением + record_solution(state, res) if is_solution?(state) + + # Перебор всех вариантов выбора + for choice in choices + # Отсечение: проверить допустимость выбора + if is_valid?(state, choice) + # Попытка: сделать выбор и обновить состояние + make_choice(state, choice) + # Перейти к следующему выбору + backtrack(state, [choice.left, choice.right], res) + # Откат: отменить выбор и восстановить предыдущее состояние + undo_choice(state, choice) + end + end +end + +### Driver Code ### +if __FILE__ == $0 + root = arr_to_tree([1, 7, 3, 4, 5, 6, 7]) + puts "\nИнициализация двоичного дерева" + print_tree(root) + + # Алгоритм бэктрекинга + res = [] + backtrack([], [root], res) + + puts "\nВсе пути от корня к узлу 7, в которых путь не содержит узлов со значением 3" + for path in res + p path.map { |node| node.val } + end +end diff --git a/ru/codes/ruby/chapter_backtracking/subset_sum_i.rb b/ru/codes/ruby/chapter_backtracking/subset_sum_i.rb new file mode 100644 index 000000000..8dafaf848 --- /dev/null +++ b/ru/codes/ruby/chapter_backtracking/subset_sum_i.rb @@ -0,0 +1,47 @@ +=begin +File: subset_sum_i.rb +Created Time: 2024-05-22 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Алгоритм бэктрекинга: сумма подмножеств I ### +def backtrack(state, target, choices, start, res) + # Если сумма подмножества равна target, записать решение + if target.zero? + res << state.dup + return + end + # Обойти все варианты выбора + # Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + for i in start...choices.length + # Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + # Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + break if target - choices[i] < 0 + # Попытка: сделать выбор и обновить target и start + state << choices[i] + # Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i, res) + # Откат: отменить выбор и восстановить предыдущее состояние + state.pop + end +end + +# ## Решить задачу суммы подмножеств I ### +def subset_sum_i(nums, target) + state = [] # Состояние (подмножество) + nums.sort! # Отсортировать nums + start = 0 # Стартовая вершина обхода + res = [] # Список результатов (список подмножеств) + backtrack(state, target, nums, start, res) + res +end + +### Driver Code ### +if __FILE__ == $0 + nums = [3, 4, 5] + target = 9 + res = subset_sum_i(nums, target) + + puts "Входной массив nums = #{nums}, target = #{target}" + puts "Все подмножества с суммой #{target}: res = #{res}" +end diff --git a/ru/codes/ruby/chapter_backtracking/subset_sum_i_naive.rb b/ru/codes/ruby/chapter_backtracking/subset_sum_i_naive.rb new file mode 100644 index 000000000..0f5349eac --- /dev/null +++ b/ru/codes/ruby/chapter_backtracking/subset_sum_i_naive.rb @@ -0,0 +1,46 @@ +=begin +File: subset_sum_i_naive.rb +Created Time: 2024-05-22 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Алгоритм бэктрекинга: сумма подмножеств I ### +def backtrack(state, target, total, choices, res) + # Если сумма подмножества равна target, записать решение + if total == target + res << state.dup + return + end + + # Перебор всех вариантов выбора + for i in 0...choices.length + # Отсечение: если сумма подмножества превышает target, пропустить этот выбор + next if total + choices[i] > target + # Попытка: сделать выбор и обновить элемент и total + state << choices[i] + # Перейти к следующему выбору + backtrack(state, target, total + choices[i], choices, res) + # Откат: отменить выбор и восстановить предыдущее состояние + state.pop + end +end + +# ## Решить задачу суммы подмножеств I (с повторяющимися подмножествами) ### +def subset_sum_i_naive(nums, target) + state = [] # Состояние (подмножество) + total = 0 # Сумма подмножеств + res = [] # Список результатов (список подмножеств) + backtrack(state, target, total, nums, res) + res +end + +### Driver Code ### +if __FILE__ == $0 + nums = [3, 4, 5] + target = 9 + res = subset_sum_i_naive(nums, target) + + puts "Входной массив nums = #{nums}, target = #{target}" + puts "Все подмножества с суммой #{target}: res = #{res}" + puts "Обратите внимание: результат этого метода содержит повторяющиеся множества" +end diff --git a/ru/codes/ruby/chapter_backtracking/subset_sum_ii.rb b/ru/codes/ruby/chapter_backtracking/subset_sum_ii.rb new file mode 100644 index 000000000..fbc78175b --- /dev/null +++ b/ru/codes/ruby/chapter_backtracking/subset_sum_ii.rb @@ -0,0 +1,51 @@ +=begin +File: subset_sum_ii.rb +Created Time: 2024-05-22 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Алгоритм бэктрекинга: сумма подмножеств II ### +def backtrack(state, target, choices, start, res) + # Если сумма подмножества равна target, записать решение + if target.zero? + res << state.dup + return + end + + # Обойти все варианты выбора + # Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + # Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента + for i in start...choices.length + # Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + # Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + break if target - choices[i] < 0 + # Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить + next if i > start && choices[i] == choices[i - 1] + # Попытка: сделать выбор и обновить target и start + state << choices[i] + # Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i + 1, res) + # Откат: отменить выбор и восстановить предыдущее состояние + state.pop + end +end + +# ## Решить задачу суммы подмножеств II ### +def subset_sum_ii(nums, target) + state = [] # Состояние (подмножество) + nums.sort! # Отсортировать nums + start = 0 # Стартовая вершина обхода + res = [] # Список результатов (список подмножеств) + backtrack(state, target, nums, start, res) + res +end + +### Driver Code ### +if __FILE__ == $0 + nums = [4, 4, 5] + target = 9 + res = subset_sum_ii(nums, target) + + puts "Входной массив nums = #{nums}, target = #{target}" + puts "Все подмножества с суммой #{target}: res = #{res}" +end diff --git a/ru/codes/ruby/chapter_computational_complexity/iteration.rb b/ru/codes/ruby/chapter_computational_complexity/iteration.rb new file mode 100644 index 000000000..43f4c1219 --- /dev/null +++ b/ru/codes/ruby/chapter_computational_complexity/iteration.rb @@ -0,0 +1,79 @@ +=begin +File: iteration.rb +Created Time: 2024-03-30 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com), Cy (9738314@gmail.com) +=end + +# ## Цикл for ### +def for_loop(n) + res = 0 + + # Циклическое суммирование 1, 2, ..., n-1, n + for i in 1..n + res += i + end + + res +end + +# ## Цикл while ### +def while_loop(n) + res = 0 + i = 1 # Инициализация условной переменной + + # Циклическое суммирование 1, 2, ..., n-1, n + while i <= n + res += i + i += 1 # Обновить условную переменную + end + + res +end + +# ## Цикл while (двойное обновление) ### +def while_loop_ii(n) + res = 0 + i = 1 # Инициализация условной переменной + + # Циклическое суммирование 1, 4, 10, ... + while i <= n + res += i + # Обновить условную переменную + i += 1 + i *= 2 + end + + res +end + +# ## Двойной цикл for ### +def nested_for_loop(n) + res = "" + + # Цикл по i = 1, 2, ..., n-1, n + for i in 1..n + # Цикл по j = 1, 2, ..., n-1, n + for j in 1..n + res += "(#{i}, #{j}), " + end + end + + res +end + +### Driver Code ### +if __FILE__ == $0 + n = 5 + + res = for_loop(n) + puts "\nРезультат суммирования в цикле for res = #{res}" + + res = while_loop(n) + puts "\nРезультат суммирования в цикле while res = #{res}" + + res = while_loop_ii(n) + puts "\nРезультат суммирования в цикле while (двойное обновление) res = #{res}" + + res = nested_for_loop(n) + puts "\nРезультат обхода в двойном цикле for #{res}" +end diff --git a/ru/codes/ruby/chapter_computational_complexity/recursion.rb b/ru/codes/ruby/chapter_computational_complexity/recursion.rb new file mode 100644 index 000000000..af37d2c93 --- /dev/null +++ b/ru/codes/ruby/chapter_computational_complexity/recursion.rb @@ -0,0 +1,70 @@ +=begin +File: recursion.rb +Created Time: 2024-03-30 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Рекурсия ### +def recur(n) + # Условие завершения + return 1 if n == 1 + # Рекурсия: рекурсивный вызов + res = recur(n - 1) + # Возврат: вернуть результат + n + res +end + +# ## Имитация рекурсии итерацией ### +def for_loop_recur(n) + # Использовать явный стек для имитации системного стека вызовов + stack = [] + res = 0 + + # Рекурсия: рекурсивный вызов + for i in n.downto(0) + # Имитировать «рекурсию» с помощью операции помещения в стек + stack << i + end + # Возврат: вернуть результат + while !stack.empty? + res += stack.pop + end + + # res = 1+2+3+...+n + res +end + +# ## Хвостовая рекурсия ### +def tail_recur(n, res) + # Условие завершения + return res if n == 0 + # Хвостовой рекурсивный вызов + tail_recur(n - 1, res + n) +end + +# ## Последовательность Фибоначчи: рекурсия ### +def fib(n) + # Условие завершения: f(1) = 0, f(2) = 1 + return n - 1 if n == 1 || n == 2 + # Рекурсивный вызов f(n) = f(n-1) + f(n-2) + res = fib(n - 1) + fib(n - 2) + # Вернуть результат f(n) + res +end + +### Driver Code ### +if __FILE__ == $0 + n = 5 + + res = recur(n) + puts "\nРезультат суммирования в рекурсивной функции res = #{res}" + + res = for_loop_recur(n) + puts "\nРезультат суммирования при имитации рекурсии res = #{res}" + + res = tail_recur(n, 0) + puts "\nРезультат суммирования в хвостовой рекурсии res = #{res}" + + res = fib(n) + puts "\n#{n}-й элемент последовательности Фибоначчи: #{res}" +end diff --git a/ru/codes/ruby/chapter_computational_complexity/space_complexity.rb b/ru/codes/ruby/chapter_computational_complexity/space_complexity.rb new file mode 100644 index 000000000..683753742 --- /dev/null +++ b/ru/codes/ruby/chapter_computational_complexity/space_complexity.rb @@ -0,0 +1,92 @@ +=begin +File: space_complexity.rb +Created Time: 2024-03-30 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/list_node' +require_relative '../utils/tree_node' +require_relative '../utils/print_util' + +# ## Функция ### +def function + # Выполнить некоторые операции + 0 +end + +# ## Постоянная сложность ### +def constant(n) + # Константы, переменные и объекты занимают O(1) памяти + a = 0 + nums = [0] * 10000 + node = ListNode.new + + # Переменные в цикле занимают O(1) памяти + (0...n).each { c = 0 } + # Функции в цикле занимают O(1) памяти + (0...n).each { function } +end + +# ## Линейная сложность ### +def linear(n) + # Список длины n занимает O(n) памяти + nums = Array.new(n, 0) + + # Хеш-таблица длины n занимает O(n) памяти + hmap = {} + for i in 0...n + hmap[i] = i.to_s + end +end + +# ## Линейная сложность (рекурсивная реализация) ### +def linear_recur(n) + puts "Рекурсия n = #{n}" + return if n == 1 + linear_recur(n - 1) +end + +# ## Квадратичная сложность ### +def quadratic(n) + # Двумерный список занимает O(n^2) памяти + Array.new(n) { Array.new(n, 0) } +end + +# ## Квадратичная сложность (рекурсивная реализация) ### +def quadratic_recur(n) + return 0 unless n > 0 + + # Длина массива nums равна n, n-1, ..., 2, 1 + nums = Array.new(n, 0) + quadratic_recur(n - 1) +end + +# ## Экспоненциальная сложность (построение полного двоичного дерева) ### +def build_tree(n) + return if n == 0 + + TreeNode.new.tap do |root| + root.left = build_tree(n - 1) + root.right = build_tree(n - 1) + end +end + +### Driver Code ### +if __FILE__ == $0 + n = 5 + + # Постоянная сложность + constant(n) + + # Линейная сложность + linear(n) + linear_recur(n) + + # Квадратичная сложность + quadratic(n) + quadratic_recur(n) + + # Экспоненциальная сложность + root = build_tree(n) + print_tree(root) +end diff --git a/ru/codes/ruby/chapter_computational_complexity/time_complexity.rb b/ru/codes/ruby/chapter_computational_complexity/time_complexity.rb new file mode 100644 index 000000000..db4f19ca0 --- /dev/null +++ b/ru/codes/ruby/chapter_computational_complexity/time_complexity.rb @@ -0,0 +1,165 @@ +=begin +File: time_complexity.rb +Created Time: 2024-03-30 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Постоянная сложность ### +def constant(n) + count = 0 + size = 100000 + + (0...size).each { count += 1 } + + count +end + +# ## Линейная сложность ### +def linear(n) + count = 0 + (0...n).each { count += 1 } + count +end + +# ## Линейная сложность (обход массива) ### +def array_traversal(nums) + count = 0 + + # Число итераций пропорционально длине массива + for num in nums + count += 1 + end + + count +end + +# ## Квадратичная сложность ### +def quadratic(n) + count = 0 + + # Число итераций квадратично зависит от размера данных n + for i in 0...n + for j in 0...n + count += 1 + end + end + + count +end + +# ## Квадратичная сложность (пузырьковая сортировка) ### +def bubble_sort(nums) + count = 0 # Счетчик + + # Внешний цикл: неотсортированный диапазон [0, i] + for i in (nums.length - 1).downto(0) + # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for j in 0...i + if nums[j] > nums[j + 1] + # Поменять местами nums[j] и nums[j + 1] + tmp = nums[j] + nums[j] = nums[j + 1] + nums[j + 1] = tmp + count += 3 # Обмен элементов включает 3 элементарные операции + end + end + end + + count +end + +# ## Экспоненциальная сложность (итеративная реализация) ### +def exponential(n) + count, base = 0, 1 + + # На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1) + (0...n).each do + (0...base).each { count += 1 } + base *= 2 + end + + # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1 + count +end + +# ## Экспоненциальная сложность (рекурсивная реализация) ### +def exp_recur(n) + return 1 if n == 1 + exp_recur(n - 1) + exp_recur(n - 1) + 1 +end + +# ## Логарифмическая сложность (итеративная реализация) ### +def logarithmic(n) + count = 0 + + while n > 1 + n /= 2 + count += 1 + end + + count +end + +# ## Логарифмическая сложность (рекурсивная реализация) ### +def log_recur(n) + return 0 unless n > 1 + log_recur(n / 2) + 1 +end + +# ## Линейно-логарифмическая сложность ### +def linear_log_recur(n) + return 1 unless n > 1 + + count = linear_log_recur(n / 2) + linear_log_recur(n / 2) + (0...n).each { count += 1 } + + count +end + +# ## Факториальная сложность (рекурсивная реализация) ### +def factorial_recur(n) + return 1 if n == 0 + + count = 0 + # Из одного получается n + (0...n).each { count += factorial_recur(n - 1) } + + count +end + +### Driver Code ### +if __FILE__ == $0 + # Можно изменить n и запустить программу, чтобы увидеть, как меняется число операций при разных сложностях + n = 8 + puts "Размер входных данных n = #{n}" + + count = constant(n) + puts "Число операций константной сложности = #{count}" + + count = linear(n) + puts "Число операций линейной сложности = #{count}" + count = array_traversal(Array.new(n, 0)) + puts "Число операций линейной сложности (обход массива) = #{count}" + + count = quadratic(n) + puts "Число операций квадратичной сложности = #{count}" + nums = Array.new(n) { |i| n - i } # [n, n-1, ..., 2, 1] + count = bubble_sort(nums) + puts "Число операций квадратичной сложности (пузырьковая сортировка) = #{count}" + + count = exponential(n) + puts "Число операций экспоненциальной сложности (итеративная реализация) = #{count}" + count = exp_recur(n) + puts "Число операций экспоненциальной сложности (рекурсивная реализация) = #{count}" + + count = logarithmic(n) + puts "Число операций логарифмической сложности (итеративная реализация) = #{count}" + count = log_recur(n) + puts "Число операций логарифмической сложности (рекурсивная реализация) = #{count}" + + count = linear_log_recur(n) + puts "Число операций линейно-логарифмической сложности (рекурсивная реализация) = #{count}" + + count = factorial_recur(n) + puts "Число операций факториальной сложности (рекурсивная реализация) = #{count}" +end diff --git a/ru/codes/ruby/chapter_computational_complexity/worst_best_time_complexity.rb b/ru/codes/ruby/chapter_computational_complexity/worst_best_time_complexity.rb new file mode 100644 index 000000000..167ed4d60 --- /dev/null +++ b/ru/codes/ruby/chapter_computational_complexity/worst_best_time_complexity.rb @@ -0,0 +1,35 @@ +=begin +File: worst_best_time_complexity.rb +Created Time: 2024-03-30 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Создать массив с элементами: 1, 2, ..., n в случайном порядке ### +def random_numbers(n) + # Создать массив nums =: 1, 2, 3, ..., n + nums = Array.new(n) { |i| i + 1 } + # Случайно перемешать элементы массива + nums.shuffle! +end + +# ## Найти индекс числа 1 в массиве nums ### +def find_one(nums) + for i in 0...nums.length + # Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1) + # Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n) + return i if nums[i] == 1 + end + + -1 +end + +### Driver Code ### +if __FILE__ == $0 + for i in 0...10 + n = 100 + nums = random_numbers(n) + index = find_one(nums) + puts "\nМассив [1, 2, ..., n] после перемешивания = #{nums}" + puts "Индекс числа 1 = #{index}" + end +end diff --git a/ru/codes/ruby/chapter_divide_and_conquer/binary_search_recur.rb b/ru/codes/ruby/chapter_divide_and_conquer/binary_search_recur.rb new file mode 100644 index 000000000..6aee6c130 --- /dev/null +++ b/ru/codes/ruby/chapter_divide_and_conquer/binary_search_recur.rb @@ -0,0 +1,42 @@ +=begin +File: binary_search_recur.rb +Created Time: 2024-05-13 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Бинарный поиск: задача f(i, j) ### +def dfs(nums, target, i, j) + # Если интервал пуст, целевой элемент отсутствует, вернуть -1 + return -1 if i > j + + # Вычислить индекс середины m + m = (i + j) / 2 + + if nums[m] < target + # Рекурсивная подзадача f(m+1, j) + return dfs(nums, target, m + 1, j) + elsif nums[m] > target + # Рекурсивная подзадача f(i, m-1) + return dfs(nums, target, i, m - 1) + else + # Целевой элемент найден, вернуть его индекс + return m + end +end + +# ## Бинарный поиск ### +def binary_search(nums, target) + n = nums.length + # Решить задачу f(0, n-1) + dfs(nums, target, 0, n - 1) +end + +### Driver Code ### +if __FILE__ == $0 + target = 6 + nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35] + + # Бинарный поиск (двусторонне замкнутый интервал) + index = binary_search(nums, target) + puts "Индекс целевого элемента 6 = #{index}" +end diff --git a/ru/codes/ruby/chapter_divide_and_conquer/build_tree.rb b/ru/codes/ruby/chapter_divide_and_conquer/build_tree.rb new file mode 100644 index 000000000..4f2fff16a --- /dev/null +++ b/ru/codes/ruby/chapter_divide_and_conquer/build_tree.rb @@ -0,0 +1,46 @@ +=begin +File: build_tree.rb +Created Time: 2024-05-13 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/tree_node' +require_relative '../utils/print_util' + +# ## Построить двоичное дерево: разделяй и властвуй ### +def dfs(preorder, inorder_map, i, l, r) + # Завершить при пустом диапазоне поддерева + return if r - l < 0 + + # Инициализировать корневой узел + root = TreeNode.new(preorder[i]) + # Найти m, чтобы разделить левое и правое поддеревья + m = inorder_map[preorder[i]] + # Подзадача: построить левое поддерево + root.left = dfs(preorder, inorder_map, i + 1, l, m - 1) + # Подзадача: построить правое поддерево + root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r) + + # Вернуть корневой узел + root +end + +# ## Построить двоичное дерево ### +def build_tree(preorder, inorder) + # Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам + inorder_map = {} + inorder.each_with_index { |val, i| inorder_map[val] = i } + dfs(preorder, inorder_map, 0, 0, inorder.length - 1) +end + +### Driver Code ### +if __FILE__ == $0 + preorder = [3, 9, 2, 1, 7] + inorder = [9, 3, 1, 2, 7] + puts "Предварительный обход = #{preorder}" + puts "Симметричный обход = #{inorder}" + + root = build_tree(preorder, inorder) + puts "Построенное двоичное дерево:" + print_tree(root) +end diff --git a/ru/codes/ruby/chapter_divide_and_conquer/hanota.rb b/ru/codes/ruby/chapter_divide_and_conquer/hanota.rb new file mode 100644 index 000000000..bcdfb5046 --- /dev/null +++ b/ru/codes/ruby/chapter_divide_and_conquer/hanota.rb @@ -0,0 +1,55 @@ +=begin +File: hanota.rb +Created Time: 2024-05-13 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Переместить один диск ### +def move(src, tar) + # Снять диск с вершины src + pan = src.pop + # Положить диск на вершину tar + tar << pan +end + +# ## Решить задачу Ханойской башни f(i) ### +def dfs(i, src, buf, tar) + # Если в src остался только один диск, сразу переместить его в tar + if i == 1 + move(src, tar) + return + end + + # Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar + dfs(i - 1, src, tar, buf) + # Подзадача f(1): переместить оставшийся один диск из src в tar + move(src, tar) + # Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src + dfs(i - 1, buf, src, tar) +end + +# ## Решить задачу Ханойской башни ### +def solve_hanota(_A, _B, _C) + n = _A.length + # Переместить верхние n дисков из A в C с помощью B + dfs(n, _A, _B, _C) +end + +### Driver Code ### +if __FILE__ == $0 + # Хвост списка соответствует вершине столбца + A = [5, 4, 3, 2, 1] + B = [] + C = [] + puts "Исходное состояние:" + puts "A = #{A}" + puts "B = #{B}" + puts "C = #{C}" + + solve_hanota(A, B, C) + + puts "После завершения перемещения дисков:" + puts "A = #{A}" + puts "B = #{B}" + puts "C = #{C}" +end diff --git a/ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_backtrack.rb b/ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_backtrack.rb new file mode 100644 index 000000000..f20e8a60e --- /dev/null +++ b/ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_backtrack.rb @@ -0,0 +1,37 @@ +=begin +File: climbing_stairs_backtrack.rb +Created Time: 2024-05-29 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Бэктрекинг ### +def backtrack(choices, state, n, res) + # Когда подъем достигает n-й ступени, число вариантов увеличивается на 1 + res[0] += 1 if state == n + # Перебор всех вариантов выбора + for choice in choices + # Отсечение: нельзя выходить за n-ю ступень + next if state + choice > n + + # Попытка: сделать выбор и обновить состояние + backtrack(choices, state + choice, n, res) + end + # Откат +end + +# ## Подъем по лестнице: бэктрекинг ### +def climbing_stairs_backtrack(n) + choices = [1, 2] # Можно подняться на 1 или 2 ступени + state = 0 # Начать подъем с 0-й ступени + res = [0] # Использовать res[0] для хранения числа решений + backtrack(choices, state, n, res) + res.first +end + +### Driver Code ### +if __FILE__ == $0 + n = 9 + + res = climbing_stairs_backtrack(n) + puts "Количество способов подняться по лестнице из #{n} ступеней: #{res}" +end diff --git a/ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_constraint_dp.rb b/ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_constraint_dp.rb new file mode 100644 index 000000000..4d67f0c3d --- /dev/null +++ b/ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_constraint_dp.rb @@ -0,0 +1,31 @@ +=begin +File: climbing_stairs_constraint_dp.rb +Created Time: 2024-05-29 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Подъем по лестнице с ограничениями: динамическое программирование ### +def climbing_stairs_constraint_dp(n) + return 1 if n == 1 || n == 2 + + # Инициализация таблицы dp для хранения решений подзадач + dp = Array.new(n + 1) { Array.new(3, 0) } + # Начальное состояние: заранее задать решения наименьших подзадач + dp[1][1], dp[1][2] = 1, 0 + dp[2][1], dp[2][2] = 0, 1 + # Переход состояний: постепенное решение больших подзадач через меньшие + for i in 3...(n + 1) + dp[i][1] = dp[i - 1][2] + dp[i][2] = dp[i - 2][1] + dp[i - 2][2] + end + + dp[n][1] + dp[n][2] +end + +### Driver Code ### +if __FILE__ == $0 + n = 9 + + res = climbing_stairs_constraint_dp(n) + puts "Количество способов подняться по лестнице из #{n} ступеней: #{res}" +end diff --git a/ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_dfs.rb b/ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_dfs.rb new file mode 100644 index 000000000..e8863f427 --- /dev/null +++ b/ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_dfs.rb @@ -0,0 +1,26 @@ +=begin +File: climbing_stairs_dfs.rb +Created Time: 2024-05-29 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Поиск ### +def dfs(i) + # dp[1] и dp[2] уже известны, вернуть их + return i if i == 1 || i == 2 + # dp[i] = dp[i-1] + dp[i-2] + dfs(i - 1) + dfs(i - 2) +end + +# ## Подъем по лестнице: поиск ### +def climbing_stairs_dfs(n) + dfs(n) +end + +### Driver Code ### +if __FILE__ == $0 + n = 9 + + res = climbing_stairs_dfs(n) + puts "Количество способов подняться по лестнице из #{n} ступеней: #{res}" +end diff --git a/ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_dfs_mem.rb b/ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_dfs_mem.rb new file mode 100644 index 000000000..8a9d0c390 --- /dev/null +++ b/ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_dfs_mem.rb @@ -0,0 +1,33 @@ +=begin +File: climbing_stairs_dfs_mem.rb +Created Time: 2024-05-29 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Поиск с мемоизацией ### +def dfs(i, mem) + # dp[1] и dp[2] уже известны, вернуть их + return i if i == 1 || i == 2 + # Если запись dp[i] существует, сразу вернуть ее + return mem[i] if mem[i] != -1 + + # dp[i] = dp[i-1] + dp[i-2] + count = dfs(i - 1, mem) + dfs(i - 2, mem) + # Сохранить dp[i] + mem[i] = count +end + +# ## Подъем по лестнице: поиск с мемоизацией ### +def climbing_stairs_dfs_mem(n) + # mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи + mem = Array.new(n + 1, -1) + dfs(n, mem) +end + +### Driver Code ### +if __FILE__ == $0 + n = 9 + + res = climbing_stairs_dfs_mem(n) + puts "Количество способов подняться по лестнице из #{n} ступеней: #{res}" +end diff --git a/ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_dp.rb b/ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_dp.rb new file mode 100644 index 000000000..c9989405b --- /dev/null +++ b/ru/codes/ruby/chapter_dynamic_programming/climbing_stairs_dp.rb @@ -0,0 +1,40 @@ +=begin +File: climbing_stairs_dp.rb +Created Time: 2024-05-29 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Подъем по лестнице: динамическое программирование ### +def climbing_stairs_dp(n) + return n if n == 1 || n == 2 + + # Инициализация таблицы dp для хранения решений подзадач + dp = Array.new(n + 1, 0) + # Начальное состояние: заранее задать решения наименьших подзадач + dp[1], dp[2] = 1, 2 + # Переход состояний: постепенное решение больших подзадач через меньшие + (3...(n + 1)).each { |i| dp[i] = dp[i - 1] + dp[i - 2] } + + dp[n] +end + +# ## Подъем по лестнице: динамическое программирование с оптимизацией памяти ### +def climbing_stairs_dp_comp(n) + return n if n == 1 || n == 2 + + a, b = 1, 2 + (3...(n + 1)).each { a, b = b, a + b } + + b +end + +### Driver Code ### +if __FILE__ == $0 + n = 9 + + res = climbing_stairs_dp(n) + puts "Количество способов подняться по лестнице из #{n} ступеней: #{res}" + + res = climbing_stairs_dp_comp(n) + puts "Количество способов подняться по лестнице из #{n} ступеней: #{res}" +end diff --git a/ru/codes/ruby/chapter_dynamic_programming/coin_change.rb b/ru/codes/ruby/chapter_dynamic_programming/coin_change.rb new file mode 100644 index 000000000..4753004c8 --- /dev/null +++ b/ru/codes/ruby/chapter_dynamic_programming/coin_change.rb @@ -0,0 +1,65 @@ +=begin +File: coin_change.rb +Created Time: 2024-05-29 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Размен монет: динамическое программирование ### +def coin_change_dp(coins, amt) + n = coins.length + _MAX = amt + 1 + # Инициализация таблицы dp + dp = Array.new(n + 1) { Array.new(amt + 1, 0) } + # Переход состояний: первая строка и первый столбец + (1...(amt + 1)).each { |a| dp[0][a] = _MAX } + # Переход состояний: остальные строки и столбцы + for i in 1...(n + 1) + for a in 1...(amt + 1) + if coins[i - 1] > a + # Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a] + else + # Меньшее из двух решений: не брать или взять монету i + dp[i][a] = [dp[i - 1][a], dp[i][a - coins[i - 1]] + 1].min + end + end + end + dp[n][amt] != _MAX ? dp[n][amt] : -1 +end + +# ## Размен монет: динамическое программирование с оптимизацией памяти ### +def coin_change_dp_comp(coins, amt) + n = coins.length + _MAX = amt + 1 + # Инициализация таблицы dp + dp = Array.new(amt + 1, _MAX) + dp[0] = 0 + # Переход состояний + for i in 1...(n + 1) + # Прямой обход + for a in 1...(amt + 1) + if coins[i - 1] > a + # Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a] + else + # Меньшее из двух решений: не брать или взять монету i + dp[a] = [dp[a], dp[a - coins[i - 1]] + 1].min + end + end + end + dp[amt] != _MAX ? dp[amt] : -1 +end + +### Driver Code ### +if __FILE__ == $0 + coins = [1, 2, 5] + amt = 4 + + # Динамическое программирование + res = coin_change_dp(coins, amt) + puts "Минимальное число монет для набора целевой суммы = #{res}" + + # Динамическое программирование с оптимизацией памяти + res = coin_change_dp_comp(coins, amt) + puts "Минимальное число монет для набора целевой суммы = #{res}" +end diff --git a/ru/codes/ruby/chapter_dynamic_programming/coin_change_ii.rb b/ru/codes/ruby/chapter_dynamic_programming/coin_change_ii.rb new file mode 100644 index 000000000..1a41cbaf8 --- /dev/null +++ b/ru/codes/ruby/chapter_dynamic_programming/coin_change_ii.rb @@ -0,0 +1,63 @@ +=begin +File: coin_change_ii.rb +Created Time: 2024-05-29 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Размен монет II: динамическое программирование ### +def coin_change_ii_dp(coins, amt) + n = coins.length + # Инициализация таблицы dp + dp = Array.new(n + 1) { Array.new(amt + 1, 0) } + # Инициализация первого столбца + (0...(n + 1)).each { |i| dp[i][0] = 1 } + # Переход состояний + for i in 1...(n + 1) + for a in 1...(amt + 1) + if coins[i - 1] > a + # Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a] + else + # Сумма двух решений: не брать или взять монету i + dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]] + end + end + end + dp[n][amt] +end + +# ## Размен монет II: динамическое программирование с оптимизацией памяти ### +def coin_change_ii_dp_comp(coins, amt) + n = coins.length + # Инициализация таблицы dp + dp = Array.new(amt + 1, 0) + dp[0] = 1 + # Переход состояний + for i in 1...(n + 1) + # Прямой обход + for a in 1...(amt + 1) + if coins[i - 1] > a + # Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a] + else + # Сумма двух решений: не брать или взять монету i + dp[a] = dp[a] + dp[a - coins[i - 1]] + end + end + end + dp[amt] +end + +### Driver Code ### +if __FILE__ == $0 + coins = [1, 2, 5] + amt = 5 + + # Динамическое программирование + res = coin_change_ii_dp(coins, amt) + puts "Количество комбинаций монет для набора целевой суммы = #{res}" + + # Динамическое программирование с оптимизацией памяти + res = coin_change_ii_dp_comp(coins, amt) + puts "Количество комбинаций монет для набора целевой суммы = #{res}" +end diff --git a/ru/codes/ruby/chapter_dynamic_programming/edit_distance.rb b/ru/codes/ruby/chapter_dynamic_programming/edit_distance.rb new file mode 100644 index 000000000..de8d42dec --- /dev/null +++ b/ru/codes/ruby/chapter_dynamic_programming/edit_distance.rb @@ -0,0 +1,115 @@ +=begin +File: edit_distance.rb +Created Time: 2024-05-29 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Редакционное расстояние: полный перебор ### +def edit_distance_dfs(s, t, i, j) + # Если s и t пусты, вернуть 0 + return 0 if i == 0 && j == 0 + # Если s пусто, вернуть длину t + return j if i == 0 + # Если t пусто, вернуть длину s + return i if j == 0 + # Если два символа равны, сразу пропустить их + return edit_distance_dfs(s, t, i - 1, j - 1) if s[i - 1] == t[j - 1] + # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + insert = edit_distance_dfs(s, t, i, j - 1) + delete = edit_distance_dfs(s, t, i - 1, j) + replace = edit_distance_dfs(s, t, i - 1, j - 1) + # Вернуть минимальное число шагов редактирования + [insert, delete, replace].min + 1 +end + +def edit_distance_dfs_mem(s, t, mem, i, j) + # Если s и t пусты, вернуть 0 + return 0 if i == 0 && j == 0 + # Если s пусто, вернуть длину t + return j if i == 0 + # Если t пусто, вернуть длину s + return i if j == 0 + # Если запись уже есть, сразу вернуть ее + return mem[i][j] if mem[i][j] != -1 + # Если два символа равны, сразу пропустить их + return edit_distance_dfs_mem(s, t, mem, i - 1, j - 1) if s[i - 1] == t[j - 1] + # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + insert = edit_distance_dfs_mem(s, t, mem, i, j - 1) + delete = edit_distance_dfs_mem(s, t, mem, i - 1, j) + replace = edit_distance_dfs_mem(s, t, mem, i - 1, j - 1) + # Сохранить и вернуть минимальное число шагов редактирования + mem[i][j] = [insert, delete, replace].min + 1 +end + +# ## Редакционное расстояние: динамическое программирование ### +def edit_distance_dp(s, t) + n, m = s.length, t.length + dp = Array.new(n + 1) { Array.new(m + 1, 0) } + # Переход состояний: первая строка и первый столбец + (1...(n + 1)).each { |i| dp[i][0] = i } + (1...(m + 1)).each { |j| dp[0][j] = j } + # Переход состояний: остальные строки и столбцы + for i in 1...(n + 1) + for j in 1...(m +1) + if s[i - 1] == t[j - 1] + # Если два символа равны, сразу пропустить их + dp[i][j] = dp[i - 1][j - 1] + else + # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[i][j] = [dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]].min + 1 + end + end + end + dp[n][m] +end + +# ## Редакционное расстояние: динамическое программирование с оптимизацией памяти ### +def edit_distance_dp_comp(s, t) + n, m = s.length, t.length + dp = Array.new(m + 1, 0) + # Переход состояний: первая строка + (1...(m + 1)).each { |j| dp[j] = j } + # Переход состояний: остальные строки + for i in 1...(n + 1) + # Переход состояний: первый столбец + leftup = dp.first # Временно сохранить dp[i-1, j-1] + dp[0] += 1 + # Переход состояний: остальные столбцы + for j in 1...(m + 1) + temp = dp[j] + if s[i - 1] == t[j - 1] + # Если два символа равны, сразу пропустить их + dp[j] = leftup + else + # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[j] = [dp[j - 1], dp[j], leftup].min + 1 + end + leftup = temp # Обновить до значения dp[i-1, j-1] для следующей итерации + end + end + dp[m] +end + +### Driver Code ### +if __FILE__ == $0 + s = 'bag' + t = 'pack' + n, m = s.length, t.length + + # Полный перебор + res = edit_distance_dfs(s, t, n, m) + puts "Чтобы преобразовать #{s} в #{t}, требуется минимум #{res} правок" + + # Поиск с мемоизацией + mem = Array.new(n + 1) { Array.new(m + 1, -1) } + res = edit_distance_dfs_mem(s, t, mem, n, m) + puts "Чтобы преобразовать #{s} в #{t}, требуется минимум #{res} правок" + + # Динамическое программирование + res = edit_distance_dp(s, t) + puts "Чтобы преобразовать #{s} в #{t}, требуется минимум #{res} правок" + + # Динамическое программирование с оптимизацией памяти + res = edit_distance_dp_comp(s, t) + puts "Чтобы преобразовать #{s} в #{t}, требуется минимум #{res} правок" +end diff --git a/ru/codes/ruby/chapter_dynamic_programming/knapsack.rb b/ru/codes/ruby/chapter_dynamic_programming/knapsack.rb new file mode 100644 index 000000000..085f2fe0f --- /dev/null +++ b/ru/codes/ruby/chapter_dynamic_programming/knapsack.rb @@ -0,0 +1,99 @@ +=begin +File: knapsack.rb +Created Time: 2024-05-29 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Рюкзак 0-1: полный перебор ### +def knapsack_dfs(wgt, val, i, c) + # Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + return 0 if i == 0 || c == 0 + # Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + return knapsack_dfs(wgt, val, i - 1, c) if wgt[i - 1] > c + # Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + no = knapsack_dfs(wgt, val, i - 1, c) + yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1] + # Вернуть вариант с большей стоимостью из двух возможных + [no, yes].max +end + +# ## Рюкзак 0-1: поиск с мемоизацией ### +def knapsack_dfs_mem(wgt, val, mem, i, c) + # Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + return 0 if i == 0 || c == 0 + # Если запись уже есть, вернуть сразу + return mem[i][c] if mem[i][c] != -1 + # Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + return knapsack_dfs_mem(wgt, val, mem, i - 1, c) if wgt[i - 1] > c + # Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + no = knapsack_dfs_mem(wgt, val, mem, i - 1, c) + yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1] + # Сохранить и вернуть вариант с большей стоимостью из двух решений + mem[i][c] = [no, yes].max +end + +# ## Рюкзак 0-1: динамическое программирование ### +def knapsack_dp(wgt, val, cap) + n = wgt.length + # Инициализация таблицы dp + dp = Array.new(n + 1) { Array.new(cap + 1, 0) } + # Переход состояний + for i in 1...(n + 1) + for c in 1...(cap + 1) + if wgt[i - 1] > c + # Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c] + else + # Большее из двух решений: не брать или взять предмет i + dp[i][c] = [dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]].max + end + end + end + dp[n][cap] +end + +# ## Рюкзак 0-1: динамическое программирование с оптимизацией памяти ### +def knapsack_dp_comp(wgt, val, cap) + n = wgt.length + # Инициализация таблицы dp + dp = Array.new(cap + 1, 0) + # Переход состояний + for i in 1...(n + 1) + # Обход в обратном порядке + for c in cap.downto(1) + if wgt[i - 1] > c + # Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c] + else + # Большее из двух решений: не брать или взять предмет i + dp[c] = [dp[c], dp[c - wgt[i - 1]] + val[i - 1]].max + end + end + end + dp[cap] +end + +### Driver Code ### +if __FILE__ == $0 + wgt = [10, 20, 30, 40, 50] + val = [50, 120, 150, 210, 240] + cap = 50 + n = wgt.length + + # Полный перебор + res = knapsack_dfs(wgt, val, n, cap) + puts "Максимальная стоимость предметов без превышения вместимости рюкзака = #{res}" + + # Поиск с мемоизацией + mem = Array.new(n + 1) { Array.new(cap + 1, -1) } + res = knapsack_dfs_mem(wgt, val, mem, n, cap) + puts "Максимальная стоимость предметов без превышения вместимости рюкзака = #{res}" + + # Динамическое программирование + res = knapsack_dp(wgt, val, cap) + puts "Максимальная стоимость предметов без превышения вместимости рюкзака = #{res}" + + # Динамическое программирование с оптимизацией памяти + res = knapsack_dp_comp(wgt, val, cap) + puts "Максимальная стоимость предметов без превышения вместимости рюкзака = #{res}" +end diff --git a/ru/codes/ruby/chapter_dynamic_programming/min_cost_climbing_stairs_dp.rb b/ru/codes/ruby/chapter_dynamic_programming/min_cost_climbing_stairs_dp.rb new file mode 100644 index 000000000..65d5cb078 --- /dev/null +++ b/ru/codes/ruby/chapter_dynamic_programming/min_cost_climbing_stairs_dp.rb @@ -0,0 +1,39 @@ +=begin +File: min_cost_climbing_stairs_dp.rb +Created Time: 2024-05-29 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Минимальная стоимость подъема по лестнице: динамическое программирование ### +def min_cost_climbing_stairs_dp(cost) + n = cost.length - 1 + return cost[n] if n == 1 || n == 2 + # Инициализация таблицы dp для хранения решений подзадач + dp = Array.new(n + 1, 0) + # Начальное состояние: заранее задать решения наименьших подзадач + dp[1], dp[2] = cost[1], cost[2] + # Переход состояний: постепенное решение больших подзадач через меньшие + (3...(n + 1)).each { |i| dp[i] = [dp[i - 1], dp[i - 2]].min + cost[i] } + dp[n] +end + +# Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти +def min_cost_climbing_stairs_dp_comp(cost) + n = cost.length - 1 + return cost[n] if n == 1 || n == 2 + a, b = cost[1], cost[2] + (3...(n + 1)).each { |i| a, b = b, [a, b].min + cost[i] } + b +end + +### Driver Code ### +if __FILE__ == $0 + cost = [0, 1, 10, 1, 1, 1, 10, 1, 1, 10, 1] + puts "Список стоимостей ступеней = #{cost}" + + res = min_cost_climbing_stairs_dp(cost) + puts "Минимальная стоимость подъема по лестнице = #{res}" + + res = min_cost_climbing_stairs_dp_comp(cost) + puts "Минимальная стоимость подъема по лестнице = #{res}" +end diff --git a/ru/codes/ruby/chapter_dynamic_programming/min_path_sum.rb b/ru/codes/ruby/chapter_dynamic_programming/min_path_sum.rb new file mode 100644 index 000000000..69259a145 --- /dev/null +++ b/ru/codes/ruby/chapter_dynamic_programming/min_path_sum.rb @@ -0,0 +1,93 @@ +=begin +File: min_path_sum.rb +Created Time: 2024-05-29 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Минимальная сумма пути: полный перебор ### +def min_path_sum_dfs(grid, i, j) + # Если это верхняя левая ячейка, завершить поиск + return grid[i][j] if i == 0 && j == 0 + # Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + return Float::INFINITY if i < 0 || j < 0 + # Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1) + up = min_path_sum_dfs(grid, i - 1, j) + left = min_path_sum_dfs(grid, i, j - 1) + # Вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + [left, up].min + grid[i][j] +end + +# ## Минимальная сумма пути: поиск с мемоизацией ### +def min_path_sum_dfs_mem(grid, mem, i, j) + # Если это верхняя левая ячейка, завершить поиск + return grid[0][0] if i == 0 && j == 0 + # Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + return Float::INFINITY if i < 0 || j < 0 + # Если запись уже есть, вернуть сразу + return mem[i][j] if mem[i][j] != -1 + # Минимальная стоимость пути для левой и верхней ячеек + up = min_path_sum_dfs_mem(grid, mem, i - 1, j) + left = min_path_sum_dfs_mem(grid, mem, i, j - 1) + # Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + mem[i][j] = [left, up].min + grid[i][j] +end + +# ## Минимальная сумма пути: динамическое программирование ### +def min_path_sum_dp(grid) + n, m = grid.length, grid.first.length + # Инициализация таблицы dp + dp = Array.new(n) { Array.new(m, 0) } + dp[0][0] = grid[0][0] + # Переход состояний: первая строка + (1...m).each { |j| dp[0][j] = dp[0][j - 1] + grid[0][j] } + # Переход состояний: первый столбец + (1...n).each { |i| dp[i][0] = dp[i - 1][0] + grid[i][0] } + # Переход состояний: остальные строки и столбцы + for i in 1...n + for j in 1...m + dp[i][j] = [dp[i][j - 1], dp[i - 1][j]].min + grid[i][j] + end + end + dp[n -1][m -1] +end + +# ## Минимальная сумма пути: динамическое программирование с оптимизацией памяти ### +def min_path_sum_dp_comp(grid) + n, m = grid.length, grid.first.length + # Инициализация таблицы dp + dp = Array.new(m, 0) + # Переход состояний: первая строка + dp[0] = grid[0][0] + (1...m).each { |j| dp[j] = dp[j - 1] + grid[0][j] } + # Переход состояний: остальные строки + for i in 1...n + # Переход состояний: первый столбец + dp[0] = dp[0] + grid[i][0] + # Переход состояний: остальные столбцы + (1...m).each { |j| dp[j] = [dp[j - 1], dp[j]].min + grid[i][j] } + end + dp[m - 1] +end + +### Driver Code ### +if __FILE__ == $0 + grid = [[1, 3, 1, 5], [2, 2, 4, 2], [5, 3, 2, 1], [4, 3, 5, 2]] + n, m = grid.length, grid.first.length + + # Полный перебор + res = min_path_sum_dfs(grid, n - 1, m - 1) + puts "Минимальная сумма пути из левого верхнего угла в правый нижний = #{res}" + + # Поиск с мемоизацией + mem = Array.new(n) { Array.new(m, - 1) } + res = min_path_sum_dfs_mem(grid, mem, n - 1, m -1) + puts "Минимальная сумма пути из левого верхнего угла в правый нижний = #{res}" + + # Динамическое программирование + res = min_path_sum_dp(grid) + puts "Минимальная сумма пути из левого верхнего угла в правый нижний = #{res}" + + # Динамическое программирование с оптимизацией памяти + res = min_path_sum_dp_comp(grid) + puts "Минимальная сумма пути из левого верхнего угла в правый нижний = #{res}" +end diff --git a/ru/codes/ruby/chapter_dynamic_programming/unbounded_knapsack.rb b/ru/codes/ruby/chapter_dynamic_programming/unbounded_knapsack.rb new file mode 100644 index 000000000..d62da8651 --- /dev/null +++ b/ru/codes/ruby/chapter_dynamic_programming/unbounded_knapsack.rb @@ -0,0 +1,61 @@ +=begin +File: unbounded_knapsack.rb +Created Time: 2024-05-29 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Полный рюкзак: динамическое программирование ### +def unbounded_knapsack_dp(wgt, val, cap) + n = wgt.length + # Инициализация таблицы dp + dp = Array.new(n + 1) { Array.new(cap + 1, 0) } + # Переход состояний + for i in 1...(n + 1) + for c in 1...(cap + 1) + if wgt[i - 1] > c + # Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c] + else + # Большее из двух решений: не брать или взять предмет i + dp[i][c] = [dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]].max + end + end + end + dp[n][cap] +end + +# ## Полный рюкзак: динамическое программирование с оптимизацией памяти ##3 +def unbounded_knapsack_dp_comp(wgt, val, cap) + n = wgt.length + # Инициализация таблицы dp + dp = Array.new(cap + 1, 0) + # Переход состояний + for i in 1...(n + 1) + # Прямой обход + for c in 1...(cap + 1) + if wgt[i -1] > c + # Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c] + else + # Большее из двух решений: не брать или взять предмет i + dp[c] = [dp[c], dp[c - wgt[i - 1]] + val[i - 1]].max + end + end + end + dp[cap] +end + +### Driver Code ### +if __FILE__ == $0 + wgt = [1, 2, 3] + val = [5, 11, 15] + cap = 4 + + # Динамическое программирование + res = unbounded_knapsack_dp(wgt, val, cap) + puts "Максимальная стоимость предметов без превышения вместимости рюкзака = #{res}" + + # Динамическое программирование с оптимизацией памяти + res = unbounded_knapsack_dp_comp(wgt, val, cap) + puts "Максимальная стоимость предметов без превышения вместимости рюкзака = #{res}" +end diff --git a/ru/codes/ruby/chapter_graph/graph_adjacency_list.rb b/ru/codes/ruby/chapter_graph/graph_adjacency_list.rb new file mode 100644 index 000000000..a35a8bed3 --- /dev/null +++ b/ru/codes/ruby/chapter_graph/graph_adjacency_list.rb @@ -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 diff --git a/ru/codes/ruby/chapter_graph/graph_adjacency_matrix.rb b/ru/codes/ruby/chapter_graph/graph_adjacency_matrix.rb new file mode 100644 index 000000000..6373196bd --- /dev/null +++ b/ru/codes/ruby/chapter_graph/graph_adjacency_matrix.rb @@ -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 diff --git a/ru/codes/ruby/chapter_graph/graph_bfs.rb b/ru/codes/ruby/chapter_graph/graph_bfs.rb new file mode 100644 index 000000000..0a79f4a8f --- /dev/null +++ b/ru/codes/ruby/chapter_graph/graph_bfs.rb @@ -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 diff --git a/ru/codes/ruby/chapter_graph/graph_dfs.rb b/ru/codes/ruby/chapter_graph/graph_dfs.rb new file mode 100644 index 000000000..d48185c48 --- /dev/null +++ b/ru/codes/ruby/chapter_graph/graph_dfs.rb @@ -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 diff --git a/ru/codes/ruby/chapter_greedy/coin_change_greedy.rb b/ru/codes/ruby/chapter_greedy/coin_change_greedy.rb new file mode 100644 index 000000000..ebe8a8f45 --- /dev/null +++ b/ru/codes/ruby/chapter_greedy/coin_change_greedy.rb @@ -0,0 +1,50 @@ +=begin +File: coin_change_greedy.rb +Created Time: 2024-05-07 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Размен монет: жадный алгоритм ### +def coin_change_greedy(coins, amt) + # Предположить, что список coins упорядочен + i = coins.length - 1 + count = 0 + # Циклически выполнять жадный выбор, пока не останется суммы + while amt > 0 + # Найти монету, которая меньше остатка суммы и наиболее к нему близка + while i > 0 && coins[i] > amt + i -= 1 + end + # Выбрать coins[i] + amt -= coins[i] + count += 1 + end + # Если допустимое решение не найдено, вернуть -1 + amt == 0 ? count : -1 +end + +### Driver Code ### +if __FILE__ == $0 + # Жадный подход: гарантирует нахождение глобально оптимального решения + coins = [1, 5, 10, 20, 50, 100] + amt = 186 + res = coin_change_greedy(coins, amt) + puts "\ncoins = #{coins}, amt = #{amt}" + puts "Минимальное количество монет для суммы #{amt}: #{res}" + + # Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = [1, 20, 50] + amt = 60 + res = coin_change_greedy(coins, amt) + puts "\ncoins = #{coins}, amt = #{amt}" + puts "Минимальное количество монет для суммы #{amt}: #{res}" + puts "На самом деле минимум равен 3: 20 + 20 + 20" + + # Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = [1, 49, 50] + amt = 98 + res = coin_change_greedy(coins, amt) + puts "\ncoins = #{coins}, amt = #{amt}" + puts "Минимальное количество монет для суммы #{amt}: #{res}" + puts "На самом деле минимум равен 2: 49 + 49" +end diff --git a/ru/codes/ruby/chapter_greedy/fractional_knapsack.rb b/ru/codes/ruby/chapter_greedy/fractional_knapsack.rb new file mode 100644 index 000000000..f1677524c --- /dev/null +++ b/ru/codes/ruby/chapter_greedy/fractional_knapsack.rb @@ -0,0 +1,51 @@ +=begin +File: fractional_knapsack.rb +Created Time: 2024-05-07 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Предмет ### +class Item + attr_accessor :w # Вес предмета + attr_accessor :v # Стоимость предмета + + def initialize(w, v) + @w = w + @v = v + end +end + +# ## Дробный рюкзак: жадный алгоритм ### +def fractional_knapsack(wgt, val, cap) + # Создать список предметов с двумя свойствами: вес и стоимость + items = wgt.each_with_index.map { |w, i| Item.new(w, val[i]) } + # Отсортировать по удельной стоимости item.v / item.w в порядке убывания + items.sort! { |a, b| (b.v.to_f / b.w) <=> (a.v.to_f / a.w) } + # Циклический жадный выбор + res = 0 + for item in items + if item.w <= cap + # Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком + res += item.v + cap -= item.w + else + # Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета + res += (item.v.to_f / item.w) * cap + # Свободной вместимости больше не осталось, поэтому выйти из цикла + break + end + end + res +end + +### Driver Code ### +if __FILE__ == $0 + wgt = [10, 20, 30, 40, 50] + val = [50, 120, 150, 210, 240] + cap = 50 + n = wgt.length + + # Жадный алгоритм + res = fractional_knapsack(wgt, val, cap) + puts "Максимальная стоимость предметов без превышения вместимости рюкзака = #{res}" +end diff --git a/ru/codes/ruby/chapter_greedy/max_capacity.rb b/ru/codes/ruby/chapter_greedy/max_capacity.rb new file mode 100644 index 000000000..44b7ec4cf --- /dev/null +++ b/ru/codes/ruby/chapter_greedy/max_capacity.rb @@ -0,0 +1,37 @@ +=begin +File: max_capacity.rb +Created Time: 2024-05-07 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Максимальная вместимость: жадный алгоритм ### +def max_capacity(ht) + # Инициализировать i и j так, чтобы они располагались по двум концам массива + i, j = 0, ht.length - 1 + # Начальная максимальная вместимость равна 0 + res = 0 + + # Выполнять жадный выбор в цикле, пока две доски не встретятся + while i < j + # Обновить максимальную вместимость + cap = [ht[i], ht[j]].min * (j - i) + res = [res, cap].max + # Сдвигать внутрь более короткую сторону + if ht[i] < ht[j] + i += 1 + else + j -= 1 + end + end + + res +end + +### Driver Code ### +if __FILE__ == $0 + ht = [3, 8, 5, 2, 7, 7, 3, 4] + + # Жадный алгоритм + res = max_capacity(ht) + puts "Максимальная вместимость = #{res}" +end diff --git a/ru/codes/ruby/chapter_greedy/max_product_cutting.rb b/ru/codes/ruby/chapter_greedy/max_product_cutting.rb new file mode 100644 index 000000000..d8c1bb77d --- /dev/null +++ b/ru/codes/ruby/chapter_greedy/max_product_cutting.rb @@ -0,0 +1,28 @@ +=begin +File: max_product_cutting.rb +Created Time: 2024-05-07 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Максимальное произведение разрезания: жадный алгоритм ### +def max_product_cutting(n) + # Когда n <= 3, обязательно нужно выделить одну 1 + return 1 * (n - 1) if n <= 3 + # Жадно выделить множители 3, где a — число троек, а b — остаток + a, b = n / 3, n % 3 + # Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2 + return (3.pow(a - 1) * 2 * 2).to_i if b == 1 + # Если остаток равен 2, ничего не делать + return (3.pow(a) * 2).to_i if b == 2 + # Если остаток равен 0, ничего не делать + 3.pow(a).to_i +end + +### Driver Code ### +if __FILE__ == $0 + n = 58 + + # Жадный алгоритм + res = max_product_cutting(n) + puts "Максимальное произведение после разрезания = #{res}" +end diff --git a/ru/codes/ruby/chapter_hashing/array_hash_map.rb b/ru/codes/ruby/chapter_hashing/array_hash_map.rb new file mode 100644 index 000000000..cf23e14ab --- /dev/null +++ b/ru/codes/ruby/chapter_hashing/array_hash_map.rb @@ -0,0 +1,121 @@ +=begin +File: array_hash_map.rb +Created Time: 2024-04-13 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Пара ключ-значение ### +class Pair + attr_accessor :key, :val + + def initialize(key, val) + @key = key + @val = val + end +end + +# ## Хеш-таблица на основе массива ### +class ArrayHashMap + # ## Конструктор ### + def initialize + # Инициализировать массив, содержащий 100 корзин + @buckets = Array.new(100) + end + + # ## Хеш-функция ### + def hash_func(key) + index = key % 100 + end + + # ## Операция поиска ### + def get(key) + index = hash_func(key) + pair = @buckets[index] + + return if pair.nil? + pair.val + end + + # ## Операция добавления ### + def put(key, val) + pair = Pair.new(key, val) + index = hash_func(key) + @buckets[index] = pair + end + + # ## Операция удаления ### + def remove(key) + index = hash_func(key) + # Присвоить nil, что означает удаление + @buckets[index] = nil + end + + # ## Получить все пары ключ-значение ### + def entry_set + result = [] + @buckets.each { |pair| result << pair unless pair.nil? } + result + end + + # ## Получить все ключи ### + def key_set + result = [] + @buckets.each { |pair| result << pair.key unless pair.nil? } + result + end + + # ## Получить все значения ### + def value_set + result = [] + @buckets.each { |pair| result << pair.val unless pair.nil? } + result + end + + # ## Вывести хеш-таблицу ### + def print + @buckets.each { |pair| puts "#{pair.key} -> #{pair.val}" unless pair.nil? } + end +end + +### Driver Code ### +if __FILE__ == $0 + # Инициализация хеш-таблицы + hmap = ArrayHashMap.new + + # Операция добавления + # Добавить пару (key, value) в хеш-таблицу + hmap.put(12836, "Сяо Ха") + hmap.put(15937, "Сяо Ло") + hmap.put(16750, "Сяо Суань") + hmap.put(13276, "Сяо Фа") + hmap.put(10583, "Сяо Я") + puts "\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение" + hmap.print + + # Операция поиска + # По ключу key получить из хеш-таблицы значение value + name = hmap.get(15937) + puts "\nДля номера 15937 найдено имя #{name}" + + # Операция удаления + # Удалить пару значений (key, value) из хеш-таблицы + hmap.remove(10583) + puts "\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение" + hmap.print + + # Обход хеш-таблицы + puts "\nОтдельный обход пар ключ-значение" + for pair in hmap.entry_set + puts "#{pair.key} -> #{pair.val}" + end + + puts "\nОтдельный обход ключей" + for key in hmap.key_set + puts key + end + + puts "\nОтдельный обход значений" + for val in hmap.value_set + puts val + end +end diff --git a/ru/codes/ruby/chapter_hashing/built_in_hash.rb b/ru/codes/ruby/chapter_hashing/built_in_hash.rb new file mode 100644 index 000000000..d40bcc3ac --- /dev/null +++ b/ru/codes/ruby/chapter_hashing/built_in_hash.rb @@ -0,0 +1,34 @@ +=begin +File: built_in_hash.rb +Created Time: 2024-04-13 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/list_node' + +### Driver Code ### +if __FILE__ == $0 + num = 3 + hash_num = num.hash + puts "Хеш-значение целого числа #{num}: #{hash_num}" + + bol = true + hash_bol = bol.hash + puts "Хеш-значение булева значения #{bol}: #{hash_bol}" + + dec = 3.14159 + hash_dec = dec.hash + puts "Хеш-значение десятичного числа #{dec}: #{hash_dec}" + + str = "Hello Algo" + hash_str = str.hash + puts "Хеш-значение строки #{str}: #{hash_str}" + + tup = [12836, 'Сяо Ха'] + hash_tup = tup.hash + puts "Хеш-значение кортежа #{tup}: #{hash_tup}" + + obj = ListNode.new(0) + hash_obj = obj.hash + puts "Хеш-значение объекта узла #{obj}: #{hash_obj}" +end diff --git a/ru/codes/ruby/chapter_hashing/hash_map.rb b/ru/codes/ruby/chapter_hashing/hash_map.rb new file mode 100644 index 000000000..949d540f7 --- /dev/null +++ b/ru/codes/ruby/chapter_hashing/hash_map.rb @@ -0,0 +1,44 @@ +=begin +File: hash_map.rb +Created Time: 2024-04-14 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/print_util' + +### Driver Code ### +if __FILE__ == $0 + # Инициализация хеш-таблицы + hmap = {} + + # Операция добавления + # Добавить пару (key, value) в хеш-таблицу + hmap[12836] = "Сяо Ха" + hmap[15937] = "Сяо Ло" + hmap[16750] = "Сяо Суань" + hmap[13276] = "Сяо Фа" + hmap[10583] = "Сяо Я" + puts "\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение" + print_hash_map(hmap) + + # Операция поиска + # Передать ключ key в хеш-таблицу и получить значение value + name = hmap[15937] + puts "\nДля номера 15937 найдено имя #{name}" + + # Операция удаления + # Удалить пару (key, value) из хеш-таблицы + hmap.delete(10583) + puts "\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение" + print_hash_map(hmap) + + # Обход хеш-таблицы + puts "\nОтдельный обход пар ключ-значение" + hmap.entries.each { |key, value| puts "#{key} -> #{value}" } + + puts "\nОтдельный обход ключей" + hmap.keys.each { |key| puts key } + + puts "\nОтдельный обход значений" + hmap.values.each { |val| puts val } +end diff --git a/ru/codes/ruby/chapter_hashing/hash_map_chaining.rb b/ru/codes/ruby/chapter_hashing/hash_map_chaining.rb new file mode 100644 index 000000000..6620dd16b --- /dev/null +++ b/ru/codes/ruby/chapter_hashing/hash_map_chaining.rb @@ -0,0 +1,128 @@ +=begin +File: hash_map_chaining.rb +Created Time: 2024-04-13 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative './array_hash_map' + +# ## Хеш-таблица с цепочками ### +class HashMapChaining + # ## Конструктор ### + def initialize + @size = 0 # Число пар ключ-значение + @capacity = 4 # Вместимость хеш-таблицы + @load_thres = 2.0 / 3.0 # Порог коэффициента загрузки для запуска расширения + @extend_ratio = 2 # Коэффициент расширения + @buckets = Array.new(@capacity) { [] } # Массив корзин + end + + # ## Хеш-функция ### + def hash_func(key) + key % @capacity + end + + # ## Коэффициент загрузки ### + def load_factor + @size / @capacity + end + + # ## Операция поиска ### + def get(key) + index = hash_func(key) + bucket = @buckets[index] + # Обойти корзину; если найден key, вернуть соответствующее val + for pair in bucket + return pair.val if pair.key == key + end + # Если key не найден, вернуть nil + nil + end + + # ## Операция добавления ### + def put(key, val) + # Когда коэффициент загрузки превышает порог, выполнить расширение + extend if load_factor > @load_thres + index = hash_func(key) + bucket = @buckets[index] + # Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть + for pair in bucket + if pair.key == key + pair.val = val + return + end + end + # Если такого key нет, добавить пару ключ-значение в конец + pair = Pair.new(key, val) + bucket << pair + @size += 1 + end + + # ## Операция удаления ### + def remove(key) + index = hash_func(key) + bucket = @buckets[index] + # Обойти корзину и удалить из нее пару ключ-значение + for pair in bucket + if pair.key == key + bucket.delete(pair) + @size -= 1 + break + end + end + end + + # ## Расширение хеш-таблицы ### + def extend + # Временно сохранить исходную хеш-таблицу + buckets = @buckets + # Инициализация новой хеш-таблицы после расширения + @capacity *= @extend_ratio + @buckets = Array.new(@capacity) { [] } + @size = 0 + # Перенести пары ключ-значение из исходной хеш-таблицы в новую + for bucket in buckets + for pair in bucket + put(pair.key, pair.val) + end + end + end + + # ## Вывести хеш-таблицу ### + def print + for bucket in @buckets + res = [] + for pair in bucket + res << "#{pair.key} -> #{pair.val}" + end + pp res + end + end +end + +### Driver Code ### +if __FILE__ == $0 + # ## Инициализация хеш-таблицы + hashmap = HashMapChaining.new + + # Операция добавления + # Добавить пару (key, value) в хеш-таблицу + hashmap.put(12836, "Сяо Ха") + hashmap.put(15937, "Сяо Ло") + hashmap.put(16750, "Сяо Суань") + hashmap.put(13276, "Сяо Фа") + hashmap.put(10583, "Сяо Я") + puts "\nПосле завершения добавления хеш-таблица имеет вид\n[Key1 -> Value1, Key2 -> Value2, ...]" + hashmap.print + + # Операция поиска + # Передать ключ key в хеш-таблицу и получить значение value + name = hashmap.get(13276) + puts "\nДля номера 13276 найдено имя #{name}" + + # Операция удаления + # Удалить пару (key, value) из хеш-таблицы + hashmap.remove(12836) + puts "\nПосле удаления 12836 хеш-таблица имеет вид\n[Key1 -> Value1, Key2 -> Value2, ...]" + hashmap.print +end diff --git a/ru/codes/ruby/chapter_hashing/hash_map_open_addressing.rb b/ru/codes/ruby/chapter_hashing/hash_map_open_addressing.rb new file mode 100644 index 000000000..aa1b6864a --- /dev/null +++ b/ru/codes/ruby/chapter_hashing/hash_map_open_addressing.rb @@ -0,0 +1,147 @@ +=begin +File: hash_map_open_addressing.rb +Created Time: 2024-04-13 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative './array_hash_map' + +# ## Хеш-таблица с открытой адресацией ### +class HashMapOpenAddressing + TOMBSTONE = Pair.new(-1, '-1') # Удалить метку + + # ## Конструктор ### + def initialize + @size = 0 # Число пар ключ-значение + @capacity = 4 # Вместимость хеш-таблицы + @load_thres = 2.0 / 3.0 # Порог коэффициента загрузки для запуска расширения + @extend_ratio = 2 # Коэффициент расширения + @buckets = Array.new(@capacity) # Массив корзин + end + + # ## Хеш-функция ### + def hash_func(key) + key % @capacity + end + + # ## Коэффициент загрузки ### + def load_factor + @size / @capacity + end + + # ## Найти индекс корзины, соответствующий key ### + def find_bucket(key) + index = hash_func(key) + first_tombstone = -1 + # Выполнять линейное пробирование и завершить при встрече с пустой корзиной + while !@buckets[index].nil? + # Если встретился key, вернуть соответствующий индекс корзины + if @buckets[index].key == key + # Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс + if first_tombstone != -1 + @buckets[first_tombstone] = @buckets[index] + @buckets[index] = TOMBSTONE + return first_tombstone # Вернуть индекс корзины после перемещения + end + return index # Вернуть индекс корзины + end + # Записать первую встретившуюся метку удаления + first_tombstone = index if first_tombstone == -1 && @buckets[index] == TOMBSTONE + # Вычислить индекс корзины; при выходе за конец вернуться к началу + index = (index + 1) % @capacity + end + # Если key не существует, вернуть индекс точки добавления + first_tombstone == -1 ? index : first_tombstone + end + + # ## Операция поиска ### + def get(key) + # Найти индекс корзины, соответствующий key + index = find_bucket(key) + # Если пара ключ-значение найдена, вернуть соответствующее val + return @buckets[index].val unless [nil, TOMBSTONE].include?(@buckets[index]) + # Если пара ключ-значение не существует, вернуть nil + nil + end + + # ## Операция добавления ### + def put(key, val) + # Когда коэффициент загрузки превышает порог, выполнить расширение + extend if load_factor > @load_thres + # Найти индекс корзины, соответствующий key + index = find_bucket(key) + # Если пара ключ-значение найдена, перезаписать val и вернуть + unless [nil, TOMBSTONE].include?(@buckets[index]) + @buckets[index].val = val + return + end + # Если пары ключ-значение нет, добавить ее + @buckets[index] = Pair.new(key, val) + @size += 1 + end + + # ## Операция удаления ### + def remove(key) + # Найти индекс корзины, соответствующий key + index = find_bucket(key) + # Если пара ключ-значение найдена, заменить ее меткой удаления + unless [nil, TOMBSTONE].include?(@buckets[index]) + @buckets[index] = TOMBSTONE + @size -= 1 + end + end + + # ## Расширение хеш-таблицы ### + def extend + # Временно сохранить исходную хеш-таблицу + buckets_tmp = @buckets + # Инициализация новой хеш-таблицы после расширения + @capacity *= @extend_ratio + @buckets = Array.new(@capacity) + @size = 0 + # Перенести пары ключ-значение из исходной хеш-таблицы в новую + for pair in buckets_tmp + put(pair.key, pair.val) unless [nil, TOMBSTONE].include?(pair) + end + end + + # ## Вывести хеш-таблицу ### + def print + for pair in @buckets + if pair.nil? + puts "Nil" + elsif pair == TOMBSTONE + puts "TOMBSTONE" + else + puts "#{pair.key} -> #{pair.val}" + end + end + end +end + +### Driver Code ### +if __FILE__ == $0 + # Инициализация хеш-таблицы + hashmap = HashMapOpenAddressing.new + + # Операция добавления + # Добавить пару (key, val) в хеш-таблицу + hashmap.put(12836, "Сяо Ха") + hashmap.put(15937, "Сяо Ло") + hashmap.put(16750, "Сяо Суань") + hashmap.put(13276, "Сяо Фа") + hashmap.put(10583, "Сяо Я") + puts "\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение" + hashmap.print + + # Операция поиска + # Передать ключ key в хеш-таблицу и получить значение val + name = hashmap.get(13276) + puts "\nДля номера 13276 найдено имя #{name}" + + # Операция удаления + # Удалить пару (key, val) из хеш-таблицы + hashmap.remove(16750) + puts "\nПосле удаления 16750 хеш-таблица имеет вид\nКлюч -> Значение" + hashmap.print +end diff --git a/ru/codes/ruby/chapter_hashing/simple_hash.rb b/ru/codes/ruby/chapter_hashing/simple_hash.rb new file mode 100644 index 000000000..f16efacdf --- /dev/null +++ b/ru/codes/ruby/chapter_hashing/simple_hash.rb @@ -0,0 +1,62 @@ +=begin +File: simple_hash.rb +Created Time: 2024-04-14 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Аддитивное хеширование ### +def add_hash(key) + hash = 0 + modulus = 1_000_000_007 + + key.each_char { |c| hash += c.ord } + + hash % modulus +end + +# ## Мультипликативное хеширование ### +def mul_hash(key) + hash = 0 + modulus = 1_000_000_007 + + key.each_char { |c| hash = 31 * hash + c.ord } + + hash % modulus +end + +# ## XOR-хеширование ### +def xor_hash(key) + hash = 0 + modulus = 1_000_000_007 + + key.each_char { |c| hash ^= c.ord } + + hash % modulus +end + +# ## Хеширование с циклическим сдвигом ### +def rot_hash(key) + hash = 0 + modulus = 1_000_000_007 + + key.each_char { |c| hash = (hash << 4) ^ (hash >> 28) ^ c.ord } + + hash % modulus +end + +### Driver Code ### +if __FILE__ == $0 + key = "Hello Algo" + + hash = add_hash(key) + puts "Хеш-сумма сложением = #{hash}" + + hash = mul_hash(key) + puts "Хеш-сумма умножением = #{hash}" + + hash = xor_hash(key) + puts "Хеш-сумма XOR = #{hash}" + + hash = rot_hash(key) + puts "Хеш-сумма с циклическим сдвигом = #{hash}" +end diff --git a/ru/codes/ruby/chapter_heap/my_heap.rb b/ru/codes/ruby/chapter_heap/my_heap.rb new file mode 100644 index 000000000..df447caf6 --- /dev/null +++ b/ru/codes/ruby/chapter_heap/my_heap.rb @@ -0,0 +1,147 @@ +=begin +File: my_heap.rb +Created Time: 2024-04-19 +Author: Blue Bean (lonnnnnnner@gmail.com) +=end + +require_relative '../utils/print_util' + +# ## Максимальная куча ### +class MaxHeap + attr_reader :max_heap + + # ## Конструктор, строящий кучу по входному списку ### + def initialize(nums) + # Добавить элементы списка в кучу без изменений + @max_heap = nums + # Выполнить heapify для всех узлов, кроме листовых + parent(size - 1).downto(0) do |i| + sift_down(i) + end + end + + # ## Получить индекс левого дочернего узла ### + def left(i) + 2 * i + 1 + end + + # ## Получить индекс правого дочернего узла ### + def right(i) + 2 * i + 2 + end + + # ## Получить индекс родительского узла ### + def parent(i) + (i - 1) / 2 # Округление вниз при делении + end + + # ## Обмен элементов ### + def swap(i, j) + @max_heap[i], @max_heap[j] = @max_heap[j], @max_heap[i] + end + + # ## Получить размер кучи ### + def size + @max_heap.length + end + + # ## Проверка, пуста ли куча ### + def is_empty? + size == 0 + end + + # ## Доступ к элементу на вершине кучи ### + def peek + @max_heap[0] + end + + # ## Добавление элемента в кучу ### + def push(val) + # Добавление узла + @max_heap << val + # Просеивание снизу вверх + sift_up(size - 1) + end + + # ## Начиная с узла i, выполнить просеивание снизу вверх ### + def sift_up(i) + loop do + # Получение родительского узла для узла i + p = parent(i) + # Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления» + break if p < 0 || @max_heap[i] <= @max_heap[p] + # Поменять два узла местами + swap(i, p) + # Циклическое просеивание вверх + i = p + end + end + + # ## Извлечение элемента из кучи ### + def pop + # Обработка пустого случая + raise IndexError, "куча пуста" if is_empty? + # Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + swap(0, size - 1) + # Удаление узла + val = @max_heap.pop + # Просеивание сверху вниз + sift_down(0) + # Вернуть элемент с вершины кучи + val + end + + # ## Начиная с узла i, выполнить просеивание сверху вниз ### + def sift_down(i) + loop do + # Определить узел с максимальным значением среди i, l и r и обозначить его как ma + l, r, ma = left(i), right(i), i + ma = l if l < size && @max_heap[l] > @max_heap[ma] + ma = r if r < size && @max_heap[r] > @max_heap[ma] + + # Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + break if ma == i + + # Поменять два узла местами + swap(i, ma) + # Циклическое просеивание вниз + i = ma + end + end + + # ## Вывести кучу (двоичное дерево) ### + def __print__ + print_heap(@max_heap) + end +end + +### Driver Code ### +if __FILE__ == $0 + # Инициализация максимальной кучи + max_heap = MaxHeap.new([9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2]) + puts "\nПосле построения кучи из входного списка" + max_heap.__print__ + + # Получение элемента с вершины кучи + peek = max_heap.peek + puts "\nЭлемент на вершине кучи = #{peek}" + + # Добавление элемента в кучу + val = 7 + max_heap.push(val) + puts "\nПосле добавления элемента #{val} в кучу" + max_heap.__print__ + + # Извлечение элемента с вершины кучи + peek = max_heap.pop + puts "\nПосле извлечения вершины кучи #{peek}" + max_heap.__print__ + + # Получение размера кучи + size = max_heap.size + puts "\nКоличество элементов в куче = #{size}" + + # Проверка, пуста ли куча + is_empty = max_heap.is_empty? + puts "\nПуста ли куча: #{is_empty}" +end diff --git a/ru/codes/ruby/chapter_heap/top_k.rb b/ru/codes/ruby/chapter_heap/top_k.rb new file mode 100644 index 000000000..740a9f4c7 --- /dev/null +++ b/ru/codes/ruby/chapter_heap/top_k.rb @@ -0,0 +1,64 @@ +=begin +File: top_k.rb +Created Time: 2024-04-19 +Author: Blue Bean (lonnnnnnner@gmail.com) +=end + +require_relative "./my_heap" + +# ## Добавление элемента в кучу ### +def push_min_heap(heap, val) + # Инвертировать знак элемента + heap.push(-val) +end + +# ## Извлечение элемента из кучи ### +def pop_min_heap(heap) + # Инвертировать знак элемента + -heap.pop +end + +# ## Доступ к элементу на вершине кучи ### +def peek_min_heap(heap) + # Инвертировать знак элемента + -heap.peek +end + +# ## Извлечение элементов из кучи ### +def get_min_heap(heap) + # Инвертировать все элементы кучи + heap.max_heap.map { |x| -x } +end + +# ## Поиск k наибольших элементов массива с помощью кучи ### +def top_k_heap(nums, k) + # Инициализация минимальной кучи + # Обратите внимание: мы инвертируем все элементы кучи, чтобы с помощью максимальной кучи имитировать минимальную + max_heap = MaxHeap.new([]) + + # Поместить первые k элементов массива в кучу + for i in 0...k + push_min_heap(max_heap, nums[i]) + end + + # Начиная с элемента k+1, поддерживать длину кучи равной k + for i in k...nums.length + # Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу + if nums[i] > peek_min_heap(max_heap) + pop_min_heap(max_heap) + push_min_heap(max_heap, nums[i]) + end + end + + get_min_heap(max_heap) +end + +### Driver Code ### +if __FILE__ == $0 + nums = [1, 7, 6, 3, 2] + k = 3 + + res = top_k_heap(nums, k) + puts "#{k} наибольших элементов:" + print_heap(res) +end diff --git a/ru/codes/ruby/chapter_searching/binary_search.rb b/ru/codes/ruby/chapter_searching/binary_search.rb new file mode 100644 index 000000000..46f03fde3 --- /dev/null +++ b/ru/codes/ruby/chapter_searching/binary_search.rb @@ -0,0 +1,63 @@ +=begin +File: binary_search.rb +Created Time: 2024-04-09 +Author: Blue Bean (lonnnnnnner@gmail.com) +=end + +# ## Бинарный поиск (двусторонне замкнутый интервал) ### +def binary_search(nums, target) + # Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно + i, j = 0, nums.length - 1 + + # Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст) + while i <= j + # Теоретически числа в Ruby могут быть сколь угодно большими (ограничены только объемом памяти), поэтому не нужно учитывать переполнение больших чисел + m = (i + j) / 2 # Вычислить индекс середины m + + if nums[m] < target + i = m + 1 # Это означает, что target находится в интервале [m+1, j] + elsif nums[m] > target + j = m - 1 # Это означает, что target находится в интервале [i, m-1] + else + return m # Целевой элемент найден, вернуть его индекс + end + end + + -1 # Целевой элемент не найден, вернуть -1 +end + +# ## Бинарный поиск (лево замкнутый, право открытый интервал) ### +def binary_search_lcro(nums, target) + # Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно + i, j = 0, nums.length + + # Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст) + while i < j + # Вычислить индекс середины m + m = (i + j) / 2 + + if nums[m] < target + i = m + 1 # Это означает, что target находится в интервале [m+1, j) + elsif nums[m] > target + j = m - 1 # Это означает, что target находится в интервале [i, m) + else + return m # Целевой элемент найден, вернуть его индекс + end + end + + -1 # Целевой элемент не найден, вернуть -1 +end + +### Driver Code ### +if __FILE__ == $0 + target = 6 + nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35] + + # Бинарный поиск (двусторонне замкнутый интервал) + index = binary_search(nums, target) + puts "Индекс целевого элемента 6 = #{index}" + + # Бинарный поиск (лево замкнутый, право открытый интервал) + index = binary_search_lcro(nums, target) + puts "Индекс целевого элемента 6 = #{index}" +end diff --git a/ru/codes/ruby/chapter_searching/binary_search_edge.rb b/ru/codes/ruby/chapter_searching/binary_search_edge.rb new file mode 100644 index 000000000..e397ca78e --- /dev/null +++ b/ru/codes/ruby/chapter_searching/binary_search_edge.rb @@ -0,0 +1,47 @@ +=begin +File: binary_search_edge.rb +Created Time: 2024-04-09 +Author: Blue Bean (lonnnnnnner@gmail.com) +=end + +require_relative './binary_search_insertion' + +# ## Бинарный поиск самого левого target ### +def binary_search_left_edge(nums, target) + # Эквивалентно поиску точки вставки target + i = binary_search_insertion(nums, target) + + # target не найден, вернуть -1 + return -1 if i == nums.length || nums[i] != target + + i # Найти target и вернуть индекс i +end + +# ## Бинарный поиск самого правого target ### +def binary_search_right_edge(nums, target) + # Преобразовать задачу в поиск самого левого target + 1 + i = binary_search_insertion(nums, target + 1) + + # j указывает на самый правый target, а i — на первый элемент больше target + j = i - 1 + + # target не найден, вернуть -1 + return -1 if j == -1 || nums[j] != target + + j # Найти target и вернуть индекс j +end + +### Driver Code ### +if __FILE__ == $0 + # Массив с повторяющимися элементами + nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15] + puts "\nМассив nums = #{nums}" + + # Бинарный поиск левой и правой границы + for target in [6, 7] + index = binary_search_left_edge(nums, target) + puts "Индекс крайнего левого элемента #{target}: #{index}" + index = binary_search_right_edge(nums, target) + puts "Индекс крайнего правого элемента #{target}: #{index}" + end +end diff --git a/ru/codes/ruby/chapter_searching/binary_search_insertion.rb b/ru/codes/ruby/chapter_searching/binary_search_insertion.rb new file mode 100644 index 000000000..d320b0cdb --- /dev/null +++ b/ru/codes/ruby/chapter_searching/binary_search_insertion.rb @@ -0,0 +1,68 @@ +=begin +File: binary_search_insertion.rb +Created Time: 2024-04-09 +Author: Blue Bean (lonnnnnnner@gmail.com) +=end + +# ## Бинарный поиск точки вставки (без повторяющихся элементов) ### +def binary_search_insertion_simple(nums, target) + # Инициализировать двусторонне замкнутый интервал [0, n-1] + i, j = 0, nums.length - 1 + + while i <= j + # Вычислить индекс середины m + m = (i + j) / 2 + + if nums[m] < target + i = m + 1 # target находится в интервале [m+1, j] + elsif nums[m] > target + j = m - 1 # target находится в интервале [i, m-1] + else + return m # Найти target и вернуть точку вставки m + end + end + + i # target не найден, вернуть точку вставки i +end + +# ## Бинарный поиск точки вставки (с повторяющимися элементами) ### +def binary_search_insertion(nums, target) + # Инициализировать двусторонне замкнутый интервал [0, n-1] + i, j = 0, nums.length - 1 + + while i <= j + # Вычислить индекс середины m + m = (i + j) / 2 + + if nums[m] < target + i = m + 1 # target находится в интервале [m+1, j] + elsif nums[m] > target + j = m - 1 # target находится в интервале [i, m-1] + else + j = m - 1 # Первый элемент меньше target находится в интервале [i, m-1] + end + end + + i # Вернуть точку вставки i +end + +### Driver Code ### +if __FILE__ == $0 + # Массив без повторяющихся элементов + nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35] + puts "\nМассив nums = #{nums}" + # Бинарный поиск точки вставки + for target in [6, 9] + index = binary_search_insertion_simple(nums, target) + puts "Индекс позиции вставки элемента #{target}: #{index}" + end + + # Массив с повторяющимися элементами + nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15] + puts "\nМассив nums = #{nums}" + # Бинарный поиск точки вставки + for target in [2, 6, 20] + index = binary_search_insertion(nums, target) + puts "Индекс позиции вставки элемента #{target}: #{index}" + end +end diff --git a/ru/codes/ruby/chapter_searching/hashing_search.rb b/ru/codes/ruby/chapter_searching/hashing_search.rb new file mode 100644 index 000000000..cc84157fc --- /dev/null +++ b/ru/codes/ruby/chapter_searching/hashing_search.rb @@ -0,0 +1,47 @@ +=begin +File: hashing_search.rb +Created Time: 2024-04-09 +Author: Blue Bean (lonnnnnnner@gmail.com) +=end + +require_relative '../utils/list_node' + +# ## Хеш-поиск (массив) ### +def hashing_search_array(hmap, target) + # key хеш-таблицы: целевой элемент, value: индекс + # Если такого key нет в хеш-таблице, вернуть -1 + hmap[target] || -1 +end + +# ## Хеш-поиск (связный список) ### +def hashing_search_linkedlist(hmap, target) + # key хеш-таблицы: целевой элемент, value: объект узла + # Если такого key нет в хеш-таблице, вернуть None + hmap[target] || nil +end + +### Driver Code ### +if __FILE__ == $0 + target = 3 + + # Хеш-поиск (массив) + nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8] + # Инициализация хеш-таблицы + map0 = {} + for i in 0...nums.length + map0[nums[i]] = i # key: элемент, value: индекс + end + index = hashing_search_array(map0, target) + puts "Индекс целевого элемента 3 = #{index}" + + # Хеш-поиск (связный список) + head = arr_to_linked_list(nums) + # Инициализация хеш-таблицы + map1 = {} + while head + map1[head.val] = head + head = head.next + end + node = hashing_search_linkedlist(map1, target) + puts "Объект узла со значением 3 = #{node}" +end diff --git a/ru/codes/ruby/chapter_searching/linear_search.rb b/ru/codes/ruby/chapter_searching/linear_search.rb new file mode 100644 index 000000000..a59e24a0a --- /dev/null +++ b/ru/codes/ruby/chapter_searching/linear_search.rb @@ -0,0 +1,44 @@ +=begin +File: linear_search.rb +Created Time: 2024-04-09 +Author: Blue Bean (lonnnnnnner@gmail.com) +=end + +require_relative '../utils/list_node' + +# ## Линейный поиск (массив) ### +def linear_search_array(nums, target) + # Обход массива + for i in 0...nums.length + return i if nums[i] == target # Целевой элемент найден, вернуть его индекс + end + + -1 # Целевой элемент не найден, вернуть -1 +end + +# ## Линейный поиск (связный список) ### +def linear_search_linkedlist(head, target) + # Обойти связный список + while head + return head if head.val == target # Найти целевой узел и вернуть его + + head = head.next + end + + nil # Целевой узел не найден, вернуть None +end + +### Driver Code ### +if __FILE__ == $0 + target = 3 + + # Выполнить линейный поиск в массиве + nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8] + index = linear_search_array(nums, target) + puts "Индекс целевого элемента 3 = #{index}" + + # Выполнить линейный поиск в связном списке + head = arr_to_linked_list(nums) + node = linear_search_linkedlist(head, target) + puts "Объект узла со значением 3 = #{node}" +end diff --git a/ru/codes/ruby/chapter_searching/two_sum.rb b/ru/codes/ruby/chapter_searching/two_sum.rb new file mode 100644 index 000000000..311210a10 --- /dev/null +++ b/ru/codes/ruby/chapter_searching/two_sum.rb @@ -0,0 +1,46 @@ +=begin +File: two_sum.rb +Created Time: 2024-04-09 +Author: Blue Bean (lonnnnnnner@gmail.com) +=end + +# ## Метод 1: полный перебор ### +def two_sum_brute_force(nums, target) + # Два вложенных цикла, временная сложность O(n^2) + for i in 0...(nums.length - 1) + for j in (i + 1)...nums.length + return [i, j] if nums[i] + nums[j] == target + end + end + + [] +end + +# ## Метод 2: вспомогательная хеш-таблица ### +def two_sum_hash_table(nums, target) + # Вспомогательная хеш-таблица, пространственная сложность O(n) + dic = {} + # Один цикл, временная сложность O(n) + for i in 0...nums.length + return [dic[target - nums[i]], i] if dic.has_key?(target - nums[i]) + + dic[nums[i]] = i + end + + [] +end + +### Driver Code ### +if __FILE__ == $0 + # ======= Test Case ======= + nums = [2, 7, 11, 15] + target = 13 + + # ====== Основной код ====== + # Метод 1 + res = two_sum_brute_force(nums, target) + puts "Результат метода 1 res = #{res}" + # Метод 2 + res = two_sum_hash_table(nums, target) + puts "Результат метода 2 res = #{res}" +end diff --git a/ru/codes/ruby/chapter_sorting/bubble_sort.rb b/ru/codes/ruby/chapter_sorting/bubble_sort.rb new file mode 100644 index 000000000..e3eaa83c6 --- /dev/null +++ b/ru/codes/ruby/chapter_sorting/bubble_sort.rb @@ -0,0 +1,51 @@ +=begin +File: bubble_sort.rb +Created Time: 2024-05-02 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Пузырьковая сортировка ### +def bubble_sort(nums) + n = nums.length + # Внешний цикл: неотсортированный диапазон [0, i] + for i in (n - 1).downto(1) + # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for j in 0...i + if nums[j] > nums[j + 1] + # Поменять местами nums[j] и nums[j + 1] + nums[j], nums[j + 1] = nums[j + 1], nums[j] + end + end + end +end + +# ## Пузырьковая сортировка (оптимизация флагом) ### +def bubble_sort_with_flag(nums) + n = nums.length + # Внешний цикл: неотсортированный диапазон [0, i] + for i in (n - 1).downto(1) + flag = false # Инициализировать флаг + + # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for j in 0...i + if nums[j] > nums[j + 1] + # Поменять местами nums[j] и nums[j + 1] + nums[j], nums[j + 1] = nums[j + 1], nums[j] + flag = true # Записать обмен элементов + end + end + + break unless flag # На этой итерации «всплытия» не было ни одного обмена, сразу выйти + end +end + +### Driver Code ### +if __FILE__ == $0 + nums = [4, 1, 3, 1, 5, 2] + bubble_sort(nums) + puts "После пузырьковой сортировки nums = #{nums}" + + nums1 = [4, 1, 3, 1, 5, 2] + bubble_sort_with_flag(nums1) + puts "После пузырьковой сортировки nums = #{nums1}" +end diff --git a/ru/codes/ruby/chapter_sorting/bucket_sort.rb b/ru/codes/ruby/chapter_sorting/bucket_sort.rb new file mode 100644 index 000000000..5aa6a2e32 --- /dev/null +++ b/ru/codes/ruby/chapter_sorting/bucket_sort.rb @@ -0,0 +1,43 @@ +=begin +File: bucket_sort.rb +Created Time: 2024-04-17 +Author: Martin Xu (martin.xus@gmail.com) +=end + +# ## Сортировка корзинами ### +def bucket_sort(nums) + # Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину + k = nums.length / 2 + buckets = Array.new(k) { [] } + + # 1. Распределить элементы массива по корзинам + nums.each do |num| + # Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1] + i = (num * k).to_i + # Добавить num в корзину i + buckets[i] << num + end + + # 2. Выполнить сортировку внутри каждой корзины + buckets.each do |bucket| + # Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки + bucket.sort! + end + + # 3. Обойти корзины и объединить результаты + i = 0 + buckets.each do |bucket| + bucket.each do |num| + nums[i] = num + i += 1 + end + end +end + +### Driver Code ### +if __FILE__ == $0 + # Пусть входные данные — числа с плавающей точкой из диапазона [0, 1) + nums = [0.49, 0.96, 0.82, 0.09, 0.57, 0.43, 0.91, 0.75, 0.15, 0.37] + bucket_sort(nums) + puts "После сортировки корзинами nums = #{nums}" +end diff --git a/ru/codes/ruby/chapter_sorting/counting_sort.rb b/ru/codes/ruby/chapter_sorting/counting_sort.rb new file mode 100644 index 000000000..f65beafc3 --- /dev/null +++ b/ru/codes/ruby/chapter_sorting/counting_sort.rb @@ -0,0 +1,62 @@ +=begin +File: counting_sort.rb +Created Time: 2024-05-02 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Сортировка подсчетом ### +def counting_sort_naive(nums) + # Простая реализация, не подходит для сортировки объектов + # 1. Найти максимальный элемент массива m + m = 0 + nums.each { |num| m = [m, num].max } + # 2. Подсчитать число появлений каждой цифры + # counter[num] обозначает число появлений num + counter = Array.new(m + 1, 0) + nums.each { |num| counter[num] += 1 } + # 3. Обойти counter и заполнить исходный массив nums элементами + i = 0 + for num in 0...(m + 1) + (0...counter[num]).each do + nums[i] = num + i += 1 + end + end +end + +# ## Сортировка подсчетом ### +def counting_sort(nums) + # Полная реализация, позволяет сортировать объекты и является стабильной сортировкой + # 1. Найти максимальный элемент массива m + m = nums.max + # 2. Подсчитать число появлений каждой цифры + # counter[num] обозначает число появлений num + counter = Array.new(m + 1, 0) + nums.each { |num| counter[num] += 1 } + # 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс» + # То есть counter[num]-1 — это индекс последнего появления num в res + (0...m).each { |i| counter[i + 1] += counter[i] } + # 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res + # Инициализировать массив res для хранения результата + n = nums.length + res = Array.new(n, 0) + (n - 1).downto(0).each do |i| + num = nums[i] + res[counter[num] - 1] = num # Поместить num по соответствующему индексу + counter[num] -= 1 # Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num + end + # Перезаписать исходный массив nums массивом результата res + (0...n).each { |i| nums[i] = res[i] } +end + +### Driver Code ### +if __FILE__ == $0 + nums = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4] + + counting_sort_naive(nums) + puts "После сортировки подсчетом (объекты не поддерживаются) nums = #{nums}" + + nums1 = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4] + counting_sort(nums1) + puts "После сортировки подсчетом nums1 = #{nums1}" +end diff --git a/ru/codes/ruby/chapter_sorting/heap_sort.rb b/ru/codes/ruby/chapter_sorting/heap_sort.rb new file mode 100644 index 000000000..8df9d5ec0 --- /dev/null +++ b/ru/codes/ruby/chapter_sorting/heap_sort.rb @@ -0,0 +1,45 @@ +=begin +File: heap_sort.rb +Created Time: 2024-04-10 +Author: junminhong (junminhong1110@gmail.com) +=end + +# ## Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз ### +def sift_down(nums, n, i) + while true + # Определить узел с максимальным значением среди i, l и r и обозначить его как ma + l = 2 * i + 1 + r = 2 * i + 2 + ma = i + ma = l if l < n && nums[l] > nums[ma] + ma = r if r < n && nums[r] > nums[ma] + # Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + break if ma == i + # Поменять два узла местами + nums[i], nums[ma] = nums[ma], nums[i] + # Циклическое просеивание вниз + i = ma + end +end + +# ## Сортировка кучей ### +def heap_sort(nums) + # Построение кучи: выполнить heapify для всех узлов, кроме листовых + (nums.length / 2 - 1).downto(0) do |i| + sift_down(nums, nums.length, i) + end + # Извлекать максимальный элемент из кучи в течение n-1 итераций + (nums.length - 1).downto(1) do |i| + # Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + nums[0], nums[i] = nums[i], nums[0] + # Начиная с корневого узла, выполнить просеивание сверху вниз + sift_down(nums, i, 0) + end +end + +### Driver Code ### +if __FILE__ == $0 + nums = [4, 1, 3, 1, 5, 2] + heap_sort(nums) + puts "После сортировки кучей nums = #{nums.inspect}" +end diff --git a/ru/codes/ruby/chapter_sorting/insertion_sort.rb b/ru/codes/ruby/chapter_sorting/insertion_sort.rb new file mode 100644 index 000000000..c6e2f8cdc --- /dev/null +++ b/ru/codes/ruby/chapter_sorting/insertion_sort.rb @@ -0,0 +1,26 @@ +=begin +File: insertion_sort.rb +Created Time: 2024-04-02 +Author: Cy (3739004@gmail.com), Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Сортировка вставками ### +def insertion_sort(nums) + n = nums.length + # Внешний цикл: отсортированный диапазон [0, i-1] + for i in 1...n + base = nums[i] + j = i - 1 + # Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1] + while j >= 0 && nums[j] > base + nums[j + 1] = nums[j] # Сдвинуть nums[j] на одну позицию вправо + j -= 1 + end + nums[j + 1] = base # Поместить base в правильную позицию + end +end + +### Driver Code ### +nums = [4, 1, 3, 1, 5, 2] +insertion_sort(nums) +puts "После сортировки вставками nums = #{nums}" diff --git a/ru/codes/ruby/chapter_sorting/merge_sort.rb b/ru/codes/ruby/chapter_sorting/merge_sort.rb new file mode 100644 index 000000000..c33418557 --- /dev/null +++ b/ru/codes/ruby/chapter_sorting/merge_sort.rb @@ -0,0 +1,60 @@ +=begin +File: merge_sort.rb +Created Time: 2024-04-10 +Author: junminhong (junminhong1110@gmail.com) +=end + +# ## Слияние левого и правого подмассивов ### +def merge(nums, left, mid, right) + # Интервал левого подмассива: [left, mid], правого подмассива: [mid+1, right] + # Создать временный массив tmp для хранения результата слияния + tmp = Array.new(right - left + 1, 0) + # Инициализировать начальные индексы левого и правого подмассивов + i, j, k = left, mid + 1, 0 + # Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив + while i <= mid && j <= right + if nums[i] <= nums[j] + tmp[k] = nums[i] + i += 1 + else + tmp[k] = nums[j] + j += 1 + end + k += 1 + end + # Скопировать оставшиеся элементы левого и правого подмассивов во временный массив + while i <= mid + tmp[k] = nums[i] + i += 1 + k += 1 + end + while j <= right + tmp[k] = nums[j] + j += 1 + k += 1 + end + # Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums + (0...tmp.length).each do |k| + nums[left + k] = tmp[k] + end +end + +# ## Сортировка слиянием ### +def merge_sort(nums, left, right) + # Условие завершения + # Когда длина подмассива равна 1, рекурсия завершается + return if left >= right + # Этап разбиения + mid = left + (right - left) / 2 # Вычислить середину + merge_sort(nums, left, mid) # Рекурсивно обработать левый подмассив + merge_sort(nums, mid + 1, right) # Рекурсивно обработать правый подмассив + # Этап слияния + merge(nums, left, mid, right) +end + +### Driver Code ### +if __FILE__ == $0 + nums = [7, 3, 2, 6, 0, 1, 5, 4] + merge_sort(nums, 0, nums.length - 1) + puts "После сортировки слиянием nums = #{nums.inspect}" +end diff --git a/ru/codes/ruby/chapter_sorting/quick_sort.rb b/ru/codes/ruby/chapter_sorting/quick_sort.rb new file mode 100644 index 000000000..b6d6285c1 --- /dev/null +++ b/ru/codes/ruby/chapter_sorting/quick_sort.rb @@ -0,0 +1,153 @@ +=begin +File: quick_sort.rb +Created Time: 2024-04-01 +Author: Cy (3739004@gmail.com), Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Класс быстрой сортировки ### +class QuickSort + class << self + # ## Разбиение с опорными указателями ### + def partition(nums, left, right) + # Взять nums[left] в качестве опорного элемента + i, j = left, right + while i < j + while i < j && nums[j] >= nums[left] + j -= 1 # Идти справа налево в поисках первого элемента меньше опорного + end + while i < j && nums[i] <= nums[left] + i += 1 # Идти слева направо в поисках первого элемента больше опорного + end + # Обмен элементов + nums[i], nums[j] = nums[j], nums[i] + end + # Переместить опорный элемент на границу двух подмассивов + nums[i], nums[left] = nums[left], nums[i] + i # Вернуть индекс опорного элемента + end + + # ## Класс быстрой сортировки ### + def quick_sort(nums, left, right) + # Рекурсивно обрабатывать, пока длина подмассива не станет равной 1 + if left < right + # Разбиение с опорными указателями + pivot = partition(nums, left, right) + # Рекурсивно обработать левый и правый подмассивы + quick_sort(nums, left, pivot - 1) + quick_sort(nums, pivot + 1, right) + end + nums + end + end +end + +# ## Класс быстрой сортировки (оптимизация медианой) ### +class QuickSortMedian + class << self + # ## Выбрать медиану из трех кандидатов ### + def median_three(nums, left, mid, right) + # Выбрать медиану из трех кандидатов + _l, _m, _r = nums[left], nums[mid], nums[right] + # m находится между l и r + return mid if (_l <= _m && _m <= _r) || (_r <= _m && _m <= _l) + # l находится между m и r + return left if (_m <= _l && _l <= _r) || (_r <= _l && _l <= _m) + return right + end + + # ## Разбиение с опорными указателями (медиана трех) ### + def partition(nums, left, right) + # ## Использовать nums[left] как опорный элемент + med = median_three(nums, left, (left + right) / 2, right) + # Переместить медиану в крайний левый элемент массива + nums[left], nums[med] = nums[med], nums[left] + i, j = left, right + while i < j + while i < j && nums[j] >= nums[left] + j -= 1 # Идти справа налево в поисках первого элемента меньше опорного + end + while i < j && nums[i] <= nums[left] + i += 1 # Идти слева направо в поисках первого элемента больше опорного + end + # Обмен элементов + nums[i], nums[j] = nums[j], nums[i] + end + # Переместить опорный элемент на границу двух подмассивов + nums[i], nums[left] = nums[left], nums[i] + i # Вернуть индекс опорного элемента + end + + # ## Быстрая сортировка ### + def quick_sort(nums, left, right) + # Рекурсивно обрабатывать, пока длина подмассива не станет равной 1 + if left < right + # Разбиение с опорными указателями + pivot = partition(nums, left, right) + # Рекурсивно обработать левый и правый подмассивы + quick_sort(nums, left, pivot - 1) + quick_sort(nums, pivot + 1, right) + end + nums + end + end +end + +# ## Класс быстрой сортировки (оптимизация глубины рекурсии) ### +class QuickSortTailCall + class << self + # ## Разбиение с опорными указателями ### + def partition(nums, left, right) + # Использовать nums[left] как опорный элемент + i = left + j = right + while i < j + while i < j && nums[j] >= nums[left] + j -= 1 # Идти справа налево в поисках первого элемента меньше опорного + end + while i < j && nums[i] <= nums[left] + i += 1 # Идти слева направо в поисках первого элемента больше опорного + end + # Обмен элементов + nums[i], nums[j] = nums[j], nums[i] + end + # Переместить опорный элемент на границу двух подмассивов + nums[i], nums[left] = nums[left], nums[i] + i # Вернуть индекс опорного элемента + end + + # ## Быстрая сортировка (оптимизация глубины рекурсии) ### + def quick_sort(nums, left, right) + # Рекурсивно обрабатывать, пока длина подмассива не станет равной 1 + while left < right + # Разбиение с опорными указателями + pivot = partition(nums, left, right) + # Выполнить быструю сортировку для более короткого из двух подмассивов + if pivot - left < right - pivot + quick_sort(nums, left, pivot - 1) + left = pivot + 1 # Оставшийся неотсортированный диапазон: [pivot + 1, right] + else + quick_sort(nums, pivot + 1, right) + right = pivot - 1 # Оставшийся неотсортированный диапазон: [left, pivot - 1] + end + end + end + end +end + +### Driver Code ### +if __FILE__ == $0 + # Быстрая сортировка + nums = [2, 4, 1, 0, 3, 5] + QuickSort.quick_sort(nums, 0, nums.length - 1) + puts "После быстрой сортировки nums = #{nums}" + + # Быстрая сортировка (оптимизация медианным опорным элементом) + nums1 = [2, 4, 1, 0, 3, 5] + QuickSortMedian.quick_sort(nums1, 0, nums1.length - 1) + puts "После быстрой сортировки (оптимизация медианным опорным элементом) nums1 = #{nums1}" + + # Быстрая сортировка (оптимизация глубины рекурсии) + nums2 = [2, 4, 1, 0, 3, 5] + QuickSortTailCall.quick_sort(nums2, 0, nums2.length - 1) + puts "После быстрой сортировки (оптимизация глубины рекурсии) nums2 = #{nums2}" +end diff --git a/ru/codes/ruby/chapter_sorting/radix_sort.rb b/ru/codes/ruby/chapter_sorting/radix_sort.rb new file mode 100644 index 000000000..59a87ade5 --- /dev/null +++ b/ru/codes/ruby/chapter_sorting/radix_sort.rb @@ -0,0 +1,70 @@ +=begin +File: radix_sort.rb +Created Time: 2024-05-03 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Получить k-й разряд элемента num, где exp = 10^(k-1) ### +def digit(num, exp) + # Передача exp вместо k позволяет избежать повторного выполнения дорогостоящих вычислений степени + (num / exp) % 10 +end + +# ## Сортировка подсчетом (сортировка по k-му разряду nums) ### +def counting_sort_digit(nums, exp) + # Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10 + counter = Array.new(10, 0) + n = nums.length + # Подсчитать число появлений каждой цифры от 0 до 9 + for i in 0...n + d = digit(nums[i], exp) # Получить k-й разряд nums[i], обозначив его как d + counter[d] += 1 # Подсчитать число появлений цифры d + end + # Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива» + (1...10).each { |i| counter[i] += counter[i - 1] } + # Выполняя обратный проход, заполнить res элементами по статистике в корзинах + res = Array.new(n, 0) + for i in (n - 1).downto(0) + d = digit(nums[i], exp) + j = counter[d] - 1 # Получить индекс j цифры d в массиве + res[j] = nums[i] # Поместить текущий элемент по индексу j + counter[d] -= 1 # Уменьшить количество d на 1 + end + # Перезаписать исходный массив nums результатом + (0...n).each { |i| nums[i] = res[i] } +end + +# ## Поразрядная сортировка ### +def radix_sort(nums) + # Получить максимальный элемент массива, чтобы определить максимальное число разрядов + m = nums.max + # Проходить разряды от младшего к старшему + exp = 1 + while exp <= m + # Выполнить сортировку подсчетом по k-му разряду элементов массива + # k = 1 -> exp = 1 + # k = 2 -> exp = 10 + # то есть exp = 10^(k-1) + counting_sort_digit(nums, exp) + exp *= 10 + end +end + +### Driver Code ### +if __FILE__ == $0 + # Поразрядная сортировка + nums = [ + 10546151, + 35663510, + 42865989, + 34862445, + 81883077, + 88906420, + 72429244, + 30524779, + 82060337, + 63832996, + ] + radix_sort(nums) + puts "После поразрядной сортировки nums = #{nums}" +end diff --git a/ru/codes/ruby/chapter_sorting/selection_sort.rb b/ru/codes/ruby/chapter_sorting/selection_sort.rb new file mode 100644 index 000000000..64c8a9389 --- /dev/null +++ b/ru/codes/ruby/chapter_sorting/selection_sort.rb @@ -0,0 +1,29 @@ +=begin +File: selection_sort.rb +Created Time: 2024-05-03 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Сортировка выбором ### +def selection_sort(nums) + n = nums.length + # Внешний цикл: неотсортированный диапазон [i, n-1] + for i in 0...(n - 1) + # Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне + k = i + for j in (i + 1)...n + if nums[j] < nums[k] + k = j # Записать индекс минимального элемента + end + end + # Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона + nums[i], nums[k] = nums[k], nums[i] + end +end + +### Driver Code ### +if __FILE__ == $0 + nums = [4, 1, 3, 1, 5, 2] + selection_sort(nums) + puts "После сортировки выбором nums = #{nums}" +end diff --git a/ru/codes/ruby/chapter_stack_and_queue/array_deque.rb b/ru/codes/ruby/chapter_stack_and_queue/array_deque.rb new file mode 100644 index 000000000..ed889c9fd --- /dev/null +++ b/ru/codes/ruby/chapter_stack_and_queue/array_deque.rb @@ -0,0 +1,145 @@ +=begin +File: array_deque.rb +Created Time: 2024-04-05 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Двусторонняя очередь на основе кольцевого массива ### +class ArrayDeque + # ## Получение длины двусторонней очереди ### + attr_reader :size + + # ## Конструктор ### + def initialize(capacity) + @nums = Array.new(capacity, 0) + @front = 0 + @size = 0 + end + + # ## Получить вместимость двусторонней очереди ### + def capacity + @nums.length + end + + # ## Проверка, пуста ли двусторонняя очередь ### + def is_empty? + size.zero? + end + + # ## Добавление в голову очереди ### + def push_first(num) + if size == capacity + puts 'Двусторонняя очередь заполнена' + return + end + + # Указатель головы сдвигается на одну позицию влево + # С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост + @front = index(@front - 1) + # Добавить num в голову очереди + @nums[@front] = num + @size += 1 + end + + # ## Добавление в хвост очереди ### + def push_last(num) + if size == capacity + puts 'Двусторонняя очередь заполнена' + return + end + + # Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + rear = index(@front + size) + # Добавить num в хвост очереди + @nums[rear] = num + @size += 1 + end + + # ## Извлечение из головы очереди ### + def pop_first + num = peek_first + # Указатель головы сдвигается на одну позицию назад + @front = index(@front + 1) + @size -= 1 + num + end + + # ## Извлечение из хвоста очереди ### + def pop_last + num = peek_last + @size -= 1 + num + end + + # ## Доступ к элементу в начале очереди ### + def peek_first + raise IndexError, 'двусторонняя очередь пуста' if is_empty? + + @nums[@front] + end + + # ## Доступ к элементу в хвосте очереди ### + def peek_last + raise IndexError, 'двусторонняя очередь пуста' if is_empty? + + # Вычислить индекс хвостового элемента + last = index(@front + size - 1) + @nums[last] + end + + # ## Вернуть массив для вывода ### + def to_array + # Преобразовывать только элементы списка в пределах фактической длины + res = [] + for i in 0...size + res << @nums[index(@front + i)] + end + res + end + + private + + # ## Вычислить индекс в кольцевом массиве ### + def index(i) + # С помощью операции взятия по модулю соединить начало и конец массива + # Когда i выходит за конец массива, он возвращается в начало + # Когда i выходит за начало массива, он возвращается в конец + (i + capacity) % capacity + end +end + +### Driver Code ### +if __FILE__ == $0 + # Инициализация двусторонней очереди + deque = ArrayDeque.new(10) + deque.push_last(3) + deque.push_last(2) + deque.push_last(5) + puts "Двусторонняя очередь deque = #{deque.to_array}" + + # Доступ к элементу + peek_first = deque.peek_first + puts "Первый элемент peek_first = #{peek_first}" + peek_last = deque.peek_last + puts "Последний элемент peek_last = #{peek_last}" + + # Добавление элемента в очередь + deque.push_last(4) + puts "После добавления элемента 4 в хвост deque = #{deque.to_array}" + deque.push_first(1) + puts "После добавления элемента 1 в хвост deque = #{deque.to_array}" + + # Извлечение элемента из очереди + pop_last = deque.pop_last + puts "Извлечен элемент из хвоста = #{pop_last}, deque после извлечения из хвоста = #{deque.to_array}" + pop_first = deque.pop_first + puts "Извлечен элемент из головы = #{pop_first}, deque после извлечения из головы = #{deque.to_array}" + + # Получение длины двусторонней очереди + size = deque.size + puts "Длина двусторонней очереди size = #{size}" + + # Проверка, пуста ли двусторонняя очередь + is_empty = deque.is_empty? + puts "Пуста ли двусторонняя очередь = #{is_empty}" +end diff --git a/ru/codes/ruby/chapter_stack_and_queue/array_queue.rb b/ru/codes/ruby/chapter_stack_and_queue/array_queue.rb new file mode 100644 index 000000000..c930bac42 --- /dev/null +++ b/ru/codes/ruby/chapter_stack_and_queue/array_queue.rb @@ -0,0 +1,107 @@ +=begin +File: array_queue.rb +Created Time: 2024-04-05 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Очередь на основе кольцевого массива ### +class ArrayQueue + # ## Получение длины очереди ### + attr_reader :size + + # ## Конструктор ### + def initialize(size) + @nums = Array.new(size, 0) # Массив для хранения элементов очереди + @front = 0 # Указатель head, указывающий на первый элемент очереди + @size = 0 # Длина очереди + end + + # ## Получить вместимость очереди ### + def capacity + @nums.length + end + + # ## Проверка, пуста ли очередь ### + def is_empty? + size.zero? + end + + # ## Добавление в очередь ### + def push(num) + raise IndexError, 'очередь заполнена' if size == capacity + + # Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + # С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива + rear = (@front + size) % capacity + # Добавить num в хвост очереди + @nums[rear] = num + @size += 1 + end + + # ## Извлечение из очереди ### + def pop + num = peek + # Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива + @front = (@front + 1) % capacity + @size -= 1 + num + end + + # ## Доступ к элементу в начале очереди ### + def peek + raise IndexError, 'очередь пуста' if is_empty? + + @nums[@front] + end + + # ## Вернуть список для вывода ### + def to_array + res = Array.new(size, 0) + j = @front + + for i in 0...size + res[i] = @nums[j % capacity] + j += 1 + end + + res + end +end + +### Driver Code ### +if __FILE__ == $0 + # Инициализация очереди + queue = ArrayQueue.new(10) + + # Добавление элемента в очередь + queue.push(1) + queue.push(3) + queue.push(2) + queue.push(5) + queue.push(4) + puts "Очередь queue = #{queue.to_array}" + + # Доступ к элементу в начале очереди + peek = queue.peek + puts "Первый элемент peek = #{peek}" + + # Извлечение элемента из очереди + pop = queue.pop + puts "Извлеченный элемент pop = #{pop}" + puts "queue после извлечения = #{queue.to_array}" + + # Получение длины очереди + size = queue.size + puts "Длина очереди size = #{size}" + + # Проверка, пуста ли очередь + is_empty = queue.is_empty? + puts "Пуста ли очередь = #{is_empty}" + + # Проверка кольцевого массива + for i in 0...10 + queue.push(i) + queue.pop + puts "После #{i}-го цикла enqueue + dequeue queue = #{queue.to_array}" + end +end diff --git a/ru/codes/ruby/chapter_stack_and_queue/array_stack.rb b/ru/codes/ruby/chapter_stack_and_queue/array_stack.rb new file mode 100644 index 000000000..3d539bc78 --- /dev/null +++ b/ru/codes/ruby/chapter_stack_and_queue/array_stack.rb @@ -0,0 +1,78 @@ +=begin +File: array_stack.rb +Created Time: 2024-04-06 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Стек на основе массива ### +class ArrayStack + # ## Конструктор ### + def initialize + @stack = [] + end + + # ## Получить длину стека ### + def size + @stack.length + end + + # ## Проверка, пуст ли стек ### + def is_empty? + @stack.empty? + end + + # ## Помещение в стек ### + def push(item) + @stack << item + end + + # ## Извлечение из стека ### + def pop + raise IndexError, 'стек пуст' if is_empty? + + @stack.pop + end + + # ## Доступ к верхнему элементу стека ### + def peek + raise IndexError, 'стек пуст' if is_empty? + + @stack.last + end + + # ## Вернуть список для вывода ### + def to_array + @stack + end +end + +### Driver Code ### +if __FILE__ == $0 + # Инициализация стека + stack = ArrayStack.new + + # Помещение элемента в стек + stack.push(1) + stack.push(3) + stack.push(2) + stack.push(5) + stack.push(4) + puts "Стек stack = #{stack.to_array}" + + # Доступ к верхнему элементу стека + peek = stack.peek + puts "Верхний элемент peek = #{peek}" + + # Извлечение элемента из стека + pop = stack.pop + puts "Извлеченный элемент pop = #{pop}" + puts "stack после извлечения = #{stack.to_array}" + + # Получение длины стека + size = stack.size + puts "Длина стека size = #{size}" + + # Проверка на пустоту + is_empty = stack.is_empty? + puts "Пуст ли стек = #{is_empty}" +end diff --git a/ru/codes/ruby/chapter_stack_and_queue/deque.rb b/ru/codes/ruby/chapter_stack_and_queue/deque.rb new file mode 100644 index 000000000..f1ac4f729 --- /dev/null +++ b/ru/codes/ruby/chapter_stack_and_queue/deque.rb @@ -0,0 +1,42 @@ +=begin +File: deque.rb +Created Time: 2024-04-06 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +### Driver Code ### +if __FILE__ == $0 + # Инициализировать двустороннюю очередь + # В Ruby нет встроенной двусторонней очереди, поэтому Array можно использовать как двустороннюю очередь + deque = [] + + # Элемент помещается в очередь + deque << 2 + deque << 5 + deque << 4 + # Обратите внимание: поскольку используется массив, временная сложность метода Array#unshift равна O(n) + deque.unshift(3) + deque.unshift(1) + puts "Двусторонняя очередь deque = #{deque}" + + # Доступ к элементу + peek_first = deque.first + puts "Первый элемент peek_first = #{peek_first}" + peek_last = deque.last + puts "Последний элемент peek_last = #{peek_last}" + + # Элемент извлекается из очереди + # Обратите внимание: поскольку используется массив, временная сложность метода Array#shift равна O(n) + pop_front = deque.shift + puts "Извлечен элемент из головы pop_front = #{pop_front}, deque после извлечения из головы = #{deque}" + pop_back = deque.pop + puts "Извлечен элемент из хвоста pop_back = #{pop_back}, deque после извлечения из хвоста = #{deque}" + + # Получение длины двусторонней очереди + size = deque.length + puts "Длина двусторонней очереди size = #{size}" + + # Проверка, пуста ли двусторонняя очередь + is_empty = size.zero? + puts "Пуста ли двусторонняя очередь = #{is_empty}" +end diff --git a/ru/codes/ruby/chapter_stack_and_queue/linkedlist_deque.rb b/ru/codes/ruby/chapter_stack_and_queue/linkedlist_deque.rb new file mode 100644 index 000000000..c3396ca6a --- /dev/null +++ b/ru/codes/ruby/chapter_stack_and_queue/linkedlist_deque.rb @@ -0,0 +1,168 @@ +=begin +File: linkedlist_deque.rb +Created Time: 2024-04-06 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Узел двусвязного списка +class ListNode + attr_accessor :val + attr_accessor :next # Ссылка на узел-преемник + attr_accessor :prev # Ссылка на узел-предшественник + + # ## Конструктор ### + def initialize(val) + @val = val + end +end + +# ## Двусторонняя очередь на основе двусвязного списка ### +class LinkedListDeque + # ## Получение длины двусторонней очереди ### + attr_reader :size + + # ## Конструктор ### + def initialize + @front = nil # Головной узел front + @rear = nil # Хвостовой узел rear + @size = 0 # Длина двусторонней очереди + end + + # ## Проверка, пуста ли двусторонняя очередь ### + def is_empty? + size.zero? + end + + # ## Операция добавления в очередь ### + def push(num, is_front) + node = ListNode.new(num) + # Если связный список пуст, пусть front и rear оба указывают на node + if is_empty? + @front = @rear = node + # Операция добавления в голову очереди + elsif is_front + # Добавить node в голову списка + @front.prev = node + node.next = @front + @front = node # Обновить головной узел + # Операция добавления в хвост очереди + else + # Добавить node в хвост списка + @rear.next = node + node.prev = @rear + @rear = node # Обновить хвостовой узел + end + @size += 1 # Обновить длину очереди + end + + # ## Добавление в голову очереди ### + def push_first(num) + push(num, true) + end + + # ## Добавление в хвост очереди ### + def push_last(num) + push(num, false) + end + + # ## Операция извлечения из очереди ### + def pop(is_front) + raise IndexError, 'двусторонняя очередь пуста' if is_empty? + + # Операция извлечения из головы очереди + if is_front + val = @front.val # Временно сохранить значение головного узла + # Удалить головной узел + fnext = @front.next + unless fnext.nil? + fnext.prev = nil + @front.next = nil + end + @front = fnext # Обновить головной узел + # Операция извлечения из хвоста очереди + else + val = @rear.val # Временно сохранить значение хвостового узла + # Удалить хвостовой узел + rprev = @rear.prev + unless rprev.nil? + rprev.next = nil + @rear.prev = nil + end + @rear = rprev # Обновить хвостовой узел + end + @size -= 1 # Обновить длину очереди + + val + end + + # ## Извлечение из головы очереди ### + def pop_first + pop(true) + end + + # ## Извлечение из головы очереди ### + def pop_last + pop(false) + end + + # ## Доступ к элементу в начале очереди ### + def peek_first + raise IndexError, 'двусторонняя очередь пуста' if is_empty? + + @front.val + end + + # ## Доступ к элементу в хвосте очереди ### + def peek_last + raise IndexError, 'двусторонняя очередь пуста' if is_empty? + + @rear.val + end + + # ## Вернуть массив для вывода ### + def to_array + node = @front + res = Array.new(size, 0) + for i in 0...size + res[i] = node.val + node = node.next + end + res + end +end + +### Driver Code ### +if __FILE__ == $0 + # Инициализация двусторонней очереди + deque = LinkedListDeque.new + deque.push_last(3) + deque.push_last(2) + deque.push_last(5) + puts "Двусторонняя очередь deque = #{deque.to_array}" + + # Доступ к элементу + peek_first = deque.peek_first + puts "Первый элемент peek_first = #{peek_first}" + peek_last = deque.peek_last + puts "Последний элемент peek_last = #{peek_last}" + + # Добавление элемента в очередь + deque.push_last(4) + puts "После добавления элемента 4 в хвост deque = #{deque.to_array}" + deque.push_first(1) + puts "После добавления элемента 1 в голову deque = #{deque.to_array}" + + # Извлечение элемента из очереди + pop_last = deque.pop_last + puts "Извлечен элемент из хвоста = #{pop_last}, deque после извлечения из хвоста = #{deque.to_array}" + pop_first = deque.pop_first + puts "Извлечен элемент из головы = #{pop_first}, deque после извлечения из головы = #{deque.to_array}" + + # Получение длины двусторонней очереди + size = deque.size + puts "Длина двусторонней очереди size = #{size}" + + # Проверка, пуста ли двусторонняя очередь + is_empty = deque.is_empty? + puts "Пуста ли двусторонняя очередь = #{is_empty}" +end diff --git a/ru/codes/ruby/chapter_stack_and_queue/linkedlist_queue.rb b/ru/codes/ruby/chapter_stack_and_queue/linkedlist_queue.rb new file mode 100644 index 000000000..e4a2522a4 --- /dev/null +++ b/ru/codes/ruby/chapter_stack_and_queue/linkedlist_queue.rb @@ -0,0 +1,101 @@ +=begin +File: linkedlist_queue.rb +Created Time: 2024-04-06 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/list_node' + +# ## Очередь на основе связного списка ### +class LinkedListQueue + # ## Получение длины очереди ### + attr_reader :size + + # ## Конструктор ### + def initialize + @front = nil # Головной узел front + @rear = nil # Хвостовой узел rear + @size = 0 + end + + # ## Проверка, пуста ли очередь ### + def is_empty? + @front.nil? + end + + # ## Добавление в очередь ### + def push(num) + # Добавить num после хвостового узла + node = ListNode.new(num) + + # Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел + if @front.nil? + @front = node + @rear = node + # Если очередь не пуста, добавить этот узел после хвостового узла + else + @rear.next = node + @rear = node + end + + @size += 1 + end + + # ## Извлечение из очереди ### + def pop + num = peek + # Удалить головной узел + @front = @front.next + @size -= 1 + num + end + + # ## Доступ к элементу в начале очереди ### + def peek + raise IndexError, 'очередь пуста' if is_empty? + + @front.val + end + + # ## Преобразовать связный список в Array и вернуть ### + def to_array + queue = [] + temp = @front + while temp + queue << temp.val + temp = temp.next + end + queue + end +end + +### Driver Code ### +if __FILE__ == $0 + # Инициализация очереди + queue = LinkedListQueue.new + + # Элемент помещается в очередь + queue.push(1) + queue.push(3) + queue.push(2) + queue.push(5) + queue.push(4) + puts "Очередь queue = #{queue.to_array}" + + # Доступ к элементу в начале очереди + peek = queue.peek + puts "Первый элемент front = #{peek}" + + # Извлечение элемента из очереди + pop_front = queue.pop + puts "Извлеченный элемент pop = #{pop_front}" + puts "queue после извлечения = #{queue.to_array}" + + # Получение длины очереди + size = queue.size + puts "Длина очереди size = #{size}" + + # Проверка, пуста ли очередь + is_empty = queue.is_empty? + puts "Пуста ли очередь = #{is_empty}" +end diff --git a/ru/codes/ruby/chapter_stack_and_queue/linkedlist_stack.rb b/ru/codes/ruby/chapter_stack_and_queue/linkedlist_stack.rb new file mode 100644 index 000000000..2cf3165a0 --- /dev/null +++ b/ru/codes/ruby/chapter_stack_and_queue/linkedlist_stack.rb @@ -0,0 +1,87 @@ +=begin +File: linkedlist_stack.rb +Created Time: 2024-04-06 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/list_node' + +# ## Стек на основе связного списка ### +class LinkedListStack + attr_reader :size + + # ## Конструктор ### + def initialize + @size = 0 + end + + # ## Проверка, пуст ли стек ### + def is_empty? + @peek.nil? + end + + # ## Помещение в стек ### + def push(val) + node = ListNode.new(val) + node.next = @peek + @peek = node + @size += 1 + end + + # ## Извлечение из стека ### + def pop + num = peek + @peek = @peek.next + @size -= 1 + num + end + + # ## Доступ к верхнему элементу стека ### + def peek + raise IndexError, 'стек пуст' if is_empty? + + @peek.val + end + + # ## Преобразовать связный список в Array и вернуть ### + def to_array + arr = [] + node = @peek + while node + arr << node.val + node = node.next + end + arr.reverse + end +end + +### Driver Code ### +if __FILE__ == $0 + # Инициализация стека + stack = LinkedListStack.new + + # Помещение элемента в стек + stack.push(1) + stack.push(3) + stack.push(2) + stack.push(5) + stack.push(4) + puts "Стек stack = #{stack.to_array}" + + # Доступ к верхнему элементу стека + peek = stack.peek + puts "Верхний элемент peek = #{peek}" + + # Извлечение элемента из стека + pop = stack.pop + puts "Извлеченный элемент pop = #{pop}" + puts "stack после извлечения = #{stack.to_array}" + + # Получение длины стека + size = stack.size + puts "Длина стека size = #{size}" + + # Проверка на пустоту + is_empty = stack.is_empty? + puts "Пуст ли стек = #{is_empty}" +end diff --git a/ru/codes/ruby/chapter_stack_and_queue/queue.rb b/ru/codes/ruby/chapter_stack_and_queue/queue.rb new file mode 100644 index 000000000..26ae2a9d3 --- /dev/null +++ b/ru/codes/ruby/chapter_stack_and_queue/queue.rb @@ -0,0 +1,38 @@ +=begin +File: queue.rb +Created Time: 2024-04-06 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +### Driver Code ### +if __FILE__ == $0 + # Инициализировать очередь + # Во встроенной очереди Ruby (Thread::Queue) нет методов peek и обхода, поэтому Array можно использовать как очередь + queue = [] + + # Добавление элемента в очередь + queue.push(1) + queue.push(3) + queue.push(2) + queue.push(5) + queue.push(4) + puts "Очередь queue = #{queue}" + + # Обратиться к элементу очереди + peek = queue.first + puts "Первый элемент peek = #{peek}" + + # Элемент извлекается из очереди + # Обратите внимание: поскольку используется массив, временная сложность метода Array#shift равна O(n) + pop = queue.shift + puts "Извлеченный элемент pop = #{pop}" + puts "queue после извлечения = #{queue}" + + # Получение длины очереди + size = queue.length + puts "Длина очереди size = #{size}" + + # Проверка, пуста ли очередь + is_empty = queue.empty? + puts "Пуста ли очередь = #{is_empty}" +end diff --git a/ru/codes/ruby/chapter_stack_and_queue/stack.rb b/ru/codes/ruby/chapter_stack_and_queue/stack.rb new file mode 100644 index 000000000..67910a1b3 --- /dev/null +++ b/ru/codes/ruby/chapter_stack_and_queue/stack.rb @@ -0,0 +1,37 @@ +=begin +File: stack.rb +Created Time: 2024-04-06 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +### Driver Code ### +if __FILE__ == $0 + # Инициализировать стек + # В Ruby нет встроенного класса стека, поэтому Array можно использовать как стек + stack = [] + + # Помещение элемента в стек + stack << 1 + stack << 3 + stack << 2 + stack << 5 + stack << 4 + puts "Стек stack = #{stack}" + + # Доступ к верхнему элементу стека + peek = stack.last + puts "Верхний элемент peek = #{peek}" + + # Извлечение элемента из стека + pop = stack.pop + puts "Извлеченный элемент pop = #{pop}" + puts "stack после извлечения = #{stack}" + + # Получение длины стека + size = stack.length + puts "Длина стека size = #{size}" + + # Проверка на пустоту + is_empty = stack.empty? + puts "Пуст ли стек = #{is_empty}" +end diff --git a/ru/codes/ruby/chapter_tree/array_binary_tree.rb b/ru/codes/ruby/chapter_tree/array_binary_tree.rb new file mode 100644 index 000000000..f9c800d2a --- /dev/null +++ b/ru/codes/ruby/chapter_tree/array_binary_tree.rb @@ -0,0 +1,124 @@ +=begin +File: array_binary_tree.rb +Created Time: 2024-04-17 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/tree_node' +require_relative '../utils/print_util' + +# ## Класс двоичного дерева в массивном представлении ### +class ArrayBinaryTree + # ## Конструктор ### + def initialize(arr) + @tree = arr.to_a + end + + # ## Вместимость списка ### + def size + @tree.length + end + + # ## Получить значение узла с индексом i ### + def val(i) + # Если индекс выходит за границы, вернуть nil, обозначающий пустую ячейку + return if i < 0 || i >= size + + @tree[i] + end + + # ## Получить индекс левого дочернего узла узла с индексом i ### + def left(i) + 2 * i + 1 + end + + # ## Получить индекс правого дочернего узла узла с индексом i ### + def right(i) + 2 * i + 2 + end + + # ## Получить индекс родительского узла узла с индексом i ### + def parent(i) + (i - 1) / 2 + end + + # ## Обход в ширину ### + def level_order + @res = [] + + # Непосредственно обходить массив + for i in 0...size + @res << val(i) unless val(i).nil? + end + + @res + end + + # ## Обход в глубину ### + def dfs(i, order) + return if val(i).nil? + # Предварительный обход + @res << val(i) if order == :pre + dfs(left(i), order) + # Симметричный обход + @res << val(i) if order == :in + dfs(right(i), order) + # Обратный обход + @res << val(i) if order == :post + end + + # ## Предварительный обход ### + def pre_order + @res = [] + dfs(0, :pre) + @res + end + + # ## Симметричный обход ### + def in_order + @res = [] + dfs(0, :in) + @res + end + + # ## Обратный обход ### + def post_order + @res = [] + dfs(0, :post) + @res + end +end + +### Driver Code ### +if __FILE__ == $0 + # Инициализировать двоичное дерево + # Здесь используется функция, напрямую строящая двоичное дерево из массива + arr = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15] + root = arr_to_tree(arr) + puts "\nИнициализация двоичного дерева\n\n" + puts 'Массивное представление двоичного дерева:' + pp arr + puts 'Связное представление двоичного дерева:' + print_tree(root) + + # Класс двоичного дерева в массивном представлении + abt = ArrayBinaryTree.new(arr) + + # Доступ к узлу + i = 1 + l, r, _p = abt.left(i), abt.right(i), abt.parent(i) + puts "\nИндекс текущего узла = #{i}, значение = #{abt.val(i).inspect}" + puts "Индекс его левого дочернего узла = #{l}, значение = #{abt.val(l).inspect}" + puts "Индекс его правого дочернего узла = #{r}, значение = #{abt.val(r).inspect}" + puts "Индекс его родительского узла = #{_p}, значение = #{abt.val(_p).inspect}" + + # Обходить дерево + res = abt.level_order + puts "\nОбход в ширину: #{res}" + res = abt.pre_order + puts "Предварительный обход: #{res}" + res = abt.in_order + puts "Симметричный обход: #{res}" + res = abt.post_order + puts "Обратный обход: #{res}" +end diff --git a/ru/codes/ruby/chapter_tree/avl_tree.rb b/ru/codes/ruby/chapter_tree/avl_tree.rb new file mode 100644 index 000000000..16f01db66 --- /dev/null +++ b/ru/codes/ruby/chapter_tree/avl_tree.rb @@ -0,0 +1,216 @@ +=begin +File: avl_tree.rb +Created Time: 2024-04-17 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/tree_node' +require_relative '../utils/print_util' + +# ## AVL-дерево ### +class AVLTree + # ## Конструктор ### + def initialize + @root = nil + end + + # ## Получение корневого узла двоичного дерева ### + def get_root + @root + end + + # ## Получить высоту узла ### + def height(node) + # Высота пустого узла равна -1, высота листового узла равна 0 + return node.height unless node.nil? + + -1 + end + + # ## Обновить высоту узла ### + def update_height(node) + # Высота узла равна высоте более высокого поддерева + 1 + node.height = [height(node.left), height(node.right)].max + 1 + end + + # ## Получить коэффициент баланса ### + def balance_factor(node) + # Коэффициент баланса пустого узла равен 0 + return 0 if node.nil? + + # Коэффициент баланса узла = высота левого поддерева - высота правого поддерева + height(node.left) - height(node.right) + end + + # ## Операция правого вращения ### + def right_rotate(node) + child = node.left + grand_child = child.right + # Выполнить правое вращение узла node вокруг child + child.right = node + node.left = grand_child + # Обновить высоту узла + update_height(node) + update_height(child) + # Вернуть корневой узел поддерева после вращения + child + end + + # ## Операция левого вращения ### + def left_rotate(node) + child = node.right + grand_child = child.left + # Выполнить левое вращение узла node вокруг child + child.left = node + node.right = grand_child + # Обновить высоту узла + update_height(node) + update_height(child) + # Вернуть корневой узел поддерева после вращения + child + end + + # ## Выполнить вращение, чтобы снова сбалансировать поддерево ### + def rotate(node) + # Получить коэффициент баланса узла node + balance_factor = balance_factor(node) + # Обойти левое поддерево + if balance_factor > 1 + if balance_factor(node.left) >= 0 + # Правое вращение + return right_rotate(node) + else + # Сначала левое вращение, затем правое + node.left = left_rotate(node.left) + return right_rotate(node) + end + # Правостороннее дерево обхода + elsif balance_factor < -1 + if balance_factor(node.right) <= 0 + # Левое вращение + return left_rotate(node) + else + # Сначала правое вращение, затем левое + node.right = right_rotate(node.right) + return left_rotate(node) + end + end + # Дерево сбалансировано, вращение не требуется, вернуть сразу + node + end + + # ## Вставка узла ### + def insert(val) + @root = insert_helper(@root, val) + end + + # ## Рекурсивная вставка узла (вспомогательный метод) ### + def insert_helper(node, val) + return TreeNode.new(val) if node.nil? + # 1. Найти позицию вставки и вставить узел + if val < node.val + node.left = insert_helper(node.left, val) + elsif val > node.val + node.right = insert_helper(node.right, val) + else + # Повторяющийся узел не вставлять, сразу вернуть + return node + end + # Обновить высоту узла + update_height(node) + # 2. Выполнить вращение, чтобы снова сбалансировать поддерево + rotate(node) + end + + # ## Удаление узла ### + def remove(val) + @root = remove_helper(@root, val) + end + + # ## Рекурсивное удаление узла (вспомогательный метод) ### + def remove_helper(node, val) + return if node.nil? + # 1. Найти узел и удалить его + if val < node.val + node.left = remove_helper(node.left, val) + elsif val > node.val + node.right = remove_helper(node.right, val) + else + if node.left.nil? || node.right.nil? + child = node.left || node.right + # Число дочерних узлов = 0, удалить node и сразу вернуть + return if child.nil? + # Число дочерних узлов = 1, удалить node напрямую + node = child + else + # Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел + temp = node.right + while !temp.left.nil? + temp = temp.left + end + node.right = remove_helper(node.right, temp.val) + node.val = temp.val + end + end + # Обновить высоту узла + update_height(node) + # 2. Выполнить вращение, чтобы снова сбалансировать поддерево + rotate(node) + end + + # ## Поиск узла ### + def search(val) + cur = @root + # Искать в цикле и выйти после прохода за листовой узел + while !cur.nil? + # Целевой узел находится в правом поддереве cur + if cur.val < val + cur = cur.right + # Целевой узел находится в левом поддереве cur + elsif cur.val > val + cur = cur.left + # Найти целевой узел и выйти из цикла + else + break + end + end + # Вернуть целевой узел + cur + end +end + +### Driver Code ### +if __FILE__ == $0 + def test_insert(tree, val) + tree.insert(val) + puts "\nAVL-дерево после вставки узла #{val}:" + print_tree(tree.get_root) + end + + def test_remove(tree, val) + tree.remove(val) + puts "\nAVL-дерево после удаления узла #{val}:" + print_tree(tree.get_root) + end + + # Инициализация пустого AVL-дерева + avl_tree = AVLTree.new + + # Вставка узла + # Обратите внимание, как AVL-дерево сохраняет баланс после вставки узла + for val in [1, 2, 3, 4, 5, 8, 7, 9, 10, 6] + test_insert(avl_tree, val) + end + + # Вставка повторяющегося узла + test_insert(avl_tree, 7) + + # Удаление узла + # Обратите внимание, как AVL-дерево сохраняет баланс после удаления узла + test_remove(avl_tree, 8) # Удаление узла степени 0 + test_remove(avl_tree, 5) # Удаление узла степени 1 + test_remove(avl_tree, 4) # Удаление узла степени 2 + + result_node = avl_tree.search(7) + puts "\nНайденный объект узла = #{result_node}, значение узла = #{result_node.val}" +end diff --git a/ru/codes/ruby/chapter_tree/binary_search_tree.rb b/ru/codes/ruby/chapter_tree/binary_search_tree.rb new file mode 100644 index 000000000..ea7d0ea53 --- /dev/null +++ b/ru/codes/ruby/chapter_tree/binary_search_tree.rb @@ -0,0 +1,161 @@ +=begin +File: binary_search_tree.rb +Created Time: 2024-04-18 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/tree_node' +require_relative '../utils/print_util' + +# ## Двоичное дерево поиска ### +class BinarySearchTree + # ## Конструктор ### + def initialize + # Инициализировать пустое дерево + @root = nil + end + + # ## Получение корневого узла двоичного дерева ### + def get_root + @root + end + + # ## Поиск узла ### + def search(num) + cur = @root + + # Искать в цикле и выйти после прохода за листовой узел + while !cur.nil? + # Целевой узел находится в правом поддереве cur + if cur.val < num + cur = cur.right + # Целевой узел находится в левом поддереве cur + elsif cur.val > num + cur = cur.left + # Найти целевой узел и выйти из цикла + else + break + end + end + + cur + end + + # ## Вставка узла ### + def insert(num) + # Если дерево пусто, инициализировать корневой узел + if @root.nil? + @root = TreeNode.new(num) + return + end + + # Искать в цикле и выйти после прохода за листовой узел + cur, pre = @root, nil + while !cur.nil? + # Найти повторяющийся узел и сразу вернуть + return if cur.val == num + + pre = cur + # Позиция вставки находится в правом поддереве cur + if cur.val < num + cur = cur.right + # Позиция вставки находится в левом поддереве cur + else + cur = cur.left + end + end + + # Вставка узла + node = TreeNode.new(num) + if pre.val < num + pre.right = node + else + pre.left = node + end + end + + # ## Удаление узла ### + def remove(num) + # Если дерево пусто, сразу вернуть + return if @root.nil? + + # Искать в цикле и выйти после прохода за листовой узел + cur, pre = @root, nil + while !cur.nil? + # Найти узел для удаления и выйти из цикла + break if cur.val == num + + pre = cur + # Узел для удаления находится в правом поддереве cur + if cur.val < num + cur = cur.right + # Узел для удаления находится в левом поддереве cur + else + cur = cur.left + end + end + # Если узел для удаления отсутствует, сразу вернуть + return if cur.nil? + + # Число дочерних узлов = 0 или 1 + if cur.left.nil? || cur.right.nil? + # Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел + child = cur.left || cur.right + # Удалить узел cur + if cur != @root + if pre.left == cur + pre.left = child + else + pre.right = child + end + else + # Если удаляемый узел является корнем, заново назначить корневой узел + @root = child + end + # Число дочерних узлов = 2 + else + # Получить следующий узел после cur в симметричном обходе + tmp = cur.right + while !tmp.left.nil? + tmp = tmp.left + end + # Рекурсивно удалить узел tmp + remove(tmp.val) + # Перезаписать cur значением tmp + cur.val = tmp.val + end + end +end + +### Driver Code ### +if __FILE__ == $0 + # Инициализация двоичного дерева поиска + bst = BinarySearchTree.new + nums = [8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15] + # Обратите внимание: разные порядки вставки порождают разные двоичные деревья; данная последовательность может построить совершенное двоичное дерево + nums.each { |num| bst.insert(num) } + puts "\nИсходное двоичное дерево\n" + print_tree(bst.get_root) + + # Поиск узла + node = bst.search(7) + puts "\nНайденный объект узла: #{node}, значение узла = #{node.val}" + + # Вставка узла + bst.insert(16) + puts "\nПосле вставки узла 16 двоичное дерево имеет вид\n" + print_tree(bst.get_root) + + # Удаление узла + bst.remove(1) + puts "\nПосле удаления узла 1 двоичное дерево имеет вид\n" + print_tree(bst.get_root) + + bst.remove(2) + puts "\nПосле удаления узла 2 двоичное дерево имеет вид\n" + print_tree(bst.get_root) + + bst.remove(4) + puts "\nПосле удаления узла 4 двоичное дерево имеет вид\n" + print_tree(bst.get_root) +end diff --git a/ru/codes/ruby/chapter_tree/binary_tree.rb b/ru/codes/ruby/chapter_tree/binary_tree.rb new file mode 100644 index 000000000..196916137 --- /dev/null +++ b/ru/codes/ruby/chapter_tree/binary_tree.rb @@ -0,0 +1,38 @@ +=begin +File: binary_tree.rb +Created Time: 2024-04-18 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/tree_node' +require_relative '../utils/print_util' + +### Driver Code ### +if __FILE__ == $0 + # Инициализация двоичного дерева + # Инициализация узлов + n1 = TreeNode.new(1) + n2 = TreeNode.new(2) + n3 = TreeNode.new(3) + n4 = TreeNode.new(4) + n5 = TreeNode.new(5) + # Построить связи между узлами (указатели) + n1.left = n2 + n1.right = n3 + n2.left = n4 + n2.right = n5 + puts "\nИнициализация двоичного дерева\n\n" + print_tree(n1) + + # Вставка и удаление узлов + _p = TreeNode.new(0) + # Вставить узел _p между n1 -> n2 + n1.left = _p + _p.left = n2 + puts "\nПосле вставки узла _p\n\n" + print_tree(n1) + # Удаление узла + n1.left = n2 + puts "\nПосле удаления узла _p\n\n" + print_tree(n1) +end diff --git a/ru/codes/ruby/chapter_tree/binary_tree_bfs.rb b/ru/codes/ruby/chapter_tree/binary_tree_bfs.rb new file mode 100644 index 000000000..6668213f6 --- /dev/null +++ b/ru/codes/ruby/chapter_tree/binary_tree_bfs.rb @@ -0,0 +1,36 @@ +=begin +File: binary_tree_bfs.rb +Created Time: 2024-04-18 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/tree_node' +require_relative '../utils/print_util' + +# ## Обход в ширину ### +def level_order(root) + # Инициализировать очередь и добавить корневой узел + queue = [root] + # Инициализировать список для хранения последовательности обхода + res = [] + while !queue.empty? + node = queue.shift # Извлечение из очереди + res << node.val # Сохранить значение узла + queue << node.left unless node.left.nil? # Поместить левый дочерний узел в очередь + queue << node.right unless node.right.nil? # Поместить правый дочерний узел в очередь + end + res +end + +### Driver Code ### +if __FILE__ == $0 + # Инициализировать двоичное дерево + # Здесь используется функция, напрямую строящая двоичное дерево из массива + root = arr_to_tree([1, 2, 3, 4, 5, 6, 7]) + puts "\nИнициализация двоичного дерева\n\n" + print_tree(root) + + # Обход в ширину + res = level_order(root) + puts "\nПоследовательность печати узлов при обходе в ширину = #{res}" +end diff --git a/ru/codes/ruby/chapter_tree/binary_tree_dfs.rb b/ru/codes/ruby/chapter_tree/binary_tree_dfs.rb new file mode 100644 index 000000000..dce4ba09c --- /dev/null +++ b/ru/codes/ruby/chapter_tree/binary_tree_dfs.rb @@ -0,0 +1,62 @@ +=begin +File: binary_tree_dfs.rb +Created Time: 2024-04-18 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative '../utils/tree_node' +require_relative '../utils/print_util' + +# ## Предварительный обход ### +def pre_order(root) + return if root.nil? + + # Порядок обхода: корень -> левое поддерево -> правое поддерево + $res << root.val + pre_order(root.left) + pre_order(root.right) +end + +# ## Симметричный обход ### +def in_order(root) + return if root.nil? + + # Порядок обхода: левое поддерево -> корень -> правое поддерево + in_order(root.left) + $res << root.val + in_order(root.right) +end + +# ## Обратный обход ### +def post_order(root) + return if root.nil? + + # Порядок обхода: левое поддерево -> правое поддерево -> корень + post_order(root.left) + post_order(root.right) + $res << root.val +end + +### Driver Code ### +if __FILE__ == $0 + # Инициализировать двоичное дерево + # Здесь используется функция, напрямую строящая двоичное дерево из массива + root = arr_to_tree([1, 2, 3, 4, 5, 6, 7]) + puts "\nИнициализация двоичного дерева\n\n" + print_tree(root) + + # Предварительный обход + $res = [] + pre_order(root) + puts "\nПоследовательность печати узлов при предварительном обходе = #{$res}" + + # Симметричный обход + $res.clear + in_order(root) + puts "\nПоследовательность печати узлов при симметричном обходе = #{$res}" + + # Обратный обход + $res.clear + post_order(root) + puts "\nПоследовательность печати узлов при обратном обходе = #{$res}" +end diff --git a/ru/codes/ruby/test_all.rb b/ru/codes/ruby/test_all.rb new file mode 100644 index 000000000..a4d417800 --- /dev/null +++ b/ru/codes/ruby/test_all.rb @@ -0,0 +1,23 @@ +require 'open3' + +start_time = Time.now +ruby_code_dir = File.dirname(__FILE__) +files = Dir.glob("#{ruby_code_dir}/chapter_*/*.rb") + +errors = [] + +files.each do |file| + stdout, stderr, status = Open3.capture3("ruby #{file}") + errors << stderr unless status.success? +end + +puts "\x1b[34mTested #{files.count} files\x1b[m" + +unless errors.empty? + puts "\x1b[33mFound exception in #{errors.length} files\x1b[m" + raise errors.join("\n\n") +else + puts "\x1b[32mPASS\x1b[m" +end + +puts "Testing finishes after #{((Time.now - start_time) * 1000).round} ms" diff --git a/ru/codes/ruby/utils/list_node.rb b/ru/codes/ruby/utils/list_node.rb new file mode 100644 index 000000000..16ca3b8ba --- /dev/null +++ b/ru/codes/ruby/utils/list_node.rb @@ -0,0 +1,38 @@ +=begin +File: list_node.rb +Created Time: 2024-03-18 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Класс узла связного списка ### +class ListNode + attr_accessor :val # Значение узла + attr_accessor :next # Ссылка на следующий узел + + def initialize(val=0, next_node=nil) + @val = val + @next = next_node + end +end + +# ## Десериализация списка в связный список ### +def arr_to_linked_list(arr) + head = current = ListNode.new(arr[0]) + + for i in 1...arr.length + current.next = ListNode.new(arr[i]) + current = current.next + end + + head +end + +# ## Сериализация связного списка в список ### +def linked_list_to_arr(head) + arr = [] + + while head + arr << head.val + head = head.next + end +end diff --git a/ru/codes/ruby/utils/print_util.rb b/ru/codes/ruby/utils/print_util.rb new file mode 100644 index 000000000..115ac9b9d --- /dev/null +++ b/ru/codes/ruby/utils/print_util.rb @@ -0,0 +1,80 @@ +=begin +File: print_util.rb +Created Time: 2024-03-18 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +require_relative "./tree_node" + +# ## Вывести матрицу ### +def print_matrix(mat) + s = [] + mat.each { |arr| s << " #{arr.to_s}" } + puts "[\n#{s.join(",\n")}\n]" +end + +# ## Вывести связный список ### +def print_linked_list(head) + list = [] + while head + list << head.val + head = head.next + end + puts "#{list.join(" -> ")}" +end + +class Trunk + attr_accessor :prev, :str + + def initialize(prev, str) + @prev = prev + @str = str + end +end + +def show_trunk(p) + return if p.nil? + + show_trunk(p.prev) + print p.str +end + +# ## Вывести двоичное дерево ### +# Этот вывод дерева заимствован из TECHIE DELIGHT +# https://www.techiedelight.com/c-program-print-binary-tree/ +def print_tree(root, prev=nil, is_right=false) + return if root.nil? + + prev_str = " " + trunk = Trunk.new(prev, prev_str) + print_tree(root.right, trunk, true) + + if prev.nil? + trunk.str = "———" + elsif is_right + trunk.str = "/———" + prev_str = " |" + else + trunk.str = "\\———" + prev.str = prev_str + end + + show_trunk(trunk) + puts " #{root.val}" + prev.str = prev_str if prev + trunk.str = " |" + print_tree(root.left, trunk, false) +end + +# ## Вывести хеш-таблицу ### +def print_hash_map(hmap) + hmap.entries.each { |key, value| puts "#{key} -> #{value}" } +end + +# ## Вывести кучу ### +def print_heap(heap) + puts "Массивное представление кучи:#{heap}" + puts "Древовидное представление кучи:" + root = arr_to_tree(heap) + print_tree(root) +end diff --git a/ru/codes/ruby/utils/tree_node.rb b/ru/codes/ruby/utils/tree_node.rb new file mode 100644 index 000000000..68d3e5340 --- /dev/null +++ b/ru/codes/ruby/utils/tree_node.rb @@ -0,0 +1,53 @@ +=begin +File: tree_node.rb +Created Time: 2024-03-30 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Класс узла двоичного дерева ### +class TreeNode + attr_accessor :val # Значение узла + attr_accessor :height # Высота узла + attr_accessor :left # Ссылка на левый дочерний узел + attr_accessor :right # Ссылка на правый дочерний узел + + def initialize(val=0) + @val = val + @height = 0 + end +end + +# ## Десериализация списка в двоичное дерево: рекурсия ### +def arr_to_tree_dfs(arr, i) + # Если индекс выходит за длину массива или соответствующий элемент равен nil, вернуть nil + return if i < 0 || i >= arr.length || arr[i].nil? + # Построить текущий узел + root = TreeNode.new(arr[i]) + # Рекурсивно построить левое и правое поддеревья + root.left = arr_to_tree_dfs(arr, 2 * i + 1) + root.right = arr_to_tree_dfs(arr, 2 * i + 2) + root +end + +# ## Десериализация списка в двоичное дерево ### +def arr_to_tree(arr) + arr_to_tree_dfs(arr, 0) +end + +# ## Сериализация двоичного дерева в список: рекурсия ### +def tree_to_arr_dfs(root, i, res) + return if root.nil? + + res += Array.new(i - res.length + 1) if i >= res.length + res[i] = root.val + + tree_to_arr_dfs(root.left, 2 * i + 1, res) + tree_to_arr_dfs(root.right, 2 * i + 2, res) +end + +# ## Сериализация двоичного дерева в список ### +def tree_to_arr(root) + res = [] + tree_to_arr_dfs(root, 0, res) + res +end diff --git a/ru/codes/ruby/utils/vertex.rb b/ru/codes/ruby/utils/vertex.rb new file mode 100644 index 000000000..3596ffdc9 --- /dev/null +++ b/ru/codes/ruby/utils/vertex.rb @@ -0,0 +1,24 @@ +=begin +File: vertex.rb +Created Time: 2024-04-25 +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end + +# ## Класс вершины ### +class Vertex + attr_accessor :val + + def initialize(val) + @val = val + end +end + +# ## На вход подается список значений vals, на выходе возвращается список вершин vets ### +def vals_to_vets(vals) + Array.new(vals.length) { |i| Vertex.new(vals[i]) } +end + +# ## На вход подается список вершин vets, на выходе возвращается список значений vals ### +def vets_to_vals(vets) + Array.new(vets.length) { |i| vets[i].val } +end diff --git a/ru/codes/rust/.gitignore b/ru/codes/rust/.gitignore new file mode 100644 index 000000000..447098846 --- /dev/null +++ b/ru/codes/rust/.gitignore @@ -0,0 +1,2 @@ +target/ +Cargo.lock \ No newline at end of file diff --git a/ru/codes/rust/Cargo.toml b/ru/codes/rust/Cargo.toml new file mode 100644 index 000000000..160f9134c --- /dev/null +++ b/ru/codes/rust/Cargo.toml @@ -0,0 +1,413 @@ +[package] +name = "hello-algo-rust" +version = "0.1.0" +edition = "2021" +publish = false + +# Run Command: cargo run --bin time_complexity +[[bin]] +name = "time_complexity" +path = "chapter_computational_complexity/time_complexity.rs" + +# Run Command: cargo run --bin worst_best_time_complexity +[[bin]] +name = "worst_best_time_complexity" +path = "chapter_computational_complexity/worst_best_time_complexity.rs" + +# Run Command: cargo run --bin space_complexity +[[bin]] +name = "space_complexity" +path = "chapter_computational_complexity/space_complexity.rs" + +# Run Command: cargo run --bin iteration +[[bin]] +name = "iteration" +path = "chapter_computational_complexity/iteration.rs" + +# Run Command: cargo run --bin recursion +[[bin]] +name = "recursion" +path = "chapter_computational_complexity/recursion.rs" + +# Run Command: cargo run --bin two_sum +[[bin]] +name = "two_sum" +path = "chapter_searching/two_sum.rs" + +# Run Command: cargo run --bin array +[[bin]] +name = "array" +path = "chapter_array_and_linkedlist/array.rs" + +# Run Command: cargo run --bin linked_list +[[bin]] +name = "linked_list" +path = "chapter_array_and_linkedlist/linked_list.rs" + +# Run Command: cargo run --bin list +[[bin]] +name = "list" +path = "chapter_array_and_linkedlist/list.rs" + +# Run Command: cargo run --bin my_list +[[bin]] +name = "my_list" +path = "chapter_array_and_linkedlist/my_list.rs" + +# Run Command: cargo run --bin stack +[[bin]] +name = "stack" +path = "chapter_stack_and_queue/stack.rs" + +# Run Command: cargo run --bin linkedlist_stack +[[bin]] +name = "linkedlist_stack" +path = "chapter_stack_and_queue/linkedlist_stack.rs" + +# Run Command: cargo run --bin queue +[[bin]] +name = "queue" +path = "chapter_stack_and_queue/queue.rs" + +# Run Command: cargo run --bin linkedlist_queue +[[bin]] +name = "linkedlist_queue" +path = "chapter_stack_and_queue/linkedlist_queue.rs" + +# Run Command: cargo run --bin deque +[[bin]] +name = "deque" +path = "chapter_stack_and_queue/deque.rs" + +# Run Command: cargo run --bin array_deque +[[bin]] +name = "array_deque" +path = "chapter_stack_and_queue/array_deque.rs" + +# Run Command: cargo run --bin linkedlist_deque +[[bin]] +name = "linkedlist_deque" +path = "chapter_stack_and_queue/linkedlist_deque.rs" + +# Run Command: cargo run --bin simple_hash +[[bin]] +name = "simple_hash" +path = "chapter_hashing/simple_hash.rs" + +# Run Command: cargo run --bin hash_map +[[bin]] +name = "hash_map" +path = "chapter_hashing/hash_map.rs" + +# Run Command: cargo run --bin array_hash_map +[[bin]] +name = "array_hash_map" +path = "chapter_hashing/array_hash_map.rs" + +# Run Command: cargo run --bin build_in_hash +[[bin]] +name = "build_in_hash" +path = "chapter_hashing/build_in_hash.rs" + +# Run Command: cargo run --bin hash_map_chaining +[[bin]] +name = "hash_map_chaining" +path = "chapter_hashing/hash_map_chaining.rs" + +# Run Command: cargo run --bin hash_map_open_addressing +[[bin]] +name = "hash_map_open_addressing" +path = "chapter_hashing/hash_map_open_addressing.rs" + +# Run Command: cargo run --bin binary_search +[[bin]] +name = "binary_search" +path = "chapter_searching/binary_search.rs" + +# Run Command: cargo run --bin binary_search_edge +[[bin]] +name = "binary_search_edge" +path = "chapter_searching/binary_search_edge.rs" + +# Run Command: cargo run --bin binary_search_insertion +[[bin]] +name = "binary_search_insertion" +path = "chapter_searching/binary_search_insertion.rs" + +# Run Command: cargo run --bin bubble_sort +[[bin]] +name = "bubble_sort" +path = "chapter_sorting/bubble_sort.rs" + +# Run Command: cargo run --bin insertion_sort +[[bin]] +name = "insertion_sort" +path = "chapter_sorting/insertion_sort.rs" + +# Run Command: cargo run --bin quick_sort +[[bin]] +name = "quick_sort" +path = "chapter_sorting/quick_sort.rs" + +# Run Command: cargo run --bin merge_sort +[[bin]] +name = "merge_sort" +path = "chapter_sorting/merge_sort.rs" + +# Run Command: cargo run --bin selection_sort +[[bin]] +name = "selection_sort" +path = "chapter_sorting/selection_sort.rs" + +# Run Command: cargo run --bin bucket_sort +[[bin]] +name = "bucket_sort" +path = "chapter_sorting/bucket_sort.rs" + +# Run Command: cargo run --bin heap_sort +[[bin]] +name = "heap_sort" +path = "chapter_sorting/heap_sort.rs" + +# Run Command: cargo run --bin counting_sort +[[bin]] +name = "counting_sort" +path = "chapter_sorting/counting_sort.rs" + +# Run Command: cargo run --bin radix_sort +[[bin]] +name = "radix_sort" +path = "chapter_sorting/radix_sort.rs" + +# Run Command: cargo run --bin array_stack +[[bin]] +name = "array_stack" +path = "chapter_stack_and_queue/array_stack.rs" + +# Run Command: cargo run --bin array_queue +[[bin]] +name = "array_queue" +path = "chapter_stack_and_queue/array_queue.rs" + +# Run Command: cargo run --bin array_binary_tree +[[bin]] +name = "array_binary_tree" +path = "chapter_tree/array_binary_tree.rs" + +# Run Command: cargo run --bin avl_tree +[[bin]] +name = "avl_tree" +path = "chapter_tree/avl_tree.rs" + +# Run Command: cargo run --bin binary_search_tree +[[bin]] +name = "binary_search_tree" +path = "chapter_tree/binary_search_tree.rs" + +# Run Command: cargo run --bin binary_tree_bfs +[[bin]] +name = "binary_tree_bfs" +path = "chapter_tree/binary_tree_bfs.rs" + +# Run Command: cargo run --bin binary_tree_dfs +[[bin]] +name = "binary_tree_dfs" +path = "chapter_tree/binary_tree_dfs.rs" + +# Run Command: cargo run --bin binary_tree +[[bin]] +name = "binary_tree" +path = "chapter_tree/binary_tree.rs" + +# Run Command: cargo run --bin heap +[[bin]] +name = "heap" +path = "chapter_heap/heap.rs" + +# Run Command: cargo run --bin my_heap +[[bin]] +name = "my_heap" +path = "chapter_heap/my_heap.rs" + +# Run Command: cargo run --bin top_k +[[bin]] +name = "top_k" +path = "chapter_heap/top_k.rs" + +# Run Command: cargo run --bin graph_adjacency_list +[[bin]] +name = "graph_adjacency_list" +path = "chapter_graph/graph_adjacency_list.rs" + +# Run Command: cargo run --bin graph_adjacency_matrix +[[bin]] +name = "graph_adjacency_matrix" +path = "chapter_graph/graph_adjacency_matrix.rs" + +# Run Command: cargo run --bin graph_bfs +[[bin]] +name = "graph_bfs" +path = "chapter_graph/graph_bfs.rs" + +# Run Command: cargo run --bin graph_dfs +[[bin]] +name = "graph_dfs" +path = "chapter_graph/graph_dfs.rs" + +# Run Command: cargo run --bin linear_search +[[bin]] +name = "linear_search" +path = "chapter_searching/linear_search.rs" + +# Run Command: cargo run --bin hashing_search +[[bin]] +name = "hashing_search" +path = "chapter_searching/hashing_search.rs" + +# Run Command: cargo run --bin climbing_stairs_dfs +[[bin]] +name = "climbing_stairs_dfs" +path = "chapter_dynamic_programming/climbing_stairs_dfs.rs" + +# Run Command: cargo run --bin climbing_stairs_dfs_mem +[[bin]] +name = "climbing_stairs_dfs_mem" +path = "chapter_dynamic_programming/climbing_stairs_dfs_mem.rs" + +# Run Command: cargo run --bin climbing_stairs_dp +[[bin]] +name = "climbing_stairs_dp" +path = "chapter_dynamic_programming/climbing_stairs_dp.rs" + +# Run Command: cargo run --bin min_cost_climbing_stairs_dp +[[bin]] +name = "min_cost_climbing_stairs_dp" +path = "chapter_dynamic_programming/min_cost_climbing_stairs_dp.rs" + +# Run Command: cargo run --bin climbing_stairs_constraint_dp +[[bin]] +name = "climbing_stairs_constraint_dp" +path = "chapter_dynamic_programming/climbing_stairs_constraint_dp.rs" + +# Run Command: cargo run --bin climbing_stairs_backtrack +[[bin]] +name = "climbing_stairs_backtrack" +path = "chapter_dynamic_programming/climbing_stairs_backtrack.rs" + +# Run Command: cargo run --bin subset_sum_i_naive +[[bin]] +name = "subset_sum_i_naive" +path = "chapter_backtracking/subset_sum_i_naive.rs" + +# Run Command: cargo run --bin subset_sum_i +[[bin]] +name = "subset_sum_i" +path = "chapter_backtracking/subset_sum_i.rs" + +# Run Command: cargo run --bin subset_sum_ii +[[bin]] +name = "subset_sum_ii" +path = "chapter_backtracking/subset_sum_ii.rs" + +# Run Command: cargo run --bin coin_change +[[bin]] +name = "coin_change" +path = "chapter_dynamic_programming/coin_change.rs" + +# Run Command: cargo run --bin coin_change_ii +[[bin]] +name = "coin_change_ii" +path = "chapter_dynamic_programming/coin_change_ii.rs" + +# Run Command: cargo run --bin unbounded_knapsack +[[bin]] +name = "unbounded_knapsack" +path = "chapter_dynamic_programming/unbounded_knapsack.rs" + +# Run Command: cargo run --bin knapsack +[[bin]] +name = "knapsack" +path = "chapter_dynamic_programming/knapsack.rs" + +# Run Command: cargo run --bin min_path_sum +[[bin]] +name = "min_path_sum" +path = "chapter_dynamic_programming/min_path_sum.rs" + +# Run Command: cargo run --bin edit_distance +[[bin]] +name = "edit_distance" +path = "chapter_dynamic_programming/edit_distance.rs" + +# Run Command: cargo run --bin n_queens +[[bin]] +name = "n_queens" +path = "chapter_backtracking/n_queens.rs" + +# Run Command: cargo run --bin permutations_i +[[bin]] +name = "permutations_i" +path = "chapter_backtracking/permutations_i.rs" + +# Run Command: cargo run --bin permutations_ii +[[bin]] +name = "permutations_ii" +path = "chapter_backtracking/permutations_ii.rs" + +# Run Command: cargo run --bin preorder_traversal_i_compact +[[bin]] +name = "preorder_traversal_i_compact" +path = "chapter_backtracking/preorder_traversal_i_compact.rs" + +# Run Command: cargo run --bin preorder_traversal_ii_compact +[[bin]] +name = "preorder_traversal_ii_compact" +path = "chapter_backtracking/preorder_traversal_ii_compact.rs" + +# Run Command: cargo run --bin preorder_traversal_iii_compact +[[bin]] +name = "preorder_traversal_iii_compact" +path = "chapter_backtracking/preorder_traversal_iii_compact.rs" + +# Run Command: cargo run --bin preorder_traversal_iii_template +[[bin]] +name = "preorder_traversal_iii_template" +path = "chapter_backtracking/preorder_traversal_iii_template.rs" + +# Run Command: cargo run --bin binary_search_recur +[[bin]] +name = "binary_search_recur" +path = "chapter_divide_and_conquer/binary_search_recur.rs" + +# Run Command: cargo run --bin hanota +[[bin]] +name = "hanota" +path = "chapter_divide_and_conquer/hanota.rs" + +# Run Command: cargo run --bin build_tree +[[bin]] +name = "build_tree" +path = "chapter_divide_and_conquer/build_tree.rs" + +# Run Command: cargo run --bin coin_change_greedy +[[bin]] +name = "coin_change_greedy" +path = "chapter_greedy/coin_change_greedy.rs" + +# Run Command: cargo run --bin fractional_knapsack +[[bin]] +name = "fractional_knapsack" +path = "chapter_greedy/fractional_knapsack.rs" + +# Run Command: cargo run --bin max_capacity +[[bin]] +name = "max_capacity" +path = "chapter_greedy/max_capacity.rs" + +# Run Command: cargo run --bin max_product_cutting +[[bin]] +name = "max_product_cutting" +path = "chapter_greedy/max_product_cutting.rs" + +[dependencies] +rand = "0.8.5" diff --git a/ru/codes/rust/chapter_array_and_linkedlist/array.rs b/ru/codes/rust/chapter_array_and_linkedlist/array.rs new file mode 100644 index 000000000..9e256ed48 --- /dev/null +++ b/ru/codes/rust/chapter_array_and_linkedlist/array.rs @@ -0,0 +1,111 @@ +/* + * File: array.rs + * Created Time: 2023-01-15 + * Author: xBLACICEx (xBLACKICEx@outlook.com), codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::print_util; +use rand::Rng; + +/* Случайный доступ к элементу */ +fn random_access(nums: &[i32]) -> i32 { + // Случайным образом выбрать число из интервала [0, nums.len()) + let random_index = rand::thread_rng().gen_range(0..nums.len()); + // Получить и вернуть случайный элемент + let random_num = nums[random_index]; + random_num +} + +/* Увеличить длину массива */ +fn extend(nums: &[i32], enlarge: usize) -> Vec { + // Инициализировать массив увеличенной длины + let mut res: Vec = vec![0; nums.len() + enlarge]; + // Скопировать все элементы исходного массива в новый + res[0..nums.len()].copy_from_slice(nums); + + // Вернуть новый массив после расширения + res +} + +/* Вставить элемент num по индексу index в массив */ +fn insert(nums: &mut [i32], num: i32, index: usize) { + // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад + for i in (index + 1..nums.len()).rev() { + nums[i] = nums[i - 1]; + } + // Присвоить num элементу по индексу index + nums[index] = num; +} + +/* Удалить элемент по индексу index */ +fn remove(nums: &mut [i32], index: usize) { + // Сдвинуть все элементы после индекса index на одну позицию вперед + for i in index..nums.len() - 1 { + nums[i] = nums[i + 1]; + } +} + +/* Обход массива */ +fn traverse(nums: &[i32]) { + let mut _count = 0; + // Обход массива по индексам + for i in 0..nums.len() { + _count += nums[i]; + } + // Непосредственно обходить элементы массива + _count = 0; + for &num in nums { + _count += num; + } +} + +/* Найти заданный элемент в массиве */ +fn find(nums: &[i32], target: i32) -> Option { + for i in 0..nums.len() { + if nums[i] == target { + return Some(i); + } + } + None +} + +/* Driver Code */ +fn main() { + /* Инициализация массива */ + let arr: [i32; 5] = [0; 5]; + print!("Массив arr = "); + print_util::print_array(&arr); + // В Rust при указании длины ([i32; 5]) получается массив, а без указания длины (&[i32]) — срез + // Так как массивы в Rust имеют длину, определяемую на этапе компиляции, для задания длины можно использовать только константы + // Vector обычно используется в Rust как тип динамического массива + // Для удобства реализации метода расширения extend() ниже vector рассматривается как массив (array) + let nums: Vec = vec![1, 3, 2, 5, 4]; + print!("\nМассив nums = "); + print_util::print_array(&nums); + + // Случайный доступ + let random_num = random_access(&nums); + println!("\nСлучайный элемент из nums = {}", random_num); + + // Расширение длины + let mut nums: Vec = extend(&nums, 3); + print!("После увеличения длины массива до 8 nums = "); + print_util::print_array(&nums); + + // Вставка элемента + insert(&mut nums, 6, 3); + print!("\nПосле вставки числа 6 по индексу 3 nums = "); + print_util::print_array(&nums); + + // Удаление элемента + remove(&mut nums, 2); + print!("\nПосле удаления элемента по индексу 2 nums = "); + print_util::print_array(&nums); + + // Обход массива + traverse(&nums); + + // Поиск элемента + let index = find(&nums, 3).unwrap(); + println!("\nПоиск элемента 3 в nums: индекс = {}", index); +} diff --git a/ru/codes/rust/chapter_array_and_linkedlist/linked_list.rs b/ru/codes/rust/chapter_array_and_linkedlist/linked_list.rs new file mode 100644 index 000000000..845b60965 --- /dev/null +++ b/ru/codes/rust/chapter_array_and_linkedlist/linked_list.rs @@ -0,0 +1,100 @@ +/* + * File: linked_list.rs + * Created Time: 2023-03-05 + * Author: codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::{print_util, ListNode}; +use std::cell::RefCell; +use std::rc::Rc; + +/* Вставить узел P после узла n0 в связном списке */ +#[allow(non_snake_case)] +pub fn insert(n0: &Rc>>, P: Rc>>) { + let n1 = n0.borrow_mut().next.take(); + P.borrow_mut().next = n1; + n0.borrow_mut().next = Some(P); +} + +/* Удалить первый узел после узла n0 в связном списке */ +#[allow(non_snake_case)] +pub fn remove(n0: &Rc>>) { + // n0 -> P -> n1 + let P = n0.borrow_mut().next.take(); + if let Some(node) = P { + let n1 = node.borrow_mut().next.take(); + n0.borrow_mut().next = n1; + } +} + +/* Доступ к узлу связного списка по индексу index */ +pub fn access(head: Rc>>, index: i32) -> Option>>> { + fn dfs( + head: Option<&Rc>>>, + index: i32, + ) -> Option>>> { + if index <= 0 { + return head.cloned(); + } + + if let Some(node) = head { + dfs(node.borrow().next.as_ref(), index - 1) + } else { + None + } + } + + dfs(Some(head).as_ref(), index) +} + +/* Найти в связном списке первый узел со значением target */ +pub fn find(head: Rc>>, target: T) -> i32 { + fn find(head: Option<&Rc>>>, target: T, idx: i32) -> i32 { + if let Some(node) = head { + if node.borrow().val == target { + return idx; + } + return find(node.borrow().next.as_ref(), target, idx + 1); + } else { + -1 + } + } + + find(Some(head).as_ref(), target, 0) +} + +/* Driver Code */ +fn main() { + /* Инициализация связного списка */ + // Инициализация всех узлов + let n0 = ListNode::new(1); + let n1 = ListNode::new(3); + let n2 = ListNode::new(2); + let n3 = ListNode::new(5); + let n4 = ListNode::new(4); + // Построить ссылки между узлами + n0.borrow_mut().next = Some(n1.clone()); + n1.borrow_mut().next = Some(n2.clone()); + n2.borrow_mut().next = Some(n3.clone()); + n3.borrow_mut().next = Some(n4.clone()); + print!("Исходный связный список "); + print_util::print_linked_list(&n0); + + /* Вставка узла */ + insert(&n0, ListNode::new(0)); + print!("Связный список после вставки узла "); + print_util::print_linked_list(&n0); + + /* Удаление узла */ + remove(&n0); + print!("Связный список после удаления узла "); + print_util::print_linked_list(&n0); + + /* Доступ к узлу */ + let node = access(n0.clone(), 3); + println!("Значение узла по индексу 3 в связном списке = {}", node.unwrap().borrow().val); + + /* Поиск узла */ + let index = find(n0.clone(), 2); + println!("Индекс узла со значением 2 в связном списке = {}", index); +} diff --git a/ru/codes/rust/chapter_array_and_linkedlist/list.rs b/ru/codes/rust/chapter_array_and_linkedlist/list.rs new file mode 100644 index 000000000..6143f9005 --- /dev/null +++ b/ru/codes/rust/chapter_array_and_linkedlist/list.rs @@ -0,0 +1,71 @@ +/* + * File: list.rs + * Created Time: 2023-01-18 + * Author: xBLACICEx (xBLACKICEx@outlook.com), codingonion (coderonion@gmail.com) + */ +use hello_algo_rust::include::print_util; + +/* Driver Code */ +fn main() { + // Инициализация списка + let mut nums: Vec = vec![1, 3, 2, 5, 4]; + print!("Список nums = "); + print_util::print_array(&nums); + + // Доступ к элементу + let num = nums[1]; + println!("\nЭлемент по индексу 1: num = {num}"); + + // Обновление элемента + nums[1] = 0; + print!("После обновления элемента по индексу 1 до 0 nums = "); + print_util::print_array(&nums); + + // Очистить список + nums.clear(); + print!("\nПосле очистки списка nums = "); + print_util::print_array(&nums); + + // Добавление элемента в конец + nums.push(1); + nums.push(3); + nums.push(2); + nums.push(5); + nums.push(4); + print!("\nПосле добавления элементов nums = "); + print_util::print_array(&nums); + + // Вставка элемента в середину + nums.insert(3, 6); + print!("\nПосле вставки числа 6 по индексу 3 nums = "); + print_util::print_array(&nums); + + // Удаление элемента + nums.remove(3); + print!("\nПосле удаления элемента по индексу 3 nums = "); + print_util::print_array(&nums); + + // Обходить список по индексам + let mut _count = 0; + for i in 0..nums.len() { + _count += nums[i]; + } + // Непосредственно обходить элементы списка + _count = 0; + for x in &nums { + _count += x; + } + + // Объединить два списка + let mut nums1 = vec![6, 8, 7, 10, 9]; + nums.append(&mut nums1); // После append (перемещение) nums1 становится пустым! + + // nums.extend(&nums1); // extend (заимствование), nums1 можно продолжать использовать + print!("\nПосле конкатенации списка nums1 к nums nums = "); + print_util::print_array(&nums); + + // Отсортировать список + nums.sort(); + print!("\nПосле сортировки списка nums = "); + print_util::print_array(&nums); +} diff --git a/ru/codes/rust/chapter_array_and_linkedlist/my_list.rs b/ru/codes/rust/chapter_array_and_linkedlist/my_list.rs new file mode 100644 index 000000000..e6085bc7f --- /dev/null +++ b/ru/codes/rust/chapter_array_and_linkedlist/my_list.rs @@ -0,0 +1,164 @@ +/* + * File: my_list.rs + * Created Time: 2023-03-11 + * Author: codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::print_util; + +/* Класс списка */ +#[allow(dead_code)] +struct MyList { + arr: Vec, // Массив (для хранения элементов списка) + capacity: usize, // Вместимость списка + size: usize, // Длина списка (текущее число элементов) + extend_ratio: usize, // Коэффициент увеличения списка при каждом расширении +} + +#[allow(unused, unused_comparisons)] +impl MyList { + /* Конструктор */ + pub fn new(capacity: usize) -> Self { + let mut vec = vec![0; capacity]; + Self { + arr: vec, + capacity, + size: 0, + extend_ratio: 2, + } + } + + /* Получить длину списка (текущее число элементов) */ + pub fn size(&self) -> usize { + return self.size; + } + + /* Получить вместимость списка */ + pub fn capacity(&self) -> usize { + return self.capacity; + } + + /* Доступ к элементу */ + pub fn get(&self, index: usize) -> i32 { + // Если индекс выходит за границы, выбрасывается исключение; далее аналогично + if index >= self.size { + panic!("индекс выходит за границы") + }; + return self.arr[index]; + } + + /* Обновление элемента */ + pub fn set(&mut self, index: usize, num: i32) { + if index >= self.size { + panic!("индекс выходит за границы") + }; + self.arr[index] = num; + } + + /* Добавление элемента в конец */ + pub fn add(&mut self, num: i32) { + // При превышении вместимости по числу элементов запускается расширение + if self.size == self.capacity() { + self.extend_capacity(); + } + self.arr[self.size] = num; + // Обновить число элементов + self.size += 1; + } + + /* Вставка элемента в середину */ + pub fn insert(&mut self, index: usize, num: i32) { + if index >= self.size() { + panic!("индекс выходит за границы") + }; + // При превышении вместимости по числу элементов запускается расширение + if self.size == self.capacity() { + self.extend_capacity(); + } + // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад + for j in (index..self.size).rev() { + self.arr[j + 1] = self.arr[j]; + } + self.arr[index] = num; + // Обновить число элементов + self.size += 1; + } + + /* Удаление элемента */ + pub fn remove(&mut self, index: usize) -> i32 { + if index >= self.size() { + panic!("индекс выходит за границы") + }; + let num = self.arr[index]; + // Сдвинуть все элементы после индекса index на одну позицию вперед + for j in index..self.size - 1 { + self.arr[j] = self.arr[j + 1]; + } + // Обновить число элементов + self.size -= 1; + // Вернуть удаленный элемент + return num; + } + + /* Расширение списка */ + pub fn extend_capacity(&mut self) { + // Создать новый массив длиной в extend_ratio раз больше исходного и скопировать в него исходный массив + let new_capacity = self.capacity * self.extend_ratio; + self.arr.resize(new_capacity, 0); + // Обновить вместимость списка + self.capacity = new_capacity; + } + + /* Преобразовать список в массив */ + pub fn to_array(&self) -> Vec { + // Преобразовывать только элементы списка в пределах фактической длины + let mut arr = Vec::new(); + for i in 0..self.size { + arr.push(self.get(i)); + } + arr + } +} + +/* Driver Code */ +fn main() { + /* Инициализация списка */ + let mut nums = MyList::new(10); + /* Добавление элемента в конец */ + nums.add(1); + nums.add(3); + nums.add(2); + nums.add(5); + nums.add(4); + print!("Список nums = "); + print_util::print_array(&nums.to_array()); + print!(" , вместимость = {} , длина = {}", nums.capacity(), nums.size()); + + /* Вставка элемента в середину */ + nums.insert(3, 6); + print!("\nПосле вставки числа 6 по индексу 3 nums = "); + print_util::print_array(&nums.to_array()); + + /* Удаление элемента */ + nums.remove(3); + print!("\nПосле удаления элемента по индексу 3 nums = "); + print_util::print_array(&nums.to_array()); + + /* Доступ к элементу */ + let num = nums.get(1); + println!("\nЭлемент по индексу 1: num = {num}"); + + /* Обновление элемента */ + nums.set(1, 0); + print!("После обновления элемента по индексу 1 до 0 nums = "); + print_util::print_array(&nums.to_array()); + + /* Проверка механизма расширения */ + for i in 0..10 { + // При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения + nums.add(i); + } + print!("\nСписок nums после увеличения вместимости = "); + print_util::print_array(&nums.to_array()); + print!(" , вместимость = {} , длина = {}", nums.capacity(), nums.size()); +} diff --git a/ru/codes/rust/chapter_backtracking/n_queens.rs b/ru/codes/rust/chapter_backtracking/n_queens.rs new file mode 100644 index 000000000..13c0bb361 --- /dev/null +++ b/ru/codes/rust/chapter_backtracking/n_queens.rs @@ -0,0 +1,76 @@ +/* + * File: n_queens.rs + * Created Time: 2023-07-15 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Алгоритм бэктрекинга: n ферзей */ +fn backtrack( + row: usize, + n: usize, + state: &mut Vec>, + res: &mut Vec>>, + cols: &mut [bool], + diags1: &mut [bool], + diags2: &mut [bool], +) { + // Когда все строки уже обработаны, записать решение + if row == n { + res.push(state.clone()); + return; + } + // Обойти все столбцы + for col in 0..n { + // Вычислить главную и побочную диагонали, соответствующие этой клетке + let diag1 = row + n - 1 - col; + let diag2 = row + col; + // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей + if !cols[col] && !diags1[diag1] && !diags2[diag2] { + // Попытка: поставить ферзя в эту клетку + state[row][col] = "Q".into(); + (cols[col], diags1[diag1], diags2[diag2]) = (true, true, true); + // Перейти к размещению следующей строки + backtrack(row + 1, n, state, res, cols, diags1, diags2); + // Откат: восстановить эту клетку как пустую + state[row][col] = "#".into(); + (cols[col], diags1[diag1], diags2[diag2]) = (false, false, false); + } + } +} + +/* Решить задачу о n ферзях */ +fn n_queens(n: usize) -> Vec>> { + // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку + let mut state: Vec> = vec![vec!["#".to_string(); n]; n]; + let mut cols = vec![false; n]; // Отмечать, есть ли ферзь в столбце + let mut diags1 = vec![false; 2 * n - 1]; // Отмечать наличие ферзя на главной диагонали + let mut diags2 = vec![false; 2 * n - 1]; // Отмечать наличие ферзя на побочной диагонали + let mut res: Vec>> = Vec::new(); + + backtrack( + 0, + n, + &mut state, + &mut res, + &mut cols, + &mut diags1, + &mut diags2, + ); + + res +} + +/* Driver Code */ +pub fn main() { + let n: usize = 4; + let res = n_queens(n); + + println!("Размер входной доски = {n}"); + println!("Количество способов расстановки ферзей: {}", res.len()); + for state in res.iter() { + println!("--------------------"); + for row in state.iter() { + println!("{:?}", row); + } + } +} diff --git a/ru/codes/rust/chapter_backtracking/permutations_i.rs b/ru/codes/rust/chapter_backtracking/permutations_i.rs new file mode 100644 index 000000000..98688aacf --- /dev/null +++ b/ru/codes/rust/chapter_backtracking/permutations_i.rs @@ -0,0 +1,46 @@ +/* + * File: permutations_i.rs + * Created Time: 2023-07-15 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Алгоритм бэктрекинга: все перестановки I */ +fn backtrack(mut state: Vec, choices: &[i32], selected: &mut [bool], res: &mut Vec>) { + // Когда длина состояния равна числу элементов, записать решение + if state.len() == choices.len() { + res.push(state); + return; + } + // Перебор всех вариантов выбора + for i in 0..choices.len() { + let choice = choices[i]; + // Отсечение: нельзя выбирать один и тот же элемент повторно + if !selected[i] { + // Попытка: сделать выбор и обновить состояние + selected[i] = true; + state.push(choice); + // Перейти к следующему выбору + backtrack(state.clone(), choices, selected, res); + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false; + state.pop(); + } + } +} + +/* Все перестановки I */ +fn permutations_i(nums: &mut [i32]) -> Vec> { + let mut res = Vec::new(); // Состояние (подмножество) + backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res); + res +} + +/* Driver Code */ +pub fn main() { + let mut nums = [1, 2, 3]; + + let res = permutations_i(&mut nums); + + println!("Входной массив nums = {:?}", &nums); + println!("Все перестановки res = {:?}", &res); +} diff --git a/ru/codes/rust/chapter_backtracking/permutations_ii.rs b/ru/codes/rust/chapter_backtracking/permutations_ii.rs new file mode 100644 index 000000000..6af358371 --- /dev/null +++ b/ru/codes/rust/chapter_backtracking/permutations_ii.rs @@ -0,0 +1,50 @@ +/* + * File: permutations_ii.rs + * Created Time: 2023-07-15 + * Author: codingonion (coderonion@gmail.com) + */ + +use std::collections::HashSet; + +/* Алгоритм бэктрекинга: все перестановки II */ +fn backtrack(mut state: Vec, choices: &[i32], selected: &mut [bool], res: &mut Vec>) { + // Когда длина состояния равна числу элементов, записать решение + if state.len() == choices.len() { + res.push(state); + return; + } + // Перебор всех вариантов выбора + let mut duplicated = HashSet::::new(); + for i in 0..choices.len() { + let choice = choices[i]; + // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы + if !selected[i] && !duplicated.contains(&choice) { + // Попытка: сделать выбор и обновить состояние + duplicated.insert(choice); // Записать значения уже выбранных элементов + selected[i] = true; + state.push(choice); + // Перейти к следующему выбору + backtrack(state.clone(), choices, selected, res); + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false; + state.pop(); + } + } +} + +/* Все перестановки II */ +fn permutations_ii(nums: &mut [i32]) -> Vec> { + let mut res = Vec::new(); + backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res); + res +} + +/* Driver Code */ +pub fn main() { + let mut nums = [1, 2, 2]; + + let res = permutations_ii(&mut nums); + + println!("Входной массив nums = {:?}", &nums); + println!("Все перестановки res = {:?}", &res); +} diff --git a/ru/codes/rust/chapter_backtracking/preorder_traversal_i_compact.rs b/ru/codes/rust/chapter_backtracking/preorder_traversal_i_compact.rs new file mode 100644 index 000000000..dfe458fad --- /dev/null +++ b/ru/codes/rust/chapter_backtracking/preorder_traversal_i_compact.rs @@ -0,0 +1,41 @@ +/* + * File: preorder_traversal_i_compact.rs + * Created Time: 2023-07-15 + * Author: codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; +use std::{cell::RefCell, rc::Rc}; + +/* Предварительный обход: пример 1 */ +fn pre_order(res: &mut Vec>>, root: Option<&Rc>>) { + if root.is_none() { + return; + } + if let Some(node) = root { + if node.borrow().val == 7 { + // Записать решение + res.push(node.clone()); + } + pre_order(res, node.borrow().left.as_ref()); + pre_order(res, node.borrow().right.as_ref()); + } +} + +/* Driver Code */ +pub fn main() { + let root = vec_to_tree([1, 7, 3, 4, 5, 6, 7].map(|x| Some(x)).to_vec()); + println!("Инициализация двоичного дерева"); + print_util::print_tree(root.as_ref().unwrap()); + + // Предварительный обход + let mut res = Vec::new(); + pre_order(&mut res, root.as_ref()); + + println!("\nВсе узлы со значением 7"); + let mut vals = Vec::new(); + for node in res { + vals.push(node.borrow().val) + } + println!("{:?}", vals); +} diff --git a/ru/codes/rust/chapter_backtracking/preorder_traversal_ii_compact.rs b/ru/codes/rust/chapter_backtracking/preorder_traversal_ii_compact.rs new file mode 100644 index 000000000..3093431bd --- /dev/null +++ b/ru/codes/rust/chapter_backtracking/preorder_traversal_ii_compact.rs @@ -0,0 +1,52 @@ +/* + * File: preorder_traversal_ii_compact.rs + * Created Time: 2023-07-15 + * Author: codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; +use std::{cell::RefCell, rc::Rc}; + +/* Предварительный обход: пример 2 */ +fn pre_order( + res: &mut Vec>>>, + path: &mut Vec>>, + root: Option<&Rc>>, +) { + if root.is_none() { + return; + } + if let Some(node) = root { + // Попытка + path.push(node.clone()); + if node.borrow().val == 7 { + // Записать решение + res.push(path.clone()); + } + pre_order(res, path, node.borrow().left.as_ref()); + pre_order(res, path, node.borrow().right.as_ref()); + // Откат + path.pop(); + } +} + +/* Driver Code */ +pub fn main() { + let root = vec_to_tree([1, 7, 3, 4, 5, 6, 7].map(|x| Some(x)).to_vec()); + println!("Инициализация двоичного дерева"); + print_util::print_tree(root.as_ref().unwrap()); + + // Предварительный обход + let mut path = Vec::new(); + let mut res = Vec::new(); + pre_order(&mut res, &mut path, root.as_ref()); + + println!("\nВсе пути от корня к узлу 7"); + for path in res { + let mut vals = Vec::new(); + for node in path { + vals.push(node.borrow().val) + } + println!("{:?}", vals); + } +} diff --git a/ru/codes/rust/chapter_backtracking/preorder_traversal_iii_compact.rs b/ru/codes/rust/chapter_backtracking/preorder_traversal_iii_compact.rs new file mode 100644 index 000000000..0de758e3d --- /dev/null +++ b/ru/codes/rust/chapter_backtracking/preorder_traversal_iii_compact.rs @@ -0,0 +1,53 @@ +/* + * File: preorder_traversal_iii_compact.rs + * Created Time: 2023-07-15 + * Author: codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; +use std::{cell::RefCell, rc::Rc}; + +/* Предварительный обход: пример 3 */ +fn pre_order( + res: &mut Vec>>>, + path: &mut Vec>>, + root: Option<&Rc>>, +) { + // Отсечение + if root.is_none() || root.as_ref().unwrap().borrow().val == 3 { + return; + } + if let Some(node) = root { + // Попытка + path.push(node.clone()); + if node.borrow().val == 7 { + // Записать решение + res.push(path.clone()); + } + pre_order(res, path, node.borrow().left.as_ref()); + pre_order(res, path, node.borrow().right.as_ref()); + // Откат + path.pop(); + } +} + +/* Driver Code */ +pub fn main() { + let root = vec_to_tree([1, 7, 3, 4, 5, 6, 7].map(|x| Some(x)).to_vec()); + println!("Инициализация двоичного дерева"); + print_util::print_tree(root.as_ref().unwrap()); + + // Предварительный обход + let mut path = Vec::new(); + let mut res = Vec::new(); + pre_order(&mut res, &mut path, root.as_ref()); + + println!("\nВсе пути от корня к узлу 7, не содержащие узлов со значением 3"); + for path in res { + let mut vals = Vec::new(); + for node in path { + vals.push(node.borrow().val) + } + println!("{:?}", vals); + } +} diff --git a/ru/codes/rust/chapter_backtracking/preorder_traversal_iii_template.rs b/ru/codes/rust/chapter_backtracking/preorder_traversal_iii_template.rs new file mode 100644 index 000000000..3cb33c66b --- /dev/null +++ b/ru/codes/rust/chapter_backtracking/preorder_traversal_iii_template.rs @@ -0,0 +1,88 @@ +/* + * File: preorder_traversal_iii_template.rs + * Created Time: 2023-07-15 + * Author: codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; +use std::{cell::RefCell, rc::Rc}; + +/* Проверить, является ли текущее состояние решением */ +fn is_solution(state: &mut Vec>>) -> bool { + return !state.is_empty() && state.last().unwrap().borrow().val == 7; +} + +/* Записать решение */ +fn record_solution( + state: &mut Vec>>, + res: &mut Vec>>>, +) { + res.push(state.clone()); +} + +/* Проверить, допустим ли этот выбор в текущем состоянии */ +fn is_valid(_: &mut Vec>>, choice: Option<&Rc>>) -> bool { + return choice.is_some() && choice.unwrap().borrow().val != 3; +} + +/* Обновить состояние */ +fn make_choice(state: &mut Vec>>, choice: Rc>) { + state.push(choice); +} + +/* Восстановить состояние */ +fn undo_choice(state: &mut Vec>>, _: Rc>) { + state.pop(); +} + +/* Алгоритм бэктрекинга: пример 3 */ +fn backtrack( + state: &mut Vec>>, + choices: &Vec>>>, + res: &mut Vec>>>, +) { + // Проверить, является ли текущее состояние решением + if is_solution(state) { + // Записать решение + record_solution(state, res); + } + // Перебор всех вариантов выбора + for &choice in choices.iter() { + // Отсечение: проверить допустимость выбора + if is_valid(state, choice) { + // Попытка: сделать выбор и обновить состояние + make_choice(state, choice.unwrap().clone()); + // Перейти к следующему выбору + backtrack( + state, + &vec![ + choice.unwrap().borrow().left.as_ref(), + choice.unwrap().borrow().right.as_ref(), + ], + res, + ); + // Откат: отменить выбор и восстановить предыдущее состояние + undo_choice(state, choice.unwrap().clone()); + } + } +} + +/* Driver Code */ +pub fn main() { + let root = vec_to_tree([1, 7, 3, 4, 5, 6, 7].map(|x| Some(x)).to_vec()); + println!("Инициализация двоичного дерева"); + print_util::print_tree(root.as_ref().unwrap()); + + // Алгоритм бэктрекинга + let mut res = Vec::new(); + backtrack(&mut Vec::new(), &mut vec![root.as_ref()], &mut res); + + println!("\nВсе пути от корня к узлу 7, в которых путь не содержит узлов со значением 3"); + for path in res { + let mut vals = Vec::new(); + for node in path { + vals.push(node.borrow().val) + } + println!("{:?}", vals); + } +} diff --git a/ru/codes/rust/chapter_backtracking/subset_sum_i.rs b/ru/codes/rust/chapter_backtracking/subset_sum_i.rs new file mode 100644 index 000000000..f0d8c5fe0 --- /dev/null +++ b/ru/codes/rust/chapter_backtracking/subset_sum_i.rs @@ -0,0 +1,56 @@ +/* + * File: subset_sum_i.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +fn backtrack( + state: &mut Vec, + target: i32, + choices: &[i32], + start: usize, + res: &mut Vec>, +) { + // Если сумма подмножества равна target, записать решение + if target == 0 { + res.push(state.clone()); + return; + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + for i in start..choices.len() { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if target - choices[i] < 0 { + break; + } + // Попытка: сделать выбор и обновить target и start + state.push(choices[i]); + // Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.pop(); + } +} + +/* Решить задачу суммы подмножеств I */ +fn subset_sum_i(nums: &mut [i32], target: i32) -> Vec> { + let mut state = Vec::new(); // Состояние (подмножество) + nums.sort(); // Отсортировать nums + let start = 0; // Стартовая вершина обхода + let mut res = Vec::new(); // Список результатов (список подмножеств) + backtrack(&mut state, target, nums, start, &mut res); + res +} + +/* Driver Code */ +pub fn main() { + let mut nums = [3, 4, 5]; + let target = 9; + + let res = subset_sum_i(&mut nums, target); + + println!("Входной массив nums = {:?}, target = {}", &nums, target); + println!("Все подмножества с суммой {}: res = {:?}", target, &res); +} diff --git a/ru/codes/rust/chapter_backtracking/subset_sum_i_naive.rs b/ru/codes/rust/chapter_backtracking/subset_sum_i_naive.rs new file mode 100644 index 000000000..beba8a11a --- /dev/null +++ b/ru/codes/rust/chapter_backtracking/subset_sum_i_naive.rs @@ -0,0 +1,54 @@ +/* + * File: subset_sum_i_naive.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +fn backtrack( + state: &mut Vec, + target: i32, + total: i32, + choices: &[i32], + res: &mut Vec>, +) { + // Если сумма подмножества равна target, записать решение + if total == target { + res.push(state.clone()); + return; + } + // Перебор всех вариантов выбора + for i in 0..choices.len() { + // Отсечение: если сумма подмножества превышает target, пропустить этот выбор + if total + choices[i] > target { + continue; + } + // Попытка: сделать выбор и обновить элемент и total + state.push(choices[i]); + // Перейти к следующему выбору + backtrack(state, target, total + choices[i], choices, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.pop(); + } +} + +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */ +fn subset_sum_i_naive(nums: &[i32], target: i32) -> Vec> { + let mut state = Vec::new(); // Состояние (подмножество) + let total = 0; // Сумма подмножеств + let mut res = Vec::new(); // Список результатов (список подмножеств) + backtrack(&mut state, target, total, nums, &mut res); + res +} + +/* Driver Code */ +pub fn main() { + let nums = [3, 4, 5]; + let target = 9; + + let res = subset_sum_i_naive(&nums, target); + + println!("Входной массив nums = {:?}, target = {}", &nums, target); + println!("Все подмножества с суммой {}: res = {:?}", target, &res); + println!("Обратите внимание: результат этого метода содержит повторяющиеся множества"); +} diff --git a/ru/codes/rust/chapter_backtracking/subset_sum_ii.rs b/ru/codes/rust/chapter_backtracking/subset_sum_ii.rs new file mode 100644 index 000000000..5b0ae049e --- /dev/null +++ b/ru/codes/rust/chapter_backtracking/subset_sum_ii.rs @@ -0,0 +1,61 @@ +/* + * File: subset_sum_ii.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Алгоритм бэктрекинга: сумма подмножеств II */ +fn backtrack( + state: &mut Vec, + target: i32, + choices: &[i32], + start: usize, + res: &mut Vec>, +) { + // Если сумма подмножества равна target, записать решение + if target == 0 { + res.push(state.clone()); + return; + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента + for i in start..choices.len() { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if target - choices[i] < 0 { + break; + } + // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить + if i > start && choices[i] == choices[i - 1] { + continue; + } + // Попытка: сделать выбор и обновить target и start + state.push(choices[i]); + // Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i + 1, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.pop(); + } +} + +/* Решить задачу суммы подмножеств II */ +fn subset_sum_ii(nums: &mut [i32], target: i32) -> Vec> { + let mut state = Vec::new(); // Состояние (подмножество) + nums.sort(); // Отсортировать nums + let start = 0; // Стартовая вершина обхода + let mut res = Vec::new(); // Список результатов (список подмножеств) + backtrack(&mut state, target, nums, start, &mut res); + res +} + +/* Driver Code */ +pub fn main() { + let mut nums = [4, 4, 5]; + let target = 9; + + let res = subset_sum_ii(&mut nums, target); + + println!("Входной массив nums = {:?}, target = {}", &nums, target); + println!("Все подмножества с суммой {}: res = {:?}", target, &res); +} diff --git a/ru/codes/rust/chapter_computational_complexity/iteration.rs b/ru/codes/rust/chapter_computational_complexity/iteration.rs new file mode 100644 index 000000000..3d3c861b4 --- /dev/null +++ b/ru/codes/rust/chapter_computational_complexity/iteration.rs @@ -0,0 +1,74 @@ +/* + * File: iteration.rs + * Created Time: 2023-09-02 + * Author: night-cruise (2586447362@qq.com) + */ + +/* Цикл for */ +fn for_loop(n: i32) -> i32 { + let mut res = 0; + // Циклическое суммирование 1, 2, ..., n-1, n + for i in 1..=n { + res += i; + } + res +} + +/* Цикл while */ +fn while_loop(n: i32) -> i32 { + let mut res = 0; + let mut i = 1; // Инициализация условной переменной + + // Циклическое суммирование 1, 2, ..., n-1, n + while i <= n { + res += i; + i += 1; // Обновить условную переменную + } + res +} + +/* Цикл while (двойное обновление) */ +fn while_loop_ii(n: i32) -> i32 { + let mut res = 0; + let mut i = 1; // Инициализация условной переменной + + // Циклическое суммирование 1, 4, 10, ... + while i <= n { + res += i; + // Обновить условную переменную + i += 1; + i *= 2; + } + res +} + +/* Двойной цикл for */ +fn nested_for_loop(n: i32) -> String { + let mut res = vec![]; + // Цикл по i = 1, 2, ..., n-1, n + for i in 1..=n { + // Цикл по j = 1, 2, ..., n-1, n + for j in 1..=n { + res.push(format!("({}, {}), ", i, j)); + } + } + res.join("") +} + +/* Driver Code */ +fn main() { + let n = 5; + let mut res; + + res = for_loop(n); + println!("\nРезультат суммирования в цикле for res = {res}"); + + res = while_loop(n); + println!("\nРезультат суммирования в цикле while res = {res}"); + + res = while_loop_ii(n); + println!("\nРезультат суммирования в цикле while (двойное обновление) res = {}", res); + + let res = nested_for_loop(n); + println!("\nРезультат обхода в двойном цикле for {res}"); +} diff --git a/ru/codes/rust/chapter_computational_complexity/recursion.rs b/ru/codes/rust/chapter_computational_complexity/recursion.rs new file mode 100644 index 000000000..9b37d9bce --- /dev/null +++ b/ru/codes/rust/chapter_computational_complexity/recursion.rs @@ -0,0 +1,76 @@ +/* + * File: recursion.rs + * Created Time: 2023-09-02 + * Author: night-cruise (2586447362@qq.com) + */ + +/* Рекурсия */ +fn recur(n: i32) -> i32 { + // Условие завершения + if n == 1 { + return 1; + } + // Рекурсия: рекурсивный вызов + let res = recur(n - 1); + // Возврат: вернуть результат + n + res +} + +/* Имитация рекурсии итерацией */ +fn for_loop_recur(n: i32) -> i32 { + // Использовать явный стек для имитации системного стека вызовов + let mut stack = Vec::new(); + let mut res = 0; + // Рекурсия: рекурсивный вызов + for i in (1..=n).rev() { + // Имитировать «рекурсию» с помощью операции помещения в стек + stack.push(i); + } + // Возврат: вернуть результат + while !stack.is_empty() { + // Имитировать «возврат» с помощью операции извлечения из стека + res += stack.pop().unwrap(); + } + // res = 1+2+3+...+n + res +} + +/* Хвостовая рекурсия */ +fn tail_recur(n: i32, res: i32) -> i32 { + // Условие завершения + if n == 0 { + return res; + } + // Хвостовой рекурсивный вызов + tail_recur(n - 1, res + n) +} + +/* Последовательность Фибоначчи: рекурсия */ +fn fib(n: i32) -> i32 { + // Условие завершения: f(1) = 0, f(2) = 1 + if n == 1 || n == 2 { + return n - 1; + } + // Рекурсивный вызов f(n) = f(n-1) + f(n-2) + let res = fib(n - 1) + fib(n - 2); + // Вернуть результат + res +} + +/* Driver Code */ +fn main() { + let n = 5; + let mut res; + + res = recur(n); + println!("\nРезультат суммирования в рекурсивной функции res = {res}"); + + res = for_loop_recur(n); + println!("\nРезультат суммирования при имитации рекурсии res = {res}"); + + res = tail_recur(n, 0); + println!("\nРезультат суммирования в хвостовой рекурсии res = {res}"); + + res = fib(n); + println!("\nЧлен последовательности Фибоначчи с номером {n} = {res}"); +} diff --git a/ru/codes/rust/chapter_computational_complexity/space_complexity.rs b/ru/codes/rust/chapter_computational_complexity/space_complexity.rs new file mode 100644 index 000000000..4c23dd39c --- /dev/null +++ b/ru/codes/rust/chapter_computational_complexity/space_complexity.rs @@ -0,0 +1,114 @@ +/* + * File: space_complexity.rs + * Created Time: 2023-03-11 + * Author: codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::{print_util, ListNode, TreeNode}; +use std::cell::RefCell; +use std::collections::HashMap; +use std::rc::Rc; + +/* Функция */ +fn function() -> i32 { + // Выполнить некоторые операции + return 0; +} + +/* Постоянная сложность */ +#[allow(unused)] +fn constant(n: i32) { + // Константы, переменные и объекты занимают O(1) памяти + const A: i32 = 0; + let b = 0; + let nums = vec![0; 10000]; + let node = ListNode::new(0); + // Переменные в цикле занимают O(1) памяти + for i in 0..n { + let c = 0; + } + // Функции в цикле занимают O(1) памяти + for i in 0..n { + function(); + } +} + +/* Линейная сложность */ +#[allow(unused)] +fn linear(n: i32) { + // Массив длины n занимает O(n) памяти + let mut nums = vec![0; n as usize]; + // Список длины n занимает O(n) памяти + let mut nodes = Vec::new(); + for i in 0..n { + nodes.push(ListNode::new(i)) + } + // Хеш-таблица длины n занимает O(n) памяти + let mut map = HashMap::new(); + for i in 0..n { + map.insert(i, i.to_string()); + } +} + +/* Линейная сложность (рекурсивная реализация) */ +fn linear_recur(n: i32) { + println!("Рекурсия n = {}", n); + if n == 1 { + return; + }; + linear_recur(n - 1); +} + +/* Квадратичная сложность */ +#[allow(unused)] +fn quadratic(n: i32) { + // Матрица занимает O(n^2) памяти + let num_matrix = vec![vec![0; n as usize]; n as usize]; + // Двумерный список занимает O(n^2) памяти + let mut num_list = Vec::new(); + for i in 0..n { + let mut tmp = Vec::new(); + for j in 0..n { + tmp.push(0); + } + num_list.push(tmp); + } +} + +/* Квадратичная сложность (рекурсивная реализация) */ +fn quadratic_recur(n: i32) -> i32 { + if n <= 0 { + return 0; + }; + // Длина массива nums равна n, n-1, ..., 2, 1 + let nums = vec![0; n as usize]; + println!("В рекурсии n = {} , длина nums = {}", n, nums.len()); + return quadratic_recur(n - 1); +} + +/* Экспоненциальная сложность (построение полного двоичного дерева) */ +fn build_tree(n: i32) -> Option>> { + if n == 0 { + return None; + }; + let root = TreeNode::new(0); + root.borrow_mut().left = build_tree(n - 1); + root.borrow_mut().right = build_tree(n - 1); + return Some(root); +} + +/* Driver Code */ +fn main() { + let n = 5; + // Постоянная сложность + constant(n); + // Линейная сложность + linear(n); + linear_recur(n); + // Квадратичная сложность + quadratic(n); + quadratic_recur(n); + // Экспоненциальная сложность + let root = build_tree(n); + print_util::print_tree(&root.unwrap()); +} diff --git a/ru/codes/rust/chapter_computational_complexity/time_complexity.rs b/ru/codes/rust/chapter_computational_complexity/time_complexity.rs new file mode 100644 index 000000000..68bbe42ff --- /dev/null +++ b/ru/codes/rust/chapter_computational_complexity/time_complexity.rs @@ -0,0 +1,170 @@ +/* + * File: time_complexity.rs + * Created Time: 2023-01-10 + * Author: xBLACICEx (xBLACKICEx@outlook.com), codingonion (coderonion@gmail.com) + */ + +/* Постоянная сложность */ +fn constant(n: i32) -> i32 { + _ = n; + let mut count = 0; + let size = 100_000; + for _ in 0..size { + count += 1; + } + count +} + +/* Линейная сложность */ +fn linear(n: i32) -> i32 { + let mut count = 0; + for _ in 0..n { + count += 1; + } + count +} + +/* Линейная сложность (обход массива) */ +fn array_traversal(nums: &[i32]) -> i32 { + let mut count = 0; + // Число итераций пропорционально длине массива + for _ in nums { + count += 1; + } + count +} + +/* Квадратичная сложность */ +fn quadratic(n: i32) -> i32 { + let mut count = 0; + // Число итераций квадратично зависит от размера данных n + for _ in 0..n { + for _ in 0..n { + count += 1; + } + } + count +} + +/* Квадратичная сложность (пузырьковая сортировка) */ +fn bubble_sort(nums: &mut [i32]) -> i32 { + let mut count = 0; // Счетчик + + // Внешний цикл: неотсортированный диапазон [0, i] + for i in (1..nums.len()).rev() { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for j in 0..i { + if nums[j] > nums[j + 1] { + // Поменять местами nums[j] и nums[j + 1] + let tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + count += 3; // Обмен элементов включает 3 элементарные операции + } + } + } + count +} + +/* Экспоненциальная сложность (итеративная реализация) */ +fn exponential(n: i32) -> i32 { + let mut count = 0; + let mut base = 1; + // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1) + for _ in 0..n { + for _ in 0..base { + count += 1 + } + base *= 2; + } + // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1 + count +} + +/* Экспоненциальная сложность (рекурсивная реализация) */ +fn exp_recur(n: i32) -> i32 { + if n == 1 { + return 1; + } + exp_recur(n - 1) + exp_recur(n - 1) + 1 +} + +/* Логарифмическая сложность (итеративная реализация) */ +fn logarithmic(mut n: i32) -> i32 { + let mut count = 0; + while n > 1 { + n = n / 2; + count += 1; + } + count +} + +/* Логарифмическая сложность (рекурсивная реализация) */ +fn log_recur(n: i32) -> i32 { + if n <= 1 { + return 0; + } + log_recur(n / 2) + 1 +} + +/* Линейно-логарифмическая сложность */ +fn linear_log_recur(n: i32) -> i32 { + if n <= 1 { + return 1; + } + let mut count = linear_log_recur(n / 2) + linear_log_recur(n / 2); + for _ in 0..n { + count += 1; + } + return count; +} + +/* Факториальная сложность (рекурсивная реализация) */ +fn factorial_recur(n: i32) -> i32 { + if n == 0 { + return 1; + } + let mut count = 0; + // Из одного получается n + for _ in 0..n { + count += factorial_recur(n - 1); + } + count +} + +/* Driver Code */ +fn main() { + // Можно изменить n и запустить программу, чтобы увидеть, как меняется число операций при разных сложностях + let n: i32 = 8; + println!("Размер входных данных n = {}", n); + + let mut count = constant(n); + println!("Число операций константной сложности = {}", count); + + count = linear(n); + println!("Число операций линейной сложности = {}", count); + count = array_traversal(&vec![0; n as usize]); + println!("Число операций линейной сложности (обход массива) = {}", count); + + count = quadratic(n); + println!("Число операций квадратичной сложности = {}", count); + let mut nums = (1..=n).rev().collect::>(); // [n,n-1,...,2,1] + count = bubble_sort(&mut nums); + println!("Число операций квадратичной сложности (пузырьковая сортировка) = {}", count); + + count = exponential(n); + println!("Число операций экспоненциальной сложности (итеративная реализация) = {}", count); + count = exp_recur(n); + println!("Число операций экспоненциальной сложности (рекурсивная реализация) = {}", count); + + count = logarithmic(n); + println!("Число операций логарифмической сложности (итеративная реализация) = {}", count); + count = log_recur(n); + println!("Число операций логарифмической сложности (рекурсивная реализация) = {}", count); + + count = linear_log_recur(n); + println!("Число операций линейно-логарифмической сложности (рекурсивная реализация) = {}", count); + + count = factorial_recur(n); + println!("Число операций факториальной сложности (рекурсивная реализация) = {}", count); +} diff --git a/ru/codes/rust/chapter_computational_complexity/worst_best_time_complexity.rs b/ru/codes/rust/chapter_computational_complexity/worst_best_time_complexity.rs new file mode 100644 index 000000000..6288ee35e --- /dev/null +++ b/ru/codes/rust/chapter_computational_complexity/worst_best_time_complexity.rs @@ -0,0 +1,42 @@ +/* + * File: worst_best_time_complexity.rs + * Created Time: 2023-01-13 + * Author: xBLACICEx (xBLACKICEx@outlook.com), codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::print_util; +use rand::seq::SliceRandom; +use rand::thread_rng; + +/* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */ +fn random_numbers(n: i32) -> Vec { + // Создать массив nums = { 1, 2, 3, ..., n } + let mut nums = (1..=n).collect::>(); + // Случайно перемешать элементы массива + nums.shuffle(&mut thread_rng()); + nums +} + +/* Найти индекс числа 1 в массиве nums */ +fn find_one(nums: &[i32]) -> Option { + for i in 0..nums.len() { + // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1) + // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n) + if nums[i] == 1 { + return Some(i); + } + } + None +} + +/* Driver Code */ +fn main() { + for _ in 0..10 { + let n = 100; + let nums = random_numbers(n); + let index = find_one(&nums).unwrap(); + print!("\nМассив [1, 2, ..., n] после перемешивания = "); + print_util::print_array(&nums); + println!("\nИндекс числа 1 = {}", index); + } +} diff --git a/ru/codes/rust/chapter_divide_and_conquer/binary_search_recur.rs b/ru/codes/rust/chapter_divide_and_conquer/binary_search_recur.rs new file mode 100644 index 000000000..63c74b080 --- /dev/null +++ b/ru/codes/rust/chapter_divide_and_conquer/binary_search_recur.rs @@ -0,0 +1,41 @@ +/* + * File: binary_search_recur.rs + * Created Time: 2023-07-15 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Бинарный поиск: задача f(i, j) */ +fn dfs(nums: &[i32], target: i32, i: i32, j: i32) -> i32 { + // Если интервал пуст, целевой элемент отсутствует, вернуть -1 + if i > j { + return -1; + } + let m: i32 = i + (j - i) / 2; + if nums[m as usize] < target { + // Рекурсивная подзадача f(m+1, j) + return dfs(nums, target, m + 1, j); + } else if nums[m as usize] > target { + // Рекурсивная подзадача f(i, m-1) + return dfs(nums, target, i, m - 1); + } else { + // Целевой элемент найден, вернуть его индекс + return m; + } +} + +/* Бинарный поиск */ +fn binary_search(nums: &[i32], target: i32) -> i32 { + let n = nums.len() as i32; + // Решить задачу f(0, n-1) + dfs(nums, target, 0, n - 1) +} + +/* Driver Code */ +pub fn main() { + let target = 6; + let nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; + + // Бинарный поиск (двусторонне замкнутый интервал) + let index = binary_search(&nums, target); + println!("Индекс целевого элемента 6 = {index}"); +} diff --git a/ru/codes/rust/chapter_divide_and_conquer/build_tree.rs b/ru/codes/rust/chapter_divide_and_conquer/build_tree.rs new file mode 100644 index 000000000..023a5c5f3 --- /dev/null +++ b/ru/codes/rust/chapter_divide_and_conquer/build_tree.rs @@ -0,0 +1,56 @@ +/* + * File: build_tree.rs + * Created Time: 2023-07-15 + * Author: codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::{print_util, TreeNode}; +use std::collections::HashMap; +use std::{cell::RefCell, rc::Rc}; + +/* Построить двоичное дерево: разделяй и властвуй */ +fn dfs( + preorder: &[i32], + inorder_map: &HashMap, + i: i32, + l: i32, + r: i32, +) -> Option>> { + // Завершить при пустом диапазоне поддерева + if r - l < 0 { + return None; + } + // Инициализировать корневой узел + let root = TreeNode::new(preorder[i as usize]); + // Найти m, чтобы разделить левое и правое поддеревья + let m = inorder_map.get(&preorder[i as usize]).unwrap(); + // Подзадача: построить левое поддерево + root.borrow_mut().left = dfs(preorder, inorder_map, i + 1, l, m - 1); + // Подзадача: построить правое поддерево + root.borrow_mut().right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r); + // Вернуть корневой узел + Some(root) +} + +/* Построить двоичное дерево */ +fn build_tree(preorder: &[i32], inorder: &[i32]) -> Option>> { + // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам + let mut inorder_map: HashMap = HashMap::new(); + for i in 0..inorder.len() { + inorder_map.insert(inorder[i], i as i32); + } + let root = dfs(preorder, &inorder_map, 0, 0, inorder.len() as i32 - 1); + root +} + +/* Driver Code */ +fn main() { + let preorder = [3, 9, 2, 1, 7]; + let inorder = [9, 3, 1, 2, 7]; + println!("Предварительный обход = {:?}", preorder); + println!("Симметричный обход = {:?}", inorder); + + let root = build_tree(&preorder, &inorder); + println!("Построенное двоичное дерево:"); + print_util::print_tree(root.as_ref().unwrap()); +} diff --git a/ru/codes/rust/chapter_divide_and_conquer/hanota.rs b/ru/codes/rust/chapter_divide_and_conquer/hanota.rs new file mode 100644 index 000000000..cf698fca4 --- /dev/null +++ b/ru/codes/rust/chapter_divide_and_conquer/hanota.rs @@ -0,0 +1,55 @@ +/* + * File: hanota.rs + * Created Time: 2023-07-15 + * Author: codingonion (coderonion@gmail.com) + */ + +#![allow(non_snake_case)] + +/* Переместить один диск */ +fn move_pan(src: &mut Vec, tar: &mut Vec) { + // Снять диск с вершины src + let pan = src.pop().unwrap(); + // Положить диск на вершину tar + tar.push(pan); +} + +/* Решить задачу Ханойской башни f(i) */ +fn dfs(i: i32, src: &mut Vec, buf: &mut Vec, tar: &mut Vec) { + // Если в src остался только один диск, сразу переместить его в tar + if i == 1 { + move_pan(src, tar); + return; + } + // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar + dfs(i - 1, src, tar, buf); + // Подзадача f(1): переместить оставшийся один диск из src в tar + move_pan(src, tar); + // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src + dfs(i - 1, buf, src, tar); +} + +/* Решить задачу Ханойской башни */ +fn solve_hanota(A: &mut Vec, B: &mut Vec, C: &mut Vec) { + let n = A.len() as i32; + // Переместить верхние n дисков из A в C с помощью B + dfs(n, A, B, C); +} + +/* Driver Code */ +pub fn main() { + let mut A = vec![5, 4, 3, 2, 1]; + let mut B = Vec::new(); + let mut C = Vec::new(); + println!("Исходное состояние:"); + println!("A = {:?}", A); + println!("B = {:?}", B); + println!("C = {:?}", C); + + solve_hanota(&mut A, &mut B, &mut C); + + println!("После завершения перемещения дисков:"); + println!("A = {:?}", A); + println!("B = {:?}", B); + println!("C = {:?}", C); +} diff --git a/ru/codes/rust/chapter_dynamic_programming/climbing_stairs_backtrack.rs b/ru/codes/rust/chapter_dynamic_programming/climbing_stairs_backtrack.rs new file mode 100644 index 000000000..39ed590d8 --- /dev/null +++ b/ru/codes/rust/chapter_dynamic_programming/climbing_stairs_backtrack.rs @@ -0,0 +1,41 @@ +/* + * File: climbing_stairs_backtrack.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Бэктрекинг */ +fn backtrack(choices: &[i32], state: i32, n: i32, res: &mut [i32]) { + // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1 + if state == n { + res[0] = res[0] + 1; + } + // Перебор всех вариантов выбора + for &choice in choices { + // Отсечение: нельзя выходить за n-ю ступень + if state + choice > n { + continue; + } + // Попытка: сделать выбор и обновить состояние + backtrack(choices, state + choice, n, res); + // Откат + } +} + +/* Подъем по лестнице: бэктрекинг */ +fn climbing_stairs_backtrack(n: usize) -> i32 { + let choices = vec![1, 2]; // Можно подняться на 1 или 2 ступени + let state = 0; // Начать подъем с 0-й ступени + let mut res = Vec::new(); + res.push(0); // Использовать res[0] для хранения числа решений + backtrack(&choices, state, n as i32, &mut res); + res[0] +} + +/* Driver Code */ +pub fn main() { + let n: usize = 9; + + let res = climbing_stairs_backtrack(n); + println!("Количество способов подняться по лестнице из {n} ступеней = {res}"); +} diff --git a/ru/codes/rust/chapter_dynamic_programming/climbing_stairs_constraint_dp.rs b/ru/codes/rust/chapter_dynamic_programming/climbing_stairs_constraint_dp.rs new file mode 100644 index 000000000..74c9d2129 --- /dev/null +++ b/ru/codes/rust/chapter_dynamic_programming/climbing_stairs_constraint_dp.rs @@ -0,0 +1,33 @@ +/* + * File: climbing_stairs_constraint_dp.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Подъем по лестнице с ограничениями: динамическое программирование */ +fn climbing_stairs_constraint_dp(n: usize) -> i32 { + if n == 1 || n == 2 { + return 1; + }; + // Инициализация таблицы dp для хранения решений подзадач + let mut dp = vec![vec![-1; 3]; n + 1]; + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1][1] = 1; + dp[1][2] = 0; + dp[2][1] = 0; + dp[2][2] = 1; + // Переход состояний: постепенное решение больших подзадач через меньшие + for i in 3..=n { + dp[i][1] = dp[i - 1][2]; + dp[i][2] = dp[i - 2][1] + dp[i - 2][2]; + } + dp[n][1] + dp[n][2] +} + +/* Driver Code */ +pub fn main() { + let n: usize = 9; + + let res = climbing_stairs_constraint_dp(n); + println!("Количество способов подняться по лестнице из {n} ступеней = {res}"); +} diff --git a/ru/codes/rust/chapter_dynamic_programming/climbing_stairs_dfs.rs b/ru/codes/rust/chapter_dynamic_programming/climbing_stairs_dfs.rs new file mode 100644 index 000000000..358472c9e --- /dev/null +++ b/ru/codes/rust/chapter_dynamic_programming/climbing_stairs_dfs.rs @@ -0,0 +1,29 @@ +/* + * File: climbing_stairs_dfs.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Поиск */ +fn dfs(i: usize) -> i32 { + // dp[1] и dp[2] уже известны, вернуть их + if i == 1 || i == 2 { + return i as i32; + } + // dp[i] = dp[i-1] + dp[i-2] + let count = dfs(i - 1) + dfs(i - 2); + count +} + +/* Подъем по лестнице: поиск */ +fn climbing_stairs_dfs(n: usize) -> i32 { + dfs(n) +} + +/* Driver Code */ +pub fn main() { + let n: usize = 9; + + let res = climbing_stairs_dfs(n); + println!("Количество способов подняться по лестнице из {n} ступеней = {res}"); +} diff --git a/ru/codes/rust/chapter_dynamic_programming/climbing_stairs_dfs_mem.rs b/ru/codes/rust/chapter_dynamic_programming/climbing_stairs_dfs_mem.rs new file mode 100644 index 000000000..56bfb9ec0 --- /dev/null +++ b/ru/codes/rust/chapter_dynamic_programming/climbing_stairs_dfs_mem.rs @@ -0,0 +1,37 @@ +/* + * File: climbing_stairs_dfs_mem.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Поиск с мемоизацией */ +fn dfs(i: usize, mem: &mut [i32]) -> i32 { + // dp[1] и dp[2] уже известны, вернуть их + if i == 1 || i == 2 { + return i as i32; + } + // Если запись dp[i] существует, сразу вернуть ее + if mem[i] != -1 { + return mem[i]; + } + // dp[i] = dp[i-1] + dp[i-2] + let count = dfs(i - 1, mem) + dfs(i - 2, mem); + // Сохранить dp[i] + mem[i] = count; + count +} + +/* Подъем по лестнице: поиск с мемоизацией */ +fn climbing_stairs_dfs_mem(n: usize) -> i32 { + // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи + let mut mem = vec![-1; n + 1]; + dfs(n, &mut mem) +} + +/* Driver Code */ +pub fn main() { + let n: usize = 9; + + let res = climbing_stairs_dfs_mem(n); + println!("Количество способов подняться по лестнице из {n} ступеней = {res}"); +} diff --git a/ru/codes/rust/chapter_dynamic_programming/climbing_stairs_dp.rs b/ru/codes/rust/chapter_dynamic_programming/climbing_stairs_dp.rs new file mode 100644 index 000000000..154e093ce --- /dev/null +++ b/ru/codes/rust/chapter_dynamic_programming/climbing_stairs_dp.rs @@ -0,0 +1,48 @@ +/* + * File: climbing_stairs_dp.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Подъем по лестнице: динамическое программирование */ +fn climbing_stairs_dp(n: usize) -> i32 { + // dp[1] и dp[2] уже известны, вернуть их + if n == 1 || n == 2 { + return n as i32; + } + // Инициализация таблицы dp для хранения решений подзадач + let mut dp = vec![-1; n + 1]; + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = 1; + dp[2] = 2; + // Переход состояний: постепенное решение больших подзадач через меньшие + for i in 3..=n { + dp[i] = dp[i - 1] + dp[i - 2]; + } + dp[n] +} + +/* Подъем по лестнице: динамическое программирование с оптимизацией памяти */ +fn climbing_stairs_dp_comp(n: usize) -> i32 { + if n == 1 || n == 2 { + return n as i32; + } + let (mut a, mut b) = (1, 2); + for _ in 3..=n { + let tmp = b; + b = a + b; + a = tmp; + } + b +} + +/* Driver Code */ +pub fn main() { + let n: usize = 9; + + let res = climbing_stairs_dp(n); + println!("Количество способов подняться по лестнице из {n} ступеней = {res}"); + + let res = climbing_stairs_dp_comp(n); + println!("Количество способов подняться по лестнице из {n} ступеней = {res}"); +} diff --git a/ru/codes/rust/chapter_dynamic_programming/coin_change.rs b/ru/codes/rust/chapter_dynamic_programming/coin_change.rs new file mode 100644 index 000000000..3bdd37764 --- /dev/null +++ b/ru/codes/rust/chapter_dynamic_programming/coin_change.rs @@ -0,0 +1,75 @@ +/* + * File: coin_change.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Размен монет: динамическое программирование */ +fn coin_change_dp(coins: &[i32], amt: usize) -> i32 { + let n = coins.len(); + let max = amt + 1; + // Инициализация таблицы dp + let mut dp = vec![vec![0; amt + 1]; n + 1]; + // Переход состояний: первая строка и первый столбец + for a in 1..=amt { + dp[0][a] = max; + } + // Переход состояний: остальные строки и столбцы + for i in 1..=n { + for a in 1..=amt { + if coins[i - 1] > a as i32 { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[i][a] = std::cmp::min(dp[i - 1][a], dp[i][a - coins[i - 1] as usize] + 1); + } + } + } + if dp[n][amt] != max { + return dp[n][amt] as i32; + } else { + -1 + } +} + +/* Размен монет: динамическое программирование с оптимизацией памяти */ +fn coin_change_dp_comp(coins: &[i32], amt: usize) -> i32 { + let n = coins.len(); + let max = amt + 1; + // Инициализация таблицы dp + let mut dp = vec![0; amt + 1]; + dp.fill(max); + dp[0] = 0; + // Переход состояний + for i in 1..=n { + for a in 1..=amt { + if coins[i - 1] > a as i32 { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[a] = std::cmp::min(dp[a], dp[a - coins[i - 1] as usize] + 1); + } + } + } + if dp[amt] != max { + return dp[amt] as i32; + } else { + -1 + } +} + +/* Driver Code */ +pub fn main() { + let coins = [1, 2, 5]; + let amt: usize = 4; + + // Динамическое программирование + let res = coin_change_dp(&coins, amt); + println!("Минимальное число монет для набора целевой суммы = {res}"); + + // Динамическое программирование с оптимизацией памяти + let res = coin_change_dp_comp(&coins, amt); + println!("Минимальное число монет для набора целевой суммы = {res}"); +} diff --git a/ru/codes/rust/chapter_dynamic_programming/coin_change_ii.rs b/ru/codes/rust/chapter_dynamic_programming/coin_change_ii.rs new file mode 100644 index 000000000..384595a9a --- /dev/null +++ b/ru/codes/rust/chapter_dynamic_programming/coin_change_ii.rs @@ -0,0 +1,64 @@ +/* + * File: coin_change_ii.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Размен монет II: динамическое программирование */ +fn coin_change_ii_dp(coins: &[i32], amt: usize) -> i32 { + let n = coins.len(); + // Инициализация таблицы dp + let mut dp = vec![vec![0; amt + 1]; n + 1]; + // Инициализация первого столбца + for i in 0..=n { + dp[i][0] = 1; + } + // Переход состояний + for i in 1..=n { + for a in 1..=amt { + if coins[i - 1] > a as i32 { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a]; + } else { + // Сумма двух решений: не брать или взять монету i + dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1] as usize]; + } + } + } + dp[n][amt] +} + +/* Размен монет II: динамическое программирование с оптимизацией памяти */ +fn coin_change_ii_dp_comp(coins: &[i32], amt: usize) -> i32 { + let n = coins.len(); + // Инициализация таблицы dp + let mut dp = vec![0; amt + 1]; + dp[0] = 1; + // Переход состояний + for i in 1..=n { + for a in 1..=amt { + if coins[i - 1] > a as i32 { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Сумма двух решений: не брать или взять монету i + dp[a] = dp[a] + dp[a - coins[i - 1] as usize]; + } + } + } + dp[amt] +} + +/* Driver Code */ +pub fn main() { + let coins = [1, 2, 5]; + let amt: usize = 5; + + // Динамическое программирование + let res = coin_change_ii_dp(&coins, amt); + println!("Количество комбинаций монет для набора целевой суммы = {res}"); + + // Динамическое программирование с оптимизацией памяти + let res = coin_change_ii_dp_comp(&coins, amt); + println!("Количество комбинаций монет для набора целевой суммы = {res}"); +} diff --git a/ru/codes/rust/chapter_dynamic_programming/edit_distance.rs b/ru/codes/rust/chapter_dynamic_programming/edit_distance.rs new file mode 100644 index 000000000..e805b1e27 --- /dev/null +++ b/ru/codes/rust/chapter_dynamic_programming/edit_distance.rs @@ -0,0 +1,145 @@ +/* + * File: edit_distance.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Редакционное расстояние: полный перебор */ +fn edit_distance_dfs(s: &str, t: &str, i: usize, j: usize) -> i32 { + // Если s и t пусты, вернуть 0 + if i == 0 && j == 0 { + return 0; + } + // Если s пусто, вернуть длину t + if i == 0 { + return j as i32; + } + // Если t пусто, вернуть длину s + if j == 0 { + return i as i32; + } + // Если два символа равны, сразу пропустить их + if s.chars().nth(i - 1) == t.chars().nth(j - 1) { + return edit_distance_dfs(s, t, i - 1, j - 1); + } + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + let insert = edit_distance_dfs(s, t, i, j - 1); + let delete = edit_distance_dfs(s, t, i - 1, j); + let replace = edit_distance_dfs(s, t, i - 1, j - 1); + // Вернуть минимальное число шагов редактирования + std::cmp::min(std::cmp::min(insert, delete), replace) + 1 +} + +/* Редакционное расстояние: поиск с мемоизацией */ +fn edit_distance_dfs_mem(s: &str, t: &str, mem: &mut Vec>, i: usize, j: usize) -> i32 { + // Если s и t пусты, вернуть 0 + if i == 0 && j == 0 { + return 0; + } + // Если s пусто, вернуть длину t + if i == 0 { + return j as i32; + } + // Если t пусто, вернуть длину s + if j == 0 { + return i as i32; + } + // Если запись уже есть, сразу вернуть ее + if mem[i][j] != -1 { + return mem[i][j]; + } + // Если два символа равны, сразу пропустить их + if s.chars().nth(i - 1) == t.chars().nth(j - 1) { + return edit_distance_dfs_mem(s, t, mem, i - 1, j - 1); + } + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + let insert = edit_distance_dfs_mem(s, t, mem, i, j - 1); + let delete = edit_distance_dfs_mem(s, t, mem, i - 1, j); + let replace = edit_distance_dfs_mem(s, t, mem, i - 1, j - 1); + // Сохранить и вернуть минимальное число шагов редактирования + mem[i][j] = std::cmp::min(std::cmp::min(insert, delete), replace) + 1; + mem[i][j] +} + +/* Редакционное расстояние: динамическое программирование */ +fn edit_distance_dp(s: &str, t: &str) -> i32 { + let (n, m) = (s.len(), t.len()); + let mut dp = vec![vec![0; m + 1]; n + 1]; + // Переход состояний: первая строка и первый столбец + for i in 1..=n { + dp[i][0] = i as i32; + } + for j in 1..m { + dp[0][j] = j as i32; + } + // Переход состояний: остальные строки и столбцы + for i in 1..=n { + for j in 1..=m { + if s.chars().nth(i - 1) == t.chars().nth(j - 1) { + // Если два символа равны, сразу пропустить их + dp[i][j] = dp[i - 1][j - 1]; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[i][j] = + std::cmp::min(std::cmp::min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1; + } + } + } + dp[n][m] +} + +/* Редакционное расстояние: динамическое программирование с оптимизацией памяти */ +fn edit_distance_dp_comp(s: &str, t: &str) -> i32 { + let (n, m) = (s.len(), t.len()); + let mut dp = vec![0; m + 1]; + // Переход состояний: первая строка + for j in 1..m { + dp[j] = j as i32; + } + // Переход состояний: остальные строки + for i in 1..=n { + // Переход состояний: первый столбец + let mut leftup = dp[0]; // Временно сохранить dp[i-1, j-1] + dp[0] = i as i32; + // Переход состояний: остальные столбцы + for j in 1..=m { + let temp = dp[j]; + if s.chars().nth(i - 1) == t.chars().nth(j - 1) { + // Если два символа равны, сразу пропустить их + dp[j] = leftup; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[j] = std::cmp::min(std::cmp::min(dp[j - 1], dp[j]), leftup) + 1; + } + leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации + } + } + dp[m] +} + +/* Driver Code */ +pub fn main() { + let s = "bag"; + let t = "pack"; + let (n, m) = (s.len(), t.len()); + + // Полный перебор + let res = edit_distance_dfs(s, t, n, m); + println!("Чтобы преобразовать {s} в {t}, нужно минимум {res} шагов"); + + // Поиск с запоминанием + let mut mem = vec![vec![0; m + 1]; n + 1]; + for row in mem.iter_mut() { + row.fill(-1); + } + let res = edit_distance_dfs_mem(s, t, &mut mem, n, m); + println!("Чтобы преобразовать {s} в {t}, нужно минимум {res} шагов"); + + // Динамическое программирование + let res = edit_distance_dp(s, t); + println!("Чтобы преобразовать {s} в {t}, нужно минимум {res} шагов"); + + // Динамическое программирование с оптимизацией памяти + let res = edit_distance_dp_comp(s, t); + println!("Чтобы преобразовать {s} в {t}, нужно минимум {res} шагов"); +} diff --git a/ru/codes/rust/chapter_dynamic_programming/knapsack.rs b/ru/codes/rust/chapter_dynamic_programming/knapsack.rs new file mode 100644 index 000000000..da782c796 --- /dev/null +++ b/ru/codes/rust/chapter_dynamic_programming/knapsack.rs @@ -0,0 +1,113 @@ +/* + * File: knapsack.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Рюкзак 0-1: полный перебор */ +fn knapsack_dfs(wgt: &[i32], val: &[i32], i: usize, c: usize) -> i32 { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if i == 0 || c == 0 { + return 0; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if wgt[i - 1] > c as i32 { + return knapsack_dfs(wgt, val, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + let no = knapsack_dfs(wgt, val, i - 1, c); + let yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1] as usize) + val[i - 1]; + // Вернуть вариант с большей стоимостью из двух возможных + std::cmp::max(no, yes) +} + +/* Рюкзак 0-1: поиск с мемоизацией */ +fn knapsack_dfs_mem(wgt: &[i32], val: &[i32], mem: &mut Vec>, i: usize, c: usize) -> i32 { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if i == 0 || c == 0 { + return 0; + } + // Если запись уже есть, вернуть сразу + if mem[i][c] != -1 { + return mem[i][c]; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if wgt[i - 1] > c as i32 { + return knapsack_dfs_mem(wgt, val, mem, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + let no = knapsack_dfs_mem(wgt, val, mem, i - 1, c); + let yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1] as usize) + val[i - 1]; + // Сохранить и вернуть вариант с большей стоимостью из двух решений + mem[i][c] = std::cmp::max(no, yes); + mem[i][c] +} + +/* Рюкзак 0-1: динамическое программирование */ +fn knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 { + let n = wgt.len(); + // Инициализация таблицы dp + let mut dp = vec![vec![0; cap + 1]; n + 1]; + // Переход состояний + for i in 1..=n { + for c in 1..=cap { + if wgt[i - 1] > c as i32 { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = std::cmp::max( + dp[i - 1][c], + dp[i - 1][c - wgt[i - 1] as usize] + val[i - 1], + ); + } + } + } + dp[n][cap] +} + +/* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */ +fn knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 { + let n = wgt.len(); + // Инициализация таблицы dp + let mut dp = vec![0; cap + 1]; + // Переход состояний + for i in 1..=n { + // Обход в обратном порядке + for c in (1..=cap).rev() { + if wgt[i - 1] <= c as i32 { + // Большее из двух решений: не брать или взять предмет i + dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]); + } + } + } + dp[cap] +} + +/* Driver Code */ +pub fn main() { + let wgt = [10, 20, 30, 40, 50]; + let val = [50, 120, 150, 210, 240]; + let cap: usize = 50; + let n = wgt.len(); + + // Полный перебор + let res = knapsack_dfs(&wgt, &val, n, cap); + println!("Максимальная стоимость предметов без превышения вместимости рюкзака = {res}"); + + // Поиск с запоминанием + let mut mem = vec![vec![0; cap + 1]; n + 1]; + for row in mem.iter_mut() { + row.fill(-1); + } + let res = knapsack_dfs_mem(&wgt, &val, &mut mem, n, cap); + println!("Максимальная стоимость предметов без превышения вместимости рюкзака = {res}"); + + // Динамическое программирование + let res = knapsack_dp(&wgt, &val, cap); + println!("Максимальная стоимость предметов без превышения вместимости рюкзака = {res}"); + + // Динамическое программирование с оптимизацией памяти + let res = knapsack_dp_comp(&wgt, &val, cap); + println!("Максимальная стоимость предметов без превышения вместимости рюкзака = {res}"); +} diff --git a/ru/codes/rust/chapter_dynamic_programming/min_cost_climbing_stairs_dp.rs b/ru/codes/rust/chapter_dynamic_programming/min_cost_climbing_stairs_dp.rs new file mode 100644 index 000000000..636199a2f --- /dev/null +++ b/ru/codes/rust/chapter_dynamic_programming/min_cost_climbing_stairs_dp.rs @@ -0,0 +1,52 @@ +/* + * File: min_cost_climbing_stairs_dp.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +use std::cmp; + +/* Минимальная стоимость подъема по лестнице: динамическое программирование */ +fn min_cost_climbing_stairs_dp(cost: &[i32]) -> i32 { + let n = cost.len() - 1; + if n == 1 || n == 2 { + return cost[n]; + } + // Инициализация таблицы dp для хранения решений подзадач + let mut dp = vec![-1; n + 1]; + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = cost[1]; + dp[2] = cost[2]; + // Переход состояний: постепенное решение больших подзадач через меньшие + for i in 3..=n { + dp[i] = cmp::min(dp[i - 1], dp[i - 2]) + cost[i]; + } + dp[n] +} + +/* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */ +fn min_cost_climbing_stairs_dp_comp(cost: &[i32]) -> i32 { + let n = cost.len() - 1; + if n == 1 || n == 2 { + return cost[n]; + }; + let (mut a, mut b) = (cost[1], cost[2]); + for i in 3..=n { + let tmp = b; + b = cmp::min(a, tmp) + cost[i]; + a = tmp; + } + b +} + +/* Driver Code */ +pub fn main() { + let cost = [0, 1, 10, 1, 1, 1, 10, 1, 1, 10, 1]; + println!("Список стоимостей ступеней = {:?}", &cost); + + let res = min_cost_climbing_stairs_dp(&cost); + println!("Минимальная стоимость подъема по лестнице = {res}"); + + let res = min_cost_climbing_stairs_dp_comp(&cost); + println!("Минимальная стоимость подъема по лестнице = {res}"); +} diff --git a/ru/codes/rust/chapter_dynamic_programming/min_path_sum.rs b/ru/codes/rust/chapter_dynamic_programming/min_path_sum.rs new file mode 100644 index 000000000..0ac9e722e --- /dev/null +++ b/ru/codes/rust/chapter_dynamic_programming/min_path_sum.rs @@ -0,0 +1,120 @@ +/* + * File: min_path_sum.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Минимальная сумма пути: полный перебор */ +fn min_path_sum_dfs(grid: &Vec>, i: i32, j: i32) -> i32 { + // Если это верхняя левая ячейка, завершить поиск + if i == 0 && j == 0 { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if i < 0 || j < 0 { + return i32::MAX; + } + // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1) + let up = min_path_sum_dfs(grid, i - 1, j); + let left = min_path_sum_dfs(grid, i, j - 1); + // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + std::cmp::min(left, up) + grid[i as usize][j as usize] +} + +/* Минимальная сумма пути: поиск с мемоизацией */ +fn min_path_sum_dfs_mem(grid: &Vec>, mem: &mut Vec>, i: i32, j: i32) -> i32 { + // Если это верхняя левая ячейка, завершить поиск + if i == 0 && j == 0 { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if i < 0 || j < 0 { + return i32::MAX; + } + // Если запись уже есть, вернуть сразу + if mem[i as usize][j as usize] != -1 { + return mem[i as usize][j as usize]; + } + // Минимальная стоимость пути для левой и верхней ячеек + let up = min_path_sum_dfs_mem(grid, mem, i - 1, j); + let left = min_path_sum_dfs_mem(grid, mem, i, j - 1); + // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + mem[i as usize][j as usize] = std::cmp::min(left, up) + grid[i as usize][j as usize]; + mem[i as usize][j as usize] +} + +/* Минимальная сумма пути: динамическое программирование */ +fn min_path_sum_dp(grid: &Vec>) -> i32 { + let (n, m) = (grid.len(), grid[0].len()); + // Инициализация таблицы dp + let mut dp = vec![vec![0; m]; n]; + dp[0][0] = grid[0][0]; + // Переход состояний: первая строка + for j in 1..m { + dp[0][j] = dp[0][j - 1] + grid[0][j]; + } + // Переход состояний: первый столбец + for i in 1..n { + dp[i][0] = dp[i - 1][0] + grid[i][0]; + } + // Переход состояний: остальные строки и столбцы + for i in 1..n { + for j in 1..m { + dp[i][j] = std::cmp::min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]; + } + } + dp[n - 1][m - 1] +} + +/* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */ +fn min_path_sum_dp_comp(grid: &Vec>) -> i32 { + let (n, m) = (grid.len(), grid[0].len()); + // Инициализация таблицы dp + let mut dp = vec![0; m]; + // Переход состояний: первая строка + dp[0] = grid[0][0]; + for j in 1..m { + dp[j] = dp[j - 1] + grid[0][j]; + } + // Переход состояний: остальные строки + for i in 1..n { + // Переход состояний: первый столбец + dp[0] = dp[0] + grid[i][0]; + // Переход состояний: остальные столбцы + for j in 1..m { + dp[j] = std::cmp::min(dp[j - 1], dp[j]) + grid[i][j]; + } + } + dp[m - 1] +} + +/* Driver Code */ +pub fn main() { + let grid = vec![ + vec![1, 3, 1, 5], + vec![2, 2, 4, 2], + vec![5, 3, 2, 1], + vec![4, 3, 5, 2], + ]; + let (n, m) = (grid.len(), grid[0].len()); + + // Полный перебор + let res = min_path_sum_dfs(&grid, n as i32 - 1, m as i32 - 1); + println!("Минимальная сумма пути из левого верхнего угла в правый нижний = {res}"); + + // Поиск с мемоизацией + let mut mem = vec![vec![0; m]; n]; + for row in mem.iter_mut() { + row.fill(-1); + } + let res = min_path_sum_dfs_mem(&grid, &mut mem, n as i32 - 1, m as i32 - 1); + println!("Минимальная сумма пути из левого верхнего угла в правый нижний = {res}"); + + // Динамическое программирование + let res = min_path_sum_dp(&grid); + println!("Минимальная сумма пути из левого верхнего угла в правый нижний = {res}"); + + // Динамическое программирование с оптимизацией памяти + let res = min_path_sum_dp_comp(&grid); + println!("Минимальная сумма пути из левого верхнего угла в правый нижний = {res}"); +} diff --git a/ru/codes/rust/chapter_dynamic_programming/unbounded_knapsack.rs b/ru/codes/rust/chapter_dynamic_programming/unbounded_knapsack.rs new file mode 100644 index 000000000..164754f9e --- /dev/null +++ b/ru/codes/rust/chapter_dynamic_programming/unbounded_knapsack.rs @@ -0,0 +1,60 @@ +/* + * File: unbounded_knapsack.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Полный рюкзак: динамическое программирование */ +fn unbounded_knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 { + let n = wgt.len(); + // Инициализация таблицы dp + let mut dp = vec![vec![0; cap + 1]; n + 1]; + // Переход состояний + for i in 1..=n { + for c in 1..=cap { + if wgt[i - 1] > c as i32 { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = std::cmp::max(dp[i - 1][c], dp[i][c - wgt[i - 1] as usize] + val[i - 1]); + } + } + } + return dp[n][cap]; +} + +/* Полный рюкзак: динамическое программирование с оптимизацией памяти */ +fn unbounded_knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 { + let n = wgt.len(); + // Инициализация таблицы dp + let mut dp = vec![0; cap + 1]; + // Переход состояний + for i in 1..=n { + for c in 1..=cap { + if wgt[i - 1] > c as i32 { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]); + } + } + } + dp[cap] +} + +/* Driver Code */ +pub fn main() { + let wgt = [1, 2, 3]; + let val = [5, 11, 15]; + let cap: usize = 4; + + // Динамическое программирование + let res = unbounded_knapsack_dp(&wgt, &val, cap); + println!("Максимальная стоимость предметов без превышения вместимости рюкзака = {res}"); + + // Динамическое программирование с оптимизацией памяти + let res = unbounded_knapsack_dp_comp(&wgt, &val, cap); + println!("Максимальная стоимость предметов без превышения вместимости рюкзака = {res}"); +} diff --git a/ru/codes/rust/chapter_graph/graph_adjacency_list.rs b/ru/codes/rust/chapter_graph/graph_adjacency_list.rs new file mode 100644 index 000000000..994e7cbf0 --- /dev/null +++ b/ru/codes/rust/chapter_graph/graph_adjacency_list.rs @@ -0,0 +1,135 @@ +/* + * File: graph_adjacency_list.rs + * Created Time: 2023-07-12 + * Author: night-cruise (2586447362@qq.com) + */ + +pub use hello_algo_rust::include::{vals_to_vets, vets_to_vals, Vertex}; + +use std::collections::HashMap; + +/* Тип неориентированного графа на основе списка смежности */ +pub struct GraphAdjList { + // Список смежности, где key — вершина, а value — все смежные ей вершины + pub adj_list: HashMap>, // maybe HashSet for value part is better? +} + +impl GraphAdjList { + /* Конструктор */ + pub fn new(edges: Vec<[Vertex; 2]>) -> Self { + let mut graph = GraphAdjList { + adj_list: HashMap::new(), + }; + // Добавить все вершины и ребра + for edge in edges { + graph.add_vertex(edge[0]); + graph.add_vertex(edge[1]); + graph.add_edge(edge[0], edge[1]); + } + + graph + } + + /* Получить число вершин */ + #[allow(unused)] + pub fn size(&self) -> usize { + self.adj_list.len() + } + + /* Добавление ребра */ + pub fn add_edge(&mut self, vet1: Vertex, vet2: Vertex) { + if vet1 == vet2 { + panic!("value error"); + } + // Добавить ребро vet1 - vet2 + self.adj_list.entry(vet1).or_default().push(vet2); + self.adj_list.entry(vet2).or_default().push(vet1); + } + + /* Удаление ребра */ + #[allow(unused)] + pub fn remove_edge(&mut self, vet1: Vertex, vet2: Vertex) { + if vet1 == vet2 { + panic!("value error"); + } + // Удалить ребро vet1 - vet2 + self.adj_list + .entry(vet1) + .and_modify(|v| v.retain(|&e| e != vet2)); + self.adj_list + .entry(vet2) + .and_modify(|v| v.retain(|&e| e != vet1)); + } + + /* Добавление вершины */ + pub fn add_vertex(&mut self, vet: Vertex) { + if self.adj_list.contains_key(&vet) { + return; + } + // Добавить новый список в список смежности + self.adj_list.insert(vet, vec![]); + } + + /* Удаление вершины */ + #[allow(unused)] + pub fn remove_vertex(&mut self, vet: Vertex) { + // Удалить из списка смежности список, соответствующий вершине vet + self.adj_list.remove(&vet); + // Обойти списки других вершин и удалить все ребра, содержащие vet + for list in self.adj_list.values_mut() { + list.retain(|&v| v != vet); + } + } + + /* Вывести список смежности */ + pub fn print(&self) { + println!("Список смежности ="); + for (vertex, list) in &self.adj_list { + let list = list.iter().map(|vertex| vertex.val).collect::>(); + println!("{}: {:?},", vertex.val, list); + } + } +} + +/* Driver Code */ +#[allow(unused)] +fn main() { + /* Инициализация неориентированного графа */ + let v = vals_to_vets(vec![1, 3, 2, 5, 4]); + let edges = vec![ + [v[0], v[1]], + [v[0], v[3]], + [v[1], v[2]], + [v[2], v[3]], + [v[2], v[4]], + [v[3], v[4]], + ]; + + let mut graph = GraphAdjList::new(edges); + println!("\nГраф после инициализации"); + graph.print(); + + /* Добавление ребра */ + // Вершины 1 и 2 соответствуют v[0] и v[2] + graph.add_edge(v[0], v[2]); + println!("\nГраф после добавления ребра 1-2"); + graph.print(); + + /* Удаление ребра */ + // Вершины 1 и 3 соответствуют v[0] и v[1] + graph.remove_edge(v[0], v[1]); + println!("\nГраф после удаления ребра 1-3"); + graph.print(); + + /* Добавление вершины */ + let v5 = Vertex { val: 6 }; + graph.add_vertex(v5); + println!("\nГраф после добавления вершины 6"); + graph.print(); + + /* Удаление вершины */ + // Вершина 3 соответствует v[1] + graph.remove_vertex(v[1]); + println!("\nГраф после удаления вершины 3"); + graph.print(); +} diff --git a/ru/codes/rust/chapter_graph/graph_adjacency_matrix.rs b/ru/codes/rust/chapter_graph/graph_adjacency_matrix.rs new file mode 100644 index 000000000..0b3cd042e --- /dev/null +++ b/ru/codes/rust/chapter_graph/graph_adjacency_matrix.rs @@ -0,0 +1,136 @@ +/* + * File: graph_adjacency_matrix.rs + * Created Time: 2023-07-12 + * Author: night-cruise (2586447362@qq.com) + */ + +/* Тип неориентированного графа на основе матрицы смежности */ +pub struct GraphAdjMat { + // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин» + pub vertices: Vec, + // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин» + pub adj_mat: Vec>, +} + +impl GraphAdjMat { + /* Конструктор */ + pub fn new(vertices: Vec, edges: Vec<[usize; 2]>) -> Self { + let mut graph = GraphAdjMat { + vertices: vec![], + adj_mat: vec![], + }; + // Добавление вершины + for val in vertices { + graph.add_vertex(val); + } + // Добавить ребра + // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices + for edge in edges { + graph.add_edge(edge[0], edge[1]) + } + + graph + } + + /* Получить число вершин */ + pub fn size(&self) -> usize { + self.vertices.len() + } + + /* Добавление вершины */ + pub fn add_vertex(&mut self, val: i32) { + let n = self.size(); + // Добавить значение новой вершины в список вершин + self.vertices.push(val); + // Добавить строку в матрицу смежности + self.adj_mat.push(vec![0; n]); + // Добавить столбец в матрицу смежности + for row in self.adj_mat.iter_mut() { + row.push(0); + } + } + + /* Удаление вершины */ + pub fn remove_vertex(&mut self, index: usize) { + if index >= self.size() { + panic!("index error") + } + // Удалить вершину с индексом index из списка вершин + self.vertices.remove(index); + // Удалить строку с индексом index из матрицы смежности + self.adj_mat.remove(index); + // Удалить столбец с индексом index из матрицы смежности + for row in self.adj_mat.iter_mut() { + row.remove(index); + } + } + + /* Добавление ребра */ + pub fn add_edge(&mut self, i: usize, j: usize) { + // Параметры i и j соответствуют индексам элементов vertices + // Обработка выхода индекса за границы и случая равенства + if i >= self.size() || j >= self.size() || i == j { + panic!("index error") + } + // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i) + self.adj_mat[i][j] = 1; + self.adj_mat[j][i] = 1; + } + + /* Удаление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + pub fn remove_edge(&mut self, i: usize, j: usize) { + // Параметры i и j соответствуют индексам элементов vertices + // Обработка выхода индекса за границы и случая равенства + if i >= self.size() || j >= self.size() || i == j { + panic!("index error") + } + self.adj_mat[i][j] = 0; + self.adj_mat[j][i] = 0; + } + + /* Вывести матрицу смежности */ + pub fn print(&self) { + println!("Список вершин = {:?}", self.vertices); + println!("Матрица смежности ="); + println!("["); + for row in &self.adj_mat { + println!(" {:?},", row); + } + println!("]") + } +} + +/* Driver Code */ +fn main() { + /* Инициализация неориентированного графа */ + // Обратите внимание: элементы edges представляют индексы вершин, то есть соответствуют индексам элементов vertices + let vertices = vec![1, 3, 2, 5, 4]; + let edges = vec![[0, 1], [0, 3], [1, 2], [2, 3], [2, 4], [3, 4]]; + let mut graph = GraphAdjMat::new(vertices, edges); + println!("\nГраф после инициализации"); + graph.print(); + + /* Добавление ребра */ + // Индексы вершин 1 и 2 равны 0 и 2 соответственно + graph.add_edge(0, 2); + println!("\nГраф после добавления ребра 1-2"); + graph.print(); + + /* Удаление ребра */ + // Индексы вершин 1 и 3 равны 0 и 1 соответственно + graph.remove_edge(0, 1); + println!("\nГраф после удаления ребра 1-3"); + graph.print(); + + /* Добавление вершины */ + graph.add_vertex(6); + println!("\nГраф после добавления вершины 6"); + graph.print(); + + /* Удаление вершины */ + // Индекс вершины 3 равен 1 + graph.remove_vertex(1); + println!("\nГраф после удаления вершины 3"); + graph.print(); +} diff --git a/ru/codes/rust/chapter_graph/graph_bfs.rs b/ru/codes/rust/chapter_graph/graph_bfs.rs new file mode 100644 index 000000000..027e43d53 --- /dev/null +++ b/ru/codes/rust/chapter_graph/graph_bfs.rs @@ -0,0 +1,69 @@ +/* + * File: graph_bfs.rs + * Created Time: 2023-07-12 + * Author: night-cruise (2586447362@qq.com) + */ + +mod graph_adjacency_list; + +use graph_adjacency_list::GraphAdjList; +use graph_adjacency_list::{vals_to_vets, vets_to_vals, Vertex}; +use std::collections::{HashSet, VecDeque}; + +/* Обход в ширину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +fn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec { + // Последовательность обхода вершин + let mut res = vec![]; + // Хеш-множество для хранения уже посещенных вершин + let mut visited = HashSet::new(); + visited.insert(start_vet); + // Очередь используется для реализации BFS + let mut que = VecDeque::new(); + que.push_back(start_vet); + // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины + while let Some(vet) = que.pop_front() { + res.push(vet); // Отметить посещенную вершину + + // Обойти все смежные вершины данной вершины + if let Some(adj_vets) = graph.adj_list.get(&vet) { + for &adj_vet in adj_vets { + if visited.contains(&adj_vet) { + continue; // Пропустить уже посещенную вершину + } + que.push_back(adj_vet); // Помещать в очередь только непосещенные вершины + visited.insert(adj_vet); // Отметить эту вершину как посещенную + } + } + } + // Вернуть последовательность обхода вершин + res +} + +/* Driver Code */ +fn main() { + /* Инициализация неориентированного графа */ + let v = vals_to_vets(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + let edges = vec![ + [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]], + ]; + let graph = GraphAdjList::new(edges); + println!("\nГраф после инициализации"); + graph.print(); + + /* Обход в ширину */ + let res = graph_bfs(graph, v[0]); + println!("\nПоследовательность вершин при обходе в ширину (BFS)"); + println!("{:?}", vets_to_vals(res)); +} diff --git a/ru/codes/rust/chapter_graph/graph_dfs.rs b/ru/codes/rust/chapter_graph/graph_dfs.rs new file mode 100644 index 000000000..c9c622c18 --- /dev/null +++ b/ru/codes/rust/chapter_graph/graph_dfs.rs @@ -0,0 +1,61 @@ +/* + * File: graph_dfs.rs + * Created Time: 2023-07-12 + * Author: night-cruise (2586447362@qq.com) + */ + +mod graph_adjacency_list; + +use graph_adjacency_list::GraphAdjList; +use graph_adjacency_list::{vals_to_vets, vets_to_vals, Vertex}; +use std::collections::HashSet; + +/* Вспомогательная функция обхода в глубину */ +fn dfs(graph: &GraphAdjList, visited: &mut HashSet, res: &mut Vec, vet: Vertex) { + res.push(vet); // Отметить посещенную вершину + visited.insert(vet); // Отметить эту вершину как посещенную + // Обойти все смежные вершины данной вершины + if let Some(adj_vets) = graph.adj_list.get(&vet) { + for &adj_vet in adj_vets { + if visited.contains(&adj_vet) { + continue; // Пропустить уже посещенную вершину + } + // Рекурсивно обходить смежные вершины + dfs(graph, visited, res, adj_vet); + } + } +} + +/* Обход в глубину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +fn graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> Vec { + // Последовательность обхода вершин + let mut res = vec![]; + // Хеш-множество для хранения уже посещенных вершин + let mut visited = HashSet::new(); + dfs(&graph, &mut visited, &mut res, start_vet); + + res +} + +/* Driver Code */ +fn main() { + /* Инициализация неориентированного графа */ + let v = vals_to_vets(vec![0, 1, 2, 3, 4, 5, 6]); + let edges = vec![ + [v[0], v[1]], + [v[0], v[3]], + [v[1], v[2]], + [v[2], v[5]], + [v[4], v[5]], + [v[5], v[6]], + ]; + let graph = GraphAdjList::new(edges); + println!("\nГраф после инициализации"); + graph.print(); + + /* Обход в глубину */ + let res = graph_dfs(graph, v[0]); + println!("\nПоследовательность вершин при обходе в глубину (DFS)"); + println!("{:?}", vets_to_vals(res)); +} diff --git a/ru/codes/rust/chapter_greedy/coin_change_greedy.rs b/ru/codes/rust/chapter_greedy/coin_change_greedy.rs new file mode 100644 index 000000000..67a59878f --- /dev/null +++ b/ru/codes/rust/chapter_greedy/coin_change_greedy.rs @@ -0,0 +1,54 @@ +/* + * File: coin_change_greedy.rs + * Created Time: 2023-07-22 + * Author: night-cruise (2586447362@qq.com) + */ + +/* Размен монет: жадный алгоритм */ +fn coin_change_greedy(coins: &[i32], mut amt: i32) -> i32 { + // Предположить, что список coins упорядочен + let mut i = coins.len() - 1; + let mut count = 0; + // Циклически выполнять жадный выбор, пока не останется суммы + while amt > 0 { + // Найти монету, которая меньше остатка суммы и наиболее к нему близка + while i > 0 && coins[i] > amt { + i -= 1; + } + // Выбрать coins[i] + amt -= coins[i]; + count += 1; + } + // Если допустимое решение не найдено, вернуть -1 + if amt == 0 { + count + } else { + -1 + } +} + +/* Driver Code */ +fn main() { + // Жадный подход: гарантирует нахождение глобально оптимального решения + let coins = [1, 5, 10, 20, 50, 100]; + let amt = 186; + let res = coin_change_greedy(&coins, amt); + println!("\ncoins = {:?}, amt = {}", coins, amt); + println!("Минимальное число монет для набора суммы {} = {}", amt, res); + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + let coins = [1, 20, 50]; + let amt = 60; + let res = coin_change_greedy(&coins, amt); + println!("\ncoins = {:?}, amt = {}", coins, amt); + println!("Минимальное число монет для набора суммы {} = {}", amt, res); + println!("На самом деле минимум равен 3: 20 + 20 + 20"); + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + let coins = [1, 49, 50]; + let amt = 98; + let res = coin_change_greedy(&coins, amt); + println!("\ncoins = {:?}, amt = {}", coins, amt); + println!("Минимальное число монет для набора суммы {} = {}", amt, res); + println!("На самом деле минимум равен 2: 49 + 49"); +} diff --git a/ru/codes/rust/chapter_greedy/fractional_knapsack.rs b/ru/codes/rust/chapter_greedy/fractional_knapsack.rs new file mode 100644 index 000000000..35490f902 --- /dev/null +++ b/ru/codes/rust/chapter_greedy/fractional_knapsack.rs @@ -0,0 +1,59 @@ +/* + * File: coin_change_greedy.rs + * Created Time: 2023-07-22 + * Author: night-cruise (2586447362@qq.com) + */ + +/* Предмет */ +struct Item { + w: i32, // Вес предмета + v: i32, // Стоимость предмета +} + +impl Item { + fn new(w: i32, v: i32) -> Self { + Self { w, v } + } +} + +/* Дробный рюкзак: жадный алгоритм */ +fn fractional_knapsack(wgt: &[i32], val: &[i32], mut cap: i32) -> f64 { + // Создать список предметов с двумя свойствами: вес и стоимость + let mut items = wgt + .iter() + .zip(val.iter()) + .map(|(&w, &v)| Item::new(w, v)) + .collect::>(); + // Отсортировать по удельной стоимости item.v / item.w в порядке убывания + items.sort_by(|a, b| { + (b.v as f64 / b.w as f64) + .partial_cmp(&(a.v as f64 / a.w as f64)) + .unwrap() + }); + // Циклический жадный выбор + let mut res = 0.0; + for item in &items { + if item.w <= cap { + // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком + res += item.v as f64; + cap -= item.w; + } else { + // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета + res += item.v as f64 / item.w as f64 * cap as f64; + // Свободной вместимости больше не осталось, поэтому выйти из цикла + break; + } + } + res +} + +/* Driver Code */ +fn main() { + let wgt = [10, 20, 30, 40, 50]; + let val = [50, 120, 150, 210, 240]; + let cap = 50; + + // Жадный алгоритм + let res = fractional_knapsack(&wgt, &val, cap); + println!("Максимальная стоимость предметов без превышения вместимости рюкзака = {}", res); +} diff --git a/ru/codes/rust/chapter_greedy/max_capacity.rs b/ru/codes/rust/chapter_greedy/max_capacity.rs new file mode 100644 index 000000000..9952a985a --- /dev/null +++ b/ru/codes/rust/chapter_greedy/max_capacity.rs @@ -0,0 +1,36 @@ +/* + * File: coin_change_greedy.rs + * Created Time: 2023-07-22 + * Author: night-cruise (2586447362@qq.com) + */ + +/* Максимальная вместимость: жадный алгоритм */ +fn max_capacity(ht: &[i32]) -> i32 { + // Инициализировать i и j так, чтобы они располагались по двум концам массива + let mut i = 0; + let mut j = ht.len() - 1; + // Начальная максимальная вместимость равна 0 + let mut res = 0; + // Выполнять жадный выбор в цикле, пока две доски не встретятся + while i < j { + // Обновить максимальную вместимость + let cap = std::cmp::min(ht[i], ht[j]) * (j - i) as i32; + res = std::cmp::max(res, cap); + // Сдвигать внутрь более короткую сторону + if ht[i] < ht[j] { + i += 1; + } else { + j -= 1; + } + } + res +} + +/* Driver Code */ +fn main() { + let ht = [3, 8, 5, 2, 7, 7, 3, 4]; + + // Жадный алгоритм + let res = max_capacity(&ht); + println!("Максимальная вместимость = {}", res); +} diff --git a/ru/codes/rust/chapter_greedy/max_product_cutting.rs b/ru/codes/rust/chapter_greedy/max_product_cutting.rs new file mode 100644 index 000000000..42094cb13 --- /dev/null +++ b/ru/codes/rust/chapter_greedy/max_product_cutting.rs @@ -0,0 +1,35 @@ +/* + * File: coin_change_greedy.rs + * Created Time: 2023-07-22 + * Author: night-cruise (2586447362@qq.com) + */ + +/* Максимальное произведение разрезания: жадный алгоритм */ +fn max_product_cutting(n: i32) -> i32 { + // Когда n <= 3, обязательно нужно выделить одну 1 + if n <= 3 { + return 1 * (n - 1); + } + // Жадно выделить множители 3, где a — число троек, а b — остаток + let a = n / 3; + let b = n % 3; + if b == 1 { + // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2 + 3_i32.pow(a as u32 - 1) * 2 * 2 + } else if b == 2 { + // Если остаток равен 2, ничего не делать + 3_i32.pow(a as u32) * 2 + } else { + // Если остаток равен 0, ничего не делать + 3_i32.pow(a as u32) + } +} + +/* Driver Code */ +fn main() { + let n = 58; + + // Жадный алгоритм + let res = max_product_cutting(n); + println!("Максимальное произведение после разрезания = {}", res); +} diff --git a/ru/codes/rust/chapter_hashing/array_hash_map.rs b/ru/codes/rust/chapter_hashing/array_hash_map.rs new file mode 100644 index 000000000..baee122c8 --- /dev/null +++ b/ru/codes/rust/chapter_hashing/array_hash_map.rs @@ -0,0 +1,124 @@ +/** + * File: array_hash_map.rs + * Created Time: 2023-2-18 + * Author: xBLACICEx (xBLACKICEx@outlook.com) + */ + +/* Пара ключ-значение */ +#[derive(Debug, Clone, PartialEq)] +pub struct Pair { + pub key: i32, + pub val: String, +} +/* Хеш-таблица на основе массива */ +pub struct ArrayHashMap { + buckets: Vec>, +} + +impl ArrayHashMap { + pub fn new() -> ArrayHashMap { + // Инициализировать массив, содержащий 100 корзин + Self { + buckets: vec![None; 100], + } + } + + /* Хеш-функция */ + fn hash_func(&self, key: i32) -> usize { + key as usize % 100 + } + + /* Операция поиска */ + pub fn get(&self, key: i32) -> Option<&String> { + let index = self.hash_func(key); + self.buckets[index].as_ref().map(|pair| &pair.val) + } + + /* Операция добавления */ + pub fn put(&mut self, key: i32, val: &str) { + let index = self.hash_func(key); + self.buckets[index] = Some(Pair { + key, + val: val.to_string(), + }); + } + + /* Операция удаления */ + pub fn remove(&mut self, key: i32) { + let index = self.hash_func(key); + // Присвоить None, что означает удаление + self.buckets[index] = None; + } + + /* Получить все пары ключ-значение */ + pub fn entry_set(&self) -> Vec<&Pair> { + self.buckets + .iter() + .filter_map(|pair| pair.as_ref()) + .collect() + } + + /* Получить все ключи */ + pub fn key_set(&self) -> Vec<&i32> { + self.buckets + .iter() + .filter_map(|pair| pair.as_ref().map(|pair| &pair.key)) + .collect() + } + + /* Получить все значения */ + pub fn value_set(&self) -> Vec<&String> { + self.buckets + .iter() + .filter_map(|pair| pair.as_ref().map(|pair| &pair.val)) + .collect() + } + + /* Вывести хеш-таблицу */ + pub fn print(&self) { + for pair in self.entry_set() { + println!("{} -> {}", pair.key, pair.val); + } + } +} + +fn main() { + /* Инициализация хеш-таблицы */ + let mut map = ArrayHashMap::new(); + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.put(12836, "Сяо Ха"); + map.put(15937, "Сяо Ло"); + map.put(16750, "Сяо Суань"); + map.put(13276, "Сяо Фа"); + map.put(10583, "Сяо Я"); + println!("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение"); + map.print(); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + let name = map.get(15937).unwrap(); + println!("\nДля номера 15937 найдено имя {}", name); + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(10583); + println!("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение"); + map.print(); + + /* Обход хеш-таблицы */ + println!("\nОтдельный обход пар ключ-значение"); + for pair in map.entry_set() { + println!("{} -> {}", pair.key, pair.val); + } + + println!("\nОтдельный обход ключей"); + for key in map.key_set() { + println!("{}", key); + } + + println!("\nОтдельный обход значений"); + for val in map.value_set() { + println!("{}", val); + } +} diff --git a/ru/codes/rust/chapter_hashing/build_in_hash.rs b/ru/codes/rust/chapter_hashing/build_in_hash.rs new file mode 100644 index 000000000..60a1a2eee --- /dev/null +++ b/ru/codes/rust/chapter_hashing/build_in_hash.rs @@ -0,0 +1,49 @@ +/* + * File: build_in_hash.rs + * Created Time: 2023-7-6 + * Author: WSL0809 (wslzzy@outlook.com) + */ + +use hello_algo_rust::include::ListNode; + +use std::collections::hash_map::DefaultHasher; +use std::hash::{Hash, Hasher}; + +/* Driver Code */ +fn main() { + let num = 3; + let mut num_hasher = DefaultHasher::new(); + num.hash(&mut num_hasher); + let hash_num = num_hasher.finish(); + println!("Хеш-значение целого числа {} = {}", num, hash_num); + + let bol = true; + let mut bol_hasher = DefaultHasher::new(); + bol.hash(&mut bol_hasher); + let hash_bol = bol_hasher.finish(); + println!("Хеш-значение булева значения {} = {}", bol, hash_bol); + + let dec: f32 = 3.14159; + let mut dec_hasher = DefaultHasher::new(); + dec.to_bits().hash(&mut dec_hasher); + let hash_dec = dec_hasher.finish(); + println!("Хеш-значение десятичного числа {} = {}", dec, hash_dec); + + let str = "Hello Algo"; + let mut str_hasher = DefaultHasher::new(); + str.hash(&mut str_hasher); + let hash_str = str_hasher.finish(); + println!("Хеш-значение строки {} = {}", str, hash_str); + + let arr = (&12836, &"Сяо Ха"); + let mut tup_hasher = DefaultHasher::new(); + arr.hash(&mut tup_hasher); + let hash_tup = tup_hasher.finish(); + println!("Хеш-значение кортежа {:?} = {}", arr, hash_tup); + + let node = ListNode::new(42); + let mut hasher = DefaultHasher::new(); + node.borrow().val.hash(&mut hasher); + let hash = hasher.finish(); + println!("Хеш-значение объекта узла {:?} = {}", node, hash); +} diff --git a/ru/codes/rust/chapter_hashing/hash_map.rs b/ru/codes/rust/chapter_hashing/hash_map.rs new file mode 100644 index 000000000..3272de284 --- /dev/null +++ b/ru/codes/rust/chapter_hashing/hash_map.rs @@ -0,0 +1,48 @@ +/* + * File: hash_map.rs + * Created Time: 2023-02-05 + * Author: codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::print_util; + +use std::collections::HashMap; + +/* Driver Code */ +pub fn main() { + // Инициализация хеш-таблицы + let mut map = HashMap::new(); + + // Операция добавления + // Добавить пару (key, value) в хеш-таблицу + map.insert(12836, "Сяо Ха"); + map.insert(15937, "Сяо Ло"); + map.insert(16750, "Сяо Суань"); + map.insert(13276, "Сяо Фа"); + map.insert(10583, "Сяо Я"); + println!("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение"); + print_util::print_hash_map(&map); + + // Операция поиска + // Передать ключ key в хеш-таблицу и получить значение value + let name = map.get(&15937).copied().unwrap(); + println!("\nДля номера 15937 найдено имя {name}"); + + // Операция удаления + // Удалить пару (key, value) из хеш-таблицы + _ = map.remove(&10583); + println!("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение"); + print_util::print_hash_map(&map); + + // Обход хеш-таблицы + println!("\nОтдельный обход пар ключ-значение"); + print_util::print_hash_map(&map); + println!("\nОтдельный обход ключей"); + for key in map.keys() { + println!("{key}"); + } + println!("\nОтдельный обход значений"); + for value in map.values() { + println!("{value}"); + } +} diff --git a/ru/codes/rust/chapter_hashing/hash_map_chaining.rs b/ru/codes/rust/chapter_hashing/hash_map_chaining.rs new file mode 100644 index 000000000..72384cc49 --- /dev/null +++ b/ru/codes/rust/chapter_hashing/hash_map_chaining.rs @@ -0,0 +1,156 @@ +/* + * File: hash_map_chaining.rs + * Created Time: 2023-07-07 + * Author: WSL0809 (wslzzy@outlook.com) + */ + +#[derive(Clone)] +/* Пара ключ-значение */ +struct Pair { + key: i32, + val: String, +} + +/* Хеш-таблица с цепочками */ +struct HashMapChaining { + size: usize, + capacity: usize, + load_thres: f32, + extend_ratio: usize, + buckets: Vec>, +} + +impl HashMapChaining { + /* Конструктор */ + fn new() -> Self { + Self { + size: 0, + capacity: 4, + load_thres: 2.0 / 3.0, + extend_ratio: 2, + buckets: vec![vec![]; 4], + } + } + + /* Хеш-функция */ + fn hash_func(&self, key: i32) -> usize { + key as usize % self.capacity + } + + /* Коэффициент загрузки */ + fn load_factor(&self) -> f32 { + self.size as f32 / self.capacity as f32 + } + + /* Операция удаления */ + fn remove(&mut self, key: i32) -> Option { + let index = self.hash_func(key); + + // Обойти корзину и удалить из нее пару ключ-значение + for (i, p) in self.buckets[index].iter_mut().enumerate() { + if p.key == key { + let pair = self.buckets[index].remove(i); + self.size -= 1; + return Some(pair.val); + } + } + + // Если key не найден, вернуть None + None + } + + /* Расширить хеш-таблицу */ + fn extend(&mut self) { + // Временно сохранить исходную хеш-таблицу + let buckets_tmp = std::mem::take(&mut self.buckets); + + // Инициализация новой хеш-таблицы после расширения + self.capacity *= self.extend_ratio; + self.buckets = vec![Vec::new(); self.capacity as usize]; + self.size = 0; + + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for bucket in buckets_tmp { + for pair in bucket { + self.put(pair.key, pair.val); + } + } + } + + /* Вывести хеш-таблицу */ + fn print(&self) { + for bucket in &self.buckets { + let mut res = Vec::new(); + for pair in bucket { + res.push(format!("{} -> {}", pair.key, pair.val)); + } + println!("{:?}", res); + } + } + + /* Операция добавления */ + fn put(&mut self, key: i32, val: String) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if self.load_factor() > self.load_thres { + self.extend(); + } + + let index = self.hash_func(key); + + // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть + for pair in self.buckets[index].iter_mut() { + if pair.key == key { + pair.val = val; + return; + } + } + + // Если такого key нет, добавить пару ключ-значение в конец + let pair = Pair { key, val }; + self.buckets[index].push(pair); + self.size += 1; + } + + /* Операция поиска */ + fn get(&self, key: i32) -> Option<&str> { + let index = self.hash_func(key); + + // Обойти корзину; если найден key, вернуть соответствующее val + for pair in self.buckets[index].iter() { + if pair.key == key { + return Some(&pair.val); + } + } + + // Если key не найден, вернуть None + None + } +} + +/* Driver Code */ +pub fn main() { + /* Инициализация хеш-таблицы */ + let mut map = HashMapChaining::new(); + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.put(12836, "Сяо Ха".to_string()); + map.put(15937, "Сяо Ло".to_string()); + map.put(16750, "Сяо Суань".to_string()); + map.put(13276, "Сяо Фа".to_string()); + map.put(10583, "Сяо Я".to_string()); + println!("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение"); + map.print(); + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + println!( + "\nПо номеру 13276 найдено имя {}",\nmatch map.get(13276) {\n Some(value) => value,\n None => "Not a valid Key",\n} + ); + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(12836); + println!("\nПосле удаления 12836 хеш-таблица имеет вид\nКлюч -> Значение"); + map.print(); +} diff --git a/ru/codes/rust/chapter_hashing/hash_map_open_addressing.rs b/ru/codes/rust/chapter_hashing/hash_map_open_addressing.rs new file mode 100644 index 000000000..32f4bf299 --- /dev/null +++ b/ru/codes/rust/chapter_hashing/hash_map_open_addressing.rs @@ -0,0 +1,181 @@ +/* + * File: hash_map_open_addressing.rs + * Created Time: 2023-07-16 + * Author: WSL0809 (wslzzy@outlook.com), night-cruise (2586447362@qq.com) + */ +#![allow(non_snake_case)] +#![allow(unused)] + +mod array_hash_map; + +use array_hash_map::Pair; + +/* Хеш-таблица с открытой адресацией */ +struct HashMapOpenAddressing { + size: usize, // Число пар ключ-значение + capacity: usize, // Вместимость хеш-таблицы + load_thres: f64, // Порог коэффициента загрузки для запуска расширения + extend_ratio: usize, // Коэффициент расширения + buckets: Vec>, // Массив корзин + TOMBSTONE: Option, // Удалить метку +} + +impl HashMapOpenAddressing { + /* Конструктор */ + fn new() -> Self { + Self { + size: 0, + capacity: 4, + load_thres: 2.0 / 3.0, + extend_ratio: 2, + buckets: vec![None; 4], + TOMBSTONE: Some(Pair { + key: -1, + val: "-1".to_string(), + }), + } + } + + /* Хеш-функция */ + fn hash_func(&self, key: i32) -> usize { + (key % self.capacity as i32) as usize + } + + /* Коэффициент загрузки */ + fn load_factor(&self) -> f64 { + self.size as f64 / self.capacity as f64 + } + + /* Найти индекс корзины, соответствующий key */ + fn find_bucket(&mut self, key: i32) -> usize { + let mut index = self.hash_func(key); + let mut first_tombstone = -1; + // Выполнять линейное пробирование и завершить при встрече с пустой корзиной + while self.buckets[index].is_some() { + // Если встретился key, вернуть соответствующий индекс корзины + if self.buckets[index].as_ref().unwrap().key == key { + // Если ранее встретилась метка удаления, переместить пару ключ-значение в этот индекс + if first_tombstone != -1 { + self.buckets[first_tombstone as usize] = self.buckets[index].take(); + self.buckets[index] = self.TOMBSTONE.clone(); + return first_tombstone as usize; // Вернуть индекс корзины после перемещения + } + return index; // Вернуть индекс корзины + } + // Записать первую встретившуюся метку удаления + if first_tombstone == -1 && self.buckets[index] == self.TOMBSTONE { + first_tombstone = index as i32; + } + // Вычислить индекс корзины; при выходе за конец вернуться к началу + index = (index + 1) % self.capacity; + } + // Если key не существует, вернуть индекс точки добавления + if first_tombstone == -1 { + index + } else { + first_tombstone as usize + } + } + + /* Операция поиска */ + fn get(&mut self, key: i32) -> Option<&str> { + // Найти индекс корзины, соответствующий key + let index = self.find_bucket(key); + // Если пара ключ-значение найдена, вернуть соответствующее val + if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE { + return self.buckets[index].as_ref().map(|pair| &pair.val as &str); + } + // Если пары ключ-значение не существует, вернуть null + None + } + + /* Операция добавления */ + fn put(&mut self, key: i32, val: String) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if self.load_factor() > self.load_thres { + self.extend(); + } + // Найти индекс корзины, соответствующий key + let index = self.find_bucket(key); + // Если пара ключ-значение найдена, перезаписать val и вернуть + if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE { + self.buckets[index].as_mut().unwrap().val = val; + return; + } + // Если пары ключ-значение нет, добавить ее + self.buckets[index] = Some(Pair { key, val }); + self.size += 1; + } + + /* Операция удаления */ + fn remove(&mut self, key: i32) { + // Найти индекс корзины, соответствующий key + let index = self.find_bucket(key); + // Если пара ключ-значение найдена, заменить ее меткой удаления + if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE { + self.buckets[index] = self.TOMBSTONE.clone(); + self.size -= 1; + } + } + + /* Расширить хеш-таблицу */ + fn extend(&mut self) { + // Временно сохранить исходную хеш-таблицу + let buckets_tmp = self.buckets.clone(); + // Инициализация новой хеш-таблицы после расширения + self.capacity *= self.extend_ratio; + self.buckets = vec![None; self.capacity]; + self.size = 0; + + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for pair in buckets_tmp { + if pair.is_none() || pair == self.TOMBSTONE { + continue; + } + let pair = pair.unwrap(); + + self.put(pair.key, pair.val); + } + } + /* Вывести хеш-таблицу */ + fn print(&self) { + for pair in &self.buckets { + if pair.is_none() { + println!("null"); + } else if pair == &self.TOMBSTONE { + println!("TOMBSTONE"); + } else { + let pair = pair.as_ref().unwrap(); + println!("{} -> {}", pair.key, pair.val); + } + } + } +} + +/* Driver Code */ +fn main() { + /* Инициализация хеш-таблицы */ + let mut hashmap = HashMapOpenAddressing::new(); + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + hashmap.put(12836, "Сяо Ха".to_string()); + hashmap.put(15937, "Сяо Ло".to_string()); + hashmap.put(16750, "Сяо Суань".to_string()); + hashmap.put(13276, "Сяо Фа".to_string()); + hashmap.put(10583, "Сяо Я".to_string()); + + println!("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение"); + hashmap.print(); + + /* Операция поиска */ + // Передать ключ key в хеш-таблицу и получить значение val + let name = hashmap.get(13276).unwrap(); + println!("\nДля номера 13276 найдено имя {}", name); + + /* Операция удаления */ + // Удалить пару (key, val) из хеш-таблицы + hashmap.remove(16750); + println!("\nПосле удаления 16750 хеш-таблица имеет вид\nКлюч -> Значение"); + hashmap.print(); +} diff --git a/ru/codes/rust/chapter_hashing/simple_hash.rs b/ru/codes/rust/chapter_hashing/simple_hash.rs new file mode 100644 index 000000000..e09898470 --- /dev/null +++ b/ru/codes/rust/chapter_hashing/simple_hash.rs @@ -0,0 +1,70 @@ +/* + * File: simple_hash.rs + * Created Time: 2023-09-07 + * Author: night-cruise (2586447362@qq.com) + */ + +/* Аддитивное хеширование */ +fn add_hash(key: &str) -> i32 { + let mut hash = 0_i64; + const MODULUS: i64 = 1000000007; + + for c in key.chars() { + hash = (hash + c as i64) % MODULUS; + } + + hash as i32 +} + +/* Мультипликативное хеширование */ +fn mul_hash(key: &str) -> i32 { + let mut hash = 0_i64; + const MODULUS: i64 = 1000000007; + + for c in key.chars() { + hash = (31 * hash + c as i64) % MODULUS; + } + + hash as i32 +} + +/* XOR-хеширование */ +fn xor_hash(key: &str) -> i32 { + let mut hash = 0_i64; + const MODULUS: i64 = 1000000007; + + for c in key.chars() { + hash ^= c as i64; + } + + (hash & MODULUS) as i32 +} + +/* Хеширование с циклическим сдвигом */ +fn rot_hash(key: &str) -> i32 { + let mut hash = 0_i64; + const MODULUS: i64 = 1000000007; + + for c in key.chars() { + hash = ((hash << 4) ^ (hash >> 28) ^ c as i64) % MODULUS; + } + + hash as i32 +} + +/* Driver Code */ +fn main() { + let key = "Hello Algo"; + + let hash = add_hash(key); + println!("Хеш-сумма сложением = {hash}"); + + let hash = mul_hash(key); + println!("Хеш-сумма умножением = {hash}"); + + let hash = xor_hash(key); + println!("Хеш-сумма XOR = {hash}"); + + let hash = rot_hash(key); + println!("Хеш-сумма с циклическим сдвигом = {hash}"); +} diff --git a/ru/codes/rust/chapter_heap/heap.rs b/ru/codes/rust/chapter_heap/heap.rs new file mode 100644 index 000000000..ec4ed3ca3 --- /dev/null +++ b/ru/codes/rust/chapter_heap/heap.rs @@ -0,0 +1,71 @@ +/* + * File: heap.rs + * Created Time: 2023-07-16 + * Author: night-cruise (2586447362@qq.com) + */ + +use hello_algo_rust::include::print_util; + +use std::{cmp::Reverse, collections::BinaryHeap}; + +fn test_push_max(heap: &mut BinaryHeap, val: i32) { + heap.push(val); // Добавление элемента в кучу + println!("\nПосле добавления элемента {} в кучу", val); + print_util::print_heap(heap.iter().map(|&val| val).collect()); +} + +fn test_pop_max(heap: &mut BinaryHeap) { + let val = heap.pop().unwrap(); + println!("\nПосле извлечения элемента вершины кучи {}", val); + print_util::print_heap(heap.iter().map(|&val| val).collect()); +} + +/* Driver Code */ +fn main() { + /* Инициализация кучи */ + // Инициализация минимальной кучи + #[allow(unused_assignments)] + let mut min_heap = BinaryHeap::new(); + // BinaryHeap в Rust является максимальной кучей; для минимальной кучи обычно используют оболочку Reverse + // Инициализировать максимальную кучу + let mut max_heap = BinaryHeap::new(); + + println!("\nНиже приведен тестовый пример для max-heap"); + + /* Добавление элемента в кучу */ + test_push_max(&mut max_heap, 1); + test_push_max(&mut max_heap, 3); + test_push_max(&mut max_heap, 2); + test_push_max(&mut max_heap, 5); + test_push_max(&mut max_heap, 4); + + /* Получение элемента с вершины кучи */ + let peek = max_heap.peek().unwrap(); + println!("\nЭлемент на вершине кучи = {}", peek); + + /* Извлечение элемента с вершины кучи */ + test_pop_max(&mut max_heap); + test_pop_max(&mut max_heap); + test_pop_max(&mut max_heap); + test_pop_max(&mut max_heap); + test_pop_max(&mut max_heap); + + /* Получение размера кучи */ + let size = max_heap.len(); + println!("\nКоличество элементов в куче = {}", size); + + /* Проверка, пуста ли куча */ + let is_empty = max_heap.is_empty(); + println!("\nПуста ли куча: {}", is_empty); + + /* Построить кучу по входному списку */ + // Временная сложность равна O(n), а не O(nlogn) + min_heap = BinaryHeap::from( + vec![1, 3, 2, 5, 4] + .into_iter() + .map(|val| Reverse(val)) + .collect::>>(), + ); + println!("\nПосле построения min-heap из входного списка"); + print_util::print_heap(min_heap.iter().map(|&val| val.0).collect()); +} diff --git a/ru/codes/rust/chapter_heap/my_heap.rs b/ru/codes/rust/chapter_heap/my_heap.rs new file mode 100644 index 000000000..f267cd6aa --- /dev/null +++ b/ru/codes/rust/chapter_heap/my_heap.rs @@ -0,0 +1,165 @@ +/* + * File: my_heap.rs + * Created Time: 2023-07-16 + * Author: night-cruise (2586447362@qq.com) + */ + +use hello_algo_rust::include::print_util; + +/* Максимальная куча */ +struct MaxHeap { + // Использовать vector вместо массива, чтобы не учитывать проблему расширения + max_heap: Vec, +} + +impl MaxHeap { + /* Конструктор, строящий кучу по входному списку */ + fn new(nums: Vec) -> Self { + // Добавить элементы списка в кучу без изменений + let mut heap = MaxHeap { max_heap: nums }; + // Выполнить heapify для всех узлов, кроме листовых + for i in (0..=Self::parent(heap.size() - 1)).rev() { + heap.sift_down(i); + } + heap + } + + /* Получить индекс левого дочернего узла */ + fn left(i: usize) -> usize { + 2 * i + 1 + } + + /* Получить индекс правого дочернего узла */ + fn right(i: usize) -> usize { + 2 * i + 2 + } + + /* Получить индекс родительского узла */ + fn parent(i: usize) -> usize { + (i - 1) / 2 // Округление вниз при делении + } + + /* Поменять элементы местами */ + fn swap(&mut self, i: usize, j: usize) { + self.max_heap.swap(i, j); + } + + /* Получение размера кучи */ + fn size(&self) -> usize { + self.max_heap.len() + } + + /* Проверка, пуста ли куча */ + fn is_empty(&self) -> bool { + self.max_heap.is_empty() + } + + /* Доступ к элементу на вершине кучи */ + fn peek(&self) -> Option { + self.max_heap.first().copied() + } + + /* Добавление элемента в кучу */ + fn push(&mut self, val: i32) { + // Добавление узла + self.max_heap.push(val); + // Просеивание снизу вверх + self.sift_up(self.size() - 1); + } + + /* Начиная с узла i, выполнить просеивание снизу вверх */ + fn sift_up(&mut self, mut i: usize) { + loop { + // Если узел i уже является вершиной кучи, завершить просеивание + if i == 0 { + break; + } + // Получение родительского узла для узла i + let p = Self::parent(i); + // Когда «узел не требует исправления», завершить просеивание + if self.max_heap[i] <= self.max_heap[p] { + break; + } + // Поменять два узла местами + self.swap(i, p); + // Циклическое просеивание вверх + i = p; + } + } + + /* Извлечение элемента из кучи */ + fn pop(&mut self) -> i32 { + // Обработка пустого случая + if self.is_empty() { + panic!("index out of bounds"); + } + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + self.swap(0, self.size() - 1); + // Удаление узла + let val = self.max_heap.pop().unwrap(); + // Просеивание сверху вниз + self.sift_down(0); + // Вернуть элемент с вершины кучи + val + } + + /* Начиная с узла i, выполнить просеивание сверху вниз */ + fn sift_down(&mut self, mut i: usize) { + loop { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + let (l, r, mut ma) = (Self::left(i), Self::right(i), i); + if l < self.size() && self.max_heap[l] > self.max_heap[ma] { + ma = l; + } + if r < self.size() && self.max_heap[r] > self.max_heap[ma] { + ma = r; + } + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if ma == i { + break; + } + // Поменять два узла местами + self.swap(i, ma); + // Циклическое просеивание вниз + i = ma; + } + } + + /* Вывести кучу (двоичное дерево) */ + fn print(&self) { + print_util::print_heap(self.max_heap.clone()); + } +} + +/* Driver Code */ +fn main() { + /* Инициализация максимальной кучи */ + let mut max_heap = MaxHeap::new(vec![9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2]); + println!("\nПосле построения кучи из входного списка"); + max_heap.print(); + + /* Получение элемента с вершины кучи */ + let peek = max_heap.peek(); + if let Some(peek) = peek { + println!("\nЭлемент на вершине кучи = {}", peek); + } + + /* Добавление элемента в кучу */ + let val = 7; + max_heap.push(val); + println!("\nПосле добавления элемента {} в кучу", val); + max_heap.print(); + + /* Извлечение элемента с вершины кучи */ + let peek = max_heap.pop(); + println!("\nПосле извлечения элемента вершины кучи {}", peek); + max_heap.print(); + + /* Получение размера кучи */ + let size = max_heap.size(); + println!("\nКоличество элементов в куче = {}", size); + + /* Проверка, пуста ли куча */ + let is_empty = max_heap.is_empty(); + println!("\nПуста ли куча: {}", is_empty); +} diff --git a/ru/codes/rust/chapter_heap/top_k.rs b/ru/codes/rust/chapter_heap/top_k.rs new file mode 100644 index 000000000..7ff708a3d --- /dev/null +++ b/ru/codes/rust/chapter_heap/top_k.rs @@ -0,0 +1,39 @@ +/* + * File: top_k.rs + * Created Time: 2023-07-16 + * Author: night-cruise (2586447362@qq.com) + */ + +use hello_algo_rust::include::print_util; + +use std::cmp::Reverse; +use std::collections::BinaryHeap; + +/* Найти k наибольших элементов массива с помощью кучи */ +fn top_k_heap(nums: Vec, k: usize) -> BinaryHeap> { + // BinaryHeap — это максимальная куча; с помощью Reverse элементы инвертируются, чтобы реализовать минимальную кучу + let mut heap = BinaryHeap::>::new(); + // Поместить первые k элементов массива в кучу + for &num in nums.iter().take(k) { + heap.push(Reverse(num)); + } + // Начиная с элемента k+1, поддерживать длину кучи равной k + for &num in nums.iter().skip(k) { + // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу + if num > heap.peek().unwrap().0 { + heap.pop(); + heap.push(Reverse(num)); + } + } + heap +} + +/* Driver Code */ +fn main() { + let nums = vec![1, 7, 6, 3, 2]; + let k = 3; + + let res = top_k_heap(nums, k); + println!("Наибольшие {} элементов", k); + print_util::print_heap(res.into_iter().map(|item| item.0).collect()); +} diff --git a/ru/codes/rust/chapter_searching/binary_search.rs b/ru/codes/rust/chapter_searching/binary_search.rs new file mode 100644 index 000000000..7ad51483b --- /dev/null +++ b/ru/codes/rust/chapter_searching/binary_search.rs @@ -0,0 +1,65 @@ +/* + * File: binary_search.rs + * Created Time: 2023-02-05 + * Author: codingonion (coderonion@gmail.com) + */ + +/* Бинарный поиск (двусторонне замкнутый интервал) */ +fn binary_search(nums: &[i32], target: i32) -> i32 { + // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно + let mut i = 0; + let mut j = nums.len() as i32 - 1; + // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст) + while i <= j { + let m = i + (j - i) / 2; // Вычислить индекс середины m + if nums[m as usize] < target { + // Это означает, что target находится в интервале [m+1, j] + i = m + 1; + } else if nums[m as usize] > target { + // Это означает, что target находится в интервале [i, m-1] + j = m - 1; + } else { + // Целевой элемент найден, вернуть его индекс + return m; + } + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +/* Бинарный поиск (лево замкнутый, право открытый интервал) */ +fn binary_search_lcro(nums: &[i32], target: i32) -> i32 { + // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно + let mut i = 0; + let mut j = nums.len() as i32; + // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст) + while i < j { + let m = i + (j - i) / 2; // Вычислить индекс середины m + if nums[m as usize] < target { + // Это означает, что target находится в интервале [m+1, j) + i = m + 1; + } else if nums[m as usize] > target { + // Это означает, что target находится в интервале [i, m) + j = m; + } else { + // Целевой элемент найден, вернуть его индекс + return m; + } + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +/* Driver Code */ +pub fn main() { + let target = 6; + let nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; + + // Бинарный поиск (двусторонне замкнутый интервал) + let mut index = binary_search(&nums, target); + println!("Индекс целевого элемента 6 = {index}"); + + // Бинарный поиск (лево замкнутый, право открытый интервал) + index = binary_search_lcro(&nums, target); + println!("Индекс целевого элемента 6 = {index}"); +} diff --git a/ru/codes/rust/chapter_searching/binary_search_edge.rs b/ru/codes/rust/chapter_searching/binary_search_edge.rs new file mode 100644 index 000000000..df7a2ee95 --- /dev/null +++ b/ru/codes/rust/chapter_searching/binary_search_edge.rs @@ -0,0 +1,50 @@ +/* + * File: binary_search_edge.rs + * Created Time: 2023-08-30 + * Author: night-cruise (2586447362@qq.com) + */ + +mod binary_search_insertion; + +use binary_search_insertion::binary_search_insertion; + +/* Бинарный поиск самого левого target */ +fn binary_search_left_edge(nums: &[i32], target: i32) -> i32 { + // Эквивалентно поиску точки вставки target + let i = binary_search_insertion(nums, target); + // target не найден, вернуть -1 + if i == nums.len() as i32 || nums[i as usize] != target { + return -1; + } + // Найти target и вернуть индекс i + i +} + +/* Бинарный поиск самого правого target */ +fn binary_search_right_edge(nums: &[i32], target: i32) -> i32 { + // Преобразовать задачу в поиск самого левого target + 1 + let i = binary_search_insertion(nums, target + 1); + // j указывает на самый правый target, а i — на первый элемент больше target + let j = i - 1; + // target не найден, вернуть -1 + if j == -1 || nums[j as usize] != target { + return -1; + } + // Найти target и вернуть индекс j + j +} + +/* Driver Code */ +fn main() { + // Массив с повторяющимися элементами + let nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15]; + println!("\nМассив nums = {:?}", nums); + + // Бинарный поиск левой и правой границы + for target in [6, 7] { + let index = binary_search_left_edge(&nums, target); + println!("Индекс самого левого элемента {} равен {}", target, index); + let index = binary_search_right_edge(&nums, target); + println!("Индекс самого правого элемента {} равен {}", target, index); + } +} diff --git a/ru/codes/rust/chapter_searching/binary_search_insertion.rs b/ru/codes/rust/chapter_searching/binary_search_insertion.rs new file mode 100644 index 000000000..13a9f5756 --- /dev/null +++ b/ru/codes/rust/chapter_searching/binary_search_insertion.rs @@ -0,0 +1,61 @@ +/* + * File: binary_search_insertion.rs + * Created Time: 2023-08-30 + * Author: night-cruise (2586447362@qq.com) + */ +#![allow(unused)] + +/* Бинарный поиск точки вставки (без повторяющихся элементов) */ +fn binary_search_insertion_simple(nums: &[i32], target: i32) -> i32 { + let (mut i, mut j) = (0, nums.len() as i32 - 1); // Инициализировать двусторонне замкнутый интервал [0, n-1] + while i <= j { + let m = i + (j - i) / 2; // Вычислить индекс середины m + if nums[m as usize] < target { + i = m + 1; // target находится в интервале [m+1, j] + } else if nums[m as usize] > target { + j = m - 1; // target находится в интервале [i, m-1] + } else { + return m; + } + } + // target не найден, вернуть точку вставки i + i +} + +/* Бинарный поиск точки вставки (с повторяющимися элементами) */ +pub fn binary_search_insertion(nums: &[i32], target: i32) -> i32 { + let (mut i, mut j) = (0, nums.len() as i32 - 1); // Инициализировать двусторонне замкнутый интервал [0, n-1] + while i <= j { + let m = i + (j - i) / 2; // Вычислить индекс середины m + if nums[m as usize] < target { + i = m + 1; // target находится в интервале [m+1, j] + } else if nums[m as usize] > target { + j = m - 1; // target находится в интервале [i, m-1] + } else { + j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1] + } + } + // Вернуть точку вставки i + i +} + +/* Driver Code */ +fn main() { + // Массив без повторяющихся элементов + let nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; + println!("\nМассив nums = {:?}", nums); + // Бинарный поиск точки вставки + for target in [6, 9] { + let index = binary_search_insertion_simple(&nums, target); + println!("Индекс позиции вставки элемента {} равен {}", target, index); + } + + // Массив с повторяющимися элементами + let nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15]; + println!("\nМассив nums = {:?}", nums); + // Бинарный поиск точки вставки + for target in [2, 6, 20] { + let index = binary_search_insertion(&nums, target); + println!("Индекс позиции вставки элемента {} равен {}", target, index); + } +} diff --git a/ru/codes/rust/chapter_searching/hashing_search.rs b/ru/codes/rust/chapter_searching/hashing_search.rs new file mode 100644 index 000000000..3da866fac --- /dev/null +++ b/ru/codes/rust/chapter_searching/hashing_search.rs @@ -0,0 +1,50 @@ +/* + * File: hashing_search.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::ListNode; +use std::cell::RefCell; +use std::collections::HashMap; +use std::rc::Rc; + +/* Хеш-поиск (массив) */ +fn hashing_search_array<'a>(map: &'a HashMap, target: i32) -> Option<&'a usize> { + // key хеш-таблицы: целевой элемент, value: индекс + // Если такого key нет в хеш-таблице, вернуть None + map.get(&target) +} + +/* Хеш-поиск (связный список) */ +fn hashing_search_linked_list( + map: &HashMap>>>, + target: i32, +) -> Option<&Rc>>> { + // key хеш-таблицы: значение целевого узла, value: объект узла + // Если такого key нет в хеш-таблице, вернуть None + map.get(&target) +} + +/* Driver Code */ +pub fn main() { + let target = 3; + + /* Хеш-поиск (массив) */ + let nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8]; + // Инициализация хеш-таблицы + let mut map = HashMap::new(); + for (i, num) in nums.iter().enumerate() { + map.insert(*num, i); // key: элемент, value: индекс + } + let index = hashing_search_array(&map, target); + println!("Индекс целевого элемента 3 = {}", index.unwrap()); + + /* Хеш-поиск (связный список) */ + let head = ListNode::arr_to_linked_list(&nums); + // Инициализировать хеш-таблицу + // let mut map1 = HashMap::new(); + let map1 = ListNode::linked_list_to_hashmap(head); + let node = hashing_search_linked_list(&map1, target); + println!("Объект узла со значением 3 = {:?}", node); +} diff --git a/ru/codes/rust/chapter_searching/linear_search.rs b/ru/codes/rust/chapter_searching/linear_search.rs new file mode 100644 index 000000000..a64183fa6 --- /dev/null +++ b/ru/codes/rust/chapter_searching/linear_search.rs @@ -0,0 +1,54 @@ +/* + * File: linear_search.rs + * Created Time: 2023-07-09 + * Author: codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::ListNode; +use std::cell::RefCell; +use std::rc::Rc; + +/* Линейный поиск (массив) */ +fn linear_search_array(nums: &[i32], target: i32) -> i32 { + // Обход массива + for (i, num) in nums.iter().enumerate() { + // Целевой элемент найден, вернуть его индекс + if num == &target { + return i as i32; + } + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +/* Линейный поиск (связный список) */ +fn linear_search_linked_list( + head: Rc>>, + target: i32, +) -> Option>>> { + // Найти целевой узел и вернуть его + if head.borrow().val == target { + return Some(head); + }; + // Найти целевой узел и вернуть его + if let Some(node) = &head.borrow_mut().next { + return linear_search_linked_list(node.clone(), target); + } + // Целевой узел не найден, вернуть None + return None; +} + +/* Driver Code */ +pub fn main() { + let target = 3; + + /* Выполнить линейный поиск в массиве */ + let nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8]; + let index = linear_search_array(&nums, target); + println!("Индекс целевого элемента 3 = {}", index); + + /* Выполнить линейный поиск в связном списке */ + let head = ListNode::arr_to_linked_list(&nums); + let node = linear_search_linked_list(head.unwrap(), target); + println!("Объект узла со значением 3 = {:?}", node); +} diff --git a/ru/codes/rust/chapter_searching/two_sum.rs b/ru/codes/rust/chapter_searching/two_sum.rs new file mode 100644 index 000000000..737e03aa1 --- /dev/null +++ b/ru/codes/rust/chapter_searching/two_sum.rs @@ -0,0 +1,52 @@ +/* + * File: two_sum.rs + * Created Time: 2023-01-14 + * Author: xBLACICEx (xBLACKICEx@outlook.com), codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::print_util; +use std::collections::HashMap; + +/* Метод 1: полный перебор */ +pub fn two_sum_brute_force(nums: &Vec, target: i32) -> Option> { + let size = nums.len(); + // Два вложенных цикла, временная сложность O(n^2) + for i in 0..size - 1 { + for j in i + 1..size { + if nums[i] + nums[j] == target { + return Some(vec![i as i32, j as i32]); + } + } + } + None +} + +/* Метод 2: вспомогательная хеш-таблица */ +pub fn two_sum_hash_table(nums: &Vec, target: i32) -> Option> { + // Вспомогательная хеш-таблица, пространственная сложность O(n) + let mut dic = HashMap::new(); + // Один цикл, временная сложность O(n) + for (i, num) in nums.iter().enumerate() { + match dic.get(&(target - num)) { + Some(v) => return Some(vec![*v as i32, i as i32]), + None => dic.insert(num, i as i32), + }; + } + None +} + +fn main() { + // ======= Test Case ======= + let nums = vec![2, 7, 11, 15]; + let target = 13; + + // ====== Основной код ====== + // Метод 1 + let res = two_sum_brute_force(&nums, target).unwrap(); + print!("Результат метода 1 res = "); + print_util::print_array(&res); + // Метод 2 + let res = two_sum_hash_table(&nums, target).unwrap(); + print!("\nРезультат метода 2 res = "); + print_util::print_array(&res); +} diff --git a/ru/codes/rust/chapter_sorting/bubble_sort.rs b/ru/codes/rust/chapter_sorting/bubble_sort.rs new file mode 100644 index 000000000..4ecf1cac4 --- /dev/null +++ b/ru/codes/rust/chapter_sorting/bubble_sort.rs @@ -0,0 +1,53 @@ +/* + * File: bubble_sort.rs + * Created Time: 2023-02-05 + * Author: codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::print_util; + +/* Пузырьковая сортировка */ +fn bubble_sort(nums: &mut [i32]) { + // Внешний цикл: неотсортированный диапазон [0, i] + for i in (1..nums.len()).rev() { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for j in 0..i { + if nums[j] > nums[j + 1] { + // Поменять местами nums[j] и nums[j + 1] + nums.swap(j, j + 1); + } + } + } +} + +/* Пузырьковая сортировка (оптимизация флагом) */ +fn bubble_sort_with_flag(nums: &mut [i32]) { + // Внешний цикл: неотсортированный диапазон [0, i] + for i in (1..nums.len()).rev() { + let mut flag = false; // Инициализировать флаг + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for j in 0..i { + if nums[j] > nums[j + 1] { + // Поменять местами nums[j] и nums[j + 1] + nums.swap(j, j + 1); + flag = true; // Записать обмен элементов + } + } + if !flag { + break; // На этой итерации «всплытия» не было ни одного обмена, сразу выйти + }; + } +} + +/* Driver Code */ +pub fn main() { + let mut nums = [4, 1, 3, 1, 5, 2]; + bubble_sort(&mut nums); + print!("После пузырьковой сортировки nums = "); + print_util::print_array(&nums); + + let mut nums1 = [4, 1, 3, 1, 5, 2]; + bubble_sort_with_flag(&mut nums1); + print!("\nПосле пузырьковой сортировки nums1 = "); + print_util::print_array(&nums1); +} diff --git a/ru/codes/rust/chapter_sorting/bucket_sort.rs b/ru/codes/rust/chapter_sorting/bucket_sort.rs new file mode 100644 index 000000000..a56d0cd65 --- /dev/null +++ b/ru/codes/rust/chapter_sorting/bucket_sort.rs @@ -0,0 +1,43 @@ +/* + * File: bucket_sort.rs + * Created Time: 2023-07-09 + * Author: night-cruise (2586447362@qq.com) + */ + +use hello_algo_rust::include::print_util; + +/* Сортировка корзинами */ +fn bucket_sort(nums: &mut [f64]) { + // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину + let k = nums.len() / 2; + let mut buckets = vec![vec![]; k]; + // 1. Распределить элементы массива по корзинам + for &num in nums.iter() { + // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1] + let i = (num * k as f64) as usize; + // Добавить num в корзину i + buckets[i].push(num); + } + // 2. Выполнить сортировку внутри каждой корзины + for bucket in &mut buckets { + // Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки + bucket.sort_by(|a, b| a.partial_cmp(b).unwrap()); + } + // 3. Обойти корзины и объединить результаты + let mut i = 0; + for bucket in buckets.iter() { + for &num in bucket.iter() { + nums[i] = num; + i += 1; + } + } +} + +/* Driver Code */ +fn main() { + // Пусть входные данные — числа с плавающей точкой из диапазона [0, 1) + let mut nums = [0.49, 0.96, 0.82, 0.09, 0.57, 0.43, 0.91, 0.75, 0.15, 0.37]; + bucket_sort(&mut nums); + print!("После сортировки корзинами nums = "); + print_util::print_array(&nums); +} diff --git a/ru/codes/rust/chapter_sorting/counting_sort.rs b/ru/codes/rust/chapter_sorting/counting_sort.rs new file mode 100644 index 000000000..32b5fe15e --- /dev/null +++ b/ru/codes/rust/chapter_sorting/counting_sort.rs @@ -0,0 +1,70 @@ +/* + * File: counting_sort.rs + * Created Time: 2023-07-09 + * Author: night-cruise (2586447362@qq.com) + */ + +use hello_algo_rust::include::print_util; + +/* Сортировка подсчетом */ +// Простая реализация, не подходит для сортировки объектов +fn counting_sort_naive(nums: &mut [i32]) { + // 1. Найти максимальный элемент массива m + let m = *nums.iter().max().unwrap(); + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + let mut counter = vec![0; m as usize + 1]; + for &num in nums.iter() { + counter[num as usize] += 1; + } + // 3. Обойти counter и заполнить исходный массив nums элементами + let mut i = 0; + for num in 0..m + 1 { + for _ in 0..counter[num as usize] { + nums[i] = num; + i += 1; + } + } +} + +/* Сортировка подсчетом */ +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой +fn counting_sort(nums: &mut [i32]) { + // 1. Найти максимальный элемент массива m + let m = *nums.iter().max().unwrap() as usize; + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + let mut counter = vec![0; m + 1]; + for &num in nums.iter() { + counter[num as usize] += 1; + } + // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс» + // То есть counter[num]-1 — это индекс последнего появления num в res + for i in 0..m { + counter[i + 1] += counter[i]; + } + // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res + // Инициализировать массив res для хранения результата + let n = nums.len(); + let mut res = vec![0; n]; + for i in (0..n).rev() { + let num = nums[i]; + res[counter[num as usize] - 1] = num; // Поместить num по соответствующему индексу + counter[num as usize] -= 1; // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num + } + // Перезаписать исходный массив nums массивом результата res + nums.copy_from_slice(&res) +} + +/* Driver Code */ +fn main() { + let mut nums = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4]; + counting_sort_naive(&mut nums); + print!("После сортировки подсчетом (объекты не поддерживаются) nums = "); + print_util::print_array(&nums); + + let mut nums1 = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4]; + counting_sort(&mut nums1); + print!("\nПосле сортировки подсчетом nums1 = "); + print_util::print_array(&nums1); +} diff --git a/ru/codes/rust/chapter_sorting/heap_sort.rs b/ru/codes/rust/chapter_sorting/heap_sort.rs new file mode 100644 index 000000000..f189d1fb3 --- /dev/null +++ b/ru/codes/rust/chapter_sorting/heap_sort.rs @@ -0,0 +1,54 @@ +/* + * File: heap_sort.rs + * Created Time: 2023-07-04 + * Author: night-cruise (2586447362@qq.com) + */ + +use hello_algo_rust::include::print_util; + +/* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */ +fn sift_down(nums: &mut [i32], n: usize, mut i: usize) { + loop { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + let l = 2 * i + 1; + let r = 2 * i + 2; + let mut ma = i; + if l < n && nums[l] > nums[ma] { + ma = l; + } + if r < n && nums[r] > nums[ma] { + ma = r; + } + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if ma == i { + break; + } + // Поменять два узла местами + nums.swap(i, ma); + // Циклическое просеивание вниз + i = ma; + } +} + +/* Сортировка кучей */ +fn heap_sort(nums: &mut [i32]) { + // Построение кучи: выполнить heapify для всех узлов, кроме листовых + for i in (0..nums.len() / 2).rev() { + sift_down(nums, nums.len(), i); + } + // Извлекать максимальный элемент из кучи в течение n-1 итераций + for i in (1..nums.len()).rev() { + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + nums.swap(0, i); + // Начиная с корневого узла, выполнить просеивание сверху вниз + sift_down(nums, i, 0); + } +} + +/* Driver Code */ +fn main() { + let mut nums = [4, 1, 3, 1, 5, 2]; + heap_sort(&mut nums); + print!("После сортировки кучей nums = "); + print_util::print_array(&nums); +} diff --git a/ru/codes/rust/chapter_sorting/insertion_sort.rs b/ru/codes/rust/chapter_sorting/insertion_sort.rs new file mode 100644 index 000000000..278294d13 --- /dev/null +++ b/ru/codes/rust/chapter_sorting/insertion_sort.rs @@ -0,0 +1,29 @@ +/* + * File: insertion_sort.rs + * Created Time: 2023-02-13 + * Author: xBLACKICEx (xBLACKICEx@outlook.com) + */ + +use hello_algo_rust::include::print_util; + +/* Сортировка вставками */ +fn insertion_sort(nums: &mut [i32]) { + // Внешний цикл: отсортированный диапазон [0, i-1] + for i in 1..nums.len() { + let (base, mut j) = (nums[i], (i - 1) as i32); + // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1] + while j >= 0 && nums[j as usize] > base { + nums[(j + 1) as usize] = nums[j as usize]; // Сдвинуть nums[j] на одну позицию вправо + j -= 1; + } + nums[(j + 1) as usize] = base; // Поместить base в правильную позицию + } +} + +/* Driver Code */ +fn main() { + let mut nums = [4, 1, 3, 1, 5, 2]; + insertion_sort(&mut nums); + print!("После сортировки вставками nums = "); + print_util::print_array(&nums); +} diff --git a/ru/codes/rust/chapter_sorting/merge_sort.rs b/ru/codes/rust/chapter_sorting/merge_sort.rs new file mode 100644 index 000000000..c22ac71d9 --- /dev/null +++ b/ru/codes/rust/chapter_sorting/merge_sort.rs @@ -0,0 +1,66 @@ +/** + * File: merge_sort.rs + * Created Time: 2023-02-14 + * Author: xBLACKICEx (xBLACKICEx@outlook.com) + */ + +/* Объединить левый и правый подмассивы */ +fn merge(nums: &mut [i32], left: usize, mid: usize, right: usize) { + // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right] + // Создать временный массив tmp для хранения результата слияния + let tmp_size = right - left + 1; + let mut tmp = vec![0; tmp_size]; + // Инициализировать начальные индексы левого и правого подмассивов + let (mut i, mut j, mut k) = (left, mid + 1, 0); + // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив + while i <= mid && j <= right { + if nums[i] <= nums[j] { + tmp[k] = nums[i]; + i += 1; + } else { + tmp[k] = nums[j]; + j += 1; + } + k += 1; + } + // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив + while i <= mid { + tmp[k] = nums[i]; + k += 1; + i += 1; + } + while j <= right { + tmp[k] = nums[j]; + k += 1; + j += 1; + } + // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums + for k in 0..tmp_size { + nums[left + k] = tmp[k]; + } +} + +/* Сортировка слиянием */ +fn merge_sort(nums: &mut [i32], left: usize, right: usize) { + // Условие завершения + if left >= right { + return; // Завершить рекурсию, когда длина подмассива равна 1 + } + + // Этап разбиения + let mid = left + (right - left) / 2; // Вычислить середину + merge_sort(nums, left, mid); // Рекурсивно обработать левый подмассив + merge_sort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив + + // Этап слияния + merge(nums, left, mid, right); +} + +/* Driver Code */ +fn main() { + /* Сортировка слиянием */ + let mut nums = [7, 3, 2, 6, 0, 1, 5, 4]; + let right = nums.len() - 1; + merge_sort(&mut nums, 0, right); + println!("После сортировки слиянием nums = {:?}", nums); +} diff --git a/ru/codes/rust/chapter_sorting/quick_sort.rs b/ru/codes/rust/chapter_sorting/quick_sort.rs new file mode 100644 index 000000000..42519eb14 --- /dev/null +++ b/ru/codes/rust/chapter_sorting/quick_sort.rs @@ -0,0 +1,148 @@ +/** + * File: quick_sort.rs + * Created Time: 2023-02-16 + * Author: xBLACKICEx (xBLACKICE@outlook.com) + */ + +/* Быстрая сортировка */ +struct QuickSort; + +impl QuickSort { + /* Разбиение с опорными указателями */ + fn partition(nums: &mut [i32], left: usize, right: usize) -> usize { + // Взять nums[left] в качестве опорного элемента + let (mut i, mut j) = (left, right); + while i < j { + while i < j && nums[j] >= nums[left] { + j -= 1; // Идти справа налево в поисках первого элемента меньше опорного + } + while i < j && nums[i] <= nums[left] { + i += 1; // Идти слева направо в поисках первого элемента больше опорного + } + nums.swap(i, j); // Поменять эти два элемента местами + } + nums.swap(i, left); // Переместить опорный элемент на границу двух подмассивов + i // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка */ + pub fn quick_sort(left: i32, right: i32, nums: &mut [i32]) { + // Завершить рекурсию, когда длина подмассива равна 1 + if left >= right { + return; + } + // Разбиение с опорными указателями + let pivot = Self::partition(nums, left as usize, right as usize) as i32; + // Рекурсивно обработать левый и правый подмассивы + Self::quick_sort(left, pivot - 1, nums); + Self::quick_sort(pivot + 1, right, nums); + } +} + +/* Быстрая сортировка (оптимизация медианным опорным элементом) */ +struct QuickSortMedian; + +impl QuickSortMedian { + /* Выбрать медиану из трех кандидатов */ + fn median_three(nums: &mut [i32], left: usize, mid: usize, right: usize) -> usize { + let (l, m, r) = (nums[left], nums[mid], nums[right]); + if (l <= m && m <= r) || (r <= m && m <= l) { + return mid; // m находится между l и r + } + if (m <= l && l <= r) || (r <= l && l <= m) { + return left; // l находится между m и r + } + right + } + + /* Разбиение с опорными указателями (медиана трех) */ + fn partition(nums: &mut [i32], left: usize, right: usize) -> usize { + // Выбрать медиану из трех кандидатов + let med = Self::median_three(nums, left, (left + right) / 2, right); + // Переместить медиану в крайний левый элемент массива + nums.swap(left, med); + // Взять nums[left] в качестве опорного элемента + let (mut i, mut j) = (left, right); + while i < j { + while i < j && nums[j] >= nums[left] { + j -= 1; // Идти справа налево в поисках первого элемента меньше опорного + } + while i < j && nums[i] <= nums[left] { + i += 1; // Идти слева направо в поисках первого элемента больше опорного + } + nums.swap(i, j); // Поменять эти два элемента местами + } + nums.swap(i, left); // Переместить опорный элемент на границу двух подмассивов + i // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка */ + pub fn quick_sort(left: i32, right: i32, nums: &mut [i32]) { + // Завершить рекурсию, когда длина подмассива равна 1 + if left >= right { + return; + } + // Разбиение с опорными указателями + let pivot = Self::partition(nums, left as usize, right as usize) as i32; + // Рекурсивно обработать левый и правый подмассивы + Self::quick_sort(left, pivot - 1, nums); + Self::quick_sort(pivot + 1, right, nums); + } +} + +/* Быстрая сортировка (оптимизация глубины рекурсии) */ +struct QuickSortTailCall; + +impl QuickSortTailCall { + /* Разбиение с опорными указателями */ + fn partition(nums: &mut [i32], left: usize, right: usize) -> usize { + // Взять nums[left] в качестве опорного элемента + let (mut i, mut j) = (left, right); + while i < j { + while i < j && nums[j] >= nums[left] { + j -= 1; // Идти справа налево в поисках первого элемента меньше опорного + } + while i < j && nums[i] <= nums[left] { + i += 1; // Идти слева направо в поисках первого элемента больше опорного + } + nums.swap(i, j); // Поменять эти два элемента местами + } + nums.swap(i, left); // Переместить опорный элемент на границу двух подмассивов + i // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка (оптимизация глубины рекурсии) */ + pub fn quick_sort(mut left: i32, mut right: i32, nums: &mut [i32]) { + // Завершить, когда длина подмассива равна 1 + while left < right { + // Операция разбиения с опорными указателями + let pivot = Self::partition(nums, left as usize, right as usize) as i32; + // Выполнить быструю сортировку для более короткого из двух подмассивов + if pivot - left < right - pivot { + Self::quick_sort(left, pivot - 1, nums); // Рекурсивно отсортировать левый подмассив + left = pivot + 1; // Оставшийся неотсортированный диапазон: [pivot + 1, right] + } else { + Self::quick_sort(pivot + 1, right, nums); // Рекурсивно отсортировать правый подмассив + right = pivot - 1; // Оставшийся неотсортированный диапазон: [left, pivot - 1] + } + } + } +} + +/* Driver Code */ +fn main() { + /* Быстрая сортировка */ + let mut nums = [2, 4, 1, 0, 3, 5]; + QuickSort::quick_sort(0, (nums.len() - 1) as i32, &mut nums); + println!("После быстрой сортировки nums = {:?}", nums); + + /* Быстрая сортировка (оптимизация медианным опорным элементом) */ + let mut nums = [2, 4, 1, 0, 3, 5]; + QuickSortMedian::quick_sort(0, (nums.len() - 1) as i32, &mut nums); + println!("После быстрой сортировки (оптимизация медианным опорным элементом) nums = {:?}", nums); + + /* Быстрая сортировка (оптимизация глубины рекурсии) */ + let mut nums = [2, 4, 1, 0, 3, 5]; + QuickSortTailCall::quick_sort(0, (nums.len() - 1) as i32, &mut nums); + println!("После быстрой сортировки (оптимизация глубины рекурсии) nums = {:?}", nums); +} diff --git a/ru/codes/rust/chapter_sorting/radix_sort.rs b/ru/codes/rust/chapter_sorting/radix_sort.rs new file mode 100644 index 000000000..bbc554616 --- /dev/null +++ b/ru/codes/rust/chapter_sorting/radix_sort.rs @@ -0,0 +1,63 @@ +/* + * File: radix_sort.rs + * Created Time: 2023-07-09 + * Author: night-cruise (2586447362@qq.com) + */ + +use hello_algo_rust::include::print_util; + +/* Получить k-й разряд элемента num, где exp = 10^(k-1) */ +fn digit(num: i32, exp: i32) -> usize { + // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени + return ((num / exp) % 10) as usize; +} + +/* Сортировка подсчетом (сортировка по k-му разряду nums) */ +fn counting_sort_digit(nums: &mut [i32], exp: i32) { + // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10 + let mut counter = [0; 10]; + let n = nums.len(); + // Подсчитать число появлений каждой цифры от 0 до 9 + for i in 0..n { + let d = digit(nums[i], exp); // Получить k-й разряд nums[i], обозначив его как d + counter[d] += 1; // Подсчитать число появлений цифры d + } + // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива» + for i in 1..10 { + counter[i] += counter[i - 1]; + } + // Выполняя обратный проход, заполнить res элементами по статистике в корзинах + let mut res = vec![0; n]; + for i in (0..n).rev() { + let d = digit(nums[i], exp); + let j = counter[d] - 1; // Получить индекс j цифры d в массиве + res[j] = nums[i]; // Поместить текущий элемент по индексу j + counter[d] -= 1; // Уменьшить количество d на 1 + } + // Перезаписать исходный массив nums результатом + nums.copy_from_slice(&res); +} + +/* Поразрядная сортировка */ +fn radix_sort(nums: &mut [i32]) { + // Получить максимальный элемент массива, чтобы определить максимальное число разрядов + let m = *nums.into_iter().max().unwrap(); + // Проходить разряды от младшего к старшему + let mut exp = 1; + while exp <= m { + counting_sort_digit(nums, exp); + exp *= 10; + } +} + +/* Driver Code */ +fn main() { + // Поразрядная сортировка + let mut nums = [ + 10546151, 35663510, 42865989, 34862445, 81883077, 88906420, 72429244, 30524779, 82060337, + 63832996, + ]; + radix_sort(&mut nums); + print!("После поразрядной сортировки nums = "); + print_util::print_array(&nums); +} diff --git a/ru/codes/rust/chapter_sorting/selection_sort.rs b/ru/codes/rust/chapter_sorting/selection_sort.rs new file mode 100644 index 000000000..b71618f7c --- /dev/null +++ b/ru/codes/rust/chapter_sorting/selection_sort.rs @@ -0,0 +1,35 @@ +/* + * File: selection_sort.rs + * Created Time: 2023-05-30 + * Author: WSL0809 (wslzzy@outlook.com) + */ + +use hello_algo_rust::include::print_util; + +/* Сортировка выбором */ +fn selection_sort(nums: &mut [i32]) { + if nums.is_empty() { + return; + } + let n = nums.len(); + // Внешний цикл: неотсортированный диапазон [i, n-1] + for i in 0..n - 1 { + // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне + let mut k = i; + for j in i + 1..n { + if nums[j] < nums[k] { + k = j; // Записать индекс минимального элемента + } + } + // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона + nums.swap(i, k); + } +} + +/* Driver Code */ +pub fn main() { + let mut nums = [4, 1, 3, 1, 5, 2]; + selection_sort(&mut nums); + print!("\nПосле сортировки выбором nums = "); + print_util::print_array(&nums); +} diff --git a/ru/codes/rust/chapter_stack_and_queue/array_deque.rs b/ru/codes/rust/chapter_stack_and_queue/array_deque.rs new file mode 100644 index 000000000..8125202f2 --- /dev/null +++ b/ru/codes/rust/chapter_stack_and_queue/array_deque.rs @@ -0,0 +1,160 @@ +/* + * File: array_deque.rs + * Created Time: 2023-03-11 + * Author: codingonion (coderonion@gmail.com) + */ +use hello_algo_rust::include::print_util; +/* Двусторонняя очередь на основе кольцевого массива */ +struct ArrayDeque { + nums: Vec, // Массив для хранения элементов двусторонней очереди + front: usize, // Указатель head, указывающий на первый элемент очереди + que_size: usize, // Длина двусторонней очереди +} + +impl ArrayDeque { + /* Конструктор */ + pub fn new(capacity: usize) -> Self { + Self { + nums: vec![T::default(); capacity], + front: 0, + que_size: 0, + } + } + + /* Получить вместимость двусторонней очереди */ + pub fn capacity(&self) -> usize { + self.nums.len() + } + + /* Получение длины двусторонней очереди */ + pub fn size(&self) -> usize { + self.que_size + } + + /* Проверка, пуста ли двусторонняя очередь */ + pub fn is_empty(&self) -> bool { + self.que_size == 0 + } + + /* Вычислить индекс в кольцевом массиве */ + fn index(&self, i: i32) -> usize { + // С помощью операции взятия по модулю соединить начало и конец массива + // Когда i выходит за конец массива, он возвращается в начало + // Когда i выходит за начало массива, он возвращается в конец + ((i + self.capacity() as i32) % self.capacity() as i32) as usize + } + + /* Добавление в голову очереди */ + pub fn push_first(&mut self, num: T) { + if self.que_size == self.capacity() { + println!("Двусторонняя очередь заполнена"); + return; + } + // Указатель головы сдвигается на одну позицию влево + // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост + self.front = self.index(self.front as i32 - 1); + // Добавить num в голову очереди + self.nums[self.front] = num; + self.que_size += 1; + } + + /* Добавление в хвост очереди */ + pub fn push_last(&mut self, num: T) { + if self.que_size == self.capacity() { + println!("Двусторонняя очередь заполнена"); + return; + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + let rear = self.index(self.front as i32 + self.que_size as i32); + // Добавить num в хвост очереди + self.nums[rear] = num; + self.que_size += 1; + } + + /* Извлечение из головы очереди */ + fn pop_first(&mut self) -> T { + let num = self.peek_first(); + // Указатель головы сдвигается на одну позицию назад + self.front = self.index(self.front as i32 + 1); + self.que_size -= 1; + num + } + + /* Извлечение из хвоста очереди */ + fn pop_last(&mut self) -> T { + let num = self.peek_last(); + self.que_size -= 1; + num + } + + /* Доступ к элементу в начале очереди */ + fn peek_first(&self) -> T { + if self.is_empty() { + panic!("двусторонняя очередь пуста") + }; + self.nums[self.front] + } + + /* Доступ к элементу в конце очереди */ + fn peek_last(&self) -> T { + if self.is_empty() { + panic!("двусторонняя очередь пуста") + }; + // Вычислить индекс хвостового элемента + let last = self.index(self.front as i32 + self.que_size as i32 - 1); + self.nums[last] + } + + /* Вернуть массив для вывода */ + fn to_array(&self) -> Vec { + // Преобразовывать только элементы списка в пределах фактической длины + let mut res = vec![T::default(); self.que_size]; + let mut j = self.front; + for i in 0..self.que_size { + res[i] = self.nums[self.index(j as i32)]; + j += 1; + } + res + } +} + +/* Driver Code */ +fn main() { + /* Инициализация двусторонней очереди */ + let mut deque = ArrayDeque::new(10); + deque.push_last(3); + deque.push_last(2); + deque.push_last(5); + print!("Двусторонняя очередь deque = "); + print_util::print_array(&deque.to_array()); + + /* Доступ к элементу */ + let peek_first = deque.peek_first(); + print!("\nПервый элемент peek_first = {}", peek_first); + let peek_last = deque.peek_last(); + print!("\nПоследний элемент peek_last = {}", peek_last); + + /* Добавление элемента в очередь */ + deque.push_last(4); + print!("\nПосле добавления элемента 4 в хвост deque = "); + print_util::print_array(&deque.to_array()); + deque.push_first(1); + print!("\nПосле добавления элемента 1 в голову deque = "); + print_util::print_array(&deque.to_array()); + + /* Извлечение элемента из очереди */ + let pop_last = deque.pop_last(); + print!("\nИзвлеченный из хвоста элемент = {}, deque после извлечения из хвоста = ", pop_last); + print_util::print_array(&deque.to_array()); + let pop_first = deque.pop_first(); + print!("\nИзвлеченный из головы элемент = {}, deque после извлечения из головы = ", pop_first); + print_util::print_array(&deque.to_array()); + + /* Получение длины двусторонней очереди */ + let size = deque.size(); + print!("\nДлина двусторонней очереди size = {}", size); + + /* Проверка, пуста ли двусторонняя очередь */ + let is_empty = deque.is_empty(); + print!("\nПуста ли двусторонняя очередь = {}", is_empty); +} diff --git a/ru/codes/rust/chapter_stack_and_queue/array_queue.rs b/ru/codes/rust/chapter_stack_and_queue/array_queue.rs new file mode 100644 index 000000000..ee0678193 --- /dev/null +++ b/ru/codes/rust/chapter_stack_and_queue/array_queue.rs @@ -0,0 +1,125 @@ +/* + * File: array_queue.rs + * Created Time: 2023-02-06 + * Author: WSL0809 (wslzzy@outlook.com) + */ + +/* Очередь на основе кольцевого массива */ +struct ArrayQueue { + nums: Vec, // Массив для хранения элементов очереди + front: i32, // Указатель head, указывающий на первый элемент очереди + que_size: i32, // Длина очереди + que_capacity: i32, // Вместимость очереди +} + +impl ArrayQueue { + /* Конструктор */ + fn new(capacity: i32) -> ArrayQueue { + ArrayQueue { + nums: vec![T::default(); capacity as usize], + front: 0, + que_size: 0, + que_capacity: capacity, + } + } + + /* Получить вместимость очереди */ + fn capacity(&self) -> i32 { + self.que_capacity + } + + /* Получение длины очереди */ + fn size(&self) -> i32 { + self.que_size + } + + /* Проверка, пуста ли очередь */ + fn is_empty(&self) -> bool { + self.que_size == 0 + } + + /* Поместить в очередь */ + fn push(&mut self, num: T) { + if self.que_size == self.capacity() { + println!("Очередь заполнена"); + return; + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива + let rear = (self.front + self.que_size) % self.que_capacity; + // Добавить num в хвост очереди + self.nums[rear as usize] = num; + self.que_size += 1; + } + + /* Извлечь из очереди */ + fn pop(&mut self) -> T { + let num = self.peek(); + // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива + self.front = (self.front + 1) % self.que_capacity; + self.que_size -= 1; + num + } + + /* Доступ к элементу в начале очереди */ + fn peek(&self) -> T { + if self.is_empty() { + panic!("index out of bounds"); + } + self.nums[self.front as usize] + } + + /* Вернуть массив */ + fn to_vector(&self) -> Vec { + let cap = self.que_capacity; + let mut j = self.front; + let mut arr = vec![T::default(); cap as usize]; + for i in 0..self.que_size { + arr[i as usize] = self.nums[(j % cap) as usize]; + j += 1; + } + arr + } +} + +/* Driver Code */ +fn main() { + /* Инициализация очереди */ + let capacity = 10; + let mut queue = ArrayQueue::new(capacity); + + /* Добавление элемента в очередь */ + queue.push(1); + queue.push(3); + queue.push(2); + queue.push(5); + queue.push(4); + println!("Очередь queue = {:?}", queue.to_vector()); + + /* Доступ к элементу в начале очереди */ + let peek = queue.peek(); + println!("Первый элемент peek = {}", peek); + + /* Извлечение элемента из очереди */ + let pop = queue.pop(); + println!( + "Извлеченный элемент pop = {:?}, queue после извлечения = {:?}", + pop, + queue.to_vector() + ); + + /* Получение длины очереди */ + let size = queue.size(); + println!("Длина очереди size = {}", size); + + /* Проверка, пуста ли очередь */ + let is_empty = queue.is_empty(); + println!("Пуста ли очередь = {}", is_empty); + + /* Проверка кольцевого массива */ + for i in 0..10 { + queue.push(i); + queue.pop(); + println!("После {:?}-го раунда операций enqueue и dequeue queue = {:?}", i, queue.to_vector()); + } +} diff --git a/ru/codes/rust/chapter_stack_and_queue/array_stack.rs b/ru/codes/rust/chapter_stack_and_queue/array_stack.rs new file mode 100644 index 000000000..77a64d2b5 --- /dev/null +++ b/ru/codes/rust/chapter_stack_and_queue/array_stack.rs @@ -0,0 +1,86 @@ +/* + * File: array_stack.rs + * Created Time: 2023-02-05 + * Author: WSL0809 (wslzzy@outlook.com), codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::print_util; + +/* Стек на основе массива */ +struct ArrayStack { + stack: Vec, +} + +impl ArrayStack { + /* Инициализация стека */ + fn new() -> ArrayStack { + ArrayStack:: { + stack: Vec::::new(), + } + } + + /* Получение длины стека */ + fn size(&self) -> usize { + self.stack.len() + } + + /* Проверка, пуст ли стек */ + fn is_empty(&self) -> bool { + self.size() == 0 + } + + /* Поместить в стек */ + fn push(&mut self, num: T) { + self.stack.push(num); + } + + /* Извлечь из стека */ + fn pop(&mut self) -> Option { + self.stack.pop() + } + + /* Доступ к верхнему элементу стека */ + fn peek(&self) -> Option<&T> { + if self.is_empty() { + panic!("стек пуст") + }; + self.stack.last() + } + + /* Вернуть &Vec */ + fn to_array(&self) -> &Vec { + &self.stack + } +} + +/* Driver Code */ +fn main() { + // Инициализация стека + let mut stack = ArrayStack::::new(); + + // Помещение элемента в стек + stack.push(1); + stack.push(3); + stack.push(2); + stack.push(5); + stack.push(4); + print!("Стек stack = "); + print_util::print_array(stack.to_array()); + + // Доступ к верхнему элементу стека + let peek = stack.peek().unwrap(); + print!("\nВерхний элемент peek = {}", peek); + + // Извлечение элемента из стека + let pop = stack.pop().unwrap(); + print!("\nИзвлеченный элемент pop = {pop}, stack после извлечения = "); + print_util::print_array(stack.to_array()); + + // Получение длины стека + let size = stack.size(); + print!("\nДлина стека size = {size}"); + + // Проверка на пустоту + let is_empty = stack.is_empty(); + print!("\nПуст ли стек = {is_empty}"); +} diff --git a/ru/codes/rust/chapter_stack_and_queue/deque.rs b/ru/codes/rust/chapter_stack_and_queue/deque.rs new file mode 100644 index 000000000..941737693 --- /dev/null +++ b/ru/codes/rust/chapter_stack_and_queue/deque.rs @@ -0,0 +1,49 @@ +/* + * File: deque.rs + * Created Time: 2023-02-05 + * Author: codingonion (coderonion@gmail.com), xBLACKICEx (xBLACKICEx@outlook.com) + */ + +use hello_algo_rust::include::print_util; +use std::collections::VecDeque; + +/* Driver Code */ +pub fn main() { + // Инициализация двусторонней очереди + let mut deque: VecDeque = VecDeque::new(); + deque.push_back(3); + deque.push_back(2); + deque.push_back(5); + print!("Двусторонняя очередь deque = "); + print_util::print_queue(&deque); + + // Доступ к элементу + let peek_first = deque.front().unwrap(); + print!("\nПервый элемент peekFirst = {peek_first}"); + let peek_last = deque.back().unwrap(); + print!("\nПоследний элемент peekLast = {peek_last}"); + + /* Добавление элемента в очередь */ + deque.push_back(4); + print!("\nПосле добавления элемента 4 в хвост deque = "); + print_util::print_queue(&deque); + deque.push_front(1); + print!("\nПосле добавления элемента 1 в голову deque = "); + print_util::print_queue(&deque); + + // Извлечение элемента из очереди + let pop_last = deque.pop_back().unwrap(); + print!("\nИзвлеченный из хвоста элемент = {pop_last}, deque после извлечения из хвоста = "); + print_util::print_queue(&deque); + let pop_first = deque.pop_front().unwrap(); + print!("\nИзвлеченный из головы элемент = {pop_first}, deque после извлечения из головы = "); + print_util::print_queue(&deque); + + // Получение длины двусторонней очереди + let size = deque.len(); + print!("\nДлина двусторонней очереди size = {size}"); + + // Проверка, пуста ли двусторонняя очередь + let is_empty = deque.is_empty(); + print!("\nПуста ли двусторонняя очередь = {is_empty}"); +} diff --git a/ru/codes/rust/chapter_stack_and_queue/linkedlist_deque.rs b/ru/codes/rust/chapter_stack_and_queue/linkedlist_deque.rs new file mode 100644 index 000000000..c8a745b46 --- /dev/null +++ b/ru/codes/rust/chapter_stack_and_queue/linkedlist_deque.rs @@ -0,0 +1,218 @@ +/* + * File: linkedlist_deque.rs + * Created Time: 2023-03-11 + * Author: codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::print_util; + +use std::cell::RefCell; +use std::rc::Rc; + +/* Узел двусвязного списка */ +pub struct ListNode { + pub val: T, // Значение узла + pub next: Option>>>, // Указатель на узел-преемник + pub prev: Option>>>, // Указатель на узел-предшественник +} + +impl ListNode { + pub fn new(val: T) -> Rc>> { + Rc::new(RefCell::new(ListNode { + val, + next: None, + prev: None, + })) + } +} + +/* Двусторонняя очередь на основе двусвязного списка */ +#[allow(dead_code)] +pub struct LinkedListDeque { + front: Option>>>, // Головной узел front + rear: Option>>>, // Хвостовой узел rear + que_size: usize, // Длина двусторонней очереди +} + +impl LinkedListDeque { + pub fn new() -> Self { + Self { + front: None, + rear: None, + que_size: 0, + } + } + + /* Получение длины двусторонней очереди */ + pub fn size(&self) -> usize { + return self.que_size; + } + + /* Проверка, пуста ли двусторонняя очередь */ + pub fn is_empty(&self) -> bool { + return self.que_size == 0; + } + + /* Операция добавления в очередь */ + fn push(&mut self, num: T, is_front: bool) { + let node = ListNode::new(num); + // Операция добавления в голову очереди + if is_front { + match self.front.take() { + // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node + None => { + self.rear = Some(node.clone()); + self.front = Some(node); + } + // Добавить node в голову списка + Some(old_front) => { + old_front.borrow_mut().prev = Some(node.clone()); + node.borrow_mut().next = Some(old_front); + self.front = Some(node); // Обновить головной узел + } + } + } + // Операция добавления в хвост очереди + else { + match self.rear.take() { + // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node + None => { + self.front = Some(node.clone()); + self.rear = Some(node); + } + // Добавить node в хвост списка + Some(old_rear) => { + old_rear.borrow_mut().next = Some(node.clone()); + node.borrow_mut().prev = Some(old_rear); + self.rear = Some(node); // Обновить хвостовой узел + } + } + } + self.que_size += 1; // Обновить длину очереди + } + + /* Добавление в голову очереди */ + pub fn push_first(&mut self, num: T) { + self.push(num, true); + } + + /* Добавление в хвост очереди */ + pub fn push_last(&mut self, num: T) { + self.push(num, false); + } + + /* Операция извлечения из очереди */ + fn pop(&mut self, is_front: bool) -> Option { + // Если очередь пуста, сразу вернуть None + if self.is_empty() { + return None; + }; + // Операция извлечения из головы очереди + if is_front { + self.front.take().map(|old_front| { + match old_front.borrow_mut().next.take() { + Some(new_front) => { + new_front.borrow_mut().prev.take(); + self.front = Some(new_front); // Обновить головной узел + } + None => { + self.rear.take(); + } + } + self.que_size -= 1; // Обновить длину очереди + old_front.borrow().val + }) + } + // Операция извлечения из хвоста очереди + else { + self.rear.take().map(|old_rear| { + match old_rear.borrow_mut().prev.take() { + Some(new_rear) => { + new_rear.borrow_mut().next.take(); + self.rear = Some(new_rear); // Обновить хвостовой узел + } + None => { + self.front.take(); + } + } + self.que_size -= 1; // Обновить длину очереди + old_rear.borrow().val + }) + } + } + + /* Извлечение из головы очереди */ + pub fn pop_first(&mut self) -> Option { + return self.pop(true); + } + + /* Извлечение из хвоста очереди */ + pub fn pop_last(&mut self) -> Option { + return self.pop(false); + } + + /* Доступ к элементу в начале очереди */ + pub fn peek_first(&self) -> Option<&Rc>>> { + self.front.as_ref() + } + + /* Доступ к элементу в конце очереди */ + pub fn peek_last(&self) -> Option<&Rc>>> { + self.rear.as_ref() + } + + /* Вернуть массив для вывода */ + pub fn to_array(&self, head: Option<&Rc>>>) -> Vec { + let mut res: Vec = Vec::new(); + fn recur(cur: Option<&Rc>>>, res: &mut Vec) { + if let Some(cur) = cur { + res.push(cur.borrow().val); + recur(cur.borrow().next.as_ref(), res); + } + } + + recur(head, &mut res); + res + } +} + +/* Driver Code */ +fn main() { + /* Инициализация двусторонней очереди */ + let mut deque = LinkedListDeque::new(); + deque.push_last(3); + deque.push_last(2); + deque.push_last(5); + print!("Двусторонняя очередь deque = "); + print_util::print_array(&deque.to_array(deque.peek_first())); + + /* Доступ к элементу */ + let peek_first = deque.peek_first().unwrap().borrow().val; + print!("\nПервый элемент peek_first = {}", peek_first); + let peek_last = deque.peek_last().unwrap().borrow().val; + print!("\nПоследний элемент peek_last = {}", peek_last); + + /* Добавление элемента в очередь */ + deque.push_last(4); + print!("\nПосле добавления элемента 4 в хвост deque = "); + print_util::print_array(&deque.to_array(deque.peek_first())); + deque.push_first(1); + print!("\nПосле добавления элемента 1 в голову deque = "); + print_util::print_array(&deque.to_array(deque.peek_first())); + + /* Извлечение элемента из очереди */ + let pop_last = deque.pop_last().unwrap(); + print!("\nИзвлеченный из хвоста элемент = {}, deque после извлечения из хвоста = ", pop_last); + print_util::print_array(&deque.to_array(deque.peek_first())); + let pop_first = deque.pop_first().unwrap(); + print!("\nИзвлеченный из головы элемент = {}, deque после извлечения из головы = ", pop_first); + print_util::print_array(&deque.to_array(deque.peek_first())); + + /* Получение длины двусторонней очереди */ + let size = deque.size(); + print!("\nДлина двусторонней очереди size = {}", size); + + /* Проверка, пуста ли двусторонняя очередь */ + let is_empty = deque.is_empty(); + print!("\nПуста ли двусторонняя очередь = {}", is_empty); +} diff --git a/ru/codes/rust/chapter_stack_and_queue/linkedlist_queue.rs b/ru/codes/rust/chapter_stack_and_queue/linkedlist_queue.rs new file mode 100644 index 000000000..b85a6ee67 --- /dev/null +++ b/ru/codes/rust/chapter_stack_and_queue/linkedlist_queue.rs @@ -0,0 +1,126 @@ +/* + * File: linkedlist_queue.rs + * Created Time: 2023-03-11 + * Author: codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::{print_util, ListNode}; + +use std::cell::RefCell; +use std::rc::Rc; + +/* Очередь на основе связного списка */ +#[allow(dead_code)] +pub struct LinkedListQueue { + front: Option>>>, // Головной узел front + rear: Option>>>, // Хвостовой узел rear + que_size: usize, // Длина очереди +} + +impl LinkedListQueue { + pub fn new() -> Self { + Self { + front: None, + rear: None, + que_size: 0, + } + } + + /* Получение длины очереди */ + pub fn size(&self) -> usize { + return self.que_size; + } + + /* Проверка, пуста ли очередь */ + pub fn is_empty(&self) -> bool { + return self.que_size == 0; + } + + /* Поместить в очередь */ + pub fn push(&mut self, num: T) { + // Добавить num после хвостового узла + let new_rear = ListNode::new(num); + match self.rear.take() { + // Если очередь не пуста, добавить этот узел после хвостового узла + Some(old_rear) => { + old_rear.borrow_mut().next = Some(new_rear.clone()); + self.rear = Some(new_rear); + } + // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел + None => { + self.front = Some(new_rear.clone()); + self.rear = Some(new_rear); + } + } + self.que_size += 1; + } + + /* Извлечь из очереди */ + pub fn pop(&mut self) -> Option { + self.front.take().map(|old_front| { + match old_front.borrow_mut().next.take() { + Some(new_front) => { + self.front = Some(new_front); + } + None => { + self.rear.take(); + } + } + self.que_size -= 1; + old_front.borrow().val + }) + } + + /* Доступ к элементу в начале очереди */ + pub fn peek(&self) -> Option<&Rc>>> { + self.front.as_ref() + } + + /* Преобразовать связный список в Array и вернуть */ + pub fn to_array(&self, head: Option<&Rc>>>) -> Vec { + let mut res: Vec = Vec::new(); + + fn recur(cur: Option<&Rc>>>, res: &mut Vec) { + if let Some(cur) = cur { + res.push(cur.borrow().val); + recur(cur.borrow().next.as_ref(), res); + } + } + + recur(head, &mut res); + + res + } +} + +/* Driver Code */ +fn main() { + /* Инициализация очереди */ + let mut queue = LinkedListQueue::new(); + + /* Добавление элемента в очередь */ + queue.push(1); + queue.push(3); + queue.push(2); + queue.push(5); + queue.push(4); + print!("Очередь queue = "); + print_util::print_array(&queue.to_array(queue.peek())); + + /* Доступ к элементу в начале очереди */ + let peek = queue.peek().unwrap().borrow().val; + print!("\nПервый элемент peek = {}", peek); + + /* Извлечение элемента из очереди */ + let pop = queue.pop().unwrap(); + print!("\nИзвлеченный элемент pop = {}, queue после извлечения = ", pop); + print_util::print_array(&queue.to_array(queue.peek())); + + /* Получение длины очереди */ + let size = queue.size(); + print!("\nДлина очереди size = {}", size); + + /* Проверка, пуста ли очередь */ + let is_empty = queue.is_empty(); + print!("\nПуста ли очередь = {}", is_empty); +} diff --git a/ru/codes/rust/chapter_stack_and_queue/linkedlist_stack.rs b/ru/codes/rust/chapter_stack_and_queue/linkedlist_stack.rs new file mode 100644 index 000000000..dc23834cc --- /dev/null +++ b/ru/codes/rust/chapter_stack_and_queue/linkedlist_stack.rs @@ -0,0 +1,105 @@ +/* + * File: linkedlist_stack.rs + * Created Time: 2023-03-11 + * Author: codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::{print_util, ListNode}; + +use std::cell::RefCell; +use std::rc::Rc; + +/* Стек на основе связного списка */ +#[allow(dead_code)] +pub struct LinkedListStack { + stack_peek: Option>>>, // Использовать головной узел как вершину стека + stk_size: usize, // Длина стека +} + +impl LinkedListStack { + pub fn new() -> Self { + Self { + stack_peek: None, + stk_size: 0, + } + } + + /* Получение длины стека */ + pub fn size(&self) -> usize { + return self.stk_size; + } + + /* Проверка, пуст ли стек */ + pub fn is_empty(&self) -> bool { + return self.size() == 0; + } + + /* Поместить в стек */ + pub fn push(&mut self, num: T) { + let node = ListNode::new(num); + node.borrow_mut().next = self.stack_peek.take(); + self.stack_peek = Some(node); + self.stk_size += 1; + } + + /* Извлечь из стека */ + pub fn pop(&mut self) -> Option { + self.stack_peek.take().map(|old_head| { + self.stack_peek = old_head.borrow_mut().next.take(); + self.stk_size -= 1; + + old_head.borrow().val + }) + } + + /* Доступ к верхнему элементу стека */ + pub fn peek(&self) -> Option<&Rc>>> { + self.stack_peek.as_ref() + } + + /* Преобразовать List в Array и вернуть */ + pub fn to_array(&self) -> Vec { + fn _to_array(head: Option<&Rc>>>) -> Vec { + if let Some(node) = head { + let mut nums = _to_array(node.borrow().next.as_ref()); + nums.push(node.borrow().val); + return nums; + } + return Vec::new(); + } + + _to_array(self.peek()) + } +} + +/* Driver Code */ +fn main() { + /* Инициализация стека */ + let mut stack = LinkedListStack::new(); + + /* Помещение элемента в стек */ + stack.push(1); + stack.push(3); + stack.push(2); + stack.push(5); + stack.push(4); + print!("Стек stack = "); + print_util::print_array(&stack.to_array()); + + /* Доступ к верхнему элементу стека */ + let peek = stack.peek().unwrap().borrow().val; + print!("\nВерхний элемент peek = {}", peek); + + /* Извлечение элемента из стека */ + let pop = stack.pop().unwrap(); + print!("\nИзвлеченный элемент pop = {}, stack после извлечения = ", pop); + print_util::print_array(&stack.to_array()); + + /* Получение длины стека */ + let size = stack.size(); + print!("\nДлина стека size = {}", size); + + /* Проверка на пустоту */ + let is_empty = stack.is_empty(); + print!("\nПуст ли стек = {}", is_empty); +} diff --git a/ru/codes/rust/chapter_stack_and_queue/queue.rs b/ru/codes/rust/chapter_stack_and_queue/queue.rs new file mode 100644 index 000000000..0fdbaf942 --- /dev/null +++ b/ru/codes/rust/chapter_stack_and_queue/queue.rs @@ -0,0 +1,41 @@ +/* + * File: queue.rs + * Created Time: 2023-02-05 + * Author: codingonion (coderonion@gmail.com), xBLACKICEx (xBLACKICEx@outlook.com) + */ + +use hello_algo_rust::include::print_util; + +use std::collections::VecDeque; + +/* Driver Code */ +pub fn main() { + // Инициализация очереди + let mut queue: VecDeque = VecDeque::new(); + + // Добавление элемента в очередь + queue.push_back(1); + queue.push_back(3); + queue.push_back(2); + queue.push_back(5); + queue.push_back(4); + print!("Очередь queue = "); + print_util::print_queue(&queue); + + // Доступ к элементу в начале очереди + let peek = queue.front().unwrap(); + println!("\nПервый элемент peek = {peek}"); + + // Извлечение элемента из очереди + let pop = queue.pop_front().unwrap(); + print!("Извлеченный элемент pop = {pop}, queue после извлечения = "); + print_util::print_queue(&queue); + + // Получение длины очереди + let size = queue.len(); + print!("\nДлина очереди size = {size}"); + + // Проверка, пуста ли очередь + let is_empty = queue.is_empty(); + print!("\nПуста ли очередь = {is_empty}"); +} diff --git a/ru/codes/rust/chapter_stack_and_queue/stack.rs b/ru/codes/rust/chapter_stack_and_queue/stack.rs new file mode 100644 index 000000000..e97ca9eb6 --- /dev/null +++ b/ru/codes/rust/chapter_stack_and_queue/stack.rs @@ -0,0 +1,40 @@ +/* + * File: stack.rs + * Created Time: 2023-02-05 + * Author: codingonion (coderonion@gmail.com) + */ + +use hello_algo_rust::include::print_util; + +/* Driver Code */ +pub fn main() { + // Инициализировать стек + // В Rust рекомендуется использовать Vec как стек + let mut stack: Vec = Vec::new(); + + // Помещение элемента в стек + stack.push(1); + stack.push(3); + stack.push(2); + stack.push(5); + stack.push(4); + print!("Стек stack = "); + print_util::print_array(&stack); + + // Доступ к верхнему элементу стека + let peek = stack.last().unwrap(); + print!("\nВерхний элемент peek = {peek}"); + + // Извлечение элемента из стека + let pop = stack.pop().unwrap(); + print!("\nИзвлеченный элемент pop = {pop}, stack после извлечения = "); + print_util::print_array(&stack); + + // Получение длины стека + let size = stack.len(); + print!("\nДлина стека size = {size}"); + + // Проверка, пуст ли стек + let is_empty = stack.is_empty(); + print!("\nПуст ли стек = {is_empty}"); +} diff --git a/ru/codes/rust/chapter_tree/array_binary_tree.rs b/ru/codes/rust/chapter_tree/array_binary_tree.rs new file mode 100644 index 000000000..301aa6834 --- /dev/null +++ b/ru/codes/rust/chapter_tree/array_binary_tree.rs @@ -0,0 +1,186 @@ +/* + * File: array_binary_tree.rs + * Created Time: 2023-07-25 + * Author: night-cruise (2586447362@qq.com) + */ + +use hello_algo_rust::include::{print_util, tree_node}; + +/* Класс двоичного дерева в массивном представлении */ +struct ArrayBinaryTree { + tree: Vec>, +} + +impl ArrayBinaryTree { + /* Конструктор */ + fn new(arr: Vec>) -> Self { + Self { tree: arr } + } + + /* Вместимость списка */ + fn size(&self) -> i32 { + self.tree.len() as i32 + } + + /* Получить значение узла с индексом i */ + fn val(&self, i: i32) -> Option { + // Если индекс выходит за границы, вернуть None, обозначающий пустую позицию + if i < 0 || i >= self.size() { + None + } else { + self.tree[i as usize] + } + } + + /* Получить индекс левого дочернего узла узла с индексом i */ + fn left(&self, i: i32) -> i32 { + 2 * i + 1 + } + + /* Получить индекс правого дочернего узла узла с индексом i */ + fn right(&self, i: i32) -> i32 { + 2 * i + 2 + } + + /* Получить индекс родительского узла узла с индексом i */ + fn parent(&self, i: i32) -> i32 { + (i - 1) / 2 + } + + /* Обход в ширину */ + fn level_order(&self) -> Vec { + self.tree.iter().filter_map(|&x| x).collect() + } + + /* Обход в глубину */ + fn dfs(&self, i: i32, order: &'static str, res: &mut Vec) { + if self.val(i).is_none() { + return; + } + let val = self.val(i).unwrap(); + // Предварительный обход + if order == "pre" { + res.push(val); + } + self.dfs(self.left(i), order, res); + // Симметричный обход + if order == "in" { + res.push(val); + } + self.dfs(self.right(i), order, res); + // Обратный обход + if order == "post" { + res.push(val); + } + } + + /* Предварительный обход */ + fn pre_order(&self) -> Vec { + let mut res = vec![]; + self.dfs(0, "pre", &mut res); + res + } + + /* Симметричный обход */ + fn in_order(&self) -> Vec { + let mut res = vec![]; + self.dfs(0, "in", &mut res); + res + } + + /* Обратный обход */ + fn post_order(&self) -> Vec { + let mut res = vec![]; + self.dfs(0, "post", &mut res); + res + } +} + +/* Driver Code */ +fn main() { + // Инициализировать двоичное дерево + // Здесь используется функция, напрямую строящая двоичное дерево из массива + let arr = vec![ + Some(1), + Some(2), + Some(3), + Some(4), + None, + Some(6), + Some(7), + Some(8), + Some(9), + None, + None, + Some(12), + None, + None, + Some(15), + ]; + + let root = tree_node::vec_to_tree(arr.clone()).unwrap(); + println!("\nИнициализация двоичного дерева\n"); + println!("Массивное представление двоичного дерева:"); + println!( + "[{}]", + arr.iter() + .map(|&val| if let Some(val) = val { + format!("{val}") + } else { + "null".to_string() + }) + .collect::>() + .join(", ") + ); + println!("Связное представление двоичного дерева:"); + print_util::print_tree(&root); + + // Класс двоичного дерева в массивном представлении + let abt = ArrayBinaryTree::new(arr); + + // Доступ к узлу + let i = 1; + let l = abt.left(i); + let r = abt.right(i); + let p = abt.parent(i); + println!( + "\nТекущий индекс узла = {}, значение = {}",\ni,\nif let Some(val) = abt.val(i) {\n format!("{val}")\n} else {\n "null".to_string()\n} + ); + println!( + "Индекс левого дочернего узла = {}, значение = {}", + l, + if let Some(val) = abt.val(l) { + format!("{val}") + } else { + "null".to_string() + } + ); + println!( + "Индекс правого дочернего узла = {}, значение = {}", + r, + if let Some(val) = abt.val(r) { + format!("{val}") + } else { + "null".to_string() + } + ); + println!( + "Индекс родительского узла = {}, значение = {}", + p, + if let Some(val) = abt.val(p) { + format!("{val}") + } else { + "null".to_string() + } + ); + + // Обходить дерево + let mut res = abt.level_order(); + println!("\nОбход в ширину: {:?}", res); + res = abt.pre_order(); + println!("Предварительный обход: {:?}", res); + res = abt.in_order(); + println!("Симметричный обход: {:?}", res); + res = abt.post_order(); + println!("Обратный обход: {:?}", res); +} diff --git a/ru/codes/rust/chapter_tree/avl_tree.rs b/ru/codes/rust/chapter_tree/avl_tree.rs new file mode 100644 index 000000000..0393a04ee --- /dev/null +++ b/ru/codes/rust/chapter_tree/avl_tree.rs @@ -0,0 +1,295 @@ +/* + * File: avl_tree.rs + * Created Time: 2023-07-14 + * Author: night-cruise (2586447362@qq.com) + */ + +use hello_algo_rust::include::{print_util, TreeNode}; + +use std::cell::RefCell; +use std::cmp::Ordering; +use std::rc::Rc; + +type OptionTreeNodeRc = Option>>; + +/* AVL-дерево */ +struct AVLTree { + root: OptionTreeNodeRc, // Корневой узел +} + +impl AVLTree { + /* Конструктор */ + fn new() -> Self { + Self { root: None } + } + + /* Получить высоту узла */ + fn height(node: OptionTreeNodeRc) -> i32 { + // Высота пустого узла равна -1, высота листового узла равна 0 + match node { + Some(node) => node.borrow().height, + None => -1, + } + } + + /* Обновить высоту узла */ + fn update_height(node: OptionTreeNodeRc) { + if let Some(node) = node { + let left = node.borrow().left.clone(); + let right = node.borrow().right.clone(); + // Высота узла равна высоте более высокого поддерева + 1 + node.borrow_mut().height = std::cmp::max(Self::height(left), Self::height(right)) + 1; + } + } + + /* Получить коэффициент баланса */ + fn balance_factor(node: OptionTreeNodeRc) -> i32 { + match node { + // Коэффициент баланса пустого узла равен 0 + None => 0, + // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева + Some(node) => { + Self::height(node.borrow().left.clone()) - Self::height(node.borrow().right.clone()) + } + } + } + + /* Операция правого вращения */ + fn right_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc { + match node { + Some(node) => { + let child = node.borrow().left.clone().unwrap(); + let grand_child = child.borrow().right.clone(); + // Выполнить правое вращение узла node вокруг child + child.borrow_mut().right = Some(node.clone()); + node.borrow_mut().left = grand_child; + // Обновить высоту узла + Self::update_height(Some(node)); + Self::update_height(Some(child.clone())); + // Вернуть корневой узел поддерева после вращения + Some(child) + } + None => None, + } + } + + /* Операция левого вращения */ + fn left_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc { + match node { + Some(node) => { + let child = node.borrow().right.clone().unwrap(); + let grand_child = child.borrow().left.clone(); + // Выполнить левое вращение узла node вокруг child + child.borrow_mut().left = Some(node.clone()); + node.borrow_mut().right = grand_child; + // Обновить высоту узла + Self::update_height(Some(node)); + Self::update_height(Some(child.clone())); + // Вернуть корневой узел поддерева после вращения + Some(child) + } + None => None, + } + } + + /* Выполнить вращение, чтобы снова сбалансировать поддерево */ + fn rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc { + // Получить коэффициент баланса узла node + let balance_factor = Self::balance_factor(node.clone()); + // Левосторонне перекошенное дерево + if balance_factor > 1 { + let node = node.unwrap(); + if Self::balance_factor(node.borrow().left.clone()) >= 0 { + // Правое вращение + Self::right_rotate(Some(node)) + } else { + // Сначала левое вращение, затем правое + let left = node.borrow().left.clone(); + node.borrow_mut().left = Self::left_rotate(left); + Self::right_rotate(Some(node)) + } + } + // Правосторонне перекошенное дерево + else if balance_factor < -1 { + let node = node.unwrap(); + if Self::balance_factor(node.borrow().right.clone()) <= 0 { + // Левое вращение + Self::left_rotate(Some(node)) + } else { + // Сначала правое вращение, затем левое + let right = node.borrow().right.clone(); + node.borrow_mut().right = Self::right_rotate(right); + Self::left_rotate(Some(node)) + } + } else { + // Дерево сбалансировано, вращение не требуется, вернуть сразу + node + } + } + + /* Вставка узла */ + fn insert(&mut self, val: i32) { + self.root = Self::insert_helper(self.root.clone(), val); + } + + /* Рекурсивная вставка узла (вспомогательный метод) */ + fn insert_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc { + match node { + Some(mut node) => { + /* 1. Найти позицию вставки и вставить узел */ + match { + let node_val = node.borrow().val; + node_val + } + .cmp(&val) + { + Ordering::Greater => { + let left = node.borrow().left.clone(); + node.borrow_mut().left = Self::insert_helper(left, val); + } + Ordering::Less => { + let right = node.borrow().right.clone(); + node.borrow_mut().right = Self::insert_helper(right, val); + } + Ordering::Equal => { + return Some(node); // Повторяющийся узел не вставлять, сразу вернуть + } + } + Self::update_height(Some(node.clone())); // Обновить высоту узла + + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = Self::rotate(Some(node)).unwrap(); + // Вернуть корневой узел поддерева + Some(node) + } + None => Some(TreeNode::new(val)), + } + } + + /* Удаление узла */ + fn remove(&self, val: i32) { + Self::remove_helper(self.root.clone(), val); + } + + /* Рекурсивное удаление узла (вспомогательный метод) */ + fn remove_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc { + match node { + Some(mut node) => { + /* 1. Найти узел и удалить его */ + if val < node.borrow().val { + let left = node.borrow().left.clone(); + node.borrow_mut().left = Self::remove_helper(left, val); + } else if val > node.borrow().val { + let right = node.borrow().right.clone(); + node.borrow_mut().right = Self::remove_helper(right, val); + } else if node.borrow().left.is_none() || node.borrow().right.is_none() { + let child = if node.borrow().left.is_some() { + node.borrow().left.clone() + } else { + node.borrow().right.clone() + }; + match child { + // Число дочерних узлов = 0, удалить node и сразу вернуть + None => { + return None; + } + // Число дочерних узлов = 1, удалить node напрямую + Some(child) => node = child, + } + } else { + // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел + let mut temp = node.borrow().right.clone().unwrap(); + loop { + let temp_left = temp.borrow().left.clone(); + if temp_left.is_none() { + break; + } + temp = temp_left.unwrap(); + } + let right = node.borrow().right.clone(); + node.borrow_mut().right = Self::remove_helper(right, temp.borrow().val); + node.borrow_mut().val = temp.borrow().val; + } + Self::update_height(Some(node.clone())); // Обновить высоту узла + + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = Self::rotate(Some(node)).unwrap(); + // Вернуть корневой узел поддерева + Some(node) + } + None => None, + } + } + + /* Поиск узла */ + fn search(&self, val: i32) -> OptionTreeNodeRc { + let mut cur = self.root.clone(); + // Искать в цикле и выйти после прохода за листовой узел + while let Some(current) = cur.clone() { + match current.borrow().val.cmp(&val) { + // Целевой узел находится в правом поддереве cur + Ordering::Less => { + cur = current.borrow().right.clone(); + } + // Целевой узел находится в левом поддереве cur + Ordering::Greater => { + cur = current.borrow().left.clone(); + } + // Найти целевой узел и выйти из цикла + Ordering::Equal => { + break; + } + } + } + // Вернуть целевой узел + cur + } +} + +/* Driver Code */ +fn main() { + fn test_insert(tree: &mut AVLTree, val: i32) { + tree.insert(val); + println!("\nПосле вставки узла {} AVL-дерево имеет вид", val); + print_util::print_tree(&tree.root.clone().unwrap()); + } + + fn test_remove(tree: &mut AVLTree, val: i32) { + tree.remove(val); + println!("\nПосле удаления узла {} AVL-дерево имеет вид", val); + print_util::print_tree(&tree.root.clone().unwrap()); + } + + /* Инициализация пустого AVL-дерева */ + let mut avl_tree = AVLTree::new(); + + /* Вставка узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после вставки узла + test_insert(&mut avl_tree, 1); + test_insert(&mut avl_tree, 2); + test_insert(&mut avl_tree, 3); + test_insert(&mut avl_tree, 4); + test_insert(&mut avl_tree, 5); + test_insert(&mut avl_tree, 8); + test_insert(&mut avl_tree, 7); + test_insert(&mut avl_tree, 9); + test_insert(&mut avl_tree, 10); + test_insert(&mut avl_tree, 6); + + /* Вставка повторяющегося узла */ + test_insert(&mut avl_tree, 7); + + /* Удаление узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после удаления узла + test_remove(&mut avl_tree, 8); // Удаление узла степени 0 + test_remove(&mut avl_tree, 5); // Удаление узла степени 1 + test_remove(&mut avl_tree, 4); // Удаление узла степени 2 + + /* Поиск узла */ + let node = avl_tree.search(7); + if let Some(node) = node { + println!( + "\nНайденный объект узла = {:?}, значение узла = {}",\n&*node.borrow(),\nnode.borrow().val + ); + } +} diff --git a/ru/codes/rust/chapter_tree/binary_search_tree.rs b/ru/codes/rust/chapter_tree/binary_search_tree.rs new file mode 100644 index 000000000..564add1ab --- /dev/null +++ b/ru/codes/rust/chapter_tree/binary_search_tree.rs @@ -0,0 +1,193 @@ +/* + * File: binary_search_tree.rs + * Created Time: 2023-04-20 + * Author: xBLACKICEx (xBLACKICE@outlook.com)、night-cruise (2586447362@qq.com) + */ + +use hello_algo_rust::include::print_util; + +use std::cell::RefCell; +use std::cmp::Ordering; +use std::rc::Rc; + +use hello_algo_rust::include::TreeNode; + +type OptionTreeNodeRc = Option>>; + +/* Двоичное дерево поиска */ +pub struct BinarySearchTree { + root: OptionTreeNodeRc, +} + +impl BinarySearchTree { + /* Конструктор */ + pub fn new() -> Self { + // Инициализировать пустое дерево + Self { root: None } + } + + /* Получить корневой узел двоичного дерева */ + pub fn get_root(&self) -> OptionTreeNodeRc { + self.root.clone() + } + + /* Поиск узла */ + pub fn search(&self, num: i32) -> OptionTreeNodeRc { + let mut cur = self.root.clone(); + // Искать в цикле и выйти после прохода за листовой узел + while let Some(node) = cur.clone() { + match num.cmp(&node.borrow().val) { + // Целевой узел находится в правом поддереве cur + Ordering::Greater => cur = node.borrow().right.clone(), + // Целевой узел находится в левом поддереве cur + Ordering::Less => cur = node.borrow().left.clone(), + // Найти целевой узел и выйти из цикла + Ordering::Equal => break, + } + } + + // Вернуть целевой узел + cur + } + + /* Вставка узла */ + pub fn insert(&mut self, num: i32) { + // Если дерево пусто, инициализировать корневой узел + if self.root.is_none() { + self.root = Some(TreeNode::new(num)); + return; + } + let mut cur = self.root.clone(); + let mut pre = None; + // Искать в цикле и выйти после прохода за листовой узел + while let Some(node) = cur.clone() { + match num.cmp(&node.borrow().val) { + // Найти повторяющийся узел и сразу вернуть + Ordering::Equal => return, + // Позиция вставки находится в правом поддереве cur + Ordering::Greater => { + pre = cur.clone(); + cur = node.borrow().right.clone(); + } + // Позиция вставки находится в левом поддереве cur + Ordering::Less => { + pre = cur.clone(); + cur = node.borrow().left.clone(); + } + } + } + // Вставка узла + let pre = pre.unwrap(); + let node = Some(TreeNode::new(num)); + if num > pre.borrow().val { + pre.borrow_mut().right = node; + } else { + pre.borrow_mut().left = node; + } + } + + /* Удаление узла */ + pub fn remove(&mut self, num: i32) { + // Если дерево пусто, сразу вернуть + if self.root.is_none() { + return; + } + let mut cur = self.root.clone(); + let mut pre = None; + // Искать в цикле и выйти после прохода за листовой узел + while let Some(node) = cur.clone() { + match num.cmp(&node.borrow().val) { + // Найти узел для удаления и выйти из цикла + Ordering::Equal => break, + // Узел для удаления находится в правом поддереве cur + Ordering::Greater => { + pre = cur.clone(); + cur = node.borrow().right.clone(); + } + // Узел для удаления находится в левом поддереве cur + Ordering::Less => { + pre = cur.clone(); + cur = node.borrow().left.clone(); + } + } + } + // Если узел для удаления отсутствует, сразу вернуть + if cur.is_none() { + return; + } + let cur = cur.unwrap(); + let (left_child, right_child) = (cur.borrow().left.clone(), cur.borrow().right.clone()); + match (left_child.clone(), right_child.clone()) { + // Число дочерних узлов = 0 или 1 + (None, None) | (Some(_), None) | (None, Some(_)) => { + // Когда число дочерних узлов = 0 / 1, child = nullptr / этот дочерний узел + let child = left_child.or(right_child); + let pre = pre.unwrap(); + // Удалить узел cur + if !Rc::ptr_eq(&cur, self.root.as_ref().unwrap()) { + let left = pre.borrow().left.clone(); + if left.is_some() && Rc::ptr_eq(left.as_ref().unwrap(), &cur) { + pre.borrow_mut().left = child; + } else { + pre.borrow_mut().right = child; + } + } else { + // Если удаляемый узел является корнем, заново назначить корневой узел + self.root = child; + } + } + // Число дочерних узлов = 2 + (Some(_), Some(_)) => { + // Получить следующий узел после cur в симметричном обходе + let mut tmp = cur.borrow().right.clone(); + while let Some(node) = tmp.clone() { + if node.borrow().left.is_some() { + tmp = node.borrow().left.clone(); + } else { + break; + } + } + let tmp_val = tmp.unwrap().borrow().val; + // Рекурсивно удалить узел tmp + self.remove(tmp_val); + // Перезаписать cur значением tmp + cur.borrow_mut().val = tmp_val; + } + } + } +} + +/* Driver Code */ +fn main() { + /* Инициализация двоичного дерева поиска */ + let mut bst = BinarySearchTree::new(); + // Обратите внимание: разные порядки вставки порождают разные двоичные деревья; данная последовательность может построить совершенное двоичное дерево + let nums = [8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15]; + for &num in &nums { + bst.insert(num); + } + println!("\nИсходное двоичное дерево\n"); + print_util::print_tree(bst.get_root().as_ref().unwrap()); + + /* Найти узел */ + let node = bst.search(7); + println!( + "\nНайденный объект узла = {:?}, значение узла = {}",\nnode.clone().unwrap(),\nnode.clone().unwrap().borrow().val + ); + + /* Вставка узла */ + bst.insert(16); + println!("\nПосле вставки узла 16 двоичное дерево имеет вид\n"); + print_util::print_tree(bst.get_root().as_ref().unwrap()); + + /* Удаление узла */ + bst.remove(1); + println!("\nПосле удаления узла 1 двоичное дерево имеет вид\n"); + print_util::print_tree(bst.get_root().as_ref().unwrap()); + bst.remove(2); + println!("\nПосле удаления узла 2 двоичное дерево имеет вид\n"); + print_util::print_tree(bst.get_root().as_ref().unwrap()); + bst.remove(4); + println!("\nПосле удаления узла 4 двоичное дерево имеет вид\n"); + print_util::print_tree(bst.get_root().as_ref().unwrap()); +} diff --git a/ru/codes/rust/chapter_tree/binary_tree.rs b/ru/codes/rust/chapter_tree/binary_tree.rs new file mode 100644 index 000000000..7a5e3979b --- /dev/null +++ b/ru/codes/rust/chapter_tree/binary_tree.rs @@ -0,0 +1,38 @@ +/** + * File: binary_tree.rs + * Created Time: 2023-02-27 + * Author: xBLACKICEx (xBLACKICE@outlook.com) + */ +use std::rc::Rc; +use hello_algo_rust::include::{print_util, TreeNode}; + +/* Driver Code */ +fn main() { + /* Инициализация двоичного дерева */ + // Инициализация узла + let n1 = TreeNode::new(1); + let n2 = TreeNode::new(2); + let n3 = TreeNode::new(3); + let n4 = TreeNode::new(4); + let n5 = TreeNode::new(5); + // Построить связи между узлами (указатели) + n1.borrow_mut().left = Some(Rc::clone(&n2)); + n1.borrow_mut().right = Some(Rc::clone(&n3)); + n2.borrow_mut().left = Some(Rc::clone(&n4)); + n2.borrow_mut().right = Some(Rc::clone(&n5)); + println!("\nИнициализация двоичного дерева\n"); + print_util::print_tree(&n1); + + // Вставка и удаление узлов + let p = TreeNode::new(0); + // Вставить узел P между n1 -> n2 + p.borrow_mut().left = Some(Rc::clone(&n2)); + n1.borrow_mut().left = Some(Rc::clone(&p)); + println!("\nПосле вставки узла P\n"); + print_util::print_tree(&n1); + // Удалить узел P + drop(p); + n1.borrow_mut().left = Some(Rc::clone(&n2)); + println!("\nПосле удаления узла P\n"); + print_util::print_tree(&n1); +} diff --git a/ru/codes/rust/chapter_tree/binary_tree_bfs.rs b/ru/codes/rust/chapter_tree/binary_tree_bfs.rs new file mode 100644 index 000000000..8c2bb2a72 --- /dev/null +++ b/ru/codes/rust/chapter_tree/binary_tree_bfs.rs @@ -0,0 +1,45 @@ +/* + * File: binary_tree_bfs.rs + * Created Time: 2023-04-07 + * Author: xBLACKICEx (xBLACKICE@outlook.com) + */ + +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; +use hello_algo_rust::op_vec; + +use std::collections::VecDeque; +use std::{cell::RefCell, rc::Rc}; + +/* Обход в ширину */ +fn level_order(root: &Rc>) -> Vec { + // Инициализировать очередь и добавить корневой узел + let mut que = VecDeque::new(); + que.push_back(root.clone()); + // Инициализировать список для хранения последовательности обхода + let mut vec = Vec::new(); + + while let Some(node) = que.pop_front() { + // Извлечение из очереди + vec.push(node.borrow().val); // Сохранить значение узла + if let Some(left) = node.borrow().left.as_ref() { + que.push_back(left.clone()); // Поместить левый дочерний узел в очередь + } + if let Some(right) = node.borrow().right.as_ref() { + que.push_back(right.clone()); // Поместить правый дочерний узел в очередь + }; + } + vec +} + +/* Driver Code */ +fn main() { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из массива + let root = vec_to_tree(op_vec![1, 2, 3, 4, 5, 6, 7]).unwrap(); + println!("Инициализация двоичного дерева\n"); + print_util::print_tree(&root); + + /* Обход в ширину */ + let vec = level_order(&root); + print!("\nПоследовательность печати узлов при обходе в ширину = {:?}", vec); +} diff --git a/ru/codes/rust/chapter_tree/binary_tree_dfs.rs b/ru/codes/rust/chapter_tree/binary_tree_dfs.rs new file mode 100644 index 000000000..1697c8960 --- /dev/null +++ b/ru/codes/rust/chapter_tree/binary_tree_dfs.rs @@ -0,0 +1,87 @@ +/* + * File: binary_tree_dfs.rs + * Created Time: 2023-04-06 + * Author: xBLACKICEx (xBLACKICE@outlook.com) + */ + +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; +use hello_algo_rust::op_vec; + +use std::cell::RefCell; +use std::rc::Rc; + +/* Предварительный обход */ +fn pre_order(root: Option<&Rc>>) -> Vec { + let mut result = vec![]; + + fn dfs(root: Option<&Rc>>, res: &mut Vec) { + if let Some(node) = root { + // Порядок обхода: корень -> левое поддерево -> правое поддерево + let node = node.borrow(); + res.push(node.val); + dfs(node.left.as_ref(), res); + dfs(node.right.as_ref(), res); + } + } + dfs(root, &mut result); + + result +} + +/* Симметричный обход */ +fn in_order(root: Option<&Rc>>) -> Vec { + let mut result = vec![]; + + fn dfs(root: Option<&Rc>>, res: &mut Vec) { + if let Some(node) = root { + // Порядок обхода: левое поддерево -> корень -> правое поддерево + let node = node.borrow(); + dfs(node.left.as_ref(), res); + res.push(node.val); + dfs(node.right.as_ref(), res); + } + } + dfs(root, &mut result); + + result +} + +/* Обратный обход */ +fn post_order(root: Option<&Rc>>) -> Vec { + let mut result = vec![]; + + fn dfs(root: Option<&Rc>>, res: &mut Vec) { + if let Some(node) = root { + // Порядок обхода: левое поддерево -> правое поддерево -> корень + let node = node.borrow(); + dfs(node.left.as_ref(), res); + dfs(node.right.as_ref(), res); + res.push(node.val); + } + } + + dfs(root, &mut result); + + result +} + +/* Driver Code */ +fn main() { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из массива + let root = vec_to_tree(op_vec![1, 2, 3, 4, 5, 6, 7]); + println!("Инициализация двоичного дерева\n"); + print_util::print_tree(root.as_ref().unwrap()); + + /* Предварительный обход */ + let vec = pre_order(root.as_ref()); + println!("\nПоследовательность печати узлов при предварительном обходе = {:?}", vec); + + /* Симметричный обход */ + let vec = in_order(root.as_ref()); + println!("\nПоследовательность печати узлов при симметричном обходе = {:?}", vec); + + /* Обратный обход */ + let vec = post_order(root.as_ref()); + print!("\nПоследовательность печати узлов при обратном обходе = {:?}", vec); +} diff --git a/ru/codes/rust/src/include/list_node.rs b/ru/codes/rust/src/include/list_node.rs new file mode 100644 index 000000000..edb6d1ef6 --- /dev/null +++ b/ru/codes/rust/src/include/list_node.rs @@ -0,0 +1,57 @@ +/* + * File: list_node.rs + * Created Time: 2023-03-05 + * Author: codingonion (coderonion@gmail.com), rongyi (hiarongyi@gmail.com) + */ + +use std::cell::RefCell; +use std::collections::HashMap; +use std::rc::Rc; + +#[derive(Debug)] +pub struct ListNode { + pub val: T, + pub next: Option>>>, +} + +impl ListNode { + pub fn new(val: T) -> Rc>> { + Rc::new(RefCell::new(ListNode { val, next: None })) + } + + /* Десериализовать массив в связный список */ + pub fn arr_to_linked_list(array: &[T]) -> Option>>> + where + T: Copy + Clone, + { + let mut head = None; + // insert in reverse order + for item in array.iter().rev() { + let node = Rc::new(RefCell::new(ListNode { + val: *item, + next: head.take(), + })); + head = Some(node); + } + head + } + + /* Преобразовать связный список в хеш-таблицу */ + pub fn linked_list_to_hashmap( + linked_list: Option>>>, + ) -> HashMap>>> + where + T: std::hash::Hash + Eq + Copy + Clone, + { + let mut hashmap = HashMap::new(); + let mut node = linked_list; + + while let Some(cur) = node { + let borrow = cur.borrow(); + hashmap.insert(borrow.val.clone(), cur.clone()); + node = borrow.next.clone(); + } + + hashmap + } +} diff --git a/ru/codes/rust/src/include/mod.rs b/ru/codes/rust/src/include/mod.rs new file mode 100644 index 000000000..6cba6f9a5 --- /dev/null +++ b/ru/codes/rust/src/include/mod.rs @@ -0,0 +1,16 @@ +/* + * File: include.rs + * Created Time: 2023-02-05 + * Author: codingonion (coderonion@gmail.com), xBLACKICEx (xBLACKICE@outlook.com) + */ + +pub mod list_node; +pub mod print_util; +pub mod tree_node; +pub mod vertex; + +// rexport to include +pub use list_node::*; +pub use print_util::*; +pub use tree_node::*; +pub use vertex::*; diff --git a/ru/codes/rust/src/include/print_util.rs b/ru/codes/rust/src/include/print_util.rs new file mode 100644 index 000000000..5a3cd4189 --- /dev/null +++ b/ru/codes/rust/src/include/print_util.rs @@ -0,0 +1,103 @@ +/* + * File: print_util.rs + * Created Time: 2023-02-05 + * Author: codingonion (coderonion@gmail.com), xBLACKICEx (xBLACKICEx@outlook.com) + */ + +use std::cell::{Cell, RefCell}; +use std::fmt::Display; +use std::collections::{HashMap, VecDeque}; +use std::rc::Rc; + +use super::list_node::ListNode; +use super::tree_node::{TreeNode, vec_to_tree}; + +struct Trunk<'a, 'b> { + prev: Option<&'a Trunk<'a, 'b>>, + str: Cell<&'b str>, +} + +/* Вывести массив */ +pub fn print_array(nums: &[T]) { + print!("["); + if nums.len() > 0 { + for (i, num) in nums.iter().enumerate() { + print!("{}{}", num, if i == nums.len() - 1 {"]"} else {", "} ); + } + } else { + print!("]"); + } +} + +/* Вывести хеш-таблицу */ +pub fn print_hash_map(map: &HashMap) { + for (key, value) in map { + println!("{key} -> {value}"); + } +} + +/* Вывести очередь (двустороннюю очередь) */ +pub fn print_queue(queue: &VecDeque) { + print!("["); + let iter = queue.iter(); + for (i, data) in iter.enumerate() { + print!("{}{}", data, if i == queue.len() - 1 {"]"} else {", "} ); + } +} + +/* Вывести связный список */ +pub fn print_linked_list(head: &Rc>>) { + print!("{}{}", head.borrow().val, if head.borrow().next.is_none() {"\n"} else {" -> "}); + if let Some(node) = &head.borrow().next { + return print_linked_list(node); + } +} + +/* Вывести двоичное дерево */ +pub fn print_tree(root: &Rc>) { + _print_tree(Some(root), None, false); +} + +/* Вывести двоичное дерево */ +fn _print_tree(root: Option<&Rc>>, prev: Option<&Trunk>, is_right: bool) { + if let Some(node) = root { + let mut prev_str = " "; + let trunk = Trunk { prev, str: Cell::new(prev_str) }; + _print_tree(node.borrow().right.as_ref(), Some(&trunk), true); + + if prev.is_none() { + trunk.str.set("———"); + } else if is_right { + trunk.str.set("/———"); + prev_str = " |"; + } else { + trunk.str.set("\\———"); + prev.as_ref().unwrap().str.set(prev_str); + } + + show_trunks(Some(&trunk)); + println!(" {}", node.borrow().val); + if let Some(prev) = prev { + prev.str.set(prev_str); + } + trunk.str.set(" |"); + + _print_tree(node.borrow().left.as_ref(), Some(&trunk), false); + } +} + +fn show_trunks(trunk: Option<&Trunk>) { + if let Some(trunk) = trunk { + show_trunks(trunk.prev); + print!("{}", trunk.str.get()); + } +} + +/* Вывести кучу */ +pub fn print_heap(heap: Vec) { + println!("Массивное представление кучи: {:?}", heap); + println!("Древовидное представление кучи:"); + if let Some(root) = vec_to_tree(heap.into_iter().map(|val| Some(val)).collect()) { + print_tree(&root); + } +} diff --git a/ru/codes/rust/src/include/tree_node.rs b/ru/codes/rust/src/include/tree_node.rs new file mode 100644 index 000000000..2e9713fa1 --- /dev/null +++ b/ru/codes/rust/src/include/tree_node.rs @@ -0,0 +1,92 @@ +/* + * File: tree_node.rs + * Created Time: 2023-02-27 + * Author: xBLACKICEx (xBLACKICE@outlook.com), night-cruise (2586447362@qq.com) + */ + +use std::cell::RefCell; +use std::rc::Rc; + +/* Тип узла двоичного дерева */ +#[derive(Debug)] +pub struct TreeNode { + pub val: i32, + pub height: i32, + pub parent: Option>>, + pub left: Option>>, + pub right: Option>>, +} + +impl TreeNode { + /* Конструктор */ + pub fn new(val: i32) -> Rc> { + Rc::new(RefCell::new(Self { + val, + height: 0, + parent: None, + left: None, + right: None, + })) + } +} + +#[macro_export] +macro_rules! op_vec { + ( $( $x:expr ),* ) => { + vec![ + $(Option::from($x)),* + ] + }; +} + +// Правила кодирования сериализации см.: +// https://www.hello-algo.com/chapter_tree/array_representation_of_tree/ +// Массивное представление двоичного дерева: +// [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15] +// Связное представление двоичного дерева: +// /——— 15 +// /——— 7 +// /——— 3 +// | \——— 6 +// | \——— 12 +// ——— 1 +// \——— 2 +// | /——— 9 +// \——— 4 +// \——— 8 + +/* Десериализовать список в двоичное дерево: рекурсия */ +fn vec_to_tree_dfs(arr: &[Option], i: usize) -> Option>> { + if i >= arr.len() || arr[i].is_none() { + return None; + } + let root = TreeNode::new(arr[i].unwrap()); + root.borrow_mut().left = vec_to_tree_dfs(arr, 2 * i + 1); + root.borrow_mut().right = vec_to_tree_dfs(arr, 2 * i + 2); + Some(root) +} + +/* Десериализовать список в двоичное дерево */ +pub fn vec_to_tree(arr: Vec>) -> Option>> { + vec_to_tree_dfs(&arr, 0) +} + +/* Сериализовать двоичное дерево в список: рекурсия */ +fn tree_to_vec_dfs(root: Option<&Rc>>, i: usize, res: &mut Vec>) { + if let Some(root) = root { + // i + 1 is the minimum valid size to access index i + while res.len() < i + 1 { + res.push(None); + } + res[i] = Some(root.borrow().val); + tree_to_vec_dfs(root.borrow().left.as_ref(), 2 * i + 1, res); + tree_to_vec_dfs(root.borrow().right.as_ref(), 2 * i + 2, res); + } +} + +/* Сериализовать двоичное дерево в список */ +pub fn tree_to_vec(root: Option>>) -> Vec> { + let mut res = vec![]; + tree_to_vec_dfs(root.as_ref(), 0, &mut res); + res +} diff --git a/ru/codes/rust/src/include/vertex.rs b/ru/codes/rust/src/include/vertex.rs new file mode 100644 index 000000000..2655d985e --- /dev/null +++ b/ru/codes/rust/src/include/vertex.rs @@ -0,0 +1,27 @@ +/* + * File: vertex.rs + * Created Time: 2023-07-13 + * Author: night-cruise (2586447362@qq.com) + */ + +/* Тип вершины */ +#[derive(Copy, Clone, Hash, PartialEq, Eq)] +pub struct Vertex { + pub val: i32, +} + +impl From for Vertex { + fn from(value: i32) -> Self { + Self { val: value } + } +} + +/* На вход подается список значений vals, на выходе возвращается список вершин vets */ +pub fn vals_to_vets(vals: Vec) -> Vec { + vals.into_iter().map(|val| val.into()).collect() +} + +/* На вход подается список вершин vets, на выходе возвращается список значений vals */ +pub fn vets_to_vals(vets: Vec) -> Vec { + vets.into_iter().map(|vet| vet.val).collect() +} diff --git a/ru/codes/rust/src/lib.rs b/ru/codes/rust/src/lib.rs new file mode 100644 index 000000000..2883b9104 --- /dev/null +++ b/ru/codes/rust/src/lib.rs @@ -0,0 +1 @@ +pub mod include; diff --git a/ru/codes/swift/.gitignore b/ru/codes/swift/.gitignore new file mode 100644 index 000000000..6295af4cc --- /dev/null +++ b/ru/codes/swift/.gitignore @@ -0,0 +1,130 @@ +# Created by https://www.toptal.com/developers/gitignore/api/objective-c,swift,swiftpackagemanager +# Edit at https://www.toptal.com/developers/gitignore?templates=objective-c,swift,swiftpackagemanager + +### Objective-C ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +## Obj-C/Swift specific +*.hmap + +## App packaging +*.ipa +*.dSYM.zip +*.dSYM + +# CocoaPods +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# Pods/ +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace + +# Carthage +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build/ + +# fastlane +# It is recommended to not store the screenshots in the git repo. +# Instead, use fastlane to re-generate the screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output + +# Code Injection +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ + +### Objective-C Patch ### + +### Swift ### +# Xcode +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + + + + + + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +# Package.pins +# Package.resolved +# *.xcodeproj +# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata +# hence it is not needed unless you have added a package configuration file to your project +# .swiftpm + +.build/ + +# CocoaPods +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# Pods/ +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace + +# Carthage +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + + +# Accio dependency management +Dependencies/ +.accio/ + +# fastlane +# It is recommended to not store the screenshots in the git repo. +# Instead, use fastlane to re-generate the screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + + +# Code Injection +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + + +### SwiftPackageManager ### +Packages +xcuserdata +*.xcodeproj + + +# End of https://www.toptal.com/developers/gitignore/api/objective-c,swift,swiftpackagemanager diff --git a/ru/codes/swift/Package.resolved b/ru/codes/swift/Package.resolved new file mode 100644 index 000000000..159c83d26 --- /dev/null +++ b/ru/codes/swift/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections", + "state" : { + "branch" : "release/1.1", + "revision" : "4a1d92ba85027010d2c528c05576cde9a362254b" + } + } + ], + "version" : 2 +} diff --git a/ru/codes/swift/Package.swift b/ru/codes/swift/Package.swift new file mode 100644 index 000000000..5326dc138 --- /dev/null +++ b/ru/codes/swift/Package.swift @@ -0,0 +1,206 @@ +// swift-tools-version: 5.7 + +import PackageDescription + +let package = Package( + name: "HelloAlgo", + products: [ + // chapter_computational_complexity + .executable(name: "iteration", targets: ["iteration"]), + .executable(name: "recursion", targets: ["recursion"]), + .executable(name: "time_complexity", targets: ["time_complexity"]), + .executable(name: "worst_best_time_complexity", targets: ["worst_best_time_complexity"]), + .executable(name: "space_complexity", targets: ["space_complexity"]), + // chapter_array_and_linkedlist + .executable(name: "array", targets: ["array"]), + .executable(name: "linked_list", targets: ["linked_list"]), + .executable(name: "list", targets: ["list"]), + .executable(name: "my_list", targets: ["my_list"]), + // chapter_stack_and_queue + .executable(name: "stack", targets: ["stack"]), + .executable(name: "linkedlist_stack", targets: ["linkedlist_stack"]), + .executable(name: "array_stack", targets: ["array_stack"]), + .executable(name: "queue", targets: ["queue"]), + .executable(name: "linkedlist_queue", targets: ["linkedlist_queue"]), + .executable(name: "array_queue", targets: ["array_queue"]), + .executable(name: "deque", targets: ["deque"]), + .executable(name: "linkedlist_deque", targets: ["linkedlist_deque"]), + .executable(name: "array_deque", targets: ["array_deque"]), + // chapter_hashing + .executable(name: "hash_map", targets: ["hash_map"]), + .executable(name: "array_hash_map", targets: ["array_hash_map"]), + .executable(name: "hash_map_chaining", targets: ["hash_map_chaining"]), + .executable(name: "hash_map_open_addressing", targets: ["hash_map_open_addressing"]), + .executable(name: "simple_hash", targets: ["simple_hash"]), + .executable(name: "built_in_hash", targets: ["built_in_hash"]), + // chapter_tree + .executable(name: "binary_tree", targets: ["binary_tree"]), + .executable(name: "binary_tree_bfs", targets: ["binary_tree_bfs"]), + .executable(name: "binary_tree_dfs", targets: ["binary_tree_dfs"]), + .executable(name: "array_binary_tree", targets: ["array_binary_tree"]), + .executable(name: "binary_search_tree", targets: ["binary_search_tree"]), + .executable(name: "avl_tree", targets: ["avl_tree"]), + // chapter_heap + .executable(name: "heap", targets: ["heap"]), + .executable(name: "my_heap", targets: ["my_heap"]), + .executable(name: "top_k", targets: ["top_k"]), + // chapter_graph + .executable(name: "graph_adjacency_matrix", targets: ["graph_adjacency_matrix"]), + .executable(name: "graph_adjacency_list", targets: ["graph_adjacency_list"]), + .executable(name: "graph_bfs", targets: ["graph_bfs"]), + .executable(name: "graph_dfs", targets: ["graph_dfs"]), + // chapter_searching + .executable(name: "binary_search", targets: ["binary_search"]), + .executable(name: "binary_search_insertion", targets: ["binary_search_insertion"]), + .executable(name: "binary_search_edge", targets: ["binary_search_edge"]), + .executable(name: "two_sum", targets: ["two_sum"]), + .executable(name: "linear_search", targets: ["linear_search"]), + .executable(name: "hashing_search", targets: ["hashing_search"]), + // chapter_sorting + .executable(name: "selection_sort", targets: ["selection_sort"]), + .executable(name: "bubble_sort", targets: ["bubble_sort"]), + .executable(name: "insertion_sort", targets: ["insertion_sort"]), + .executable(name: "quick_sort", targets: ["quick_sort"]), + .executable(name: "merge_sort", targets: ["merge_sort"]), + .executable(name: "heap_sort", targets: ["heap_sort"]), + .executable(name: "bucket_sort", targets: ["bucket_sort"]), + .executable(name: "counting_sort", targets: ["counting_sort"]), + .executable(name: "radix_sort", targets: ["radix_sort"]), + // chapter_divide_and_conquer + .executable(name: "binary_search_recur", targets: ["binary_search_recur"]), + .executable(name: "build_tree", targets: ["build_tree"]), + .executable(name: "hanota", targets: ["hanota"]), + // chapter_backtracking + .executable(name: "preorder_traversal_i_compact", targets: ["preorder_traversal_i_compact"]), + .executable(name: "preorder_traversal_ii_compact", targets: ["preorder_traversal_ii_compact"]), + .executable(name: "preorder_traversal_iii_compact", targets: ["preorder_traversal_iii_compact"]), + .executable(name: "preorder_traversal_iii_template", targets: ["preorder_traversal_iii_template"]), + .executable(name: "permutations_i", targets: ["permutations_i"]), + .executable(name: "permutations_ii", targets: ["permutations_ii"]), + .executable(name: "subset_sum_i_naive", targets: ["subset_sum_i_naive"]), + .executable(name: "subset_sum_i", targets: ["subset_sum_i"]), + .executable(name: "subset_sum_ii", targets: ["subset_sum_ii"]), + .executable(name: "n_queens", targets: ["n_queens"]), + // chapter_dynamic_programming + .executable(name: "climbing_stairs_backtrack", targets: ["climbing_stairs_backtrack"]), + .executable(name: "climbing_stairs_dfs", targets: ["climbing_stairs_dfs"]), + .executable(name: "climbing_stairs_dfs_mem", targets: ["climbing_stairs_dfs_mem"]), + .executable(name: "climbing_stairs_dp", targets: ["climbing_stairs_dp"]), + .executable(name: "min_cost_climbing_stairs_dp", targets: ["min_cost_climbing_stairs_dp"]), + .executable(name: "climbing_stairs_constraint_dp", targets: ["climbing_stairs_constraint_dp"]), + .executable(name: "min_path_sum", targets: ["min_path_sum"]), + .executable(name: "knapsack", targets: ["knapsack"]), + .executable(name: "unbounded_knapsack", targets: ["unbounded_knapsack"]), + .executable(name: "coin_change", targets: ["coin_change"]), + .executable(name: "coin_change_ii", targets: ["coin_change_ii"]), + .executable(name: "edit_distance", targets: ["edit_distance"]), + // chapter_greedy + .executable(name: "coin_change_greedy", targets: ["coin_change_greedy"]), + .executable(name: "fractional_knapsack", targets: ["fractional_knapsack"]), + .executable(name: "max_capacity", targets: ["max_capacity"]), + .executable(name: "max_product_cutting", targets: ["max_product_cutting"]), + ], + dependencies: [ + .package(url: "https://github.com/apple/swift-collections", branch: "release/1.1"), + ], + targets: [ + // helper + .target(name: "utils", path: "utils"), + .target(name: "graph_adjacency_list_target", dependencies: ["utils"], path: "chapter_graph", sources: ["graph_adjacency_list_target.swift"], swiftSettings: [.define("TARGET")]), + .target(name: "binary_search_insertion_target", path: "chapter_searching", sources: ["binary_search_insertion_target.swift"], swiftSettings: [.define("TARGET")]), + // chapter_computational_complexity + .executableTarget(name: "iteration", path: "chapter_computational_complexity", sources: ["iteration.swift"]), + .executableTarget(name: "recursion", path: "chapter_computational_complexity", sources: ["recursion.swift"]), + .executableTarget(name: "time_complexity", path: "chapter_computational_complexity", sources: ["time_complexity.swift"]), + .executableTarget(name: "worst_best_time_complexity", path: "chapter_computational_complexity", sources: ["worst_best_time_complexity.swift"]), + .executableTarget(name: "space_complexity", dependencies: ["utils"], path: "chapter_computational_complexity", sources: ["space_complexity.swift"]), + // chapter_array_and_linkedlist + .executableTarget(name: "array", path: "chapter_array_and_linkedlist", sources: ["array.swift"]), + .executableTarget(name: "linked_list", dependencies: ["utils"], path: "chapter_array_and_linkedlist", sources: ["linked_list.swift"]), + .executableTarget(name: "list", path: "chapter_array_and_linkedlist", sources: ["list.swift"]), + .executableTarget(name: "my_list", path: "chapter_array_and_linkedlist", sources: ["my_list.swift"]), + // chapter_stack_and_queue + .executableTarget(name: "stack", path: "chapter_stack_and_queue", sources: ["stack.swift"]), + .executableTarget(name: "linkedlist_stack", dependencies: ["utils"], path: "chapter_stack_and_queue", sources: ["linkedlist_stack.swift"]), + .executableTarget(name: "array_stack", path: "chapter_stack_and_queue", sources: ["array_stack.swift"]), + .executableTarget(name: "queue", path: "chapter_stack_and_queue", sources: ["queue.swift"]), + .executableTarget(name: "linkedlist_queue", dependencies: ["utils"], path: "chapter_stack_and_queue", sources: ["linkedlist_queue.swift"]), + .executableTarget(name: "array_queue", path: "chapter_stack_and_queue", sources: ["array_queue.swift"]), + .executableTarget(name: "deque", path: "chapter_stack_and_queue", sources: ["deque.swift"]), + .executableTarget(name: "linkedlist_deque", path: "chapter_stack_and_queue", sources: ["linkedlist_deque.swift"]), + .executableTarget(name: "array_deque", path: "chapter_stack_and_queue", sources: ["array_deque.swift"]), + // chapter_hashing + .executableTarget(name: "hash_map", dependencies: ["utils"], path: "chapter_hashing", sources: ["hash_map.swift"]), + .executableTarget(name: "array_hash_map", dependencies: ["utils"], path: "chapter_hashing", sources: ["array_hash_map.swift"]), + .executableTarget(name: "hash_map_chaining", dependencies: ["utils"], path: "chapter_hashing", sources: ["hash_map_chaining.swift"]), + .executableTarget(name: "hash_map_open_addressing", dependencies: ["utils"], path: "chapter_hashing", sources: ["hash_map_open_addressing.swift"]), + .executableTarget(name: "simple_hash", path: "chapter_hashing", sources: ["simple_hash.swift"]), + .executableTarget(name: "built_in_hash", dependencies: ["utils"], path: "chapter_hashing", sources: ["built_in_hash.swift"]), + // chapter_tree + .executableTarget(name: "binary_tree", dependencies: ["utils"], path: "chapter_tree", sources: ["binary_tree.swift"]), + .executableTarget(name: "binary_tree_bfs", dependencies: ["utils"], path: "chapter_tree", sources: ["binary_tree_bfs.swift"]), + .executableTarget(name: "binary_tree_dfs", dependencies: ["utils"], path: "chapter_tree", sources: ["binary_tree_dfs.swift"]), + .executableTarget(name: "array_binary_tree", dependencies: ["utils"], path: "chapter_tree", sources: ["array_binary_tree.swift"]), + .executableTarget(name: "binary_search_tree", dependencies: ["utils"], path: "chapter_tree", sources: ["binary_search_tree.swift"]), + .executableTarget(name: "avl_tree", dependencies: ["utils"], path: "chapter_tree", sources: ["avl_tree.swift"]), + // chapter_heap + .executableTarget(name: "heap", dependencies: ["utils", .product(name: "HeapModule", package: "swift-collections")], path: "chapter_heap", sources: ["heap.swift"]), + .executableTarget(name: "my_heap", dependencies: ["utils"], path: "chapter_heap", sources: ["my_heap.swift"]), + .executableTarget(name: "top_k", dependencies: ["utils", .product(name: "HeapModule", package: "swift-collections")], path: "chapter_heap", sources: ["top_k.swift"]), + // chapter_graph + .executableTarget(name: "graph_adjacency_matrix", dependencies: ["utils"], path: "chapter_graph", sources: ["graph_adjacency_matrix.swift"]), + .executableTarget(name: "graph_adjacency_list", dependencies: ["utils"], path: "chapter_graph", sources: ["graph_adjacency_list.swift"]), + .executableTarget(name: "graph_bfs", dependencies: ["utils", "graph_adjacency_list_target"], path: "chapter_graph", sources: ["graph_bfs.swift"]), + .executableTarget(name: "graph_dfs", dependencies: ["utils", "graph_adjacency_list_target"], path: "chapter_graph", sources: ["graph_dfs.swift"]), + // chapter_searching + .executableTarget(name: "binary_search", path: "chapter_searching", sources: ["binary_search.swift"]), + .executableTarget(name: "binary_search_insertion", path: "chapter_searching", sources: ["binary_search_insertion.swift"]), + .executableTarget(name: "binary_search_edge", dependencies: ["binary_search_insertion_target"], path: "chapter_searching", sources: ["binary_search_edge.swift"]), + .executableTarget(name: "two_sum", path: "chapter_searching", sources: ["two_sum.swift"]), + .executableTarget(name: "linear_search", dependencies: ["utils"], path: "chapter_searching", sources: ["linear_search.swift"]), + .executableTarget(name: "hashing_search", dependencies: ["utils"], path: "chapter_searching", sources: ["hashing_search.swift"]), + // chapter_sorting + .executableTarget(name: "selection_sort", path: "chapter_sorting", sources: ["selection_sort.swift"]), + .executableTarget(name: "bubble_sort", path: "chapter_sorting", sources: ["bubble_sort.swift"]), + .executableTarget(name: "insertion_sort", path: "chapter_sorting", sources: ["insertion_sort.swift"]), + .executableTarget(name: "quick_sort", path: "chapter_sorting", sources: ["quick_sort.swift"]), + .executableTarget(name: "merge_sort", path: "chapter_sorting", sources: ["merge_sort.swift"]), + .executableTarget(name: "heap_sort", path: "chapter_sorting", sources: ["heap_sort.swift"]), + .executableTarget(name: "bucket_sort", path: "chapter_sorting", sources: ["bucket_sort.swift"]), + .executableTarget(name: "counting_sort", path: "chapter_sorting", sources: ["counting_sort.swift"]), + .executableTarget(name: "radix_sort", path: "chapter_sorting", sources: ["radix_sort.swift"]), + // chapter_divide_and_conquer + .executableTarget(name: "binary_search_recur", path: "chapter_divide_and_conquer", sources: ["binary_search_recur.swift"]), + .executableTarget(name: "build_tree", dependencies: ["utils"], path: "chapter_divide_and_conquer", sources: ["build_tree.swift"]), + .executableTarget(name: "hanota", path: "chapter_divide_and_conquer", sources: ["hanota.swift"]), + // chapter_backtracking + .executableTarget(name: "preorder_traversal_i_compact", dependencies: ["utils"], path: "chapter_backtracking", sources: ["preorder_traversal_i_compact.swift"]), + .executableTarget(name: "preorder_traversal_ii_compact", dependencies: ["utils"], path: "chapter_backtracking", sources: ["preorder_traversal_ii_compact.swift"]), + .executableTarget(name: "preorder_traversal_iii_compact", dependencies: ["utils"], path: "chapter_backtracking", sources: ["preorder_traversal_iii_compact.swift"]), + .executableTarget(name: "preorder_traversal_iii_template", dependencies: ["utils"], path: "chapter_backtracking", sources: ["preorder_traversal_iii_template.swift"]), + .executableTarget(name: "permutations_i", path: "chapter_backtracking", sources: ["permutations_i.swift"]), + .executableTarget(name: "permutations_ii", path: "chapter_backtracking", sources: ["permutations_ii.swift"]), + .executableTarget(name: "subset_sum_i_naive", path: "chapter_backtracking", sources: ["subset_sum_i_naive.swift"]), + .executableTarget(name: "subset_sum_i", path: "chapter_backtracking", sources: ["subset_sum_i.swift"]), + .executableTarget(name: "subset_sum_ii", path: "chapter_backtracking", sources: ["subset_sum_ii.swift"]), + .executableTarget(name: "n_queens", path: "chapter_backtracking", sources: ["n_queens.swift"]), + // chapter_dynamic_programming + .executableTarget(name: "climbing_stairs_backtrack", path: "chapter_dynamic_programming", sources: ["climbing_stairs_backtrack.swift"]), + .executableTarget(name: "climbing_stairs_dfs", path: "chapter_dynamic_programming", sources: ["climbing_stairs_dfs.swift"]), + .executableTarget(name: "climbing_stairs_dfs_mem", path: "chapter_dynamic_programming", sources: ["climbing_stairs_dfs_mem.swift"]), + .executableTarget(name: "climbing_stairs_dp", path: "chapter_dynamic_programming", sources: ["climbing_stairs_dp.swift"]), + .executableTarget(name: "min_cost_climbing_stairs_dp", path: "chapter_dynamic_programming", sources: ["min_cost_climbing_stairs_dp.swift"]), + .executableTarget(name: "climbing_stairs_constraint_dp", path: "chapter_dynamic_programming", sources: ["climbing_stairs_constraint_dp.swift"]), + .executableTarget(name: "min_path_sum", path: "chapter_dynamic_programming", sources: ["min_path_sum.swift"]), + .executableTarget(name: "knapsack", path: "chapter_dynamic_programming", sources: ["knapsack.swift"]), + .executableTarget(name: "unbounded_knapsack", path: "chapter_dynamic_programming", sources: ["unbounded_knapsack.swift"]), + .executableTarget(name: "coin_change", path: "chapter_dynamic_programming", sources: ["coin_change.swift"]), + .executableTarget(name: "coin_change_ii", path: "chapter_dynamic_programming", sources: ["coin_change_ii.swift"]), + .executableTarget(name: "edit_distance", path: "chapter_dynamic_programming", sources: ["edit_distance.swift"]), + // chapter_greedy + .executableTarget(name: "coin_change_greedy", path: "chapter_greedy", sources: ["coin_change_greedy.swift"]), + .executableTarget(name: "fractional_knapsack", path: "chapter_greedy", sources: ["fractional_knapsack.swift"]), + .executableTarget(name: "max_capacity", path: "chapter_greedy", sources: ["max_capacity.swift"]), + .executableTarget(name: "max_product_cutting", path: "chapter_greedy", sources: ["max_product_cutting.swift"]), + ] +) diff --git a/ru/codes/swift/chapter_array_and_linkedlist/array.swift b/ru/codes/swift/chapter_array_and_linkedlist/array.swift new file mode 100644 index 000000000..b7cca7f2c --- /dev/null +++ b/ru/codes/swift/chapter_array_and_linkedlist/array.swift @@ -0,0 +1,107 @@ +/** + * File: array.swift + * Created Time: 2023-01-05 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Случайный доступ к элементу */ +func randomAccess(nums: [Int]) -> Int { + // Случайным образом выбрать число из интервала [0, nums.count) + let randomIndex = nums.indices.randomElement()! + // Получить и вернуть случайный элемент + let randomNum = nums[randomIndex] + return randomNum +} + +/* Увеличить длину массива */ +func extend(nums: [Int], enlarge: Int) -> [Int] { + // Инициализировать массив увеличенной длины + var res = Array(repeating: 0, count: nums.count + enlarge) + // Скопировать все элементы исходного массива в новый массив + for i in nums.indices { + res[i] = nums[i] + } + // Вернуть новый массив после расширения + return res +} + +/* Вставить элемент num по индексу index в массив */ +func insert(nums: inout [Int], num: Int, index: Int) { + // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад + for i in nums.indices.dropFirst(index).reversed() { + nums[i] = nums[i - 1] + } + // Присвоить num элементу по индексу index + nums[index] = num +} + +/* Удалить элемент по индексу index */ +func remove(nums: inout [Int], index: Int) { + // Сдвинуть все элементы после индекса index на одну позицию вперед + for i in nums.indices.dropFirst(index).dropLast() { + nums[i] = nums[i + 1] + } +} + +/* Обход массива */ +func traverse(nums: [Int]) { + var count = 0 + // Обход массива по индексам + for i in nums.indices { + count += nums[i] + } + // Непосредственно обходить элементы массива + for num in nums { + count += num + } + // Одновременно обходить индексы и элементы данных + for (i, num) in nums.enumerated() { + count += nums[i] + count += num + } +} + +/* Найти заданный элемент в массиве */ +func find(nums: [Int], target: Int) -> Int { + for i in nums.indices { + if nums[i] == target { + return i + } + } + return -1 +} + +@main +enum _Array { + /* Driver Code */ + static func main() { + /* Инициализация массива */ + let arr = Array(repeating: 0, count: 5) + print("Массив arr = \(arr)") + var nums = [1, 3, 2, 5, 4] + print("Массив nums = \(nums)") + + /* Случайный доступ */ + let randomNum = randomAccess(nums: nums) + print("Случайный элемент из nums = \(randomNum)") + + /* Расширение длины */ + nums = extend(nums: nums, enlarge: 3) + print("После увеличения длины массива до 8 nums = \(nums)") + + /* Вставка элемента */ + insert(nums: &nums, num: 6, index: 3) + print("После вставки числа 6 по индексу 3 nums = \(nums)") + + /* Удаление элемента */ + remove(nums: &nums, index: 2) + print("После удаления элемента по индексу 2 nums = \(nums)") + + /* Обход массива */ + traverse(nums: nums) + + /* Поиск элемента */ + let index = find(nums: nums, target: 3) + print("Поиск элемента 3 в nums: индекс = \(index)") + } +} diff --git a/ru/codes/swift/chapter_array_and_linkedlist/linked_list.swift b/ru/codes/swift/chapter_array_and_linkedlist/linked_list.swift new file mode 100644 index 000000000..771194d87 --- /dev/null +++ b/ru/codes/swift/chapter_array_and_linkedlist/linked_list.swift @@ -0,0 +1,90 @@ +/** + * File: linked_list.swift + * Created Time: 2023-01-08 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Вставить узел P после узла n0 в связном списке */ +func insert(n0: ListNode, P: ListNode) { + let n1 = n0.next + P.next = n1 + n0.next = P +} + +/* Удалить первый узел после узла n0 в связном списке */ +func remove(n0: ListNode) { + if n0.next == nil { + return + } + // n0 -> P -> n1 + let P = n0.next + let n1 = P?.next + n0.next = n1 +} + +/* Доступ к узлу связного списка по индексу index */ +func access(head: ListNode, index: Int) -> ListNode? { + var head: ListNode? = head + for _ in 0 ..< index { + if head == nil { + return nil + } + head = head?.next + } + return head +} + +/* Найти в связном списке первый узел со значением target */ +func find(head: ListNode, target: Int) -> Int { + var head: ListNode? = head + var index = 0 + while head != nil { + if head?.val == target { + return index + } + head = head?.next + index += 1 + } + return -1 +} + +@main +enum LinkedList { + /* Driver Code */ + static func main() { + /* Инициализация связного списка */ + // Инициализация всех узлов + let n0 = ListNode(x: 1) + let n1 = ListNode(x: 3) + let n2 = ListNode(x: 2) + let n3 = ListNode(x: 5) + let n4 = ListNode(x: 4) + // Построить ссылки между узлами + n0.next = n1 + n1.next = n2 + n2.next = n3 + n3.next = n4 + print("Исходный связный список") + PrintUtil.printLinkedList(head: n0) + + /* Вставка узла */ + insert(n0: n0, P: ListNode(x: 0)) + print("Связный список после вставки узла") + PrintUtil.printLinkedList(head: n0) + + /* Удаление узла */ + remove(n0: n0) + print("Связный список после удаления узла") + PrintUtil.printLinkedList(head: n0) + + /* Доступ к узлу */ + let node = access(head: n0, index: 3) + print("Значение узла по индексу 3 в связном списке = \(node!.val)") + + /* Поиск узла */ + let index = find(head: n0, target: 2) + print("Индекс узла со значением 2 в связном списке = \(index)") + } +} diff --git a/ru/codes/swift/chapter_array_and_linkedlist/list.swift b/ru/codes/swift/chapter_array_and_linkedlist/list.swift new file mode 100644 index 000000000..507c619b8 --- /dev/null +++ b/ru/codes/swift/chapter_array_and_linkedlist/list.swift @@ -0,0 +1,63 @@ +/** + * File: list.swift + * Created Time: 2023-01-08 + * Author: nuomi1 (nuomi1@qq.com) + */ + +@main +enum List { + /* Driver Code */ + static func main() { + /* Инициализация списка */ + var nums = [1, 3, 2, 5, 4] + print("Список nums = \(nums)") + + /* Доступ к элементу */ + let num = nums[1] + print("Элемент по индексу 1: num = \(num)") + + /* Обновление элемента */ + nums[1] = 0 + print("После обновления элемента по индексу 1 до 0 nums = \(nums)") + + /* Очистить список */ + nums.removeAll() + print("После очистки списка nums = \(nums)") + + /* Добавление элемента в конец */ + nums.append(1) + nums.append(3) + nums.append(2) + nums.append(5) + nums.append(4) + print("После добавления элементов nums = \(nums)") + + /* Вставка элемента в середину */ + nums.insert(6, at: 3) + print("После вставки числа 6 по индексу 3 nums = \(nums)") + + /* Удаление элемента */ + nums.remove(at: 3) + print("После удаления элемента по индексу 3 nums = \(nums)") + + /* Обходить список по индексам */ + var count = 0 + for i in nums.indices { + count += nums[i] + } + /* Непосредственно обходить элементы списка */ + count = 0 + for x in nums { + count += x + } + + /* Объединить два списка */ + let nums1 = [6, 8, 7, 10, 9] + nums.append(contentsOf: nums1) + print("После конкатенации списка nums1 к nums nums = \(nums)") + + /* Отсортировать список */ + nums.sort() + print("После сортировки списка nums = \(nums)") + } +} diff --git a/ru/codes/swift/chapter_array_and_linkedlist/my_list.swift b/ru/codes/swift/chapter_array_and_linkedlist/my_list.swift new file mode 100644 index 000000000..e4a89835c --- /dev/null +++ b/ru/codes/swift/chapter_array_and_linkedlist/my_list.swift @@ -0,0 +1,146 @@ +/** + * File: my_list.swift + * Created Time: 2023-01-08 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Класс списка */ +class MyList { + private var arr: [Int] // Массив (для хранения элементов списка) + private var _capacity: Int // Вместимость списка + private var _size: Int // Длина списка (текущее число элементов) + private let extendRatio: Int // Коэффициент увеличения списка при каждом расширении + + /* Конструктор */ + init() { + _capacity = 10 + _size = 0 + extendRatio = 2 + arr = Array(repeating: 0, count: _capacity) + } + + /* Получить длину списка (текущее число элементов) */ + func size() -> Int { + _size + } + + /* Получить вместимость списка */ + func capacity() -> Int { + _capacity + } + + /* Доступ к элементу */ + func get(index: Int) -> Int { + // Если индекс выходит за границы, выбросить ошибку; далее аналогично + if index < 0 || index >= size() { + fatalError("индекс выходит за границы") + } + return arr[index] + } + + /* Обновление элемента */ + func set(index: Int, num: Int) { + if index < 0 || index >= size() { + fatalError("индекс выходит за границы") + } + arr[index] = num + } + + /* Добавление элемента в конец */ + func add(num: Int) { + // При превышении вместимости по числу элементов запускается расширение + if size() == capacity() { + extendCapacity() + } + arr[size()] = num + // Обновить число элементов + _size += 1 + } + + /* Вставка элемента в середину */ + func insert(index: Int, num: Int) { + if index < 0 || index >= size() { + fatalError("индекс выходит за границы") + } + // При превышении вместимости по числу элементов запускается расширение + if size() == capacity() { + extendCapacity() + } + // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад + for j in (index ..< size()).reversed() { + arr[j + 1] = arr[j] + } + arr[index] = num + // Обновить число элементов + _size += 1 + } + + /* Удаление элемента */ + @discardableResult + func remove(index: Int) -> Int { + if index < 0 || index >= size() { + fatalError("индекс выходит за границы") + } + let num = arr[index] + // Сдвинуть все элементы после индекса index на одну позицию вперед + for j in index ..< (size() - 1) { + arr[j] = arr[j + 1] + } + // Обновить число элементов + _size -= 1 + // Вернуть удаленный элемент + return num + } + + /* Расширение списка */ + func extendCapacity() { + // Создать новый массив длиной в extendRatio раз больше исходного и скопировать в него исходный массив + arr = arr + Array(repeating: 0, count: capacity() * (extendRatio - 1)) + // Обновить вместимость списка + _capacity = arr.count + } + + /* Преобразовать список в массив */ + func toArray() -> [Int] { + Array(arr.prefix(size())) + } +} + +@main +enum _MyList { + /* Driver Code */ + static func main() { + /* Инициализация списка */ + let nums = MyList() + /* Добавление элемента в конец */ + nums.add(num: 1) + nums.add(num: 3) + nums.add(num: 2) + nums.add(num: 5) + nums.add(num: 4) + print("Список nums = \(nums.toArray()) , вместимость = \(nums.capacity()) , длина = \(nums.size())") + + /* Вставка элемента в середину */ + nums.insert(index: 3, num: 6) + print("После вставки числа 6 по индексу 3 nums = \(nums.toArray())") + + /* Удаление элемента */ + nums.remove(index: 3) + print("После удаления элемента по индексу 3 nums = \(nums.toArray())") + + /* Доступ к элементу */ + let num = nums.get(index: 1) + print("Элемент по индексу 1: num = \(num)") + + /* Обновление элемента */ + nums.set(index: 1, num: 0) + print("После обновления элемента по индексу 1 до 0 nums = \(nums.toArray())") + + /* Проверка механизма расширения */ + for i in 0 ..< 10 { + // При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения + nums.add(num: i) + } + print("Список nums после увеличения вместимости = \(nums.toArray()) , вместимость = \(nums.capacity()) , длина = \(nums.size())") + } +} diff --git a/ru/codes/swift/chapter_backtracking/n_queens.swift b/ru/codes/swift/chapter_backtracking/n_queens.swift new file mode 100644 index 000000000..54a4c4ab7 --- /dev/null +++ b/ru/codes/swift/chapter_backtracking/n_queens.swift @@ -0,0 +1,67 @@ +/** + * File: n_queens.swift + * Created Time: 2023-05-14 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Алгоритм бэктрекинга: n ферзей */ +func backtrack(row: Int, n: Int, state: inout [[String]], res: inout [[[String]]], cols: inout [Bool], diags1: inout [Bool], diags2: inout [Bool]) { + // Когда все строки уже обработаны, записать решение + if row == n { + res.append(state) + return + } + // Обойти все столбцы + for col in 0 ..< n { + // Вычислить главную и побочную диагонали, соответствующие этой клетке + let diag1 = row - col + n - 1 + let diag2 = row + col + // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей + if !cols[col] && !diags1[diag1] && !diags2[diag2] { + // Попытка: поставить ферзя в эту клетку + state[row][col] = "Q" + cols[col] = true + diags1[diag1] = true + diags2[diag2] = true + // Перейти к размещению следующей строки + backtrack(row: row + 1, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2) + // Откат: восстановить эту клетку как пустую + state[row][col] = "#" + cols[col] = false + diags1[diag1] = false + diags2[diag2] = false + } + } +} + +/* Решить задачу о n ферзях */ +func nQueens(n: Int) -> [[[String]]] { + // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку + var state = Array(repeating: Array(repeating: "#", count: n), count: n) + var cols = Array(repeating: false, count: n) // Отмечать, есть ли ферзь в столбце + var diags1 = Array(repeating: false, count: 2 * n - 1) // Отмечать наличие ферзя на главной диагонали + var diags2 = Array(repeating: false, count: 2 * n - 1) // Отмечать наличие ферзя на побочной диагонали + var res: [[[String]]] = [] + + backtrack(row: 0, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2) + + return res +} + +@main +enum NQueens { + /* Driver Code */ + static func main() { + let n = 4 + let res = nQueens(n: n) + + print("Размер входной доски = \(n)") + print("Количество способов расстановки ферзей: \(res.count)") + for state in res { + print("--------------------") + for row in state { + print(row) + } + } + } +} diff --git a/ru/codes/swift/chapter_backtracking/permutations_i.swift b/ru/codes/swift/chapter_backtracking/permutations_i.swift new file mode 100644 index 000000000..0ca9e6b55 --- /dev/null +++ b/ru/codes/swift/chapter_backtracking/permutations_i.swift @@ -0,0 +1,50 @@ +/** + * File: permutations_i.swift + * Created Time: 2023-04-30 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Алгоритм бэктрекинга: все перестановки I */ +func backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) { + // Когда длина состояния равна числу элементов, записать решение + if state.count == choices.count { + res.append(state) + return + } + // Перебор всех вариантов выбора + for (i, choice) in choices.enumerated() { + // Отсечение: нельзя выбирать один и тот же элемент повторно + if !selected[i] { + // Попытка: сделать выбор и обновить состояние + selected[i] = true + state.append(choice) + // Перейти к следующему выбору + backtrack(state: &state, choices: choices, selected: &selected, res: &res) + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false + state.removeLast() + } + } +} + +/* Все перестановки I */ +func permutationsI(nums: [Int]) -> [[Int]] { + var state: [Int] = [] + var selected = Array(repeating: false, count: nums.count) + var res: [[Int]] = [] + backtrack(state: &state, choices: nums, selected: &selected, res: &res) + return res +} + +@main +enum PermutationsI { + /* Driver Code */ + static func main() { + let nums = [1, 2, 3] + + let res = permutationsI(nums: nums) + + print("Входной массив nums = \(nums)") + print("Все перестановки res = \(res)") + } +} diff --git a/ru/codes/swift/chapter_backtracking/permutations_ii.swift b/ru/codes/swift/chapter_backtracking/permutations_ii.swift new file mode 100644 index 000000000..24a317263 --- /dev/null +++ b/ru/codes/swift/chapter_backtracking/permutations_ii.swift @@ -0,0 +1,52 @@ +/** + * File: permutations_ii.swift + * Created Time: 2023-04-30 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Алгоритм бэктрекинга: все перестановки II */ +func backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) { + // Когда длина состояния равна числу элементов, записать решение + if state.count == choices.count { + res.append(state) + return + } + // Перебор всех вариантов выбора + var duplicated: Set = [] + for (i, choice) in choices.enumerated() { + // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы + if !selected[i], !duplicated.contains(choice) { + // Попытка: сделать выбор и обновить состояние + duplicated.insert(choice) // Записать значения уже выбранных элементов + selected[i] = true + state.append(choice) + // Перейти к следующему выбору + backtrack(state: &state, choices: choices, selected: &selected, res: &res) + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false + state.removeLast() + } + } +} + +/* Все перестановки II */ +func permutationsII(nums: [Int]) -> [[Int]] { + var state: [Int] = [] + var selected = Array(repeating: false, count: nums.count) + var res: [[Int]] = [] + backtrack(state: &state, choices: nums, selected: &selected, res: &res) + return res +} + +@main +enum PermutationsII { + /* Driver Code */ + static func main() { + let nums = [1, 2, 3] + + let res = permutationsII(nums: nums) + + print("Входной массив nums = \(nums)") + print("Все перестановки res = \(res)") + } +} diff --git a/ru/codes/swift/chapter_backtracking/preorder_traversal_i_compact.swift b/ru/codes/swift/chapter_backtracking/preorder_traversal_i_compact.swift new file mode 100644 index 000000000..c340c1d7a --- /dev/null +++ b/ru/codes/swift/chapter_backtracking/preorder_traversal_i_compact.swift @@ -0,0 +1,43 @@ +/** + * File: preorder_traversal_i_compact.swift + * Created Time: 2023-04-30 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +var res: [TreeNode] = [] + +/* Предварительный обход: пример 1 */ +func preOrder(root: TreeNode?) { + guard let root = root else { + return + } + if root.val == 7 { + // Записать решение + res.append(root) + } + preOrder(root: root.left) + preOrder(root: root.right) +} + +@main +enum PreorderTraversalICompact { + /* Driver Code */ + static func main() { + let root = TreeNode.listToTree(arr: [1, 7, 3, 4, 5, 6, 7]) + print("\nИнициализация двоичного дерева") + PrintUtil.printTree(root: root) + + // Предварительный обход + res = [] + preOrder(root: root) + + print("\nВсе узлы со значением 7") + var vals: [Int] = [] + for node in res { + vals.append(node.val) + } + print(vals) + } +} diff --git a/ru/codes/swift/chapter_backtracking/preorder_traversal_ii_compact.swift b/ru/codes/swift/chapter_backtracking/preorder_traversal_ii_compact.swift new file mode 100644 index 000000000..d3116e7f3 --- /dev/null +++ b/ru/codes/swift/chapter_backtracking/preorder_traversal_ii_compact.swift @@ -0,0 +1,51 @@ +/** + * File: preorder_traversal_ii_compact.swift + * Created Time: 2023-04-30 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +var path: [TreeNode] = [] +var res: [[TreeNode]] = [] + +/* Предварительный обход: пример 2 */ +func preOrder(root: TreeNode?) { + guard let root = root else { + return + } + // Попытка + path.append(root) + if root.val == 7 { + // Записать решение + res.append(path) + } + preOrder(root: root.left) + preOrder(root: root.right) + // Откат + path.removeLast() +} + +@main +enum PreorderTraversalIICompact { + /* Driver Code */ + static func main() { + let root = TreeNode.listToTree(arr: [1, 7, 3, 4, 5, 6, 7]) + print("\nИнициализация двоичного дерева") + PrintUtil.printTree(root: root) + + // Предварительный обход + path = [] + res = [] + preOrder(root: root) + + print("\nВсе пути от корня к узлу 7") + for path in res { + var vals: [Int] = [] + for node in path { + vals.append(node.val) + } + print(vals) + } + } +} diff --git a/ru/codes/swift/chapter_backtracking/preorder_traversal_iii_compact.swift b/ru/codes/swift/chapter_backtracking/preorder_traversal_iii_compact.swift new file mode 100644 index 000000000..b6dee82d8 --- /dev/null +++ b/ru/codes/swift/chapter_backtracking/preorder_traversal_iii_compact.swift @@ -0,0 +1,52 @@ +/** + * File: preorder_traversal_iii_compact.swift + * Created Time: 2023-04-30 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +var path: [TreeNode] = [] +var res: [[TreeNode]] = [] + +/* Предварительный обход: пример 3 */ +func preOrder(root: TreeNode?) { + // Отсечение + guard let root = root, root.val != 3 else { + return + } + // Попытка + path.append(root) + if root.val == 7 { + // Записать решение + res.append(path) + } + preOrder(root: root.left) + preOrder(root: root.right) + // Откат + path.removeLast() +} + +@main +enum PreorderTraversalIIICompact { + /* Driver Code */ + static func main() { + let root = TreeNode.listToTree(arr: [1, 7, 3, 4, 5, 6, 7]) + print("\nИнициализация двоичного дерева") + PrintUtil.printTree(root: root) + + // Предварительный обход + path = [] + res = [] + preOrder(root: root) + + print("\nВсе пути от корня к узлу 7, не содержащие узлов со значением 3") + for path in res { + var vals: [Int] = [] + for node in path { + vals.append(node.val) + } + print(vals) + } + } +} diff --git a/ru/codes/swift/chapter_backtracking/preorder_traversal_iii_template.swift b/ru/codes/swift/chapter_backtracking/preorder_traversal_iii_template.swift new file mode 100644 index 000000000..0c9f99c5c --- /dev/null +++ b/ru/codes/swift/chapter_backtracking/preorder_traversal_iii_template.swift @@ -0,0 +1,76 @@ +/** + * File: preorder_traversal_iii_template.swift + * Created Time: 2023-04-30 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Проверить, является ли текущее состояние решением */ +func isSolution(state: [TreeNode]) -> Bool { + !state.isEmpty && state.last!.val == 7 +} + +/* Записать решение */ +func recordSolution(state: [TreeNode], res: inout [[TreeNode]]) { + res.append(state) +} + +/* Проверить, допустим ли этот выбор в текущем состоянии */ +func isValid(state: [TreeNode], choice: TreeNode?) -> Bool { + choice != nil && choice!.val != 3 +} + +/* Обновить состояние */ +func makeChoice(state: inout [TreeNode], choice: TreeNode) { + state.append(choice) +} + +/* Восстановить состояние */ +func undoChoice(state: inout [TreeNode], choice: TreeNode) { + state.removeLast() +} + +/* Алгоритм бэктрекинга: пример 3 */ +func backtrack(state: inout [TreeNode], choices: [TreeNode], res: inout [[TreeNode]]) { + // Проверить, является ли текущее состояние решением + if isSolution(state: state) { + recordSolution(state: state, res: &res) + } + // Перебор всех вариантов выбора + for choice in choices { + // Отсечение: проверить допустимость выбора + if isValid(state: state, choice: choice) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state: &state, choice: choice) + // Перейти к следующему выбору + backtrack(state: &state, choices: [choice.left, choice.right].compactMap { $0 }, res: &res) + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state: &state, choice: choice) + } + } +} + +@main +enum PreorderTraversalIIITemplate { + /* Driver Code */ + static func main() { + let root = TreeNode.listToTree(arr: [1, 7, 3, 4, 5, 6, 7]) + print("\nИнициализация двоичного дерева") + PrintUtil.printTree(root: root) + + // Алгоритм бэктрекинга + var state: [TreeNode] = [] + var res: [[TreeNode]] = [] + backtrack(state: &state, choices: [root].compactMap { $0 }, res: &res) + + print("\nВсе пути от корня к узлу 7, не содержащие узлов со значением 3") + for path in res { + var vals: [Int] = [] + for node in path { + vals.append(node.val) + } + print(vals) + } + } +} diff --git a/ru/codes/swift/chapter_backtracking/subset_sum_i.swift b/ru/codes/swift/chapter_backtracking/subset_sum_i.swift new file mode 100644 index 000000000..76421baaf --- /dev/null +++ b/ru/codes/swift/chapter_backtracking/subset_sum_i.swift @@ -0,0 +1,53 @@ +/** + * File: subset_sum_i.swift + * Created Time: 2023-07-02 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +func backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) { + // Если сумма подмножества равна target, записать решение + if target == 0 { + res.append(state) + return + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + for i in choices.indices.dropFirst(start) { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if target - choices[i] < 0 { + break + } + // Попытка: сделать выбор и обновить target и start + state.append(choices[i]) + // Перейти к следующему выбору + backtrack(state: &state, target: target - choices[i], choices: choices, start: i, res: &res) + // Откат: отменить выбор и восстановить предыдущее состояние + state.removeLast() + } +} + +/* Решить задачу суммы подмножеств I */ +func subsetSumI(nums: [Int], target: Int) -> [[Int]] { + var state: [Int] = [] // Состояние (подмножество) + let nums = nums.sorted() // Отсортировать nums + let start = 0 // Стартовая вершина обхода + var res: [[Int]] = [] // Список результатов (список подмножеств) + backtrack(state: &state, target: target, choices: nums, start: start, res: &res) + return res +} + +@main +enum SubsetSumI { + /* Driver Code */ + static func main() { + let nums = [3, 4, 5] + let target = 9 + + let res = subsetSumI(nums: nums, target: target) + + print("Входной массив nums = \(nums), target = \(target)") + print("Все подмножества с суммой \(target): res = \(res)") + } +} diff --git a/ru/codes/swift/chapter_backtracking/subset_sum_i_naive.swift b/ru/codes/swift/chapter_backtracking/subset_sum_i_naive.swift new file mode 100644 index 000000000..a56d23a09 --- /dev/null +++ b/ru/codes/swift/chapter_backtracking/subset_sum_i_naive.swift @@ -0,0 +1,51 @@ +/** + * File: subset_sum_i_naive.swift + * Created Time: 2023-07-02 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +func backtrack(state: inout [Int], target: Int, total: Int, choices: [Int], res: inout [[Int]]) { + // Если сумма подмножества равна target, записать решение + if total == target { + res.append(state) + return + } + // Перебор всех вариантов выбора + for i in choices.indices { + // Отсечение: если сумма подмножества превышает target, пропустить этот выбор + if total + choices[i] > target { + continue + } + // Попытка: сделать выбор и обновить элемент и total + state.append(choices[i]) + // Перейти к следующему выбору + backtrack(state: &state, target: target, total: total + choices[i], choices: choices, res: &res) + // Откат: отменить выбор и восстановить предыдущее состояние + state.removeLast() + } +} + +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */ +func subsetSumINaive(nums: [Int], target: Int) -> [[Int]] { + var state: [Int] = [] // Состояние (подмножество) + let total = 0 // Сумма подмножеств + var res: [[Int]] = [] // Список результатов (список подмножеств) + backtrack(state: &state, target: target, total: total, choices: nums, res: &res) + return res +} + +@main +enum SubsetSumINaive { + /* Driver Code */ + static func main() { + let nums = [3, 4, 5] + let target = 9 + + let res = subsetSumINaive(nums: nums, target: target) + + print("Входной массив nums = \(nums), target = \(target)") + print("Все подмножества с суммой \(target): res = \(res)") + print("Обратите внимание: результат этого метода содержит повторяющиеся множества") + } +} diff --git a/ru/codes/swift/chapter_backtracking/subset_sum_ii.swift b/ru/codes/swift/chapter_backtracking/subset_sum_ii.swift new file mode 100644 index 000000000..a99cdb9b7 --- /dev/null +++ b/ru/codes/swift/chapter_backtracking/subset_sum_ii.swift @@ -0,0 +1,58 @@ +/** + * File: subset_sum_ii.swift + * Created Time: 2023-07-02 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Алгоритм бэктрекинга: сумма подмножеств II */ +func backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) { + // Если сумма подмножества равна target, записать решение + if target == 0 { + res.append(state) + return + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента + for i in choices.indices.dropFirst(start) { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if target - choices[i] < 0 { + break + } + // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить + if i > start, choices[i] == choices[i - 1] { + continue + } + // Попытка: сделать выбор и обновить target и start + state.append(choices[i]) + // Перейти к следующему выбору + backtrack(state: &state, target: target - choices[i], choices: choices, start: i + 1, res: &res) + // Откат: отменить выбор и восстановить предыдущее состояние + state.removeLast() + } +} + +/* Решить задачу суммы подмножеств II */ +func subsetSumII(nums: [Int], target: Int) -> [[Int]] { + var state: [Int] = [] // Состояние (подмножество) + let nums = nums.sorted() // Отсортировать nums + let start = 0 // Стартовая вершина обхода + var res: [[Int]] = [] // Список результатов (список подмножеств) + backtrack(state: &state, target: target, choices: nums, start: start, res: &res) + return res +} + +@main +enum SubsetSumII { + /* Driver Code */ + static func main() { + let nums = [4, 4, 5] + let target = 9 + + let res = subsetSumII(nums: nums, target: target) + + print("Входной массив nums = \(nums), target = \(target)") + print("Все подмножества с суммой \(target): res = \(res)") + } +} diff --git a/ru/codes/swift/chapter_computational_complexity/iteration.swift b/ru/codes/swift/chapter_computational_complexity/iteration.swift new file mode 100644 index 000000000..0287d5c3e --- /dev/null +++ b/ru/codes/swift/chapter_computational_complexity/iteration.swift @@ -0,0 +1,75 @@ +/** + * File: iteration.swift + * Created Time: 2023-09-02 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Цикл for */ +func forLoop(n: Int) -> Int { + var res = 0 + // Циклическое суммирование 1, 2, ..., n-1, n + for i in 1 ... n { + res += i + } + return res +} + +/* Цикл while */ +func whileLoop(n: Int) -> Int { + var res = 0 + var i = 1 // Инициализация условной переменной + // Циклическое суммирование 1, 2, ..., n-1, n + while i <= n { + res += i + i += 1 // Обновить условную переменную + } + return res +} + +/* Цикл while (двойное обновление) */ +func whileLoopII(n: Int) -> Int { + var res = 0 + var i = 1 // Инициализация условной переменной + // Циклическое суммирование 1, 4, 10, ... + while i <= n { + res += i + // Обновить условную переменную + i += 1 + i *= 2 + } + return res +} + +/* Двойной цикл for */ +func nestedForLoop(n: Int) -> String { + var res = "" + // Цикл по i = 1, 2, ..., n-1, n + for i in 1 ... n { + // Цикл по j = 1, 2, ..., n-1, n + for j in 1 ... n { + res.append("(\(i), \(j)), ") + } + } + return res +} + +@main +enum Iteration { + /* Driver Code */ + static func main() { + let n = 5 + var res = 0 + + res = forLoop(n: n) + print("\nРезультат суммирования в цикле for res = \(res)") + + res = whileLoop(n: n) + print("\nРезультат суммирования в цикле while res = \(res)") + + res = whileLoopII(n: n) + print("\nРезультат суммирования в цикле while (двойное обновление) res = \(res)") + + let resStr = nestedForLoop(n: n) + print("\nРезультат обхода в двойном цикле for \(resStr)") + } +} diff --git a/ru/codes/swift/chapter_computational_complexity/recursion.swift b/ru/codes/swift/chapter_computational_complexity/recursion.swift new file mode 100644 index 000000000..155cd8fbe --- /dev/null +++ b/ru/codes/swift/chapter_computational_complexity/recursion.swift @@ -0,0 +1,79 @@ +/** + * File: recursion.swift + * Created Time: 2023-09-02 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Рекурсия */ +func recur(n: Int) -> Int { + // Условие завершения + if n == 1 { + return 1 + } + // Рекурсия: рекурсивный вызов + let res = recur(n: n - 1) + // Возврат: вернуть результат + return n + res +} + +/* Имитация рекурсии итерацией */ +func forLoopRecur(n: Int) -> Int { + // Использовать явный стек для имитации системного стека вызовов + var stack: [Int] = [] + var res = 0 + // Рекурсия: рекурсивный вызов + for i in (1 ... n).reversed() { + // Имитировать «рекурсию» с помощью операции помещения в стек + stack.append(i) + } + // Возврат: вернуть результат + while !stack.isEmpty { + // Имитировать «возврат» с помощью операции извлечения из стека + res += stack.removeLast() + } + // res = 1+2+3+...+n + return res +} + +/* Хвостовая рекурсия */ +func tailRecur(n: Int, res: Int) -> Int { + // Условие завершения + if n == 0 { + return res + } + // Хвостовой рекурсивный вызов + return tailRecur(n: n - 1, res: res + n) +} + +/* Последовательность Фибоначчи: рекурсия */ +func fib(n: Int) -> Int { + // Условие завершения: f(1) = 0, f(2) = 1 + if n == 1 || n == 2 { + return n - 1 + } + // Рекурсивный вызов f(n) = f(n-1) + f(n-2) + let res = fib(n: n - 1) + fib(n: n - 2) + // Вернуть результат f(n) + return res +} + +@main +enum Recursion { + /* Driver Code */ + static func main() { + let n = 5 + var res = 0 + + res = recursion.recur(n: n) + print("\nРезультат суммирования в рекурсивной функции res = \(res)") + + res = recursion.forLoopRecur(n: n) + print("\nРезультат суммирования при имитации рекурсии res = \(res)") + + res = recursion.tailRecur(n: n, res: 0) + print("\nРезультат суммирования в хвостовой рекурсии res = \(res)") + + res = recursion.fib(n: n) + print("\nЧлен последовательности Фибоначчи с номером \(n) = \(res)") + } +} diff --git a/ru/codes/swift/chapter_computational_complexity/space_complexity.swift b/ru/codes/swift/chapter_computational_complexity/space_complexity.swift new file mode 100644 index 000000000..ad3d890bd --- /dev/null +++ b/ru/codes/swift/chapter_computational_complexity/space_complexity.swift @@ -0,0 +1,98 @@ +/** + * File: space_complexity.swift + * Created Time: 2023-01-01 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Функция */ +@discardableResult +func function() -> Int { + // Выполнить некоторые операции + return 0 +} + +/* Постоянная сложность */ +func constant(n: Int) { + // Константы, переменные и объекты занимают O(1) памяти + let a = 0 + var b = 0 + let nums = Array(repeating: 0, count: 10000) + let node = ListNode(x: 0) + // Переменные в цикле занимают O(1) памяти + for _ in 0 ..< n { + let c = 0 + } + // Функции в цикле занимают O(1) памяти + for _ in 0 ..< n { + function() + } +} + +/* Линейная сложность */ +func linear(n: Int) { + // Массив длины n занимает O(n) памяти + let nums = Array(repeating: 0, count: n) + // Список длины n занимает O(n) памяти + let nodes = (0 ..< n).map { ListNode(x: $0) } + // Хеш-таблица длины n занимает O(n) памяти + let map = Dictionary(uniqueKeysWithValues: (0 ..< n).map { ($0, "\($0)") }) +} + +/* Линейная сложность (рекурсивная реализация) */ +func linearRecur(n: Int) { + print("Рекурсия n = \(n)") + if n == 1 { + return + } + linearRecur(n: n - 1) +} + +/* Квадратичная сложность */ +func quadratic(n: Int) { + // Двумерный список занимает O(n^2) памяти + let numList = Array(repeating: Array(repeating: 0, count: n), count: n) +} + +/* Квадратичная сложность (рекурсивная реализация) */ +@discardableResult +func quadraticRecur(n: Int) -> Int { + if n <= 0 { + return 0 + } + // Длина массива nums равна n, n-1, ..., 2, 1 + let nums = Array(repeating: 0, count: n) + print("В рекурсии n = \(n), длина nums = \(nums.count)") + return quadraticRecur(n: n - 1) +} + +/* Экспоненциальная сложность (построение полного двоичного дерева) */ +func buildTree(n: Int) -> TreeNode? { + if n == 0 { + return nil + } + let root = TreeNode(x: 0) + root.left = buildTree(n: n - 1) + root.right = buildTree(n: n - 1) + return root +} + +@main +enum SpaceComplexity { + /* Driver Code */ + static func main() { + let n = 5 + // Постоянная сложность + constant(n: n) + // Линейная сложность + linear(n: n) + linearRecur(n: n) + // Квадратичная сложность + quadratic(n: n) + quadraticRecur(n: n) + // Экспоненциальная сложность + let root = buildTree(n: n) + PrintUtil.printTree(root: root) + } +} diff --git a/ru/codes/swift/chapter_computational_complexity/time_complexity.swift b/ru/codes/swift/chapter_computational_complexity/time_complexity.swift new file mode 100644 index 000000000..16de375fd --- /dev/null +++ b/ru/codes/swift/chapter_computational_complexity/time_complexity.swift @@ -0,0 +1,172 @@ +/** + * File: time_complexity.swift + * Created Time: 2022-12-26 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Постоянная сложность */ +func constant(n: Int) -> Int { + var count = 0 + let size = 100_000 + for _ in 0 ..< size { + count += 1 + } + return count +} + +/* Линейная сложность */ +func linear(n: Int) -> Int { + var count = 0 + for _ in 0 ..< n { + count += 1 + } + return count +} + +/* Линейная сложность (обход массива) */ +func arrayTraversal(nums: [Int]) -> Int { + var count = 0 + // Число итераций пропорционально длине массива + for _ in nums { + count += 1 + } + return count +} + +/* Квадратичная сложность */ +func quadratic(n: Int) -> Int { + var count = 0 + // Число итераций квадратично зависит от размера данных n + for _ in 0 ..< n { + for _ in 0 ..< n { + count += 1 + } + } + return count +} + +/* Квадратичная сложность (пузырьковая сортировка) */ +func bubbleSort(nums: inout [Int]) -> Int { + var count = 0 // Счетчик + // Внешний цикл: неотсортированный диапазон [0, i] + for i in nums.indices.dropFirst().reversed() { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for j in 0 ..< i { + if nums[j] > nums[j + 1] { + // Поменять местами nums[j] и nums[j + 1] + let tmp = nums[j] + nums[j] = nums[j + 1] + nums[j + 1] = tmp + count += 3 // Обмен элементов включает 3 элементарные операции + } + } + } + return count +} + +/* Экспоненциальная сложность (итеративная реализация) */ +func exponential(n: Int) -> Int { + var count = 0 + var base = 1 + // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1) + for _ in 0 ..< n { + for _ in 0 ..< base { + count += 1 + } + base *= 2 + } + // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1 + return count +} + +/* Экспоненциальная сложность (рекурсивная реализация) */ +func expRecur(n: Int) -> Int { + if n == 1 { + return 1 + } + return expRecur(n: n - 1) + expRecur(n: n - 1) + 1 +} + +/* Логарифмическая сложность (итеративная реализация) */ +func logarithmic(n: Int) -> Int { + var count = 0 + var n = n + while n > 1 { + n = n / 2 + count += 1 + } + return count +} + +/* Логарифмическая сложность (рекурсивная реализация) */ +func logRecur(n: Int) -> Int { + if n <= 1 { + return 0 + } + return logRecur(n: n / 2) + 1 +} + +/* Линейно-логарифмическая сложность */ +func linearLogRecur(n: Int) -> Int { + if n <= 1 { + return 1 + } + var count = linearLogRecur(n: n / 2) + linearLogRecur(n: n / 2) + for _ in stride(from: 0, to: n, by: 1) { + count += 1 + } + return count +} + +/* Факториальная сложность (рекурсивная реализация) */ +func factorialRecur(n: Int) -> Int { + if n == 0 { + return 1 + } + var count = 0 + // Из одного получается n + for _ in 0 ..< n { + count += factorialRecur(n: n - 1) + } + return count +} + +@main +enum TimeComplexity { + /* Driver Code */ + static func main() { + // Можно изменить n и запустить программу, чтобы увидеть, как меняется число операций при разных сложностях + let n = 8 + print("Размер входных данных n = \(n)") + + var count = constant(n: n) + print("Число операций константной сложности = \(count)") + + count = linear(n: n) + print("Число операций линейной сложности = \(count)") + count = arrayTraversal(nums: Array(repeating: 0, count: n)) + print("Число операций линейной сложности (обход массива) = \(count)") + + count = quadratic(n: n) + print("Число операций квадратичной сложности = \(count)") + var nums = Array(stride(from: n, to: 0, by: -1)) // [n,n-1,...,2,1] + count = bubbleSort(nums: &nums) + print("Число операций квадратичной сложности (пузырьковая сортировка) = \(count)") + + count = exponential(n: n) + print("Число операций экспоненциальной сложности (итеративная реализация) = \(count)") + count = expRecur(n: n) + print("Число операций экспоненциальной сложности (рекурсивная реализация) = \(count)") + + count = logarithmic(n: n) + print("Число операций логарифмической сложности (итеративная реализация) = \(count)") + count = logRecur(n: n) + print("Число операций логарифмической сложности (рекурсивная реализация) = \(count)") + + count = linearLogRecur(n: n) + print("Число операций линейно-логарифмической сложности (рекурсивная реализация) = \(count)") + + count = factorialRecur(n: n) + print("Число операций факториальной сложности (рекурсивная реализация) = \(count)") + } +} diff --git a/ru/codes/swift/chapter_computational_complexity/worst_best_time_complexity.swift b/ru/codes/swift/chapter_computational_complexity/worst_best_time_complexity.swift new file mode 100644 index 000000000..442500584 --- /dev/null +++ b/ru/codes/swift/chapter_computational_complexity/worst_best_time_complexity.swift @@ -0,0 +1,40 @@ +/** + * File: worst_best_time_complexity.swift + * Created Time: 2022-12-26 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */ +func randomNumbers(n: Int) -> [Int] { + // Создать массив nums = { 1, 2, 3, ..., n } + var nums = Array(1 ... n) + // Случайно перемешать элементы массива + nums.shuffle() + return nums +} + +/* Найти индекс числа 1 в массиве nums */ +func findOne(nums: [Int]) -> Int { + for i in nums.indices { + // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1) + // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n) + if nums[i] == 1 { + return i + } + } + return -1 +} + +@main +enum WorstBestTimeComplexity { + /* Driver Code */ + static func main() { + for _ in 0 ..< 10 { + let n = 100 + let nums = randomNumbers(n: n) + let index = findOne(nums: nums) + print("Массив [1, 2, ..., n] после перемешивания = \(nums)") + print("Индекс числа 1 = \(index)") + } + } +} diff --git a/ru/codes/swift/chapter_divide_and_conquer/binary_search_recur.swift b/ru/codes/swift/chapter_divide_and_conquer/binary_search_recur.swift new file mode 100644 index 000000000..10e5667fc --- /dev/null +++ b/ru/codes/swift/chapter_divide_and_conquer/binary_search_recur.swift @@ -0,0 +1,44 @@ +/** + * File: binary_search_recur.swift + * Created Time: 2023-09-02 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Бинарный поиск: задача f(i, j) */ +func dfs(nums: [Int], target: Int, i: Int, j: Int) -> Int { + // Если интервал пуст, целевой элемент отсутствует, вернуть -1 + if i > j { + return -1 + } + // Вычислить индекс середины m + let m = (i + j) / 2 + if nums[m] < target { + // Рекурсивная подзадача f(m+1, j) + return dfs(nums: nums, target: target, i: m + 1, j: j) + } else if nums[m] > target { + // Рекурсивная подзадача f(i, m-1) + return dfs(nums: nums, target: target, i: i, j: m - 1) + } else { + // Целевой элемент найден, вернуть его индекс + return m + } +} + +/* Бинарный поиск */ +func binarySearch(nums: [Int], target: Int) -> Int { + // Решить задачу f(0, n-1) + dfs(nums: nums, target: target, i: nums.startIndex, j: nums.endIndex - 1) +} + +@main +enum BinarySearchRecur { + /* Driver Code */ + static func main() { + let target = 6 + let nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35] + + // Бинарный поиск (двусторонне замкнутый интервал) + let index = binarySearch(nums: nums, target: target) + print("Индекс целевого элемента 6 = \(index)") + } +} diff --git a/ru/codes/swift/chapter_divide_and_conquer/build_tree.swift b/ru/codes/swift/chapter_divide_and_conquer/build_tree.swift new file mode 100644 index 000000000..a68a3a2cc --- /dev/null +++ b/ru/codes/swift/chapter_divide_and_conquer/build_tree.swift @@ -0,0 +1,47 @@ +/** + * File: build_tree.swift + * Created Time: 2023-09-02 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Построить двоичное дерево: разделяй и властвуй */ +func dfs(preorder: [Int], inorderMap: [Int: Int], i: Int, l: Int, r: Int) -> TreeNode? { + // Завершить при пустом диапазоне поддерева + if r - l < 0 { + return nil + } + // Инициализировать корневой узел + let root = TreeNode(x: preorder[i]) + // Найти m, чтобы разделить левое и правое поддеревья + let m = inorderMap[preorder[i]]! + // Подзадача: построить левое поддерево + root.left = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1, l: l, r: m - 1) + // Подзадача: построить правое поддерево + root.right = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1 + m - l, l: m + 1, r: r) + // Вернуть корневой узел + return root +} + +/* Построить двоичное дерево */ +func buildTree(preorder: [Int], inorder: [Int]) -> TreeNode? { + // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам + let inorderMap = inorder.enumerated().reduce(into: [:]) { $0[$1.element] = $1.offset } + return dfs(preorder: preorder, inorderMap: inorderMap, i: inorder.startIndex, l: inorder.startIndex, r: inorder.endIndex - 1) +} + +@main +enum BuildTree { + /* Driver Code */ + static func main() { + let preorder = [3, 9, 2, 1, 7] + let inorder = [9, 3, 1, 2, 7] + print("Предварительный обход = \(preorder)") + print("Симметричный обход = \(inorder)") + + let root = buildTree(preorder: preorder, inorder: inorder) + print("Построенное двоичное дерево:") + PrintUtil.printTree(root: root) + } +} diff --git a/ru/codes/swift/chapter_divide_and_conquer/hanota.swift b/ru/codes/swift/chapter_divide_and_conquer/hanota.swift new file mode 100644 index 000000000..3beb234f7 --- /dev/null +++ b/ru/codes/swift/chapter_divide_and_conquer/hanota.swift @@ -0,0 +1,58 @@ +/** + * File: hanota.swift + * Created Time: 2023-09-02 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Переместить один диск */ +func move(src: inout [Int], tar: inout [Int]) { + // Снять диск с вершины src + let pan = src.popLast()! + // Положить диск на вершину tar + tar.append(pan) +} + +/* Решить задачу Ханойской башни f(i) */ +func dfs(i: Int, src: inout [Int], buf: inout [Int], tar: inout [Int]) { + // Если в src остался только один диск, сразу переместить его в tar + if i == 1 { + move(src: &src, tar: &tar) + return + } + // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar + dfs(i: i - 1, src: &src, buf: &tar, tar: &buf) + // Подзадача f(1): переместить оставшийся один диск из src в tar + move(src: &src, tar: &tar) + // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src + dfs(i: i - 1, src: &buf, buf: &src, tar: &tar) +} + +/* Решить задачу Ханойской башни */ +func solveHanota(A: inout [Int], B: inout [Int], C: inout [Int]) { + let n = A.count + // Хвост списка соответствует вершине столбца + // Переместить верхние n дисков из src в C с помощью B + dfs(i: n, src: &A, buf: &B, tar: &C) +} + +@main +enum Hanota { + /* Driver Code */ + static func main() { + // Хвост списка соответствует вершине столбца + var A = [5, 4, 3, 2, 1] + var B: [Int] = [] + var C: [Int] = [] + print("Исходное состояние:") + print("A = \(A)") + print("B = \(B)") + print("C = \(C)") + + solveHanota(A: &A, B: &B, C: &C) + + print("После завершения перемещения дисков:") + print("A = \(A)") + print("B = \(B)") + print("C = \(C)") + } +} diff --git a/ru/codes/swift/chapter_dynamic_programming/climbing_stairs_backtrack.swift b/ru/codes/swift/chapter_dynamic_programming/climbing_stairs_backtrack.swift new file mode 100644 index 000000000..99dad8598 --- /dev/null +++ b/ru/codes/swift/chapter_dynamic_programming/climbing_stairs_backtrack.swift @@ -0,0 +1,44 @@ +/** + * File: climbing_stairs_backtrack.swift + * Created Time: 2023-07-15 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Бэктрекинг */ +func backtrack(choices: [Int], state: Int, n: Int, res: inout [Int]) { + // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1 + if state == n { + res[0] += 1 + } + // Перебор всех вариантов выбора + for choice in choices { + // Отсечение: нельзя выходить за n-ю ступень + if state + choice > n { + continue + } + // Попытка: сделать выбор и обновить состояние + backtrack(choices: choices, state: state + choice, n: n, res: &res) + // Откат + } +} + +/* Подъем по лестнице: бэктрекинг */ +func climbingStairsBacktrack(n: Int) -> Int { + let choices = [1, 2] // Можно подняться на 1 или 2 ступени + let state = 0 // Начать подъем с 0-й ступени + var res: [Int] = [] + res.append(0) // Использовать res[0] для хранения числа решений + backtrack(choices: choices, state: state, n: n, res: &res) + return res[0] +} + +@main +enum ClimbingStairsBacktrack { + /* Driver Code */ + static func main() { + let n = 9 + + let res = climbingStairsBacktrack(n: n) + print("Количество способов подняться по лестнице из \(n) ступеней = \(res)") + } +} diff --git a/ru/codes/swift/chapter_dynamic_programming/climbing_stairs_constraint_dp.swift b/ru/codes/swift/chapter_dynamic_programming/climbing_stairs_constraint_dp.swift new file mode 100644 index 000000000..f0bdb15d5 --- /dev/null +++ b/ru/codes/swift/chapter_dynamic_programming/climbing_stairs_constraint_dp.swift @@ -0,0 +1,36 @@ +/** + * File: climbing_stairs_constraint_dp.swift + * Created Time: 2023-07-15 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Подъем по лестнице с ограничениями: динамическое программирование */ +func climbingStairsConstraintDP(n: Int) -> Int { + if n == 1 || n == 2 { + return 1 + } + // Инициализация таблицы dp для хранения решений подзадач + var dp = Array(repeating: Array(repeating: 0, count: 3), count: n + 1) + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1][1] = 1 + dp[1][2] = 0 + dp[2][1] = 0 + dp[2][2] = 1 + // Переход состояний: постепенное решение больших подзадач через меньшие + for i in 3 ... n { + dp[i][1] = dp[i - 1][2] + dp[i][2] = dp[i - 2][1] + dp[i - 2][2] + } + return dp[n][1] + dp[n][2] +} + +@main +enum ClimbingStairsConstraintDP { + /* Driver Code */ + static func main() { + let n = 9 + + let res = climbingStairsConstraintDP(n: n) + print("Количество способов подняться по лестнице из \(n) ступеней = \(res)") + } +} diff --git a/ru/codes/swift/chapter_dynamic_programming/climbing_stairs_dfs.swift b/ru/codes/swift/chapter_dynamic_programming/climbing_stairs_dfs.swift new file mode 100644 index 000000000..31dc58064 --- /dev/null +++ b/ru/codes/swift/chapter_dynamic_programming/climbing_stairs_dfs.swift @@ -0,0 +1,32 @@ +/** + * File: climbing_stairs_dfs.swift + * Created Time: 2023-07-15 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Поиск */ +func dfs(i: Int) -> Int { + // dp[1] и dp[2] уже известны, вернуть их + if i == 1 || i == 2 { + return i + } + // dp[i] = dp[i-1] + dp[i-2] + let count = dfs(i: i - 1) + dfs(i: i - 2) + return count +} + +/* Подъем по лестнице: поиск */ +func climbingStairsDFS(n: Int) -> Int { + dfs(i: n) +} + +@main +enum ClimbingStairsDFS { + /* Driver Code */ + static func main() { + let n = 9 + + let res = climbingStairsDFS(n: n) + print("Количество способов подняться по лестнице из \(n) ступеней = \(res)") + } +} diff --git a/ru/codes/swift/chapter_dynamic_programming/climbing_stairs_dfs_mem.swift b/ru/codes/swift/chapter_dynamic_programming/climbing_stairs_dfs_mem.swift new file mode 100644 index 000000000..2d1d0a66d --- /dev/null +++ b/ru/codes/swift/chapter_dynamic_programming/climbing_stairs_dfs_mem.swift @@ -0,0 +1,40 @@ +/** + * File: climbing_stairs_dfs_mem.swift + * Created Time: 2023-07-15 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Поиск с мемоизацией */ +func dfs(i: Int, mem: inout [Int]) -> Int { + // dp[1] и dp[2] уже известны, вернуть их + if i == 1 || i == 2 { + return i + } + // Если запись dp[i] существует, сразу вернуть ее + if mem[i] != -1 { + return mem[i] + } + // dp[i] = dp[i-1] + dp[i-2] + let count = dfs(i: i - 1, mem: &mem) + dfs(i: i - 2, mem: &mem) + // Сохранить dp[i] + mem[i] = count + return count +} + +/* Подъем по лестнице: поиск с мемоизацией */ +func climbingStairsDFSMem(n: Int) -> Int { + // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи + var mem = Array(repeating: -1, count: n + 1) + return dfs(i: n, mem: &mem) +} + +@main +enum ClimbingStairsDFSMem { + /* Driver Code */ + static func main() { + let n = 9 + + let res = climbingStairsDFSMem(n: n) + print("Количество способов подняться по лестнице из \(n) ступеней = \(res)") + } +} diff --git a/ru/codes/swift/chapter_dynamic_programming/climbing_stairs_dp.swift b/ru/codes/swift/chapter_dynamic_programming/climbing_stairs_dp.swift new file mode 100644 index 000000000..86f59dc69 --- /dev/null +++ b/ru/codes/swift/chapter_dynamic_programming/climbing_stairs_dp.swift @@ -0,0 +1,49 @@ +/** + * File: climbing_stairs_dp.swift + * Created Time: 2023-07-15 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Подъем по лестнице: динамическое программирование */ +func climbingStairsDP(n: Int) -> Int { + if n == 1 || n == 2 { + return n + } + // Инициализация таблицы dp для хранения решений подзадач + var dp = Array(repeating: 0, count: n + 1) + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = 1 + dp[2] = 2 + // Переход состояний: постепенное решение больших подзадач через меньшие + for i in 3 ... n { + dp[i] = dp[i - 1] + dp[i - 2] + } + return dp[n] +} + +/* Подъем по лестнице: динамическое программирование с оптимизацией памяти */ +func climbingStairsDPComp(n: Int) -> Int { + if n == 1 || n == 2 { + return n + } + var a = 1 + var b = 2 + for _ in 3 ... n { + (a, b) = (b, a + b) + } + return b +} + +@main +enum ClimbingStairsDP { + /* Driver Code */ + static func main() { + let n = 9 + + var res = climbingStairsDP(n: n) + print("Количество способов подняться по лестнице из \(n) ступеней = \(res)") + + res = climbingStairsDPComp(n: n) + print("Количество способов подняться по лестнице из \(n) ступеней = \(res)") + } +} diff --git a/ru/codes/swift/chapter_dynamic_programming/coin_change.swift b/ru/codes/swift/chapter_dynamic_programming/coin_change.swift new file mode 100644 index 000000000..089945a7d --- /dev/null +++ b/ru/codes/swift/chapter_dynamic_programming/coin_change.swift @@ -0,0 +1,69 @@ +/** + * File: coin_change.swift + * Created Time: 2023-07-15 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Размен монет: динамическое программирование */ +func coinChangeDP(coins: [Int], amt: Int) -> Int { + let n = coins.count + let MAX = amt + 1 + // Инициализация таблицы dp + var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1) + // Переход состояний: первая строка и первый столбец + for a in 1 ... amt { + dp[0][a] = MAX + } + // Переход состояний: остальные строки и столбцы + for i in 1 ... n { + for a in 1 ... amt { + if coins[i - 1] > a { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a] + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1) + } + } + } + return dp[n][amt] != MAX ? dp[n][amt] : -1 +} + +/* Размен монет: динамическое программирование с оптимизацией памяти */ +func coinChangeDPComp(coins: [Int], amt: Int) -> Int { + let n = coins.count + let MAX = amt + 1 + // Инициализация таблицы dp + var dp = Array(repeating: MAX, count: amt + 1) + dp[0] = 0 + // Переход состояний + for i in 1 ... n { + for a in 1 ... amt { + if coins[i - 1] > a { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a] + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1) + } + } + } + return dp[amt] != MAX ? dp[amt] : -1 +} + +@main +enum CoinChange { + /* Driver Code */ + static func main() { + let coins = [1, 2, 5] + let amt = 4 + + // Динамическое программирование + var res = coinChangeDP(coins: coins, amt: amt) + print("Минимальное число монет для набора целевой суммы = \(res)") + + // Динамическое программирование с оптимизацией памяти + res = coinChangeDPComp(coins: coins, amt: amt) + print("Минимальное число монет для набора целевой суммы = \(res)") + } +} diff --git a/ru/codes/swift/chapter_dynamic_programming/coin_change_ii.swift b/ru/codes/swift/chapter_dynamic_programming/coin_change_ii.swift new file mode 100644 index 000000000..750b52344 --- /dev/null +++ b/ru/codes/swift/chapter_dynamic_programming/coin_change_ii.swift @@ -0,0 +1,67 @@ +/** + * File: coin_change_ii.swift + * Created Time: 2023-07-16 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Размен монет II: динамическое программирование */ +func coinChangeIIDP(coins: [Int], amt: Int) -> Int { + let n = coins.count + // Инициализация таблицы dp + var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1) + // Инициализация первого столбца + for i in 0 ... n { + dp[i][0] = 1 + } + // Переход состояний + for i in 1 ... n { + for a in 1 ... amt { + if coins[i - 1] > a { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a] + } else { + // Сумма двух решений: не брать или взять монету i + dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]] + } + } + } + return dp[n][amt] +} + +/* Размен монет II: динамическое программирование с оптимизацией памяти */ +func coinChangeIIDPComp(coins: [Int], amt: Int) -> Int { + let n = coins.count + // Инициализация таблицы dp + var dp = Array(repeating: 0, count: amt + 1) + dp[0] = 1 + // Переход состояний + for i in 1 ... n { + for a in 1 ... amt { + if coins[i - 1] > a { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a] + } else { + // Сумма двух решений: не брать или взять монету i + dp[a] = dp[a] + dp[a - coins[i - 1]] + } + } + } + return dp[amt] +} + +@main +enum CoinChangeII { + /* Driver Code */ + static func main() { + let coins = [1, 2, 5] + let amt = 5 + + // Динамическое программирование + var res = coinChangeIIDP(coins: coins, amt: amt) + print("Количество комбинаций монет для набора целевой суммы = \(res)") + + // Динамическое программирование с оптимизацией памяти + res = coinChangeIIDPComp(coins: coins, amt: amt) + print("Количество комбинаций монет для набора целевой суммы = \(res)") + } +} diff --git a/ru/codes/swift/chapter_dynamic_programming/edit_distance.swift b/ru/codes/swift/chapter_dynamic_programming/edit_distance.swift new file mode 100644 index 000000000..41ce6471f --- /dev/null +++ b/ru/codes/swift/chapter_dynamic_programming/edit_distance.swift @@ -0,0 +1,147 @@ +/** + * File: edit_distance.swift + * Created Time: 2023-07-16 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Редакционное расстояние: полный перебор */ +func editDistanceDFS(s: String, t: String, i: Int, j: Int) -> Int { + // Если s и t пусты, вернуть 0 + if i == 0, j == 0 { + return 0 + } + // Если s пусто, вернуть длину t + if i == 0 { + return j + } + // Если t пусто, вернуть длину s + if j == 0 { + return i + } + // Если два символа равны, сразу пропустить их + if s.utf8CString[i - 1] == t.utf8CString[j - 1] { + return editDistanceDFS(s: s, t: t, i: i - 1, j: j - 1) + } + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + let insert = editDistanceDFS(s: s, t: t, i: i, j: j - 1) + let delete = editDistanceDFS(s: s, t: t, i: i - 1, j: j) + let replace = editDistanceDFS(s: s, t: t, i: i - 1, j: j - 1) + // Вернуть минимальное число шагов редактирования + return min(min(insert, delete), replace) + 1 +} + +/* Редакционное расстояние: поиск с мемоизацией */ +func editDistanceDFSMem(s: String, t: String, mem: inout [[Int]], i: Int, j: Int) -> Int { + // Если s и t пусты, вернуть 0 + if i == 0, j == 0 { + return 0 + } + // Если s пусто, вернуть длину t + if i == 0 { + return j + } + // Если t пусто, вернуть длину s + if j == 0 { + return i + } + // Если запись уже есть, сразу вернуть ее + if mem[i][j] != -1 { + return mem[i][j] + } + // Если два символа равны, сразу пропустить их + if s.utf8CString[i - 1] == t.utf8CString[j - 1] { + return editDistanceDFS(s: s, t: t, i: i - 1, j: j - 1) + } + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + let insert = editDistanceDFS(s: s, t: t, i: i, j: j - 1) + let delete = editDistanceDFS(s: s, t: t, i: i - 1, j: j) + let replace = editDistanceDFS(s: s, t: t, i: i - 1, j: j - 1) + // Сохранить и вернуть минимальное число шагов редактирования + mem[i][j] = min(min(insert, delete), replace) + 1 + return mem[i][j] +} + +/* Редакционное расстояние: динамическое программирование */ +func editDistanceDP(s: String, t: String) -> Int { + let n = s.utf8CString.count + let m = t.utf8CString.count + var dp = Array(repeating: Array(repeating: 0, count: m + 1), count: n + 1) + // Переход состояний: первая строка и первый столбец + for i in 1 ... n { + dp[i][0] = i + } + for j in 1 ... m { + dp[0][j] = j + } + // Переход состояний: остальные строки и столбцы + for i in 1 ... n { + for j in 1 ... m { + if s.utf8CString[i - 1] == t.utf8CString[j - 1] { + // Если два символа равны, сразу пропустить их + dp[i][j] = dp[i - 1][j - 1] + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1 + } + } + } + return dp[n][m] +} + +/* Редакционное расстояние: динамическое программирование с оптимизацией памяти */ +func editDistanceDPComp(s: String, t: String) -> Int { + let n = s.utf8CString.count + let m = t.utf8CString.count + var dp = Array(repeating: 0, count: m + 1) + // Переход состояний: первая строка + for j in 1 ... m { + dp[j] = j + } + // Переход состояний: остальные строки + for i in 1 ... n { + // Переход состояний: первый столбец + var leftup = dp[0] // Временно сохранить dp[i-1, j-1] + dp[0] = i + // Переход состояний: остальные столбцы + for j in 1 ... m { + let temp = dp[j] + if s.utf8CString[i - 1] == t.utf8CString[j - 1] { + // Если два символа равны, сразу пропустить их + dp[j] = leftup + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1 + } + leftup = temp // Обновить до значения dp[i-1, j-1] для следующей итерации + } + } + return dp[m] +} + +@main +enum EditDistance { + /* Driver Code */ + static func main() { + let s = "bag" + let t = "pack" + let n = s.utf8CString.count + let m = t.utf8CString.count + + // Полный перебор + var res = editDistanceDFS(s: s, t: t, i: n, j: m) + print("Чтобы преобразовать \(s) в \(t), нужно минимум \(res) шагов") + + // Поиск с мемоизацией + var mem = Array(repeating: Array(repeating: -1, count: m + 1), count: n + 1) + res = editDistanceDFSMem(s: s, t: t, mem: &mem, i: n, j: m) + print("Чтобы преобразовать \(s) в \(t), нужно минимум \(res) шагов") + + // Динамическое программирование + res = editDistanceDP(s: s, t: t) + print("Чтобы преобразовать \(s) в \(t), нужно минимум \(res) шагов") + + // Динамическое программирование с оптимизацией памяти + res = editDistanceDPComp(s: s, t: t) + print("Чтобы преобразовать \(s) в \(t), нужно минимум \(res) шагов") + } +} diff --git a/ru/codes/swift/chapter_dynamic_programming/knapsack.swift b/ru/codes/swift/chapter_dynamic_programming/knapsack.swift new file mode 100644 index 000000000..ac1e9a808 --- /dev/null +++ b/ru/codes/swift/chapter_dynamic_programming/knapsack.swift @@ -0,0 +1,110 @@ +/** + * File: knapsack.swift + * Created Time: 2023-07-15 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Рюкзак 0-1: полный перебор */ +func knapsackDFS(wgt: [Int], val: [Int], i: Int, c: Int) -> Int { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if i == 0 || c == 0 { + return 0 + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if wgt[i - 1] > c { + return knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c) + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + let no = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c) + let yes = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c - wgt[i - 1]) + val[i - 1] + // Вернуть вариант с большей стоимостью из двух возможных + return max(no, yes) +} + +/* Рюкзак 0-1: поиск с мемоизацией */ +func knapsackDFSMem(wgt: [Int], val: [Int], mem: inout [[Int]], i: Int, c: Int) -> Int { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if i == 0 || c == 0 { + return 0 + } + // Если запись уже есть, вернуть сразу + if mem[i][c] != -1 { + return mem[i][c] + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if wgt[i - 1] > c { + return knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c) + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + let no = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c) + let yes = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c - wgt[i - 1]) + val[i - 1] + // Сохранить и вернуть вариант с большей стоимостью из двух решений + mem[i][c] = max(no, yes) + return mem[i][c] +} + +/* Рюкзак 0-1: динамическое программирование */ +func knapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int { + let n = wgt.count + // Инициализация таблицы dp + var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1) + // Переход состояний + for i in 1 ... n { + for c in 1 ... cap { + if wgt[i - 1] > c { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c] + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]) + } + } + } + return dp[n][cap] +} + +/* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */ +func knapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int { + let n = wgt.count + // Инициализация таблицы dp + var dp = Array(repeating: 0, count: cap + 1) + // Переход состояний + for i in 1 ... n { + // Обход в обратном порядке + for c in (1 ... cap).reversed() { + if wgt[i - 1] <= c { + // Большее из двух решений: не брать или взять предмет i + dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]) + } + } + } + return dp[cap] +} + +@main +enum Knapsack { + /* Driver Code */ + static func main() { + let wgt = [10, 20, 30, 40, 50] + let val = [50, 120, 150, 210, 240] + let cap = 50 + let n = wgt.count + + // Полный перебор + var res = knapsackDFS(wgt: wgt, val: val, i: n, c: cap) + print("Максимальная стоимость предметов без превышения вместимости рюкзака = \(res)") + + // Поиск с мемоизацией + var mem = Array(repeating: Array(repeating: -1, count: cap + 1), count: n + 1) + res = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: n, c: cap) + print("Максимальная стоимость предметов без превышения вместимости рюкзака = \(res)") + + // Динамическое программирование + res = knapsackDP(wgt: wgt, val: val, cap: cap) + print("Максимальная стоимость предметов без превышения вместимости рюкзака = \(res)") + + // Динамическое программирование с оптимизацией памяти + res = knapsackDPComp(wgt: wgt, val: val, cap: cap) + print("Максимальная стоимость предметов без превышения вместимости рюкзака = \(res)") + } +} diff --git a/ru/codes/swift/chapter_dynamic_programming/min_cost_climbing_stairs_dp.swift b/ru/codes/swift/chapter_dynamic_programming/min_cost_climbing_stairs_dp.swift new file mode 100644 index 000000000..9e43ee431 --- /dev/null +++ b/ru/codes/swift/chapter_dynamic_programming/min_cost_climbing_stairs_dp.swift @@ -0,0 +1,51 @@ +/** + * File: min_cost_climbing_stairs_dp.swift + * Created Time: 2023-07-15 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Минимальная стоимость подъема по лестнице: динамическое программирование */ +func minCostClimbingStairsDP(cost: [Int]) -> Int { + let n = cost.count - 1 + if n == 1 || n == 2 { + return cost[n] + } + // Инициализация таблицы dp для хранения решений подзадач + var dp = Array(repeating: 0, count: n + 1) + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = cost[1] + dp[2] = cost[2] + // Переход состояний: постепенное решение больших подзадач через меньшие + for i in 3 ... n { + dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i] + } + return dp[n] +} + +/* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */ +func minCostClimbingStairsDPComp(cost: [Int]) -> Int { + let n = cost.count - 1 + if n == 1 || n == 2 { + return cost[n] + } + var (a, b) = (cost[1], cost[2]) + for i in 3 ... n { + (a, b) = (b, min(a, b) + cost[i]) + } + return b +} + +@main +enum MinCostClimbingStairsDP { + /* Driver Code */ + static func main() { + let cost = [0, 1, 10, 1, 1, 1, 10, 1, 1, 10, 1] + print("Список стоимостей ступеней = \(cost)") + + var res = minCostClimbingStairsDP(cost: cost) + print("Минимальная стоимость подъема по лестнице = \(res)") + + res = minCostClimbingStairsDPComp(cost: cost) + print("Минимальная стоимость подъема по лестнице = \(res)") + } +} diff --git a/ru/codes/swift/chapter_dynamic_programming/min_path_sum.swift b/ru/codes/swift/chapter_dynamic_programming/min_path_sum.swift new file mode 100644 index 000000000..e43b4825e --- /dev/null +++ b/ru/codes/swift/chapter_dynamic_programming/min_path_sum.swift @@ -0,0 +1,123 @@ +/** + * File: min_path_sum.swift + * Created Time: 2023-07-15 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Минимальная сумма пути: полный перебор */ +func minPathSumDFS(grid: [[Int]], i: Int, j: Int) -> Int { + // Если это верхняя левая ячейка, завершить поиск + if i == 0, j == 0 { + return grid[0][0] + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if i < 0 || j < 0 { + return .max + } + // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1) + let up = minPathSumDFS(grid: grid, i: i - 1, j: j) + let left = minPathSumDFS(grid: grid, i: i, j: j - 1) + // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + return min(left, up) + grid[i][j] +} + +/* Минимальная сумма пути: поиск с мемоизацией */ +func minPathSumDFSMem(grid: [[Int]], mem: inout [[Int]], i: Int, j: Int) -> Int { + // Если это верхняя левая ячейка, завершить поиск + if i == 0, j == 0 { + return grid[0][0] + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if i < 0 || j < 0 { + return .max + } + // Если запись уже есть, вернуть сразу + if mem[i][j] != -1 { + return mem[i][j] + } + // Минимальная стоимость пути для левой и верхней ячеек + let up = minPathSumDFSMem(grid: grid, mem: &mem, i: i - 1, j: j) + let left = minPathSumDFSMem(grid: grid, mem: &mem, i: i, j: j - 1) + // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + mem[i][j] = min(left, up) + grid[i][j] + return mem[i][j] +} + +/* Минимальная сумма пути: динамическое программирование */ +func minPathSumDP(grid: [[Int]]) -> Int { + let n = grid.count + let m = grid[0].count + // Инициализация таблицы dp + var dp = Array(repeating: Array(repeating: 0, count: m), count: n) + dp[0][0] = grid[0][0] + // Переход состояний: первая строка + for j in 1 ..< m { + dp[0][j] = dp[0][j - 1] + grid[0][j] + } + // Переход состояний: первый столбец + for i in 1 ..< n { + dp[i][0] = dp[i - 1][0] + grid[i][0] + } + // Переход состояний: остальные строки и столбцы + for i in 1 ..< n { + for j in 1 ..< m { + dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j] + } + } + return dp[n - 1][m - 1] +} + +/* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */ +func minPathSumDPComp(grid: [[Int]]) -> Int { + let n = grid.count + let m = grid[0].count + // Инициализация таблицы dp + var dp = Array(repeating: 0, count: m) + // Переход состояний: первая строка + dp[0] = grid[0][0] + for j in 1 ..< m { + dp[j] = dp[j - 1] + grid[0][j] + } + // Переход состояний: остальные строки + for i in 1 ..< n { + // Переход состояний: первый столбец + dp[0] = dp[0] + grid[i][0] + // Переход состояний: остальные столбцы + for j in 1 ..< m { + dp[j] = min(dp[j - 1], dp[j]) + grid[i][j] + } + } + return dp[m - 1] +} + +@main +enum MinPathSum { + /* Driver Code */ + static func main() { + let grid = [ + [1, 3, 1, 5], + [2, 2, 4, 2], + [5, 3, 2, 1], + [4, 3, 5, 2], + ] + let n = grid.count + let m = grid[0].count + + // Полный перебор + var res = minPathSumDFS(grid: grid, i: n - 1, j: m - 1) + print("Минимальная сумма пути из левого верхнего угла в правый нижний = \(res)") + + // Поиск с мемоизацией + var mem = Array(repeating: Array(repeating: -1, count: m), count: n) + res = minPathSumDFSMem(grid: grid, mem: &mem, i: n - 1, j: m - 1) + print("Минимальная сумма пути из левого верхнего угла в правый нижний = \(res)") + + // Динамическое программирование + res = minPathSumDP(grid: grid) + print("Минимальная сумма пути из левого верхнего угла в правый нижний = \(res)") + + // Динамическое программирование с оптимизацией памяти + res = minPathSumDPComp(grid: grid) + print("Минимальная сумма пути из левого верхнего угла в правый нижний = \(res)") + } +} diff --git a/ru/codes/swift/chapter_dynamic_programming/unbounded_knapsack.swift b/ru/codes/swift/chapter_dynamic_programming/unbounded_knapsack.swift new file mode 100644 index 000000000..f4471bb91 --- /dev/null +++ b/ru/codes/swift/chapter_dynamic_programming/unbounded_knapsack.swift @@ -0,0 +1,63 @@ +/** + * File: unbounded_knapsack.swift + * Created Time: 2023-07-15 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Полный рюкзак: динамическое программирование */ +func unboundedKnapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int { + let n = wgt.count + // Инициализация таблицы dp + var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1) + // Переход состояний + for i in 1 ... n { + for c in 1 ... cap { + if wgt[i - 1] > c { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c] + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]) + } + } + } + return dp[n][cap] +} + +/* Полный рюкзак: динамическое программирование с оптимизацией памяти */ +func unboundedKnapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int { + let n = wgt.count + // Инициализация таблицы dp + var dp = Array(repeating: 0, count: cap + 1) + // Переход состояний + for i in 1 ... n { + for c in 1 ... cap { + if wgt[i - 1] > c { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c] + } else { + // Большее из двух решений: не брать или взять предмет i + dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]) + } + } + } + return dp[cap] +} + +@main +enum UnboundedKnapsack { + /* Driver Code */ + static func main() { + let wgt = [1, 2, 3] + let val = [5, 11, 15] + let cap = 4 + + // Динамическое программирование + var res = unboundedKnapsackDP(wgt: wgt, val: val, cap: cap) + print("Максимальная стоимость предметов без превышения вместимости рюкзака = \(res)") + + // Динамическое программирование с оптимизацией памяти + res = unboundedKnapsackDPComp(wgt: wgt, val: val, cap: cap) + print("Максимальная стоимость предметов без превышения вместимости рюкзака = \(res)") + } +} diff --git a/ru/codes/swift/chapter_graph/graph_adjacency_list.swift b/ru/codes/swift/chapter_graph/graph_adjacency_list.swift new file mode 100644 index 000000000..897bf6f63 --- /dev/null +++ b/ru/codes/swift/chapter_graph/graph_adjacency_list.swift @@ -0,0 +1,121 @@ +/** + * File: graph_adjacency_list.swift + * Created Time: 2023-02-01 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Класс неориентированного графа на основе списка смежности */ +public class GraphAdjList { + // Список смежности, где key — вершина, а value — все смежные ей вершины + public private(set) var adjList: [Vertex: [Vertex]] + + /* Конструктор */ + public init(edges: [[Vertex]]) { + adjList = [:] + // Добавить все вершины и ребра + for edge in edges { + addVertex(vet: edge[0]) + addVertex(vet: edge[1]) + addEdge(vet1: edge[0], vet2: edge[1]) + } + } + + /* Получить число вершин */ + public func size() -> Int { + adjList.count + } + + /* Добавление ребра */ + public func addEdge(vet1: Vertex, vet2: Vertex) { + if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 { + fatalError("Неверный аргумент") + } + // Добавить ребро vet1 - vet2 + adjList[vet1]?.append(vet2) + adjList[vet2]?.append(vet1) + } + + /* Удаление ребра */ + public func removeEdge(vet1: Vertex, vet2: Vertex) { + if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 { + fatalError("Неверный аргумент") + } + // Удалить ребро vet1 - vet2 + adjList[vet1]?.removeAll { $0 == vet2 } + adjList[vet2]?.removeAll { $0 == vet1 } + } + + /* Добавление вершины */ + public func addVertex(vet: Vertex) { + if adjList[vet] != nil { + return + } + // Добавить новый список в список смежности + adjList[vet] = [] + } + + /* Удаление вершины */ + public func removeVertex(vet: Vertex) { + if adjList[vet] == nil { + fatalError("Неверный аргумент") + } + // Удалить из списка смежности список, соответствующий вершине vet + adjList.removeValue(forKey: vet) + // Обойти списки других вершин и удалить все ребра, содержащие vet + for key in adjList.keys { + adjList[key]?.removeAll { $0 == vet } + } + } + + /* Вывести список смежности */ + public func print() { + Swift.print("Список смежности =") + for (vertex, list) in adjList { + let list = list.map { $0.val } + Swift.print("\(vertex.val): \(list),") + } + } +} + +#if !TARGET + +@main +enum GraphAdjacencyList { + /* Driver Code */ + static func main() { + /* Инициализация неориентированного графа */ + let v = Vertex.valsToVets(vals: [1, 3, 2, 5, 4]) + let 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]]] + let graph = GraphAdjList(edges: edges) + print("\nГраф после инициализации") + graph.print() + + /* Добавление ребра */ + // Вершины 1 и 2 соответствуют v[0] и v[2] + graph.addEdge(vet1: v[0], vet2: v[2]) + print("\nГраф после добавления ребра 1-2") + graph.print() + + /* Удаление ребра */ + // Вершины 1 и 3 соответствуют v[0] и v[1] + graph.removeEdge(vet1: v[0], vet2: v[1]) + print("\nГраф после удаления ребра 1-3") + graph.print() + + /* Добавление вершины */ + let v5 = Vertex(val: 6) + graph.addVertex(vet: v5) + print("\nГраф после добавления вершины 6") + graph.print() + + /* Удаление вершины */ + // Вершина 3 соответствует v[1] + graph.removeVertex(vet: v[1]) + print("\nГраф после удаления вершины 3") + graph.print() + } +} + +#endif diff --git a/ru/codes/swift/chapter_graph/graph_adjacency_list_target.swift b/ru/codes/swift/chapter_graph/graph_adjacency_list_target.swift new file mode 100644 index 000000000..897bf6f63 --- /dev/null +++ b/ru/codes/swift/chapter_graph/graph_adjacency_list_target.swift @@ -0,0 +1,121 @@ +/** + * File: graph_adjacency_list.swift + * Created Time: 2023-02-01 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Класс неориентированного графа на основе списка смежности */ +public class GraphAdjList { + // Список смежности, где key — вершина, а value — все смежные ей вершины + public private(set) var adjList: [Vertex: [Vertex]] + + /* Конструктор */ + public init(edges: [[Vertex]]) { + adjList = [:] + // Добавить все вершины и ребра + for edge in edges { + addVertex(vet: edge[0]) + addVertex(vet: edge[1]) + addEdge(vet1: edge[0], vet2: edge[1]) + } + } + + /* Получить число вершин */ + public func size() -> Int { + adjList.count + } + + /* Добавление ребра */ + public func addEdge(vet1: Vertex, vet2: Vertex) { + if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 { + fatalError("Неверный аргумент") + } + // Добавить ребро vet1 - vet2 + adjList[vet1]?.append(vet2) + adjList[vet2]?.append(vet1) + } + + /* Удаление ребра */ + public func removeEdge(vet1: Vertex, vet2: Vertex) { + if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 { + fatalError("Неверный аргумент") + } + // Удалить ребро vet1 - vet2 + adjList[vet1]?.removeAll { $0 == vet2 } + adjList[vet2]?.removeAll { $0 == vet1 } + } + + /* Добавление вершины */ + public func addVertex(vet: Vertex) { + if adjList[vet] != nil { + return + } + // Добавить новый список в список смежности + adjList[vet] = [] + } + + /* Удаление вершины */ + public func removeVertex(vet: Vertex) { + if adjList[vet] == nil { + fatalError("Неверный аргумент") + } + // Удалить из списка смежности список, соответствующий вершине vet + adjList.removeValue(forKey: vet) + // Обойти списки других вершин и удалить все ребра, содержащие vet + for key in adjList.keys { + adjList[key]?.removeAll { $0 == vet } + } + } + + /* Вывести список смежности */ + public func print() { + Swift.print("Список смежности =") + for (vertex, list) in adjList { + let list = list.map { $0.val } + Swift.print("\(vertex.val): \(list),") + } + } +} + +#if !TARGET + +@main +enum GraphAdjacencyList { + /* Driver Code */ + static func main() { + /* Инициализация неориентированного графа */ + let v = Vertex.valsToVets(vals: [1, 3, 2, 5, 4]) + let 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]]] + let graph = GraphAdjList(edges: edges) + print("\nГраф после инициализации") + graph.print() + + /* Добавление ребра */ + // Вершины 1 и 2 соответствуют v[0] и v[2] + graph.addEdge(vet1: v[0], vet2: v[2]) + print("\nГраф после добавления ребра 1-2") + graph.print() + + /* Удаление ребра */ + // Вершины 1 и 3 соответствуют v[0] и v[1] + graph.removeEdge(vet1: v[0], vet2: v[1]) + print("\nГраф после удаления ребра 1-3") + graph.print() + + /* Добавление вершины */ + let v5 = Vertex(val: 6) + graph.addVertex(vet: v5) + print("\nГраф после добавления вершины 6") + graph.print() + + /* Удаление вершины */ + // Вершина 3 соответствует v[1] + graph.removeVertex(vet: v[1]) + print("\nГраф после удаления вершины 3") + graph.print() + } +} + +#endif diff --git a/ru/codes/swift/chapter_graph/graph_adjacency_matrix.swift b/ru/codes/swift/chapter_graph/graph_adjacency_matrix.swift new file mode 100644 index 000000000..169c431fa --- /dev/null +++ b/ru/codes/swift/chapter_graph/graph_adjacency_matrix.swift @@ -0,0 +1,130 @@ +/** + * File: graph_adjacency_matrix.swift + * Created Time: 2023-02-01 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Класс неориентированного графа на основе матрицы смежности */ +class GraphAdjMat { + private var vertices: [Int] // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин» + private var adjMat: [[Int]] // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин» + + /* Конструктор */ + init(vertices: [Int], edges: [[Int]]) { + self.vertices = [] + adjMat = [] + // Добавление вершины + for val in vertices { + addVertex(val: val) + } + // Добавить ребра + // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices + for e in edges { + addEdge(i: e[0], j: e[1]) + } + } + + /* Получить число вершин */ + func size() -> Int { + vertices.count + } + + /* Добавление вершины */ + func addVertex(val: Int) { + let n = size() + // Добавить значение новой вершины в список вершин + vertices.append(val) + // Добавить строку в матрицу смежности + let newRow = Array(repeating: 0, count: n) + adjMat.append(newRow) + // Добавить столбец в матрицу смежности + for i in adjMat.indices { + adjMat[i].append(0) + } + } + + /* Удаление вершины */ + func removeVertex(index: Int) { + if index >= size() { + fatalError("Выход за границы диапазона") + } + // Удалить вершину с индексом index из списка вершин + vertices.remove(at: index) + // Удалить строку с индексом index из матрицы смежности + adjMat.remove(at: index) + // Удалить столбец с индексом index из матрицы смежности + for i in adjMat.indices { + adjMat[i].remove(at: index) + } + } + + /* Добавление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + func addEdge(i: Int, j: Int) { + // Обработка выхода индекса за границы и случая равенства + if i < 0 || j < 0 || i >= size() || j >= size() || i == j { + fatalError("Выход за границы диапазона") + } + // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i) + adjMat[i][j] = 1 + adjMat[j][i] = 1 + } + + /* Удаление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + func removeEdge(i: Int, j: Int) { + // Обработка выхода индекса за границы и случая равенства + if i < 0 || j < 0 || i >= size() || j >= size() || i == j { + fatalError("Выход за границы диапазона") + } + adjMat[i][j] = 0 + adjMat[j][i] = 0 + } + + /* Вывести матрицу смежности */ + func print() { + Swift.print("Список вершин = ", terminator: "") + Swift.print(vertices) + Swift.print("Матрица смежности =") + PrintUtil.printMatrix(matrix: adjMat) + } +} + +@main +enum GraphAdjacencyMatrix { + /* Driver Code */ + static func main() { + /* Инициализация неориентированного графа */ + // Обратите внимание: элементы edges представляют индексы вершин, то есть соответствуют индексам элементов vertices + let vertices = [1, 3, 2, 5, 4] + let edges = [[0, 1], [1, 2], [2, 3], [0, 3], [2, 4], [3, 4]] + let graph = GraphAdjMat(vertices: vertices, edges: edges) + print("\nГраф после инициализации") + graph.print() + + /* Добавление ребра */ + // Индексы вершин 1 и 2 равны 0 и 2 соответственно + graph.addEdge(i: 0, j: 2) + print("\nГраф после добавления ребра 1-2") + graph.print() + + /* Удаление ребра */ + // Индексы вершин 1 и 3 равны 0 и 1 соответственно + graph.removeEdge(i: 0, j: 1) + print("\nГраф после удаления ребра 1-3") + graph.print() + + /* Добавление вершины */ + graph.addVertex(val: 6) + print("\nГраф после добавления вершины 6") + graph.print() + + /* Удаление вершины */ + // Индекс вершины 3 равен 1 + graph.removeVertex(index: 1) + print("\nГраф после удаления вершины 3") + graph.print() + } +} diff --git a/ru/codes/swift/chapter_graph/graph_bfs.swift b/ru/codes/swift/chapter_graph/graph_bfs.swift new file mode 100644 index 000000000..e51288bd5 --- /dev/null +++ b/ru/codes/swift/chapter_graph/graph_bfs.swift @@ -0,0 +1,56 @@ +/** + * File: graph_bfs.swift + * Created Time: 2023-02-21 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import graph_adjacency_list_target +import utils + +/* Обход в ширину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +func graphBFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] { + // Последовательность обхода вершин + var res: [Vertex] = [] + // Хеш-множество для хранения уже посещенных вершин + var visited: Set = [startVet] + // Очередь используется для реализации BFS + var que: [Vertex] = [startVet] + // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины + while !que.isEmpty { + let vet = que.removeFirst() // Извлечь головную вершину из очереди + res.append(vet) // Отметить посещенную вершину + // Обойти все смежные вершины данной вершины + for adjVet in graph.adjList[vet] ?? [] { + if visited.contains(adjVet) { + continue // Пропустить уже посещенную вершину + } + que.append(adjVet) // Помещать в очередь только непосещенные вершины + visited.insert(adjVet) // Отметить эту вершину как посещенную + } + } + // Вернуть последовательность обхода вершин + return res +} + +@main +enum GraphBFS { + /* Driver Code */ + static func main() { + /* Инициализация неориентированного графа */ + let v = Vertex.valsToVets(vals: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) + let 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]], + ] + let graph = GraphAdjList(edges: edges) + print("\nГраф после инициализации") + graph.print() + + /* Обход в ширину */ + let res = graphBFS(graph: graph, startVet: v[0]) + print("\nПоследовательность вершин при обходе в ширину (BFS)") + print(Vertex.vetsToVals(vets: res)) + } +} diff --git a/ru/codes/swift/chapter_graph/graph_dfs.swift b/ru/codes/swift/chapter_graph/graph_dfs.swift new file mode 100644 index 000000000..18e859bb1 --- /dev/null +++ b/ru/codes/swift/chapter_graph/graph_dfs.swift @@ -0,0 +1,54 @@ +/** + * File: graph_dfs.swift + * Created Time: 2023-02-21 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import graph_adjacency_list_target +import utils + +/* Вспомогательная функция обхода в глубину */ +func dfs(graph: GraphAdjList, visited: inout Set, res: inout [Vertex], vet: Vertex) { + res.append(vet) // Отметить посещенную вершину + visited.insert(vet) // Отметить эту вершину как посещенную + // Обойти все смежные вершины данной вершины + for adjVet in graph.adjList[vet] ?? [] { + if visited.contains(adjVet) { + continue // Пропустить уже посещенную вершину + } + // Рекурсивно обходить смежные вершины + dfs(graph: graph, visited: &visited, res: &res, vet: adjVet) + } +} + +/* Обход в глубину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +func graphDFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] { + // Последовательность обхода вершин + var res: [Vertex] = [] + // Хеш-множество для хранения уже посещенных вершин + var visited: Set = [] + dfs(graph: graph, visited: &visited, res: &res, vet: startVet) + return res +} + +@main +enum GraphDFS { + /* Driver Code */ + static func main() { + /* Инициализация неориентированного графа */ + let v = Vertex.valsToVets(vals: [0, 1, 2, 3, 4, 5, 6]) + let 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]], + ] + let graph = GraphAdjList(edges: edges) + print("\nГраф после инициализации") + graph.print() + + /* Обход в глубину */ + let res = graphDFS(graph: graph, startVet: v[0]) + print("\nПоследовательность вершин при обходе в глубину (DFS)") + print(Vertex.vetsToVals(vets: res)) + } +} diff --git a/ru/codes/swift/chapter_greedy/coin_change_greedy.swift b/ru/codes/swift/chapter_greedy/coin_change_greedy.swift new file mode 100644 index 000000000..29f082f0d --- /dev/null +++ b/ru/codes/swift/chapter_greedy/coin_change_greedy.swift @@ -0,0 +1,54 @@ +/** + * File: coin_change_greedy.swift + * Created Time: 2023-09-03 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Размен монет: жадный алгоритм */ +func coinChangeGreedy(coins: [Int], amt: Int) -> Int { + // Предположить, что список coins упорядочен + var i = coins.count - 1 + var count = 0 + var amt = amt + // Циклически выполнять жадный выбор, пока не останется суммы + while amt > 0 { + // Найти монету, которая меньше остатка суммы и наиболее к нему близка + while i > 0 && coins[i] > amt { + i -= 1 + } + // Выбрать coins[i] + amt -= coins[i] + count += 1 + } + // Если допустимое решение не найдено, вернуть -1 + return amt == 0 ? count : -1 +} + +@main +enum CoinChangeGreedy { + /* Driver Code */ + static func main() { + // Жадный подход: гарантирует нахождение глобально оптимального решения + var coins = [1, 5, 10, 20, 50, 100] + var amt = 186 + var res = coinChangeGreedy(coins: coins, amt: amt) + print("\ncoins = \(coins), amount = \(amt)") + print("Минимальное число монет для набора суммы \(amt) = \(res)") + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = [1, 20, 50] + amt = 60 + res = coinChangeGreedy(coins: coins, amt: amt) + print("\ncoins = \(coins), amount = \(amt)") + print("Минимальное число монет для набора суммы \(amt) = \(res)") + print("На самом деле минимум равен 3: 20 + 20 + 20") + + // Жадный подход: не гарантирует нахождение глобально оптимального решения + coins = [1, 49, 50] + amt = 98 + res = coinChangeGreedy(coins: coins, amt: amt) + print("\ncoins = \(coins), amount = \(amt)") + print("Минимальное число монет для набора суммы \(amt) = \(res)") + print("На самом деле минимум равен 2: 49 + 49") + } +} diff --git a/ru/codes/swift/chapter_greedy/fractional_knapsack.swift b/ru/codes/swift/chapter_greedy/fractional_knapsack.swift new file mode 100644 index 000000000..4461f4ac9 --- /dev/null +++ b/ru/codes/swift/chapter_greedy/fractional_knapsack.swift @@ -0,0 +1,57 @@ +/** + * File: fractional_knapsack.swift + * Created Time: 2023-09-03 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Предмет */ +class Item { + var w: Int // Вес предмета + var v: Int // Стоимость предмета + + init(w: Int, v: Int) { + self.w = w + self.v = v + } +} + +/* Дробный рюкзак: жадный алгоритм */ +func fractionalKnapsack(wgt: [Int], val: [Int], cap: Int) -> Double { + // Создать список предметов с двумя свойствами: вес и стоимость + var items = zip(wgt, val).map { Item(w: $0, v: $1) } + // Отсортировать по удельной стоимости item.v / item.w в порядке убывания + items.sort { -(Double($0.v) / Double($0.w)) < -(Double($1.v) / Double($1.w)) } + // Циклический жадный выбор + var res = 0.0 + var cap = cap + for item in items { + if item.w <= cap { + // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком + res += Double(item.v) + cap -= item.w + } else { + // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета + res += Double(item.v) / Double(item.w) * Double(cap) + // Свободной вместимости больше не осталось, поэтому выйти из цикла + break + } + } + return res +} + +@main +enum FractionalKnapsack { + /* Driver Code */ + static func main() { + // Вес предмета + let wgt = [10, 20, 30, 40, 50] + // Стоимость предмета + let val = [50, 120, 150, 210, 240] + // Вместимость рюкзака + let cap = 50 + + // Жадный алгоритм + let res = fractionalKnapsack(wgt: wgt, val: val, cap: cap) + print("Максимальная стоимость предметов без превышения вместимости рюкзака = \(res)") + } +} diff --git a/ru/codes/swift/chapter_greedy/max_capacity.swift b/ru/codes/swift/chapter_greedy/max_capacity.swift new file mode 100644 index 000000000..8435bbd11 --- /dev/null +++ b/ru/codes/swift/chapter_greedy/max_capacity.swift @@ -0,0 +1,38 @@ +/** + * File: max_capacity.swift + * Created Time: 2023-09-03 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Максимальная вместимость: жадный алгоритм */ +func maxCapacity(ht: [Int]) -> Int { + // Инициализировать i и j так, чтобы они располагались по двум концам массива + var i = ht.startIndex, j = ht.endIndex - 1 + // Начальная максимальная вместимость равна 0 + var res = 0 + // Выполнять жадный выбор в цикле, пока две доски не встретятся + while i < j { + // Обновить максимальную вместимость + let cap = min(ht[i], ht[j]) * (j - i) + res = max(res, cap) + // Сдвигать внутрь более короткую сторону + if ht[i] < ht[j] { + i += 1 + } else { + j -= 1 + } + } + return res +} + +@main +enum MaxCapacity { + /* Driver Code */ + static func main() { + let ht = [3, 8, 5, 2, 7, 7, 3, 4] + + // Жадный алгоритм + let res = maxCapacity(ht: ht) + print("Максимальная вместимость = \(res)") + } +} diff --git a/ru/codes/swift/chapter_greedy/max_product_cutting.swift b/ru/codes/swift/chapter_greedy/max_product_cutting.swift new file mode 100644 index 000000000..8eba99c48 --- /dev/null +++ b/ru/codes/swift/chapter_greedy/max_product_cutting.swift @@ -0,0 +1,43 @@ +/** + * File: max_product_cutting.swift + * Created Time: 2023-09-03 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import Foundation + +func pow(_ x: Int, _ y: Int) -> Int { + Int(Double(truncating: pow(Decimal(x), y) as NSDecimalNumber)) +} + +/* Максимальное произведение разрезания: жадный алгоритм */ +func maxProductCutting(n: Int) -> Int { + // Когда n <= 3, обязательно нужно выделить одну 1 + if n <= 3 { + return 1 * (n - 1) + } + // Жадно выделить множители 3, где a — число троек, а b — остаток + let a = n / 3 + let b = n % 3 + if b == 1 { + // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2 + return pow(3, a - 1) * 2 * 2 + } + if b == 2 { + // Если остаток равен 2, ничего не делать + return pow(3, a) * 2 + } + // Если остаток равен 0, ничего не делать + return pow(3, a) +} + +@main +enum MaxProductCutting { + static func main() { + let n = 58 + + // Жадный алгоритм + let res = maxProductCutting(n: n) + print("Максимальное произведение после разрезания = \(res)") + } +} diff --git a/ru/codes/swift/chapter_hashing/array_hash_map.swift b/ru/codes/swift/chapter_hashing/array_hash_map.swift new file mode 100644 index 000000000..44fcd3745 --- /dev/null +++ b/ru/codes/swift/chapter_hashing/array_hash_map.swift @@ -0,0 +1,110 @@ +/** + * File: array_hash_map.swift + * Created Time: 2023-01-16 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Хеш-таблица на основе массива */ +class ArrayHashMap { + private var buckets: [Pair?] + + init() { + // Инициализировать массив, содержащий 100 корзин + buckets = Array(repeating: nil, count: 100) + } + + /* Хеш-функция */ + private func hashFunc(key: Int) -> Int { + let index = key % 100 + return index + } + + /* Операция поиска */ + func get(key: Int) -> String? { + let index = hashFunc(key: key) + let pair = buckets[index] + return pair?.val + } + + /* Операция добавления */ + func put(key: Int, val: String) { + let pair = Pair(key: key, val: val) + let index = hashFunc(key: key) + buckets[index] = pair + } + + /* Операция удаления */ + func remove(key: Int) { + let index = hashFunc(key: key) + // Присвоить nil, что означает удаление + buckets[index] = nil + } + + /* Получить все пары ключ-значение */ + func pairSet() -> [Pair] { + buckets.compactMap { $0 } + } + + /* Получить все ключи */ + func keySet() -> [Int] { + buckets.compactMap { $0?.key } + } + + /* Получить все значения */ + func valueSet() -> [String] { + buckets.compactMap { $0?.val } + } + + /* Вывести хеш-таблицу */ + func print() { + for pair in pairSet() { + Swift.print("\(pair.key) -> \(pair.val)") + } + } +} + +@main +enum _ArrayHashMap { + /* Driver Code */ + static func main() { + /* Инициализация хеш-таблицы */ + let map = ArrayHashMap() + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.put(key: 12836, val: "Сяо Ха") + map.put(key: 15937, val: "Сяо Ло") + map.put(key: 16750, val: "Сяо Суань") + map.put(key: 13276, val: "Сяо Фа") + map.put(key: 10583, val: "Сяо Я") + print("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение") + map.print() + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + let name = map.get(key: 15937)! + print("\nДля номера 15937 найдено имя \(name)") + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(key: 10583) + print("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение") + map.print() + + /* Обход хеш-таблицы */ + print("\nОтдельный обход пар ключ-значение") + for pair in map.pairSet() { + print("\(pair.key) -> \(pair.val)") + } + print("\nОтдельный обход ключей") + for key in map.keySet() { + print(key) + } + print("\nОтдельный обход значений") + for val in map.valueSet() { + print(val) + } + } +} diff --git a/ru/codes/swift/chapter_hashing/built_in_hash.swift b/ru/codes/swift/chapter_hashing/built_in_hash.swift new file mode 100644 index 000000000..578ec127a --- /dev/null +++ b/ru/codes/swift/chapter_hashing/built_in_hash.swift @@ -0,0 +1,37 @@ +/** + * File: built_in_hash.swift + * Created Time: 2023-07-01 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +@main +enum BuiltInHash { + /* Driver Code */ + static func main() { + let num = 3 + let hashNum = num.hashValue + print("Хеш-значение целого числа \(num) = \(hashNum)") + + let bol = true + let hashBol = bol.hashValue + print("Хеш-значение булева значения \(bol) = \(hashBol)") + + let dec = 3.14159 + let hashDec = dec.hashValue + print("Хеш-значение десятичного числа \(dec) = \(hashDec)") + + let str = "Hello Algo" + let hashStr = str.hashValue + print("Хеш-значение строки \(str) = \(hashStr)") + + let arr = [AnyHashable(12836), AnyHashable("Сяо Ха")] + let hashTup = arr.hashValue + print("Хеш-значение массива \(arr) = \(hashTup)") + + let obj = ListNode(x: 0) + let hashObj = obj.hashValue + print("Хеш-значение объекта узла \(obj) = \(hashObj)") + } +} diff --git a/ru/codes/swift/chapter_hashing/hash_map.swift b/ru/codes/swift/chapter_hashing/hash_map.swift new file mode 100644 index 000000000..c882616ef --- /dev/null +++ b/ru/codes/swift/chapter_hashing/hash_map.swift @@ -0,0 +1,51 @@ +/** + * File: hash_map.swift + * Created Time: 2023-01-16 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +@main +enum HashMap { + /* Driver Code */ + static func main() { + /* Инициализация хеш-таблицы */ + var map: [Int: String] = [:] + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map[12836] = "Сяо Ха" + map[15937] = "Сяо Ло" + map[16750] = "Сяо Суань" + map[13276] = "Сяо Фа" + map[10583] = "Сяо Я" + print("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение") + PrintUtil.printHashMap(map: map) + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + let name = map[15937]! + print("\nДля номера 15937 найдено имя \(name)") + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.removeValue(forKey: 10583) + print("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение") + PrintUtil.printHashMap(map: map) + + /* Обход хеш-таблицы */ + print("\nОтдельный обход пар ключ-значение") + for (key, value) in map { + print("\(key) -> \(value)") + } + print("\nОтдельный обход ключей") + for key in map.keys { + print(key) + } + print("\nОтдельный обход значений") + for value in map.values { + print(value) + } + } +} diff --git a/ru/codes/swift/chapter_hashing/hash_map_chaining.swift b/ru/codes/swift/chapter_hashing/hash_map_chaining.swift new file mode 100644 index 000000000..b5f8fe810 --- /dev/null +++ b/ru/codes/swift/chapter_hashing/hash_map_chaining.swift @@ -0,0 +1,138 @@ +/** + * File: hash_map_chaining.swift + * Created Time: 2023-06-28 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Хеш-таблица с цепочками */ +class HashMapChaining { + var size: Int // Число пар ключ-значение + var capacity: Int // Вместимость хеш-таблицы + var loadThres: Double // Порог коэффициента загрузки для запуска расширения + var extendRatio: Int // Коэффициент расширения + var buckets: [[Pair]] // Массив корзин + + /* Конструктор */ + init() { + size = 0 + capacity = 4 + loadThres = 2.0 / 3.0 + extendRatio = 2 + buckets = Array(repeating: [], count: capacity) + } + + /* Хеш-функция */ + func hashFunc(key: Int) -> Int { + key % capacity + } + + /* Коэффициент загрузки */ + func loadFactor() -> Double { + Double(size) / Double(capacity) + } + + /* Операция поиска */ + func get(key: Int) -> String? { + let index = hashFunc(key: key) + let bucket = buckets[index] + // Обойти корзину; если найден key, вернуть соответствующее val + for pair in bucket { + if pair.key == key { + return pair.val + } + } + // Если key не найден, вернуть nil + return nil + } + + /* Операция добавления */ + func put(key: Int, val: String) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if loadFactor() > loadThres { + extend() + } + let index = hashFunc(key: key) + let bucket = buckets[index] + // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть + for pair in bucket { + if pair.key == key { + pair.val = val + return + } + } + // Если такого key нет, добавить пару ключ-значение в конец + let pair = Pair(key: key, val: val) + buckets[index].append(pair) + size += 1 + } + + /* Операция удаления */ + func remove(key: Int) { + let index = hashFunc(key: key) + let bucket = buckets[index] + // Обойти корзину и удалить из нее пару ключ-значение + for (pairIndex, pair) in bucket.enumerated() { + if pair.key == key { + buckets[index].remove(at: pairIndex) + size -= 1 + break + } + } + } + + /* Расширить хеш-таблицу */ + func extend() { + // Временно сохранить исходную хеш-таблицу + let bucketsTmp = buckets + // Инициализация новой хеш-таблицы после расширения + capacity *= extendRatio + buckets = Array(repeating: [], count: capacity) + size = 0 + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for bucket in bucketsTmp { + for pair in bucket { + put(key: pair.key, val: pair.val) + } + } + } + + /* Вывести хеш-таблицу */ + func print() { + for bucket in buckets { + let res = bucket.map { "\($0.key) -> \($0.val)" } + Swift.print(res) + } + } +} + +@main +enum _HashMapChaining { + /* Driver Code */ + static func main() { + /* Инициализация хеш-таблицы */ + let map = HashMapChaining() + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.put(key: 12836, val: "Сяо Ха") + map.put(key: 15937, val: "Сяо Ло") + map.put(key: 16750, val: "Сяо Суань") + map.put(key: 13276, val: "Сяо Фа") + map.put(key: 10583, val: "Сяо Я") + print("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение") + map.print() + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + let name = map.get(key: 13276) + print("\nДля номера 13276 найдено имя \(name!)") + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(key: 12836) + print("\nПосле удаления 12836 хеш-таблица имеет вид\nКлюч -> Значение") + map.print() + } +} diff --git a/ru/codes/swift/chapter_hashing/hash_map_open_addressing.swift b/ru/codes/swift/chapter_hashing/hash_map_open_addressing.swift new file mode 100644 index 000000000..4d52a59fe --- /dev/null +++ b/ru/codes/swift/chapter_hashing/hash_map_open_addressing.swift @@ -0,0 +1,164 @@ +/** + * File: hash_map_open_addressing.swift + * Created Time: 2023-06-28 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Хеш-таблица с открытой адресацией */ +class HashMapOpenAddressing { + var size: Int // Число пар ключ-значение + var capacity: Int // Вместимость хеш-таблицы + var loadThres: Double // Порог коэффициента загрузки для запуска расширения + var extendRatio: Int // Коэффициент расширения + var buckets: [Pair?] // Массив корзин + var TOMBSTONE: Pair // Удалить метку + + /* Конструктор */ + init() { + size = 0 + capacity = 4 + loadThres = 2.0 / 3.0 + extendRatio = 2 + buckets = Array(repeating: nil, count: capacity) + TOMBSTONE = Pair(key: -1, val: "-1") + } + + /* Хеш-функция */ + func hashFunc(key: Int) -> Int { + key % capacity + } + + /* Коэффициент загрузки */ + func loadFactor() -> Double { + Double(size) / Double(capacity) + } + + /* Найти индекс корзины, соответствующий key */ + func findBucket(key: Int) -> Int { + var index = hashFunc(key: key) + var firstTombstone = -1 + // Выполнять линейное пробирование и завершить при встрече с пустой корзиной + while buckets[index] != nil { + // Если встретился key, вернуть соответствующий индекс корзины + if buckets[index]!.key == key { + // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс + if firstTombstone != -1 { + buckets[firstTombstone] = buckets[index] + buckets[index] = TOMBSTONE + return firstTombstone // Вернуть индекс корзины после перемещения + } + return index // Вернуть индекс корзины + } + // Записать первую встретившуюся метку удаления + if firstTombstone == -1 && buckets[index] == TOMBSTONE { + firstTombstone = index + } + // Вычислить индекс корзины; при выходе за конец вернуться к началу + index = (index + 1) % capacity + } + // Если key не существует, вернуть индекс точки добавления + return firstTombstone == -1 ? index : firstTombstone + } + + /* Операция поиска */ + func get(key: Int) -> String? { + // Найти индекс корзины, соответствующий key + let index = findBucket(key: key) + // Если пара ключ-значение найдена, вернуть соответствующее val + if buckets[index] != nil, buckets[index] != TOMBSTONE { + return buckets[index]!.val + } + // Если пары ключ-значение не существует, вернуть null + return nil + } + + /* Операция добавления */ + func put(key: Int, val: String) { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if loadFactor() > loadThres { + extend() + } + // Найти индекс корзины, соответствующий key + let index = findBucket(key: key) + // Если пара ключ-значение найдена, перезаписать val и вернуть + if buckets[index] != nil, buckets[index] != TOMBSTONE { + buckets[index]!.val = val + return + } + // Если пары ключ-значение нет, добавить ее + buckets[index] = Pair(key: key, val: val) + size += 1 + } + + /* Операция удаления */ + func remove(key: Int) { + // Найти индекс корзины, соответствующий key + let index = findBucket(key: key) + // Если пара ключ-значение найдена, заменить ее меткой удаления + if buckets[index] != nil, buckets[index] != TOMBSTONE { + buckets[index] = TOMBSTONE + size -= 1 + } + } + + /* Расширить хеш-таблицу */ + func extend() { + // Временно сохранить исходную хеш-таблицу + let bucketsTmp = buckets + // Инициализация новой хеш-таблицы после расширения + capacity *= extendRatio + buckets = Array(repeating: nil, count: capacity) + size = 0 + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for pair in bucketsTmp { + if let pair, pair != TOMBSTONE { + put(key: pair.key, val: pair.val) + } + } + } + + /* Вывести хеш-таблицу */ + func print() { + for pair in buckets { + if pair == nil { + Swift.print("null") + } else if pair == TOMBSTONE { + Swift.print("TOMBSTONE") + } else { + Swift.print("\(pair!.key) -> \(pair!.val)") + } + } + } +} + +@main +enum _HashMapOpenAddressing { + /* Driver Code */ + static func main() { + /* Инициализация хеш-таблицы */ + let map = HashMapOpenAddressing() + + /* Операция добавления */ + // Добавить пару (key, value) в хеш-таблицу + map.put(key: 12836, val: "Сяо Ха") + map.put(key: 15937, val: "Сяо Ло") + map.put(key: 16750, val: "Сяо Суань") + map.put(key: 13276, val: "Сяо Фа") + map.put(key: 10583, val: "Сяо Я") + print("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение") + map.print() + + /* Операция поиска */ + // Ввести в хеш-таблицу ключ key и получить значение value + let name = map.get(key: 13276) + print("\nДля номера 13276 найдено имя \(name!)") + + /* Операция удаления */ + // Удалить пару (key, value) из хеш-таблицы + map.remove(key: 16750) + print("\nПосле удаления 16750 хеш-таблица имеет вид\nКлюч -> Значение") + map.print() + } +} diff --git a/ru/codes/swift/chapter_hashing/simple_hash.swift b/ru/codes/swift/chapter_hashing/simple_hash.swift new file mode 100644 index 000000000..0005e504c --- /dev/null +++ b/ru/codes/swift/chapter_hashing/simple_hash.swift @@ -0,0 +1,73 @@ +/** + * File: simple_hash.swift + * Created Time: 2023-07-01 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Аддитивное хеширование */ +func addHash(key: String) -> Int { + var hash = 0 + let MODULUS = 1_000_000_007 + for c in key { + for scalar in c.unicodeScalars { + hash = (hash + Int(scalar.value)) % MODULUS + } + } + return hash +} + +/* Мультипликативное хеширование */ +func mulHash(key: String) -> Int { + var hash = 0 + let MODULUS = 1_000_000_007 + for c in key { + for scalar in c.unicodeScalars { + hash = (31 * hash + Int(scalar.value)) % MODULUS + } + } + return hash +} + +/* XOR-хеширование */ +func xorHash(key: String) -> Int { + var hash = 0 + let MODULUS = 1_000_000_007 + for c in key { + for scalar in c.unicodeScalars { + hash ^= Int(scalar.value) + } + } + return hash & MODULUS +} + +/* Хеширование с циклическим сдвигом */ +func rotHash(key: String) -> Int { + var hash = 0 + let MODULUS = 1_000_000_007 + for c in key { + for scalar in c.unicodeScalars { + hash = ((hash << 4) ^ (hash >> 28) ^ Int(scalar.value)) % MODULUS + } + } + return hash +} + +@main +enum SimpleHash { + /* Driver Code */ + static func main() { + let key = "Hello Algo" + + var hash = addHash(key: key) + print("Хеш-сумма сложением = \(hash)") + + hash = mulHash(key: key) + print("Хеш-сумма умножением = \(hash)") + + hash = xorHash(key: key) + print("Хеш-сумма XOR = \(hash)") + + hash = rotHash(key: key) + print("Хеш-сумма с циклическим сдвигом = \(hash)") + } +} diff --git a/ru/codes/swift/chapter_heap/heap.swift b/ru/codes/swift/chapter_heap/heap.swift new file mode 100644 index 000000000..dc24f2e6c --- /dev/null +++ b/ru/codes/swift/chapter_heap/heap.swift @@ -0,0 +1,62 @@ +/** + * File: heap.swift + * Created Time: 2024-03-17 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import HeapModule +import utils + +func testPush(heap: inout Heap, val: Int) { + heap.insert(val) + print("\nПосле добавления элемента \(val) в кучу\n") + PrintUtil.printHeap(queue: heap.unordered) +} + +func testPop(heap: inout Heap) { + let val = heap.removeMax() + print("\nПосле извлечения элемента вершины кучи \(val)\n") + PrintUtil.printHeap(queue: heap.unordered) +} + +@main +enum _Heap { + /* Driver Code */ + static func main() { + /* Инициализация кучи */ + // Тип Heap в Swift одновременно поддерживает максимальную и минимальную кучу + var heap = Heap() + + /* Добавление элемента в кучу */ + testPush(heap: &heap, val: 1) + testPush(heap: &heap, val: 3) + testPush(heap: &heap, val: 2) + testPush(heap: &heap, val: 5) + testPush(heap: &heap, val: 4) + + /* Получение элемента с вершины кучи */ + let peek = heap.max() + print("\nЭлемент на вершине кучи = \(peek!)\n") + + /* Извлечение элемента с вершины кучи */ + testPop(heap: &heap) + testPop(heap: &heap) + testPop(heap: &heap) + testPop(heap: &heap) + testPop(heap: &heap) + + /* Получение размера кучи */ + let size = heap.count + print("\nКоличество элементов в куче = \(size)\n") + + /* Проверка, пуста ли куча */ + let isEmpty = heap.isEmpty + print("\nПуста ли куча: \(isEmpty)\n") + + /* Построить кучу по входному списку */ + // Временная сложность равна O(n), а не O(nlogn) + let heap2 = Heap([1, 3, 2, 5, 4]) + print("\nПосле построения кучи из входного списка") + PrintUtil.printHeap(queue: heap2.unordered) + } +} diff --git a/ru/codes/swift/chapter_heap/my_heap.swift b/ru/codes/swift/chapter_heap/my_heap.swift new file mode 100644 index 000000000..8a0fa0b78 --- /dev/null +++ b/ru/codes/swift/chapter_heap/my_heap.swift @@ -0,0 +1,163 @@ +/** + * File: my_heap.swift + * Created Time: 2023-01-28 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Максимальная куча */ +class MaxHeap { + private var maxHeap: [Int] + + /* Конструктор, строящий кучу по входному списку */ + init(nums: [Int]) { + // Добавить элементы списка в кучу без изменений + maxHeap = nums + // Выполнить heapify для всех узлов, кроме листовых + for i in (0 ... parent(i: size() - 1)).reversed() { + siftDown(i: i) + } + } + + /* Получить индекс левого дочернего узла */ + private func left(i: Int) -> Int { + 2 * i + 1 + } + + /* Получить индекс правого дочернего узла */ + private func right(i: Int) -> Int { + 2 * i + 2 + } + + /* Получить индекс родительского узла */ + private func parent(i: Int) -> Int { + (i - 1) / 2 // Округление вниз при делении + } + + /* Поменять элементы местами */ + private func swap(i: Int, j: Int) { + maxHeap.swapAt(i, j) + } + + /* Получение размера кучи */ + func size() -> Int { + maxHeap.count + } + + /* Проверка, пуста ли куча */ + func isEmpty() -> Bool { + size() == 0 + } + + /* Доступ к элементу на вершине кучи */ + func peek() -> Int { + maxHeap[0] + } + + /* Добавление элемента в кучу */ + func push(val: Int) { + // Добавление узла + maxHeap.append(val) + // Просеивание снизу вверх + siftUp(i: size() - 1) + } + + /* Начиная с узла i, выполнить просеивание снизу вверх */ + private func siftUp(i: Int) { + var i = i + while true { + // Получение родительского узла для узла i + let p = parent(i: i) + // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления» + if p < 0 || maxHeap[i] <= maxHeap[p] { + break + } + // Поменять два узла местами + swap(i: i, j: p) + // Циклическое просеивание вверх + i = p + } + } + + /* Извлечение элемента из кучи */ + func pop() -> Int { + // Обработка пустого случая + if isEmpty() { + fatalError("куча пуста") + } + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + swap(i: 0, j: size() - 1) + // Удаление узла + let val = maxHeap.remove(at: size() - 1) + // Просеивание сверху вниз + siftDown(i: 0) + // Вернуть элемент с вершины кучи + return val + } + + /* Начиная с узла i, выполнить просеивание сверху вниз */ + private func siftDown(i: Int) { + var i = i + while true { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + let l = left(i: i) + let r = right(i: i) + var ma = i + if l < size(), maxHeap[l] > maxHeap[ma] { + ma = l + } + if r < size(), maxHeap[r] > maxHeap[ma] { + ma = r + } + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if ma == i { + break + } + // Поменять два узла местами + swap(i: i, j: ma) + // Циклическое просеивание вниз + i = ma + } + } + + /* Вывести кучу (двоичное дерево) */ + func print() { + let queue = maxHeap + PrintUtil.printHeap(queue: queue) + } +} + +@main +enum MyHeap { + /* Driver Code */ + static func main() { + /* Инициализация максимальной кучи */ + let maxHeap = MaxHeap(nums: [9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2]) + print("\nПосле построения кучи из входного списка") + maxHeap.print() + + /* Получение элемента с вершины кучи */ + var peek = maxHeap.peek() + print("\nЭлемент на вершине кучи = \(peek)") + + /* Добавление элемента в кучу */ + let val = 7 + maxHeap.push(val: val) + print("\nПосле добавления элемента \(val) в кучу") + maxHeap.print() + + /* Извлечение элемента с вершины кучи */ + peek = maxHeap.pop() + print("\nПосле извлечения элемента вершины кучи \(peek)") + maxHeap.print() + + /* Получение размера кучи */ + let size = maxHeap.size() + print("\nКоличество элементов в куче = \(size)") + + /* Проверка, пуста ли куча */ + let isEmpty = maxHeap.isEmpty() + print("\nПуста ли куча: \(isEmpty)") + } +} diff --git a/ru/codes/swift/chapter_heap/top_k.swift b/ru/codes/swift/chapter_heap/top_k.swift new file mode 100644 index 000000000..f2699bd6c --- /dev/null +++ b/ru/codes/swift/chapter_heap/top_k.swift @@ -0,0 +1,36 @@ +/** + * File: top_k.swift + * Created Time: 2023-07-02 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import HeapModule +import utils + +/* Найти k наибольших элементов массива с помощью кучи */ +func topKHeap(nums: [Int], k: Int) -> [Int] { + // Инициализировать минимальную кучу и построить ее по первым k элементам + var heap = Heap(nums.prefix(k)) + // Начиная с элемента k+1, поддерживать длину кучи равной k + for i in nums.indices.dropFirst(k) { + // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу + if nums[i] > heap.min()! { + _ = heap.removeMin() + heap.insert(nums[i]) + } + } + return heap.unordered +} + +@main +enum TopK { + /* Driver Code */ + static func main() { + let nums = [1, 7, 6, 3, 2] + let k = 3 + + let res = topKHeap(nums: nums, k: k) + print("Наибольшие \(k) элементов") + PrintUtil.printHeap(queue: res) + } +} diff --git a/ru/codes/swift/chapter_searching/binary_search.swift b/ru/codes/swift/chapter_searching/binary_search.swift new file mode 100644 index 000000000..97317d4d1 --- /dev/null +++ b/ru/codes/swift/chapter_searching/binary_search.swift @@ -0,0 +1,62 @@ +/** + * File: binary_search.swift + * Created Time: 2023-01-28 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Бинарный поиск (двусторонне замкнутый интервал) */ +func binarySearch(nums: [Int], target: Int) -> Int { + // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно + var i = nums.startIndex + var j = nums.endIndex - 1 + // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст) + while i <= j { + let m = i + (j - i) / 2 // Вычислить индекс середины m + if nums[m] < target { // Это означает, что target находится в интервале [m+1, j] + i = m + 1 + } else if nums[m] > target { // Это означает, что target находится в интервале [i, m-1] + j = m - 1 + } else { // Целевой элемент найден, вернуть его индекс + return m + } + } + // Целевой элемент не найден, вернуть -1 + return -1 +} + +/* Бинарный поиск (лево замкнутый, право открытый интервал) */ +func binarySearchLCRO(nums: [Int], target: Int) -> Int { + // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно + var i = nums.startIndex + var j = nums.endIndex + // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст) + while i < j { + let m = i + (j - i) / 2 // Вычислить индекс середины m + if nums[m] < target { // Это означает, что target находится в интервале [m+1, j) + i = m + 1 + } else if nums[m] > target { // Это означает, что target находится в интервале [i, m) + j = m + } else { // Целевой элемент найден, вернуть его индекс + return m + } + } + // Целевой элемент не найден, вернуть -1 + return -1 +} + +@main +enum BinarySearch { + /* Driver Code */ + static func main() { + let target = 6 + let nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35] + + /* Бинарный поиск (двусторонне замкнутый интервал) */ + var index = binarySearch(nums: nums, target: target) + print("Индекс целевого элемента 6 = \(index)") + + /* Бинарный поиск (лево замкнутый, право открытый интервал) */ + index = binarySearchLCRO(nums: nums, target: target) + print("Индекс целевого элемента 6 = \(index)") + } +} diff --git a/ru/codes/swift/chapter_searching/binary_search_edge.swift b/ru/codes/swift/chapter_searching/binary_search_edge.swift new file mode 100644 index 000000000..9948df47a --- /dev/null +++ b/ru/codes/swift/chapter_searching/binary_search_edge.swift @@ -0,0 +1,51 @@ +/** + * File: binary_search_edge.swift + * Created Time: 2023-08-06 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import binary_search_insertion_target + +/* Бинарный поиск самого левого target */ +func binarySearchLeftEdge(nums: [Int], target: Int) -> Int { + // Эквивалентно поиску точки вставки target + let i = binarySearchInsertion(nums: nums, target: target) + // target не найден, вернуть -1 + if i == nums.endIndex || nums[i] != target { + return -1 + } + // Найти target и вернуть индекс i + return i +} + +/* Бинарный поиск самого правого target */ +func binarySearchRightEdge(nums: [Int], target: Int) -> Int { + // Преобразовать задачу в поиск самого левого target + 1 + let i = binarySearchInsertion(nums: nums, target: target + 1) + // j указывает на самый правый target, а i — на первый элемент больше target + let j = i - 1 + // target не найден, вернуть -1 + if j == -1 || nums[j] != target { + return -1 + } + // Найти target и вернуть индекс j + return j +} + +@main +enum BinarySearchEdge { + /* Driver Code */ + static func main() { + // Массив с повторяющимися элементами + let nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15] + print("\nМассив nums = \(nums)") + + // Бинарный поиск левой и правой границы + for target in [6, 7] { + var index = binarySearchLeftEdge(nums: nums, target: target) + print("Индекс самого левого элемента \(target) равен \(index)") + index = binarySearchRightEdge(nums: nums, target: target) + print("Индекс самого правого элемента \(target) равен \(index)") + } + } +} diff --git a/ru/codes/swift/chapter_searching/binary_search_insertion.swift b/ru/codes/swift/chapter_searching/binary_search_insertion.swift new file mode 100644 index 000000000..57cd71c03 --- /dev/null +++ b/ru/codes/swift/chapter_searching/binary_search_insertion.swift @@ -0,0 +1,71 @@ +/** + * File: binary_search_insertion.swift + * Created Time: 2023-08-06 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Бинарный поиск точки вставки (без повторяющихся элементов) */ +func binarySearchInsertionSimple(nums: [Int], target: Int) -> Int { + // Инициализировать двусторонне замкнутый интервал [0, n-1] + var i = nums.startIndex + var j = nums.endIndex - 1 + while i <= j { + let m = i + (j - i) / 2 // Вычислить индекс середины m + if nums[m] < target { + i = m + 1 // target находится в интервале [m+1, j] + } else if nums[m] > target { + j = m - 1 // target находится в интервале [i, m-1] + } else { + return m // Найти target и вернуть точку вставки m + } + } + // target не найден, вернуть точку вставки i + return i +} + +/* Бинарный поиск точки вставки (с повторяющимися элементами) */ +public func binarySearchInsertion(nums: [Int], target: Int) -> Int { + // Инициализировать двусторонне замкнутый интервал [0, n-1] + var i = nums.startIndex + var j = nums.endIndex - 1 + while i <= j { + let m = i + (j - i) / 2 // Вычислить индекс середины m + if nums[m] < target { + i = m + 1 // target находится в интервале [m+1, j] + } else if nums[m] > target { + j = m - 1 // target находится в интервале [i, m-1] + } else { + j = m - 1 // Первый элемент меньше target находится в интервале [i, m-1] + } + } + // Вернуть точку вставки i + return i +} + +#if !TARGET + +@main +enum BinarySearchInsertion { + /* Driver Code */ + static func main() { + // Массив без повторяющихся элементов + var nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35] + print("\nМассив nums = \(nums)") + // Бинарный поиск точки вставки + for target in [6, 9] { + let index = binarySearchInsertionSimple(nums: nums, target: target) + print("Индекс позиции вставки элемента \(target) равен \(index)") + } + + // Массив с повторяющимися элементами + nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15] + print("\nМассив nums = \(nums)") + // Бинарный поиск точки вставки + for target in [2, 6, 20] { + let index = binarySearchInsertion(nums: nums, target: target) + print("Индекс позиции вставки элемента \(target) равен \(index)") + } + } +} + +#endif diff --git a/ru/codes/swift/chapter_searching/binary_search_insertion_target.swift b/ru/codes/swift/chapter_searching/binary_search_insertion_target.swift new file mode 100644 index 000000000..57cd71c03 --- /dev/null +++ b/ru/codes/swift/chapter_searching/binary_search_insertion_target.swift @@ -0,0 +1,71 @@ +/** + * File: binary_search_insertion.swift + * Created Time: 2023-08-06 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Бинарный поиск точки вставки (без повторяющихся элементов) */ +func binarySearchInsertionSimple(nums: [Int], target: Int) -> Int { + // Инициализировать двусторонне замкнутый интервал [0, n-1] + var i = nums.startIndex + var j = nums.endIndex - 1 + while i <= j { + let m = i + (j - i) / 2 // Вычислить индекс середины m + if nums[m] < target { + i = m + 1 // target находится в интервале [m+1, j] + } else if nums[m] > target { + j = m - 1 // target находится в интервале [i, m-1] + } else { + return m // Найти target и вернуть точку вставки m + } + } + // target не найден, вернуть точку вставки i + return i +} + +/* Бинарный поиск точки вставки (с повторяющимися элементами) */ +public func binarySearchInsertion(nums: [Int], target: Int) -> Int { + // Инициализировать двусторонне замкнутый интервал [0, n-1] + var i = nums.startIndex + var j = nums.endIndex - 1 + while i <= j { + let m = i + (j - i) / 2 // Вычислить индекс середины m + if nums[m] < target { + i = m + 1 // target находится в интервале [m+1, j] + } else if nums[m] > target { + j = m - 1 // target находится в интервале [i, m-1] + } else { + j = m - 1 // Первый элемент меньше target находится в интервале [i, m-1] + } + } + // Вернуть точку вставки i + return i +} + +#if !TARGET + +@main +enum BinarySearchInsertion { + /* Driver Code */ + static func main() { + // Массив без повторяющихся элементов + var nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35] + print("\nМассив nums = \(nums)") + // Бинарный поиск точки вставки + for target in [6, 9] { + let index = binarySearchInsertionSimple(nums: nums, target: target) + print("Индекс позиции вставки элемента \(target) равен \(index)") + } + + // Массив с повторяющимися элементами + nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15] + print("\nМассив nums = \(nums)") + // Бинарный поиск точки вставки + for target in [2, 6, 20] { + let index = binarySearchInsertion(nums: nums, target: target) + print("Индекс позиции вставки элемента \(target) равен \(index)") + } + } +} + +#endif diff --git a/ru/codes/swift/chapter_searching/hashing_search.swift b/ru/codes/swift/chapter_searching/hashing_search.swift new file mode 100644 index 000000000..dd56f471a --- /dev/null +++ b/ru/codes/swift/chapter_searching/hashing_search.swift @@ -0,0 +1,50 @@ +/** + * File: hashing_search.swift + * Created Time: 2023-01-28 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Хеш-поиск (массив) */ +func hashingSearchArray(map: [Int: Int], target: Int) -> Int { + // key хеш-таблицы: целевой элемент, value: индекс + // Если такого key нет в хеш-таблице, вернуть -1 + return map[target, default: -1] +} + +/* Хеш-поиск (связный список) */ +func hashingSearchLinkedList(map: [Int: ListNode], target: Int) -> ListNode? { + // key хеш-таблицы: значение целевого узла, value: объект узла + // Если такого key нет в хеш-таблице, вернуть null + return map[target] +} + +@main +enum HashingSearch { + /* Driver Code */ + static func main() { + let target = 3 + + /* Хеш-поиск (массив) */ + let nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8] + // Инициализация хеш-таблицы + var map: [Int: Int] = [:] + for i in nums.indices { + map[nums[i]] = i // key: элемент, value: индекс + } + let index = hashingSearchArray(map: map, target: target) + print("Индекс целевого элемента 3 = \(index)") + + /* Хеш-поиск (связный список) */ + var head = ListNode.arrToLinkedList(arr: nums) + // Инициализация хеш-таблицы + var map1: [Int: ListNode] = [:] + while head != nil { + map1[head!.val] = head! // key: значение узла, value: узел + head = head?.next + } + let node = hashingSearchLinkedList(map: map1, target: target) + print("Объект узла со значением 3 = \(node!)") + } +} diff --git a/ru/codes/swift/chapter_searching/linear_search.swift b/ru/codes/swift/chapter_searching/linear_search.swift new file mode 100644 index 000000000..00e23991a --- /dev/null +++ b/ru/codes/swift/chapter_searching/linear_search.swift @@ -0,0 +1,53 @@ +/** + * File: linear_search.swift + * Created Time: 2023-01-28 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Линейный поиск (массив) */ +func linearSearchArray(nums: [Int], target: Int) -> Int { + // Обход массива + for i in nums.indices { + // Целевой элемент найден, вернуть его индекс + if nums[i] == target { + return i + } + } + // Целевой элемент не найден, вернуть -1 + return -1 +} + +/* Линейный поиск (связный список) */ +func linearSearchLinkedList(head: ListNode?, target: Int) -> ListNode? { + var head = head + // Обойти связный список + while head != nil { + // Найти целевой узел и вернуть его + if head?.val == target { + return head + } + head = head?.next + } + // Целевой узел не найден, вернуть null + return nil +} + +@main +enum LinearSearch { + /* Driver Code */ + static func main() { + let target = 3 + + /* Выполнить линейный поиск в массиве */ + let nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8] + let index = linearSearchArray(nums: nums, target: target) + print("Индекс целевого элемента 3 = \(index)") + + /* Выполнить линейный поиск в связном списке */ + let head = ListNode.arrToLinkedList(arr: nums) + let node = linearSearchLinkedList(head: head, target: target) + print("Объект узла со значением 3 = \(node!)") + } +} diff --git a/ru/codes/swift/chapter_searching/two_sum.swift b/ru/codes/swift/chapter_searching/two_sum.swift new file mode 100644 index 000000000..c496aeab5 --- /dev/null +++ b/ru/codes/swift/chapter_searching/two_sum.swift @@ -0,0 +1,49 @@ +/** + * File: two_sum.swift + * Created Time: 2023-01-03 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Метод 1: полный перебор */ +func twoSumBruteForce(nums: [Int], target: Int) -> [Int] { + // Два вложенных цикла, временная сложность O(n^2) + for i in nums.indices.dropLast() { + for j in nums.indices.dropFirst(i + 1) { + if nums[i] + nums[j] == target { + return [i, j] + } + } + } + return [0] +} + +/* Метод 2: вспомогательная хеш-таблица */ +func twoSumHashTable(nums: [Int], target: Int) -> [Int] { + // Вспомогательная хеш-таблица, пространственная сложность O(n) + var dic: [Int: Int] = [:] + // Один цикл, временная сложность O(n) + for i in nums.indices { + if let j = dic[target - nums[i]] { + return [j, i] + } + dic[nums[i]] = i + } + return [0] +} + +@main +enum LeetcodeTwoSum { + /* Driver Code */ + static func main() { + // ======= Test Case ======= + let nums = [2, 7, 11, 15] + let target = 13 + // ====== Основной код ====== + // Метод 1 + var res = twoSumBruteForce(nums: nums, target: target) + print("Результат метода 1 res = \(res)") + // Метод 2 + res = twoSumHashTable(nums: nums, target: target) + print("Результат метода 2 res = \(res)") + } +} diff --git a/ru/codes/swift/chapter_sorting/bubble_sort.swift b/ru/codes/swift/chapter_sorting/bubble_sort.swift new file mode 100644 index 000000000..40f9d60d2 --- /dev/null +++ b/ru/codes/swift/chapter_sorting/bubble_sort.swift @@ -0,0 +1,51 @@ +/** + * File: bubble_sort.swift + * Created Time: 2023-01-29 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Пузырьковая сортировка */ +func bubbleSort(nums: inout [Int]) { + // Внешний цикл: неотсортированный диапазон [0, i] + for i in nums.indices.dropFirst().reversed() { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for j in 0 ..< i { + if nums[j] > nums[j + 1] { + // Поменять местами nums[j] и nums[j + 1] + nums.swapAt(j, j + 1) + } + } + } +} + +/* Пузырьковая сортировка (оптимизация флагом) */ +func bubbleSortWithFlag(nums: inout [Int]) { + // Внешний цикл: неотсортированный диапазон [0, i] + for i in nums.indices.dropFirst().reversed() { + var flag = false // Инициализировать флаг + for j in 0 ..< i { + if nums[j] > nums[j + 1] { + // Поменять местами nums[j] и nums[j + 1] + nums.swapAt(j, j + 1) + flag = true // Записать обмен элементов + } + } + if !flag { // На этой итерации «всплытия» не было ни одного обмена, сразу выйти + break + } + } +} + +@main +enum BubbleSort { + /* Driver Code */ + static func main() { + var nums = [4, 1, 3, 1, 5, 2] + bubbleSort(nums: &nums) + print("После пузырьковой сортировки nums = \(nums)") + + var nums1 = [4, 1, 3, 1, 5, 2] + bubbleSortWithFlag(nums: &nums1) + print("После пузырьковой сортировки nums1 = \(nums1)") + } +} diff --git a/ru/codes/swift/chapter_sorting/bucket_sort.swift b/ru/codes/swift/chapter_sorting/bucket_sort.swift new file mode 100644 index 000000000..e50c925ed --- /dev/null +++ b/ru/codes/swift/chapter_sorting/bucket_sort.swift @@ -0,0 +1,43 @@ +/** + * File: bucket_sort.swift + * Created Time: 2023-03-27 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Сортировка корзинами */ +func bucketSort(nums: inout [Double]) { + // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину + let k = nums.count / 2 + var buckets = (0 ..< k).map { _ in [Double]() } + // 1. Распределить элементы массива по корзинам + for num in nums { + // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1] + let i = Int(num * Double(k)) + // Добавить num в корзину i + buckets[i].append(num) + } + // 2. Выполнить сортировку внутри каждой корзины + for i in buckets.indices { + // Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки + buckets[i].sort() + } + // 3. Обойти корзины и объединить результаты + var i = nums.startIndex + for bucket in buckets { + for num in bucket { + nums[i] = num + i += 1 + } + } +} + +@main +enum BucketSort { + /* Driver Code */ + static func main() { + // Пусть входные данные — числа с плавающей точкой из диапазона [0, 1) + var nums = [0.49, 0.96, 0.82, 0.09, 0.57, 0.43, 0.91, 0.75, 0.15, 0.37] + bucketSort(nums: &nums) + print("После сортировки корзинами nums = \(nums)") + } +} diff --git a/ru/codes/swift/chapter_sorting/counting_sort.swift b/ru/codes/swift/chapter_sorting/counting_sort.swift new file mode 100644 index 000000000..056d2ff4b --- /dev/null +++ b/ru/codes/swift/chapter_sorting/counting_sort.swift @@ -0,0 +1,70 @@ +/** + * File: counting_sort.swift + * Created Time: 2023-03-22 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Сортировка подсчетом */ +// Простая реализация, не подходит для сортировки объектов +func countingSortNaive(nums: inout [Int]) { + // 1. Найти максимальный элемент массива m + let m = nums.max()! + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + var counter = Array(repeating: 0, count: m + 1) + for num in nums { + counter[num] += 1 + } + // 3. Обойти counter и заполнить исходный массив nums элементами + var i = 0 + for num in 0 ..< m + 1 { + for _ in 0 ..< counter[num] { + nums[i] = num + i += 1 + } + } +} + +/* Сортировка подсчетом */ +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой +func countingSort(nums: inout [Int]) { + // 1. Найти максимальный элемент массива m + let m = nums.max()! + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + var counter = Array(repeating: 0, count: m + 1) + for num in nums { + counter[num] += 1 + } + // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс» + // То есть counter[num]-1 — это индекс последнего появления num в res + for i in 0 ..< m { + counter[i + 1] += counter[i] + } + // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res + // Инициализировать массив res для хранения результата + var res = Array(repeating: 0, count: nums.count) + for i in nums.indices.reversed() { + let num = nums[i] + res[counter[num] - 1] = num // Поместить num по соответствующему индексу + counter[num] -= 1 // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num + } + // Перезаписать исходный массив nums массивом результата res + for i in nums.indices { + nums[i] = res[i] + } +} + +@main +enum CountingSort { + /* Driver Code */ + static func main() { + var nums = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4] + countingSortNaive(nums: &nums) + print("После сортировки подсчетом (объекты не поддерживаются) nums = \(nums)") + + var nums1 = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4] + countingSort(nums: &nums1) + print("После сортировки подсчетом nums1 = \(nums1)") + } +} diff --git a/ru/codes/swift/chapter_sorting/heap_sort.swift b/ru/codes/swift/chapter_sorting/heap_sort.swift new file mode 100644 index 000000000..4ed3e3f5f --- /dev/null +++ b/ru/codes/swift/chapter_sorting/heap_sort.swift @@ -0,0 +1,55 @@ +/** + * File: heap_sort.swift + * Created Time: 2023-05-28 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */ +func siftDown(nums: inout [Int], n: Int, i: Int) { + var i = i + while true { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + let l = 2 * i + 1 + let r = 2 * i + 2 + var ma = i + if l < n, nums[l] > nums[ma] { + ma = l + } + if r < n, nums[r] > nums[ma] { + ma = r + } + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if ma == i { + break + } + // Поменять два узла местами + nums.swapAt(i, ma) + // Циклическое просеивание вниз + i = ma + } +} + +/* Сортировка кучей */ +func heapSort(nums: inout [Int]) { + // Построение кучи: выполнить heapify для всех узлов, кроме листовых + for i in stride(from: nums.count / 2 - 1, through: 0, by: -1) { + siftDown(nums: &nums, n: nums.count, i: i) + } + // Извлекать максимальный элемент из кучи в течение n-1 итераций + for i in nums.indices.dropFirst().reversed() { + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + nums.swapAt(0, i) + // Начиная с корневого узла, выполнить просеивание сверху вниз + siftDown(nums: &nums, n: i, i: 0) + } +} + +@main +enum HeapSort { + /* Driver Code */ + static func main() { + var nums = [4, 1, 3, 1, 5, 2] + heapSort(nums: &nums) + print("После сортировки кучей nums = \(nums)") + } +} diff --git a/ru/codes/swift/chapter_sorting/insertion_sort.swift b/ru/codes/swift/chapter_sorting/insertion_sort.swift new file mode 100644 index 000000000..59a65e043 --- /dev/null +++ b/ru/codes/swift/chapter_sorting/insertion_sort.swift @@ -0,0 +1,30 @@ +/** + * File: insertion_sort.swift + * Created Time: 2023-01-29 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Сортировка вставками */ +func insertionSort(nums: inout [Int]) { + // Внешний цикл: отсортированный диапазон [0, i-1] + for i in nums.indices.dropFirst() { + let base = nums[i] + var j = i - 1 + // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1] + while j >= 0, nums[j] > base { + nums[j + 1] = nums[j] // Сдвинуть nums[j] на одну позицию вправо + j -= 1 + } + nums[j + 1] = base // Поместить base в правильную позицию + } +} + +@main +enum InsertionSort { + /* Driver Code */ + static func main() { + var nums = [4, 1, 3, 1, 5, 2] + insertionSort(nums: &nums) + print("После сортировки вставками nums = \(nums)") + } +} diff --git a/ru/codes/swift/chapter_sorting/merge_sort.swift b/ru/codes/swift/chapter_sorting/merge_sort.swift new file mode 100644 index 000000000..4ea5595dc --- /dev/null +++ b/ru/codes/swift/chapter_sorting/merge_sort.swift @@ -0,0 +1,65 @@ +/** + * File: merge_sort.swift + * Created Time: 2023-01-29 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Объединить левый и правый подмассивы */ +func merge(nums: inout [Int], left: Int, mid: Int, right: Int) { + // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right] + // Создать временный массив tmp для хранения результата слияния + var tmp = Array(repeating: 0, count: right - left + 1) + // Инициализировать начальные индексы левого и правого подмассивов + var i = left, j = mid + 1, k = 0 + // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив + while i <= mid, j <= right { + if nums[i] <= nums[j] { + tmp[k] = nums[i] + i += 1 + } else { + tmp[k] = nums[j] + j += 1 + } + k += 1 + } + // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив + while i <= mid { + tmp[k] = nums[i] + i += 1 + k += 1 + } + while j <= right { + tmp[k] = nums[j] + j += 1 + k += 1 + } + // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums + for k in tmp.indices { + nums[left + k] = tmp[k] + } +} + +/* Сортировка слиянием */ +func mergeSort(nums: inout [Int], left: Int, right: Int) { + // Условие завершения + if left >= right { // Завершить рекурсию, когда длина подмассива равна 1 + return + } + // Этап разбиения + let mid = left + (right - left) / 2 // Вычислить середину + mergeSort(nums: &nums, left: left, right: mid) // Рекурсивно обработать левый подмассив + mergeSort(nums: &nums, left: mid + 1, right: right) // Рекурсивно обработать правый подмассив + // Этап слияния + merge(nums: &nums, left: left, mid: mid, right: right) +} + +@main +enum MergeSort { + /* Driver Code */ + static func main() { + /* Сортировка слиянием */ + var nums = [7, 3, 2, 6, 0, 1, 5, 4] + mergeSort(nums: &nums, left: nums.startIndex, right: nums.endIndex - 1) + print("После сортировки слиянием nums = \(nums)") + } +} diff --git a/ru/codes/swift/chapter_sorting/quick_sort.swift b/ru/codes/swift/chapter_sorting/quick_sort.swift new file mode 100644 index 000000000..a5807f2ce --- /dev/null +++ b/ru/codes/swift/chapter_sorting/quick_sort.swift @@ -0,0 +1,114 @@ +/** + * File: quick_sort.swift + * Created Time: 2023-01-29 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Класс быстрой сортировки */ +/* Разбиение с опорными указателями */ +func partition(nums: inout [Int], left: Int, right: Int) -> Int { + // Взять nums[left] в качестве опорного элемента + var i = left + var j = right + while i < j { + while i < j, nums[j] >= nums[left] { + j -= 1 // Идти справа налево в поисках первого элемента меньше опорного + } + while i < j, nums[i] <= nums[left] { + i += 1 // Идти слева направо в поисках первого элемента больше опорного + } + nums.swapAt(i, j) // Поменять эти два элемента местами + } + nums.swapAt(i, left) // Переместить опорный элемент на границу двух подмассивов + return i // Вернуть индекс опорного элемента +} + +/* Быстрая сортировка */ +func quickSort(nums: inout [Int], left: Int, right: Int) { + // Завершить рекурсию, когда длина подмассива равна 1 + if left >= right { + return + } + // Разбиение с опорными указателями + let pivot = partition(nums: &nums, left: left, right: right) + // Рекурсивно обработать левый и правый подмассивы + quickSort(nums: &nums, left: left, right: pivot - 1) + quickSort(nums: &nums, left: pivot + 1, right: right) +} + +/* Класс быстрой сортировки (оптимизация медианным опорным элементом) */ +/* Выбрать медиану из трех кандидатов */ +func medianThree(nums: [Int], left: Int, mid: Int, right: Int) -> Int { + let l = nums[left] + let m = nums[mid] + let r = nums[right] + if (l <= m && m <= r) || (r <= m && m <= l) { + return mid // m находится между l и r + } + if (m <= l && l <= r) || (r <= l && l <= m) { + return left // l находится между m и r + } + return right +} + +/* Разбиение с опорными указателями (медиана трех) */ +func partitionMedian(nums: inout [Int], left: Int, right: Int) -> Int { + // Выбрать медиану из трех кандидатов + let med = medianThree(nums: nums, left: left, mid: left + (right - left) / 2, right: right) + // Переместить медиану в крайний левый элемент массива + nums.swapAt(left, med) + return partition(nums: &nums, left: left, right: right) +} + +/* Быстрая сортировка (оптимизация медианным опорным элементом) */ +func quickSortMedian(nums: inout [Int], left: Int, right: Int) { + // Завершить рекурсию, когда длина подмассива равна 1 + if left >= right { + return + } + // Разбиение с опорными указателями + let pivot = partitionMedian(nums: &nums, left: left, right: right) + // Рекурсивно обработать левый и правый подмассивы + quickSortMedian(nums: &nums, left: left, right: pivot - 1) + quickSortMedian(nums: &nums, left: pivot + 1, right: right) +} + +/* Быстрая сортировка (оптимизация глубины рекурсии) */ +func quickSortTailCall(nums: inout [Int], left: Int, right: Int) { + var left = left + var right = right + // Завершить, когда длина подмассива равна 1 + while left < right { + // Операция разбиения с опорными указателями + let pivot = partition(nums: &nums, left: left, right: right) + // Выполнить быструю сортировку для более короткого из двух подмассивов + if (pivot - left) < (right - pivot) { + quickSortTailCall(nums: &nums, left: left, right: pivot - 1) // Рекурсивно отсортировать левый подмассив + left = pivot + 1 // Оставшийся неотсортированный диапазон: [pivot + 1, right] + } else { + quickSortTailCall(nums: &nums, left: pivot + 1, right: right) // Рекурсивно отсортировать правый подмассив + right = pivot - 1 // Оставшийся неотсортированный диапазон: [left, pivot - 1] + } + } +} + +@main +enum QuickSort { + /* Driver Code */ + static func main() { + /* Быстрая сортировка */ + var nums = [2, 4, 1, 0, 3, 5] + quickSort(nums: &nums, left: nums.startIndex, right: nums.endIndex - 1) + print("После быстрой сортировки nums = \(nums)") + + /* Быстрая сортировка (оптимизация медианным опорным элементом) */ + var nums1 = [2, 4, 1, 0, 3, 5] + quickSortMedian(nums: &nums1, left: nums1.startIndex, right: nums1.endIndex - 1) + print("После быстрой сортировки (оптимизация медианным опорным элементом) nums1 = \(nums1)") + + /* Быстрая сортировка (оптимизация глубины рекурсии) */ + var nums2 = [2, 4, 1, 0, 3, 5] + quickSortTailCall(nums: &nums2, left: nums2.startIndex, right: nums2.endIndex - 1) + print("После быстрой сортировки (оптимизация глубины рекурсии) nums2 = \(nums2)") + } +} diff --git a/ru/codes/swift/chapter_sorting/radix_sort.swift b/ru/codes/swift/chapter_sorting/radix_sort.swift new file mode 100644 index 000000000..2ee69124d --- /dev/null +++ b/ru/codes/swift/chapter_sorting/radix_sort.swift @@ -0,0 +1,79 @@ +/** + * File: radix_sort.swift + * Created Time: 2023-01-29 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Получить k-й разряд элемента num, где exp = 10^(k-1) */ +func digit(num: Int, exp: Int) -> Int { + // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени + (num / exp) % 10 +} + +/* Сортировка подсчетом (сортировка по k-му разряду nums) */ +func countingSortDigit(nums: inout [Int], exp: Int) { + // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10 + var counter = Array(repeating: 0, count: 10) + // Подсчитать число появлений каждой цифры от 0 до 9 + for i in nums.indices { + let d = digit(num: nums[i], exp: exp) // Получить k-й разряд nums[i], обозначив его как d + counter[d] += 1 // Подсчитать число появлений цифры d + } + // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива» + for i in 1 ..< 10 { + counter[i] += counter[i - 1] + } + // Выполняя обратный проход, заполнить res элементами по статистике в корзинах + var res = Array(repeating: 0, count: nums.count) + for i in nums.indices.reversed() { + let d = digit(num: nums[i], exp: exp) + let j = counter[d] - 1 // Получить индекс j цифры d в массиве + res[j] = nums[i] // Поместить текущий элемент по индексу j + counter[d] -= 1 // Уменьшить количество d на 1 + } + // Перезаписать исходный массив nums результатом + for i in nums.indices { + nums[i] = res[i] + } +} + +/* Поразрядная сортировка */ +func radixSort(nums: inout [Int]) { + // Получить максимальный элемент массива, чтобы определить максимальное число разрядов + var m = Int.min + for num in nums { + if num > m { + m = num + } + } + // Проходить разряды от младшего к старшему + for exp in sequence(first: 1, next: { m >= ($0 * 10) ? $0 * 10 : nil }) { + // Выполнить сортировку подсчетом по k-му разряду элементов массива + // k = 1 -> exp = 1 + // k = 2 -> exp = 10 + // то есть exp = 10^(k-1) + countingSortDigit(nums: &nums, exp: exp) + } +} + +@main +enum RadixSort { + /* Driver Code */ + static func main() { + // Поразрядная сортировка + var nums = [ + 10_546_151, + 35_663_510, + 42_865_989, + 34_862_445, + 81_883_077, + 88_906_420, + 72_429_244, + 30_524_779, + 82_060_337, + 63_832_996, + ] + radixSort(nums: &nums) + print("После поразрядной сортировки nums = \(nums)") + } +} diff --git a/ru/codes/swift/chapter_sorting/selection_sort.swift b/ru/codes/swift/chapter_sorting/selection_sort.swift new file mode 100644 index 000000000..fd8776749 --- /dev/null +++ b/ru/codes/swift/chapter_sorting/selection_sort.swift @@ -0,0 +1,31 @@ +/** + * File: selection_sort.swift + * Created Time: 2023-05-28 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Сортировка выбором */ +func selectionSort(nums: inout [Int]) { + // Внешний цикл: неотсортированный диапазон [i, n-1] + for i in nums.indices.dropLast() { + // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне + var k = i + for j in nums.indices.dropFirst(i + 1) { + if nums[j] < nums[k] { + k = j // Записать индекс минимального элемента + } + } + // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона + nums.swapAt(i, k) + } +} + +@main +enum SelectionSort { + /* Driver Code */ + static func main() { + var nums = [4, 1, 3, 1, 5, 2] + selectionSort(nums: &nums) + print("После сортировки выбором nums = \(nums)") + } +} diff --git a/ru/codes/swift/chapter_stack_and_queue/array_deque.swift b/ru/codes/swift/chapter_stack_and_queue/array_deque.swift new file mode 100644 index 000000000..06a89535c --- /dev/null +++ b/ru/codes/swift/chapter_stack_and_queue/array_deque.swift @@ -0,0 +1,148 @@ +/** + * File: array_deque.swift + * Created Time: 2023-02-22 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Двусторонняя очередь на основе кольцевого массива */ +class ArrayDeque { + private var nums: [Int] // Массив для хранения элементов двусторонней очереди + private var front: Int // Указатель head, указывающий на первый элемент очереди + private var _size: Int // Длина двусторонней очереди + + /* Конструктор */ + init(capacity: Int) { + nums = Array(repeating: 0, count: capacity) + front = 0 + _size = 0 + } + + /* Получить вместимость двусторонней очереди */ + func capacity() -> Int { + nums.count + } + + /* Получение длины двусторонней очереди */ + func size() -> Int { + _size + } + + /* Проверка, пуста ли двусторонняя очередь */ + func isEmpty() -> Bool { + size() == 0 + } + + /* Вычислить индекс в кольцевом массиве */ + private func index(i: Int) -> Int { + // С помощью операции взятия по модулю соединить начало и конец массива + // Когда i выходит за конец массива, он возвращается в начало + // Когда i выходит за начало массива, он возвращается в конец + (i + capacity()) % capacity() + } + + /* Добавление в голову очереди */ + func pushFirst(num: Int) { + if size() == capacity() { + print("Двусторонняя очередь заполнена") + return + } + // Указатель головы сдвигается на одну позицию влево + // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост + front = index(i: front - 1) + // Добавить num в голову очереди + nums[front] = num + _size += 1 + } + + /* Добавление в хвост очереди */ + func pushLast(num: Int) { + if size() == capacity() { + print("Двусторонняя очередь заполнена") + return + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + let rear = index(i: front + size()) + // Добавить num в хвост очереди + nums[rear] = num + _size += 1 + } + + /* Извлечение из головы очереди */ + func popFirst() -> Int { + let num = peekFirst() + // Указатель головы сдвигается на одну позицию назад + front = index(i: front + 1) + _size -= 1 + return num + } + + /* Извлечение из хвоста очереди */ + func popLast() -> Int { + let num = peekLast() + _size -= 1 + return num + } + + /* Доступ к элементу в начале очереди */ + func peekFirst() -> Int { + if isEmpty() { + fatalError("двусторонняя очередь пуста") + } + return nums[front] + } + + /* Доступ к элементу в конце очереди */ + func peekLast() -> Int { + if isEmpty() { + fatalError("двусторонняя очередь пуста") + } + // Вычислить индекс хвостового элемента + let last = index(i: front + size() - 1) + return nums[last] + } + + /* Вернуть массив для вывода */ + func toArray() -> [Int] { + // Преобразовывать только элементы списка в пределах фактической длины + (front ..< front + size()).map { nums[index(i: $0)] } + } +} + +@main +enum _ArrayDeque { + /* Driver Code */ + static func main() { + /* Инициализация двусторонней очереди */ + let deque = ArrayDeque(capacity: 10) + deque.pushLast(num: 3) + deque.pushLast(num: 2) + deque.pushLast(num: 5) + print("Двусторонняя очередь deque = \(deque.toArray())") + + /* Доступ к элементу */ + let peekFirst = deque.peekFirst() + print("Первый элемент peekFirst = \(peekFirst)") + let peekLast = deque.peekLast() + print("Последний элемент peekLast = \(peekLast)") + + /* Добавление элемента в очередь */ + deque.pushLast(num: 4) + print("После добавления элемента 4 в хвост deque = \(deque.toArray())") + deque.pushFirst(num: 1) + print("После добавления элемента 1 в голову deque = \(deque.toArray())") + + /* Извлечение элемента из очереди */ + let popLast = deque.popLast() + print("Извлеченный из хвоста элемент = \(popLast), deque после извлечения из хвоста = \(deque.toArray())") + let popFirst = deque.popFirst() + print("Извлеченный из головы элемент = \(popFirst), deque после извлечения из головы = \(deque.toArray())") + + /* Получение длины двусторонней очереди */ + let size = deque.size() + print("Длина двусторонней очереди size = \(size)") + + /* Проверка, пуста ли двусторонняя очередь */ + let isEmpty = deque.isEmpty() + print("Пуста ли двусторонняя очередь = \(isEmpty)") + } +} diff --git a/ru/codes/swift/chapter_stack_and_queue/array_queue.swift b/ru/codes/swift/chapter_stack_and_queue/array_queue.swift new file mode 100644 index 000000000..b3fb17934 --- /dev/null +++ b/ru/codes/swift/chapter_stack_and_queue/array_queue.swift @@ -0,0 +1,113 @@ +/** + * File: array_queue.swift + * Created Time: 2023-01-11 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Очередь на основе кольцевого массива */ +class ArrayQueue { + private var nums: [Int] // Массив для хранения элементов очереди + private var front: Int // Указатель head, указывающий на первый элемент очереди + private var _size: Int // Длина очереди + + init(capacity: Int) { + // Инициализация массива + nums = Array(repeating: 0, count: capacity) + front = 0 + _size = 0 + } + + /* Получить вместимость очереди */ + func capacity() -> Int { + nums.count + } + + /* Получение длины очереди */ + func size() -> Int { + _size + } + + /* Проверка, пуста ли очередь */ + func isEmpty() -> Bool { + size() == 0 + } + + /* Поместить в очередь */ + func push(num: Int) { + if size() == capacity() { + print("Очередь заполнена") + return + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива + let rear = (front + size()) % capacity() + // Добавить num в хвост очереди + nums[rear] = num + _size += 1 + } + + /* Извлечь из очереди */ + @discardableResult + func pop() -> Int { + let num = peek() + // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива + front = (front + 1) % capacity() + _size -= 1 + return num + } + + /* Доступ к элементу в начале очереди */ + func peek() -> Int { + if isEmpty() { + fatalError("очередь пуста") + } + return nums[front] + } + + /* Вернуть массив */ + func toArray() -> [Int] { + // Преобразовывать только элементы списка в пределах фактической длины + (front ..< front + size()).map { nums[$0 % capacity()] } + } +} + +@main +enum _ArrayQueue { + /* Driver Code */ + static func main() { + /* Инициализация очереди */ + let capacity = 10 + let queue = ArrayQueue(capacity: capacity) + + /* Добавление элемента в очередь */ + queue.push(num: 1) + queue.push(num: 3) + queue.push(num: 2) + queue.push(num: 5) + queue.push(num: 4) + print("Очередь queue = \(queue.toArray())") + + /* Доступ к элементу в начале очереди */ + let peek = queue.peek() + print("Первый элемент peek = \(peek)") + + /* Извлечение элемента из очереди */ + let pop = queue.pop() + print("Извлеченный элемент pop = \(pop), queue после извлечения = \(queue.toArray())") + + /* Получение длины очереди */ + let size = queue.size() + print("Длина очереди size = \(size)") + + /* Проверка, пуста ли очередь */ + let isEmpty = queue.isEmpty() + print("Пуста ли очередь = \(isEmpty)") + + /* Проверка кольцевого массива */ + for i in 0 ..< 10 { + queue.push(num: i) + queue.pop() + print("После \(i)-го раунда операций enqueue и dequeue queue = \(queue.toArray())") + } + } +} diff --git a/ru/codes/swift/chapter_stack_and_queue/array_stack.swift b/ru/codes/swift/chapter_stack_and_queue/array_stack.swift new file mode 100644 index 000000000..5c438e613 --- /dev/null +++ b/ru/codes/swift/chapter_stack_and_queue/array_stack.swift @@ -0,0 +1,85 @@ +/** + * File: array_stack.swift + * Created Time: 2023-01-09 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Стек на основе массива */ +class ArrayStack { + private var stack: [Int] + + init() { + // Инициализация списка (динамического массива) + stack = [] + } + + /* Получение длины стека */ + func size() -> Int { + stack.count + } + + /* Проверка, пуст ли стек */ + func isEmpty() -> Bool { + stack.isEmpty + } + + /* Поместить в стек */ + func push(num: Int) { + stack.append(num) + } + + /* Извлечь из стека */ + @discardableResult + func pop() -> Int { + if isEmpty() { + fatalError("стек пуст") + } + return stack.removeLast() + } + + /* Доступ к верхнему элементу стека */ + func peek() -> Int { + if isEmpty() { + fatalError("стек пуст") + } + return stack.last! + } + + /* Преобразовать List в Array и вернуть */ + func toArray() -> [Int] { + stack + } +} + +@main +enum _ArrayStack { + /* Driver Code */ + static func main() { + /* Инициализация стека */ + let stack = ArrayStack() + + /* Помещение элемента в стек */ + stack.push(num: 1) + stack.push(num: 3) + stack.push(num: 2) + stack.push(num: 5) + stack.push(num: 4) + print("Стек stack = \(stack.toArray())") + + /* Доступ к верхнему элементу стека */ + let peek = stack.peek() + print("Верхний элемент peek = \(peek)") + + /* Извлечение элемента из стека */ + let pop = stack.pop() + print("Извлеченный элемент pop = \(pop), stack после извлечения = \(stack.toArray())") + + /* Получение длины стека */ + let size = stack.size() + print("Длина стека size = \(size)") + + /* Проверка на пустоту */ + let isEmpty = stack.isEmpty() + print("Пуст ли стек = \(isEmpty)") + } +} diff --git a/ru/codes/swift/chapter_stack_and_queue/deque.swift b/ru/codes/swift/chapter_stack_and_queue/deque.swift new file mode 100644 index 000000000..f5aa48207 --- /dev/null +++ b/ru/codes/swift/chapter_stack_and_queue/deque.swift @@ -0,0 +1,44 @@ +/** + * File: deque.swift + * Created Time: 2023-01-14 + * Author: nuomi1 (nuomi1@qq.com) + */ + +@main +enum Deque { + /* Driver Code */ + static func main() { + /* Инициализация двусторонней очереди */ + // В Swift нет встроенного класса двусторонней очереди, поэтому Array можно использовать как двустороннюю очередь + var deque: [Int] = [] + + /* Добавление элемента в очередь */ + deque.append(2) + deque.append(5) + deque.append(4) + deque.insert(3, at: 0) + deque.insert(1, at: 0) + print("Двусторонняя очередь deque = \(deque)") + + /* Доступ к элементу */ + let peekFirst = deque.first! + print("Первый элемент peekFirst = \(peekFirst)") + let peekLast = deque.last! + print("Последний элемент peekLast = \(peekLast)") + + /* Извлечение элемента из очереди */ + // При использовании Array для имитации popFirst имеет сложность O(n) + let popFirst = deque.removeFirst() + print("Извлеченный из головы элемент popFirst = \(popFirst), deque после извлечения из головы = \(deque)") + let popLast = deque.removeLast() + print("Извлеченный из хвоста элемент popLast = \(popLast), deque после извлечения из хвоста = \(deque)") + + /* Получение длины двусторонней очереди */ + let size = deque.count + print("Длина двусторонней очереди size = \(size)") + + /* Проверка, пуста ли двусторонняя очередь */ + let isEmpty = deque.isEmpty + print("Пуста ли двусторонняя очередь = \(isEmpty)") + } +} diff --git a/ru/codes/swift/chapter_stack_and_queue/linkedlist_deque.swift b/ru/codes/swift/chapter_stack_and_queue/linkedlist_deque.swift new file mode 100644 index 000000000..c59585da8 --- /dev/null +++ b/ru/codes/swift/chapter_stack_and_queue/linkedlist_deque.swift @@ -0,0 +1,180 @@ +/** + * File: linkedlist_deque.swift + * Created Time: 2023-02-22 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Узел двусвязного списка */ +class ListNode { + var val: Int // Значение узла + var next: ListNode? // Ссылка на узел-преемник + weak var prev: ListNode? // Ссылка на узел-предшественник + + init(val: Int) { + self.val = val + } +} + +/* Двусторонняя очередь на основе двусвязного списка */ +class LinkedListDeque { + private var front: ListNode? // Головной узел front + private var rear: ListNode? // Хвостовой узел rear + private var _size: Int // Длина двусторонней очереди + + init() { + _size = 0 + } + + /* Получение длины двусторонней очереди */ + func size() -> Int { + _size + } + + /* Проверка, пуста ли двусторонняя очередь */ + func isEmpty() -> Bool { + size() == 0 + } + + /* Операция добавления в очередь */ + private func push(num: Int, isFront: Bool) { + let node = ListNode(val: num) + // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node + if isEmpty() { + front = node + rear = node + } + // Операция добавления в голову очереди + else if isFront { + // Добавить node в голову списка + front?.prev = node + node.next = front + front = node // Обновить головной узел + } + // Операция добавления в хвост очереди + else { + // Добавить node в хвост списка + rear?.next = node + node.prev = rear + rear = node // Обновить хвостовой узел + } + _size += 1 // Обновить длину очереди + } + + /* Добавление в голову очереди */ + func pushFirst(num: Int) { + push(num: num, isFront: true) + } + + /* Добавление в хвост очереди */ + func pushLast(num: Int) { + push(num: num, isFront: false) + } + + /* Операция извлечения из очереди */ + private func pop(isFront: Bool) -> Int { + if isEmpty() { + fatalError("двусторонняя очередь пуста") + } + let val: Int + // Операция извлечения из головы очереди + if isFront { + val = front!.val // Временно сохранить значение головного узла + // Удалить головной узел + let fNext = front?.next + if fNext != nil { + fNext?.prev = nil + front?.next = nil + } + front = fNext // Обновить головной узел + } + // Операция извлечения из хвоста очереди + else { + val = rear!.val // Временно сохранить значение хвостового узла + // Удалить хвостовой узел + let rPrev = rear?.prev + if rPrev != nil { + rPrev?.next = nil + rear?.prev = nil + } + rear = rPrev // Обновить хвостовой узел + } + _size -= 1 // Обновить длину очереди + return val + } + + /* Извлечение из головы очереди */ + func popFirst() -> Int { + pop(isFront: true) + } + + /* Извлечение из хвоста очереди */ + func popLast() -> Int { + pop(isFront: false) + } + + /* Доступ к элементу в начале очереди */ + func peekFirst() -> Int { + if isEmpty() { + fatalError("двусторонняя очередь пуста") + } + return front!.val + } + + /* Доступ к элементу в конце очереди */ + func peekLast() -> Int { + if isEmpty() { + fatalError("двусторонняя очередь пуста") + } + return rear!.val + } + + /* Вернуть массив для вывода */ + func toArray() -> [Int] { + var node = front + var res = Array(repeating: 0, count: size()) + for i in res.indices { + res[i] = node!.val + node = node?.next + } + return res + } +} + +@main +enum _LinkedListDeque { + /* Driver Code */ + static func main() { + /* Инициализация двусторонней очереди */ + let deque = LinkedListDeque() + deque.pushLast(num: 3) + deque.pushLast(num: 2) + deque.pushLast(num: 5) + print("Двусторонняя очередь deque = \(deque.toArray())") + + /* Доступ к элементу */ + let peekFirst = deque.peekFirst() + print("Первый элемент peekFirst = \(peekFirst)") + let peekLast = deque.peekLast() + print("Последний элемент peekLast = \(peekLast)") + + /* Добавление элемента в очередь */ + deque.pushLast(num: 4) + print("После добавления элемента 4 в хвост deque = \(deque.toArray())") + deque.pushFirst(num: 1) + print("После добавления элемента 1 в голову deque = \(deque.toArray())") + + /* Извлечение элемента из очереди */ + let popLast = deque.popLast() + print("Извлеченный из хвоста элемент = \(popLast), deque после извлечения из хвоста = \(deque.toArray())") + let popFirst = deque.popFirst() + print("Извлеченный из головы элемент = \(popFirst), deque после извлечения из головы = \(deque.toArray())") + + /* Получение длины двусторонней очереди */ + let size = deque.size() + print("Длина двусторонней очереди size = \(size)") + + /* Проверка, пуста ли двусторонняя очередь */ + let isEmpty = deque.isEmpty() + print("Пуста ли двусторонняя очередь = \(isEmpty)") + } +} diff --git a/ru/codes/swift/chapter_stack_and_queue/linkedlist_queue.swift b/ru/codes/swift/chapter_stack_and_queue/linkedlist_queue.swift new file mode 100644 index 000000000..d0158398f --- /dev/null +++ b/ru/codes/swift/chapter_stack_and_queue/linkedlist_queue.swift @@ -0,0 +1,107 @@ +/** + * File: linkedlist_queue.swift + * Created Time: 2023-01-11 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Очередь на основе связного списка */ +class LinkedListQueue { + private var front: ListNode? // Головной узел + private var rear: ListNode? // Хвостовой узел + private var _size: Int + + init() { + _size = 0 + } + + /* Получение длины очереди */ + func size() -> Int { + _size + } + + /* Проверка, пуста ли очередь */ + func isEmpty() -> Bool { + size() == 0 + } + + /* Поместить в очередь */ + func push(num: Int) { + // Добавить num после хвостового узла + let node = ListNode(x: num) + // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел + if front == nil { + front = node + rear = node + } + // Если очередь не пуста, добавить этот узел после хвостового узла + else { + rear?.next = node + rear = node + } + _size += 1 + } + + /* Извлечь из очереди */ + @discardableResult + func pop() -> Int { + let num = peek() + // Удалить головной узел + front = front?.next + _size -= 1 + return num + } + + /* Доступ к элементу в начале очереди */ + func peek() -> Int { + if isEmpty() { + fatalError("очередь пуста") + } + return front!.val + } + + /* Преобразовать связный список в Array и вернуть */ + func toArray() -> [Int] { + var node = front + var res = Array(repeating: 0, count: size()) + for i in res.indices { + res[i] = node!.val + node = node?.next + } + return res + } +} + +@main +enum _LinkedListQueue { + /* Driver Code */ + static func main() { + /* Инициализация очереди */ + let queue = LinkedListQueue() + + /* Добавление элемента в очередь */ + queue.push(num: 1) + queue.push(num: 3) + queue.push(num: 2) + queue.push(num: 5) + queue.push(num: 4) + print("Очередь queue = \(queue.toArray())") + + /* Доступ к элементу в начале очереди */ + let peek = queue.peek() + print("Первый элемент peek = \(peek)") + + /* Извлечение элемента из очереди */ + let pop = queue.pop() + print("Извлеченный элемент pop = \(pop), queue после извлечения = \(queue.toArray())") + + /* Получение длины очереди */ + let size = queue.size() + print("Длина очереди size = \(size)") + + /* Проверка, пуста ли очередь */ + let isEmpty = queue.isEmpty() + print("Пуста ли очередь = \(isEmpty)") + } +} diff --git a/ru/codes/swift/chapter_stack_and_queue/linkedlist_stack.swift b/ru/codes/swift/chapter_stack_and_queue/linkedlist_stack.swift new file mode 100644 index 000000000..ff3420e34 --- /dev/null +++ b/ru/codes/swift/chapter_stack_and_queue/linkedlist_stack.swift @@ -0,0 +1,96 @@ +/** + * File: linkedlist_stack.swift + * Created Time: 2023-01-09 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Стек на основе связного списка */ +class LinkedListStack { + private var _peek: ListNode? // Использовать головной узел как вершину стека + private var _size: Int // Длина стека + + init() { + _size = 0 + } + + /* Получение длины стека */ + func size() -> Int { + _size + } + + /* Проверка, пуст ли стек */ + func isEmpty() -> Bool { + size() == 0 + } + + /* Поместить в стек */ + func push(num: Int) { + let node = ListNode(x: num) + node.next = _peek + _peek = node + _size += 1 + } + + /* Извлечь из стека */ + @discardableResult + func pop() -> Int { + let num = peek() + _peek = _peek?.next + _size -= 1 + return num + } + + /* Доступ к верхнему элементу стека */ + func peek() -> Int { + if isEmpty() { + fatalError("стек пуст") + } + return _peek!.val + } + + /* Преобразовать List в Array и вернуть */ + func toArray() -> [Int] { + var node = _peek + var res = Array(repeating: 0, count: size()) + for i in res.indices.reversed() { + res[i] = node!.val + node = node?.next + } + return res + } +} + +@main +enum _LinkedListStack { + /* Driver Code */ + static func main() { + /* Инициализация стека */ + let stack = LinkedListStack() + + /* Помещение элемента в стек */ + stack.push(num: 1) + stack.push(num: 3) + stack.push(num: 2) + stack.push(num: 5) + stack.push(num: 4) + print("Стек stack = \(stack.toArray())") + + /* Доступ к верхнему элементу стека */ + let peek = stack.peek() + print("Верхний элемент peek = \(peek)") + + /* Извлечение элемента из стека */ + let pop = stack.pop() + print("Извлеченный элемент pop = \(pop), stack после извлечения = \(stack.toArray())") + + /* Получение длины стека */ + let size = stack.size() + print("Длина стека size = \(size)") + + /* Проверка на пустоту */ + let isEmpty = stack.isEmpty() + print("Пуст ли стек = \(isEmpty)") + } +} diff --git a/ru/codes/swift/chapter_stack_and_queue/queue.swift b/ru/codes/swift/chapter_stack_and_queue/queue.swift new file mode 100644 index 000000000..48abbad7d --- /dev/null +++ b/ru/codes/swift/chapter_stack_and_queue/queue.swift @@ -0,0 +1,40 @@ +/** + * File: queue.swift + * Created Time: 2023-01-11 + * Author: nuomi1 (nuomi1@qq.com) + */ + +@main +enum Queue { + /* Driver Code */ + static func main() { + /* Инициализация очереди */ + // В Swift нет встроенного класса очереди, поэтому Array можно использовать как очередь + var queue: [Int] = [] + + /* Добавление элемента в очередь */ + queue.append(1) + queue.append(3) + queue.append(2) + queue.append(5) + queue.append(4) + print("Очередь queue = \(queue)") + + /* Доступ к элементу в начале очереди */ + let peek = queue.first! + print("Первый элемент peek = \(peek)") + + /* Извлечение элемента из очереди */ + // При использовании Array для имитации pop имеет сложность O(n) + let pool = queue.removeFirst() + print("Извлеченный элемент pop = \(pool), queue после извлечения = \(queue)") + + /* Получение длины очереди */ + let size = queue.count + print("Длина очереди size = \(size)") + + /* Проверка, пуста ли очередь */ + let isEmpty = queue.isEmpty + print("Пуста ли очередь = \(isEmpty)") + } +} diff --git a/ru/codes/swift/chapter_stack_and_queue/stack.swift b/ru/codes/swift/chapter_stack_and_queue/stack.swift new file mode 100644 index 000000000..09d13025d --- /dev/null +++ b/ru/codes/swift/chapter_stack_and_queue/stack.swift @@ -0,0 +1,39 @@ +/** + * File: stack.swift + * Created Time: 2023-01-09 + * Author: nuomi1 (nuomi1@qq.com) + */ + +@main +enum Stack { + /* Driver Code */ + static func main() { + /* Инициализация стека */ + // В Swift нет встроенного класса стека, поэтому Array можно использовать как стек + var stack: [Int] = [] + + /* Помещение элемента в стек */ + stack.append(1) + stack.append(3) + stack.append(2) + stack.append(5) + stack.append(4) + print("Стек stack = \(stack)") + + /* Доступ к верхнему элементу стека */ + let peek = stack.last! + print("Верхний элемент peek = \(peek)") + + /* Извлечение элемента из стека */ + let pop = stack.removeLast() + print("Извлеченный элемент pop = \(pop), stack после извлечения = \(stack)") + + /* Получение длины стека */ + let size = stack.count + print("Длина стека size = \(size)") + + /* Проверка на пустоту */ + let isEmpty = stack.isEmpty + print("Пуст ли стек = \(isEmpty)") + } +} diff --git a/ru/codes/swift/chapter_tree/array_binary_tree.swift b/ru/codes/swift/chapter_tree/array_binary_tree.swift new file mode 100644 index 000000000..90c30c842 --- /dev/null +++ b/ru/codes/swift/chapter_tree/array_binary_tree.swift @@ -0,0 +1,141 @@ +/** + * File: array_binary_tree.swift + * Created Time: 2023-07-23 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Класс двоичного дерева в массивном представлении */ +class ArrayBinaryTree { + private var tree: [Int?] + + /* Конструктор */ + init(arr: [Int?]) { + tree = arr + } + + /* Вместимость списка */ + func size() -> Int { + tree.count + } + + /* Получить значение узла с индексом i */ + func val(i: Int) -> Int? { + // Если индекс выходит за границы, вернуть null, обозначающий пустую позицию + if i < 0 || i >= size() { + return nil + } + return tree[i] + } + + /* Получить индекс левого дочернего узла узла с индексом i */ + func left(i: Int) -> Int { + 2 * i + 1 + } + + /* Получить индекс правого дочернего узла узла с индексом i */ + func right(i: Int) -> Int { + 2 * i + 2 + } + + /* Получить индекс родительского узла узла с индексом i */ + func parent(i: Int) -> Int { + (i - 1) / 2 + } + + /* Обход в ширину */ + func levelOrder() -> [Int] { + var res: [Int] = [] + // Непосредственно обходить массив + for i in 0 ..< size() { + if let val = val(i: i) { + res.append(val) + } + } + return res + } + + /* Обход в глубину */ + private func dfs(i: Int, order: String, res: inout [Int]) { + // Если это пустая позиция, вернуть + guard let val = val(i: i) else { + return + } + // Предварительный обход + if order == "pre" { + res.append(val) + } + dfs(i: left(i: i), order: order, res: &res) + // Симметричный обход + if order == "in" { + res.append(val) + } + dfs(i: right(i: i), order: order, res: &res) + // Обратный обход + if order == "post" { + res.append(val) + } + } + + /* Предварительный обход */ + func preOrder() -> [Int] { + var res: [Int] = [] + dfs(i: 0, order: "pre", res: &res) + return res + } + + /* Симметричный обход */ + func inOrder() -> [Int] { + var res: [Int] = [] + dfs(i: 0, order: "in", res: &res) + return res + } + + /* Обратный обход */ + func postOrder() -> [Int] { + var res: [Int] = [] + dfs(i: 0, order: "post", res: &res) + return res + } +} + +@main +enum _ArrayBinaryTree { + /* Driver Code */ + static func main() { + // Инициализировать двоичное дерево + // Здесь используется функция, напрямую строящая двоичное дерево из массива + let arr = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15] + + let root = TreeNode.listToTree(arr: arr) + print("\nИнициализация двоичного дерева\n") + print("Массивное представление двоичного дерева:") + print(arr) + print("Связное представление двоичного дерева:") + PrintUtil.printTree(root: root) + + // Класс двоичного дерева в массивном представлении + let abt = ArrayBinaryTree(arr: arr) + + // Доступ к узлу + let i = 1 + let l = abt.left(i: i) + let r = abt.right(i: i) + let p = abt.parent(i: i) + print("\nТекущий узел: индекс = \(i), значение = \(abt.val(i: i) as Any)") + print("Индекс левого дочернего узла = \(l), значение = \(abt.val(i: l) as Any)") + print("Индекс правого дочернего узла = \(r), значение = \(abt.val(i: r) as Any)") + print("Индекс родительского узла = \(p), значение = \(abt.val(i: p) as Any)") + + // Обходить дерево + var res = abt.levelOrder() + print("\nОбход в ширину: \(res)") + res = abt.preOrder() + print("Предварительный обход: \(res)") + res = abt.inOrder() + print("Симметричный обход: \(res)") + res = abt.postOrder() + print("Обратный обход: \(res)") + } +} diff --git a/ru/codes/swift/chapter_tree/avl_tree.swift b/ru/codes/swift/chapter_tree/avl_tree.swift new file mode 100644 index 000000000..31f85c33a --- /dev/null +++ b/ru/codes/swift/chapter_tree/avl_tree.swift @@ -0,0 +1,230 @@ +/** + * File: avl_tree.swift + * Created Time: 2023-01-28 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* AVL-дерево */ +class AVLTree { + fileprivate var root: TreeNode? // Корневой узел + + init() {} + + /* Получить высоту узла */ + func height(node: TreeNode?) -> Int { + // Высота пустого узла равна -1, высота листового узла равна 0 + node?.height ?? -1 + } + + /* Обновить высоту узла */ + private func updateHeight(node: TreeNode?) { + // Высота узла равна высоте более высокого поддерева + 1 + node?.height = max(height(node: node?.left), height(node: node?.right)) + 1 + } + + /* Получить коэффициент баланса */ + func balanceFactor(node: TreeNode?) -> Int { + // Коэффициент баланса пустого узла равен 0 + guard let node = node else { return 0 } + // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева + return height(node: node.left) - height(node: node.right) + } + + /* Операция правого вращения */ + private func rightRotate(node: TreeNode?) -> TreeNode? { + let child = node?.left + let grandChild = child?.right + // Выполнить правое вращение узла node вокруг child + child?.right = node + node?.left = grandChild + // Обновить высоту узла + updateHeight(node: node) + updateHeight(node: child) + // Вернуть корневой узел поддерева после вращения + return child + } + + /* Операция левого вращения */ + private func leftRotate(node: TreeNode?) -> TreeNode? { + let child = node?.right + let grandChild = child?.left + // Выполнить левое вращение узла node вокруг child + child?.left = node + node?.right = grandChild + // Обновить высоту узла + updateHeight(node: node) + updateHeight(node: child) + // Вернуть корневой узел поддерева после вращения + return child + } + + /* Выполнить вращение, чтобы снова сбалансировать поддерево */ + private func rotate(node: TreeNode?) -> TreeNode? { + // Получить коэффициент баланса узла node + let balanceFactor = balanceFactor(node: node) + // Левосторонне перекошенное дерево + if balanceFactor > 1 { + if self.balanceFactor(node: node?.left) >= 0 { + // Правое вращение + return rightRotate(node: node) + } else { + // Сначала левое вращение, затем правое + node?.left = leftRotate(node: node?.left) + return rightRotate(node: node) + } + } + // Правосторонне перекошенное дерево + if balanceFactor < -1 { + if self.balanceFactor(node: node?.right) <= 0 { + // Левое вращение + return leftRotate(node: node) + } else { + // Сначала правое вращение, затем левое + node?.right = rightRotate(node: node?.right) + return leftRotate(node: node) + } + } + // Дерево сбалансировано, вращение не требуется, вернуть сразу + return node + } + + /* Вставка узла */ + func insert(val: Int) { + root = insertHelper(node: root, val: val) + } + + /* Рекурсивная вставка узла (вспомогательный метод) */ + private func insertHelper(node: TreeNode?, val: Int) -> TreeNode? { + var node = node + if node == nil { + return TreeNode(x: val) + } + /* 1. Найти позицию вставки и вставить узел */ + if val < node!.val { + node?.left = insertHelper(node: node?.left, val: val) + } else if val > node!.val { + node?.right = insertHelper(node: node?.right, val: val) + } else { + return node // Повторяющийся узел не вставлять, сразу вернуть + } + updateHeight(node: node) // Обновить высоту узла + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = rotate(node: node) + // Вернуть корневой узел поддерева + return node + } + + /* Удаление узла */ + func remove(val: Int) { + root = removeHelper(node: root, val: val) + } + + /* Рекурсивное удаление узла (вспомогательный метод) */ + private func removeHelper(node: TreeNode?, val: Int) -> TreeNode? { + var node = node + if node == nil { + return nil + } + /* 1. Найти узел и удалить его */ + if val < node!.val { + node?.left = removeHelper(node: node?.left, val: val) + } else if val > node!.val { + node?.right = removeHelper(node: node?.right, val: val) + } else { + if node?.left == nil || node?.right == nil { + let child = node?.left ?? node?.right + // Число дочерних узлов = 0, удалить node и сразу вернуть + if child == nil { + return nil + } + // Число дочерних узлов = 1, удалить node напрямую + else { + node = child + } + } else { + // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел + var temp = node?.right + while temp?.left != nil { + temp = temp?.left + } + node?.right = removeHelper(node: node?.right, val: temp!.val) + node?.val = temp!.val + } + } + updateHeight(node: node) // Обновить высоту узла + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = rotate(node: node) + // Вернуть корневой узел поддерева + return node + } + + /* Поиск узла */ + func search(val: Int) -> TreeNode? { + var cur = root + while cur != nil { + // Целевой узел находится в правом поддереве cur + if cur!.val < val { + cur = cur?.right + } + // Целевой узел находится в левом поддереве cur + else if cur!.val > val { + cur = cur?.left + } + // Найти целевой узел и выйти из цикла + else { + break + } + } + // Вернуть целевой узел + return cur + } +} + +@main +enum _AVLTree { + static func testInsert(tree: AVLTree, val: Int) { + tree.insert(val: val) + print("\nПосле вставки узла \(val) AVL-дерево имеет вид") + PrintUtil.printTree(root: tree.root) + } + + static func testRemove(tree: AVLTree, val: Int) { + tree.remove(val: val) + print("\nПосле удаления узла \(val) AVL-дерево имеет вид") + PrintUtil.printTree(root: tree.root) + } + + /* Driver Code */ + static func main() { + /* Инициализация пустого AVL-дерева */ + let avlTree = AVLTree() + + /* Вставка узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после вставки узла + testInsert(tree: avlTree, val: 1) + testInsert(tree: avlTree, val: 2) + testInsert(tree: avlTree, val: 3) + testInsert(tree: avlTree, val: 4) + testInsert(tree: avlTree, val: 5) + testInsert(tree: avlTree, val: 8) + testInsert(tree: avlTree, val: 7) + testInsert(tree: avlTree, val: 9) + testInsert(tree: avlTree, val: 10) + testInsert(tree: avlTree, val: 6) + + /* Вставка повторяющегося узла */ + testInsert(tree: avlTree, val: 7) + + /* Удаление узла */ + // Обратите внимание, как AVL-дерево сохраняет баланс после удаления узла + testRemove(tree: avlTree, val: 8) // Удаление узла степени 0 + testRemove(tree: avlTree, val: 5) // Удаление узла степени 1 + testRemove(tree: avlTree, val: 4) // Удаление узла степени 2 + + /* Поиск узла */ + let node = avlTree.search(val: 7) + print("\nНайденный объект узла = \(node!), значение узла = \(node!.val)") + } +} diff --git a/ru/codes/swift/chapter_tree/binary_search_tree.swift b/ru/codes/swift/chapter_tree/binary_search_tree.swift new file mode 100644 index 000000000..a5a852d30 --- /dev/null +++ b/ru/codes/swift/chapter_tree/binary_search_tree.swift @@ -0,0 +1,173 @@ +/** + * File: binary_search_tree.swift + * Created Time: 2023-01-26 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Двоичное дерево поиска */ +class BinarySearchTree { + private var root: TreeNode? + + /* Конструктор */ + init() { + // Инициализировать пустое дерево + root = nil + } + + /* Получить корневой узел двоичного дерева */ + func getRoot() -> TreeNode? { + root + } + + /* Поиск узла */ + func search(num: Int) -> TreeNode? { + var cur = root + // Искать в цикле и выйти после прохода за листовой узел + while cur != nil { + // Целевой узел находится в правом поддереве cur + if cur!.val < num { + cur = cur?.right + } + // Целевой узел находится в левом поддереве cur + else if cur!.val > num { + cur = cur?.left + } + // Найти целевой узел и выйти из цикла + else { + break + } + } + // Вернуть целевой узел + return cur + } + + /* Вставка узла */ + func insert(num: Int) { + // Если дерево пусто, инициализировать корневой узел + if root == nil { + root = TreeNode(x: num) + return + } + var cur = root + var pre: TreeNode? + // Искать в цикле и выйти после прохода за листовой узел + while cur != nil { + // Найти повторяющийся узел и сразу вернуть + if cur!.val == num { + return + } + pre = cur + // Позиция вставки находится в правом поддереве cur + if cur!.val < num { + cur = cur?.right + } + // Позиция вставки находится в левом поддереве cur + else { + cur = cur?.left + } + } + // Вставка узла + let node = TreeNode(x: num) + if pre!.val < num { + pre?.right = node + } else { + pre?.left = node + } + } + + /* Удаление узла */ + func remove(num: Int) { + // Если дерево пусто, сразу вернуть + if root == nil { + return + } + var cur = root + var pre: TreeNode? + // Искать в цикле и выйти после прохода за листовой узел + while cur != nil { + // Найти узел для удаления и выйти из цикла + if cur!.val == num { + break + } + pre = cur + // Узел для удаления находится в правом поддереве cur + if cur!.val < num { + cur = cur?.right + } + // Узел для удаления находится в левом поддереве cur + else { + cur = cur?.left + } + } + // Если узел для удаления отсутствует, сразу вернуть + if cur == nil { + return + } + // Число дочерних узлов = 0 или 1 + if cur?.left == nil || cur?.right == nil { + // Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел + let child = cur?.left ?? cur?.right + // Удалить узел cur + if cur !== root { + if pre?.left === cur { + pre?.left = child + } else { + pre?.right = child + } + } else { + // Если удаляемый узел является корнем, заново назначить корневой узел + root = child + } + } + // Число дочерних узлов = 2 + else { + // Получить следующий узел после cur в симметричном обходе + var tmp = cur?.right + while tmp?.left != nil { + tmp = tmp?.left + } + // Рекурсивно удалить узел tmp + remove(num: tmp!.val) + // Перезаписать cur значением tmp + cur?.val = tmp!.val + } + } +} + +@main +enum _BinarySearchTree { + /* Driver Code */ + static func main() { + /* Инициализация двоичного дерева поиска */ + let bst = BinarySearchTree() + // Обратите внимание: разные порядки вставки порождают разные двоичные деревья; данная последовательность может построить совершенное двоичное дерево + let nums = [8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15] + for num in nums { + bst.insert(num: num) + } + print("\nИсходное двоичное дерево\n") + PrintUtil.printTree(root: bst.getRoot()) + + /* Поиск узла */ + let node = bst.search(num: 7) + print("\nНайденный объект узла = \(node!), значение узла = \(node!.val)") + + /* Вставка узла */ + bst.insert(num: 16) + print("\nПосле вставки узла 16 двоичное дерево имеет вид\n") + PrintUtil.printTree(root: bst.getRoot()) + + /* Удаление узла */ + bst.remove(num: 1) + print("\nПосле удаления узла 1 двоичное дерево имеет вид\n") + PrintUtil.printTree(root: bst.getRoot()) + bst.remove(num: 2) + print("\nПосле удаления узла 2 двоичное дерево имеет вид\n") + PrintUtil.printTree(root: bst.getRoot()) + bst.remove(num: 4) + print("\nПосле удаления узла 4 двоичное дерево имеет вид\n") + PrintUtil.printTree(root: bst.getRoot()) + } +} diff --git a/ru/codes/swift/chapter_tree/binary_tree.swift b/ru/codes/swift/chapter_tree/binary_tree.swift new file mode 100644 index 000000000..1bb78b7ec --- /dev/null +++ b/ru/codes/swift/chapter_tree/binary_tree.swift @@ -0,0 +1,40 @@ +/** + * File: binary_tree.swift + * Created Time: 2023-01-18 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +@main +enum BinaryTree { + /* Driver Code */ + static func main() { + /* Инициализация двоичного дерева */ + // Инициализация узла + let n1 = TreeNode(x: 1) + let n2 = TreeNode(x: 2) + let n3 = TreeNode(x: 3) + let n4 = TreeNode(x: 4) + let n5 = TreeNode(x: 5) + // Построить связи между узлами (указатели) + n1.left = n2 + n1.right = n3 + n2.left = n4 + n2.right = n5 + print("\nИнициализация двоичного дерева\n") + PrintUtil.printTree(root: n1) + + /* Вставка и удаление узлов */ + let P = TreeNode(x: 0) + // Вставить узел P между n1 -> n2 + n1.left = P + P.left = n2 + print("\nПосле вставки узла P\n") + PrintUtil.printTree(root: n1) + // Удалить узел P + n1.left = n2 + print("\nПосле удаления узла P\n") + PrintUtil.printTree(root: n1) + } +} diff --git a/ru/codes/swift/chapter_tree/binary_tree_bfs.swift b/ru/codes/swift/chapter_tree/binary_tree_bfs.swift new file mode 100644 index 000000000..d12f34d42 --- /dev/null +++ b/ru/codes/swift/chapter_tree/binary_tree_bfs.swift @@ -0,0 +1,42 @@ +/** + * File: binary_tree_bfs.swift + * Created Time: 2023-01-18 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +/* Обход в ширину */ +func levelOrder(root: TreeNode) -> [Int] { + // Инициализировать очередь и добавить корневой узел + var queue: [TreeNode] = [root] + // Инициализировать список для хранения последовательности обхода + var list: [Int] = [] + while !queue.isEmpty { + let node = queue.removeFirst() // Извлечение из очереди + list.append(node.val) // Сохранить значение узла + if let left = node.left { + queue.append(left) // Поместить левый дочерний узел в очередь + } + if let right = node.right { + queue.append(right) // Поместить правый дочерний узел в очередь + } + } + return list +} + +@main +enum BinaryTreeBFS { + /* Driver Code */ + static func main() { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из массива + let node = TreeNode.listToTree(arr: [1, 2, 3, 4, 5, 6, 7])! + print("\nИнициализация двоичного дерева\n") + PrintUtil.printTree(root: node) + + /* Обход в ширину */ + let list = levelOrder(root: node) + print("\nПоследовательность печати узлов при обходе в ширину = \(list)") + } +} diff --git a/ru/codes/swift/chapter_tree/binary_tree_dfs.swift b/ru/codes/swift/chapter_tree/binary_tree_dfs.swift new file mode 100644 index 000000000..2f408aef3 --- /dev/null +++ b/ru/codes/swift/chapter_tree/binary_tree_dfs.swift @@ -0,0 +1,70 @@ +/** + * File: binary_tree_dfs.swift + * Created Time: 2023-01-18 + * Author: nuomi1 (nuomi1@qq.com) + */ + +import utils + +// Инициализировать список для хранения последовательности обхода +var list: [Int] = [] + +/* Предварительный обход */ +func preOrder(root: TreeNode?) { + guard let root = root else { + return + } + // Порядок обхода: корень -> левое поддерево -> правое поддерево + list.append(root.val) + preOrder(root: root.left) + preOrder(root: root.right) +} + +/* Симметричный обход */ +func inOrder(root: TreeNode?) { + guard let root = root else { + return + } + // Порядок обхода: левое поддерево -> корень -> правое поддерево + inOrder(root: root.left) + list.append(root.val) + inOrder(root: root.right) +} + +/* Обратный обход */ +func postOrder(root: TreeNode?) { + guard let root = root else { + return + } + // Порядок обхода: левое поддерево -> правое поддерево -> корень + postOrder(root: root.left) + postOrder(root: root.right) + list.append(root.val) +} + +@main +enum BinaryTreeDFS { + /* Driver Code */ + static func main() { + /* Инициализация двоичного дерева */ + // Здесь используется функция, напрямую строящая двоичное дерево из массива + let root = TreeNode.listToTree(arr: [1, 2, 3, 4, 5, 6, 7])! + print("\nИнициализация двоичного дерева\n") + PrintUtil.printTree(root: root) + + /* Предварительный обход */ + list.removeAll() + preOrder(root: root) + print("\nПоследовательность печати узлов при предварительном обходе = \(list)") + + /* Симметричный обход */ + list.removeAll() + inOrder(root: root) + print("\nПоследовательность печати узлов при симметричном обходе = \(list)") + + /* Обратный обход */ + list.removeAll() + postOrder(root: root) + print("\nПоследовательность печати узлов при обратном обходе = \(list)") + } +} diff --git a/ru/codes/swift/utils/ListNode.swift b/ru/codes/swift/utils/ListNode.swift new file mode 100644 index 000000000..451030e89 --- /dev/null +++ b/ru/codes/swift/utils/ListNode.swift @@ -0,0 +1,33 @@ +/** + * File: ListNode.swift + * Created Time: 2023-01-02 + * Author: nuomi1 (nuomi1@qq.com) + */ + +public class ListNode: Hashable { + public var val: Int // Значение узла + public var next: ListNode? // Ссылка на узел-преемник + + public init(x: Int) { + val = x + } + + public static func == (lhs: ListNode, rhs: ListNode) -> Bool { + lhs.val == rhs.val && lhs.next.map { ObjectIdentifier($0) } == rhs.next.map { ObjectIdentifier($0) } + } + + public func hash(into hasher: inout Hasher) { + hasher.combine(val) + hasher.combine(next.map { ObjectIdentifier($0) }) + } + + public static func arrToLinkedList(arr: [Int]) -> ListNode? { + let dum = ListNode(x: 0) + var head: ListNode? = dum + for val in arr { + head?.next = ListNode(x: val) + head = head?.next + } + return dum.next + } +} diff --git a/ru/codes/swift/utils/Pair.swift b/ru/codes/swift/utils/Pair.swift new file mode 100644 index 000000000..fc298b761 --- /dev/null +++ b/ru/codes/swift/utils/Pair.swift @@ -0,0 +1,20 @@ +/** + * File: Pair.swift + * Created Time: 2023-06-28 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Пара ключ-значение */ +public class Pair: Equatable { + public var key: Int + public var val: String + + public init(key: Int, val: String) { + self.key = key + self.val = val + } + + public static func == (lhs: Pair, rhs: Pair) -> Bool { + lhs.key == rhs.key && lhs.val == rhs.val + } +} diff --git a/ru/codes/swift/utils/PrintUtil.swift b/ru/codes/swift/utils/PrintUtil.swift new file mode 100644 index 000000000..2305e802f --- /dev/null +++ b/ru/codes/swift/utils/PrintUtil.swift @@ -0,0 +1,93 @@ +/** + * File: PrintUtil.swift + * Created Time: 2023-01-02 + * Author: nuomi1 (nuomi1@qq.com) + */ + +public enum PrintUtil { + private class Trunk { + var prev: Trunk? + var str: String + + init(prev: Trunk?, str: String) { + self.prev = prev + self.str = str + } + } + + public static func printLinkedList(head: ListNode) { + var head: ListNode? = head + var list: [String] = [] + while head != nil { + list.append("\(head!.val)") + head = head?.next + } + print(list.joined(separator: " -> ")) + } + + public static func printTree(root: TreeNode?) { + printTree(root: root, prev: nil, isRight: false) + } + + private static func printTree(root: TreeNode?, prev: Trunk?, isRight: Bool) { + if root == nil { + return + } + + var prevStr = " " + let trunk = Trunk(prev: prev, str: prevStr) + + printTree(root: root?.right, prev: trunk, isRight: true) + + if prev == nil { + trunk.str = "———" + } else if isRight { + trunk.str = "/———" + prevStr = " |" + } else { + trunk.str = "\\———" + prev?.str = prevStr + } + + showTrunks(p: trunk) + print(" \(root!.val)") + + if prev != nil { + prev?.str = prevStr + } + trunk.str = " |" + + printTree(root: root?.left, prev: trunk, isRight: false) + } + + private static func showTrunks(p: Trunk?) { + if p == nil { + return + } + + showTrunks(p: p?.prev) + print(p!.str, terminator: "") + } + + public static func printHashMap(map: [K: V]) { + for (key, value) in map { + print("\(key) -> \(value)") + } + } + + public static func printHeap(queue: [Int]) { + print("Массивное представление кучи:", terminator: "") + print(queue) + print("Древовидное представление кучи:") + let root = TreeNode.listToTree(arr: queue) + printTree(root: root) + } + + public static func printMatrix(matrix: [[T]]) { + print("[") + for row in matrix { + print(" \(row),") + } + print("]") + } +} diff --git a/ru/codes/swift/utils/TreeNode.swift b/ru/codes/swift/utils/TreeNode.swift new file mode 100644 index 000000000..298c60aa1 --- /dev/null +++ b/ru/codes/swift/utils/TreeNode.swift @@ -0,0 +1,71 @@ +/** + * File: TreeNode.swift + * Created Time: 2023-01-02 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Класс узла двоичного дерева */ +public class TreeNode { + public var val: Int // Значение узла + public var height: Int // Высота узла + public var left: TreeNode? // Ссылка на левый дочерний узел + public var right: TreeNode? // Ссылка на правый дочерний узел + + /* Конструктор */ + public init(x: Int) { + val = x + height = 0 + } + + // Правила кодирования сериализации см.: + // https://www.hello-algo.com/chapter_tree/array_representation_of_tree/ + // Представление двоичного дерева массивом: + // [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15] + // Представление двоичного дерева связным списком: + // /——— 15 + // /——— 7 + // /——— 3 + // | \——— 6 + // | \——— 12 + // ——— 1 + // \——— 2 + // | /——— 9 + // \——— 4 + // \——— 8 + + /* Десериализовать список в двоичное дерево: рекурсия */ + private static func listToTreeDFS(arr: [Int?], i: Int) -> TreeNode? { + if i < 0 || i >= arr.count || arr[i] == nil { + return nil + } + let root = TreeNode(x: arr[i]!) + root.left = listToTreeDFS(arr: arr, i: 2 * i + 1) + root.right = listToTreeDFS(arr: arr, i: 2 * i + 2) + return root + } + + /* Десериализовать список в двоичное дерево */ + public static func listToTree(arr: [Int?]) -> TreeNode? { + listToTreeDFS(arr: arr, i: 0) + } + + /* Сериализовать двоичное дерево в список: рекурсия */ + private static func treeToListDFS(root: TreeNode?, i: Int, res: inout [Int?]) { + if root == nil { + return + } + while i >= res.count { + res.append(nil) + } + res[i] = root?.val + treeToListDFS(root: root?.left, i: 2 * i + 1, res: &res) + treeToListDFS(root: root?.right, i: 2 * i + 2, res: &res) + } + + /* Сериализовать двоичное дерево в список */ + public static func treeToList(root: TreeNode?) -> [Int?] { + var res: [Int?] = [] + treeToListDFS(root: root, i: 0, res: &res) + return res + } +} diff --git a/ru/codes/swift/utils/Vertex.swift b/ru/codes/swift/utils/Vertex.swift new file mode 100644 index 000000000..c86ad8044 --- /dev/null +++ b/ru/codes/swift/utils/Vertex.swift @@ -0,0 +1,32 @@ +/** + * File: Vertex.swift + * Created Time: 2023-02-19 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* Класс вершины */ +public class Vertex: Hashable { + public var val: Int + + public init(val: Int) { + self.val = val + } + + public static func == (lhs: Vertex, rhs: Vertex) -> Bool { + lhs.val == rhs.val + } + + public func hash(into hasher: inout Hasher) { + hasher.combine(val) + } + + /* На вход подается список значений vals, на выходе возвращается список вершин vets */ + public static func valsToVets(vals: [Int]) -> [Vertex] { + vals.map { Vertex(val: $0) } + } + + /* На вход подается список вершин vets, на выходе возвращается список значений vals */ + public static func vetsToVals(vets: [Vertex]) -> [Int] { + vets.map { $0.val } + } +} diff --git a/ru/codes/typescript/.gitignore b/ru/codes/typescript/.gitignore new file mode 100644 index 000000000..d5f19d89b --- /dev/null +++ b/ru/codes/typescript/.gitignore @@ -0,0 +1,2 @@ +node_modules +package-lock.json diff --git a/ru/codes/typescript/.prettierrc b/ru/codes/typescript/.prettierrc new file mode 100644 index 000000000..3f4aa8cb6 --- /dev/null +++ b/ru/codes/typescript/.prettierrc @@ -0,0 +1,6 @@ +{ + "tabWidth": 4, + "useTabs": false, + "semi": true, + "singleQuote": true +} diff --git a/ru/codes/typescript/chapter_array_and_linkedlist/array.ts b/ru/codes/typescript/chapter_array_and_linkedlist/array.ts new file mode 100644 index 000000000..fdab1e2f3 --- /dev/null +++ b/ru/codes/typescript/chapter_array_and_linkedlist/array.ts @@ -0,0 +1,101 @@ +/** + * File: array.ts + * Created Time: 2022-12-04 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Случайный доступ к элементу */ +function randomAccess(nums: number[]): number { + // Случайным образом выбрать число из интервала [0, nums.length) + const random_index = Math.floor(Math.random() * nums.length); + // Получить и вернуть случайный элемент + const random_num = nums[random_index]; + return random_num; +} + +/* Увеличить длину массива */ +// Обратите внимание: Array в TypeScript — это динамический массив, его можно расширять напрямую +// Для удобства обучения в этой функции Array рассматривается как массив неизменяемой длины +function extend(nums: number[], enlarge: number): number[] { + // Инициализировать массив увеличенной длины + const res = new Array(nums.length + enlarge).fill(0); + // Скопировать все элементы исходного массива в новый массив + for (let i = 0; i < nums.length; i++) { + res[i] = nums[i]; + } + // Вернуть новый массив после расширения + return res; +} + +/* Вставить элемент num по индексу index в массив */ +function insert(nums: number[], num: number, index: number): void { + // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад + for (let i = nums.length - 1; i > index; i--) { + nums[i] = nums[i - 1]; + } + // Присвоить num элементу по индексу index + nums[index] = num; +} + +/* Удалить элемент по индексу index */ +function remove(nums: number[], index: number): void { + // Сдвинуть все элементы после индекса index на одну позицию вперед + for (let i = index; i < nums.length - 1; i++) { + nums[i] = nums[i + 1]; + } +} + +/* Обход массива */ +function traverse(nums: number[]): void { + let count = 0; + // Обход массива по индексам + for (let i = 0; i < nums.length; i++) { + count += nums[i]; + } + // Непосредственно обходить элементы массива + for (const num of nums) { + count += num; + } +} + +/* Найти заданный элемент в массиве */ +function find(nums: number[], target: number): number { + for (let i = 0; i < nums.length; i++) { + if (nums[i] === target) { + return i; + } + } + return -1; +} + +/* Driver Code */ +/* Инициализация массива */ +const arr: number[] = new Array(5).fill(0); +console.log('Массив arr =', arr); +let nums: number[] = [1, 3, 2, 5, 4]; +console.log('Массив nums =', nums); + +/* Случайный доступ */ +let random_num = randomAccess(nums); +console.log('Случайный элемент из nums =', random_num); + +/* Расширение длины */ +nums = extend(nums, 3); +console.log('После расширения длины массива до 8 nums =', nums); + +/* Вставка элемента */ +insert(nums, 6, 3); +console.log('После вставки числа 6 по индексу 3 nums =', nums); + +/* Удаление элемента */ +remove(nums, 2); +console.log('После удаления элемента по индексу 2 nums =', nums); + +/* Обход массива */ +traverse(nums); + +/* Поиск элемента */ +let index = find(nums, 3); +console.log('Поиск элемента 3 в nums: индекс =', index); + +export {}; diff --git a/ru/codes/typescript/chapter_array_and_linkedlist/linked_list.ts b/ru/codes/typescript/chapter_array_and_linkedlist/linked_list.ts new file mode 100644 index 000000000..0c49f7e31 --- /dev/null +++ b/ru/codes/typescript/chapter_array_and_linkedlist/linked_list.ts @@ -0,0 +1,86 @@ +/** + * File: linked_list.ts + * Created Time: 2022-12-10 + * Author: Justin (xiefahit@gmail.com) + */ + +import { ListNode } from '../modules/ListNode'; +import { printLinkedList } from '../modules/PrintUtil'; + +/* Вставить узел P после узла n0 в связном списке */ +function insert(n0: ListNode, P: ListNode): void { + const n1 = n0.next; + P.next = n1; + n0.next = P; +} + +/* Удалить первый узел после узла n0 в связном списке */ +function remove(n0: ListNode): void { + if (!n0.next) { + return; + } + // n0 -> P -> n1 + const P = n0.next; + const n1 = P.next; + n0.next = n1; +} + +/* Доступ к узлу связного списка по индексу index */ +function access(head: ListNode | null, index: number): ListNode | null { + for (let i = 0; i < index; i++) { + if (!head) { + return null; + } + head = head.next; + } + return head; +} + +/* Найти в связном списке первый узел со значением target */ +function find(head: ListNode | null, target: number): number { + let index = 0; + while (head !== null) { + if (head.val === target) { + return index; + } + head = head.next; + index += 1; + } + return -1; +} + +/* Driver Code */ +/* Инициализация связного списка */ +// Инициализация всех узлов +const n0 = new ListNode(1); +const n1 = new ListNode(3); +const n2 = new ListNode(2); +const n3 = new ListNode(5); +const n4 = new ListNode(4); +// Построить ссылки между узлами +n0.next = n1; +n1.next = n2; +n2.next = n3; +n3.next = n4; +console.log('Инициализированный связный список'); +printLinkedList(n0); + +/* Вставка узла */ +insert(n0, new ListNode(0)); +console.log('Связный список после вставки узла'); +printLinkedList(n0); + +/* Удаление узла */ +remove(n0); +console.log('Связный список после удаления узла'); +printLinkedList(n0); + +/* Доступ к узлу */ +const node = access(n0, 3); +console.log(`Значение узла по индексу 3 в связном списке = ${node?.val}`); + +/* Поиск узла */ +const index = find(n0, 2); +console.log(`Индекс узла со значением 2 в связном списке = ${index}`); + +export {}; diff --git a/ru/codes/typescript/chapter_array_and_linkedlist/list.ts b/ru/codes/typescript/chapter_array_and_linkedlist/list.ts new file mode 100644 index 000000000..788605cc1 --- /dev/null +++ b/ru/codes/typescript/chapter_array_and_linkedlist/list.ts @@ -0,0 +1,59 @@ +/** + * File: list.ts + * Created Time: 2022-12-10 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Инициализация списка */ +const nums: number[] = [1, 3, 2, 5, 4]; +console.log(`Список nums = ${nums}`); + +/* Доступ к элементу */ +const num: number = nums[1]; +console.log(`Элемент по индексу 1: num = ${num}`); + +/* Обновление элемента */ +nums[1] = 0; +console.log(`После обновления элемента по индексу 1 до 0 nums = ${nums}`); + +/* Очистить список */ +nums.length = 0; +console.log(`После очистки списка nums = ${nums}`); + +/* Добавление элемента в конец */ +nums.push(1); +nums.push(3); +nums.push(2); +nums.push(5); +nums.push(4); +console.log(`После добавления элементов nums = ${nums}`); + +/* Вставка элемента в середину */ +nums.splice(3, 0, 6); +console.log(`После вставки числа 6 по индексу 3 nums = ${nums}`); + +/* Удаление элемента */ +nums.splice(3, 1); +console.log(`После удаления элемента по индексу 3 nums = ${nums}`); + +/* Обходить список по индексам */ +let count = 0; +for (let i = 0; i < nums.length; i++) { + count += nums[i]; +} +/* Непосредственно обходить элементы списка */ +count = 0; +for (const x of nums) { + count += x; +} + +/* Объединить два списка */ +const nums1: number[] = [6, 8, 7, 10, 9]; +nums.push(...nums1); +console.log(`После конкатенации списка nums1 к nums nums = ${nums}`); + +/* Отсортировать список */ +nums.sort((a, b) => a - b); +console.log(`После сортировки списка nums = ${nums}`); + +export {}; diff --git a/ru/codes/typescript/chapter_array_and_linkedlist/my_list.ts b/ru/codes/typescript/chapter_array_and_linkedlist/my_list.ts new file mode 100644 index 000000000..ab222b904 --- /dev/null +++ b/ru/codes/typescript/chapter_array_and_linkedlist/my_list.ts @@ -0,0 +1,141 @@ +/** + * File: my_list.ts + * Created Time: 2022-12-11 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Класс списка */ +class MyList { + private arr: Array; // Массив (для хранения элементов списка) + private _capacity: number = 10; // Вместимость списка + private _size: number = 0; // Длина списка (текущее число элементов) + private extendRatio: number = 2; // Коэффициент увеличения списка при каждом расширении + + /* Конструктор */ + constructor() { + this.arr = new Array(this._capacity); + } + + /* Получить длину списка (текущее число элементов) */ + public size(): number { + return this._size; + } + + /* Получить вместимость списка */ + public capacity(): number { + return this._capacity; + } + + /* Доступ к элементу */ + public get(index: number): number { + // Если индекс выходит за границы, выбрасывается исключение; далее аналогично + if (index < 0 || index >= this._size) throw new Error('индекс выходит за границы'); + return this.arr[index]; + } + + /* Обновление элемента */ + public set(index: number, num: number): void { + if (index < 0 || index >= this._size) throw new Error('индекс выходит за границы'); + this.arr[index] = num; + } + + /* Добавление элемента в конец */ + public add(num: number): void { + // Если длина равна вместимости, требуется расширение + if (this._size === this._capacity) this.extendCapacity(); + // Добавить новый элемент в конец списка + this.arr[this._size] = num; + this._size++; + } + + /* Вставка элемента в середину */ + public insert(index: number, num: number): void { + if (index < 0 || index >= this._size) throw new Error('индекс выходит за границы'); + // При превышении вместимости по числу элементов запускается расширение + if (this._size === this._capacity) { + this.extendCapacity(); + } + // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад + for (let j = this._size - 1; j >= index; j--) { + this.arr[j + 1] = this.arr[j]; + } + // Обновить число элементов + this.arr[index] = num; + this._size++; + } + + /* Удаление элемента */ + public remove(index: number): number { + if (index < 0 || index >= this._size) throw new Error('индекс выходит за границы'); + let num = this.arr[index]; + // Сдвинуть все элементы после индекса index на одну позицию вперед + for (let j = index; j < this._size - 1; j++) { + this.arr[j] = this.arr[j + 1]; + } + // Обновить число элементов + this._size--; + // Вернуть удаленный элемент + return num; + } + + /* Расширение списка */ + public extendCapacity(): void { + // Создать новый массив длиной size и скопировать в него исходный массив + this.arr = this.arr.concat( + new Array(this.capacity() * (this.extendRatio - 1)) + ); + // Обновить вместимость списка + this._capacity = this.arr.length; + } + + /* Преобразовать список в массив */ + public toArray(): number[] { + let size = this.size(); + // Преобразовывать только элементы списка в пределах фактической длины + const arr = new Array(size); + for (let i = 0; i < size; i++) { + arr[i] = this.get(i); + } + return arr; + } +} + +/* Driver Code */ +/* Инициализация списка */ +const nums = new MyList(); +/* Добавление элемента в конец */ +nums.add(1); +nums.add(3); +nums.add(2); +nums.add(5); +nums.add(4); +console.log( + `Список nums = ${nums.toArray()}, вместимость = ${nums.capacity()}, длина = ${nums.size()}` +); + +/* Вставка элемента в середину */ +nums.insert(3, 6); +console.log(`После вставки числа 6 по индексу 3 nums = ${nums.toArray()}`); + +/* Удаление элемента */ +nums.remove(3); +console.log(`После удаления элемента по индексу 3 nums = ${nums.toArray()}`); + +/* Доступ к элементу */ +const num = nums.get(1); +console.log(`Элемент по индексу 1: num = ${num}`); + +/* Обновление элемента */ +nums.set(1, 0); +console.log(`После обновления элемента по индексу 1 до 0 nums = ${nums.toArray()}`); + +/* Проверка механизма расширения */ +for (let i = 0; i < 10; i++) { + // При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения + nums.add(i); +} +console.log( + `Список nums после увеличения вместимости = ${nums.toArray()}, вместимость = ${nums.capacity()}, длина = ${nums.size()}` +); + +export {}; diff --git a/ru/codes/typescript/chapter_backtracking/n_queens.ts b/ru/codes/typescript/chapter_backtracking/n_queens.ts new file mode 100644 index 000000000..d62789941 --- /dev/null +++ b/ru/codes/typescript/chapter_backtracking/n_queens.ts @@ -0,0 +1,65 @@ +/** + * File: n_queens.ts + * Created Time: 2023-05-13 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Алгоритм бэктрекинга: n ферзей */ +function backtrack( + row: number, + n: number, + state: string[][], + res: string[][][], + cols: boolean[], + diags1: boolean[], + diags2: boolean[] +): void { + // Когда все строки уже обработаны, записать решение + if (row === n) { + res.push(state.map((row) => row.slice())); + return; + } + // Обойти все столбцы + for (let col = 0; col < n; col++) { + // Вычислить главную и побочную диагонали, соответствующие этой клетке + const diag1 = row - col + n - 1; + const diag2 = row + col; + // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей + if (!cols[col] && !diags1[diag1] && !diags2[diag2]) { + // Попытка: поставить ферзя в эту клетку + state[row][col] = 'Q'; + cols[col] = diags1[diag1] = diags2[diag2] = true; + // Перейти к размещению следующей строки + backtrack(row + 1, n, state, res, cols, diags1, diags2); + // Откат: восстановить эту клетку как пустую + state[row][col] = '#'; + cols[col] = diags1[diag1] = diags2[diag2] = false; + } + } +} + +/* Решить задачу о n ферзях */ +function nQueens(n: number): string[][][] { + // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку + const state = Array.from({ length: n }, () => Array(n).fill('#')); + const cols = Array(n).fill(false); // Отмечать, есть ли ферзь в столбце + const diags1 = Array(2 * n - 1).fill(false); // Отмечать наличие ферзя на главной диагонали + const diags2 = Array(2 * n - 1).fill(false); // Отмечать наличие ферзя на побочной диагонали + const res: string[][][] = []; + + backtrack(0, n, state, res, cols, diags1, diags2); + return res; +} + +// Driver Code +const n = 4; +const res = nQueens(n); + +console.log(`Размер входной доски = ${n}`); +console.log(`Количество способов расстановки ферзей: ${res.length}`); +res.forEach((state) => { + console.log('--------------------'); + state.forEach((row) => console.log(row)); +}); + +export {}; diff --git a/ru/codes/typescript/chapter_backtracking/permutations_i.ts b/ru/codes/typescript/chapter_backtracking/permutations_i.ts new file mode 100644 index 000000000..8adf47ab0 --- /dev/null +++ b/ru/codes/typescript/chapter_backtracking/permutations_i.ts @@ -0,0 +1,49 @@ +/** + * File: permutations_i.ts + * Created Time: 2023-05-13 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Алгоритм бэктрекинга: все перестановки I */ +function backtrack( + state: number[], + choices: number[], + selected: boolean[], + res: number[][] +): void { + // Когда длина состояния равна числу элементов, записать решение + if (state.length === choices.length) { + res.push([...state]); + return; + } + // Перебор всех вариантов выбора + choices.forEach((choice, i) => { + // Отсечение: нельзя выбирать один и тот же элемент повторно + if (!selected[i]) { + // Попытка: сделать выбор и обновить состояние + selected[i] = true; + state.push(choice); + // Перейти к следующему выбору + backtrack(state, choices, selected, res); + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false; + state.pop(); + } + }); +} + +/* Все перестановки I */ +function permutationsI(nums: number[]): number[][] { + const res: number[][] = []; + backtrack([], nums, Array(nums.length).fill(false), res); + return res; +} + +// Driver Code +const nums: number[] = [1, 2, 3]; +const res: number[][] = permutationsI(nums); + +console.log(`Входной массив nums = ${JSON.stringify(nums)}`); +console.log(`Все перестановки res = ${JSON.stringify(res)}`); + +export {}; diff --git a/ru/codes/typescript/chapter_backtracking/permutations_ii.ts b/ru/codes/typescript/chapter_backtracking/permutations_ii.ts new file mode 100644 index 000000000..a2606dfe3 --- /dev/null +++ b/ru/codes/typescript/chapter_backtracking/permutations_ii.ts @@ -0,0 +1,51 @@ +/** + * File: permutations_ii.ts + * Created Time: 2023-05-13 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Алгоритм бэктрекинга: все перестановки II */ +function backtrack( + state: number[], + choices: number[], + selected: boolean[], + res: number[][] +): void { + // Когда длина состояния равна числу элементов, записать решение + if (state.length === choices.length) { + res.push([...state]); + return; + } + // Перебор всех вариантов выбора + const duplicated = new Set(); + choices.forEach((choice, i) => { + // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы + if (!selected[i] && !duplicated.has(choice)) { + // Попытка: сделать выбор и обновить состояние + duplicated.add(choice); // Записать значения уже выбранных элементов + selected[i] = true; + state.push(choice); + // Перейти к следующему выбору + backtrack(state, choices, selected, res); + // Откат: отменить выбор и восстановить предыдущее состояние + selected[i] = false; + state.pop(); + } + }); +} + +/* Все перестановки II */ +function permutationsII(nums: number[]): number[][] { + const res: number[][] = []; + backtrack([], nums, Array(nums.length).fill(false), res); + return res; +} + +// Driver Code +const nums: number[] = [1, 2, 2]; +const res: number[][] = permutationsII(nums); + +console.log(`Входной массив nums = ${JSON.stringify(nums)}`); +console.log(`Все перестановки res = ${JSON.stringify(res)}`); + +export {}; diff --git a/ru/codes/typescript/chapter_backtracking/preorder_traversal_i_compact.ts b/ru/codes/typescript/chapter_backtracking/preorder_traversal_i_compact.ts new file mode 100644 index 000000000..db504691d --- /dev/null +++ b/ru/codes/typescript/chapter_backtracking/preorder_traversal_i_compact.ts @@ -0,0 +1,36 @@ +/** + * File: preorder_traversal_i_compact.ts + * Created Time: 2023-05-09 + * Author: Justin (xiefahit@gmail.com) + */ + +import { type TreeNode } from '../modules/TreeNode'; +import { arrToTree } from '../modules/TreeNode'; +import { printTree } from '../modules/PrintUtil'; + +/* Предварительный обход: пример 1 */ +function preOrder(root: TreeNode | null, res: TreeNode[]): void { + if (root === null) { + return; + } + if (root.val === 7) { + // Записать решение + res.push(root); + } + preOrder(root.left, res); + preOrder(root.right, res); +} + +// Driver Code +const root = arrToTree([1, 7, 3, 4, 5, 6, 7]); +console.log('\nИнициализация двоичного дерева'); +printTree(root); + +// Предварительный обход +const res: TreeNode[] = []; +preOrder(root, res); + +console.log('\nВывести все узлы со значением 7'); +console.log(res.map((node) => node.val)); + +export {}; diff --git a/ru/codes/typescript/chapter_backtracking/preorder_traversal_ii_compact.ts b/ru/codes/typescript/chapter_backtracking/preorder_traversal_ii_compact.ts new file mode 100644 index 000000000..731d576fe --- /dev/null +++ b/ru/codes/typescript/chapter_backtracking/preorder_traversal_ii_compact.ts @@ -0,0 +1,47 @@ +/** + * File: preorder_traversal_ii_compact.ts + * Created Time: 2023-05-09 + * Author: Justin (xiefahit@gmail.com) + */ + +import { type TreeNode } from '../modules/TreeNode'; +import { arrToTree } from '../modules/TreeNode'; +import { printTree } from '../modules/PrintUtil'; + +/* Предварительный обход: пример 2 */ +function preOrder( + root: TreeNode | null, + path: TreeNode[], + res: TreeNode[][] +): void { + if (root === null) { + return; + } + // Попытка + path.push(root); + if (root.val === 7) { + // Записать решение + res.push([...path]); + } + preOrder(root.left, path, res); + preOrder(root.right, path, res); + // Откат + path.pop(); +} + +// Driver Code +const root = arrToTree([1, 7, 3, 4, 5, 6, 7]); +console.log('\nИнициализация двоичного дерева'); +printTree(root); + +// Предварительный обход +const path: TreeNode[] = []; +const res: TreeNode[][] = []; +preOrder(root, path, res); + +console.log('\nВывести все пути от корня к узлу 7'); +res.forEach((path) => { + console.log(path.map((node) => node.val)); +}); + +export {}; diff --git a/ru/codes/typescript/chapter_backtracking/preorder_traversal_iii_compact.ts b/ru/codes/typescript/chapter_backtracking/preorder_traversal_iii_compact.ts new file mode 100644 index 000000000..5a7a29507 --- /dev/null +++ b/ru/codes/typescript/chapter_backtracking/preorder_traversal_iii_compact.ts @@ -0,0 +1,48 @@ +/** + * File: preorder_traversal_iii_compact.ts + * Created Time: 2023-05-09 + * Author: Justin (xiefahit@gmail.com) + */ + +import { type TreeNode } from '../modules/TreeNode'; +import { arrToTree } from '../modules/TreeNode'; +import { printTree } from '../modules/PrintUtil'; + +/* Предварительный обход: пример 3 */ +function preOrder( + root: TreeNode | null, + path: TreeNode[], + res: TreeNode[][] +): void { + // Отсечение + if (root === null || root.val === 3) { + return; + } + // Попытка + path.push(root); + if (root.val === 7) { + // Записать решение + res.push([...path]); + } + preOrder(root.left, path, res); + preOrder(root.right, path, res); + // Откат + path.pop(); +} + +// Driver Code +const root = arrToTree([1, 7, 3, 4, 5, 6, 7]); +console.log('\nИнициализация двоичного дерева'); +printTree(root); + +// Предварительный обход +const path: TreeNode[] = []; +const res: TreeNode[][] = []; +preOrder(root, path, res); + +console.log('\nВывести все пути от корня к узлу 7, не содержащие узлов со значением 3'); +res.forEach((path) => { + console.log(path.map((node) => node.val)); +}); + +export {}; diff --git a/ru/codes/typescript/chapter_backtracking/preorder_traversal_iii_template.ts b/ru/codes/typescript/chapter_backtracking/preorder_traversal_iii_template.ts new file mode 100644 index 000000000..b6a13ae84 --- /dev/null +++ b/ru/codes/typescript/chapter_backtracking/preorder_traversal_iii_template.ts @@ -0,0 +1,75 @@ +/** + * File: preorder_traversal_iii_template.ts + * Created Time: 2023-05-09 + * Author: Justin (xiefahit@gmail.com) + */ + +import { type TreeNode } from '../modules/TreeNode'; +import { arrToTree } from '../modules/TreeNode'; +import { printTree } from '../modules/PrintUtil'; + +/* Проверить, является ли текущее состояние решением */ +function isSolution(state: TreeNode[]): boolean { + return state && state[state.length - 1]?.val === 7; +} + +/* Записать решение */ +function recordSolution(state: TreeNode[], res: TreeNode[][]): void { + res.push([...state]); +} + +/* Проверить, допустим ли этот выбор в текущем состоянии */ +function isValid(state: TreeNode[], choice: TreeNode): boolean { + return choice !== null && choice.val !== 3; +} + +/* Обновить состояние */ +function makeChoice(state: TreeNode[], choice: TreeNode): void { + state.push(choice); +} + +/* Восстановить состояние */ +function undoChoice(state: TreeNode[]): void { + state.pop(); +} + +/* Алгоритм бэктрекинга: пример 3 */ +function backtrack( + state: TreeNode[], + choices: TreeNode[], + res: TreeNode[][] +): void { + // Проверить, является ли текущее состояние решением + if (isSolution(state)) { + // Записать решение + recordSolution(state, res); + } + // Перебор всех вариантов выбора + for (const choice of choices) { + // Отсечение: проверить допустимость выбора + if (isValid(state, choice)) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state, choice); + // Перейти к следующему выбору + backtrack(state, [choice.left, choice.right], res); + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state); + } + } +} + +// Driver Code +const root = arrToTree([1, 7, 3, 4, 5, 6, 7]); +console.log('\nИнициализация двоичного дерева'); +printTree(root); + +// Алгоритм бэктрекинга +const res: TreeNode[][] = []; +backtrack([], [root], res); + +console.log('\nВсе пути от корня к узлу 7, не содержащие узлов со значением 3'); +res.forEach((path) => { + console.log(path.map((node) => node.val)); +}); + +export {}; diff --git a/ru/codes/typescript/chapter_backtracking/subset_sum_i.ts b/ru/codes/typescript/chapter_backtracking/subset_sum_i.ts new file mode 100644 index 000000000..6b7ec7ce3 --- /dev/null +++ b/ru/codes/typescript/chapter_backtracking/subset_sum_i.ts @@ -0,0 +1,54 @@ +/** + * File: subset_sum_i.ts + * Created Time: 2023-07-30 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +function backtrack( + state: number[], + target: number, + choices: number[], + start: number, + res: number[][] +): void { + // Если сумма подмножества равна target, записать решение + if (target === 0) { + res.push([...state]); + return; + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + for (let i = start; i < choices.length; i++) { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if (target - choices[i] < 0) { + break; + } + // Попытка: сделать выбор и обновить target и start + state.push(choices[i]); + // Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.pop(); + } +} + +/* Решить задачу суммы подмножеств I */ +function subsetSumI(nums: number[], target: number): number[][] { + const state = []; // Состояние (подмножество) + nums.sort((a, b) => a - b); // Отсортировать nums + const start = 0; // Стартовая вершина обхода + const res = []; // Список результатов (список подмножеств) + backtrack(state, target, nums, start, res); + return res; +} + +/* Driver Code */ +const nums = [3, 4, 5]; +const target = 9; +const res = subsetSumI(nums, target); +console.log(`Входной массив nums = ${JSON.stringify(nums)}, target = ${target}`); +console.log(`Все подмножества с суммой ${target}: res = ${JSON.stringify(res)}`); + +export {}; diff --git a/ru/codes/typescript/chapter_backtracking/subset_sum_i_naive.ts b/ru/codes/typescript/chapter_backtracking/subset_sum_i_naive.ts new file mode 100644 index 000000000..c81c54780 --- /dev/null +++ b/ru/codes/typescript/chapter_backtracking/subset_sum_i_naive.ts @@ -0,0 +1,52 @@ +/** + * File: subset_sum_i_naive.ts + * Created Time: 2023-07-30 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Алгоритм бэктрекинга: сумма подмножеств I */ +function backtrack( + state: number[], + target: number, + total: number, + choices: number[], + res: number[][] +): void { + // Если сумма подмножества равна target, записать решение + if (total === target) { + res.push([...state]); + return; + } + // Перебор всех вариантов выбора + for (let i = 0; i < choices.length; i++) { + // Отсечение: если сумма подмножества превышает target, пропустить этот выбор + if (total + choices[i] > target) { + continue; + } + // Попытка: сделать выбор и обновить элемент и total + state.push(choices[i]); + // Перейти к следующему выбору + backtrack(state, target, total + choices[i], choices, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.pop(); + } +} + +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */ +function subsetSumINaive(nums: number[], target: number): number[][] { + const state = []; // Состояние (подмножество) + const total = 0; // Сумма подмножеств + const res = []; // Список результатов (список подмножеств) + backtrack(state, target, total, nums, res); + return res; +} + +/* Driver Code */ +const nums = [3, 4, 5]; +const target = 9; +const res = subsetSumINaive(nums, target); +console.log(`Входной массив nums = ${JSON.stringify(nums)}, target = ${target}`); +console.log(`Все подмножества с суммой ${target}: res = ${JSON.stringify(res)}`); +console.log('Обратите внимание: результат этого метода содержит повторяющиеся множества'); + +export {}; diff --git a/ru/codes/typescript/chapter_backtracking/subset_sum_ii.ts b/ru/codes/typescript/chapter_backtracking/subset_sum_ii.ts new file mode 100644 index 000000000..05abc1251 --- /dev/null +++ b/ru/codes/typescript/chapter_backtracking/subset_sum_ii.ts @@ -0,0 +1,59 @@ +/** + * File: subset_sum_ii.ts + * Created Time: 2023-07-30 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Алгоритм бэктрекинга: сумма подмножеств II */ +function backtrack( + state: number[], + target: number, + choices: number[], + start: number, + res: number[][] +): void { + // Если сумма подмножества равна target, записать решение + if (target === 0) { + res.push([...state]); + return; + } + // Обойти все варианты выбора + // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств + // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента + for (let i = start; i < choices.length; i++) { + // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл + // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target + if (target - choices[i] < 0) { + break; + } + // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить + if (i > start && choices[i] === choices[i - 1]) { + continue; + } + // Попытка: сделать выбор и обновить target и start + state.push(choices[i]); + // Перейти к следующему выбору + backtrack(state, target - choices[i], choices, i + 1, res); + // Откат: отменить выбор и восстановить предыдущее состояние + state.pop(); + } +} + +/* Решить задачу суммы подмножеств II */ +function subsetSumII(nums: number[], target: number): number[][] { + const state = []; // Состояние (подмножество) + nums.sort((a, b) => a - b); // Отсортировать nums + const start = 0; // Стартовая вершина обхода + const res = []; // Список результатов (список подмножеств) + backtrack(state, target, nums, start, res); + return res; +} + +/* Driver Code */ +const nums = [4, 4, 5]; +const target = 9; +const res = subsetSumII(nums, target); +console.log(`Входной массив nums = ${JSON.stringify(nums)}, target = ${target}`); +console.log(`Все подмножества с суммой ${target}: res = ${JSON.stringify(res)}`); + +export {}; diff --git a/ru/codes/typescript/chapter_computational_complexity/iteration.ts b/ru/codes/typescript/chapter_computational_complexity/iteration.ts new file mode 100644 index 000000000..8667c710c --- /dev/null +++ b/ru/codes/typescript/chapter_computational_complexity/iteration.ts @@ -0,0 +1,72 @@ +/** + * File: iteration.ts + * Created Time: 2023-08-28 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Цикл for */ +function forLoop(n: number): number { + let res = 0; + // Циклическое суммирование 1, 2, ..., n-1, n + for (let i = 1; i <= n; i++) { + res += i; + } + return res; +} + +/* Цикл while */ +function whileLoop(n: number): number { + let res = 0; + let i = 1; // Инициализация условной переменной + // Циклическое суммирование 1, 2, ..., n-1, n + while (i <= n) { + res += i; + i++; // Обновить условную переменную + } + return res; +} + +/* Цикл while (двойное обновление) */ +function whileLoopII(n: number): number { + let res = 0; + let i = 1; // Инициализация условной переменной + // Циклическое суммирование 1, 4, 10, ... + while (i <= n) { + res += i; + // Обновить условную переменную + i++; + i *= 2; + } + return res; +} + +/* Двойной цикл for */ +function nestedForLoop(n: number): string { + let res = ''; + // Цикл по i = 1, 2, ..., n-1, n + for (let i = 1; i <= n; i++) { + // Цикл по j = 1, 2, ..., n-1, n + for (let j = 1; j <= n; j++) { + res += `(${i}, ${j}), `; + } + } + return res; +} + +/* Driver Code */ +const n = 5; +let res: number; + +res = forLoop(n); +console.log(`Результат суммирования в цикле for res = ${res}`); + +res = whileLoop(n); +console.log(`Результат суммирования в цикле while res = ${res}`); + +res = whileLoopII(n); +console.log(`Результат суммирования в цикле while (двойное обновление) res = ${res}`); + +const resStr = nestedForLoop(n); +console.log(`Результат обхода в двойном цикле for ${resStr}`); + +export {}; diff --git a/ru/codes/typescript/chapter_computational_complexity/recursion.ts b/ru/codes/typescript/chapter_computational_complexity/recursion.ts new file mode 100644 index 000000000..b6e0e2b16 --- /dev/null +++ b/ru/codes/typescript/chapter_computational_complexity/recursion.ts @@ -0,0 +1,70 @@ +/** + * File: recursion.ts + * Created Time: 2023-08-28 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Рекурсия */ +function recur(n: number): number { + // Условие завершения + if (n === 1) return 1; + // Рекурсия: рекурсивный вызов + const res = recur(n - 1); + // Возврат: вернуть результат + return n + res; +} + +/* Имитация рекурсии итерацией */ +function forLoopRecur(n: number): number { + // Использовать явный стек для имитации системного стека вызовов + const stack: number[] = []; + let res: number = 0; + // Рекурсия: рекурсивный вызов + for (let i = n; i > 0; i--) { + // Имитировать «рекурсию» с помощью операции помещения в стек + stack.push(i); + } + // Возврат: вернуть результат + while (stack.length) { + // Имитировать «возврат» с помощью операции извлечения из стека + res += stack.pop(); + } + // res = 1+2+3+...+n + return res; +} + +/* Хвостовая рекурсия */ +function tailRecur(n: number, res: number): number { + // Условие завершения + if (n === 0) return res; + // Хвостовой рекурсивный вызов + return tailRecur(n - 1, res + n); +} + +/* Последовательность Фибоначчи: рекурсия */ +function fib(n: number): number { + // Условие завершения: f(1) = 0, f(2) = 1 + if (n === 1 || n === 2) return n - 1; + // Рекурсивный вызов f(n) = f(n-1) + f(n-2) + const res = fib(n - 1) + fib(n - 2); + // Вернуть результат f(n) + return res; +} + +/* Driver Code */ +const n = 5; +let res: number; + +res = recur(n); +console.log(`Результат суммирования в рекурсивной функции res = ${res}`); + +res = forLoopRecur(n); +console.log(`Результат суммирования при имитации рекурсии итерацией res = ${res}`); + +res = tailRecur(n, 0); +console.log(`Результат суммирования в хвостовой рекурсии res = ${res}`); + +res = fib(n); +console.log(`Член последовательности Фибоначчи с номером ${n} = ${res}`); + +export {}; diff --git a/ru/codes/typescript/chapter_computational_complexity/space_complexity.ts b/ru/codes/typescript/chapter_computational_complexity/space_complexity.ts new file mode 100644 index 000000000..1d453cb1f --- /dev/null +++ b/ru/codes/typescript/chapter_computational_complexity/space_complexity.ts @@ -0,0 +1,103 @@ +/** + * File: space_complexity.ts + * Created Time: 2023-02-05 + * Author: Justin (xiefahit@gmail.com) + */ + +import { ListNode } from '../modules/ListNode'; +import { TreeNode } from '../modules/TreeNode'; +import { printTree } from '../modules/PrintUtil'; + +/* Функция */ +function constFunc(): number { + // Выполнить некоторые операции + return 0; +} + +/* Постоянная сложность */ +function constant(n: number): void { + // Константы, переменные и объекты занимают O(1) памяти + const a = 0; + const b = 0; + const nums = new Array(10000); + const node = new ListNode(0); + // Переменные в цикле занимают O(1) памяти + for (let i = 0; i < n; i++) { + const c = 0; + } + // Функции в цикле занимают O(1) памяти + for (let i = 0; i < n; i++) { + constFunc(); + } +} + +/* Линейная сложность */ +function linear(n: number): void { + // Массив длины n занимает O(n) памяти + const nums = new Array(n); + // Список длины n занимает O(n) памяти + const nodes: ListNode[] = []; + for (let i = 0; i < n; i++) { + nodes.push(new ListNode(i)); + } + // Хеш-таблица длины n занимает O(n) памяти + const map = new Map(); + for (let i = 0; i < n; i++) { + map.set(i, i.toString()); + } +} + +/* Линейная сложность (рекурсивная реализация) */ +function linearRecur(n: number): void { + console.log(`Рекурсия n = ${n}`); + if (n === 1) return; + linearRecur(n - 1); +} + +/* Квадратичная сложность */ +function quadratic(n: number): void { + // Матрица занимает O(n^2) памяти + const numMatrix = Array(n) + .fill(null) + .map(() => Array(n).fill(null)); + // Двумерный список занимает O(n^2) памяти + const numList = []; + for (let i = 0; i < n; i++) { + const tmp = []; + for (let j = 0; j < n; j++) { + tmp.push(0); + } + numList.push(tmp); + } +} + +/* Квадратичная сложность (рекурсивная реализация) */ +function quadraticRecur(n: number): number { + if (n <= 0) return 0; + const nums = new Array(n); + console.log(`В рекурсии n = ${n} длина nums = ${nums.length}`); + return quadraticRecur(n - 1); +} + +/* Экспоненциальная сложность (построение полного двоичного дерева) */ +function buildTree(n: number): TreeNode | null { + if (n === 0) return null; + const root = new TreeNode(0); + root.left = buildTree(n - 1); + root.right = buildTree(n - 1); + return root; +} + +/* Driver Code */ +const n = 5; +// Постоянная сложность +constant(n); +// Линейная сложность +linear(n); +linearRecur(n); +// Квадратичная сложность +quadratic(n); +quadraticRecur(n); +// Экспоненциальная сложность +const root = buildTree(n); +printTree(root); diff --git a/ru/codes/typescript/chapter_computational_complexity/time_complexity.ts b/ru/codes/typescript/chapter_computational_complexity/time_complexity.ts new file mode 100644 index 000000000..54b8501c2 --- /dev/null +++ b/ru/codes/typescript/chapter_computational_complexity/time_complexity.ts @@ -0,0 +1,157 @@ +/** + * File: time_complexity.ts + * Created Time: 2023-01-02 + * Author: RiverTwilight (contact@rene.wang) + */ + +/* Постоянная сложность */ +function constant(n: number): number { + let count = 0; + const size = 100000; + for (let i = 0; i < size; i++) count++; + return count; +} + +/* Линейная сложность */ +function linear(n: number): number { + let count = 0; + for (let i = 0; i < n; i++) count++; + return count; +} + +/* Линейная сложность (обход массива) */ +function arrayTraversal(nums: number[]): number { + let count = 0; + // Число итераций пропорционально длине массива + for (let i = 0; i < nums.length; i++) { + count++; + } + return count; +} + +/* Квадратичная сложность */ +function quadratic(n: number): number { + let count = 0; + // Число итераций квадратично зависит от размера данных n + for (let i = 0; i < n; i++) { + for (let j = 0; j < n; j++) { + count++; + } + } + return count; +} + +/* Квадратичная сложность (пузырьковая сортировка) */ +function bubbleSort(nums: number[]): number { + let count = 0; // Счетчик + // Внешний цикл: неотсортированный диапазон [0, i] + for (let i = nums.length - 1; i > 0; i--) { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (let j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + let tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + count += 3; // Обмен элементов включает 3 элементарные операции + } + } + } + return count; +} + +/* Экспоненциальная сложность (итеративная реализация) */ +function exponential(n: number): number { + let count = 0, + base = 1; + // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1) + for (let i = 0; i < n; i++) { + for (let j = 0; j < base; j++) { + count++; + } + base *= 2; + } + // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1 + return count; +} + +/* Экспоненциальная сложность (рекурсивная реализация) */ +function expRecur(n: number): number { + if (n === 1) return 1; + return expRecur(n - 1) + expRecur(n - 1) + 1; +} + +/* Логарифмическая сложность (итеративная реализация) */ +function logarithmic(n: number): number { + let count = 0; + while (n > 1) { + n = n / 2; + count++; + } + return count; +} + +/* Логарифмическая сложность (рекурсивная реализация) */ +function logRecur(n: number): number { + if (n <= 1) return 0; + return logRecur(n / 2) + 1; +} + +/* Линейно-логарифмическая сложность */ +function linearLogRecur(n: number): number { + if (n <= 1) return 1; + let count = linearLogRecur(n / 2) + linearLogRecur(n / 2); + for (let i = 0; i < n; i++) { + count++; + } + return count; +} + +/* Факториальная сложность (рекурсивная реализация) */ +function factorialRecur(n: number): number { + if (n === 0) return 1; + let count = 0; + // Из одного получается n + for (let i = 0; i < n; i++) { + count += factorialRecur(n - 1); + } + return count; +} + +/* Driver Code */ +// Можно изменить n и запустить программу, чтобы увидеть, как меняется число операций при разных сложностях +const n = 8; +console.log('Размер входных данных n = ' + n); + +let count = constant(n); +console.log('Число операций постоянной сложности = ' + count); + +count = linear(n); +console.log('Число операций линейной сложности = ' + count); +count = arrayTraversal(new Array(n)); +console.log('Число операций линейной сложности (обход массива) = ' + count); + +count = quadratic(n); +console.log('Число операций квадратичной сложности = ' + count); +var nums = new Array(n); +for (let i = 0; i < n; i++) nums[i] = n - i; // [n,n-1,...,2,1] +count = bubbleSort(nums); +console.log('Число операций квадратичной сложности (пузырьковая сортировка) = ' + count); + +count = exponential(n); +console.log('Число операций экспоненциальной сложности (итеративная реализация) = ' + count); +count = expRecur(n); +console.log('Число операций экспоненциальной сложности (рекурсивная реализация) = ' + count); + +count = logarithmic(n); +console.log('Число операций логарифмической сложности (итеративная реализация) = ' + count); +count = logRecur(n); +console.log('Число операций логарифмической сложности (рекурсивная реализация) = ' + count); + +count = linearLogRecur(n); +console.log('Число операций линейно-логарифмической сложности (рекурсивная реализация) = ' + count); + +count = factorialRecur(n); +console.log('Число операций факториальной сложности (рекурсивная реализация) = ' + count); + +export {}; diff --git a/ru/codes/typescript/chapter_computational_complexity/worst_best_time_complexity.ts b/ru/codes/typescript/chapter_computational_complexity/worst_best_time_complexity.ts new file mode 100644 index 000000000..a0cda6a4d --- /dev/null +++ b/ru/codes/typescript/chapter_computational_complexity/worst_best_time_complexity.ts @@ -0,0 +1,45 @@ +/** + * File: worst_best_time_complexity.ts + * Created Time: 2023-01-05 + * Author: RiverTwilight (contact@rene.wang) + */ + +/* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */ +function randomNumbers(n: number): number[] { + const nums = Array(n); + // Создать массив nums = { 1, 2, 3, ..., n } + for (let i = 0; i < n; i++) { + nums[i] = i + 1; + } + // Случайно перемешать элементы массива + for (let i = 0; i < n; i++) { + const r = Math.floor(Math.random() * (i + 1)); + const temp = nums[i]; + nums[i] = nums[r]; + nums[r] = temp; + } + return nums; +} + +/* Найти индекс числа 1 в массиве nums */ +function findOne(nums: number[]): number { + for (let i = 0; i < nums.length; i++) { + // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1) + // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n) + if (nums[i] === 1) { + return i; + } + } + return -1; +} + +/* Driver Code */ +for (let i = 0; i < 10; i++) { + const n = 100; + const nums = randomNumbers(n); + const index = findOne(nums); + console.log('\nПосле перемешивания массива [ 1, 2, ..., n ] = [' + nums.join(', ') + ']'); + console.log('Индекс числа 1 = ' + index); +} + +export {}; diff --git a/ru/codes/typescript/chapter_divide_and_conquer/binary_search_recur.ts b/ru/codes/typescript/chapter_divide_and_conquer/binary_search_recur.ts new file mode 100644 index 000000000..6cd78cd04 --- /dev/null +++ b/ru/codes/typescript/chapter_divide_and_conquer/binary_search_recur.ts @@ -0,0 +1,41 @@ +/** + * File: binary_search_recur.ts + * Created Time: 2023-07-30 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Бинарный поиск: задача f(i, j) */ +function dfs(nums: number[], target: number, i: number, j: number): number { + // Если интервал пуст, целевой элемент отсутствует, вернуть -1 + if (i > j) { + return -1; + } + // Вычислить индекс середины m + const m = i + ((j - i) >> 1); + if (nums[m] < target) { + // Рекурсивная подзадача f(m+1, j) + return dfs(nums, target, m + 1, j); + } else if (nums[m] > target) { + // Рекурсивная подзадача f(i, m-1) + return dfs(nums, target, i, m - 1); + } else { + // Целевой элемент найден, вернуть его индекс + return m; + } +} + +/* Бинарный поиск */ +function binarySearch(nums: number[], target: number): number { + const n = nums.length; + // Решить задачу f(0, n-1) + return dfs(nums, target, 0, n - 1); +} + +/* Driver Code */ +const target = 6; +const nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; +// Бинарный поиск (двусторонне замкнутый интервал) +const index = binarySearch(nums, target); +console.log(`Индекс целевого элемента 6 = ${index}`); + +export {}; diff --git a/ru/codes/typescript/chapter_divide_and_conquer/build_tree.ts b/ru/codes/typescript/chapter_divide_and_conquer/build_tree.ts new file mode 100644 index 000000000..f02a0131e --- /dev/null +++ b/ru/codes/typescript/chapter_divide_and_conquer/build_tree.ts @@ -0,0 +1,50 @@ +/** + * File: build_tree.ts + * Created Time: 2023-07-30 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +import { printTree } from '../modules/PrintUtil'; +import { TreeNode } from '../modules/TreeNode'; + +/* Построить двоичное дерево: разделяй и властвуй */ +function dfs( + preorder: number[], + inorderMap: Map, + i: number, + l: number, + r: number +): TreeNode | null { + // Завершить при пустом диапазоне поддерева + if (r - l < 0) return null; + // Инициализировать корневой узел + const root: TreeNode = new TreeNode(preorder[i]); + // Найти m, чтобы разделить левое и правое поддеревья + const m = inorderMap.get(preorder[i]); + // Подзадача: построить левое поддерево + root.left = dfs(preorder, inorderMap, i + 1, l, m - 1); + // Подзадача: построить правое поддерево + root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r); + // Вернуть корневой узел + return root; +} + +/* Построить двоичное дерево */ +function buildTree(preorder: number[], inorder: number[]): TreeNode | null { + // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам + let inorderMap = new Map(); + for (let i = 0; i < inorder.length; i++) { + inorderMap.set(inorder[i], i); + } + const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1); + return root; +} + +/* Driver Code */ +const preorder = [3, 9, 2, 1, 7]; +const inorder = [9, 3, 1, 2, 7]; +console.log('Предварительный обход = ' + JSON.stringify(preorder)); +console.log('Симметричный обход = ' + JSON.stringify(inorder)); +const root = buildTree(preorder, inorder); +console.log('Построенное двоичное дерево:'); +printTree(root); diff --git a/ru/codes/typescript/chapter_divide_and_conquer/hanota.ts b/ru/codes/typescript/chapter_divide_and_conquer/hanota.ts new file mode 100644 index 000000000..e462c8591 --- /dev/null +++ b/ru/codes/typescript/chapter_divide_and_conquer/hanota.ts @@ -0,0 +1,52 @@ +/** + * File: hanota.ts + * Created Time: 2023-07-30 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Переместить один диск */ +function move(src: number[], tar: number[]): void { + // Снять диск с вершины src + const pan = src.pop(); + // Положить диск на вершину tar + tar.push(pan); +} + +/* Решить задачу Ханойской башни f(i) */ +function dfs(i: number, src: number[], buf: number[], tar: number[]): void { + // Если в src остался только один диск, сразу переместить его в tar + if (i === 1) { + move(src, tar); + return; + } + // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar + dfs(i - 1, src, tar, buf); + // Подзадача f(1): переместить оставшийся один диск из src в tar + move(src, tar); + // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src + dfs(i - 1, buf, src, tar); +} + +/* Решить задачу Ханойской башни */ +function solveHanota(A: number[], B: number[], C: number[]): void { + const n = A.length; + // Переместить верхние n дисков из A в C с помощью B + dfs(n, A, B, C); +} + +/* Driver Code */ +// Хвост списка соответствует вершине столбца +const A = [5, 4, 3, 2, 1]; +const B = []; +const C = []; +console.log('Начальное состояние:'); +console.log(`A = ${JSON.stringify(A)}`); +console.log(`B = ${JSON.stringify(B)}`); +console.log(`C = ${JSON.stringify(C)}`); + +solveHanota(A, B, C); + +console.log('После завершения перемещения дисков:'); +console.log(`A = ${JSON.stringify(A)}`); +console.log(`B = ${JSON.stringify(B)}`); +console.log(`C = ${JSON.stringify(C)}`); diff --git a/ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_backtrack.ts b/ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_backtrack.ts new file mode 100644 index 000000000..4e3e700e4 --- /dev/null +++ b/ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_backtrack.ts @@ -0,0 +1,41 @@ +/** + * File: climbing_stairs_backtrack.ts + * Created Time: 2023-07-26 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Бэктрекинг */ +function backtrack( + choices: number[], + state: number, + n: number, + res: Map<0, any> +): void { + // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1 + if (state === n) res.set(0, res.get(0) + 1); + // Перебор всех вариантов выбора + for (const choice of choices) { + // Отсечение: нельзя выходить за n-ю ступень + if (state + choice > n) continue; + // Попытка: сделать выбор и обновить состояние + backtrack(choices, state + choice, n, res); + // Откат + } +} + +/* Подъем по лестнице: бэктрекинг */ +function climbingStairsBacktrack(n: number): number { + const choices = [1, 2]; // Можно подняться на 1 или 2 ступени + const state = 0; // Начать подъем с 0-й ступени + const res = new Map(); + res.set(0, 0); // Использовать res[0] для хранения числа решений + backtrack(choices, state, n, res); + return res.get(0); +} + +/* Driver Code */ +const n = 9; +const res = climbingStairsBacktrack(n); +console.log(`Количество способов подняться по лестнице из ${n} ступеней = ${res} вариантов`); + +export {}; diff --git a/ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_constraint_dp.ts b/ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_constraint_dp.ts new file mode 100644 index 000000000..4eb56c636 --- /dev/null +++ b/ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_constraint_dp.ts @@ -0,0 +1,32 @@ +/** + * File: climbing_stairs_constraint_dp.ts + * Created Time: 2023-08-23 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Подъем по лестнице с ограничениями: динамическое программирование */ +function climbingStairsConstraintDP(n: number): number { + if (n === 1 || n === 2) { + return 1; + } + // Инициализация таблицы dp для хранения решений подзадач + const dp = Array.from({ length: n + 1 }, () => new Array(3)); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1][1] = 1; + dp[1][2] = 0; + dp[2][1] = 0; + dp[2][2] = 1; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (let i = 3; i <= n; i++) { + dp[i][1] = dp[i - 1][2]; + dp[i][2] = dp[i - 2][1] + dp[i - 2][2]; + } + return dp[n][1] + dp[n][2]; +} + +/* Driver Code */ +const n = 9; +const res = climbingStairsConstraintDP(n); +console.log(`Количество способов подняться по лестнице из ${n} ступеней = ${res} вариантов`); + +export {}; diff --git a/ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_dfs.ts b/ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_dfs.ts new file mode 100644 index 000000000..ea643c536 --- /dev/null +++ b/ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_dfs.ts @@ -0,0 +1,26 @@ +/** + * File: climbing_stairs_dfs.ts + * Created Time: 2023-07-26 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Поиск */ +function dfs(i: number): number { + // dp[1] и dp[2] уже известны, вернуть их + if (i === 1 || i === 2) return i; + // dp[i] = dp[i-1] + dp[i-2] + const count = dfs(i - 1) + dfs(i - 2); + return count; +} + +/* Подъем по лестнице: поиск */ +function climbingStairsDFS(n: number): number { + return dfs(n); +} + +/* Driver Code */ +const n = 9; +const res = climbingStairsDFS(n); +console.log(`Количество способов подняться по лестнице из ${n} ступеней = ${res} вариантов`); + +export {}; diff --git a/ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_dfs_mem.ts b/ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_dfs_mem.ts new file mode 100644 index 000000000..251033cc8 --- /dev/null +++ b/ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_dfs_mem.ts @@ -0,0 +1,32 @@ +/** + * File: climbing_stairs_dfs_mem.ts + * Created Time: 2023-07-26 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Поиск с мемоизацией */ +function dfs(i: number, mem: number[]): number { + // dp[1] и dp[2] уже известны, вернуть их + if (i === 1 || i === 2) return i; + // Если запись dp[i] существует, сразу вернуть ее + if (mem[i] != -1) return mem[i]; + // dp[i] = dp[i-1] + dp[i-2] + const count = dfs(i - 1, mem) + dfs(i - 2, mem); + // Сохранить dp[i] + mem[i] = count; + return count; +} + +/* Подъем по лестнице: поиск с мемоизацией */ +function climbingStairsDFSMem(n: number): number { + // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи + const mem = new Array(n + 1).fill(-1); + return dfs(n, mem); +} + +/* Driver Code */ +const n = 9; +const res = climbingStairsDFSMem(n); +console.log(`Количество способов подняться по лестнице из ${n} ступеней = ${res} вариантов`); + +export {}; diff --git a/ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_dp.ts b/ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_dp.ts new file mode 100644 index 000000000..b0be6684a --- /dev/null +++ b/ru/codes/typescript/chapter_dynamic_programming/climbing_stairs_dp.ts @@ -0,0 +1,42 @@ +/** + * File: climbing_stairs_dp.ts + * Created Time: 2023-07-26 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Подъем по лестнице: динамическое программирование */ +function climbingStairsDP(n: number): number { + if (n === 1 || n === 2) return n; + // Инициализация таблицы dp для хранения решений подзадач + const dp = new Array(n + 1).fill(-1); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = 1; + dp[2] = 2; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (let i = 3; i <= n; i++) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + return dp[n]; +} + +/* Подъем по лестнице: динамическое программирование с оптимизацией памяти */ +function climbingStairsDPComp(n: number): number { + if (n === 1 || n === 2) return n; + let a = 1, + b = 2; + for (let i = 3; i <= n; i++) { + const tmp = b; + b = a + b; + a = tmp; + } + return b; +} + +/* Driver Code */ +const n = 9; +let res = climbingStairsDP(n); +console.log(`Количество способов подняться по лестнице из ${n} ступеней = ${res} вариантов`); +res = climbingStairsDPComp(n); +console.log(`Количество способов подняться по лестнице из ${n} ступеней = ${res} вариантов`); + +export {}; diff --git a/ru/codes/typescript/chapter_dynamic_programming/coin_change.ts b/ru/codes/typescript/chapter_dynamic_programming/coin_change.ts new file mode 100644 index 000000000..d64ef6bcc --- /dev/null +++ b/ru/codes/typescript/chapter_dynamic_programming/coin_change.ts @@ -0,0 +1,68 @@ +/** + * File: coin_change.ts + * Created Time: 2023-08-23 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Размен монет: динамическое программирование */ +function coinChangeDP(coins: Array, amt: number): number { + const n = coins.length; + const MAX = amt + 1; + // Инициализация таблицы dp + const dp = Array.from({ length: n + 1 }, () => + Array.from({ length: amt + 1 }, () => 0) + ); + // Переход состояний: первая строка и первый столбец + for (let a = 1; a <= amt; a++) { + dp[0][a] = MAX; + } + // Переход состояний: остальные строки и столбцы + for (let i = 1; i <= n; i++) { + for (let a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1); + } + } + } + return dp[n][amt] !== MAX ? dp[n][amt] : -1; +} + +/* Размен монет: динамическое программирование с оптимизацией памяти */ +function coinChangeDPComp(coins: Array, amt: number): number { + const n = coins.length; + const MAX = amt + 1; + // Инициализация таблицы dp + const dp = Array.from({ length: amt + 1 }, () => MAX); + dp[0] = 0; + // Переход состояний + for (let i = 1; i <= n; i++) { + for (let a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1); + } + } + } + return dp[amt] !== MAX ? dp[amt] : -1; +} + +/* Driver Code */ +const coins = [1, 2, 5]; +const amt = 4; + +// Динамическое программирование +let res = coinChangeDP(coins, amt); +console.log(`Минимальное число монет для набора целевой суммы = ${res}`); + +// Динамическое программирование с оптимизацией памяти +res = coinChangeDPComp(coins, amt); +console.log(`Минимальное число монет для набора целевой суммы = ${res}`); + +export {}; diff --git a/ru/codes/typescript/chapter_dynamic_programming/coin_change_ii.ts b/ru/codes/typescript/chapter_dynamic_programming/coin_change_ii.ts new file mode 100644 index 000000000..745976be9 --- /dev/null +++ b/ru/codes/typescript/chapter_dynamic_programming/coin_change_ii.ts @@ -0,0 +1,66 @@ +/** + * File: coin_change_ii.ts + * Created Time: 2023-08-23 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Размен монет II: динамическое программирование */ +function coinChangeIIDP(coins: Array, amt: number): number { + const n = coins.length; + // Инициализация таблицы dp + const dp = Array.from({ length: n + 1 }, () => + Array.from({ length: amt + 1 }, () => 0) + ); + // Инициализация первого столбца + for (let i = 0; i <= n; i++) { + dp[i][0] = 1; + } + // Переход состояний + for (let i = 1; i <= n; i++) { + for (let a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a]; + } else { + // Сумма двух решений: не брать или взять монету i + dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]; + } + } + } + return dp[n][amt]; +} + +/* Размен монет II: динамическое программирование с оптимизацией памяти */ +function coinChangeIIDPComp(coins: Array, amt: number): number { + const n = coins.length; + // Инициализация таблицы dp + const dp = Array.from({ length: amt + 1 }, () => 0); + dp[0] = 1; + // Переход состояний + for (let i = 1; i <= n; i++) { + for (let a = 1; a <= amt; a++) { + if (coins[i - 1] > a) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Сумма двух решений: не брать или взять монету i + dp[a] = dp[a] + dp[a - coins[i - 1]]; + } + } + } + return dp[amt]; +} + +/* Driver Code */ +const coins = [1, 2, 5]; +const amt = 5; + +// Динамическое программирование +let res = coinChangeIIDP(coins, amt); +console.log(`Количество комбинаций монет для набора целевой суммы = ${res}`); + +// Динамическое программирование с оптимизацией памяти +res = coinChangeIIDPComp(coins, amt); +console.log(`Количество комбинаций монет для набора целевой суммы = ${res}`); + +export {}; diff --git a/ru/codes/typescript/chapter_dynamic_programming/edit_distance.ts b/ru/codes/typescript/chapter_dynamic_programming/edit_distance.ts new file mode 100644 index 000000000..9028d209a --- /dev/null +++ b/ru/codes/typescript/chapter_dynamic_programming/edit_distance.ts @@ -0,0 +1,148 @@ +/** + * File: edit_distance.ts + * Created Time: 2023-08-23 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Редакционное расстояние: полный перебор */ +function editDistanceDFS(s: string, t: string, i: number, j: number): number { + // Если s и t пусты, вернуть 0 + if (i === 0 && j === 0) return 0; + + // Если s пусто, вернуть длину t + if (i === 0) return j; + + // Если t пусто, вернуть длину s + if (j === 0) return i; + + // Если два символа равны, сразу пропустить их + if (s.charAt(i - 1) === t.charAt(j - 1)) + return editDistanceDFS(s, t, i - 1, j - 1); + + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + const insert = editDistanceDFS(s, t, i, j - 1); + const del = editDistanceDFS(s, t, i - 1, j); + const replace = editDistanceDFS(s, t, i - 1, j - 1); + // Вернуть минимальное число шагов редактирования + return Math.min(insert, del, replace) + 1; +} + +/* Редакционное расстояние: поиск с мемоизацией */ +function editDistanceDFSMem( + s: string, + t: string, + mem: Array>, + i: number, + j: number +): number { + // Если s и t пусты, вернуть 0 + if (i === 0 && j === 0) return 0; + + // Если s пусто, вернуть длину t + if (i === 0) return j; + + // Если t пусто, вернуть длину s + if (j === 0) return i; + + // Если запись уже есть, сразу вернуть ее + if (mem[i][j] !== -1) return mem[i][j]; + + // Если два символа равны, сразу пропустить их + if (s.charAt(i - 1) === t.charAt(j - 1)) + return editDistanceDFSMem(s, t, mem, i - 1, j - 1); + + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + const insert = editDistanceDFSMem(s, t, mem, i, j - 1); + const del = editDistanceDFSMem(s, t, mem, i - 1, j); + const replace = editDistanceDFSMem(s, t, mem, i - 1, j - 1); + // Сохранить и вернуть минимальное число шагов редактирования + mem[i][j] = Math.min(insert, del, replace) + 1; + return mem[i][j]; +} + +/* Редакционное расстояние: динамическое программирование */ +function editDistanceDP(s: string, t: string): number { + const n = s.length, + m = t.length; + const dp = Array.from({ length: n + 1 }, () => + Array.from({ length: m + 1 }, () => 0) + ); + // Переход состояний: первая строка и первый столбец + for (let i = 1; i <= n; i++) { + dp[i][0] = i; + } + for (let j = 1; j <= m; j++) { + dp[0][j] = j; + } + // Переход состояний: остальные строки и столбцы + for (let i = 1; i <= n; i++) { + for (let j = 1; j <= m; j++) { + if (s.charAt(i - 1) === t.charAt(j - 1)) { + // Если два символа равны, сразу пропустить их + dp[i][j] = dp[i - 1][j - 1]; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[i][j] = + Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1; + } + } + } + return dp[n][m]; +} + +/* Редакционное расстояние: динамическое программирование с оптимизацией памяти */ +function editDistanceDPComp(s: string, t: string): number { + const n = s.length, + m = t.length; + const dp = new Array(m + 1).fill(0); + // Переход состояний: первая строка + for (let j = 1; j <= m; j++) { + dp[j] = j; + } + // Переход состояний: остальные строки + for (let i = 1; i <= n; i++) { + // Переход состояний: первый столбец + let leftup = dp[0]; // Временно сохранить dp[i-1, j-1] + dp[0] = i; + // Переход состояний: остальные столбцы + for (let j = 1; j <= m; j++) { + const temp = dp[j]; + if (s.charAt(i - 1) === t.charAt(j - 1)) { + // Если два символа равны, сразу пропустить их + dp[j] = leftup; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1; + } + leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации + } + } + return dp[m]; +} + +/* Driver Code */ +const s = 'bag'; +const t = 'pack'; +const n = s.length, + m = t.length; + +// Полный перебор +let res = editDistanceDFS(s, t, n, m); +console.log(`Чтобы преобразовать ${s} в ${t}, нужно минимум ${res} шагов`); + +// Поиск с мемоизацией +const mem = Array.from({ length: n + 1 }, () => + Array.from({ length: m + 1 }, () => -1) +); +res = editDistanceDFSMem(s, t, mem, n, m); +console.log(`Чтобы преобразовать ${s} в ${t}, нужно минимум ${res} шагов`); + +// Динамическое программирование +res = editDistanceDP(s, t); +console.log(`Чтобы преобразовать ${s} в ${t}, нужно минимум ${res} шагов`); + +// Динамическое программирование с оптимизацией памяти +res = editDistanceDPComp(s, t); +console.log(`Чтобы преобразовать ${s} в ${t}, нужно минимум ${res} шагов`); + +export {}; diff --git a/ru/codes/typescript/chapter_dynamic_programming/knapsack.ts b/ru/codes/typescript/chapter_dynamic_programming/knapsack.ts new file mode 100644 index 000000000..5427cf3d6 --- /dev/null +++ b/ru/codes/typescript/chapter_dynamic_programming/knapsack.ts @@ -0,0 +1,134 @@ +/** + * File: knapsack.ts + * Created Time: 2023-08-23 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Рюкзак 0-1: полный перебор */ +function knapsackDFS( + wgt: Array, + val: Array, + i: number, + c: number +): number { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i === 0 || c === 0) { + return 0; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (wgt[i - 1] > c) { + return knapsackDFS(wgt, val, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + const no = knapsackDFS(wgt, val, i - 1, c); + const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]; + // Вернуть вариант с большей стоимостью из двух возможных + return Math.max(no, yes); +} + +/* Рюкзак 0-1: поиск с мемоизацией */ +function knapsackDFSMem( + wgt: Array, + val: Array, + mem: Array>, + i: number, + c: number +): number { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i === 0 || c === 0) { + return 0; + } + // Если запись уже есть, вернуть сразу + if (mem[i][c] !== -1) { + return mem[i][c]; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (wgt[i - 1] > c) { + return knapsackDFSMem(wgt, val, mem, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + const no = knapsackDFSMem(wgt, val, mem, i - 1, c); + const yes = + knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]; + // Сохранить и вернуть вариант с большей стоимостью из двух решений + mem[i][c] = Math.max(no, yes); + return mem[i][c]; +} + +/* Рюкзак 0-1: динамическое программирование */ +function knapsackDP( + wgt: Array, + val: Array, + cap: number +): number { + const n = wgt.length; + // Инициализация таблицы dp + const dp = Array.from({ length: n + 1 }, () => + Array.from({ length: cap + 1 }, () => 0) + ); + // Переход состояний + for (let i = 1; i <= n; i++) { + for (let c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = Math.max( + dp[i - 1][c], + dp[i - 1][c - wgt[i - 1]] + val[i - 1] + ); + } + } + } + return dp[n][cap]; +} + +/* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */ +function knapsackDPComp( + wgt: Array, + val: Array, + cap: number +): number { + const n = wgt.length; + // Инициализация таблицы dp + const dp = Array(cap + 1).fill(0); + // Переход состояний + for (let i = 1; i <= n; i++) { + // Обход в обратном порядке + for (let c = cap; c >= 1; c--) { + if (wgt[i - 1] <= c) { + // Большее из двух решений: не брать или взять предмет i + dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[cap]; +} + +/* Driver Code */ +const wgt = [10, 20, 30, 40, 50]; +const val = [50, 120, 150, 210, 240]; +const cap = 50; +const n = wgt.length; + +// Полный перебор +let res = knapsackDFS(wgt, val, n, cap); +console.log(`Максимальная стоимость предметов без превышения вместимости рюкзака = ${res}`); + +// Поиск с мемоизацией +const mem = Array.from({ length: n + 1 }, () => + Array.from({ length: cap + 1 }, () => -1) +); +res = knapsackDFSMem(wgt, val, mem, n, cap); +console.log(`Максимальная стоимость предметов без превышения вместимости рюкзака = ${res}`); + +// Динамическое программирование +res = knapsackDP(wgt, val, cap); +console.log(`Максимальная стоимость предметов без превышения вместимости рюкзака = ${res}`); + +// Динамическое программирование с оптимизацией памяти +res = knapsackDPComp(wgt, val, cap); +console.log(`Максимальная стоимость предметов без превышения вместимости рюкзака = ${res}`); + +export {}; diff --git a/ru/codes/typescript/chapter_dynamic_programming/min_cost_climbing_stairs_dp.ts b/ru/codes/typescript/chapter_dynamic_programming/min_cost_climbing_stairs_dp.ts new file mode 100644 index 000000000..8c02b92cc --- /dev/null +++ b/ru/codes/typescript/chapter_dynamic_programming/min_cost_climbing_stairs_dp.ts @@ -0,0 +1,51 @@ +/** + * File: min_cost_climbing_stairs_dp.ts + * Created Time: 2023-08-23 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Минимальная стоимость подъема по лестнице: динамическое программирование */ +function minCostClimbingStairsDP(cost: Array): number { + const n = cost.length - 1; + if (n === 1 || n === 2) { + return cost[n]; + } + // Инициализация таблицы dp для хранения решений подзадач + const dp = new Array(n + 1); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = cost[1]; + dp[2] = cost[2]; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (let i = 3; i <= n; i++) { + dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i]; + } + return dp[n]; +} + +/* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */ +function minCostClimbingStairsDPComp(cost: Array): number { + const n = cost.length - 1; + if (n === 1 || n === 2) { + return cost[n]; + } + let a = cost[1], + b = cost[2]; + for (let i = 3; i <= n; i++) { + const tmp = b; + b = Math.min(a, tmp) + cost[i]; + a = tmp; + } + return b; +} + +/* Driver Code */ +const cost = [0, 1, 10, 1, 1, 1, 10, 1, 1, 10, 1]; +console.log(`Стоимость подъема по ступеням: ${cost}`); + +let res = minCostClimbingStairsDP(cost); +console.log(`Минимальная стоимость подъема по лестнице = ${res}`); + +res = minCostClimbingStairsDPComp(cost); +console.log(`Минимальная стоимость подъема по лестнице = ${res}`); + +export {}; diff --git a/ru/codes/typescript/chapter_dynamic_programming/min_path_sum.ts b/ru/codes/typescript/chapter_dynamic_programming/min_path_sum.ts new file mode 100644 index 000000000..202cef4e5 --- /dev/null +++ b/ru/codes/typescript/chapter_dynamic_programming/min_path_sum.ts @@ -0,0 +1,132 @@ +/** + * File: min_path_sum.ts + * Created Time: 2023-08-23 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Минимальная сумма пути: полный перебор */ +function minPathSumDFS( + grid: Array>, + i: number, + j: number +): number { + // Если это верхняя левая ячейка, завершить поиск + if (i === 0 && j == 0) { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 || j < 0) { + return Infinity; + } + // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1) + const up = minPathSumDFS(grid, i - 1, j); + const left = minPathSumDFS(grid, i, j - 1); + // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + return Math.min(left, up) + grid[i][j]; +} + +/* Минимальная сумма пути: поиск с мемоизацией */ +function minPathSumDFSMem( + grid: Array>, + mem: Array>, + i: number, + j: number +): number { + // Если это верхняя левая ячейка, завершить поиск + if (i === 0 && j === 0) { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 || j < 0) { + return Infinity; + } + // Если запись уже есть, вернуть сразу + if (mem[i][j] != -1) { + return mem[i][j]; + } + // Минимальная стоимость пути для левой и верхней ячеек + const up = minPathSumDFSMem(grid, mem, i - 1, j); + const left = minPathSumDFSMem(grid, mem, i, j - 1); + // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + mem[i][j] = Math.min(left, up) + grid[i][j]; + return mem[i][j]; +} + +/* Минимальная сумма пути: динамическое программирование */ +function minPathSumDP(grid: Array>): number { + const n = grid.length, + m = grid[0].length; + // Инициализация таблицы dp + const dp = Array.from({ length: n }, () => + Array.from({ length: m }, () => 0) + ); + dp[0][0] = grid[0][0]; + // Переход состояний: первая строка + for (let j = 1; j < m; j++) { + dp[0][j] = dp[0][j - 1] + grid[0][j]; + } + // Переход состояний: первый столбец + for (let i = 1; i < n; i++) { + dp[i][0] = dp[i - 1][0] + grid[i][0]; + } + // Переход состояний: остальные строки и столбцы + for (let i = 1; i < n; i++) { + for (let j: number = 1; j < m; j++) { + dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]; + } + } + return dp[n - 1][m - 1]; +} + +/* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */ +function minPathSumDPComp(grid: Array>): number { + const n = grid.length, + m = grid[0].length; + // Инициализация таблицы dp + const dp = new Array(m); + // Переход состояний: первая строка + dp[0] = grid[0][0]; + for (let j = 1; j < m; j++) { + dp[j] = dp[j - 1] + grid[0][j]; + } + // Переход состояний: остальные строки + for (let i = 1; i < n; i++) { + // Переход состояний: первый столбец + dp[0] = dp[0] + grid[i][0]; + // Переход состояний: остальные столбцы + for (let j = 1; j < m; j++) { + dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j]; + } + } + return dp[m - 1]; +} + +/* Driver Code */ +const grid = [ + [1, 3, 1, 5], + [2, 2, 4, 2], + [5, 3, 2, 1], + [4, 3, 5, 2], +]; +const n = grid.length, + m = grid[0].length; +// Полный перебор +let res = minPathSumDFS(grid, n - 1, m - 1); +console.log(`Минимальная сумма пути из левого верхнего угла в правый нижний = ${res}`); + +// Поиск с мемоизацией +const mem = Array.from({ length: n }, () => + Array.from({ length: m }, () => -1) +); +res = minPathSumDFSMem(grid, mem, n - 1, m - 1); +console.log(`Минимальная сумма пути из левого верхнего угла в правый нижний = ${res}`); + +// Динамическое программирование +res = minPathSumDP(grid); +console.log(`Минимальная сумма пути из левого верхнего угла в правый нижний = ${res}`); + +// Динамическое программирование с оптимизацией памяти +res = minPathSumDPComp(grid); +console.log(`Минимальная сумма пути из левого верхнего угла в правый нижний = ${res}`); + +export {}; diff --git a/ru/codes/typescript/chapter_dynamic_programming/unbounded_knapsack.ts b/ru/codes/typescript/chapter_dynamic_programming/unbounded_knapsack.ts new file mode 100644 index 000000000..965c309f3 --- /dev/null +++ b/ru/codes/typescript/chapter_dynamic_programming/unbounded_knapsack.ts @@ -0,0 +1,73 @@ +/** + * File: unbounded_knapsack.ts + * Created Time: 2023-08-23 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Полный рюкзак: динамическое программирование */ +function unboundedKnapsackDP( + wgt: Array, + val: Array, + cap: number +): number { + const n = wgt.length; + // Инициализация таблицы dp + const dp = Array.from({ length: n + 1 }, () => + Array.from({ length: cap + 1 }, () => 0) + ); + // Переход состояний + for (let i = 1; i <= n; i++) { + for (let c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = Math.max( + dp[i - 1][c], + dp[i][c - wgt[i - 1]] + val[i - 1] + ); + } + } + } + return dp[n][cap]; +} + +/* Полный рюкзак: динамическое программирование с оптимизацией памяти */ +function unboundedKnapsackDPComp( + wgt: Array, + val: Array, + cap: number +): number { + const n = wgt.length; + // Инициализация таблицы dp + const dp = Array.from({ length: cap + 1 }, () => 0); + // Переход состояний + for (let i = 1; i <= n; i++) { + for (let c = 1; c <= cap; c++) { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]); + } + } + } + return dp[cap]; +} + +/* Driver Code */ +const wgt = [1, 2, 3]; +const val = [5, 11, 15]; +const cap = 4; + +// Динамическое программирование +let res = unboundedKnapsackDP(wgt, val, cap); +console.log(`Максимальная стоимость предметов без превышения вместимости рюкзака = ${res}`); + +// Динамическое программирование с оптимизацией памяти +res = unboundedKnapsackDPComp(wgt, val, cap); +console.log(`Максимальная стоимость предметов без превышения вместимости рюкзака = ${res}`); + +export {}; diff --git a/ru/codes/typescript/chapter_graph/graph_adjacency_list.ts b/ru/codes/typescript/chapter_graph/graph_adjacency_list.ts new file mode 100644 index 000000000..0fd586395 --- /dev/null +++ b/ru/codes/typescript/chapter_graph/graph_adjacency_list.ts @@ -0,0 +1,140 @@ +/** + * File: graph_adjacency_list.ts + * Created Time: 2023-02-09 + * Author: Justin (xiefahit@gmail.com) + */ + +import { Vertex } from '../modules/Vertex'; + +/* Класс неориентированного графа на основе списка смежности */ +class GraphAdjList { + // Список смежности, где key — вершина, а value — все смежные ей вершины + adjList: Map; + + /* Конструктор */ + constructor(edges: Vertex[][]) { + this.adjList = new Map(); + // Добавить все вершины и ребра + for (const edge of edges) { + this.addVertex(edge[0]); + this.addVertex(edge[1]); + this.addEdge(edge[0], edge[1]); + } + } + + /* Получить число вершин */ + size(): number { + return this.adjList.size; + } + + /* Добавление ребра */ + addEdge(vet1: Vertex, vet2: Vertex): void { + if ( + !this.adjList.has(vet1) || + !this.adjList.has(vet2) || + vet1 === vet2 + ) { + throw new Error('Illegal Argument Exception'); + } + // Добавить ребро vet1 - vet2 + this.adjList.get(vet1).push(vet2); + this.adjList.get(vet2).push(vet1); + } + + /* Удаление ребра */ + removeEdge(vet1: Vertex, vet2: Vertex): void { + if ( + !this.adjList.has(vet1) || + !this.adjList.has(vet2) || + vet1 === vet2 || + this.adjList.get(vet1).indexOf(vet2) === -1 + ) { + throw new Error('Illegal Argument Exception'); + } + // Удалить ребро vet1 - vet2 + this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1); + this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1); + } + + /* Добавление вершины */ + addVertex(vet: Vertex): void { + if (this.adjList.has(vet)) return; + // Добавить новый список в список смежности + this.adjList.set(vet, []); + } + + /* Удаление вершины */ + removeVertex(vet: Vertex): void { + if (!this.adjList.has(vet)) { + throw new Error('Illegal Argument Exception'); + } + // Удалить из списка смежности список, соответствующий вершине vet + this.adjList.delete(vet); + // Обойти списки других вершин и удалить все ребра, содержащие vet + for (const set of this.adjList.values()) { + const index: number = set.indexOf(vet); + if (index > -1) { + set.splice(index, 1); + } + } + } + + /* Вывести список смежности */ + print(): void { + console.log('Список смежности ='); + for (const [key, value] of this.adjList.entries()) { + const tmp = []; + for (const vertex of value) { + tmp.push(vertex.val); + } + console.log(key.val + ': ' + tmp.join()); + } + } +} + +/* Driver Code */ +if (import.meta.url.endsWith(process.argv[1])) { + /* Инициализация неориентированного графа */ + const v0 = new Vertex(1), + v1 = new Vertex(3), + v2 = new Vertex(2), + v3 = new Vertex(5), + v4 = new Vertex(4); + const edges = [ + [v0, v1], + [v1, v2], + [v2, v3], + [v0, v3], + [v2, v4], + [v3, v4], + ]; + const graph = new GraphAdjList(edges); + console.log('\nПосле инициализации граф имеет вид'); + graph.print(); + + /* Добавление ребра */ + // Вершины 1 и 2 соответствуют v0 и v2 + graph.addEdge(v0, v2); + console.log('\nПосле добавления ребра 1-2 граф имеет вид'); + graph.print(); + + /* Удаление ребра */ + // Вершины 1 и 3 соответствуют v0 и v1 + graph.removeEdge(v0, v1); + console.log('\nПосле удаления ребра 1-3 граф имеет вид'); + graph.print(); + + /* Добавление вершины */ + const v5 = new Vertex(6); + graph.addVertex(v5); + console.log('\nПосле добавления вершины 6 граф имеет вид'); + graph.print(); + + /* Удаление вершины */ + // Вершина 3 соответствует v1 + graph.removeVertex(v1); + console.log('\nПосле удаления вершины 3 граф имеет вид'); + graph.print(); +} + +export { GraphAdjList }; diff --git a/ru/codes/typescript/chapter_graph/graph_adjacency_matrix.ts b/ru/codes/typescript/chapter_graph/graph_adjacency_matrix.ts new file mode 100644 index 000000000..4142fa84d --- /dev/null +++ b/ru/codes/typescript/chapter_graph/graph_adjacency_matrix.ts @@ -0,0 +1,134 @@ +/** + * File: graph_adjacency_matrix.ts + * Created Time: 2023-02-09 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +/* Класс неориентированного графа на основе матрицы смежности */ +class GraphAdjMat { + vertices: number[]; // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин» + adjMat: number[][]; // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин» + + /* Конструктор */ + constructor(vertices: number[], edges: number[][]) { + this.vertices = []; + this.adjMat = []; + // Добавление вершины + for (const val of vertices) { + this.addVertex(val); + } + // Добавить ребра + // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices + for (const e of edges) { + this.addEdge(e[0], e[1]); + } + } + + /* Получить число вершин */ + size(): number { + return this.vertices.length; + } + + /* Добавление вершины */ + addVertex(val: number): void { + const n: number = this.size(); + // Добавить значение новой вершины в список вершин + this.vertices.push(val); + // Добавить строку в матрицу смежности + const newRow: number[] = []; + for (let j: number = 0; j < n; j++) { + newRow.push(0); + } + this.adjMat.push(newRow); + // Добавить столбец в матрицу смежности + for (const row of this.adjMat) { + row.push(0); + } + } + + /* Удаление вершины */ + removeVertex(index: number): void { + if (index >= this.size()) { + throw new RangeError('Index Out Of Bounds Exception'); + } + // Удалить вершину с индексом index из списка вершин + this.vertices.splice(index, 1); + + // Удалить строку с индексом index из матрицы смежности + this.adjMat.splice(index, 1); + // Удалить столбец с индексом index из матрицы смежности + for (const row of this.adjMat) { + row.splice(index, 1); + } + } + + /* Добавление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + addEdge(i: number, j: number): void { + // Обработка выхода индекса за границы и случая равенства + if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) { + throw new RangeError('Index Out Of Bounds Exception'); + } + // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) === (j, i) + this.adjMat[i][j] = 1; + this.adjMat[j][i] = 1; + } + + /* Удаление ребра */ + // Параметры i и j соответствуют индексам элементов vertices + removeEdge(i: number, j: number): void { + // Обработка выхода индекса за границы и случая равенства + if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) { + throw new RangeError('Index Out Of Bounds Exception'); + } + this.adjMat[i][j] = 0; + this.adjMat[j][i] = 0; + } + + /* Вывести матрицу смежности */ + print(): void { + console.log('Список вершин = ', this.vertices); + console.log('Матрица смежности =', this.adjMat); + } +} + +/* Driver Code */ +/* Инициализация неориентированного графа */ +// Обратите внимание: элементы edges представляют индексы вершин, то есть соответствуют индексам элементов vertices +const vertices: number[] = [1, 3, 2, 5, 4]; +const edges: number[][] = [ + [0, 1], + [1, 2], + [2, 3], + [0, 3], + [2, 4], + [3, 4], +]; +const graph: GraphAdjMat = new GraphAdjMat(vertices, edges); +console.log('\nПосле инициализации граф имеет вид'); +graph.print(); + +/* Добавление ребра */ +// Индексы вершин 1 и 2 равны 0 и 2 соответственно +graph.addEdge(0, 2); +console.log('\nПосле добавления ребра 1-2 граф имеет вид'); +graph.print(); + +/* Удаление ребра */ +// Индексы вершин 1 и 3 равны 0 и 1 соответственно +graph.removeEdge(0, 1); +console.log('\nПосле удаления ребра 1-3 граф имеет вид'); +graph.print(); + +/* Добавление вершины */ +graph.addVertex(6); +console.log('\nПосле добавления вершины 6 граф имеет вид'); +graph.print(); + +/* Удаление вершины */ +// Индекс вершины 3 равен 1 +graph.removeVertex(1); +console.log('\nПосле удаления вершины 3 граф имеет вид'); +graph.print(); + +export {}; diff --git a/ru/codes/typescript/chapter_graph/graph_bfs.ts b/ru/codes/typescript/chapter_graph/graph_bfs.ts new file mode 100644 index 000000000..57a4f73b9 --- /dev/null +++ b/ru/codes/typescript/chapter_graph/graph_bfs.ts @@ -0,0 +1,61 @@ +/** + * File: graph_bfs.ts + * Created Time: 2023-02-21 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +import { GraphAdjList } from './graph_adjacency_list'; +import { Vertex } from '../modules/Vertex'; + +/* Обход в ширину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +function graphBFS(graph: GraphAdjList, startVet: Vertex): Vertex[] { + // Последовательность обхода вершин + const res: Vertex[] = []; + // Хеш-множество для хранения уже посещенных вершин + const visited: Set = new Set(); + visited.add(startVet); + // Очередь используется для реализации BFS + const que = [startVet]; + // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины + while (que.length) { + const vet = que.shift(); // Извлечь головную вершину из очереди + res.push(vet); // Отметить посещенную вершину + // Обойти все смежные вершины данной вершины + for (const adjVet of graph.adjList.get(vet) ?? []) { + if (visited.has(adjVet)) { + continue; // Пропустить уже посещенную вершину + } + que.push(adjVet); // Помещать в очередь только непосещенные вершины + visited.add(adjVet); // Отметить эту вершину как посещенную + } + } + // Вернуть последовательность обхода вершин + return res; +} + +/* Driver Code */ +/* Инициализация неориентированного графа */ +const v = Vertex.valsToVets([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); +const 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]], +]; +const graph = new GraphAdjList(edges); +console.log('\nПосле инициализации граф имеет вид'); +graph.print(); + +/* Обход в ширину */ +const res = graphBFS(graph, v[0]); +console.log('\nПоследовательность вершин при обходе в ширину (BFS)'); +console.log(Vertex.vetsToVals(res)); diff --git a/ru/codes/typescript/chapter_graph/graph_dfs.ts b/ru/codes/typescript/chapter_graph/graph_dfs.ts new file mode 100644 index 000000000..d0a097122 --- /dev/null +++ b/ru/codes/typescript/chapter_graph/graph_dfs.ts @@ -0,0 +1,58 @@ +/** + * File: graph_dfs.ts + * Created Time: 2023-02-21 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +import { Vertex } from '../modules/Vertex'; +import { GraphAdjList } from './graph_adjacency_list'; + +/* Вспомогательная функция обхода в глубину */ +function dfs( + graph: GraphAdjList, + visited: Set, + res: Vertex[], + vet: Vertex +): void { + res.push(vet); // Отметить посещенную вершину + visited.add(vet); // Отметить эту вершину как посещенную + // Обойти все смежные вершины данной вершины + for (const adjVet of graph.adjList.get(vet)) { + if (visited.has(adjVet)) { + continue; // Пропустить уже посещенную вершину + } + // Рекурсивно обходить смежные вершины + dfs(graph, visited, res, adjVet); + } +} + +/* Обход в глубину */ +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины +function graphDFS(graph: GraphAdjList, startVet: Vertex): Vertex[] { + // Последовательность обхода вершин + const res: Vertex[] = []; + // Хеш-множество для хранения уже посещенных вершин + const visited: Set = new Set(); + dfs(graph, visited, res, startVet); + return res; +} + +/* Driver Code */ +/* Инициализация неориентированного графа */ +const v = Vertex.valsToVets([0, 1, 2, 3, 4, 5, 6]); +const 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]], +]; +const graph = new GraphAdjList(edges); +console.log('\nПосле инициализации граф имеет вид'); +graph.print(); + +/* Обход в глубину */ +const res = graphDFS(graph, v[0]); +console.log('\nПоследовательность вершин при обходе в глубину (DFS)'); +console.log(Vertex.vetsToVals(res)); diff --git a/ru/codes/typescript/chapter_greedy/coin_change_greedy.ts b/ru/codes/typescript/chapter_greedy/coin_change_greedy.ts new file mode 100644 index 000000000..0ddb0b5f4 --- /dev/null +++ b/ru/codes/typescript/chapter_greedy/coin_change_greedy.ts @@ -0,0 +1,50 @@ +/** + * File: coin_change_greedy.ts + * Created Time: 2023-09-02 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Размен монет: жадный алгоритм */ +function coinChangeGreedy(coins: number[], amt: number): number { + // Предположить, что массив coins упорядочен + let i = coins.length - 1; + let count = 0; + // Циклически выполнять жадный выбор, пока не останется суммы + while (amt > 0) { + // Найти монету, которая меньше остатка суммы и наиболее к нему близка + while (i > 0 && coins[i] > amt) { + i--; + } + // Выбрать coins[i] + amt -= coins[i]; + count++; + } + // Если допустимое решение не найдено, вернуть -1 + return amt === 0 ? count : -1; +} + +/* Driver Code */ +// Жадный подход: гарантирует нахождение глобально оптимального решения +let coins: number[] = [1, 5, 10, 20, 50, 100]; +let amt: number = 186; +let res: number = coinChangeGreedy(coins, amt); +console.log(`\ncoins = ${coins}, amt = ${amt}`); +console.log(`Минимальное число монет для набора суммы ${amt} = ${res}`); + +// Жадный подход: не гарантирует нахождение глобально оптимального решения +coins = [1, 20, 50]; +amt = 60; +res = coinChangeGreedy(coins, amt); +console.log(`\ncoins = ${coins}, amt = ${amt}`); +console.log(`Минимальное число монет для набора суммы ${amt} = ${res}`); +console.log('На самом деле минимум равен 3: 20 + 20 + 20'); + +// Жадный подход: не гарантирует нахождение глобально оптимального решения +coins = [1, 49, 50]; +amt = 98; +res = coinChangeGreedy(coins, amt); +console.log(`\ncoins = ${coins}, amt = ${amt}`); +console.log(`Минимальное число монет для набора суммы ${amt} = ${res}`); +console.log('На самом деле минимум равен 2: 49 + 49'); + +export {}; diff --git a/ru/codes/typescript/chapter_greedy/fractional_knapsack.ts b/ru/codes/typescript/chapter_greedy/fractional_knapsack.ts new file mode 100644 index 000000000..92fcab0f9 --- /dev/null +++ b/ru/codes/typescript/chapter_greedy/fractional_knapsack.ts @@ -0,0 +1,50 @@ +/** + * File: fractional_knapsack.ts + * Created Time: 2023-09-02 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Предмет */ +class Item { + w: number; // Вес предмета + v: number; // Стоимость предмета + + constructor(w: number, v: number) { + this.w = w; + this.v = v; + } +} + +/* Дробный рюкзак: жадный алгоритм */ +function fractionalKnapsack(wgt: number[], val: number[], cap: number): number { + // Создать список предметов с двумя свойствами: вес и стоимость + const items: Item[] = wgt.map((w, i) => new Item(w, val[i])); + // Отсортировать по удельной стоимости item.v / item.w в порядке убывания + items.sort((a, b) => b.v / b.w - a.v / a.w); + // Циклический жадный выбор + let res = 0; + for (const item of items) { + if (item.w <= cap) { + // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком + res += item.v; + cap -= item.w; + } else { + // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета + res += (item.v / item.w) * cap; + // Свободной вместимости больше не осталось, поэтому выйти из цикла + break; + } + } + return res; +} + +/* Driver Code */ +const wgt: number[] = [10, 20, 30, 40, 50]; +const val: number[] = [50, 120, 150, 210, 240]; +const cap: number = 50; + +// Жадный алгоритм +const res: number = fractionalKnapsack(wgt, val, cap); +console.log(`Максимальная стоимость предметов без превышения вместимости рюкзака = ${res}`); + +export {}; diff --git a/ru/codes/typescript/chapter_greedy/max_capacity.ts b/ru/codes/typescript/chapter_greedy/max_capacity.ts new file mode 100644 index 000000000..2f9714814 --- /dev/null +++ b/ru/codes/typescript/chapter_greedy/max_capacity.ts @@ -0,0 +1,36 @@ +/** + * File: max_capacity.ts + * Created Time: 2023-09-02 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Максимальная вместимость: жадный алгоритм */ +function maxCapacity(ht: number[]): number { + // Инициализировать i и j так, чтобы они располагались по двум концам массива + let i = 0, + j = ht.length - 1; + // Начальная максимальная вместимость равна 0 + let res = 0; + // Выполнять жадный выбор в цикле, пока две доски не встретятся + while (i < j) { + // Обновить максимальную вместимость + const cap: number = Math.min(ht[i], ht[j]) * (j - i); + res = Math.max(res, cap); + // Сдвигать внутрь более короткую сторону + if (ht[i] < ht[j]) { + i += 1; + } else { + j -= 1; + } + } + return res; +} + +/* Driver Code */ +const ht: number[] = [3, 8, 5, 2, 7, 7, 3, 4]; + +// Жадный алгоритм +const res: number = maxCapacity(ht); +console.log(`Максимальная вместимость = ${res}`); + +export {}; diff --git a/ru/codes/typescript/chapter_greedy/max_product_cutting.ts b/ru/codes/typescript/chapter_greedy/max_product_cutting.ts new file mode 100644 index 000000000..7dd20abd7 --- /dev/null +++ b/ru/codes/typescript/chapter_greedy/max_product_cutting.ts @@ -0,0 +1,35 @@ +/** + * File: max_product_cutting.ts + * Created Time: 2023-09-02 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Максимальное произведение разрезания: жадный алгоритм */ +function maxProductCutting(n: number): number { + // Когда n <= 3, обязательно нужно выделить одну 1 + if (n <= 3) { + return 1 * (n - 1); + } + // Жадно выделить множители 3, где a — число троек, а b — остаток + let a: number = Math.floor(n / 3); + let b: number = n % 3; + if (b === 1) { + // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2 + return Math.pow(3, a - 1) * 2 * 2; + } + if (b === 2) { + // Если остаток равен 2, ничего не делать + return Math.pow(3, a) * 2; + } + // Если остаток равен 0, ничего не делать + return Math.pow(3, a); +} + +/* Driver Code */ +let n: number = 58; + +// Жадный алгоритм +let res: number = maxProductCutting(n); +console.log(`Максимальное произведение после разрезания = ${res}`); + +export {}; diff --git a/ru/codes/typescript/chapter_hashing/array_hash_map.ts b/ru/codes/typescript/chapter_hashing/array_hash_map.ts new file mode 100644 index 000000000..f0e26ccf6 --- /dev/null +++ b/ru/codes/typescript/chapter_hashing/array_hash_map.ts @@ -0,0 +1,134 @@ +/** + * File: array_hash_map.ts + * Created Time: 2022-12-20 + * Author: Daniel (better.sunjian@gmail.com) + */ + +/* Пара ключ-значение Number -> String */ +class Pair { + public key: number; + public val: string; + + constructor(key: number, val: string) { + this.key = key; + this.val = val; + } +} + +/* Хеш-таблица на основе массива */ +class ArrayHashMap { + private readonly buckets: (Pair | null)[]; + + constructor() { + // Инициализировать массив, содержащий 100 корзин + this.buckets = new Array(100).fill(null); + } + + /* Хеш-функция */ + private hashFunc(key: number): number { + return key % 100; + } + + /* Операция поиска */ + public get(key: number): string | null { + let index = this.hashFunc(key); + let pair = this.buckets[index]; + if (pair === null) return null; + return pair.val; + } + + /* Операция добавления */ + public set(key: number, val: string) { + let index = this.hashFunc(key); + this.buckets[index] = new Pair(key, val); + } + + /* Операция удаления */ + public delete(key: number) { + let index = this.hashFunc(key); + // Присвоить null, что означает удаление + this.buckets[index] = null; + } + + /* Получить все пары ключ-значение */ + public entries(): (Pair | null)[] { + let arr: (Pair | null)[] = []; + for (let i = 0; i < this.buckets.length; i++) { + if (this.buckets[i]) { + arr.push(this.buckets[i]); + } + } + return arr; + } + + /* Получить все ключи */ + public keys(): (number | undefined)[] { + let arr: (number | undefined)[] = []; + for (let i = 0; i < this.buckets.length; i++) { + if (this.buckets[i]) { + arr.push(this.buckets[i].key); + } + } + return arr; + } + + /* Получить все значения */ + public values(): (string | undefined)[] { + let arr: (string | undefined)[] = []; + for (let i = 0; i < this.buckets.length; i++) { + if (this.buckets[i]) { + arr.push(this.buckets[i].val); + } + } + return arr; + } + + /* Вывести хеш-таблицу */ + public print() { + let pairSet = this.entries(); + for (const pair of pairSet) { + console.info(`${pair.key} -> ${pair.val}`); + } + } +} + +/* Driver Code */ +/* Инициализация хеш-таблицы */ +const map = new ArrayHashMap(); +/* Операция добавления */ +// Добавить пару (key, value) в хеш-таблицу +map.set(12836, 'Сяо Ха'); +map.set(15937, 'Сяо Ло'); +map.set(16750, 'Сяо Суань'); +map.set(13276, 'Сяо Фа'); +map.set(10583, 'Сяо Я'); +console.info('\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение'); +map.print(); + +/* Операция поиска */ +// Ввести в хеш-таблицу ключ key и получить значение value +let name = map.get(15937); +console.info('\nПо номеру 15937 найдено имя ' + name); + +/* Операция удаления */ +// Удалить пару (key, value) из хеш-таблицы +map.delete(10583); +console.info('\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение'); +map.print(); + +/* Обход хеш-таблицы */ +console.info('\nОтдельный обход пар ключ-значение'); +for (const pair of map.entries()) { + if (!pair) continue; + console.info(pair.key + ' -> ' + pair.val); +} +console.info('\nОтдельный обход ключей'); +for (const key of map.keys()) { + console.info(key); +} +console.info('\nОтдельный обход значений'); +for (const val of map.values()) { + console.info(val); +} + +export {}; diff --git a/ru/codes/typescript/chapter_hashing/hash_map.ts b/ru/codes/typescript/chapter_hashing/hash_map.ts new file mode 100644 index 000000000..c66d51c85 --- /dev/null +++ b/ru/codes/typescript/chapter_hashing/hash_map.ts @@ -0,0 +1,46 @@ +/** + * File: hash_map.ts + * Created Time: 2022-12-20 + * Author: Daniel (better.sunjian@gmail.com) + */ + +/* Driver Code */ +/* Инициализация хеш-таблицы */ +const map = new Map(); + +/* Операция добавления */ +// Добавить пару (key, value) в хеш-таблицу +map.set(12836, 'Сяо Ха'); +map.set(15937, 'Сяо Ло'); +map.set(16750, 'Сяо Суань'); +map.set(13276, 'Сяо Фа'); +map.set(10583, 'Сяо Я'); +console.info('\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение'); +console.info(map); + +/* Операция поиска */ +// Ввести в хеш-таблицу ключ key и получить значение value +let name = map.get(15937); +console.info('\nПо номеру 15937 найдено имя ' + name); + +/* Операция удаления */ +// Удалить пару (key, value) из хеш-таблицы +map.delete(10583); +console.info('\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение'); +console.info(map); + +/* Обход хеш-таблицы */ +console.info('\nОтдельный обход пар ключ-значение'); +for (const [k, v] of map.entries()) { + console.info(k + ' -> ' + v); +} +console.info('\nОтдельный обход ключей'); +for (const k of map.keys()) { + console.info(k); +} +console.info('\nОтдельный обход значений'); +for (const v of map.values()) { + console.info(v); +} + +export {}; diff --git a/ru/codes/typescript/chapter_hashing/hash_map_chaining.ts b/ru/codes/typescript/chapter_hashing/hash_map_chaining.ts new file mode 100644 index 000000000..3878f6d5b --- /dev/null +++ b/ru/codes/typescript/chapter_hashing/hash_map_chaining.ts @@ -0,0 +1,146 @@ +/** + * File: hash_map_chaining.ts + * Created Time: 2023-08-06 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Пара ключ-значение Number -> String */ +class Pair { + key: number; + val: string; + constructor(key: number, val: string) { + this.key = key; + this.val = val; + } +} + +/* Хеш-таблица с цепочками */ +class HashMapChaining { + #size: number; // Число пар ключ-значение + #capacity: number; // Вместимость хеш-таблицы + #loadThres: number; // Порог коэффициента загрузки для запуска расширения + #extendRatio: number; // Коэффициент расширения + #buckets: Pair[][]; // Массив корзин + + /* Конструктор */ + constructor() { + this.#size = 0; + this.#capacity = 4; + this.#loadThres = 2.0 / 3.0; + this.#extendRatio = 2; + this.#buckets = new Array(this.#capacity).fill(null).map((x) => []); + } + + /* Хеш-функция */ + #hashFunc(key: number): number { + return key % this.#capacity; + } + + /* Коэффициент загрузки */ + #loadFactor(): number { + return this.#size / this.#capacity; + } + + /* Операция поиска */ + get(key: number): string | null { + const index = this.#hashFunc(key); + const bucket = this.#buckets[index]; + // Обойти корзину; если найден key, вернуть соответствующее val + for (const pair of bucket) { + if (pair.key === key) { + return pair.val; + } + } + // Если key не найден, вернуть null + return null; + } + + /* Операция добавления */ + put(key: number, val: string): void { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if (this.#loadFactor() > this.#loadThres) { + this.#extend(); + } + const index = this.#hashFunc(key); + const bucket = this.#buckets[index]; + // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть + for (const pair of bucket) { + if (pair.key === key) { + pair.val = val; + return; + } + } + // Если такого key нет, добавить пару ключ-значение в конец + const pair = new Pair(key, val); + bucket.push(pair); + this.#size++; + } + + /* Операция удаления */ + remove(key: number): void { + const index = this.#hashFunc(key); + let bucket = this.#buckets[index]; + // Обойти корзину и удалить из нее пару ключ-значение + for (let i = 0; i < bucket.length; i++) { + if (bucket[i].key === key) { + bucket.splice(i, 1); + this.#size--; + break; + } + } + } + + /* Расширить хеш-таблицу */ + #extend(): void { + // Временно сохранить исходную хеш-таблицу + const bucketsTmp = this.#buckets; + // Инициализация новой хеш-таблицы после расширения + this.#capacity *= this.#extendRatio; + this.#buckets = new Array(this.#capacity).fill(null).map((x) => []); + this.#size = 0; + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for (const bucket of bucketsTmp) { + for (const pair of bucket) { + this.put(pair.key, pair.val); + } + } + } + + /* Вывести хеш-таблицу */ + print(): void { + for (const bucket of this.#buckets) { + let res = []; + for (const pair of bucket) { + res.push(pair.key + ' -> ' + pair.val); + } + console.log(res); + } + } +} + +/* Driver Code */ +/* Инициализация хеш-таблицы */ +const map = new HashMapChaining(); + +/* Операция добавления */ +// Добавить пару (key, value) в хеш-таблицу +map.put(12836, 'Сяо Ха'); +map.put(15937, 'Сяо Ло'); +map.put(16750, 'Сяо Суань'); +map.put(13276, 'Сяо Фа'); +map.put(10583, 'Сяо Я'); +console.log('\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение'); +map.print(); + +/* Операция поиска */ +// Ввести в хеш-таблицу ключ key и получить значение value +const name = map.get(13276); +console.log('\nПо номеру 13276 найдено имя ' + name); + +/* Операция удаления */ +// Удалить пару (key, value) из хеш-таблицы +map.remove(12836); +console.log('\nПосле удаления 12836 хеш-таблица имеет вид\nКлюч -> Значение'); +map.print(); + +export {}; diff --git a/ru/codes/typescript/chapter_hashing/hash_map_open_addressing.ts b/ru/codes/typescript/chapter_hashing/hash_map_open_addressing.ts new file mode 100644 index 000000000..b579137e2 --- /dev/null +++ b/ru/codes/typescript/chapter_hashing/hash_map_open_addressing.ts @@ -0,0 +1,182 @@ +/** + * File: hash_map_open_addressing.ts + * Created Time: 2023-08-06 + * Author: yuan0221 (yl1452491917@gmail.com), krahets (krahets@163.com) + */ + +/* Пара ключ-значение Number -> String */ +class Pair { + key: number; + val: string; + + constructor(key: number, val: string) { + this.key = key; + this.val = val; + } +} + +/* Хеш-таблица с открытой адресацией */ +class HashMapOpenAddressing { + private size: number; // Число пар ключ-значение + private capacity: number; // Вместимость хеш-таблицы + private loadThres: number; // Порог коэффициента загрузки для запуска расширения + private extendRatio: number; // Коэффициент расширения + private buckets: Array; // Массив корзин + private TOMBSTONE: Pair; // Удалить метку + + /* Конструктор */ + constructor() { + this.size = 0; // Число пар ключ-значение + this.capacity = 4; // Вместимость хеш-таблицы + this.loadThres = 2.0 / 3.0; // Порог коэффициента загрузки для запуска расширения + this.extendRatio = 2; // Коэффициент расширения + this.buckets = Array(this.capacity).fill(null); // Массив корзин + this.TOMBSTONE = new Pair(-1, '-1'); // Удалить метку + } + + /* Хеш-функция */ + private hashFunc(key: number): number { + return key % this.capacity; + } + + /* Коэффициент загрузки */ + private loadFactor(): number { + return this.size / this.capacity; + } + + /* Найти индекс корзины, соответствующий key */ + private findBucket(key: number): number { + let index = this.hashFunc(key); + let firstTombstone = -1; + // Выполнять линейное пробирование и завершить при встрече с пустой корзиной + while (this.buckets[index] !== null) { + // Если встретился key, вернуть соответствующий индекс корзины + if (this.buckets[index]!.key === key) { + // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс + if (firstTombstone !== -1) { + this.buckets[firstTombstone] = this.buckets[index]; + this.buckets[index] = this.TOMBSTONE; + return firstTombstone; // Вернуть индекс корзины после перемещения + } + return index; // Вернуть индекс корзины + } + // Записать первую встретившуюся метку удаления + if ( + firstTombstone === -1 && + this.buckets[index] === this.TOMBSTONE + ) { + firstTombstone = index; + } + // Вычислить индекс корзины; при выходе за конец вернуться к началу + index = (index + 1) % this.capacity; + } + // Если key не существует, вернуть индекс точки добавления + return firstTombstone === -1 ? index : firstTombstone; + } + + /* Операция поиска */ + get(key: number): string | null { + // Найти индекс корзины, соответствующий key + const index = this.findBucket(key); + // Если пара ключ-значение найдена, вернуть соответствующее val + if ( + this.buckets[index] !== null && + this.buckets[index] !== this.TOMBSTONE + ) { + return this.buckets[index]!.val; + } + // Если пары ключ-значение не существует, вернуть null + return null; + } + + /* Операция добавления */ + put(key: number, val: string): void { + // Когда коэффициент загрузки превышает порог, выполнить расширение + if (this.loadFactor() > this.loadThres) { + this.extend(); + } + // Найти индекс корзины, соответствующий key + const index = this.findBucket(key); + // Если пара ключ-значение найдена, перезаписать val и вернуть + if ( + this.buckets[index] !== null && + this.buckets[index] !== this.TOMBSTONE + ) { + this.buckets[index]!.val = val; + return; + } + // Если пары ключ-значение нет, добавить ее + this.buckets[index] = new Pair(key, val); + this.size++; + } + + /* Операция удаления */ + remove(key: number): void { + // Найти индекс корзины, соответствующий key + const index = this.findBucket(key); + // Если пара ключ-значение найдена, заменить ее меткой удаления + if ( + this.buckets[index] !== null && + this.buckets[index] !== this.TOMBSTONE + ) { + this.buckets[index] = this.TOMBSTONE; + this.size--; + } + } + + /* Расширить хеш-таблицу */ + private extend(): void { + // Временно сохранить исходную хеш-таблицу + const bucketsTmp = this.buckets; + // Инициализация новой хеш-таблицы после расширения + this.capacity *= this.extendRatio; + this.buckets = Array(this.capacity).fill(null); + this.size = 0; + // Перенести пары ключ-значение из исходной хеш-таблицы в новую + for (const pair of bucketsTmp) { + if (pair !== null && pair !== this.TOMBSTONE) { + this.put(pair.key, pair.val); + } + } + } + + /* Вывести хеш-таблицу */ + print(): void { + for (const pair of this.buckets) { + if (pair === null) { + console.log('null'); + } else if (pair === this.TOMBSTONE) { + console.log('TOMBSTONE'); + } else { + console.log(pair.key + ' -> ' + pair.val); + } + } + } +} + +/* Driver Code */ +// Инициализация хеш-таблицы +const hashmap = new HashMapOpenAddressing(); + +// Операция добавления +// Добавить пару (key, val) в хеш-таблицу +hashmap.put(12836, 'Сяо Ха'); +hashmap.put(15937, 'Сяо Ло'); +hashmap.put(16750, 'Сяо Суань'); +hashmap.put(13276, 'Сяо Фа'); +hashmap.put(10583, 'Сяо Я'); +console.log('\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение'); +hashmap.print(); + +// Операция поиска +// Передать ключ key в хеш-таблицу и получить значение val +const name = hashmap.get(13276); +console.log('\nПо номеру 13276 найдено имя ' + name); + +// Операция удаления +// Удалить пару (key, val) из хеш-таблицы +hashmap.remove(16750); +console.log('\nПосле удаления 16750 хеш-таблица имеет вид\nКлюч -> Значение'); +hashmap.print(); + +export {}; diff --git a/ru/codes/typescript/chapter_hashing/simple_hash.ts b/ru/codes/typescript/chapter_hashing/simple_hash.ts new file mode 100644 index 000000000..1f5263bcf --- /dev/null +++ b/ru/codes/typescript/chapter_hashing/simple_hash.ts @@ -0,0 +1,60 @@ +/** + * File: simple_hash.ts + * Created Time: 2023-08-06 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +/* Аддитивное хеширование */ +function addHash(key: string): number { + let hash = 0; + const MODULUS = 1000000007; + for (const c of key) { + hash = (hash + c.charCodeAt(0)) % MODULUS; + } + return hash; +} + +/* Мультипликативное хеширование */ +function mulHash(key: string): number { + let hash = 0; + const MODULUS = 1000000007; + for (const c of key) { + hash = (31 * hash + c.charCodeAt(0)) % MODULUS; + } + return hash; +} + +/* XOR-хеширование */ +function xorHash(key: string): number { + let hash = 0; + const MODULUS = 1000000007; + for (const c of key) { + hash ^= c.charCodeAt(0); + } + return hash % MODULUS; +} + +/* Хеширование с циклическим сдвигом */ +function rotHash(key: string): number { + let hash = 0; + const MODULUS = 1000000007; + for (const c of key) { + hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS; + } + return hash; +} + +/* Driver Code */ +const key = 'Hello Algo'; + +let hash = addHash(key); +console.log('Хеш-значение по сложению = ' + hash); + +hash = mulHash(key); +console.log('Хеш-значение по умножению = ' + hash); + +hash = xorHash(key); +console.log('Хеш-значение по XOR = ' + hash); + +hash = rotHash(key); +console.log('Хеш-значение по циклическому сдвигу = ' + hash); diff --git a/ru/codes/typescript/chapter_heap/my_heap.ts b/ru/codes/typescript/chapter_heap/my_heap.ts new file mode 100644 index 000000000..28e38a721 --- /dev/null +++ b/ru/codes/typescript/chapter_heap/my_heap.ts @@ -0,0 +1,155 @@ +/** + * File: my_heap.ts + * Created Time: 2023-02-07 + * Author: Justin (xiefahit@gmail.com) + */ + +import { printHeap } from '../modules/PrintUtil'; + +/* Класс максимальной кучи */ +class MaxHeap { + private maxHeap: number[]; + /* Конструктор, создающий пустую кучу или строящий кучу по входному списку */ + constructor(nums?: number[]) { + // Добавить элементы списка в кучу без изменений + this.maxHeap = nums === undefined ? [] : [...nums]; + // Выполнить heapify для всех узлов, кроме листовых + for (let i = this.parent(this.size() - 1); i >= 0; i--) { + this.siftDown(i); + } + } + + /* Получить индекс левого дочернего узла */ + private left(i: number): number { + return 2 * i + 1; + } + + /* Получить индекс правого дочернего узла */ + private right(i: number): number { + return 2 * i + 2; + } + + /* Получить индекс родительского узла */ + private parent(i: number): number { + return Math.floor((i - 1) / 2); // Округление вниз при делении + } + + /* Поменять элементы местами */ + private swap(i: number, j: number): void { + const tmp = this.maxHeap[i]; + this.maxHeap[i] = this.maxHeap[j]; + this.maxHeap[j] = tmp; + } + + /* Получение размера кучи */ + public size(): number { + return this.maxHeap.length; + } + + /* Проверка, пуста ли куча */ + public isEmpty(): boolean { + return this.size() === 0; + } + + /* Доступ к элементу на вершине кучи */ + public peek(): number { + return this.maxHeap[0]; + } + + /* Добавление элемента в кучу */ + public push(val: number): void { + // Добавление узла + this.maxHeap.push(val); + // Просеивание снизу вверх + this.siftUp(this.size() - 1); + } + + /* Начиная с узла i, выполнить просеивание снизу вверх */ + private siftUp(i: number): void { + while (true) { + // Получение родительского узла для узла i + const p = this.parent(i); + // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления» + if (p < 0 || this.maxHeap[i] <= this.maxHeap[p]) break; + // Поменять два узла местами + this.swap(i, p); + // Циклическое просеивание вверх + i = p; + } + } + + /* Извлечение элемента из кучи */ + public pop(): number { + // Обработка пустого случая + if (this.isEmpty()) throw new RangeError('Heap is empty.'); + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + this.swap(0, this.size() - 1); + // Удаление узла + const val = this.maxHeap.pop(); + // Просеивание сверху вниз + this.siftDown(0); + // Вернуть элемент с вершины кучи + return val; + } + + /* Начиная с узла i, выполнить просеивание сверху вниз */ + private siftDown(i: number): void { + while (true) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + const l = this.left(i), + r = this.right(i); + let ma = i; + if (l < this.size() && this.maxHeap[l] > this.maxHeap[ma]) ma = l; + if (r < this.size() && this.maxHeap[r] > this.maxHeap[ma]) ma = r; + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (ma === i) break; + // Поменять два узла местами + this.swap(i, ma); + // Циклическое просеивание вниз + i = ma; + } + } + + /* Вывести кучу (двоичное дерево) */ + public print(): void { + printHeap(this.maxHeap); + } + + /* Извлечь элементы из кучи */ + public getMaxHeap(): number[] { + return this.maxHeap; + } +} + +/* Driver Code */ +if (import.meta.url.endsWith(process.argv[1])) { + /* Инициализация максимальной кучи */ + const maxHeap = new MaxHeap([9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2]); + console.log('\nПосле построения кучи из входного списка'); + maxHeap.print(); + + /* Получение элемента с вершины кучи */ + let peek = maxHeap.peek(); + console.log(`\nЭлемент на вершине кучи = ${peek}`); + + /* Добавление элемента в кучу */ + const val = 7; + maxHeap.push(val); + console.log(`\nПосле добавления элемента ${val} в кучу`); + maxHeap.print(); + + /* Извлечение элемента с вершины кучи */ + peek = maxHeap.pop(); + console.log(`\nПосле извлечения элемента вершины кучи ${peek}`); + maxHeap.print(); + + /* Получение размера кучи */ + const size = maxHeap.size(); + console.log(`\nКоличество элементов в куче = ${size}`); + + /* Проверка, пуста ли куча */ + const isEmpty = maxHeap.isEmpty(); + console.log(`\nПуста ли куча: ${isEmpty}`); +} + +export { MaxHeap }; diff --git a/ru/codes/typescript/chapter_heap/top_k.ts b/ru/codes/typescript/chapter_heap/top_k.ts new file mode 100644 index 000000000..11464a9a4 --- /dev/null +++ b/ru/codes/typescript/chapter_heap/top_k.ts @@ -0,0 +1,58 @@ +/** + * File: top_k.ts + * Created Time: 2023-08-13 + * Author: Justin (xiefahit@gmail.com) + */ + +import { MaxHeap } from './my_heap'; + +/* Добавление элемента в кучу */ +function pushMinHeap(maxHeap: MaxHeap, val: number): void { + // Инвертировать знак элемента + maxHeap.push(-val); +} + +/* Извлечение элемента из кучи */ +function popMinHeap(maxHeap: MaxHeap): number { + // Инвертировать знак элемента + return -maxHeap.pop(); +} + +/* Доступ к элементу на вершине кучи */ +function peekMinHeap(maxHeap: MaxHeap): number { + // Инвертировать знак элемента + return -maxHeap.peek(); +} + +/* Извлечь элементы из кучи */ +function getMinHeap(maxHeap: MaxHeap): number[] { + // Инвертировать знак элемента + return maxHeap.getMaxHeap().map((num: number) => -num); +} + +/* Найти k наибольших элементов массива с помощью кучи */ +function topKHeap(nums: number[], k: number): number[] { + // Инициализация минимальной кучи + // Обратите внимание: мы инвертируем все элементы кучи, чтобы с помощью максимальной кучи имитировать минимальную + const maxHeap = new MaxHeap([]); + // Поместить первые k элементов массива в кучу + for (let i = 0; i < k; i++) { + pushMinHeap(maxHeap, nums[i]); + } + // Начиная с элемента k+1, поддерживать длину кучи равной k + for (let i = k; i < nums.length; i++) { + // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу + if (nums[i] > peekMinHeap(maxHeap)) { + popMinHeap(maxHeap); + pushMinHeap(maxHeap, nums[i]); + } + } + // Вернуть элементы кучи + return getMinHeap(maxHeap); +} + +/* Driver Code */ +const nums = [1, 7, 6, 3, 2]; +const k = 3; +const res = topKHeap(nums, k); +console.log(`Наибольшие ${k} элементов`, res); diff --git a/ru/codes/typescript/chapter_searching/binary_search.ts b/ru/codes/typescript/chapter_searching/binary_search.ts new file mode 100644 index 000000000..d94edbcd3 --- /dev/null +++ b/ru/codes/typescript/chapter_searching/binary_search.ts @@ -0,0 +1,65 @@ +/** + * File: binary_search.ts + * Created Time: 2022-12-27 + * Author: Daniel (better.sunjian@gmail.com) + */ + +/* Бинарный поиск (двусторонне замкнутый интервал) */ +function binarySearch(nums: number[], target: number): number { + // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно + let i = 0, + j = nums.length - 1; + // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст) + while (i <= j) { + // Вычислить индекс середины m + const m = Math.floor(i + (j - i) / 2); + if (nums[m] < target) { + // Это означает, что target находится в интервале [m+1, j] + i = m + 1; + } else if (nums[m] > target) { + // Это означает, что target находится в интервале [i, m-1] + j = m - 1; + } else { + // Целевой элемент найден, вернуть его индекс + return m; + } + } + return -1; // Целевой элемент не найден, вернуть -1 +} + +/* Бинарный поиск (лево замкнутый, право открытый интервал) */ +function binarySearchLCRO(nums: number[], target: number): number { + // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно + let i = 0, + j = nums.length; + // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст) + while (i < j) { + // Вычислить индекс середины m + const m = Math.floor(i + (j - i) / 2); + if (nums[m] < target) { + // Это означает, что target находится в интервале [m+1, j) + i = m + 1; + } else if (nums[m] > target) { + // Это означает, что target находится в интервале [i, m) + j = m; + } else { + // Целевой элемент найден, вернуть его индекс + return m; + } + } + return -1; // Целевой элемент не найден, вернуть -1 +} + +/* Driver Code */ +const target = 6; +const nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; + +/* Бинарный поиск (двусторонне замкнутый интервал) */ +let index = binarySearch(nums, target); +console.info('Индекс целевого элемента 6 = %d', index); + +/* Бинарный поиск (лево замкнутый, право открытый интервал) */ +index = binarySearchLCRO(nums, target); +console.info('Индекс целевого элемента 6 = %d', index); + +export {}; diff --git a/ru/codes/typescript/chapter_searching/binary_search_edge.ts b/ru/codes/typescript/chapter_searching/binary_search_edge.ts new file mode 100644 index 000000000..6ebd32c4a --- /dev/null +++ b/ru/codes/typescript/chapter_searching/binary_search_edge.ts @@ -0,0 +1,46 @@ +/** + * File: binary_search_edge.ts + * Created Time: 2023-08-22 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ +import { binarySearchInsertion } from './binary_search_insertion'; + +/* Бинарный поиск самого левого target */ +function binarySearchLeftEdge(nums: Array, target: number): number { + // Эквивалентно поиску точки вставки target + const i = binarySearchInsertion(nums, target); + // target не найден, вернуть -1 + if (i === nums.length || nums[i] !== target) { + return -1; + } + // Найти target и вернуть индекс i + return i; +} + +/* Бинарный поиск самого правого target */ +function binarySearchRightEdge(nums: Array, target: number): number { + // Преобразовать задачу в поиск самого левого target + 1 + const i = binarySearchInsertion(nums, target + 1); + // j указывает на самый правый target, а i — на первый элемент больше target + const j = i - 1; + // target не найден, вернуть -1 + if (j === -1 || nums[j] !== target) { + return -1; + } + // Найти target и вернуть индекс j + return j; +} + +/* Driver Code */ +// Массив с повторяющимися элементами +let nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15]; +console.log('\nМассив nums = ' + nums); +// Бинарный поиск левой и правой границы +for (const target of [6, 7]) { + let index = binarySearchLeftEdge(nums, target); + console.log('Индекс самого левого элемента ' + target + ' = ' + index); + index = binarySearchRightEdge(nums, target); + console.log('Индекс самого правого элемента ' + target + ' = ' + index); +} + +export {}; diff --git a/ru/codes/typescript/chapter_searching/binary_search_insertion.ts b/ru/codes/typescript/chapter_searching/binary_search_insertion.ts new file mode 100644 index 000000000..20b8bf785 --- /dev/null +++ b/ru/codes/typescript/chapter_searching/binary_search_insertion.ts @@ -0,0 +1,65 @@ +/** + * File: binary_search_insertion.ts + * Created Time: 2023-08-22 + * Author: Gaofer Chou (gaofer-chou@qq.com) + */ + +/* Бинарный поиск точки вставки (без повторяющихся элементов) */ +function binarySearchInsertionSimple( + nums: Array, + target: number +): number { + let i = 0, + j = nums.length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + const m = Math.floor(i + (j - i) / 2); // Вычислить индекс середины m, используя Math.floor() для округления вниз + if (nums[m] < target) { + i = m + 1; // target находится в интервале [m+1, j] + } else if (nums[m] > target) { + j = m - 1; // target находится в интервале [i, m-1] + } else { + return m; // Найти target и вернуть точку вставки m + } + } + // target не найден, вернуть точку вставки i + return i; +} + +/* Бинарный поиск точки вставки (с повторяющимися элементами) */ +function binarySearchInsertion(nums: Array, target: number): number { + let i = 0, + j = nums.length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1] + while (i <= j) { + const m = Math.floor(i + (j - i) / 2); // Вычислить индекс середины m, используя Math.floor() для округления вниз + if (nums[m] < target) { + i = m + 1; // target находится в интервале [m+1, j] + } else if (nums[m] > target) { + j = m - 1; // target находится в интервале [i, m-1] + } else { + j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1] + } + } + // Вернуть точку вставки i + return i; +} + +/* Driver Code */ +// Массив без повторяющихся элементов +let nums = [1, 3, 6, 8, 12, 15, 23, 26, 31, 35]; +console.log('\nМассив nums = ' + nums); +// Бинарный поиск точки вставки +for (const target of [6, 9]) { + const index = binarySearchInsertionSimple(nums, target); + console.log('Индекс точки вставки элемента ' + target + ' = ' + index); +} + +// Массив с повторяющимися элементами +nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15]; +console.log('\nМассив nums = ' + nums); +// Бинарный поиск точки вставки +for (const target of [2, 6, 20]) { + const index = binarySearchInsertion(nums, target); + console.log('Индекс точки вставки элемента ' + target + ' = ' + index); +} + +export { binarySearchInsertion }; diff --git a/ru/codes/typescript/chapter_searching/hashing_search.ts b/ru/codes/typescript/chapter_searching/hashing_search.ts new file mode 100644 index 000000000..595d9be14 --- /dev/null +++ b/ru/codes/typescript/chapter_searching/hashing_search.ts @@ -0,0 +1,50 @@ +/** + * File: hashing_search.ts + * Created Time: 2022-12-29 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +import { ListNode, arrToLinkedList } from '../modules/ListNode'; + +/* Хеш-поиск (массив) */ +function hashingSearchArray(map: Map, target: number): number { + // key хеш-таблицы: целевой элемент, value: индекс + // Если такого key нет в хеш-таблице, вернуть -1 + return map.has(target) ? (map.get(target) as number) : -1; +} + +/* Хеш-поиск (связный список) */ +function hashingSearchLinkedList( + map: Map, + target: number +): ListNode | null { + // key хеш-таблицы: значение целевого узла, value: объект узла + // Если такого key нет в хеш-таблице, вернуть null + return map.has(target) ? (map.get(target) as ListNode) : null; +} + +/* Driver Code */ +const target = 3; + +/* Хеш-поиск (массив) */ +const nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8]; +// Инициализация хеш-таблицы +const map = new Map(); +for (let i = 0; i < nums.length; i++) { + map.set(nums[i], i); // key: элемент, value: индекс +} +const index = hashingSearchArray(map, target); +console.log('Индекс целевого элемента 3 = ' + index); + +/* Хеш-поиск (связный список) */ +let head = arrToLinkedList(nums); +// Инициализация хеш-таблицы +const map1 = new Map(); +while (head != null) { + map1.set(head.val, head); // key: значение узла, value: узел + head = head.next; +} +const node = hashingSearchLinkedList(map1, target); +console.log('Объект узла со значением 3 =', node); + +export {}; diff --git a/ru/codes/typescript/chapter_searching/linear_search.ts b/ru/codes/typescript/chapter_searching/linear_search.ts new file mode 100644 index 000000000..3e513197a --- /dev/null +++ b/ru/codes/typescript/chapter_searching/linear_search.ts @@ -0,0 +1,52 @@ +/** + * File: linear_search.ts + * Created Time: 2023-01-07 + * Author: Daniel (better.sunjian@gmail.com) + */ + +import { ListNode, arrToLinkedList } from '../modules/ListNode'; + +/* Линейный поиск (массив) */ +function linearSearchArray(nums: number[], target: number): number { + // Обход массива + for (let i = 0; i < nums.length; i++) { + // Целевой элемент найден, вернуть его индекс + if (nums[i] === target) { + return i; + } + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +/* Линейный поиск (связный список) */ +function linearSearchLinkedList( + head: ListNode | null, + target: number +): ListNode | null { + // Обойти связный список + while (head) { + // Найти целевой узел и вернуть его + if (head.val === target) { + return head; + } + head = head.next; + } + // Целевой узел не найден, вернуть null + return null; +} + +/* Driver Code */ +const target = 3; + +/* Выполнить линейный поиск в массиве */ +const nums = [1, 5, 3, 2, 4, 7, 5, 9, 10, 8]; +const index = linearSearchArray(nums, target); +console.log('Индекс целевого элемента 3 =', index); + +/* Выполнить линейный поиск в связном списке */ +const head = arrToLinkedList(nums); +const node = linearSearchLinkedList(head, target); +console.log('Объект узла со значением 3 =', node); + +export {}; diff --git a/ru/codes/typescript/chapter_searching/two_sum.ts b/ru/codes/typescript/chapter_searching/two_sum.ts new file mode 100644 index 000000000..e0d48201a --- /dev/null +++ b/ru/codes/typescript/chapter_searching/two_sum.ts @@ -0,0 +1,49 @@ +/** + * File: two_sum.ts + * Created Time: 2022-12-15 + * Author: gyt95 (gytkwan@gmail.com) + */ + +/* Метод 1: полный перебор */ +function twoSumBruteForce(nums: number[], target: number): number[] { + const n = nums.length; + // Два вложенных цикла, временная сложность O(n^2) + for (let i = 0; i < n; i++) { + for (let j = i + 1; j < n; j++) { + if (nums[i] + nums[j] === target) { + return [i, j]; + } + } + } + return []; +} + +/* Метод 2: вспомогательная хеш-таблица */ +function twoSumHashTable(nums: number[], target: number): number[] { + // Вспомогательная хеш-таблица, пространственная сложность O(n) + let m: Map = new Map(); + // Один цикл, временная сложность O(n) + for (let i = 0; i < nums.length; i++) { + let index = m.get(target - nums[i]); + if (index !== undefined) { + return [index, i]; + } else { + m.set(nums[i], i); + } + } + return []; +} + +/* Driver Code */ +// Метод 1 +const nums = [2, 7, 11, 15], + target = 13; + +let res = twoSumBruteForce(nums, target); +console.log('Метод 1: res = ', res); + +// Метод 2 +res = twoSumHashTable(nums, target); +console.log('Метод 2: res = ', res); + +export {}; diff --git a/ru/codes/typescript/chapter_sorting/bubble_sort.ts b/ru/codes/typescript/chapter_sorting/bubble_sort.ts new file mode 100644 index 000000000..b97ec4518 --- /dev/null +++ b/ru/codes/typescript/chapter_sorting/bubble_sort.ts @@ -0,0 +1,51 @@ +/** + * File: bubble_sort.ts + * Created Time: 2022-12-12 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Пузырьковая сортировка */ +function bubbleSort(nums: number[]): void { + // Внешний цикл: неотсортированный диапазон [0, i] + for (let i = nums.length - 1; i > 0; i--) { + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (let j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + let tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + } + } + } +} + +/* Пузырьковая сортировка (оптимизация флагом) */ +function bubbleSortWithFlag(nums: number[]): void { + // Внешний цикл: неотсортированный диапазон [0, i] + for (let i = nums.length - 1; i > 0; i--) { + let flag = false; // Инициализировать флаг + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + for (let j = 0; j < i; j++) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + let tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + flag = true; // Записать обмен элементов + } + } + if (!flag) break; // На этой итерации «всплытия» не было ни одного обмена, сразу выйти + } +} + +/* Driver Code */ +const nums = [4, 1, 3, 1, 5, 2]; +bubbleSort(nums); +console.log('После завершения пузырьковой сортировки nums =', nums); + +const nums1 = [4, 1, 3, 1, 5, 2]; +bubbleSortWithFlag(nums1); +console.log('После завершения пузырьковой сортировки nums =', nums1); + +export {}; diff --git a/ru/codes/typescript/chapter_sorting/bucket_sort.ts b/ru/codes/typescript/chapter_sorting/bucket_sort.ts new file mode 100644 index 000000000..d750c647e --- /dev/null +++ b/ru/codes/typescript/chapter_sorting/bucket_sort.ts @@ -0,0 +1,41 @@ +/** + * File: bucket_sort.ts + * Created Time: 2023-04-08 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Сортировка корзинами */ +function bucketSort(nums: number[]): void { + // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину + const k = nums.length / 2; + const buckets: number[][] = []; + for (let i = 0; i < k; i++) { + buckets.push([]); + } + // 1. Распределить элементы массива по корзинам + for (const num of nums) { + // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1] + const i = Math.floor(num * k); + // Добавить num в корзину i + buckets[i].push(num); + } + // 2. Выполнить сортировку внутри каждой корзины + for (const bucket of buckets) { + // Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки + bucket.sort((a, b) => a - b); + } + // 3. Обойти корзины и объединить результаты + let i = 0; + for (const bucket of buckets) { + for (const num of bucket) { + nums[i++] = num; + } + } +} + +/* Driver Code */ +const nums = [0.49, 0.96, 0.82, 0.09, 0.57, 0.43, 0.91, 0.75, 0.15, 0.37]; +bucketSort(nums); +console.log('После завершения сортировки корзинами nums =', nums); + +export {}; diff --git a/ru/codes/typescript/chapter_sorting/counting_sort.ts b/ru/codes/typescript/chapter_sorting/counting_sort.ts new file mode 100644 index 000000000..67a7ba11c --- /dev/null +++ b/ru/codes/typescript/chapter_sorting/counting_sort.ts @@ -0,0 +1,67 @@ +/** + * File: counting_sort.ts + * Created Time: 2023-04-08 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Сортировка подсчетом */ +// Простая реализация, не подходит для сортировки объектов +function countingSortNaive(nums: number[]): void { + // 1. Найти максимальный элемент массива m + let m: number = Math.max(...nums); + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + const counter: number[] = new Array(m + 1).fill(0); + for (const num of nums) { + counter[num]++; + } + // 3. Обойти counter и заполнить исходный массив nums элементами + let i = 0; + for (let num = 0; num < m + 1; num++) { + for (let j = 0; j < counter[num]; j++, i++) { + nums[i] = num; + } + } +} + +/* Сортировка подсчетом */ +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой +function countingSort(nums: number[]): void { + // 1. Найти максимальный элемент массива m + let m: number = Math.max(...nums); + // 2. Подсчитать число появлений каждой цифры + // counter[num] обозначает число появлений num + const counter: number[] = new Array(m + 1).fill(0); + for (const num of nums) { + counter[num]++; + } + // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс» + // То есть counter[num]-1 — это индекс последнего появления num в res + for (let i = 0; i < m; i++) { + counter[i + 1] += counter[i]; + } + // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res + // Инициализировать массив res для хранения результата + const n = nums.length; + const res: number[] = new Array(n); + for (let i = n - 1; i >= 0; i--) { + const num = nums[i]; + res[counter[num] - 1] = num; // Поместить num по соответствующему индексу + counter[num]--; // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num + } + // Перезаписать исходный массив nums массивом результата res + for (let i = 0; i < n; i++) { + nums[i] = res[i]; + } +} + +/* Driver Code */ +const nums = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4]; +countingSortNaive(nums); +console.log('После завершения сортировки подсчетом (объекты не сортируются) nums =', nums); + +const nums1 = [1, 0, 1, 2, 0, 4, 0, 2, 2, 4]; +countingSort(nums1); +console.log('После завершения сортировки подсчетом nums1 =', nums1); + +export {}; diff --git a/ru/codes/typescript/chapter_sorting/heap_sort.ts b/ru/codes/typescript/chapter_sorting/heap_sort.ts new file mode 100644 index 000000000..13abd3733 --- /dev/null +++ b/ru/codes/typescript/chapter_sorting/heap_sort.ts @@ -0,0 +1,51 @@ +/** + * File: heap_sort.ts + * Created Time: 2023-06-04 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */ +function siftDown(nums: number[], n: number, i: number): void { + while (true) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + let l = 2 * i + 1; + let r = 2 * i + 2; + let ma = i; + if (l < n && nums[l] > nums[ma]) { + ma = l; + } + if (r < n && nums[r] > nums[ma]) { + ma = r; + } + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (ma === i) { + break; + } + // Поменять два узла местами + [nums[i], nums[ma]] = [nums[ma], nums[i]]; + // Циклическое просеивание вниз + i = ma; + } +} + +/* Сортировка кучей */ +function heapSort(nums: number[]): void { + // Построение кучи: выполнить heapify для всех узлов, кроме листовых + for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) { + siftDown(nums, nums.length, i); + } + // Извлекать максимальный элемент из кучи в течение n-1 итераций + for (let i = nums.length - 1; i > 0; i--) { + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + [nums[0], nums[i]] = [nums[i], nums[0]]; + // Начиная с корневого узла, выполнить просеивание сверху вниз + siftDown(nums, i, 0); + } +} + +/* Driver Code */ +const nums: number[] = [4, 1, 3, 1, 5, 2]; +heapSort(nums); +console.log('После завершения сортировки кучей nums =', nums); + +export {}; diff --git a/ru/codes/typescript/chapter_sorting/insertion_sort.ts b/ru/codes/typescript/chapter_sorting/insertion_sort.ts new file mode 100644 index 000000000..a0a82f4a3 --- /dev/null +++ b/ru/codes/typescript/chapter_sorting/insertion_sort.ts @@ -0,0 +1,27 @@ +/** + * File: insertion_sort.ts + * Created Time: 2022-12-12 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Сортировка вставками */ +function insertionSort(nums: number[]): void { + // Внешний цикл: отсортированный диапазон [0, i-1] + for (let i = 1; i < nums.length; i++) { + const base = nums[i]; + let j = i - 1; + // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1] + while (j >= 0 && nums[j] > base) { + nums[j + 1] = nums[j]; // Сдвинуть nums[j] на одну позицию вправо + j--; + } + nums[j + 1] = base; // Поместить base в правильную позицию + } +} + +/* Driver Code */ +const nums = [4, 1, 3, 1, 5, 2]; +insertionSort(nums); +console.log('После завершения сортировки вставками nums =', nums); + +export {}; diff --git a/ru/codes/typescript/chapter_sorting/merge_sort.ts b/ru/codes/typescript/chapter_sorting/merge_sort.ts new file mode 100644 index 000000000..cee0773d6 --- /dev/null +++ b/ru/codes/typescript/chapter_sorting/merge_sort.ts @@ -0,0 +1,54 @@ +/** + * File: merge_sort.ts + * Created Time: 2022-12-12 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Объединить левый и правый подмассивы */ +function merge(nums: number[], left: number, mid: number, right: number): void { + // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right] + // Создать временный массив tmp для хранения результата слияния + const tmp = new Array(right - left + 1); + // Инициализировать начальные индексы левого и правого подмассивов + let i = left, + j = mid + 1, + k = 0; + // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив + while (i <= mid && j <= right) { + if (nums[i] <= nums[j]) { + tmp[k++] = nums[i++]; + } else { + tmp[k++] = nums[j++]; + } + } + // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив + while (i <= mid) { + tmp[k++] = nums[i++]; + } + while (j <= right) { + tmp[k++] = nums[j++]; + } + // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums + for (k = 0; k < tmp.length; k++) { + nums[left + k] = tmp[k]; + } +} + +/* Сортировка слиянием */ +function mergeSort(nums: number[], left: number, right: number): void { + // Условие завершения + if (left >= right) return; // Завершить рекурсию, когда длина подмассива равна 1 + // Этап разбиения + let mid = Math.floor(left + (right - left) / 2); // Вычислить середину + mergeSort(nums, left, mid); // Рекурсивно обработать левый подмассив + mergeSort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив + // Этап слияния + merge(nums, left, mid, right); +} + +/* Driver Code */ +const nums = [7, 3, 2, 6, 0, 1, 5, 4]; +mergeSort(nums, 0, nums.length - 1); +console.log('После завершения сортировки слиянием nums =', nums); + +export {}; diff --git a/ru/codes/typescript/chapter_sorting/quick_sort.ts b/ru/codes/typescript/chapter_sorting/quick_sort.ts new file mode 100644 index 000000000..5c0115d1f --- /dev/null +++ b/ru/codes/typescript/chapter_sorting/quick_sort.ts @@ -0,0 +1,180 @@ +/** + * File: quick_sort.ts + * Created Time: 2022-12-12 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Класс быстрой сортировки */ +class QuickSort { + /* Обмен элементов */ + swap(nums: number[], i: number, j: number): void { + let tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + /* Разбиение с опорными указателями */ + partition(nums: number[], left: number, right: number): number { + // Взять nums[left] в качестве опорного элемента + let i = left, + j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) { + j -= 1; // Идти справа налево в поисках первого элемента меньше опорного + } + while (i < j && nums[i] <= nums[left]) { + i += 1; // Идти слева направо в поисках первого элемента больше опорного + } + // Обмен элементов + this.swap(nums, i, j); // Поменять эти два элемента местами + } + this.swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка */ + quickSort(nums: number[], left: number, right: number): void { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) { + return; + } + // Разбиение с опорными указателями + const pivot = this.partition(nums, left, right); + // Рекурсивно обработать левый и правый подмассивы + this.quickSort(nums, left, pivot - 1); + this.quickSort(nums, pivot + 1, right); + } +} + +/* Класс быстрой сортировки (оптимизация медианным опорным элементом) */ +class QuickSortMedian { + /* Обмен элементов */ + swap(nums: number[], i: number, j: number): void { + let tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + /* Выбрать медиану из трех кандидатов */ + medianThree( + nums: number[], + left: number, + mid: number, + right: number + ): number { + let l = nums[left], + m = nums[mid], + r = nums[right]; + // m находится между l и r + if ((l <= m && m <= r) || (r <= m && m <= l)) return mid; + // l находится между m и r + if ((m <= l && l <= r) || (r <= l && l <= m)) return left; + return right; + } + + /* Разбиение с опорными указателями (медиана трех) */ + partition(nums: number[], left: number, right: number): number { + // Выбрать медиану из трех кандидатов + let med = this.medianThree( + nums, + left, + Math.floor((left + right) / 2), + right + ); + // Переместить медиану в крайний левый элемент массива + this.swap(nums, left, med); + // Взять nums[left] в качестве опорного элемента + let i = left, + j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) { + j--; // Идти справа налево в поисках первого элемента меньше опорного + } + while (i < j && nums[i] <= nums[left]) { + i++; // Идти слева направо в поисках первого элемента больше опорного + } + this.swap(nums, i, j); // Поменять эти два элемента местами + } + this.swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка */ + quickSort(nums: number[], left: number, right: number): void { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) { + return; + } + // Разбиение с опорными указателями + const pivot = this.partition(nums, left, right); + // Рекурсивно обработать левый и правый подмассивы + this.quickSort(nums, left, pivot - 1); + this.quickSort(nums, pivot + 1, right); + } +} + +/* Класс быстрой сортировки (оптимизация глубины рекурсии) */ +class QuickSortTailCall { + /* Обмен элементов */ + swap(nums: number[], i: number, j: number): void { + let tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + /* Разбиение с опорными указателями */ + partition(nums: number[], left: number, right: number): number { + // Взять nums[left] в качестве опорного элемента + let i = left, + j = right; + while (i < j) { + while (i < j && nums[j] >= nums[left]) { + j--; // Идти справа налево в поисках первого элемента меньше опорного + } + while (i < j && nums[i] <= nums[left]) { + i++; // Идти слева направо в поисках первого элемента больше опорного + } + this.swap(nums, i, j); // Поменять эти два элемента местами + } + this.swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + /* Быстрая сортировка (оптимизация глубины рекурсии) */ + quickSort(nums: number[], left: number, right: number): void { + // Завершить, когда длина подмассива равна 1 + while (left < right) { + // Операция разбиения с опорными указателями + let pivot = this.partition(nums, left, right); + // Выполнить быструю сортировку для более короткого из двух подмассивов + if (pivot - left < right - pivot) { + this.quickSort(nums, left, pivot - 1); // Рекурсивно отсортировать левый подмассив + left = pivot + 1; // Оставшийся неотсортированный диапазон: [pivot + 1, right] + } else { + this.quickSort(nums, pivot + 1, right); // Рекурсивно отсортировать правый подмассив + right = pivot - 1; // Оставшийся неотсортированный диапазон: [left, pivot - 1] + } + } + } +} + +/* Driver Code */ +/* Быстрая сортировка */ +const nums = [2, 4, 1, 0, 3, 5]; +const quickSort = new QuickSort(); +quickSort.quickSort(nums, 0, nums.length - 1); +console.log('После завершения быстрой сортировки nums =', nums); + +/* Быстрая сортировка (оптимизация медианным опорным элементом) */ +const nums1 = [2, 4, 1, 0, 3, 5]; +const quickSortMedian = new QuickSortMedian(); +quickSortMedian.quickSort(nums1, 0, nums1.length - 1); +console.log('После завершения быстрой сортировки (оптимизация медианным опорным элементом) nums1 =', nums1); + +/* Быстрая сортировка (оптимизация глубины рекурсии) */ +const nums2 = [2, 4, 1, 0, 3, 5]; +const quickSortTailCall = new QuickSortTailCall(); +quickSortTailCall.quickSort(nums2, 0, nums2.length - 1); +console.log('После завершения быстрой сортировки (оптимизация глубины рекурсии) nums2 =', nums2); + +export {}; diff --git a/ru/codes/typescript/chapter_sorting/radix_sort.ts b/ru/codes/typescript/chapter_sorting/radix_sort.ts new file mode 100644 index 000000000..51bbb845b --- /dev/null +++ b/ru/codes/typescript/chapter_sorting/radix_sort.ts @@ -0,0 +1,63 @@ +/** + * File: radix_sort.ts + * Created Time: 2023-04-08 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Получить k-й разряд элемента num, где exp = 10^(k-1) */ +function digit(num: number, exp: number): number { + // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени + return Math.floor(num / exp) % 10; +} + +/* Сортировка подсчетом (сортировка по k-му разряду nums) */ +function countingSortDigit(nums: number[], exp: number): void { + // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10 + const counter = new Array(10).fill(0); + const n = nums.length; + // Подсчитать число появлений каждой цифры от 0 до 9 + for (let i = 0; i < n; i++) { + const d = digit(nums[i], exp); // Получить k-й разряд nums[i], обозначив его как d + counter[d]++; // Подсчитать число появлений цифры d + } + // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива» + for (let i = 1; i < 10; i++) { + counter[i] += counter[i - 1]; + } + // Выполняя обратный проход, заполнить res элементами по статистике в корзинах + const res = new Array(n).fill(0); + for (let i = n - 1; i >= 0; i--) { + const d = digit(nums[i], exp); + const j = counter[d] - 1; // Получить индекс j цифры d в массиве + res[j] = nums[i]; // Поместить текущий элемент по индексу j + counter[d]--; // Уменьшить количество d на 1 + } + // Перезаписать исходный массив nums результатом + for (let i = 0; i < n; i++) { + nums[i] = res[i]; + } +} + +/* Поразрядная сортировка */ +function radixSort(nums: number[]): void { + // Получить максимальный элемент массива, чтобы определить максимальное число разрядов + let m: number = Math.max(... nums); + // Проходить разряды от младшего к старшему + for (let exp = 1; exp <= m; exp *= 10) { + // Выполнить сортировку подсчетом по k-му разряду элементов массива + // k = 1 -> exp = 1 + // k = 2 -> exp = 10 + // то есть exp = 10^(k-1) + countingSortDigit(nums, exp); + } +} + +/* Driver Code */ +const nums = [ + 10546151, 35663510, 42865989, 34862445, 81883077, 88906420, 72429244, + 30524779, 82060337, 63832996, +]; +radixSort(nums); +console.log('После завершения поразрядной сортировки nums =', nums); + +export {}; diff --git a/ru/codes/typescript/chapter_sorting/selection_sort.ts b/ru/codes/typescript/chapter_sorting/selection_sort.ts new file mode 100644 index 000000000..d590ea8aa --- /dev/null +++ b/ru/codes/typescript/chapter_sorting/selection_sort.ts @@ -0,0 +1,29 @@ +/** + * File: selection_sort.ts + * Created Time: 2023-06-04 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Сортировка выбором */ +function selectionSort(nums: number[]): void { + let n = nums.length; + // Внешний цикл: неотсортированный диапазон [i, n-1] + for (let i = 0; i < n - 1; i++) { + // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне + let k = i; + for (let j = i + 1; j < n; j++) { + if (nums[j] < nums[k]) { + k = j; // Записать индекс минимального элемента + } + } + // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона + [nums[i], nums[k]] = [nums[k], nums[i]]; + } +} + +/* Driver Code */ +const nums: number[] = [4, 1, 3, 1, 5, 2]; +selectionSort(nums); +console.log('После завершения сортировки выбором nums =', nums); + +export {}; diff --git a/ru/codes/typescript/chapter_stack_and_queue/array_deque.ts b/ru/codes/typescript/chapter_stack_and_queue/array_deque.ts new file mode 100644 index 000000000..72cb06c83 --- /dev/null +++ b/ru/codes/typescript/chapter_stack_and_queue/array_deque.ts @@ -0,0 +1,158 @@ +/** + * File: array_deque.ts + * Created Time: 2023-02-28 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +/* Двусторонняя очередь на основе кольцевого массива */ +class ArrayDeque { + private nums: number[]; // Массив для хранения элементов двусторонней очереди + private front: number; // Указатель head, указывающий на первый элемент очереди + private queSize: number; // Длина двусторонней очереди + + /* Конструктор */ + constructor(capacity: number) { + this.nums = new Array(capacity); + this.front = 0; + this.queSize = 0; + } + + /* Получить вместимость двусторонней очереди */ + capacity(): number { + return this.nums.length; + } + + /* Получение длины двусторонней очереди */ + size(): number { + return this.queSize; + } + + /* Проверка, пуста ли двусторонняя очередь */ + isEmpty(): boolean { + return this.queSize === 0; + } + + /* Вычислить индекс в кольцевом массиве */ + index(i: number): number { + // С помощью операции взятия по модулю соединить начало и конец массива + // Когда i выходит за конец массива, он возвращается в начало + // Когда i выходит за начало массива, он возвращается в конец + return (i + this.capacity()) % this.capacity(); + } + + /* Добавление в голову очереди */ + pushFirst(num: number): void { + if (this.queSize === this.capacity()) { + console.log('Двусторонняя очередь заполнена'); + return; + } + // Указатель головы сдвигается на одну позицию влево + // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост + this.front = this.index(this.front - 1); + // Добавить num в голову очереди + this.nums[this.front] = num; + this.queSize++; + } + + /* Добавление в хвост очереди */ + pushLast(num: number): void { + if (this.queSize === this.capacity()) { + console.log('Двусторонняя очередь заполнена'); + return; + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + const rear: number = this.index(this.front + this.queSize); + // Добавить num в хвост очереди + this.nums[rear] = num; + this.queSize++; + } + + /* Извлечение из головы очереди */ + popFirst(): number { + const num: number = this.peekFirst(); + // Указатель головы сдвигается на одну позицию назад + this.front = this.index(this.front + 1); + this.queSize--; + return num; + } + + /* Извлечение из хвоста очереди */ + popLast(): number { + const num: number = this.peekLast(); + this.queSize--; + return num; + } + + /* Доступ к элементу в начале очереди */ + peekFirst(): number { + if (this.isEmpty()) throw new Error('The Deque Is Empty.'); + return this.nums[this.front]; + } + + /* Доступ к элементу в конце очереди */ + peekLast(): number { + if (this.isEmpty()) throw new Error('The Deque Is Empty.'); + // Вычислить индекс хвостового элемента + const last = this.index(this.front + this.queSize - 1); + return this.nums[last]; + } + + /* Вернуть массив для вывода */ + toArray(): number[] { + // Преобразовывать только элементы списка в пределах фактической длины + const res: number[] = []; + for (let i = 0, j = this.front; i < this.queSize; i++, j++) { + res[i] = this.nums[this.index(j)]; + } + return res; + } +} + +/* Driver Code */ +/* Инициализация двусторонней очереди */ +const capacity = 5; +const deque: ArrayDeque = new ArrayDeque(capacity); +deque.pushLast(3); +deque.pushLast(2); +deque.pushLast(5); +console.log('Двусторонняя очередь deque = [' + deque.toArray() + ']'); + +/* Доступ к элементу */ +const peekFirst = deque.peekFirst(); +console.log('Элемент в начале очереди peekFirst = ' + peekFirst); +const peekLast = deque.peekLast(); +console.log('Элемент в конце очереди peekLast = ' + peekLast); + +/* Добавление элемента в очередь */ +deque.pushLast(4); +console.log('После добавления элемента 4 в хвост deque = [' + deque.toArray() + ']'); +deque.pushFirst(1); +console.log('После добавления элемента 1 в голову deque = [' + deque.toArray() + ']'); + +/* Извлечение элемента из очереди */ +const popLast = deque.popLast(); +console.log( + 'Извлеченный из хвоста элемент = ' + + popLast + + ', deque после извлечения из хвоста = [' + + deque.toArray() + + ']' +); +const popFirst = deque.popFirst(); +console.log( + 'Извлеченный из головы элемент = ' + + popFirst + + ', deque после извлечения из головы = [' + + deque.toArray() + + ']' +); + +/* Получение длины двусторонней очереди */ +const size = deque.size(); +console.log('Длина двусторонней очереди size = ' + size); + +/* Проверка, пуста ли двусторонняя очередь */ +const isEmpty = deque.isEmpty(); +console.log('Пуста ли двусторонняя очередь = ' + isEmpty); + +export {}; diff --git a/ru/codes/typescript/chapter_stack_and_queue/array_queue.ts b/ru/codes/typescript/chapter_stack_and_queue/array_queue.ts new file mode 100644 index 000000000..2ffe908ef --- /dev/null +++ b/ru/codes/typescript/chapter_stack_and_queue/array_queue.ts @@ -0,0 +1,109 @@ +/** + * File: array_queue.ts + * Created Time: 2022-12-11 + * Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com) + */ + +/* Очередь на основе кольцевого массива */ +class ArrayQueue { + private nums: number[]; // Массив для хранения элементов очереди + private front: number; // Указатель head, указывающий на первый элемент очереди + private queSize: number; // Длина очереди + + constructor(capacity: number) { + this.nums = new Array(capacity); + this.front = this.queSize = 0; + } + + /* Получить вместимость очереди */ + get capacity(): number { + return this.nums.length; + } + + /* Получение длины очереди */ + get size(): number { + return this.queSize; + } + + /* Проверка, пуста ли очередь */ + isEmpty(): boolean { + return this.queSize === 0; + } + + /* Поместить в очередь */ + push(num: number): void { + if (this.size === this.capacity) { + console.log('Очередь заполнена'); + return; + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива + const rear = (this.front + this.queSize) % this.capacity; + // Добавить num в хвост очереди + this.nums[rear] = num; + this.queSize++; + } + + /* Извлечь из очереди */ + pop(): number { + const num = this.peek(); + // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива + this.front = (this.front + 1) % this.capacity; + this.queSize--; + return num; + } + + /* Доступ к элементу в начале очереди */ + peek(): number { + if (this.isEmpty()) throw new Error('очередь пуста'); + return this.nums[this.front]; + } + + /* Вернуть Array */ + toArray(): number[] { + // Преобразовывать только элементы списка в пределах фактической длины + const arr = new Array(this.size); + for (let i = 0, j = this.front; i < this.size; i++, j++) { + arr[i] = this.nums[j % this.capacity]; + } + return arr; + } +} + +/* Driver Code */ +/* Инициализация очереди */ +const capacity = 10; +const queue = new ArrayQueue(capacity); + +/* Добавление элемента в очередь */ +queue.push(1); +queue.push(3); +queue.push(2); +queue.push(5); +queue.push(4); +console.log('Очередь queue =', queue.toArray()); + +/* Доступ к элементу в начале очереди */ +const peek = queue.peek(); +console.log('Элемент в начале очереди peek = ' + peek); + +/* Извлечение элемента из очереди */ +const pop = queue.pop(); +console.log('Извлечен элемент pop = ' + pop + ', очередь после извлечения queue =', queue.toArray()); + +/* Получение длины очереди */ +const size = queue.size; +console.log('Длина очереди size = ' + size); + +/* Проверка, пуста ли очередь */ +const isEmpty = queue.isEmpty(); +console.log('Пуста ли очередь = ' + isEmpty); + +/* Проверка кольцевого массива */ +for (let i = 0; i < 10; i++) { + queue.push(i); + queue.pop(); + console.log('После ' + i + '-го добавления и извлечения queue =', queue.toArray()); +} + +export {}; diff --git a/ru/codes/typescript/chapter_stack_and_queue/array_stack.ts b/ru/codes/typescript/chapter_stack_and_queue/array_stack.ts new file mode 100644 index 000000000..d6c28817c --- /dev/null +++ b/ru/codes/typescript/chapter_stack_and_queue/array_stack.ts @@ -0,0 +1,77 @@ +/** + * File: array_stack.ts + * Created Time: 2022-12-08 + * Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com) + */ + +/* Стек на основе массива */ +class ArrayStack { + private stack: number[]; + constructor() { + this.stack = []; + } + + /* Получение длины стека */ + get size(): number { + return this.stack.length; + } + + /* Проверка, пуст ли стек */ + isEmpty(): boolean { + return this.stack.length === 0; + } + + /* Поместить в стек */ + push(num: number): void { + this.stack.push(num); + } + + /* Извлечь из стека */ + pop(): number | undefined { + if (this.isEmpty()) throw new Error('стек пуст'); + return this.stack.pop(); + } + + /* Доступ к верхнему элементу стека */ + top(): number | undefined { + if (this.isEmpty()) throw new Error('стек пуст'); + return this.stack[this.stack.length - 1]; + } + + /* Вернуть Array */ + toArray() { + return this.stack; + } +} + +/* Driver Code */ +/* Инициализация стека */ +const stack = new ArrayStack(); + +/* Помещение элемента в стек */ +stack.push(1); +stack.push(3); +stack.push(2); +stack.push(5); +stack.push(4); +console.log('Стек stack = '); +console.log(stack.toArray()); + +/* Доступ к верхнему элементу стека */ +const top = stack.top(); +console.log('Верхний элемент стека top = ' + top); + +/* Извлечение элемента из стека */ +const pop = stack.pop(); +console.log('Извлечен элемент pop = ' + pop + ', стек после извлечения stack = '); +console.log(stack.toArray()); + +/* Получение длины стека */ +const size = stack.size; +console.log('Длина стека size = ' + size); + +/* Проверка на пустоту */ +const isEmpty = stack.isEmpty(); +console.log('Пуст ли стек = ' + isEmpty); + +export {}; diff --git a/ru/codes/typescript/chapter_stack_and_queue/deque.ts b/ru/codes/typescript/chapter_stack_and_queue/deque.ts new file mode 100644 index 000000000..8837b2fc2 --- /dev/null +++ b/ru/codes/typescript/chapter_stack_and_queue/deque.ts @@ -0,0 +1,46 @@ +/** + * File: deque.ts + * Created Time: 2023-01-17 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +/* Driver Code */ +/* Инициализация двусторонней очереди */ +// В TypeScript нет встроенной двусторонней очереди, поэтому Array можно использовать как двустороннюю очередь +const deque: number[] = []; + +/* Добавление элемента в очередь */ +deque.push(2); +deque.push(5); +deque.push(4); +// Обратите внимание: поскольку используется массив, временная сложность метода unshift() равна O(n) +deque.unshift(3); +deque.unshift(1); +console.log('Двусторонняя очередь deque = ', deque); + +/* Доступ к элементу */ +const peekFirst: number = deque[0]; +console.log('Элемент в начале очереди peekFirst = ' + peekFirst); +const peekLast: number = deque[deque.length - 1]; +console.log('Элемент в конце очереди peekLast = ' + peekLast); + +/* Извлечение элемента из очереди */ +// Обратите внимание: поскольку используется массив, временная сложность метода shift() равна O(n) +const popFront: number = deque.shift() as number; +console.log( + 'Извлеченный из головы элемент popFront = ' + popFront + ', deque после извлечения из головы = ' + deque +); +const popBack: number = deque.pop() as number; +console.log( + 'Извлеченный из хвоста элемент popBack = ' + popBack + ', deque после извлечения из хвоста = ' + deque +); + +/* Получение длины двусторонней очереди */ +const size: number = deque.length; +console.log('Длина двусторонней очереди size = ' + size); + +/* Проверка, пуста ли двусторонняя очередь */ +const isEmpty: boolean = size === 0; +console.log('Пуста ли двусторонняя очередь = ' + isEmpty); + +export {}; diff --git a/ru/codes/typescript/chapter_stack_and_queue/linkedlist_deque.ts b/ru/codes/typescript/chapter_stack_and_queue/linkedlist_deque.ts new file mode 100644 index 000000000..fdafbf6dd --- /dev/null +++ b/ru/codes/typescript/chapter_stack_and_queue/linkedlist_deque.ts @@ -0,0 +1,167 @@ +/** + * File: linkedlist_deque.ts + * Created Time: 2023-02-04 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +/* Узел двусвязного списка */ +class ListNode { + prev: ListNode; // Ссылка на узел-предшественник (указатель) + next: ListNode; // Ссылка на узел-преемник (указатель) + val: number; // Значение узла + + constructor(val: number) { + this.val = val; + this.next = null; + this.prev = null; + } +} + +/* Двусторонняя очередь на основе двусвязного списка */ +class LinkedListDeque { + private front: ListNode; // Головной узел front + private rear: ListNode; // Хвостовой узел rear + private queSize: number; // Длина двусторонней очереди + + constructor() { + this.front = null; + this.rear = null; + this.queSize = 0; + } + + /* Операция добавления в хвост очереди */ + pushLast(val: number): void { + const node: ListNode = new ListNode(val); + // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node + if (this.queSize === 0) { + this.front = node; + this.rear = node; + } else { + // Добавить node в хвост списка + this.rear.next = node; + node.prev = this.rear; + this.rear = node; // Обновить хвостовой узел + } + this.queSize++; + } + + /* Операция добавления в голову очереди */ + pushFirst(val: number): void { + const node: ListNode = new ListNode(val); + // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node + if (this.queSize === 0) { + this.front = node; + this.rear = node; + } else { + // Добавить node в голову списка + this.front.prev = node; + node.next = this.front; + this.front = node; // Обновить головной узел + } + this.queSize++; + } + + /* Операция извлечения из хвоста очереди */ + popLast(): number { + if (this.queSize === 0) { + return null; + } + const value: number = this.rear.val; // Сохранить значение хвостового узла + // Удалить хвостовой узел + let temp: ListNode = this.rear.prev; + if (temp !== null) { + temp.next = null; + this.rear.prev = null; + } + this.rear = temp; // Обновить хвостовой узел + this.queSize--; + return value; + } + + /* Операция извлечения из головы очереди */ + popFirst(): number { + if (this.queSize === 0) { + return null; + } + const value: number = this.front.val; // Сохранить значение хвостового узла + // Удалить головной узел + let temp: ListNode = this.front.next; + if (temp !== null) { + temp.prev = null; + this.front.next = null; + } + this.front = temp; // Обновить головной узел + this.queSize--; + return value; + } + + /* Доступ к элементу в конце очереди */ + peekLast(): number { + return this.queSize === 0 ? null : this.rear.val; + } + + /* Доступ к элементу в начале очереди */ + peekFirst(): number { + return this.queSize === 0 ? null : this.front.val; + } + + /* Получение длины двусторонней очереди */ + size(): number { + return this.queSize; + } + + /* Проверка, пуста ли двусторонняя очередь */ + isEmpty(): boolean { + return this.queSize === 0; + } + + /* Вывести двустороннюю очередь */ + print(): void { + const arr: number[] = []; + let temp: ListNode = this.front; + while (temp !== null) { + arr.push(temp.val); + temp = temp.next; + } + console.log('[' + arr.join(', ') + ']'); + } +} + +/* Driver Code */ +/* Инициализация двусторонней очереди */ +const linkedListDeque: LinkedListDeque = new LinkedListDeque(); +linkedListDeque.pushLast(3); +linkedListDeque.pushLast(2); +linkedListDeque.pushLast(5); +console.log('Двусторонняя очередь linkedListDeque = '); +linkedListDeque.print(); + +/* Доступ к элементу */ +const peekFirst: number = linkedListDeque.peekFirst(); +console.log('Элемент в начале очереди peekFirst = ' + peekFirst); +const peekLast: number = linkedListDeque.peekLast(); +console.log('Элемент в конце очереди peekLast = ' + peekLast); + +/* Добавление элемента в очередь */ +linkedListDeque.pushLast(4); +console.log('После добавления элемента 4 в хвост linkedListDeque = '); +linkedListDeque.print(); +linkedListDeque.pushFirst(1); +console.log('После добавления элемента 1 в голову linkedListDeque = '); +linkedListDeque.print(); + +/* Извлечение элемента из очереди */ +const popLast: number = linkedListDeque.popLast(); +console.log('Извлечен элемент из хвоста = ' + popLast + ', linkedListDeque после извлечения из хвоста = '); +linkedListDeque.print(); +const popFirst: number = linkedListDeque.popFirst(); +console.log('Извлечен элемент из головы = ' + popFirst + ', linkedListDeque после извлечения из головы = '); +linkedListDeque.print(); + +/* Получение длины двусторонней очереди */ +const size: number = linkedListDeque.size(); +console.log('Длина двусторонней очереди size = ' + size); + +/* Проверка, пуста ли двусторонняя очередь */ +const isEmpty: boolean = linkedListDeque.isEmpty(); +console.log('Пуста ли двусторонняя очередь = ' + isEmpty); diff --git a/ru/codes/typescript/chapter_stack_and_queue/linkedlist_queue.ts b/ru/codes/typescript/chapter_stack_and_queue/linkedlist_queue.ts new file mode 100644 index 000000000..fb0d2b066 --- /dev/null +++ b/ru/codes/typescript/chapter_stack_and_queue/linkedlist_queue.ts @@ -0,0 +1,102 @@ +/** + * File: linkedlist_queue.ts + * Created Time: 2022-12-19 + * Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com) + */ + +import { ListNode } from '../modules/ListNode'; + +/* Очередь на основе связного списка */ +class LinkedListQueue { + private front: ListNode | null; // Головной узел front + private rear: ListNode | null; // Хвостовой узел rear + private queSize: number = 0; + + constructor() { + this.front = null; + this.rear = null; + } + + /* Получение длины очереди */ + get size(): number { + return this.queSize; + } + + /* Проверка, пуста ли очередь */ + isEmpty(): boolean { + return this.size === 0; + } + + /* Поместить в очередь */ + push(num: number): void { + // Добавить num после хвостового узла + const node = new ListNode(num); + // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел + if (!this.front) { + this.front = node; + this.rear = node; + // Если очередь не пуста, добавить этот узел после хвостового узла + } else { + this.rear!.next = node; + this.rear = node; + } + this.queSize++; + } + + /* Извлечь из очереди */ + pop(): number { + const num = this.peek(); + if (!this.front) throw new Error('очередь пуста'); + // Удалить головной узел + this.front = this.front.next; + this.queSize--; + return num; + } + + /* Доступ к элементу в начале очереди */ + peek(): number { + if (this.size === 0) throw new Error('очередь пуста'); + return this.front!.val; + } + + /* Преобразовать связный список в Array и вернуть */ + toArray(): number[] { + let node = this.front; + const res = new Array(this.size); + for (let i = 0; i < res.length; i++) { + res[i] = node!.val; + node = node!.next; + } + return res; + } +} + +/* Driver Code */ +/* Инициализация очереди */ +const queue = new LinkedListQueue(); + +/* Добавление элемента в очередь */ +queue.push(1); +queue.push(3); +queue.push(2); +queue.push(5); +queue.push(4); +console.log('Очередь queue = ' + queue.toArray()); + +/* Доступ к элементу в начале очереди */ +const peek = queue.peek(); +console.log('Элемент в начале очереди peek = ' + peek); + +/* Извлечение элемента из очереди */ +const pop = queue.pop(); +console.log('Извлечен элемент pop = ' + pop + ', очередь после извлечения queue = ' + queue.toArray()); + +/* Получение длины очереди */ +const size = queue.size; +console.log('Длина очереди size = ' + size); + +/* Проверка, пуста ли очередь */ +const isEmpty = queue.isEmpty(); +console.log('Пуста ли очередь = ' + isEmpty); + +export {}; diff --git a/ru/codes/typescript/chapter_stack_and_queue/linkedlist_stack.ts b/ru/codes/typescript/chapter_stack_and_queue/linkedlist_stack.ts new file mode 100644 index 000000000..ac9ecd96f --- /dev/null +++ b/ru/codes/typescript/chapter_stack_and_queue/linkedlist_stack.ts @@ -0,0 +1,91 @@ +/** + * File: linkedlist_stack.ts + * Created Time: 2022-12-21 + * Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com) + */ + +import { ListNode } from '../modules/ListNode'; + +/* Стек на основе связного списка */ +class LinkedListStack { + private stackPeek: ListNode | null; // Использовать головной узел как вершину стека + private stkSize: number = 0; // Длина стека + + constructor() { + this.stackPeek = null; + } + + /* Получение длины стека */ + get size(): number { + return this.stkSize; + } + + /* Проверка, пуст ли стек */ + isEmpty(): boolean { + return this.size === 0; + } + + /* Поместить в стек */ + push(num: number): void { + const node = new ListNode(num); + node.next = this.stackPeek; + this.stackPeek = node; + this.stkSize++; + } + + /* Извлечь из стека */ + pop(): number { + const num = this.peek(); + if (!this.stackPeek) throw new Error('стек пуст'); + this.stackPeek = this.stackPeek.next; + this.stkSize--; + return num; + } + + /* Доступ к верхнему элементу стека */ + peek(): number { + if (!this.stackPeek) throw new Error('стек пуст'); + return this.stackPeek.val; + } + + /* Преобразовать связный список в Array и вернуть */ + toArray(): number[] { + let node = this.stackPeek; + const res = new Array(this.size); + for (let i = res.length - 1; i >= 0; i--) { + res[i] = node!.val; + node = node!.next; + } + return res; + } +} + +/* Driver Code */ +/* Инициализация стека */ +const stack = new LinkedListStack(); + +/* Помещение элемента в стек */ +stack.push(1); +stack.push(3); +stack.push(2); +stack.push(5); +stack.push(4); +console.log('Стек stack = ' + stack.toArray()); + +/* Доступ к верхнему элементу стека */ +const peek = stack.peek(); +console.log('Верхний элемент стека peek = ' + peek); + +/* Извлечение элемента из стека */ +const pop = stack.pop(); +console.log('Извлечен элемент pop = ' + pop + ', стек после извлечения stack = ' + stack.toArray()); + +/* Получение длины стека */ +const size = stack.size; +console.log('Длина стека size = ' + size); + +/* Проверка на пустоту */ +const isEmpty = stack.isEmpty(); +console.log('Пуст ли стек = ' + isEmpty); + +export {}; diff --git a/ru/codes/typescript/chapter_stack_and_queue/queue.ts b/ru/codes/typescript/chapter_stack_and_queue/queue.ts new file mode 100644 index 000000000..a7e569cfb --- /dev/null +++ b/ru/codes/typescript/chapter_stack_and_queue/queue.ts @@ -0,0 +1,37 @@ +/** + * File: queue.ts + * Created Time: 2022-12-05 + * Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com) + */ + +/* Driver Code */ +/* Инициализация очереди */ +// В TypeScript нет встроенной очереди, поэтому Array можно использовать как очередь +const queue: number[] = []; + +/* Добавление элемента в очередь */ +queue.push(1); +queue.push(3); +queue.push(2); +queue.push(5); +queue.push(4); +console.log('Очередь queue =', queue); + +/* Доступ к элементу в начале очереди */ +const peek = queue[0]; +console.log('Элемент в начале очереди peek =', peek); + +/* Извлечение элемента из очереди */ +// В основе лежит массив, поэтому временная сложность метода shift() равна O(n) +const pop = queue.shift(); +console.log('Извлечен элемент pop =', pop, ', очередь после извлечения queue = ', queue); + +/* Получение длины очереди */ +const size = queue.length; +console.log('Длина очереди size =', size); + +/* Проверка, пуста ли очередь */ +const isEmpty = queue.length === 0; +console.log('Пуста ли очередь = ', isEmpty); + +export {}; diff --git a/ru/codes/typescript/chapter_stack_and_queue/stack.ts b/ru/codes/typescript/chapter_stack_and_queue/stack.ts new file mode 100644 index 000000000..818837b56 --- /dev/null +++ b/ru/codes/typescript/chapter_stack_and_queue/stack.ts @@ -0,0 +1,37 @@ +/** + * File: stack.ts + * Created Time: 2022-12-04 + * Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com) + */ + +/* Driver Code */ +/* Инициализация стека */ +// В TypeScript нет встроенного класса стека, поэтому Array можно использовать как стек +const stack: number[] = []; + +/* Помещение элемента в стек */ +stack.push(1); +stack.push(3); +stack.push(2); +stack.push(5); +stack.push(4); +console.log('Стек stack =', stack); + +/* Доступ к верхнему элементу стека */ +const peek = stack[stack.length - 1]; +console.log('Верхний элемент стека peek =', peek); + +/* Извлечение элемента из стека */ +const pop = stack.pop(); +console.log('Извлечен элемент pop =', pop); +console.log('Стек после извлечения =', stack); + +/* Получение длины стека */ +const size = stack.length; +console.log('Длина стека size =', size); + +/* Проверка на пустоту */ +const isEmpty = stack.length === 0; +console.log('Пуст ли стек =', isEmpty); + +export {}; diff --git a/ru/codes/typescript/chapter_tree/array_binary_tree.ts b/ru/codes/typescript/chapter_tree/array_binary_tree.ts new file mode 100644 index 000000000..b9e490a9a --- /dev/null +++ b/ru/codes/typescript/chapter_tree/array_binary_tree.ts @@ -0,0 +1,151 @@ +/** + * File: array_binary_tree.js + * Created Time: 2023-08-09 + * Author: yuan0221 (yl1452491917@gmail.com) + */ + +import { arrToTree } from '../modules/TreeNode'; +import { printTree } from '../modules/PrintUtil'; + +type Order = 'pre' | 'in' | 'post'; + +/* Класс двоичного дерева в массивном представлении */ +class ArrayBinaryTree { + #tree: (number | null)[]; + + /* Конструктор */ + constructor(arr: (number | null)[]) { + this.#tree = arr; + } + + /* Вместимость списка */ + size(): number { + return this.#tree.length; + } + + /* Получить значение узла с индексом i */ + val(i: number): number | null { + // Если индекс выходит за границы, вернуть null, обозначающий пустую позицию + if (i < 0 || i >= this.size()) return null; + return this.#tree[i]; + } + + /* Получить индекс левого дочернего узла узла с индексом i */ + left(i: number): number { + return 2 * i + 1; + } + + /* Получить индекс правого дочернего узла узла с индексом i */ + right(i: number): number { + return 2 * i + 2; + } + + /* Получить индекс родительского узла узла с индексом i */ + parent(i: number): number { + return Math.floor((i - 1) / 2); // Округление вниз при делении + } + + /* Обход в ширину */ + levelOrder(): number[] { + let res = []; + // Непосредственно обходить массив + for (let i = 0; i < this.size(); i++) { + if (this.val(i) !== null) res.push(this.val(i)); + } + return res; + } + + /* Обход в глубину */ + #dfs(i: number, order: Order, res: (number | null)[]): void { + // Если это пустая позиция, вернуть + if (this.val(i) === null) return; + // Предварительный обход + if (order === 'pre') res.push(this.val(i)); + this.#dfs(this.left(i), order, res); + // Симметричный обход + if (order === 'in') res.push(this.val(i)); + this.#dfs(this.right(i), order, res); + // Обратный обход + if (order === 'post') res.push(this.val(i)); + } + + /* Предварительный обход */ + preOrder(): (number | null)[] { + const res = []; + this.#dfs(0, 'pre', res); + return res; + } + + /* Симметричный обход */ + inOrder(): (number | null)[] { + const res = []; + this.#dfs(0, 'in', res); + return res; + } + + /* Обратный обход */ + postOrder(): (number | null)[] { + const res = []; + this.#dfs(0, 'post', res); + return res; + } +} + +/* Driver Code */ +// Инициализировать двоичное дерево +// Здесь используется функция, напрямую строящая двоичное дерево из массива +const arr = Array.of( + 1, + 2, + 3, + 4, + null, + 6, + 7, + 8, + 9, + null, + null, + 12, + null, + null, + 15 +); + +const root = arrToTree(arr); +console.log('\nИнициализация двоичного дерева\n'); +console.log('Массивное представление двоичного дерева:'); +console.log(arr); +console.log('Связное представление двоичного дерева:'); +printTree(root); + +// Класс двоичного дерева в массивном представлении +const abt = new ArrayBinaryTree(arr); + +// Доступ к узлу +const i = 1; +const l = abt.left(i); +const r = abt.right(i); +const p = abt.parent(i); +console.log('\nТекущий индекс узла = ' + i + ', значение = ' + abt.val(i)); +console.log( + 'Индекс левого дочернего узла = ' + l + ', значение = ' + (l === null ? 'null' : abt.val(l)) +); +console.log( + 'Индекс правого дочернего узла = ' + r + ', значение = ' + (r === null ? 'null' : abt.val(r)) +); +console.log( + 'Индекс родительского узла = ' + p + ', значение = ' + (p === null ? 'null' : abt.val(p)) +); + +// Обходить дерево +let res = abt.levelOrder(); +console.log('\nОбход в ширину: ' + res); +res = abt.preOrder(); +console.log('Предварительный обход: ' + res); +res = abt.inOrder(); +console.log('Симметричный обход: ' + res); +res = abt.postOrder(); +console.log('Обратный обход: ' + res); + +export {}; diff --git a/ru/codes/typescript/chapter_tree/avl_tree.ts b/ru/codes/typescript/chapter_tree/avl_tree.ts new file mode 100644 index 000000000..7609e84b9 --- /dev/null +++ b/ru/codes/typescript/chapter_tree/avl_tree.ts @@ -0,0 +1,222 @@ +/** + * File: avl_tree.ts + * Created Time: 2023-02-06 + * Author: Justin (xiefahit@gmail.com) + */ + +import { TreeNode } from '../modules/TreeNode'; +import { printTree } from '../modules/PrintUtil'; + +/* AVL-дерево */ +class AVLTree { + root: TreeNode; + /* Конструктор */ + constructor() { + this.root = null; // Корневой узел + } + + /* Получить высоту узла */ + height(node: TreeNode): number { + // Высота пустого узла равна -1, высота листового узла равна 0 + return node === null ? -1 : node.height; + } + + /* Обновить высоту узла */ + private updateHeight(node: TreeNode): void { + // Высота узла равна высоте более высокого поддерева + 1 + node.height = + Math.max(this.height(node.left), this.height(node.right)) + 1; + } + + /* Получить коэффициент баланса */ + balanceFactor(node: TreeNode): number { + // Коэффициент баланса пустого узла равен 0 + if (node === null) return 0; + // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева + return this.height(node.left) - this.height(node.right); + } + + /* Операция правого вращения */ + private rightRotate(node: TreeNode): TreeNode { + const child = node.left; + const grandChild = child.right; + // Выполнить правое вращение узла node вокруг child + child.right = node; + node.left = grandChild; + // Обновить высоту узла + this.updateHeight(node); + this.updateHeight(child); + // Вернуть корневой узел поддерева после вращения + return child; + } + + /* Операция левого вращения */ + private leftRotate(node: TreeNode): TreeNode { + const child = node.right; + const grandChild = child.left; + // Выполнить левое вращение узла node вокруг child + child.left = node; + node.right = grandChild; + // Обновить высоту узла + this.updateHeight(node); + this.updateHeight(child); + // Вернуть корневой узел поддерева после вращения + return child; + } + + /* Выполнить вращение, чтобы снова сбалансировать поддерево */ + private rotate(node: TreeNode): TreeNode { + // Получить коэффициент баланса узла node + const balanceFactor = this.balanceFactor(node); + // Левосторонне перекошенное дерево + if (balanceFactor > 1) { + if (this.balanceFactor(node.left) >= 0) { + // Правое вращение + return this.rightRotate(node); + } else { + // Сначала левое вращение, затем правое + node.left = this.leftRotate(node.left); + return this.rightRotate(node); + } + } + // Правосторонне перекошенное дерево + if (balanceFactor < -1) { + if (this.balanceFactor(node.right) <= 0) { + // Левое вращение + return this.leftRotate(node); + } else { + // Сначала правое вращение, затем левое + node.right = this.rightRotate(node.right); + return this.leftRotate(node); + } + } + // Дерево сбалансировано, вращение не требуется, вернуть сразу + return node; + } + + /* Вставка узла */ + insert(val: number): void { + this.root = this.insertHelper(this.root, val); + } + + /* Рекурсивная вставка узла (вспомогательный метод) */ + private insertHelper(node: TreeNode, val: number): TreeNode { + if (node === null) return new TreeNode(val); + /* 1. Найти позицию вставки и вставить узел */ + if (val < node.val) { + node.left = this.insertHelper(node.left, val); + } else if (val > node.val) { + node.right = this.insertHelper(node.right, val); + } else { + return node; // Повторяющийся узел не вставлять, сразу вернуть + } + this.updateHeight(node); // Обновить высоту узла + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = this.rotate(node); + // Вернуть корневой узел поддерева + return node; + } + + /* Удаление узла */ + remove(val: number): void { + this.root = this.removeHelper(this.root, val); + } + + /* Рекурсивное удаление узла (вспомогательный метод) */ + private removeHelper(node: TreeNode, val: number): TreeNode { + if (node === null) return null; + /* 1. Найти узел и удалить его */ + if (val < node.val) { + node.left = this.removeHelper(node.left, val); + } else if (val > node.val) { + node.right = this.removeHelper(node.right, val); + } else { + if (node.left === null || node.right === null) { + const child = node.left !== null ? node.left : node.right; + // Число дочерних узлов = 0, удалить node и сразу вернуть + if (child === null) { + return null; + } else { + // Число дочерних узлов = 1, удалить node напрямую + node = child; + } + } else { + // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел + let temp = node.right; + while (temp.left !== null) { + temp = temp.left; + } + node.right = this.removeHelper(node.right, temp.val); + node.val = temp.val; + } + } + this.updateHeight(node); // Обновить высоту узла + /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */ + node = this.rotate(node); + // Вернуть корневой узел поддерева + return node; + } + + /* Поиск узла */ + search(val: number): TreeNode { + let cur = this.root; + // Искать в цикле и выйти после прохода за листовой узел + while (cur !== null) { + if (cur.val < val) { + // Целевой узел находится в правом поддереве cur + cur = cur.right; + } else if (cur.val > val) { + // Целевой узел находится в левом поддереве cur + cur = cur.left; + } else { + // Найти целевой узел и выйти из цикла + break; + } + } + // Вернуть целевой узел + return cur; + } +} + +function testInsert(tree: AVLTree, val: number): void { + tree.insert(val); + console.log('\nПосле вставки узла ' + val + ' AVL-дерево имеет вид'); + printTree(tree.root); +} + +function testRemove(tree: AVLTree, val: number): void { + tree.remove(val); + console.log('\nПосле удаления узла ' + val + ' AVL-дерево имеет вид'); + printTree(tree.root); +} + +/* Driver Code */ +/* Инициализация пустого AVL-дерева */ +const avlTree = new AVLTree(); +/* Вставка узла */ +// Обратите внимание, как AVL-дерево сохраняет баланс после вставки узла +testInsert(avlTree, 1); +testInsert(avlTree, 2); +testInsert(avlTree, 3); +testInsert(avlTree, 4); +testInsert(avlTree, 5); +testInsert(avlTree, 8); +testInsert(avlTree, 7); +testInsert(avlTree, 9); +testInsert(avlTree, 10); +testInsert(avlTree, 6); + +/* Вставка повторяющегося узла */ +testInsert(avlTree, 7); + +/* Удаление узла */ +// Обратите внимание, как AVL-дерево сохраняет баланс после удаления узла +testRemove(avlTree, 8); // Удаление узла степени 0 +testRemove(avlTree, 5); // Удаление узла степени 1 +testRemove(avlTree, 4); // Удаление узла степени 2 + +/* Поиск узла */ +const node = avlTree.search(7); +console.log('\nНайденный объект узла =', node, ', значение узла = ' + node.val); + +export {}; diff --git a/ru/codes/typescript/chapter_tree/binary_search_tree.ts b/ru/codes/typescript/chapter_tree/binary_search_tree.ts new file mode 100644 index 000000000..bdc034570 --- /dev/null +++ b/ru/codes/typescript/chapter_tree/binary_search_tree.ts @@ -0,0 +1,146 @@ +/** + * File: binary_search_tree.ts + * Created Time: 2022-12-14 + * Author: Justin (xiefahit@gmail.com) + */ + +import { TreeNode } from '../modules/TreeNode'; +import { printTree } from '../modules/PrintUtil'; + +/* Двоичное дерево поиска */ +class BinarySearchTree { + private root: TreeNode | null; + + /* Конструктор */ + constructor() { + // Инициализировать пустое дерево + this.root = null; + } + + /* Получить корневой узел двоичного дерева */ + getRoot(): TreeNode | null { + return this.root; + } + + /* Поиск узла */ + search(num: number): TreeNode | null { + let cur = this.root; + // Искать в цикле и выйти после прохода за листовой узел + while (cur !== null) { + // Целевой узел находится в правом поддереве cur + if (cur.val < num) cur = cur.right; + // Целевой узел находится в левом поддереве cur + else if (cur.val > num) cur = cur.left; + // Найти целевой узел и выйти из цикла + else break; + } + // Вернуть целевой узел + return cur; + } + + /* Вставка узла */ + insert(num: number): void { + // Если дерево пусто, инициализировать корневой узел + if (this.root === null) { + this.root = new TreeNode(num); + return; + } + let cur: TreeNode | null = this.root, + pre: TreeNode | null = null; + // Искать в цикле и выйти после прохода за листовой узел + while (cur !== null) { + // Найти повторяющийся узел и сразу вернуть + if (cur.val === num) return; + pre = cur; + // Позиция вставки находится в правом поддереве cur + if (cur.val < num) cur = cur.right; + // Позиция вставки находится в левом поддереве cur + else cur = cur.left; + } + // Вставка узла + const node = new TreeNode(num); + if (pre!.val < num) pre!.right = node; + else pre!.left = node; + } + + /* Удаление узла */ + remove(num: number): void { + // Если дерево пусто, сразу вернуть + if (this.root === null) return; + let cur: TreeNode | null = this.root, + pre: TreeNode | null = null; + // Искать в цикле и выйти после прохода за листовой узел + while (cur !== null) { + // Найти узел для удаления и выйти из цикла + if (cur.val === num) break; + pre = cur; + // Узел для удаления находится в правом поддереве cur + if (cur.val < num) cur = cur.right; + // Узел для удаления находится в левом поддереве cur + else cur = cur.left; + } + // Если узел для удаления отсутствует, сразу вернуть + if (cur === null) return; + // Число дочерних узлов = 0 или 1 + if (cur.left === null || cur.right === null) { + // Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел + const child: TreeNode | null = + cur.left !== null ? cur.left : cur.right; + // Удалить узел cur + if (cur !== this.root) { + if (pre!.left === cur) pre!.left = child; + else pre!.right = child; + } else { + // Если удаляемый узел является корнем, заново назначить корневой узел + this.root = child; + } + } + // Число дочерних узлов = 2 + else { + // Получить следующий узел после cur в симметричном обходе + let tmp: TreeNode | null = cur.right; + while (tmp!.left !== null) { + tmp = tmp!.left; + } + // Рекурсивно удалить узел tmp + this.remove(tmp!.val); + // Перезаписать cur значением tmp + cur.val = tmp!.val; + } + } +} + +/* Driver Code */ +/* Инициализация двоичного дерева поиска */ +const bst = new BinarySearchTree(); +// Обратите внимание: разные порядки вставки порождают разные двоичные деревья; данная последовательность может построить совершенное двоичное дерево +const nums = [8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15]; +for (const num of nums) { + bst.insert(num); +} +console.log('\nИнициализированное двоичное дерево\n'); +printTree(bst.getRoot()); + +/* Поиск узла */ +const node = bst.search(7); +console.log( + '\nНайденный объект узла = ' + node + ', значение узла = ' + (node ? node.val : 'null') +); + +/* Вставка узла */ +bst.insert(16); +console.log('\nПосле вставки узла 16 двоичное дерево имеет вид\n'); +printTree(bst.getRoot()); + +/* Удаление узла */ +bst.remove(1); +console.log('\nПосле удаления узла 1 двоичное дерево имеет вид\n'); +printTree(bst.getRoot()); +bst.remove(2); +console.log('\nПосле удаления узла 2 двоичное дерево имеет вид\n'); +printTree(bst.getRoot()); +bst.remove(4); +console.log('\nПосле удаления узла 4 двоичное дерево имеет вид\n'); +printTree(bst.getRoot()); + +export {}; diff --git a/ru/codes/typescript/chapter_tree/binary_tree.ts b/ru/codes/typescript/chapter_tree/binary_tree.ts new file mode 100644 index 000000000..dc3004be4 --- /dev/null +++ b/ru/codes/typescript/chapter_tree/binary_tree.ts @@ -0,0 +1,37 @@ +/** + * File: binary_tree.ts + * Created Time: 2022-12-13 + * Author: Justin (xiefahit@gmail.com) + */ + +import { TreeNode } from '../modules/TreeNode'; +import { printTree } from '../modules/PrintUtil'; + +/* Инициализация двоичного дерева */ +// Инициализация узла +let n1 = new TreeNode(1), + n2 = new TreeNode(2), + n3 = new TreeNode(3), + n4 = new TreeNode(4), + n5 = new TreeNode(5); +// Построить связи между узлами (указатели) +n1.left = n2; +n1.right = n3; +n2.left = n4; +n2.right = n5; +console.log('\nИнициализация двоичного дерева\n'); +printTree(n1); + +/* Вставка и удаление узлов */ +const P = new TreeNode(0); +// Вставить узел P между n1 -> n2 +n1.left = P; +P.left = n2; +console.log('\nПосле вставки узла P\n'); +printTree(n1); +// Удалить узел P +n1.left = n2; +console.log('\nПосле удаления узла P\n'); +printTree(n1); + +export {}; diff --git a/ru/codes/typescript/chapter_tree/binary_tree_bfs.ts b/ru/codes/typescript/chapter_tree/binary_tree_bfs.ts new file mode 100644 index 000000000..9de0601ed --- /dev/null +++ b/ru/codes/typescript/chapter_tree/binary_tree_bfs.ts @@ -0,0 +1,41 @@ +/** + * File: binary_tree_bfs.ts + * Created Time: 2022-12-14 + * Author: Justin (xiefahit@gmail.com) + */ + +import { type TreeNode } from '../modules/TreeNode'; +import { arrToTree } from '../modules/TreeNode'; +import { printTree } from '../modules/PrintUtil'; + +/* Обход в ширину */ +function levelOrder(root: TreeNode | null): number[] { + // Инициализировать очередь и добавить корневой узел + const queue = [root]; + // Инициализировать список для хранения последовательности обхода + const list: number[] = []; + while (queue.length) { + let node = queue.shift() as TreeNode; // Извлечение из очереди + list.push(node.val); // Сохранить значение узла + if (node.left) { + queue.push(node.left); // Поместить левый дочерний узел в очередь + } + if (node.right) { + queue.push(node.right); // Поместить правый дочерний узел в очередь + } + } + return list; +} + +/* Driver Code */ +/* Инициализация двоичного дерева */ +// Здесь используется функция, напрямую строящая двоичное дерево из массива +const root = arrToTree([1, 2, 3, 4, 5, 6, 7]); +console.log('\nИнициализация двоичного дерева\n'); +printTree(root); + +/* Обход в ширину */ +const list = levelOrder(root); +console.log('\nПоследовательность печати узлов при обходе в ширину = ' + list); + +export {}; diff --git a/ru/codes/typescript/chapter_tree/binary_tree_dfs.ts b/ru/codes/typescript/chapter_tree/binary_tree_dfs.ts new file mode 100644 index 000000000..370747f8e --- /dev/null +++ b/ru/codes/typescript/chapter_tree/binary_tree_dfs.ts @@ -0,0 +1,69 @@ +/** + * File: binary_tree_dfs.ts + * Created Time: 2022-12-14 + * Author: Justin (xiefahit@gmail.com) + */ + +import { type TreeNode } from '../modules/TreeNode'; +import { arrToTree } from '../modules/TreeNode'; +import { printTree } from '../modules/PrintUtil'; + +// Инициализировать список для хранения последовательности обхода +const list: number[] = []; + +/* Предварительный обход */ +function preOrder(root: TreeNode | null): void { + if (root === null) { + return; + } + // Порядок обхода: корень -> левое поддерево -> правое поддерево + list.push(root.val); + preOrder(root.left); + preOrder(root.right); +} + +/* Симметричный обход */ +function inOrder(root: TreeNode | null): void { + if (root === null) { + return; + } + // Порядок обхода: левое поддерево -> корень -> правое поддерево + inOrder(root.left); + list.push(root.val); + inOrder(root.right); +} + +/* Обратный обход */ +function postOrder(root: TreeNode | null): void { + if (root === null) { + return; + } + // Порядок обхода: левое поддерево -> правое поддерево -> корень + postOrder(root.left); + postOrder(root.right); + list.push(root.val); +} + +/* Driver Code */ +/* Инициализация двоичного дерева */ +// Здесь используется функция, напрямую строящая двоичное дерево из массива +const root = arrToTree([1, 2, 3, 4, 5, 6, 7]); +console.log('\nИнициализация двоичного дерева\n'); +printTree(root); + +/* Предварительный обход */ +list.length = 0; +preOrder(root); +console.log('\nПоследовательность печати узлов при предварительном обходе = ' + list); + +/* Симметричный обход */ +list.length = 0; +inOrder(root); +console.log('\nПоследовательность печати узлов при симметричном обходе = ' + list); + +/* Обратный обход */ +list.length = 0; +postOrder(root); +console.log('\nПоследовательность печати узлов при обратном обходе = ' + list); + +export {}; diff --git a/ru/codes/typescript/modules/ListNode.ts b/ru/codes/typescript/modules/ListNode.ts new file mode 100644 index 000000000..ba514b534 --- /dev/null +++ b/ru/codes/typescript/modules/ListNode.ts @@ -0,0 +1,28 @@ +/** + * File: ListNode.ts + * Created Time: 2022-12-10 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Узел связного списка */ +class ListNode { + val: number; + next: ListNode | null; + constructor(val?: number, next?: ListNode | null) { + this.val = val === undefined ? 0 : val; + this.next = next === undefined ? null : next; + } +} + +/* Десериализовать массив в связный список */ +function arrToLinkedList(arr: number[]): ListNode | null { + const dum: ListNode = new ListNode(0); + let head = dum; + for (const val of arr) { + head.next = new ListNode(val); + head = head.next; + } + return dum.next; +} + +export { ListNode, arrToLinkedList }; diff --git a/ru/codes/typescript/modules/PrintUtil.ts b/ru/codes/typescript/modules/PrintUtil.ts new file mode 100644 index 000000000..4851d80a1 --- /dev/null +++ b/ru/codes/typescript/modules/PrintUtil.ts @@ -0,0 +1,93 @@ +/** + * File: PrintUtil.ts + * Created Time: 2022-12-13 + * Author: Justin (xiefahit@gmail.com) + */ + +import { ListNode } from './ListNode'; +import { TreeNode, arrToTree } from './TreeNode'; + +/* Вывести связный список */ +function printLinkedList(head: ListNode | null): void { + const list: string[] = []; + while (head !== null) { + list.push(head.val.toString()); + head = head.next; + } + console.log(list.join(' -> ')); +} + +class Trunk { + prev: Trunk | null; + str: string; + + constructor(prev: Trunk | null, str: string) { + this.prev = prev; + this.str = str; + } +} + +/** + * Вывести двоичное дерево + * Этот вывод дерева заимствован из TECHIE DELIGHT + * https://www.techiedelight.com/c-program-print-binary-tree/ + */ +function printTree(root: TreeNode | null) { + printTreeHelper(root, null, false); +} + +/* Вывести двоичное дерево */ +function printTreeHelper( + root: TreeNode | null, + prev: Trunk | null, + isRight: boolean +) { + if (root === null) { + return; + } + + let prev_str = ' '; + const trunk = new Trunk(prev, prev_str); + + printTreeHelper(root.right, trunk, true); + + if (prev === null) { + trunk.str = '———'; + } else if (isRight) { + trunk.str = '/———'; + prev_str = ' |'; + } else { + trunk.str = '\\———'; + prev.str = prev_str; + } + + showTrunks(trunk); + console.log(' ' + root.val); + + if (prev) { + prev.str = prev_str; + } + trunk.str = ' |'; + + printTreeHelper(root.left, trunk, false); +} + +function showTrunks(p: Trunk | null) { + if (p === null) { + return; + } + + showTrunks(p.prev); + process.stdout.write(p.str); +} + +/* Вывести кучу */ +function printHeap(arr: number[]): void { + console.log('Массивное представление кучи:'); + console.log(arr); + console.log('Древовидное представление кучи:'); + const root = arrToTree(arr); + printTree(root); +} + +export { printLinkedList, printTree, printHeap }; diff --git a/ru/codes/typescript/modules/TreeNode.ts b/ru/codes/typescript/modules/TreeNode.ts new file mode 100644 index 000000000..9acb40c2f --- /dev/null +++ b/ru/codes/typescript/modules/TreeNode.ts @@ -0,0 +1,37 @@ +/** + * File: TreeNode.ts + * Created Time: 2022-12-13 + * Author: Justin (xiefahit@gmail.com) + */ + +/* Узел двоичного дерева */ +class TreeNode { + val: number; // Значение узла + height: number; // Высота узла + left: TreeNode | null; // Указатель на левый дочерний узел + right: TreeNode | null; // Указатель на правый дочерний узел + constructor( + val?: number, + height?: number, + left?: TreeNode | null, + right?: TreeNode | null + ) { + this.val = val === undefined ? 0 : val; + this.height = height === undefined ? 0 : height; + this.left = left === undefined ? null : left; + this.right = right === undefined ? null : right; + } +} + +/* Десериализовать массив в двоичное дерево */ +function arrToTree(arr: (number | null)[], i: number = 0): TreeNode | null { + if (i < 0 || i >= arr.length || arr[i] === null) { + return null; + } + let root = new TreeNode(arr[i]); + root.left = arrToTree(arr, 2 * i + 1); + root.right = arrToTree(arr, 2 * i + 2); + return root; +} + +export { TreeNode, arrToTree }; diff --git a/ru/codes/typescript/modules/Vertex.ts b/ru/codes/typescript/modules/Vertex.ts new file mode 100644 index 000000000..146e3f3df --- /dev/null +++ b/ru/codes/typescript/modules/Vertex.ts @@ -0,0 +1,33 @@ +/** + * File: Vertex.ts + * Created Time: 2023-02-15 + * Author: Zhuo Qinyue (1403450829@qq.com) + */ + +/* Класс вершины */ +class Vertex { + val: number; + constructor(val: number) { + this.val = val; + } + + /* На вход подается список значений vals, на выходе возвращается список вершин vets */ + public static valsToVets(vals: number[]): Vertex[] { + const vets: Vertex[] = []; + for (let i = 0; i < vals.length; i++) { + vets[i] = new Vertex(vals[i]); + } + return vets; + } + + /* На вход подается список вершин vets, на выходе возвращается список значений vals */ + public static vetsToVals(vets: Vertex[]): number[] { + const vals: number[] = []; + for (const vet of vets) { + vals.push(vet.val); + } + return vals; + } +} + +export { Vertex }; diff --git a/ru/codes/typescript/package.json b/ru/codes/typescript/package.json new file mode 100644 index 000000000..ae81c64fe --- /dev/null +++ b/ru/codes/typescript/package.json @@ -0,0 +1,11 @@ +{ + "private": true, + "type": "module", + "scripts": { + "check": "tsc" + }, + "devDependencies": { + "@types/node": "^24.9.2", + "typescript": "^5.9.3" + } +} diff --git a/ru/codes/typescript/tsconfig.json b/ru/codes/typescript/tsconfig.json new file mode 100644 index 000000000..954efb8e7 --- /dev/null +++ b/ru/codes/typescript/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "module": "esnext", + "moduleResolution": "node", + "types": ["@types/node"], + "noEmit": true, + "target": "esnext", + }, + "include": ["chapter_*/*.ts"], + "exclude": ["node_modules"] +} diff --git a/ru/codes/zig/.gitignore b/ru/codes/zig/.gitignore new file mode 100644 index 000000000..76bab71be --- /dev/null +++ b/ru/codes/zig/.gitignore @@ -0,0 +1,4 @@ +zig-out +zig-cache +.zig-cache +!/.vscode/ \ No newline at end of file diff --git a/ru/codes/zig/.vscode/launch.json b/ru/codes/zig/.vscode/launch.json new file mode 100644 index 000000000..cfeec2388 --- /dev/null +++ b/ru/codes/zig/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug", + "type": "lldb", + "request": "launch", + "program": "${workspaceFolder}/zig-out/bin/${fileBasenameNoExtension}", + "args": [], + "cwd": "${workspaceFolder}", + "preLaunchTask": "build" + } + ] +} \ No newline at end of file diff --git a/ru/codes/zig/.vscode/settings.json b/ru/codes/zig/.vscode/settings.json new file mode 100644 index 000000000..a1ccb9aa3 --- /dev/null +++ b/ru/codes/zig/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "zig.testArgs": ["build", "test", "-Dtest-filter=${filter}"] +} \ No newline at end of file diff --git a/ru/codes/zig/.vscode/tasks.json b/ru/codes/zig/.vscode/tasks.json new file mode 100644 index 000000000..a66ac10e2 --- /dev/null +++ b/ru/codes/zig/.vscode/tasks.json @@ -0,0 +1,10 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "type": "shell", + "command": "zig build", + } + ] +} \ No newline at end of file diff --git a/ru/codes/zig/build.zig b/ru/codes/zig/build.zig new file mode 100644 index 000000000..ff86b619e --- /dev/null +++ b/ru/codes/zig/build.zig @@ -0,0 +1,169 @@ +// File: build.zig +// Created Time: 2023-01-07 +// Author: codingonion (coderonion@gmail.com), CreatorMetaSky (creator_meta_sky@163.com) + +//! Zig Version: 0.14.1 +//! Build Command: zig build +//! Run Command: zig build run | zig build run_* +//! Test Command: zig build test | zig build test -Dtest-filter=* + +const std = @import("std"); + +pub fn build(b: *std.Build) void { + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); + + const chapters = [_][]const u8{ + "chapter_computational_complexity", + "chapter_array_and_linkedlist", + "chapter_stack_and_queue", + "chapter_hashing", + "chapter_tree", + "chapter_heap", + "chapter_searching", + "chapter_sorting", + "chapter_dynamic_programming", + }; + + const test_step = b.step("test", "Run unit tests"); + const test_filters = b.option([]const []const u8, "test-filter", "Skip tests that do not match any filter") orelse &[0][]const u8{}; + + buildChapterExeModules(b, target, optimize, &chapters, test_step, test_filters); + buildMainExeModule(b, target, optimize); +} + +fn buildChapterExeModules( + b: *std.Build, + target: std.Build.ResolvedTarget, + optimize: std.builtin.OptimizeMode, + chapter_dirs: []const []const u8, + test_step: *std.Build.Step, + test_filters: []const []const u8, +) void { + for (chapter_dirs) |chapter_dir_name| { + const chapter_dir_path = std.fs.path.join(b.allocator, &[_][]const u8{chapter_dir_name}) catch continue; + var chapter_dir = std.fs.cwd().openDir(chapter_dir_path, .{ .iterate = true }) catch continue; + defer chapter_dir.close(); + + var it = chapter_dir.iterate(); + while (it.next() catch continue) |chapter_dir_entry| { + if (chapter_dir_entry.kind != .file or !std.mem.endsWith(u8, chapter_dir_entry.name, ".zig")) continue; + const exe_mod = buildExeModuleFromChapterDirEntry(b, target, optimize, chapter_dir_name, chapter_dir_entry) catch continue; + addTestStepToExeModule(b, test_step, exe_mod, test_filters); + } + } +} + +fn buildExeModuleFromChapterDirEntry( + b: *std.Build, + target: std.Build.ResolvedTarget, + optimize: std.builtin.OptimizeMode, + chapter_dir_name: []const u8, + chapter_dir_entry: std.fs.Dir.Entry, +) !*std.Build.Module { + const zig_file_path = try std.fs.path.join(b.allocator, &[_][]const u8{ chapter_dir_name, chapter_dir_entry.name }); + const zig_file_name = chapter_dir_entry.name[0 .. chapter_dir_entry.name.len - 4]; // abstract zig file name from xxx.zig + + // Здесь временно добавлены только главы про массивы и связные списки; после доработки будут открыты все + const new_algo_names = [_][]const u8{ + "array", + "linked_list", + "list", + "my_list", + "iteration", + "recursion", + "space_complexity", + "time_complexity", + "worst_best_time_complexity", + }; + var can_run = false; + for (new_algo_names) |name| { + if (std.mem.eql(u8, zig_file_name, name)) { + can_run = true; + } + } + if (!can_run) { + return error.CanNotRunUseOldZigCodes; + } + + // std.debug.print("now run zig file name = {s}\n", .{zig_file_name}); + + const exe_mod = b.createModule(.{ + .root_source_file = b.path(zig_file_path), + .target = target, + .optimize = optimize, + }); + + const exe = b.addExecutable(.{ + .name = zig_file_name, + .root_module = exe_mod, + }); + + const utils_mod = createUtilsModule(b, target, optimize); + exe_mod.addImport("utils", utils_mod); + + b.installArtifact(exe); + + const run_cmd = b.addRunArtifact(exe); + run_cmd.step.dependOn(b.getInstallStep()); + if (b.args) |args| { + run_cmd.addArgs(args); + } + + const step_name = try std.fmt.allocPrint(b.allocator, "run_{s}", .{zig_file_name}); + const step_desc = try std.fmt.allocPrint(b.allocator, "Run {s}/{s}.zig", .{ chapter_dir_name, zig_file_name }); + const run_step = b.step(step_name, step_desc); + run_step.dependOn(&run_cmd.step); + + return exe_mod; +} + +fn buildMainExeModule( + b: *std.Build, + target: std.Build.ResolvedTarget, + optimize: std.builtin.OptimizeMode, +) void { + const exe_mod = b.createModule(.{ + .root_source_file = b.path("main.zig"), + .target = target, + .optimize = optimize, + }); + + const utils_mod = createUtilsModule(b, target, optimize); + exe_mod.addImport("utils", utils_mod); + + const exe = b.addExecutable(.{ + .name = "main", + .root_module = exe_mod, + }); + + b.installArtifact(exe); + + const run_cmd = b.addRunArtifact(exe); + run_cmd.step.dependOn(b.getInstallStep()); + if (b.args) |args| { + run_cmd.addArgs(args); + } + + const run_step = b.step("run", "Run all hello algo zig"); + run_step.dependOn(&run_cmd.step); +} + +fn createUtilsModule(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.builtin.OptimizeMode) *std.Build.Module { + const utils_mod = b.createModule(.{ + .root_source_file = b.path("utils/utils.zig"), + .target = target, + .optimize = optimize, + }); + return utils_mod; +} + +fn addTestStepToExeModule(b: *std.Build, test_step: *std.Build.Step, exe_mod: *std.Build.Module, test_filters: []const []const u8) void { + const exe_unit_tests = b.addTest(.{ + .root_module = exe_mod, + .filters = test_filters, + }); + + const run_exe_unit_tests = b.addRunArtifact(exe_unit_tests); + test_step.dependOn(&run_exe_unit_tests.step); +} diff --git a/ru/codes/zig/chapter_array_and_linkedlist/array.zig b/ru/codes/zig/chapter_array_and_linkedlist/array.zig new file mode 100644 index 000000000..f36fd0365 --- /dev/null +++ b/ru/codes/zig/chapter_array_and_linkedlist/array.zig @@ -0,0 +1,131 @@ +// File: array.zig +// Created Time: 2023-01-07 +// Author: codingonion (coderonion@gmail.com), CreatorMetaSky (creator_meta_sky@163.com) + +const std = @import("std"); +const utils = @import("utils"); + +// Случайный доступ к элементу +pub fn randomAccess(nums: []const i32) i32 { + // Случайным образом выбрать целое число из интервала [0, nums.len) + const random_index = std.crypto.random.intRangeLessThan(usize, 0, nums.len); + // Получить и вернуть случайный элемент + const randomNum = nums[random_index]; + return randomNum; +} + +// Увеличить длину массива +pub fn extend(allocator: std.mem.Allocator, nums: []const i32, enlarge: usize) ![]i32 { + // Инициализировать массив увеличенной длины + const res = try allocator.alloc(i32, nums.len + enlarge); + @memset(res, 0); + + // Скопировать все элементы исходного массива в новый массив + std.mem.copyForwards(i32, res, nums); + + // Вернуть новый массив после расширения + return res; +} + +// Вставить элемент num по индексу index в массив +pub fn insert(nums: []i32, num: i32, index: usize) void { + // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад + var i = nums.len - 1; + while (i > index) : (i -= 1) { + nums[i] = nums[i - 1]; + } + // Присвоить num элементу по индексу index + nums[index] = num; +} + +// Удалить элемент по индексу index +pub fn remove(nums: []i32, index: usize) void { + // Сдвинуть все элементы после индекса index на одну позицию вперед + var i = index; + while (i < nums.len - 1) : (i += 1) { + nums[i] = nums[i + 1]; + } +} + +// Обход массива +pub fn traverse(nums: []const i32) void { + var count: i32 = 0; + + // Обход массива по индексам + var i: usize = 0; + while (i < nums.len) : (i += 1) { + count += nums[i]; + } + + // Непосредственно обходить элементы массива + count = 0; + for (nums) |num| { + count += num; + } + + // Одновременно обходить индексы и элементы данных + for (nums, 0..) |num, index| { + count += nums[index]; + count += num; + } +} + +// Найти заданный элемент в массиве +pub fn find(nums: []i32, target: i32) i32 { + for (nums, 0..) |num, i| { + if (num == target) return @intCast(i); + } + return -1; +} + +// Driver Code +pub fn run() !void { + // Инициализация массива + const arr = [_]i32{0} ** 5; + std.debug.print("Массив arr = {}\n", .{utils.fmt.slice(&arr)}); + + // Срез массива + var array = [_]i32{ 1, 3, 2, 5, 4 }; + var known_at_runtime_zero: usize = 0; + _ = &known_at_runtime_zero; + var nums = array[known_at_runtime_zero..array.len]; // Превратить указатель в срез через известную во время выполнения переменную known_at_runtime_zero + std.debug.print("Массив nums = {}\n", .{utils.fmt.slice(nums)}); + + // Случайный доступ + const randomNum = randomAccess(nums); + std.debug.print("Случайный элемент из nums = {}\n", .{randomNum}); + + // Инициализация аллокатора памяти + var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer arena.deinit(); + const allocator = arena.allocator(); + + // Расширение длины + nums = try extend(allocator, nums, 3); + std.debug.print("После расширения длины массива до 8 nums = {}\n", .{utils.fmt.slice(nums)}); + + // Вставка элемента + insert(nums, 6, 3); + std.debug.print("После вставки числа 6 по индексу 3 nums = {}\n", .{utils.fmt.slice(nums)}); + + // Удаление элемента + remove(nums, 2); + std.debug.print("После удаления элемента по индексу 2 nums = {}\n", .{utils.fmt.slice(nums)}); + + // Обход массива + traverse(nums); + + // Поиск элемента + const index = find(nums, 3); + std.debug.print("Поиск элемента 3 в nums: индекс = {}\n", .{index}); + + std.debug.print("\n", .{}); +} + +pub fn main() !void { + try run(); +} + +test "array" { + try run(); +} diff --git a/ru/codes/zig/chapter_array_and_linkedlist/linked_list.zig b/ru/codes/zig/chapter_array_and_linkedlist/linked_list.zig new file mode 100644 index 000000000..e9e3acd54 --- /dev/null +++ b/ru/codes/zig/chapter_array_and_linkedlist/linked_list.zig @@ -0,0 +1,96 @@ +// File: linked_list.zig +// Created Time: 2023-01-07 +// Author: codingonion (coderonion@gmail.com), CreatorMetaSky (creator_meta_sky@163.com) + +const std = @import("std"); +const utils = @import("utils"); +const ListNode = utils.ListNode; + +// Вставить узел P после узла n0 в связном списке +pub fn insert(comptime T: type, n0: *ListNode(T), P: *ListNode(T)) void { + const n1 = n0.next; + P.next = n1; + n0.next = P; +} + +// Удалить первый узел после узла n0 в связном списке +pub fn remove(comptime T: type, n0: *ListNode(T)) void { + // n0 -> P -> n1 => n0 -> n1 + const P = n0.next; + const n1 = P.?.next; + n0.next = n1; +} + +// Доступ к узлу связного списка по индексу index +pub fn access(comptime T: type, node: *ListNode(T), index: i32) ?*ListNode(T) { + var head: ?*ListNode(T) = node; + var i: i32 = 0; + while (i < index) : (i += 1) { + if (head) |cur| { + head = cur.next; + } else { + return null; + } + } + return head; +} + +// Найти в связном списке первый узел со значением target +pub fn find(comptime T: type, node: *ListNode(T), target: T) i32 { + var head: ?*ListNode(T) = node; + var index: i32 = 0; + while (head) |cur| { + if (cur.val == target) return index; + head = cur.next; + index += 1; + } + return -1; +} + +// Driver Code +pub fn run() void { + // Инициализация всех узлов + var n0 = ListNode(i32){ .val = 1 }; + var n1 = ListNode(i32){ .val = 3 }; + var n2 = ListNode(i32){ .val = 2 }; + var n3 = ListNode(i32){ .val = 5 }; + var n4 = ListNode(i32){ .val = 4 }; + // Построить ссылки между узлами + n0.next = &n1; + n1.next = &n2; + n2.next = &n3; + n3.next = &n4; + std.debug.print( + "Инициализированный связный список = {}\n",\n .{utils.fmt.linkedList(i32, &n0)},\n); + + // Вставка узла + var tmp = ListNode(i32){ .val = 0 }; + insert(i32, &n0, &tmp); + std.debug.print( + "Связный список после вставки узла = {}\n",\n .{utils.fmt.linkedList(i32, &n0)},\n); + + // Удаление узла + remove(i32, &n0); + std.debug.print( + "Связный список после удаления узла = {}\n",\n .{utils.fmt.linkedList(i32, &n0)},\n); + + // Доступ к узлу + const node = access(i32, &n0, 3); + std.debug.print( + "Значение узла по индексу 3 в связном списке = {}\n",\n .{node.?.val},\n); + + // Поиск узла + const index = find(i32, &n0, 2); + std.debug.print( + "Индекс узла со значением 2 в связном списке = {}\n",\n .{index},\n); + + std.debug.print("\n", .{}); +} + +pub fn main() void { + run(); +} + +test "linked_list" { + run(); +} diff --git a/ru/codes/zig/chapter_array_and_linkedlist/list.zig b/ru/codes/zig/chapter_array_and_linkedlist/list.zig new file mode 100644 index 000000000..819e5aa3f --- /dev/null +++ b/ru/codes/zig/chapter_array_and_linkedlist/list.zig @@ -0,0 +1,78 @@ +// File: list.zig +// Created Time: 2023-01-07 +// Author: codingonion (coderonion@gmail.com), CreatorMetaSky (creator_meta_sky@163.com) + +const std = @import("std"); +const utils = @import("utils"); + +// Driver Code +pub fn run() !void { + // Инициализация списка + var nums = std.ArrayList(i32).init(std.heap.page_allocator); + defer nums.deinit(); // Отложенное освобождение памяти + + try nums.appendSlice(&[_]i32{ 1, 3, 2, 5, 4 }); + std.debug.print("Список nums = {}\n", .{utils.fmt.slice(nums.items)}); + + // Доступ к элементу + const num = nums.items[1]; + std.debug.print("Элемент по индексу 1: num = {}\n", .{num}); + + // Обновление элемента + nums.items[1] = 0; + std.debug.print("После обновления элемента по индексу 1 до 0 nums = {}\n", .{utils.fmt.slice(nums.items)}); + + // Очистить список + nums.clearRetainingCapacity(); + std.debug.print("После очистки списка nums = {}\n", .{utils.fmt.slice(nums.items)}); + + // Добавление элемента в конец + try nums.append(1); + try nums.append(3); + try nums.append(2); + try nums.append(5); + try nums.append(4); + std.debug.print("После добавления элементов nums = {}\n", .{utils.fmt.slice(nums.items)}); + + // Вставка элемента в середину + try nums.insert(3, 6); + std.debug.print("После вставки числа 6 по индексу 3 nums = {}\n", .{utils.fmt.slice(nums.items)}); + + // Удаление элемента + _ = nums.orderedRemove(3); + std.debug.print("После удаления элемента по индексу 3 nums = {}\n", .{utils.fmt.slice(nums.items)}); + + // Обходить список по индексам + var count: i32 = 0; + var i: usize = 0; + while (i < nums.items.len) : (i += 1) { + count += nums.items[i]; + } + + // Непосредственно обходить элементы списка + count = 0; + for (nums.items) |x| { + count += x; + } + + // Объединить два списка + var nums1 = std.ArrayList(i32).init(std.heap.page_allocator); + defer nums1.deinit(); + try nums1.appendSlice(&[_]i32{ 6, 8, 7, 10, 9 }); + try nums.insertSlice(nums.items.len, nums1.items); + std.debug.print("После конкатенации списка nums1 к nums nums = {}\n", .{utils.fmt.slice(nums.items)}); + + // Отсортировать список + std.mem.sort(i32, nums.items, {}, comptime std.sort.asc(i32)); + std.debug.print("После сортировки списка nums = {}\n", .{utils.fmt.slice(nums.items)}); + + std.debug.print("\n", .{}); +} + +pub fn main() !void { + try run(); +} + +test "list" { + try run(); +} diff --git a/ru/codes/zig/chapter_array_and_linkedlist/my_list.zig b/ru/codes/zig/chapter_array_and_linkedlist/my_list.zig new file mode 100644 index 000000000..64af5de03 --- /dev/null +++ b/ru/codes/zig/chapter_array_and_linkedlist/my_list.zig @@ -0,0 +1,217 @@ +// File: my_list.zig +// Created Time: 2023-01-08 +// Author: codingonion (coderonion@gmail.com), CreatorMetaSky (creator_meta_sky@163.com) + +const std = @import("std"); +const utils = @import("utils"); + +// Класс списка +const MyList = struct { + const Self = @This(); + + items: []i32, // Массив (для хранения элементов списка) + capacity: usize, // Вместимость списка + allocator: std.mem.Allocator, // Аллокатор памяти + + extend_ratio: usize = 2, // Коэффициент увеличения списка при каждом расширении + + // Конструктор (выделение памяти + инициализация списка) + pub fn init(allocator: std.mem.Allocator) Self { + return Self{ + .items = &[_]i32{}, + .capacity = 0, + .allocator = allocator, + }; + } + + // Деструктор (освобождение памяти) + pub fn deinit(self: Self) void { + self.allocator.free(self.allocatedSlice()); + } + + // Добавление элемента в конец + pub fn add(self: *Self, item: i32) !void { + // При превышении вместимости по числу элементов запускается расширение + const newlen = self.items.len + 1; + try self.ensureTotalCapacity(newlen); + + // Обновление элемента + self.items.len += 1; + const new_item_ptr = &self.items[self.items.len - 1]; + new_item_ptr.* = item; + } + + // Получить длину списка (текущее число элементов) + pub fn getSize(self: *Self) usize { + return self.items.len; + } + + // Получить вместимость списка + pub fn getCapacity(self: *Self) usize { + return self.capacity; + } + + // Доступ к элементу + pub fn get(self: *Self, index: usize) i32 { + // Если индекс выходит за границы, выбрасывается исключение; далее аналогично + if (index < 0 or index >= self.items.len) { + @panic("индекс выходит за границы"); + } + return self.items[index]; + } + + // Обновление элемента + pub fn set(self: *Self, index: usize, num: i32) void { + // Если индекс выходит за границы, выбрасывается исключение; далее аналогично + if (index < 0 or index >= self.items.len) { + @panic("индекс выходит за границы"); + } + self.items[index] = num; + } + + // Вставка элемента в середину + pub fn insert(self: *Self, index: usize, item: i32) !void { + if (index < 0 or index >= self.items.len) { + @panic("индекс выходит за границы"); + } + + // При превышении вместимости по числу элементов запускается расширение + const newlen = self.items.len + 1; + try self.ensureTotalCapacity(newlen); + + // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад + self.items.len += 1; + var i = self.items.len - 1; + while (i >= index) : (i -= 1) { + self.items[i] = self.items[i - 1]; + } + self.items[index] = item; + } + + // Удаление элемента + pub fn remove(self: *Self, index: usize) i32 { + if (index < 0 or index >= self.getSize()) { + @panic("индекс выходит за границы"); + } + // Сдвинуть все элементы после индекса index на одну позицию вперед + const item = self.items[index]; + var i = index; + while (i < self.items.len - 1) : (i += 1) { + self.items[i] = self.items[i + 1]; + } + self.items.len -= 1; + // Вернуть удаленный элемент + return item; + } + + // Преобразовать список в массив + pub fn toArraySlice(self: *Self) ![]i32 { + return self.toOwnedSlice(false); + } + + // Вернуть новый срез и указать, нужно ли сбросить или очистить контейнер списка + pub fn toOwnedSlice(self: *Self, clear: bool) ![]i32 { + const allocator = self.allocator; + const old_memory = self.allocatedSlice(); + if (allocator.remap(old_memory, self.items.len)) |new_items| { + if (clear) { + self.* = init(allocator); + } + return new_items; + } + + const new_memory = try allocator.alloc(i32, self.items.len); + @memcpy(new_memory, self.items); + if (clear) { + self.clearAndFree(); + } + return new_memory; + } + + // Расширение списка + fn ensureTotalCapacity(self: *Self, new_capacity: usize) !void { + if (self.capacity >= new_capacity) return; + const capcacity = if (self.capacity == 0) 10 else self.capacity; + const better_capacity = capcacity * self.extend_ratio; + + const old_memory = self.allocatedSlice(); + if (self.allocator.remap(old_memory, better_capacity)) |new_memory| { + self.items.ptr = new_memory.ptr; + self.capacity = new_memory.len; + } else { + const new_memory = try self.allocator.alloc(i32, better_capacity); + @memcpy(new_memory[0..self.items.len], self.items); + self.allocator.free(old_memory); + self.items.ptr = new_memory.ptr; + self.capacity = new_memory.len; + } + } + + fn clearAndFree(self: *Self, allocator: std.mem.Allocator) void { + allocator.free(self.allocatedSlice()); + self.items.len = 0; + self.capacity = 0; + } + + fn allocatedSlice(self: Self) []i32 { + return self.items.ptr[0..self.capacity]; + } +}; + +// Driver Code +pub fn run() !void { + var gpa = std.heap.DebugAllocator(.{}){}; + defer _ = gpa.deinit(); + const allocator = gpa.allocator(); + + // Инициализация списка + var nums = MyList.init(allocator); + // Отложенное освобождение памяти + defer nums.deinit(); + + // Добавление элемента в конец + try nums.add(1); + try nums.add(3); + try nums.add(2); + try nums.add(5); + try nums.add(4); + std.debug.print("Список nums = {}, вместимость = {}, длина = {}\n", .{\n utils.fmt.slice(nums.items),\n nums.getCapacity(),\n nums.getSize(),\n}); + + // Вставка элемента в середину + try nums.insert(3, 6); + std.debug.print( + "После вставки числа 6 по индексу 3 получаем nums = {}\n",\n .{utils.fmt.slice(nums.items)},\n); + + // Удаление элемента + _ = nums.remove(3); + std.debug.print( + "После удаления элемента по индексу 3 получаем nums = {}\n",\n .{utils.fmt.slice(nums.items)},\n); + + // Доступ к элементу + const num = nums.get(1); + std.debug.print("Элемент по индексу 1: num = {}\n", .{num}); + + // Обновление элемента + nums.set(1, 0); + std.debug.print( + "После обновления элемента по индексу 1 значением 0 получаем nums = {}\n",\n .{utils.fmt.slice(nums.items)},\n); + + // Проверка механизма расширения + var i: i32 = 0; + while (i < 10) : (i += 1) { + // При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения + try nums.add(i); + } + std.debug.print( + "Список nums после увеличения вместимости = {}, вместимость = {}, длина = {}\n",\n .{\n utils.fmt.slice(nums.items),\n nums.getCapacity(),\n nums.getSize(),\n },\n); + + std.debug.print("\n", .{}); +} + +pub fn main() !void { + try run(); +} + +test "my_list" { + try run(); +} diff --git a/ru/codes/zig/chapter_computational_complexity/iteration.zig b/ru/codes/zig/chapter_computational_complexity/iteration.zig new file mode 100644 index 000000000..724b91766 --- /dev/null +++ b/ru/codes/zig/chapter_computational_complexity/iteration.zig @@ -0,0 +1,91 @@ +// File: iteration.zig +// Created Time: 2023-09-27 +// Author: QiLOL (pikaqqpika@gmail.com), CreatorMetaSky (creator_meta_sky@163.com) + +const std = @import("std"); +const Allocator = std.mem.Allocator; + +// Цикл for +fn forLoop(n: usize) i32 { + var res: i32 = 0; + // Циклическое суммирование 1, 2, ..., n-1, n + for (1..n + 1) |i| { + res += @intCast(i); + } + return res; +} + +// Цикл while +fn whileLoop(n: i32) i32 { + var res: i32 = 0; + var i: i32 = 1; // Инициализация условной переменной + // Циклическое суммирование 1, 2, ..., n-1, n + while (i <= n) : (i += 1) { + res += @intCast(i); + } + return res; +} + +// Цикл while (двойное обновление) +fn whileLoopII(n: i32) i32 { + var res: i32 = 0; + var i: i32 = 1; // Инициализация условной переменной + // Циклическое суммирование 1, 4, 10, ... + while (i <= n) : ({ + // Обновить условную переменную + i += 1; + i *= 2; + }) { + res += @intCast(i); + } + return res; +} + +// Двойной цикл for +fn nestedForLoop(allocator: Allocator, n: usize) ![]const u8 { + var res = std.ArrayList(u8).init(allocator); + defer res.deinit(); + var buffer: [20]u8 = undefined; + // Цикл по i = 1, 2, ..., n-1, n + for (1..n + 1) |i| { + // Цикл по j = 1, 2, ..., n-1, n + for (1..n + 1) |j| { + const str = try std.fmt.bufPrint(&buffer, "({d}, {d}), ", .{ i, j }); + try res.appendSlice(str); + } + } + return res.toOwnedSlice(); +} + +// Driver Code +pub fn run() !void { + var gpa = std.heap.DebugAllocator(.{}){}; + defer _ = gpa.deinit(); + const allocator = gpa.allocator(); + + const n: i32 = 5; + var res: i32 = 0; + + res = forLoop(n); + std.debug.print("Результат суммирования в цикле for res = {}\n", .{res}); + + res = whileLoop(n); + std.debug.print("Результат суммирования в цикле while res = {}\n", .{res}); + + res = whileLoopII(n); + std.debug.print("Результат суммирования в цикле while (двойное обновление) res = {}\n", .{res}); + + const resStr = try nestedForLoop(allocator, n); + std.debug.print("Результат обхода в двойном цикле for {s}\n", .{resStr}); + allocator.free(resStr); + + std.debug.print("\n", .{}); +} + +pub fn main() !void { + try run(); +} + +test "interation" { + try run(); +} diff --git a/ru/codes/zig/chapter_computational_complexity/recursion.zig b/ru/codes/zig/chapter_computational_complexity/recursion.zig new file mode 100644 index 000000000..9e9a40505 --- /dev/null +++ b/ru/codes/zig/chapter_computational_complexity/recursion.zig @@ -0,0 +1,88 @@ +// File: recursion.zig +// Created Time: 2023-09-27 +// Author: QiLOL (pikaqqpika@gmail.com), CreatorMetaSky (creator_meta_sky@163.com) + +const std = @import("std"); + +// Рекурсивная функция +fn recur(n: i32) i32 { + // Условие завершения + if (n == 1) { + return 1; + } + // Рекурсия: рекурсивный вызов + const res = recur(n - 1); + // Возврат: вернуть результат + return n + res; +} + +// Имитация рекурсии итерацией +fn forLoopRecur(comptime n: i32) i32 { + // Использовать явный стек для имитации системного стека вызовов + var stack: [n]i32 = undefined; + var res: i32 = 0; + // Рекурсия: рекурсивный вызов + var i: usize = n; + while (i > 0) { + stack[i - 1] = @intCast(i); + i -= 1; + } + // Возврат: вернуть результат + var index: usize = n; + while (index > 0) { + index -= 1; + res += stack[index]; + } + // res = 1+2+3+...+n + return res; +} + +// Хвосторекурсивная функция +fn tailRecur(n: i32, res: i32) i32 { + // Условие завершения + if (n == 0) { + return res; + } + // Хвостовой рекурсивный вызов + return tailRecur(n - 1, res + n); +} + +// Числа Фибоначчи +fn fib(n: i32) i32 { + // Условие завершения: f(1) = 0, f(2) = 1 + if (n == 1 or n == 2) { + return n - 1; + } + // Рекурсивный вызов f(n) = f(n-1) + f(n-2) + const res: i32 = fib(n - 1) + fib(n - 2); + // Вернуть результат f(n) + return res; +} + +// Driver Code +pub fn run() void { + const n: i32 = 5; + var res: i32 = 0; + + res = recur(n); + std.debug.print("Результат суммирования в рекурсивной функции res = {}\n", .{recur(n)}); + + res = forLoopRecur(n); + std.debug.print("Результат суммирования при имитации рекурсии итерацией res = {}\n", .{forLoopRecur(n)}); + + res = tailRecur(n, 0); + std.debug.print("Результат суммирования в хвостовой рекурсии res = {}\n", .{tailRecur(n, 0)}); + + res = fib(n); + std.debug.print("Член последовательности Фибоначчи с номером {} = {}\n", .{ n, fib(n) }); + + std.debug.print("\n", .{}); +} + +pub fn main() void { + run(); +} + +test "recursion" { + run(); +} diff --git a/ru/codes/zig/chapter_computational_complexity/space_complexity.zig b/ru/codes/zig/chapter_computational_complexity/space_complexity.zig new file mode 100644 index 000000000..035f7b8f0 --- /dev/null +++ b/ru/codes/zig/chapter_computational_complexity/space_complexity.zig @@ -0,0 +1,142 @@ +// File: space_complexity.zig +// Created Time: 2023-01-07 +// Author: codingonion (coderonion@gmail.com), CreatorMetaSky (creator_meta_sky@163.com) + +const std = @import("std"); +const utils = @import("utils"); +const ListNode = utils.ListNode; +const TreeNode = utils.TreeNode; + +// Функция +fn function() i32 { + // Выполнить некоторые операции + return 0; +} + +// Постоянная сложность +fn constant(n: i32) void { + // Константы, переменные и объекты занимают O(1) памяти + const a: i32 = 0; + const b: i32 = 0; + const nums = [_]i32{0} ** 10000; + const node = ListNode(i32){ .val = 0 }; + var i: i32 = 0; + // Переменные в цикле занимают O(1) памяти + while (i < n) : (i += 1) { + const c: i32 = 0; + _ = c; + } + // Функции в цикле занимают O(1) памяти + i = 0; + while (i < n) : (i += 1) { + _ = function(); + } + _ = a; + _ = b; + _ = nums; + _ = node; +} + +// Линейная сложность +fn linear(comptime n: i32) !void { + // Массив длины n занимает O(n) памяти + const nums = [_]i32{0} ** n; + // Список длины n занимает O(n) памяти + var nodes = std.ArrayList(i32).init(std.heap.page_allocator); + defer nodes.deinit(); + var i: i32 = 0; + while (i < n) : (i += 1) { + try nodes.append(i); + } + // Хеш-таблица длины n занимает O(n) памяти + var map = std.AutoArrayHashMap(i32, []const u8).init(std.heap.page_allocator); + defer map.deinit(); + var j: i32 = 0; + while (j < n) : (j += 1) { + const string = try std.fmt.allocPrint(std.heap.page_allocator, "{d}", .{j}); + defer std.heap.page_allocator.free(string); + try map.put(i, string); + } + _ = nums; +} + +// Линейная сложность (рекурсивная реализация) +fn linearRecur(comptime n: i32) void { + std.debug.print("Рекурсия n = {}\n", .{n}); + if (n == 1) return; + linearRecur(n - 1); +} + +// Квадратичная сложность +fn quadratic(n: i32) !void { + // Двумерный список занимает O(n^2) памяти + var nodes = std.ArrayList(std.ArrayList(i32)).init(std.heap.page_allocator); + defer nodes.deinit(); + var i: i32 = 0; + while (i < n) : (i += 1) { + var tmp = std.ArrayList(i32).init(std.heap.page_allocator); + defer tmp.deinit(); + var j: i32 = 0; + while (j < n) : (j += 1) { + try tmp.append(0); + } + try nodes.append(tmp); + } +} + +// Квадратичная сложность (рекурсивная реализация) +fn quadraticRecur(comptime n: i32) i32 { + if (n <= 0) return 0; + const nums = [_]i32{0} ** n; + std.debug.print("В рекурсии n = {} длина nums = {}\n", .{ n, nums.len }); + return quadraticRecur(n - 1); +} + +// Экспоненциальная сложность (построение полного двоичного дерева) +fn buildTree(allocator: std.mem.Allocator, n: i32) !?*TreeNode(i32) { + if (n == 0) return null; + const root = try allocator.create(TreeNode(i32)); + root.init(0); + root.left = try buildTree(allocator, n - 1); + root.right = try buildTree(allocator, n - 1); + return root; +} + +// Освободить память дерева +fn freeTree(allocator: std.mem.Allocator, root: ?*const TreeNode(i32)) void { + if (root == null) return; + freeTree(allocator, root.?.left); + freeTree(allocator, root.?.right); + allocator.destroy(root.?); +} + +// Driver Code +pub fn run() !void { + var gpa = std.heap.DebugAllocator(.{}){}; + defer _ = gpa.deinit(); + const allocator = gpa.allocator(); + + const n: i32 = 5; + // Постоянная сложность + constant(n); + // Линейная сложность + try linear(n); + linearRecur(n); + // Квадратичная сложность + try quadratic(n); + _ = quadraticRecur(n); + // Экспоненциальная сложность + const root = try buildTree(allocator, n); + defer freeTree(allocator, root); + std.debug.print("{}\n", .{utils.fmt.tree(i32, root)}); + + std.debug.print("\n", .{}); +} + +pub fn main() !void { + try run(); +} + +test "space_complexity" { + try run(); +} diff --git a/ru/codes/zig/chapter_computational_complexity/time_complexity.zig b/ru/codes/zig/chapter_computational_complexity/time_complexity.zig new file mode 100644 index 000000000..2e2e02118 --- /dev/null +++ b/ru/codes/zig/chapter_computational_complexity/time_complexity.zig @@ -0,0 +1,184 @@ +// File: time_complexity.zig +// Created Time: 2022-12-28 +// Author: codingonion (coderonion@gmail.com), CreatorMetaSky (creator_meta_sky@163.com) + +const std = @import("std"); + +// Постоянная сложность +fn constant(n: i32) i32 { + _ = n; + var count: i32 = 0; + const size: i32 = 100_000; + var i: i32 = 0; + while (i < size) : (i += 1) { + count += 1; + } + return count; +} + +// Линейная сложность +fn linear(n: i32) i32 { + var count: i32 = 0; + var i: i32 = 0; + while (i < n) : (i += 1) { + count += 1; + } + return count; +} + +// Линейная сложность (обход массива) +fn arrayTraversal(nums: []i32) i32 { + var count: i32 = 0; + // Число итераций пропорционально длине массива + for (nums) |_| { + count += 1; + } + return count; +} + +// Квадратичная сложность +fn quadratic(n: i32) i32 { + var count: i32 = 0; + var i: i32 = 0; + // Число итераций квадратично зависит от размера данных n + while (i < n) : (i += 1) { + var j: i32 = 0; + while (j < n) : (j += 1) { + count += 1; + } + } + return count; +} + +// Квадратичная сложность (пузырьковая сортировка) +fn bubbleSort(nums: []i32) i32 { + var count: i32 = 0; // Счетчик + // Внешний цикл: неотсортированный диапазон [0, i] + var i: i32 = @as(i32, @intCast(nums.len)) - 1; + while (i > 0) : (i -= 1) { + var j: usize = 0; + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + while (j < i) : (j += 1) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + const tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + count += 3; // Обмен элементов включает 3 элементарные операции + } + } + } + return count; +} + +// Экспоненциальная сложность (итеративная реализация) +fn exponential(n: i32) i32 { + var count: i32 = 0; + var bas: i32 = 1; + var i: i32 = 0; + // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1) + while (i < n) : (i += 1) { + var j: i32 = 0; + while (j < bas) : (j += 1) { + count += 1; + } + bas *= 2; + } + // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1 + return count; +} + +// Экспоненциальная сложность (рекурсивная реализация) +fn expRecur(n: i32) i32 { + if (n == 1) return 1; + return expRecur(n - 1) + expRecur(n - 1) + 1; +} + +// Логарифмическая сложность (итеративная реализация) +fn logarithmic(n: i32) i32 { + var count: i32 = 0; + var n_var: i32 = n; + while (n_var > 1) : (n_var = @divTrunc(n_var, 2)) { + count += 1; + } + return count; +} + +// Логарифмическая сложность (рекурсивная реализация) +fn logRecur(n: i32) i32 { + if (n <= 1) return 0; + return logRecur(@divTrunc(n, 2)) + 1; +} + +// Линейно-логарифмическая сложность +fn linearLogRecur(n: i32) i32 { + if (n <= 1) return 1; + var count: i32 = linearLogRecur(@divTrunc(n, 2)) + linearLogRecur(@divTrunc(n, 2)); + var i: i32 = 0; + while (i < n) : (i += 1) { + count += 1; + } + return count; +} + +// Факториальная сложность (рекурсивная реализация) +fn factorialRecur(n: i32) i32 { + if (n == 0) return 1; + var count: i32 = 0; + var i: i32 = 0; + // Из одного получается n + while (i < n) : (i += 1) { + count += factorialRecur(n - 1); + } + return count; +} + +// Driver Code +pub fn run() void { + // Можно изменить n и запустить программу, чтобы увидеть, как меняется число операций при разных сложностях + const n: i32 = 8; + std.debug.print("Размер входных данных n = {}\n", .{n}); + + var count = constant(n); + std.debug.print("Число операций постоянной сложности = {}\n", .{count}); + + count = linear(n); + std.debug.print("Число операций линейной сложности = {}\n", .{count}); + var nums = [_]i32{0} ** n; + count = arrayTraversal(&nums); + std.debug.print("Число операций линейной сложности (обход массива) = {}\n", .{count}); + + count = quadratic(n); + std.debug.print("Число операций квадратичной сложности = {}\n", .{count}); + for (&nums, 0..) |*num, i| { + num.* = n - @as(i32, @intCast(i)); // [n,n-1,...,2,1] + } + count = bubbleSort(&nums); + std.debug.print("Число операций квадратичной сложности (пузырьковая сортировка) = {}\n", .{count}); + + count = exponential(n); + std.debug.print("Число операций экспоненциальной сложности (итеративная реализация) = {}\n", .{count}); + count = expRecur(n); + std.debug.print("Число операций экспоненциальной сложности (рекурсивная реализация) = {}\n", .{count}); + + count = logarithmic(n); + std.debug.print("Число операций логарифмической сложности (итеративная реализация) = {}\n", .{count}); + count = logRecur(n); + std.debug.print("Число операций логарифмической сложности (рекурсивная реализация) = {}\n", .{count}); + + count = linearLogRecur(n); + std.debug.print("Число операций линейно-логарифмической сложности (рекурсивная реализация) = {}\n", .{count}); + + count = factorialRecur(n); + std.debug.print("Число операций факториальной сложности (рекурсивная реализация) = {}\n", .{count}); + + std.debug.print("\n", .{}); +} + +pub fn main() !void { + run(); +} + +test "time_complexity" { + run(); +} diff --git a/ru/codes/zig/chapter_computational_complexity/worst_best_time_complexity.zig b/ru/codes/zig/chapter_computational_complexity/worst_best_time_complexity.zig new file mode 100644 index 000000000..d3270280c --- /dev/null +++ b/ru/codes/zig/chapter_computational_complexity/worst_best_time_complexity.zig @@ -0,0 +1,53 @@ +// File: worst_best_time_complexity.zig +// Created Time: 2022-12-28 +// Author: codingonion (coderonion@gmail.com), CreatorMetaSky (creator_meta_sky@163.com) + +const std = @import("std"); +const utils = @import("utils"); + +// Создать массив с элементами { 1, 2, ..., n } в случайном порядке +pub fn randomNumbers(comptime n: usize) [n]i32 { + var nums: [n]i32 = undefined; + // Создать массив nums = { 1, 2, 3, ..., n } + for (&nums, 0..) |*num, i| { + num.* = @as(i32, @intCast(i)) + 1; + } + // Случайно перемешать элементы массива + const rand = std.crypto.random; + rand.shuffle(i32, &nums); + return nums; +} + +// Найти индекс числа 1 в массиве nums +pub fn findOne(nums: []i32) i32 { + for (nums, 0..) |num, i| { + // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1) + // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n) + if (num == 1) return @intCast(i); + } + return -1; +} + +// Driver Code +pub fn run() void { + var i: i32 = 0; + while (i < 10) : (i += 1) { + const n: usize = 100; + var nums = randomNumbers(n); + const index = findOne(&nums); + std.debug.print("После перемешивания массива [ 1, 2, ..., n ] = ", .{}); + std.debug.print("{}\n", .{utils.fmt.slice(nums)}); + + std.debug.print("Индекс числа 1 = {}\n", .{index}); + } + + std.debug.print("\n", .{}); +} + +pub fn main() !void { + run(); +} + +test "worst_best_time_complexity" { + run(); +} diff --git a/ru/codes/zig/chapter_dynamic_programming/climbing_stairs_backtrack.zig b/ru/codes/zig/chapter_dynamic_programming/climbing_stairs_backtrack.zig new file mode 100644 index 000000000..494a5d77b --- /dev/null +++ b/ru/codes/zig/chapter_dynamic_programming/climbing_stairs_backtrack.zig @@ -0,0 +1,44 @@ +// File: climbing_stairs_backtrack.zig +// Created Time: 2023-07-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); + +// Бэктрекинг +fn backtrack(choices: []i32, state: i32, n: i32, res: std.ArrayList(i32)) void { + // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1 + if (state == n) { + res.items[0] = res.items[0] + 1; + } + // Перебор всех вариантов выбора + for (choices) |choice| { + // Отсечение: нельзя выходить за n-ю ступень + if (state + choice > n) { + continue; + } + // Попытка: сделать выбор и обновить состояние + backtrack(choices, state + choice, n, res); + // Откат + } +} + +// Подъем по лестнице: бэктрекинг +fn climbingStairsBacktrack(n: usize) !i32 { + var choices = [_]i32{ 1, 2 }; // Можно подняться на 1 или 2 ступени + var state: i32 = 0; // Начать подъем с 0-й ступени + var res = std.ArrayList(i32).init(std.heap.page_allocator); + defer res.deinit(); + try res.append(0); // Использовать res[0] для хранения числа решений + backtrack(&choices, state, @intCast(n), res); + return res.items[0]; +} + +// Driver Code +pub fn main() !void { + var n: usize = 9; + + var res = try climbingStairsBacktrack(n); + std.debug.print("Количество способов подняться по лестнице из {} ступеней: {} вариантов\n", .{ n, res }); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_dynamic_programming/climbing_stairs_constraint_dp.zig b/ru/codes/zig/chapter_dynamic_programming/climbing_stairs_constraint_dp.zig new file mode 100644 index 000000000..82ac11dc4 --- /dev/null +++ b/ru/codes/zig/chapter_dynamic_programming/climbing_stairs_constraint_dp.zig @@ -0,0 +1,35 @@ +// File: climbing_stairs_constraint_dp.zig +// Created Time: 2023-07-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); + +// Подъем по лестнице с ограничениями: динамическое программирование +fn climbingStairsConstraintDP(comptime n: usize) i32 { + if (n == 1 or n == 2) { + return 1; + } + // Инициализация таблицы dp для хранения решений подзадач + var dp = [_][3]i32{ [_]i32{ -1, -1, -1 } } ** (n + 1); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1][1] = 1; + dp[1][2] = 0; + dp[2][1] = 0; + dp[2][2] = 1; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (3..n + 1) |i| { + dp[i][1] = dp[i - 1][2]; + dp[i][2] = dp[i - 2][1] + dp[i - 2][2]; + } + return dp[n][1] + dp[n][2]; +} + +// Driver Code +pub fn main() !void { + comptime var n: usize = 9; + + var res = climbingStairsConstraintDP(n); + std.debug.print("Количество способов подняться по лестнице из {} ступеней: {} вариантов\n", .{ n, res }); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_dynamic_programming/climbing_stairs_dfs.zig b/ru/codes/zig/chapter_dynamic_programming/climbing_stairs_dfs.zig new file mode 100644 index 000000000..7e4740c9f --- /dev/null +++ b/ru/codes/zig/chapter_dynamic_programming/climbing_stairs_dfs.zig @@ -0,0 +1,31 @@ +// File: climbing_stairs_dfs.zig +// Created Time: 2023-07-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); + +// Поиск +fn dfs(i: usize) i32 { + // dp[1] и dp[2] уже известны, вернуть их + if (i == 1 or i == 2) { + return @intCast(i); + } + // dp[i] = dp[i-1] + dp[i-2] + var count = dfs(i - 1) + dfs(i - 2); + return count; +} + +// Подъем по лестнице: поиск +fn climbingStairsDFS(comptime n: usize) i32 { + return dfs(n); +} + +// Driver Code +pub fn main() !void { + comptime var n: usize = 9; + + var res = climbingStairsDFS(n); + std.debug.print("Количество способов подняться по лестнице из {} ступеней: {} вариантов\n", .{ n, res }); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_dynamic_programming/climbing_stairs_dfs_mem.zig b/ru/codes/zig/chapter_dynamic_programming/climbing_stairs_dfs_mem.zig new file mode 100644 index 000000000..dd4b08d99 --- /dev/null +++ b/ru/codes/zig/chapter_dynamic_programming/climbing_stairs_dfs_mem.zig @@ -0,0 +1,39 @@ +// File: climbing_stairs_dfs_mem.zig +// Created Time: 2023-07-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); + +// Поиск с мемоизацией +fn dfs(i: usize, mem: []i32) i32 { + // dp[1] и dp[2] уже известны, вернуть их + if (i == 1 or i == 2) { + return @intCast(i); + } + // Если запись dp[i] существует, сразу вернуть ее + if (mem[i] != -1) { + return mem[i]; + } + // dp[i] = dp[i-1] + dp[i-2] + var count = dfs(i - 1, mem) + dfs(i - 2, mem); + // Сохранить dp[i] + mem[i] = count; + return count; +} + +// Подъем по лестнице: поиск с мемоизацией +fn climbingStairsDFSMem(comptime n: usize) i32 { + // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи + var mem = [_]i32{ -1 } ** (n + 1); + return dfs(n, &mem); +} + +// Driver Code +pub fn main() !void { + comptime var n: usize = 9; + + var res = climbingStairsDFSMem(n); + std.debug.print("Количество способов подняться по лестнице из {} ступеней: {} вариантов\n", .{ n, res }); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_dynamic_programming/climbing_stairs_dp.zig b/ru/codes/zig/chapter_dynamic_programming/climbing_stairs_dp.zig new file mode 100644 index 000000000..c4207c727 --- /dev/null +++ b/ru/codes/zig/chapter_dynamic_programming/climbing_stairs_dp.zig @@ -0,0 +1,51 @@ +// File: climbing_stairs_dp.zig +// Created Time: 2023-07-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); + +// Подъем по лестнице: динамическое программирование +fn climbingStairsDP(comptime n: usize) i32 { + // dp[1] и dp[2] уже известны, вернуть их + if (n == 1 or n == 2) { + return @intCast(n); + } + // Инициализация таблицы dp для хранения решений подзадач + var dp = [_]i32{-1} ** (n + 1); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = 1; + dp[2] = 2; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (3..n + 1) |i| { + dp[i] = dp[i - 1] + dp[i - 2]; + } + return dp[n]; +} + +// Подъем по лестнице: динамическое программирование с оптимизацией памяти +fn climbingStairsDPComp(comptime n: usize) i32 { + if (n == 1 or n == 2) { + return @intCast(n); + } + var a: i32 = 1; + var b: i32 = 2; + for (3..n + 1) |_| { + var tmp = b; + b = a + b; + a = tmp; + } + return b; +} + +// Driver Code +pub fn main() !void { + comptime var n: usize = 9; + + var res = climbingStairsDP(n); + std.debug.print("Количество способов подняться по лестнице из {} ступеней: {} вариантов\n", .{ n, res }); + + res = climbingStairsDPComp(n); + std.debug.print("Количество способов подняться по лестнице из {} ступеней: {} вариантов\n", .{ n, res }); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_dynamic_programming/coin_change.zig b/ru/codes/zig/chapter_dynamic_programming/coin_change.zig new file mode 100644 index 000000000..ef29d4750 --- /dev/null +++ b/ru/codes/zig/chapter_dynamic_programming/coin_change.zig @@ -0,0 +1,77 @@ +// File: coin_change.zig +// Created Time: 2023-07-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); + +// Размен монет: динамическое программирование +fn coinChangeDP(comptime coins: []i32, comptime amt: usize) i32 { + comptime var n = coins.len; + comptime var max = amt + 1; + // Инициализация таблицы dp + var dp = [_][amt + 1]i32{[_]i32{0} ** (amt + 1)} ** (n + 1); + // Переход состояний: первая строка и первый столбец + for (1..amt + 1) |a| { + dp[0][a] = max; + } + // Переход состояний: остальные строки и столбцы + for (1..n + 1) |i| { + for (1..amt + 1) |a| { + if (coins[i - 1] > @as(i32, @intCast(a))) { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[i][a] = @min(dp[i - 1][a], dp[i][a - @as(usize, @intCast(coins[i - 1]))] + 1); + } + } + } + if (dp[n][amt] != max) { + return @intCast(dp[n][amt]); + } else { + return -1; + } +} + +// Размен монет: динамическое программирование с оптимизацией памяти +fn coinChangeDPComp(comptime coins: []i32, comptime amt: usize) i32 { + comptime var n = coins.len; + comptime var max = amt + 1; + // Инициализация таблицы dp + var dp = [_]i32{0} ** (amt + 1); + @memset(&dp, max); + dp[0] = 0; + // Переход состояний + for (1..n + 1) |i| { + for (1..amt + 1) |a| { + if (coins[i - 1] > @as(i32, @intCast(a))) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[a] = @min(dp[a], dp[a - @as(usize, @intCast(coins[i - 1]))] + 1); + } + } + } + if (dp[amt] != max) { + return @intCast(dp[amt]); + } else { + return -1; + } +} + +// Driver Code +pub fn main() !void { + comptime var coins = [_]i32{ 1, 2, 5 }; + comptime var amt: usize = 4; + + // Динамическое программирование + var res = coinChangeDP(&coins, amt); + std.debug.print("Минимальное число монет для набора целевой суммы = {}\n", .{res}); + + // Динамическое программирование с оптимизацией памяти + res = coinChangeDPComp(&coins, amt); + std.debug.print("Минимальное число монет для набора целевой суммы = {}\n", .{res}); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_dynamic_programming/coin_change_ii.zig b/ru/codes/zig/chapter_dynamic_programming/coin_change_ii.zig new file mode 100644 index 000000000..9388f960d --- /dev/null +++ b/ru/codes/zig/chapter_dynamic_programming/coin_change_ii.zig @@ -0,0 +1,66 @@ +// File: coin_change_ii.zig +// Created Time: 2023-07-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); + +// Размен монет II: динамическое программирование +fn coinChangeIIDP(comptime coins: []i32, comptime amt: usize) i32 { + comptime var n = coins.len; + // Инициализация таблицы dp + var dp = [_][amt + 1]i32{[_]i32{0} ** (amt + 1)} ** (n + 1); + // Инициализация первого столбца + for (0..n + 1) |i| { + dp[i][0] = 1; + } + // Переход состояний + for (1..n + 1) |i| { + for (1..amt + 1) |a| { + if (coins[i - 1] > @as(i32, @intCast(a))) { + // Если целевая сумма превышена, монету i не выбирать + dp[i][a] = dp[i - 1][a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[i][a] = dp[i - 1][a] + dp[i][a - @as(usize, @intCast(coins[i - 1]))]; + } + } + } + return dp[n][amt]; +} + +// Размен монет II: динамическое программирование с оптимизацией памяти +fn coinChangeIIDPComp(comptime coins: []i32, comptime amt: usize) i32 { + comptime var n = coins.len; + // Инициализация таблицы dp + var dp = [_]i32{0} ** (amt + 1); + dp[0] = 1; + // Переход состояний + for (1..n + 1) |i| { + for (1..amt + 1) |a| { + if (coins[i - 1] > @as(i32, @intCast(a))) { + // Если целевая сумма превышена, монету i не выбирать + dp[a] = dp[a]; + } else { + // Меньшее из двух решений: не брать или взять монету i + dp[a] = dp[a] + dp[a - @as(usize, @intCast(coins[i - 1]))]; + } + } + } + return dp[amt]; +} + +// Driver Code +pub fn main() !void { + comptime var coins = [_]i32{ 1, 2, 5 }; + comptime var amt: usize = 5; + + // Динамическое программирование + var res = coinChangeIIDP(&coins, amt); + std.debug.print("Количество комбинаций монет для набора целевой суммы = {}\n", .{res}); + + // Динамическое программирование с оптимизацией памяти + res = coinChangeIIDPComp(&coins, amt); + std.debug.print("Количество комбинаций монет для набора целевой суммы = {}\n", .{res}); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_dynamic_programming/edit_distance.zig b/ru/codes/zig/chapter_dynamic_programming/edit_distance.zig new file mode 100644 index 000000000..fae650ef0 --- /dev/null +++ b/ru/codes/zig/chapter_dynamic_programming/edit_distance.zig @@ -0,0 +1,146 @@ +// File: edit_distance.zig +// Created Time: 2023-07-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); + +// Редакционное расстояние: полный перебор +fn editDistanceDFS(comptime s: []const u8, comptime t: []const u8, i: usize, j: usize) i32 { + // Если s и t пусты, вернуть 0 + if (i == 0 and j == 0) { + return 0; + } + // Если s пусто, вернуть длину t + if (i == 0) { + return @intCast(j); + } + // Если t пусто, вернуть длину s + if (j == 0) { + return @intCast(i); + } + // Если два символа равны, сразу пропустить их + if (s[i - 1] == t[j - 1]) { + return editDistanceDFS(s, t, i - 1, j - 1); + } + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + var insert = editDistanceDFS(s, t, i, j - 1); + var delete = editDistanceDFS(s, t, i - 1, j); + var replace = editDistanceDFS(s, t, i - 1, j - 1); + // Вернуть минимальное число шагов редактирования + return @min(@min(insert, delete), replace) + 1; +} + +// Редакционное расстояние: поиск с мемоизацией +fn editDistanceDFSMem(comptime s: []const u8, comptime t: []const u8, mem: anytype, i: usize, j: usize) i32 { + // Если s и t пусты, вернуть 0 + if (i == 0 and j == 0) { + return 0; + } + // Если s пусто, вернуть длину t + if (i == 0) { + return @intCast(j); + } + // Если t пусто, вернуть длину s + if (j == 0) { + return @intCast(i); + } + // Если запись уже есть, сразу вернуть ее + if (mem[i][j] != -1) { + return mem[i][j]; + } + // Если два символа равны, сразу пропустить их + if (s[i - 1] == t[j - 1]) { + return editDistanceDFSMem(s, t, mem, i - 1, j - 1); + } + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + var insert = editDistanceDFSMem(s, t, mem, i, j - 1); + var delete = editDistanceDFSMem(s, t, mem, i - 1, j); + var replace = editDistanceDFSMem(s, t, mem, i - 1, j - 1); + // Сохранить и вернуть минимальное число шагов редактирования + mem[i][j] = @min(@min(insert, delete), replace) + 1; + return mem[i][j]; +} + +// Редакционное расстояние: динамическое программирование +fn editDistanceDP(comptime s: []const u8, comptime t: []const u8) i32 { + comptime var n = s.len; + comptime var m = t.len; + var dp = [_][m + 1]i32{[_]i32{0} ** (m + 1)} ** (n + 1); + // Переход состояний: первая строка и первый столбец + for (1..n + 1) |i| { + dp[i][0] = @intCast(i); + } + for (1..m + 1) |j| { + dp[0][j] = @intCast(j); + } + // Переход состояний: остальные строки и столбцы + for (1..n + 1) |i| { + for (1..m + 1) |j| { + if (s[i - 1] == t[j - 1]) { + // Если два символа равны, сразу пропустить их + dp[i][j] = dp[i - 1][j - 1]; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[i][j] = @min(@min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1; + } + } + } + return dp[n][m]; +} + +// Редакционное расстояние: динамическое программирование с оптимизацией памяти +fn editDistanceDPComp(comptime s: []const u8, comptime t: []const u8) i32 { + comptime var n = s.len; + comptime var m = t.len; + var dp = [_]i32{0} ** (m + 1); + // Переход состояний: первая строка + for (1..m + 1) |j| { + dp[j] = @intCast(j); + } + // Переход состояний: остальные строки + for (1..n + 1) |i| { + // Переход состояний: первый столбец + var leftup = dp[0]; // Временно сохранить dp[i-1, j-1] + dp[0] = @intCast(i); + // Переход состояний: остальные столбцы + for (1..m + 1) |j| { + var temp = dp[j]; + if (s[i - 1] == t[j - 1]) { + // Если два символа равны, сразу пропустить их + dp[j] = leftup; + } else { + // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1 + dp[j] = @min(@min(dp[j - 1], dp[j]), leftup) + 1; + } + leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации + } + } + return dp[m]; +} + +// Driver Code +pub fn main() !void { + const s = "bag"; + const t = "pack"; + comptime var n = s.len; + comptime var m = t.len; + + // Полный перебор + var res = editDistanceDFS(s, t, n, m); + std.debug.print("Чтобы преобразовать {s} в {s}, нужно минимум {} шагов\n", .{ s, t, res }); + + // Поиск с запоминанием + var mem = [_][m + 1]i32{[_]i32{-1} ** (m + 1)} ** (n + 1); + res = editDistanceDFSMem(s, t, @constCast(&mem), n, m); + std.debug.print("Чтобы преобразовать {s} в {s}, нужно минимум {} шагов\n", .{ s, t, res }); + + // Динамическое программирование + res = editDistanceDP(s, t); + std.debug.print("Чтобы преобразовать {s} в {s}, нужно минимум {} шагов\n", .{ s, t, res }); + + // Динамическое программирование с оптимизацией памяти + res = editDistanceDPComp(s, t); + std.debug.print("Чтобы преобразовать {s} в {s}, нужно минимум {} шагов\n", .{ s, t, res }); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_dynamic_programming/knapsack.zig b/ru/codes/zig/chapter_dynamic_programming/knapsack.zig new file mode 100644 index 000000000..5e7b444f1 --- /dev/null +++ b/ru/codes/zig/chapter_dynamic_programming/knapsack.zig @@ -0,0 +1,110 @@ +// File: knapsack.zig +// Created Time: 2023-07-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); + +// Рюкзак 0-1: полный перебор +fn knapsackDFS(wgt: []i32, val: []i32, i: usize, c: usize) i32 { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i == 0 or c == 0) { + return 0; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (wgt[i - 1] > c) { + return knapsackDFS(wgt, val, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + var no = knapsackDFS(wgt, val, i - 1, c); + var yes = knapsackDFS(wgt, val, i - 1, c - @as(usize, @intCast(wgt[i - 1]))) + val[i - 1]; + // Вернуть вариант с большей стоимостью из двух возможных + return @max(no, yes); +} + +// Рюкзак 0-1: поиск с мемоизацией +fn knapsackDFSMem(wgt: []i32, val: []i32, mem: anytype, i: usize, c: usize) i32 { + // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0 + if (i == 0 or c == 0) { + return 0; + } + // Если запись уже есть, вернуть сразу + if (mem[i][c] != -1) { + return mem[i][c]; + } + // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак + if (wgt[i - 1] > c) { + return knapsackDFSMem(wgt, val, mem, i - 1, c); + } + // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут + var no = knapsackDFSMem(wgt, val, mem, i - 1, c); + var yes = knapsackDFSMem(wgt, val, mem, i - 1, c - @as(usize, @intCast(wgt[i - 1]))) + val[i - 1]; + // Сохранить и вернуть вариант с большей стоимостью из двух решений + mem[i][c] = @max(no, yes); + return mem[i][c]; +} + +// Рюкзак 0-1: динамическое программирование +fn knapsackDP(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 { + comptime var n = wgt.len; + // Инициализация таблицы dp + var dp = [_][cap + 1]i32{[_]i32{0} ** (cap + 1)} ** (n + 1); + // Переход состояний + for (1..n + 1) |i| { + for (1..cap + 1) |c| { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = @max(dp[i - 1][c], dp[i - 1][c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]); + } + } + } + return dp[n][cap]; +} + +// Рюкзак 0-1: динамическое программирование с оптимизацией памяти +fn knapsackDPComp(wgt: []i32, val: []i32, comptime cap: usize) i32 { + var n = wgt.len; + // Инициализация таблицы dp + var dp = [_]i32{0} ** (cap + 1); + // Переход состояний + for (1..n + 1) |i| { + // Обход в обратном порядке + var c = cap; + while (c > 0) : (c -= 1) { + if (wgt[i - 1] < c) { + // Большее из двух решений: не брать или взять предмет i + dp[c] = @max(dp[c], dp[c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]); + } + } + } + return dp[cap]; +} + +// Driver Code +pub fn main() !void { + comptime var wgt = [_]i32{ 10, 20, 30, 40, 50 }; + comptime var val = [_]i32{ 50, 120, 150, 210, 240 }; + comptime var cap = 50; + comptime var n = wgt.len; + + // Полный перебор + var res = knapsackDFS(&wgt, &val, n, cap); + std.debug.print("Максимальная стоимость предметов без превышения вместимости рюкзака = {}\n", .{res}); + + // Поиск с запоминанием + var mem = [_][cap + 1]i32{[_]i32{-1} ** (cap + 1)} ** (n + 1); + res = knapsackDFSMem(&wgt, &val, @constCast(&mem), n, cap); + std.debug.print("Максимальная стоимость предметов без превышения вместимости рюкзака = {}\n", .{res}); + + // Динамическое программирование + res = knapsackDP(&wgt, &val, cap); + std.debug.print("Максимальная стоимость предметов без превышения вместимости рюкзака = {}\n", .{res}); + + // Динамическое программирование с оптимизацией памяти + res = knapsackDPComp(&wgt, &val, cap); + std.debug.print("Максимальная стоимость предметов без превышения вместимости рюкзака = {}\n", .{res}); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_dynamic_programming/min_cost_climbing_stairs_dp.zig b/ru/codes/zig/chapter_dynamic_programming/min_cost_climbing_stairs_dp.zig new file mode 100644 index 000000000..715ac118c --- /dev/null +++ b/ru/codes/zig/chapter_dynamic_programming/min_cost_climbing_stairs_dp.zig @@ -0,0 +1,54 @@ +// File: min_cost_climbing_stairs_dp.zig +// Created Time: 2023-07-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); + +// Минимальная стоимость подъема по лестнице: динамическое программирование +fn minCostClimbingStairsDP(comptime cost: []i32) i32 { + comptime var n = cost.len - 1; + if (n == 1 or n == 2) { + return cost[n]; + } + // Инициализация таблицы dp для хранения решений подзадач + var dp = [_]i32{-1} ** (n + 1); + // Начальное состояние: заранее задать решения наименьших подзадач + dp[1] = cost[1]; + dp[2] = cost[2]; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (3..n + 1) |i| { + dp[i] = @min(dp[i - 1], dp[i - 2]) + cost[i]; + } + return dp[n]; +} + +// Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти +fn minCostClimbingStairsDPComp(cost: []i32) i32 { + var n = cost.len - 1; + if (n == 1 or n == 2) { + return cost[n]; + } + var a = cost[1]; + var b = cost[2]; + // Переход состояний: постепенное решение больших подзадач через меньшие + for (3..n + 1) |i| { + var tmp = b; + b = @min(a, tmp) + cost[i]; + a = tmp; + } + return b; +} + +// Driver Code +pub fn main() !void { + comptime var cost = [_]i32{ 0, 1, 10, 1, 1, 1, 10, 1, 1, 10, 1 }; + std.debug.print("Стоимость подъема по ступеням = {any}\n", .{cost}); + + var res = minCostClimbingStairsDP(&cost); + std.debug.print("Стоимость подъема по ступеням = {}\n", .{res}); + + res = minCostClimbingStairsDPComp(&cost); + std.debug.print("Стоимость подъема по ступеням = {}\n", .{res}); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_dynamic_programming/min_path_sum.zig b/ru/codes/zig/chapter_dynamic_programming/min_path_sum.zig new file mode 100644 index 000000000..8a5b6552c --- /dev/null +++ b/ru/codes/zig/chapter_dynamic_programming/min_path_sum.zig @@ -0,0 +1,122 @@ +// File: min_path_sum.zig +// Created Time: 2023-07-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); + +// Минимальная сумма пути: полный перебор +fn minPathSumDFS(grid: anytype, i: i32, j: i32) i32 { + // Если это верхняя левая ячейка, завершить поиск + if (i == 0 and j == 0) { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 or j < 0) { + return std.math.maxInt(i32); + } + // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1) + var up = minPathSumDFS(grid, i - 1, j); + var left = minPathSumDFS(grid, i, j - 1); + // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j) + return @min(left, up) + grid[@as(usize, @intCast(i))][@as(usize, @intCast(j))]; +} + +// Минимальная сумма пути: поиск с мемоизацией +fn minPathSumDFSMem(grid: anytype, mem: anytype, i: i32, j: i32) i32 { + // Если это верхняя левая ячейка, завершить поиск + if (i == 0 and j == 0) { + return grid[0][0]; + } + // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ + if (i < 0 or j < 0) { + return std.math.maxInt(i32); + } + // Если запись уже есть, вернуть сразу + if (mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))] != -1) { + return mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))]; + } + // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1) + var up = minPathSumDFSMem(grid, mem, i - 1, j); + var left = minPathSumDFSMem(grid, mem, i, j - 1); + // Вернуть минимальную стоимость пути из левого верхнего угла в (i, j) + // Записать и вернуть минимальную стоимость пути из левого верхнего угла в (i, j) + mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))] = @min(left, up) + grid[@as(usize, @intCast(i))][@as(usize, @intCast(j))]; + return mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))]; +} + +// Минимальная сумма пути: динамическое программирование +fn minPathSumDP(comptime grid: anytype) i32 { + comptime var n = grid.len; + comptime var m = grid[0].len; + // Инициализация таблицы dp + var dp = [_][m]i32{[_]i32{0} ** m} ** n; + dp[0][0] = grid[0][0]; + // Переход состояний: первая строка + for (1..m) |j| { + dp[0][j] = dp[0][j - 1] + grid[0][j]; + } + // Переход состояний: первый столбец + for (1..n) |i| { + dp[i][0] = dp[i - 1][0] + grid[i][0]; + } + // Переход состояний: остальные строки и столбцы + for (1..n) |i| { + for (1..m) |j| { + dp[i][j] = @min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]; + } + } + return dp[n - 1][m - 1]; +} + +// Минимальная сумма пути: динамическое программирование с оптимизацией памяти +fn minPathSumDPComp(comptime grid: anytype) i32 { + comptime var n = grid.len; + comptime var m = grid[0].len; + // Инициализация таблицы dp + var dp = [_]i32{0} ** m; + // Переход состояний: первая строка + dp[0] = grid[0][0]; + for (1..m) |j| { + dp[j] = dp[j - 1] + grid[0][j]; + } + // Переход состояний: остальные строки + for (1..n) |i| { + // Переход состояний: первый столбец + dp[0] = dp[0] + grid[i][0]; + for (1..m) |j| { + dp[j] = @min(dp[j - 1], dp[j]) + grid[i][j]; + } + } + return dp[m - 1]; +} + +// Driver Code +pub fn main() !void { + comptime var grid = [_][4]i32{ + [_]i32{ 1, 3, 1, 5 }, + [_]i32{ 2, 2, 4, 2 }, + [_]i32{ 5, 3, 2, 1 }, + [_]i32{ 4, 3, 5, 2 }, + }; + comptime var n = grid.len; + comptime var m = grid[0].len; + + // Полный перебор + var res = minPathSumDFS(&grid, n - 1, m - 1); + std.debug.print("Минимальная сумма пути из левого верхнего угла в правый нижний = {}\n", .{res}); + + // Поиск с мемоизацией + var mem = [_][m]i32{[_]i32{-1} ** m} ** n; + res = minPathSumDFSMem(&grid, &mem, n - 1, m - 1); + std.debug.print("Минимальная сумма пути из левого верхнего угла в правый нижний = {}\n", .{res}); + + // Динамическое программирование + res = minPathSumDP(&grid); + std.debug.print("Минимальная сумма пути из левого верхнего угла в правый нижний = {}\n", .{res}); + + // Динамическое программирование с оптимизацией памяти + res = minPathSumDPComp(&grid); + std.debug.print("Минимальная сумма пути из левого верхнего угла в правый нижний = {}\n", .{res}); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_dynamic_programming/unbounded_knapsack.zig b/ru/codes/zig/chapter_dynamic_programming/unbounded_knapsack.zig new file mode 100644 index 000000000..4e3979399 --- /dev/null +++ b/ru/codes/zig/chapter_dynamic_programming/unbounded_knapsack.zig @@ -0,0 +1,62 @@ +// File: unbounded_knapsack.zig +// Created Time: 2023-07-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); + +// Полный рюкзак: динамическое программирование +fn unboundedKnapsackDP(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 { + comptime var n = wgt.len; + // Инициализация таблицы dp + var dp = [_][cap + 1]i32{[_]i32{0} ** (cap + 1)} ** (n + 1); + // Переход состояний + for (1..n + 1) |i| { + for (1..cap + 1) |c| { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[i][c] = dp[i - 1][c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[i][c] = @max(dp[i - 1][c], dp[i][c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]); + } + } + } + return dp[n][cap]; +} + +// Полный рюкзак: динамическое программирование с оптимизацией памяти +fn unboundedKnapsackDPComp(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 { + comptime var n = wgt.len; + // Инициализация таблицы dp + var dp = [_]i32{0} ** (cap + 1); + // Переход состояний + for (1..n + 1) |i| { + for (1..cap + 1) |c| { + if (wgt[i - 1] > c) { + // Если вместимость рюкзака превышена, предмет i не выбирать + dp[c] = dp[c]; + } else { + // Большее из двух решений: не брать или взять предмет i + dp[c] = @max(dp[c], dp[c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]); + } + } + } + return dp[cap]; +} + +// Driver Code +pub fn main() !void { + comptime var wgt = [_]i32{ 1, 2, 3 }; + comptime var val = [_]i32{ 5, 11, 15 }; + comptime var cap = 4; + + // Динамическое программирование + var res = unboundedKnapsackDP(&wgt, &val, cap); + std.debug.print("Максимальная стоимость предметов без превышения вместимости рюкзака = {}\n", .{res}); + + // Динамическое программирование с оптимизацией памяти + res = unboundedKnapsackDPComp(&wgt, &val, cap); + std.debug.print("Максимальная стоимость предметов без превышения вместимости рюкзака = {}\n", .{res}); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_hashing/array_hash_map.zig b/ru/codes/zig/chapter_hashing/array_hash_map.zig new file mode 100644 index 000000000..a01cd5219 --- /dev/null +++ b/ru/codes/zig/chapter_hashing/array_hash_map.zig @@ -0,0 +1,162 @@ +// File: array_hash_map.zig +// Created Time: 2023-01-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Пара ключ-значение +const Pair = struct { + key: usize = undefined, + val: []const u8 = undefined, + + pub fn init(key: usize, val: []const u8) Pair { + return Pair { + .key = key, + .val = val, + }; + } +}; + +// Хеш-таблица на основе массива +pub fn ArrayHashMap(comptime T: type) type { + return struct { + bucket: ?std.ArrayList(?T) = null, + mem_allocator: std.mem.Allocator = undefined, + + const Self = @This(); + + // Конструктор + pub fn init(self: *Self, allocator: std.mem.Allocator) !void { + self.mem_allocator = allocator; + // Инициализировать корзину (массив) длиной 100 + self.bucket = std.ArrayList(?T).init(self.mem_allocator); + var i: i32 = 0; + while (i < 100) : (i += 1) { + try self.bucket.?.append(null); + } + } + + // Деструктор + pub fn deinit(self: *Self) void { + if (self.bucket != null) self.bucket.?.deinit(); + } + + // Хеш-функция + fn hashFunc(key: usize) usize { + var index = key % 100; + return index; + } + + // Операция поиска + pub fn get(self: *Self, key: usize) []const u8 { + var index = hashFunc(key); + var pair = self.bucket.?.items[index]; + return pair.?.val; + } + + // Операция добавления + pub fn put(self: *Self, key: usize, val: []const u8) !void { + var pair = Pair.init(key, val); + var index = hashFunc(key); + self.bucket.?.items[index] = pair; + } + + // Операция удаления + pub fn remove(self: *Self, key: usize) !void { + var index = hashFunc(key); + // Присвоить null, что означает удаление + self.bucket.?.items[index] = null; + } + + // Получить все пары ключ-значение + pub fn pairSet(self: *Self) !std.ArrayList(T) { + var entry_set = std.ArrayList(T).init(self.mem_allocator); + for (self.bucket.?.items) |item| { + if (item == null) continue; + try entry_set.append(item.?); + } + return entry_set; + } + + // Получить все ключи + pub fn keySet(self: *Self) !std.ArrayList(usize) { + var key_set = std.ArrayList(usize).init(self.mem_allocator); + for (self.bucket.?.items) |item| { + if (item == null) continue; + try key_set.append(item.?.key); + } + return key_set; + } + + // Получить все значения + pub fn valueSet(self: *Self) !std.ArrayList([]const u8) { + var value_set = std.ArrayList([]const u8).init(self.mem_allocator); + for (self.bucket.?.items) |item| { + if (item == null) continue; + try value_set.append(item.?.val); + } + return value_set; + } + + // Вывести хеш-таблицу + pub fn print(self: *Self) !void { + var entry_set = try self.pairSet(); + defer entry_set.deinit(); + for (entry_set.items) |item| { + std.debug.print("{} -> {s}\n", .{item.key, item.val}); + } + } + }; +} + +// Driver Code +pub fn main() !void { + // Инициализация хеш-таблицы + var map = ArrayHashMap(Pair){}; + try map.init(std.heap.page_allocator); + defer map.deinit(); + + // Операция добавления + // Добавить пару (key, value) в хеш-таблицу + try map.put(12836, "Сяо Ха"); + try map.put(15937, "Сяо Ло"); + try map.put(16750, "Сяо Суань"); + try map.put(13276, "Сяо Фа"); + try map.put(10583, "Сяо Я"); + std.debug.print("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение\n", .{}); + try map.print(); + + // Операция поиска + // Передать ключ key в хеш-таблицу и получить значение value + var name = map.get(15937); + std.debug.print("\nПо номеру 15937 найдено имя {s}\n", .{name}); + + // Операция удаления + // Удалить пару (key, value) из хеш-таблицы + try map.remove(10583); + std.debug.print("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение\n", .{}); + try map.print(); + + // Обход хеш-таблицы + std.debug.print("\nОтдельный обход пар ключ-значение\n", .{}); + var entry_set = try map.pairSet(); + for (entry_set.items) |kv| { + std.debug.print("{} -> {s}\n", .{kv.key, kv.val}); + } + defer entry_set.deinit(); + std.debug.print("\nОтдельный обход ключей\n", .{}); + var key_set = try map.keySet(); + for (key_set.items) |key| { + std.debug.print("{}\n", .{key}); + } + defer key_set.deinit(); + std.debug.print("\nОтдельный обход значений\n", .{}); + var value_set = try map.valueSet(); + for (value_set.items) |val| { + std.debug.print("{s}\n", .{val}); + } + defer value_set.deinit(); + + _ = try std.io.getStdIn().reader().readByte(); +} \ No newline at end of file diff --git a/ru/codes/zig/chapter_hashing/hash_map.zig b/ru/codes/zig/chapter_hashing/hash_map.zig new file mode 100644 index 000000000..7c6f991f6 --- /dev/null +++ b/ru/codes/zig/chapter_hashing/hash_map.zig @@ -0,0 +1,54 @@ +// File: hash_map.zig +// Created Time: 2023-01-13 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Driver Code +pub fn main() !void { + // Инициализация хеш-таблицы + var map = std.AutoHashMap(i32, []const u8).init(std.heap.page_allocator); + // Отложенное освобождение памяти + defer map.deinit(); + + // Операция добавления + // Добавить пару (key, value) в хеш-таблицу + try map.put(12836, "Сяо Ха"); + try map.put(15937, "Сяо Ло"); + try map.put(16750, "Сяо Суань"); + try map.put(13276, "Сяо Фа"); + try map.put(10583, "Сяо Я"); + std.debug.print("\nПосле добавления хеш-таблица имеет вид\nКлюч -> Значение\n", .{}); + inc.PrintUtil.printHashMap(i32, []const u8, map); + + // Операция поиска + // Передать ключ key в хеш-таблицу и получить значение value + var name = map.get(15937).?; + std.debug.print("\nПо номеру 15937 найдено имя {s}\n", .{name}); + + // Операция удаления + // Удалить пару (key, value) из хеш-таблицы + _ = map.remove(10583); + std.debug.print("\nПосле удаления 10583 хеш-таблица имеет вид\nКлюч -> Значение\n", .{}); + inc.PrintUtil.printHashMap(i32, []const u8, map); + + // Обход хеш-таблицы + std.debug.print("\nОтдельный обход пар ключ-значение\n", .{}); + inc.PrintUtil.printHashMap(i32, []const u8, map); + + std.debug.print("\nОтдельный обход ключей\n", .{}); + var it = map.iterator(); + while (it.next()) |kv| { + std.debug.print("{}\n", .{kv.key_ptr.*}); + } + + std.debug.print("\nОтдельный обход значений\n", .{}); + it = map.iterator(); + while (it.next()) |kv| { + std.debug.print("{s}\n", .{kv.value_ptr.*}); + } + + _ = try std.io.getStdIn().reader().readByte(); +} + diff --git a/ru/codes/zig/chapter_heap/heap.zig b/ru/codes/zig/chapter_heap/heap.zig new file mode 100644 index 000000000..c68885acb --- /dev/null +++ b/ru/codes/zig/chapter_heap/heap.zig @@ -0,0 +1,80 @@ +// File: heap.zig +// Created Time: 2023-01-14 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +fn lessThan(context: void, a: i32, b: i32) std.math.Order { + _ = context; + return std.math.order(a, b); +} + +fn greaterThan(context: void, a: i32, b: i32) std.math.Order { + return lessThan(context, a, b).invert(); +} + +fn testPush(comptime T: type, mem_allocator: std.mem.Allocator, heap: anytype, val: T) !void { + try heap.add(val); // Добавление элемента в кучу + std.debug.print("\nПосле добавления элемента {} в кучу\n", .{val}); + try inc.PrintUtil.printHeap(T, mem_allocator, heap); +} + +fn testPop(comptime T: type, mem_allocator: std.mem.Allocator, heap: anytype) !void { + var val = heap.remove(); // Извлечение элемента с вершины кучи + std.debug.print("\nПосле извлечения элемента вершины кучи {}\n", .{val}); + try inc.PrintUtil.printHeap(T, mem_allocator, heap); +} + +// Driver Code +pub fn main() !void { + // Инициализация аллокатора памяти + var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer mem_arena.deinit(); + const mem_allocator = mem_arena.allocator(); + + // Инициализировать кучу + // Инициализировать минимальную кучу + const PQlt = std.PriorityQueue(i32, void, lessThan); + var min_heap = PQlt.init(std.heap.page_allocator, {}); + defer min_heap.deinit(); + // Инициализация максимальной кучи + const PQgt = std.PriorityQueue(i32, void, greaterThan); + var max_heap = PQgt.init(std.heap.page_allocator, {}); + defer max_heap.deinit(); + + std.debug.print("\nНиже приведен тестовый пример для большой кучи", .{}); + + // Добавление элемента в кучу + try testPush(i32, mem_allocator, &max_heap, 1); + try testPush(i32, mem_allocator, &max_heap, 3); + try testPush(i32, mem_allocator, &max_heap, 2); + try testPush(i32, mem_allocator, &max_heap, 5); + try testPush(i32, mem_allocator, &max_heap, 4); + + // Получение элемента с вершины кучи + var peek = max_heap.peek().?; + std.debug.print("\nЭлемент на вершине кучи = {}\n", .{peek}); + + // Извлечение элемента с вершины кучи + try testPop(i32, mem_allocator, &max_heap); + try testPop(i32, mem_allocator, &max_heap); + try testPop(i32, mem_allocator, &max_heap); + try testPop(i32, mem_allocator, &max_heap); + try testPop(i32, mem_allocator, &max_heap); + + // Получить размер кучи + var size = max_heap.len; + std.debug.print("\nКоличество элементов в куче = {}\n", .{size}); + + // Проверка, пуста ли куча + var is_empty = if (max_heap.len == 0) true else false; + std.debug.print("\nПуста ли куча: {}\n", .{is_empty}); + + // Построить кучу по входному списку + try min_heap.addSlice(&[_]i32{ 1, 3, 2, 5, 4 }); + std.debug.print("\nПосле построения мин-кучи из входного списка\n", .{}); + try inc.PrintUtil.printHeap(i32, mem_allocator, min_heap); + + _ = try std.io.getStdIn().reader().readByte(); +} \ No newline at end of file diff --git a/ru/codes/zig/chapter_heap/my_heap.zig b/ru/codes/zig/chapter_heap/my_heap.zig new file mode 100644 index 000000000..664f72349 --- /dev/null +++ b/ru/codes/zig/chapter_heap/my_heap.zig @@ -0,0 +1,186 @@ +// File: my_heap.zig +// Created Time: 2023-01-14 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Упрощенная реализация класса кучи +pub fn MaxHeap(comptime T: type) type { + return struct { + const Self = @This(); + + max_heap: ?std.ArrayList(T) = null, // Использовать список вместо массива, чтобы не учитывать проблему расширения + + // Конструктор, строящий кучу по входному списку + pub fn init(self: *Self, allocator: std.mem.Allocator, nums: []const T) !void { + if (self.max_heap != null) return; + self.max_heap = std.ArrayList(T).init(allocator); + // Добавить элементы списка в кучу без изменений + try self.max_heap.?.appendSlice(nums); + // Выполнить heapify для всех узлов, кроме листовых + var i: usize = parent(self.size() - 1) + 1; + while (i > 0) : (i -= 1) { + try self.siftDown(i - 1); + } + } + + // Деструктор, освободить память + pub fn deinit(self: *Self) void { + if (self.max_heap != null) self.max_heap.?.deinit(); + } + + // Получить индекс левого дочернего узла + fn left(i: usize) usize { + return 2 * i + 1; + } + + // Получить индекс правого дочернего узла + fn right(i: usize) usize { + return 2 * i + 2; + } + + // Получить индекс родительского узла + fn parent(i: usize) usize { + // return (i - 1) / 2; // округление вниз при делении + return @divFloor(i - 1, 2); + } + + // Поменять элементы местами + fn swap(self: *Self, i: usize, j: usize) !void { + var tmp = self.max_heap.?.items[i]; + try self.max_heap.?.replaceRange(i, 1, &[_]T{self.max_heap.?.items[j]}); + try self.max_heap.?.replaceRange(j, 1, &[_]T{tmp}); + } + + // Получение размера кучи + pub fn size(self: *Self) usize { + return self.max_heap.?.items.len; + } + + // Проверка, пуста ли куча + pub fn isEmpty(self: *Self) bool { + return self.size() == 0; + } + + // Доступ к элементу на вершине кучи + pub fn peek(self: *Self) T { + return self.max_heap.?.items[0]; + } + + // Добавление элемента в кучу + pub fn push(self: *Self, val: T) !void { + // Добавление узла + try self.max_heap.?.append(val); + // Просеивание снизу вверх + try self.siftUp(self.size() - 1); + } + + // Начиная с узла i, выполнить просеивание снизу вверх + fn siftUp(self: *Self, i_: usize) !void { + var i = i_; + while (true) { + // Получение родительского узла для узла i + var p = parent(i); + // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления» + if (p < 0 or self.max_heap.?.items[i] <= self.max_heap.?.items[p]) break; + // Поменять два узла местами + try self.swap(i, p); + // Циклическое просеивание вверх + i = p; + } + } + + // Извлечение элемента из кучи + pub fn pop(self: *Self) !T { + // Обработка проверки + if (self.isEmpty()) unreachable; + // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы) + try self.swap(0, self.size() - 1); + // Удаление узла + var val = self.max_heap.?.pop(); + // Просеивание сверху вниз + try self.siftDown(0); + // Вернуть элемент с вершины кучи + return val; + } + + // Начиная с узла i, выполнить просеивание сверху вниз + fn siftDown(self: *Self, i_: usize) !void { + var i = i_; + while (true) { + // Определить узел с максимальным значением среди i, l и r и обозначить его как ma + var l = left(i); + var r = right(i); + var ma = i; + if (l < self.size() and self.max_heap.?.items[l] > self.max_heap.?.items[ma]) ma = l; + if (r < self.size() and self.max_heap.?.items[r] > self.max_heap.?.items[ma]) ma = r; + // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти + if (ma == i) break; + // Поменять два узла местами + try self.swap(i, ma); + // Циклическое просеивание вниз + i = ma; + } + } + + fn lessThan(context: void, a: T, b: T) std.math.Order { + _ = context; + return std.math.order(a, b); + } + + fn greaterThan(context: void, a: T, b: T) std.math.Order { + return lessThan(context, a, b).invert(); + } + + // Вывести кучу (двоичное дерево) + pub fn print(self: *Self, mem_allocator: std.mem.Allocator) !void { + const PQgt = std.PriorityQueue(T, void, greaterThan); + var queue = PQgt.init(std.heap.page_allocator, {}); + defer queue.deinit(); + try queue.addSlice(self.max_heap.?.items); + try inc.PrintUtil.printHeap(T, mem_allocator, queue); + } + }; +} + +// Driver Code +pub fn main() !void { + // Инициализация аллокатора памяти + var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer mem_arena.deinit(); + const mem_allocator = mem_arena.allocator(); + + // Инициализация максимальной кучи + var max_heap = MaxHeap(i32){}; + try max_heap.init(std.heap.page_allocator, &[_]i32{ 9, 8, 6, 6, 7, 5, 2, 1, 4, 3, 6, 2 }); + defer max_heap.deinit(); + std.debug.print("\nПосле построения кучи из входного списка\n", .{}); + try max_heap.print(mem_allocator); + + // Получение элемента с вершины кучи + var peek = max_heap.peek(); + std.debug.print("\nЭлемент на вершине кучи = {}\n", .{peek}); + + // Добавление элемента в кучу + const val = 7; + try max_heap.push(val); + std.debug.print("\nПосле добавления элемента {} в кучу\n", .{val}); + try max_heap.print(mem_allocator); + + // Извлечение элемента с вершины кучи + peek = try max_heap.pop(); + std.debug.print("\nПосле извлечения элемента вершины кучи {}\n", .{peek}); + try max_heap.print(mem_allocator); + + // Получить размер кучи + var size = max_heap.size(); + std.debug.print("\nКоличество элементов в куче = {}", .{size}); + + // Проверка, пуста ли куча + var is_empty = max_heap.isEmpty(); + std.debug.print("\nПуста ли куча: {}\n", .{is_empty}); + + _ = try std.io.getStdIn().reader().readByte(); +} + diff --git a/ru/codes/zig/chapter_searching/binary_search.zig b/ru/codes/zig/chapter_searching/binary_search.zig new file mode 100644 index 000000000..183625f0b --- /dev/null +++ b/ru/codes/zig/chapter_searching/binary_search.zig @@ -0,0 +1,64 @@ +// File: binary_search.zig +// Created Time: 2023-01-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Бинарный поиск (двусторонне замкнутый интервал) +fn binarySearch(comptime T: type, nums: std.ArrayList(T), target: T) T { + // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно + var i: usize = 0; + var j: usize = nums.items.len - 1; + // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст) + while (i <= j) { + var m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums.items[m] < target) { // Это означает, что target находится в интервале [m+1, j] + i = m + 1; + } else if (nums.items[m] > target) { // Это означает, что target находится в интервале [i, m-1] + j = m - 1; + } else { // Целевой элемент найден, вернуть его индекс + return @intCast(m); + } + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +// Бинарный поиск (лево замкнутый, право открытый интервал) +fn binarySearchLCRO(comptime T: type, nums: std.ArrayList(T), target: T) T { + // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно + var i: usize = 0; + var j: usize = nums.items.len; + // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст) + while (i <= j) { + var m = i + (j - i) / 2; // Вычислить индекс середины m + if (nums.items[m] < target) { // Это означает, что target находится в интервале [m+1, j) + i = m + 1; + } else if (nums.items[m] > target) { // Это означает, что target находится в интервале [i, m) + j = m; + } else { // Целевой элемент найден, вернуть его индекс + return @intCast(m); + } + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +// Driver Code +pub fn main() !void { + var target: i32 = 6; + var nums = std.ArrayList(i32).init(std.heap.page_allocator); + defer nums.deinit(); + try nums.appendSlice(&[_]i32{ 1, 3, 6, 8, 12, 15, 23, 26, 31, 35 }); + + // Бинарный поиск (двусторонне замкнутый интервал) + var index = binarySearch(i32, nums, target); + std.debug.print("Индекс целевого элемента 6 = {}\n", .{index}); + + // Бинарный поиск (лево замкнутый, право открытый интервал) + index = binarySearchLCRO(i32, nums, target); + std.debug.print("Индекс целевого элемента 6 = {}\n", .{index}); + + _ = try std.io.getStdIn().reader().readByte(); +} \ No newline at end of file diff --git a/ru/codes/zig/chapter_searching/hashing_search.zig b/ru/codes/zig/chapter_searching/hashing_search.zig new file mode 100644 index 000000000..c7549d53c --- /dev/null +++ b/ru/codes/zig/chapter_searching/hashing_search.zig @@ -0,0 +1,57 @@ +// File: hashing_search.zig +// Created Time: 2023-01-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Хеш-поиск (массив) +fn hashingSearchArray(comptime T: type, map: std.AutoHashMap(T, T), target: T) T { + // key хеш-таблицы: целевой элемент, value: индекс + // Если такого key нет в хеш-таблице, вернуть -1 + if (map.getKey(target) == null) return -1; + return map.get(target).?; +} + +// Хеш-поиск (связный список) +fn hashingSearchLinkedList(comptime T: type, map: std.AutoHashMap(T, *inc.ListNode(T)), target: T) ?*inc.ListNode(T) { + // key хеш-таблицы: значение целевого узла, value: объект узла + // Если такого key нет в хеш-таблице, вернуть null + if (map.getKey(target) == null) return null; + return map.get(target); +} + +// Driver Code +pub fn main() !void { + var target: i32 = 3; + + // Хеш-поиск (массив) + var nums = [_]i32{ 1, 5, 3, 2, 4, 7, 5, 9, 10, 8 }; + // Инициализация хеш-таблицы + var map = std.AutoHashMap(i32, i32).init(std.heap.page_allocator); + defer map.deinit(); + for (nums, 0..) |num, i| { + try map.put(num, @as(i32, @intCast(i))); // key: элемент, value: индекс + } + var index = hashingSearchArray(i32, map, target); + std.debug.print("Индекс целевого элемента 3 = {}\n", .{index}); + + // Хеш-поиск (связный список) + var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer mem_arena.deinit(); + const mem_allocator = mem_arena.allocator(); + var head = try inc.ListUtil.arrToLinkedList(i32, mem_allocator, &nums); + // Инициализация хеш-таблицы + var map1 = std.AutoHashMap(i32, *inc.ListNode(i32)).init(std.heap.page_allocator); + defer map1.deinit(); + while (head != null) { + try map1.put(head.?.val, head.?); + head = head.?.next; + } + var node = hashingSearchLinkedList(i32, map1, target); + std.debug.print("Объект узла со значением 3 = ", .{}); + try inc.PrintUtil.printLinkedList(i32, node); + + _ = try std.io.getStdIn().reader().readByte(); +} + diff --git a/ru/codes/zig/chapter_searching/linear_search.zig b/ru/codes/zig/chapter_searching/linear_search.zig new file mode 100644 index 000000000..7e00af7b5 --- /dev/null +++ b/ru/codes/zig/chapter_searching/linear_search.zig @@ -0,0 +1,54 @@ +// File: linear_search.zig +// Created Time: 2023-01-13 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Линейный поиск (массив) +fn linearSearchArray(comptime T: type, nums: std.ArrayList(T), target: T) T { + // Обход массива + for (nums.items, 0..) |num, i| { + // Найти целевой элемент и вернуть его индекс + if (num == target) { + return @intCast(i); + } + } + // Целевой элемент не найден, вернуть -1 + return -1; +} + +// Линейный поиск (связный список) +pub fn linearSearchLinkedList(comptime T: type, node: ?*inc.ListNode(T), target: T) ?*inc.ListNode(T) { + var head = node; + // Обойти связный список + while (head != null) { + // Найти целевой узел и вернуть его + if (head.?.val == target) return head; + head = head.?.next; + } + return null; +} + +// Driver Code +pub fn main() !void { + var target: i32 = 3; + + // Выполнить линейный поиск в массиве + var nums = std.ArrayList(i32).init(std.heap.page_allocator); + defer nums.deinit(); + try nums.appendSlice(&[_]i32{ 1, 5, 3, 2, 4, 7, 5, 9, 10, 8 }); + var index = linearSearchArray(i32, nums, target); + std.debug.print("Индекс целевого элемента 3 = {}\n", .{index}); + + // Выполнить линейный поиск в связном списке + var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer mem_arena.deinit(); + const mem_allocator = mem_arena.allocator(); + var head = try inc.ListUtil.listToLinkedList(i32, mem_allocator, nums); + var node = linearSearchLinkedList(i32, head, target); + std.debug.print("Объект узла со значением 3 = ", .{}); + try inc.PrintUtil.printLinkedList(i32, node); + + _ = try std.io.getStdIn().reader().readByte(); +} \ No newline at end of file diff --git a/ru/codes/zig/chapter_searching/two_sum.zig b/ru/codes/zig/chapter_searching/two_sum.zig new file mode 100644 index 000000000..07bd85fd3 --- /dev/null +++ b/ru/codes/zig/chapter_searching/two_sum.zig @@ -0,0 +1,58 @@ +// File: two_sum.zig +// Created Time: 2023-01-07 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Метод 1: полный перебор +pub fn twoSumBruteForce(nums: []i32, target: i32) ?[2]i32 { + var size: usize = nums.len; + var i: usize = 0; + // Два вложенных цикла, временная сложность O(n^2) + while (i < size - 1) : (i += 1) { + var j = i + 1; + while (j < size) : (j += 1) { + if (nums[i] + nums[j] == target) { + return [_]i32{@intCast(i), @intCast(j)}; + } + } + } + return null; +} + +// Метод 2: вспомогательная хеш-таблица +pub fn twoSumHashTable(nums: []i32, target: i32) !?[2]i32 { + var size: usize = nums.len; + // Вспомогательная хеш-таблица, пространственная сложность O(n) + var dic = std.AutoHashMap(i32, i32).init(std.heap.page_allocator); + defer dic.deinit(); + var i: usize = 0; + // Один цикл, временная сложность O(n) + while (i < size) : (i += 1) { + if (dic.contains(target - nums[i])) { + return [_]i32{dic.get(target - nums[i]).?, @intCast(i)}; + } + try dic.put(nums[i], @intCast(i)); + } + return null; +} + + +pub fn main() !void { + // ======= Test Case ======= + var nums = [_]i32{ 2, 7, 11, 15 }; + var target: i32 = 9; + + // ====== Основной код ====== + // Метод 1 + var res = twoSumBruteForce(&nums, target).?; + std.debug.print("Метод 1: res = ", .{}); + inc.PrintUtil.printArray(i32, &res); + // Метод 2 + res = (try twoSumHashTable(&nums, target)).?; + std.debug.print("\nМетод 2: res = ", .{}); + inc.PrintUtil.printArray(i32, &res); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_sorting/bubble_sort.zig b/ru/codes/zig/chapter_sorting/bubble_sort.zig new file mode 100644 index 000000000..02286f4b0 --- /dev/null +++ b/ru/codes/zig/chapter_sorting/bubble_sort.zig @@ -0,0 +1,61 @@ +// File: bubble_sort.zig +// Created Time: 2023-01-08 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Пузырьковая сортировка +fn bubbleSort(nums: []i32) void { + // Внешний цикл: неотсортированный диапазон [0, i] + var i: usize = nums.len - 1; + while (i > 0) : (i -= 1) { + var j: usize = 0; + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + while (j < i) : (j += 1) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + var tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + } + } + } +} + +// Пузырьковая сортировка (оптимизация флагом) +fn bubbleSortWithFlag(nums: []i32) void { + // Внешний цикл: неотсортированный диапазон [0, i] + var i: usize = nums.len - 1; + while (i > 0) : (i -= 1) { + var flag = false; // Инициализировать флаг + var j: usize = 0; + // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец + while (j < i) : (j += 1) { + if (nums[j] > nums[j + 1]) { + // Поменять местами nums[j] и nums[j + 1] + var tmp = nums[j]; + nums[j] = nums[j + 1]; + nums[j + 1] = tmp; + flag = true; + } + } + if (!flag) break; // На этой итерации «всплытия» не было ни одного обмена, сразу выйти + } +} + +// Driver Code +pub fn main() !void { + var nums = [_]i32{ 4, 1, 3, 1, 5, 2 }; + bubbleSort(&nums); + std.debug.print("После завершения пузырьковой сортировки nums = ", .{}); + inc.PrintUtil.printArray(i32, &nums); + + var nums1 = [_]i32{ 4, 1, 3, 1, 5, 2 }; + bubbleSortWithFlag(&nums1); + std.debug.print("\nПосле завершения пузырьковой сортировки nums1 = ", .{}); + inc.PrintUtil.printArray(i32, &nums1); + + _ = try std.io.getStdIn().reader().readByte(); +} + diff --git a/ru/codes/zig/chapter_sorting/insertion_sort.zig b/ru/codes/zig/chapter_sorting/insertion_sort.zig new file mode 100644 index 000000000..323e8140c --- /dev/null +++ b/ru/codes/zig/chapter_sorting/insertion_sort.zig @@ -0,0 +1,31 @@ +// File: insertion_sort.zig +// Created Time: 2023-01-08 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Сортировка вставками +fn insertionSort(nums: []i32) void { + // Внешний цикл: отсортированный диапазон [0, i-1] + var i: usize = 1; + while (i < nums.len) : (i += 1) { + var base = nums[i]; + var j: usize = i; + // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1] + while (j >= 1 and nums[j - 1] > base) : (j -= 1) { + nums[j] = nums[j - 1]; // Сдвинуть nums[j] на одну позицию вправо + } + nums[j] = base; // Поместить base в правильную позицию + } +} + +// Driver Code +pub fn main() !void { + var nums = [_]i32{ 4, 1, 3, 1, 5, 2 }; + insertionSort(&nums); + std.debug.print("После завершения сортировки вставками nums = ", .{}); + inc.PrintUtil.printArray(i32, &nums); + + _ = try std.io.getStdIn().reader().readByte(); +} \ No newline at end of file diff --git a/ru/codes/zig/chapter_sorting/merge_sort.zig b/ru/codes/zig/chapter_sorting/merge_sort.zig new file mode 100644 index 000000000..5ccfab942 --- /dev/null +++ b/ru/codes/zig/chapter_sorting/merge_sort.zig @@ -0,0 +1,67 @@ +// File: merge_sort.zig +// Created Time: 2023-01-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Объединить левый и правый подмассивы +// Диапазон левого подмассива [left, mid] +// Диапазон правого подмассива [mid + 1, right] +fn merge(nums: []i32, left: usize, mid: usize, right: usize) !void { + // Инициализация вспомогательного массива + var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer mem_arena.deinit(); + const mem_allocator = mem_arena.allocator(); + var tmp = try mem_allocator.alloc(i32, right + 1 - left); + std.mem.copy(i32, tmp, nums[left..right+1]); + // Начальный и конечный индексы левого подмассива + var leftStart = left - left; + var leftEnd = mid - left; + // Начальный и конечный индексы правого подмассива + var rightStart = mid + 1 - left; + var rightEnd = right - left; + // i и j указывают соответственно на первые элементы левого и правого подмассивов + var i = leftStart; + var j = rightStart; + // Объединить левый и правый подмассивы, перезаписывая исходный массив nums + var k = left; + while (k <= right) : (k += 1) { + // Если «левый подмассив уже полностью слит», выбрать элемент правого подмассива и выполнить j++ + if (i > leftEnd) { + nums[k] = tmp[j]; + j += 1; + // Иначе, если «правый подмассив уже полностью слит» или «элемент левого подмассива <= элементу правого подмассива», выбрать элемент левого подмассива и выполнить i++ + } else if (j > rightEnd or tmp[i] <= tmp[j]) { + nums[k] = tmp[i]; + i += 1; + // Иначе, если «оба подмассива еще не полностью слиты» и «элемент левого подмассива > элемента правого подмассива», выбрать элемент правого подмассива и выполнить j++ + } else { + nums[k] = tmp[j]; + j += 1; + } + } +} + +// Сортировка слиянием +fn mergeSort(nums: []i32, left: usize, right: usize) !void { + // Условие завершения + if (left >= right) return; // Завершить рекурсию, когда длина подмассива равна 1 + // Этап разбиения + var mid = left + (right - left) / 2; // Вычислить середину + try mergeSort(nums, left, mid); // Рекурсивно обработать левый подмассив + try mergeSort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив + // Этап слияния + try merge(nums, left, mid, right); +} + +// Driver Code +pub fn main() !void { + // Сортировка слиянием + var nums = [_]i32{ 7, 3, 2, 6, 0, 1, 5, 4 }; + try mergeSort(&nums, 0, nums.len - 1); + std.debug.print("После завершения сортировки слиянием nums = ", .{}); + inc.PrintUtil.printArray(i32, &nums); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_sorting/quick_sort.zig b/ru/codes/zig/chapter_sorting/quick_sort.zig new file mode 100644 index 000000000..23adb7edb --- /dev/null +++ b/ru/codes/zig/chapter_sorting/quick_sort.zig @@ -0,0 +1,162 @@ +// File: quick_sort.zig +// Created Time: 2023-01-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Класс быстрой сортировки +const QuickSort = struct { + + // Обмен элементов + pub fn swap(nums: []i32, i: usize, j: usize) void { + var tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + // Разбиение с опорными указателями + pub fn partition(nums: []i32, left: usize, right: usize) usize { + // Взять nums[left] в качестве опорного элемента + var i = left; + var j = right; + while (i < j) { + while (i < j and nums[j] >= nums[left]) j -= 1; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j and nums[i] <= nums[left]) i += 1; // Идти слева направо в поисках первого элемента больше опорного + swap(nums, i, j); // Поменять эти два элемента местами + } + swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + // Быстрая сортировка + pub fn quickSort(nums: []i32, left: usize, right: usize) void { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) return; + // Разбиение с опорными указателями + var pivot = partition(nums, left, right); + // Рекурсивно обработать левый и правый подмассивы + quickSort(nums, left, pivot - 1); + quickSort(nums, pivot + 1, right); + } +}; + +// Класс быстрой сортировки (оптимизация медианным опорным элементом) +const QuickSortMedian = struct { + + // Обмен элементов + pub fn swap(nums: []i32, i: usize, j: usize) void { + var tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + // Выбрать медиану из трех кандидатов + pub fn medianThree(nums: []i32, left: usize, mid: usize, right: usize) usize { + var l = nums[left]; + var m = nums[mid]; + var r = nums[right]; + if ((l <= m && m <= r) || (r <= m && m <= l)) + return mid; // m находится между l и r + if ((m <= l && l <= r) || (r <= l && l <= m)) + return left; // l находится между m и r + return right; + } + + // Разбиение с опорными указателями (медиана трех) + pub fn partition(nums: []i32, left: usize, right: usize) usize { + // Выбрать медиану из трех кандидатов + var med = medianThree(nums, left, (left + right) / 2, right); + // Переместить медиану в крайний левый элемент массива + swap(nums, left, med); + // Взять nums[left] в качестве опорного элемента + var i = left; + var j = right; + while (i < j) { + while (i < j and nums[j] >= nums[left]) j -= 1; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j and nums[i] <= nums[left]) i += 1; // Идти слева направо в поисках первого элемента больше опорного + swap(nums, i, j); // Поменять эти два элемента местами + } + swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + // Быстрая сортировка + pub fn quickSort(nums: []i32, left: usize, right: usize) void { + // Завершить рекурсию, когда длина подмассива равна 1 + if (left >= right) return; + // Разбиение с опорными указателями + var pivot = partition(nums, left, right); + if (pivot == 0) return; + // Рекурсивно обработать левый и правый подмассивы + quickSort(nums, left, pivot - 1); + quickSort(nums, pivot + 1, right); + } +}; + +// Класс быстрой сортировки (оптимизация глубины рекурсии) +const QuickSortTailCall = struct { + + // Обмен элементов + pub fn swap(nums: []i32, i: usize, j: usize) void { + var tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + // Разбиение с опорными указателями + pub fn partition(nums: []i32, left: usize, right: usize) usize { + // Взять nums[left] в качестве опорного элемента + var i = left; + var j = right; + while (i < j) { + while (i < j and nums[j] >= nums[left]) j -= 1; // Идти справа налево в поисках первого элемента меньше опорного + while (i < j and nums[i] <= nums[left]) i += 1; // Идти слева направо в поисках первого элемента больше опорного + swap(nums, i, j); // Поменять эти два элемента местами + } + swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов + return i; // Вернуть индекс опорного элемента + } + + // Быстрая сортировка (оптимизация глубины рекурсии) + pub fn quickSort(nums: []i32, left_: usize, right_: usize) void { + var left = left_; + var right = right_; + // Завершить рекурсию, когда длина подмассива равна 1 + while (left < right) { + // Операция разбиения с опорными указателями + var pivot = partition(nums, left, right); + // Выполнить быструю сортировку для более короткого из двух подмассивов + if (pivot - left < right - pivot) { + quickSort(nums, left, pivot - 1); // Рекурсивно отсортировать левый подмассив + left = pivot + 1; // Оставшийся неотсортированный диапазон: [pivot + 1, right] + } else { + quickSort(nums, pivot + 1, right); // Рекурсивно отсортировать правый подмассив + right = pivot - 1; // Оставшийся неотсортированный диапазон: [left, pivot - 1] + } + } + } +}; + +// Driver Code +pub fn main() !void { + // Быстрая сортировка + var nums = [_]i32{ 2, 4, 1, 0, 3, 5 }; + QuickSort.quickSort(&nums, 0, nums.len - 1); + std.debug.print("После завершения быстрой сортировки nums = ", .{}); + inc.PrintUtil.printArray(i32, &nums); + + // Быстрая сортировка (оптимизация медианным опорным элементом) + var nums1 = [_]i32{ 2, 4, 1, 0, 3, 5 }; + QuickSortMedian.quickSort(&nums1, 0, nums1.len - 1); + std.debug.print("\nПосле завершения быстрой сортировки (оптимизация медианным опорным элементом) nums = ", .{}); + inc.PrintUtil.printArray(i32, &nums1); + + // Быстрая сортировка (оптимизация глубины рекурсии) + var nums2 = [_]i32{ 2, 4, 1, 0, 3, 5 }; + QuickSortTailCall.quickSort(&nums2, 0, nums2.len - 1); + std.debug.print("\nПосле завершения быстрой сортировки (оптимизация глубины рекурсии) nums = ", .{}); + inc.PrintUtil.printArray(i32, &nums2); + + _ = try std.io.getStdIn().reader().readByte(); +} \ No newline at end of file diff --git a/ru/codes/zig/chapter_sorting/radix_sort.zig b/ru/codes/zig/chapter_sorting/radix_sort.zig new file mode 100644 index 000000000..7e96b6e97 --- /dev/null +++ b/ru/codes/zig/chapter_sorting/radix_sort.zig @@ -0,0 +1,77 @@ +// File: radix_sort.zig +// Created Time: 2023-01-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Получить k-й разряд элемента num, где exp = 10^(k-1) +fn digit(num: i32, exp: i32) i32 { + // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени + return @mod(@divFloor(num, exp), 10); +} + +// Сортировка подсчетом (сортировка по k-му разряду nums) +fn countingSortDigit(nums: []i32, exp: i32) !void { + // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10 + var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + // defer mem_arena.deinit(); + const mem_allocator = mem_arena.allocator(); + var counter = try mem_allocator.alloc(usize, 10); + @memset(counter, 0); + var n = nums.len; + // Подсчитать число появлений каждой цифры от 0 до 9 + for (nums) |num| { + var d: u32 = @bitCast(digit(num, exp)); // Получить k-й разряд nums[i], обозначив его как d + counter[d] += 1; // Подсчитать число появлений цифры d + } + // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива» + var i: usize = 1; + while (i < 10) : (i += 1) { + counter[i] += counter[i - 1]; + } + // Выполняя обратный проход, заполнить res элементами по статистике в корзинах + var res = try mem_allocator.alloc(i32, n); + i = n - 1; + while (i >= 0) : (i -= 1) { + var d: u32 = @bitCast(digit(nums[i], exp)); + var j = counter[d] - 1; // Получить индекс j цифры d в массиве + res[j] = nums[i]; // Поместить текущий элемент по индексу j + counter[d] -= 1; // Уменьшить количество d на 1 + if (i == 0) break; + } + // Перезаписать исходный массив nums результатом + i = 0; + while (i < n) : (i += 1) { + nums[i] = res[i]; + } +} + +// Поразрядная сортировка +fn radixSort(nums: []i32) !void { + // Получить максимальный элемент массива, чтобы определить максимальное число разрядов + var m: i32 = std.math.minInt(i32); + for (nums) |num| { + if (num > m) m = num; + } + // Проходить разряды от младшего к старшему + var exp: i32 = 1; + while (exp <= m) : (exp *= 10) { + // Выполнить сортировку подсчетом по k-му разряду элементов массива + // k = 1 -> exp = 1 + // k = 2 -> exp = 10 + // то есть exp = 10^(k-1) + try countingSortDigit(nums, exp); + } +} + +// Driver Code +pub fn main() !void { + // Поразрядная сортировка + var nums = [_]i32{ 23, 12, 3, 4, 788, 192 }; + try radixSort(&nums); + std.debug.print("После завершения поразрядной сортировки nums = ", .{}); + inc.PrintUtil.printArray(i32, &nums); + + _ = try std.io.getStdIn().reader().readByte(); +} \ No newline at end of file diff --git a/ru/codes/zig/chapter_stack_and_queue/array_queue.zig b/ru/codes/zig/chapter_stack_and_queue/array_queue.zig new file mode 100644 index 000000000..97861e3e7 --- /dev/null +++ b/ru/codes/zig/chapter_stack_and_queue/array_queue.zig @@ -0,0 +1,140 @@ +// File: array_queue.zig +// Created Time: 2023-01-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Очередь на основе кольцевого массива +pub fn ArrayQueue(comptime T: type) type { + return struct { + const Self = @This(); + + nums: []T = undefined, // Массив для хранения элементов очереди + cap: usize = 0, // Вместимость очереди + front: usize = 0, // Указатель head, указывающий на первый элемент очереди + queSize: usize = 0, // Указатель хвоста, указывающий на позицию после хвоста + mem_arena: ?std.heap.ArenaAllocator = null, + mem_allocator: std.mem.Allocator = undefined, // Аллокатор памяти + + // Конструктор (выделение памяти + инициализация массива) + pub fn init(self: *Self, allocator: std.mem.Allocator, cap: usize) !void { + if (self.mem_arena == null) { + self.mem_arena = std.heap.ArenaAllocator.init(allocator); + self.mem_allocator = self.mem_arena.?.allocator(); + } + self.cap = cap; + self.nums = try self.mem_allocator.alloc(T, self.cap); + @memset(self.nums, @as(T, 0)); + } + + // Деструктор (освобождение памяти) + pub fn deinit(self: *Self) void { + if (self.mem_arena == null) return; + self.mem_arena.?.deinit(); + } + + // Получить вместимость очереди + pub fn capacity(self: *Self) usize { + return self.cap; + } + + // Получение длины очереди + pub fn size(self: *Self) usize { + return self.queSize; + } + + // Проверка, пуста ли очередь + pub fn isEmpty(self: *Self) bool { + return self.queSize == 0; + } + + // Поместить в очередь + pub fn push(self: *Self, num: T) !void { + if (self.size() == self.capacity()) { + std.debug.print("Очередь заполнена\n", .{}); + return; + } + // Вычислить указатель хвоста, указывающий на индекс хвоста + 1 + // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива + var rear = (self.front + self.queSize) % self.capacity(); + // Добавить num после хвостового узла + self.nums[rear] = num; + self.queSize += 1; + } + + // Извлечь из очереди + pub fn pop(self: *Self) T { + var num = self.peek(); + // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива + self.front = (self.front + 1) % self.capacity(); + self.queSize -= 1; + return num; + } + + // Доступ к элементу в начале очереди + pub fn peek(self: *Self) T { + if (self.isEmpty()) @panic("очередь пуста"); + return self.nums[self.front]; + } + + // Вернуть массив + pub fn toArray(self: *Self) ![]T { + // Преобразовывать только элементы списка в пределах фактической длины + var res = try self.mem_allocator.alloc(T, self.size()); + @memset(res, @as(T, 0)); + var i: usize = 0; + var j: usize = self.front; + while (i < self.size()) : ({ i += 1; j += 1; }) { + res[i] = self.nums[j % self.capacity()]; + } + return res; + } + }; +} + +// Driver Code +pub fn main() !void { + // Инициализация очереди + var capacity: usize = 10; + var queue = ArrayQueue(i32){}; + try queue.init(std.heap.page_allocator, capacity); + defer queue.deinit(); + + // Добавление элемента в очередь + try queue.push(1); + try queue.push(3); + try queue.push(2); + try queue.push(5); + try queue.push(4); + std.debug.print("Очередь queue = ", .{}); + inc.PrintUtil.printArray(i32, try queue.toArray()); + + // Доступ к элементу в начале очереди + var peek = queue.peek(); + std.debug.print("\nЭлемент в начале очереди peek = {}", .{peek}); + + // Извлечение элемента из очереди + var pop = queue.pop(); + std.debug.print("\nИзвлечен элемент pop = {}, очередь после извлечения queue = ", .{pop}); + inc.PrintUtil.printArray(i32, try queue.toArray()); + + // Получение длины очереди + var size = queue.size(); + std.debug.print("\nДлина очереди size = {}", .{size}); + + // Проверка, пуста ли очередь + var is_empty = queue.isEmpty(); + std.debug.print("\nПуста ли очередь = {}", .{is_empty}); + + // Проверка кольцевого массива + var i: i32 = 0; + while (i < 10) : (i += 1) { + try queue.push(i); + _ = queue.pop(); + std.debug.print("\nПосле {}-го добавления и извлечения queue = ", .{i}); + inc.PrintUtil.printArray(i32, try queue.toArray()); + } + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_stack_and_queue/array_stack.zig b/ru/codes/zig/chapter_stack_and_queue/array_stack.zig new file mode 100644 index 000000000..983edf630 --- /dev/null +++ b/ru/codes/zig/chapter_stack_and_queue/array_stack.zig @@ -0,0 +1,97 @@ +// File: array_stack.zig +// Created Time: 2023-01-08 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Стек на основе массива +pub fn ArrayStack(comptime T: type) type { + return struct { + const Self = @This(); + + stack: ?std.ArrayList(T) = null, + + // Конструктор (выделение памяти + инициализация стека) + pub fn init(self: *Self, allocator: std.mem.Allocator) void { + if (self.stack == null) { + self.stack = std.ArrayList(T).init(allocator); + } + } + + // Деструктор (освобождение памяти) + pub fn deinit(self: *Self) void { + if (self.stack == null) return; + self.stack.?.deinit(); + } + + // Получение длины стека + pub fn size(self: *Self) usize { + return self.stack.?.items.len; + } + + // Проверка, пуст ли стек + pub fn isEmpty(self: *Self) bool { + return self.size() == 0; + } + + // Доступ к верхнему элементу стека + pub fn peek(self: *Self) T { + if (self.isEmpty()) @panic("стек пуст"); + return self.stack.?.items[self.size() - 1]; + } + + // Поместить в стек + pub fn push(self: *Self, num: T) !void { + try self.stack.?.append(num); + } + + // Извлечь из стека + pub fn pop(self: *Self) T { + var num = self.stack.?.pop(); + return num; + } + + // Вернуть ArrayList + pub fn toList(self: *Self) std.ArrayList(T) { + return self.stack.?; + } + }; +} + +// Driver Code +pub fn main() !void { + // Инициализация стека + var stack = ArrayStack(i32){}; + stack.init(std.heap.page_allocator); + // Отложенное освобождение памяти + defer stack.deinit(); + + // Помещение элемента в стек + try stack.push(1); + try stack.push(3); + try stack.push(2); + try stack.push(5); + try stack.push(4); + std.debug.print("Стек stack = ", .{}); + inc.PrintUtil.printList(i32, stack.toList()); + + // Доступ к верхнему элементу стека + var peek = stack.peek(); + std.debug.print("\nВерхний элемент стека peek = {}", .{peek}); + + // Извлечение элемента из стека + var top = stack.pop(); + std.debug.print("\nИзвлечен элемент pop = {}, стек после извлечения stack = ", .{top}); + inc.PrintUtil.printList(i32, stack.toList()); + + // Получение длины стека + var size = stack.size(); + std.debug.print("\nДлина стека size = {}", .{size}); + + // Проверка, пуст ли стек + var is_empty = stack.isEmpty(); + std.debug.print("\nПуст ли стек = {}", .{is_empty}); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_stack_and_queue/deque.zig b/ru/codes/zig/chapter_stack_and_queue/deque.zig new file mode 100644 index 000000000..b5764e4a4 --- /dev/null +++ b/ru/codes/zig/chapter_stack_and_queue/deque.zig @@ -0,0 +1,51 @@ +// File: deque.zig +// Created Time: 2023-01-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Driver Code +pub fn main() !void { + // Инициализация двусторонней очереди + const L = std.TailQueue(i32); + var deque = L{}; + + // Добавление элемента в очередь + var node1 = L.Node{ .data = 2 }; + var node2 = L.Node{ .data = 5 }; + var node3 = L.Node{ .data = 4 }; + var node4 = L.Node{ .data = 3 }; + var node5 = L.Node{ .data = 1 }; + deque.append(&node1); // Добавить в хвост очереди + deque.append(&node2); + deque.append(&node3); + deque.prepend(&node4); // Добавить в голову очереди + deque.prepend(&node5); + std.debug.print("Двусторонняя очередь deque = ", .{}); + inc.PrintUtil.printQueue(i32, deque); + + // Доступ к элементу + var peek_first = deque.first.?.data; // Элемент в голове очереди + std.debug.print("\nЭлемент в начале очереди peek_first = {}", .{peek_first}); + var peek_last = deque.last.?.data; // Элемент в хвосте очереди + std.debug.print("\nЭлемент в конце очереди peek_last = {}", .{peek_last}); + + // Извлечение элемента из очереди + var pop_first = deque.popFirst().?.data; // Извлечь элемент из головы очереди + std.debug.print("\nИзвлечен элемент из головы pop_first = {}, deque после извлечения из головы = ", .{pop_first}); + inc.PrintUtil.printQueue(i32, deque); + var pop_last = deque.pop().?.data; // Извлечь элемент из хвоста очереди + std.debug.print("\nИзвлечен элемент из хвоста pop_last = {}, deque после извлечения из хвоста = ", .{pop_last}); + inc.PrintUtil.printQueue(i32, deque); + + // Получение длины двусторонней очереди + var size = deque.len; + std.debug.print("\nДлина двусторонней очереди size = {}", .{size}); + + // Проверка, пуста ли двусторонняя очередь + var is_empty = if (deque.len == 0) true else false; + std.debug.print("\nПуста ли двусторонняя очередь = {}", .{is_empty}); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_stack_and_queue/linkedlist_deque.zig b/ru/codes/zig/chapter_stack_and_queue/linkedlist_deque.zig new file mode 100644 index 000000000..268b47516 --- /dev/null +++ b/ru/codes/zig/chapter_stack_and_queue/linkedlist_deque.zig @@ -0,0 +1,207 @@ +// File: linkedlist_deque.zig +// Created Time: 2023-01-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Узел двусвязного списка +pub fn ListNode(comptime T: type) type { + return struct { + const Self = @This(); + + val: T = undefined, // Значение узла + next: ?*Self = null, // Указатель на узел-преемник + prev: ?*Self = null, // Указатель на узел-предшественник + + // Initialize a list node with specific value + pub fn init(self: *Self, x: i32) void { + self.val = x; + self.next = null; + self.prev = null; + } + }; +} + +// Двусторонняя очередь на основе двусвязного списка +pub fn LinkedListDeque(comptime T: type) type { + return struct { + const Self = @This(); + + front: ?*ListNode(T) = null, // Головной узел front + rear: ?*ListNode(T) = null, // Хвостовой узел rear + que_size: usize = 0, // Длина двусторонней очереди + mem_arena: ?std.heap.ArenaAllocator = null, + mem_allocator: std.mem.Allocator = undefined, // Аллокатор памяти + + // Конструктор (выделение памяти + инициализация очереди) + pub fn init(self: *Self, allocator: std.mem.Allocator) !void { + if (self.mem_arena == null) { + self.mem_arena = std.heap.ArenaAllocator.init(allocator); + self.mem_allocator = self.mem_arena.?.allocator(); + } + self.front = null; + self.rear = null; + self.que_size = 0; + } + + // Деструктор (освобождение памяти) + pub fn deinit(self: *Self) void { + if (self.mem_arena == null) return; + self.mem_arena.?.deinit(); + } + + // Получение длины двусторонней очереди + pub fn size(self: *Self) usize { + return self.que_size; + } + + // Проверка, пуста ли двусторонняя очередь + pub fn isEmpty(self: *Self) bool { + return self.size() == 0; + } + + // Операция добавления в очередь + pub fn push(self: *Self, num: T, is_front: bool) !void { + var node = try self.mem_allocator.create(ListNode(T)); + node.init(num); + // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node + if (self.isEmpty()) { + self.front = node; + self.rear = node; + // Операция добавления в голову очереди + } else if (is_front) { + // Добавить node в голову списка + self.front.?.prev = node; + node.next = self.front; + self.front = node; // Обновить головной узел + // Операция добавления в хвост очереди + } else { + // Добавить node в хвост списка + self.rear.?.next = node; + node.prev = self.rear; + self.rear = node; // Обновить хвостовой узел + } + self.que_size += 1; // Обновить длину очереди + } + + // Добавление в голову очереди + pub fn pushFirst(self: *Self, num: T) !void { + try self.push(num, true); + } + + // Добавление в хвост очереди + pub fn pushLast(self: *Self, num: T) !void { + try self.push(num, false); + } + + // Операция извлечения из очереди + pub fn pop(self: *Self, is_front: bool) T { + if (self.isEmpty()) @panic("двусторонняя очередь пуста"); + var val: T = undefined; + // Операция извлечения из головы очереди + if (is_front) { + val = self.front.?.val; // Временно сохранить значение головного узла + // Удалить головной узел + var fNext = self.front.?.next; + if (fNext != null) { + fNext.?.prev = null; + self.front.?.next = null; + } + self.front = fNext; // Обновить головной узел + // Операция извлечения из хвоста очереди + } else { + val = self.rear.?.val; // Временно сохранить значение хвостового узла + // Удалить хвостовой узел + var rPrev = self.rear.?.prev; + if (rPrev != null) { + rPrev.?.next = null; + self.rear.?.prev = null; + } + self.rear = rPrev; // Обновить хвостовой узел + } + self.que_size -= 1; // Обновить длину очереди + return val; + } + + // Извлечение из головы очереди + pub fn popFirst(self: *Self) T { + return self.pop(true); + } + + // Извлечение из хвоста очереди + pub fn popLast(self: *Self) T { + return self.pop(false); + } + + // Доступ к элементу в начале очереди + pub fn peekFirst(self: *Self) T { + if (self.isEmpty()) @panic("двусторонняя очередь пуста"); + return self.front.?.val; + } + + // Доступ к элементу в конце очереди + pub fn peekLast(self: *Self) T { + if (self.isEmpty()) @panic("двусторонняя очередь пуста"); + return self.rear.?.val; + } + + // Вернуть массив для вывода + pub fn toArray(self: *Self) ![]T { + var node = self.front; + var res = try self.mem_allocator.alloc(T, self.size()); + @memset(res, @as(T, 0)); + var i: usize = 0; + while (i < res.len) : (i += 1) { + res[i] = node.?.val; + node = node.?.next; + } + return res; + } + }; +} + +// Driver Code +pub fn main() !void { + // Инициализация двусторонней очереди + var deque = LinkedListDeque(i32){}; + try deque.init(std.heap.page_allocator); + defer deque.deinit(); + try deque.pushLast(3); + try deque.pushLast(2); + try deque.pushLast(5); + std.debug.print("Двусторонняя очередь deque = ", .{}); + inc.PrintUtil.printArray(i32, try deque.toArray()); + + // Доступ к элементу + var peek_first = deque.peekFirst(); + std.debug.print("\nЭлемент в начале очереди peek_first = {}", .{peek_first}); + var peek_last = deque.peekLast(); + std.debug.print("\nЭлемент в конце очереди peek_last = {}", .{peek_last}); + + // Добавление элемента в очередь + try deque.pushLast(4); + std.debug.print("\nПосле добавления элемента 4 в хвост deque = ", .{}); + inc.PrintUtil.printArray(i32, try deque.toArray()); + try deque.pushFirst(1); + std.debug.print("\nПосле добавления элемента 1 в голову deque = ", .{}); + inc.PrintUtil.printArray(i32, try deque.toArray()); + + // Извлечение элемента из очереди + var pop_last = deque.popLast(); + std.debug.print("\nИзвлечен элемент из хвоста = {}, deque после извлечения из хвоста = ", .{pop_last}); + inc.PrintUtil.printArray(i32, try deque.toArray()); + var pop_first = deque.popFirst(); + std.debug.print("\nИзвлечен элемент из головы = {}, deque после извлечения из головы = ", .{pop_first}); + inc.PrintUtil.printArray(i32, try deque.toArray()); + + // Получение длины двусторонней очереди + var size = deque.size(); + std.debug.print("\nДлина двусторонней очереди size = {}", .{size}); + + // Проверка, пуста ли двусторонняя очередь + var is_empty = deque.isEmpty(); + std.debug.print("\nПуста ли двусторонняя очередь = {}", .{is_empty}); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_stack_and_queue/linkedlist_queue.zig b/ru/codes/zig/chapter_stack_and_queue/linkedlist_queue.zig new file mode 100644 index 000000000..6a03fa58b --- /dev/null +++ b/ru/codes/zig/chapter_stack_and_queue/linkedlist_queue.zig @@ -0,0 +1,127 @@ +// File: linkedlist_queue.zig +// Created Time: 2023-01-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Очередь на основе связного списка +pub fn LinkedListQueue(comptime T: type) type { + return struct { + const Self = @This(); + + front: ?*inc.ListNode(T) = null, // Головной узел front + rear: ?*inc.ListNode(T) = null, // Хвостовой узел rear + que_size: usize = 0, // Длина очереди + mem_arena: ?std.heap.ArenaAllocator = null, + mem_allocator: std.mem.Allocator = undefined, // Аллокатор памяти + + // Конструктор (выделение памяти + инициализация очереди) + pub fn init(self: *Self, allocator: std.mem.Allocator) !void { + if (self.mem_arena == null) { + self.mem_arena = std.heap.ArenaAllocator.init(allocator); + self.mem_allocator = self.mem_arena.?.allocator(); + } + self.front = null; + self.rear = null; + self.que_size = 0; + } + + // Деструктор (освобождение памяти) + pub fn deinit(self: *Self) void { + if (self.mem_arena == null) return; + self.mem_arena.?.deinit(); + } + + // Получение длины очереди + pub fn size(self: *Self) usize { + return self.que_size; + } + + // Проверка, пуста ли очередь + pub fn isEmpty(self: *Self) bool { + return self.size() == 0; + } + + // Доступ к элементу в начале очереди + pub fn peek(self: *Self) T { + if (self.size() == 0) @panic("очередь пуста"); + return self.front.?.val; + } + + // Поместить в очередь + pub fn push(self: *Self, num: T) !void { + // Добавить num после хвостового узла + var node = try self.mem_allocator.create(inc.ListNode(T)); + node.init(num); + // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел + if (self.front == null) { + self.front = node; + self.rear = node; + // Если очередь не пуста, добавить этот узел после хвостового узла + } else { + self.rear.?.next = node; + self.rear = node; + } + self.que_size += 1; + } + + // Извлечь из очереди + pub fn pop(self: *Self) T { + var num = self.peek(); + // Удалить головной узел + self.front = self.front.?.next; + self.que_size -= 1; + return num; + } + + // Преобразовать связный список в массив + pub fn toArray(self: *Self) ![]T { + var node = self.front; + var res = try self.mem_allocator.alloc(T, self.size()); + @memset(res, @as(T, 0)); + var i: usize = 0; + while (i < res.len) : (i += 1) { + res[i] = node.?.val; + node = node.?.next; + } + return res; + } + }; +} + +// Driver Code +pub fn main() !void { + // Инициализация очереди + var queue = LinkedListQueue(i32){}; + try queue.init(std.heap.page_allocator); + defer queue.deinit(); + + // Добавление элемента в очередь + try queue.push(1); + try queue.push(3); + try queue.push(2); + try queue.push(5); + try queue.push(4); + std.debug.print("Очередь queue = ", .{}); + inc.PrintUtil.printArray(i32, try queue.toArray()); + + // Доступ к элементу в начале очереди + var peek = queue.peek(); + std.debug.print("\nЭлемент в начале очереди peek = {}", .{peek}); + + // Извлечение элемента из очереди + var pop = queue.pop(); + std.debug.print("\nИзвлечен элемент pop = {}, очередь после извлечения queue = ", .{pop}); + inc.PrintUtil.printArray(i32, try queue.toArray()); + + // Получение длины очереди + var size = queue.size(); + std.debug.print("\nДлина очереди size = {}", .{size}); + + // Проверка, пуста ли очередь + var is_empty = queue.isEmpty(); + std.debug.print("\nПуста ли очередь = {}", .{is_empty}); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_stack_and_queue/linkedlist_stack.zig b/ru/codes/zig/chapter_stack_and_queue/linkedlist_stack.zig new file mode 100644 index 000000000..77d87d234 --- /dev/null +++ b/ru/codes/zig/chapter_stack_and_queue/linkedlist_stack.zig @@ -0,0 +1,118 @@ +// File: linkedlist_stack.zig +// Created Time: 2023-01-08 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Стек на основе связного списка +pub fn LinkedListStack(comptime T: type) type { + return struct { + const Self = @This(); + + stack_top: ?*inc.ListNode(T) = null, // Использовать головной узел как вершину стека + stk_size: usize = 0, // Длина стека + mem_arena: ?std.heap.ArenaAllocator = null, + mem_allocator: std.mem.Allocator = undefined, // Аллокатор памяти + + // Конструктор (выделение памяти + инициализация стека) + pub fn init(self: *Self, allocator: std.mem.Allocator) !void { + if (self.mem_arena == null) { + self.mem_arena = std.heap.ArenaAllocator.init(allocator); + self.mem_allocator = self.mem_arena.?.allocator(); + } + self.stack_top = null; + self.stk_size = 0; + } + + // Деструктор (освобождение памяти) + pub fn deinit(self: *Self) void { + if (self.mem_arena == null) return; + self.mem_arena.?.deinit(); + } + + // Получение длины стека + pub fn size(self: *Self) usize { + return self.stk_size; + } + + // Проверка, пуст ли стек + pub fn isEmpty(self: *Self) bool { + return self.size() == 0; + } + + // Доступ к верхнему элементу стека + pub fn peek(self: *Self) T { + if (self.size() == 0) @panic("стек пуст"); + return self.stack_top.?.val; + } + + // Поместить в стек + pub fn push(self: *Self, num: T) !void { + var node = try self.mem_allocator.create(inc.ListNode(T)); + node.init(num); + node.next = self.stack_top; + self.stack_top = node; + self.stk_size += 1; + } + + // Извлечь из стека + pub fn pop(self: *Self) T { + var num = self.peek(); + self.stack_top = self.stack_top.?.next; + self.stk_size -= 1; + return num; + } + + // Преобразовать стек в массив + pub fn toArray(self: *Self) ![]T { + var node = self.stack_top; + var res = try self.mem_allocator.alloc(T, self.size()); + @memset(res, @as(T, 0)); + var i: usize = 0; + while (i < res.len) : (i += 1) { + res[res.len - i - 1] = node.?.val; + node = node.?.next; + } + return res; + } + }; +} + +// Driver Code +pub fn main() !void { + // Инициализация стека + var stack = LinkedListStack(i32){}; + try stack.init(std.heap.page_allocator); + // Отложенное освобождение памяти + defer stack.deinit(); + + // Помещение элемента в стек + try stack.push(1); + try stack.push(3); + try stack.push(2); + try stack.push(5); + try stack.push(4); + std.debug.print("Стек stack = ", .{}); + inc.PrintUtil.printArray(i32, try stack.toArray()); + + // Доступ к верхнему элементу стека + var peek = stack.peek(); + std.debug.print("\nВерхний элемент стека top = {}", .{peek}); + + // Извлечение элемента из стека + var pop = stack.pop(); + std.debug.print("\nИзвлечен элемент pop = {}, стек после извлечения stack = ", .{pop}); + inc.PrintUtil.printArray(i32, try stack.toArray()); + + // Получение длины стека + var size = stack.size(); + std.debug.print("\nДлина стека size = {}", .{size}); + + // Проверка, пуст ли стек + var is_empty = stack.isEmpty(); + std.debug.print("\nПуст ли стек = {}", .{is_empty}); + + _ = try std.io.getStdIn().reader().readByte(); +} + diff --git a/ru/codes/zig/chapter_stack_and_queue/queue.zig b/ru/codes/zig/chapter_stack_and_queue/queue.zig new file mode 100644 index 000000000..98b80e837 --- /dev/null +++ b/ru/codes/zig/chapter_stack_and_queue/queue.zig @@ -0,0 +1,46 @@ +// File: queue.zig +// Created Time: 2023-01-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Driver Code +pub fn main() !void { + // Инициализация очереди + const L = std.TailQueue(i32); + var queue = L{}; + + // Добавление элемента в очередь + var node1 = L.Node{ .data = 1 }; + var node2 = L.Node{ .data = 3 }; + var node3 = L.Node{ .data = 2 }; + var node4 = L.Node{ .data = 5 }; + var node5 = L.Node{ .data = 4 }; + queue.append(&node1); + queue.append(&node2); + queue.append(&node3); + queue.append(&node4); + queue.append(&node5); + std.debug.print("Очередь queue = ", .{}); + inc.PrintUtil.printQueue(i32, queue); + + // Доступ к элементу в начале очереди + var peek = queue.first.?.data; + std.debug.print("\nЭлемент в начале очереди peek = {}", .{peek}); + + // Извлечение элемента из очереди + var pop = queue.popFirst().?.data; + std.debug.print("\nИзвлечен элемент pop = {}, очередь после извлечения queue = ", .{pop}); + inc.PrintUtil.printQueue(i32, queue); + + // Получение длины очереди + var size = queue.len; + std.debug.print("\nДлина очереди size = {}", .{size}); + + // Проверка, пуста ли очередь + var is_empty = if (queue.len == 0) true else false; + std.debug.print("\nПуста ли очередь = {}", .{is_empty}); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_stack_and_queue/stack.zig b/ru/codes/zig/chapter_stack_and_queue/stack.zig new file mode 100644 index 000000000..9fdfd718b --- /dev/null +++ b/ru/codes/zig/chapter_stack_and_queue/stack.zig @@ -0,0 +1,43 @@ +// File: stack.zig +// Created Time: 2023-01-08 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Driver Code +pub fn main() !void { + // Инициализировать стек + // В Zig рекомендуется использовать ArrayList как стек + var stack = std.ArrayList(i32).init(std.heap.page_allocator); + // Отложенное освобождение памяти + defer stack.deinit(); + + // Помещение элемента в стек + try stack.append(1); + try stack.append(3); + try stack.append(2); + try stack.append(5); + try stack.append(4); + std.debug.print("Стек stack = ", .{}); + inc.PrintUtil.printList(i32, stack); + + // Доступ к верхнему элементу стека + var peek = stack.items[stack.items.len - 1]; + std.debug.print("\nВерхний элемент стека peek = {}", .{peek}); + + // Извлечение элемента из стека + var pop = stack.pop(); + std.debug.print("\nИзвлечен элемент pop = {}, стек после извлечения stack = ", .{pop}); + inc.PrintUtil.printList(i32, stack); + + // Получение длины стека + var size = stack.items.len; + std.debug.print("\nДлина стека size = {}", .{size}); + + // Проверка, пуст ли стек + var is_empty = if (stack.items.len == 0) true else false; + std.debug.print("\nПуст ли стек = {}", .{is_empty}); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_tree/avl_tree.zig b/ru/codes/zig/chapter_tree/avl_tree.zig new file mode 100644 index 000000000..d50317695 --- /dev/null +++ b/ru/codes/zig/chapter_tree/avl_tree.zig @@ -0,0 +1,249 @@ +// File: avl_tree.zig +// Created Time: 2023-01-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// AVL-дерево +pub fn AVLTree(comptime T: type) type { + return struct { + const Self = @This(); + + root: ?*inc.TreeNode(T) = null, // Корневой узел + mem_arena: ?std.heap.ArenaAllocator = null, + mem_allocator: std.mem.Allocator = undefined, // Аллокатор памяти + + // Конструктор + pub fn init(self: *Self, allocator: std.mem.Allocator) void { + if (self.mem_arena == null) { + self.mem_arena = std.heap.ArenaAllocator.init(allocator); + self.mem_allocator = self.mem_arena.?.allocator(); + } + } + + // Метод-деструктор + pub fn deinit(self: *Self) void { + if (self.mem_arena == null) return; + self.mem_arena.?.deinit(); + } + + // Получить высоту узла + fn height(self: *Self, node: ?*inc.TreeNode(T)) i32 { + _ = self; + // Высота пустого узла равна -1, высота листового узла равна 0 + return if (node == null) -1 else node.?.height; + } + + // Обновить высоту узла + fn updateHeight(self: *Self, node: ?*inc.TreeNode(T)) void { + // Высота узла равна высоте более высокого поддерева + 1 + node.?.height = @max(self.height(node.?.left), self.height(node.?.right)) + 1; + } + + // Получить коэффициент баланса + fn balanceFactor(self: *Self, node: ?*inc.TreeNode(T)) i32 { + // Коэффициент баланса пустого узла равен 0 + if (node == null) return 0; + // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева + return self.height(node.?.left) - self.height(node.?.right); + } + + // Операция правого вращения + fn rightRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) { + var child = node.?.left; + var grandChild = child.?.right; + // Выполнить правое вращение узла node вокруг child + child.?.right = node; + node.?.left = grandChild; + // Обновить высоту узла + self.updateHeight(node); + self.updateHeight(child); + // Вернуть корневой узел поддерева после вращения + return child; + } + + // Операция левого вращения + fn leftRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) { + var child = node.?.right; + var grandChild = child.?.left; + // Выполнить левое вращение узла node вокруг child + child.?.left = node; + node.?.right = grandChild; + // Обновить высоту узла + self.updateHeight(node); + self.updateHeight(child); + // Вернуть корневой узел поддерева после вращения + return child; + } + + // Выполнить вращение, чтобы снова сбалансировать поддерево + fn rotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) { + // Получить коэффициент баланса узла node + var balance_factor = self.balanceFactor(node); + // Левосторонне перекошенное дерево + if (balance_factor > 1) { + if (self.balanceFactor(node.?.left) >= 0) { + // Правое вращение + return self.rightRotate(node); + } else { + // Сначала левое вращение, затем правое + node.?.left = self.leftRotate(node.?.left); + return self.rightRotate(node); + } + } + // Правосторонне перекошенное дерево + if (balance_factor < -1) { + if (self.balanceFactor(node.?.right) <= 0) { + // Левое вращение + return self.leftRotate(node); + } else { + // Сначала правое вращение, затем левое + node.?.right = self.rightRotate(node.?.right); + return self.leftRotate(node); + } + } + // Дерево сбалансировано, вращение не требуется, вернуть сразу + return node; + } + + // Вставка узла + fn insert(self: *Self, val: T) !void { + self.root = (try self.insertHelper(self.root, val)).?; + } + + // Рекурсивная вставка узла (вспомогательный метод) + fn insertHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) !?*inc.TreeNode(T) { + var node = node_; + if (node == null) { + var tmp_node = try self.mem_allocator.create(inc.TreeNode(T)); + tmp_node.init(val); + return tmp_node; + } + // 1. Найти позицию вставки и вставить узел + if (val < node.?.val) { + node.?.left = try self.insertHelper(node.?.left, val); + } else if (val > node.?.val) { + node.?.right = try self.insertHelper(node.?.right, val); + } else { + return node; // Повторяющийся узел не вставлять, сразу вернуть + } + self.updateHeight(node); // Обновить высоту узла + // 2. Выполнить вращение, чтобы снова сбалансировать поддерево + node = self.rotate(node); + // Вернуть корневой узел поддерева + return node; + } + + // Удаление узла + fn remove(self: *Self, val: T) void { + self.root = self.removeHelper(self.root, val).?; + } + + // Рекурсивное удаление узла (вспомогательный метод) + fn removeHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) ?*inc.TreeNode(T) { + var node = node_; + if (node == null) return null; + // 1. Найти узел и удалить его + if (val < node.?.val) { + node.?.left = self.removeHelper(node.?.left, val); + } else if (val > node.?.val) { + node.?.right = self.removeHelper(node.?.right, val); + } else { + if (node.?.left == null or node.?.right == null) { + var child = if (node.?.left != null) node.?.left else node.?.right; + // Число дочерних узлов = 0, удалить node и сразу вернуть + if (child == null) { + return null; + // Число дочерних узлов = 1, удалить node напрямую + } else { + node = child; + } + } else { + // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел + var temp = node.?.right; + while (temp.?.left != null) { + temp = temp.?.left; + } + node.?.right = self.removeHelper(node.?.right, temp.?.val); + node.?.val = temp.?.val; + } + } + self.updateHeight(node); // Обновить высоту узла + // 2. Выполнить вращение, чтобы снова сбалансировать поддерево + node = self.rotate(node); + // Вернуть корневой узел поддерева + return node; + } + + // Поиск узла + fn search(self: *Self, val: T) ?*inc.TreeNode(T) { + var cur = self.root; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Целевой узел находится в правом поддереве cur + if (cur.?.val < val) { + cur = cur.?.right; + // Целевой узел находится в левом поддереве cur + } else if (cur.?.val > val) { + cur = cur.?.left; + // Найти целевой узел и выйти из цикла + } else { + break; + } + } + // Вернуть целевой узел + return cur; + } + }; +} + +pub fn testInsert(comptime T: type, tree_: *AVLTree(T), val: T) !void { + var tree = tree_; + try tree.insert(val); + std.debug.print("\nПосле вставки узла {} AVL-дерево имеет вид\n", .{val}); + try inc.PrintUtil.printTree(tree.root, null, false); +} + +pub fn testRemove(comptime T: type, tree_: *AVLTree(T), val: T) void { + var tree = tree_; + tree.remove(val); + std.debug.print("\nПосле удаления узла {} AVL-дерево имеет вид\n", .{val}); + try inc.PrintUtil.printTree(tree.root, null, false); +} + +// Driver Code +pub fn main() !void { + // Инициализация пустого AVL-дерева + var avl_tree = AVLTree(i32){}; + avl_tree.init(std.heap.page_allocator); + defer avl_tree.deinit(); + + // Вставка узла + // Обратите внимание, как AVL-дерево сохраняет баланс после вставки узла + try testInsert(i32, &avl_tree, 1); + try testInsert(i32, &avl_tree, 2); + try testInsert(i32, &avl_tree, 3); + try testInsert(i32, &avl_tree, 4); + try testInsert(i32, &avl_tree, 5); + try testInsert(i32, &avl_tree, 8); + try testInsert(i32, &avl_tree, 7); + try testInsert(i32, &avl_tree, 9); + try testInsert(i32, &avl_tree, 10); + try testInsert(i32, &avl_tree, 6); + + // Вставка повторяющегося узла + try testInsert(i32, &avl_tree, 7); + + // Удаление узла + // Обратите внимание, как AVL-дерево сохраняет баланс после удаления узла + testRemove(i32, &avl_tree, 8); // Удаление узла степени 0 + testRemove(i32, &avl_tree, 5); // Удаление узла степени 1 + testRemove(i32, &avl_tree, 4); // Удаление узла степени 2 + + // Поиск узла + var node = avl_tree.search(7).?; + std.debug.print("\nНайденный объект узла = {any}, значение узла = {}\n", .{node, node.val}); + + _ = try std.io.getStdIn().reader().readByte(); +} \ No newline at end of file diff --git a/ru/codes/zig/chapter_tree/binary_search_tree.zig b/ru/codes/zig/chapter_tree/binary_search_tree.zig new file mode 100644 index 000000000..f404f7a5d --- /dev/null +++ b/ru/codes/zig/chapter_tree/binary_search_tree.zig @@ -0,0 +1,182 @@ +// File: binary_search_tree.zig +// Created Time: 2023-01-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Двоичное дерево поиска +pub fn BinarySearchTree(comptime T: type) type { + return struct { + const Self = @This(); + + root: ?*inc.TreeNode(T) = null, + mem_arena: ?std.heap.ArenaAllocator = null, + mem_allocator: std.mem.Allocator = undefined, // Аллокатор памяти + + // Конструктор + pub fn init(self: *Self, allocator: std.mem.Allocator, nums: []T) !void { + if (self.mem_arena == null) { + self.mem_arena = std.heap.ArenaAllocator.init(allocator); + self.mem_allocator = self.mem_arena.?.allocator(); + } + std.mem.sort(T, nums, {}, comptime std.sort.asc(T)); // Отсортировать массив + self.root = try self.buildTree(nums, 0, nums.len - 1); // Построить двоичное дерево поиска + } + + // Метод-деструктор + pub fn deinit(self: *Self) void { + if (self.mem_arena == null) return; + self.mem_arena.?.deinit(); + } + + // Построить двоичное дерево поиска + fn buildTree(self: *Self, nums: []T, i: usize, j: usize) !?*inc.TreeNode(T) { + if (i > j) return null; + // Использовать средний узел массива как корневой узел + var mid = i + (j - i) / 2; + var node = try self.mem_allocator.create(inc.TreeNode(T)); + node.init(nums[mid]); + // Рекурсивно построить левое и правое поддеревья + if (mid >= 1) node.left = try self.buildTree(nums, i, mid - 1); + node.right = try self.buildTree(nums, mid + 1, j); + return node; + } + + // Получить корневой узел двоичного дерева + fn getRoot(self: *Self) ?*inc.TreeNode(T) { + return self.root; + } + + // Поиск узла + fn search(self: *Self, num: T) ?*inc.TreeNode(T) { + var cur = self.root; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Целевой узел находится в правом поддереве cur + if (cur.?.val < num) { + cur = cur.?.right; + // Целевой узел находится в левом поддереве cur + } else if (cur.?.val > num) { + cur = cur.?.left; + // Найти целевой узел и выйти из цикла + } else { + break; + } + } + // Вернуть целевой узел + return cur; + } + + // Вставка узла + fn insert(self: *Self, num: T) !void { + // Если дерево пусто, инициализировать корневой узел + if (self.root == null) { + self.root = try self.mem_allocator.create(inc.TreeNode(T)); + return; + } + var cur = self.root; + var pre: ?*inc.TreeNode(T) = null; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Найти повторяющийся узел и сразу вернуть + if (cur.?.val == num) return; + pre = cur; + // Позиция вставки находится в правом поддереве cur + if (cur.?.val < num) { + cur = cur.?.right; + // Позиция вставки находится в левом поддереве cur + } else { + cur = cur.?.left; + } + } + // Вставка узла + var node = try self.mem_allocator.create(inc.TreeNode(T)); + node.init(num); + if (pre.?.val < num) { + pre.?.right = node; + } else { + pre.?.left = node; + } + } + + // Удаление узла + fn remove(self: *Self, num: T) void { + // Если дерево пусто, сразу вернуть + if (self.root == null) return; + var cur = self.root; + var pre: ?*inc.TreeNode(T) = null; + // Искать в цикле и выйти после прохода за листовой узел + while (cur != null) { + // Найти узел для удаления и выйти из цикла + if (cur.?.val == num) break; + pre = cur; + // Узел для удаления находится в правом поддереве cur + if (cur.?.val < num) { + cur = cur.?.right; + // Узел для удаления находится в левом поддереве cur + } else { + cur = cur.?.left; + } + } + // Если узел для удаления отсутствует, сразу вернуть + if (cur == null) return; + // Число дочерних узлов = 0 или 1 + if (cur.?.left == null or cur.?.right == null) { + // Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел + var child = if (cur.?.left != null) cur.?.left else cur.?.right; + // Удалить узел cur + if (pre.?.left == cur) { + pre.?.left = child; + } else { + pre.?.right = child; + } + // Число дочерних узлов = 2 + } else { + // Получить следующий узел после cur в симметричном обходе + var tmp = cur.?.right; + while (tmp.?.left != null) { + tmp = tmp.?.left; + } + var tmp_val = tmp.?.val; + // Рекурсивно удалить узел tmp + self.remove(tmp.?.val); + // Перезаписать cur значением tmp + cur.?.val = tmp_val; + } + } + }; +} + +// Driver Code +pub fn main() !void { + // Инициализация двоичного дерева + var nums = [_]i32{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; + var bst = BinarySearchTree(i32){}; + try bst.init(std.heap.page_allocator, &nums); + defer bst.deinit(); + std.debug.print("Инициализированное двоичное дерево\n", .{}); + try inc.PrintUtil.printTree(bst.getRoot(), null, false); + + // Поиск узла + var node = bst.search(7); + std.debug.print("\nНайденный объект узла = {any}, значение узла = {}\n", .{node, node.?.val}); + + // Вставка узла + try bst.insert(16); + std.debug.print("\nПосле вставки узла 16 двоичное дерево имеет вид\n", .{}); + try inc.PrintUtil.printTree(bst.getRoot(), null, false); + + // Удаление узла + bst.remove(1); + std.debug.print("\nПосле удаления узла 1 двоичное дерево имеет вид\n", .{}); + try inc.PrintUtil.printTree(bst.getRoot(), null, false); + bst.remove(2); + std.debug.print("\nПосле удаления узла 2 двоичное дерево имеет вид\n", .{}); + try inc.PrintUtil.printTree(bst.getRoot(), null, false); + bst.remove(4); + std.debug.print("\nПосле удаления узла 4 двоичное дерево имеет вид\n", .{}); + try inc.PrintUtil.printTree(bst.getRoot(), null, false); + + _ = try std.io.getStdIn().reader().readByte(); +} diff --git a/ru/codes/zig/chapter_tree/binary_tree.zig b/ru/codes/zig/chapter_tree/binary_tree.zig new file mode 100644 index 000000000..01c50fa6a --- /dev/null +++ b/ru/codes/zig/chapter_tree/binary_tree.zig @@ -0,0 +1,39 @@ +// File: binary_tree.zig +// Created Time: 2023-01-14 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Driver Code +pub fn main() !void { + // Инициализация двоичного дерева + // Инициализация узлов + var n1 = inc.TreeNode(i32){ .val = 1 }; + var n2 = inc.TreeNode(i32){ .val = 2 }; + var n3 = inc.TreeNode(i32){ .val = 3 }; + var n4 = inc.TreeNode(i32){ .val = 4 }; + var n5 = inc.TreeNode(i32){ .val = 5 }; + // Построить связи между узлами (указатели) + n1.left = &n2; + n1.right = &n3; + n2.left = &n4; + n2.right = &n5; + std.debug.print("Инициализация двоичного дерева\n", .{}); + try inc.PrintUtil.printTree(&n1, null, false); + + // Вставка и удаление узлов + var p = inc.TreeNode(i32){ .val = 0 }; + // Вставить узел P между n1 -> n2 + n1.left = &p; + p.left = &n2; + std.debug.print("После вставки узла P\n", .{}); + try inc.PrintUtil.printTree(&n1, null, false); + // Удаление узла + n1.left = &n2; + std.debug.print("После удаления узла P\n", .{}); + try inc.PrintUtil.printTree(&n1, null, false); + + _ = try std.io.getStdIn().reader().readByte(); +} + diff --git a/ru/codes/zig/chapter_tree/binary_tree_bfs.zig b/ru/codes/zig/chapter_tree/binary_tree_bfs.zig new file mode 100644 index 000000000..e23aa8345 --- /dev/null +++ b/ru/codes/zig/chapter_tree/binary_tree_bfs.zig @@ -0,0 +1,57 @@ +// File: binary_tree_bfs.zig +// Created Time: 2023-01-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +// Обход в ширину +fn levelOrder(comptime T: type, mem_allocator: std.mem.Allocator, root: *inc.TreeNode(T)) !std.ArrayList(T) { + // Инициализировать очередь и добавить корневой узел + const L = std.TailQueue(*inc.TreeNode(T)); + var queue = L{}; + var root_node = try mem_allocator.create(L.Node); + root_node.data = root; + queue.append(root_node); + // Инициализировать список для хранения последовательности обхода + var list = std.ArrayList(T).init(std.heap.page_allocator); + while (queue.len > 0) { + var queue_node = queue.popFirst().?; // Извлечение из очереди + var node = queue_node.data; + try list.append(node.val); // Сохранить значение узла + if (node.left != null) { + var tmp_node = try mem_allocator.create(L.Node); + tmp_node.data = node.left.?; + queue.append(tmp_node); // Поместить левый дочерний узел в очередь + } + if (node.right != null) { + var tmp_node = try mem_allocator.create(L.Node); + tmp_node.data = node.right.?; + queue.append(tmp_node); // Поместить правый дочерний узел в очередь + } + } + return list; +} + +// Driver Code +pub fn main() !void { + // Инициализация аллокатора памяти + var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer mem_arena.deinit(); + const mem_allocator = mem_arena.allocator(); + + // Инициализировать двоичное дерево + // Здесь используется функция, напрямую строящая двоичное дерево из массива + var nums = [_]i32{1, 2, 3, 4, 5, 6, 7}; + var root = try inc.TreeUtil.arrToTree(i32, mem_allocator, &nums); + std.debug.print("Инициализация двоичного дерева\n", .{}); + try inc.PrintUtil.printTree(root, null, false); + + // Обход в ширину + var list = try levelOrder(i32, mem_allocator, root.?); + defer list.deinit(); + std.debug.print("\nПоследовательность печати узлов при обходе в ширину = ", .{}); + inc.PrintUtil.printList(i32, list); + + _ = try std.io.getStdIn().reader().readByte(); +} \ No newline at end of file diff --git a/ru/codes/zig/chapter_tree/binary_tree_dfs.zig b/ru/codes/zig/chapter_tree/binary_tree_dfs.zig new file mode 100644 index 000000000..27365a9f9 --- /dev/null +++ b/ru/codes/zig/chapter_tree/binary_tree_dfs.zig @@ -0,0 +1,70 @@ +// File: binary_tree_dfs.zig +// Created Time: 2023-01-15 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +var list = std.ArrayList(i32).init(std.heap.page_allocator); + +// Предварительный обход +fn preOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void { + if (root == null) return; + // Порядок обхода: корень -> левое поддерево -> правое поддерево + try list.append(root.?.val); + try preOrder(T, root.?.left); + try preOrder(T, root.?.right); +} + +// Симметричный обход +fn inOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void { + if (root == null) return; + // Порядок обхода: левое поддерево -> корень -> правое поддерево + try inOrder(T, root.?.left); + try list.append(root.?.val); + try inOrder(T, root.?.right); +} + +// Обратный обход +fn postOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void { + if (root == null) return; + // Порядок обхода: левое поддерево -> правое поддерево -> корень + try postOrder(T, root.?.left); + try postOrder(T, root.?.right); + try list.append(root.?.val); +} + +// Driver Code +pub fn main() !void { + // Инициализация аллокатора памяти + var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer mem_arena.deinit(); + const mem_allocator = mem_arena.allocator(); + + // Инициализировать двоичное дерево + // Здесь используется функция, напрямую строящая двоичное дерево из массива + var nums = [_]i32{1, 2, 3, 4, 5, 6, 7}; + var root = try inc.TreeUtil.arrToTree(i32, mem_allocator, &nums); + std.debug.print("Инициализация двоичного дерева\n", .{}); + try inc.PrintUtil.printTree(root, null, false); + + // Предварительный обход + list.clearRetainingCapacity(); + try preOrder(i32, root); + std.debug.print("\nПоследовательность печати узлов при предварительном обходе = ", .{}); + inc.PrintUtil.printList(i32, list); + + // Симметричный обход + list.clearRetainingCapacity(); + try inOrder(i32, root); + std.debug.print("\nПоследовательность печати узлов при симметричном обходе = ", .{}); + inc.PrintUtil.printList(i32, list); + + // Обратный обход + list.clearRetainingCapacity(); + try postOrder(i32, root); + std.debug.print("\nПоследовательность печати узлов при обратном обходе = ", .{}); + inc.PrintUtil.printList(i32, list); + + _ = try std.io.getStdIn().reader().readByte(); +} \ No newline at end of file diff --git a/ru/codes/zig/include/PrintUtil.zig b/ru/codes/zig/include/PrintUtil.zig new file mode 100644 index 000000000..09ded4efa --- /dev/null +++ b/ru/codes/zig/include/PrintUtil.zig @@ -0,0 +1,42 @@ +// File: PrintUtil.zig +// Created Time: 2023-01-07 +// Author: codingonion (coderonion@gmail.com) + +const std = @import("std"); +pub const ListUtil = @import("ListNode.zig"); +pub const ListNode = ListUtil.ListNode; +pub const TreeUtil = @import("TreeNode.zig"); +pub const TreeNode = TreeUtil.TreeNode; + +// Вывести очередь +pub fn printQueue(comptime T: type, queue: std.TailQueue(T)) void { + var node = queue.first; + std.debug.print("[", .{}); + var i: i32 = 0; + while (node != null) : (i += 1) { + var data = node.?.data; + std.debug.print("{}{s}", .{ data, if (i == queue.len - 1) "]" else ", " }); + node = node.?.next; + } +} + +// Вывести хеш-таблицу +pub fn printHashMap(comptime TKey: type, comptime TValue: type, map: std.AutoHashMap(TKey, TValue)) void { + var it = map.iterator(); + while (it.next()) |kv| { + var key = kv.key_ptr.*; + var value = kv.value_ptr.*; + std.debug.print("{} -> {s}\n", .{ key, value }); + } +} + +// Вывести кучу +pub fn printHeap(comptime T: type, mem_allocator: std.mem.Allocator, queue: anytype) !void { + var arr = queue.items; + var len = queue.len; + std.debug.print("Массивное представление кучи:", .{}); + printArray(T, arr[0..len]); + std.debug.print("\nДревовидное представление кучи:\n", .{}); + var root = try TreeUtil.arrToTree(T, mem_allocator, arr[0..len]); + try printTree(root, null, false); +} diff --git a/ru/codes/zig/include/include.zig b/ru/codes/zig/include/include.zig new file mode 100644 index 000000000..4c4ec8369 --- /dev/null +++ b/ru/codes/zig/include/include.zig @@ -0,0 +1,7 @@ +// File: include.zig +// Created Time: 2023-01-07 +// Author: codingonion (coderonion@gmail.com) + +pub const PrintUtil = @import("PrintUtil.zig"); +pub const TreeUtil = @import("TreeNode.zig"); +pub const TreeNode = TreeUtil.TreeNode; diff --git a/ru/codes/zig/main.zig b/ru/codes/zig/main.zig new file mode 100644 index 000000000..970449d97 --- /dev/null +++ b/ru/codes/zig/main.zig @@ -0,0 +1,25 @@ +const std = @import("std"); + +const iteration = @import("chapter_computational_complexity/iteration.zig"); +const recursion = @import("chapter_computational_complexity/recursion.zig"); +const time_complexity = @import("chapter_computational_complexity/time_complexity.zig"); +const space_complexity = @import("chapter_computational_complexity/space_complexity.zig"); +const worst_best_time_complexity = @import("chapter_computational_complexity/worst_best_time_complexity.zig"); + +const array = @import("chapter_array_and_linkedlist/array.zig"); +const linked_list = @import("chapter_array_and_linkedlist/linked_list.zig"); +const list = @import("chapter_array_and_linkedlist/list.zig"); +const my_list = @import("chapter_array_and_linkedlist/my_list.zig"); + +pub fn main() !void { + try iteration.run(); + recursion.run(); + time_complexity.run(); + try space_complexity.run(); + worst_best_time_complexity.run(); + + try array.run(); + linked_list.run(); + try list.run(); + try my_list.run(); +} diff --git a/ru/codes/zig/utils/ListNode.zig b/ru/codes/zig/utils/ListNode.zig new file mode 100644 index 000000000..05bc75b47 --- /dev/null +++ b/ru/codes/zig/utils/ListNode.zig @@ -0,0 +1,49 @@ +// File: ListNode.zig +// Created Time: 2023-01-07 +// Author: codingonion (coderonion@gmail.com), CreatorMetaSky (creator_meta_sky@163.com) + +const std = @import("std"); + +// Узел связного списка +pub fn ListNode(comptime T: type) type { + return struct { + const Self = @This(); + + val: T = 0, + next: ?*Self = null, + + // Initialize a list node with specific value + pub fn init(self: *Self, x: i32) void { + self.val = x; + self.next = null; + } + }; +} + +// Десериализовать список в связный список +pub fn listToLinkedList(comptime T: type, allocator: std.mem.Allocator, list: std.ArrayList(T)) !?*ListNode(T) { + var dum = try allocator.create(ListNode(T)); + dum.init(0); + var head = dum; + for (list.items) |val| { + var tmp = try allocator.create(ListNode(T)); + tmp.init(val); + head.next = tmp; + head = head.next.?; + } + return dum.next; +} + +// Десериализовать массив в связный список +pub fn arrToLinkedList(comptime T: type, mem_allocator: std.mem.Allocator, arr: []T) !?*ListNode(T) { + var dum = try mem_allocator.create(ListNode(T)); + dum.init(0); + var head = dum; + for (arr) |val| { + var tmp = try mem_allocator.create(ListNode(T)); + tmp.init(val); + head.next = tmp; + head = head.next.?; + } + return dum.next; +} diff --git a/ru/codes/zig/utils/TreeNode.zig b/ru/codes/zig/utils/TreeNode.zig new file mode 100644 index 000000000..3617fbe03 --- /dev/null +++ b/ru/codes/zig/utils/TreeNode.zig @@ -0,0 +1,63 @@ +// File: TreeNode.zig +// Created Time: 2023-01-07 +// Author: codingonion (coderonion@gmail.com), CreatorMetaSky (creator_meta_sky@163.com) + +const std = @import("std"); + +// Узел двоичного дерева +pub fn TreeNode(comptime T: type) type { + return struct { + const Self = @This(); + + val: T = undefined, // Значение узла + height: i32 = undefined, // Высота узла + left: ?*Self = null, // Указатель на левый дочерний узел + right: ?*Self = null, // Указатель на правый дочерний узел + + // Initialize a tree node with specific value + pub fn init(self: *Self, x: i32) void { + self.val = x; + self.height = 0; + self.left = null; + self.right = null; + } + }; +} + +// Десериализовать массив в двоичное дерево +pub fn arrToTree(comptime T: type, allocator: std.mem.Allocator, arr: []T) !?*TreeNode(T) { + if (arr.len == 0) return null; + var root = try allocator.create(TreeNode(T)); + root.init(arr[0]); + const L = std.TailQueue(*TreeNode(T)); + var que = L{}; + var root_node = try allocator.create(L.Node); + root_node.data = root; + que.append(root_node); + var index: usize = 0; + while (que.len > 0) { + const que_node = que.popFirst().?; + var node = que_node.data; + index += 1; + if (index >= arr.len) break; + if (index < arr.len) { + var tmp = try allocator.create(TreeNode(T)); + tmp.init(arr[index]); + node.left = tmp; + var tmp_node = try allocator.create(L.Node); + tmp_node.data = node.left.?; + que.append(tmp_node); + } + index += 1; + if (index >= arr.len) break; + if (index < arr.len) { + var tmp = try allocator.create(TreeNode(T)); + tmp.init(arr[index]); + node.right = tmp; + var tmp_node = try allocator.create(L.Node); + tmp_node.data = node.right.?; + que.append(tmp_node); + } + } + return root; +} diff --git a/ru/codes/zig/utils/format.zig b/ru/codes/zig/utils/format.zig new file mode 100644 index 000000000..f1bc16932 --- /dev/null +++ b/ru/codes/zig/utils/format.zig @@ -0,0 +1,140 @@ +// File: format.zig +// Created Time: 2025-07-19 +// Author: CreatorMetaSky (creator_meta_sky@163.com) + +const std = @import("std"); +const ListNode = @import("ListNode.zig").ListNode; +const TreeNode = @import("TreeNode.zig").TreeNode; + +pub fn slice(items: anytype) SliceFormatter(@TypeOf(items)) { + return .{ .items = items }; +} + +pub fn SliceFormatter(comptime SliceType: type) type { + return struct { + const Self = @This(); + + items: SliceType, + + pub fn format( + self: Self, + comptime _: []const u8, + _: std.fmt.FormatOptions, + writer: anytype, + ) !void { + try writer.writeAll("["); + + if (self.items.len > 0) { + for (self.items, 0..) |item, i| { + try std.fmt.format(writer, "{}", .{item}); + if (i != self.items.len - 1) { + try writer.writeAll(", "); + } + } + } + + try writer.writeAll("]"); + } + }; +} + +pub fn linkedList(comptime T: type, head: *const ListNode(T)) LinkedListFormatter(T) { + return .{ .head = head }; +} + +pub fn LinkedListFormatter(comptime T: type) type { + return struct { + const Self = @This(); + + head: *const ListNode(T), + + pub fn format( + self: Self, + comptime _: []const u8, + _: std.fmt.FormatOptions, + writer: anytype, + ) !void { + try printLinkedList(self.head, writer); + } + + pub fn printLinkedList(head: *const ListNode(T), writer: anytype) !void { + try std.fmt.format(writer, "{}", .{head.val}); + if (head.next) |next_node| { + try writer.writeAll("->"); + try printLinkedList(next_node, writer); + } + } + }; +} + +pub fn tree(comptime T: type, root: ?*const TreeNode(T)) TreeFormatter(T) { + return .{ .root = root }; +} + +pub fn TreeFormatter(comptime T: type) type { + return struct { + const Self = @This(); + + root: ?*const TreeNode(T), + + pub fn format( + self: Self, + comptime _: []const u8, + _: std.fmt.FormatOptions, + writer: anytype, + ) !void { + try printTree(self.root, null, false, writer); + } + + // Вывести двоичное дерево + fn printTree(root: ?*const TreeNode(T), prev: ?*Trunk, isRight: bool, writer: anytype) !void { + if (root == null) { + return; + } + + var prev_str = " "; + var trunk = Trunk{ .prev = prev, .str = prev_str }; + + try printTree(root.?.right, &trunk, true, writer); + + if (prev == null) { + trunk.str = "———"; + } else if (isRight) { + trunk.str = "/———"; + prev_str = " |"; + } else { + trunk.str = "\\———"; + prev.?.str = prev_str; + } + + try showTrunks(&trunk, writer); + try std.fmt.format(writer, "{d}\n", .{root.?.val}); + + if (prev) |_| { + prev.?.str = prev_str; + } + trunk.str = " |"; + + try printTree(root.?.left, &trunk, false, writer); + } + + // Вывести двоичное дерево + // Этот вывод дерева заимствован из TECHIE DELIGHT + // https://www.techiedelight.com/c-program-print-binary-tree/ + const Trunk = struct { + prev: ?*Trunk = null, + str: []const u8 = undefined, + + pub fn init(self: *Trunk, prev: ?*Trunk, str: []const u8) void { + self.prev = prev; + self.str = str; + } + }; + + pub fn showTrunks(p: ?*Trunk, writer: anytype) !void { + if (p == null) return; + try showTrunks(p.?.prev, writer); + try std.fmt.format(writer, "{s}", .{p.?.str}); + } + }; +} diff --git a/ru/codes/zig/utils/utils.zig b/ru/codes/zig/utils/utils.zig new file mode 100644 index 000000000..a3d53797c --- /dev/null +++ b/ru/codes/zig/utils/utils.zig @@ -0,0 +1,8 @@ +// File: format.zig +// Created Time: 2025-07-15 +// Author: CreatorMetaSky (creator_meta_sky@163.com) + +const std = @import("std"); +pub const fmt = @import("format.zig"); +pub const ListNode = @import("ListNode.zig").ListNode; +pub const TreeNode = @import("TreeNode.zig").TreeNode; diff --git a/ru/docs/assets/covers/chapter_appendix.jpg b/ru/docs/assets/covers/chapter_appendix.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c35b7db9e118162aa770156e8c0ed05f61b8affb GIT binary patch literal 135651 zcmbUIWl$V%^e&1H5-boxfCP6P0>Rx0GB|@f!5JjD1_&M|=pcash9CnB8r%s4cXxM( z;DJCm{QhU}ea?sb;okdn)%2>K)vNmHdaIYdk8_V}fS1Y&AO!##8UPUdbO0XL0WtEv z4z>V*ni>EI003|R&(K~0FrFl|rvrdS0eJR5G60~AM)`kaFdEzc(m@9Rq8tF2|4YZ{ z>HHs_EdO`+|2kuQNBe&)enO^$94b_4yGyw7z2#~fKG&lL4@|$ z1)zPh^$hKQ@SoCuKtspCe1?UMgNyh4Nul;7038hj1056N*)z*E)(30`Hxk~E#2g$(*~$)5@c3^gK1=sdT)fwB$jB*}SyYs4^J;|A74NJu<(e;s4vk_SWbJCXcy3-kvY@aC zRa{kFQ(ITx(Ae~=v#YzOx37O-VsdJFW_E6VVSQtBYkOyRZ~x%z{NnQJ`sUB=-G98E z-pc*@FZBQK&SUg(&Z7?{}q@j^rQ`Hwge<}-R8tXDEx*dN@88F)i*NMsXpDm!o) z`M|$PE#1fQUNiBpGoSrO?SGj4e@86z|1W0$huHtaYY`v^!2KV*#KnF2`sK@)uW4RC zfrf?VKd^AI{13SP7li%?(*Hr}|KRb-2-D*r#@artR+2|g|W z@G;Py783>$Knk!kpFWp#NzxO?nc+exk#0QAEJB-r8kpa;2q^WBg%3L+}7_{x| zooJnuQFRFp;Mi>y$i0(t*nH~5Dqh2YPU_Ppb+=yZr=nDzKM#eG{1IcCJV)c)dbEF!?j4)yJ7iF4}-Igj5!! z1;XH9wFXls_)rHLl`{)}o07N#a`dKb?9@FJ``i3_8M6D)Qvw(@lax3x%@6;PR5>Sy z3U+9tj{D71+w_m5KCaylk2e6ml@fNf78hB=@UtQ2-y?wcU4@&0sGg7Fd&rF_f#~qb z33!3$<}O=irPUTEuRhvJofHdu-J~$wsy=nRB9E>*t8MMYYOL4tnVFZL5C?@&V5E4c zfCHjPIwB(=a92c18NPXww&YsuaaDl*K4w5&$W;ods`pvdfN$-R3a@wSc*uE|FRW$l zo&Q{@c-HBdhspMFr^!_puyN@K>HEj zA<|FXj92oJy+$lQrYf#M{K2ujDh_x3&C5qXF{4;Km42*V-cLRWxGRV)H#3omJCfCc znnw@z20CriNCwkRp>Dq^5p;cMS{tQ%m{Q!vUTiFJCvCBH>D@NBnhNqlP`GF5mVXUC z$CuR#Gc`<~L4>i|mGP)6IJ77DyqG@a_wA46*O_D^X!I8vzMayUY-)g4{{UAMR*)nY zySCp^kkQv@Z*{oq=ZF+&tIBQuox8%y!hFXV+u8(=RiD8s!yR%G8qp@y*A^q+mmSSTYp$P(|gFTLelMrH6k))MgeJm8rxE zv3}Q5@0R3OkZN%b+lRL~bE(x{=Q5_xnAN34I`6ve#GUR6my9G(~EjZh3i59n0KC%hCvT!IQaU@VKh1mWn)pnWV-7 zM&ho9k0#B^d823^{IRDHU+1>$W;NmwVC_E%0DIFmWF{Rr#O)}&UHyDrdhG2GK)l@7 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 vJoAzYQdiBHW literal 0 HcmV?d00001 diff --git a/ru/docs/assets/covers/chapter_array_and_linkedlist.jpg b/ru/docs/assets/covers/chapter_array_and_linkedlist.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d03142ffc32e3a1d8d06316ef871f09c84733c3 GIT binary patch literal 128537 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 literal 0 HcmV?d00001 diff --git a/ru/docs/assets/covers/chapter_backtracking.jpg b/ru/docs/assets/covers/chapter_backtracking.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea4aa1d11ab46df0c68e831a7a7eacd242dd332a GIT binary patch literal 132554 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∓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 QVWRH-D$FK{9riLdv9Xcwom>^gQu<|A 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®ffpO!Slnh|NWc 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 literal 0 HcmV?d00001 diff --git a/ru/docs/assets/covers/chapter_complexity_analysis.jpg b/ru/docs/assets/covers/chapter_complexity_analysis.jpg new file mode 100644 index 0000000000000000000000000000000000000000..691523b9f90a37aa4b263d64817267197b9af4bc GIT binary patch literal 96935 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 |#8<3TiZXAmEgL5Sl?WZ!*BK}O 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

yvXrsE<7ZGd2oYHK-s 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

OTMA6U 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

  • s>0r@54)GUq(uu2eWj^9mQ1BVx`t&0ieW*^%e(YB z!gua99Ka%E25$XaI2Uh8bH|k?i>1QDpjRXr)$@_K{EPhbvw{lUzH&gA{P}>Zks01t zSQkuS9v2PCq5UlX!W|F^0xjF*5MmNOB4`}?R+RATECZyJ8>Ha*tev})L`6+9N^pq_ z2y>D{=&VrlX&)S(Zq6^3zHSH@oETQXr$5FKe#jhj;}uS1tkkdoAWaK<>`_<$n@?>T z(XU1iYF`0>)t+Lp6S-qL7kMZyV6k7=ZrTTT3R4#tq`bx8A)rG=Or?dj z&5dDHyc|uKp7pl&vWS}4?(E5FG1DM~wazyMc!EAI_M}#2m-uyzKP;;mXnoPf8gg=` zNMHiIr???;%~tm6AICGE*{0cT9hi5}0Idw6(xgOK&4>0G$Dje`ENP8jLJj5F14X+k z{Ny;J+tl4r|8M4KBGjN68=~*laInKwk_bsu&wi0FP&k<)DDM22b4>c7BO{ZY>Z?97 z8y#h&z(EeZ@?&RL7@nt5h*GG1N~;e)abegb2%VkG!q{#py(*uAi@G)-NTNl3R69Ot zWkApyzTA341(qUf|OY0A+= zF$}{o-1zJ;B~#OZ%cozICdN4#9Z72aR|5z6i@KdxwA z?qcUvIa28Z`(eOIY=$g5ew4cknWpmF9?H*6k>F1H;scAq`5sqoV3g`&J^aL*SRUs< zcdsSCi_n`6$Cj1ltgBIq*s{NI3cYMxT#^bN+Jp;CT1!ZcMC1;20YDcH2Nxz8O{mSE zIvo*yV@EdZ;t()Rgn9RyCY4?L4@NZrxZXzaS;aKt!iYaxg`d>lTygOyV2F)Hv6|-b zc<|YEBUPIjm^G)=Al-;UM6ZMsO5B`q#yqw5nsV$(R-6f7##dK+tsBncewkxfYGTKC zRD@GfdqI8{PMwW@zj`)`tFZIR6ugJ8B!{f`NgfhwNf_5NZB^BAX}+ARkfS%58I`_4 zSTt7ffkF)Ff56~PJa&6(EX3pk1JE<2+@3lpm({!WmuOhBSl-d*8=7spy>FyhSy+H(DFmGPV2bE`^G-YvHsrhiM z^W{^7=a5F6JSMNBoybebYtFu^1!eQ+cIl9~HJOkj%!-NK7az(b82iG1fZn5u(Dc#W z}|7@#VBlb9lW!`M!PlJ5N4=rTC{c|nf!fCe+qX3X^qW!47mD+uVq z=mFVj^zvbl{D+G$7u{zQ(10n#Om|azUf8vxpm%{hfEf*p$u6*iXWo|OabLTSX7at1 z&!CrsvAh9=vg`fvePgTq$u;GHvmvtgaC5#0YFz5*IJJqo-IidNUgcYCJ%u5xK4sNTPXits3wiEZeHmkp}J zA`6(g{&lzCIA$L~;+lsQ zc4hxUwca?BrS3lipPfk-`CsRfi4ki{hLa57sBH_w+}}H|ic{o54%ItnEOB9*Vo6HU zRo{P=Yu{YXe;|#o_RJ$B;J=>xtAw$&hHkVr1PJ%w8ToSgFa^N;!Nl zhgRY`V%&`ve*Vl);eC1jo`O0vc&A=^$S^syQk!dH5Un#ax`R%I+auF4eq&RTj}EnwM#D~uMy)K*@; zEdMY&s(Ofs^j$j4|Jt%}1=lzS@}wg4<1I3HAl;`VTdeD~+bw1yo&`f1nr)Xl_Ld+N z)G(^oOm}`2l}OKNCOaf~{s$m*_+F&{0#w+q%jJL&S8ghrP8QXfZBy0qdPn{C7A{A) z(E+guT5+hVjUB(ZL@o+t;YV~c@T6aP-fX#>)X}Ag$(u|wAM)I$Sc7ME52C$LkG^)q zEvJf=+a?{*DjH_v)AkkA{9c&(-v2R}LV^@Z*`)IRu9m;_^5bBQjcVq@o;%GZge>$0 z<%uC72624bCfGGVfhXI0Q1*aZOPR}#-BYdtL!UD09Q&Ljy+nMpM;$|n202ohxobbk ze3se~x>1(n$9Y5&2{s$P+Ziay{VlvOd6&uFzsYrEf7olIpgc%8#GjP?)ZFMkY{q?x z22zM_$({m>RBEi_jCi3rp51&vQa(`qJ`LJtUj`#OrxO?8J9%1`%BJtamF+H154w0*)(Gd+->OB< znc`LLp`<%UH?0)g)E+y=(KO_7TTgTWL*|QSgQBgEHccuUovZ9kD5Ex`MK!nokq+k9 zJ3E7~v=3$A%a`m+@68)&hJ1{{%V-!t-1lFEAc(0^r5RIi+0l*oC8+Tdy1j{IlbtEN z9{`mWVE!Y~R;4^hbg63ynBakU6vhr>BCOIK>tc~hRzO?gHe{^M%+_J8WbGaT-l%eD z9IaFp?sD^{I#yw+`l$R)mp&O~lH7s8LO-b6Ts!5xH`?m6VjfeDN0`z#dR}b=S_QbS zKS;LvbRI6vLp(5kT-7=05a*-3c2}DD;t&|p(nJs!TSv3ElW)(?G_6BJQcNAGMPG(o zDdY`*>DMcb36wz%p6+zIM}z^@lyhp5lKq%3+vQ!X==s{KVbWjmgm%ZY+gz7 zFU=m+LB1Xrt!5M0glZ0N&3&_v(ghoVC!CXU*#cCBV>~ZuzkM0n)cXZ}(M9=KG+JPx zgx-?{dWcL9P>w`ZGbPhWR!3el9ZBhSwm zN6!`8!(ZqL3%ievfO29sBSU>>>a#i+$5UiKWK6ire$OL@P8^q1t{w)mgoK^iNDOUn zE`G)SG`ZWiOX11GjF$5+%uq*|Fak%@ThM2Un9}QX#FTUo=u7({F)||7Z$Qy}q&YET zrPx8F!W+6j#Sx)3-JDfp{9xm8v_#jnReJv0md100CSNWJa)JHG;3VWiaj0>c418cC*6%cYm(R^;=>892ClP3?v2;TC{ z?73~!(P3Jv!}esBEyKjc_w(d=lTCiV*E5FocmswazuKJ0Ii&87-FPbE`O~78nU4Da zEr&mmWRbXyV74JgN*vZQUz{o?+7#sy1;MajSl5kv8|3n2-Q%GV=1Vovj>gSD{sUMn zL79Dkz8A;GUtc6@qg!|^JV0mrq!__n8+`~XM`u%YrSPnyV+w$bWf@uUm!rsHa(4}> zbabaXEHr6z+prw>^v|2xI;o*ncZP7!VDj0c%G=M(Y+Q`~qLaF2Oe+2QuA&!S*B$ox z4H7s$T&LS>zVaw+;<=L(Pl3;?J}P5T*&Q`t`|55bvFDqbgst@b+t2#4`_8y(s1w^k z($P${>$OdD&n|WIIn_!e$&1#wrrZ_%L^!n}=a>(fOUkI!K{-V6;Vw7n5>pU#XKS{SN@C2yHPgv?<&phkpjG=A^2sb=0T- zU?>NWowp3hHnRoo&o%5DWm*=}bIF|z0qmKgTp%!k)D791P;bSH=?R>e)MDV`;V;E0 zr@UU^aT(KaNb(1>qR+?MTcN)59X_XP=31Iz-D-4-No?Wi*e#EBcV=)r$J#8HZ=QUt zPMqyOC%OLssoHm_>^_2YAy%}K5r}3(7u}-yJ4R)@qtUexlZ4V5 z3cN#IA{(`g%(;@)=i*6L3nTzpIIOElqEw#bz@P7twEOMB+uO!x=k~m0LKEL3Xg?R~ zLFyQ9&`Gm*=DBJ+r>A@T{p0=mjJfLqE?EBr83@;ls5a*nHWKpbg@LA_&4`QB&FA`3 zx=}uTN$sLQ-3aq|oAI`f9Q?Qc8UL{l{!H;l7mA~wT`bj2(6q%^Wu0uiZ^llzF4n~M zjp|D4=3cj72?a2GKMhTeKlc&$)(t*m8s7UYy7v{2J*XUc69eEHbilB8UC9Pi(HJYB zEvW(}N2u)00?7_za-6ojh4>7FHUz5{$=3W&uZ>H1BZsC$0SQ(sJf50IlR)|)@#SFzRhhG>F<=to2=NJ{NVS|Ozf&l zy_wVznO9SvN$#%{v?pbZZh73;QK|aM7c*Igx>3oqLM4gi87gwy64#ZsO4mOrHLLSA z$aYiV6RLCm#f5V%oK*+Yp73yF)Zx~*z+Re7`6g>AuIX0IXwPY-89sMEkbvJO!_uus zq|t~e{amNjM%jXfUDI3Z_Hcs}IqDrhRxT&I2c$|t(Qu}=T*x`lHvja~8T>_g;kyT{ zK;rGB316etJXacYG)?#Un2W6)=-L?h1rIc03#7H{jUD+iq;esxr$hW9ye7;GD zCoRf~V3_gJAek+PY%_aL_^GeYmpL6c-R-6$O!#&BmlaD{2OZyMBW*dCv^n98Q!f-# zD!oBA(Y`Lea*AJj5%Z~%GXDS!mmiA=KQ(wqdKIx z+~6R4Gj|DEVqkviF!T_5Jmzv$x0_Etu->%>BQTRNR{64zHNvKj%En-FbcCzx+=$SM z(H>t5!2V#PsA+01-x`N(***&%a9!Po4lY|f!ufXmU#uA}*7<$7_q1_p(5FnLW`I`y z-$l4|`GIc5yu%vkZxG8VIizCqT^2a-ea;%pA?Xza!a+!=y003quNPr`bX+ust1>Kj zrZN1CtwL7}n@=h{!~N^MDl|%deg~5aiqnnES6dS-+}#IWY0zkb*nKqj7c0jzr2@55 z9ADB1Sm6~qY8Q*9H0SX8GV!y#3~{NRH^rrp3+m@jJLi2V!Tfeqyhc7@SLK;4rVPQ} zE0Jr+cCy`brw-os>*xJn0`!KB;7X)A$qaHTpk5#wALP&KB`(fXM@x2|mSm7*Jzlft zm|XC}yKp&BUILqh3Mpq=o6z;LexsW^E^&HCjFjub8*;YIC5d zXzJa#4Cq+(9nwsj*mXP(JS@NYtA{Y+K2TWiIS$2g+MmzrKb@!W*c|HG3bkj_x|V!> z>R}Ab$7ufz+cu?`&XOBHQ+l%>iFQ-u*mIJ`7}{9yJqyo- zTT|{l8*)y3zY=hrkC9dtOaqbn-}vJ3i2v9(y@??Co~ZkTP4wwca9XqS)mZL!4k@<<4>IDs`H3j zKytjx8$s!Dx(*XZ=OEQK3SW2x&nqgCqMWMrxyr;}gD1PQlEL;#Bkxi)2Sk-fn%VhT zCGJ~;1B*?p9izi{=}qD$PqUlTJy_KEa)$=7Y+>@8hC(%n=a-MHQ-|Rr!{p{JLbm3k z$UiG7PXt(H>m=g0v71){3Nzdkoys{uNi5ihfPAs!q>JKYYuVXoRf@HCc6&!C9lnw;jbYwJPIoX44(2Ny3}|$3Zo`Ad ze5X)0g2Tg-H>3bNIpRkMq~<=7pWlb27DnGaM2c7GEfT*LlZ{SXZzX_i5Cb=TCrF_y zkMca@5SE|s1J({9U3g?CVWxB^>oLErz!(@Miu(+O58riI`)SO~dbt`pY>7 zu#*xCAqBlxqO$bo(^Xxfy2~~;_TOJTnFF72d@c(z=(<)*B`3z1+SL9xaRj?CWX497 zj0Ld2VjjqURA@h!@2XaNHyZ#x&@KwO-pwhVv>z)CfFA=Hl= zhN?elo_GSr+TNlwq%fDf^* znNv$H4^2gOkX+b;7;JJdIEBtf{rn=_xY8HYba$YZBkQ#&W}CRpBCq>dh}-4fnBHSr zy8#IlAu<`MghuFZc__s=3WDS3LOe!_c~NKda~uEsof zE7jH4Ya7AJM>pv}_6o#@6T#PG(X=aAa<2{X ze80;V-Fxzd+-BK{W5uvbuAk=j&`wwxv%B^y7J5uRkWFwZRoRJEN8(+XI4Mt9gfolj z`dhZ2+NwUwe5~~=`LOpPtCO0Ze4!sLKi7^p&605ChD`H*tOY;?CRnXs(1aq5d@B3z zen|X{hLBv27J=oOJgO?pyOpbtviuyr!7(Gvuz`uG!2K(wTMsjN6@Jw%%e7{ zu6pchgU&&F%qa9MiH}+Wtyt_*gWHU@L40-cDB#fTf?kKYhN*4+mK*sJ8SE}dj$s}o zD&~sOPG(gSFNZYg5fi={q-=+6vrHM-5snJL88aZNF5j|?sZ>>{zBB4U!Bw!vAkqA6 z9q#%g?{vO}vQUuaB~nzH`P!IAhSk{tX_AW`CM46@V+dmb^!zn-M;6gR>@i3g|BFjQ z;R^1?m@%*PyACnCGj;xt)r2NYK(Q>_13oeb*TMNeA~Ow~B1E1n~_^G2Sw|LQPp zNYX=T`J{Q@^5{bLcH(scfViKR+R&?Mv@WUQNq?)cg608SD=d^c4Jca?K?kYZ+DAON zXD}PTZ4BW>^tzdTtt_p&!a!p~$?{>Kmbh-nrOBIt@l`2~eb6ye-A8ugTNLy;C+z>K zKo-}-GJg*)wVR~6S<>UBF8nuYKJP)Bs;$SXbhk$BIiNniDG_u%d8pSz0VCY7rzomF zqTas7@81iyF$FJV2gGIS#xLd6OXOV80=Kh&CPMYAGr>jQINGcciVId`#9+n5H_BG) z{D=J*x(DW()L|F>_HCI^49`e+_AZA^e$_ey_gpSuR18cc-gxc|c#-m|#P zud6h$|3@&4oo;9QiRAln9O61m2qI5g2HnOj{Ya6ORje(i2-t?P1J{rDEqWKUhV5`> z%3Y)rGEP;v(q8~^loz2D(sxUk7(&fMyRKzPFPQJ#BtRf}1XQe_$SQd(9AVZ?vTYdm zq!qO)y&mEq;?mUR%}4?=y0IgDNb8caT~8>og-p$N*Sx$~X<`@JSReVDz&6A&S^B!Y zX0Yj2g=tQbF?-App(2-W@Ow{5Ba$V9!CmZ3`_2oqBXd4We)UYlPZ6)ap{3UtU;JxLR=6hO&-ej1FqwJ6Cp{elCn+f}{FIog}ik?c&;hvd8NRM}}`U-5;m;CWAVzIy-<;>O6O~~G;wlZ34 zn3&7uA5z$0&-8NS)?}NJ>**qIYjXGdW_%YXnV6+uj%Oidu#C$Z_!hA$6{|nGtJG^R zy*Ur*cPlDJlbudc>szpeBVPGY#B zFCwnFr$(#TEBUhz3>QuH3;;RMkYmoT+<<+CDjs%CafhRUWV5r$ZZgKa0_Ew_MGx$d zFwfY&-lGAW1iL7uX2ow@bkpAONKbMQdX@uk+#pm>Q%UCW0T%^Zi^4z?b_=QaZ|Q5q z+P(*!f#`{w(}*^;_~CwpCxLA1i>v1(&8UZjB6C5cLw}x(=ov^#T4rV6<9=iE;Yp z2>;W;Z|!e1=OEqB7up^#{le!BSKs#ucV}W_ChZ>TDYLR&!n`n(0+n2aT^dL1syD6y!C)pf}t+4 zP+|8Xvx_PmD35UMYueWW+#tm=9bC*xd@*MIF+ChDTNbc5 z!sv#{u2yj;xBu;Oz$13|-0n2|`Sv0$#X>`xZ+-2UbaWl(J2n5>eod^o?GT)pLihF} zOm?FZKthvy9C8j7yUrx}mugz0Vxlk+5d-BZ^D$1}$$*>$cn*zW$HHKXl~HqB7H9V@ z6jY8umaaIwk*PoR!=kYqS(n0sugNanC@^fNH!9~c^8o$e*P?YikoOpODoy#9_ zQ{5wv=_cIxaMmBE#?wjAWl7AsHK6z~ndXQ0Ydp3{>iiQ=;>TpF;3wET-37YYgG%Ow zl~3-QG3>!0IF4{o_DG5kk$h9oKgHPViS2-bjh<(E8Xo#OZ8))+hJi%Ypw3sny=5J; zdJWqJ&PI(1eNLC_`uv9g{I1ZD{JbQPa*lTm1VtZK9Gj;oAv9_!-|b=agTQCRTJ01F z&6l)jU@776<_S{~_?^ev!5}Cv;$WlvDYeENT@`8mou}n$>yu>xlC?Pl1QwD~Z^Dys zNKMEE$3ejvJL*s}@HQ!;_DFa_M=DkFSMc|Ti;YyJpJ7J8O77KX)l5DMYw?ypmqGqK zk_N%9EzF~3kmY*_{jqyf+rp0{o9>*o@GX%*5afx?GDIleJqAYF`Ebi{=a&tcEheJ! zg=Fie=rT=xIx9CG2M4_$N|)BQJe*OuE5#?S>mrqNi#jk>r{os_W4CS%qgcq1oz;3r zV>VX59lTRDfiX^}CUdceW_})c9WC^)nF}{JPq|@5eUE+~!%YT4X-=r$n{`OKgSqb9k2kXPlep_?Tpe)>ffC~3o5?XmV zDfzOrym*ZJxd#Fumy2`C&Q{kC@G-ipUgfQTssvNp#Ed2Tgg~cAv`e0rf4eXt^0mLh zVz1&%_T#j@YLHqjL3+)1_|m_tq_QCUm{B$5M>D`_YGyRVs44VWi7{)FQwE=WD@X4^ z<%h?QAD@~li8^#)ldM*JLX~jlGypYM@%WIi8z~+ zuH=1Q^F6mesjPHeuK0N)+_ErICc8i5 zkj22DG&CizNf^V7a3#6`Hdf5AH z$?{RLM@26u9J-re_hd-=fv;`6R0*%%auD%_clKYnP&B8$*}%^K2?~zMwwGz71RvO) z`8o-r`hS3F3*E1&3!VtQTUs?dU$^d%3o&M_Xr#9fSoo7(bM*OCw*OMv_48PO#Fp~7 zG*6ONIk}oHnDPVY2p$?CQ{WTuV?qpfEzf^rVaDJCr%l*mhcv0Z%GhuOi=Kzz8Chri zM|-6~f$TAIr{#yQJ6d^rW$rz?*(H_|3<&pU$gyvM#)L9Gq)00mo;?zM`P~t5MrYudG)^`InLdvz3s8Q+1qQbVoF zj|#>4r7{Mnf>ss2)?_C)fI@x{M^>dW?cYvFr&1BVP4O|e>U_T#ldp02R zK{(?s@&UzFs44iYW&4$B0HlpKOx571_`C(TWYtSNt*W}vRzu_~J|n=>KNYKZtc=*p zYbp}3=hGX_N9zpYcya)p-nQA?&d!fWwbvqQIt(N0#gifIf==F1g?vaw^MtvfeF-6u zZ-afcE=s=ESfHf5&d4Gck-ZCsy*}O_gK#B_{4I=I%P}dGu^h38>()oH{v%NUNBw>V zTt>H=&(&n;sW7w;H4~pTkW+8 z{)21&`20$%M{_((S{L=mRNZW^FWe%yLv=X^TFQq3Wpm*kRcUnt;T8Z=I48<*N%9w1 z$!2JO|HAZH`KI6`3*v~&qj^W|=B<)MN5h3I&peS@kvD1=1zw8`+&%@RUGkS3O*;j2 zED73A5iqeodIhv%gM{iv$4x}TBT1ZA8L={HMegX_ctK^@t%#2N`apD0|E|{YTrl}e zOELCc(?nx&p=n^ioLg8{ldMfGV2?BAaF68-!-P?Ndy$JDR!{r#J-I_!(R!9?%3|}h z$t3p4P0Ipb5i<>D5R5?FXjx!5syuW&2n_Qinhz3^4Cv{F%P?`Et zu*`2x)_Zxl?2GQ##VAN0KyWByrN+EpFP_{PoVC5 zW@5|rw=YFz!9Gtha0TtVw;+2Giyu|QJ~co3J%RchXV!DfiO*R+_%|(YK=GYG0aT-e zB7Ky|Pb%-@7@0Vo;8_a)FeepPnk>6Dc@q0H02VM@gCovIbyeFVDVk4%iC3|Gkiw~0 z9@9iHOetG8WU;s*8WKPZ6Kt%U!wpzT3f`1fXd!e6?kv8x_eDYnA~^H~p6>10tv#RV zo=zSd1|7tZx?P^dGJzn})#g&$Ub4d3?8KV!3GXFGFX?*7!8+XP<4IP60ItG9BTlxa zTEztJ-M9P7zzBzs%*|WG(yjq!n4`p7|r7!=+BeXm?ccI9PLv6>9+ z`3Z)})r05xo+A}?)uwo}oD=DC;}uoLW?@qG_1X&=m8Wl2BxDLoY|;FSebMgvisldboqDYKMS6f6k&%V$*~ z_$z%CpEz|T2+{Sm!;f49=Xvx&YR~bXFcLAnZNkJgTJ0^O^-X#dk#p3NuC5*8v^_B` z2b>poR3%SDLoj;RjTR{aDNCG(%1_$vBw6cT2`Nl2x1Q5#I)K*f;W6+=Dp^aa{9;~^ zlk{HbbwlvW-Rp>ljT_q1!$~%%1i7KkcE$Zvy{t2)r2i(5s9`CBss;~tjMNI{ zs2#Z{N@p4j3?`hoqE_C!j#=G#qsCLj8Tw@|JYTL^-5nOkGsPak?&kO?3`Nc(uct>! zEvd8^%O3L_P$I*L#mpk#{|Bgk!P797ir|AsOu(mf83EX zNwWD2SgeQ%(X27&pF(uXc1U-l@m&{2f5=n8oxKxqMUEMSx@1Z56JO4r?^I}%7II-Z zdKq_vS^z{FqpcQu1U>WLZW=UoIW zTdkp4`L{Ibq4Q2f5>o9XU-&bf%_sboe3=2;R*W|aN{*O4R!Eclni{6lrp%l<#<{L0 zaZWfl{xniDeV@`@f(8&Ko9B*CB7N94!bR&ZWum5!cNj@+z7p)1vn^MIujEHs1FDWB!`p15 z*NEp?;2rL}-Xve|B$0b8riPmj*{txgTomzVvSV zB>EiDl+sS0dj20EPUq>{J;#_r`^-5g_Pfi^icb&sw}^-e_?;5!iQ=!();^^dObDf-tH%*Z!5R zHNSqJ*GBVRqU0mSLupSyrCYM|DtF$l*!#z68p8yW={#e@t&858jf;@Pcvf9;y3zqP z*SNlYaH8nQU9r8eqq!n%{KTOUfF%=fA}#5zk@O1wru<(|-bqXfkep4gnd$Miy4%Cv z+q79UGK5-1%(mf>V!FaXB%lk;H+wt~Vj@49=)KGY-s2?uBOC6|!_IO-DHi|h?oALa zY2&K1T++f|pk`icN7RWzL8ZC-+|ZhU5Z7{^Qb-^k-uSqqI{o2bdpsVpmKWlDM_x#4 z>C+HP5Xg(NWzYK-5pve=VJX@a`&Q*JUN-QqEIiUCJoXZsVhm?|&bbRA?OUkXuX?HR zrG|Fn7j(Ai{G>S3zyi5(wkxVC`sxNj8lOW=c$@qQ&&trFy_SkLFg5o&_7%kd1E{X| zJ0mK6kmX`=t(=yYt@;w7Q-d=KU>8jOQvGq_DwPpI^)r4Sy=PmA>4Pl1V}X zJI{AtkKXVG0!uLFDIaZ;{I+V>Zc4x9gf2D}yr}zJv16%~_#P=95<)wj#nv&9P1#Kj zWu8B)p{o*f`90R!IQ8WvM=KqWy7l|g>;Sws{-+`Wjyh;B3f_MG=mS`A@9n<>^XvL^zH@k^=-A?yXj)VBJMlO7Pck%u_(DP zOqZ4p6q;SV5i<*>>)keOCnkQ7szmauBG$m6QutccfOiW=d+u6N}^740(PG`+fE9*fR8o) zzg9z7RWj{&2V-?9Xb<80T4H?iyN+3hSyb0oP&YJm==u8!MJAJe7V46a5c?T~^3kd0#B)-mv&mx91`Q z+QY-b1pEHS(Rs&H_4t4MijZU#xpj@YGE+v%#kI=bduLpm>@7QmuFJKFi|n0E$cTIG zD|<#@h|ighu;+85Z-zB)ikeE%5OL42TGysaG&P}SeQF3sc6X1=84$XW{N(A6SM5h2&Rbt8`8u`#~yN&f2 z+$HqJ_d_!YC#6j*yp{QXpcucvKegs=Q?u3fLlJeoDdzYI#?{t!c}B4i8m6pt7AY*~ zG*A6?x!WY%%^kOST+oqCuSlS3{c=?Ljk7X@^=>@U1Ae|zSsO_RUm9F`lpc=~oSA(z zd7dOz1mABHTPc~xokXZKU{BVlPg{HoR27so6ijSYEQV&K8h$*BVfETY&HcD%&+{=i z?yU{@2tOgzZy@EFw-a<6A!$tC>Ow=E^#6PO1?-1P{l;?no z`5mqQjg!O^=gV_&!=N(Xv`=wnZVb;%qJ6iV|K1id^`mt?ZOz4kRmL1J_Iu^Ld6z1Y^go-WcltuFR7Sq8#}ktn98>`34;)gfO`h)uToezH{8!oueh}RQWWgp34la@ zx<@&1Eo84FQL~tvqooG^NpTI;9!klJac^2sanT!N&4U=^=lv{G63&yocv${7a!6VjQFQP1Pdtn!P0`&mf5?_; zV^*b_N(2?eU1SJQcGhv!yghn7tM#={#8*o1u5fqf5EqeQKr(ll*I5Ns3pmrET) zb7&b3uJU{ctI+*2J&otmVu=7J^8Y^r52f^wf=yCDj0CC%b5wx8meb3RpRj_cd32FA zXQe<-2Rc+Oi%cTu87Nbt)$akBZkvIDo@`Py7@p4cF)Hl zww5jt0s*(*H+kb#APuxTOI&ufQ5-yEp5x8tHQz(6KOq4 zjoyKmvGN@AEQ;&TN!)0C#-lygD-K{3yBhWRE6M%r$YtI3=F zqZ9hd0)4fQi~cc*a*hb-`UvF4ggf%JBX8D$ra#i^#|G@NoN-X(rja_WU|ch0dJ^L) zoBv8>XUC3beRRWIdRWZICHgu-u9Y^8{6Bx2y_J+yPyOfLs*^xhSxd01%W>Jf<-9iZ zdD~-cDkU3;V&+^GvgpIe1iE{th*7`SWA?!L zzeP->#C*hnWX^(mrt6KC(WWQX@uHE!tQY&3fRfi8t3AAIjT8?lJ3)fy%(c>-cuI^- zcLNTAXZ~`o)AW(;skEDRNc_+>cl_V;^50M<927b`KA22>l8c^R_$1YmLK*ZtkU3Ex zF>y*G`iP&+m^E+^|f?sg?D_7m- z?Q$!yNf_(PUvBWor55cd1&--w7R7pxgTa9PiK5#`|d4RMv>KhG3K z{812IondlaSAIKxT8QWo4PiX$K0fYYDxrMWj&#zI2aBRayvkIz9`_5kX$p|SnEq3? z%4tureP37T?=1~%p+3mHRkl>>CIco51UKNERWY-=MrPe)rU)E+X{S!6O(BqYxvjzY zMqY{)$!u>_X=nVSOz?Y>#l{y9|I&ETtI~nw^GINSadDpK)izzQ3^8*(Pn!h-!^8_e z+XSGU+Qpl_=rL%$SL23|t6^grs=2Qm%9O+?3B`h%Cd!!Jmc|+-uB~J>PB0B9%ad_8 z)6nWmnB(*L0XEDh0K`%+p3g3*Rw^Pa$&MO#Ew|zNFPo&U9co9esNLk_H8K$39v!e) z;M=RC3h5*V2e#>8e+9tWzx^lS-9@SgnU;xM*-xxy>-%UfAV zi=2Ayv7l0=X!WFn1(s-?@MSM^;pe5W0W0nn+6hXY+7ONAH!k7JGhGFbY0J9mR{y|hYD5APj+9V`J#5b`H$Ia z+n&$3kEBI0>i&fz#hnT^fi7dOs}A1pD>kknm&f7yz>QS+Bri?>Bs2RpWP2WxArC#d$v4FMepUI6maw<@2VHzotkGOO1o5WX+ z0(vfF@f$%z^H&#R{$_C1nvl#J=`A74QcLRXI(&v1gW-W80&nW zc~|eH1i8f_;3nrn4c>9_y$(t=q{?&(E4RMderoiCAfzHC$={P_1% z#^%tw2sjb6-1k3|7ApKJ&K~Pk=8P)Qz=V~-J;syOhO3zItaqI6zD0`q;uNKyJ++3~ zQ}g~hQLD%Tl==9FnY1C@M6pQp$ofpwS63^xomDWz8{i@_wN?+D|HVK&awj9u+9XdT zS>60xfb^5`Z5{KUy7$13y8%XD_X zT5GwWvzmv>xL{Q0dGUMu-8%tpqPidZ+?ht0a_kl$>6WhZV&kJ#Z(V6$h@gAJ(kqDb zta=N3^+S@n2i3qAetJ5vb!+QCG#|oE4u~L#ET$ksC9`j1^Y=myR%3D}D0wcEQW z0b-(%ZhgK{NCosEEa~xi+lX_v! z)&ks>nqUj*BhNzJh**onSUv_}YVB!=`3B`!K68Vz(y4sO_VNSD`QEbfVsgEh3ab&3 zB-N#52OhJka_guuw1;HuzetYEf=yk5%weBQhZ~5vl`LKNW5n_)F(#wsyu6StwbBol z{sVmOW^eV()a{?rOQ^8$=2b(!K`;~@LMVcs%Da;E-R6H?mP^b`# zVp5u{EiYw3QG34Tkia^-ejO&K)vv|j<0aCqE*ZHT^*Yi@WCERZL(jdvVJqN><6SFDpFLUt_0_CVWV7&TLK z6P`Dz38}={tIlk6qyp~8o5nj4msYWSj2x}QKY6}2lzwLocH<-3a9_W6U^o_`jVUzj zx>b6zrjddUc57J20t=5m_&XW$Fh~J06aTfyp)$(AD$yFv7d=uw6i}kdS@yBc?SUCR zUgN(>7A)Umd8snRmhK51p%2<}h*J&Jh*ek{t&3uK9@d|8b(1+**7V7wVCUip5O;9h zMoy)lZ{CUjyjw^a{QEVU54-yQs>JWqb+C`zfKU!ceZ@Hp)9NKokiQ zc^p*pFbBY? z9}J~j8ki-`5B!WY_K@togFsE;i7Uiw-;?K$t{jX;ENKi;Cy#_^KyhN#^yZb~@>q#4 z>FLz@YG>LPo_*7T+?Ka|#g@tppL|RDX;NGLFT#1pwc&!`NqoGnw_}NAjqqxRUkkYJ z&hHhE^e1`cZy{A)f2?Ye+>ythFE(D9)|#4-(@EcTdkn8mUoB+1sg<(m-r=yY+~;w5!X6qx?E&|x~~QXR_^soNq1f>JdE!3 z$pS(cZb#&`txQm@#~P-%VK#&^b*ukQ!^&N>i;P>$$0;WOU&;F0-C z7w~L^&+bWJo7N#>!G5l1<3d(L)9HQ~lf{<;_cUpChU?k}nuzmdNkNRobhBK^AA8-X zq)`H{M@#e$Se55~ix0sj#oCz_1>==_uNf>{#MAd<@M-s}lpl?zDHZr!)pokBKG7=> zZ`=s1X@BlGwejHo*_b!iGEuw4bUY$vA$p{DQYCdU@VJ%Nd>=^2M`=fX2#etgC z6_xlp2dJ+4E=?e;Hy9p-Kdg}2!^b*CIrd>pA{OE&0W8BH!?%9v^I+Q)0C#eJF{)bj zh$aloh!_Q4Br)wbUYdq9Ge&*xZgu-FR@ls#uO@2N(>!!_9h@W=K2EO3kN;?XnVpx| z@T-yK7jQQWS38DpzCSpMnagfFE=+FT(mB`Z!+Sg1hH{efV{cpc6{&H|UGu)-|w+D=E{|B zSP$GTs~qS|5BdoY>iA(6@h(J;qw!eiUbCt}xeW|`4qIg&vrX5_lTLmr?*2H^GtcVB zqN_4>gH0`$kgDC-ZO5rDM$>oVcH=@TmH7>JF>p9HmzCXP_G~5xu;OaAVpLSq?2pW? z{iA|R5z1Eu9*%yCi4T!usch5^ge9?+>Ok3{YA-}*7|ChDE*=Q@Iws+S;@mE%(=6#~ka|x9x9vg{!86ZoBmy3QpyzXvJ_pSBRW! zWZ@LP6{pHqGUQosRanx_NH{L0Yar~b6xn`01;08FpVTT6W-L$Z9WawDRAUX566SbX zXtd5R``x6o`|*<))ycM_GM~KI{E^4^TfwINH(^l+{6a1HXwkJ1!mNHrZ5tB>$VDVh zl{7H;QO!gDAP*o1Le(z9SpGAsB$Ny;KNuihvnxuHN}E6&g38R?G?3o0H(%^>pJBtoUh^KKHKSS~{0!u<=^iTx5YN~9Y(6x@Ba(UO*Hi_YpGI_kL= z)k^JZ#&TVN4D>CL9_>J*N9`3`F`J>2Bv1+j-311Xr&zut@0b3}h*t~hNQIzh2Stms z%rPQI7sp3MCv2&+O~L1~E&=~pK5;XD3+}P_SVSh;bpM)*PUgiQ`I%eP|M0NW?HEP5 z=x6;VF23MZlms?Htgt;=>apq_tblmS+OJTkPv`(-{QODe3x#ghkg(&WT0w=?OQTx!q_}&1EG;7y>u1{G zpLY?c3}6r)PV2ohE5`vN1c|qnJrO7yHhwW*xqUZLmwFQ7-p;Zl-jTARw-hU#vZ(lp8Mtr{IMP`A#7G_bE(Hzab{?i!g zl`${qhYFKW%eVha(a+bgv{S?sK;Yciyv^?$O-*w*gBH0IV zY_x|3%MQGnSJr2@omGKYD7h{9!#-^cU$lg z4%6KvnBn%YmN~zW%12$~j5com8A6InAa-*r_#T2pcXI&Oae1$NMk`tJf|}4*hYCHW6YDb< zqk->|!GCAek>N~Iur^rn@so%HF&kIoY#h8@f^ewCK%ES6p|aclDct7Ta6Kfsc}5K+ zZ<3swhbF88%QgFVHSokA6rRk#GSBI$!Y zdl9!#)!W2uf4SC(J&VkcmT`HN>l=2%E?(%E-w)!SN*gxe1fSbH23lanpS)Ix75R_& z6dM3I9WRvqYn%n-RghIoOxIf^_&N%RdeWyy|0{l}v>bubf=RqAP;<`C$5N^X--?f= zX3@~zwwjf?cPhnr%pvhlb9S(9@0f}Fcr}auc4BsV31i;lUMuYYAC^Q@qSg4V-5&E~ zNWhq)EJz3-GU06<*4V%A zyeOZD%KDuQy!CuKn-ebP1h@|rZ0eM8cp;5s<=ffzM_TR>d)@7dnj6KPCYb*;yMP2? z68}v9`=Eo8Vr9TXH|JZlW01N0JF#YUprw7WsAiddqx=TWuct0lZff==;6rwI2G#um zHVX3jp`)Jn&A>eYutztmi*zC&8V+bY5jXU`bMm3qmWW2<#4BGho&SLZw}<7RbXlI8 z!6FNmV^5}6ko5xg-r^ojQey5g32xNzUj^g!TV**YI&|2l-AzEu5GJvtuglMdw1}2` zi`Dlen;-v~lzb`BDVe!BlVnT?0f3mBn$Di5y#n7Cl0iUZ=tp;?u65SOb%bm$u#jhE z8M)#fQQq%v_S}%;sHiXo$^vRGCr$6C^kfVXf4UPHQ1f&&o`tX~-Kz?zLA_-TgTrvk z>&E>Dui_58U#JRhNL*Z{{T1CXY1cfbl z;}>1n*0g#G60G04AWUEB%05M1P-bOnB9}Mw8$pEa(#W)02oP}4BsfJ|ycWp7ucVsj+>y61_>>M4?q4nUW962sTx`zN z81hu%w$_PWiO5VGQ?m45$}S-Dv{u@YTMp-7`*7`Gr2J)D?v+dPmQ4nP z5e=FDTWyr~er6NvoOx#8+12`nnH4uVb3ws5KF_jSb}K#}<2nJ<7%fBn z+4%v&%)7z4Hs)UiR}KgP(^@u=Y!2X^IQ}-(wAz9*c2;70 zLBZEB`TdZy%)RoesVDU^HML0G12K?aJP^CNrrQ-c@90l-G0r^lJUnHOM|Qc2Ph^y@ z)A(XE=Z_=m9@nP2y>v835={xodK+0Oq=_k{+3itVnLz!GD` zfRy{X@H-$hWgyH4T} zT$%TUPXFnvovT8$0^I^O zCl$`a?k0ra;O(YtE5_TwZ0?)uKs7~Ms>Rz4!Zrjam@`C1Pd38UlH0`s)Q$?ZRM`LZ zig%I-6k~i~;@2g=6PDQLO8p{V#m)Zw5iM6w|Uwj8e1z)SA@Pr{q&Z2PL1?$>Xp-`m^9GReQGau?j!ae?k<K{H)lQ|E7$2_g5?Jy=|2(ynB=qGO<6o&iRtl8(~$9X?aZJZS-nIIE`VBB@%6dJ*G zN0nCZ-zAPo|KywH4|WsvUj?Qx^EN7w%vdP2_)#oNDJ!Ewd;f|0u`98%jw(rW_4?GNf2%$v$ z;#S-0VudRIdkug`j5n-st{cU7QRuMCx`icRmnmZR-IIoH;4{S}BYaTJ^zcmk4zvc4 zg@qA4I9+Nzq8EJO8te;~%NHCe@N>WSyKh4^0PZ>*dpB+s`7s5@w4e5QQTNmHt{+4* zI2V6l=u6F3EKVd@5+;V+B;K8ziPa{<^7k=7C|%=%x{IUqMw66ILTYNHA{dELS*}-? zqt@F-{P~L}jT|9B(6irIcMj<@Nw)_?vo;r_Aqp3vlK+7Po|DqA(4Ar(*@M6;M||>l zKu18%T_V}3w@JVf`pZqk760B&CT>>Z8(XUJvNqM#jgXxBJv*e62E9wU3k&eC~q zP%^w>DSlHg+iTT@wzkqWcFpxqyz?S=t?R{Q)E%xs;AXw6Z?J)(+IRe}xg% zRWoB!$^QPl9ieQUv?!KpYV&VI%)6NOI;~gX`ydELbiO7SgD?1JBy0Fe>77=0_8WEy zFYQn_5$4Gf4$qfH07A2>zB;rbR(qVBv1X`pY zv%TdJeWc;-X+*SFoD`WWqtjGjbAbZ!pb|`fhl&ehWKG9R~H|(Ezv8>h_G*I#O zXcBR_oZ#Sx26F}0Pc!=Of{YT>DT92del>!RB=QWRdT8WY=JFW&?Z| z69yg_H-VIF=KljF#ou?{KZI-C)UIXuc2h-)B$#8gbo=fTHP)duQ?fiRl@`#S}; zR{Al|zL0o{?b$~C>O=~>4gK>oSWP^q05O~`NSYw~FjQoL3YcfPqbJOs#IRj>=N^)S zFn?3aMm02`p4>B%Z2()ZSV@F^<35QfXnEIYVZ>s5dQ_xtc1o{?cxQ}~4gWM$*D>n} zJX5EI5SxtFzVXbknjdT|>(ciop&Pf~GDSpmPx6OsZtieDt!S{}K>96~DnV@dUwH3t zwlgOj%`H0z3gga>PKp|z=MgHbuT_}kZvYJ0UP=@Z-LQSAdA@stzdqI}EDZuoafwx4 z9jX8dxI**X0xd3v&@{ViyU!t!S}!C)o=)8N4gDNnK5Mh;rVvLQZ)>q@>WSRFYlWHw zk;<=nLy^`wjkS7?z2v+H#ydNAq@mmYTh4^W?}X8Ok9imAyJ@BOvPk8F*F6D-g3WtIqC; zrp;9U-E{_2(3`s8T|@vD-5|rpB!BuVqgc^ch*ZlLttK#Q0NJK;Wt73P!)9f5e;zk zY&41opI>&rpOf5zH|8N~tNNv5`R*(bf-(cg?xhcPB_@RT;33zr;*sZZ9aE0x7Xbm{ z8ATzAn@)=wr!S3}`GJSC{7Z*drtPS%^l#dGzehMiZY09p<;%}h8v#HbzB&9#9#Io2 zOjtAu>*m0a%3tiqV88rGI^jDOP5!3kE1(!Ec|nQT6TWsB>WwJPK_2U<2N4;|ofy3+ zerleXZi)GHAJE_I?4)en-86Rd78$OL`X7i3TB`ur2_wx(tV%yFergrJtQ8Am3*uG) z_e{0|o(}{Mz|L4#$jP8FpVRJfkh#|NEX5QQqqG?XT;4}z(Jr4}(SDSBy*G)!kXa1rWE%rZL#+reoYGt|FY~ockFg0Q!4>{IN zY?7^e+-}PYg9{h6qIbtJzWLUtm5=G{Ijl6|yPhAi@g!|d`i=Ye4+RdD#O$nI@xWAZ zD%>v&t5&CW*)PA=1{lTMv}iR~`um)U?jUC9o0EB&T2p;%)jkGhMq8N7U6*}s)47k% zTm{6X<@_3xT?W=_Km9FZZfccI%C0=b6FHUdt&$0;%Aenjo&%Vsi9D}pO=K#!yxZGH zf&a#{P~h~?+-)E~^U8i=YAo=a?NZAy{)P5Cef7da;Sh06*Z4Jf;4jQESBKft=z)$H zEkoLlx}*xRf+VfRR^o;mV&TH{QWO#{ZsQLL{IO^hvBkPT={f;kzizXG@a|3TrTN_79c;-b#Dz%zc z>Xviw>MiS7DniGRwR=mAMVTUB0lV~>aea%&-j2=c^~@;!hdg%CA_@W};$q}gQBM6Y zeul^3A1urn_e`pWRr*}Dy(Dvd9#UFu~-tCkW*QvW`aF!Fbi$ESH}5QJ4Y6@~y-b;dyN>ggy}a6aZ^s&OMknqAcA z_f7iWomDYRi{Lp+nQJMev5Yr*&eI{MIvEJenz!gKTcK%kgB@?4d6v$(7w@U0T#;9kMB#so82+{LZ}?r}+Hj;veSV>*9V;CfF?1`H z8*rKOL*&^Qs-Iazg(ht$=fuH&>1+}{ zJf#fcq<#gGh0D0~c)d}UER|YEVM|i9O#+J5C1+~9aInpZGX33lr2n#A zpUxdKmc}>`yzI;7i8IBPG^2}XbIgue-H|r?EYbQl)A_oy@?esnIeGFw7XOAKanYFyAZhPigEw$?jia}1bY>l^P-iW{57 zC_}~!FX{SvnpO@Qj|Oxbs-l*M2EWThyOiKaE@IT|5f3MknOx5mpz*=JjQR4;)wQ7s zBs{|1Y|KmfT)Dd*U4aCeHZ(uOnhrHLS<%tv1XJ;-M$;`O7!XDPfFNo*Ux=W_Sp@D= zrb=ppomS3T5qGt zNTn=OS8Z*fL!n;pn#ckj3|G0?rOy1ZSo?*Pu=*?u;!LAd&R5tbTpS?Z>Gr-%7F zCJZla;aY&YAd|%w59Cm5g zc;Gt7e?F>aTa`oWvLZNifAp03%I`)9B5+TluRhL+hz*SrKDtP=7x8b3{3c7x{mRBm z-z;+zSFmi{pM-tm;6~jY=;&Qur0oATEFD#Vf(QMswS2GipqiRvnW6#DhzF*iM24L| zyz~}nR;Dk#v~Q8>aU7nU=5DwV2Zik93& zTy0C~l%sujO#=6;AGzqw263b04vFr@W13G++2dwho+xn2F+%(`c*}#E2tW=XSa_*0 z_n<7OIWq;gHdiszKUS)Tc(D9aT9LXwx%zUZ2cLJT1k7-uq1;eSOyWa7K&Zu`q4KKc zGg@jq&CaeMjWqa{8dHf^?+T{{)7MI83Uh%@ zFqVGR|5R>LC5=SyDhc&fr6dp_mNBXgR~wuJD>6ImPP13Z^3XsJkd^ex$ejONY2j(e z=xXNB;f~!z++81;(sy*S#>WHNAq3u&NYp+#$R=M+>f-*H_PgeCgDNTb#UI9|4X#lI zD%s9=sN+C^$`_#GKgFkcR$Qlkx;V--zx!g@5j@DCaBHy`L0|PEYcW^Vcu_uK4%SE2 z`F;1_Bxv)X9AJXqkqj&4-yrJm&@@Ca-g%DfD>#qQ7P=RKegM(}GpYJ)>Q~R=z}=3q zlf=M%?P9_vujg)O2Gw8T3u1#hkM!}Zvmet^ccCF$UakZ7Mgl^GXtkXVmz-*?q`DM#CmD4+r$pE=4 zjz??{zpZWf>yGtfPS*`j{B-M|*iJCr?x~Rnh}QV-RYMzhCycuN%Mq2JgzRAlG9|5m;grrjWmuF>P&bLL=WU z_p}j*olih=%21d9a%U$(lDmUr&|e|z>6vBPf;lD?f!-lze!RP((WsThKfU8(LtCWx zSY$Z$a`pnnXBadk=`F@pjq*o_rE~La$hJY65@3*z<-6;`{fFB9yG#d>VwW8bMP{x} zpv2T7F$K!Hp-D{kL>y^AOZr%EHz-`=SCi!oiCEuD3OK++QnXS^3wQbgsU}6o`Di-J z!lrM&yH_QdV?xBDkB!_fD}U2o$&IXEZD4Z>!Kvbq9LO(PHm^<{^5-Db6@gK zQkM{wudioi)`w%=$J11#p0$}K!i1*$nYAtcc6IcIu`N(IQdDOOpDgHVlR7khtWLLK z|H&pJLy-gW_%5=+T@pXH@q#;XY}zO~Y{mUg5H{&#%ZPn!8L#H-my^#(<{|2#IjS7r?W4!8gE6&ZchloW&JmpulN48avB&Sic?dj-m7@k zn55#YgBN|UwDt=K5pYBAYKFKg)=k+``Nn5 z2h&X=iTS%MXatkN2#2Mf(;bqd4NKzqhKCZChY z&VMTFCbBT0IN82q^kd9O&D_~dpwNd0U#8VMx;&bSaG`ZaZ(`EZvUx=Ltu1hkuh6#* z_|7^`Z*&HZePmU?8-DXQ5bB+JJ|s&K(cR7zg!dbdy5=oS8os#YGfM=rQe(oI2HE%f z*FaA>1*Ce+Cs<=f#)}7DP25YJjS~hRofK@HZ}&&8*8ToCsn}hdI)56_%3_b=Tl<$> zC=7BRP;&aN)G%7UYy*lqGI^s^H%z!x%vXT*d1`DQukY$Fx>6)1jgBY2;g$Kp2tlZ1TEtS38)bOEt%>M~8#&WHNbzyuUlB*WjdYUyIpN<}2W95uHEVAei zF^~su`49W+lZAIMu+jjBJD82ai}xhIZxh3@fFsks=4?(%53(u|*4Dk$qLn6OfM_Jw zhg2woS|TqXG1%}2_mVKL&|*pENM_d?IYa!Xeyx7jFOd5aP~jz}7V%oIoz*RSw#%;1 z-R=12KAXq+q?9Bdf`8wu7tcA|)^d1atny8tu9yfWB>iukjE-N_m+r%Q2u4k-eX%UT zpaCr$e&B<)%trY6f0@?rD*k)0$tCPOkjS;JPw^mQL{;Mb8-fT5kFcC`>^brIDe6;=kv^IPeeVF>0+%!4XMZRMx6E~^t zO=p02oKRMXA=!Z}!K*}98n2(xIfSz5+K%!u;lS6fhMf70nbOWS7Ag`3De??1EYYdN zneQjbg-uSaT7*3r}bM6<&4!_I-FFCt~e(5=^q@rN|ny{3-uf`QiPc?e=~~zjP9^%LH_(3wZVM4 zrY;lU6(5#Iwx`sD1uidG9=M`LmzYf>9{=k4LvptlX}Lr2gti7=J8-Y`azy9W=#VT& zLef2P^w|WcEI1=oZ@%zGM+3d6R#iXHjg@tsuP7|e&p0xhQWO+qjp=_Tf~a7LfrlH@ ze&^nSR?v$W#TB@0>%My|k9SHb$4KAjpZqwZK@Re~@E@Vz98?en@*u~`#3+gx7ao28 z+K?y}=cnBej;4Bps6V^r+GsK*ur6JtHPM&G1b0F_aTVvsC4IKBIihAE^KdTzH=`6k z43g9pWA?8k9*r>UfB)A=oFx_k$uQlE52=9Ny~8rA`e{ zoi7;ALO%?@1bnZ+EYV6$!3rR1)!G+YJMj(3u&Y*z&t3gCUn51gI5vW?F*OpGEU7?~ zS(|jT!`T<)@yA0DFsQv{7u_X>I=-)Gu=<2cp)EIWgOk%P_raGaqO9+4H4C1maDpLG ze4t8WJbvZ zli;?F0sbxC-i0h|Iw$e{%CA4uzqP3n+396v7+Lo=eT@@Udy6G68t6T@O<3)Z8r4tn9Z9eu7kNA^ob-ZtjOQO7YX6fKc8 z9PQ$25pq1Q^LPO2h?o2n>!3xHqb{zCbsah!Fjhc6>iGJEcW@`rNdzTw`ZPE7`#bW8 zJJ2}(U^pq9TmKHN=)#WXt@x3>lL9u2=Y3qD)n!N!_jfRxYbn^8t$U8tFQ{d}cKSKe zyKL#-U7iS7=$Pt0a+D$86tBqh{!b=vafVj6G~ zt9hCY^}&mqVl+hR0t#Y)S@fnNy9=6j`L;>JQrN^=P?`1I;2v~(>+yq7@lSqUgSI3B zTzcC{d;EjJIYlqjHKE=y-x%a`x!m17~D7&bnD9F0{Wp7wH-hcdI#?1>Dvd(s$8ozR4F_SqUJf_a5C-Pd(;MyN zm}mXp2cgMMmd-mB1*7B9e+S;EFzoLgy5g*uf&iZ~b7mU^ruMyjorQ^V)!+al5h*=r z?STt-$s^@4g_X$$CKW$_9u~L_%-E`PaK0&G;Z%r`Bv>TAOE#Ai?>Aiesp&j=I?sN< za`fr@ntFZcdJkdrKpqO-RrR9H_FCX9SKZX`ow++QT$7NXgEG|4(>3mI65D^s8{O}p zR(2ALvm*x5AQRK;)WnX;XqT%zusoPkIF$^Y9J!0PKmbUHWUuG`%VhQi9CP~UpR0~i z#<5W@CJ}#4+Xve@Tt%Xl98A@dfjX9q>d|G*7re3`2-ZDtHT!x>?v|fgdJodp$WzYo z%Z9i9jK36$VA``AGJ42t4)H45eG&2r#HUDDDfnjeq&RT*71F3LBn zog9xKN^(B_bU*$0SiGZ>cl7UHC#(jQcmXis8Kfl)Z#>GeL;spwdS;At)7uSj@nOlZ z(bTgEWQch#Yk$%FvozDPPNIn{e)HN@uk`unOluq0FRp+XQO8I3uCH|X48+omx$*d7 ztfVBf=4OkM^D@i*eDOz|cja1p?&p$o*N`{`LOgKM`*YP<6$`@p2k?k1yya>KUXMg^ z-Ok@EszH=GvP=pIU;Cvqx>WyL;)!Gilp2?iI!&H1r|$)27{fDqH*wzT-91h=6yvhIFqAUyL}hrX5R0_A4b?LyO2}^7LymUOY9> zuG9+7Yhb#df;X0wnz;4f0okAp25MPltaNZmDWu|UNGbr!)Sc7m&snzK#N2#2D4r19 zsui53cVwC*iQP>1WI8Kx0o#OIScMbFg|2qSb`h0D&-Hdn!`0g~9mBmnnaESa1PXjIv%=2s`&0umMgZ@}&0 zTFlL+Vf1#66qWiN2wkA*POvCT=gFpuiO{w)qule)lnf-0;9l1mfa)}H@=}5KmzDi7 zoF-2@k>62B>6DVS?p}>gPiOI~bqp>lYWpJIx$8;(87}3R)at?icL7;nw6`uT3>QQZFaKcEF<6s`zTYZ0BuI42359;8S2zWEQG+kov?qh;d z3S1aOnEG?guQ$8-WCw)^+(w*cW*i6}aI)^9Cy=>DQ~EB;kD8_{1y;rl$j1AI58>C& z{hbZc6k)d8SLJ(69qJ+TiXV>`nsJ{Vf+2fWb;he+0^ZVYpFLCx^}`=A>;pfl=Qj8aYWEvpquAeOC~W$M?U=8h&YQaLoP-x z964WE^7w>^D>K3~H(b54URlAmmyk5Hw|I40A<7AhAz@cxyH@0j3gG@g^DvjaQs^0m zHR+_(n9GCdBA1jKC52`n3tzEGG^tbQj=8hNNJis&Z+og`+kBVRH4aYfp`vh;S|VuG zGb-|gvb4{IZfKuIdv!SR)sy!!kA-uC5!3%VV2l%B@B>*qay4<++^+<0C57K>T5ReKrM~5dWPZf=!O&;YreQPKk>`vS1^{G<2x?UkU{=8zd<)5)GA&Ym+h1 z+b~iDV>2U*{&n&ezr-h*Nim6YddCHR8pIo_!>OnKPB{7udEJ`AO7MR3UP=9a2P9R& zPu=4^jB65MO#+Xu+4y{QbGP&XGl&sC0oyqP2=qwxI{8=w|rcb-0T7E{0<6v(*jDp(GA1d!+zOxT0MvznAxixYSXYo+XwTvHL`?#jz zLc%tcxTo6KWr%B^{ZQVVWny?`rIp~WXD>P6k4%lz-{AP|JD!aQ_b&anBD z^3{K!B1Ly$%jD+;85!JjCa=oI8Y{_1*gef!5gggDwrhTw>;_kP9F6{4=&`|_Bf?jy zezT|n@(tl?eVf1`9Q4x2)ZI{0&Y>yw=rMpJKZdme7(4ZG4UMA0+~0f9yF726ymZ!} z#2fv117z}F!;FzzD~xtkZ8;<{)?SL#e5sx*nxpFy2VA))TgfTp{r-=PDHlzWL;1Du zxUTDH7f=1J)Lw^dwgUnmG7S~T>Ni2#8I0We>fQXYTr9AYP?zWJQ7TuwFC@Iswx{ez z_Aud~ZGmqhbqFeH+f#lfl+)4N2IW&Qyg?m)5i~RpIqrt}zpOQdQq6 zNpu5Oge={39CBq?wxSf5`Cfm{4zT&{1RGrle7lh30oi-*B84w>v3EsmgYFVRTf(}! zhrfEd3q0tbU;0&ZVquXd)kv9`HZ%w!A?o3tnw~}W$)z7TD7LQ(Tcf9rs`K4&PDej} zZ*X~#VL(3U+G~E+#oo=^4nzYYfvg;}C)Jwryw3$i{UypCar?ZFquC=}ggjbIE-E9= zy)=w3{-&9vN%5`fz2#wUgyQ9Cc;6)1Q|5KaI_7L@$E^aDf=2ER?@XPv>?oLe9X2yq??s6wj2xBszt3=EyRfQbEr61Z{k^35 zUecCglx0Uzn&m14=BC1|!-Hq=Efh#SR`xL4K`FcsVfWf)AQf4k)8T0MyP4PR!8!Pr zK*8SL-(Y|)`D54hlP{g_u#%LlDG*qmU1+S{R~Vr_y*=k~D=Ogf+PTt=y6jyCOLMN! z+9_+oJLh))zu6P|p_Gdi|AAUAjIo2miw!AA*|RgkpUP1E;b4Cg?lEJQ&(zV2Y@MAh z{<`V1YzfY{RMBai2yp2(uxC}?S$^&^R;I9AF%H@Z4Qtw&_+0O4&f3I0zi&Bp`nBPs z#S+xjdUtUOkv63!CX?10$N0zrl&Hej)hZ>m(KdDqvgM@tDKGMwtP(5!28?K$!LT21 zeP>!$*q7pX9-i)k`O(UkTgEcgEm#DtZ;Y2qjrYu(JHYJDemN^ESQ;MeiFj{=XYT`U zVb*yJqh7pxhRKFD>`G|uWzm&Xz6-=}kE=rrYA19T9GdmT1~lqlJ0N?41H>dVFK68s zLFwKei!a{Eiv&Afo>y=zBz{{lo)rX-#O$Ul$}98nRKfxkX1yXt(YMvFmtYXcF6Om4 zl)j7eUF}vgVlBtXguemIMXPptaA9=P7$-)4moIVx77^;H*HghTB6MLCOQcYc-`71o zb?{EBCbcwXG?|1Yu!ozZ1=U2cH%~O)Yjf8ADV<@J#Y^IP0FCvMW6iD!ujGN4Ry!Sa z+{FmxrF}%8BKDK{t9Q$rade3&s%ZU($(!@_tbR-b;TY%1*xPX0-iS*eOCOyUo1}gt zRZ^E^0U`6Z&xQS|wj;GrosQv>0`YLfD#^$c+cQ6T;QMhpG;-SYQ|}(%8TXf4Adi za|{v!g!qN$dVt}7{*f%!#~FLfgdb6R9CSE@tLX}BnpOVX(giOO{QiPqt;W{bcgA(3 zfGTn8wE+>uN|WG&{4ga71APzNAM3I(Sw_wRl<>UBfY<8>RuUR^x`Q|}sgsR{gX)l) zj;Yp)-&JP4ttyL77 z#)ZE>mx4;4j7gXH4cdi1JK0L)Yb6T!I*7;*2IlafhR=mpVpfoGZ1VV(%v{pT|sa-=9p>W!u`WQ-z*snO;We*189Amk+O!72A*c z@ldt|0+u>JHoCS0wO^GVJcK-i=jfErfc~wLQ8eto$)nLpef?Rp9zo~FyE?y|B?_F# zU(u(=F=mJ@n1lSBddEaE#3+75wpBrD$gHYnvGu*EXf393@_lzScc!S8z6B>WD!a^y z*RrO`*|U*oI<5$zkv69__aHdfFzR(up}Xj0`Fci;dJ?H8#{AX~r%unMna^3H!(|BY z>niv8xf0AOj#ylIf1E3yY>tV8a9rYrZBLx*W&IM(+8o3_Q$+Fn(GyjI6ov!g!pBSX ztx}R<57}hAqa-Yimf9ZRHJz8G-4*_UpmgMJ8^k5N``+YZX7xoMy?;99jmW{%(ZP@N zow2b?FC{h+rguf>Liu^wJj|KHxMLoDa<>~d0V`}YRPK{t+zowhheaIUi2I$^!H!uY zmciBmm0FU%ovZ1dM?%tPrx@q7Iu*50=I>oPoS!14K$TZ-h z0GYeqzt$#)V)LOjL}A<8Cs*=2gHIP@gXJD2w2pm^zdW<$Ah`o?vh9 zn$QjG!iYdtl2N9B?Bs=d^^p+Reszv6yd?-2YK1TvmJ)wCt^RICq8Aa$F9I>xa}#1s z6g5^m<|6#5qCBvZN-Ih6_F-sw$02Ua^_$n1rKWa!Qd{AW#o!v(bJaezs^psE__TZ_ zwEiNCX6XK4_wh#?kc(-8aI*j1m?GsAuP_q9al=Dwh-_XK^C&UA`kNI z0qKKRr{4^P;YicKYJUF0;b<8iuf7Q*QwFT z!jTw{fGQ1*03#dU4V6UxuYlOAbfB$g5ija@Df`*ctT3&ZZz&q?BYi&9yQeRJ7e%Gr zYrgP~Mj#1tFt(jL>+a`W=J9pa0oGv$E4{evDj%$7orWF7;D_kJ9wv;nBGl6R`+(oR zb9s}Wd&LvFgv{F48yGGi2v8z0O4pmV*1~y0l0SPnRkf#CDkzu}81_thEvfga{eSvR zVc+9z5ks%e@BgU(1C_ivRd_Ylaoc=RxuBo8Iv)mS+k9CyWUSkAMuD%i8+ZfiCumW5YY z`Z)x*iM53jA_7?RgBBC?>*lxK@tB>h;aL-D!gYqT{F1cz28pC0+-xfEb}uH{-=>!G z_*55x*fL8<^p#Ma$MOsz``R85{4E!NK; z*i#+brhVk%J0A!Yj+;URZ2lc3}hgz2-_SW+i$kxP~q%%eyAhg##sF_i-_#EN=@BKwb@hgl1|2&4{0KuLd9Np z?0s2%8M<9UDHc(SaRa@oZg@&Ux4~@H^9*C}*M;b)pG7=U3ps=Qxh^P=uKI=To8 z3Y4^Wd~%foj#JOhddlmG9F$L;1dINZS>iii0slEZKMw_jb*k=uMtwvCVPO!YF$(~pbYCL0$YE}Wb zBwn8WRC=3)%Dn!^esaME{*zC@HYQH;k;N+5!YN@36{`NZ?DsFGk5xy7NQtg?$~>Yy zZtUt^J81ale8tU8U$C;bmYD|}H*}ha#&S=7-83Cd?}4X5^D&C%CE_WZ!|^L=bz1|} zEYT}PE~P4zo^fM~rKSWwo6ShJgbQ4WYO+M2Y$V1y{OR|mN6A!rgI*EA?Obn-x+$Xl#)MOg=SZUbYR&YljBgH5xXye)h;nhcc=z9-VD3vQO{T5T{2Im;?}4m;P5f zNo|>Xlwj+&{}Ffic5~Nb!R(z4W?Evs3CBvCf4OVqe;wbOJuM9z;}2N`CZpJd`VrvU zKE9Yf`eCB@-_#MZv1lce_jKB$&eT)Su!#j=@WkrtXRF^~jN>V|P2afSdyC#6^6TUj zo%3=X&-q5voi&chI>VVG{J?E7@9FsE5v4h};UQ5PH%h(w!@13QnKtQ+by2p102}Ll z1#RehXTViC+bf-6^x@fo;od$ajI!bswtG3Um9pUrH#(SsziXI6><6vx3p@UZ9o2(HbMc}~2@2lOH46dy-X%-%Q(+njp z0IsO#W!4s-{E9z-C~0M{wd^*=H^p7D-CTWzU>_(dMkKtG<-xDfCH7j*XUy;4{@_>_ zK#C%}OHrc58W}y(IFjhUhLU$Jt#9@Kd+DuYufRg=1eAZrH^aT&v>A(k0E{8ATDf5% z_FpJWBfMAH3#%6;vs@W^M|hUx(csJcfzr1>(gQ5EW{sFc$(g9Af&@lyuoKQ8umKTBx2Ok_9s z6GS#x#5Z9qi@Ouy=G%qeA0++E5Gz`#^fnb}d<_#5Y?X zviG9Jm~h2A`PrM&a@xtveN4q8nhD)qBC6G1-cNN;9u@3}(0 zdbIhJ+izM+^OkfCH%=cQ;>~B|IC`NcrK!jjTC|jHF_V~BZYk6Y8M^UBJWRE%ntso@ zX_3DrV-y^?FBwvi9L}*B_wBRTQP{;f(PAz7UC_rL3ned&;;;f;Z${kNqHd`WCY$sv z$mw6IGWGOPGS?msk=Ukb3+J+Dmfue=txjNGw`cj#QhMnPc&A+UO_2~=(zhyI;1a`t zS=nh1XBT@#N7t0q?rpsq66H{yM-{()g5=(R*UeAUfmG_yx2EU++s%`4yuBHbz>)*pC92(D z!nipTdS+R0vhlNY=7^7N&>hcfUc)!*g?8K9%|DCx(a|RxO?E`kkt127w~1VO&sD9T zBmbUWyC@rB$dkdIR~7s|vN=01>4#$s|LCBqgxye5d>xS|oPYTGDt=T%_5nl=0{bdX ze}Q(=4NSRY4`gq!*Dh}}>ovU2=u%oJ=Uh)&!Y@y2V15V|mY1KCW$f|Ce{blw#SXpQ zVMen$k8CEb#LX(<+gcsY z{I8Xo&wkBX8%Txr*rURf_-_IQI9^ugIa>Ps(x*DeD|J@XSUg$pT+>*Y%r8QDDQ^yA87^ub=%899v)sA$utb>G{T8=C$|9SL zKPD&^QVk!lC`791H4*y^f>Wk;&1PySg7+YnMIrM=R``1nI#Ps!o3t1nneZP;UKx_#5$=cF-%Ol73NS$kQ97QByIPY~ zwy7OU%|EoC4TAEm+i-KnqbbkhNIY9?lRXCl_OAKL^#4?9=ClZs_4GiY($_&IFAJ6e zjblTGWIqLZQ#MpJHNv;yQe5>(xu;CrM-{Z@7FOd-^B`a$Hu8gl zC>^8sWe!iO#3#f*XI;%crd6U;!bi!2Pb)V+_-%f!Q%4z_PG_0_+=x$Y5V}oFZK49V4Id|gpeP0^%f?|HqJjIs>Seev`CQur+^He{$1-v;GJEW1Dz#NM zfXy3QpXzF!c=5!0I8jy69D`i&m7`u(5ie|y@A&#UVfK`b&*<%(y+pWqo=TCl8r0#* zw|s+z6#Hswh5UG5s@shp2)a7mq)G9OcRDt$2EO!4`hj_{aG`#`2zlO@ERo<^0>{Wg zdnA`gR2{oY%ioRquT5{wN}y2r?wZL$T`N)tHz3y$IY9uP@#@#zyWJg3U_|)1vr4@8 zc~HXfH7~QcD?JXO^`=G%9(afP8DZiOTWt9J-yr@(dRH&8qxqDWgfN>AbW*Mx@JlZJ z8|~wSAyu?bC0r?PGt6%8&ayX7MhTR7K^)_zH1t1)^d7SdUrwcyCy4Ns5+aZ9{XJp8 zzPE35;dzkp7AiMo$45#&1Q~kVVtiS(XaqD%iVJ9C zbF{^Dg?UPPOBSD5s_Uu6nS=bDc_76FFJjD$rOFE{pQ_udPDR8=uwS6W-r%`{X5P4! zQds~E1dc$Tq2{LZLINW`q=$LwSYTn4YhC~jW5}WG5bnq&Bse3Ed`#nNMt}V2{N=_8 zx6F$P#L{Xj%kL`CJ;HYs55AHM3Tu)v9g==6-iBX0L+@f6adaq>bra%*<2`I$YPJ7V zaiPPvTMt?(S(8=X_0SOd#b0y5I-Nhikc%~dOS;biJDd^!d-4bNmQSAxuYBx^&V5&w zBmz?+L;wU%1N1; zhHo@hu8|S-KB3{H#QUOwi)QUc5|^=w(Q^g;qMG%+U*6{7u4ziD(^1qwTPrH%&jB64^}j?%(C;IOfon^#R;Rm;0)l z*Nde`ANT^nQ&PCoO1v1?q}8)c+h=P@(YY{e`O@O&l=f$4gK~%nK)Gvuw@0|(pljV> zImS(g@;}7so84)&uN0>I7M-X#ueYP+kY3Q=GMVjQYR45heQfonE9=aM>^_8HOQ34U zzuc{|`)2{`y0+-PMcLzghW^d>v2Pt55<^f-&{Kue@{eZhg)nO|A9i!IsO9Oa*WsfDcqaY?HU?LWq}oAXzJQMLkJ}+bAy8Vq1nOX zpV8Wy*`AC%qxDZ*W)S?<*{_V#K~6{x^5? zyhBS?C2pGBL3R_G47lwcC(ERwl*Qo1bmu+9KLx}&MBLp)(sr^g6`yovGX9BvcMrsEC&$ty=N`3$40x%Flt>a1s zo-8QiBdj|AWgqRzAFnXca3|}uRc`rC#8;2~xSj8BRp2=L_uF(K}xy zf%zi{9%z*9g`w2qbf{7x4_32&@>`7B4K=uSPyc&Pj?EB+n?v3H0Y3gr(C0a=*9uKNbtt)o$&D6=>W{2YqNf5QXS|z_lextTyyP}{JCArnI_d9o82PcXp^@g6c-ulh^VKF7) zEP|M=ZL1O1-kb~?9R7h%Bm*=%4qRN>?f0~dB4LL)5DYOB0e-2!&}%>N0;0Rw>GfGr@AzS+ay5ucVonxWZ36`7~mq0J4k7he25{Z54Swj(RuHVq5$y zKnY&Sz&OuYAez}4+w`n50Yrn&LW`@{O>q5B=-RR-yn!;y6f2Jm3Y z6yy0HSqtG+#_iW@!hh5tS9}W$mzlEyT>jghGonqIxuw#$F9dAM)jF++I?c#2=o_-N zJZg9&Y>&>P*oQn@S)*$#06Dt6Iv3})*$jGG0Tyw>C zQu)$aOYHJQ-R@%5^P`l=i5aR@$su^S++>!Ba`-^Xgg+lfVKV4=+cagV?zVc$Dudr? zteFu4tm8fHdte&t7=KhyEs7v4eBSnX$TE|t!XmwkBxk$iu)aDpYmrp2HI0f{Jg*l~ z`{itr6Gia8i$cm!cV7p6xzjLMH=y9kW$;&#m2$hwTzt6T$%Zl4+ z_uO-Ga@Y10{+?Vr)u0l4`njR;f^EA z9saDrH`XU*UgiB@{lJrP#jJAIn$B-Oksw{+MW!3yaGj}*+|aLK@Bm$pXRO{g;<-Cq z)dMNNv{RB_NGMCQcVjMR2(9`hIh)|Gq5Om5HvPx zlcmSFbX6<}u$UB@c+xpbg5dzP*r25T!!V4A!pMtAj#iOo(@gU<89fYc^G7}i>0D%1 zx76-Pb<7^Py=zq58mQcNREDR!oUs{jViZ1Nlp5MYoED4yjUv4({BJopWePZRzO1nD za2*$=rJnFi_EPy9JW1b@XJ&adKlnRnCdrYo53+3-@c}eR^WvYX$$2=)Defu`YGTFo zNaWnv@BMZ^cUIu_aNsRby{r%)V2bhE#!RG19zP!>o^Co#a1SCHQpk_7Zmu=T*t<`XGKXAEvu(WWGuFz}i?g8RYe~OD34^lz;o)QOrv(kN;-o83{O?I%(g5%4-}D>pXRNH}+x<%R zuNopE)~<1<<>z$oBS(-~Ob0hXMzK%sdGugj92oghetSUghha_8qz)N>wsvnS_s~Ge zlgk-%rS%^uB=SbQp!w|(tMs^s+WCQj8gn&?BhYIEXrsGRTaT3c=;ia;vb4_)+IsP< zr~L-m-;XxC8y`ONkLh`lYXef~I<+%K+!}snw{k7K19py^)k~j&yCghuj6M%ds3LPU zJz4zRLgyx&wqr_5A12>f@wH{bjZ^8-=8xnu&ctpWg*=gPb9>2mL6Hd{KoDc|2)*eNXzKrQgy0u{b@cEPvI1kV+@3G(XVZYSQR2Iy$)dQqq zuY;K7)#UK+t-SlyPxm2hPaLG71;n-N-y7}fhh5Y4?#2vq`dlKZ7))nNz+j$0+%L5PM`4CGsX5eJS!HR~6MPWzw8jlp82e9|9-+Di_pj`5$w;Q;r_3de z@J3%;8s{}l4sBVClhGV8;-t|Nz?7uEwQ~4HFnj`o07vDO49Zilx z?u;oWuPUCdN%!fWsyE9kVjqS-dW4%NZ}`5H-rn9-D_Q9L(e0EN-l5geK}S|v?dPk& zUN`rm_FobAu9XX|Hc@%H?sfJO?>}^kF$jNxHZUDpUiw{fAF?ACG5iyGW&8x&k&sSk z#k7<-yDzAb1XHN_eFMO6GHP>WuT=5-Zkx@C2a4P*Iso^Px$dnny3^U}Iad>3xhV>| z$Z_pF7=y_KkvK*tY#Rj^QCpiac8$0nZ1M0O6F3OsS-zVuQ4kUs&?DC5%n)c|CqZK! z@E_=5Y&`->uyP9_f&*xd(^9Xx8Hi-vhqna{OT&wXK6~i0vL{PBqFHB2cdsV^#-q^z z2PWgU2W8nmypO^v&PqJKyq9922o;omA}EXWD;W)Swp17TLVv)kK7Pkg276)h2_BDsDiPa%_*xNiP2r3S#wKCVfmRZa#-GS z#6dE+?5ZL*m&faKBt|JW$V7#@3mZ29;(`}gp*X4Kbv8|pKe~qp-Ya!o`+$>@V$G#i zx}1o>3^&h&XEb}>yz*hzfVh>ov)Jl`@JQuwRHt5o*0W#?(mbavb zK>DBLuw&|%)Yr$3I}&@IVJi+shSYhOf~$*C*7@yT`?T8M-F!8ch%7e6v`5PuFGK@h znaw4S<@)S^*C*SsBD9iu7q0mm@>0Ohmc`Xzbum5(t5)J}J;6;@Bu`3-2ufc>0IQMF zu7w)6ZQFC69T^GPHUH`lIum!g7v4P5MUwAMMJZmMP*$Mkpdi+Fb|SRIn6PlZ-Srk; zX89?YGoELA_RkoviO}nFYy0p~?R;}9!uV2@gces?S$X*oT zi2{~HXSXp}RGPL#GRf}~&b+5tFFhWX?ew=oXW6>aNSI0YzN%RcYH!TpTR%roOS8fjfp<_dUB$b!{~qMazqxUpsy8D~Wvg5++5!XXBIC;1(gyG<@u(Cilz7ybu58##8cta^#&h@Y`^i}te2GD24zfr@G~j; zi>!wU!8aWEaG98|df&g;jLo8scMTugHDctN%mG{QJ!;q zd)X6+%>e^Q5Bj19THCsZrrXoVVEat{q6^EpL^+MF19H0}62&ufD ztRU~QsucO*%b~u&KtC(;XkfhGi7@&e<{g%wXKx+4J_yYJ|3|)=l}0EEv&aV9TnA$f zmOk(?Niu+7h#%n}=u2c>#qSnx{`Di1q^7AoxCwP~Wrq|yrbdBq9#AGsxTkS-F~anF z0o8+^HFnVpzse9IPPKZW9w9kaW08P%JfA#xk^A=|^ z05ZFR#cfNPJ?hY)5R|}44Xyc&lV9^*>YHCDi`kWY8sZF@w+`IB!Z>g0!|fJ6mE;6x z>8W^@wWQHI=RodzX@lfEBd;p##vV^W>6RjXwJF&ADi0z?z6YFJ0pDWp`~4yxq?r!s z>iocd>Z~dD#xe;hJk3$VwwqpJ@hd&%kzHUjTbi#2L`tsjoxizlQk0fNoTg| z)Sv(KK&)I|@qO^|v}fEzFps?~B7nsIz|gKOiafr4&w!CyI68WQ+IcN>EEWx<_!Z5) z++1aI|1=?2HjAzLb={1KqXG9j^K4UBoF$j5NEr}{a=u*HU4@`afDhZ$fGQ>HLYCZz1$h~*gkBOF)9%Tg2m!yc*Yda7wy zsXz|3#2m#OA|LSbzAdofeM_%Plx;bwKk*=FawA8b_oK(I0TGh#5rYjVNcUyrN6ouZ zV@^)k9mo=KM>S0gLv|k*G0;w_{fSYrEm3L5dkUb2^X7P{hHSQk-Dkp7%f$U$sz~-c zf@8TvK7o>m^shy4#ETJX0|C7dU_&9qjpYDCJiZHfs{C5y}UH~yXSzkI!bBIPoxKT48#aQ-6;f{4yNryr1{*#e;vU zlu|Hc*Z(pf2LhEyaBkigPXHt>Up_RA3pr*Dwl#`Z;q+caX?MpnhZP7sewvUrM46{_ zj^8R@8oDQ$-o^yMyhzfZEF;HMhw%^zk9{eKGbleXZHMRo_Cv=5C*q z|GlS`Ke_l-RP)!Q&?%jlf*j(Z@T;#d)%8Hj1Jy3Y20#*l=(V%%zLRWFMMyD~K?zYNKTvB$6$Hli}^f#moFZd0R7 zjpJKk?y`=%rk82hv!e_V(V(Q5%Z;Y}nkwA$I@{G+@CEi&XOYf>6pnx+z`~ti;JEP6 zso6roy{oClm#5`@N{rO*uiNGp-jvSwz_ZP_J;R=KGd4TWE6S}to$v?F{U%*slVTd> zZX82R44j1fTJS|cY8fCk(etu=hwTTMC>HkCg-!IOOL2Voiyi&F*z;VdA|mjbUtk$A zc9&nL-VDDu&O*G(aZ?^M7eh!wiya?%d3d9n_<5X??)(X7r}E*lnOo(`oa5w1(y-?f zIwfzDYJ0<@f)YH(-qHudwghkCNE~yGoTlrXNM-gh*wWjXlwtl=d>A&Nsff0<*bnZG}MJiG8EpLUfa#N^4 zDrBM?Jt4Lu;UP7er)1lf8m`L5>&G^@+`Ejkda^PBbHkOmKIJrr6iS^w!j9 zq+BhC0}0fMH#J)XV7WF8Z4CcmAIT;(Im{Qv?HIO9RS69F+|HS4Q;adAc=n~Z2g1r+ z`R3E~x0)U)wl=o1z_eeQ>U&Qgd`H}LtC#vhUbvFYvC**JFpa&EpBAb9(M#M)IO#WH zJm9Ber&a+hhDe@i6EWrua^*i>ERhSDEZ!jn`9ZGCmYy{SEPjE|g0qb(VT3SRhhX?# zsCovM92)AJ!?ctJ0aEG)37a~tt#P!Pzwe=#@Yp8{3tn}Cq}riCC#k+>2A9(X-~G|l z{omxpmZN@-tb|*&);qiUd3yKX8syR(@qcY@I-0(Z$F)?^C<*wnoase~_Fy>7tGKkK ziK9XrZo(CU}Bq|eT- z0|}EYTekuZxw()J`Y(%zxeE zb7@TPH1_sHIVCw5XhBmH#vk>SVop%?ec%HwCRf{r$*Mio`3U}`sl`8)IsHC%n_>Dg zx!K$GzZ~4m$(jSNV$VS#U90gX9Zec#eYeBgU$C!qThEwJ=|&pawq2<9NJDzAL_|+f zOU~P@HWmPugXQ*fLfhchw;S`^y_^*ZQJ}O+w3pVcBDYn}#!pdm#=Cg6@-wS&F7gGT z<@NTZiQd=o48PtqVp4`?Fc|SGe_NGIZ+fQf| zwaEqen@MY&`1l$~c*h~Qqthxa{q=`%v(~<`qbP5<4_Ce`mgmn_?nqm<@)G!vy68`3 z2KUo0X@GQmE)(^H@;A8_s!QfXYTR?$(=^>gVi)vj7)q@MKEzcCjAu|a9#S$He4zxq zyn+|oCJGpGs25d%+c=1Xqh<(-s5{IF844o&^?-Bv?oC*it0PZxH!&vDih=nIf6wY+$SjhhK)CfI*2Kp$(QtIVl~q1xJ<%8FRS9@}uvQ z+Erb#dAeu)e*1KL!* zSHu+NIwkT-k0XUB%qz*Hb}=RL&kMF{UNA!3`xr?GCntLb+%|Dr4uO$T>BP`e+(PD0 zIa{*<;`ot$8RH#ZCq!=q=_Czjc>b>8=^Z*4OM5$*c9QS6ezD4Geq!Aqa_K5pmLn}mX2G+!0@ekPy1e*l(d zQdkZGdLTE&KG?A4+BNMJAe0{))S?6?yaFJXuEoN zW)0U@w072!+yCK`s0=z6i&gUZE@lMUw+jTfTx=vWP?XdvaluyQLjfZvr_LS=skG{-P8|_fA!bOz;^VHsb z8Yx8{)+o^w(`LVV%UY(zMJc)SnwL|RuVM;2uD7IZq@*v8jng9QtHx3vz7r8BVkO!S zkh|&Ri}~>@?#a)q-n>c`K!}MXUPa7^V{*i_4;dc>>PsnHQ6i8R;*s?CC8>vK9k?7J z7p@{t6K3AQ@cropwX$d~A`s1c9J4j!9+(Ei#%B{FRz>mjS(t?RUy#(YM1;dy_5po+lF zpoTv(vVAdhqntxEEShP+6*+r#Ub%8E`B{x8`w(Qop8D_0zv#VaHH!bE=q%it`r9x* zLQ$loWHK5>LZsP%QA&3=BHb`XBQ1gmqY)4WO1CtKN(hXe(p?*jkdT!8z32S{w(DHi zIp27m=f3X`gJz4tR26Y5hrv>V=kRvIGiI=r?biHX)?=S_EyYwJ<&AImfB6gsoL%}4EQqlQm~4GPk4J-6VsFlFQ@ zW;*HhrRjyZZCQ@&$2IQCcs%|7AL#41`~!ymrNBa?AJQJNslXX_eH>oE!05j9#!zoF z2VLsr0$y4H$+6vh58Nn3O4OC@Z^~{bDFK>b*VTrvc^aM~stR(FmQ>%;^j%IJLD(mp z&r_nLsXD4DxvN}m1^B;IvItbab=mO*yvN6Nq_Tl?O*%T)lZl*>eg?4#{;R9yC(V*T z;fg7^>cFb&y%*Hq!uqSL?2wKc4ruJK66r1%I+`RujGx2Sz`gfixI+H8f34ajU?yvJ=;+-?5DqB! zP9{D~>A2osp!-HaG;wPuGRGDeCB}8_j<{|bYXrSEej)HlXFLEDo+z+I`Ez%Ue&w_; zoNv!JgvmFAF2qMsR-_AguG?8%v&78LUDr(Jn=4FGz=j*&vee`-S043N!M4;ayHBgh zlo~4Q7WCh-QTgF5I{QB#q~c)K zd@p=wyfU+=DOL7o?Vs`OZ1jxH!rsIv{E4`T#s)=+{E1AM5hSJ0{)l-44%_7Y95`FY z{N%Wca9A~>R*aSoJfkH;nqq?+gzbMm!SCH1fSd^HsIz z+QfWF4jKUscNKBJ(emR60Omz7SS4c1UpOHH46t7e*C(qBq#viNq%G$jO&8xQ>uMQM zSt`PDbX+W72Un~88auLy5v3)}Dmg7~k5DN6_D`jfJjR}%RitkJE-}+KX*-tFx%rN4 z2`-vWIQ?5AR0{FzC;Z@bZhGZ^tYqdl)F3iE9OzCtvol@*m*d+J5SMFGCM|SJNf6>f z!3aB+CU4^|pI0sSWoahuo#2zgnl^ddV+GpZ{wi`xc&2GW>Fy-Z=I%u4uWGETsTs61b8^|}=xPYV1c*0d zzZ-t@yVRRghO+baU;G{kuxb84cjgQ(T$sTjk(gCQt8A4~jWRjO0-!gAWzgDqaqHeI z1sOjKcqhsH!=Gv60xiB>MM*Z>&|uu*j=I)U=7$r3S(RS)Gw=($E4*)c>ObjpgGM_N z9(L-|ms8~<{QU;626%{cl>1M5A4s^l#}9Gf_HXZC5xN^`YN($H$QNsYeQKVX?(*#Z z>=Qd7@H+c?5c>`!pBGzq<10T*=j+yqv6c>~+~h(_42)_Eg}Ods8uFR^oq-5=v@qnY z-Nyv-@use=g}Zt37tr5DruBITUGa-}KqDNJWGLKWK!_z2C(f<6xDvBC4)mpg9n@!{ zu>N^le#JJ$IQ^UG2lp^!SF#ym)ChhqReHf-!9WNA!fa7*&9T=m(P&&w_9pY1E-x@w z^JK6adMw5E4a5p;*!fcx-e(^48t)e}nm<5cCm8e6a>YlH3g?3?^N8t*Fv}YTKK1G& z;yW@c2d=amX2ZXI=UdXcFef(|SZ!MEHPsy6Z+PRlb)9>d5?B8v#V=e5Hyud?v%0>6 zw&eR*W(~x)Dz2?ubKDbDqKK0d;^Fp(gu!moOVvt02?~52RF?qB5NhNE8v$0K%pn!E z+^UgdrW#ph+))2wuJ36V;i&RsdX$g}SqnUrUy?D|l!>KE9<~XBZkYAP=rGMc` zSzfBLr;>E?UIA=GFnv>_4=CY*QQ>L$rM_0ePhLLSQb!dC6|cm=4Hf_D2eI_GP>RX2G;w08ld$`mgYMZJyi)ej zt={kvi_p4Vj6r@s;2u))aBiW+A*=~3I%CCO8-+@9V^D$Yxi_4j^+IwKU8f%I@CiBl zw81YXQWe$<)v@0r$;e8CkmqA6vIqBP`2DW<98-$=`{)WGr%;?+qH;-#itGc1$J%^O z_XXa((0Ck(WguE>hS{?NVGnlVmMuV(jY}XsRqxPUmUp~oM-e)n{GRuqYc{D@`?;Ar z7ycXdjgy9gRmdYdP*_{_C$1;NB9g3aXH{ksaqFsw!_m$>xxN4cS5o>#9`NFU_FEI{ zl8fG}7JaKo7}k>jj2R})G^;&Cxl?Gi$>4Y7YMa=<(s1yp-{m5|828kw9cYT^Y_}PLgN~pl8Mdl1EK5D%*5F$BS-6|i% zl{mA1T%D+Ga4RiidxkB~#uO80t!FOVXZT^xVaH9Cj+#fIpQj^yDz4h`>qme20sIBk z^0li4d|b6o^HLX8N=95er@)rgsn$Qxxu5j6#MRed%3Y{TQO$NnF*vCwJa=mHmn35s zSLgX{1Yle@9~>7f$o|&CCPZWi1V2vg^m=s?8Dn^u2AJr3d>S-Dij}7n9;6(0>~t{| zjhn9x>cI>e6Y9g9mQSh|m7yPpmdu}zbLD$Bp*MTZwR;|bLH?Y{_sT5AhjyP&N3`Og z+uGrLUH;0sw*>}u;H_7p=Axo1o?v>)9*QS~zaz$ukwm`CObF~hI0pLFv(Td4Cbd6woJMwZ6} zeW;0Qp5lL?@7N=d33~;tP+^nvwh1MDwF6D(9nLTxCSJD-$QLv@mIos(PJVm7%~mOtrBs`}g+4UQ}-E@ay`& zjVAfa|Dts#)KIjq;!as~CV=HWW`zZoxN z&WNYPEH#hy>M11WEk!3y=O724nthI=Lsy0C!pYbSj6S?hYRWpGhD+&=!L=c#|x2&F(0d`*v&{gEw4UK)5$)^5I|$w7?H{$4^N z2IfUD@bEM`exkvvmtiYMp7Q79E<%*+$7(x_z^2~8`)09=_6hk&JI^PKSLd{a3(Xyw z@wT=LBrqSX5ik}WbK&;=^|QQWmXLYYF!$qMEc;(H;@`vN`oHus-`XSF5D901U1$Lj zKQYyqRorx`^_3x2d_ff^P$7g|jx=kwe&|*W_k0m!pL|tNqdbPdhRs%@BtAyvCJ-NGuzjMV}hRaQx zFdS+5Oq!_mSlTX}`|s<4#u%;=otDFLW6bVcp?KFYP0UgeQ6~HW8}l= zuW4lW$tn13luC-c1C%Ycc6ck~{b#f6;6&VX3xGe@(71Jx>}vjTfVVl?wanB_lE zrt4Ck z_jfcca=x-uP5b-@a=iR6Wr9y1{xE7Aa538Y1ITK$Gp$c%$mxWj159{is z{rKGr5Wj4EtF)AXP@=2|MW+~p1t(xbx3V>Cr+&8g z!%mmT0KV|wa(CZs2dm*8MzDa&RO z)mQxel2`h}w}pa3{K^G0N;TU-d5GoXt`Udb#uRe=?VBUSgq@|`zPgsPOmdIPATP z;1^{j;)Xb(0s$r7iQ>7=tftV4OvLBa>p&P;lhaR+P}k~b==uy@#gyIijYd5!*Pf+P z1Z8!pWfX|ZJQVv%C-&&a_G8&CLN4KPbtl?v zZs&)keTOz#_)wGn@1?ci?D~oVVlj3bQJUa@tAAA%=XzE&Y#+f-Bhm7J*ounZ(>|m! zY6>sF#dkpRME>~8q9TK68A z8{h`{TQf)pSs-dt2bQU~=(t#-19@W1bHT9=VeGb>#C<mUYBBoD#kMyH&tJ5 zFz0G%2goi-)qDu{e zAFQ`tT*6m%?vik?P!&-JH&wQCH<9{qT(44;l7LeBPfNPrd&sVkrw022;+@*{5idTd zk8Z9o3?59a(^nM{g+$?tUh}D1 zVWN+G$&QY%`HgwmhUDih?=MheTWefK7eT$woFFgm6}z;Xpe?-=a;Shr>YZNmuQN4_ zG{TLnL05oIe5%6b-3N9GyTX7ILj3p1o&o=~QJiw$&56lyUbzcE#_YY+Ua+fBzU$ugxHrAzuR{E{upP1+Uq};k zld2`uG!xYJ)%$B4X&9?YQZpw#B@N2((+wVORFtW7*ap7Cg)|H(;$Sioc}C4 zRkREudYOfv`|S`+PSme_UF@`+dFq1~r1vw2j|z)-VaxfJRgtint8uwNij&K>3STI7 z_}?0dzV2=ZHHI0XOTZ2#JF|6M9oN*ZB@>#usCG9GBSUxXtXC)aIryWbv2oR#oGUK2Sq62t!ryQ4qo2z~W z=2)(OrgUbROwK*86c+ms3zwJ1iz_`k%r)NBtlvyvrER)Qv{J`^T;L-va{he>Ei=Uj z5@mfsC$h0~sgtLpRq_}nI0#tDk8{%;2Uh17PIhj1jw&<5GzXr9F&*CB{b%zVY2hz+ z-0@V9vL`>_2QoJ_EMqErO7Y9jB+=-E0622rI&c@?&qZr=U_o#r%hWl zLPU7^;KuOI?g_tc^FEAS#D@rwR{qH7E2*bR?G%N)UWg(?CcV^Ix0sgtfR3XcbRdvY z0BF;J1qEJ zt&WO|{Rsw4l62ECG2yN)Nh5W=mlsZM%j1!fTd~i?o;E%%W1C-0f-INkmX4}}!oze; z!wL|lW6;Hcm1EptwbtWXU%#1}efzu`@oL5{HzXwm?dnjcfk;z#Y7dgMr%1RU{NMiN z*jc`TT7s=x=*2}R=Mo}2VP`u=kRz-6#_#YGugBdzps8`Deq|W3(}5?2?cscPn@bY- z0g%uemSM%(lbSS*@!q;irLLpLGQ`2ur5)dGRd`b3*6@*8(cPTx)h<$c$dHbbZlVGd>#`&gcxJcBJ<&d_5N)_W}-Xg8Ssr;B(PdUt!usruB zk)Zg;pNmEfFf`7NJa_zSY@W&GU@zPwZ-gUBg?E@I_BO>|mu&rroR(Ai8!DE3%yuBf%|Pe=LA1F1Jr45T~S&@2sc`t zTEyV2fAh!Bi>att!K@*=W{1vG{jqa7eO}i^}K4ylNRAzSDD^RqZZ>fEQ=H z)6qTm?l*+|52bb0CG9OgVpbIkQspVWQ$sPZwMvhs2zu0Fz7upFy?7UfgAuBgD4Txv z|Ip9Ekfs4hPE8|jtwCM01xhszyB6n#07NUbj=Wn#qFTZOFu7D%>y?xNcMI8BPi}M< z@R8Uh;O(jn9osqXlh;VC0Cj@FzP0tUTl!V|ET}oAEJcZsw3pl77X0R2M_N(EVF$X( zuz_p-{LGNJ71R?)cJ@Jb8PIL|D1avV$DCg}jmzPTt`!9gi4A6^iXPHy`V3k{^e?82 zZ&~?zr<5{7PK2pE30yArXZpg@C~eUpwlL(5#fSs^&)=fo=`9LPIt47D4O>>hE+%H( z=|)^zN&Nwp2b-unmoMn!$CH*cAc+6&FPmW7O3c%| z3ioE_57}<#UN2h(=YrETX z$j8uP)$?~Zrz*`VDdQJ9UqXniZP!evN`pBiuYhpNkSJdpnQNpfo@cZ-@`*RW>#@@O zA>lfemzU>D_O~;ip4-psfxREjKHoACy% z(JE6fD=N#a@W9(@e4QVDj&V#Q`$URgIl-__exk}N>ttZm?+Tz`H9W?U$z8kplgv=}d z)M4S&J7(RC0h;B~d+|E_tDh2%!A#tYyEn)kJ#q9WFHd71ZL*>0T)Jbj<(!4LeX@@- zOwWEI8&TIP=5^k`Zc*|j?ITf2v}xZnf2s~%I+V`JWOSVqzu~H5xdBL9zstH%9BI+h zJf)U55aXUPm-+Xc^!)%ZnlKF^uc;SEO%ji)xGD&yI|ue_E96*7Igg#0tR3UVY6$m4xu$ZT_iLqh^8yuXraM(5a{5Cd@<2PFW5o9*LAFtrz058K~%ra>8Tt42X9-pW$ z6F-m>4H4cX+Sf11e)^^a!MF}8_ZCr^PM9hX5qQNpV5{0`2~z3U8gbFj{k(f8UPQ}U zGal-3YD>~A;!`2idb;9!d|c6t{F3mtlljZtNAJMfK0za<*H=-`eT`+c7icV4gtUc3 z|4jg6{cI(!dwoH2LkvYiK5k3)>R&fiBN|l@R>RyxRkIt?yd5 zU55avQucAg$uZmnNN)5(urF|_F`j&H@y?hmA*!PrU^j0|IhJa;@!K!eMGnCDmznkf zR&f=dPNu(e>ozLrb5K>%>=`n#lfX^=I%!>#U%bI56xn3gXXM(!(4A4`SLkuTT<_yqh56&lqm)jLKKe$ zLPvXEVN2!zFLx?>o6W2_8o|)Pv{J>dG6akWlSG>bi0k@@f#%~w;DGC+rA^W7q>hC41cEuTuYH3jz zd1$xknLRaQD&tSv@XQFHHsrivb-TVst#eYk2Ebp+e(m^vj_#rq)jsn#N}ux zd{Sq>rM8uV?)Zca&IllB1kRXv2fU8|r;K=-*{z9y6K`LKdZTC zMd4eX+--C#D-Cm|6Bb^(YGlmxS$ajE8r-Lf4^K1itg4G8O^LX3f&-+aZi;V}eaJJn zRjkQgDj1gjj_=b@xMK^>LSKyq(S!$eNMU`ysXWn@7*AL^LLDzy0kaN{^M}(q8~1@U z&4=dd-Zg3Iyu1@Oy8LmJQfcuoi$UtubEW!xU#WatUmx{~@^V_=?d8#Kj1SsKKT;q< z^A`Ow8T%;T<0>!WjL!+sPN(pOOmtVx_f^H@8pSlzLI|Kq(>|m76pmU2#M*G)%~%jC za;`B|jD!SY@Tb76rs0Y!zgn6}>H~iTo&p))PVvn9#=P8ad8(=c9FgIWATMloXAFvuH zliw|gTN4z~*VHZFpPNX%;)iRd8`@M==gr`Lp_^W%4c=nrlOF(Y{WE44otMQhaaF&J zQsef5ML3Y~h)YV{YfvkQJ8*`0lfK`1rRXqphVEc*rjTf3@@*+XErSn>x_!c3P=*STsl9yy6*8wb8Yg|rI`=U-z8KaF z5`)EdL(-`cw59HWkDD@k-3w2MCszb~#Hpt^j-iUn?2+lru3=v&pg`Usr-A=5re*dO z#D4(r)d?F_D)mICu`flOwl?Aaf%?i{@>wkuN#F$Y!_l|QB$Acxr*6$ok^$h{?oW$( zYDF1mkTE6FR7=g*=O%eQt8{FiuHDGb%rjSZ6EctC^r2+oR)3HH-(RD(9DKL7va{e<*DNA(P<}z+4P^C;wEbPFX*Co(Ub6&k4ekO zXcGjJUIbLez?3gHGT%}UF<&nA{2pW%a&|F3n&H5Hjsu@S!airA0$eQ_M~be}mNIt+ge7JhhffPUn(@u#tldM=T; zE8KP=&k5mg4RF^qaQjpJmC+~kE^K!?soH4#x4RPhPht7CNhLp{Uxp5IsGRn-)D-VT zp;yM|IlPaG7e1WC%BVKhzLnKsgG--?i3xTLU3s|W(dZ$yP#LF?>=!^t!d&PTq`Dve z^D6YeCv01J7Akr?V%m^;xOO=_ZghSg8YufcCb-h&)Cc!k_=~l&yv&UeMIvQ_1!t0N zbl+|IFvU01FQ^`~<`vA(3V;70P1r{Elg&?DPPQj{PVv665hbQlOgJD@M}GY#=S)?F zP0J;qfv$+tgbB+rNGi@anUG!kW?7ECoCF(Yx#)*lk$xhbqOM&%>E1 z2HWMyc({{1TW^d|b`9g7oF^3)v2204C%Ey_Vq{Ln&;q|#az=l5^sh^F-c}J0*Y8`C zsn4>k41-UBAvbx!4d?h;`ioJjp#H77ZxuIcLveYB@jkM)oyIpAb}j+7wNehVaol+O zizH9}hbMOGGGk(;4|qOp{dQ$MTygROci~R9jJZ+Z4;#9jtg*GLmgxqnA8o+QDuav2 zlhXHX>_+j#MqdJ7w&&|pvs{``%J_JWsk|s_cXr8R)^QXW>e$%6cYhoZr>GUq*3)Zs z!4VGS^Ewr1_Ll{Un|L3o1UsqoK-mKR7=ZRm(xnq1*M(*1N935WJ zewP!R{BX*_&JH0-hQi56PioaJD`Np~GG5h!)P}A5zHOB1jZ4M5P9#3i5^C#<>4* z%E3|R9t5AV6>D=R3*V0%klASP^x}-D=qC_XkPFn>-^N+}Nz*SYq;u&|uB?2*V^50J zzR!mH_NTuuGeu=k1cv#JRj93;ZF?qxc!%?aE+Rq|t2fs+q9Wm-KcB|K+qZ_ma-EF4ynOxSjoJ}v#Rsv2 z(dqjLnZD;crUO*6KFcyG?Z`5Z7 zRXY*8%R(KJok;ywfSiou@J3$d{1$Bl2FQ!46ZGwWh7Xx3=4baPdyq^V-9?bO*k~$E zXg`a~V0O0;(kk<4t9LMY&vWk(hXO>O>R+Dvm3Ke)C9*E!0sr5Kxnm`AEYTVL#QPst zWUe2O#hkWl74z+Z3p0txpoY_<5Wnp^vU$j^ns<}MzUytNZ!TyoT=Z`Ne`MPe2DzBr zy3fgsWs8LbU|cgiTZVsSkW#czz)t_D0PWjyS0uCPw-w?~T+ebdu*g3;ta*Ij8=n?Z z89Q3GrbJjCh(?YtmDSS#H6vSX>0$ZnID3IZVjWU@wD1k$xMYYX?TJRYA* z)3!qBfV)02t7aNrrCMzgDFw?$5WbX~_ht#i4@2yubQGl!$6`C)+|n~N)c&kD8Ga0r z3*IKRw!$|`4t!(gmIBW`Ldo=jCtuz$J@??sJ;Rp5x0Q5fxKBp^ zgulFLQe0)CNG5|EO{Hg^gVnllsNgC2_|uK&SKJgC(5+U)_&EEG->Wq#XF zK&|m=Ac6>nO9EbgweH6hz)+u{QX^}5M)+IV?zu_sQKCI;I;b5o7Va$`y{(#}(N#(u%5z>J;AwH#z z92bRN5whbQjU4U9yeHguOVV;Qf9KqOrmhQH%aNLVGv7sjw?Vo8_AQGR@uK(ON5Z|1 zeG+Rr)=e(<1Kd;@pP?l+d+#=)ZH^w47HipFau4Dnjai~i_uvO|=A|BBm-lqPZhUFb zZ@({8b1KKfu`?oSLMm1);*ymEoR2-dO3xE zwvBkBwpiN(9lj8wCx22*$l>Ru6>9GP2tzX0@Lozvwd%qCam7EW(9TZjx3EfL@Bctg z__m?v+Tq$wMK-8)dAnGWx2*ZAyN0)7Gpnh2f-bIw&GL9R9Tr`t&PWifU9oz4Gn>u2 zE!lF|=-+iMe}S6lVFyiHqH3;vt#vM8%ee560HlIs>wJG)W9hi|=OrbY0}%lQo^1Ev zNVOV6rdZ16COsW!dyV@{GQBXZ2Wh7|`lXNfva0{*h|*T9ZnC&VX@<*|jx3pq37LCM zY2@77<0vo6iG#AJXr|ogR4Y|uS^8=bQjp3H(f}sRad~4l+h~~bZ#pM1l8&o8+VIGU?2anQ!qGW7808amR&DdOA?d!@bq{PA zCe|6sClbo{;ykWWs41n`zFqCZ<>&X6nNb|1_WQ|KomAO!cydItc~2o&0Qg|@4=T#J zUTmD=vf0*^E`D8-=Z1}o?G~6mu)W>@+ijV(;Fql)=il#sHp20LAD*~J(IsU=KSn@> zXR_icjB$)Zyi*pq8VU1U0s^IT{m?{SjEU$Am($-Mu+MjTh!bo2YWdIm!d;BY3%JNA zYVDJ^(yo8Vo@K z|N1FC6%;pU0<{h7!rvc1AFD_preZn)Z@ToJ3LbV+f77tBF{a#)^W72IhoF&>d3A@> zrEorGfh}APG}47UW~;q`?OoNoD}!S0ABIjN?*1!bj^7&er)!&(J8e=J&vhvx_d<0_ z!pZxcTAQ;AU(=zl5~y+~X8l-}pU_!g&q_oMIy`qG~o)rQ&vh(zc*N4(j>g07&_lIa~G1A-3_|E*JY#Njhp7$zI zul=u8oUBq>Z1R5~CepIAv#MNok5N>!TU>#Th~u5_B0WSGQ-(h{#yP=90o11oa)aOI z^u?LKOt(<&b;|yd-@W4cf-N@Y4J~OIHhYIB`gM6jzm{gbBbvT!FlNvzESf_iJ$U}hWZ#r}T351H$mZRq-k5ZEz9X-diEKJ)y82Z<-A@lL#eV!0i*0-&l(HW+1eaY?-z_A4dQv}H7XCS7{^YE=Hp52rkh}(A;``K2I@jJ{t+@2y9 zQlC?fygTtL*9*s0LF)%2J)?WS3hQn)=f&n*+D(6_db;Jq{KtNFTk@2hx$?stl<3Rl zcPV`2zo}zu&L&Ri9*eU45WXVcGpK6SuAnNWFjtVwh3BODV3~0Q92#;;}WqDTe3_p)}@#h1X^k% z=c{9q?~l-Q#23(E(Tyc*Q@P|*@t9&9TO&Uel>I=5MUKNv>TRyOkwat)FN;MgwdZoR z=W}`i1`c&bpDZr@%Fc4yo?0-Qm=l4}#4@A|Av+&ActzZbvsaI2-$Vw`wU3qeO# zt6TB|xce)LD&&5j^wC&T4JR$lD@Q(LF8Ug=KUJni9=G_Iybj0hL7IAJ$MR(J(#VBN z-DiEqt$5+6s%A-@Ms;?GXdewQ!{4fTSb5%GS`kz;*}>}H>0B#U5LNPFU$DAEUicO5 z4I`W|G-OaPW$I?1*9TuCt)Ci6`K&wHo2PyiW6#ce&d4H~GOBP^soQUt_S&NXF(CV0 zwrTiNdz7REA}TjyLHkc|K>rTPRZdbb-qb_kj(wj6nDneK7(yL9mQZ~A++MTlOeMIb z3X>|Nq8Zjiw?ISE9ICy9Nb+oYlb|mY-`kuPoj^AVd=tmzMoY4#9`8p4Ulg2)$>PCDakOj!xywp+e{rZZuJ5Z<$zfXF7H0}*gvO_hVWDsUF zo=}Mdvc--yWxTlFIHpa~xQlEa(`i&D4B0Ts-&VyXP#jQ)A(mojwGUZ(<)ORiS!{6R zr?&eUw;Z_G_b+EodEiPwAmAM5TYVz1bem_;ewTROi_$7GN-@W(=F`2-;rCpi2OHo~ zxjd&u)4r#8dl!b-VUQz#^e-B1VH3*rhFs6{dLq(Y7!Rt+{O0_XlIo&Q57qLM#WZvW z$}NX4psuj#ZMdTu!s{U^uo<1w!&Gyte@3BVSuA+SRWT5wutK^*gJnIRwtVqdo_5L<^0!bhj6U^I*{^KdyX?H}>oy{C zFS`pQbtCNT5=)&a7f{y?yUJ^V`NDa{%AMAOQj<;L5|7_~Rc-Y=CySCg+o%^<7TAh1 zfsyU(j+nOQ2!n6c2VW+zey^KK^^hj-Bexxyo2IaR)&!31VyV|5MJb0&wxkEyKLMpA zQ@;+j8*5fju_}+a%l3@*d}Uf7GkkVhe}sn|f9{ScU@`gScjYoTHeH@xXuHurBpm}z zBY9jDGrB&f1KZChEUc9+X&a9$L1YahDhCL^&dw?&MzRW(ZNhX_JkcHIZ}Vz~F`99L zZz5LLnfS;^fkqBiX5#i5((lxa>oAgS=eD*{sBq*imfbjlYTYX64zj-=TZUoK&}|8N z-PAHTSluekO3(WJg7wyYmv)goQ$5J52wMeGWGZ5mN{5G~l5Ifb<>2=2dfxkt&LN`Z zt0Oh|;-6bj|E{~!t)4;M93Udt6fwwoVr!YO>agUxGOdBey7xms~v zKQi(*Tmevim$wQe^6hzj1ktFFBv50-Mc806!?}{07yg~%9sx`v3DBdu-A063T?e7< zKhO^)u`b%Y_6C%w8ou{>`}I((DUg3kZqBRZoBK)ob}H%#%}UUSCUx)|JMqU#r1h2? zF*};pZ4B&d*(7gWNKEV?zgHmS1pte^mOSJ5@HT(%-~@(fN5SR+@<-tnqzfX6Z{3 zv3LuxjFr&9MgAFt;`vAV->{-KG9UK}PsX|MsIfxg{^(P%GQfze(o&I*p?};no!f zGMNzL2Bi(3@7tn|gyQF_Q-^aH*_LTO?e!%x<;`%u@VULm=j1rqbMaPp;R*66W+M@& zvAkc^f`z+lGoP!S{(W702SzrLsVBxOzg3&ztK~-D614a*ni-2;3=BT!nI+HW*m3d^>CBd3WQ8$Y@{_1$_#z<%`ik6tFb z0?>K=Df>~tZcBr!?O>7b%AM7oMIjHHSb7tbOKV#jreE9`Xa4 z(;@&_8qM+aC^xwcN&<$-4Yu-+D6Vb4lnM~gCh^>)Zk7sT&|A-3jUz?pICcG;Iz5qjI6$c07~}AgY+h7h9ggA&f#0F?7>=d%< z9o80_fKE0Qc7OSoX-Z7RH$-p`+1v*2>2RgW@nyzqZdBW4;^XYFmZ8)&a#(SHW?z-V zyy=yQ6QJ`;!` zBdeiiXmY7t?tKh8iciVFjG$sSAa*;ZYfrkl&m6M6dlE880Gb#b#^!Dd&yWuZFAN5; zcgk7M;i3!VOD%0jI5+9Y#{qpuL$pvTkN1uG1?^4j?pAn*SFO09GzVKChOYA|)!SR_=~A$Wgu`1B-B(*@F)U~N%~O=g@|)D>yXN|pBfcqg zF{mj1EV~bX4kO-N{RBhKPRnbm8NCPpaebl^#o)%ub{G-+f|aeRs_afMco1uo`KVsg zA66%$S52m=zr&@Cv28gfk39r2Vdr+1xEc{TzSj~Lh9QbfH%PQRNe%Sz7sjaz ztR4{rCi9jjmWA3nWNPxH2RWz4@)NXo*Qk#k0ab2y;f_p8`^j}IdUIp_ zTjcd`wHY56-fm|4g=0}o!h(S9Xl1Zc^$g7d4)3+<4oP6ez#Gmd4Um;v`nQfK;$U+? ziL4(4Jm~JY_}8$XLEx6OThLn;%;}NS^E;}Wzn;x*u=)~d4+v*kBciwA7|t}}Zx1IP zcx+hC)9hTi?PFLdW!JPGYYuTMO?b=N!uFTyYgR*UAHC}BmV+ZBPma$v8gkau28>=P z7UrhphUKp+|I{2$IX3ow=lLJ#8<^sr4X!q9(*37f$UO!6;WzkX9VV_)nVY6jX)Or5 z^1TMh1uk+VN*T1ZKUFnCH#_eY)ZFkY0&fRpvh>|D)h?EG0DGDzRLzzP_{{gkRc355 zh5jO|fw5*7U#vk3!k_UGl1<1y5fWJQwl%aIB&(Y?4+rtL*TGFk`z-nvZ@-KG7+&-VIE@pkpF@8d(a7HD$}Gr*+c0@0D@k;`M%}o zmQF$Hj`$N2%9|-<1un|LJLt&&^rW7+2zAT!g&1TcX1qA&e>PX+bf@5nwwY-z4=k70r(prd-#sH5+`IcOGrr4yXJckZ=)C;qxrgZu`d{j zhTl?nhjz#mcgHhYm2MDPw=k}j??0K?FV9XT=2Ff|qk;%WC4fAiySi$Y8rM zXGYH_Wa-N@-SKi=?@?J4{H?sHjZ?}f8PmyGaaeUi8HfDHqxy4&_Gdc1p%v8=I#5Ld z$Voa}FvR#xMMc1E8At#Ly1TqVIOE&zX3+&!>X!dN7GmQjt>5DR!e<05D4TQ?P4ag% z#QKz<^M!UZy(M9h(=?1sUzcb9J1~ks@hNb-(SR7C*dZ({E=No0_@P~ocfabnx}djI z!p#f)xzQt760WMuO)MqZDFMBO;#@2(tBmy*S6Adz%6QO!=)-sH)A;L8iXt8o5gN`{_^91n zrCC>IFeU(wR+?XIof-1N zHtW1ShOC1%tIFkv%j>bWIT3j5^AYoC^Lp+<1Nz1mm(Pl{;uzNJ@M0H5TGbo9;Rs0D zrfV@?ac|kSP1k!Cd!`){JP~C(&kAYYm|yt2uyVSVp7Hy=V7C9rsh{!OgMEr!FkJS> zBt?p919RCZK~8WSl~1U)pil;}r~SI|(^u@aZ<22}Qv;%1JFGu9y#FKSug>n6gw=M0raXnmzD^}o?mU5;lHYQ^)2Cos+DY6#@J`?U6#e;bz=hh&B=DS z)YzG^14oqe?CTjF(#W*q6Zp2zsQmqio+$a<{A&GXm+*=HPx3qgXCGkDu9F+1q9`bx ztv}xG?=GNIF6K^qQut7_?n$<`NkVk1J(Uh1FA`B5IfIeq20K=fbZ4-YP}fdX43`LR zM53!U3)8m43jB&gzC4=sx>6EdPMJO`bf~Qevn``E(3II%$Tyd31RS%Q>DRfJKqS~C zaHCfD^Mw?~iW#`fo|JHyL~BE3;_vjAus*rZ2{Ak`Ghpf}4>Z4%xi+Sc_b(aeHutH~ zdJK0pvWzFHH+rc)9&t+nV_x`B!cF;EyCKTFR^EZEn(wLXeu(zTPTYOYQfp0d#W}d?Nj1c2=YBY`^rLmaqY_ z`?0{7B`uh-Fu>m0lpa)oSl-c7po!YQcV_Ba>DhHB&d)QPoYQK&;nez;(g@6G@?CaN zuYNk^stVcTT39!sTwK{vNk>Ati^YW#Z`I6BS*-zIuWr4@5$#&`j@HV&!8o_8_`}@< zl(=IBXJLf4lJaJrcY4MuN`e&)5T1KG`p-EW&J{=|{+ivTXB^mAfDoBU&MnkOGt}7W z=uH3)tCyV0tW(HfmRqNFZnor3uk#n#rpH=`MijTtk3?S=CPx=kyw1^WWK2~o+jGIA zCSv2A$*M^n5EogJ^qM?dip$R5`$g&EGg#o*zh%x(VcXTVhL zGQSLDKj%EoyvUp0N7=sL@H)*py$YEwQzI!(Q*kD4eVI-L!o?4`wQZWuabb^X0@)_nQJlvEa@X$DN_MWz2USiW zP8__!+|=rh-}{p0It~TdS97y0Ne1~x(^IXj>rU@J!Qc9bVoQQHnolI6PM^1?%CmcP z;XqMZP6K!4NqHM3hgwf?AkP&%bUKtN!lyFmm-r?epOzUTS2Yah<8bIx}5kNf`J^IvKe^X@9D`d>CN(M-rf6W+t|<)y$)VReHc7K@>c9YR$vM@ z#A#uN$?_j0iA*p+5T-Q|2|T2>^=+DJ229{tqZq9w2IekG5sZi-cjLqM zpIQEv0qw1cJc4(HU*1|rPh@=ow<#U4lP-K2o*I4$j{UF|Fl87a+N%V|AaIv-`miOj z<2j`l!8J0N6kB|v#Jzr#u#Qc5z{T?DnLbILSfv2x8$YzfQ0L|XdU=w4YMGk7uVY7K zVy3!Os*#%jk3ocwOzM5M=p}>LkA`A^<&%eG&o=x z9h=NbtQym`uQA%?(j!EmnR*RZ4*7-rHAV5D?uU)JyCcdwU$oj7Vhp|I3u1Ho9~n|E z#-Sgg!WS@jG~<>&lbW^=9JbgI1@R=?P1s$K9d06HbLPu=o?Q@2kB(@I`}=RYPO^4R zeK_BZRh;(EOKGY?zOOgrF!gAu`yc7!7pgnh)@;s}&xanR-YU9Faq?qVfO8EI^JG|^ zw4yO-96^gqMgiNgU2&Dq#p>gi_dF#CWBm@doSXz~EphTHPx6^a3D$>&I@bM9@k{A{ z+OG;U;wihJkToh(mK3oz9J+!jtnwY2`L{wEKC<} zl3Abl&#RLTBNmRzJxQuxdW6%(BEn2S?J#)Yblc)g!+1nTi8U56Qt6!C@|-inR(6kZ zKH0VQsrtX{rKI8oGh=#_T+Jq~gR4*h3VWycAv=oiQV;rl;!MGq&;q2S_jnJo7U{2g zCw?(Zm}(bg5O6F|#3bK)pVI|Ui3(js@2Ga>iQmOsjrM$S%q7et7izLD`T{5_b(N>n zR-qe~>BFziHo^EU$M1oC;DuGG2qEpq6F+$Qjejb-6MqlD$hbV$!89=g0aQ+aHDYl( zTZNJFUBC5%UNYh9Qd%nYfXLk*qwyle_EkOa_aB$pdm%~JvMZ+jOG5}@oFAd$B@rPo zyuqZvk9Ly!+5|ZT2q=FU?9QOCA9;Xf>L>0Rc_=(CT5$t`*+1kL1UCc=!@ zZ6hkEhKi_!x%wR9=ts1h@iM| zT0`z?@*vJXJopYuq01Und^jDexxu02PSVke%VOkNe6e{gvfaCyBa>%yULz@L_sWOF zvbjngh+J0mx?JA4OTlVu9XaxabviGR$prV>R?t+6Mx={`fFPKu$l7#DFg`i?DpS5z z8EdGY&DrqrATHjB6f&e$gsOl!Rowlk5pAa8 z&O_9!x z82=8#+a1{3&n_itEB1f-GYdZh$;vI|rWt%{$In0LJ|iIdd$C$|J>#|1sbYUmfdIMa zwQKa%e=w}4>nKd&?aRYV(fe(&HP{`;iuK_RO>!G+ACR^z6}Fy3M2$3MPWOBGaY(wX zhSU04SBACl+PWf?EzEDEeY3~GVJ5;^FRWegI+tqId~UmA$UkNECbNX4NZ0nzQ^Zwu z=vXQ-bPj*qqX#5PF*&nwmAI{0$BpN;WYFm8E-JxK-t!%VGTyClswUzjaoc&h-&v`m zA|K<$23asIN7_7w5r>IvAL`qn6c@s=RA8hYMYnNs6ut1+*AKz~!@&2rv}Qq#@qOaT zc?y@Ws)P%W8oHA?V^9LA5qTEFB64%kadmW-ZzL$=sll)vOYxYDHT5$=m&iLJP{LTd zdUFX2z2E>x6@(CVaSh%007-oK*t;&S`2!TEaa*tZn0-Tt6zloI5)~np*>WD}&90dc zO9i_M;XEz>_pw_9k*F~ED)z;-$i%l5gL|L0o;ob3`y~w1o)N(b`?hnY>)HM0ezYEk z7FaA?&V2h`??i1~JGk?c%D-pFyBs zh2{$$4e>B}R)G-(m5>Wesf4 zh6>ituA8hWIBU5n+t>W!Vrh5^J0q|bgKL+NBt$`(g@qQbrqCi$@OWuTXIMV9Ig{ma z8MiHgm-P(SZ-&x#;YOp*ezv_3)-2BGbj2R=N=15>8-FZsuDnT+bv`BghPL$r48g^CT+N*?2uIUT-_4e+d#}OQW6LZYHea ziCV734PU#7CcKOrN%C&0uzr@PT{1J1)D1Jsxyfe!qP=~3`aXn=v-lT*&I@a;((C!M-=BwhNKQv(AuK7zv!?jz0WBgB0Abgzn#rM! zgO*g6)mH{s9*<2NbK2ALEF@6*C6pGhzrwRp|huaFktt_-|&?nj2?`b;R?r1 zXKh?sbCG7?26B!8MSbgc*H&)Y;x`u3WL%e1DmU!?f;+ID#SZWz9b1A z?J~o;;Ukkv^%m$k%}gfBW$WB&Ca)tIq(inCpd%&aQ3h5|h)6vERFh17Nl_oiVB-88 z8+|NDstpnAKf>`vzHhdXuT4XHe9xs~KV?7JQ|4#~ffKXx(q-dfX=O|tW9`*>X2l_| zeDzTO$p;S-jsHY#pT!a<J0lSUiarL33S>7kugzf9E$v3#rvC6)J5&OuT0g33w&Ym-w z9w+Q;HL=P-DO468`znv3<7%~}fWJ$xx^Ci40{g#i8eK4lJxJUZQ|Yknl=#aEWv{xea92%V^~Dv2~JI7NsLq<8Z1 z{42xBT;ee~#wTXtd$WuF&AnVqFY%Ls)>j6OmL+oDO!JR^eoq*=XsiBxRPHV&UB{w?<7CPXH<2FUZjd7?C;LlJX_Ji=CB|4!UOJi~F)s z{E2_gSH8oViyY*ZU2DM2!zYAfh9nL$7zZ)O#FN3!cNe|!nGpwL(?h@hA)Wp3yCki@<;=#=^(8^?JpR$i0U^lG8nD3_UxjT*;rif?;~aCa|V zC^%kLZs#L8FeteKf@5AvcP*G>X>0lZh$OyXeOsh{x|C1*JiqC?w-E=go+9xbzY*EZ z0$qs{j*n9r0VQz6-++zpS+il#YpMx=Qc`iOnOs$92Fbf>kjH-!^0o`UaDl)_ii*2jBVoNRa^`7z6JoIII$tX z%C=ZjL%?j3-4CTCJe&n!bB3uC@aIwgT3HmizL}owPAB_U9##uXk1l=a4um>HM^5r^ zaW&uSm5~f#3W&mTZ9V0P5)OByPAj!NAqp58aiRz^Na%0)>E^XlIV7)Qs6n@gB}c-% zjZfus^4_4U)n(Sh1w7MLa_=FIEdb9^eOR$Eq1fDLn<;Lg$R(w?MoA@yp>W)mY@h!y zx5*Hyw-s=NL0{=z)E^T@z?tlpd04&UEcY}tV3zjO=xGunL~bhsXW z<&*c!R;G8g(1D?kD;!Kay=o<6#gEW;D1l+Y?un7zy!z+t-JQTd0GVY~{Km{g-f^Gd zzS7A7%9y^#azuPRcN8qH-)te!#Z%{_(X1kb`nwbBw$7Yjx z#`(S;uTYY9;1}K)2b7Lz&F!(iKrZU8dw2AbPG*ETBe|xGi{x+Z)pSZUn4NXHKTu z3kk5EpnDRt+!BT+wv|#Q?A=72?wcd^IDLjHzta}gx3kH-j^bh>?1jV?Y0E1(VfdQt zmB>GR`1k(pA%LVhDbrSD*MCOD`#%CIxiFF6^SQC}WD1zU%3-+(vRhXk|M2G=$lgf974z?xm!ZIo#G!;E`V{@QHf`17hG^QmgxT z{oUvk7k8TWSvL*+%?)0kPEa8;;^qF^PnBWp| zAcfqH4u98iXD9z8ObP6DAappL`lQK&#ijK94jI6u0u{BdsGIdi`Vu6K2Hc`ITIZx+ z8{GGKk#vugVG|x3NVu!QwP4j}C4^NRmRAQPDsM9zmf02n7FFl&EdUwQRxV%wK@d?R z>KP++k6j4hrTGM;<{2Z>vW!ZcP5vQc4EO7O@XRkaL0_(doj7b?cjpL4kh!&uxYbL3 zPhF$<)zrn>^@k$`vt>gQTvbERA=KCVHguri>781d)|~WB3=+4lvq&4tUqBE0iNC(} zen|2mC@V_(AO33f^R^`_1xrB90XQu)yKxok5;tARgH>hIM? zGS-}O!u6$(c_Ds#zsJ8gq7+RkC(w)%lgW!F@_EAvbTop)B8EWu*Qjb4wnES;Q%_lf zbVt%B3+ZcJgcjIF33e0gIC8A7NpI?Ue3aB?AafVGwZ6Jn)bw0O&5=GQSud$yO>|h{ zX~|j19U9NYi3V+cQ9uhe{>UY$b#jBv5uPFqEwIxYdqma))BCuIVhq6Q)u=nZg%Hl3 z6OWsCO(2drDaa;740H31-_nNm@eif}L+uBsU1~2?MJft37I5(#p9a|)} zT0(89*vvq&ds=G#IP6JlE&669CztgmV7NKqOoGo7?{^sx;zu_Z` zejyKF2?aVk^Z4;+{cf@|BPj%|xuCe*QcrjqbPy#pD*l3{HE?pmOg^6}JZYi&_8rxx zrdUr!=j^{Ucp_}=)-H)rWIdWqh%<5EOj>$Zay`$H{c?YUi>f2&(p#UeWzR{aIT1G>uKGcIf4%v6o{t9a&l@|d_lJ%D;q-}T^AffJ<-h7EjXgNGf) zW|R@$IK6R`E_syidGhxW&u6jseJs)VYu1N05icwyrWc6e_;C=GmNEdfMfRhkXa`ma{Ss#|D+LHa*h6#ka8^A6<$eEjz{Y7d< z-^7&D2wJvyuyRWu{{mG|C(WgCmzgmneqyM}4zTdK3Jlb}GU;>mroE)t~d7Qi76D<~F5h^W&!|xP%*3kw$?!htXFVoe$4ma%;SheXET1OnxgoJ5H^w zzk^(v`uafx;0ZClwEM zW`~NH2YjC{_I;$?*8|7w{eCoP)Bp~Q=cmmLO8`s-ptm?j! z@i~xb)hilJ@*KwRrAqKBS{YhcM`DU(-y2h=H9TjSxBbla{FQEG(&>$~Q)+7Tm1=*H z^8pu2I!@yxNpG*xCQ1vgERy{JdYSwmcF4uJsma-J;;(KI0p&I7-avDPfKf&o7sH~+ zL~Q#_z|>@}k!z*{t5BgK^)Gd3=N_z5*Yw3enibh8S2K?D`XcxK3FOhAGE@eH0dht( z%erk;FuYE7QGF3N!`eHUM(`{g^r{sxL)-K5c25?@1wB0lAT{?s$`5#EHQS9J?Nz4g z?+^ez3$DU-F-F`!Q$mNx721EDpD?qKxw*f3cbzlso!##3q4Dq5yK970&zk2Ien3}C zhKIY4w-Iqp=e$R~{norxRTuOl2*ZkJR!=_<*u|4aAi^i=-L~VtGk9&w-Q|fFifk!i z*xwN`jC1piOI}{KE*UABF71mx2XacHSDyAk#1B<-DguCg@mu4Pl@uIu=9+I{&@IxE z0ASkSRs1lVeGke#FMYcCRl03eaQ;%$&j=(NUOastM}dQ2K&Fs3xP^_T6xlL{&m>x&9QiT>n@R|q`;hV|a` zb#)CGfz8?Gb>^mBbLL}V6Ga71r03m0dw2+K5(Py|3>h<$=>aK`v?oY)ntimAjJ^}} z?Q&P&`bab$_bCsM?c#t;j`6efdLCnOwE`so>o_F!KFZMHe3W359JjGqO(*^(U(T0m zSbfy@0m%JlV^5V?zWx0Xy#AvneDwso<6mkfHTd->y~^bhs#sTvmsyK6-mdF~Od+2o znmzF4k;;F8NZ1JoJTZ%EB(H^rb9UPVpTh&Jcl9b*dn5M>R7fX4?uhG};Ic@XDX}5? z#re!1F&W}x8Ln^k(jZOhtwCrnS=AF`{YDutpUL z44{il-bcV#rFwrw2+GmOVq3o_qVkYFpC4-l=f*wT_j(e(Fca63FnfU${pV*fq%6xSP>QplJ-?NoGjY$u>LnlJQ;?SI{}k`6Bi;wUN=5P}K8h&{%UG)IvTa zbf)OIEJ1jLNnU+fUV^Z5l{?eqo+tK57&9Uo5Ux*1KV8mcA zv8_=bUlYNAWDfFoUBY{Akt}T=S^f?^=2eC(?iI8i2nT2=n{!Rd% z*$GP&yb^v;IHe&eru7?DU4kEgd>@O2L@Fr<2_r@Z24F?V)a z5^lB_$_m4QeF}V{EP-tyj-oeJdVq!;l@uRnEnTgp;-wljt~r->(7a41yJFIZpeEmx zdI=p-m+jc76|in>OCf)qK=q_^OJfF9@5&&4bNms_B9ZtC?REG!P)~|@f20WZ;8d=xBdnhOfCX66aO?juZj`imixxE1Xa^rZPAH@9w*bCp(?{Em4 zWSUin2A-8L0QlUOv2VDPxdDWjd0ldHVc4T+!Xm;KA7TS^bFU_qc~wW{o|rrSEuIM1 z2E4*HLJCWF>Z~|DBY#H^57X8qQ(XNox0pq{toPEVKXc>KS_~XdtVVw9q>Df6Y;_QL4!g2I}dfSqhU? z?`_^q6Ea0*L3fp!0w(!Sj+?JbMTxr|7~mjKEK?OV<`m?oTjm>qjRU)u<<` zTf`WpBYvVo{5r08lA1DW;5b8*!XI|Yi4tJ@Lg}~wHY3h=6{SII$QI(j<)i%@=g|ZH z*VcncNn294Pg?;)bW_!DSlpBZw?MX@1E}QBsVDhR%^ckfe zKpRN94V<#7ZGN)2Pv6VM(y=`C`E5;}Yo@}-Z%47Zo7*>z!l?zI6ZQ^HK-P3MF}0o$ z0j}m`qq=Q0o=?Q;u%=crBjR;^pu3H1)4Hh!`iJQOv7SYs?MT!uU5>CFy5fQISNL6e z_~w7$j|vJJEdQ(1{AS+A9`{k0sl)+j=o0%#@S^_4=c1j*kNKWd@zh1&ia=*Qs<+Jj zA9|{HzXzkm^{wb1TY#5?rKVIa$u-v~H5e*HS-;-{qA>D*I8fUkoET0BG|bbln*9u$ z#JmLC#k|wUQRdZZgNku&ijU#Zs`UbBnlhC8qYH#R<9{`THFE(pcCg+qr1DBLl|SUicj+q0;Gydy%p0b?F7<>pOi- zksX8R*~x1WHlG~T4$fO6jO=03t!y?@LZ`o+xXYyqoq~uw-N;;=-u{vgdf`FHjKDZ3 zq;f6gG2nl11M-;?37$Kv!hrTN^qv>S1h8kty$wBopM-Qpj4f|4NvFdl#=gXYcECv8K%KK(;wlLHo9(?vzETf|%;EC_%<{{^3%7JE1u$f@rPF1?@s zt&zwf90_@DdU~VqciQ;%1+SUWLyH~t39LxRCXihI$(uC#<6kL_$pG*3AzL+$UiGCg z?;T-2hm78Z>PhpdA0zBE@_#$b5x||Eq0`Wc3TI6T25uI)u&Lt>uftpS$jxxMZ z!cjs^?pe%K%#s%)wB5oB7LCcJWrD;4h!IfS3F^owwOaWY7mqj`QLlGLe7e_SL5=b2 z-HiPo!J4kD<7F5TfU2j$*1U6BI55S0qDi~&NyflTc6u$MU-hSEy-5$UzZ|atzF;U7 z7D_Y4P~j&u7a7Eq;KParbPsl*a7Mli5VO{#1v_F9bF= z0cS(Dy$Lp=kRuG~ZQfCZMBH#EK~SEr^vP{Ved=-&Ixd6?^rr&V+Z_%gB3FQQ+z6Se zM+R7+yEi@i&R`d7A>bJ?u${hb2i%6*pj>b2FXsd^)_>&NX^D%Elu3(b!4h>7iwBG? zRO`AdwJp6n>J5>wfXHp&k(p|e%DRH^+W!d1F0jEOOJ)7%X$)(e1pZJkt2#D4mPQK6 zk(P5|L4pnad<`ubX1lbUFCsV?85BC*yqbPzY%~A9i{Yuxy5QRN;M^wIr-CV)#KtG} zP8e|~x$NhYN(QTKY*3B;tNcZ`m>ZDMzo1t<@(?ZbRrGczN%dcY?Coi7BeQopZFs^i z9=s!jg|Ge7g}@#P^YeR>w&|G2ltT|@ic2jP%Fz^Tpn`e0i6u15^6%ZF^axD}puda? zxSCRF@k$`&Ws<3<;L2k%)9MDG*YkZ4OJ&JF>cLX@gc}}4#q#~`TGoVz8&>}rF5y?Y zX${JoP7jPm1_|+vZ%1MLP z0(}`aDoUQb+-{7$ZM~&SV_fKn(A7hEEy`#jcY=S^+mxgFkErW5IcH$oy_K*xUQGO( z&vcI(F~JILO6W?-wId9)Sb`)zzzbIlWJ45{eVo&}YFH&0hHh3}ly`qJ3=_t|maQw1 zI!|8`O?<;^lBmo3>EG%JFDEK+wTI-~mdeSye1oJx=#IxlI@wS;T00^=wx3w{1A)F_ zdD(m41gZ4d$DSP8ffd<97=|m~toOq0i_Cx2Z?Bv;iFymsIh@1|oRw$IGSV0m)vHrV zo}kb7^`8~kb|BFn8fRrQsIQCt9dueb-A9=R<64uE1Z{&oVYUmM;1G0(XpM2fFp+YH zePi+2m7e@Z5!Q6hhZo8J5V#^Sby%iEmrYeKJT&Qa$bTYw=?Rm&({WEY4;#@;`*AV9 zFc>>W*-G8l!GM$5WKA#Z@{aKMh3o|8hHfcL42l9n^;d|v+*`ev??Rc8Jau%#t1`{F zBGXCa2r-RBrk-!*%3{un?3x~3tDi^G%}P=N8jO#-t=DgElAv)T@D!B&ri}QyFk``h z^d=tTj^MI0R~Y!2FtYVu{q3cYhFE-)mCRmkNcZ_xcvOy`6XUj5(e4^!=uF#5RvK&j@F$tz}DY>V2fXzrdn zP2ot5JMoC=>=#+&_~--$I%d^;FIt*DJxBjv(IDDU1-$BDpywMNE1}rBut&Q}OJQKc zR6vQzwN@&Zx=}&*tckfKLEv5damT%_iX5jf=bT1V6!CPPay55fk2b8-=~P0==t0Q= zAC&{AB{=$}&yJ@cQg0(=?(;YE+l}nONh4?e2kepojD;n`tDa68bu>+#!;-pA5cq0D z1LS^EH2Mj3rN5Y+DrpC^hL~bsn{xL)owjpZ>ft@Aj1m5=ui2dErK$y&V#1S4X)Psp zdXC+CInd$hygcV61oy`)<>=q0k1IB-_k3LKAn>Ath6|nC^Lm-TqM*K!&GG%XylD2w z_!rn!sphF+9z!v9hCxg7^XzY4_37G52X8;Sa-szC43vOv%; zpLvCEbdrx+E!~|{pLbf0DIhZizTZzYm^_W6l7FZX)7~l(;yoH^B+hOb&S4%+a9yUP zF7Hfs5HOkZJ%K!_m!6kW+G#xE1#IK17iE*!vrt~^@h_S37n4cAlYvgzvRJg(%Awoh zdX5+!sNLsP+@k>99p!&yo)h6Usx(=xzdofKCkWE( z+?~)a(N!zEJ1@HC5OGEIuh|`0sY`+YBaW;x$a66uW~h~d7P9ZAZoq|UDxT16(wn{X zR0x&R(r|{qE-Nbr+kOBB1Em?@fHiUij*gOhOexzuaXvrIG7lxxODq|a>pcR!;hW|R zH1zL}>KG;oI^}XXU?9IM%r|=d+&$Q%%v)*|Zb9Sk68h3eH`+M!rx}&J1cJ^gJpCI~ zE3-Gk!JEfcEr#hS8O2P_`iRp&PIp6tZ@b;6pdK)coQwh!S>e6YZxG7B$$*3FJHJ{g zVuyPg_v@=0R2Pv8u6}cR0e_D$>MazCohl6gYwKHQh@2IVqF2j3{0d09o65zLL@SS8 z%Lc536qbqY*Zc|3*%AVl?|ED`BH4-xs|l7-{)fs%bgzH6U)O#(;YfFXPW9*c2Ja2( zA3fZb?mWh{459n{w8czbI*ptD+_H=6OVJw-u$5Ni79gSC4bgMqMMm*mO+v+*$L?*H z^I*i<3^T1ucP`J=(I$IYgtPY%3jka(lNn=jTO2Z^f!IpQc%j1lp0?us<=7263^R zv5XcF`|lU#(e=~D6R|PfRUq&NE){;hxS-iSRj^yso?fO%8mnNfdw8%PTE}Q2${TYc z2wjQO7Sx!od?R?$h5FuqcaMeYhpckTcCL}>;>7+tkBk`^o5=Pxg@C9VVqfLQK!0`| zOXY4Jpf?#UR{yx+_(9B=f(zQdQZhOw_XCHL0WxZMH6X5w{=AZe>t3w3B-lUCA){Jx ztbx)~T{i&-Y$xcxkORULa3ZkZCV&T1$UXV|P8dt7H!^@eR`-+UDLFwjI&S6O`U84N zz6xa#WAK51z+kl`gtVMe0UiphwxM_>Y9;U{2+RUnpU+n$&uL9RAX+FnE#nr)3PmP* zNDIY+)=hYfj5kahZILdc$z6}^mcuAP_@zR{DI;rj0tPNHphK97rhB6r0o(c|e|X!- z`d&Mp^ea2o5Rc9QY@1JOW6bSLVq(e^91~3(epYri*|(3^*y&kNBje>gWq{b@ZxbBl zT{H{7cur*BrMh(_O&sm(9?HzQmBD$M>6&EsiT3qN%^c*ywX~11>zWxH);X%;QV&P< zV``oH;mf_oZm(n~=1ZMsj(&B49sVN_{>8DHBTtLuNC#B^oi_lG7Cmlu&91QJ}ttlC0A zR0p3FnkyUa27@gx$MUS~EG!06=DU|lP9;%_Xe5NAmXRasg|++#_~w_57ztLFsg;w; zv80x(8Kk@fRK?IZaPB!|F&c7t*Kaoo(;8}=dN8i?N$(Sj@tSahXDGI=a?hq#c)$&m zyp{?ohQh>#v$n$rs^Ff4ef<9s?%@U`#@@~7RBUy!b}bVEeE#>D1Y76|QyXqzra-eP zo0YtLXE$nAL0fW-s+%Q1KYo&3>XpQxA%P@Kpmu+W`0E`~WK!=4Oj<)3zfpU!>M&y` z=KfX6_xfGDI67{o{j5wyI0F&y(Ts0AJuSB|duaFDO5yFd&1g_6nXN^E|7B*U%|?p|t*RWlqD^eyp)RxkMI@1(;-`4>nhcscHEkuh2xMI=j%I>Jc@=*+2x`k`&? znL&llw%mK4xn3;%@dJe$=p`yfk@5fHj^wH)Kd-cM$cjWo9d(4sz zw0H%reEB?I;6brx!Y+%3oA-~8CNLWHA_K&Y$r|P$3+VRmg=qUj+C&WtS!~f<(d09D z*fRODeeU63pL`DPb|1uvb==HZJ|UJqOcF)eeA`s=`DgB3RZIu!1a%uyw=u3S$M-C6 za4F1F2$Sr_8n^*jM!aqq{T}hb4WxB>Dr@}h-&7FzdXdO*>-_0j4A-FNuNw-kjKeF& zase>8>##Iw!9SJ%0m*W-&38iq;-sXmtSd88K z1_=Y}zS%}s_m!mZFiUcX$tQ$M^C^vWf2jQHOq| z$A@fT0jFXFb=ppTdvqUnFURZ@M6E0O$sBTTkG@|`CmKBk(X*=Rqs8Oph6RJ2_3uk$ zOR&*n<<&(rQicA0^tRWU2SNF*)%9p^ochhoehNktoYPlOgs=IvHY|PseYveSS4puRJc3kO#lX#VJr7JHEPajfIIxyvWQY-yv;cZpZ zGE`^FuS7tsg*#j?{?Xp!q$>k7e}2qx59=Z87T+t=z~6LL^~&awE-`;&71B_o3g!C+lpoSXBXroxp$!alO{b_up$vvd)B??v5}u zT&!KN;jeV273Fj7m-ZsX-@!tX?`AS+Z4|xQ-t9oYg6N><1vew0P6-qH|s42DjCdT>in29nz^>} zt}+MG&41^dW~6gnJdPWotB};e^sam}PvN)c4`gbTtjKPmAH5t8^^`%JNrNs|OPE^z z#kIax*=h@w{U3pz97&xZw_!4&epuy|p99Xw$H{yy>xQok)p3E@D+C7&40(8G-W0IeijMEj+ap-@ilB6d%AS=kdF{`2uu} z(6^i5dYL|a=ysN>!ZVL2_7TfOJ*l3MOpgvwMAj(ESaj{k-grN7e0XDG|KF^pXq?($ zZ|rloV#r!jM&3x%fBmg1Tgb|lkDJ1&Y{e_eC8w8>TD(GmSvozFv4eV;zhF|lm6UDx z?Q6Z1w);Sy-J`uGY26R3qqiw;l@wJa)enyWf$Fz>lfA!;n@ z02@S#et5I=;TS6BZCLySwpvwK-_T;Vd@}dJIGPaY^xCESoAo5)s(pFEWRl_dvoi-s z1Y5!)?>eQRr!3{mEx;|jp71Q;QIzch#GV+uW_`UpQ)AP3C@HvNa((-?DU@z|A>T}k zvy1yaRHyIM61Vv`aO&q9Y31{o7ubfqP|w5WG=_PF(4*^Jw;fsj>)sce5rjl>#>@NP z;Dvy0!ZJc}M_S>mvP&&%sHYYEo;dGl*q?I;q@iW{x779D))MM=;2CZ};6PB3^ZGWq zZ<+L`E)il42n;%=_}0QkgjM);s&G7Rywd6T=Dj6l;ktaRz^i7)l z1FR;T3=Lma#dJ};KR{08+}3k02xXg5F%TzABIdI_T=A&yA~YHUSOrVfWhnm{}RX$^*&b4bCz=*R|PsLzu%%;pWIdk zPe@4FkNpdbUmC?2R^z+QJs3@+$iwW3J)ppQU#e?Q*cOjz%JWIELP@>AC+H(e^A3Ns z5n^w*eddpzyMl*MVG^jM8>+LCm`>-{iIlp4vC@3#Nq)U2(XTjiHwe}H|4jXjuSgD{p597 zF)7T07;qh4#>H)pmv*{KR_pm_v8pad&LqlYmsXT_H`(&NgLaOL{+nvbo?lkq5x1z^ z`y=@PaXFJEK6NI+*pe#$>C&|sLcS^Udy@_>Q0b#c^ngJ61VaWqI^T-+ElHPaX76?^ z^nt+S$ivLUxwy2P^H{_vwV|^540{W8N)*rJdv+6OFP8Kgc^f#{!Z}Yw7^@+gSe*L& zImCW}9)~zBPVQr&Q57VJ9~cF+ZaY-6F?_$w*A_EH9l8WLArE7_5^$HayLJ){iOlHZ zd}O?W+wTI>SB3ZR2@?soPZN!%IT-2Z<+->B!YH9|z-$0*7*PGhW%rVs{>&6$@wW#Z z0sJ~gXsQ_gPkB?Ftu5s-tBh*%LOV8;M0d%9 zfof(p_V>rllkz!>gdfhH!rj-+aC~FESJA-tceoar+<@~+i>!|Y^9lor;yE+SPCMhi z8y}Ou3w?rkmVWmpBDM!@1p?~B$vKEnFDkk_3>l7*4!xRu7lo9dMyBGVp_`3>t>9hq zLAO0ytRkzq-(hrT&)2@zpJR4{B7NXn0K`y|s#vJ6olA`>0hmKM0p)|$4gRkGBj9_k z9vqtLIR2eXduO)`!Cww zESJC$0;JK2DiG(YCd|pKm>-(ut>Ytr&=z{;SHxkJFj~i0(xVD;A~-Ec5z$SciJ#Jj ziAkPxFq9-dJFB>_!c!S{CAr4aCA1}rEt%t2OVVb?)Jzs}k=Z*Gb4rNqgG?O;ca;rRKr49oQMB3xrm1m|X z!YLt>pE*BvT0rkZ-*Nrk>*0{2rHk7)@S6wQi;bfJ|L&>fn_8@w^u;{V-5I*f^gRz6 zi%VGyd72*NP^jH7ouQ#0^ziZyXjgyb$SzCZ(E%AJWEt;FcvW)4y}>iaS2fALZW8+M zH~z&Gi;Ms#-vNxSoyajWN(Kid4}D)#bnL=9AgWO~oD)n$rKQJM;W8YM4sBbtmn)uE z>#zvT*)<>tzv0aTBKK}iJI}WDOw?N&H-@zpE?9G>8)8B>$^YEntJO7@$E`sN>yroq zsEs&oHz);GEMxHrz*n)wy}~h1*3pirQZTgZYU+D&Kh$w)Fv3-GTH~y`w?B3|f zebG>Lgr_rUx@ITR1CEccYxara5?%o1 ztVg}}Le8_La!PHu&Xvq~A79&gdUQOTi!_AnRwMTY%<4%L8k!88PLWIgTfhnFdMhv1GQ;PfAyMIaOwqC0Br5 z+Wm!&h2f8V<0Z+=O}~t{a$`lQ6OFA0$iBkC#e^H#Y(qw8%Cf)HElTyZ3$!!I4}_-k z7SyuJndwi3%=>M(zLq98|7slQywcwt{G7H)M~&ee-Hfi+me=mm`SG6ay{4x`;})O% z5@|n(i0U^pZw>~f81vpF+Nub1&8XI32JLit3+2mEE>x#WcPKin0rjhzMs15=OA3EddWtD#= zKmKeV9`O1SQ<>iam(gE4@^h_BYPR7pd@O*)xx(R_tw8s`56Q?5VqirjI{;Lhx}v)` z`3s9S=U}gmwx??f$onsSzTn+gPp__m1A_U6&az?qTsuneymQOL+tF>^>{GkG>_Au| zoyV-qB4ADq)Ly7XcgqW1AWkcN726%w3^Ep z{i`;Li+})$t02kq<_&R+O!(b6o~k&$diRB(p-n=pH1Ai?8^gFKFW@0^r)6rQPwP1| zXFm`jxE0_)UZt*|J^QF)P3({K9V)=hRsNH>*X+kT`!-uM6}a1x0q zr$P;J&$Od(EPdZx@Z~0;gtolY?VnNlJoMQ9`}+ec@ow>#1XqX~X&xe_2DSDeus4DI z3~Ew*<^f#DpU4syWGzj)zdfCs_;0{(Az6P1+JO%ry$#ammrmryOr`M8Rd$@vX8)Ug z*tk7Hzq@OA^7TW)SIxV=+~$F2BlL732fz2z-mE{%vlG5cWQ}HN_4(rJVj~|zs5z_% zSq}eu#%iixw~<#u6VrPfZ&LB|z%(vvQOvOmd6IWPPe2|EV!o_&TiW_cpB)_~t$P&b zUb2~qkr28@<+HYmjDQM!C%%uNk7snFH5vp~iE8IOer~vCEW^pPafgacBG!&Qk(2ZHu5k}{$Hd)?(jz#B*z zbLmB=GaN_1M#q{n@n>73I>BVf^v>MBjx&llZRf~`O7c9FQKbf=*2fjviOk*`*a;7^+tR8Uy!=1h4d7rP=M3n>wZ4}>WYg3$jeofkDifOW zR@~NRsiH~nUlAwho7T*?fC>a{I6;Qr#TFtS2A+8gNt&!PcStp)ck7T92mr`iU3RH& z^eB>cXNvxgw^qwp6{GWYO^OLjPJDb!PT@P7m`Z1Np_ zrsI1uWtWWc%>YYJ8Jg>z4`CorX~U~~lqQc}r1$&LQY-MiXk^LvDvA%(RaOW9 z?2g6^+OZ^}mVx9EV;9g^SQKL7v2ZO5?(@9n%Ok@ ze4WIlbJL{mtKi~4u|Pdwlec9A6q{M8F$$Z$$a*sl>E}#}LcfY+o!xAxe;MY-&|KEU z`-zKdXStu5G$?+oS+ZbYU5A<5?5)aRoTBWr@+fp>0R1NN;X}9TiT0^uRs2#K2b30X zg6^R{9kFboh;H3O^Ws8kJ=P;a@YpWop5`QNrjE{_!Cp5Rw=v2FV3_~}P1g*v?<7q$bg2f^^sEUT@L z#PuBsuAvA>JQh0%9>p1SBamt7O$NqcXBtUy-GG{NS_+aqmuHh-F2~X@H5)$0txJ9$ zAIfJ9bBdq>96$qNHms_$m@KV)_pg4+1PLX45%MIayaTN5Y;vW)e{*G%f`% zG}U{ZoL?1w!qF7hZth6WE`F=w98{3OA#~VB8WC>1$@>SGBG)gO!-W5wimz@<2zs9+?$jL8R!OzkTm3z$VqFB-DS$7 z2}2d$`OGh`myEiv>^##?kE~o#RKgFm`R9w0G~#(}ZL}ZXT8%l{oy`_vnSbT&QuO3! zA^_Jw*`3bo{}YIBf>Zj;p&pf}xhjKc)x}|Zwlk$dNZr3#6~am|RyFO0dOmTyJLfe& zmc=N8=AwduG-3O~JbCsEz`$x=)t99W&|dguB;ZVT5}`$@&iTV2w;XGx7K-@#(;)qS zc-pewV6Ouc+(Oq=o2yM|di-uJNE~?Eje1E}T6mJAs8UoAgDdkj-?x3kH_T0hOnE=K zUYpKdY+8zY%+xm>o}er*Mo?%JJKbsQhW2}>r??kyeX5(f!3<@(_?Er?P(6LI9vxCw zVe^abIy3X&diX<3VOqo^99`xU$~!q=XPh4PGz9sNX{KBzY+x^j=sZPY%Er^+UdERF zp5UJL0}mhX;KHjT$Vv0Kg;)GW=O1xa=+f&S#5myH_xE%AB1$LuL$Y=_q?o*J!R#L{ zl0EUfH_gessGVZwDi+LhIIHet5d_UrQZ|IgcAa93Ql~fP>#v}^2)W0@5~y>x57ovQ)bX5?Pmwiixh`4 zWL|6PRlZN4PG0Hs2C^qkTL2fSC{gL69jrqCq1RFn8E{t7V?h7PM*sVl8M4EqZU%1k z#SPoL<#w^t>+l%+2}Ku)Y2CSuMmk!q*8@|?1(>-|^gPZ3d1y%IDd+p7w%sg4958WR ziW+vQ4fho@AI0^~=1MDh^D~q^$pdx%E31$RhSP9i`gH@ZQ7a(@Paz}$4A%K|W7(%N zTkQwk<30GM4_eCZlNu&F_gZg7LyeaNru9Rng~8xA?p}E{M?C0Tu*?(ZogrybhtpZp zQo|)AO2kQX{r@U6^D7*JK{IA&?lf-q)M*gN29zu%L{ME9oP>Fuqgvz1|irTy3l#m z@U!L+DjE&k9fkN$sDLaaAIGcDpgY_isT4tN5kB^={?tlv-kJdd5MOP_NpnyGm>YzPrN6a-by0$maJ>J=ZUN$=Wv1{#)da} zOCPGKo{0kd!)@TWq{)Jnsi1G8Cb~vfd0$=lCP~&V&dzBI-FVy**AYJJ5F>j|EV-xp zfw#ug5<^*ED-lm*?1p)Mk)RGvy)MdpulXmIwuzww?J?9)@sXLg+6J(>yE}bG8-G-SSGw*{ z$ouh^95+iP@T3?ZtGd=}wNL5eZXiLIrsrQG9Yhh<`L$3aZXM<=En94Uw$>X`KH>F` z)N!H7c`Z!_*^V0(pArM~T&sZVcN~PAcv#?t)HK&`A%4~ryg4pf>?(wVb_*1S?Mg5w>k@*3BS2p!uPKaTBBiuZ>E<{U$b74O1a`I% zkbYJ{`GSlJaz@kAbbovs137(ZiX)zJaR}px4-A|;%A1KG#52D|+nSq5nvXg`&%AQv z77Nq^g!|}A6a8~OB;&)f%9Q(`edDqPFlRtB1jYn(`cC3MMR{#&C%>H%2>tRv;RU9u zP|-AR#?!B6JjiRH}JtZ=A)1NA~?p>eFafmB5P~&cHf|q^a17w9pn;nbM{VE?=R5SOL=@EH3Go@SU5! zl2jG%qz8gLZ}au{D1NAJz&qisd{JyPkhtwN(nHEZ7S=p|TA_R?6??EnX_%D6gNdW?v&P{u{s6laM(6L$REo+-%d zhOwPDL1vpyYj}7xFID%HcDaU2Ox4$mPBDfV$8Xagz|)1gq_n2>LkdK-1fk+%TzB2i zMLGHDH`nmQa?X1 zPcy6`)jbndA$)a>40Ii*9&~!q!zmREYvA`EbGqJBeAL&h6>%4qk79j~UE}OO2&Wt> z;yDN^&wM&rdS$y4Fe}PK?oqdY4C_J>$T@G+XO~ zg(W0D%ko_9R=T`KjbVmVqt?&`;fZJHzls&XDYa%65 z2aejW3@c+Rn?AfGD00qD)?C*w82BZMi%^aOWI8KJm98vTwt$|ck{xRk0x~^~LwZYy zlP*PG(JBe&=u$NX&{P`m#twTv4#{!&9Utjn6wuFEMAb|8_d8WIhr&*{s#6jhL=`Ca zd?}}duQDp(b62UmgCSNJDQc;v*c_73CDTm_NU`Ih__Y6HGIq7-rw@EjRbM$ol{O+^2L2pV!D87(hL@isc}Dc5rw$?_mSRx7`a3P4LuF zVyh_PR3t?_F`g1HRr!r#@mZs)HYBzm(IlvxISR=CjOG+jtvE+i%M%EvC? zD+c)}_vCS?lGi_dzQSBNzl3$@)1A(r;axZJDyT+o1}>NPaKYs@>;`w2$7LvG*}bW!Kq?JvOSfiGsagfOM-+_9 zCaUw#%tEWpu@t#{ABe?nq_C4uiKEwD3dmr}T4;9I{jGHiJ5iGahV_Cc<3S^(6ls2_ z<($*78{TO@1davQPUs8XKRh96+d@{EizXA}5j+ z1JI|NrG%M7qRE2`aux{BAm0~r22x&i!jZ9fhr6(!Eu|y5Lm+&p<&pTUOCAEz#E;Mx zuCH@kbX*P#sR>hrES+`diGTTtW`D6>7j)lwU$${%ohY+h@?s5}wB6??dU1?9-+Gl3 zKJ$_6bqI=MVaPNQ%bbJjBs#B@rL1xug++yJsJF^RkQD2D@v@46dHf@ z;ll}SX)wxS_cyd}hW3_%%8-&+CQN)t3Z5t@?_r8r=9W#a*Gd7SJ+2dw@}8RSsE#uA zT-r-7FDY37Cgw{(zb$X$Xf+4p!ti~p*AOflJh?s!E&G@_*cP<@IDlmlRqo#9KEn@) zM!;1&nOz-18~5ovhP;-e@4+RbD_yCQEsQpJ|1j`v19MuN$g`5wUxttMYkjO7Y@Tem^3Y_vvPQcQU&J;Nh6%nIG-wifAy!Radv=t&h^4 zmr6dLtQ{i;NIAe}(*56FVP#THG&WLzgbzFe4;QoiPxvt7&ilpOdD-4yGoMN#Zg)G(fv>22w1Ix&JSl>ytGsxhF*4@i2%O;;jzdV zCJPMi_DL*0k3$IKC2G8ErIOyQ7m(wd@yPOONWEmz`F&oICMX9;9a4e62m{b>$!3f6 zm!B%m3fDlVejkWKqcc6SLhpKvm9!$&XX#m@Ah;*T9e!|MZ*o&&%!ETs{r`Fc>hp0E47LG(`hszlbyxBIJO?vRiw0aHMsro55Pu+dQuCP4rA6UdrviJ6h zKGn{ANNxlgH^xhlgRrti_b*t@F{aUp*1lIHv?XFNKxmyT7ASR!Hq~Vv-QaLta7{DiwmddUt|TEU3SQ?T^6Wb8Cs$mr9>CIS z`5R}9vYv^{K304-qOxKdhEp@1mkYg5EMedeK#h9&J5A!xM_Ry#kN z-YdB4$$Q&GImJV~hN-$5RVpDLqs29VY$6BG*E17XG6nOCrJl{YeD{l}b6X~oJUv{3 z52g2iM~sd**M_ZuY^2UHC#VFf!9#WuK7FBOKiRvmwDd{E=UhVP+jrqy)02nEi*`=B zYt#r3+#S$CX{l6TEUfUiAx4z--2+c$b_AAv7e}Vd^Cv*eA-94i(zoUXA0$)Z^b;)X z$lrHC+lTJGTqJ9ZLWTn~(vO6G{2M59_B%gRcX$rj)l5MX6{ywcOLO+_mu+*HLe!m< zoZm7u*W~{E$m&O5hVsnWr?)>d|DeQ5y-cQlujWvqbIOFyxpPWh&^N)bB0rSTeVwXi zEVwAU4EktHo{NNRYP{_K)vu9rMsRyxy4g`TmB(+4*GyO!gujeKk!FivsmDdDd@fHP z{CdYE2-bf-{s9s|D*Fvi&7+WQ|7HT+cQ>2>4aY-e|$Aq#uS)k0C($Xqv~$7?3STgl$Qm zMqcalB+7mxVP~L_P2+i76B^$KQzynDI-q$44Wdv~uDv1qTffM!tW@f_wfk5j|dG@|Y~CFrZ2itPDaRugc>6Evbkt^Y<>vDZu+@ zA}!Ppq<1AX<5Ewj%1%OO(`Q{v?)4Uq6|o;XAzFQV&KN|ryo`)q*(itHc}ef+^yRMB z&{&moqe9d_EOfH>3W$+uAX@8*_X*IEe^XfM3ON`4u94C1S3tpU=v(^5=7<*XwvKz* zq+)m~6CJZ&(?YqF%Q(|c=^V8)HS%FdoVI}N!e}rqXXzsKQnA;)mcvKtNoLpFp1z~P zB4rlX!wa|Iinsk`OhVJuKi)Ppcv|t-s)D7M`s-$?C1~>F@(uzWZK#9wQ~935jbpEu zhSCy!_M98qV@#Z?fBhc8^ZyTB`3vR^0WYD)DV8a^OiXH@XK9{Y9sPl=NKICbQWGV-ZRubP!eaT)1jlk!Ua_S z(aYCVmY+l^e(Yni}edAd4~bJHnHT092NJ&HWS52CcXm<>FJ=>y(HpBnE zzR7HL#(oI!a{xUP(I0SG>8h$O0o}s1C88UM*@2*xxnqNyC za@jx+mmKgwCe2p0H&Ia_ibAOCfO|MKh>rf*iIcIzw}p=m?EgwT7mOWlkC`rKykDbM z4WASoV--MHV}^qkO||19>tg5$tDEDF4|6W)(TUkelTb1JFgc#*llzvWt)gfqkM zAeo6&9bANA{7yGFn)2^%A~%r~fn`JUQq$d^oNdABw2f8f4bPBgkw1)|wCOPS?mRRk zV2LjQyUs)ekrF4fk;lVXk(?yV2+m|>;{WFLMWg{`FJZvKG0u#f2h+bqpGWmqD$qfc z;{dNJqG-G&j&Zt>l%SVrQo$fy`PZjmdOX!q5qMo*2#CH_f_l-02v!!Ss}2zl(?~&c#$Y9etgLD1NJF|Is_h%gE!TCc|_V zLXLI?(-yo4K$qsS@&;6!^b`+LBuphiVUTj>Mp7HRIjWox`aUFAn zOGKwKD}>_y#tYco@xS55XhCy}n)MjzRvebeHmzRCWKQ2tN91AUj@7S`$}I| zGw}Nlw6FV6cufCtsL&m`&7ciK^~-yQUATuQ=l8~_q}#GkrGJ~*+!Q#2Xuf8H>(9oU z8{rS*Q}ihCxnxaR=f|U<$fT?A>)p|qR)@_&_KCl(2@k7yZS}}TDLl7s@8xT*eGhfG zT*Z@?zSO5u@<#6CcBm9>f)}9ZeK=0=q+ll%JpBNl1w1fny}Hy#rl>rqaj<7Ce%2+D z7B4zI48@3;b5s)0zh=YNP%tNwX&7FVFHsq}q@uWy<8e0mVlup?_9PZ2#V~?KP~ck5 z_*YXZ$%a3U-O^HkJanU$K`^@0!~4KWV{Gr&CV=3OF7>6R4IHIV>?G^l^@TiHX}s&+ z7jnbrI8-KVGkrYA_HvxmgO!dyD1~-2k$Ot_s+bF%!+?(F--x!J{z?Ho*azYaqrpw85DnB zEiMhlC4+AyJ6ak-q5{Vtkuc6zO(%no#sEdK#(5zFN5xPZ`pw4WaqGpEVXFIc6?p_M zEqY44?5|Sf{V&IPR}4Y1NM6!iE8u%}BChNtIH?HK`*p8o72Yw&zOCBhdS>?AB=%S; zLw$j+EPHN;Yp>?J!*BY#C7+9nDqd<5RO+tUsM(zup zL`iKDe)R+Aa@7o=@E;DTCw+W63VQypc_KJB(`@ZMzVG(wX%=8b_!I#QTs*Et3x(9B z4C19-QcPnt86)9>j1U92gIW2Se^y!?(!YMG*PCqEJ(_R-99@NX!quA@;qprVX59ui zFVR1+qI;6Y5ClhA^~R5`zwZwi&qY~Jr*}|r)ueGYkQZnLn0uX&&AMLH$$helH0e^Y z;#5)8y=2(Yi!&FF{P71!TP)JB1qo(j8=fAhZJC!7nabxbu^MxM&QGZRlGOvFh9Bh= z+xQ6YDDG?_MBG)pm8X2Q1r@Xcx~}zq;M1Bb>z@6sfmQ_JoWI-|kw!9y8mb7|6j;L2 z?PZZ*suWIt<_w9-Y$tKu;3p!{eLimN=}_r4f}Lv!3Ct2Q>B@SY?2?PM+chV z3-+$3#R z_cf2#Q0>xf_oo+@DLB&ed1;i>!q-=s6QL9O^7VIz9g$17nH6y*Z}8TS<3AsWSqiSz zV5FYhaX_=W;qIN-ZDZ9t;)K@kPHvlvILO{wkUx6Y$g{slWddFd^1plNKF{wLu>Mlc zA~i_gtUOTSyCTKJ6=O^H0BC0P#|Ps0%LX2~!V)5T~* zsg$%SrFWFih3)4_o_{)K@<6?I5}61|v?Dsr|JkX(nfJ_y~#3l>zr@2Z*8YQUlRhYRVC3nwR8}_hNbzUMh1*SaAUr$(7SMT=k$1FEegt7=I|rGn0-xy&&7OprYh z$~6+qW;Xd4kKt-m=euzY2YVh@$bRHp(!hCn8y{~z2QXFo4TH1>%H;Fol zycpg@B7P0fouq-Z>eq=y;reNqB-ncKIC(@yYfMQd8|L+)%`M3R1fvLleR`-zne|}r z3n|Hf&Hz33q>RYPf-xjRs|%Y1Ki)Oua%*d}8<^tzLhLCf;m~PpQQduacIRBYIN_Cc zTXJI^RJG1+ZbX5`k#JN66rIR@5RsEv(6ge8953aE%#m{9g^Xv!ra`(pf?SLceVS{W zy}t<=P%u84q&h~flxaKfpAoMY0*a4E;1x(RpQw`1@=LAH1~C+&`WHY`ih`eQ#KENi z)VmHY%>bDhMK$lKotJ&e;zjZ_WHTSlS!4J38-^2McHmEU^`%%b`(Y~^@|*Pwso zh8?!`elg_vo15gEUzQvDMw#}jCMDs<6|p}#X{>K_Yrm=s1|{8#c-T%HdkWI!Q}owk zA~8vt80om}{dj}PS5YdAVw{_hhJHDj*c3nEc<<$z2A|G`N3R~?L&J^BOAOJpxyr4v zgs`iM66AZ8aPKhRn?VF-dxzWN=I!jZpD9^rc>fpQchbW4B86RlIW^R?TFO_AU$Vm_ z5aGtQvwkP!vty62Qm2`Z>XTAaq5_ypf#U-Sd>DH?(mHB6(KiFGXCh+*=Buta%YXb_ z6H+opH#Gzup+pn;Zh=%3E9Kv3kP7EPPurB_jajevh^?BFi(-QK=&EnGY2=&&L2H~g z$)1A2K4sT2i%zkMP4tOm+@5bSD4VOK;wOz1lugD)d?8&@T_oq?Qh)0lY=wn%3|kl0 zSD3^})>2L>(YKCK_E{s9EppSrGhnNjV%x9qgPWOB;!i#{c=*}q$yx{R_uilN+NMbd z6U)2NRXBBcLnYhOUk??YXGi|SnL)2{7emtNL53ax(Ei1}ZyV>$hvtBOa~UO_b0+L$ zGH1q7sgu<5I%Al7r?F-!Qt_}i{+k;|6pt;Xu~yHY2<%jm^B`e@2~R{s(5Xp!Qkh`A zeC!U%I6=x`f4K3Ou7VZ4H3~XqrHZATgX-R#lB6C!Z}lgML2w zF`6CObLD0Dp3Ag!`n8GeljJ7?!+zs`o$m_{j+C582&?A1)KH%%J4yv9yUE=n(Z*E=iIbD2AhT0Aao74pZAFT9DZIW zoXA4n)&y@?Vm~WvoZ;hHcUWG6^8mfhD!gbI6b@>)r#Ds@MjF51h(Lr$;;~Segu%m5 z*J{;Y=m7u&MBjey&|QG+BZs^CYCEOrjeR!tI~w|VYG`8Dc|YI<%<0eeQ0C>lZf43a zx-*~Gc9NpYbzxw1@p*;hyuPUIxcd6F-Y#%<_1G+%6fiot&dBd)bQ3oL{Y;@IPDGXk`mFVJXO5Q#>dpO@=lRY!gnJAzj_VTGf-75h(muQGKDIIzRv83KF3;Yer4_IJltB4Fd!7oWI-4QvHeLp4ML{pi`U4Jy4Q2CeRutATl<4^;5n!2>lM)RV8}q90)LOY z7Cfi{pJ5ap}KCSG^R9qN3IEbTU4JZzTd4+Se$!V5!KAfC}1MDZ4=dQAtt1x;1JyQ zWGDa?{Zvt|k_{MbCYlw%s(~9}NY46Nc?2>9NGag_wt~Hhh*0O~w?p2YY3{xyi~@-G zKDEOvS{62jPk<8c<4wY){ z!?GOGgA-v>{Roie((DU5=`5)zROQ(&j7tql=*t>dI%#3KJvQ~dh(d`6U|vM0)LVuD zFDn;vW3`$~ES>8Xa?NV$(D#@p*FJaLfKPj4eenk{8R^&B2{ej({E*YE-?;-N8#S#O zs~^a;xz1TGZSR>IJ$!-}`l+rpB};KdBMft;%O4Q-Ds=8d3M&n~E#8s57yePPx)JL4 zsI)(hFH<3yh_4Ht_QTcTF1MS>xcx#~Lr}vnq!E;rQ!~CMiwaT`{neYRixP7fhH(BUz&Yb-Qa=qCxH2{S^(c7qvxf;gbhlb_B6qdtg z&EO>WgRNbTCo=7N_ON@V^Eg9F*SVG-StR1C;g4m1)>T&U65L0zB=l1;uc@i02#88G^8N*cRC&Bo%EMeexh-RRbnqp? z78bDkRD0ds6m$f+*3~xazxmJ>u>uI13#SYSyn5utw5EKoSSlOq6LS02J>q|Ofs{-` zb-D)f78QIIz3pvZhY1>k^o_EsXQg7FD!V1^bpA0N6>SfmvF{3}pD1|L z3%fE9n;t>N!hfQ&-tvCK*)Y!OZdop||EBMKUmTrZ5U-}aCTE|J=~M`n^hosQTjsqb?Hi_gF3UteN5THlbRH!rhn?lm{Wqo9Nq^>&OEtm~E--cgU;P>q zcK$2;r|AFiPH{pv9AqO%_RsV1tG)2U?E4Ob8SFfKpOk4N90%u7)7FU)PMh#1FYE&z z;>5pveBk^BNna&3l3d&A=RCVfyJ+dpJb9eqog@6x-5N&*GGWROU3oF zFo>DdbseE3D<`>qwf%U1@iGB6#KZeu7RqI|0 zmDSfh=^}t$5{4L9HDhWH{N}8pQ)zhbH1< zMc{#`fx5DutQrV&qj&H5;2p>Nz_mx7H8lf3o1Y0QlpRhc-7XJ5Mp>m>wJMDtB`Tv! z?i;8a?11O?(hYw{{Z7iDAwhmX-fgjr^r4mAZ7-odnJvB%`ZD z#;-1SZ;rq=@cA_grvZn(+pWckExytH@#ZHf_b!D=SEazbomci;(+ha)ra4FfHkUZ& z_c^-I@ z-od`Bk$#Sk5?C=Ds=e|2$zQo>v|1?VsfD$4R$2yId(rcWs{R9U)V3&?D^ylu{opX& zY1U4=LI80-Y96?#D}4m+qty1}=VRd%N*WkvoMGH}L%=9BF;%%KkS|KidRAed*m5<9 zQy34IvzUIH69ri()7v+txOF)$Tkg9HosDC)3X)krv*sW|CnOw>M}7EJM01~; zTq)~P_1fG*?l@(c*E03($x1hvL?67xvIb9ywSOAX!Qp@Bc6W`FjUSn$FnU2Bpax!C z&-Nh`3M~}bbUC_ihbldZud!FZyjFl(gEZX9VyXf7km=*-CEzW@B*;FS=flNrReSHA z1+H2&X;8CitV8tK00m*db99l0)D7uS$DICh+?q@%`fYej*f-oX>FnWQ4MhKBe|q)9 z3rZ;Sb+*;^wU=p>9P0#$eC%%0?_K3_FJIO=(`>=F{3_D2ce>RDUJuq2l{A9<7-M4a zzdK=p1hAEVv@O;d8LW0I^=s=%iQxU&664sk<}L!lMz4SV`zHDZJYFsvEd44{P}+S2 ztTWBvZBW_)?^E6byhq4+R-8;A_+s~;ZmZiL6=QZbIZ^^@Sai$gch9QLjPJ*L(z2?N zRR!Pn(|RbtGQG#wv%Z`yihccl{;vnQlwQt&Sb z&+~$M4`;%sHd1Q7%KgiwXyPY_sS(NFxKh=ZP1C4Sn~tvxa}ZyN(s=8&YbMaA;%>W@ z|19`nLfEgQ^^)-se)Z5@)~mitB5S-Z_kfFW=dA;jT{;Vmt0rI!Z#-zcCEi7!uqreE zke>mdu2ks%tGD0SLMPoPQ-qh@Y0Zeu(uCntaZ`udo3Q6V2JqRQlIlo9mhnq&(Z{yc z<9`Ov%SpVLzK+ZP79W#I8|SEBNt(#4NhvkzdHy;z?lU|i4g**7FH;Gb02zPq%x7AC z7=D;O`l_&mckUqnh0z}U=nx(mp7nBEhC^@G=XDp!T!>c(J57Et6La_vF zI1L`oIKcuQU)c#f&DT!ZTw%c1lhWmBF8l1C65Y=w$M0V6UH{sJo{FJ@SR^U1nDhA` z*`xnAo@+O88dVK6C5R6y_EAf<&rAmYB}F_7@uqPb3exYJDMpC-cvx6e{hMXsW}&r; zl8E2^co1-20+!4#tnH+t(&SR5$$tr*(}8(&rT(e=C%r;A6+|3nZptTnpdslfi`_Ti1OS5T#U|arXWo;W04t zR&za!85Lt-w&KFaDX-U%SjC*DC03|KB_-dW@6%mcfViLqvfZDH_%;{ivpXhGrGlW- zxjhsV3Ua@l@;!=a3JHIv87V2gZ+_DEL{-eK#7}@J;6C*Wy-s2v+xZU;Yoz0dLcZA_xO!ioj(C zzz3Shn{Bg=J=MG)@~NKFs%8rLeh1oUdY4~i#@S0H#49z?itea?FphdT{Z&!d&w=35 zMrMWUrE6zk#I@e!$7#3cjIk)zMuC)+{VmebjdT1irF&GZWZ>TWtV{wi)w06{-SdB6 z(zkIi>fMxlRo5QfN&8NK043``@+c_&an{1NrUEG4iKe~kYdvP(x*cog5|`Sw?y1b` zQ0TtAbLigr^2)30vP|LCoVVHA5|F_9bTb3Z&XRU|mXxNEB2A3_!D{<-;?97fNb5mp zj-^9Y&2Hx4SM?jIB?}g!sL#*5`dwu0M^~ApDI(hyhlpFE36qHgkP?{V+w$*G8<}gh z!D8Z)F^t%EfT= zZFh^-sAJM7`*N)9$|sBa4xxPmu3|tH2s(3FYiEirv{hlrPc0aXEzmK2&pFb5-mgS( zRCb&jNc5)}ggY3FoBI{ja4Cy4K+~sS`mS+})5+RoNykA~)26hhxN*e+f=-P73eiYX zy4{RL~B~#z~ zv@nl-sOzeB|32e@$>R(GgCQgGzIOtlmh|5YzdkS#oTz> z{Mr-X*X3rzeLjD z;Xj=haW$u`;;#qU&+nXX1rocOfLD-dy*`p3aYadue*eP@o^5aw-gc)P8hokY@aiwnZ)9P4$ zVAo;}f3GILe*?o2rqa94%0(kjKYFwlTnO*ciLM#OB(-#{u1G6ihk^8nB8!^tCq8@| zWTnWjk*XA&+ob(QkMCMN&l_xVFyHf0tS9od+Pszf#)7uN5duMjDx1=}~ zF8wyCXfm0$4Qa;^l#Yj-j_PMlZ|lhW)MoQ(BvrStR7>6aPJezGFXY0w`~pBKNwH3; z8XsWSLA1P~Q>4KfImd8n4k_gn8?BklOP)|(3IY%i{0sf$uJE=OP4al{Nf#hT9Bo|X zKsZ~x*YlcAFVRnD9)_^5j3xU%w}CdjagYji8UN1>Tr#v3t8X~xVnc9@SP=+COC0X-;QWZL{N&A2q!|=xg{Yo7YdU^xmKrBNC z;NW|By^*y-jAuhUhNa8QrtotP&`>}ht%La3s*D&0u+uG`}Rt{!@~JKckMnpEO7lRFE*n|y#4-T>GK zYXk3OqzkT z!v$><%4pa}+ezW116^(Ts<*`t!x`JJ^{0=uVad}QsK{bzn|#Ta+%{AMIsh_!K%v*? z@*Pitp)vgXm-W}@ps+OATUIdZunTiil$s?!cH2y#S0|~Phr!UTbe7SZE3L0pT@(rQ z@z`>~?K~fU40v|;OKd31jupduTTO527Bwy-A2dO~LP(~vD*kfk_ilhJ*o7$rbh~3=})O%HYMP(J6TlLGvv11ua*pFxC8d7ic=}gOCRb%uqkFT95W!ziKOk@w*!k~3k?U&2DVops39yowhL&!>(n zjlOzS_USK#+3TV!g~tDKowv=K-fzW#F*%!2`k%7m<`MV?`BPO4Vq8px{+|mM71+O1 z;UkeVzRY@(Z~i73I8a*^nAJVudfd6MZEpObI7tvok6rA*RU0npvsl88_T>j);Ytd2 z(Zz3rQlZ=;4oY7)=y|&c5Hs}sBz?gQtajA`eV^4F~`!ux8x0_s@qnB7mM{3O2vpr*m@KYaxV7 zUeW!NNXef_3yHBRe|BjYHdGND@8`5%CMn z{ibcXuuERpY|=KM*9>dN-IqgMbZtlCP%u{SH%nszDSb~x$Ai7b9}Tib1kKDpP+m0x z?ycN?GG3Y5XQ{5W|GHswDthpd0KIYN_@LS(_+6Uj!;{2^te~eMmkcToTI?*^xI6`M zcqJ{rI^Lu}n#3s^h{HkIZS$?l#ow0siCFPHoN-)o-|=J3dL-Net8KI#$^20#^@SS) z&dn|E(^lU6F+SQ|a12dQDR6jRk{`V{6-m?md2Nps{~scFLdZaKketqGQrOr}ek)tzU-@=jdhz+Q|q4s2$* zE7Kv(tl43qrK-)L`5W|je`_5lG4z7`0qmXhm?Dzm0gCrQWT%UTdWp#;GIGC*g)7Qm zyrB3<@DDQTU~e{*8^FXlK))q~dM&5(&^*BDyLvi8SCDjLZ z1EN`@16Ud4jJ}=KS8>Ux;c-YL;$9>^Sr)Vp=&W>hDuBN8^t{?&{Tc?xtN#o{QB6SrkvNOhgP|Eeo^Q__=!Z~u?Lz`M;|GT!P zhYTuRD8etKZ7r<2%nM1E0$l*9`_wBwW_rCb$gNCNjq^3j`}v;fXL6i&tQ7x6SutAA z`$-`n<2a~EJ^R(~5m^BbbFR{a)Z{lWI~f&%Qh&GEjAvd}`s!<E#f5%6#2)_u#66GmsnPh# zp0(<)d2=Rw#Qy+uCkaOAn&!$&a({_^MN`f?)|kC>35bm3V_n}B}zB+|Sx#rMG!fwR`BHPFUMtr;v~L9IAkbOy48PL4$lTy*MkvsrR^ zHE9J=f%goWzO{spPK!@b{izNL5NY(r>5p22sDvqQ)c*h?GxvsljYt3kibCK~aU_=H zoB_v5VSdAbOfCmgiiw>_;LwoViAyLM9Mx9??*YX;GPld#qH}^)nnqH0Lvgt=-=$V& zDtN10D5jSmfvQGwNND+hKD8c5Ja(r=?b4OhZUpzLMsI7A51Ddlg>h2F$l|0ao+@r^ zqjhqdsUwPv#y=|2F^Y-P(wdN+E~OHq6rF=aX;jlP9Y_u-)ZX+6 zl@C6(Y{sN~y*m4fq`fg#RmfkhQYJ`Tf%K*^QB&8D6H}fm{{Tv}4r@xsO(2d$4!mu~;(GJOKdo!p%(LnD z5CSluFz4bBES)Y_B1oIkj7Sa8G~ zlg|ey*C(E|czRcu%A{`c)DTZmpF#e5QP4%(*%5wQfE5M@%Zz&WfQsEo zE`C#=UZ?P@T7~SgN`7K8a#e>;y^U*I+ka$OZ<(=iI^lWc6Y%IyAIsL5u3u?lk)2{7 zM+n)Ifw-Q(P&&_2< zUMZkAyf^0g(uoceY087tll<#));-M9G2p))zVD?;r(1o8PBPr&F&S)fN2OuhYI9mj zl0-?2jsRSP&#%+cxvSH4BWRk!N-pfzxwaQEgjq^qvNAa1oE-WZa!cl>;&}&aa6l)% zJ-sVF-(I(P@pb#A>UhZgImKr$i50J$1ST8>+r~le-~DRx9vZHxt&X);9nHjc4AMw= zJOhp~_4lcEga96KfDh;@t6W>%!V(fBQoOSBjBt97!`h}*iCGU^9uFryy8HgM#VsDE zN+o9|GqG|>>C>NoYLQiD1(+2%83%$f%`^hbxT*CS<3FEDt9~Sh%wV|v-wvd%Pe13@ zyD+g;A1g*RWy`2RaU60yEX#*%s2t}5x8+x(iGX|&%O74nYnan?yQ}=l&9V>);EeO_ z{ObOrtlH@jCAzSgyQ>~ld-txoxD?&s%wb*I-bSSH$Z&yvR_b%meSeivxz{XUa};FC zScMF|0mgcde@f(Tyis#>xF8761#ob|Ppx3w-m9*~U4(jZ&wp%sQBMOOv=XlNM_qfY zJCB3v^Z5+uIpz@CRO=y{MKm9HgilRPD*&arO20uAjq@ zL*kJZDDxUor_U=EZ8V4=g-+C%k+`wJ9-o&crfnZjB(IdD zvE;6JKTOuVOAWk0Mx|GrFJKQ~Jv#KEKpT_>$OI1F_4BT@+?%=Us6{JS=WaA>V(lDY zs}MN{?)^cmzwE2U0FsTB;18}39^GrPi*rP*F}bqD=Quq-mlXM9eT7FXP7ZteWOuHL zc*>B{=2OGMTG-|-tu-q#m=#|<6&xIa)Mp;QjX-q?B9~IegBp5To1t>cc@_lo9n!&!Tb=2um-xKH2kTd&Y`&lIW^4)s#& z>zta|xX>*nPzvk;x`D|U>F-r-^y|BPMKR203=d2nLO=S|yemRq36!BFxt7M=7w1Ef z)OE+bS7?#Imjq<-&uo8&yYqsas4=|l2=5BBl~?HLpT7QO6_T;PNWsCjL^A`q#*imHVcvMJYp( zU1{B29wVpAE?FAT0=yd1PL+xFvZpFIsZ#1!I0y2mlv_HfRg82uatB&N>shf#u6|?9 zTo39;HIqktDswB2X2)8IiR94v13hXtVZan2HVq)fFp_y33IGKDH7FjmH(*NTTmauM zQC0|9KqsiE+ydazqhX5r&?K#+40I=qR5Anidm6KhjE}~vF=ZP_$o*=O6WC(07@#-I zOr3=>WQd#t^vxujm3XVM&gG@eNN^BjVxC=Bt!Bq|F}3)qUO-nhJeulmtFB*kuxDPB zq=p<;NtH)AsiK=5_@?35&KR4!GQ;AkN!J3VmGA)usk7&;IHD^}Y(_^km=v4E8^v9Y zUSxm&)$&a9MI|kC9Dz;-o6RUR0P1k-P3=pZb3r7G2pKfav^0$W0C;A;&caGfzgr!Jw8;A^C7Bxj3nujkQ?xpqQfUE*Nb!WPk=LrMVxCTqH5t zJ5w^2;*LNR-t_DoaY;;sD5(_Gbm76K43jJx9x&RIs}U-4A|ipwpvSG?!N7jN{(1?aCy(SbzHHCQ>A~%zz@~ zusnV>+S=Nf;ZQ#s=WUV{x<)@IHP-ptMo&*sLnbzQvc1j3*6cn);P(~G>a$$TqB)SL z&OxrV=R!8*b5$gYJB4WFokngGICq0b?ivmf>71LkoDDj!?#t0mbTvt4{?(c*h zdgrAp8!4Ewjk0cGyFR_^e$wJxgm6hCJ4ZbIJ5wdo^2I^UIXL#J?Qc46Xx!wCb6Lup zI-!Vz(&t8Q)>~mC51TmW_58hSF<8dD9#2dR3<}7ITty&_hC}r4S0QFj91)YxJ*yUu zl*=1hB@727Py0*Zi4pVw^(WidQzu)C7EpvJ&R2Iv z?fm}$#;HZ_N3>V6GcJ6la%14|eZI8{smN^cTJg!J>LpTD5Xw$B1Ht-s{OY{=Z1$m< zesv$1{3?-*^)Vz?wYc-5&JW(lYV7pb7DWEgx*=`X1Qz*8ahw6|{{ZS8>y^5Yh)%(c z4AD9uxpE^c2?Sk#~*R+FLtZTnQb#(hmK=|=XAJ0Cuv#QAQ+QRWMz*GMKeGGq0 z*Dcp4{BvDqsdXNmU_=;JVT4|vQ$y?vyE8Ql*k)%{IF8)l=lGl+$J_bW zD<#WZf1?Jx6|eU}cISXkZaLzgZ)TQ~vaihK4D*iNDFKi676DZ9 zSncRB&pFT5llwbh7ZN|+QmTu=>T*5*09xE|zcV-^10%mq_#G>fk))GR0APk;*VCtZ z7|C?)O5;u?Vg;hd&6XMZuV3X_i{f=@HpgzocO3lRz&Z@$)~Q|Fq+`!-y}j|Z8sJ|;I&)yxrg9A0sJT)o4X(L5eOGM2*H&%T{P^|-k=LMJM1Kf_)ruK~T z7E&1)07qPb#{=u@SeM%LcA=rLMOWGvk%68$9`(*@vFl9-n{{!$INYklU<2vEBQ-Il zPLua^xm?nk)Y0(=hBkTO@j=nV};E~f#h0>ECj@H(A1+0F+p;b}b4_7U~sUP7d*BMM`Q*Q^jtelGawYn2qRgKsg_sMdlsZ8C;BipRGP^$s;7qmd`&? z-zJ)f#Hyb7J!|O^<(g{VVwuPc8|5fEj9`)h_OC{Y3w4Y~vjA{Cf$jMFSD$J2`>s$< zn~;)1^d}ttHQz&avIX<^BXs~Hpeq@p8;Pz#byP2YM#xsCVL+eILM$EY+ z9^__}Z{AB10qO70=j~5e$>=eh0z2_uS>19tVm@vrsTLAa+4aqqN=VJeh=OQHSI!Al{9(sin}=xY{7s4wsY6MF;(wK4i!c=o_`wa zbCL#dqnu~9f5@#A+th~}XjYBgl}7HJJ$UV1ByAk=C?GPo1bs(C zSWEVMrC+mk7~pl!PMx@^Z7z%`$k`*Y>N0x%wUnLBVys_C^2XX?Ln%I6cOZ5?q*jCz zylv%8!R&hsBnx$Jvtt21KHt+!}A1JDMU= zI@H2y#YtqhAto7K#;)xSyW>4;v)y{0Qk3JNEx=insph%)5UJv|8d5%16;fOtMQIgd znzWSlDyw!iW-K#Io6Kl>6ah8L&ZTQ)Ty^|Bi@io+Y0Be6)5uEPX7Sm z=bw7b=yXQUW@|?%njm}kq$BgJs3jrty))C=wLuIrDjKob33DJG{7}*q826x~A9{~# zV55wWUrL<|yBWCTob~mjFOIz8n8-*wPI2i_KHxrXG5A#^VJV94a&mKyrlDzMBMeRr zF^+%FT8xuhMm^3dl^b?UaWx{!>&H>(Y63@kP1Qz8v`@K7$l|07*uXiexfGkW^`hff zCu2+vicR_JNNJMUFPhlKYBJQ!(@CPja=7i(Zm8&@!$1Gl@=97tcWUT3#H6L7fsP$0 z>q(kWC?shHflf35Om`QWG2Wgrie&_jQ%FrH!4%Rc0NiN@S`QQo213OsW8PMrSHWxxaOIP06WvTq#RO;0f!=&G*b!9FdlM7M@n-rE6-YLwmQ=o z;+@4}^m>z8p@c3$=BhmHA@dj4r9n8z1XOnN`BJM9kPk{OH5F@}HKgKo2>h_=R$1<3 z9#Lk;Zq+e~3@bgljGlNDuzji6GOtRrk?)~OOIZ;^H%hsu&g#Mk@t!ir1`B06dhB*SMX)?!W z46`^4!x;Yn3Z1q#id{+~X(4Ye*0R+L35e7LADuTo`LkwF8Jf5@m2q>3XcR!|26 zAC(;T+^0tR#ANoYIgf*$z3TD^$;nVy`ulrysz2IODk{jFoE|frQX9Faky0;{9FfoK zikrswHRY>rR`fb0dxF_Mp4}>EK4g0)UEpT~edRv2TGLWtm}lhfz&Or8t!U)7nm{wL zyB^g}%;#Ludz>}QQGw;=4 ztvN2UJ&)h&%hM<<=)dUf~Xy>C6#H<7QK_x6nEx#vB5(@eP*?BF8kOAgYTNXn3V z_Wb_<16!&@aGvA2_dM4*rK`a5ZeT%PJpt?dt7Fbd;`=;#%Hi|tfr4t$46|^|`b4|} z$%h&3^!zKH(sVn$S(;4wajE;~ka5{ZQ}110*q+9mF!ziXL_ zBLWl-;GF(m=B-U-5c{VkLE!uK=8^_sYI=+LpXg&7Mlf;P)9LiA$JQ=F=W=hs=s5Jp z8RoiKVu6*CWg{StoDM&oW=o{N;H|TakH-Z1;;54jZAxb$xJ4&8@BV!%tX9Tbfh%AD zOJwno54~;Ar+t}2T}+4q<0q1SgSX*Y2FW9DHwR)ScDDtWo^jisTzx1RjdJTe%VlH? zk{krjU&QwJ&rY?qe=1wsu9*V{Wgon50o~W!jP?3rrqkoLwuSGCt^wN#RqlG8=h*k) z*E;tWjXNx_y~_|u2k#M%!}An@nfGcKBy*KwTbBoM`f<{)&7#W{rqyvGC@#u)8+`%J zK7iHL)80i^meUS=C0 zH1XuND>zdlOXHcALr7k z-D-AF7Q=$-4ig-c+o!LsP_ooz)RXsVu>lH6IXOO^F<2@x<>s}Kue4XS&JR%0ZW*pG zphYmO%m7o9jGlgix%i#pVCZm1HSG~bu-pBW*_l8CbMxQxKU(HB-wmvdCC!Om0Xs4k zKfSzR35HvnA0dne8dFUpxD1tX8jyYm=$(PaY%=f-ou>HPCv zWe{_25epoi2XDjcU7m+?bYPGeoW_d4I^f`p9Ah~+_NmM$^CeLa3sTL+o4HpiIcyAm zWOu2e-RCgqgkWHB2Br9EQYc)(J*=fBpB0>w)3$Dhd4VvIz)(6Wvb10)P*AE~NHO_PQ_OuCrISSs^zeR6HawW#Eu{gVUg{A6A(+ zCAzQ7obLYsdmsL~_9#|WZ6uBgwD}d8Qah6ihR$)@*EO}6q$?z#0CS9U`0?B8is#dO zjkQnV{OWNe@nv(+^z_YbQWx0H6Sj=#W4RDGRy*)XIX{W-5hwzVftfNjI1Y6$C| zGyLm;(R7ihNM@aj#JJo!2sHwRwrn0yo;|&f z_}10j9c50R#6Pe2)^;#9u*#8I!fq!GS}H>&jb&W^wU;bxnIn-}J6aw`%%75FxaUUPHBl2 zV=9vj^v!HCBb}?kJ#pz+ZMByGjMjyX%y9-2w><}X!lHYlyA3qG*&1RM>O0d|0o2nQ zP_-X*zad$-H{M_>g95UQB;KcGOhq`Y84bjX=90bo)LXmM1-YYkE3qpcEai7{LQOX` znWHqw40A?BG@4A(Wh6g7l!T0Xns3&eM{!7`h>MjtH1(7WR4>OB5ng)K-J-b@Gyw;Z zNNYGVuPSO)y6obuPq_|@=vvJtY9Bg3T0H3eY4aj^CD{Mh@?lD80R&R>T?Y`_T+-td z->m}*UX)T$1Bu9|twm2<(-TG8G=c6BZi!gQ0gCm-7mzF$4vC$aI|=SP8iqbvwRZ`v z3^HRN<$oXW^sBapPF7|mJGCpLM%!DcrjzMVX}BCyJMlrFQW){gUV+8{=xT;>Peac% z$dqo4oB_>8COcB0`7mm{r)b7%j%ck%BX+5~`qeaS8nzoEf~18eo6?+fjw&-jC~zXB z3;@CApc(H@&S{OI&Y_nJReYibYSwXqOpqVFOi8q9X}YAgc#ZyKJ-sWnw7#~vRcMGc z$k^K3T*H?8!>vOy{gz$OIT-FLtYF%2L%y0dnlhwy6^{@q4Y@pnl|I#t4!3fnZ0nWv z6?t#qk$l2HAFtAaWSz(^ZEmG<^AK^^b{^TP0J_HO-mJajPH_++eN9$o*(V=#b^ItA zxpvma&$xGGz=(hW>yhh<>wmN1*iqCGk8btMXi{CX5&_{OVVv~ELprTz zv59@9Sw{g;g<-;x!Rf|7D#f>fE!4E9aU&Q#N6^;o)s&GP&Bz?)vTp%^qRsM`85yRM zL{6liLGZyP!kvl{LC#x~_zH?kca4mQ+kodIwP}WCwE1{AtZy{OCO|)rAoikjG(z-b$8+bUWdzw@DbvX;Y2H|pc2lOa; z{Ec8db6d%rl`F@g{A;{7vPRoa%s(oQSG2!fldnAn?g;uCRvMj-9&vAc1b1W0lyD>+ z{IrIh+O)QjJ69|-mLPQ}{{XFB z?xzU2vv`5Q#~kB0uP%Ky_Gd2|^&kx3XY<8eb~2LGu|B9Lk8r|~)MJtKst~=zlX-Dx zJRUedm)53-OKWMo%gv%S88~76I*RCYn?zfWHZ1IqoP(Cf@aO*k*Hv*?lG4&EFfOhL zc^j1-!K__U`tIg6osPtQ6-IJ@E;Czqw>GidkF>weFma6FepK5#X?1IuZe(0r!rQ}l zX6!!>rjQ}i*_RM$E4U;P4bR(g>-y*OtjVlwH2K=$mka?Q1Dr7Dfye&ARZ0dcNfBM&6t=Op7fG`E_VxwehMg_-)2 zGt;5T_4KNdMJ$-g{FwW|=Z~ja*N;i_3bTR$9Q$LpwH7Mo0;@csaKmuucqhIO)Q`m1 zM>vyCbbC@v%YfM+hEddD^N&i3!ptV1@|h2p7$u3uGN+C>y;xU0(l*eU&^^%UiGf#JoL|ej-9`iE>wrB8x+!6&eBHA>N;mTeKL8->ycR3GD|D4 zk&6I#bJL$n(L~&c5D>(GRk{#;{=dq%d_kyK&ujK&gLI`qRwEm6&H><@4m~TLq?~Fb zqkEf0UM;qB`ee|@H}9CM4l#k>zqjRG3^L7P`G5_Lg5cvB$mxUMrE!t5Qd=XO3>xTk z`@(k#cQ)WxYV`FP{A+ndO>)T@rqjAQ-8{*CF}aye6@Q1ZJ-X-LrED9^IPR7=ar@4A zJP)s7_|`p~z}Pv2ZFbtEj=b^wxEZW#n{O{*05NX4?a!xQO5mOeN=>tMh-p~wmI%-9 z0XgR#{{SLCTExA*I(^JQ0P#2=q7l7F!OjO&AXYubr*~}{`EE%Iw{Ir^;Pt>AxUAb7 zNp7wLt@EC_W1jp2p1pBdQ@~mK#mf`e?=9lVYosLkm?Jp{1ExXkR)%0w`*Pg3Bd_!3 zv#jonFh?E3WwXZwa6iJcZttd+P>kDSW55S)NcZPGKs_oJ5>30BI_V>IFIs3`RYp>y z7;%n$h|WiDDhrXiH7s)7Ngu6K)35D}Uu0qtlX3a@&po~Je!c2Tc@|{yRYH-FI{nem zB&7r-{uUJBo4Sd)6N@>q;2jw{7C&N&uHcMfOs87c+GJd-nn`9hO$6l z5t4^*-Z^@UNhwMN^83Jld5U-PsDcRpPAqk{_7xI&n~>cpx$Nt;~;G z(XBqirNaprV!Pk{=I5WMPr{@Z4Qnp!W;4kHl0Ki-uO1e&FV<6NOdK%h*N*&GCG|CH zL!gR8kprQ~Jm#rf+L8O%2i1SVxQl&y=E8C(0D^e{`u_kb?yPkSeL^ob1NBqXRiiep zW~-}o?b@rz%NY#4`mJkS*$Gdb5!&PR`qoeV z@+37lHBcN>s`=|%+~t%>jYm>cc&0)DMI|i*5}XbWX(=cfZYRZETrm1pSZXM&EitK*-wW6tw_j!=-)>4{C)Ynf zc+GY2OXi?_V3Ei@Yn->Zh{&xU1>5Gp{{SAm^{qKBMWk(UA^B8uj>3nXNM2OsC@Sa#RK2$;57Mmz(?2dO^v%2y0GtoThP+Y>Dgej5B^wHLd6k+pW0BL9`Ipf3 zAB{zIWfkI?V&VJaztmP_H%+^HbkGU9DhpAxYGV| z#Pq>eUI@i+6-%V^VK{E%)~gnk6tgbn9ZK~dP=BQwGUGYNV{gOSK8YU8XqhJfS};(#P+?=wT=%DIBJXxkZ6{KeW&kS02s@nRN%hAh^z1QPR+e#D#`ZRCnU69# z&H+Em*m7%})I3Xf_KB@wDv7wN{JijSoc_HluF(XM=_x#<7myhV&r;uaB>Q59?YNe^ z8SA5ImLS|-H<=*?u*U(2^ikHQmhew%(At2j%8%jTei-N5wN$*4*4g~~vG$o;g)PDZ z=m((uezlC=CAlw`MGB(;0mtD~mGvdbY*f3729U)r=-2`C5y2pPb*w>QbR-cX=e|># z>Z0)tt6?r}avar~;wYx;Z+KXAz1z*YS@pk!7S0@*jp2d;SQ_j2yNI#~?4fH@Y_fso z5YjQ~-km=WO2>;!2JA&7fr&XgbH^LA&ow5esOk4M<*eilBXCuLQ;cV!7(aojG)0wS zlJ!`IljT%A=Nz1O=M;xx{-Y^4LNT5W2TXtZtCN>cX=PFfJY@CB1L_C2HPXn&M#5x{ ztVf{ts1;|8O9AFf{0c`L9B1p#d{Ds{6I)qnj;)_D!(@fzV;LMDdSk8Mh%OOhMU7z_ zj_jNU{Z4y!twz(*-Zh?K=G;hlU%WoNb?=|jn`YwJNpo_g8P{&mdx4NKkL&nXHF(b4 z)b}^1C3{O_oNX5DUJC%AxI2r3^6ke{-}=%my!O(xb0`Hyb7$`79A~Fb&Zvzl0Vw-z!fq!!MoIm4 z*F}u3SBW0^QHq7xjQV;W{rdiOw;IC~V88%50H`?tVD;y|I`^cqI%BVw3%fG*D~#LR32H}fx8e# z9Os;N_BFM2sawSWGQ{!B01=J39XgEQcILA*Ag1bRvSV~nh28R;=cwy}_+qT<*Y+aD zOIMeCqW~y8hUyO)01tZd>bE+|n~l;tVPy_v${+BQ-5?%nBNL6lWl!VjTz%xPb#(VE zFl1u>+@74)osH;%IZ%!dAT~MtaDQ5(H0s%BAakFTah!TrT{x)C+BP$jZYu1m0Rw_K z$>;K@7nwH>25F_s9t8s<1F5cq64^QWes#Oy%Ll%{S#kTgm^&YF(0+ACOwlj(Ne0C+ z#1Aqsz{j_#uT-$Ix3ISs_REDGN$O9j_pIkMm636YeDX3XCtb_1@-g|-^OHkzc&>9( zj@LA%&)T5N0r#?cWam7Z#jw4a+GUy+D!|~3agTrNUXt;vp^do=2tSQ^#J0^0tfX)W z3yyL@$F*8yGWWt=vf#40IgLdvW8A^gX%anYDO}pb0uyQ z7-BxPAd=aL&lF9imlzTg^#K0>g=W5sI3%l&$kvKx5~9r`6kC4&D=qFJRth8s^{Ue8 zmtO2z{uufGS;yjP)k}3Tcy4Zn+}E&12I2)#I+d<*yEV=o zXG~ViHt!+zYy54`Eb8ujE~o)A6aAm%tpgbof{+S2>x`<%Z#Dp z^A(hJsg)Q{Zp(w!PT~DOokp6yjDs)3AJg-}{&fDc-5I>Ot&LX04xfmq7?q@3i#Ns` zbL&S;r7b5>PU95BH|s?QttA5#RLk0+sZoGD z(?qmfjoD8WNf6o`bSI~!K(cdI1D%-d*Yc~}$)<{IFlfgWVdEt{z&Hd0^*{cqgBYk~ zr=XM?IVOxyF-J;prh!hNOqF;vy$)#Yu^{B~aZAwCql~yM$IHph5@UJW(DbS$k;*vSDHZ-@Z1o({F(eUDFF6zr+7iw< z%~Kp!lu(J+B=S2{Q(KhC1Emdh2+c2ag=AId6|-fm&j-l3agL4tHP3A%;8VxRMaywV zVFt2OhlG$$P6)?8QBA(orN2QEMo@0ta(bHO1oA21n!9g)z=fBmsOwakGL$7_sncxI zQv11N9DQq{c|?$`(VTQ69=@N_uwt{ijxl+s&LjkV2_H^HX2@=gOm}>&eqg`UQ)U*i zp?R#9ZMNA5``_VMv4UM%eC^LPGMGlDHJ0CSGT=T zcPd5=K_rYXTsCvkq*$It+}wLmwJoHzW|UggtAOenu6?r3=Nb7M-~8gTme>lETl-Zg zvl&Vy;~I~;aw-RMgJI+jl^BherxcAFwH6^XS+%`uc{7}?bRu6c3#((69Y?72t~sE3 zwQD5S?Ug)Iv8OWVZ{O*kYJgv9<2mKfbQ|Z>12YV(TuHnI{ZrU@V51DgEa--=wZ-@kXrK@b-*^pzLj=A)2 zTHLvs*G_>#oOaWp#DA$lqu}{^71H0U?e?Iudy`=#X2Y+aIZ zc{Oc^1d5qT=8=t#E5(O%!5XQ~80Q>w?_3nY`CKscIR5}WYt?l%`)0=p3TbvwPW}`GFMS-1mR2 z{{UK!XdCQ7t{5Y?KQYg5)A6QTT1!0nU_ekCoZz0kpL)L}65dWBMGv=(uOs~X^rja% z_%!0pxj_xo4o-go-n&a{3w<^}I_u?-@~Sz<`TZ*0wVLURyemm7ah}8IN&RXUOHDz6 zk@i1sa7pJM&VVs>T}_wwFpyPqlhE_pv2DD|hua=qkKF`gjPr`yxzJ>l!G*@t>Uv=H zAZI*N(XA}d!)+iXxM>exLKmI~uRom^5oR~B($%77GRni8V+-E^{y&X8UD&Y_Dty?$ z3_Fg0&-1EB`z|z8GLw)=z&*%6hv(X%c8%p!fw*o~MkD|S)Mll=tfY+zHGd~)j7N-e zFhTks>Ds7GtVb+i3gGn52mCtLPNFcz6>l_k`AO^FJXUwwa;7;|SPq2n%bauX(uC90 zb_;@_keTDT_s6-c`Jcv~xIl;H$W|E{{W?<;D2f?e`waE`sY#TT%5lcP zhH!c8eLGc{H2a-OK$fYNA9$0G$DY+@*4lf?gf{Dv-=O#O73lhQp9Y@*h8|e*&D@&C zQn9K=4VQ#1BEw#}mAx0`QTSRm%Cthr5p}wGW%3y{#6UVn59>Y@JaNfFu9vz6<(xuu6FJ{ z$WRb?>jBrm{tCG%~Gf3IaDH`ek z%#R|1y+Jg_kXpfxt<##}^%>!WwawcB&Q4Ep&*S)0zd*6r+}G{_It9Xmb zY`lcHIT4}fueSs7{HvbSyiapTo>R49ApvK9<*Dc zDLWJ1*<0I2g|QQykQbllid!~i{memSLD2QV{XVsweRgi;5{24!f%w!gNi1>=hXnQd zQ&H1VIcuTWM+9MaU>0sT@9upnlT3zhDKK(&{y$p16onB%DG{qKnQWqw{F#)KA#b6G78+4K_s3qbI%{=@~2!zt!|Q>fIuIYr4f3BmWL|Z zWI%#O2T!dDWMbwi9S^fs#uO8gk<*%i)BqVD7^ha=GQ{xs33>PUZh z7Eh?b{VK>46P93j$4=D3j8_EGNv@)lV=d6Zszlsez{~Eu{+xe07UISK0E-9TkLOU_ z5wrxs?#8R3i15HQXs0A#@bKxOtg*zyF}LJt{!{^I_%UeOtSUZ;`&(($@lZ7pnK zI8%i%Q^BB2lvB+#A4++uGGiz->}RbZpau$cB^-C4W5MT&*0Y38I6VIVjbwM?uG`7w z;EK4JR8HC!=h+-@Z-8(^2JUgjKAh&W4PBIi+s`@cRZ7t!Vm6l)ayX^tq@e{k3Jp6n z36C5adF@fJy-0dcLlE;xo-sh{ieIGwD%71hsK*AK^rj|QicPE;xyL-z&YpM9gP%&L z(DPG9 z3C`;DY3+B9lxDG~(dUep+m-h1Mu4XzaIS?L6v3M6n@!!x85Njq)a1rGQn9parblC| zT-jw1x3D455 zwUYu>7!&R(G{DJ*ha`|ggWHOdDZ|V>uy7lm^m8!wXwR8$UpxA@q|mMmM44?IgqHc69i$L1g1C%FEi zxBO8(=+n}DK1?GYnU}he$3BL+oE&9ldi3imkmg33$!}}66=VeQ*Z%;oSTCi+Eb?l4 zvu^IH56TpD_pS=YD~qe>;8yvaz}z|GHS0QsvfM@@lY!TczST`x*mt_Q$K2~WBwr$1 zhf%{|0mtLXr@^Rcmn-DJjIopRM~%at_{se+D<4|1ft;Kn2(nr^}*(>=|v#1 zlTo=F)&5jWbwA6kSHIPDObL{#s`gM1Pp@CVRF3B~ZSE2A<&bgC;BpT`^s81$sRRoE z!0FKE>(3RWn*Ga0sseB7U9vgqeX8Q?vrCyH5v*i`+~9iSKaOZB=6%^qSjDhFU5;J3 z`~c?|_2-jR#OokeP!t|IA6^0GtlaB9e5BsQlEl3I(yfnT3H?QFK^?ZC5QYTG;B{PM zJ#s%Dpw?9-B-bi5icfN`mbW)EDk)c1=m!L6oScFBS4w0{2+TGK^JiOs^&O6TdUT?D#AVum>>UGh!1oxe_8B9B4oJxKtE&_?$(xeQ+ko=1kCgMA z_UE-GS|G%{6<#`nf(8#1rqP-|F-}+>dyIODy&SV#$QO2UxLgi8^x%6`m(G^U37qP)`KcccEGtrF~98@~_Jt zeY^f0KEFztyA=ahOw*&&;o1Q6Tzu#H4`EuF08>E4M$T&%UB~COOjscIs*38ov8Wnw z?tQqaV!37CC#@iFo7<&Q^T5d`J+Vm~vNG>fBiQrld1J%OeuF`@iS>YUkNm_L6pi#s~T0iv`;=j;5BE5*qImnGk zC#gINbapUBhgAWWI6j%{O}M&-*>dM`=m5uGQDIBpK87=mO$3}Zv(uCui^eDnrU1PuU_#jww|pJB3b(=?f&<-w_m4P^6Q(c ztx9h;<+JJNK7yfGncIA%l6`ubwvmH?D`>z@R@jLV6mU9@wPjdif!e27f{}xh&}O46 zjzKk{oylOlds#!r)OGYVUQ%RslcwTGA6iov1+p>e-lO9@cBO8mU!ZRo!5Ph4v9@c8 z)l=86psMl4(l8#pes$A^hQ{B^To!I~+?q{|8?3O$ZPP4zdJKPB$dD;h=B{&`5!6sF zJn@mp?T*znY9(Np`sT8=jV?xx3^TjmigC5Y zErpK+u_qYmQMlbP$<8}c!7^m2=eHFs`$$|KKVEBALPSi0Bn7w!Bk5W5$+U2J?N;7& zUK^(!YLtr3N~y>gz^vArmi&rmIRuZrP#!%w^s92D%1-RydQ}p<;;lQ8ZsxQ%ssip@ z_Rn6OD=nmEb|<;-Q%NIAcRw5eF~>oH(~5+sVYq%(DOjhd?eFVG_w}ffX-y>q5OGtX$i+cU z6wul=ZGy6qCU$|x)}dq|;Pt4Zk%twpFnMf5je&;BjCSbQ{VMlIJJFe}xa(1$YLo%o z(iQZm3z79Wr5$lfMF4X_M3|!o6um_uC%ps>8O=Ok)PKcND8&O|-kc2~q*`Q>6YW4b z=}2=(C=oi~t~>UtsVI^I19s>IW`o+NN5{-Mj+IH1Btl7!LaZ=q^|SoIRSDUiQq939 zH0U1$cBGh2H%Fyt_g-XX7a1wY`c~f1>&0?f6v||Lk;;z0TIgD3gynh9Z2HjFrcsra zq<1!`$9ez_aRLu2;z--EuH@as>z%^6JEljxW=@!@iJa}wrqCpu5maZfDmN!1(AJ|q z2-{Pj4mR}_L@Bg#tp*Rw3e}5yd1PRyGhM1_Yjt8JLGvz0*A;;*QrZ$?Bo6eEvzzKS z?5zTqbN6}0Nv7g^l@HEbXY;C3+)XzQdQ`f6hB>!%!Ob#GpI4vkbAt%OZ8;;3I#xxj zPchjZcfW7yYHfDqUgb*t(xacwi+xEfU_L^IoyRPC0qIF>Id7@Aa;v9Wp zxYbxjRs|rQ4tWBqz3uhL#Evj}(jj!CBDOw<4`CVIZ(Xu#cV~a zpDS$R4m*zZk1$x}F(JqY89mSVQu!kpEt;-dn7WQ6HxfO~(Ya&KKs~8g2239HFP4$> zQ`_0ka{E^fKd)T}QkrW^SDxGg!x_&#eXE_Pdo$RKqT|fAIo)~?ZedV2DFl#s>EAWTPo!Vm-ZMiP zDsh91^cCt>am@DVCGvwQ8R!N9=szyCXp~MzUuvaN+7jvA+{Lrg&}op`&bTNy5$}>} zwf2o}@R17qz#M&lTGy6WYlK0S9G;_`del)zI=h)Oj@duTgxEBmhm_xG_qJ`91cA@W zF^b48SODW0>)XHSUe_g>NTy4!n@Hn44!qYgJUIrejX#(6en?jbJBPaQ`HWRv3eRKC zp^ixo!~kGHpT5guC4lFShxD&q(5z&KPEj(9wpg&>ka}mQG-(f6@{{V+td{!{&=;Fl|X_q^goUr4rI^*fhJ%GneD&X#U0zd+cHb^8M z`+vrxy0Cjz&A%#sP~)p-{m?=DYQ5Fjx+SM(LU=jB;FHDQR)|#n|!A7#zx|P za(U;2$3CB}081RR+u@WFSLPd7fAzEY(~hVeAMFUPSmz6rZhiWC^&M(-)O7pS^6p^T zNgGN5lfefgsQk#Pm)dQ-SlcExG}TvI>MD5 zW^KoIJA=U`ZdwnRxS)aL+uW52CQV9_kHPdNVoR;L3!&jbAC zlXh1fuIxI(!R~HS*l^C=A4Td-ddx6K3@Zdf3V;ABnefh>V}-RD#vWg~JrmdQ$K*Zh zsf4tjFzK4-le;xY2qUdUHM{Lrh-BmvI2?EDSAj*&aB95Qa3T{S1N{DUftm8bIUp@p z{>&ypE4c^Ibf><%rN%cGBzEKf0M%5_inPvhkB-Fc0RFTKl^V-y9&^;=6=fh%?tYca zOX9uQ`#Qvj9axt<{WgL6*4t`O7?s{(&r(R^*U(Vd)KN5gjibt8hjS6sg*g1_=I{bS zCr*T)=rdgH$B6W3G9{f`*?B+s?rWU8@x)8=Y48?3nobAgIX{@8U4h@paUmO=>;Po* zfm}AL;*CDljCMoq68iJ7AFqGI^R6!YR@C(~{+Tf={l(yZLyyj>Bw%*O`SqT1c^8f6Yk zW~q)o_d`xnTLU=HuS#MiSqW|`S&A|tT<4wNTC1LNItsTNVQ|20Kj-tN1SqFyVksIX zQM=Z!Dvh~O#WTrgY%fm!fK;)TtYRbQBdu1uk))iqI&doRVI8|FlfdKu0Iyj^i5Ndx z&9c%i+gyuqLj$+AJ!;H%TU&bdCxi5?e*j$mD%$ZR9B#&S~mC$AW(uN2o-aVI-Yx;^^%T9O0WsX9ct4tl6L?};-yiM?@H1KJSfj}`Us8=Tj|X^vpz(( zGvm@?h;NYYBl4`J0bK3rk~8gBF0baeQyK!Jzj~~ScGE;o-43%!$JqG(@uq4PQA&nD zKl=4n!tG&#IL}rlu3TKNlw2MM_*83iqUpxREjE*G0Xv94n5;;~$q7@OaaS&{WSxj# zl@IGwmROL6BoL>O+}4I^Tz00b70N^pB~+hdNgD592YxD?toJuY;rXc_%sWI!X$Lu^ zi;`DJwJzjsr1h)%T+u-+vdC~%I3H900M@Ld3(DK2a>xAoRD#YN@;{wbnV&Qfxu-*C zcXSQYfT}V^ak-E50=lE7>5alhy*h$_#<;6%StmPf*CbYw!EY4Dvb zy^WM-DH`YBn$ZfQjAFROp5h0}IW@aysV&gh-z$#Q5{opaRxe8%7$THYVsPVW>q^5F z2L56))^+`oUP5DT7;>l3)|fdJ8;WVzQi^EvSrS;-pd}@ZvZuPR>0YU$->$1+72Ysd zVb{@z1b%hJYqpz8-XQD4eR~?8!Z*H6?6wSkS%;dR?+zRK8mgMEV8Tn5PMbT~n6C@g zpfNUg6O8&*nOBg13Wj3gcBkHM0rdB*QRp(PaE84uGqn_fo`jyYaf4^&?fFq{ZXl0f zC5hy*?rP2gi~*l&ZHX-kyAf0d8_%Uk2E+x2KAx2(0({JJYns%&Lk*mayLaGq2fa0@ zn@GghwT(gxwu0J10O$q>{{UXHthMbX95xfP;|d*CXt`HAdKPXmKi`x&n7l`d`d2LdLUn=DRvPNRW^=Z?Qh<8PpSIz>Co zayZE-53jCsUCh_oexRU6cqH+REy8SjzlRcR06e;~hcI z_5-ghDouxIH)~vX`_{T(+@mm92Lx#HPXg#shW^&f`7(^Xb~D%PqyjHN$X0 z!*?Fs9GqwHrp)bfzHF{H?!f#y(=KEO2^bh03=Cv`HL)Vb#&=ZtKx4F%$5FuNIO$W} zTBWlE10-Y~r_&kfQ0dW`ZqTpHQ0^d(2&=6Gw-Yy;giP{J81|@gvl?BDV;PacA>H&9 zy`*V}QNCMTe2Mc)-rwEy_7zG*id&7gppbB&4y2wvtG%(dhefjToZ-*SBYK~2r}&=r zoTs6rVr|JRX&;v#PJng*e@er@@fC)gzEqEvAHtn~A5X-J;dQ?iOEa~$o_4Qy9e)q; z{IOiB!z{;qr-RQm5rxZc$6I;hJK4_5C0Nv-_mAdy{XZJOmiG4GmzsBc^%*$+l{Kx3 zNa8R?PEI;;^{r?$wl@W5+R?AfdW?g|Z>18c2yPLCrLoNj(36mV7XJY2P!SJoXWZ9n z_OYYFs(=7;dVBH5e)S_k5tIoOD8bqQ1fF@$YoF_@q)oo8`2X1~|{1c9~ym3^TyE1epwmDz3VxA%cpsjVZR*cA} zt9z96U+Mz&%6Yj_pP=YRIL`z1uBs~- zK*E8yjAxDC>?HbvU^+%e0Kiw<H*t zH~OwRU=V)_?}Q|cgl^AMPKpp>%c*R2-QTx0hu7v)p%czt)_Ak$M*MJi@AaZ69#;W= z?-@RsuSA|P5N+U=Y#*1~ABHQR0tnfoKK6qp_5zq|Df~__ywSl|8-l z-}0>%vVp+ZHn0E!Iv%;mG^*K90p}m*@v8_38DMxB{Qm$dk8La7;mWo$qIkmXE0TB_ z?Mm4Lj^nrKSEY~V^ME;QSa$_~FcW~?IP220 zHo%1K>V0T+5GXRJVlZ4Bngiz`^%Zcg{#5smXeA9T6H#;G{iU@RG@=V3V0L{$KspPolG>ug`$ueT3|g*OpWVM3YRp|Ef!af zMLAsOnt>Z4rNQk?$)dwyhZPV5wLN%Ra;`Z&X&K(bK*uJYaCsEX$_{DU!Jrx#2Q@OO zJkv2!{n5{Q1jyUaQXWM=-lHd)U_@zYcpWK+nnjKj(rEXjJ!k@5nsXB&X&RUO(k8LCG+)VCzXR46#w zf1PaVQy|l_zr+Ci{{Z^c%G|zi-n6pcNhPwt$Avlkx=_o4(1J!JVQK*wrx^jEa%e3p zA>dT#n52yfsa>{=DCVsg$=^gckiBU`3eHIzdEM5m=YV_Am^fJIbgf1!G-Qy4!7K^y z?e+Aiu666%&)r#kiaNPG{e8ckV;`7&+={yifY}%#7=77qbKCT&lIm|tS5_}t{{U#u zxP})v9HS0@1Jei&-H*#HSx#)#ui;wY1UQr{010f53V->0X*g zHReD8GY-U>(i*0WD!y4MBia>&(Fb00$fk9Z=qsD>rT+lhbkPGGvMNesXR4jm%OGG=GwDw!3svT3NL`}?a8r!*&uS4*LXG^=g)u|R9<{_vpFc*sXZmQCG~eCJuAEn$mf`$8GkDh21A$MhO1^3fXC*Ile7f&RtsFY4(3)vqol= zgDZdm80w?-tgksO!pA#?ZMpeyNC&1ne>_%>t*A?NW4<;E=A3Qx9rNGPxi~c2%e|r{ zW4jn2WMI=lrSvFVO2$@iF^hxL^VhvHTic;{)2xioo){C(Mm?*$wD81$V&&B~Ir>!T$h&;C^|e%SSYj-b|#Z-MayR8TZFbim@h*sLokZ zGK6Q0@HprRuC`r5&f46~YJr0ttGAEDp5K*ZCH?)wG}Ez;GF0t9CB|9AowNtQ(uVo7q5+^2A^PjC){ym1YZT z-9f~5tGRQ6-2my-;D1`~bgc&0PRz35=Eh5&i}e2hIjrY39gQOknEFPZnqnKPk^A62 zRXF)aUBv$YoDX{Ad_k{CsK{+?oA+7ex^Djf1s%P5p4ijzhPCHQ{h4ZT2l~Q0p3BGU z_YiilujGmuL&M|U#Www$Fdu^k0a(h+O+$0MMlFjnq^v`&b zoi5GW%)5;3!73Dt@-d%GdQo0}&KC+%=aq-q+s$I;OOm@706^pe{Hpx6vrO$GNMmI@ zV0(9~P)72ol3WHt4hK(8z5f6znZvwNBODQxJn^3Xm8AQYP3%-g=Wa>vG6B!H`eL6fQ!)mD(|ExI6cPl0U;qdB)GP(O4(?75InP3Qz|A(&UaPSeKEx>9#rIH3~s^6;DOWHoi2}YbBTs@tm5#;4e=Y==T%*nz;tP^%TvGR`G z^#1_sQj;CYaT@Ljcq0c5*CRdZP=HIZiQR&KKT2|J3RQSq^v^@-$8UP`Tk3QWK-XId zmu`6+XSYxOy*eqph)E%v0FVz~Tyg8$ibW_viH>mC=dL|-ib*0uFj$Os6!gBPZIw{m zF5@l>xz0yn=sj`U^`w_F5yDoN>8^7o2jx2o*NhtPr?N6*wCiPm-%4YP!QmbxfOT27ec!{rAT(*^s4S#AZH|W$9fooxjj15RFlhd>7KPsqzH08 z+!K&Kz3S9+C;?lNYNl{Te_!WONSjVaN|e(c#fzLInE>)R&#giBjidrN9=`PAS>ojK zgkbm0S%}4W0x-(}NzZC-ZYWJAJ!JS_tH zq#B&ayzN}^NFjMXQoZq1ODnZW_ z$YYn~se^W?!R%?nie_w`ROhc1B#pIc5EcPPH4LPa^rmHNu?92EOsSfxxy@Ze#%UEH z>J)Nm>_H-VCy%W~DdLD*6wKQ9PRmV_6Kt_cdCwX2 zsI@dm*Nj$75*5Q|uN6Gb9DK&C<$IOOqb3Rb>Z=ZT6)9o-B7g}z(k*B)RGzhJH0F^M zRoJ5>a58%eq>SY*g!b@xj3Wmf$*q{|p@}h!p5)aSplfyWS%G8Lu1z>wV!-yK*(x?U zOZ8Qlx^^_F$Qh{RkT(?QfxxD>E?X8yBB^h9WGtBHs6FcFsAWv^O{hew+`?8irTBxcR1@M)Vtw2hen>VubZIabn||6cFc#Yhkw9rRBQ$bDuds+WW)t z@A%ZMEKYpuQ;c<9;+SC_g;#rFoy)-;#Xe5Ndu1<(?R4ElPZ&o(HEk<%UT1GSw(-5D>wL@?-FYn&kO_mE7jCVNvvBw|Iuq4zZm9uj(P&#AR*A>+bF2d}co0OB(AJ6Xt zQ^(;wG#tpz`R+*mfK_`~lgQ2zDPTBDXqs71Qg|6BwmCma=`{ZU3^bc&)EJNl5s&I? zvbWQ0EE6!s20QxwN#>O9o%cV>AE$Hv0PZr zwwg_slL7tgfP@~Nr||xDsjKSN+H^j2&9zs6gBd63UN5O%O{(6t%$@jA=sOCS#_Xob zu&I(yGEPZ3B-d4?*`ZM+oCB5z9mP`9Y(&a;l|h5cdiKS2N{gr3kiWb|=WysxJOX&* zJl9fIFmC2`#pr8e2bK`0EXqB9&*54cUAn~&n(i5-8?))3^WL&n)^-acgZH-)>Nqvi zMIDvl;!@0{5TNwnXODc>nU8X^R?zLj+V5RRniq5C3YwbdecmIW!yW6vw#>3 z1bTF<^R2C((&VP%6gN_F&~u(EJ5ZBVl0a=E*sA<6BXI;1j2@NeK{;6Ll#((G z@>?v{7h9xg&QZuD5Kc$u+w!gGH48Cs=CMS;!BNHz2OE8RS1kqm+KF1>Ns)-%k%Pw= zBhwtzTA-fduk{@ z!K&upP&a>Rl>-=Gfs@k!@!O33GgIg(EGqW$BM&XhhX;aB7(a-vgqC&l6b2p19gjV} zzlC8^rz3GirOcCMWS&M~s}UbD9f0@zPCC`l+t19TZ8#X?xA_#n8C~2R*}wsZIraYl zK9w?{^4JlAMnO0|Ym!zp5?fW9a&$NcAanH1Rkwvw5wI0JWFB$Qb?a8%XPV#2iLl4y zbDU#6ao3!5`qfDbLcwivRA3Ro!0Gvl6kV)KV#^3dWY_^8%BVETF!oM*LBCvX4}(~KSte_C-}%-bR)x@SB%&)|PLjIID?C3DH={Ewwhu&9g}&Idpb zVd+rI=S6}rSA*zz_N^C@EMuV~2crydIjH0giGZbpb;fi2#(Px4Cy=qo!Csi-nn{(! zM>#kinayn->`N;Xg)(#pt~*sbXx8D{X)*%v2l@RfT}7B%ft&(BZ4^*x6cr-yd8p~Ynqp#}4-{sSm!$$0iuc_gM(~*MZLY7Z z+DEk`-6Vld;&)>wZzr10{@wUn2l~4({{Z&LpZyA#F!@gu6ye2v8{wT}!Wz}&mU=yc z#OR)3W`;EcWDcN{-n?JNFxuPrn)Vwc5yY|p6m$mzb_Zdc(3qOi=Q=s5lZt^(Dqwle zD$$gQ2;Io1uc4$+-EmF>sUKRSHb|i6nBx?v;GTFivNi@f(j!}tsmBJMScAn!o@w2= zprXRez3Ng>TCTTvDojTAkEP7LEdedka z@lU1-c%V#Ub|5s%}~*@{c2~eW>Oivo9;D=}y2k6WCm=0^}|f zjPcY8tsTY=*W!gF#VTzUo-o3%X;)ukpJbov--Djs^;uXo44{f`HzqT2XMV0W*PLAt zbt{5D=c9i*)V0-RwNEBrnE>P4{{XF65V2<7-A^a$SjHA-WlD;1(5VbN?&M-fRde`~ zdRIWO&R}IkB$9bQ;Zyi_$L%+B%ERtRK>F99#bFXIF;e8BbSh46=3Nqd>{>< zTvne!RbU%I7{@hcx!LJQU>>zm*UY$ZR|){!-oHw>Ri$Qf6?^ph`k$vQjPag5 zDkRE9n>+h!kOGn%^R>7?siNmkNu(2_W2hjUisWL{W{{B=%FW0a3y?a1anG%H3X%xG zz*g((GJ1-JtUboT3Jw>b;&CG=$l&bE|3od5%f9GW3l;VoCaE{{XFAuB+oXVFnF4JFWyGb3Aq_@#+?ZJ__7|!GUJwH0uH1DYnb}$kP?OyCpddy39 z>BpzHwOIbil3SL2p%9;xbR2z7YqqhoiIPbp3S+@t+#XL~^Y2QnX=F^0A(g?#azMwX zI%2m`NXgB!3dcm2O{PK`FiFoisUfw~;FEpD$Y`^;Mx(jU2d^Ab>N{<&c%$Vr_4AR`@^~SYX^1boLm zdSg5em9eKa<_9kgUOmM{ zXXTqENWd6~Zt4a`I*)VSrfo~#wxE+*5=jnPL|#b>dF1EU+wi8LoJITf+vou#5GvYR znK05EA5eY$X{|I6H05lxjQPzd=)2k|)mwJo)@ zw)1WrE~sElRSiPyyo(L4Hyoe?x2dl}2{_%D$?IfgT^}-M zRKets2OTOFfEP$f$#0p+{tzpAJ2Z=8D)I(N?oUp>^E@DAzIn00_Y+w+Gvfm8m+!VO1%e%&JembI;-^5j1Nlj~wzn zxcsY`)w(LhdF`A>@?#`%o(Jh%ldDBG*9Rj#b6wPTHqu4rXJ`rYFMn~4KbJMf-bwa} z-atO_!uB{7t{uC(iK9A603wkgmE=(%`8N`9dUUHo!^|rqG3Ssw9Ca0{k*Ftt20ss_ zZ#vx(4VG=%G{_Nw48a(88V5spBv zu9gWGV*qfxezhtxu?19t{uLT>#I6r+eW}RAe3=J7T>k)C!I%cvyDonNM%e!VyZRcG zTpVyX{C~!m?G63k=l(RcDF4v$plMG$(`cb~O5l{3dphq+V-Rt6^dRm4PF1z~E%_OQ`9$ znnmN--zLeU#zsNvGB8IRis^nFk~~>#JyuWs0Mx$_&U{yL52Szk0H&U{Giytn<%-Qb ziER>@3%CI~OLOmky=~H;+;aE<5c@&3fNgJG=gf}FAD(ZeKNJX`b zeT&H7kYDkl?)G8J9#+xi8g89;s@^4yif@(kfsi_KNhYl8IyL@!xB zTE>gCb_5(}-;B{ISaj*%bL9Xlpp(OTvS{nB`C!`-oxz4c&fZ5}wa=}4OELcdg;}5W zG5-LOu}!-f#wp(Ciw@?xT_3|*#<_1L&Yc)!jO`_uE>Bzx^{jm_PPx_Z;?wO0URKAj z9m)0sn)+i(hfmUyJp#=9&_o=L_$M2WyBwNQm5PNvZO@pdid%VJ36!hG#aJH191;1} z#g~TlYwa>kUe+-1L|b>v1AL<-;Q9)utdez$!g>AtpZXE6Rq%U%#R-0WJpTaw7Ad!6 zOd^|Uo;Y%Tm9e7e_qyH7T37`xs9f$i;1EBktX|dWKMZ4b*5;S^R^5U6mRx@$RNa-x zjBe6rC2?mxjmz3yF3BT1S$gyMQwid>yi$MSqP!>mdVfJ$9u3e&x2PHJMs4k|Sbun) zi}d54{=Hu{mD$hi+n*{Z>An}%wRpViSa!yGJDs5YJDP^R@Gc3F-tzO0@NW@Bc21B<$hbQ!^T9=2lohf|lsDng0 zx*foMdymSxyT27(UtBzPnSvxZ9hr#r^!ioX9}!3+md{W|mnoFaFhSsh?OFR--sb-R zRic%z^E|~F5>0N(`UP!zzZqc^V zJibr+rmj>kQImZSGP7BWfS`5x}ed6|?@)zWW@Yn84ot+keNUdN!}BwV@VPSW=*5 zfz!|r!lqKQvMQA|DEmph4g`2JUbl~NRD5<;=k>*6OB=-IIaI4D!3Tm3bS>hIR>M|M zWHQ7QZjHIlbDSQa*6)mMAez=4UJv5Jk~^ymsjVY9CX~9FR-sN&bEUf79&ISkTDhfY zI;N&~S;R^Mg6+coXRqN}Iv$dBi}klB5vbiE{{Uom9_G4F68M$0#u`SAwjmJ1vX8s| z%KbZ%`4u_^{F_xb3~>F4M=)mQwKF2#nrWd*F6`mN&Ksxy74@--1!!&Rw0~`jmM7M{{Sv)GT&H^ z_Q&kkc~XONN(OPao^w^o$>vPawbiAYb+yh5?K@Zu4mOVTmfo>#|%wv>ehGqjFpC8V)v7O6TcaU2}_DBctkTJ;oeaXdOO*D~|V&!GXELfZ` zA6na;L%EMlkqeW80Qt^3?I*8ZgPOp1Ss9i{i?HLTu#m_hCE$1gjq^-+pW!P`-E~g$})PdKKZThEWrpcv2+R;hi{m1gU^1Q>y+27?Ct{F z+Y>wFIc%J-89sxY*4CXJ(x8_5Qz_aoGB`QUUZnGmdRIk7?y1PiFIN;u*9P`Qh9YAJ z3|R0;J-ztFPAzTD3xT|Wm=}!2O*pO84z;40%QRW!fft6xLGmts!?ZrZ# zniX#1!>A+Nn@3aTAkJ`cjBr<*EYa_AYGoHN%C-4;c&^O4WgYCfN z(Ufk%r*owPW00nG0K|D2=p^a#(&p zoknjLYnCO5JPx~w=rQZsp@VVU7?vaEVtX+;IrPW!t$9=vW_P(U5=^1laf8#Y5B~tJ zk)tGWjGjLZf~)|=v+ItOll4IcH{{WuV=*hokjF#l~(=^Q9WMy(Oxx4!h zrCW{!b`PJpenLHa)wI*nRt!$#*ngkrRCO`sPZSX`%Bd}Z)3DBZXP#?~d+yOMZOeCz zMUso72OsSo;16unQ%n*NPu>9W{Igf= z+)~h2xeddmnr(|4v4BSe{{Z^4S!$a|X6nRa>p?9$tc~nFKTm47$R1URPT&DJJ-b%6 zY!=~FCoT)N37OL7Nb0X+c!06l4w zPYhrL%aOwncpjY9C2bJO6Yf~U@Hqt3MK@%j6)VUN4%~WXpaD0KF}tZFoYj#nMih9m z6cK^W53LB~M6$>L?~(6T_xXwtf*9i?+uEdM+;TIHpW{;H+=hrm(Sd@-m(Gj(#+U5K zdE9?mU$Uq7kLyLytbhN}@tP?5QCgV_1r)16^`Hc$6qO(=w5c4PhJg&FP*{ZnB=n@O zWAMMjmw9yUa(jf522`D++Ck)QQQRJJo|HFXrE_=30BHUKx6+v5h=u|^N)5;LTJQ?` zTgILf)I3uqxlB zLHYKsTj9vhi!G0$$ba#}Uc=(ecGtr;QqOD@UfvuhsUQX1eUxMI{AstYgrvE3IDd#b z{86HKV@$%s2wyjEPnYhe&~-le^sQfrCmtKq{{Y`l{T6G)<#{D@B#c>@l1b!}dYbmn zh-;4xY3I^JANdT`TFnuAsWXJ|ebg4-A+>;uX{COF2l5oZ7C+|SDR}$Pj{=`T{$Ow&Uy67!2AVv-wd@_EVXH@Cp&)Dpdmds zrbr)%ClxNc@bg-2R#|kkSzwvVsVo$xw;Hd8t#!L{ z3dB|a0N@gUKb|RG>=Z2)jtk-TKjAF3`bqx)pf!4>uCA%$Jwrgc!H(e(;|HeU8txy8 z{{SlTzlVc9E4Dt1C;otH-;J)Ou<^8)upB%_CsXbfX|;9{m7{+%yYTOZA@H^CrL11@ z3^@?7*)@aa^~GynS!2=|9=F5lIn{sg%Ak zfzAdA&p79b+xS#7V}0);575$UOR}QZGEqEaSF`^B%`E=_fPd|3@qu4P_(I+Zydh^5 z$PSn+LFw|ySZC-(RLrR>wvKnhdUdyhG#PwDs;(|2P89V3{nQ@pc|M{Rr%8+PX1=<(8&$*OK zczoy<1YHm=u6}13=og~<<2?JC<J{-HpCS2dnBgdbP>Dxna6Plg9%b06l=OV7rj% z{tmQA$X)3WJ%(6rKbfyB*0mdJ{YCC9qFA87R7C)MtI(WxHR)Of&6kP%ICNW+wpf%Q z9l%raF!mg0{{XK<)`^aU^^^`x;aiX{txnbhEWI~l`qgNz8_yC+ka}Z3(ADVtE8?3Q zk1F03k}!B}>$4w1Ll4Tj(`jX(TP~@tnB=%o@*?w=^cm!zd|**@wg(wK)s80m@;hbu zkImR;ufNj09`5r@xA66)#<3Tj6C__Q(BCmk=Lhkx8o6n;E6Fdee)OzZ`g7QO3iU4# z#K*#Rp$2vcjy-}JxyNgm(WzxO9*El0F7(TdI!oOG**B;o%L=iQ!?7S9y{pN!Jzn=$ zzB1nYrG8Nu;3ufT@9S4QKdVipUy0Nc6Y(mJS?+oZV_VZnr}C3M3NVOZ-@jejhjZRcYli%_NQ0n4i|O{4J`(rs|$t#0ckI zg^y$WB>Q%*!%@&CX_|W+GPy0cIKe#e+Z3gw-Nj8g(Ta~l%CDP#sUh^h{D7}a*A&6w zD|n^hw#2wTxXvp#O7LaL)LQ=lRw}WE+#?4iyYtuzsp8#cJwoAaEt_;ulae|!dwUAB z`J|HQLyM(Oa-Urh(D*OxYo^OODOm#%D|N^mj1ORICTY9^WND=hD={od^LZz)rA6Sq zN-KMbEG`HFd=)3A;oI>QQ&sR*q?aso;MVDq39b?#8g2bYaO9?c{3P z_^ZSAg;z%2*bl?`*KEzTc&d}b6!DmD0A+rv zYGUl}YbB+RF4LCP1ecnEI|#9WGs!(M>U}w^TbU)eQkJSCjGXNR^NwU-x6E=!;flW|i(n%2FPO57 zzA93FA_Q&4?Lb6X<^P}iU+Ev)|ldc^I( z;2d-w{{V$qNe#84oA67qgL&wfumJt~V$ZK-96V8=Wu z=bvu%qE<6)GUV5Z4)=oHRFDYDlada9`qj={YkHG0M{I%*%2WZ*fAFnkw76CBtmPOT zc{$JWsy8Q4jFn<`u=}SN>*#nt&W47Wn*n>7w}v5r&nNny>-biKY8LazKG7EKxcPx0 zusG+}^89Nc$s{uQ@wUhR0B7aLYKLy}0KsPC2mEOibVf^OKp+hmZVu6seX?skilZC? zdf;cKYf8;v)2zPJdmiR~BaEI7F_WD8){UR`M9t<#e6}inSq~hZ&ENB&NW_W!fTefu zAhMDHJ4dE|hv`|Dmv?h1Nm-;sJaN;h8ROj7p}Y~vwI1CcesasfDhFN|2u!`;;5owx%%v+rAG%v?a$;^mAh@{mfmAau`M4nI2av8pObZQSpm-L)arqD!O^ zBwMH8p&XD2Ip???I{H?=ojS>EsLaml0xjP*e*5$ccREy1vq5|7}K>Bggn-aFeD~47%<2?O; z!}6yw3?4nej1U3m{NtxeWKtx6FU*?;c9KCIv-JM}_10H*D6MpoM{DKdcJfzp^NXhI( zk!m}euOa1@EXoH64suAq_s(l38;h%}B%V-Qu{%_sMk5&gGuPI&R7B;npn$*-dgmk4 zy-pyEWmJNLFSnkjIpqF5>#q#CovdL|+fxthz)G&*d5P)o*R5M$lm(1->N|?cR5MIv za!?GC2_W;wHFaF8_;E5rszg1whI49D3GI%%o2m%==ZaIOEel{bNh^bcx>XSp#86 z0FK{y@Hy?)rA1Uj<&D@K4_*(xd8lQPZY{!?$nyux7#x5(=jn>NP;!=nld>}{EZw9? zoR>d%p1ExPU24v%ZPEb%IbuU$dV(?2uRgf0p4P=}qB2eZBzkle&t2)wb2CrIz0alv_fAe?q0@5+h$)23xXQl@S@T9u9v$2rD z0{QKnm;MF!!0TDBKB0O+mB>!Pe(n#qPtLjHN-)^fw)ZtIX1yrO5k)J|FU)!M^y0Ga z1oO@2O1U6(0QKq9=}T`7$Cy)q-B_;}{{T4^avO$Y<;nzzI+ORa=sjwsX=uY^Fhr=k z(@~txZd`fbT52sJonx0k6nVLwdc`f6Aox64<`*y3RPk={)7S#^sT-PrmtY`|x z2nT5A-zT?fs_7(|a(3kBpH70bC4$N!=0_mh4nmX0eJTSwV5uEIB;)+{tlieadX>ez zYFC0zdJcrts|poob;jd^?fq)V@)Yt(3(#YZJ9MF^fwHJ_eE`K~+=XUm$(UR+jud>} zxIUtqjAUkXI8)Q#-~1{^8}lI<2b`YWc;nuhgUcd5LXJnZTiAv-%Kq~V_vVi&f4o0B zoGOqB@Adxx8eNP2bN)202mjLXnki{9TA2zd!kbPUP=v)8%_9sNeml|=lg&`BGQNSk z)Slbnj8__c$Cos4K%t{-FguhHkxo@nlf2~$Jj-dYl zdg4>{cK-kxr$sRrmr&FJ%G^pn;BEdj?kjT7@Ui4FnP16Z%v*8ElaNo)*MS31+`&qM zaC(ngO$j>_TU^g+GTd7`M)ROP-m|auEB!)6Z9-?5#x{cIBo9iC-s#|BEGG^yLG&Y|LQNew2B+C|d2V&UI)~Oz8huWcLBr_iQtGs9qgMx$IKOv=D?cezO->kjXuS@+w0vzb8&qu%_06LB>rB4rju9H=CDmJ zS>3IpIatZyf1cH!%^{#JS+%>lvYBqINgE{dm)xqz%1Q(7!^!Y z#R3Y^u+?=vFtO9_B!_-CY+?b&Op4AF{9scR>@IOyaO*myy_@OqT*#L1kkN+udF%Ag ze_G3?KS~6IVslrlH7ortQ$C+F!sK9-ILP<)tlZ?(qJp+2l36E}=b4K;v1Vh`lgTvG zNIC#oL8ZP@j=a+$j}>;#_U^)Qab+t-AQ;?-2M4#(sRP=iS_x&@?rtw9Yn!JsNarla zsiHS{*gRybDaa#&54A$HrLk6G^=D9?GVvrx5pNp+W9ACS^B|hT)HQqkMT6hY^JAvt z!1@k?v&&RO7Nup-(Kh#G$YmP=HKzr{&`2k@a*n))Q-VJcSct3!D(o)c?I4=8%x4w4 zI^p8~01*W8#nXS^E1%C9thbux`crXvBTD|RNvc2|{GP(E*!jtFr+>&n485t@Es>Lx zlC-2~*}{@a0p|lhm33DaGrgd~GHXduNT#cQuefx^ATWJ{WR(@Gj7Qv~%a+2)M9x&@WBlfP#MbhPBdRr=^+tS`ko~2vHE9}Fz$*|uvHUn6 zgX7_MPNmVaf8M#{g&b{VM40l;Ew*4oer(OP?I)CzG}_Zop`&I516EIJMw#j{VN@` znX*_TueWN`LkDwO`4(77i~@QJ;pZ|$b|D~+qZQag1?*r#>To@A{xx1rAq(%4O@joG zI)D19GLtzgV|uPaNK?LYYpa6(=~ZL63o0CEclrL6O6NtWDvB(MeQa*Xd89hL(vm+G& z06<1T9nbWl0ln2{7(y~xdB6wP9DX$|+g3EMp>}(ex}VIQw&ZOf5_lar9+>@VXk*jv za**v;RUiS-li%>FcN$|O1h*y3yzOCwj^9&RQOPn$0NfipNX|b4oMNR(J&U!DhfRj` z$ig{HU>qI2G2a8FS=3(WMq}J|5;A>y=YiI*EUyi+v#=~tT!Y6s&!=#IN=Wr7?+w&-#~z(|s~W?LOF1qga;}Hv#(3w`rF`{uQdPMn@;y3kDjdjc8{;o; zF5;k)g}bhJ9=TrrwCUw};`<`Mmm>g1>|}K0dy3@e@eR$wh`>x4H)V1&>5*McmE<>Z znMZst&5$w%PC94nQC|-_cAG_Z%pd-> zUs)o^+<6B85<33?^~Nz(t`JP1NKP^{x2W&ir!~(RYpJ1dD=-J2my&Ugywn%JHMY$2 zkO0PWik2eix!fF}BQ3!spHWrpuH~89NzjE-aoj2He;U%1d8Ml&a#2jTzpD`Vm^Yj%8L=jfoA0p@RALlh`a~{?p zg&ZCUI34)UO7Z5J(C9>wqTDIJ=S&>&^L>3QPR<3vnU|sAj~>UbdXCyQ2*}`LsqI)=wy5IWmIBcxaEv?T z@r?8p>S1D`9(fp4cXmdev8jlMmV}d^m(z|bjkq_LCl4pfj34WoyJ-WgJLd(s%N+7g z#ZQy~Ac?iMJr>D}W-N`D2wv6lya8J{o z4`WY{a*y5;NZ|c@3T)99P|n<_$j7gyed-fV_9|B?`C()pS!B*~RGj0#^r=i@IKn4$ z_4?FwcAOz8^Zx9(!|DnnZuxgMe|;x#dp4O*HDx zs0bUm&(ojItnyoMKGm3swoGU50v9~zo}YzT-6~2VKn_QKy*pMik761m@*+H){{XEX zL|%{j(g7$KC!fZb_nyDbr{*gk|I_iT(MBl6YGfFt9ceQ~08BVZ*8t^*H62P%!oJ3w}xE$e=}S#>BVbk`D>s%FF7@&dl=N(=(Dd` z3u~h^EUy%wbgu*v!3;Ye=U7B~R<-L&^U5SSC5bhgfsScO0+xg%Qf;Y7%_T`!7WYU-o6wdkri?l`LEFmdd2iKcv;mBTmWK9!hV z*~}O*x|5K4@m;H01v{avZC1$2qUtUrLC?7KKT0kucQZ8iX1a}e&Uvnu>-}msp*7Cw zIFjXLJyaamK`epg^2hMi6D~0bfJ>>po>s^8wGTS+>G1Nx}E2VvE$N zsHgfse^vffN*397^%bps8DJRptZ7ck(Z33%u@B-GRRbY~AoJRD zy@{U5h!;E)gG~g3f^$!C-k@i|%~>g2l)eVx+nR_65sQrc>+}Br^}dwoPUaozIc_5? z)``nL6nbaUrL$^j-pIdj@i0q>^R%#JA70fga2(g|tHX93Z6ib2B`sT8mJMi&*rPM`&AQgU8UKK}S*ndjkwRvuDrOm?> zMfceTYF;EVG|5T zDC2Lhy*64!rPU#MHne1KJqJID6%E2W+q9Z^LX1xBpkyB4R#QbR4Yj~bVBf{x%a4)RF#==cGVf8?&csFQw?7XnH5ufmv<~2mMwq)<0sRa z>V@64%N4qfS=j9xI{sZM@Af^k1#VOVWBG!ChREnK{{Yvl<4q@XM>~`+CkElIfMQWq z6FgwA2ldZAYn_+(gt-J9?dRL;=~uqXbuo8npN9L*$6s2w&|5rm8?hlFzkqSupQSc5 zWDQaUvTJ$b^CVJAxj4ta*Z%;mS!R2NA~t6y85tzwjB)r?`^z;FlMmcp>@a^Xt!?;n z-Bl$AXqcV@3}tb~Gut`OZ(8QWRCJ@yYnwtm&eu4i9W%kf$Ef$Ni$}S)Hww4IA<5cL zKz^t4t6G(Xie4(DnPvpKgOCqVfI4;QSrf(O5^xkZ@Z*ud=cn?cO4R#YFUupn{?4}k z2-Qx|4`axxSC?&I@gu3knaR#cBe&GnB#U#W!wUnqEf} z_?gc{6inMk0AK)fk8Wzruq-j0MmF^Tau5FiuhOkW82;BW?VNayt(tIWhu|lTSB`{7bb42s!9D$N3e{MuVv49f#D`)Tzo+yhxOiT9lyCUUf;yAmAQx-`Cd_d;2OF6EnU^Ao13=Bo|T- zEdjynkMq*AWJ!Yl^Ne=}y$`EFyR>t;*smjCh~oK2(|yQ*Gt#r9 z^P@gsJF)5he_FF8#uSC>zn&^6FkMPUN@qUw zziE^HdH%J{>?Q~Q)bXlONkwX8FTDbt#WsNp(w-Z!rVeS#obgQwj%CLqy&xu&HR|6D zv@IW7x4vCY-DWYE_L4{-Fm8kqj+8fGO8OpBc>HO#?T;VAD446A#BtW({{Sk}(PQ{! zsNb!QnQoHI;FS)t5%P?mzsE|J%27N5mb(7{9aw4lZ;5BK)04}MRS7}RGbkq>+}Bm` z*Fw?tt83-d?bc$A7*cWw1UEtm$4Yn7;^v3W&ktE0SH+GF<~t%{aHFuo z^6iejznxpKZ-)LRoBJ}_*p#Pu9=Y)jsFo0th(2jwA9Y9dJpileb1Q3O3>v#+?2_?b zy>+DgKk$QjdY0>{+mMg*upjP?st4AtT4}xo@oY|-LW_Ha8Tkgr9{YMQ^~dHYQ|c0= z+Og!fK+52bq+{!f$>*hS>vlIfRr6U~kDepJ9miw%^{%(Tng)-qoAIc^U&}G>$l58iB^ z26K)&njEYO4eWSFYCBi7$*6oYu$Sxt-DLyiX#y7m{sc}>)Mm20U*PRN4LEE5A31{o zodMjtPw^={{YUbnm>e|Go>flLqS$bBTHm|8er^EN9U8XIIl^UK(@KC zwtFa*C6i%yAKfd-BfV9)PYGymcR2dC72wdVx0=NSw#53YR;RAi;G&sLPFHGPex z+Ebq$CF;)MmXKS@89Q`f1g)Ba{ogs+@wOsTt%E+*g^#-{}Q? z1zaSXx-zRqP)$g>+|_1}Et>T`6HD;?+A!4aVI;<<%q&>)y+{E607{9qPX#I1Eq4!4 zpW<^()Vs1pM-0?dr8KU2tZEdWdXC>uX)gZMTjkte1Fmb)wY>{Umr6R`i}I=sTR&XCKzNX7#c?iZOhtvojS)*(1tlo8~ zjzHk|u3G7C#O6D~qZH`=Ps(6wm*h$WK!1U&>rL~3XnQULn zC-{H*)vt4*>BqrMeIx-ckxAYG4WBa{`tj>rC7f3&GH(sHxW+q*(k}P0l;LY!=>>)A z9tyDa2cOof%cb8;f2gR8HqE+7 zj_x++pXFV)o#DHEQOx-%7$6ck_rUb6JEP%EAc)@A%{U;iQ2zj2mNcB!$hg6^c6p7A zQ?0|vAp}Ob!Qf={#b-U`*q6;mU_2Ko>rhZVZ-3@>5={wveBz3G2@U4@6HE)hwEIW z;E9I92-%OAa>V{WOs zO69VBF^mqKE490XNdnDqSZA^@9AiCwg>m=E3^I?gxsf*H6Vx6*m%rshDH{4bFu@VH zazpnWhI(=Sf1OQvY-Ui*RW{>-GJU##DzT(2w_r02tcT~p?FOp54YtXDIeVfkFOQc=@u52lN)@7bQx)SV0QclC~;3lg8hqkQcEnUV{WC3kjyc_ zQO*ygKJF;DnJ*m3W5Xhkx;=>R>&;1Hx;r^_CIKb6W1g5%+n$&MlUP@G4U(Jj8w1Je zbCKVYf6o-8)I(NX)F+Ta*G-fMf(8LT+#1J^P*%zUz>r8d__9a&U9(dkU@M8Rn68 zAU#gi11ATLoby`|MJ3GNZn^{_5Mqz02h{uLrE(he!nMGLC1PCjux9{wA4-|UMhzjw zw$WA_G*$B;2RY{>jl=x&Tei0XP|UpS;Eq8bn5uCJytMhb3&6)X?Vh~-D*e2EW8i{W z_&N6dab6!Qo3Yt+ikEhV@GDG8oQ(bzQb_INSB4l%WDlA80y=d606DJJ^syvgGh@>{ zkF8`$XJriKVm^G2_f9aXN2wg2!o8|=Qd;hE&Q9iCot)ChE+-(jV7vkJ1HLP)w}uOF zQF&rAPCu*ek~2i9Gz{BOl$>L)HD2b~W=4@f zX2uu%_pVD&zFEFl5mm-XBl`aU`l<*u>)S_Fo8}qkaR;?hLT|X5g}Fdf9AlA>^Z3^( zD!Ml8``~)ls@q-J>aiJDXl~&5>)yG&UqNsT*5i&oPWe4~^ryK#hZ3$ZMo9EIra^FG zVqYgceT^l;y0+ICVe3@GM&}KmVmf{`oRO?qs}jN=a<>F@KU|zrOpwT?R&WSC{W=fj zSgkK#Eb&OJe&IYfJ$TJy$ggutmRw-rk3Q6qugoOff&M?OC|n{&1{(z6`f_QJTFoY0 z@W1D!T8S=1il4m6Ab%G<>PBPa2VtG3gU=q-JP~!=Fr$H=PNuBf+le60BX)N5=O0?D zXiqVVz9Y_aM(DrErig9`$i*H-&$VV*|JCuVQs$D1)W}*XX=o6g4-};OQc>+d3&&da z&xAjBQpc=6`#pG-dvC%I^?HxiAN`(`wj6gnUUP}${{VRZ06Oiy8-K{%ZT{?^`T?#g zar^l{-apQ}Pln&}H(P(ZC;otGy@75s;xGJ;7oSMK^jg<%@Q3|YqyF??`#o_V5r5=x zy!u7|0HW5re}p_msQ&=H7yi#l>^1Qm7mf9~wXJ@A%zT@7Xrf-gDZxMRA~XL0>aKH7 zo?C0^E+II0w45uZ9itWVI-~FjzaxO z{WDLYJF~v{u2MDAALc~u|x)_*$W{wV6P-fJ;w z@esn%4(xV!!6WbhS5@J(ZD--kntUHLs3c9JsUf$4_~cUPkXznu9xr`0#ogq$cWhc& z7_$@Hn%MBI%(h-3v7Qr*%&2|U&eQrDrEsY_i-N;<-F5GfI^+EFU4Mb}7SuIpE-|_* zW)m}xnH;M9ayoietyvgGO|)!$Pk~obx1B}{#e?s)zxwre;ZfZBiT?nuKl?pD;vJE{ zZ?{D%1+-m^gz|EE$L2WpsQwg;9YkXv>VNinhwv7^ig`8h&D`Jh(Z89hdCvx~-huYX zv;Fq|W~mYBRAg=VXZ}Vj5Bm9!{{TW2>t7Q!nXIfL((Tx(y4++V`-_f05`RkaPYmRE zi%lHwuWaz7hUek+>{kcm zjb~BpHg5i8*Nednw=*TZx)+ho)m7w@eJk7bIMc#j13GK4^XF3;9<3+e`~u`>=}ujV zr={8E{s_|J)x1RnQw`C@nVfos=nuByGh1I1HMuUeQKUvliqrzbvpWpu@CO6&qv3p! zuZSf>)$Q01`{_+{UN(wod{KHP1QwHU{{VD=N9jxL6utwP&3lK$BxpPtV*_U*NL1(A zHva$$^S=i8dTo1Fk0^f43kR9IU~(7g-9DVxseDn4&Ecr!jOAmvMkIO_W&UJP-l(WA zb+f=C{{ULQQD0i!>K5>77TRUNAL)xAT=XRZoxg}D@~@KO{{UFO?+W(siWf6kOQl|0 zow7wFj;GvgB9xY+gR*SkbuSBCTlla00^A%;ATb~MX58og0yCeXuWK5F8h*8>_*%z= zNLk!^Dya%Sr;>jPw`p;uYBrE~t&{?m?05eFbx$ro0to#5Ysx$!sY|Q)?X?-Y%p@Rs zF5D>m1_c|A$}di)H;(@Rt*ieMrFiRDTZjbvIW&AGyJfZO(x7$l-_LIs6Sx@e=wCBT2RJ#-27S0L%yX z5d5J1Tc5(0_exfOyft;3>2+U+t$#n?n4^*D`{9B34lBtluGT36Hy<#sPMqW6WMuyU zaX<8EuN%+rl>3UfJ0@XXJk2NA_MeHZwi_ewC;rPx;N30_7fh4H+Na5s%wYCUU#oN; z-&*T+?Eq_+wmyISd)t?J2lunL3;5%oYV&^`cz|kGKiKvyi+f}9k6SBGV1;rxxSmMo@NK2>^}isaUwiTv~)Grcy>>-_zHPXI~G&#t2Jl222f zwd?*OhG{%0Y^bHSh>PQ}3Do;$yqZ#u4@|Fa^r@{ID-}O_DXxca@Zv^W>xdMcjSylz z!vH^-u4egJyi;*$0XUNAp#K1YK0i#?dEmV`=-O?@wWtFhnz>MVh}WOZkMynuE_Z6M z>eFFdTrADla=^6-`^}=}mn0!Rr=xhz>8!NKw5v~*Tw$^O#p553^sh2cni9U%=$<#W zm+dy!sxuQIjgO(uSM%n)^bL+uu9w4en;74dvAuV-t)q;+MxlZ^AHo$Bx18|{0BK<_N#>oI)ntD%;K$REX&}_hf+ZcDFk&K zSDdxo&UYDKKD&)nRGXEVok>%SY4gVVcRf4Aq4cc>`!h~~%tdh0bqcx3&wQVzIj=SF z^|#x#2yBl@8FypT8E?|P8^Jd^h2^yAdRj;q0SoiV&PGpB(zw40J-mJ>Pbd9W_f-0A zU@BtVd6BJ1s+^PP`WrI2j=pPIWwS^D0hA2&#{#I0F5{!J5!`cAU8|ikH4MPvazP;U z^{iEm`@0{hG(|F|)%G>@7@@b(Ws2Z#K)ir6oVI#boF&z#nY6(qV?9b7ewnXL3O};; zw>*DZ!e_Nd5wohX?U9wA zUb-9G2ydP*JwqxIPDj$P_0@+^0?mmLA>3h~0q$jC{u=j#$?@r}%4Hk`rrx8l-sncQ|4X z;h+Asc6!okC(C;)rh#xn1yyXG-*^-GR|z%dy$s^k_UYSs%xZ&f(P4k}@LXkAWJ z^*V)y-@^I?@ZC-woH-flOAG)8Nv|UNWadEIk34=A-$AC&u3I$I{JvIxcIT1&{p*)~ z8Q~zhh5&kSPHLj9awRL++n zxSMz-$1Rb-{JH6xme)a^>=nwNhrD?%y zBRASE&n^5s=B_2ZmXBZrk`0Q??AYu{`Gq{8wY#=6 zkE!*pgIH;`DU4R@x-=U@b|C%Z>5TDETKIo!=J4-aACz?GpVQj2acp-eY1(PNm^`Bh z7~?!=+x$&>3^wYDv7RDK93C_O0M@Ed#j!Ri;D4Se@B7n|bI(uffmds2g5-CXO5@75 z8;W{#{Q4T^TSmCJxHnTiTaGzDDIKe+5JrP^$716Ebw5ry{HjKdSq36sFQ?w*k?W4% ziTo)_DXTH2)~0Q)kfnx3J-w@KQY%PFE4cPi%NmY2ri>K_uU}fBcYSYS3$fhlH*M-q zpzn{ziip#Uc0+P~N4ytz%(7m{Vv9HtuS|B`+L-g%+apD60;-Jh?ZL%iY0}?aJKxT{S2*Cs28RnRd<5kh&yvrs8n8D9ZYl6SgWsH?nAdZA& z=DjA`@*9{H!NzgLK`rcRc9GMZk-_{&6)#e@Jc?@xVo)ST-f~IpjxmbTwbEEB+}~m~ z=L&PU{MLxLD5?}^lhf1uD?%H&UOgEUBgp%B z!Ovs;Dz)?+7N0k?K@&U@FK=9)(|-k_bCCCjXr5=ftQn341*x(^8J z7TONG4yAUi(I91Qm@V@u8NnjCnkfwF{9~(G>wX}gQL)@&kRTg|56Yk(KMM4Jgdgg) zANQjEPhKJ`);<|)+D?$SubpJoN8L>@~TuH;Miq_=t(TMQmcYPn41z z=N^q8Bz-`rwI7I@K9^zro#88eykT6f)Li!q)sNTpuN%22Ze%f>sdmBk&lMQrj!<%B z(#s^$w9_$nb}YrwXGh*!LOr?}nPR zpKa74*)ww6qj1Fg`FRKPsC6HRI!2#jbpHSgL$u=o_UuLX0P;`Nes$vAX>dm(g%me7 zbTR6)GiKzMSICnmInO!z5Hm^09)vUC>=hlif=!e|6oMXV991+M6Pn+kwI9NFO|Os0O;5o*EzVQEC4G_46P8 zge%+pPvSim!tr!ndfdxzJVH&_+yUH2Bd-|hIj;)P?x3>PtnThk*y5QPk6ZwGJXclm z7gN)X^iZhBDF#~C%D>srUe9X`&$>0S|s$x<=q z?b-%tc;eJo!~`{lJZX*_}h$%rx8&-*#WZ+Jsk zw$Sys@9x!%VOdVWk}^8-MRLNPDUo|>blxb`?R9;2<59ES<;$~f;e+y`sr^NCo(1tf zo8k4jk5Jw`;)Pj8N6Vb&zk2hac+D+4X<|8=e8m3%X_6b0b8PJ!1}v;ja+uhFaB8BGF|Exr)U;0!*bfWb=$9(%FUKFCmoOUtouvM z%0!%Jn%PPG#Uys*&f!~yc#!$>@IGUymBN_wmWW2=ijAbi@yUwIJ-!5 zDdY`|N92B5%kd_sr{8!|-qzY>Ge_m+IRq748sIE0Sx1!JJ?l6^`<*rGxZ9S@?)Bdh zO{^(`H89&L$p@=r``&0WQ1Z&TF#HRCwG!5){cL|ry*SuhwC9ASsIt#6y(1lq_hRxo582FE;) zKzOepw26|{E|1+;KA&~C&)`LBT(J8%ZtKkvrkV=4i76#y&94@Cnr&_oZEOryz~=|6 z5z}|m(zqB7(SyMTwT}mHX5?0MssK5w$x6)}hjDf3-ERgk~#oxxS?5ADN{nsH-DN zH6>P8k?nSRjgGZz6xx-($w1Bs&NJvoBR-X^*Kk|Mw%Ku5FhnCj1zBT(lU%JXhp43O zsi6hxM+>dTIm!CwvOL0hUPUrf1k18q6+ZP?$!lV(8^{zMfsZw58OlcVw{gp8uz*7h zeK@Swm`0nALFrH==)=rM1$~Z3=~?%hghnzWKQ=he0-A|4sin=+t6QBtt=B$a1Y_~8 zI{Q(0UNH%JC|U3XOZ~kw6#4hRFJ$}hah9qn&$NaUT-XR9AbqOmW4UF zy-!roJZEVpiuTuR#^`PXBZeoZHLq)bZFDe)4cvFH47XWeb(1*jn(AzCW%+JY^gRLg z;)N7BP3hS7yM0D67n5`e1B~N5RVg)349O?i<-;)`?R9Ktx84}6iz}tMg(c747^<3v zh?l3$g|RN!||YHsEKkr*EZYO>pd` zZW}r1yo3IF*I@b`w2k}cCxO!g6zH@qJ|+%`Bp~s)=ASYbBRSnN!fV-9c?Q@}e(yYF z{{V;cHP|JZ#4<@76T$W3qPxDc(%|1aWVZ^cIVb7sqhQicxZQgU8dZGJXB2 zYRb_Q>wX=Y`Ih3^R(u1P-2VXRK8Nf1isVk4eQg@qy0FQ?7%R`$xZ<~B)HQ7|0eu_D zndP!Dy!K(A*A=}6yQWPUDKG;hkpBQF9Q%qaE2D_9(xUNg)Z*vmmM@Hxv^y9hu^z=2)>CZN&eq?46Fgu$gfI9*0_)%`5 zeu(MfNhQS71Gx4bKLJ+!mzxo(`40pS@v9|cjwY6G^=dLP+*dhysa?!=Mf<40$i{Qe zOz~55OC)UzYj{(tt_D3g{VE1qZ!EZVBfm9~745t!l?+d=IXL`z{Ob!<)Lw8l;|rb$ z`M)gp{!}Z8v~`nS*jfTfF336{&-f44pticazF;gPSmPP}<9y$jOrLMov2>jp;{Dd< z_bVT0&r|Mw1y8H%#?nKkX@4UqA*IL42p@HE$Kyi;ZQMy~rN+|}=gxQ~kIl~?fcjPx zdfuTe!p8pqyHnHUE6zG(=lRw&(*!$27BkHH9X~`jhROPV*{@~ zpZ>Zm1t*Fz84J_f^2K4_YH_C!jmH=OXQ=K;1B$Du>R_X7$y|`7I)nar>0HIzU&k{| zBKctBaRVUd*A*2f%B_7%jBZPDcRkdCX=W?G_;~<*G5u;coS{3NvcnyHI&P$g;um=I2r^fATI#*2AWu4fJYvK{Pn0LK4R~O9E{`AnzIa& zdh{UhYh_ot4jqk)JJ+{;nfiTd{FjDL%aS_&wak(j^}+Ns`0kzqj-Zad)u%cqm78yI zByxF>5>-vfVe?}i)ngLNh8e&) z0C8OMuG1^oqjGlxr#$ptf2ZS61yit8Yzg7b*TkJJ!(-xA&(U5 zXa<)inFN`rWFXX-%|y$J0d7EQc*fvXq5~$b!wFNCp%pnKitaX=VQz9NNr>IWRwjYP zT@yyfc57-0Bz_|}J?jc1^H$tHx%r!+?^P2D=zDL8{LGV{wLb8SB^;^i^sLFQS)1Cd z!0C@FZ}n~YinPpJ9g~sM!*Z;M@tlx0pZ1h={HvK~XfC%(xf_WC>sn^kOF$)n?~IK7 z1v$K{sPb^$-NiPpX9=kJqgvAH-s(NL9Wqq+7{z0GrB&^ps&x8xs^4XJi#5AoS$6@6+IrTWenXDEYNVxEcY1SLGn$)ejkJH= z0qMnPDdPsRZ1SL~>(;c?_NN_!s@0Bn5utYI22bJ5b$$x7DW{vc2hTefKTOvXen_=& zy-oo9NUvJa?Zvf}P%rQxU&vNfS=oe-yK`W1Oe>s$-kbsJPUTyUm4V*OE4xXTF9^va zrg8rO)~wru`=wi(Y1@iv<%p7CfNOUQgHf6|9zo5Z(+yhz^Y9yt8%|0Btz8Yk3WVg^}d?hb8#a$>IX&qhiY0a%GK;fOWa``;J5In zILG<=Q)AP>JAxHs@7voIJ^rbuXwdAGjom^fGEemSn&oHloZuFU1s<6s`ubzGC{4YA z*=}`7ry@H@N6dTipUmc+B4qrEbN%DZaZlqJLVVC6AMYOZ4d%b7#~R$nEO=aepmonq zPgQuco|z)DuC#l1m(PkcX$L^)NYCI!a%2Wyu9LBL8yKx{BAao72L|NDePMv=`>$F`p z?4ZQuOtKNY_fgn>9R4+>xC530j)Y>QTcNuV0?c|0dvX4Lv^$AgsiNa5GB{p<@mSNy zjKN}!8$1KM{{XF8A7yFBn|k=heo%f;J^gA2xey;N(j;VDVCNswk}aIg&6VxR`BhN+ z5^z5*YW9`kr0S!6u*p4`etjtZ(Y>35jyTsi&n@!${{RRd zts03WSJlnqD6_U!2*c-ohaQ0c06OF*v(#gZMQ;&2cNy=~>0RMFMs6kfv)=-drV2*Y zFYkem=RjEEt@JCoaI-GOA2-d%Bz54ET}{596~0Ri%uY$ityq%blomTwD9I%A{(lODi)ir3Ok*(~$a(FMCqWyo*YOknk(%eR2 zgAs=xGV_t`o;v$hK9-sDA{&*NvJV{(wsLDK^KgyPa7s?hgvBMcs3e(=(oPvU(|<;T+8M^n8Wkn)cbtZ$Zm%LkN*H(nr-*6*ul#YxVNWV@l9Df zfdO5PuE46Wz{fo~=Ad^)e5v~VYUR}N7TFdsr>{^wt2i#w8`89n+K8~SG5|QiZP zpjk#&Jw0fYI|#I?@|cl0P&R9TaD$Kb=w7NIQVX1MsPDn{koIVv^ydQO0** z@ss^3&8+JieVxAcatE){pxCIp5NAC;ow@d?=0PqLoup$2xc>kquScL7gdijZOnra) z)SoZ+Q}h1->sD9VZr9}qPB_kb(e|s)`R0E*T(7uT|IqQOGm1caQ-~PNXkXS&n@T7P4ivPMv(D zlzP&hX_*mwQ%_2HT=FS|5kW!&OPXQgjL=nwfzK2c;}rF5bn8qYP%DiFoEx=9aoU@j zMOx*IgHg3JG!Z}~6yZ&!6aeZx$Rk(Fsr6O#}%WGV}=#m(nMA_ zjc(pV$8=|b?f(GQsV*%{av5#9b-=8p`N2l}%UaggC+y9;mO+8|^r06t)4C+Ko6cR5 z4wVeb1;8WFw&v;JM;O_I-#tFHtKwZQ?d}cS zYrQehe}!_fT}d2XK|oiZz1(_Mw=z+&(s*VfW_$T10w_i@+zrjfIrPnI>ho&)c{dTv zS`*N&I0w{r$75Wp-P~MT!J_HPU6gK=sQb=&{D&WnbQ)EciY*W-8jxVkv7{zM-eGn>Z3!@sdvLgY*PeO}CCM*@E8Nw0!bZ z?jMoCADOO}cfPxb!vre`EsfG0#CwHb>eZbWgmm)T?zc+$$tUGgk74~yD-@dSYgy{n zmuu!*IArwz_xwMdU7uI6vclZTsK=0_l79iotmW|joe~v*G(o!~5PzOOO0M1fO!7^8V7UHR!GqDMOD-c6Fd2bw<0YOZm{Epy%N>&}rU0oh1iq6JK zayuXW3-Rw%?Ji=L5g$iEf(ZauZraC(uhd0$rZRf0i|y(%KU!eWyf;2tB}N4HbN)3# zvbLuSERkiA8|E0m^&PQVws65MgljjLOXQFady(H56~8Zqw6;>wsTjcFj&gc>ip99n zb!{X+*ua)1=)G8HuS({`(v;HWWz(8lhLgNm4Z!fsIl$<8{{Z^w_kdcW&k-@mSQ6OA zbMKmb7dLkRTZ>s)k6dF1r*n$G4ug5AKl*b7jTnzC9Jd~=Ty&^a_Pp&_-gP6(%4li2 zwZ+A?R08cSPyJucU1A!1)&U#(P|#5M}S zAZ_g24&3L|@rv}@xy+S|8!s=9nR0xD&-%4FJRan6{{ZW&n8ctu6G<@1I1)r>hMCWumH?CZgG#q zj%%INbtwxAXyxNLX6#3C$3M=qV|e9_L{YQcaqbVVPTW>${7Kx%ZX@v7ejt z$N3d3GTvH2wl;2^4_{s}Th(lh9;kIcAGrrV6boa(aai8l$^8=%gN73X3P1fmmb;#uUWAUoDIu-q)EW^xR zG3DbQQ`~l}n9Y)Y?`yv!I6r$IPM?{sk4@H=&=iJ3>$r`Qf>5_Z#+ooxTIh?Ff{{XtIewp;INlj}`GX$10jg|SBWpa4ot5Hp(g361u9ylLN z)<0H8p3w2duz1j*Ryz(k9OTt`<9JTi1QKzN{{UTkB(|`~3{h~WsT}_Rhf3o$oh+-Y zYBvIM557O0OsHE_3Z}Z8BOSahdH(=7q*ic7z&$ywE1Nd7OiDlfb(}^H;mEADMuo^& zx5(b+qmdLhu6tsU^Byn=Bj47PhhTOL;AG;ojP8M;4xv6^eFv{vj!6M*C^-KBIG`(o zgX>PuX6ip4KD0^P1Xa17KPECrQAaXvnY(a4ftjXV;j+h;DOLF2} zvo14?5sV!7!TmE>O*Hiy)S`j0gWK1Ns~8eV<~w6NW9e7RM(dRs$i{P36$$xQ<^6e~ zJ;0Hf!w|hQ$N9x3`F+37;YY|gDnHNRMq~cy{{TOQ0Du3{@s33ly{RihFs02lmVh2A zQOKwTNE_0ES|3d`>QAjQMp9F##RUzbmWlvTPNva7hjgPfl)1$*6C-x1YN$9hI=DPg zM3C-jq|}+H+Z4$}X9k!>IO3U_Mu<>NDQ+p5=7T`&6qJ;-hAk+h#S{p4)|@GVo+*ie zq^D+^K#<{5twaYrRHKS$mOh@ORAQt9(wPjCZbd(gVDzQ~`BR4^3TAAYN8=Syj%w2= z9G*>8lbRTzVwvksSlP}LXEf#=>vv3nSqz7*B(7;zuOx0zYbJ^xF!dbPu9*8~$M>rA z@dk*mwkr-93^*gG$gM4Aar3&cX`PlgkEpEa;*cpp$n94xrDuUlj1mTDn*mQXp~D-e zW0!R?T;Trz5UG`li4=Dk{Ea2=@X4N4smef@1JQ;m7h}70nQ^H*hkyeP@4rrb%(jMO7(cCiFWDkB@I11KDB13#EG zjU~Q~cQ@|PyPS>(>)N*4O16~#^L9N09DY@y1+)+iu^>=ADCQE2W>ub>4WRwZN}o^a zYehrw7*)b{kCbMsnP%w7qr;D`%8>6YAG|5QXN-=Yl|<7iQjxfg$3HO5a_>RPNi2rPN(#)KT&;NA?F*3 zl#WW4BB;Tw>P;I7r+EUL6)n%Ne_Evy9JJ8sTUpl(n3182IU#Ymz4*zi(P~#@syk%$ zKPdc1`8DQ3NmfxRu^2hY?_I8wc@5%($PL_o`psHMhkebf#I)5DY{gPV5rAH%@sR z{V_|Fr6bNDu<;P-ZIRO_jPu;)ufgHna#vtPZ{F?r{rdVr1Bn%%>#(0IP3Lr9q~y) z4syhj4l&f$d|JJXpE|JzBkzL0%zIRmMR$90jcsycg?S+dEPvkg{3x}8{mVw)7{7R` z8@M8*4vv0Nw2_mMifY10$Z?LIzlZr1ZZz6Q8SRtB3~3ox3nkCV7+?=VK)^qU{#8yr z8pC?aG+T%Rmu#Hx1L-MY8A5eN9^P0xEzO%NF!qQ7S1IR;> zj-Tv~eL1Epmd=->+c9aMBo0)zI(rI{Z}giq+iHMho`ci!{nrEl&gXOJd?=$IIF_$!qa3a4%J01xkg)X?sNJ70Gv{2W)N9j0-|7!xaXHJ*1^%MMAjl0ncuu(zBg4BBM5sGK$tohVl;_ob){4Vv;3wZzz1EoM6|Z z%N?`E6;vSgJbquDW5uRhtj0|9@AS|4_N={zrTa||LP&x($NfLgdSOqP@DEN8dh74B z=8`caBL_Lb$3g!9>#USSf>_dM$sqjPe8)XM&-14`TIdm(V@I_~;+7c>6C8pLK|Y7Q zbN4pQ1cow&cIP<$c;>ozXOiDgD2=uf*yVG<{{RDBOxk6w>M?PWzzyrcz^Zhw6eT+| z${r<-ERKW{Gwu4&s0dPek;$&(P|$7TjQNu)5Oaqex{d{M@}vtPROI815B07&)0*gN zrkO;nx%f00SHU+;gP%A4gQa#^|eqsdS2x93^%u(|)z@sUVrD9vbQEfi5e3Ms;x zDcw3yB0)!5Z78Nlq+*j4;X$B7D5a#u0}3f=C;+00C;@2awIwK^303jMKX5e$D5g!2 z_5-y?%{Y=Nxu9rmEdl(e)6QBEGT+EGlA z;-nt69Z0mvWApNwROP|UsK5W?CUwg{t$#gY8#iT(0bLX&eS2YOG@!S(!Tx zbXsmaoxb&&(bd~6(YA5Hrya?z`J!t$%9`gSz;oytx=d#^fa{By6prGmMid_AgjeWS z8O8?!v1hutX$uD?pCoCV167%JoSK%|)lLyk=#_5Fi?Uv)fmcDoB%YmXA7N(sezmO& z2L?9oGelWcVwR{TnT+hqfmW1~na?#y?n8sre=56kpDjd01#YL>p2kvFvM9|sMIsTB zcr8zfi=3Xo56iFXR9$dNkGy><<+#Ady(sQ$G?YuLQwohmNGoHFvtz?*8(D1jL66qG zU3yoNXp(t4yiR&Z3LmdgUbeq>v6J1sKs{(_RTQ31JvpXs z&lOtg<*nf@5`x_YD_k3})zod}kis&IKfEzf+}*9T4L!qQP-KjA`PMhtP1xVOvu7+x z_3hL0^s6szbu=c@;!W|e!N}(xnd?`|x*2mb5%n>vL`t2boQ=bQ^}zI~^!ur_=-xp4 zla_4s`U**WClWWAYb&FFweuzEOMuNZ8dt&I1{2B=3z{kf!SaT{B_25tuY z9=?Qh{VSc+JTz4#mdZgOKXzs}vdNNF(tF ziWU0_+k2SO2_Rz}>dM265&kt2T}cy(t@kT>t#|9EYqw|?=4h7~Iat9b@jue7Md5oT z+HMQYj=P%xdf*ID?ljTN+jzoQquD%r$nL-4SAXF&jF3Lg!#<>cg>_Nsb~flz2$U%t z;A4;T-kUy+V{%qoh*jA-F(0S@09ezr?jG-Blm7sO!5ah0Bc6E%w=~UL`$0EGK45-f z#~)swhZS{nyGTGO3NK%}pmnQ}TU)E|5ruD2!TkI5qRda1q5&j{^B%wF(-m;uT*S2BH1LYxA)k`c%l^F8GtLuOH%Rg3z$HB^PzYvl6-crC5Gh1pffvHD2e$ zmX^n3K{@$z_cro9Nh6BPywvXO*-X}@<3Gh4b^I`YTCX37?BqUG+;T*L ze8T?#!dZKC%`LHtJ;MS#ZXkn?n4D*)7!?k!sA`w+g9L{FVWS@}<&M8h)VI17j-y1ZEwPMK{JCER8 zFvr&w5_q9w&f9UcoS&F;_2bf(ox@(oWp}7+pe&YtSx!jWH}UVBllTg!ZLLXo;@Vbd z=i_53DvW(Q<3Hz`%1wIBCRJU~zS4K6-8+UxdXKLM>s=Ys()LSeT}J6+5_!>a+qmca z`crKQCNcGU%Thkts_4g+Yy+QSI5_teN=R(A7R`wp$QX)TDIY>G57YInXmnYKFq?&R ziGmI5xaZLGRG&ceBARo$KPa53IURbBN=c!(vle@HM<~nl4shd)56JZN6;9=PZZI`C4qIt_sF<+?kC!7n^})?Pl3hm|y^cYmwh^l+X>fCuVfi1Fk^XtA@-wh63W&ygoScut z`3kpTq)Q{sER!v~R?W6okP(B^107G}T}GQ=Y_$+Xi!5_nJ0k&%jC1Zk8jB^dX*O|A z0X}AO!>H&mI`*hbs}k&(1mK>WeFxW!S6d`(`W2*mK65*T3+j4)bjkcI#5_rH8(gR? zV*v68I0vRjr5Z4^Ih%Q9hzWM?Qg-C}W1;?Hv;&N8jfq}!>O1l={{YrCjPcxC6%3~b zpJVi{!pp;K*9&bu;zf4Lyu<-5w2p-5uc)fMw-F3EuFhfX%*ev$pmiLK;w4ocgJC$dWz-|Yk4KS=m8kX zQ^6gvoc8HX=uJJ!DSX0E2?Q^GM?TeguaT9!)Z7n3anG(h_oa(Oit;ma<_Ka31<1}% zpdZel9vHfk^A(OV1~7jUQp@0&n3YR`lmHM%LF=EVYFxunW`ws_HqJD)gFuk*Fu1Cm3$3 zag*Oa=QT<~XytsL54X%b?tZ`HOXPTe{+oWk<6YWm`dCmB2=;--Na;)V4LAOHNBN2` z1)q@@%9>M|(>6bN@T;7%!{r8rX)08KkRsya}4pe#SFB|3vl zk+f5dB_JC~N@z3;N&%vZ0C1(I(x1DU1O}T%X%AWkf{IEg7__vMlmO~?T1;?F0)Y!p z6xw+7rbwgKmXK1=NWJN4MIfdj<2@E_^gAl05C5wI( z>ob^fR*Y!5#a)gj?AXg#1h4aUtx*D~=~S%G@3HG!N1+vI9Q9=GW&^eMR!!pUyDk0o zAK_Z__048#AM(ikNAjf2D8GButF&UO$e9IujzwEM3W>h(q|ws`G9Uz7y?WC(mBfR# z2>w(`NJmlYRFINL&uW&<;~U+xc8yt?{ z*OFVDj2_%p-jh6#-bb+GaoT>AN;gGQs^Kdhn9>CWi2!#rsNsNRIR}wgYRz+PCz^A) zoqqsuKb12=nnM?sPC)5dIO%h>RMy8ylTCP*McU&cp0x2bV2nsRdlU1$>$glzIvX2PL*oN z#ods{WU?qbayuH)ODNO}juy?(O9ZB1bZT_kbwJ^&|AH zYi|{4H(cB-ke)Jek@=76D}cBFxg-ua;9|4ZMvRnRk_;Nn-5V=Dhqghf=`)YqT_$?q zk-++KR|shj`Zdf;k;fao{{X#SA#4GiRPqi1qIsnAS;58!Zk%!bDCT12S3RzOw%XhI zlB&)@%LEuZdz>Fiq4upF`0(m^zz5|ZWBh3$xther@Ej|c)S=~mY=TE{c-iRV{6zv3Y-~RyDU1f~#JR&JTWp(5c@BaYSs??Qkr9bU0CB{sGKd&5T z-l3Ll3C`Ia7@trG{#8d<(XC*$TgaK!i5zEv#yI0Yt#Gb6J#1moy4-l4|Y70uN2m^@hv>rN&iZ69(6=b-3u?~hLPEM76SXl~||favG!;|DAV z!0Y*%^T=l=bXG+xxUSMNFltM*j9f6OMxZ37vBaGt2A`jl*%#exu?LZmdjry!Dr4tpv2S}}VW-6r zxFxMFOKb~+D()ELx2-xWog&KmeP-V8?GEBbju50B&)JFWD;6lBx@LDkrMDA|_Kcq7 z_pAmc-b}~UxX-42DtSugI#~QmtL079f=hkFaur;a9QFdbTUj(HwV5@awHaD}x|>MZ zk;ysq>0WBmvcC1>3V7{Ko@SL7a2W>~9*3GN3A4A;-r74mTW$HC+Ut5pw1Xfd0gT`d zJDS_Gwz9LlzP$}AG4ma_##K{1kXZ1?(;chLE$(GjUUCjTQ_y>k;QcCV-CI(X#k|wW zBx-)^F(CbU=7$bpDcI}PH0@Hx%ujG2cn~QB6P5J@dej#entr3H$vevS$P;QdG7iu& zk?&lTZp9R5f_hY}=XN~~D!Dr{dHbWW)30pq>?5+dlv~Xc5;!C{KA!&7sTIwgv&(Ph zGRGnX5;({$*Ek)y-+7O;7}&%>&f;;7-9|CZbJ}#Smj>NV7v|@`8UFwZ z-|}O-R<@jEZoqHiAA6zvDL4&JP+f0Nys) zMmWhQwma9@dW#gPLg%i|p z{E`Cum31uyrO-Y?Dq&!~xa>+{Rm+CQ5X{IIHGSXkco9+Q12VF5>KcbNp)doup^@=% z6Dw;Qgsq)D5{tvTy19E0{QS=boC_q9A|j(MUb=iGIw3JBIVClXoRgcEUvRsyh*DKe zrO_Eo7Q3;jxuvzOy`%HV({4^rZ(skw=ooi=VsdJF=I#8#yTzsV%PXtv8(%lSegEPq8BF&w#=?< zcr2o-kNE=e4IdGeRx^03zP>Bkzmom`6DH4sa8mJz`?}CHE^yN-8<%!}J~guh-5iK)DQe zWFU~$3r`Dk2FqojPBj{6+2h6k3B$YN ztK{@T_D$cZ`?RH{q`sY!|0g4IkB3p~($a)o3P$e{y03;3)jRW1wY)>d4E>ls;CY~n z-WWhbJMVERbZ4qCWJqt2mavYbfq?s7t|z&dkJo2+@irV4Efa{uH7ET6o~u%J^e&$B-W<)K;+BFZ43Yb(h z8;fF^MQ>p=+5Px3lTnq*v-Bcu+4F_W@8j5r#$+~7(*t@z;#Zd zNvCBMAj)Q6C%1nq#7Mqgvm0=eU5=I<{;P>ue%#BJML+}DY9X2&Q?PHW6xg@a2Be|M zF-dpf3qwG;7@l@2#|%8{q6_R#rMvK7t_J_X_{ODkWEk`57`~n1uN^9vOQ;F_F=fzp zmR}xBI6z?jgV3CF)DB40Ewy4V)x_wP&+rZ??t6XVpr_q@UUWCPfJ_*E2AwZ<0>?Hf ziW5X|;Q2euzhGu->-G)}v+;)Za9 zQk4HlmEQ}v2%&*YBoyblz4X|M*@FN1emE)Swe9AKV}I6gkvVben85>2cR=m4 zN&_{ar!$jCXcrdC#=&93> z3l(g@&0=Y66__8I0?GnoMqQMNjS5W9u|LH5>f*l+*P-CHBW-gAc?%OcaiTCACI?v+ zdqmw424N-H^@@hl$x(cY;wRu%6x39On}#<26{}9&jR+f6Zftq#>d@^qQIZnIyekmd z<9hsE{aO2SJvIUTve<;vs)|~A^CxG?b5ftqsZaH(KR@A`hnt8H2(aH6%e7p$V$G z4Q>_=2Cq80@M3oLTZ{w#fF=ut6;_qnldX2YMRLr}$k$5eOxx6)Lgj}WN}aFYTwiIf zx+jlyJ;$3%s0zqXaJ=i!{5^1Ef8mJz~gz*DH0tKQFe9s1Z)B> zJZZ3R{G#Df<2d`Bv&Vp{S zFj%vO>&ScJ`F#K1>rw}=yJansrvy8eJwJ3d*^KC5FYkb^n{4}0=CD}p0d=|_pR-_s zrEi1F6A|hLs3sC0p?3w1)y_Qn1Kl*_)E!1>qCpf8%q5Plbg;a!%mxg<%D% zgRQcw(qvcy8oD-iy=1R30h4SidnSPnmlEag6Gzyf$V71eAr%S<1Ji@X&LFY&j+Ue3 zU}G0Pj!BUN1(a*hqDY*s0C59Kh{=ULa?q)2urP?47jSq>?v|*nlIlJ`yTDtSfgF2s zC;^l%dQ0>&@-osK#;u}Amy@l;#+pzZnF z%yvw636DVg!K-{`iE^*^5Ll{)=^nT68U$_;AkYEA%1zy~7%0pVn%pcg6Ks-mtDDNe z_{JV|aIn!$v(Z)u8Iq&aLFzKJs@Q{MT_<2`XU-TQgVOg`hZr4Ygl(FQ<}qJB*t_^` z^Sf$`8Tb{|aMRRta&l^moauQ@qhxZ_N|R;ov3J7e66qsiTE2oNF3qKY?4B2U{F9uEQON zJb%&)e{i9Iw*zK9C)Qe3-da|J`8X6|7?O=<^SM$jVKsb|W{tC}v9)_HmPfxzOjthk z<&RCUtx9K#)vc$8e#@~3WRZ9KRQa#s6*QaCCv!_$?wwa$8+TqrRXAH+gPX!nqnuj! z94|tr7(7lKt$d$Cz~!UKyxo`S+(fK!g(VPwDgvz>4Yqv1e4g;V>0wrKDW2osAK=TU{HR*G2Fe1L9@Z7%RR^lZTjGj^cpSHNh3w26GX+ z*O7n4O&FdY?=bl2%s(y$qIv?3HJIxK{w{Ve6j%qyR%)WqmqZ>0ALbYkcgVWted`FA zBSz9(A{+mT^l8RQkw|wyc%)M-6o|iY!byZ|d73)8Oc{O+0mG-`BlhG~+{MmFl82{Y zhr7T~k?tj(`Ny?s(w%!|p4^7KLM?|mhbM@pbL%DwZ9?p2sSHVbN5N4n3o3?$2L77> zIPzB&kOkEN9RQr4y?Hzt8Yq(ogyiJLWSJ0~gFm~c4@KTsSX+e#vhqT_&ic@h-#!m# zrmWaI#6OC-70p`N0ZkZ)8D6}&x)1#gP!s!2KhjoZb8~Y$`%tj942{l*Qa2tWiXo9v z>dG0w-?B2>8TaE@Qtx5E-J=r`AebVdq35=bZ|qE?-Up(g=lW= z57It~HOj~Jm_1>U4$!JyQnGF|=fLe+6dOz)T9rKz4|(~@=7#PMf4)0)SAG=s=6XuI zDSFmGKMx&0)WD6mn7OP%$D)zpZ+AfVc^EW%{`qn;iF_NPF2>OS^wc*_Sm1>AA&B}h z)tC0h#9kg}-a>IZabD>f2UnEat$=#9KF+-}d6f6+Yo|{SgkZD^OAQ+!uWXh> zxr97nx+FFmoqbxvS`8b9$#&%M$=W+{)Q|1P!dO6Mz+%DbK$unsat5B}-9!=iyi2pH z;MVQ|D6hwS$~*LFrGm{VvdrP&)WnjHw?$tSSCxN(EAz`MHYWW9~#qm^Qw*Nl?WEVsVF^jk{>F3%m-?GwHG z5ykPaM?3~Uz2-+hwXp;0jH#S2R#OK>nT|YM+nX}ArR0a9jx81}8f!&ZC*t}isyQf` zB~}rob%A!_Wto=rtIKtlowPDp5A^Zk9#|ZjJdyJ*1COY8=F#uJi4wl^6<+a@nC`4SEt1kov78tmwr8(4Uuce@&i!dK!?nyFjOEGZ2`u))BIW50qX`CRPY5R>03DncEoHivaEv5e0u!$hk>w7%Xxi;b# zZW8LW8|33Wp+)V@K8;*|{4^GVP9mkM8sx1afr6%xF@I}JW)|&0{%<+c6{5-T1?mps zZqVIzyt_UZ1cefzAPk_?JtGb_$CNb(dhDD;R`(&cc0d^?J^Y^w%0ywgF{wWoqXs@- zfU+jDs_GS*~>;?K`d7s7e`z$7!N~078Go-&8 zTk%)3DLx3ua`07#b$bR6Upl4kp6vq-Bl8q)n8y+4$iOe3tBp@K2iH&i44*BjomDJB z?|_77mA<~*tl4@d{9XS;%+B~*8xykD{S6L{!&_>e$kEoMRaj!?^Dtw3GH5j5Lmmv` zqpW(U)%C@b2iLYw5({apJglo9ChU^+l6sV$=exK;<==zbs;|FNv+8smw1hDDltY;ei*Ng>G(4f*et``iy&7^l_KOx$qjoCq&cIXtC`i;^Em^HhlMrGxo<@3x zs7W0k)GU?EzCxg5@nG(1kVZzXHlLG96&6d*85lFq?f%kt$_>LX+LMJO8f?Jy=oIyaWGY@G(UH>3 zLN%zt5rFo_k2QGAj&_R`LC_x`*X;)~OCTJZdWwy8yVrck8)~`My-`&^bGqf!j3IZn zMv?~s^UkA*YbBAXIDdQr77d{%j(7lt&!Dz`u*Z>F8zYE+-LX2o^A==B9EaFW=l3M) zV&;MB)4e*_q4jn!$c7vR1?LG92uMv?`E{EJk@&Zlpno2JgA95t>np!HKX0>n!sw^l zX#`INO(WA%TVvzAmd?oM)2B1?T*E#(*{{yETnOX|`#a(ct~Z>9aVxmIR6(juK3tQ; z2E4L^jaNfwI@f!QC1y!X9LqR1uB@9Jhk%CRQo*?RLg*%_dCUO?w{v9ag~%{5uPOJ5 zs{+L5AN_PJ_Z{+O4+=r*1#DD!HPatIwMx6^s9W0u877G&*J{X5RtrUj_Iu>7+t}G? zz`FHv%7I|VQ%D7hX%{|CT2*29uFeO`>{eBr-E3pm)ABUuZ6VDK$pj<_FbnE226MJ92YoQZ#a(A3Q2twn+Jy|O2)=CAf6Uxef*lB+e#Fnfac z{D|<%c=gy;bGDrH^?aiTr=M#NHn&(`eIoZuOU=X2Bmmx>Xa7s705I--{ z7)UT0vjYl3t$8hdwQnE0>%KEF4-IqJRrMqq7&Cl`R#oa~;b8AnVd)E$ZS58O9Bor@ zdxce)6G(BNN;)>SLMPB7++5_8hb>}ta0kTMH_<#PUQ4!zPD* zKWK9sP;gQer4$t~!ahqLn5ewe_}kiSEx6FJ{EK4sx@_Gcl11j9Q74Xs^~wqR6W3~( zKAQ&f`M0ZMs?#=G*Us;N4&T2pFfpMSt?QoQ202FMfQ$K06;Q;DF*3e|HV$?+d|Hwy zj+1L~>&>K8!_g#G>u6HdTc0@MOOi|T-{yK#h} zX$JY$nbii*MkwB<21WEGa^NjSoq=e!jqX112G!zEvzIr`2zq8iwgIZd^9HIAi!s5}fj8sicB%?hrHI@hrjkSDsPoC% zn1Ks{oS1x3lLJ&@|88?ift*~N$}!1_JqTb_6~1T(geK3EPI2vS=?KTm{k(StNa9Zs z*<(##x7<#~B+jJt_^;k}bP|5Id1{{5vU%gg)RoWB%Xdt{H1;Cojtzh#Aq@ae&b=vW-T5ba9ntyp%#Y0OtR`s>P=2&rjZ6Fj_9B8)BUq*meRhZv>fCr;#X?a z9nSMuLHJbSMfg+WmTFVqF}JiZlw%z}$&ua=IIcH9DMH}|X@ZqiBc+#b46;1W?3H$& zwg0)n_*&Qb;$iFW;F5xc&&Pf_|F+8B;!>`^czI-@-R#Qkr5(`a&=`W^q-F<-W-x|P zjzG#)4`~on?~3b?+DVs5uCj0$x*#LLu2R>TH>cE2fPp1O*!j*E4pIQb<`^uG=>aQa z)K9HoX%B|4b$%L%HJ9zJ!(EVCzT8(>?wzp>sY-8a5E~6#J$huq>gOFhg%dqnM}KDH zi+kike`h0aRN8)nSEb*R@~hlnU35EqI32s~@lxvBwHV~e`8%qQS{#@?e3>Z?@_=d7 zb&s5a>N;r@Q?kX*GG$5O^Ob&-z?^%cspJxJI=NB;fK~rsk}3pwFait#mgT5Sm$52< z6d}E^vA?FS16hxuf#^l3IfKWJpJOcQ0y|hVG4bk?%zg=}I6MD0xSQ^jkd|Q9@gzug z*Q;LOCZ%CF1vv)wVS0dv+b)5W=AN#@-TB~JWwXQfrbkhl;HNM8>nEO z)C?ZtSdQYvx+l^kHE{Wt6xe0J2X3NnXiH&gX(RpwQHSU8M9s;3$Ae0N#7u9#DP8sEckPfRK^}^?}4@ zR1yHKfRva6f-o4fh`5g-X5$0Lu4mN+%$JgjEbKk5dnciwKYdLP$Ua!r%s}5E_ zUdGLir!KVK{Dg4dYUo`y>#5bh_r?em$rlS{@4ve2xQ;#}{8>-83weUO{eI1nBUAVA z4&UuHeY2h61>%29hJcLXl`hEH_2M=raiRhzu+aHiDWkr-saGKIBr&6L016NrUnZ_s zP);5$CuA_K9AK`%f@05d8@|vO8F0X&RQ66EPgOG z>MYve?L&}P&2-S&f3MqC{$Pz>(MIT`UB2h=D&}?XcA}XQ;VVNh3n7I;R8jI# z=Ep&q7Vji6&|1_U(V$aL|H^GI^?j+gUjKVA`LE4sEbeH3y!+AKKTW||+Y4V}RFSXt zARg1<#+0-Sq@Xh3{G`wYY_;;JgKTkbNY&%;K2i~ZCB(wB3=9S<#+vZ?t1jc>2g1EZ z$$sn90*0a@rvQa-DA2N7q&avHfml(oRbR9!C{x(`S4MeSu`&biLRd6Oj~47 zSjm|rMAU)rsXHLue-gD`{5iY>QkFGa%iaME7d+r!@2{y@=M%MZ+4EBSrQ`bhu~0zf zmdCR4(T5x@5Izwlnfh7Xkf^($H#spJP~R1MUJK zAqU578Q1cro&~Wnui(Z_;vtS|of;m(l^tg(96&;y~PfbRN z?U{I&zzIf-7l~b#ty!lmuvp{H<`RQ}4%6a&R|4(3wko%!J`VrJuU&cDf%#IFBF0F@ zF58l<=|h2y?G!^@M?wCZlZuI#6nnqaA6IQX+7XJ?QSmIk)E1ISjY)D%UP+9fS+@=^ z@3ftb`Qd!0;r*JMp3q^Mg}=1^iB{s$_03-g|1Qqc)oV`P@w2&w(9OLy_g71|8C`}YqNrf{-qn{Z?0}pSo0Tti7Ne&uDyK0!GR^d*foF% zt=QBCK)AZiMO6MUBdBtf68p7p=3wcl)Qhihg-=;bVyx3o*uK|R!`q2&OtSwlb=^Qu ztR`OgJ6v%jHzNPbcKwf{rq1Kp2>he_C;xIH7lQ^rI1or9M zZm_N$rm0x{WgHuPXno~_iPX;>5G)L-RTP)8FR{hm@2h;Ttl5+9_v>Bo;uC~|^v^*$ z=(8B%)!KcsO2}_pJ(Iz2iyez-EY4=y>6y&0?H+~@nd^r@FSKE%BDO|q*k z3654=U(EeGJi7xra-+rBaa^alxLo_k74NqTCm)2G%6%h$JtJ-2K=Q>at+_~jlaDzB z^EnkP^ZYk#S?xbicxoMX*lVb|YlzGH=tuvd8~IGv#%NQC5jXG~*y(10s(Bd!Gw_#Y zs&CvaBZ!DfsVYvEZLOQ-Ldj-p)L1tpSCOv3CF>-MWl%;2a>P2{vntSo5OfCWD4{-x ztz|`VM$^;L4z6~E)eu-^NWN}t97RU})%+&^tnv#Ds-_UqZ4cxLu96t$%u8#iGUR1< zj?Z^6v>&cY-E|*;5sQO->ca5<@WS$v0$czjvELCZIxd_5_N4+X7Jqlze_OV1nk#Ur z_ecHIGLMXB%Yc{1cx%}Kjo}7%HH+N-y`<3|*b{`-VLh(s9O`H;;h^S})~Septae5R zt{U=X;}lgGkYzmrOF>I+%~?oIG_*bpnQNC{U@S+k+!5du;3C&CU3qes;nKtitWS=V3&m?J0(YzMty_isxTKrUc}zi9 zM$+#VHB$Gu^|gsa2uFJ_)3otjP@JoPC7mYN;V~(xk*t-PuCKEgQn3Rv^F0}Kz=im+ z+HTKn?DGX~+!TQI5aw!w&(HH4zc^fubO?Xe?Q_E4P!E<~PyN^<7>2+0`G~)KKyCM+ z!I9q`@;tarxr0(4Bg$-yUl}-wDqdf$vCkAzY>~X>r*;nPehz)^#$n?VdO%4zb4SNb0d=RI&YQ9c$7SDaZsA(I1BYqg3h!H{XtG#84k$92^X2!zwWhcEunzMz z7b;ouvld}t zwhm3%7T5t*%8mcgyx>>y8nIO`LK_M|^|xUo&`Y-sc;3&c?|^OrUN9`EX{1VG<oKz>A}?m#J_){~{7L_(^icG}nXg%*)5RIKFMKwh=$C)b;@hHZ4zRO4rC+Gt8~Wb7 z9J5G$DKutkyYkOnCRhL+Ys`B;f8X@CyQ5)?v;Oa=f89C5F)8KA;JtgzS?_6eAEP$O z<;In5%T9SW%1;K)bFh-g^DOk6YGud{=r%G{>#o(GgFrq2HCrp%_I&`m|MUrle_XVD z-qI{TnrMLknfyX!@}1t=0kNxwulsx-{4=NC)|M%-Og^w7a|gQ4kI?oFjY&(`*Uk42 zjc77E(`zE1;u52a$NH;``}`zFCD;{~)f?_(?SR%?pPE$N4hQk6mBrs5?3R1;I&YCm0_9ngjW0VUWb}YHADxhYbQwd!{znR#VR$AGhxqq z*trB%4S0q%cY~ygOY;*)5Z`eT&DOff6ej_}YCq4%GX43~<8Tp{Ts54V=?b91!J2fH z?%?L7x?gOBmYKmlmhr5Vj;;c$h{=Z|6AcXP1nfr(p)dyxM=7_3e_&Ke>Em#EO`J#n zZ7`zCmo-r1`VMYCq?wWD??U2jA+Ab!(tSs~>Wm=A!B3#GHsMg1FSL-&1F8u-9Gzqf zzoE{|g{k$m__*d69IjvvEq1oumep(Dmg!me`CX|r0%_~$JssvsS66Y?a}}-bFosyf zG#~z589d4T^Ld-^8*5?oRe*QKtgXF+NN&c1t}MShSwUIdsIfH7LEu?(lzioJ(H}URnp$#f1Gp4F^(;A zKD$S_z7XH=!o+RrYbyrYUSI#-_9Uhupn;+~FzFAYhYu7Zu0x=f(89W0eP7H7(BHBw zwS#iIwKb{WRZHpgQMCCJz;zX=kjo4oGX;$0P&{>e_y{g7KGyH#CQ>dROg$7`CJ=#3 zdtf+(hwD+E{SKyj*~1dPz1U#XS4!=G*!F5WpeUdggQ|8K!S!)b=+cuVQP}bol+kIl4EM1wFp^!8fhsc(e&+ki>urc-emg((4L zbuN_fZ*R39jA<@Mmxr`JCQ zvX-^loc9uW+GP5_9|`-j7BV+CH-6$?B<_rj3~R~3U#mVb`k!*?qQKVmjp(Lm$|%P` z?z(T!l{Ru@hxVtTO+Q_Se$}Q+FDB~li-YX>$19B-XRYF^y#{-@d{;v1MN2ydw0#g+WuPACvE^vM(fq>m$Po_es!xRghJIrOtY|_ z&=^at2|ISk(Sm0ZrB?D~J(0ZJzy* zA{Tg?2y%@Of zNC!9SG_m{e(dAU*t?X_1^sVMH8=Udaw(=YhtA&! z9MVgl@NNGv8c>MRkCKM;i!e)BdvJR&NBDgV-AHHcxC1N40YE&bFrKVgAt1;=#^U?zKcw*}#tN_NB)fOV(tQI!vjXPO-) z&_`$OjT&SLfv$cn7Kev1vcRJ)AdOya8+bGygXBXU9r)bh{Dm=K*1a9sQEq)k<&4x3 z{!Enu7QO5*^zA^_Om5_R-r~4IZ;xzQVMWZ4H>#JH7E`NhG1z))kslUfR zv-*J{Me?`{=|G%}H@V41)O_Um95L+fkp#hxw7MC?$B^av4oJ%NK>7Vb@JU3|bV&>G zFx&VEKp`Bydi?7X-9Ip?^J_l_?u^IQedxVu3lJ%TckbK$^HR+?MoH^t<3R}Ym4v5K0#6_fRM zXSGyaM&CS0uhD#+m47e6ZdAWDrBv@t>^{D_6Na3g*r#y$$G*e*j`x57E;d-Ln7134=4X@NsV1_9Xz6vd(7XCs}ll6m+` z$h(9>Qnvc(X7+IgC4`s?FhFGBhYUbppi>oC*1tR?A)a|t&)gdU?o*ZMWIk2$hseKA zo`AaIRb4E$L?4hH@yAcQ2d9c7=~bMQMB!#S72+k2i{<7O!NJ3U8dP5?)GIrnuf=oN ztn*ZNj4t*QyYZ_mM1#nqL+oIFwWnN!^pgr$;M|olj>MpzgixJ_AXP9UPXEPyErD*6 zY7syGztcjYs_ozISaHCs;rXw6!wRWd0DM9f{Ym4XT1#7F8&Cz+D)o&xbxrlWmnt=e zC}JV|z)fD3uE9A;G~6?aoes-ZJ3>;~rP$Uk^n>D0a<%W+*snDp^{<68fWs=?HbnvptmMh!wmJfd$o z?SvoYVSGh~jhDGrnd6)$&_S{1$m8UccE+D|-YY<;cW5wg(uEFvbv&YWScq~{W~pO5 zo>QrI{*nqW$ihCm{{Lx}2W3&5aJ@5T~pY@K^RgTO3#F3Br zygw%2iY}P>L@lIUi8VwDXlzs%s5%IsEgr^a{4M?r9i3|W@xJKM8_$?c3D`v7kgj3G zFWb>i)yPu!<7y1-5w0|}8!i+dLT9S(nLc}!<3WqKS$ULrzw{Yi4tr5{x2of3Xs3p0-vaJ#QmY$2xFX*5- zu4GuboP?LiRln!43lXqw3@95HYgIW|^s(2{8i-2ij8CPuy~jaZt8*s6zFC$IJp35J=qb7!WF`lLJ|f_BPAZg)i}-& z=VLVl%PHxYrCa-e-q>hBtU8UCLZ^bofHJ)K3p5PFXU>R23Y-uXJVavvEnYA%4`Ji} z5~XDhDZEC-u45o?M(1Od0g{m~KxwP8h8%+La(mNwSOV5Cv>g>_6+*i(cb|ekxBxe? zk|i7B9uwb^JoiApvCdpw zKhyp}cF5p-OqkE-OF%M<*?u4QYy9F@>JG^Lr(#;~+C(|UlJx5U<~r@6g7CPcAlSE{ zAgA{E57A%~vS2a*j()(*$7PQ=8_a;v9LGB@BQ7KM6to>|Gd#{6*^N&sB=@)&r9Y== z#ko#+2jx4&!#=qE^X&yJV1yZY!@K$!BZkmYevM-o(SB}4kp1j+XL=}h5@+_Ox!6QBR z!WWb>f(b7^T%^c(P7j-ZxpySb z(ih=_Ue@T0C})*y4>#dErwu%9;eqssL~NMrVwPY{_GwlLN}N^=Zm~|%28()wo10w@ zRgnoGBtes|+%*_|tiEkL z3mo^wVr}RgA31ZvlGS$K|IXsrCg-fN*Njx75yuWj#R|%g$If?n$(aD7rIp+IBil!VEtArP0rjO-Msv#3Bzi?Atkxb`uFP}BkwmjwkNm2#QqCusr`$fv193q z#hv99t1+;1h0a^4gE1|K2h2Wazj#k>ffQof_c~*)99~~@O_X6?S{*)LhH7pFK!v*cLa4XWq&rsSd{a?<;v8AwZ>mX|@S)dDxRYL-t9-y-gw7R=6 zfGxby=V<5w-G=tocblx7VM=BsAwfSh@NwPG54YO^Y@!K$4`;$`u`l6hM>1@&qcsmR z7idR=B!5F?id15Inw3yRmpK6rK}SZ5aqo_9JuyA^^9JKl#n#9R374}G%-%A->{als z8+kFr!$1517zlOdx7yQK&EINsc@NKC%i5VNJuA*ZQHH!n9>Qi$A%c!uv5)(mN-v~j zPycLF}3!YYz1ny!wH61%DWoYqpZL(b24NjHLl%Uv`)g8xY{|TP#HZYv6$f zR>jIgpA!KB0di(bqqj_Vq(c4jOd2dIZ5s$ZwlwN=-t6ovV z4;vvTaIXVN)s)lRS@eOx)&M{IB`N%42A^}D+mU3ruimO6KEi()peqAhbr+ZgiUv-$gTCQ< z(1xTH`X4ivYLXeBSa-)XhIB~U+zy&=y*-6+)8NC1&umWd0bR0rVB(+hj6>>Fjt-F+ zJBw~Dbudq!PY3wFy99Yu1wUMtC2j;3&dl4L#c>n>o(o0_<09qKF<*jm&HnF z$Mblo6ukTpC(twuclJ1(YL|^?>tp27C;Ix+skEvh6@Y165SNDdk9|`ua#5U<(cFe= zghY^&8ryKH7hb0*9*!yvwPq=J+Obr5>*{sAHqJSsWnG}fHprf)&v&ZFK0e#v?Ji{| z)HEztQSU+EvZWqJ&fg6QkXP(`F#FdunsUt~Qu>y#Uw^ObN%u19Z;HWh5AFOut zU$-(7Mh;Aq#`cd}-vc{}P);P)927q&j(-M_>xOki8-{TE^WR{a0;)Eqvmitw>%9@P zPTAmDuA53zz?$3srxUppEA;tiUI~<@M=H&7gXEzCjr2Felv@TP|5#Dj!e-aooCV>G+->JymRCAX`D-7W>KQP}?wxEoMV6Dhcu7(zS}SWFH1-w$=9iW2-yY*FMcc2e743NBv&-;9%%l@? z{<*9gbO~M^epdXP8YX~jNOB>uT9qHazyzv<*%9v!4dOkv9+5hBx88l9^FF*jQtqaZZbXzR z+y#E(qzNF<)uvIIF?F0MPx4z0j8&={-41>0HkhBec(Ku>sD9bqVd= zzJ<(+(pf!nKmkR4ZRd`;>qXE<7tlWg{cXXYq0kCdulnxOe-A) zyl|!UL4z_!SN!;siov_+RVP?U)^)S3Udf|B{N8OJiK$?t`0ZZC&c2@W%l$=JrS0w2 z_Mo;1b);^@m9KRD8FJHm7A+~W13GtSDQ1iNow?S6JrjhDn}|7Qc`R1pmHnqHW<|iz zQBI3)@B{Z5fW{NM+b5>#uDQC5N3r5+-+4J4WWI7)N}q5wY=2K;F46t)Qxgq{aQ|R5 zkaXFg7C#86B3g{A_sX*? z^yAl<$nY3tyXeM=Rn)6Bdy-7eUw=oqMoo&*n z3}Kx2ADByfu{K)MJo)wdtGj@Ky?%>{O*O0lMel`*(7fM&aQ&^O_PMagbNqRXQ{H!D z8SoORz84;b2=_b9PEVmUenYR-=NPXxN;$%n>2BzOU7jc~Dk4Lx;Ae;;Ln{F0pj>7F zt&(m}u_P8zX}%pv8dU~g9pQGx=>{`lRfQtvKyMFp+~%J+BRP5tBgg}_>;;*w5wnu1 zG4ml?^wFOZbl1Hw!RIgaK#QEKS&MsNiJj-yH)ZSZ8i6MdWfEaI2dkw+F+IznPa!zU zhmem8+0KxGS)0WU-p-X5g$p&P?lhSMLb$z7cS}p}jD`|)Rnpe&)YCRrS8Y!Jep&zD zHItK5`yyuA4Dzz~ppO0h(Ee(BAgi-_WvhfjofsTcUOLcjimyE zAU!%z(J_GV;pHy?J;82jEs-ui=3WoXBD1@IDZ^)4vW*s$!S=TL^g0~nm<>@jThr^k zK#mz9k2o@4mp?UbVhnF8UiRzjEILZ7T=8g=yK384-wq-jS9X&zSisYvXq3EcI@t%K z#V&XpaZ5{MiOV?T<^`jNJ->-?)nw#z49LrlkAcx24B7V}z@_w!6We8@_!j;wDi0A$Cw2)NMc5nNeQ&MstImg<0^qaTO&%64Qy^P8OM_f;r=6Re=hDS^A*;& z-ppW>c#oCD+>;}PzD<{A+E+a}pZDNci!H^H+iezQqgISS$+F!ttA#DUBRDwa z_)i8shXqz0Ttd!n^sl&_hv_U#);WLob&EXrrRFF}buIQPj`wWht@leOPqKLSe_>og zyJ?4%34Ie{GCb`=KDJtwd}C5^t}6N)-z!B*tsoSMwdco~5@q9V&h5%#J`Re&wC*J4 zKu5oewJKw9@W#2UQI=6daTaC`l6L9YV*td39c^h^50bs`y?F7=I{dUs+QBOai+>OG z{~2>)SGDOk0b8(zPlk_SACqhiAdh1mcD@DBznF^dLf zuYt)hfT|k^OdIV^DhOh*>!=DrU-Ct$uDJkUd%Uq={BPfgI9zPq^-~f~3+~*Di01L> zrVFyF8qN8kFylNP*L!aKMJotHEq&k0bMv&quxt;^i?%xB8ZxFqf&23fUN~5MOgbV- z0k!w{Od^82xILJf&Feke{<+NBd#ikYQ;9I)oF8~r=IbDOLN1!5w`W*4ShgFq1Co`O z-Pd;Z&tI(y2i*g&YM2nP3J4?viUi^EpDjJFx3;dyYyl=4akDkzDpiMYiCi0|r4Jce z%$$X$?u>olax2EqlJekT?)C+{C=2kz(%hYF7NkK`6$Ok%fqXMr8<;hcnP6uPIcs_2 z9dGw9S3e-A#p8tPtd&)23;2>C|Jci#hfjTDW2DH6j0@t}P@8}~i*D10t>)?z;vSx| z4RZ@8KqgpT*0QKTf0K83k2ntQl77zcyZ1MPL(0xN4oRqFkA~5(`n^Bj-{l{d>$o`Ab>8>u zzMtc98{Zl^<>mae+u_9-t6dU9BE(od)sE>_*!f;b-D2GNgmYbSh)8*Jfxv*N{VXTc zU<)iq^_@3T*+rpZuhuG35Q(_>*p}O~27>d2PKx+KSp;sHZhbI1>ffQN*9LJHnqQ;t za@MXq4nSRL+>s$M@G=XX8Igh}pF+s1ltGlFU2;*Z*c<*3akHlu_SVcLvOtGI0?>ZW zlUAC2lM8|Emg9&Foc&Uff3&~`2s0&rsqlC&sCFI0cD8nq#Gg9O@QpB{hLaP;rY%_c zHe5veE?YBNtqS4Dy{7E_AA%6!I+__ld+YB{$8S3Cq!Z{uGHZ$#Lyw69!9gb0K3x~l zUpl1pBr|MscY>A8Io?b=u*AFMXa9XA9_G}(((nPuOmNSn=YM#MRBWoZ%z9k>3E!`8 z^=9GO6UTrV;7DuNrc%}$kY&MNY>1ogyCTh8#(ovjP2=6cs?aamHPvJmGh>tSypyUf zwM7~k%=LZD&`he|U5ekMeqCtl!}<3Wf1NBB$jtr! zcffY}d~P8LHBs{wXFWrBQh6N%$I6=K%s%N4c!Avt&T`wK&a9Ma%rO8#TG14Cy$VX1NP`mJj6%$~S%48z|w?k3F9t;^G!spR?Q36+~Nr;2Iy}gKDbsXPMtp$%8c)lT_4)sgK3qD#h04d|Rzb--=G! zxLY3$y<7Li)mxCmTnG624ZkL@GY;>aX4~1BS$m1oN!o}co%0pMt;vDe-0%_@2D-InFT(6nYPdD zH-b*?_(xyQw+DEbv?R9ZTC?AT%3`Y(JJJD&#sNE+8Q2eOBQ_JR zKe%fEY*P&B9Ltf9y;|;2n%`Yqx~A;F`z7V_8~BLZ-13+<(#x2vSeVn+0F56}pp9ag zbD{Z2=N$J-+LOt{sy2VRHTt94YOs}8&I*vQZ+4v;*ij}*FHyTL#4xp}P?byx+s;pw zWHaW*7TK(jb01&XkFB~|eBiz?KFNTu4)f0&sJFuiGC-@Pib^W*>XFqmGnD=D>n_=M zWa>;G7t}s6DVa1aLU738QW290SZ@*TFShnJA1%IkR3?+r&GuYo>LmY!Ef?jab#y6f z8P@L;b3>rBvFR0v+w+fnrxBj@mW-n7=%21qMLC^Oc@?}F!#Z|(M_Mt3WXuC_yKZ{L ziERIl7_paYCTw95fs>(#+$E#vh6H;=Uy%$6hc-09gy4FMD~+{Lp5^$#YE&<=hDK|0 z1RliN1dCR7?!qI)Hj#T{1TUu2%E*SUwpUqs#MXdSBb(KLDN;+Q9#teaTszo1CDi6}Tutdn&njc~%qQOXj(-?z?!EWiB|@BG2@vNvNJn4X)y-f<8Vp z^f7Ei_SZ#I52CEK+`X>w`mSa9V6*KwbPI2UiEpgcbmghX(l6ZZbPU_?snB#INrkFvZ;P@lxL1_SOTRj4#@h#2qxbk9O*cJGB}f9Bxq5_h0FzC9oE_~O$s>$)#QvfI zY^WvmBP)hTpn&^mo~1yK-!q5%|9e7!Gy}n+5`e1Tc029XRRePe{ItPrrLxLCH$>{n zr8a)(RZmXtINm+5ivH3bVV2*D{>)Qfss){3_n5U7j0tm7nJWD`aY+>qVbTLL$3s5T z;w*9c>Zpg+f{2wYvw~nyzB*&JwTEFpq6CXzGc3BaaW6g5=v$Ox#p(;5z~k!R+jPBl zD}h9z!{q+=)O#TdEp82J=`5{h*`Gdo%04Ar(lVTXuFN0SB-JT?t~wvt3@f4T)oM4F zL7J57c_)KMIOq9)Cs!d_BZa}2-XR|NUm;hGx2_0 z>tlx|dvI>7s{yY?4akfr7^B4-d0G0#{#E`g7h=^U3=QPH%j%I-I?ToA1-*mvn*49fS7rvjPgd7 z&}rk8&Rof_0p;`B$DGUrv6A%;i?XlWbjfk$%}<*P&s>Z25|ouKfd=+s-8&HZt04Ub zI(fRvs=eM)pF!EabCHOKi@M>KSDH2d2H~V~;9C9Zd1t{@n4(q>0}`u`3}Jjy5-f&) z00actxr@B{Be3VO`u=KZNMSQ$pzvAK>z3k+>5-$S{=9lBbAOFR;+W}_Px1E^iIa`; z!eg`bKQXtXIOd%lOwh4V5%0`!`|;T4QLMI4VI}j=etuv%qsQ?N1SD%^1w#}D=+FaJ z4C%(omZJoREDw6p>y`ET&JYXB`SYxvIZgUIII*{21Z~FJgchnr}iv0TOQ?MePIA! z4Oa&9fuCDRsAcD8x0v-dVPpt!^Yb&4fWi!H_$2>pPyw6^kQBr)$3a|w9y^d`>;=sq zUx0ll>%R@Ln)NrUB}tqbwYF{jcKzv=Z(Tq?(cje&6$+g-d_0bN6z6P19PzL$K&Zrn zFX}&;CdivzZnm0!e?iN~rFh8R>@tBJZ{0-59Di8Gjlj8NCCI>Xiz>XkC-Cv%qFA}p zy;NDdS9j4KZLiC&oxdDEmGSf+XupeI;Ann2P`reRPj7X)@vHCLdsSf4rpAVw8VkQW zDDP=Fzv4Ywh3lwf?DYY~omC%{i)y}XuDdkp^5<9GYG_~8NI1o8F%P5iu9=U++JuD1 zl|Z*{j)a+TWy@ZZJLNRq2(HLp?C?$R40s-5rCzK3#afkhIIlQN41raPN*%<aSZ=(N@O-^j_`ZMW0|6KYV5pVQ%! zkt6DiJGj@u4>xJk8>ZT?J95`%^5W|8q$_`H(vt>nP8lTm4z{G6{hJgJdJi>QbOfg;2se?ThVaWTd$&$rVmE5AkS`Dz;>k~6)jvCW_8EQ8LYqxO(k8FoB{J09E!F)| z}^M2c)xr@V>JTS z2b)@0Rl+1f29dq=0sWq#S|vN8=ZezjGMp~yfHl#d+ePkwY9txXQ!Mvt!=(4*ki&K& zmV87`IX@?n``u$whh;qCVE;F{+1#{!jy7}KENdyLa-_v?QMX_3}R1Y&`mV z(s~zuv*)94Rt%^=Fx08^idHzFxMXUO1{D2Vg0Ri3 znQF$Ob=zJ+{#DFiMsyO~X?olgZq5eFZOJ32cv!<)00@*MK(mqLw%2Fkw#V^K$OXnb z#7~JLnCqk(ZcpZ=+*q1wA7H2zr}tQ_VoD)Z>)BN*=vY-4Bi@Y|c7aDKN2)l>%$3_o z!KNOUca0qRutcIdSHX{k6hslTxUNSelc|o^Y%XHb1Ze< z>)U=E^)cRLhr6WA?SRvkd~!X(g>aC$QR!VcZzinQWd!gTT0SitaC|B!o}RqR$oN2} zp}kkqJH#f)W(xwy=k{XA1WDkJTRp+$jKLjJ>7iou4;n=;FsJ*dG~aS4M}*sdlZ^ev^gT79s`#{+AvHDm! z&s=_Mrr}fM?x|?{4>};UiA=tx0F9EB%Bmbmz;;z)L?n>qS=r56;xM0qf(D{SdMl*Sq@2AM?e3dYp}`Bis}~2Rw7UH8}wR>o~Fa6TTRb7cn?e| z!R`3(Vjt_%RGV(X9?=bYnKm@|?yn&*EwnHbeSyNyQFy9T%KVx|>y1Ud{nDre;d}o; zb-JxiR;K44mTwEc_`{KMP)-!fe4(`yebTC3UogV^_o;*2SN5GJza0D=F!M&5uz=m!p{?F$SWpA_8=9C9~$*L)DE`L#G_3&kOo{)Ee52H;o5w-)a=Cf;EDrBl5AecOS}uxcioR3I|&52SsJLHIsM{>Fj&@if+C zPxqKTv~_0W%s4KgvYrw5IGIq)oRvR;Vk@lY<1_XhmZ?Vs47Mch5l^E{3hkcmIt~o3 z!W_XqA{CjJV=UMQWHZ z`yhfm60n#6Ux{+pG4zuWMvRT#$VNE5fx0QPZ~b zY7PbD^CVxQjBe66(E&>(K@ zGEL!AZ=`S~T*K4v#iKf1pp~2X5AxenI;N0XW?xgd87`jJ zn}@-gSRq5up#hSLF8=3}g3fwPm|j0=`)a=QynHh%_V(=~+t_8x;wHEJX`}li{am0= z+rnLdf_bE;dDl(o-JL7sld?P+qj6R>{tK>67Pj7MrMN6{sj`Wz*(3=`o(`AnIw<37 z(qFLxO(VMiD$dQ};oCyeUs?NY`DN(+q@9m<9^tK$r-^g z!->Zm$>g5w{1(*?6*cIr65Nb6D{S^@E)xD|Rw(8$@cHW_j7dm(sbX^$@VZYm$h1Skfh3=jGyLedbAqSlFKiP1QCeUr^iKe zkw2|q0GdjshS85ms5lLKgFu>97(sxM4w3Q0q|4jmT_6%yL=%f`0kR?BKR_M;zN)?( zKx_g^-8Z0ff@-F2A!X$*agNg96!Ki>s8{OOo8U1Q2M1FJexAG$AyYel+qs@FakiGy zlZTDEld@`yA9Pnrxe@bkX%{R_->;*O3RcG*Mc19CAKJErZyq2lK*59?jO9VH0;A`j zjbpnz53i<_DO=X6uLY6^Ml6^dQyQu0waGh<+EGm{b%`{f+6ngc1YGVC9vEmG62adl zs54@P)~_oyLfdu}Iuv4;D(|6<9E#YTQwij&2(C=hWfJbXTl;uF#joPfP)iB~QRYHRlnOHdiL#N%+Et9T`6D1{) ze@Wg8^R`8trE;5LeG1?lDe{gcjU`i$%ATTfkYspHT%B)#TnCA#?rl_wxwE%!G=6kiUh}NUg}EYVl6^( zfNGe$*9VSG|4d4Dr0W%E<3|RjmA71b;&$;=$@xyUbbp1#{k)jgcXJCi$F`TJpj)(o zEy9b|Ggsf7N<4EgWvyzTHo3JGwtUpF&scdxO~MH7ygiZ1pZ+>fqNIJ9U5hDeBPA$1 z6mqRUU6#ju%BcNuy16=-_F`Czx4!T9_YaO6u@x)j+F1%E&KZ&w#)_gqfrSEC(P1a` z7MuWwA!9t^DDuG3R0yAV(dPaji(!=FVRhT?Z<6JCxCQlIQKxx8*v}6jb>6Y-$bGm+ zz*`~av0Ga(iJ5ZG&st}nXA6iNAx38F&+@cdJ;l8qH8mu15YBnBAZ?Yz(xIb^Q7Dz5 zUQ<}{6h72gp35#_R915=#m8t$rTq7x_<=*Z21S|u>4-3)2=F2w=#4&$r}y~JOTcEM zC2xzTrB>ww6`4~Gc?{AzSnkhD^sUg=+=XYFkY1N%liCrBDIl<$VKbm=YBN|P8IC^-w4R){aQMSKLk321CuSP!iU8KwGvu871ju}XozLMgZ zA)=pTM+8?Hc0?{jO|3$D9m(q)bHa1{6}RnxYrdH$3F#sj0j#cnpf2IJuE!I{HcaZ= z!riv?uRtu!c2*(z+Tgwyh-%j}GH{yiX(}9sJ!aY0Aj*CJJ<~>?4$Unapea3^FThcb zf1!`CQhrGhw<`K~DPPlbJ4Spf4w@a|6YO^wzX8q0IKh9Q1V@a-Rs_I0QwC-P)#?$h zZp|3O`*tX-z>q;DH1c5A7*aF6&a1ZY#TvF@aasizGr4Xuxo%km9y%2MM@!mfp=G}7 zd*(S|6pn50JncR+blfhX)|4|k`^cUm(uOx7ZQAKA6^{A` zTB4iyhwgfQBYxDYqbP4L+Eh|PPQ4Ls9`;LP*53pG0@^SXJ}iL!cr7Ci87jM<_TexJgz&Vx#s)ra3rPPSK|S5vunzG;e|BU9f{ZkSCtFcToRAH z9;NdiNc-6+(NJxrQj7%afo2x{ zmjzkG8>^W8{NE$qox$x%oV8YXvu@n;E`{5(F4>%@4ALO48vVKzS_8Zmpu;#b0@`5& z0Av8{?b!k_EaVcbqz;kxOZGJEIPpp0!*r;82fRR|t+@%wTZ8Ys;i-zw$md}6K2X#f z!sA(NuAW9llFtTwLH_hQX2$YaCY*V4*th-wbeXWP9UV0l7I}gE+lv==SSg?UK1t&9 z#p6#ukI0L%HMa`csTe<7mjd4UnXekJ68M&hA&C*g!or$e`NN2gCOupX)q=W4ta|{htK+oDD#lS(YPb|aX>X;9 zfZX)l>V?9suqNG~$2udjO>RtlUgNPY7j)tq%$LfMi2VtE#c=o39pp>%{lV(NjPaA3 zM_3ogjzZ6`>~FFECbyBe5;ziwez`qUwQA=t%|bIy{-!m4)9HpA-ga-*8jf?G9P9Nz z(+nBpeJ`jCHZJ&6Ky)c>gFBv%&$^Zh&RQ9n&jQjm3f*(0YhRBb+!tvLD-m)Ea|mUy zs*#|`*>d(Z=8*l`4<7QZ5~mLwbf~6G`rM04&zrtQJYn&?%E0F72y#grK7sPWYHi zseQRuQv2h~Rj_qdiFbHI{tl;#iOBtqI;rI9Xn&U5cZ_$%9xmy=Uv~fnf8=yYm^>Xn z_9AfY*W=pEx|zE_%K;ksCbE4Y$>$5z;o zw*%VUw45dCTfkJG{z}5N@Aj7LK6eWZnqSv+-pq0dnYmn31aC6v^`pqH-GtiA7V(PZ zGCJhTkKm?UjX%&@@=&SO#sfWIu@%x?j^irI@V#5ulWSXC^nJYq$doxp=~?sq9yJy0 zxwy9BP}8BWuWDtFu}^-@Q;zBK-~8MW0y)diVnv1XUJq~z_$ zR*}W69-ItSl@$WC?g+gAZ(9mNK$6*&1aNk$<~G;Z*|-8xP}(K#)Hi{SQcbD1Iwm2m zSFODJE#gY>fhIJQSCJ16@DmcLC4^qs>@7U$+w#i?06JwNWMA(Ko|?JXk60{vhCI@b zW&vmt3F=q%lA8|7e{@$i+Pe>e?0+W*owMRkD_qOY|^mTKk53I`l^g?2%4iDP?+>6GJyDaFulO}a0|Dsb`wS)8F zFe;E*qSzOex^Iasv_0}C-bE^2qe1W)|A<|VEo^9l&kR$eJgb^o z_GY@w%svPBj1pMGI)If~5qsxlvbn2+@vz7?!6g7C$=i{mgZ1gW9}W*n5&u|iV_8h(yBjMl{2p8+|FNvG{U~Dx)>l+auHm7k z$?^@oIN;(l*l5sWbt6T8`aKBfH171Su9eo7uEJf@#-5*wTFL!Qz)zcRg<+pYHoSqJ zU4N}ZVau7LC9tI4)SbGJil3uhe0Y!dNw7~zVlYiGtE}9%UfFx*lOFF@)O7T(a-9}p zSk{znE#cuYhy3?A-Y?hrWcT-lYa1;0baYWu6Ep)z9>^wSfC_3n{2=T?BK8bxjES&4 z)L_v~?7Z5|yI)TpB!o=kR+{qm`HmpNqSrv;>%G|HGV!7Nq>rR!)4Z0WuNmJ@l~2}V zws}wuvpf_4OM{hW7%{``0!P2&Cx&5 z{IRk1a{Aj00O`PQoiP)?FZ{(4(IWP)eD2t9Ui!D`Dv*vO>)q9Ch)FsMG0!@37Pd3i zs%YMV!OG`_%K_*`*_8v%v45a?8%A+)yuE(Isq3=@u7N17zp?vk*DdG|FRM)DnTJ-p z*oXSwZOi?A4Anp{f-VjVa>!Plfj+WOP_zOnZncIn_sjeLI;z%=E}M&MZG|>=TXDuf zQ#-Z8u7uA2dhfM->(}*bD+I18g(+Sz$DO(M{sONATTZbH?&d&C6L{35KQQOrF37B9 zjWHEUj1nI0GUcPF>SvSF4e~r5>ZFM^96TIR+96X`doE3>6HWKxEcJO6 z&GJe=-$LjLpaBPH;x_zt32;zA%B@s&o}= z05L3<@Ckeani)xO8|!ZtI9J}zM^y_~GQ$}&>Lce;X=cuyZBkwCQ6`CUt1Q~S?T;HK z61O}aFQxBWH}yJ&R_A}DJu#3wPc@Ydo$vKD52oEv?t@hFB@crjU@uZ@r*9rQX6@L& zLYxKMhoQa)mgTeQvw6jv$1P=InIix%WA5r;Iur#ucw|?y7Tl5%t2APku7~^{pXR^#skIv7Hql zqYoHj-~2`1f2J4t@kjTGAqgPm?^K38oft#FM^!1#+vz?83KftK=Zapu?fs7+ ze_HiF+`F+9Le8|CtT`1fff@>Pn~a~^dNk=EDQIV{mN|{#e+HWd6!>)&0iVP8V~-Qd zKfiw+Oi>>@gUo(-$8cXRTRLRT76`{FrHqBzB5V=SBkl(mhkZgtg^A8)XP2gu7sz`m|aVrg+#}Ni}pG8 z-wBFn54T8c8a}gC34h_Dr*iEG1U5Ut*HlyZR_t3)?k_0LeH6554{dHM7U}=(I5~G% zPOFbF2@LmyKD+bkx~+k2uNjlV?2FVg!d-y4zK6&sF84FTGm%o-b_aYTqQH}c@B;~j0mI$)vEMY^mhPDshw6?OiR+UrLNuI znC{=&^xGXI54RFEtox!aPyYTM<@5Fd4YB<4tIbEwU+uO zLH>K!hEt=zkN*QD?bJP|eIu+_wpgEHs8ar zfzp+7??Z-+JD<(JQLr)LncSGyErLgU9L6{&vL@ImPm(F;$;QJaU4l(O$@SDYYFuwb z`mj6ZVPl9U*yu)k&7~0(r!6~j$Wd98uNH@@m~1lh1%Ng33GaW9A<~C0GLBB~?nymE zc{YF6uUng=HhumFDqAEqOP*>C%ekbMGtW7%mt?f}n=owhkX}^<79q>rB>~sGeCRdn z_bh%^5YAWO3EY^#SCz>O0XhgESOZ3lo|_ArZwVw#=yQQugsIM&iqRms0WIG_2_`Iat)^W=XZKQA~rkT4P|el6o7TFcf9T6s{&LYqhD#>O>W$PX!M3dkU49PHG@$7vVdxF?NbXR z8J6IfysSEjC#>d|gG;!M{WYK7f4SbuiW!}R@i>LHpO>2Ws11P18W*pm1&I!rZru~M z_%dxCbqW5#MN2+6xP3dPJjTB)wRBHQS;_6$CEQbS6TbER8Wm8;QCc|VaakB)ngBx; zy4XFR3ga5+^DF=dK(lbEZ%r){>~%&Yjq8(vM*5##N%wb;7|Na_?9HiZS{J@?_hq3i zmAe@w$}Ljyb+)BaW1o%2x;Wy0Y(xV)fRQ&%6Z{!u3Fv5FB=fo8Qzzgp-50=gcWGG^ zM8l~Qx5@aYO{k@1*{4Gxy|SJ~S-7SQr{UeEXThocOzzJGvtA*1lJ! z-t%bNHqsLpmY6yeQuVBxhp7w+K!4}~?)hHJMc63^yY#(<6a&S`4P_7V{YoToPeEg- z@5UK|hr~}SWtC|PQT;8uqMx33QCiDH%XC|2OXNB9w!QA#f736*u+C3q#SEIB-3$>* z(mSEdXY<4a36}qI1X9|1rRYQLo1!M;TCB8ElYCM!0{=2mO+qK;`hR1I19td^lwS@aN^K(Zy2dV zQXQq=csQ3~|9*!Q-)CyUFmEpfm|iQX6GIA~c9<+-jiax>9Yu8xFP+5y13f`6dx=M$ z>x=YS(|bFWC#ui*K)r4*D1bDS5=YJ-$r1ers!7^gtYWun2^N!{0;+sp`zpI>aIRWF zdaHX1AtixRQm!D48>d8~YI%`wP%uA&?PWe!!TbFz3#AHM^6$J>Z5FEkB>lO!NS%FY zpK%y?v_UITo1ADr!t%pX6)42$^7fbg)#R};L(!uJ-g}0 zlmPeP4;AHzGUgU7GG@eI&o8yu@?^ zf`cty6}{m1#eJvIP76=`HMqJsp+q`yG4DR&As@>$y3uc<5Z?@IH_W@i$n6Xzz*0|b zKRLWl{&Pp~!4X!nHMKGOOX{d5&zf$^c&uhuXA0BMKadY5@_Crzq4=`x@T)~@7Z5bT z{(v{8%aRy}|RgL%HersZVb&KZ-avYWZ(Uh#igw`0fl_HC|ihFZ}e!h4_fhR{| zH*~#6b^1eqlci>f_c&KIi!`pvn8}G*h!Zv~f_tDl{ozB0@cSc-C7R#`aUwytu_+jB zE=My5?a60x?%D@VOTVJ##?GJq2Xe4D?bT?@6yM>K0c7vhqg2#f)`0lFa3L_% zZ{@xX63nn4AiYZ%lq6ednQ^s2LD)7b`%ku$O*%;Z7&KCwFW3Bu>DL8yNA& z`HU!}VUD5>_5!V}j%6HaquKSpVTNkCbF~XjE|o9=*kK_fep*HkL6k?1Zr-!>ui55n zrj|f6935d37jH5-H~9c)fCx0+89cJqK^qJ(F6?5Q19sNquvK0OE)R72N`c^PImW#JoD=^0kk(JTV5TB0d57cv?kdx z(BjjLCAkZwrr)%0_wUqbZSyk9-DRXtJ_cQq28Cjhj0+_b>-T1fOXjT#K8y+!g_}W%kuTC8beF@baGBU=gfZsrUzWKs4y=G^c^KH zc@CS@F$&s6Ep_|FZn*SUH}uE(_^wKwbUj8?Z0pjZ%pb-YsI^sj zbKvRw{epW9Q5rZ|1rvh}9a**3E9sP#Hyc-Eu4sL}-Cuv{L?mAk00VR6jSj17e%^`R z)NV&KLHNUmSHgLldM|&Gcr@_!PkH&kZQ%#hu1#$< zb_+Y6U-=*uhuR>CZ=T#GDSkh%xu-{Jb*n|4 zSrPx^y>#zN?7LX#gjt_m$8`+pd^dW#>S5KBS-yLUs*0!a4)(a`oQ&dY`OQ6zY;zcpIWyH`{^)_qSbw{cH3utQ(QPFHqq8Vz;>;-|sPZ zLxL9W>@$-7(9@eV=Fj;E?1HhpahtR@r0s%6iTt0B^;OW^>2z?z%rQ8dC!0yAfN3)TM-b{U}xNQd9% z1p+&u!ETagkR)u0J|dvF0Nk5Jj?Exizc-{sn-P4op4X0o4&Q0r;|x1M z4aDiAd4a&4*)*K>1(TUN)xJq3um3b@3nq)s+piT=WA&|#YW(;9 zT|%TXjl#lqzr$o&C&Oq@2RPQTpF5Q&!5NfC@XS!N&cH-(Fo$AQpGOJP@NS&X&m2tu zG#A|Ik{AK=itK1`|8($u!@X?vQy=VmzGJ1v1q_aW=}(EdYTX8t1#e8vd}U}1cOI{; zxoJRJEvR?e&SGI8*)f^-hFMhKw1NO6>hUJaz@on-`MHLhYrlMz&*U@l%l5b{a!+n9VGz;)8rAB++Ys>Ylf=dt<`GZ zNawipRl63BX2-HBKeBlPRkiMut-y&?`+;3n2FlCy-a2H}6*sHqG3QNW*%13U*d>EP z0X7V<64Owj$^(yeckk>8js3Yt3+j~&iJg9_7ssg!+{P5ES%$~eR`OJ=+g8f5+AR9! zKDet*`)rR>ILoE(Z6b5`_2<3+Y>8@7aa6D)h%<<#UUnyK53XbC&K}v&3S9kazYGwu zw@CUA=!`VJl zL`8W&z7_vaP)?@$Y1{#F2Z|7gD&jw}rf^M$u>1rMn-&&omBjadanC0Tm-~oum5_Lat zM{yiA)0O|H*GS31u%o|nPbW=k*S=|lRbfGR|Y;FUgq3`9WSAG zu6tcUe8g)d2=b3zz~}iA)>~L9KFgw*J2-;x<(5f>D8#RTC)gBXuSh0ql^cykth`xz zmR~A>HF?z9;X>4;W$L6Ii`~<9uN(w#UJ@M5Ur$X%Wcz#c)*$nzT%YKcRsW>)X?ztH z{j@b7t9%baA0f);9~FUp_w`A*Z1q(o*dUiTFYNIxQMU$VLr(}RCm39(=KzE9)q^8EmEnLkc6B{WETweoe~P2#|77@> zfqn8GmsXQ6CZ5DLGJbhsb;bdG2`>c0htiuPW#r_)@MZ39RRbr=GAvh+m^Jl3kuciY z{Ir-zq};pEcTqXtPwtX`I`=wF-zuyyfiSuH-wE5ng}OdfbE%)gZFtrWzDVpprQK>{ zSG!2M9>sBHr76M3ce!Y6D&!EKrRtKs z28(+$Vg;8SOlu_^4eGw7_4dV>gI1pz2NwjrTfHSxveLn60bOZ!bDd)o&%5>QmF+vU z^t=GrBcuN2qtBPLuwDxKXlce8zmEIF45f(`e)5W9y<*|Z7B@H2zlqYG&b;6=I%&$6 z&F(Hwjvs&d^ZN+%cGBA4Yj~x}edvOPUn;h3U4kM^poWRNV0Sp;sFOJ(Isle@46e$ccw%49M<;mz z%dzLlFYAAxo}`Sh%|8*psSHGavaPWPy($w)NoEZfA)P`X_`fdcS>$lP?`hyfb`z!V zTr11F(lt(-c1aAIBq}oEg8W8c$pJA~jej8et3%RX#7bqh^?EC_fym7^X`y>3U=@GQ zFFg11f0?My>H!uDWHw%UoUQza@Z*Za*q5=Vx`8uD@F^4S8~5z0dPftJhf8TUIKO3V z+&9mwOjRN?*DD4$3mMnVcSyG#7a1F}HV}=-(*2r^9Y! z-5X=MEx8E-r(MN22fiA}cEqlvXkCb(*8xz=;$ z>(;$jz!ql^#W!p)5R7uy`q4(6@nIU@t>U&@KS=o1-q;AB&g+5#TPueB-}n>(+8ft&VzGf+-!YQY9pA zk`TFu8mcD20z0~B_r#?=DIF_WSr;w>p#Lsu z2k~u7+z@Bm;B&2orb%VZEJmeb%*6bifX_K9ec zUDR~#N>=};4W4tM8-#~v5uB}l>sM4-!XoDqL8r=8H~*jyUue!Qw+$8DvVTp$O^Lc^ zrLuP3-tSVSI?g|J$zV&OoB*fcyF2$1g_B`lE=D2Wajv`HaUVUW+f8P?9jaSZ*K*C} z;SPw?>ZhGC*L+73Lx=f3-$K}`f|>e(BOLSLgHQ`(-o3gpJd4?EK&RiL_U!>`Hf&I` zmi@P_fdfCsUZw6L*|rHt7#z-wZCXK~J4xabuinPSQMZb1EmEi7E47)}WyeB7*9^AT zVlThhMD)ZNgc_-adyF4)dLWrrBR414pyF&-m)L~SpHFf-o^(__v@{$bVlHS0EtNf_ zdiwor{e82UBUagdZqDFzn&79qK!W3xGrcU|B$vDyp>l6f&_@{bOVE>I94iuYE>;Q4 z`ONkEEvXAf!JK+&2%Z9!M#eLw!)o3-h47tHf-0ewH~3zLMFk^B^_sFWOn`Ojq*(dfezX<>KIrrWuEpj$)0?P|1+WuYT`% z&b?IIcFQLd|4NUvN>1*BC-ILHFq)8!o0eQMYmvj%t0k)oc=53Am9Ae2yvw=5wUwS% zmt-zK;AqWgiXMGcuh4%9wppdR+_r4`EBw>Z?yaG&wCn@LP16F!s*~1hy?4YnZ#Dg+ zJ$A4B>#bq)E-K^6pOctY&&nDFkI$iHrTvp1XFKI0UGvGtVwole1F$b<4*V0cp}NQo zy?Vnt{U?nf8=5h?c>%~?!I1!+-=eAMXX?*%fUkC|cIxGxB>f;)6kh#!^DiJsC+%+k zp_Mcwo%yil7iZaP9+x^5$txfB?KYP!gZk*Hey@|ewcKVPrH=mU`)`h7T^u`|68~zj zRDdtMBVNUwLENLgz%|PoYgdM@XXOl)oFvxw%Y_O;RwpZuGT;`oD8CrZX4wTDob|Qf$U1@-e9`aH}}?N3ZQ>yuE~*Gu6C>Kg~C->+5F! zE;()t&XfvSw^zcp**8`KMEE(w(a)^aAuI){4u{p3jZyg`rlYboV7X8fF{~VZF*`OQ ziK**=WAzAn{5ItOI64czCjYmK6A~gJFq8%XiGfIWHxn3RjFzrZQj*dF(u@!o-E5SU zlt@XZFhW968U&>!zt8=9{({}FZTBb6bQ8NK#EtP?QD}-VwaDkV*fDPhmmgFN$u(? ziX6s8Sms!^Ura#?oj+){2IDf#y2ek<$*Jp&FF$uF z3T9|e_U`qc0$L&@Ol;s-^=tVDE*$o+leXYe4NXU7v#Yq zjn5ZFGNNQju3c{iOno`GhM=49F*3}%s(mmZY2uD?XLO0xuD-s5G4CDuIiJIHYjH_l zo2XP7rDm4<&9SY!-M zDj$34J(Hy<`m2~)&c!=YYp-ST3^6aIuUdA$~x5=+NqR z77iEGVD~uy*rBI1@3TNf`cIU^j!^J^c0xPfvubW}&T!u^!VHcW1S><- zRaM-#vO>Yax{i2;j279Wcv~gI*AuX0X&0G1bUDazV`RPmvsKX!zq-0Ztz}#?fPAdT zD4%YMcWbPn7OVZL0rZ`GQt(ABo$~;ZsE)2~S`$%>uv@9~+7F(q5hx(w!k7Qj$*v6- z!fybixyKKYu&!GQMBEk+I|5mh42xlrW}V}6@o?5M=FKd4{z-1&j4dEc_2#Zc%+j#b zoB3SfhZUp|EE&P&zRtT|`kVv+ugfPH3)SSvQbW2xi~2v+BlZ{?-&qv#ZR`)9%QfsF2M^vZX*K+i-|2{CT4P2rMxn6Y55qpsO?9P>Jur9o_o!-lXD*T>z5K2Yjy8U3R^96N>NwIo~{TOW7CV}E>GLy^Q;QokLtZiQqp}rYsQQy z>?&$;e?%jkI43asHe1TFYpR^qn9R&&37!o_5hNhIXzFI*L+duBVfRLT#LZPFUKQ1CGr-)=|u1* z=Cg^HAF?k;yG912I%#=VSq$wl6IR0xSbUe)JoMG?EA(f*eM9nC3rA}xx{Ocgbl?&8 zn~Kz?O$L9RSb%lI;CE02VqU4ABUj+)OJ|ui5l38NKLh*Ri#R*4#9yW6ZC!%Xjf&5zz=rm7Ox2aDjRfA(Tn5W8M?9Cg*qOZ|M(#3#Eu&0A1TC&hpABf0$^rSO z!=MX5H2!sJoBvH*6Ox{sHp6rh()by3Jm*XdkMbBty^J~}E9Kor@*=I_ z3*&bXS2ZKG*o(iY#fDqp(yeVzUL5Ts=Fdk<+e)!}gLSF0d{@2~`!6iZB_@9BnY{tC zq0VJh0;9lV?k7+>wye#>*HB#883uvX#hnp6(h6T4l)-70K1~7k08;rl3|w%xHpncQN&&3|x|VWV z*>>qyraD8KhtNQpHHG$k4D=Hwa$gALa~ zoBg;%7$dULUR4uj+7CCrF>xqT;$Pv^?GtH|Qe_qYo!y)mq=7u-`63u5cS#6KfKgi) z4+h!X@`U#N_1d8P^)1z_ZG%Moh#m|C9X0acg7SyQkF0-iNY7>ngOCdjdS)GLB$5S> zWe!UDTiv)S;CfsD1$eLGr8Eogn+pI0*?ETie98fDSf`0kQ{}h9|8TV@$w`-qz?n#n zK{$`_RB>HP-T2M6?ONe*{F1R;TiKBOQk}+(7ITV=iC}?Ev>u6f09LlF71g%dxhy?l z-bBNZwvKm7muLP8ZmJ=i^wsUYzX$uRVd7m|^@AroTl5!-d^dy271aPJ)yzBlB>99v z1G<0584r`WxEI9z$Wxv_Rn6}G}(PtJIT>_JA|uRSXjhERy;eya8^MVS7t2~fI(Qzm;-g@;7^x`*I) zXEyDm9!XIxQ$h~gMw_(dVoltJxuYq&hiG01@=?OcyW+RfZ%{++)$fh}j&a0=8gvOy zqXz@VH^yrufS^+bWUtTu-r97`lsb~y*oT#0#=c;;?REy}QKPOf(@P6ix%sy(kNs<1 zltW5~%x<=WR#3AYnxq5mz~zmzJEb19=KDKz5;qx8p8gwm)i7F4ih#Fnw>w$Ux0ieE~`6(M0) zr+@hlKUH0!b&ST~1!iPKpfiIZf^wk`48`A^?`v0=kQ?Bi2wzd1T;j4T>V5v`qyoJX zeD5Hh!)4_FKZe+Cg8m#h2bN~K`N`dh>;H#0)ECzAW2V9lHDo!L7C*;A>2CV|&1h2L zJ)tYMay2GSj;P_@QWQzELy9owyA8JLOCoD&6m&wtP|(lR6s*ciDDP5K4sYB3uzOZh z4syT$xop2@8?&zymcc;cp@;05(`K8LV)G2Gydl}YIf-{ik81NbDU(U-2i-zX z**3J(bvWDhA(XD=8bi$GA(}Db>^}Ol(XzDTW01RMQ9?x1i~n&NC?`NGGjk7Bz3ytl zK6j5Beygh7G`>B%d(FNbp?g0X1QZgbd{(&)x-*Q%h4dEs+=2cq8XdA5adHCf-3Kfu zr)7?g(spQfg44%hj){z(uzgJt<P}x>vD%67OUkM$))mT>c-Itv zU#zWSSk2j9ZoRd>bzQePQrImzEKpj$lpe^fvHfM6thLPrX^4>p%9~sl=<0x`v$bFD zh=PEaZU{qIHpUNaA9bO*rLnU0k1OA&B=3dfDhw>xLqxc(S(MWh%uC zz-f%x;J7)=%1GZ*L%XcsdByAzq-xxg=;e$^lUs5kW5)+Dc^7X)-d`bpNmC{Pv3Mfn zAVHB>J3yT)o6k1+*;lo)U3B-kFSnUkV8{okvYZYg8${$aYpMzD$&4B4ztC``;uc+` zjN07`+55FTSXzWp@R^Md`l6VCP7cj_{%v*T?WJ9Ei^@7hq9DI3S!sl6D~WF*q{ACG z+3d>^KjnSslXy;-Uc2bmlZ?Wo-K?Stv4 zWzU|QD?=BfC`uC0K%(ryr04`Uf=Yn$@a`0Aru|+@`n9w|xLx=5Ohzorh@ktk9ElH? zDLStwyn-UZsJ4gwPd>NoqEs4u=2DF0p_ivMx^|k9))Q_d*`db;Nq}LY#>4l^+KjRD z$3YR}s=Jo@$`{+2$?8~bC!bf+3g&#w50&W}?g`LCqFniUVKez>_Zeq6QYCnwFJ6U& zV6{xxFYzw!c~i}oz2l{y)ZSM^Wy&tp`l<_7GM5X!-S^Z)5SKlsF8tJX15TBV(OlQ7 zK8HDmE;(1%d=Y#m>VDTisl;sWU&pRDylH=rdfzf4zS_&i-T$uLJ4BPX`0MY9;&+G1 z0xQH)Fv|!#N1{BXPU0mI0_8E(W39_bSPady*^}p#qe4pKGX12HL1Bo zIhLY#Pk47FEc$sm?_N9bbq>hcOZ9R_{n#~#;&Hs$t#fD+O-op%W=Gg`ZeAT36VJ2p zk?iWHOUN49^oN`>fC@#K1C8EJkl{FfY!1s!n+ebI|3g7){t;OzTCn{sMQeFHv{xrx zn{mgmlyhd1tS|$y1{b0A;?Y8{l)Dy>N*}c0?^AN1gIOKGx*K!eJ_$($!YgpN;%4_( zl0E1@!;BJ(D{?{-)=#rX+E5l=`x5zXDTPmLyT(ROSZtzps51p`(j|*kxb18xPIAb-lye(re&ic z?=05ztF(J+d2LBQpV6W6xTjs+`b9p#3ZqG92&BrzGmYnAkB17L4?9P5G z)^C~_OOnM~awE7$aW%vbG>)7?~ae<_Z(z@Bgy<2xc-`JZWd-sN?l!mBCP?I z&hG8u`u@Qm6Zn`w6H%sDGQZvzh{7L2xp`!>8-TlstP5gJpA2z%#gl?AA^plSeX-Zo zO{IEeSV~KNDEFF$^lH|}{#r~;&BaqMG*gDZAj}2$;dT9uT$1$A9L%? z&zq74q=?NFLXAg0uv7i z`C^lzddn~Ol6H=1PdH_Pu2Z}gi%Ii{Y9A3-GX10AxEl2jepMK@X*P&Fv;(`lByQjS z-6V*@73e8s`YzKGjJZu@ZZqubr4b{zk~7>KU?(h#!?2NB#-wJ^gtQ>^2iYsOgT`w25q9F;LJ!f)`M2)GUaa`1gH-?KDS1>-suax*BLNCzZx4Ita8+FQL zC1EL*DlB~MSQj}Jf?}Oq)!y}qq1c6Fvmnip^kvJx$yP_Qi2jFe1CP4X71R#%%v2CJ z!Q2_8xyCMuv%khjGb1c!=Z61ia+(VvXjiE+sUPN@=#rId5~Qh+9V0u3573a?7k)dG zc?b7WEDVTj27dz(4BPN^j2!x9|9rENh(9gib?M(n)F{{skF=&g>-PZbR_ljWt-s89C-bFCVip)a&*s%>cz}hS8s_v!R=pFEjaL(bkmL&-0&?aOT$dV{9mCjdGmTTN$VOCGGE%0 zp_!BvI(UQx?OKAG=trUp@%!^~7qv*k&s*ZVW-DdBh81%Dpq1wrvD@Y+oVlo^k}Uo` zMHzij^^p%t7LJ7gNIi2fwMQ6Qz62E84dPJDS`?DRS;(?8U_7znLXkY`qQ+swXHDWm+(F-rAK-asLVMiYJfEz4l6akB`w^NUgW$;f61;vIE7E6d+g%U~sbM(;Q*PBk>GvBTc-c4$3q1JNySSe|qylEr zYI*cE^mnXp>)p}HkHh+ZdGPA|);Yozv6+X;WS?I5Y+o%vs?6{C*V=K}7|^s$BiCpR zNW(W~qlAAw1#&CizabS@Nxi@ty7E5lyLw8+?8ud0Eme~&kl|Ad-&IS+e~@wxJ+AW6 zz~=I+g;Qm9`-~{UjS+lL5=if#(pi%m8KBCZxDSuwD1|31#ElGj%Bh3)q-(|anq$k= z4KD4`{#h>{Yi(|((8FTQ zaasH5J!p+Du(@tJV;eV+BK35}k1S1hesa>%$+nw(#%uiQTyx(*z$LG0d!dW)37oU) z(vS7>F5}+QPi>zsj)b?_Zo`xf(k8!Kgaj7=WcK<4BTn@sKS1TQD1<}SKXAD+{%x7$MHfHI^MSE`PHn>|=}+te)ZkV+W*0gqX8R^8cEQkLMO zvtJdUe53^aMZguj{TT(3g>Mt@MdW~n+1pc)`r0tehXqy;@s#bU_eDkr8EikD^?fh6bSxR~< z85?+u>kzz-7Oi}`rG(I#n|8Tx!%y`jt`}4bA?2j}pDJ~?lYiX0 zd|+k;Y{F(5k2K&_%UtBj6A)&`dNic+-U!_JL;t@lAU4CA2~s9q3L^;1D#6)aw9BbaR(_k-ui>re(ZKL5)TYTL#pJXJ2o?CCPDUkyRDuZxSl z&vT#*!5YpFK=RP-riQJMZ1sI;VxsjK-4p9BUDb53kUAgnY?PMthT+W5_91ypyr?eZ zC$EV!=nS-$$!_Le6mM&b6;EiQF=3wjD{MfPu(B=ptJ6~;ln<>{sI~a^heC)YR$np=nj{)yGdoTG#e*Ded{v_KM zHf^;1?L2SL>tLz&fE_n-Up}B#Ol$PmZ3@pfmF{8>Y}NFLL4`ip2tA0Ia)IAdI~=5{ z0;b{MT8ghwALibaPu=D0k)n%6ooZ`uYCFGme?dq(Xncu!bzF@Qblh32-rzmBq=j<{ z+okoNRVynqlo29(cVD2_HyYT!O`nF1!_Ms%G1ab#UN6F375tFH@uBdPHIg0YB}HJH z0B?QOnBCWu^5%G(_%0imwwPG4S6vQm8)ylYu|d#6pG}5Yz^^cV(^W>IUx&6~Ouioe zWS>SD_Np(*oYL{{h;E|IGT&vuS1Qky7iSp>T7pNSt`jcFTve$q)D`?Ro7A7`xwyv* zQ3Z|T9A0=uuN6YRq`=Y_*+;j6GDnCVkgenUz&AneeEBGKZP z#O5Ec620F{^Sn*ADmK0I-ZzOdl_dUDqF+0`n)j8&ykeKVI9JH5uiH817e8wgpc0Uc z+CQzclnr#0L+hf;i*1Rl#6B7D-uufGf9ft@9<25(hTV>R!^=WWf;yE1UeK~^q9Raa zG6el~bv4sg=1iKOG7)vKRQZ5?hluQq-Anr;SL({JOz{n0qt<700@6#U-7fqOD6t1~ z#b^xf=j3nj)KrFIj~?3SL|kYdS6UlTKh?m6a%V3$^kQ`wsMl~F*P6`f(+Kms6b=EoNg*?uqR|8WVAFw_SwOf`?W^{YCKBXk2*a1>9KCeY=q8|^gBHOS94 zRX(~CFWjaMz1y+yxEbB2*{(?Fn*y5FM`DW86fmPx_VFAbGV@(N7maxRnbcuxs3 z(lh{S#@P1t#1&cQvq^tNo>Odx+PB8WQb|3MeRz$H241zT9PDH9=q9g8Jy3=0t2w~> zQd78+Q}MrPPf&TL9)04Kf5p4lBbp!ZTVf*M7~hu|!e23dRF@hNca05W1ulPWsb^AG zhT#TZM>}F=chom9n~g3Ab*l~lk|66YEBLluvMoHwFkuIYR~ca-HU=XnpGytEYHbFH zOSvtG&3>-5VEp*jAn6lp6za52FW{ys`AilDyO5afzjy4F^j{kO0&SMUxui2=3 zb>DPPVMdhyK3n)F-dgL?G_TqJW&MXgI?_K_vHRYf?ul<&zThu<}-`ebjE7W!|W|D4Te)xo}iAAFb-u5Hb^DnzHAj z;}oSE;X^Z*`K}f6-2R1bBRTc#S?$A$O&rv`mwJhQP zq!+lWF`^Jh*S#rT!#5qc_QkL8cAD^R{*c)pz#dr(zjVt>R+siWr58K3eajj0eQ0)Z zUN0o66xz;6*m>3_({x7(!^~>9j8IJ^XuwogV-|nWbAD_gTWAScSiXeacp%=$N$!bJ{ zx274xFf$|h*Y#SpaVouxk#0NiiGCW-Vt>TdT<1$2*=V2q@A=r4xwdwC68b+nEgxS5 zOosmZ1DFU7tz;Ue&C_gG_r}BE@FrenAm81*C1ppFs<}R4p7iNYerFg}<-+%@=P=Bp z8I3%zI|8Su>NK=QSRBX>S>F9BIFxwAno;v|D?ujp0xC2HsP;=Xr#o zAT$oSqo+@pdDCeazqjJ6kZCo+3^$2kD7RVZL@O<>A7j~&&i}Gdw||Z*FGu@pA3ex= zU`UfXstkZYxmSDlwagOkHwmZh5njLNVx9ATjEZrR)eG{a6Yecyod7_RI+T3=>kU}>fAp~8&|=S7U%-LFM0l0_GSyRh)otEPVzHx27(-cvAKs`4fYHU8$k3r`_)YFs6c_K~KoVvr zw6o6l=+^q2ivjJ2YezR4O*N%B4Z3ySf*UV0p#y$r4ZLYh(+hJ0-L*dYda0j{ z*^*w*eyd4nX6^EsbR`RUq%K=xtyzrObimY=a1Ke1S8h!~cIj^UImR??Vlxt1J^6!2 z?+=34I&%!OY+w_nmg>gzbl?_g4(sbQh$wBu?d%O!Xwc@PXf#`3chOyC>q4nt%e+1f zCkeTx(K*R1?v74Q*gaapcS#C(kH&WhiU1-9VL8HW?$h}nm{7$#2RPbh!h|C-whJ+$ zRXxE?VX_o#;0}cD7pow#)afIDf*%sdQ-n=hRVMoS{DivaYQDV2YkMMhEA@(!WG2~_ zRKWLbl3ndhi4(Rhb!VA4jd}9Nvr=~mdJ|42eGe8Xfv`-dC>sZjRAeH)f%^a_ zDat?d%Fe6Gp@4Mg@AeAYK4kN_!~*j(Pyv@nfU#S`Jl#o6wQ?#NcrJ2u!hA6S6@9=_ zjNV97U0((jxGw-oh!X51X2JJ4Iz}OYw4aP>;!pAqNF<#w zcH>Qr9#!!O5b%eX*c(YDHA>xp&)SIbsNVdCCu+*=wxFEA?Bb6ns+yQAa|S94v|#Jp z-~H`EEl3}gNcP!YHG!p{3}vOrw|}$OsRha}mG7x2l+N-Tl(nm>-qNtB`6P{btBX6* zHyf5hdQu=C>vqP`pH<}@G?elEFfy?J?ZVRHHsui{;nJ!7$eTh62g3M05x+OntR%%S zWY*Fq4Hib%^Ss^HRJC14CK7F&YpgN7au8Eoi?IAT45^ zr*W^*k@?hh9|d*ME>5M1E(u?%5Sllhn-nawVJ1nXtm83YXP!r_uO&s|`u? z#riiP3Ek9C824`iXp8KJP0iB2uNH$`%;(!Jnlc#%u=d~Jj|C}oA80)%PN;Xy;vNo~ z_}pM;K5ywR+Z870EA!HLB_^_&`KAf_>wVeS=D@fbC9zBw2>JuoYNKqE4>xJjppX3C zr^Z5wyfzc2UVHRa8% zAw^L6axjj^c!@sAa|OR^%9aa4_~9_m_a0EMl*zWAe$zB#|Gtj*XEGIqm+tD1oABA} z#t$XHp7Bme|LSP}ndD9%F-Zd0Bfh3b=U6VWBP^1m;@g|@`=j=uad>gi799>-k$~!s zhWz|t!n~htip3RL*RWVysp@Bs?S`?9rFEd=`*>_eRgF7He_RF)HY8foi|fNKTn3*( zJn41N`H7rnvWwu$Buzg&gE&2YnVCSrMw#_4cU6yatvUMB>AWl>E-L;8^ex zl#+@VJ9OROOY*&zRBM~#eN-nGMKTrVeA!kpe#9WSPxXoPbxC>2^jiBqq73=An_FT& z<$d?S1gjZ-58YFf(Hxz`kZ2fc&z(kz&-gN<3nJIH6fd9x}WPvM=lzK@PF z5{WEq(PG1;vJpIa+ile@15zGJhv1o~?^IC(!iWUxbBvk#5?S7M1s`1wXoD~rnV_PS zIMpfl`~>s)6%6s-pgLZaA2vELnV=|Ht4t7C#yYOK56j7&&%Kw|_8*>0>>~wV%caj5 zSh~=i0rgI?BHW@s_r75o*R^3$#8+Tpw#M-Tc_HXw!p#InY#{YH{gpu=L_SOgot6+C zFQoC=N-wehOq~4O($2#Ye9F0LbGIBOlg>XY?xHJC>IK!X&3(+mm*lc1@9ML2zjO=; z+naT}b4sdkleRd5W?dftQQ-Go=44L$5iuAB&aqSbsl*1+t7a^wec#%ex&E@V^O~~7 z6WQwYKAkO2yuqz>xcBZPY)7M#HKrWrfb|kW5Bl!>cHz9Y{_j6LA^wu89ME|MR-wc< zOO$NfE88_p651)=V)353$}-6j)nFWr)Pm0% zS=}%B+9o7BYm~T_kw|?DozZcLybQWToU=PUJ(-_kDtqJbX78~!UDNDQ*~{cZrnYh= zkTH&QL1eVfQk79Qc5v|o9_sz?GU=zO`VIGD(A^-9Q2lr3^SY4uOhw_9&(w? z6tuI-k08!}^otk*_^R$X$2}W*@}jUJET4ahUyx2EB{WPKHuxYJ{{}O`K*;02sS)8P z>9fw%aEgZrtoZLBhF1O+1! zI*s!coQFA!YaHIzM3ABOO&6PAbEt8$$G_a)1E%&vxLy1^@g z8V*g4!=xxG7dVmb*CEIF&rS_xCsf7N3J6w&EQiOa`tmO9Z%~)>rEj2ZezbQu;vnip z8VPi?j$Z$qj^Sg_YSr0?mo1}J#|&qw}ZiT(!8BkaK|;WzwFgl%VK3tp9r z#jik~cnKGA8&`8xChs!HeKB$={2qZ^z~*AFdI1TkYJAX1_#{1+hc%x_JtKib2~WBg zb2%xTzH3--N8 zH#6NH*!<=1aA7Hyt6$ZcT-yDwF*faO$vSmHdcu2PCULEu;z){!Hk&=<#$e^9{tspC zdytt;ynBi3Etba#uh$z`Gq|I9o1G*lm!YF17O$&rTA=9+3N5AQN`~9Dn#`(`$GHWU zwX_-@0!acViR5-&tXj!Xz7AI7tN3pSJj2HiFQfhb_H(fXLDZ$35f57P95Ywk_zNiR zr|yuCFN^%%riMuAy->sAh+U<`TXpZ~o)JT?P`cr+J1egB-IvScKyDvjak5?dMrP)v zaHJ9jM?A%FU^?dG+(p#T_L!!|DJ^LJ_h_fL6!7oZ*X7+k4xIdXEZj55uY1&b1me<( zRWk)qPt|u>Y8ve#^zCV=g5+9P+ZZcBUvkxC`Z^as_U4z-p4Q8w;-u;!lk50ay!GQ@VWjSgQ|74DuHJ-huh{dD8H7{c>)xZyg`HssBAuDS#8T{2l#t z9}|RsU4CV_>e3->f}>J?v31VCv#UhKUazOFcFm9xyj4zgG+edVn%(_e3Hi<*RfL!F zhiY4Yb#eK-;-4&84P`p9x^3HoL6gvoqIRbh;b=O6vKOyhDLU>Yd4k=r%mpzRrqZ;0 zvKdXDywD4da4})dkgu0>0ke;F*cg@#irl>C$cQAJV#AJ>qsY(NY zNEsy395XZ>mLw(;u@VY;m3YRH8SDMYMN+$atKVOt2lqA8h&-E6Zb2G5QKin6ArjGqRK&8fn6R-z1*gew5ruXbXvn7p0NMEUo{@Ph%j|D38xH{2aD5c z4>LXfQNO9z=hi%fCo&OnX-MgxlKSX^>sP@CZ2scNnH<_Em9k8qJwj5W{BphW)o3k( zo*SX#4ON`1JfT0envA)3IxkMSOXUfcTpiSwix=Qee}spwd1|S0>>ZZ>e5`GIrZ_2f zTyaV4H-Eg1vHQ%;_tj|aaN=pH(~9?Ht2%;#1=TL+St-=JdG&4b;6j120@s=6zpZhc z51x~EzmA3dFIW8fjjT|5j`6E{>7qJ&{jUe;;LPDm zp3r$Mh{bULpqi=Yn|ES4R+pPM-Geo^X^Ieq5w^;GjR*`t=uM<<|B)zp5leCcYRgyL zExO6Qq1rXT@Bkdc_4qHtRUX!OhwkM;QN3)@8m%8h-Q@_U&&5{t`VaoPt2|QQGy$m0 z2NrUuAB)h9ak7HXLp#oG-rPadEI`OEIx$98tA8`g!=EzfDt_9aMv`w>e!wLsDk(b~ zXaq46)QxeknhW*6O4)>OAh_GrP^lD?P%@cQmJpII?orqy!<8L{%2TZ0j^)$ko*}Eh zm?cipurlVGvI9%JyNVjq0gxvLI2o^MTWq6){dkU;Bq(|vZm#s)nlFG2u2S{fVavPL z2LH{$h}`UOYpB<=AC|Zxx-kOa=H`D@>WD30fVdREC$Ry#-?gbDI>X5H_?+I$d zlVz)?Yt+^2=Z&T~A#=)L)gY-NQ)WpKM=r2^Vgu4D!XHGmG_N^Nr_QQ%V%{1kFRf7D z`MdydZY0yQtEwp~GHj5cyBUOMBj%nz3tvQqv3=*zst42l;(vJ1(J~bAEG(`hQz(d9 zD~og#mNG7-xUSweoH1D00!x##{3Q`{f51^_hmPgc8d5I9(0eFj z-HOefEHxA|8yc~zs-umRKJgG$FaGcx`DEl+kK9(-66uB^d3YY>=ebr@ny2mXL=@V6 ze6L~SVm-b;7)i7CrT86j%S2~~O$z<4sm08f`PLalQV}BEV6h1|)jDEL#iVEDt!duU z#AUd)W;w5R;0U${c&trFpUc_Jlp)d=#2uwU9GKsHmn3Lo@PJ6tUYJZ>Z&Z3ZAR^1m zav8D>4(;mwaxUd$ISTg~xih@k+_)k$jd4T;R~gyOY%tp=3XccxaJCVPc@`>^^Rmz`N2pY?QJUyKTmUjBUn8(u$Sf)y z=w6Fby2qH-@QugHtOF_@b57eUXnmP+XWL>MuT&bi70zvZ&wzNm%4>SIR5=-Wh=(^z zFu$jAgK)>KAx-?b63XBpAg^3@Q=4(Mvmau|9ex6^gE+cLQ+I6Y+XQ?u!?H>sp~%ZkB6WnG#h7{QOsi#cTK-=Lx;o5mIw8Jek%M{6gHCuomO!t z5+}t1qDXP+(i5;dWpAZBz(qXwz21J=JQqhwESrL!8VU|nmi5P5fvInn}8|@%&wsHSwfXSK+>T=FRH*ar$&4IQq zK)l-lGvqB%z%=t|-kfQe+j&%yq>6#KBcG$sIlREG`5Z`~F#5ISqZV?6L;~ncx1L=D zZr7?W)Qh#r?`7z$L<$#tZjJ8Fjmu!o4wetjUt7zc&|Ib}zNy-@8Bh5ScSwLg z`lcKDcNgLyj6sqRV%UDd)StY*Y_sVFhB3FH%~{l!({j>-KNIJ<)ljR;V_yvT*^~mY zS*fZ4Mtp-Rn=w+HEnddlt}hA&)%m%@2;`M(Clv0qpCWR@@fkdt&0(_3s(!p_^k2LZ z!KdZIb^helLCK1@VM(lRR^O*)3paH|(l6|M{@GprY8JtT<#62oYzs=J+SD^e{euth z$)@yGXXTwL0ig?U^Ynz!W#7?s;`T|Im}Q!Ksmt+??OLDUt!q`%JSVwUpa1aoYF|gW zSTp{ryZh=c%O6?B9JQ}M7B9YZ7_cJvOMA4%H^}XmvnKYhYhvVCg%xj|$th=@YxT@Q zd8GV|r#Z7>Rzqw0^y|v!BnnaD^ehwdT3j;>Qfv4sf4!DlM8yuf_{iU9Lno{Mq4mEp zRF%r+l$}YjDFbHBGLfl!*0cT({aV+MqB;Vk{V*Gg+)#d*1%_M}xjvFLBHd3>E!~9s zh?->BR87jwkskZd_m$iCDY^yH7>Kxf$EyWa$($ zm$6ms#tK*crS5NkDjK*zKWh7p?)?xsXTfUtDQmMyvi9ZC86PGhf&+CvR5#p1O=!0_ z#arJ`It&>)#x`b-jO;L07<{vp+P*T44@h}tY6;a%R%(R zxzZK=m(gi)@q8O|Ld6#8D@R72LzuE8Z*aQv`}8L!Cpo0s;-Fj`w}P{PND$6IgNxoq zg*aXj$<$++sd0R;k*K~1ID%z5=G!=Ju;{mzW*R>8>XpSjDkfEvqKJtV>-7LS30)tV zvA5ZQZ0`-Pcgp?M$Nf=ENaun0UFkh?EKlM8B+h(TM@JmLuZQee(D0f zBw66)YlApdi<7}ec{7BaB#}rV&F2(}V*%K;h`g&2SPEyw!A)j6^`C%ln!o8iLvg3TLzj!Sdj+Uq6+2hpvH4K9o zQSXM0w^ELOhxMWB8p(Y*tK`*n*~Y`K;ZLJNN!OC!>OXoSBBr?|7xW)qlB)Pdm>^V> zPFh3B2)5Ae@&!F%D{zx{dR|2FN2u+RinV#7vd-lbw{8TTre0~ee65pL4pWL=^Y16s zo^t1i%VF3>u(ykI+3k<<#a>Ql26{?YQhs-i*+UTpfJpPh za5_plG=${UXvqnqsa!+f)kV=@|G%V1bYrxD<|GdxwkHt{u zW6#^+SMU)>tOV`-B~8{J^UauIktTtNe!o-fR3N$crC_hFd47(q9sSsW6zgsEq)w}( zBopn^?9)SCibaq|kkY#kBXasiMAt*&Mtw_K?gp~y?LFJe%YSR};$@yaegMjQqT#Sx zz>B!|Q9i8PG`HDP%+c&FvQKa7C;e1WVc^4=MbZukmQ}812phMm|1x8l=BU zH2AMS9?Y&7eq+uXPu99uL;gkDQj;+L&Hd}`tLJB>ekL=0JukS!zTGv8-G48ao$^#8 zL=(7gxcgq$qIOp9y2A2_=5sqL#_MdB7w*gmKHqlB_^tNy22>E2EtYL~hG>FJkST6e z8}rvR|TY3C;7^_C#;10D$*!?_N%{8vER{^Q>?(rE2V!E$r6oubf#jkjK2N9 z$2zNNe&mSTz7kV8B*rrcRESzinI3Bk1 zUVgXwgGKwBkh%STU%eK?59Rl|W*$ZK%2%6Hvu0y2sEgknfGmvU4udsYY|S$ieSz2Y zS>@8x^wGBtxicNRPw?M-kR%8~bjk*l2vDn>EW&Im6h_&=PiTL}Cu?E8Y5lxU$5B7- zrL01^uJn#W6i<)v&CpWSi#N6_oqFD`MnXbfx9c~14M}7TJ(IfZOcX=tsPRi}7Vx}b zM7&ixo|j=Ab?D2YNT`c|Y}T=tuBn=9`mV*n_`;(iVL!an2?g1lO*|*|3xdqZt@YK4 zKA%Y$1ZOChg<3ynolDn16O$(Y!YkI6BnLa+#-tq};sh|nckQy@Z=(!b_$29#*^Z}; zN(P#}`MGZ;p^tBU%^osUC?{T2)ZCx^nHIEF@L?SV*L-go%xu7*)q`r_J5FAwR`5tVyHhn;=0yl(VTzHkdeoc|ibEk(QYcyNY1D}V~PN>4I+iySamfTxIHRFB9O|6% z?_FDy#cxk472xtZ*E4nH%RV6=m0BgEq_vznZYLtAdDD)2)@76{6o0%JV^_dTfsW#k zhR=4Yrn9a!7eVrYj-1xL)wFVBk6-0j_nL5Pb1*#PIHXX^Jw|dwWNsDHAm9_$vm&yF z))gu~Y;`rHtTuo-Gyy5bIjo!8aU$+Pv~&2@jtd;W<=UdShvWBs#Daz(-%=jCDgigag}{{VaX3IIbCc`N|Q zrfdSI&f&qV+ly)Use#T3=O&AZmi8~DM$kh1vIF%MIx7VLoYXT*<=_F5ds70Cia72h z2m*o>;Bo6xV3G3k@7kqUklq$xGGhnzt4$a*?kgFrfDH8}poYo>nWt1x?TofLtqCG3 zJw-xDArIck z`kHG&2dl9?)IL>y^NurEM&IqDUyOZia zolCe1WT!ElP*8y8l!^zx6;-#smwx*lU3rCS=?tCAdkwWA|c5+ z`qKi9#n_Az4;2hDnTp_G0oT^7U2Syo)P3#=sDOCY6+q*U&Y1qL3abXc7O` z>zRP$)oEsn954(y70=6dOKn0~I`dRT%a(57cC6fvWe(>|lX;|=`ub3ti@6~7&*fA! zi-iv&wmWXM74dJ5>^x$>h3;BY%vFJ)nIbl@tHkK#Ql z=AjkEu>x*E=toLJXH6a4Cz5fRw(^8R$_e8*0=a!MC!Rqpg9x9kbo+y_QQMRKDy&O( z83>zT!tE!LTd60n1N>@+rwqPNn7NRT;l~xVQO(K`KpY%4TFumetX^7s{G}*f1YC4bKT4^nAM_~z?g0GAtsn>hdQz~+ zo1Ut8sH0=&Il<^E&erW!zGR(?94Wv*S_VwTTZ*M7-Pj61BeiG+1E8p8z&!d;BQ{iz z%HJ3u_V=l+9x|tC=e;DXjS(HiR#YH)u@9Iw54ffySy@A#ds4iKj=B0)Y)tJgSPyYm z_l#k9pe`g)oq*>6^N+0y8i>j7%{>?dU!bOg`@hbR6X9wJNDPGfpXF0A3NmXpVD}To zuDeuZ^WK;d-&!s1&^js2Sc2Uli_1~cu6&~a9w^+Sy#Q2oA|?QFinOE_#WGe?5y!Xl zt0Nht#*tb=!NMrbW?Zgkk3aL-f0b_%2U^Ft!MRL-&t?8p1&w8*JOunt^Q!k!v=-7z zgDk2@terDbH;PhRZeLE6t)<6vpk^39N@9J%^sJlc?oK3tk_S~4ZpKO89n*{)@!N_R zuc-LBm5q7wKxiQ1d0YWS&JdS$;hnBx#cqsK2cjAdCHDXYOBEvsMFb8hg1wWoHLKR=so@GVbchE(*k)}fEdSK^;OR6 zCjS6*)utnYbJw*&_pRN1nv)pu8JZ{KaHyqG;F8 zwcwAvie%jA8G!@?&1FKD0%9MKM{bpcr{CO7aEN_*^sc5kSIi}d2NY}rBb1?KW1N0< zBrdWsJ54_^G`SefOac$P-he8?O0YpSSGk4jQUdM*|* z6`o1kD%{vp!THjTP{{Tro=s!Y##*=xd z8L>K_RX@yAuyYp8V%|pLQb5jm7_B2A6o|mNKEjhjOy`96WMmh`9(Cud*4c=Ifzp%9 zY6gG**LJm`&1hQg#FH82le+yqtD25^cXZ~xWy8PT7#@`crLDAZt0Za|jN}e$6FZoC zMTN>Q+8k`&F@x5$K-lfOyB?g@n;dafBvvrH#xlxD6w|SsmBKYy4iSMqndYt~zCQI~ zTilD8l_Wq(IKi%jTPptmt7c!J$o!6Il$b^cUoRaf^35*U*P&MWj33iK%8xad{bDfp zA29tn{VHx>D4toS${Sz@yD#&p7I;|TFwddj{!~l+1J%d))3{h@M`;@;pdZ$pU?laW zQ~SsKKb1+kkgR4}#@KK%)}15*O{pdrXE>>CNZ7~Tp2z1OjZnG}6+~W`sDx~zBdO-C z6)fJSo#eLDyNau%MVl&yBxamJAamZOc!*uY0-#HXq-8*GPeDU>8bz>`AX)`D8iLA~ zi!Y72f74a{D*1XtM8J$ycENTBka0%xIi`loG5-KPDOjtRI*y@t zXE22^w*Z1hcr|9ydyCXBf%5U5#;jji!*+nnkW-LHU!_{Mfi0p~qZk5#6@0f%!GOsb zs}}oGFbVgkxcQj>0I~ixDktvOK7yDT&xE<(ju>-~T9mS~oK%wI&QLuKRJvzdc{Y9E z4nDL9m@osj)g+#vq|rpx@RLuuT(=dD$d2ig<Tn8!357Ps^U(m8g*{ON68d zs-UcZ5t4h=T}BIuka;6G{3`mk>9BA(q?y@9$j0V83Sd{Tx0X1uIp@$;fxs0Vye$%) z=PY{Ff}_%q%v59+>N&dO&R0I-5iQ^cbrWviWBx0M;Ij z43R|7KMd!m(zLFkdEqgq1keDA9YnAk8dEOcmSME|_M*zst)cSR?j+=zl33q>Fh_b~ zBei4Y@s0@}ty&J=)mqXNA;Ib#{{W3#@>j7mz^^kBW9j$D@-+Vd`EEbl{Lze+yMD)OXN=|1v(f1#*ua%YIah~daG^-Qb#=C6J15Uy4whmdW?d7PARK|)K?AVa(0UzBz;agEbu@n|1$5tKB(wR3bNz*>{9G~h=Kf6lgg!#WZ zZw(Ru0Cs>Plm=0eRratv3b+6_B?&RSK^ckp7G-#?v8$hWgAjZIV1XZ%2jihl{UfY>9b3Z$pn4jv~>VKVD zlHHVVUV^GdaS8f=N_R|~cPyert>y(#$G$nKx79f2jfVtrQ-&V&iYx}FW~+u{(0+99 zoA{6AMS|q4h~o|e4|=I3v|-cBB{|Orj)$?xs{k+m0Ir(k2TXha04fGU65J_vIDEIz z@yF7n^FsabSL#2nN|HW@{o_$w&ag&gZq$TBXu!Zo=bDujo?JIT4MApOnihNm^B!qD z_l|XnGs7Hn&MDk1jWD4`7m8!C7yx9NP4W(^57YkuuT>uL1;U{Wyb^LMMp_Yr%!hIG z?fFzO*uay>_|E(s9^SaDO-E2?ki!un7p^$TtD0@|yDhxDp2xi~HOyr`?<4i5_32hA z3Woa8aahlo6C^AC-hWEFimy76EN8AVYOThkmdp{?lg%(jkrc!oezll2RB#FmRT^rW81r z>5tN<*gzjjVPc%h8I+pMxPjQOmc>qL`2_sKgY8P=u-E7_>r?IkbH!D4oDjQrXSk`>5b2Ug zC#?(;8=cZFJ?gB0i-i9Gu7mj+wFS44FU;k#IL#AF6f&uh;Ac6daoCzn>^Sr_Oq-O6 zKu!P|tqtiUMbP9BaZZq?J_2*plSf#(N`&%~D#m5goLK5Wnij^I}!n3*e+Oo?QT zf<7_rR)`b~fmpNQ2Oa9jOwu4+VQN|d6?}vf?#F7B#=e-PKkEn3)6D=uf;w|XM}8_? z3T_8VKvh-5?0tn24UVijW~B-QgpW#Ok*k$0*w6)$K~Q?o2qTJ3xIA&rO#>m8+9`%4 z8O1eH0Nz)J{QFRGpTedf9xAzxOdX_p0Za(t7DJ28Wi$1JBO#c8%ZOdj8fKCWKJ?NDtGDKK_1NQ64B7i1+s4{A~^QBGE00HP) zuLMOo$3CZ%QK1_JAhC;YZGGoCm;kJK!L1}jjko|+h41yH;+?|93#0qXazE#%^fhLn zy8swSAM(|Ity#gK1`$jgN4P^`={8S=UkWkBo3D)B~Agx2T@MJbFE|de!tMuvrq=ys{M%v^QmYMr;&qEugbd* zPJq;u01j2T27n@n<^(_NkL6PVkyW5wmh0U{N7Dq=q0)d2wH%AeA4ebIP7dkV7u-q2jmXKf7bs zEG(Md4W;vwo+_kzZNyrDotQFiC%$WHBl1)K0Og>kaIqOKKZMqO%G?=5kdK*Bv7Y@a zZlZ7XquEdM6*nD^GnV#cn3u_H{J{FwzLN9Y-K>FrRqA_JO?9W)-8!_r0ZMr0c4m*9E{ zS_Ed;!F3GoXFHc4Da~qsAK^^{sOd&9+0SYK5C9MR#)HXfXvyj8PHgi)#0m~G=|~Y( ziBK|n)n&Q;_mWioYR2Qbfe7dy>M6mL0(~l?tkKMN{L0+(S2n9INTvfLB$6?XYFv;F zHCQ@s98{D6Uw-L8#xM;?!*InlllQy*spq8t9@M}-V^JfyY#N?`7(V%|-AdZxRR$A` zaf;MTHEgq$FHSbKGf={45o9Q6m+Boj&qucx4MrngYQsWi>4qz zKwkA_aEb#SaZCwR5TG7S8-8Nmw4j`3kgixZPaV4&07V}yRu31Q<>YVcj`eMR@8WAZ zJ1Elq?uK&1r2t-pa{mDDe?d=>e7}hPbdih~`j6x(Wc$B}{&a>qqQ@kI-lWZ99bOf< zXj~D7#Q;SW{Qm&j&u8U~a0$e)D|nwR`~=h2k@wRZr}A`;aT9J=G)t!!UPjnoEQ4(It(6^t!n z!s7N3pXw%DXI~q`nv!`J|hL4IqmiRag}%SJJR zT#xPy{XBlYmt-1`qQ>Vp?!ji<))fRrDOVD>sZ1JN+}pS1lle zP{Si}xC{~fE5Gy7Shpd_AP_}(G)P&173b5$9su;8uu&CFr%IXy%MrL`cWANIb*96?iI+f|mlPn66TYi03WIsAXTA=dv2n zVN@p=XD70MjR}K70(O8s1w(KTkaOIR=SpOeag{16YlZ#D&vswtDv*LP@_scg)4w!` zq$uOPOV6b%g@Y!UjLLKU(frLn7^WvK-q;j|AyK_??@n!~rP$yBlR^IgSieJ5^*2Ff zB0Fu~FgsnCD4C%fm1bbJP$g)EwH)I-`4N`j-5-Gs_4Rflp zzNb|1@wd8q74G8;i1{R9sA+a`M;S7bySf2awENg~8)0z|ehBnFm1yzBbtj?5)t;iP z80gF?$r%pcJ9HkO;Xq~-(IaKBGe8m&$sobc2dzBFRB{Dj-`!qCJZl0M+z&yT)U@+n z5Z4Q}y$t|1IX5Rx3I4Tk`F_<|Rv?%szxAauMYtjj%xMg%t4@~o5-{pU(e*Xt`mP=z z;PR)D>}$~cPr5s3vCy&4*Bn)q%*iBYQ3roLl)$A(%C<1_vG?73U zD%j$$)O%18z53FPpyRy&8Os$Xu&OTGZaQb>t8CFGS-7ZEV3eHa(vT4n?XZ>pFUqf- z-!9&n8K~uvB2drMIHeA+w19b_2^w9mw2nP$8D|S3FRp6Q0<+%Vbh#fX=bu_&S}e+i zhs;eN4ZJ@=j%bA?R&O&H?TT4^!?eYYy!|KwL|{HrdCf>_DA0xZ`8g(}pa{tTo+~g< zB)6Vgj4Ji_tz1=LgY5-}6ogv}DOZ7tU~!$G^GXikT@7~lTb$;z_@80 zzD{s6Ob0Zw3HBBFdl6GMK>0>ZFY$g9>HvhWjW<7Pkn%X=G^7R?G`*<-9BRwd=kTSF z60{<)<&J6X(tr$9MR^C(r>gHVN5jwsIEC<#d6?VYtc}J`yV9)E0fr`!5xcBwxw=#K zfDIGMCvZa#PX7Q})U2DUmqw7Te|3Y5b)+%&>s+3TdM>pGJ8(!RHP;FO z5lWefhq0)oAG;q_{$i~Wl_S(t6Mw4wznw57VUdc81;k1!YK||t`O*VBQl948)Xi$U z$UKi~W|t-Ou$gZLH*%xCJ?l`82&4x9eJBE^pfhOy0EhDxZ9%~1qPasQyC~{KN~DoM z2zPJxq-ES!cdbZGHIF0fKoH9eW;WxsO^zuUNd}Qa6(34sE6ll;FRA`jIFB9al8>4* z{@3)W>4>gk!3RC*`#sGL>bML*=AWGOpe#c1uG(y983#RuPFFo>i9kR-sJK{+A?uo> z{+}L31M+_=za)zcO)H!#0#D&wRQ@4poQ?YjU_Zv9bvb$!8eGRsZ7lK`3k{?;G589c z`Ma0vT!dQmusF%yr>H;UU46C8S8+#i5y&U=UaG zf9YJ;iQy*IC12reAH-5)iq!Kv#Z-Ktz^YrTPFR`LgVgk_!i}hgQg~BOl54-VFvM|mC%bkZg?cmd8+|F?QW?W9hA#?& zWKeO)=9m5vi@*8mpRIRTqZC|6|I^~Nt2DONZXtv2E1VBZ^N+)&Q;s*_=DOWSPd5zL zkn+cu9=`R@Y{yFARW6R@3l{C;1cQzTTJ;?UXSla**ur5~@~=G8AU8J=+m1J|8LwBe zvVz7RCIEd&JxQe%t<0-QTE*B#7@urajnz^%#(uQ@=Cx-kWsTHkpxsIh10GM!S+@xz z%EdZ-qZNBUH{ntL026<_KcxaJ8n1EpRDZU$VAX4mvHt+QLIQOoZapb;Mrowb0uxck z$#eeK^b`=e$Q;#ZUQD-4Z!`gD{{XBXLtM7EIBT7Q_y#MdCAabETz;vhUwO|uub8Y! z`Fj3Ul|sJ8=lZ@3FlsvgoaCjgLAI7Z$4@zrFf^RSQh^at5Xc1dtY}{}vvD7s9 zTP-5wdUO1%nDH*G@T%CtagmqD=qrv(qn@;zWhkD7sOt82FqlMp`2=q02;V z4}s`7tif@bcbi$e^)AJccYB|{Ypl^PgF-DCLOSGvFaiGn>(>$H)TwY(ocV z&ks*x2PT?H^rj%#Jl+1-rPw!b??G%4nlcYVKnWykB9&o~YbG0G9nm|91DsZ?KLif7 zn;4nyi!sIk>E3`Zz8EMYJkpTrnNiMqQjwA>Wa-TSM7x|RZ_1=N-;+;Kg{B|%fYK1E z;re!@MJS+p8gh_wN3AL8Kn+sZJN;=GD}kQe(%~$BD-IB6zb2EC zMaB+W9qJRbXRRQ{^ITPjik0ONUE>G%hxM+?Af%ZGdTHF5MaObn4cQ%O0Kg)U5X^S= zrCr?SsF5RAU%Yd`r{%YRF^XPj@0wr-?+SG#6ac{Fxm<8N(Tyu&7eda} z=RHRXJxS?YADFii8E)juA5&P=smg0kpEj)Y3wwyCT*l$PhNol2dF*!)TF580a2b1N zf;}s{hGm`(tsqUw?Xx%*Pi&7#WUJmwS|ESWBc!noca%?1F_$lVxN?K zE5$$ICDwDh?N9oDg?Anp@f&I__6yQH;0Z?QxDKQ0DcBrNx?V~j_Jv7EIpG5 zJuUAgNu!fzMI+j_Vu(c=#=M0X=7#7#qNL3X1jPx`mo(Ms_|OF#_}Xg;;$Ezb2iFzh za$K--q+6+p6y#i~?rG)&0sV(X4>TA~Ev`c6b2tHLz04X@x>{mLH(U)p8`-}7yCMqNc zXr@5=rxmux^Eb0~;GQboBKM>NReomr{{Tv>du}f+UfuZII6j1Qt7C_6!ny5BSwsda zMg_VS^!ih^!MhlS!p~0muNX7`0CaQue~o5c%Vl&zm^cUTXAO_SqLs_JcO;Y4nu8*( zB#hjfcReFdYd5t|v0z4{0Y`6R?^kifd8MW7)^hojx+SGgPKr91cO^6 zk+%0CjPQQ6A<7r=oMJ#@RWYW0oASA!xP24_j z_p8Wm{6VSS+?nH*qF>=fH~@YfO?A2+u+rGcE}(vzQAs>A0+I6MN6~?=rc3*Z|;vlSy_>}kdjY& z=68CXv5l3E=fk$TWOu%GxjVL;0)1<^z$7(zt-aK?vaFD?45u~hT7A-AT1Rr9#5o>^ zxUH%7Fs&OqmxeLLFfua`rzCZ$g+!5}XK2PxHKBls%#HX|rvPNrPz~+)R(7{@_DwE% zLBZR!eOr&~Kpsh}UHzu|S^F~_eLH@YmLwUXN69rwwF6)Z*EuqnS=iTk5gNOwmm4CVK0%4 zVwIRE%Nz<6h8YJUti)??2R*yflmNdaJ2ce*a3}$)#DZ936%1?)%ts>tRn8AJSuwrw z>qrSYu&I!OIPF#346hmHrHK_rSG@o`l_ZnKcoe%;pPtyGZztz7r4@2RW}@@TKG3=}ILzF)>fWsQz{14-%rz3 zWgBFW?_hgpp!};?tw^nF9S{L>R8Sw}+<2y6Auo@wBN#X`}mICI*U?h?fHpl3hguQTij(Skse=ErUhD}{#MP0Kut2pr@*G1`JvRTH(q$Hf2ith9Tl{BcICxJ-3jP$3B&;=6& zzIw3xz3S=dN>574*6+@nrO$XdWLz)%$ASFl1Ym1EFSOF<`zk4w*Y9mS1L<7Lc>3VX zSs+m#_etmTuRfL8+`F8Ta!K{5^H*a|RC~^auUP8`F?^E&^C9bxW87CzE9RR^sjX&N z?cAfG$YIo1(0WDj)O6S{NWqbL9^-@hik69zv8hqX$oxe+H4VhE!wX9*1y$se&{7d4 zDs(?nTs7~FZQ^2KFX?sp<=EBFCXW&ViCM1yaYiHR0Noxw^WRbw4vRHhUbJ z_W6*>6UIM@Nc_clGs5F>JQ2n|m6YV-Z%QfN=MGqk(9*72*HO2)Q-YEy{4>w#PSh-( zHv2-4l=a7BS?Sjzwo*-96DYLo&!gOYzli>HyJ|R}%(qEDysF=r2Bx6EiIa@`ihkN_ zo+;a?0NYF@V+EMtdYXPsay}ruWu0JCfS?jR&1p`bJgj9}rzCD@-RiNbnC;F<@7Py5 zST`oAdDPP_dN8Jj)TlWJkz2OfxeMjobNe|1&T-CE{pI!l0PELz6RV(gUAC^zLwP%2#!3_mdBv& zTp5|OSG7G=^;V8|U4>971Ez9vN7k|lt)sDv+_mQBlgz4OPDrQjpe$MQDOP4e8BPf3 zMO58QEl4bN3*u|_P`@d_#z^GTzu_mp^iRsUJ=AWZ!$1Gk;mn?Gz;9A9UW24QJV_uQ z#S#8WYtA7*y(bo@7>#gOzs#csxL?GMxqK|`M<$kmLvRW9t2qUa?hmC& znu$K*k6~3N)U7Sc30v-c;s!wa(rjrrv3{yu&ua`UZyYRa3Y?y~9DzdK+DUBJaY(Nc zg2j~Q0CQeRs%o=eUK@!IAHuzreLu#UR|6_&Jd1*nlE@nYx^5kfdJV;mt+$6|iAW4k zInPqV2Dt?yTXy3law}rTcBQ^c*Ke~xyPSIZDEiSP?pl{~okY1y2e@2_+C@X|KqvI6 z^zl5?D#x7UbgO!Xpx2~EKuD8_<6ad<`R`hK4c)DT=1KTg7~PJQa;EKZD!mT++ArprzG2Q0Ope4{Ysx|p{d^6+S+}k z{%rlwJDQVCy<3|Fx{-XL&OtpeeQEO`<$IZ0-nAu+!rBZ501|rju43m{xV?-dnBeD% zi(a{c>r#?vTXOI-^cbvGnNhF@70&M2+X$qVg@jt5#}&%1@H%)oMK#S~1A z6@hMR)chdjwCM+7A;;ncc_JO;H?4aA0EHnjX+e+ixo_$HD&n;=tMHvrsL+y4JQ}HQ zd21}~Zybu!FI5MTTAZb{A2T1Nab7jM*=-e|Jh9wM}R*q1Xqo zps1^y#D=Iya_jZ0avG+2kP5U}bt>$2Nd;U=hBR5tM#h~{F{moTByFfob$<`?*Y_vV zA^!lO3gd20Bgd()Lil-XRvW9c{7k4n43qrDR7F38?_M492V;;sd(`wAD$a4V)j~NY zxV=jH`Y#Y92`NM@iUxjM9A_h^t#-uvRNm#aVaFZntV9yn{`FV5)U2%XE~Qi>oF2cG zb20d)AGH{ujL3}LdLDhK6^_ZbWk?+jB$G#N6VEBysxoLTkcXy7u204iNg6sus0Gg1$pK6n)fZAEd51vbIKUx zlHAG%PgVB=p*87INRl9AIR?3n#Bv<*Lf=UX?cG|&t+yg{`L#O6RdI&tMg{=%=~?!d zo_N~ddarKeFSTx(dYsKP?8H|XB%Uia&s(s*x@$NXmqCz7;ehLkv2qJr$gRfZBaeFL z?DXjEZX>#kVb>=EzD5m1r)Og06w^BHbHxp`Da~d70B8qR02Ltdp7mYt2^c1#Rc)}; zA5zuD))#7Yu5$X?CV<>@ZZq#!WPG7M)th+4#HTzjQCK$Rxw6w@ycY2o+F~+)m37eG zvW>6v4_@`lMpipq4vxe1BDDkdrljMrnoo11j^-%_0q4-ukR913xp6nlKVh+ zq(5}=^u=^Sqn3=yP_eVH2lEG0#XmiBT;0crp@w~l6S@PnpP(N>)YkBkT?3~fhDW_= z%$~%w*5!`W->ot-OklTKhC9n?q-bJr&YyS+1W>ruk{4xM5IE1hC5Evb%ZOhAk3;KR zKD8Y7mya7~YZAzN5P!m#!_d!ns395JhjSl5KgO|6S2u8vEzeMJ4nDO*Rny|tY-F*N zl@Edl>_;Hg{lE~uwES~h7$fI9?K)dVZ1Spcn#winUL(>ZidUHvbPjhD>7JneHRksg z46+|9mF-gry`*%snz|?;W?&R#o`6@s=(E~d+FR*uDlF+5<}z^E#!nUJo($6AYv#MT z#^{I0r~Ajh;awHgfw}QiFPs6j&%V*0=~mh@k?0w$FA+p%(-{Xq!H>{Z-9a)dp;j3L zaw=ZLt8VKUZ?5l^{$0<+eqbUKrA!BJq2EZZzcCf zf$dnvZEkHlHKEff?MkPw)~iJ-%A4c;dsLC{!SgZKwQQNrV#DHFDeuLMYS?46NyZ8K zb-}H>bMmnCcCH8|g@&rIk}!-LcjJ*=>|lc9{jz^BDMj4UX)TFOayr(J1EiNWK`gK3yS`heaL{GiB&%0y! zR+(WF7UbUNNoyo43c()%6e^78fxxM*ZXvaSt|x7%gCy4`lQeC)PAdMRy8i%7 z44mvaVe5*~N!ZTUb}`3~H0GPicw|)1-r)X~+S|_!%qwvN2S*uJ9SE-q)lvm~BJF(h zj)YgI_%&rs3O_SAXL7mp&-muFi@LZ@Hagn#KN3oRv}XSRWRK7a^qs&Ao&f7!N2=Vd z)zs4tj>M0rYV5-;TR3qqM1V_?nqM-rV3%}iYJK^x%btHJZ+!+zt-6|8i-##Bl9gp@ z^lb*{Tv!FqF`RxKMR{cJ!u@Nd@Xn;R_g+k=3n$C?_N;41nk^gAe6mdRIpBuoCW3Vg zjno?QjcZSBGV!2Ox-*7Sdf@*6hf4Lj#MU&cT}mv^m1GBNFJJz+uQjWlv?pWBOA3jN zDK!%s*%=Y;#F+M}gH<*^y&p=P8Va#C>R~k8(+Q*&AG(dz7HG`?fB)9=$Pdf~dS;U3 zYmv%2PY?9Z^shRO5bPR0zLn_O7A1-ae~#KrANO02>s%9hrgmH1Xzo3 z<23Maap_!sp=|cIBVmlbQAoL3V-tcc}AgKL0#k3&&R zNFdX59Iuh`liRfy0E`p#t=8l+<)pazPfF?SfRDp>482-hAEy<>#{7=ewQGN}(rZTL zWx*cAQ?{mT&t^HRB0^)TMAWMw34>cQ4@U5_HNKki$tFWKRWs8Zezl-M5t-y{^N+8s zak?Yq5)KABd)Gs9>X54X9M_vUYIUgCxvkvA_C!2w-P6*z+pStxgY4kp2S6)RQDG&s zZwG3QzV*b&?VKKICCtrWtci@JxiuR$YQLB$+a#XCtCYKn(g1KdH5++^jodHwt0@3e zRy?rERQIQJg<-Z4dDBM`INZT=>6420OGr}I1hn^u-t zG6HlQ9y-vTrd3wQNj>$va5INeKsdqgUSFaa{{XhqN5}z*CbSZBBCt`@C-bTFqO667 zP=8t+nF$?z&HRfrYXbq3hF0z?$hB?Ddp6;MT%XL=_P0Fo-UmkN0Up&}-UZczeXAwc zfWw1LJA2F*V~ulAAk3rMv@dOh6TC=wDx3pVVL}||(zd>XEg-82Q6Q<4t!BoFYA5Sb zzXViGQ*w&4sbZ=IYuB`49);o5X?b?bZS{8OKPvL;U=7j}+nV$(PFUiG-K1aw!~&0U zIW+HLWv+v?OPxktRo>;xB#L(ecm!h@9la~CotZ7ONoA5bgF()!@Eo(z9JnmsZfJ-4x3gY0?_%DkmwQ_FBy zl54rrwK#2Tk|~Z<{nOU~_N8*>j15jHFR$bT;for-r0L?uL3aF<=Bul3)ehc4Vsln? zE1?PdG)I;hYL?yXK8Jf0(OgFqu^g*6_}3ldS-yB-9h9;BPCunu@XgB|&^JNz59L^% zC74`l4UUQekHWN0=4n}w_;y2Wdjm6ZIAuBgDotwQYrE-V1o=u2AZGx7_3H#Qtt5U) z`ICkE*I8=&B6&##ih$qNvYWFuit1+QDKvKx$VL^>il16kz2C1*lfhEI_s%NZa>|y* zcET)Rgaf7paS>cJcY@)M@nrrzX(i2Z^*hP#R~z$=)REkIiU>V=)-A-y7wU6WqSQQ* zvAXAgJJcw)in=a~F+L5)V>Ql~4a}4~s z2fbIGVNWBOMa;wTnd!6aS44fP+^xBNEQ({|*x$rxn*2l~^Fj3n-f^?5K6 zex|v=kurkN_9^GUv@z*^s0`aI|D9!dMGI(;jj z-CBAhZq#w;q}4@gCUSl*v=HiUkc=)BfF9$Y*1GQp>Me1niz$BeBjrA;{{YskKN%)9 zRDQdoUOt41c7-R|XGR@5AEB)iv#{l=x!-CFG?p_*Z}-^0kIyS|rgvgaLG@CVe@QyG{T*Qx3FS4ZKg zJh{;^fr1b7u3Gh+En~8c6*TYA^oUuK1y?(Ys08}pb*j?bMJz5<_B6pOZ3uYHa<|tn z8Q86Z%H!ATT#20r5Y5S`nW{^un%ZL%kVxl>s#>+U>@=LnD!{6P{bgAOkwf!LCX||C zGzd)5nr>*#0Du42!&7b5RdeXIzoV>?%o;Dc{{Sl~>x19$uQWo)z^VEg?KE9M*+gu9 zbmdQ|uQsGCu6IUP(Dc9H$aKl1a#@`3B=_W1Nn?=CZI~Uwt4+&A z2v+;2HmEIMZkO^QK+ zq~MC1HAR;q3}7) zaawyAFAQtZm-$xz0NUhLWi5;ky`DcB^QRwp>{_Avmg8)9@s5ChTIIq6TGGz4TN18c zEwq#B22MXZ&QVabHIBq470*hTMipu5GSvA!D7i&YK5B6oY*4>?mToZKlmQmpOs(r( z4W08_+sOxM2n7395y1hy2sNQ@f=L!8=*I?{c6yT~bY6;OSqgN`GREnxreMI7Cz_V# z0Shxka-$jcsz?NqFm8kbYh4;S$+aLJ;JWjWKRSJ!l37D6-m8K2Ju1nwSzHx3Q`Vu> zgmFNSN9&VH_t1S#W?{LodGA$MnV5P3R}UnbqZ$3% z1dTKNgk#qo>#fr)qf0Rz&>4{D+*dOh%!Az5PR{%QakiaD(G4q=Ft*yDQgWlA{3|Yb znrYfb7$lm$NNe;h-k_JuX&Tx?f(hE+(wbsuwWi$36E~N@#xq&BhE3(1=QV!LITc-B zrBS|6g8=578s-Tt3YM}JxkK+=t*DH~LXWO%hPFAlPpx&f=WK6O`;|{&x9FC- zWT>A{%-0IhN#*(D?(W<9*K4gvqfg`bm{%_X5NTNENJR=3cWjm493`czH1=2afKrl?`opAlW;vFD(yz__gC zfWg7;D)4n}p-(C~#ZqS}5diJ_QI(zAEsb{_Sjye(xM8Hbxfr;<}N0p&Rw#w$ML z5ep_b>sIaZw(+Upg{hOgM-^!nr*apHf=4DWeW@-F6#}+m9^6(YgqG5jV%Z?(tz2F1 z7$=&kYmBx=YPI3pC)b*|y=-SF^(s#>-=6gFbInqdlb>3%9zuY4`qt>lqGD;XJ`ny@ z9(z+I$qK8_Ii@6P=|We!{mX4-8O>PKrh5goa#<fm2O~JDh@>+5?fj!0Uo$^J{cEJ~nRx9dhC|A@Z_P*eS1)d?6v-g@j~x06 z+S4w@xwr?7(Skmpk^O4ZwuqT*T)nv8D?eg*u6|O@ax>5_e>%SH#yas>o@+^RLh+8j zg;F7xiKgb8O(uXP-CG_XIlhs-7y8x-U`~4fo>s305!p3ys<13uDIX_cJN^Ywh*4JAh zJP-|L`Ila`=+d3wjvBQ6_o=8&Fq+OUb?PZU(ogYLoWv*^D&-h3>MNnqE#|n8$fs%p z*ZK{Gge6TXhDDy~3G0KCQO$67n46F~8b}*-<35!|*cq~YYoaLUWow|)1oh^t?h){7 zZraRV77TD#p%sfd6p^Dp!o+??suI3~lIjJ<>`)Wt5_+6|l@>D9uO*uZkgrwhD*2Ln zk;>Z8r=FDP{{Yqxtw-LU5&hu$)~wAJWGs>fOzy`Rs3Ww!yO=~tB%b{~wR#j1U8tC);oQ+aedf^3H4*iHB~xhqInueEZs@TsTZIgwSzZA z(T+3gNZhqZI29MYNXWW1K0%bEB9}Z<0=y?VjMjuMS8I;E8p?0o$+%XUU@x~?Bs5); zV!w+mF_`^XtB^{OeLw z7YFx(ryPn;U@ll6-=CqPU>amp$@g5WQ+qIKVj+Zfjm>j^4fM zsx{4FMQB%M0_rvgH5K{+K7BwnHP}_SNa7gVjGtPod678;=cQD4OqOfej9Y=%J)6K#h3;RxC>mpnF4H{1`Tvp z@-9m-$w9^`R^H`P_((NjE89mO1(~`I#}$inJaWuJHY2w|8j;+NwLYnKS+>R3?yuDK zHJHkYve|jS%YA5yvedGq?CBU@(sTGyLv=b3h}(%&!ujbnvl+# z86ChRjMO&~Zu!qq(-hbkj8)DL2fb&r5mq<35E4d5t!ZszYm?6%Yb{xlH;c7x6)R_t z_C-v(0xjryGw zvfpP4I%B10&VSM$>sPQ^0raSsLr4vV;|=q0xWE-9^KQ1?(~(#vQm?hn0IPCKHNnks*y+o z6eq7DrJbuXUPoL~NM?tc(FQ1Raa0;do?LY%tm%07 zWNC;!X~R!NJq>GUlBI2e&RJX*kmn|@7Ip;>BD!4?#?7n>%m*%hqk&Dm)8L8m3uIP& z>tUS5v=~1=ah?Zi*-!zf%xs-0;f^_>yM>F0z;RTBfp28z83Lw8^{lvL^Kabt=k%p* z8xE+rX5Q>`o_dObNcEnLtaG@+Jrdu=C`+FBS4yNYdGo|>?wx$_5zutX1W4=08u~lZyYc@zkx7$~uu6eFnbJpiXpl8pyEqt!Suj5%b z#cSP$@|nA2Rz7R4o4PTY)NmB?a4CX^KPmcEl0P)kX)}>XO#%ujxuY}z|Izcg2h2ro zTHC9^9D{?7)rlba&2?IG$Ze1+o}5<&M`Vt;?rUkI0kO?s-7_@KBx8V1Yj!7FKz!4; zcQu1|GEUMM#shb(>F&Z}qIq)z+hHQA*~BNkL~chU{uOwTVae(elSYZ&?cEo4)&6F- zzq;9#wKZ+**49!`lC9g)xVy3q)VTipe>(JSlJ`UUSDDP)r*`#Y{OM4=+hdt#!V^8( zAob7X&2+QFBxp+tqv5#Gu4I+YHm(MJNv@*#V|#WAMtJ^p6=m-iPegJvTPK)KF;ZLE z#@m|*Bc)!vj3vegJPMl8Kt?Bu9No7cD!CnQIb?1*!q5$Nj@uiP654%vVRViJvnzKeXb<+&`s4+JQfHe>%*kqLyHzl6a$%C@#*D z)(^Eo=RX;%tr6Ln##KdhP-!v43dTS?Mk&VI%7n)nmaaziDM=i}2+tr;DoNCra0gC* zD$#<{>KVMihZNO}JhvqFL;UMyBQ}LgNj$V8(=~~BF)J_oM!RchrZAykF|=0`c6Uza z{iFQpQf;;j&5-j|kn-PJo8okVilZt0 z;ri9cPF9oH5pv2SHOG{v1%a(gq-$q}IXS`LilwA~$U#3J4$gT1Rg#^kbUUkxRx$Jv}O_E6(Uqe(j8V2t4^q$d7Stn;sgx0G3&gAqo&hcUxb{y74@Cg)Y+>*w+J1B(q>bc+w=XGq0!yorRAJ(Re z_pCab5ZWMVRZo1@+N#>yG=%3I{{V$j(&LS;O0oHoas_DX2_o387v09Gq6H zDS!oN%*`0O4AruE%~Fpz#amuQWX6Pa{qE8Hc&*Ekwhh09Qicg7xQW$CQPks#+`6@S zVj?lkWhbfy)Tw2GW%bQI&3D_nkKk~BF;YWoJa*zDha#l5g60_*lqFnX)ZcI>ll@=e zS@s7rNmpef%f@+kqeioSwoRQ#EuryEA6%<+y*XX{XNuk5O3{ zY~ET-LHYB~(yrSXWQ1e2bI)XSL26`PA&Pg8t`r*5)6t~11RuIctm%UrxdZjaD)yN2 z2wfC(Z{{eS`9W@8YjQ>y(kyKdA$odLg{JiVDUIi!{{U5Dn=Z)4ms5m}1AbMVHli6y z#-}H_rp+GN9ZzCwH1)37!X^!~pwfdFS;lj^w2X|cRWxxg**|s(8;@$$@~#__jDHH| zoW15~mV(5xOBsZryCppq zm{v^m70ZoE{B)VWPw=K4LiF{Oze>JFBejm&CASwXA&vRyeJR%$@!H1|O5SqGo>X9r zW3R1e*+F%2X%o0+`ANz5sydu6Z{VFz4&%L2uz&QCxbi`&c6QGsIRk=f>~_+@ zD3mEU?ODr}ClqNE?wPYAM#whuL8`#wKm|z~`GBbfPin3SS$=*oT#p4j~t&`i1~ly*Lv9JW5TC$XxksXHxW`|Kk{mXJc#{GZ(2Zj=mD`c; z&2Y(G-04qC6R9nS1mN>a!wx!B3nQWwU{9thtcK*aK;zSzg%@$$wJ-n*&Y#w#Q7}I~ zNTxO$AlGFr5rp?ClEf0Hn#PlN+A%Mu6|%vQ@mV)#HvpeX-X>+VRon=z+YYQftDb<6 zaBE)PR)~_F>MJY7mrvqG<~D-Z=rdXN;L6iX$jV3tjMfP=Aj>Zm-ACa$>MctE(BE{`Q9F84nV5`Xx3QIp z(B%ixl+{I&MHm>SnWfG%MS{i7X*sHXWS+Enl6ui#vH#NZ_Zg7=Ytn2W5!ph7au9zi z^Y|e%-K<0Sm32GFf+@Q(Ag$tJ%3Z7(HuOWg8|> zTb%%9&3NfBEeo3;Vv}1G*`H+IQ%KG*02s{!Q;nIU>4HvALtEl3^>I!RCvv8$=!VQYHidwb zJm3y$#;G7WRmL&*4@%e&MmlY*&3Fj(Yk~;-pmFZPmF~eFTAdo1N~h&&Zfm5mYga{w z&(z>U(|9NF=lWJgYpw8&xtmdGIQ`sY^XhOaXRw*y5T={8YUhx9mHg>G&+fI#NkzsK zl^HnVuwb^lR*CwTI&AF5AiK8*$4NQsXGCcY_mq8WNd&jTr{UH$K2PY%>a%U ze2x^K(!9y~nyP(9P?Nn@kEyFtcdCih*Fq5HKQ&&2)^YpQdK1MdY&2Jp<@! zCoD}~w?8cs*htgT{{ZA5gV!VUuC`l0ID+hW>0FMMajHY^*sn<{eJcsOF|#Et#AA+r zwB}bM0~MlB`cr(i^r#V;3{H$*Tpy)O>~VlNtG-)$Q%q;lfHBNb5BX%jm1W#o?~`(< zQRpkFFq&bv%~F+wV%bP7V<2X+8O*n@JgQFPn(V&D4{BksL)24JO6(eEDF~J;@pT&H zXQ#DxQOJ@mKs@%vH7t~NtMS9Ma4Kfg9Bz(NTGH*l%4d!+jkt0+>t25>QU=FdSFYe7*g^X2|#YUrwm@WlN zV>>+zD_LQ?G5(dZBaX221|Md1J)8Pg_C;dJVr-AlQh^xsrQ9goC=tTm!s@e~#1#h> zPsD7W=y0LPTXjF5{{X7G%~HYcfoO0`3^Mf3<6IW3vqf^2^W$_es&UUwf300LsZ|y9R&T>-v8>-cHKq30&mE14n$*S$0Ut{nAI}N-BWt z?^-!DizH5^OCR&~u9ro&Fj**&V7JZBze>mO&7>DLVtI!18x>G`4*vkwx|!}Hw@vTR zdRG*eL!+5nL(gxq{kL#CZa>nuJTgH0LXq81^R8ytcY(`}IU zi9e98E5x$z)QXScRUf8*t$F}ZiWPbRf%FyUo+F8))LF>kz$5a-VN2o^wlICFt;2l4 zRh2oavd1I2Bc*jB4^hz77fHAIMoQ=NHL7-c56Zbu3|z_N8!3<7zcDIsO?8sO9ANaUO+wBHZKRkEK;oQju$}if_A%#?N_<|-V@Z^cTvdPFQUel@dE$q#Bhhq7k?mNO z1ct{yO4|@e{n1>`l;_KEzM%eMwgipuTwJ#`Y`x^C_eCB;dJ3o|Z&Obax2+tZa${{9 za8z?%dvh6r;o)!LVk^J%Th_SkZ8qL-{`d#_Rnt~vvnEalHHUVjO0SL&8TwYUvBoOo z)&k=}`$~_VCuaOQAMvfzu(vSdAc2b8(q&cDA>1+v+xd)FKM*3XK_QA{kbesU`5JOp zLOnxdf7~CCrWoS>;{HOU3>ah{v|_l;3Rf0Z*AX;KiZ>3R42tvJQ%|1B9yvxwRbkMK z*Qa3CeyeTvtu}aZl2DQL9E!L*Fg$|-or+3Y>?AQ&*nHJvH3NO>5QL(gMKC}A)93V9 zci)*0@B)86E3Vor7eb3@mQPX#^{x8zB=tI37nTodPbq3@Ge|@}N_tbgn8!G&b4?`B z23DpE*~tyK`P^*>>s(0DbtBk*b?Bu@q}f_Ve5%Mz91>`nkU0(%`w~BubrLPq)?a3n z{N*;59sTQAM^5tSbH3qg9BsahG!MKmW9~SuD}6fcUw52S*=wQ^fl>ve=Ga(jX8;qQ zdYMfCQ^M2?P{Oi&LP61|$NN9}5UqffnXX5>NVo&CXYwG^TY=>3_e~`#^fb!qEL!h; z7?@j$f8Af^Yk>y61HrBgHxc&?r}QJ_{&2S`gYf57?r_1=%c;cmb;X%o%Cyd*wG~lYpGN;zA<7k8}Pq&JIPXOxGwHBRoGKLBO zBOsIONwFH54>8KVgnwG-Fl#4GwR<&v+6 z)|x2J4FGvQr6%i{pVip@wTs@gZ(H||?oacq&@yYSYzMMwDdlOF$>|#Yqcwjfp@n?7 zQa|pfACRdtT!4AsjaL`YN&V>Y`4j#%#%8j`_y3!Xz{57{eiK*KYn75Bq z=l=k&Su-qw+;|T*!+u9ntzxx<5)y>U}9UFQqUPvJTY3>*y&9FZXH7mpDYv z(wL2F8;wnWd2Py`4;*n_U9IKAukV*>sQf<@iyTcELLA@`jw^IVo`SihC3{%3K(Z6m z3V45EQte+#U90I)aoCT4wR5`qf+CY1qx#oNv3)BWU5FbUzY)RyRn2C*BJQq8wF~{~lQk2b zYJ@v9W}BKbOb`FmT_tg3ul@2{`c{@}D@J|#bbi?%k*zxN-secPlxB(mT25%C#UTyF z02-J^-Fkg^rNm>Y&(fF>fYj}*dQ_X#ebM>SZ(~3W2-NVW){qlU%>X=PQ}-H-8eP87QTe7Tx4{3MUcqCIP{VO@uWCfj=?C-~#f zY1d?H0GPlasei2%}4W7$Grel)X(}1p7{QC!{d`( zuBd;|*m{v%Z>?z!fX$e7to&A#-RnNLh=}{t!|v30=AZmELK-UE6;*1~G?*e*>t35` z{$;FB>WY6#^CquC(w}~v3I70RACasoY%@!(B`-=tSqxfs1u#>AqyxaGijOqlXaV`9 z%{G>R94W$@DdK<^2D$xlceFA6Tlos;hHD2?`L5I+%0I0l>F#nj&|?Za@m*htAW|)( z1EFF00a&*wzUn0PW&U;1>mM}G5BJaVp}mbC#BsNF!4q~X(Cw4`8X^9|{{SlFZ_s%r zyGRBgjCv^kR9@(cg6yLeB@`Kv^GnS;G`XMwc;xgI!opH7}` z;Rqj7!2WgQ403B~OQ{kr>5vPZO5WeD=>~p)@v?CE(MYI#u+S`U>l7ntQU)!%e4}W-35RjkxBds?#wDX@TT7zv~<7Y71!0 zw-LraiNO79M(WPsOv7$QO+c0xd$%g>{A;Z>U_EF)X?IsUq&%w#Nr_@TYj8Ju=4!(^ zzZa(cEnoYR1Nnk0%&XPBNWNx^Kl?jd@?l<4T~vM&CAjR@rT8}=*^*=gn_Nc0|f*`>ElOdV@)(!nZf^TfZvpgO8;)Z{3nT4Rl{y8QAN5HGe$PNoeON ztGIg{*IukgPAiM>qQZk8#Bbu0NC z{{UL*^I00)K5dr%@vv{e@M;s(wYkCA*)8qj+OaFVFa&ylNd8rtV_*+ol=EF2YHg*C z_CB$&Y<&+kTH-VsjOf30n6UacBl*_RnNB9Jgcdh92q21KWPZhm>T85OE3xq8nXzR4>z~vL-loK(C&f|X?kPXKnEa3b0A9I) z>0O74m-kRh=*53ApXpqOQJT1HOFHii$aYO1x}WANsNGywhh*D!>HXwCp%vL?u&BM_ z*2DK2P--lSGf*>>@q{~|g5(dn#Sh{#Kb3GfuTk*~er}O3s$st)URrCWllMtsnvMF3 zbw>TGVGhk1rqMu;|J8#*{{WC`f4tw$wrd;1?t@NUz@M4AeQRjWN8C_9U*}$Aw>m`# z&BzqH6n*vs>CHgWJAL9!GcMLQf*%2Bt9p%JL7Q3`x^tm+sM%>;RDRQ9CZz;UkQLX;gnSNp6* zaE0rr&?o)Wk$Mn+I?AHZXzI7pZmPa!X+slOjItV@4r&GWsniNUJPL3W04d;50u0oE z8gK%iz@#w()5a;erJx6bE1%SVq1Nn;VNvl1#1HRBcT5&HTYjjj{5Y z?==?ltYwUKDo^Fja7v~4rA_D(+}P3|W}y-FC4VuB?*9N9^LsfAS5X%1>VI1FLd0~e z>h3s>G-jgRj`X{|Ya)ns74tOt(D#kMm3a}bUb+7Ok6C}*Z{=P-Yo?COQVi5@PNqLf z+>vOe($FLS)}x@G_?IvH&HU?R)-H+i>CyX=e_GbvUTfW*BIcBP(+i4edO%26cBYak zo2fTvtpGnX{AQvJN*K@txTjP>soS$a$pNQlH5fGE%^)QNj+G!`Py&9GyQl(v)Ml&i zrtdU>^Y0RW$X-%C7ykf36@^+lwEqBT)Mk`&H(-7oR(*CyVF_0(IK71b0Jgu*snx49 zi>QzLYy9Yz!#%9|Y0Qn2{n7nu7r87pkClA|WE++Brkj=TTy|h-nXot%hEjUgLA(RK zLf7DCpD3qUS{*3sqi?zZ-EkLy^3pzT&{{DFE!#se=^kfj|zW6wK2LPz3p`oltzyztmOT)k9D@ ziBF?{N(zSL8aU0x#Gmeu=UN(p{lGqqKdooz#A0LW!}(RcLBDa2_Js_m@fmhwex!%{ zicjf}>s=;mpVJ0zRi+y)3Zr|&G@aq(4rso)A}0o z;%mI|S^oeawf_Kc{{ZM!+gAbL znRZ^!5&kp>@<080@7snVvZ?VG9flfZDKy;HV-}i48KX1+(kX-rc{IXlfSgiNW|MUQ zJ0iSR`8=!HqyFrSKO$?{T0o;D@m@o#m2FPpkmMN{CJ498^S4Gn^)aqLLCIlMf*~D@(1JLnG z(Z8)i&~7;QJQm#6t)!AefDay&rxeDeW3}^C)PaRz zMRmKaT}i8*#>R=4ZWw)*Q~tw$D)J(0)n;whvXAx~`B#+I)OKQGQyZl|nB5I-AvvR( zN-2o{*Q2KpmJtE{+PS`{Tl|osFF*xPy1eFe+_AgTlXX|zXxw{IV7X^?8>+Z(T7L0J zE=mq*;M4*88gO$!6K13wb5I5bos&pp`52~`#Xwr4ENHM6Orn}*s$|u7C!jR!D~!L@ z&9Ms-?mf+O*BagYz^HAY{{VN2)0RA%r6dG$yc*UiB5q@)q|z^%!)kh;>FY@92LpgA z?6A(Eik1V3k%wXpX~(7aa!p^3(lqEQT##I}E*a_D+r0}O1}Z?F zwVlw2OB$^%<`@R9n9VoICX0cP=3H%lMOP}PuNAm$vrZOZ_NUB(#t7QID#CAJ(ze#k zeJW+NUrHR%Si=#yrwCoUS3;J_=~hIB4+6G?0;gCpQs&2Eq%jp0c>x^ao)Z-CG18*r9H-i+Q&5VK5Ges*Qs$uC zX$zVFvRDd?y;d?BVRJwhOqAXEs@si5((M_b3!A;`D^$CN6j37qlb_0~&w5vdu3u4= zrj=Np*sUWAy+zGqsnITDnPw<>+&TOz#;bb`v~jG5?~~8aS21Gd+7O`fc{L8FJd?(Q zuF`*6zh`zF{Y{$(|>GtLa5-}u?dM8aSn7OWZ zAevmBn5^jMCax@*tQsh?4;<4=5lr3Qs?94X;(?exCX;kgFI*C9hjy-;RTIxBC^9iv z;>K5OzZKO_MX8jxJFgD0O)@oXbCda+-}47r;jJZ>1PBiTw1xbb=CG6<#+ko%=_S08 zNPbsR58^Ay5O0u2?_Gt}Mlbo+i`c_j8Db`qt<6T6@%srp7tNYtD&13Oj{x4NZ`1k++sez*2avh^`JRk;cVb z*T|&f=~Whd)WNe-Q72kVFM3KT0LG0CGs<5|n*x`QN?=3~cBw+*lwzOA=8z5A8A|$$ zR~-ZSQ=|G3n(YgPQtWsGHN!a^x8qe3qCRx;uI^(U3+^BAA)4$^k1c=QAIi9yZWiKl z>(|Rr-%*iWb))&Vk+?s?2j#^Q6pII*l^F(~&uUI75><8Pp*&UQ6t9#Z_plMIss~?Wt4>lV&MG;;Q1X z^y|f5icIyY0D(}w>O^o&CayGeD)~}}xW##!sYWV$99Km?ri~LSJ`OuqHcn1WT{zfc zQXZ7Fm8cQXPZ2pCDSW5&phy4Eccpwuw1$i_i4bMhN`O(Q!D0^9m)CaPY1E6f##kG z@6AZbb4KC?G;O8&&;sU=jMDK*(vS@)Q8Eggl6ujQqnZX&XtUa@n6hxAas35onA%Uh z@{dmSAdCTp6z(e-OKLNg9JR8+)gr6>S#){qPd>rXy{o-jJn5kL{=jzuPYsl<-dojTA0 zk9u5+VaIAr&;+}MG@nXkI{<)$%E(3VgxJWtasw z$Q7yOVvT~1VOY!%0ot^ze{|r|6%{N?gF|6sdl;pqLAn)j^fZ;3K}97Lh9NZ>sdG#? zGyz@3Qk5%2)n^%|fXH}(s^$?|Zj}*^w7Di}h*L~Lv`loKP^WPj;yRrH2CVr)je?7X zg+o?Dkx+#Kq!fUhNuIRe$Gt)gJT)r}n>6gyK<1PhKuMZOE)pf(D*!#}GD!ET7qO+p zep_@jA&_c1jAj!YE%&;gYUJj>LztrZnD^`|dz~d0)Q_!ZwSYs$MRYK@f&~zFP8PADQm8rhsMT}8sntjsH7sM-1k{6% zr8Ew6*wnxQ?^4PXQ~l{UCnp?I_sBd_7`=K?j(DWV9Cb8p+RgIZQUY}}?zEs&u|UVF{JknnW12zo{xvRhz!e}MT3xjB=}Smt zJ1E;z;CH0fXb#TcLlg{c4nidq0nDC%k7DIC)?N&p;_KoVhb$21Z#)|du4 z7@%-@??4a8?M8FOH;nqxyPTQ;OlF!!DcR!<-jMvm6ad08Mk(PBUexWNahd>N1FcB3 zV?0!f2UAD}frFZpj+CpKcN761T4`MMsYu5Z%w~WhF^X@L4NpY?Kq3_HC=t3*=>rUe&Dgr_y2Qkr8F2%=C_Wh+BqsLBd=0+z})RjstrwC*Cf zT3l4P#Wad8A(*A7Vw!1y;Av_+)3ZR(r=}_w=Zci_IH;SYA(SN?V-=YsIqh3ax#}vj z$5x$$(S*?RLdS~Icu!id<(ku&n-7J`RIjI zC^R))pwCfSyJ|9(NdOf9+fr*Y4{k)98$Q* zfH|Nk?NaqTbfeiR0Uq7Fv7iEdg-Q?ulgX#!wHFx}0CcGaaf434>S-`Dfkd z29zdw%{y|>tv;JEy0!F?$JfOAr)rhrMosZ~JjNMf!J6(GPA%ytyLMhze& z2A!Hf^q;u^}$Kq*DG0gxjKPp4bA@-*Cpa# zgUF@>#Xlrc0mH8p;m;Kq&q{DS&;)}WDQZ2~KScO#T zO0G7=36Ersk=2a0etF$CI12U5nJ_EIvt!EiEERJcBa<{}1{ClwGibuCFD z8NhNgwx%(1*lna$G}FylIX20TyNx(o0(KW0z{wR{kD#tnBAd58YSO|s2_$fVx@WyZ zDzr{xZla~drEs|cPfB4?UqD3amin`Xn zDzZ3rCvHb$Qyn~lP)NC6Nc0s-5*5*q(fU+P6=_XwA_~ESD-HOR!cUmwic{F)7 zXK3}KX!WAuWB=2vsgAsp+LR_UnvfvId8t$i^DcB1_7TaWW<^RAb*Z+D3U><-D)I8u ziYoGIX891Z_N7G|L!L<#t}?#De)msGa9>K8sHEB`xLAxWE;-4mFe$j824g0i7qF)Q zDRIRBCfszTAa|w3JSY^dF_^_DY*4^Z0Hg!Kr-M;qfk+9nP7DP^1wR863|+$%p!(BD z6bb;6oCxnwuOg-j4_ZJe!RCxoid=I*3AdVX&p7E$z@Ul%Xy=-6%{v1WPy;gA^rSc^ zBva2cU{bgd^y+CysWz{rG=Z8f12ac7>{3y13>tn&sKp^BfF<2QZ+eF`v;i*R{50*@ z;-Mg8ih3xdU6NwjpJDEFWR2Q*Q%QM6HT0Zs&pObQ4Xpa}uZN$*gvN_eCL ziNz*C=}AT?0L?~e#+qoj#54*i1pr75I8mY4~p$)H2%rh`tP095cc*$2NB z4Inr<6kH2;ONZU-RQT&!H-G9utgiILi9x4kqgs6-i%XnSX=nj+O(Qh4P$Dw4&9y0{ z#TNoCr@b_-Pfaw&L5g7>wK1f?qToVTy)cTfK&D_(aS)N~NI0no6&M&az+Y;%lB&Uv z;~Wp6s-5ZLsxood8o6e9Qwy}?Cvp1JttxK-eZ~iO<5aLa()(3=XaAtk5{3GLiXv^Ydq?wM_1>a*_k`uHVwD;}o?jcGz|; z#VYM|3>23v2^j=ZiBr!7+@F+<$AS0?r9rFqtX!p~c#<{4WXAc%I*M|b5=OX3+)hXs z?tN;FI+wJ4gOr=?GaLpvUgH9-E8C>zV)@#uDINNex8*?Qqj-k7B26K7}gYR4n?iM1zqXMSDqXLz{|JlT3 BNFo3L literal 0 HcmV?d00001 diff --git a/ru/docs/assets/covers/chapter_greedy.jpg b/ru/docs/assets/covers/chapter_greedy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..872ea8d3f8de917590d330a7540711b8a1889eff GIT binary patch literal 131643 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

    8u!5%{?|ltf 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 literal 0 HcmV?d00001 diff --git a/ru/docs/assets/covers/chapter_stack_and_queue.jpg b/ru/docs/assets/covers/chapter_stack_and_queue.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e41820d1817a9b89c9e2bcd2f9a43f577c7a913b GIT binary patch literal 113383 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

    arQ^q8W< zxfor>r@$NvP&SOyLCMV)9qupElQbGp?@(%xoKlV{a4ET@GC*n77!A1&JAe>r4bU6%qHO%@-Ysh{Y%wsKfR( zAS1OG6@})hOR3pJN^kQWcqtez`Sil%)JEEEa{TF$J4bB}8tOziW4o1!Pi&4@j)RW% z-PzdMY48XvqDWA52r>Ep0QKvpog1sOlCC3_*&J1!^|qlCO=?LB#TYOuLk^&V0TpDn zYQC(|Y5pTsRVpu_EZ&VIXRp_9U!bKjWcpTBBg*V_QI|Y!O-(Krj`bOGdQ&San<$K$ zWrjAEL$y>APoNdcUu$}0{j`>0ZRJ+L4|2s6A5f$BnI5}P>$pbaeHJe4qT-P(BTrQmew?<;e<|Lsk#P=j|^aD5*(Z{JudXe~w!lS2mbI*H@ zNkmQa56Z6#n`d6TYO%VF$IhVrD!Z5u+ys6#lAkWjL3?Rqa~WB3Rlm5*r2Tf0To$dO z+So}9HjxF6P+gghS<0U5c|ExFuHAy;G|QVieP+y9+&;-sx4|b}tU7%`=tptyitNH- zZByPRYU;;{+^xvHNx%){m0`SPNe4JS)jqJ-8lCyoZ0*viI&lk*oc{oH=Z{SKR|BQli~S*>dEPa4 z+`u1{u;dau*6qEFa%iJSmDWOz9zHrdFdSre&M{poicz_PsjZJ$m4hQF`LaJkFa1{7qRg&uCiIF>SvnJx)LURg0tDjT2gyE0ea`^?+AA1((qKH)Hg! z2vtq;ohxI~4K|k`fI-MKR)a!P(h6EYK+l7LO$<#n_;XGKQZz^l8dZ}A2AX-K0+^aC zoEmNj=~0Z1Dd5wwox`VEM&)Q=YCXhI4UyuVib8qK8?jVmE-5-v7O2V1F%t%${KJZa zIHe8gMT3}92t3dYF7kLZnWDnD?kM7tid>`SKmXA5-n5_^U_A3uk7~e3Ppv$5Xn!yabVnnJCyeNayxogEoH3Q&*C{X z3sB4Ukc!Cs6?b(EJ@Jk!ywdeceOB3TEf}i~{)hT@BDwDnX)!#%+Y!g*-9*Ao z@r*|<4@Xh=9QJO9y*iX`v^Z$jw7F-w=psPi0n(*YTy2KCYIOFWcnun!4^xhudiFKd z+p|0|GyUd8Ess(GHRU+9xwMs;V8s)knH2s4x&3HF(FaTtoqaLsR&B2u>fa#e5e90OoK3S7HKwa5Am)GCh z-n}Ql+E{|YwHa3uT$};iMmi6~@@vUsQ7o}V&`Bbz4{Yb9eGR7hQCeHVgk_U*j_0|@ z(z)>srC~|k8!H-Z7!_Vf4h~ORdbm%#a4K^fGViWiT^X6i*dFzTt-{e;AtygS^sb}p zT=$42iEWrk(GjFL_7tHVN=Kb)+NaqU%2UWv`2PTC{HytLYl)iXS;8Y6D(3^#o~PWO z{CiOG|b^+RtgVNKpll@*=gC`_9()I8F{2XbayPrf%sRaPMwy5l+rP6?B*bE z{mOOcmp_MZ#oeev#g>R7garvkLop*EJ1dl{c(o4DGmtC}U-Hle0MgoN_vC${H&ySL|nJ%w42 zWpPJ`?H=n|Yv4a~W`-bp8DEkIuGQ;~m6Laixl43+-DyP>hPaKwidrZEwDld$01otw z-Gu`NY@7;VG*ejAwp>KsML0|AQ5s5vLVqWK*?K{Aos_V+59T5(^cs&sys%SSewwqxUnVqxd zT+FH?h<9M$#KW)|=DU5SoUq$C+aySF>Z|@0y*a3y^`Pak#X%0A98rCfP-$HT)@|b_ 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 i;e*CV#bjSzG46 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_appendix/contribution.md b/ru/docs/chapter_appendix/contribution.md new file mode 100644 index 000000000..b4b368cd8 --- /dev/null +++ b/ru/docs/chapter_appendix/contribution.md @@ -0,0 +1,47 @@ +# Присоединяйтесь к созданию книги + +Возможности автора ограничены, поэтому в книге неизбежно могут встречаться упущения и ошибки. Просим отнестись к этому с пониманием. Если вы заметите опечатки, неработающие ссылки, пропуски в содержании, двусмысленные формулировки, неясные объяснения или неудачную структуру изложения, пожалуйста, помогите нам это исправить, чтобы читатели получили более качественный учебный ресурс. + +GitHub ID всех [участников](https://github.com/krahets/hello-algo/graphs/contributors) будут указаны на главных страницах репозитория книги, веб-версии и PDF-версии в знак благодарности за их бескорыстный вклад в сообщество открытого исходного кода. + +!!! success "Сила открытого исходного кода" + + Интервал между двумя тиражами бумажной книги обычно довольно велик, поэтому обновлять содержание очень неудобно. + + В этой же открытой книге цикл обновления содержания сокращается до нескольких дней, а иногда даже до нескольких часов. + +### Небольшие правки содержания + +Как показано на рисунке ниже, в правом верхнем углу каждой страницы есть "значок редактирования". Вы можете изменить текст или код следующим образом. + +1. Нажмите на "значок редактирования". Если появится сообщение "You need to fork this repository", согласитесь с этим действием. +2. Измените содержимое исходного Markdown-файла, проверьте корректность правок и постарайтесь сохранить единый стиль оформления. +3. Внизу страницы заполните описание изменений, затем нажмите кнопку "Propose file change". После перехода на следующую страницу нажмите кнопку "Create pull request", чтобы создать pull request. + +![Кнопка редактирования страницы](contribution.assets/edit_markdown.png) + +Изображения нельзя изменить напрямую, поэтому проблему с ними нужно описывать через новый [Issue](https://github.com/krahets/hello-algo/issues) или комментарий. Мы постараемся как можно быстрее перерисовать и заменить изображение. + +### Создание содержания + +Если вам интересно участвовать в этом проекте с открытым исходным кодом, например переводить код на другие языки программирования или расширять содержание статей, то следует придерживаться следующего рабочего процесса Pull Request. + +1. Войдите в GitHub и сделайте Fork [репозитория книги](https://github.com/krahets/hello-algo) в свой личный аккаунт. +2. Перейдите на страницу своего Fork-репозитория и с помощью команды `git clone` клонируйте репозиторий локально. +3. Создавайте и редактируйте содержание локально, затем проведите полное тестирование и проверьте корректность кода. +4. Сделайте Commit для локальных изменений, после чего выполните Push в удаленный репозиторий. +5. Обновите страницу репозитория и нажмите кнопку "Create pull request", чтобы отправить pull request. + +### Развертывание Docker + +В корневом каталоге `hello-algo` выполните следующий Docker-скрипт, после чего проект будет доступен по адресу `http://localhost:8000`: + +```shell +docker-compose up -d +``` + +Удалить развертывание можно следующей командой: + +```shell +docker-compose down +``` diff --git a/ru/docs/chapter_appendix/index.md b/ru/docs/chapter_appendix/index.md new file mode 100644 index 000000000..3aa3bd236 --- /dev/null +++ b/ru/docs/chapter_appendix/index.md @@ -0,0 +1,3 @@ +# Приложение + +![Приложение](../assets/covers/chapter_appendix.jpg) diff --git a/ru/docs/chapter_appendix/installation.assets/vscode_extension_installation.png b/ru/docs/chapter_appendix/installation.assets/vscode_extension_installation.png new file mode 100644 index 0000000000000000000000000000000000000000..6b8dbfb4ab9904411edea6bf805bf35ce66dd3a2 GIT binary patch literal 125768 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
      m7!^etSPy%# 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 N002ovPDHLkV1flq!~p;R literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_appendix/installation.md b/ru/docs/chapter_appendix/installation.md new file mode 100644 index 000000000..637710dbf --- /dev/null +++ b/ru/docs/chapter_appendix/installation.md @@ -0,0 +1,68 @@ +# Установка среды программирования + +## Установка IDE + +В качестве локальной интегрированной среды разработки (IDE) рекомендуется использовать открытую и легковесную VS Code. Перейдите на [официальный сайт VS Code](https://code.visualstudio.com/), выберите версию для своей операционной системы и установите ее. + +![Загрузка VS Code с официального сайта](installation.assets/vscode_installation.png) + +VS Code обладает мощной экосистемой расширений и поддерживает запуск и отладку большинства языков программирования. Например, после установки расширения "Python Extension Pack" можно отлаживать код на Python. Процесс установки показан на рисунке ниже. + +![Установка расширений VS Code](installation.assets/vscode_extension_installation.png) + +## Установка языковой среды + +### Среда Python + +1. Загрузите и установите [Miniconda3](https://docs.conda.io/en/latest/miniconda.html), требуется Python 3.10 или более новая версия. +2. В магазине расширений VS Code найдите `python` и установите Python Extension Pack. +3. (Необязательно) Введите в командной строке `pip install black`, чтобы установить инструмент форматирования кода. + +### Среда C/C++ + +1. В Windows требуется установить [MinGW](https://sourceforge.net/projects/mingw-w64/files/) ([руководство по настройке](https://blog.csdn.net/qq_33698226/article/details/129031241)); в macOS Clang уже установлен по умолчанию. +2. В магазине расширений VS Code найдите `c++` и установите C/C++ Extension Pack. +3. (Необязательно) Откройте страницу Settings, найдите параметр форматирования `Clang_format_fallback Style` и задайте значение `{ BasedOnStyle: Microsoft, BreakBeforeBraces: Attach }`. + +### Среда Java + +1. Загрузите и установите [OpenJDK](https://jdk.java.net/18/) (требуемая версия: > JDK 9). +2. В магазине расширений VS Code найдите `java` и установите Extension Pack for Java. + +### Среда C# + +1. Загрузите и установите [.Net 8.0](https://dotnet.microsoft.com/en-us/download). +2. В магазине расширений VS Code найдите `C# Dev Kit` и установите C# Dev Kit ([руководство по настройке](https://code.visualstudio.com/docs/csharp/get-started)). +3. Также можно использовать Visual Studio ([руководство по установке](https://learn.microsoft.com/zh-cn/visualstudio/install/install-visual-studio?view=vs-2022)). + +### Среда Go + +1. Загрузите и установите [go](https://go.dev/dl/). +2. В магазине расширений VS Code найдите `go` и установите Go. +3. Нажмите `Ctrl + Shift + P`, чтобы открыть командную палитру, введите `go`, выберите `Go: Install/Update Tools`, отметьте все инструменты и установите их. + +### Среда Swift + +1. Загрузите и установите [Swift](https://www.swift.org/download/). +2. В магазине расширений VS Code найдите `swift` и установите [Swift for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=sswg.swift-lang). + +### Среда JavaScript + +1. Загрузите и установите [Node.js](https://nodejs.org/en/). +2. (Необязательно) В магазине расширений VS Code найдите `Prettier` и установите инструмент форматирования кода. + +### Среда TypeScript + +1. Выполните те же шаги, что и для среды JavaScript. +2. Установите [TypeScript Execute (tsx)](https://github.com/privatenumber/tsx?tab=readme-ov-file#global-installation). +3. В магазине расширений VS Code найдите `typescript` и установите [Pretty TypeScript Errors](https://marketplace.visualstudio.com/items?itemName=yoavbls.pretty-ts-errors). + +### Среда Dart + +1. Загрузите и установите [Dart](https://dart.dev/get-dart). +2. В магазине расширений VS Code найдите `dart` и установите [Dart](https://marketplace.visualstudio.com/items?itemName=Dart-Code.dart-code). + +### Среда Rust + +1. Загрузите и установите [Rust](https://www.rust-lang.org/tools/install). +2. В магазине расширений VS Code найдите `rust` и установите [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer). diff --git a/ru/docs/chapter_appendix/terminology.md b/ru/docs/chapter_appendix/terminology.md new file mode 100644 index 000000000..27c0b5b25 --- /dev/null +++ b/ru/docs/chapter_appendix/terminology.md @@ -0,0 +1,137 @@ +# Глоссарий + +В таблице ниже перечислены важные термины, встречающиеся в книге. Обратите внимание на следующие моменты. + +- Рекомендуем запомнить английские названия терминов, чтобы легче читать англоязычную литературу. +- В русской версии третий столбец дублирует основной перевод, чтобы сохранить единый формат таблицы. + +

      Таблица   Важные термины по структурам данных и алгоритмам

      + +| English | Русский | Русский | +| ------------------------------ | ------------------------------ | ------------------------------ | +| algorithm | алгоритм | алгоритм | +| data structure | структура данных | структура данных | +| code | код | код | +| file | файл | файл | +| function | функция | функция | +| method | метод | метод | +| variable | переменная | переменная | +| asymptotic complexity analysis | асимптотический анализ сложности | асимптотический анализ сложности | +| time complexity | временная сложность | временная сложность | +| space complexity | пространственная сложность | пространственная сложность | +| loop | цикл | цикл | +| iteration | итерация | итерация | +| recursion | рекурсия | рекурсия | +| tail recursion | хвостовая рекурсия | хвостовая рекурсия | +| recursion tree | дерево рекурсии | дерево рекурсии | +| big-$O$ notation | нотация big-$O$ | нотация big-$O$ | +| asymptotic upper bound | асимптотическая верхняя граница | асимптотическая верхняя граница | +| sign-magnitude | прямой код | прямой код | +| 1’s complement | обратный код | обратный код | +| 2’s complement | дополнительный код | дополнительный код | +| array | массив | массив | +| index | индекс | индекс | +| linked list | связный список | связный список | +| linked list node, list node | узел связного списка | узел связного списка | +| head node | головной узел | головной узел | +| tail node | хвостовой узел | хвостовой узел | +| list | список | список | +| dynamic array | динамический массив | динамический массив | +| hard disk | жесткий диск | жесткий диск | +| random-access memory (RAM) | оперативная память | оперативная память | +| cache memory | кеш-память | кеш-память | +| cache miss | промах кеша | промах кеша | +| cache hit rate | коэффициент попадания в кеш | коэффициент попадания в кеш | +| stack | стек | стек | +| top of the stack | вершина стека | вершина стека | +| bottom of the stack | основание стека | основание стека | +| queue | очередь | очередь | +| double-ended queue | двусторонняя очередь | двусторонняя очередь | +| front of the queue | голова очереди | голова очереди | +| rear of the queue | хвост очереди | хвост очереди | +| hash table | хеш-таблица | хеш-таблица | +| hash set | хеш-набор | хеш-набор | +| bucket | корзина | корзина | +| hash function | хеш-функция | хеш-функция | +| hash collision | хеш-коллизия | хеш-коллизия | +| load factor | коэффициент заполнения | коэффициент заполнения | +| separate chaining | цепная адресация | цепная адресация | +| open addressing | открытая адресация | открытая адресация | +| linear probing | линейное зондирование | линейное зондирование | +| lazy deletion | ленивое удаление | ленивое удаление | +| binary tree | двоичное дерево | двоичное дерево | +| tree node | узел дерева | узел дерева | +| left-child node | левый дочерний узел | левый дочерний узел | +| right-child node | правый дочерний узел | правый дочерний узел | +| parent node | родительский узел | родительский узел | +| left subtree | левое поддерево | левое поддерево | +| right subtree | правое поддерево | правое поддерево | +| root node | корневой узел | корневой узел | +| leaf node | листовой узел | листовой узел | +| edge | ребро | ребро | +| level | уровень | уровень | +| degree | степень | степень | +| height | высота | высота | +| depth | глубина | глубина | +| perfect binary tree | идеальное двоичное дерево | идеальное двоичное дерево | +| complete binary tree | совершенное двоичное дерево | совершенное двоичное дерево | +| full binary tree | полное двоичное дерево | полное двоичное дерево | +| balanced binary tree | сбалансированное двоичное дерево | сбалансированное двоичное дерево | +| binary search tree | двоичное дерево поиска | двоичное дерево поиска | +| AVL tree | АВЛ-дерево | АВЛ-дерево | +| red-black tree | красно-черное дерево | красно-черное дерево | +| level-order traversal | обход по уровням | обход по уровням | +| breadth-first traversal | обход в ширину | обход в ширину | +| depth-first traversal | обход в глубину | обход в глубину | +| binary search tree | двоичное дерево поиска | двоичное дерево поиска | +| balanced binary search tree | сбалансированное двоичное дерево поиска | сбалансированное двоичное дерево поиска | +| balance factor | фактор баланса | фактор баланса | +| heap | куча | куча | +| max heap | максимальная куча | максимальная куча | +| min heap | минимальная куча | минимальная куча | +| priority queue | приоритетная очередь | приоритетная очередь | +| heapify | упорядочивание кучи | упорядочивание кучи | +| top-$k$ problem | поиск $k$ наибольших элементов | поиск $k$ наибольших элементов | +| graph | граф | граф | +| vertex | вершина | вершина | +| undirected graph | неориентированный граф | неориентированный граф | +| directed graph | ориентированный граф | ориентированный граф | +| connected graph | связный граф | связный граф | +| disconnected graph | несвязный граф | несвязный граф | +| weighted graph | взвешенный граф | взвешенный граф | +| adjacency | смежность | смежность | +| path | путь | путь | +| in-degree | входящая степень | входящая степень | +| out-degree | исходящая степень | исходящая степень | +| adjacency matrix | матрица смежности | матрица смежности | +| adjacency list | список смежности | список смежности | +| breadth-first search | поиск в ширину | поиск в ширину | +| depth-first search | поиск в глубину | поиск в глубину | +| binary search | двоичный поиск | двоичный поиск | +| searching algorithm | алгоритм поиска | алгоритм поиска | +| sorting algorithm | алгоритм сортировки | алгоритм сортировки | +| selection sort | сортировка выбором | сортировка выбором | +| bubble sort | сортировка пузырьком | сортировка пузырьком | +| insertion sort | сортировка вставкой | сортировка вставкой | +| quick sort | быстрая сортировка | быстрая сортировка | +| merge sort | сортировка слиянием | сортировка слиянием | +| heap sort | пирамидальная сортировка | пирамидальная сортировка | +| bucket sort | блочная сортировка | блочная сортировка | +| counting sort | сортировка подсчетом | сортировка подсчетом | +| radix sort | поразрядная сортировка | поразрядная сортировка | +| divide and conquer | разделяй и властвуй | разделяй и властвуй | +| hanota problem | задача о Ханойской башне | задача о Ханойской башне | +| backtracking algorithm | алгоритм поиска с возвратом | алгоритм поиска с возвратом | +| constraint | ограничение | ограничение | +| solution | решение | решение | +| state | состояние | состояние | +| pruning | отсечение | отсечение | +| permutations problem | задача о перестановках | задача о перестановках | +| subset-sum problem | задача о сумме подмножеств | задача о сумме подмножеств | +| $n$-queens problem | задача о $n$ ферзях | задача о $n$ ферзях | +| dynamic programming | динамическое программирование | динамическое программирование | +| initial state | начальное состояние | начальное состояние | +| state-transition equation | уравнение перехода состояния | уравнение перехода состояния | +| knapsack problem | задача о рюкзаке | задача о рюкзаке | +| edit distance problem | задача о расстоянии редактирования | задача о расстоянии редактирования | +| greedy algorithm | жадный алгоритм | жадный алгоритм | diff --git a/ru/docs/chapter_array_and_linkedlist/array.assets/array_definition.png b/ru/docs/chapter_array_and_linkedlist/array.assets/array_definition.png new file mode 100644 index 0000000000000000000000000000000000000000..49ba4d106e24432a1f9856e29a4ac76ce989aa1f GIT binary patch literal 13100 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_array_and_linkedlist/array.assets/array_insert_element.png b/ru/docs/chapter_array_and_linkedlist/array.assets/array_insert_element.png new file mode 100644 index 0000000000000000000000000000000000000000..1c3a3d5cd31f10bc8e1ad2bb15200db48d77603c GIT binary patch literal 23409 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

      `z4BiNdM(#!y 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_array_and_linkedlist/array.assets/array_memory_location_calculation.png b/ru/docs/chapter_array_and_linkedlist/array.assets/array_memory_location_calculation.png new file mode 100644 index 0000000000000000000000000000000000000000..65ebe5ed1447b832f925626ef045f30d90788670 GIT binary patch literal 18206 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╈MHt_e^7P~%#RlDlVZZ&r@0Kepg3 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

      HB7oR{ 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_array_and_linkedlist/array.assets/array_remove_element.png b/ru/docs/chapter_array_and_linkedlist/array.assets/array_remove_element.png new file mode 100644 index 0000000000000000000000000000000000000000..0337f519307a83c605215822ff6b1c810c9bbf2a GIT binary patch literal 20698 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_array_and_linkedlist/array.md b/ru/docs/chapter_array_and_linkedlist/array.md new file mode 100644 index 000000000..2f2de7256 --- /dev/null +++ b/ru/docs/chapter_array_and_linkedlist/array.md @@ -0,0 +1,227 @@ +# Массив + +Массив (array) - это линейная структура данных, которая хранит элементы одного типа в непрерывной области памяти. Положение элемента в массиве называется его индексом (index). На рисунке ниже показаны основные понятия, связанные с массивом, и способ его хранения. + +![Определение массива и способ хранения](array.assets/array_definition.png) + +## Основные операции с массивом + +### Инициализация массива + +В зависимости от задачи мы можем выбрать один из двух способов инициализации массива: без начальных значений или с заданными начальными значениями. Если начальные значения не указаны, большинство языков программирования инициализируют элементы массива значением $0$ : + +=== "Python" + + ```python title="array.py" + # Инициализация массива + arr: list[int] = [0] * 5 # [ 0, 0, 0, 0, 0 ] + nums: list[int] = [1, 3, 2, 5, 4] + ``` + +=== "C++" + + ```cpp title="array.cpp" + /* Инициализация массива */ + // Хранится в стеке + int arr[5]; + int nums[5] = { 1, 3, 2, 5, 4 }; + // Хранится в куче (требуется ручное освобождение памяти) + int* arr1 = new int[5]; + int* nums1 = new int[5] { 1, 3, 2, 5, 4 }; + ``` + +=== "Java" + + ```java title="array.java" + /* Инициализация массива */ + int[] arr = new int[5]; // { 0, 0, 0, 0, 0 } + int[] nums = { 1, 3, 2, 5, 4 }; + ``` + +=== "C#" + + ```csharp title="array.cs" + /* Инициализация массива */ + int[] arr = new int[5]; // [ 0, 0, 0, 0, 0 ] + int[] nums = [1, 3, 2, 5, 4]; + ``` + +=== "Go" + + ```go title="array.go" + /* Инициализация массива */ + var arr [5]int + // В Go указание длины ([5]int) создает массив, а отсутствие длины ([]int) - срез + // Поскольку длина массива в Go определяется на этапе компиляции, для задания длины можно использовать только константы + // Чтобы упростить реализацию метода extend(), ниже будем рассматривать срезы (Slice) как массивы (Array) + nums := []int{1, 3, 2, 5, 4} + ``` + +=== "Swift" + + ```swift title="array.swift" + /* Инициализация массива */ + let arr = Array(repeating: 0, count: 5) // [0, 0, 0, 0, 0] + let nums = [1, 3, 2, 5, 4] + ``` + +=== "JS" + + ```javascript title="array.js" + /* Инициализация массива */ + var arr = new Array(5).fill(0); + var nums = [1, 3, 2, 5, 4]; + ``` + +=== "TS" + + ```typescript title="array.ts" + /* Инициализация массива */ + let arr: number[] = new Array(5).fill(0); + let nums: number[] = [1, 3, 2, 5, 4]; + ``` + +=== "Dart" + + ```dart title="array.dart" + /* Инициализация массива */ + List arr = List.filled(5, 0); // [0, 0, 0, 0, 0] + List nums = [1, 3, 2, 5, 4]; + ``` + +=== "Rust" + + ```rust title="array.rs" + /* Инициализация массива */ + let arr: [i32; 5] = [0; 5]; // [0, 0, 0, 0, 0] + let slice: &[i32] = &[0; 5]; + // В Rust указание длины ([i32; 5]) создает массив, а отсутствие длины (&[i32]) - срез + // Поскольку длина массива в Rust определяется на этапе компиляции, для задания длины можно использовать только константы + // Vector в Rust обычно используется как динамический массив + // Чтобы упростить реализацию метода extend(), ниже будем рассматривать vector как массив (array) + let nums: Vec = vec![1, 3, 2, 5, 4]; + ``` + +=== "C" + + ```c title="array.c" + /* Инициализация массива */ + int arr[5] = { 0 }; // { 0, 0, 0, 0, 0 } + int nums[5] = { 1, 3, 2, 5, 4 }; + ``` + +=== "Kotlin" + + ```kotlin title="array.kt" + /* Инициализация массива */ + var arr = IntArray(5) // { 0, 0, 0, 0, 0 } + var nums = intArrayOf(1, 3, 2, 5, 4) + ``` + +=== "Ruby" + + ```ruby title="array.rb" + # Инициализация массива + arr = Array.new(5, 0) + nums = [1, 3, 2, 5, 4] + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%0Aarr%20%3D%20%5B0%5D%20%2A%205%20%20%23%20%5B%200%2C%200%2C%200%2C%200%2C%200%20%5D%0Anums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D&cumulative=false&curInstr=0&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +### Доступ к элементам + +Элементы массива хранятся в непрерывной области памяти, а это означает, что вычислить адрес любого элемента очень просто. Зная адрес массива в памяти (то есть адрес первого элемента) и индекс некоторого элемента, мы можем по формуле с рисунка ниже вычислить адрес этого элемента и напрямую обратиться к нему. + +![Вычисление адреса элемента массива](array.assets/array_memory_location_calculation.png) + +Если посмотреть на рисунок выше, можно заметить, что индекс первого элемента массива равен $0$ , и это кажется не слишком интуитивным, ведь естественнее было бы начинать счет с $1$ . Однако с точки зрения формулы адресации **индекс по сути является смещением относительно адреса памяти**. Смещение первого элемента равно $0$ , поэтому индекс $0$ вполне логичен. + +Доступ к элементам массива очень эффективен: любой элемент массива можно получить за $O(1)$ времени. + +```src +[file]{array}-[class]{}-[func]{random_access} +``` + +### Вставка элемента + +Элементы массива в памяти расположены "вплотную" друг к другу, и между ними нет места для размещения новых данных. Как показано на рисунке ниже, если мы хотим вставить элемент в середину массива, то все элементы после этой позиции нужно сдвинуть на одну позицию вправо, а затем записать новое значение в освободившийся индекс. + +![Пример вставки элемента в массив](array.assets/array_insert_element.png) + +Стоит отметить, что длина массива фиксирована, поэтому вставка нового элемента неизбежно приведет к "потере" элемента на конце массива. Решение этой проблемы мы оставим для обсуждения в разделе о "списках". + +```src +[file]{array}-[class]{}-[func]{insert} +``` + +### Удаление элемента + +Аналогично, как показано на рисунке ниже, если нужно удалить элемент по индексу $i$ , то все элементы после индекса $i$ необходимо сдвинуть на одну позицию влево. + +![Пример удаления элемента из массива](array.assets/array_remove_element.png) + +Обрати внимание: после удаления исходный последний элемент становится "бессмысленным", поэтому специально изменять его не требуется. + +```src +[file]{array}-[class]{}-[func]{remove} +``` + +В целом операции вставки и удаления в массиве имеют следующие недостатки. + +- **Высокая временная сложность**: средняя временная сложность и вставки, и удаления равна $O(n)$ , где $n$ - длина массива. +- **Потеря элементов**: поскольку длина массива неизменяема, после вставки элементы, выходящие за пределы длины массива, будут потеряны. +- **Потери памяти**: можно заранее инициализировать более длинный массив и использовать только его переднюю часть; тогда "теряемые" при вставке элементы на конце не будут нести смысла, но такой подход приводит к лишнему расходу памяти. + +### Обход массива + +В большинстве языков программирования массив можно обходить как по индексу, так и напрямую перебирая каждый элемент: + +```src +[file]{array}-[class]{}-[func]{traverse} +``` + +### Поиск элемента + +Чтобы найти заданный элемент в массиве, нужно пройти по массиву и на каждой итерации проверять, совпадает ли значение; если совпадает, вернуть соответствующий индекс. + +Поскольку массив - это линейная структура данных, такая операция поиска называется "линейным поиском". + +```src +[file]{array}-[class]{}-[func]{find} +``` + +### Расширение массива + +В сложной системной среде программа не может гарантировать, что память сразу после массива доступна, поэтому безопасно расширить емкость массива невозможно. Поэтому в большинстве языков программирования **длина массива неизменяема**. + +Если мы хотим расширить массив, нужно заново создать больший массив и затем по одному скопировать в него элементы исходного массива. Это операция с временной сложностью $O(n)$ , и при больших массивах она очень затратна. Соответствующий код показан ниже: + +```src +[file]{array}-[class]{}-[func]{extend} +``` + +## Преимущества и ограничения массива + +Массив хранится в непрерывной области памяти, и все его элементы имеют один и тот же тип. Такой подход содержит много априорной информации, которую система может использовать для оптимизации эффективности операций со структурой данных. + +- **Высокая пространственная эффективность**: массив выделяет для данных непрерывный блок памяти без дополнительного структурного накладного расхода. +- **Поддержка произвольного доступа**: массив позволяет обращаться к любому элементу за $O(1)$ времени. +- **Локальность кэша**: при обращении к элементу массива компьютер загружает не только сам элемент, но и соседние данные, что позволяет использовать кэш для ускорения последующих операций. + +Хранение в непрерывной области памяти - палка о двух концах, и у него есть следующие ограничения. + +- **Низкая эффективность вставки и удаления**: когда элементов в массиве много, вставка и удаление требуют сдвига большого количества элементов. +- **Неизменяемая длина**: после инициализации длина массива фиксирована; расширение массива требует копирования всех данных в новый массив, что стоит дорого. +- **Потери памяти**: если выделенный массив больше, чем реально необходимо, лишнее пространство пропадает впустую. + +## Типичные применения массива + +Массив - это базовая и очень распространенная структура данных. Он часто используется как в различных алгоритмах, так и при реализации более сложных структур данных. + +- **Произвольный доступ**: если мы хотим случайным образом выбирать некоторые образцы, можно сохранить их в массиве и сгенерировать случайную последовательность индексов для выборки. +- **Сортировка и поиск**: массив - самая распространенная структура данных для алгоритмов сортировки и поиска. Быстрая сортировка, сортировка слиянием, бинарный поиск и многие другие алгоритмы в основном работают именно с массивами. +- **Таблица поиска**: когда нужно быстро находить элемент или его соответствие, массив можно использовать как lookup table. Например, если мы хотим реализовать отображение символов в коды ASCII, можно использовать значение ASCII как индекс, а соответствующий элемент хранить по этой позиции массива. +- **Машинное обучение**: в нейронных сетях широко используются операции линейной алгебры над векторами, матрицами и тензорами, и все эти данные строятся в форме массивов. Массив - самая часто используемая структура данных в программировании нейросетей. +- **Реализация структур данных**: массивы можно использовать для реализации стеков, очередей, хеш-таблиц, куч, графов и других структур данных. Например, матрица смежности графа по сути является двумерным массивом. diff --git a/ru/docs/chapter_array_and_linkedlist/index.md b/ru/docs/chapter_array_and_linkedlist/index.md new file mode 100644 index 000000000..8f05539db --- /dev/null +++ b/ru/docs/chapter_array_and_linkedlist/index.md @@ -0,0 +1,9 @@ +# Массивы и списки + +![Массивы и списки](../assets/covers/chapter_array_and_linkedlist.jpg) + +!!! abstract + + Мир структур данных напоминает прочную кирпичную стену. + + Кирпичи массива уложены ровно и плотно прилегают друг к другу. Кирпичи связного списка разбросаны в разных местах, а соединяющие их лозы свободно тянутся между щелями. diff --git a/ru/docs/chapter_array_and_linkedlist/linked_list.assets/linkedlist_common_types.png b/ru/docs/chapter_array_and_linkedlist/linked_list.assets/linkedlist_common_types.png new file mode 100644 index 0000000000000000000000000000000000000000..efeeeb2017ab3ec66bc5d252153ca6ace0103e74 GIT binary patch literal 12967 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


      !+ zY@q2+Wcuu!O9odgYoSCI=hGYm_QS82tz=ODgf72Zg`|rhRYv>vrK@eWkMn_rN02k5 zy5J(4m<-wC#U8?eBArvodL=Q?J=q;Yewr+c5i+1Ay^nyRi{SDpWZyn6B!xWu3Vt=X zlz8@2Iq}0aU~@W1Tcu! zJwtD;UQG`^@gsd!@X<|WRZxMB{&+?r52bJ-?2^qI3Iu4mK<}82-Z%p4LBj(g6FaDo zrgQ}2u|1Z6B)BrMqApZ2JJDE1WoNyp?MH|TqRVPkwx z9?!L3)f^RA;Y*8rm?)o^T+rRVwp>tTKVmX;$@SOqYdPWh^K>5ReJiTZS15rGwyiw0%>C;jE-*v6n(b1=Y-Ag@I5Rc-?8fSVPX z)GkJnac=QM1ry(JA3s$4Y;*_9!9rHJVK zycNgQ56UU1Dp)OZOq>!oU!|-t*;YWWMBG(NvKLlSHu$5AQK0+*wQ8u{Ubuqn@}&5lXE_S#1%gXV#pYt{4gxdYaQ2ii{ldc z(>8d8h&t9Ty@w8?D-U^0nLQv28w0*RGUh0{V&D)Ru#{4;w6>GAcD1E)1GV>aO=(s* zULfU!{cz0)U(mCVPxdprH}QMw@PQ@S?yAf`9>HqFP3{4IN3x!|-Vzrj%IxGWV&32YOR&d=77g|u|PX~L~v)DH{mPLs#id7J(Tm;Ym% bxj_Iyg literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_array_and_linkedlist/linked_list.assets/linkedlist_insert_node.png b/ru/docs/chapter_array_and_linkedlist/linked_list.assets/linkedlist_insert_node.png new file mode 100644 index 0000000000000000000000000000000000000000..1498a4f4094370c64db6f397d6cf718f10ada8bb GIT binary patch literal 14761 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

      ir595vMy3dwhm|3WT^z^J9#X1I=J2uB|ix z+mRFt9Vv@R2%h92PQ3#wB(aC)u?uEoORoTpOSNY`J+@Vel1(1&iAcfWr zdiHSxk9)((SBABfiGnza3o0bvn~iOSeW=mmVwClDF`ap~fns%Bm?I;f(R@=P&()L1 z@avvrw+RyG>R0z+@XZol*YkYfY)d?wk~%rrL`o}GmmaT}miWbry)N&8Os$UZow0*v zin=5Ajao1qiVtzJHp}Vsr9U8BbO_lky`uRmZ}hA>Je5`cu-m!rD-ECw2LA0|&+-*B6(G8E&z_fH$Fk&GecI&y zjDL2-Qr**)zF;7?jwXG&T3FILwY!Eb!%%who=iHs;JNCm@OyvrUqQ zrdSzKIn#?JZ1pIyMLrTsyWJU%Ea}1&b;FvTO9$7Blg6&xk6+fMOhKd`JJvG}fAz3- zqj}H5KS`TW_i9N?fryln;D}rPL}0B>Cz)w{axzUjsPytDdhDlBZj8MuM^@mpe{Y>< zJ`gAOh-F)D?s>s+fGAzun-rWTInh15|4aRD7uPo~Xl(gJHjEEa_ZLSnk4?5+exWsv z7&xDA?d8Xb6ecV$eOKSRn=td0v)6Pj+sY&OwN)m_zAsF2IZ4KLjbvba@{$!|H-`-J zF{^S^TuE~DyOkzxO1!yXH*J3DM?A1r+Kky9tan>63nh6bjw~IlGJ+v6{W5UMX{^Bt;#zk8xaj{FJ?@V0c| zxy0E|CH{oZ9>QN@3Y$gP2`SllAhCsb7B2cOHOCD{nYwq;2xHN4N;G}Xv+W{HrfN>6 z(8o}HLqnin*YMYycsUQvj!8a~^x6{_Gvif~&W3?DAKzvB%7qUgwoCn;C>{b8=0K`B z7TF#daw%F6-$pOgTLI!vPV2npU_p3mS8AQ z2Gc~&R6n$#c)g*s+>+l#S0|G2*3Yg_C^;USTmzUrR3h=CL|YB68#P0GLY-^x8)|}? zhP2Aerhi}e8MVI$D`+;Km_H`Sp`IDW86=LdCkvLX*o6gK2;2?`+wQ`z*`f(GYl3ku zOD^YrvI4S!4=Qop|6;&yIOO z`4IIt6rxY_=tWT6!1mlMu6dR0fdJ2+>W&^1cFS51Hat&`%Gv}bonF1yW)8yQK@Gx4-Xdvrt>tRuNyv~PjMHy z{ctxLSG6y28@@W_SHkmsB$um91|Q|^aG~3Fx=6jl;Gk-#UE?*|2eK(NOTp^GFc zc_V>`m&Si#^C2TyN+1viuJpW3g|0E;=YQzAC^UcV6iEZ>6FAZ~(~IIQMZcxJtzpIg za}C;jOoSaL`fMn=!xTF%*sVrIx+!%oodA;W3MJF_S-A~<9l4tF2ZA>^m9kH*Pbu4V z8kbNp≠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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_array_and_linkedlist/linked_list.md b/ru/docs/chapter_array_and_linkedlist/linked_list.md new file mode 100644 index 000000000..80cc0f6c9 --- /dev/null +++ b/ru/docs/chapter_array_and_linkedlist/linked_list.md @@ -0,0 +1,702 @@ +# Связный список + +Память является общим ресурсом для всех программ, и в сложной среде выполнения свободные участки памяти могут быть разбросаны по всему адресу памяти. Мы знаем, что память для хранения массива должна быть непрерывной, а если массив очень велик, память может не суметь предоставить столь большой непрерывный блок. Именно здесь проявляется преимущество гибкости связного списка. + +Связный список (linked list) - это линейная структура данных, в которой каждый элемент представляет собой объект-узел, а сами узлы соединены между собой через "ссылки". Ссылка хранит адрес памяти следующего узла, благодаря чему из текущего узла можно получить доступ к следующему. + +Конструкция связного списка позволяет хранить отдельные узлы в разных местах памяти, и их адреса вовсе не обязаны быть непрерывными. + +![Определение связного списка и способ хранения](linked_list.assets/linkedlist_definition.png) + +Если посмотреть на рисунок выше, можно заметить, что базовой единицей связного списка является объект узел (node). Каждый узел содержит две части данных: "значение" узла и "ссылку" на следующий узел. + +- Первый узел связного списка называется "головным узлом", а последний - "хвостовым узлом". +- Хвостовой узел указывает на "пусто", что в Java, C++ и Python обозначается как `null` , `nullptr` и `None` соответственно. +- В языках, поддерживающих указатели, таких как C, C++, Go и Rust, упомянутую выше "ссылку" следует заменить на "указатель". + +Как показано в коде ниже, узел связного списка `ListNode` хранит не только значение, но и дополнительную ссылку (указатель). Поэтому **при одинаковом объеме данных связный список занимает больше памяти, чем массив**. + +=== "Python" + + ```python title="" + class ListNode: + """Класс узла связного списка""" + def __init__(self, val: int): + self.val: int = val # Значение узла + self.next: ListNode | None = None # Ссылка на следующий узел + ``` + +=== "C++" + + ```cpp title="" + /* Структура узла связного списка */ + struct ListNode { + int val; // Значение узла + ListNode *next; // Указатель на следующий узел + ListNode(int x) : val(x), next(nullptr) {} // Конструктор + }; + ``` + +=== "Java" + + ```java title="" + /* Класс узла связного списка */ + class ListNode { + int val; // Значение узла + ListNode next; // Ссылка на следующий узел + ListNode(int x) { val = x; } // Конструктор + } + ``` + +=== "C#" + + ```csharp title="" + /* Класс узла связного списка */ + class ListNode(int x) { // Конструктор + int val = x; // Значение узла + ListNode? next; // Ссылка на следующий узел + } + ``` + +=== "Go" + + ```go title="" + /* Структура узла связного списка */ + type ListNode struct { + Val int // Значение узла + Next *ListNode // Указатель на следующий узел + } + + // NewListNode Конструктор, создает новый связный список + func NewListNode(val int) *ListNode { + return &ListNode{ + Val: val, + Next: nil, + } + } + ``` + +=== "Swift" + + ```swift title="" + /* Класс узла связного списка */ + class ListNode { + var val: Int // Значение узла + var next: ListNode? // Ссылка на следующий узел + + init(x: Int) { // Конструктор + val = x + } + } + ``` + +=== "JS" + + ```javascript title="" + /* Класс узла связного списка */ + class ListNode { + constructor(val, next) { + this.val = (val === undefined ? 0 : val); // Значение узла + this.next = (next === undefined ? null : next); // Ссылка на следующий узел + } + } + ``` + +=== "TS" + + ```typescript title="" + /* Класс узла связного списка */ + class ListNode { + val: number; + next: ListNode | null; + constructor(val?: number, next?: ListNode | null) { + this.val = val === undefined ? 0 : val; // Значение узла + this.next = next === undefined ? null : next; // Ссылка на следующий узел + } + } + ``` + +=== "Dart" + + ```dart title="" + /* Класс узла связного списка */ + class ListNode { + int val; // Значение узла + ListNode? next; // Ссылка на следующий узел + ListNode(this.val, [this.next]); // Конструктор + } + ``` + +=== "Rust" + + ```rust title="" + use std::rc::Rc; + use std::cell::RefCell; + /* Класс узла связного списка */ + #[derive(Debug)] + struct ListNode { + val: i32, // Значение узла + next: Option>>, // Указатель на следующий узел + } + ``` + +=== "C" + + ```c title="" + /* Структура узла связного списка */ + typedef struct ListNode { + int val; // Значение узла + struct ListNode *next; // Указатель на следующий узел + } ListNode; + + /* Конструктор */ + ListNode *newListNode(int val) { + ListNode *node; + node = (ListNode *) malloc(sizeof(ListNode)); + node->val = val; + node->next = NULL; + return node; + } + ``` + +=== "Kotlin" + + ```kotlin title="" + /* Класс узла связного списка */ + // Конструктор + class ListNode(x: Int) { + val _val: Int = x // Значение узла + val next: ListNode? = null // Ссылка на следующий узел + } + ``` + +=== "Ruby" + + ```ruby title="" + # Класс узла связного списка + class ListNode + attr_accessor :val # Значение узла + attr_accessor :next # Ссылка на следующий узел + + def initialize(val=0, next_node=nil) + @val = val + @next = next_node + end + end + ``` + +## Основные операции со связным списком + +### Инициализация связного списка + +Построение связного списка состоит из двух шагов: сначала нужно инициализировать объекты всех узлов, затем установить связи-ссылки между ними. После завершения инициализации мы можем, начиная с головы списка, последовательно проходить все узлы по ссылке `next`. + +=== "Python" + + ```python title="linked_list.py" + # Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 + # Инициализация отдельных узлов + n0 = ListNode(1) + n1 = ListNode(3) + n2 = ListNode(2) + n3 = ListNode(5) + n4 = ListNode(4) + # Построение ссылок между узлами + n0.next = n1 + n1.next = n2 + n2.next = n3 + n3.next = n4 + ``` + +=== "C++" + + ```cpp title="linked_list.cpp" + /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */ + // Инициализация отдельных узлов + ListNode* n0 = new ListNode(1); + ListNode* n1 = new ListNode(3); + ListNode* n2 = new ListNode(2); + ListNode* n3 = new ListNode(5); + ListNode* n4 = new ListNode(4); + // Построение ссылок между узлами + n0->next = n1; + n1->next = n2; + n2->next = n3; + n3->next = n4; + ``` + +=== "Java" + + ```java title="linked_list.java" + /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */ + // Инициализация отдельных узлов + ListNode n0 = new ListNode(1); + ListNode n1 = new ListNode(3); + ListNode n2 = new ListNode(2); + ListNode n3 = new ListNode(5); + ListNode n4 = new ListNode(4); + // Построение ссылок между узлами + n0.next = n1; + n1.next = n2; + n2.next = n3; + n3.next = n4; + ``` + +=== "C#" + + ```csharp title="linked_list.cs" + /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */ + // Инициализация отдельных узлов + ListNode n0 = new(1); + ListNode n1 = new(3); + ListNode n2 = new(2); + ListNode n3 = new(5); + ListNode n4 = new(4); + // Построение ссылок между узлами + n0.next = n1; + n1.next = n2; + n2.next = n3; + n3.next = n4; + ``` + +=== "Go" + + ```go title="linked_list.go" + /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */ + // Инициализация отдельных узлов + n0 := NewListNode(1) + n1 := NewListNode(3) + n2 := NewListNode(2) + n3 := NewListNode(5) + n4 := NewListNode(4) + // Построение ссылок между узлами + n0.Next = n1 + n1.Next = n2 + n2.Next = n3 + n3.Next = n4 + ``` + +=== "Swift" + + ```swift title="linked_list.swift" + /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */ + // Инициализация отдельных узлов + let n0 = ListNode(x: 1) + let n1 = ListNode(x: 3) + let n2 = ListNode(x: 2) + let n3 = ListNode(x: 5) + let n4 = ListNode(x: 4) + // Построение ссылок между узлами + n0.next = n1 + n1.next = n2 + n2.next = n3 + n3.next = n4 + ``` + +=== "JS" + + ```javascript title="linked_list.js" + /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */ + // Инициализация отдельных узлов + const n0 = new ListNode(1); + const n1 = new ListNode(3); + const n2 = new ListNode(2); + const n3 = new ListNode(5); + const n4 = new ListNode(4); + // Построение ссылок между узлами + n0.next = n1; + n1.next = n2; + n2.next = n3; + n3.next = n4; + ``` + +=== "TS" + + ```typescript title="linked_list.ts" + /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */ + // Инициализация отдельных узлов + const n0 = new ListNode(1); + const n1 = new ListNode(3); + const n2 = new ListNode(2); + const n3 = new ListNode(5); + const n4 = new ListNode(4); + // Построение ссылок между узлами + n0.next = n1; + n1.next = n2; + n2.next = n3; + n3.next = n4; + ``` + +=== "Dart" + + ```dart title="linked_list.dart" + /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */\ + // Инициализация отдельных узлов + ListNode n0 = ListNode(1); + ListNode n1 = ListNode(3); + ListNode n2 = ListNode(2); + ListNode n3 = ListNode(5); + ListNode n4 = ListNode(4); + // Построение ссылок между узлами + n0.next = n1; + n1.next = n2; + n2.next = n3; + n3.next = n4; + ``` + +=== "Rust" + + ```rust title="linked_list.rs" + /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */ + // Инициализация отдельных узлов + let n0 = Rc::new(RefCell::new(ListNode { val: 1, next: None })); + let n1 = Rc::new(RefCell::new(ListNode { val: 3, next: None })); + let n2 = Rc::new(RefCell::new(ListNode { val: 2, next: None })); + let n3 = Rc::new(RefCell::new(ListNode { val: 5, next: None })); + let n4 = Rc::new(RefCell::new(ListNode { val: 4, next: None })); + + // Построение ссылок между узлами + n0.borrow_mut().next = Some(n1.clone()); + n1.borrow_mut().next = Some(n2.clone()); + n2.borrow_mut().next = Some(n3.clone()); + n3.borrow_mut().next = Some(n4.clone()); + ``` + +=== "C" + + ```c title="linked_list.c" + /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */ + // Инициализация отдельных узлов + ListNode* n0 = newListNode(1); + ListNode* n1 = newListNode(3); + ListNode* n2 = newListNode(2); + ListNode* n3 = newListNode(5); + ListNode* n4 = newListNode(4); + // Построение ссылок между узлами + n0->next = n1; + n1->next = n2; + n2->next = n3; + n3->next = n4; + ``` + +=== "Kotlin" + + ```kotlin title="linked_list.kt" + /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */ + // Инициализация отдельных узлов + val n0 = ListNode(1) + val n1 = ListNode(3) + val n2 = ListNode(2) + val n3 = ListNode(5) + val n4 = ListNode(4) + // Построение ссылок между узлами + n0.next = n1; + n1.next = n2; + n2.next = n3; + n3.next = n4; + ``` + +=== "Ruby" + + ```ruby title="linked_list.rb" + # Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 + # Инициализация отдельных узлов + n0 = ListNode.new(1) + n1 = ListNode.new(3) + n2 = ListNode.new(2) + n3 = ListNode.new(5) + n4 = ListNode.new(4) + # Построение ссылок между узлами + n0.next = n1 + n1.next = n2 + n2.next = n3 + n3.next = n4 + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%20%20%20%20%22%22%22%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%D1%83%D0%B7%D0%B5%D0%BB%D0%BA%D0%BB%D0%B0%D1%81%D1%81%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%201%20-%3E%203%20-%3E%202%20-%3E%205%20-%3E%204%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20n0%20%3D%20ListNode%281%29%0A%20%20%20%20n1%20%3D%20ListNode%283%29%0A%20%20%20%20n2%20%3D%20ListNode%282%29%0A%20%20%20%20n3%20%3D%20ListNode%285%29%0A%20%20%20%20n4%20%3D%20ListNode%284%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%83%D0%B7%D0%BB%D0%B0%D0%BC%D0%B8%0A%20%20%20%20n0.next%20%3D%20n1%0A%20%20%20%20n1.next%20%3D%20n2%0A%20%20%20%20n2.next%20%3D%20n3%0A%20%20%20%20n3.next%20%3D%20n4&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +Массив в целом - это одна переменная: например, массив `nums` содержит элементы `nums[0]` , `nums[1]` и т.д. Связный список же состоит из множества независимых объектов-узлов. **Обычно в качестве обозначения всего связного списка используют головной узел**; например, в приведенном выше коде связный список можно обозначить как список `n0` . + +### Вставка узла + +Вставить узел в связный список очень легко. Как показано на рисунке ниже, предположим, что мы хотим вставить новый узел `P` между двумя соседними узлами `n0` и `n1` ; **для этого нужно изменить всего две ссылки (указателя)**, а временная сложность будет равна $O(1)$ . + +Для сравнения: временная сложность вставки элемента в массив составляет $O(n)$ , и при большом объеме данных это неэффективно. + +![Пример вставки узла в связный список](linked_list.assets/linkedlist_insert_node.png) + +```src +[file]{linked_list}-[class]{}-[func]{insert} +``` + +### Удаление узла + +Как показано на рисунке ниже, удалить узел из связного списка тоже очень удобно: **нужно изменить всего одну ссылку (указатель)**. + +Обрати внимание: хотя после завершения операции удаления узел `P` все еще указывает на `n1` , при обходе связного списка до `P` уже нельзя добраться, а значит `P` больше не принадлежит данному списку. + +![Удаление узла из связного списка](linked_list.assets/linkedlist_remove_node.png) + +```src +[file]{linked_list}-[class]{}-[func]{remove} +``` + +### Доступ к узлу + +**Доступ к узлам в связном списке менее эффективен**. Как уже обсуждалось в предыдущем разделе, к любому элементу массива можно обратиться за $O(1)$ времени. Со связным списком это не так: программе нужно стартовать от головного узла и последовательно двигаться дальше, пока не будет найден целевой узел. То есть для доступа к $i$ -му узлу списка нужно выполнить $i - 1$ итераций, а временная сложность составляет $O(n)$ . + +```src +[file]{linked_list}-[class]{}-[func]{access} +``` + +### Поиск узла + +Выполни обход связного списка, найди в нем узел со значением `target` и верни индекс этого узла в списке. Этот процесс тоже относится к линейному поиску. Код выглядит следующим образом: + +```src +[file]{linked_list}-[class]{}-[func]{find} +``` + +## Сравнение массива и связного списка + +В таблице ниже обобщаются свойства массива и связного списка, а также сравнивается эффективность соответствующих операций. Поскольку они используют противоположные стратегии хранения, их свойства и эффективность операций тоже во многом противоположны. + +

      Таблица   Сравнение эффективности массива и связного списка

      + +| | Массив | Связный список | +| ------------- | ---------------------------------------------- | ----------------------- | +| Способ хранения | Непрерывная область памяти | Разрозненная область памяти | +| Расширение емкости | Длина неизменяема | Гибкое расширение | +| Эффективность памяти | Элементы занимают меньше памяти, но возможны потери пространства | Элементы занимают больше памяти | +| Доступ к элементу | $O(1)$ | $O(n)$ | +| Добавление элемента | $O(n)$ | $O(1)$ | +| Удаление элемента | $O(n)$ | $O(1)$ | + +## Основные типы связных списков + +Как показано на рисунке ниже, существует три распространенных типа связных списков. + +- **Односвязный список**: это обычный связный список, рассмотренный выше. Узел односвязного списка содержит значение и ссылку на следующий узел. Первый узел называется головным, последний - хвостовым, и хвост указывает на пусто `None` . +- **Циклический список**: если заставить хвостовой узел односвязного списка указывать на головной (то есть соединить хвост с головой), получится циклический список. В циклическом списке любой узел можно рассматривать как головной. +- **Двусвязный список**: по сравнению с односвязным списком двусвязный хранит ссылки в двух направлениях. Определение узла двусвязного списка включает как ссылку на следующий узел, так и ссылку на предыдущий узел. По сравнению с односвязным списком двусвязный более гибок и позволяет проходить список в обе стороны, но за это приходится платить дополнительной памятью. + +=== "Python" + + ```python title="" + class ListNode: + """Класс узла двусвязного списка""" + def __init__(self, val: int): + self.val: int = val # Значение узла + self.next: ListNode | None = None # Ссылка на следующий узел + self.prev: ListNode | None = None # Ссылка на предыдущий узел + ``` + +=== "C++" + + ```cpp title="" + /* Структура узла двусвязного списка */ + struct ListNode { + int val; // Значение узла + ListNode *next; // Указатель на следующий узел + ListNode *prev; // Указатель на предыдущий узел + ListNode(int x) : val(x), next(nullptr), prev(nullptr) {} // Конструктор + }; + ``` + +=== "Java" + + ```java title="" + /* Класс узла двусвязного списка */ + class ListNode { + int val; // Значение узла + ListNode next; // Ссылка на следующий узел + ListNode prev; // Ссылка на предыдущий узел + ListNode(int x) { val = x; } // Конструктор + } + ``` + +=== "C#" + + ```csharp title="" + /* Класс узла двусвязного списка */ + class ListNode(int x) { // Конструктор + int val = x; // Значение узла + ListNode next; // Ссылка на следующий узел + ListNode prev; // Ссылка на предыдущий узел + } + ``` + +=== "Go" + + ```go title="" + /* Структура узла двусвязного списка */ + type DoublyListNode struct { + Val int // Значение узла + Next *DoublyListNode // Указатель на следующий узел + Prev *DoublyListNode // Указатель на предыдущий узел + } + + // NewDoublyListNode Инициализация + func NewDoublyListNode(val int) *DoublyListNode { + return &DoublyListNode{ + Val: val, + Next: nil, + Prev: nil, + } + } + ``` + +=== "Swift" + + ```swift title="" + /* Класс узла двусвязного списка */ + class ListNode { + var val: Int // Значение узла + var next: ListNode? // Ссылка на следующий узел + var prev: ListNode? // Ссылка на предыдущий узел + + init(x: Int) { // Конструктор + val = x + } + } + ``` + +=== "JS" + + ```javascript title="" + /* Класс узла двусвязного списка */ + class ListNode { + constructor(val, next, prev) { + this.val = val === undefined ? 0 : val; // Значение узла + this.next = next === undefined ? null : next; // Ссылка на следующий узел + this.prev = prev === undefined ? null : prev; // Ссылка на предыдущий узел + } + } + ``` + +=== "TS" + + ```typescript title="" + /* Класс узла двусвязного списка */ + class ListNode { + val: number; + next: ListNode | null; + prev: ListNode | null; + constructor(val?: number, next?: ListNode | null, prev?: ListNode | null) { + this.val = val === undefined ? 0 : val; // Значение узла + this.next = next === undefined ? null : next; // Ссылка на следующий узел + this.prev = prev === undefined ? null : prev; // Ссылка на предыдущий узел + } + } + ``` + +=== "Dart" + + ```dart title="" + /* Класс узла двусвязного списка */ + class ListNode { + int val; // Значение узла + ListNode? next; // Ссылка на следующий узел + ListNode? prev; // Ссылка на предыдущий узел + ListNode(this.val, [this.next, this.prev]); // Конструктор + } + ``` + +=== "Rust" + + ```rust title="" + use std::rc::Rc; + use std::cell::RefCell; + + /* Тип узла двусвязного списка */ + #[derive(Debug)] + struct ListNode { + val: i32, // Значение узла + next: Option>>, // Указатель на следующий узел + prev: Option>>, // Указатель на предыдущий узел + } + + /* Конструктор */ + impl ListNode { + fn new(val: i32) -> Self { + ListNode { + val, + next: None, + prev: None, + } + } + } + ``` + +=== "C" + + ```c title="" + /* Структура узла двусвязного списка */ + typedef struct ListNode { + int val; // Значение узла + struct ListNode *next; // Указатель на следующий узел + struct ListNode *prev; // Указатель на предыдущий узел + } ListNode; + + /* Конструктор */ + ListNode *newListNode(int val) { + ListNode *node; + node = (ListNode *) malloc(sizeof(ListNode)); + node->val = val; + node->next = NULL; + node->prev = NULL; + return node; + } + ``` + +=== "Kotlin" + + ```kotlin title="" + /* Класс узла двусвязного списка */ + // Конструктор + class ListNode(x: Int) { + val _val: Int = x // Значение узла + val next: ListNode? = null // Ссылка на следующий узел + val prev: ListNode? = null // Ссылка на предыдущий узел + } + ``` + +=== "Ruby" + + ```ruby title="" + # Класс узла двусвязного списка + class ListNode + attr_accessor :val # Значение узла + attr_accessor :next # Ссылка на следующий узел + attr_accessor :prev # Ссылка на предыдущий узел + + def initialize(val=0, next_node=nil, prev_node=nil) + @val = val + @next = next_node + @prev = prev_node + end + end + ``` + +![Распространенные типы связных списков](linked_list.assets/linkedlist_common_types.png) + +## Типичные применения связных списков + +Односвязные списки обычно используются для реализации стеков, очередей, хеш-таблиц и графов. + +- **Стеки и очереди**: если операции вставки и удаления выполняются на одном конце связного списка, он проявляет свойства LIFO, соответствующие стеку; если вставка происходит на одном конце, а удаление на другом, он проявляет свойства FIFO, соответствующие очереди. +- **Хеш-таблицы**: метод цепочек - один из основных способов разрешения коллизий в хеш-таблицах. В этом подходе все конфликтующие элементы помещаются в связный список. +- **Графы**: список смежности - это распространенный способ представления графа, при котором каждой вершине графа соответствует связный список, а каждый элемент этого списка представляет другую вершину, соединенную с данной. + +Двусвязные списки обычно используются там, где нужен быстрый доступ как к предыдущему, так и к следующему элементу. + +- **Продвинутые структуры данных**: например, в красно-черных деревьях и B-деревьях нам нужен доступ к родительскому узлу; этого можно добиться, сохранив в узле ссылку на родителя, по аналогии с двусвязным списком. +- **История браузера**: когда пользователь в браузере нажимает кнопки "вперед" или "назад", браузеру нужно знать предыдущую и следующую веб-страницы, которые он посещал. Свойства двусвязного списка делают такую операцию простой. +- **Алгоритм LRU**: в алгоритмах вытеснения из кэша (LRU) нужно быстро находить наименее недавно использованные данные, а также быстро добавлять и удалять узлы. Для этого двусвязный список подходит очень хорошо. + +Циклические списки часто применяются в сценариях, требующих периодических операций, например при планировании ресурсов в операционной системе. + +- **Алгоритм циклического распределения кванта времени**: в операционных системах round-robin scheduling - это распространенный алгоритм планирования CPU, который циклически обходит набор процессов. Каждому процессу выделяется квант времени, и когда он исчерпан, CPU переключается на следующий процесс. Такую циклическую операцию удобно реализовать с помощью кольцевого списка. +- **Буферы данных**: в некоторых реализациях буферов данных также могут использоваться циклические списки. Например, в аудио- и видеоплеерах поток данных может делиться на несколько буферных блоков и помещаться в кольцевой список для обеспечения непрерывного воспроизведения. diff --git a/ru/docs/chapter_array_and_linkedlist/list.md b/ru/docs/chapter_array_and_linkedlist/list.md new file mode 100644 index 000000000..dc441b75d --- /dev/null +++ b/ru/docs/chapter_array_and_linkedlist/list.md @@ -0,0 +1,961 @@ +# Список + +Список (list) - это абстрактное понятие структуры данных, обозначающее упорядоченную коллекцию элементов, которая поддерживает доступ к элементам, их изменение, добавление, удаление и обход, не требуя от пользователя учитывать ограничения по емкости. Список может быть реализован как на основе связного списка, так и на основе массива. + +- Связный список естественным образом можно рассматривать как список: он поддерживает операции добавления, удаления, поиска и изменения элементов и может гибко расширяться динамически. +- Массив тоже поддерживает операции добавления, удаления, поиска и изменения элементов, но из-за неизменяемости длины его можно считать лишь списком с ограниченной длиной. + +Когда список реализуется с помощью массива, **неизменяемость длины снижает его практическую полезность**. Причина в том, что мы обычно не можем заранее точно знать, сколько данных нужно хранить, а значит, трудно выбрать подходящую длину списка. Если длина слишком мала, она может не покрыть реальные потребности; если слишком велика, будет зря расходоваться память. + +Чтобы решить эту проблему, можно использовать динамический массив (dynamic array) для реализации списка. Он сохраняет все преимущества массива и при этом может динамически расширяться во время выполнения программы. + +На практике **списки из стандартных библиотек многих языков программирования реализованы именно на основе динамических массивов**, например `list` в Python, `ArrayList` в Java, `vector` в C++ и `List` в C#. В дальнейшем обсуждении мы будем считать понятия "список" и "динамический массив" эквивалентными. + +## Основные операции со списком + +### Инициализация списка + +Обычно мы используем два способа инициализации: "без начальных значений" и "с начальными значениями": + +=== "Python" + + ```python title="list.py" + # Инициализация списка + # Без начальных значений + nums1: list[int] = [] + # С начальными значениями + nums: list[int] = [1, 3, 2, 5, 4] + ``` + +=== "C++" + + ```cpp title="list.cpp" + /* Инициализация списка */ + // Обрати внимание: в C++ vector соответствует описываемому здесь nums + // Без начальных значений + vector nums1; + // С начальными значениями + vector nums = { 1, 3, 2, 5, 4 }; + ``` + +=== "Java" + + ```java title="list.java" + /* Инициализация списка */ + // Без начальных значений + List nums1 = new ArrayList<>(); + // С начальными значениями (обрати внимание: элементы массива должны использовать обертку Integer[] вместо int[]) + Integer[] numbers = new Integer[] { 1, 3, 2, 5, 4 }; + List nums = new ArrayList<>(Arrays.asList(numbers)); + ``` + +=== "C#" + + ```csharp title="list.cs" + /* Инициализация списка */ + // Без начальных значений + List nums1 = []; + // С начальными значениями + int[] numbers = [1, 3, 2, 5, 4]; + List nums = [.. numbers]; + ``` + +=== "Go" + + ```go title="list_test.go" + /* Инициализация списка */ + // Без начальных значений + nums1 := []int{} + // С начальными значениями + nums := []int{1, 3, 2, 5, 4} + ``` + +=== "Swift" + + ```swift title="list.swift" + /* Инициализация списка */ + // Без начальных значений + let nums1: [Int] = [] + // С начальными значениями + var nums = [1, 3, 2, 5, 4] + ``` + +=== "JS" + + ```javascript title="list.js" + /* Инициализация списка */ + // Без начальных значений + const nums1 = []; + // С начальными значениями + const nums = [1, 3, 2, 5, 4]; + ``` + +=== "TS" + + ```typescript title="list.ts" + /* Инициализация списка */ + // Без начальных значений + const nums1: number[] = []; + // С начальными значениями + const nums: number[] = [1, 3, 2, 5, 4]; + ``` + +=== "Dart" + + ```dart title="list.dart" + /* Инициализация списка */ + // Без начальных значений + List nums1 = []; + // С начальными значениями + List nums = [1, 3, 2, 5, 4]; + ``` + +=== "Rust" + + ```rust title="list.rs" + /* Инициализация списка */ + // Без начальных значений + let nums1: Vec = Vec::new(); + // С начальными значениями + let nums: Vec = vec![1, 3, 2, 5, 4]; + ``` + +=== "C" + + ```c title="list.c" + // В C нет встроенного динамического массива + ``` + +=== "Kotlin" + + ```kotlin title="list.kt" + /* Инициализация списка */ + // Без начальных значений + var nums1 = listOf() + // С начальными значениями + var numbers = arrayOf(1, 3, 2, 5, 4) + var nums = numbers.toMutableList() + ``` + +=== "Ruby" + + ```ruby title="list.rb" + # Инициализация списка + # Без начальных значений + nums1 = [] + # С начальными значениями + nums = [1, 3, 2, 5, 4] + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20%23%20%D0%91%D0%B5%D0%B7%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%0A%20%20%20%20nums1%20%3D%20%5B%5D%0A%20%20%20%20%23%20%D0%A1%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%D0%B8%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +### Доступ к элементам + +Список по своей сути является массивом, поэтому доступ к элементам и их обновление можно выполнять за $O(1)$ времени, что очень эффективно. + +=== "Python" + + ```python title="list.py" + # Доступ к элементу + num: int = nums[1] # Доступ к элементу по индексу 1 + + # Обновление элемента + nums[1] = 0 # Обновить элемент по индексу 1 значением 0 + ``` + +=== "C++" + + ```cpp title="list.cpp" + /* Доступ к элементу */ + int num = nums[1]; // Доступ к элементу по индексу 1 + + /* Обновление элемента */ + nums[1] = 0; // Обновить элемент по индексу 1 значением 0 + ``` + +=== "Java" + + ```java title="list.java" + /* Доступ к элементу */ + int num = nums.get(1); // Доступ к элементу по индексу 1 + + /* Обновление элемента */ + nums.set(1, 0); // Обновить элемент по индексу 1 значением 0 + ``` + +=== "C#" + + ```csharp title="list.cs" + /* Доступ к элементу */ + int num = nums[1]; // Доступ к элементу по индексу 1 + + /* Обновление элемента */ + nums[1] = 0; // Обновить элемент по индексу 1 значением 0 + ``` + +=== "Go" + + ```go title="list_test.go" + /* Доступ к элементу */ + num := nums[1] // Доступ к элементу по индексу 1 + + /* Обновление элемента */ + nums[1] = 0 // Обновить элемент по индексу 1 значением 0 + ``` + +=== "Swift" + + ```swift title="list.swift" + /* Доступ к элементу */ + let num = nums[1] // Доступ к элементу по индексу 1 + + /* Обновление элемента */ + nums[1] = 0 // Обновить элемент по индексу 1 значением 0 + ``` + +=== "JS" + + ```javascript title="list.js" + /* Доступ к элементу */ + const num = nums[1]; // Доступ к элементу по индексу 1 + + /* Обновление элемента */ + nums[1] = 0; // Обновить элемент по индексу 1 значением 0 + ``` + +=== "TS" + + ```typescript title="list.ts" + /* Доступ к элементу */ + const num: number = nums[1]; // Доступ к элементу по индексу 1 + + /* Обновление элемента */ + nums[1] = 0; // Обновить элемент по индексу 1 значением 0 + ``` + +=== "Dart" + + ```dart title="list.dart" + /* Доступ к элементу */ + int num = nums[1]; // Доступ к элементу по индексу 1 + + /* Обновление элемента */ + nums[1] = 0; // Обновить элемент по индексу 1 значением 0 + ``` + +=== "Rust" + + ```rust title="list.rs" + /* Доступ к элементу */ + let num: i32 = nums[1]; // Доступ к элементу по индексу 1 + /* Обновление элемента */ + nums[1] = 0; // Обновить элемент по индексу 1 значением 0 + ``` + +=== "C" + + ```c title="list.c" + // В C нет встроенного динамического массива + ``` + +=== "Kotlin" + + ```kotlin title="list.kt" + /* Доступ к элементу */ + val num = nums[1] // Доступ к элементу по индексу 1 + /* Обновление элемента */ + nums[1] = 0 // Обновить элемент по индексу 1 значением 0 + ``` + +=== "Ruby" + + ```ruby title="list.rb" + # Доступ к элементу + num = nums[1] # Доступ к элементу по индексу 1 + # Обновление элемента + nums[1] = 0 # Обновить элемент по индексу 1 значением 0 + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%20%D0%BA%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%83%0A%20%20%20%20num%20%3D%20nums%5B1%5D%20%20%23%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C%D1%81%D1%8F%20%D0%BA%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%201%20%D0%BF%D0%BE%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%0A%0A%20%20%20%20%23%20%D0%9E%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%0A%20%20%20%20nums%5B1%5D%20%3D%200%20%20%20%20%23%20%D0%9E%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%201%20%D0%B4%D0%BE%200&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +### Вставка и удаление элементов + +По сравнению с массивами список позволяет свободно добавлять и удалять элементы. Добавление элемента в конец списка имеет временную сложность $O(1)$ , но операции вставки и удаления по-прежнему имеют ту же эффективность, что и у массива, то есть $O(n)$ . + +=== "Python" + + ```python title="list.py" + # Очистить список + nums.clear() + + # Добавить элементы в конец + nums.append(1) + nums.append(3) + nums.append(2) + nums.append(5) + nums.append(4) + + # Вставить элемент в середину + nums.insert(3, 6) # Вставить число 6 по индексу 3 + + # Удалить элемент + nums.pop(3) # Удалить элемент по индексу 3 + ``` + +=== "C++" + + ```cpp title="list.cpp" + /* Очистить список */ + nums.clear(); + + /* Добавить элементы в конец */ + nums.push_back(1); + nums.push_back(3); + nums.push_back(2); + nums.push_back(5); + nums.push_back(4); + + /* Вставить элемент в середину */ + nums.insert(nums.begin() + 3, 6); // Вставить число 6 по индексу 3 + + /* Удалить элемент */ + nums.erase(nums.begin() + 3); // Удалить элемент по индексу 3 + ``` + +=== "Java" + + ```java title="list.java" + /* Очистить список */ + nums.clear(); + + /* Добавить элементы в конец */ + nums.add(1); + nums.add(3); + nums.add(2); + nums.add(5); + nums.add(4); + + /* Вставить элемент в середину */ + nums.add(3, 6); // Вставить число 6 по индексу 3 + + /* Удалить элемент */ + nums.remove(3); // Удалить элемент по индексу 3 + ``` + +=== "C#" + + ```csharp title="list.cs" + /* Очистить список */ + nums.Clear(); + + /* Добавить элементы в конец */ + nums.Add(1); + nums.Add(3); + nums.Add(2); + nums.Add(5); + nums.Add(4); + + /* Вставить элемент в середину */ + nums.Insert(3, 6); // Вставить число 6 по индексу 3 + + /* Удалить элемент */ + nums.RemoveAt(3); // Удалить элемент по индексу 3 + ``` + +=== "Go" + + ```go title="list_test.go" + /* Очистить список */ + nums = nil + + /* Добавить элементы в конец */ + nums = append(nums, 1) + nums = append(nums, 3) + nums = append(nums, 2) + nums = append(nums, 5) + nums = append(nums, 4) + + /* Вставить элемент в середину */ + nums = append(nums[:3], append([]int{6}, nums[3:]...)...) // Вставить число 6 по индексу 3 + + /* Удалить элемент */ + nums = append(nums[:3], nums[4:]...) // Удалить элемент по индексу 3 + ``` + +=== "Swift" + + ```swift title="list.swift" + /* Очистить список */ + nums.removeAll() + + /* Добавить элементы в конец */ + nums.append(1) + nums.append(3) + nums.append(2) + nums.append(5) + nums.append(4) + + /* Вставить элемент в середину */ + nums.insert(6, at: 3) // Вставить число 6 по индексу 3 + + /* Удалить элемент */ + nums.remove(at: 3) // Удалить элемент по индексу 3 + ``` + +=== "JS" + + ```javascript title="list.js" + /* Очистить список */ + nums.length = 0; + + /* Добавить элементы в конец */ + nums.push(1); + nums.push(3); + nums.push(2); + nums.push(5); + nums.push(4); + + /* Вставить элемент в середину */ + nums.splice(3, 0, 6); // Вставить число 6 по индексу 3 + + /* Удалить элемент */ + nums.splice(3, 1); // Удалить элемент по индексу 3 + ``` + +=== "TS" + + ```typescript title="list.ts" + /* Очистить список */ + nums.length = 0; + + /* Добавить элементы в конец */ + nums.push(1); + nums.push(3); + nums.push(2); + nums.push(5); + nums.push(4); + + /* Вставить элемент в середину */ + nums.splice(3, 0, 6); // Вставить число 6 по индексу 3 + + /* Удалить элемент */ + nums.splice(3, 1); // Удалить элемент по индексу 3 + ``` + +=== "Dart" + + ```dart title="list.dart" + /* Очистить список */ + nums.clear(); + + /* Добавить элементы в конец */ + nums.add(1); + nums.add(3); + nums.add(2); + nums.add(5); + nums.add(4); + + /* Вставить элемент в середину */ + nums.insert(3, 6); // Вставить число 6 по индексу 3 + + /* Удалить элемент */ + nums.removeAt(3); // Удалить элемент по индексу 3 + ``` + +=== "Rust" + + ```rust title="list.rs" + /* Очистить список */ + nums.clear(); + + /* Добавить элементы в конец */ + nums.push(1); + nums.push(3); + nums.push(2); + nums.push(5); + nums.push(4); + + /* Вставить элемент в середину */ + nums.insert(3, 6); // Вставить число 6 по индексу 3 + + /* Удалить элемент */ + nums.remove(3); // Удалить элемент по индексу 3 + ``` + +=== "C" + + ```c title="list.c" + // В C нет встроенного динамического массива + ``` + +=== "Kotlin" + + ```kotlin title="list.kt" + /* Очистить список */ + nums.clear(); + + /* Добавить элементы в конец */ + nums.add(1); + nums.add(3); + nums.add(2); + nums.add(5); + nums.add(4); + + /* Вставить элемент в середину */ + nums.add(3, 6); // Вставить число 6 по индексу 3 + + /* Удалить элемент */ + nums.remove(3); // Удалить элемент по индексу 3 + ``` + +=== "Ruby" + + ```ruby title="list.rb" + # Очистить список + nums.clear + + # Добавить элементы в конец + nums << 1 + nums << 3 + nums << 2 + nums << 5 + nums << 4 + + # Вставить элемент в середину + nums.insert(3, 6) # Вставить число 6 по индексу 3 + + # Удалить элемент + nums.delete_at(3) # Удалить элемент по индексу 3 + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%A1%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%D0%B8%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D1%87%D0%B8%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums.clear%28%29%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BA%D0%BE%D0%BD%D0%B5%D1%86%0A%20%20%20%20nums.append%281%29%0A%20%20%20%20nums.append%283%29%0A%20%20%20%20nums.append%282%29%0A%20%20%20%20nums.append%285%29%0A%20%20%20%20nums.append%284%29%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D1%81%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%BD%D1%83%0A%20%20%20%20nums.insert%283%2C%206%29%20%20%23%20%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%206%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%203%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%0A%20%20%20%20nums.pop%283%29%20%20%20%20%20%20%20%20%23%20%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%203&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +### Обход списка + +Как и массив, список можно обходить как по индексам, так и напрямую по элементам. + +=== "Python" + + ```python title="list.py" + # Обход списка по индексам + count = 0 + for i in range(len(nums)): + count += nums[i] + + # Прямой обход элементов списка + for num in nums: + count += num + ``` + +=== "C++" + + ```cpp title="list.cpp" + /* Обход списка по индексам */ + int count = 0; + for (int i = 0; i < nums.size(); i++) { + count += nums[i]; + } + + /* Прямой обход элементов списка */ + count = 0; + for (int num : nums) { + count += num; + } + ``` + +=== "Java" + + ```java title="list.java" + /* Обход списка по индексам */ + int count = 0; + for (int i = 0; i < nums.size(); i++) { + count += nums.get(i); + } + + /* Прямой обход элементов списка */ + for (int num : nums) { + count += num; + } + ``` + +=== "C#" + + ```csharp title="list.cs" + /* Обход списка по индексам */ + int count = 0; + for (int i = 0; i < nums.Count; i++) { + count += nums[i]; + } + + /* Прямой обход элементов списка */ + count = 0; + foreach (int num in nums) { + count += num; + } + ``` + +=== "Go" + + ```go title="list_test.go" + /* Обход списка по индексам */ + count := 0 + for i := 0; i < len(nums); i++ { + count += nums[i] + } + + /* Прямой обход элементов списка */ + count = 0 + for _, num := range nums { + count += num + } + ``` + +=== "Swift" + + ```swift title="list.swift" + /* Обход списка по индексам */ + var count = 0 + for i in nums.indices { + count += nums[i] + } + + /* Прямой обход элементов списка */ + count = 0 + for num in nums { + count += num + } + ``` + +=== "JS" + + ```javascript title="list.js" + /* Обход списка по индексам */ + let count = 0; + for (let i = 0; i < nums.length; i++) { + count += nums[i]; + } + + /* Прямой обход элементов списка */ + count = 0; + for (const num of nums) { + count += num; + } + ``` + +=== "TS" + + ```typescript title="list.ts" + /* Обход списка по индексам */ + let count = 0; + for (let i = 0; i < nums.length; i++) { + count += nums[i]; + } + + /* Прямой обход элементов списка */ + count = 0; + for (const num of nums) { + count += num; + } + ``` + +=== "Dart" + + ```dart title="list.dart" + /* Обход списка по индексам */ + int count = 0; + for (var i = 0; i < nums.length; i++) { + count += nums[i]; + } + + /* Прямой обход элементов списка */ + count = 0; + for (var num in nums) { + count += num; + } + ``` + +=== "Rust" + + ```rust title="list.rs" + // Обход списка по индексам + let mut _count = 0; + for i in 0..nums.len() { + _count += nums[i]; + } + + // Прямой обход элементов списка + _count = 0; + for num in &nums { + _count += num; + } + ``` + +=== "C" + + ```c title="list.c" + // В C нет встроенного динамического массива + ``` + +=== "Kotlin" + + ```kotlin title="list.kt" + /* Обход списка по индексам */ + var count = 0 + for (i in nums.indices) { + count += nums[i] + } + + /* Прямой обход элементов списка */ + for (num in nums) { + count += num + } + ``` + +=== "Ruby" + + ```ruby title="list.rb" + # Обход списка по индексам + count = 0 + for i in 0...nums.length + count += nums[i] + end + + # Прямой обход элементов списка + count = 0 + for num in nums + count += num + end + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%D0%BC%0A%20%20%20%20count%20%3D%200%0A%20%20%20%20for%20i%20in%20range%28len%28nums%29%29%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D%20nums%5Bi%5D%0A%0A%20%20%20%20%23%20%D0%9D%D0%B5%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%0A%20%20%20%20for%20num%20in%20nums%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D%20num&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +### Конкатенация списков + +Если дан новый список `nums1` , мы можем присоединить его к хвосту исходного списка. + +=== "Python" + + ```python title="list.py" + # Конкатенация двух списков + nums1: list[int] = [6, 8, 7, 10, 9] + nums += nums1 # Присоединить список nums1 к концу nums + ``` + +=== "C++" + + ```cpp title="list.cpp" + /* Конкатенация двух списков */ + vector nums1 = { 6, 8, 7, 10, 9 }; + // Присоединить список nums1 к концу nums + nums.insert(nums.end(), nums1.begin(), nums1.end()); + ``` + +=== "Java" + + ```java title="list.java" + /* Конкатенация двух списков */ + List nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 })); + nums.addAll(nums1); // Присоединить список nums1 к концу nums + ``` + +=== "C#" + + ```csharp title="list.cs" + /* Конкатенация двух списков */ + List nums1 = [6, 8, 7, 10, 9]; + nums.AddRange(nums1); // Присоединить список nums1 к концу nums + ``` + +=== "Go" + + ```go title="list_test.go" + /* Конкатенация двух списков */ + nums1 := []int{6, 8, 7, 10, 9} + nums = append(nums, nums1...) // Присоединить список nums1 к концу nums + ``` + +=== "Swift" + + ```swift title="list.swift" + /* Конкатенация двух списков */ + let nums1 = [6, 8, 7, 10, 9] + nums.append(contentsOf: nums1) // Присоединить список nums1 к концу nums + ``` + +=== "JS" + + ```javascript title="list.js" + /* Конкатенация двух списков */ + const nums1 = [6, 8, 7, 10, 9]; + nums.push(...nums1); // Присоединить список nums1 к концу nums + ``` + +=== "TS" + + ```typescript title="list.ts" + /* Конкатенация двух списков */ + const nums1: number[] = [6, 8, 7, 10, 9]; + nums.push(...nums1); // Присоединить список nums1 к концу nums + ``` + +=== "Dart" + + ```dart title="list.dart" + /* Конкатенация двух списков */ + List nums1 = [6, 8, 7, 10, 9]; + nums.addAll(nums1); // Присоединить список nums1 к концу nums + ``` + +=== "Rust" + + ```rust title="list.rs" + /* Конкатенация двух списков */ + let nums1: Vec = vec![6, 8, 7, 10, 9]; + nums.extend(nums1); + ``` + +=== "C" + + ```c title="list.c" + // В C нет встроенного динамического массива + ``` + +=== "Kotlin" + + ```kotlin title="list.kt" + /* Конкатенация двух списков */ + val nums1 = intArrayOf(6, 8, 7, 10, 9).toMutableList() + nums.addAll(nums1) // Присоединить список nums1 к концу nums + ``` + +=== "Ruby" + + ```ruby title="list.rb" + # Конкатенация двух списков + nums1 = [6, 8, 7, 10, 9] + nums += nums1 + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B4%D0%B2%D0%B0%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%0A%20%20%20%20nums1%20%3D%20%5B6%2C%208%2C%207%2C%2010%2C%209%5D%0A%20%20%20%20nums%20%2B%3D%20nums1%20%20%23%20%D0%9F%D1%80%D0%B8%D1%81%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B8%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20nums1%20%D0%BA%20nums&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +### Сортировка списка + +После сортировки списка мы сможем применять алгоритмы "бинарный поиск" и "два указателя", которые очень часто встречаются в задачах по массивам. + +=== "Python" + + ```python title="list.py" + # Отсортировать список + nums.sort() # После сортировки элементы списка идут по возрастанию + ``` + +=== "C++" + + ```cpp title="list.cpp" + /* Отсортировать список */ + sort(nums.begin(), nums.end()); // После сортировки элементы списка идут по возрастанию + ``` + +=== "Java" + + ```java title="list.java" + /* Отсортировать список */ + Collections.sort(nums); // После сортировки элементы списка идут по возрастанию + ``` + +=== "C#" + + ```csharp title="list.cs" + /* Отсортировать список */ + nums.Sort(); // После сортировки элементы списка идут по возрастанию + ``` + +=== "Go" + + ```go title="list_test.go" + /* Отсортировать список */ + sort.Ints(nums) // После сортировки элементы списка идут по возрастанию + ``` + +=== "Swift" + + ```swift title="list.swift" + /* Отсортировать список */ + nums.sort() // После сортировки элементы списка идут по возрастанию + ``` + +=== "JS" + + ```javascript title="list.js" + /* Отсортировать список */ + nums.sort((a, b) => a - b); // После сортировки элементы списка идут по возрастанию + ``` + +=== "TS" + + ```typescript title="list.ts" + /* Отсортировать список */ + nums.sort((a, b) => a - b); // После сортировки элементы списка идут по возрастанию + ``` + +=== "Dart" + + ```dart title="list.dart" + /* Отсортировать список */ + nums.sort(); // После сортировки элементы списка идут по возрастанию + ``` + +=== "Rust" + + ```rust title="list.rs" + /* Отсортировать список */ + nums.sort(); // После сортировки элементы списка идут по возрастанию + ``` + +=== "C" + + ```c title="list.c" + // В C нет встроенного динамического массива + ``` + +=== "Kotlin" + + ```kotlin title="list.kt" + /* Отсортировать список */ + nums.sort() // После сортировки элементы списка идут по возрастанию + ``` + +=== "Ruby" + + ```ruby title="list.rb" + # Отсортировать список + nums = nums.sort { |a, b| a <=> b } # После сортировки элементы списка идут по возрастанию + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums.sort%28%29%20%20%23%20%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%80%D0%B0%D1%81%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D1%8B%20%D0%BF%D0%BE%20%D0%B2%D0%BE%D0%B7%D1%80%D0%B0%D1%81%D1%82%D0%B0%D0%BD%D0%B8%D1%8E&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +## Реализация списка + +Во многих языках программирования списки встроены в стандартную библиотеку, например в Java, C++ и Python. Их реализация довольно сложна, а настройки параметров тщательно продуманы: начальная емкость, коэффициент расширения и так далее. Если тебе интересно, стоит заглянуть в исходный код. + +Чтобы лучше понять принцип работы списка, попробуем реализовать его упрощенную версию, в которой есть три ключевых аспекта проектирования. + +- **Начальная емкость**: выбрать разумную начальную емкость внутреннего массива. В этом примере мы берем 10. +- **Учет количества элементов**: объявить переменную `size` , которая будет хранить текущее число элементов в списке и обновляться в реальном времени при вставке и удалении элементов. С помощью этой переменной можно находить конец списка и понимать, требуется ли расширение. +- **Механизм расширения**: если при вставке элементов емкость списка исчерпана, нужно выполнить расширение. Для этого сначала создается больший массив с учетом коэффициента расширения, а затем все элементы текущего массива по порядку переносятся в новый. В этом примере мы считаем, что каждый раз массив расширяется в 2 раза. + +```src +[file]{my_list}-[class]{my_list}-[func]{} +``` diff --git a/ru/docs/chapter_array_and_linkedlist/ram_and_cache.assets/computer_storage_devices.png b/ru/docs/chapter_array_and_linkedlist/ram_and_cache.assets/computer_storage_devices.png new file mode 100644 index 0000000000000000000000000000000000000000..87477bab68f9f5fd594bd701a2a512c06a88028b GIT binary patch literal 8664 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 H+NJ*i2*n!n literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_array_and_linkedlist/ram_and_cache.md b/ru/docs/chapter_array_and_linkedlist/ram_and_cache.md new file mode 100644 index 000000000..1698af133 --- /dev/null +++ b/ru/docs/chapter_array_and_linkedlist/ram_and_cache.md @@ -0,0 +1,71 @@ +# Оперативная память и кэш * + +В первых двух разделах этой главы мы разобрали массивы и связные списки - две фундаментальные и важные структуры данных, которые соответственно представляют две физические структуры хранения: "непрерывное хранение" и "разрозненное хранение". + +На практике **физическая структура во многом определяет, насколько эффективно программа использует память и кэш**, а это, в свою очередь, влияет на общую производительность алгоритмической программы. + +## Устройства хранения данных в компьютере + +В компьютере есть три типа устройств хранения данных: жесткий диск (hard disk) , оперативная память (random-access memory, RAM) и кэш-память (cache memory) . В таблице ниже показаны их различные роли и характеристики производительности в компьютерной системе. + +

      Таблица   Устройства хранения данных в компьютере

      + +| | Жесткий диск | Оперативная память | Кэш | +| -------------- | --------------------------------------- | ----------------------------------------- | ------------------------------------------------------- | +| Назначение | Долговременное хранение данных, включая ОС, программы, файлы и т.д. | Временное хранение выполняемых программ и обрабатываемых данных | Хранение часто используемых данных и инструкций, уменьшающее число обращений CPU к памяти | +| Энергозависимость | Данные не теряются после отключения питания | Данные теряются после отключения питания | Данные теряются после отключения питания | +| Емкость | Большая, уровень TB | Меньшая, уровень GB | Очень малая, уровень MB | +| Скорость | Низкая, от сотен до тысяч MB/s | Высокая, десятки GB/s | Очень высокая, десятки и сотни GB/s | +| Цена (юани) | Дешевый, от долей юаня до нескольких юаней за GB | Дорогая, десятки и сотни юаней за GB | Очень дорогой, входит в стоимость упаковки CPU | + +Компьютерную систему хранения можно представить в виде пирамиды, показанной на рисунке ниже. Чем ближе устройство хранения к вершине пирамиды, тем оно быстрее, тем меньше его емкость и тем выше его стоимость. Такая многоуровневая конструкция возникла не случайно, а стала результатом тщательных инженерных компромиссов. + +- **Жесткий диск трудно заменить оперативной памятью**. Во-первых, данные в оперативной памяти исчезают после отключения питания, поэтому она не подходит для долговременного хранения. Во-вторых, память стоит в десятки раз дороже жесткого диска, что мешает ее широкому применению в потребительском сегменте. +- **Кэш не может одновременно быть и очень большим, и очень быстрым**. По мере роста емкости кэшей L1, L2 и L3 их физический размер увеличивается, расстояние до ядра CPU становится больше, время передачи данных растет, а задержка доступа к элементам увеличивается. При текущем уровне технологий многоуровневая структура кэша является лучшим балансом между емкостью, скоростью и стоимостью. + +![Система хранения данных компьютера](ram_and_cache.assets/storage_pyramid.png) + +!!! tip + + Иерархия памяти компьютера отражает тонкий баланс между скоростью, емкостью и стоимостью. На самом деле подобные компромиссы встречаются почти во всех отраслях инженерии: приходится искать оптимальный баланс между преимуществами и ограничениями. + +В итоге **жесткий диск используется для долговременного хранения больших объемов данных, оперативная память - для временного хранения данных, с которыми программа работает прямо сейчас, а кэш - для хранения часто используемых данных и инструкций**, чтобы ускорять выполнение программ. Все три уровня работают совместно и обеспечивают эффективную работу компьютерной системы. + +Как показано на рисунке ниже, во время выполнения программы данные читаются с жесткого диска в оперативную память, а затем используются CPU в вычислениях. Кэш можно рассматривать как часть CPU: **он интеллектуально подгружает данные из оперативной памяти**, обеспечивая CPU высокоскоростной доступ и тем самым значительно ускоряя выполнение программы и уменьшая зависимость от более медленной RAM. + +![Поток данных между жестким диском, RAM и кэшем](ram_and_cache.assets/computer_storage_devices.png) + +## Эффективность использования памяти структурами данных + +С точки зрения использования пространства памяти массивы и связные списки имеют свои преимущества и ограничения. + +С одной стороны, **память ограничена, и один и тот же участок памяти не может совместно использоваться несколькими программами**, поэтому нам хочется, чтобы структуры данных использовали пространство как можно эффективнее. Элементы массива расположены плотно и не требуют дополнительного места для хранения ссылок (указателей) между узлами списка, поэтому массивы эффективнее по памяти. Однако массиву нужно сразу выделить достаточно большой непрерывный участок памяти, что может приводить к потерям пространства, а его расширение требует дополнительных затрат времени и памяти. Напротив, связные списки выполняют динамическое выделение и освобождение памяти "по узлам", что дает большую гибкость. + +С другой стороны, во время выполнения программы **при многократном выделении и освобождении памяти фрагментация свободной памяти становится все более серьезной**, что снижает эффективность ее использования. Массивы из-за непрерывного хранения относительно менее подвержены фрагментации. Напротив, элементы связного списка распределены по памяти, и частые операции вставки и удаления легче приводят к фрагментации. + +## Эффективность использования кэша структурами данных + +Хотя по объему кэш намного меньше оперативной памяти, он значительно быстрее и играет критически важную роль в скорости выполнения программ. Поскольку объем кэша ограничен и в нем можно хранить только небольшую долю часто используемых данных, когда CPU пытается обратиться к данным, которых в кэше нет, происходит промах кэша (cache miss) , и CPU вынужден загружать нужные данные из более медленной памяти. + +Очевидно, что **чем меньше "промахов кэша", тем выше эффективность чтения и записи данных CPU**, а значит, тем лучше производительность программы. Долю обращений, при которых CPU успешно получает данные из кэша, называют коэффициентом попадания в кэш (cache hit rate) ; этот показатель обычно используют для оценки эффективности кэша. + +Чтобы добиться как можно большей эффективности, кэш использует следующие механизмы загрузки данных. + +- **Строки кэша**: кэш хранит и загружает данные не по одному байту, а строками кэша. По сравнению с передачей по байтам это гораздо эффективнее. +- **Механизм предвыборки**: процессор старается предсказать шаблон доступа к данным (например последовательный доступ, доступ с фиксированным шагом и т.д.) и на основе этого шаблона заранее загружает данные в кэш, повышая вероятность попадания. +- **Пространственная локальность**: если к некоторым данным уже обратились, то велика вероятность, что в ближайшее время понадобятся и соседние данные. Поэтому, загружая некоторые данные, кэш часто подгружает и окружающие их данные. +- **Временная локальность**: если к данным уже обратились, то высока вероятность, что к ним снова обратятся в ближайшем будущем. Кэш использует это свойство, сохраняя недавно использованные данные. + +На практике **массивы и связные списки по-разному используют кэш**, и это проявляется в нескольких аспектах. + +- **Занимаемое пространство**: элементы связного списка занимают больше места, чем элементы массива, поэтому в кэше помещается меньше полезных данных. +- **Строки кэша**: данные списка разбросаны по памяти, а кэш загружает данные "строками", поэтому доля бесполезно загружаемых данных оказывается выше. +- **Механизм предвыборки**: шаблон доступа к данным у массивов более "предсказуем", чем у списков, то есть системе легче угадать, какие данные понадобятся следующими. +- **Пространственная локальность**: массив хранится в компактной области памяти, поэтому данные рядом с уже загруженными с большей вероятностью скоро будут использованы. + +В целом **массивы имеют более высокий коэффициент попадания в кэш, поэтому по эффективности операций они обычно превосходят связные списки**. Именно поэтому при решении алгоритмических задач структуры данных на основе массивов часто оказываются предпочтительнее. + +Важно понимать, что **высокая эффективность кэша не означает, что массивы во всех случаях лучше связных списков**. В реальных приложениях выбор структуры данных должен определяться конкретными требованиями. Например, и массивы, и списки могут использоваться для реализации "стека" (подробнее об этом будет рассказано в следующей главе), но подходят они для разных сценариев. + +- При решении алгоритмических задач мы обычно предпочитаем стек на основе массива, потому что он дает более высокую эффективность операций и поддерживает произвольный доступ, а цена за это - необходимость заранее выделить некоторый объем памяти под массив. +- Если объем данных очень велик, структура сильно динамична, а ожидаемый размер стека трудно оценить заранее, то более уместен стек на основе связного списка. Список позволяет распределить большой объем данных по разным участкам памяти и избегает накладных расходов, связанных с расширением массива. diff --git a/ru/docs/chapter_array_and_linkedlist/summary.md b/ru/docs/chapter_array_and_linkedlist/summary.md new file mode 100644 index 000000000..a7831ed00 --- /dev/null +++ b/ru/docs/chapter_array_and_linkedlist/summary.md @@ -0,0 +1,86 @@ +# Резюме + +### Ключевые выводы + +- Массивы и связные списки - это две базовые структуры данных, представляющие два способа хранения данных в памяти компьютера: хранение в непрерывной области и хранение в разрозненных областях. Их свойства во многом взаимно дополняют друг друга. +- Массив поддерживает произвольный доступ и занимает меньше памяти; однако вставка и удаление элементов в нем неэффективны, а длина после инициализации неизменяема. +- Связный список позволяет эффективно вставлять и удалять узлы путем изменения ссылок (указателей), а также гибко менять длину; однако доступ к узлам неэффективен, а памяти он занимает больше. Распространенные типы списков включают односвязные, циклические и двусвязные списки. +- Список - это упорядоченная коллекция элементов, поддерживающая добавление, удаление, поиск и изменение, и обычно реализуемая на основе динамического массива. Он сохраняет преимущества массива и при этом может гибко менять длину. +- Появление списка значительно повысило практическую полезность массива, хотя это и может приводить к потерям части памяти. +- Во время работы программы данные в основном хранятся в оперативной памяти. Массив обеспечивает более высокую эффективность использования пространства памяти, а связный список дает большую гибкость в использовании памяти. +- Кэш, используя строки кэша, механизм предвыборки, а также пространственную и временную локальность, предоставляет CPU быстрый доступ к данным и заметно повышает эффективность выполнения программ. +- Поскольку массивы обычно имеют более высокий коэффициент попадания в кэш, они в большинстве случаев работают эффективнее списков. При выборе структуры данных нужно исходить из конкретных требований и сценариев. + +### Q & A + +**Q**: Влияет ли хранение массива в стеке или в куче на временную и пространственную эффективность? + +Массивы, расположенные и в стеке, и в куче, все равно хранятся в непрерывной области памяти, поэтому эффективность операций с данными у них в целом одинакова. Однако у стека и кучи есть собственные особенности, из-за которых возникают следующие различия. + +1. Эффективность выделения и освобождения: стек представляет собой относительно небольшой участок памяти, а выделение в нем обычно выполняется автоматически компилятором; куча же обычно больше, может выделяться динамически из кода и легче фрагментируется. Поэтому выделение и освобождение памяти в куче обычно медленнее, чем в стеке. +2. Ограничение размера: объем стека относительно невелик, а размер кучи обычно ограничивается доступной памятью. Поэтому куча лучше подходит для хранения больших массивов. +3. Гибкость: размер массива в стеке должен быть известен во время компиляции, а размер массива в куче может определяться динамически во время выполнения. + +**Q**: Почему для массива требуется, чтобы все элементы были одного типа, а для связного списка это не подчеркивается? + +Связный список состоит из узлов, а узлы соединяются между собой через ссылки (указатели), поэтому каждый узел в принципе может хранить данные разного типа, например `int` , `double` , `string` , `object` и т.д. + +Напротив, элементы массива должны быть одного типа, иначе нельзя будет вычислять адрес элемента через смещение. Например, если массив одновременно содержит `int` и `long` , один элемент занимает 4 байта, а другой - 8 байт ; в этом случае формула ниже уже не позволит вычислить смещение, потому что в массиве будут присутствовать элементы разной длины. + +```shell +# Адрес элемента в памяти = адрес массива в памяти (адрес первого элемента) + длина элемента * индекс элемента +``` + +**Q**: После удаления узла `P` нужно ли присваивать `P.next = None` ? + +Можно и не изменять `P.next` . С точки зрения данного списка, при обходе от головы к хвосту узел `P` уже больше не встретится. Это означает, что узел `P` уже удален из списка, и то, куда он указывает после этого, на сам список больше не влияет. + +С точки зрения задач по структурам данных и алгоритмам, отсутствие такого разрыва обычно не критично, если логика программы остается корректной. Но с точки зрения стандартной библиотеки разорвать связь безопаснее и логичнее. Если этого не сделать и удаленный узел не будет нормально собран, он может мешать освобождению памяти последующих узлов. + +**Q**: Временная сложность вставки и удаления в связном списке равна $O(1)$ . Но до вставки или удаления обычно еще нужно потратить $O(n)$ на поиск элемента. Почему тогда общая сложность не $O(n)$ ? + +Если сначала искать элемент, а потом удалять его, то временная сложность действительно будет $O(n)$ . Однако преимущество связного списка с $O(1)$ вставкой и удалением проявляется в других сценариях. Например, двустороннюю очередь удобно реализовывать именно на связном списке: мы поддерживаем указатели на голову и хвост, и тогда каждая операция вставки или удаления остается $O(1)$ . + +**Q**: На рисунке "Определение связного списка и способ хранения" светло-голубой блок с указателем узла - это отдельный адрес памяти? Или он делит память пополам со значением узла? + +Этот рисунок дает только качественное представление; количественно все зависит от конкретных условий. + +- Значения узлов разных типов занимают разный объем памяти, например `int` , `long` , `double` и объекты-экземпляры. +- Размер памяти, занимаемой переменной-указателем, зависит от операционной системы и среды компиляции и обычно составляет 8 байт или 4 байта. + +**Q**: Всегда ли добавление элемента в конец списка имеет сложность $O(1)$ ? + +Если при добавлении элемента длина списка превышается, то сначала приходится расширять список, а уже затем добавлять новый элемент. Система выделяет новый участок памяти и переносит туда все элементы исходного списка, и в этот момент временная сложность становится $O(n)$ . + +**Q**: В утверждении "появление списка сильно повысило практическую полезность массива, но может приводить к потере части памяти" под потерями памяти имеется в виду дополнительная память под такие переменные, как емкость, длина и коэффициент расширения? + +Потери памяти здесь в основном имеют два значения: во-первых, список обычно имеет некоторую начальную емкость, которая может быть нам не нужна целиком; во-вторых, чтобы избежать слишком частых расширений, емкость при расширении обычно умножается на некоторый коэффициент, например $\times 1.5$ . Из-за этого появляется много пустых слотов, которые обычно нельзя полностью заполнить. + +**Q**: В Python после инициализации `n = [1, 2, 3]` адреса этих трех элементов выглядят непрерывными, но после `m = [2, 1, 3]` можно заметить, что `id` элементов не идут подряд, а совпадают с одинаковыми числами из `n` . Если адреса элементов не непрерывны, остается ли `m` массивом? + +Предположим, что элементами списка являются узлы `n = [n1, n2, n3, n4, n5]` . Обычно эти 5 объектов-узлов тоже будут храниться в разных местах памяти. Однако, имея индекс списка, мы по-прежнему можем за $O(1)$ получить адрес памяти соответствующего узла и обратиться к нему. Это связано с тем, что в массиве хранятся ссылки на узлы, а не сами узлы. + +В отличие от многих других языков, в Python даже числа обернуты в объекты, и в списке хранятся не сами числа, а ссылки на них. Поэтому мы и наблюдаем, что одинаковые числа в двух массивах имеют один и тот же `id` , а адреса этих чисел не обязаны быть непрерывными. + +**Q**: В C++ STL уже есть двусвязный список `std::list` , но в некоторых учебниках по алгоритмам им пользуются не так часто. Это связано с какими-то ограничениями? + +С одной стороны, при разработке алгоритмов мы обычно предпочитаем структуры на основе массива, а к связным спискам прибегаем только при необходимости, по двум главным причинам. + +- Накладные расходы по памяти: поскольку каждому элементу нужны два дополнительных указателя (на предыдущий и следующий элементы), `std::list` обычно занимает больше памяти, чем `std::vector` . +- Низкая дружелюбность к кэшу: поскольку данные не лежат непрерывно, `std::list` хуже использует кэш. В большинстве случаев `std::vector` показывает лучшую производительность. + +С другой стороны, случаи, когда связный список действительно необходим, в основном возникают в деревьях и графах. Для стеков и очередей чаще используют предоставляемые языком `stack` и `queue` , а не связный список напрямую. + +**Q**: Операция `res = [[0]] * n` создает двумерный список. Каждый `[0]` в нем независим? + +Нет, они не независимы. В таком двумерном списке все `[0]` на самом деле являются ссылками на один и тот же объект. Если изменить один из них, окажется, что меняются и все остальные соответствующие элементы. + +Если нужно, чтобы каждый `[0]` был независимым, можно использовать `res = [[0] for _ in range(n)]` . В этом варианте создаются $n$ независимых объектов-списков `[0]` . + +**Q**: Операция `res = [0] * n` создает список. Каждый целочисленный `0` в нем независим? + +В этом списке все целые числа `0` являются ссылками на один и тот же объект. Это связано с тем, что Python использует механизм кэш-пула для маленьких целых чисел (обычно от -5 до 256), чтобы максимально переиспользовать объекты и повысить производительность. + +Хотя все элементы указывают на один и тот же объект, мы все равно можем независимо изменять элементы списка, потому что целые числа в Python - это "неизменяемые объекты". Когда мы изменяем некоторый элемент, на самом деле происходит переключение ссылки на другой объект, а не изменение исходного объекта. + +Однако если элементами списка являются "изменяемые объекты" (например списки, словари или экземпляры классов), то изменение одного элемента прямо меняет сам объект, и все элементы, ссылающиеся на него, увидят одно и то же изменение. diff --git a/ru/docs/chapter_backtracking/backtracking_algorithm.assets/backtrack_remove_return_or_not.png b/ru/docs/chapter_backtracking/backtracking_algorithm.assets/backtrack_remove_return_or_not.png new file mode 100644 index 0000000000000000000000000000000000000000..1883e048d6e8096e8a388e26be71f0d6b89a9895 GIT binary patch literal 26497 zcmce6g;$i{^YF8~#L^20(jgsEQo_I_QC=~K9xypZT`7gn8 zR?v3?0Q|21e$ZzQe9C`FkejBwG*B^2wev57W-X;61pw7?ICpRVtFNuDto`co@o{r= zvu?UJxG5-g`nN_)6&w!Vw{;|~OqiaTncQDLI6wLL@#D?yO;=Y}%i4HqYO1}xeP#7` zpP_ag9i6{5_1BZrdB1W`l2VuX6!yLRj*wCJADh+yfDTZUmD2W}+g~(vn`eI#{x$^_ z9VtDl#dZGpxKkgSY>AptCB{E;Ye+Bf?J?HRCY9cH1^pB2|M%xdUH(BFO&#Cn(?L`0 zC(KO*vj>AX#=m_07j~0VDTJ$}?}GM8=4v9ai4c^}s&Mlo%Ap$l)7SY^h!wL|^t9?2 zZvZqD3s)BVht7C-bMil6x36;o@;|(8@<@p5zao6Muikvw|3UxCehO_$zRa0T*m`}I zppKseq4=H6k@XGvU+MP0nldl{@%P$TW%C{ga+PdmP@85GC;bmhXCS~?PJ(PAu*uo9 z%PF=H%a#j7*G!cZNr9H1WTt{Dm)7+>wlE9mhmBhr3F0)D|Z} z&_}+jL5PF4x@nUjyRm*>_)n{L$AfP>@mVn^sBg9;j$`2i`t<>IyoAC7pmI~ReI?_I zvI}*54#k%_H@V(i9`fHpTqWO^O*CirB=k4=f6AVEbcFSzAmg^^c1mb6KyhY;#KZGgep%cvQW7%yOD~Q{AS`8 zG6`9nkQ^18A(5oXqq+BJ5x{CE;d~<4!E6L#H$jHhW4zn)zLw#5oOms!xBB7}98KL8 zN4ZfsX@ediM@a_&tQjiCi!X*<9Dp2VuItUINEr|%ozCt9X>lV#@XtbrkgV<4Ayd3x zkbX*W9amTI^{%EDKU{>FxDFT1_@^kaWs%=6lT@K5zOP@2J|fD;k%dTX5KcsXwZsiL z6~*I@C~qV)vZJ98s3iRqZc_+y%;zaxo{@tNdeBj85oYo@wAGZkW~erFWUymk%3-|szFSR9eLnzSC+(ssJrw@r7QWvv^JHMr6coGY z2)pqE@lYA8@QaCJxBm=UxvO38g!7|4!#+gx8k=g}jw_AKTV)+6HIw$0$KRY^3SDWP zRq4XXqo4Jzw7zu=G$6=gLh;@p|Mt4~w#H*yuZ+JP?f0<}Q5}%n!BgixIBHp|iGf@E z-ka|Rt4Zr{B_YR&a%MJH!{D+fDS=8-QE`YubgpVAwyQaA%<;2PXHAUA@%ghxhN2Pz z;#>TPCb0n--#(csKx1Zd*;b}T@0OCf>Nh+IDR#0!zw7DOP^!8UsI?#EKz$q#Dfc7R z3z2v_nk7o77MerWD}z@gLL*K?QIxhkSG2~4c-_~@ZemUosYOHKh?ZYK=*_W6|7|HH zjdrRz@N7)zn`y|p7G33L?xq=8QhvMGxG0H>=A&W2i>`9e_Y318rW}860`4TpKoj-? zW`Ox4B@2xh^5L8gu8WvN%kyC(ICxILO>GUylQl0}iL-3@bd+gvrYqob~B}($cH1fWykwm_j=J5iqCM_&56~_Df6-=^`?2V{+cV@ammpGU0}IiW=b|* zEdN4i&)#N@y!OX=5C-eiuatd1)=cq*mYB^|Go-xF3~_YdvP-}GEyaqTwlwXpySJ3t z!en*lOZ9sPu=RG=fMEX;XzeBCHO&^x)g2UV7$TMzd#C?rfUHtoRhru?9O19#5Qv+yCa zM>N1&^c;ifwp@iWMV1<9i}C4=&8kWJzlPa%k+J70>mzZq}zH-IxDlW2g?#!v+p*Tc2+zrQqxEFAc* zU{`&C7l88aK5iMMb00uz8!)^RZdnw6n?qVQSI=!=Y7mC$JqfP{X^XA(=&WX(mS(VQ zf33jIfBm|JPuPdawfzlvtZIs-3Ya6oZ7Lecu#qd6#-S`+}3$Sqx9zRP&7I{QJ2UjVpSDpJ+~t zXv-`4@GK-ZIGu}wnzDT$6Pk3r`=7w9vn)jXERN{o4X`ilrB%!@PO(Y;6CPhwR z0vGMJ(m&OUx+|xPH#Ff+ z^`I{|XV=T?Y13|xw|7VGi!gm7*txABHk%`+xqXP0MgJBZah+IH{E z$gZpM_E?Ew5;LE(qkPFbMgk4BA6~{ASVIr()!+W!FpPnb?|e<>lvhdZ3 z?BZ6WrPWN4^b;U3zOte`CjR3FKuquc>t;MT&WDl@E{6e1x0JEVfoWfbp#@J)=sobe zOu4t-Zu}!=Ag%^(W$!96Y{{~2(Mnp3rP*1ub!K}HyI?!zibK~;I^cLnt~rp zAcr?R*f+|4Mt&pvZMhIlN>xy78OCAur_eFAK*wMg5Qa-Tsu zxM0hJGUV6U!15AW=lF20@>XN}o4cel1GUc*1Y*U@pCm?%bm>^8&>amjzdvUq;9i9n zP{qGkc3rwBS`oPN7*K0Eu;R&A%RPjgY{K~$aOLpzX?+|joj|^L*A9QGrCCfwO$sbt zC|`s~+Oyvu;K<&Z)6D(->;@+b&fW`LJ!8A)@Y!is?4X^FWLf8{KpyK+;C30)M4rR> z2fggxfKRk~s%y{WoNW$7GOdq)l)VoU`optQvD<%yA^yc!0>pw z>~L{Pnm>Vx)4Xdai|x_>I4+xysbtM^9mDoNRmn07 zP1mKtINOeqOe);ejPM$IuPq_q~Nz)lHh3I~M zfM*;@BqFbdyDp7Ds+-rBv-*}h@0i`szj+2EXa>$QWfUv?xAVrwliJ3eS1@{Z5E`ZpfpyzT#jK z)6UkngW<8oNBHsG)NkksccM6dQFsycUkTso`VCfm8JW-DERRceC|o)H=CL@Nt=)1w#w$o8{r}--h6yHcOLyVhKjN zTl6SOUJx?LQf`hqrO*iba~tL*G}`SN`CE9HU8f#c|Hc|=`?RDApftAV;TGDa1gEfx zxRPJ)erQ?`lZ1r)l!hHN}sK6EBZ?7W`wt{^WnpxHk z5R_5)L7zH&1@q1|M8Q7>o>pIv`VHC1lVSQ-2!N`|_9I~(qo&&2+Y)HGUvve%?_$+4 zlL&rDL~P1v{#LT#abn@@N%)KXryjRHjjAM6SbPN+w@rp+FC<$L^m3f1fB-R3$~2;` zW7{1;1)kZEF%z-8j!3esy`5g=h-TMa(@jx&pJ*3m4!~d1@To9`P)XYp<#)Pi6EJh| zmHWWiLN+aduFgPt&gw3{=u@FLgnd~fB>14;AA&kG;Uaz#vid6_u7#RUXt9?vhh3@W zk;ejg$J&+Sgz=$PWJ6E6K)U%aj{3#5wtv*J(!arEWI-ds>AH@eXVk~s$<{`{7F!3ZfdC;bM35&lzTGa7Jt|QlgKR*d8 z0>#v5)A$JI^oXBnySv;5sQfCG^skmdxh9Q9Evq|W;xGONs)@6l{SYh+86^0MvBvr# z8hPF;c&2FgYXY=WT00~-gT(;sujdBgY#cfeNpjW+{&2seCt}NApE9!4mi-KLzDusyt*d{ANc(ucCQ=m_v>c8eLA18#aXj`6;rclM)Iubc z%p?!iUt;l{{t_#%_4Uv4t|VkMK*Gc&=sC`+Q6H9_)bq_wtZI>rM0Hxoq#Vtsfzuax zDu{mG^uU@CG{x{TYFZ3bT#xj?Mj;bcwfGEk$`?Oq2Cmh0kh<|V1ajR}q&{l1Q~XIpsaTm52JLtBzEcRW@cZt40DU$dYBEauNCdY1o`h-d{TDM#fP+(RCOb(&{vcZWfS#yp^`7TAvWlS3MpffV-tpkpMuLLxh9LV3 zhv@=&?wn?TlkcaEC$P@xum~wFA6Fxw!$=+0&6EY&-cR!7Nkzi7pgA{j zQYJ44UMUyI zo7amEiYrCo=H@ae?kNp9+R5d(;HDDj*B_7kTOJqhC>>sk$ivoH403;csqUc#BWA~W zRI__nUR=W(RkN7X^3#~zc6$nrw`TRPe!}v=c|T?Z?@bjH-z71&U0+T-NixaB{^FQOnGhgmNIz0fh3@|!twJbw{!4Oi^l zN|>|h{WOLALoE&0;)u`@z!FDWp~vD(HP@~+AN^8?W2SysuQ&tto1S8B?)bLbepZ*P zCn$YN51~`~nHevdPzY~d11bDsYQVrbDsVeyF(o=fd_B&FJ+Aon=y#6b3-E{*<|?h@NS!6HwLrv z?RKr%us!ql!8hiZQ{CPJULwm9#2{TO%`{l);D;(KR!A@bJ*UCece3QJsoeyrcFpVB zLF^dfI;$y>gl)AX5RV$|SNJ#v{lK)qyrP3Pfr>ZdRlG$IX97zU`m5RtKaHR#lq$9r z8aWfSZc#JqmFJW^1=a)0NvD{h-eDl57AK+#8a4r=1B6BPDm=pI>*Ei_0Ho zVrDIC`_oui9d(0c5cAS?(J_`+nar|2DrhjG>s>TjS6pYzXC5VD2Mv&s;yG{mOR7!4 zp~kK3brM!gMPhgN)8z#A$@eQG887^ue9;+7@mVUWpqAkR&sZpLC5LzZWfAxHarkyT$2m-7a8 zQzJYXg-p6|M*51B&yQ?=jl4(kn@6{smZ)^cd5OhJF? zwEs7f<+a9_zFK?pJba_Q_Bt0C{u*Z`KL09h3V+q+kZNwnD6jK<>Y*nD$>a~2-;7O$-NoGgo@^S$dtCAp4{r*j%ImA}_Ny^zS_W>c*84uo*^^iFMapKmmF zimhP(&99vdgYH>&!Gq&TA2Hx#OisgtPc{fWRIJH9Rm z7Q?l;vDnmTXpLJtg#i`VWyLzwxSFv^h*A5CAtXOvzWr-(z)utMHH1r`2^Hppusi}S81ld)|0+_*t)%47VX6o{Il3lzS&t!FFWC5<)A>nvb|T&3y|VR%I%YL0wSW% z$s97DPiW1_*Y#b-GyCLXB&s;#MY3Uj$@F+9)egy8&8Ja)OP1ts7zdd7dG~R`jN0Y- z@lQ(z(t_)F=vYtJpEn%)7*L9D%bD25{NV^A?_MDN?qgVLr5LeRuPT+;C)057iJq6sR8bcQmt5&t(dV($nX+vS>LD~w zBRHZHnA}`n+es!+l-~HIXCS2<+xcW!zgA;O%pr668=NXU&ZeGRS&NeFbO-No8)>(F z|J)fM!(X9s=K$=RmykFqfUqdMD?x@xB$<#H66onu;^9;K$MABREF7o&>BoUv(Jl_E zKeqDTu09h+JEph@H-EjwH4mWRXA(WSc*=M#uSt`m?U6pNwuW#h3xmBPubvHWPJX`2 z#lR3q{nbP95Lg0}T$80faEMvzMjS)(Wi#cW6fS~!{Wk$CFpN(?js?@hCx+oa6p`g5 z8Z<5k>&?U!JBt5G8UAT{?33jJRsWVsWmkcLdsD@Z;5~jyyw-=TgK~eYyY(4C*vV^n5Ku?C3oReBBx zoIA*|Op4{TG8LNO+41~yoJT{ z`s0*NG9WW(2_mg{k@^c9BEtkRK2(JlaOrq*eA~$| zcFhsg*-bw>SVKRo*3RI}i4*5pLHmf(U2wwa?t;diZ7Nf`OW)sUTuqK)dpt;fg3UW- z*;s1I?nj%LDzF(&o91%QZa>(bveK16CgRKqN^1&(LgeayPGIfI;0mhh)Y>JZReK=R zuS8HxKw1jU_z{Q@Xma~V(Eb!S;9DtCj?!Ziuh9Mcis}VyfD0{&>Qa9}t-2g${t@8? z#J)2b(f7KACV*fGKc5olr>o5d;F3MlqS#x6(x(4-=isN*#QL5n?IoZRto+805R@aD za&_zr8ZA8wpKwEK3Ca7#pyq)8F!Y++m@`Q$u*w-)Pm*Uszw-Ct=oxHw*s$t!BKOCn zX7R0&ktnRnE3+jNo%(ivROD#poaUVOLP4u>P5hmqPxG_8#d(?pHV6A`9RfIxeS5i^ zA4!X=7uWCA7l3-C@MA()pxk`=>6?VZ52O+Nj|Yc8*o^xaulKi1D^K|btaW@sSr2uw z>&P6E!UA#7Htv7(V~~!srts9gyXzFQ-D-GJDyK+ZSI~_FYIX2F;n~+{>1E?Q@DXxi zwFQr+CWi!u|8)vS=m;2Bat%JXu`gd=iwiuJ;C$vCyCc|LGE^RrSHoM8Nuc`GK0a|z99 z(#QJvdKv-?)vFP?!vkiNpTqDc`3fnP-~W|aD38!HeN?_1$5#`5+40wu_9_-|CZM0f z=b|oN!WOoVXGn+1l-X{0#DX4}b-#OyKf&cMRB)vI!2H|%IvFIq?w8!V zE^$#&H>>d^!j9w(QDd~0g%t0f$Hx(pGEQy5v!avseawWIvdo^0Oax;Ga=5`_UP!tbDZ(Gcvy&i zlmG*1d%*ko`HPDsY9hqc#`_a08O}3FjIP3m`0hPUn-G*2G@%I&E#A76PW3ZxsVX$@ zh5lAVRpTi)MsDR-+mqodNg7}QH-i{6Vq};zf3=WT|r8D5PZ%}(OUC1Niwbmu9 zYzKcj`}(V@K1e{_WkUEPc7|yO1@&f>GMai{mSO@(a@BvOR0w0k1W=X7N)Qn*LlC!u z(KvlmV77RW!?~Mfdof|`%zD#LquzZ*pE4wL%um|L2#@Vst%SJGzvTLbAQsjCyMOYxH(gg zm&;^?&)&y?B$TTDAk8IJ^*oSujhNL zxH0Ve?_8%Y(T#;FfN6`$n2zaRO2ng@gE8$zI#V@xOOzv2?(S&;)`z-7P7lx&CR`H&nO#=Codg4(z2?z}G0Nd>IAS@)e1KxV_w6`S<@&se+`1btLJtCqfIX7S{JHV-xNA6IpC11);X)J|&~~ zuN`L~)-t6yF-#f3j#owZ+YT5^7&6@1o*PU1n8nD0R;;#LMUqyz>e>C;lqyQAf>!bX zEO#As1g^*HcP6VdUv@7RJNnwM!akMiVTf6!|Lh=suUBEtk%`u}SSD`e_UF!87>BP; z+?f(+?4>{A^BDhb+LhH=>kwG@G_cdex#FkTyMoMB8MXlzYb=XR}<51 zf&HUedcp^S z3w3f@1GjCy?f~Nyv1h^it4pyM<)Gtl_nPIKjdFR`Tk|hT{#%W{VmarO;eU&sa{G5#X z$VyuOH~Q2@wGNg;&iVIzsjo4hWPrzs;4hF^4T)B*YR4_CA_ zc&+X)#)dqbA>lP>=r)3B$UHnxHt&kjfy!tvt^bP!c;2>43N)2=qz-R~y>TIucVq%K zb|_LwfU%l0)Pm}h=S)%?v79{Z$Ias_RS$h_}tIh1i9=)@~bM2;V0f$POlhN91IN<>6QU||rUIn!q1Hx8zW_e9W zyC$e5;GC67%V{_(qahS@Yg&(VKmtwRDO`kO)%wDB6eehtt$kBoV5H`tt^YU1t=5=& zX#I;vRyDw^w&Qm-IX}zIbg3gKruLf^w?H*!>K!1=KBRO0sNtesty}fwf72YYL#5#$>bq zjqZUbV0MX(u){+jj9^kBj&iqZ9Zb&y%0Pe)czsk6R^7S6Z3rDQ!cxzI;atG3s@7{` zD@1lgP_rj1T!4M=DiQFt)udTZ9~9X@l7q#u%bxb7y%cz*0a{z}s=p=Vz?BPqadt?w z{^M__dM8KX0ig0nfh|EXc;>~K!vURaMZWpG-&dS*wO9D85hObX68KD{Zbh&rHk1kw zJ#2mjWWny0aMfF=AxTAUxI)))(*Mgu=Sh%fBi*kRT^Q|xd|aP`iY3RTB&qZk?SjR% z$7cTg`pnezNle!7->#FMg=HKfRlxOKAnfF{UMk|3tk}E($c%tcdvTfl^=de0)pvcf z_Qi+0G3@wRJXV}v){km?r9aX4ONT3gzWwGi{S`4FwaCu^hG4L|OKg97XdaJ!yw6mz zn4cq^a9kYKAp4xyyn~+ZZ*3?({f;|qv<|8Kv`0QvSn`#JAqRo(4p@QHgQ*t`bmOzcnJp=%2qLif8``(h#g;Gs-G4kSl8wO=r$8-~;O^{W<&7C?xPy(37l{EiZKN^r#b z_r@{tisraqH9g(Ro#PFd`JlCv=Gfad%B$DMMiAQglBo*gJr5z_^99Qb)X`mr)3qDj zcQzCsU~mC2?=%kU=m`zl)X(n^gXa(a7*&cVMh%1If8q+t_6nq8a|c!0agSnsO$>4x zq&ofdz{vyu6Inct%_DN|;RlsPk_U>kAAS~H%}798OI5k_`DRo^1twO$qlml@s=tcI zvyPHVNo*$J05xDG)RUQc&e9Yd27*xwAVW26$-X(m*6w_*K&Y28slb=H%l z@NbJ&kId!rC2LLoET6HG3e)GnYMq#iK@@b#RP9~utW{}wKFq&YJD&kL>Wn%OntNOT z8hwN(tB%q})1mdxP_(VvJiPm8iDJwI>FkMIjUJW1F2oeh72-L77NOE(Ri4?;Pt&I^ zcrs$cH7MkMaCJ08HM*bL9^?dm@0D4ny%R?(u)-;E%_#_0?~gc=-ItPFz39&Ftz!!$ zAz6}%uyi2MLeE|copb5;F6#=HD&rc?B&Wse=3i!1bHp9EN))E#!{%#?sab}twfy-0SS zsvcu{o~#qt&wf7g3zjDcm5+c&N7?KlDg8Nt@^TsD7fhC8`Y78pGn2e}&yWy3FjtoQ z^GiPI^Zq4;Z7$|eb&8WDBIcg_RRS7UA!&n$r?r$(=yc;?r-><^PXagkSL3U35(?l` zyZ8{qOO)4sIlWTEvpbCNF@)S#>hMdfDst$u|fSXW6T(@j+a2gbrRr z@e3R!G*ca4NN5fE410l)Awy~V(mAHdgQMl*JF>wvk>t8edu|6-fh-acZ-((!{g$l` zUIrjjYsCVwK1V-AbS%_R9a@rSjb+~82jxYj!jQM4(CXc8(({nN)f)BMYPY*_ZzR8z z>|n>mJ{LL_KCU<%T9e|y<8`fm1<>$9+Z0fk3cJ-smPA5-suq5nhl|>7J|0Wue7ML2!>FmxiK?u`e|_28 zuICJ_Wi{(o;;OQ4&oI0?3-SC;JW8s`)FLOd%EfPMpLwG`dDAAn&N2FZXl>nbM)WV0 z%#UhzrkqU~gr^WY7YWqmLE`QkV$|u=qz!9PWRRM3EL+## zAI-dS&^S=l`p}wb`)Z}JYwX*GmvH3d`coT63$3eRUFddX_F5us46M{RYIiSzqUD`r z&Q|Y10e9ii+MZPPv|hgJPp5wk{WYDS_d4g65)@n);R4oe5f_S&)n0WD6?yQ+rVm9b z;bWyHFT|Qh{yhW7MR4bsNr4hRT{~NOiCE>G3}?cmmA9~Q?{8!&3`09rmt7th6lPK( zYivOLJ#x$^yF8~g8yAx@h@V~#Lo$b_2$xqRvPJ4$^xnGavYp-dt1m!cWADhbh4c?5 z(?V4Ms?CvX{0CSQPSr~)&}tgLqedM!F#zJdcyeV;4LGTBrQccNCeg)VmEX!D@k?RJolE}%IbUo}6(sQ?^04fjC-g~Ahc-zna1b_EKNxU}Xq?ExksT=SNq-&hL5H)2^02LXJ1sDMHXRIA(o8-vFahh6Zxs;NiNL#J4P+?*p3hzfHv`Y(ja zhd;rIy%-TH_g%`5hM>17)3&&hd3@*z&l|w9_9%*)_U=}|361em{I)f}H9Nurwj0ZM zLY%mb@O57S$SU)5K+(2VUjFsHBlsbopk@;0#gE~-cLkkj&6)-hAJdO$W0{idxi{Zo zla=3*)CWgfR{2_HJcwmaEq+Z)$&PlRNvAg_`XOwC_Hxw{Gji41w}l@^p6YP=q_Bxx zvzKCu*k$w3m&kam zyYf0p&pv@leC*NqM|b*{GZwb+X!=blsDvTf4MDE^yTh2^C-AdKP z>QOO~%YX;VFx4|cUOn#-!>>jjY)#$lm*_v#pWNyX>_KhfAE2z&59% z?C9B5iOF@2dphlP;_SBrKI>%ByL2>v5}+D5*Vie!4|;g$F2uq#9;Lk{I{>IRm%{d=O%2q&*|Q$U7zG{#kGX3OsSl7l!Ht zh8LXnDE_E`lW<(&c{KQ?vzb{2?-A!7DCBhBFZGJN<_kxAdJQzpQgNmmzAi|XvSla5 z!bcpw_WA;rV?G*2>o9z4g5`eoomNzofn4S%PL3?lE;KhhOexKTZrSUIW}@JHjr-4? zm6o!xg_6LK_C5Lk8l|FdlKSc?g2wVo6>))y@9m$apCZ(c;Te_%P<3%4X&c=t0?zQ|2I%KT#m66rtGnUtagbk6t=p zD6I{k_my@!6*djWQc{oGLYMFlNWY&3G=AL(9RG=VO*FpRDKqc#pV5K}6Xwqu!FuyQ zNwsUP17*Zja&oO>kv{Biv`bqiuH9O;K3{*F9{0OPI6a3c` zo{HMAj-_SOyMvqDK#LLws?GnLSdX0?*nFwy{;05}uco3C79?{S!|?^&!^pZ1xo#d; z8~w3Gz49NS(Ho51`T(m*jBmo z{h+e&%Jiq1Hqm|(jP^H&7OHXMl6xLMXBuRnPE!d5J_6&|5%bX zt)C~#7!>`pxLL|g)=)KzpoyU98(EJbcJ&w0aWkKb%?nuqXm&vV@u5fGyUr-_N2}5R zuk7cslmh`)lFIs3{;63C{#&eM1N#3)e&fVh{bsk6TtUL+MFozI(9nJvM-TB2K6K^i zyXy}*#yHZ1b{zWuoMyzUFy{T`(bgxRB+;PUCM~o1^JaQulQN}~@bqRdkkRT{1S!gMD}WdkCD_dl1`R*~pkaUjV{5@R?9Fyg475cHv~K4>`v z-e6MOG*u!HKkvPX^+`dZKO|Vl>v$ZRNp5BbY+Jm-5i=1rmXRKC9l)_W8F7zf+a^_( zLu(oA=cA{wLi-Sn#KP<%cv3luOEjwXPu~SbPY<4V6BUG0+CvdF)qEJ!MT<@_TD4zl zzg`Q{1#kj4A8HhZCH~C;JYCsmKdh>;HMWl{zX&Mp(T28JS9!B?oA{6=9(jEUw!}z% z0(|g`e+%M4mkEZR_qOZcebt+DT}7D0VCqTbJ2?G;3S&xoY8q{JQr}%e`f+*af%CZ$ zeKa%_BQ6&GB0?*m!RoS%V}fLNx$);A<*yHAB%7~fCzpxb;Ed!zB1p3Re!l>Ufv_bb zlD2b58<3kW{l(~+zIyI;^5c8kJ{j=Q+N%%nw%dT@BqeXgfPoKMW4n!uuLqL61q;q? zpwk*U6I(;r%$6hot=(-^UXgAf5N$2GzWcSBJi=+XJ&CEG?+kU<9q0i`w9|UaX`A ziTKYZ21wA#=qjmz@P>y7Gm|4PPbfVKrZ(2Wd%VG@ekc+|dSl5p7^7R^-aNmwt)5YI z$h;j6jfj`pG&+{wvRX}~QCC)Gp?n~d$JAT= z{AvEKpbatg&}8knoOOiAwg_H?LLzQNcG4Yw-$XICRuNF)_bxYID>xrtIF7!&QcdJ0 z$y&BYOT=Gbxwt2OTZfBiZCVgomUO^pC1L~drT*zV`feLD3Zd`q)_B*J+LkP@;becq|#*&|zu0vxp-qiA9@)r@teBQX+bytS8Tcuxj7 z!bLov8*(JfR&l_%BC{{>68TW#asr z3N)ok156@Mjb?w2D+LRN+*6GHii0bXjB6;<%5EDPMEHT@uD} zX61a-4UW7q^9y%&LcV4|Ekoh-Kr9E|sLZ&ZhdJj6Z!m_r#|SiI<1Yy%_0zV*VT!UF zWGjWc7iJgD!xY&3vu-E@=^>h41$2MYnkw!5SoieYn^q)@C$!hC>ePGi|$oAxN=o|Ko9{)R=y-!-R$t8T z1u~1wAh$1)7(?lquY~;mls)j6jiil|OPp0g?6u6O2H3?R&r&hFq7g3Gn^k9Tw(*_8 z7g0wiPPE`~o=`raqDjNIBC1+9%ye&#QE2JmBdKi@_Cl106G6!^O$yA#189UGh<6&a z&IwSM6C+9HFaAGW2XbyV)vl5pg$Q9(`@QF+`Q_ zex)dKfxb8Zr^^yzQlNUATd@vTp~@JojHP=mxM!xZ0DYW^3S#+qt(`V;$G2uBCgF>h z$fcoel}q$z6zM-de;Z&Q5r}(t z{Del05!i>O5DIz-G(F}1op3V*e#LZXHD8pEr0P_mCspjNKzQ>KL~JQyiAMo^`#dD1 z?7wU9-`reOSfBV za+-75aif3FqIW5SEEo`P0)9#t*5&KD);OGVM$qF9v*UD(d&6gChi8yMm19$+kkb0y z?f#O4yysHWO~uwSlD{}QikT6d+6FIJ>`EqCO2G9O=Ralen(a=rI^PeG z)?+(OyX;(ae!)dr=~&<9yr+hBh|~S?i2tfd``&emm!-Cg*^s)>gXG`LVxtS9f{Wk8 zt1-HIR?}OTslEF;N~i@aVdw1%`3n?pFx$!%#zMQlp@qmf&zo& zneKz=Q~_8L8Vv0v6Yyr7bcHm<#B(Ehyyo)PN0ax*kHg6xLMGwQN4MvasTk$syx|Ek zBFYd^^a(4p34DO$K{Cu+fdqiQ#EdOP`$~}XQ~)q2E*7DF59pnmx)q{jZp`lDk|i8- z3u5SCZO- z-65gzTin=zju_D*K&>)$ok*WSdNKpkFY3BZNqdhn?x3#?ecjn-5%M1Hg@O(gC0`a@ zch0n$T%9phU%QJGd0&q0tvr3dw5aKTv9JkwPSe~MG|BWUh&D0_1(CLG$~@WB1SNEPy)l<0$LOG%$7Z@6z#-99w7O-rXfL zm;p$`r#`}VbTT*F-(tcrkgnJ<`oKi@;E2!in+@$y?=*H?am_Ffw8l8Xxk0dnQCA0Bfe)~k0Z`{{! zAuATPfNYJzBWZ(x)fd``M=OC%6|6Wg6}I~ns#Kfui3o*Y6yi1LyAE1khxO;?=3=hqPEF)3PKI7u=lky*cYJ98?vRlz8? zYV!<~D5nPV4?bESheb=$5lru0yEyt)c_0_`;w9u{PW?Wu<(NjGcme&SG30~#9|zpU zX<9vxM?@+*2wM$obfdLm=}6Rpaks|9AXB#GJ2NVV`w^^ew7B}-?RPjb!=QW+jy=lA zA|&8aW530uFX#V4xjEJ{AF7@O8Z=1_c>#V*vVpDO*&#AR`u<+HnkEaEVc2{f`geAc z`N~2ta+G}PoDH;i4|HzI4eHj#XYsZE^sC0`^RuqmeFlAAF#Ct5AdKJl9X6aF-8&89 zd5&BwdH}!~Nv{`rF>AR&P5mD)m{A8Wtikw4v{3nV*eitso*{#bWNrI)cnK!+M6r1SZZ13^oj;9`O|e8OO{q;Z|=?2ErS zwCHTd5A{vV9lZ4Cb!*8=&tU$*F`6$#m^kGt^nD);3J}E_-G^w8UtYgPX9c4*{-l*P zmqv)A-qW{~h8%bjhx!m0SoUoq$#>i`Gwrv7l224BgLfPMNU8Fb+ulMI1J-KjImQ?Z7{*=X z8e6biQt*z>8BEY3rF6Z#6BR>gT2nq{Q0$f&*sJ5uY!eu0i<;?ymnA2eB}m;z34=V0x-f*VnU+KQG_m3}<^THF ze>Huox|twX&~RiWbM*K1wvRgKaZbQVJOR-G&NKui_cU5LAzedbJbxvG2u4Q8*&Ov# z-un3?6Gq#f(Ggrj}`d_T+G9c z?QINH6vm9NWTBg=&mim6%fmZ}a&N`VRqu?d6jo?>h7!~PlUjHhP^RokqcwJiYnH>u zsENFuX_QDrXk+QoLD~w?IPoV{TJc=M6Y?FddRi8B0QM=qI>E5|VDArRZFtFNMi`FD z9F+Fw8PwI}Vmjb4>_D^6?LtespirR2oFtz5+t3ZWnP0%b8;X~!Qo+yhheNkcLCbk% zU4@^+g=@MCmIppicAAB4-awg1!*m(Z`lER10d5WuTbkgT?V_cIugW~qPyJzR{}7Ld zWXFZ@e1Wy-*1UpQX3Fn{Y_R}w)KB|N32io=w@_5nYn08}sN3Idb;@EgeW(0LD@n~| z|8_*>hW;045#Gp}?d0CS_>YL8|BD3>bRRS6ZGupz!3uQ3juK#&Q2!P7ys=OLpWu2z zCDjkqqSQBZ=A9v5O;028CGH)(&MyViG6$Y{yuIcURFEB7dV11pUOPuC%MXbJEB)q9 zM~nJ@rF~aW6i>8w&+Y|npaQuKk0M-iHmu+_1rPcT-$uUu3&A`}-0r`o*c4uRAz3%{ z6Pst*GqFxl8AsC-IBV4eiwn%oY7{dO{7NcHf8u0o?PJf=(YZuuC;h7}{k7A9HC$=( z(`4)S^{cy6r|05MPu%{d7)!u4IS5>KdF1K91A=_362pnRR z&bLNkShe`r13pbf`4S4+(Bb?^FNwZSPnB=>i*YLd)+h+Knm;01VH&IKJs+slnaG<8 z>2`3?1vu{Q8y<7ypMUvZw1ll#<;Catq? znwGKsCU%-!(xfwVlL}`^q_{$HFIXTQ;fau_Q@#HO_u|Saw{SnCSTRjsN`uMd zv6|HSvF|^s0Ml|o)szs=#9vwkG$q<1|LPm`QJxg( zJvQ5rC1%z)Sm4NEW2ZgFzg^C4YOo+BORPw zJ?&qW^Bni!Ij4EJIFloI3lv>Jqm;>>EPax5hn8d0O$-NCDme_b>4O`^)KI_;iHfOa zw;)U-w|{*VUAXI-vs9+zy>pcKL{|zxmQ;1b41f?iiuuSPJ9&OD=dR4(+P+}ZToFUj z6u!@dXGACfYh#xOJLa{{?e}i@k_RtaSo0ISy3pe?4}t?E%CZ=k>ON>)n6ZTmY@7dC zVSf;@{N$^C(#l1v_9>hVgj~1e$_l1}VHH#!^`8gH-oWUPlxG-xwrXGGok^m{?_v^i zkGy*`5@KAh-nL+)_;4&Sm(^>>Tc@BiKwMDLdk$mTVFXZ86^@mrCl;Kg9^bq0 zEc9$q^QX>A%W0LX{OuodOg+wlc^Cf(paJ3uWF~xl~#<# z5#JKP*uyB(bA0Q81tog!ws@hV0EmUYnokfp-l-laiG2;W0%p%E3?%&=}HI1bLTc20>NsYiV& zBO(50I=*rCM^`z)KP|z?$Spj65OTgH_y8((q?QHJCg9p!`xS>SRth8V|L8D!PcJ<5Od(o}qvB=*{9(Zz2d7J;xlU?@Y9q72|+ zv7npmf-WrOR!UvUn;BC8`$sLUA45!}2_Zo@Z7|+8^a{~vAqLAD$IH|}+W2e+DX~Q6 zQwS~^FBapm&~)#J0K&3qTEp2ElYV3!V{nf;y8!D2QE;HzL)J+dD0}p>CScl@Ogva) z*jXs@k0DGGcd$8JI)@2v7WOWSd;zdbu(P|@Jz~bijm}+P$h8T%Sx+Ru(OhTb=!8P&<838A08<5qWpAzzyt2sM7q1f3Z#<&)#$E5IJl@yCvauJ3JPK^ zzUEt0C@oo}T)43j&MTs)o2A*qidUL2!6+|8_#aL=H*Zbe#19vKYv00r1u?rw%Cp2< z&=qpn+5R)85%*nay6KM!M_7I#>s`h0wd4;Oq8Kv7@{*kA)p-IVhy@e$_Jk7z@7WJ&j_rT?{jvnc%l{!Ud}pVbyY0Mm*OF1mhVZkSv)v8Id z_c(ds;1C8{`DkPjkaXg(gB#TV(WHi)(sR&$BD(NniiExr;2Ne#1lW zAm*FWxsIS*P?n_kwDi~x`OB4e5}EH`Cja(UCwWd6C2#1nV8xmH-CM4G)}lL1%JSC| zVAJ%t&ZXfYu{{cHG&PAs>5({1+-=MC`&inG@}gu-X0anhZb4i-(#J8eFE>i!zBk^=@9|Ro%E7022qK;G53izF{ z9eH#3HJ_9g%5K_-48Dn)A;9bvkzBJ3gWQr^xY|U!c3eZJELAX}mqK-(KxMU*z=l5V zY1}f0c*y5Pkd#3YoHhKvUUx_)&*6_J(A!OKezek!R^cunRw=>i? z#pQ60TwmT&X!vLea|DdZq`AXjPcQhF3(vXcfu%mwW74_@(Djg;43$YS@vp7RFS6ua z_r6wKFoFgn*mx!~eUlJlC*}ch%f%tXTflUepqpozmhBHVH+`G9KkL>UkAnyEW*w^~ zxC4mel)h-wZBE^Uu^=$EllPgG5(y7qhV+-7D^ZI*$K0fVf1EzWs7P7&!D9^kl~7+; zfnHT?_^m5SN>uQ;eQoO)bnCH3$oUP_eN<39H&zyF1wJ9@gn+;naf@F*w`GS#G^)2kt}obv8&)5;wAYpj*|yRi!c0cUg-bb{9InFhQhM>#FpQ zL(R>_odJ1B?jRaKK$@M6y_UrWCMBU1*|M4|(179U*L5y6N)mQh2G?{YGZGSPLO$^{ z5x^@+jONk4O-1LcDI;KQ=KeDHNXG9H7jaUMGb`*aH)^FN!$;>LRdbp?j@w|Q^-7Af-BFuv z4>#fKA%wm^hYpC^B~Kdhe-I&z&{vzU56bTgVdNkYfs0uXA)O*hv)M0{9>Sl#a_OJj zx5%~08rVU84*i8uMRV(~_;7`>22;ODlClM(GO$|G@gQUxR>CO*DrrhaM9XgyipPJ9 zybNP}-OOooCO%7!d1)#+nIm-+A3pw9ffLM9)AB=044IS~*GGnE^;YALuH%%73Lo^Z zzizsFt!%_A$mVQUQRYpcuo`#~jnOZ5m3xM865xjIzpetL8i>3wpmoYIo2a@Od<| z1iBWc{dmH1zgd#Rq`UUPH;Oa%ut$bM%M6ybi*2;7IUlvK`-H0luL#K8DC z#R`H3^g4HH_|H(m*y@}SpBk}9d{q@mI4fYo7rq9=LG67Q%HtvEGx0%y?6CvaC%3>o zVoC^w01#VUYP~%lpF9QK#MhSdkmjbQEq4$;yM5Z+&wZp- z`9ia|{c#>1T*rrJi7KbAvcla@y=wp;tE#m>H9B$ZwBiyBY#}l2BN1WET9g-2p8%G5 zm8Ih62^kQmK77T90F#vHV~JxK2o1D3F<%&OKzMnZ0MqrfUhm>*xyP#I3h2SfwvmRO!hR z-n=bv8J4r?-k|Y3ydU_an4f9k!mGQZekG;OU5>~**aTKoC7PS7vGXi#tfQ=>f0B2N zU+}m5(zlbs=6>~e!Sn_&eh6pVFuiCuBKmmqQk57Ouz2k`D+{>Z7au37{HGQV z^?@YGs#hko?C3fqDGaK&HsIPRvm1mEx*9%RLx#S0MRh9S^YdONI%|ghQLe&Oogo&O z8%}%typ~v7%(Z|>NqJy%e~>P>am~54D|)ke8i{rl!S{<1IOlt=mQ1x9r9FRo=ZP~& z2;9n$7^-++i&y^|KSGBNm*pr1B1SgXxo{P}HyBx6v4z?204>yJpX& z2LV&OmLOh-8{oaYfzd)i`^TsH701Q(N%2K7io$H1KRd$73!t}Bbm|Ik30u?}~4|CF}@9taQ`C5IN4NWJl zGdzw5{s0N4AdDn^I+6T4za>in=l~y2MGW(1mI7lqhLSpqXWUb5%*zXAT8$?oMK$03 zX$A%XCBU(RDh2=gmc&x>0|#_qx$ILJMWUu}PF=eAS zLzLHy^q5xf=L04m<&e|bL2J#T;t~yeWmRBlOk5_gFQelwSkTt>ALVW~DdwE?nI|bB zdbts#u?FZaIGjIDbI)3YV%B`ogTw7-(&>`gU4~bC2*~-MQ9Zb1e@u?l^cM%$L#3if{ggkSb&wW8&F04o20UJ^*cPuBU~HMyU+&3}rWI+aKRef{<**!i1K{dtYonA5 zr-F=$U&VGIfg2kpcB0l8@4KZLLYz>x_{qe_QS%6ES?!n7#-Cd2cuF0YF68dh&2k;y z*Q)m)^|whECOrP0qjR@+;(W88aqAbLw4%aW17d5rhKCo13R42pndIa#*01V?5J2&W z+1nb)7mAhI{7GqynDHKuW-mjwY}GI-SW<;eJr#e6xrS_>b0G^+q6})Apo2xSoyFh@ zuiX8A2>~v8r%CRq;lxnzv1iTc)}`$><+#;TCXmf~a=tQrzu8o&SpT%Xv8SeJz5Y0! zdo37;Zx+EW+lurZGskH%e=8uF2v!^{eC#&l@CGYhPIHkXm>z#)D}) z`VZo~p_#6&7ewgQiqdmwAb1bNd>nm}AJ7`zEGG3cI=GY*qei&9zRD9yIy++!O&7uUnD)i^1AR_)_|7_*1MS%q^P;0{(-U@;4^{Tl`4&j z8*1;4jvHzNl~dl`6Xw3t_U_BuZ6)kG4B#ahX7XvyxRc}GVA!+65=}diW94LCSac)L zSbJcNWZsfqM{%u(-0vpUz}7U8jDvwO(}Y~oh7)p6V}XIqSEGtY$9A^OHs`;_B8xIb z?Nu7DCLe#&9b(CuS`wCFeMSm!7-aX)b^Yf}w?j`R4m-q$oBgcA%(tjEf>fqrQZtTc z)0Ym%wo;WRYj-gHxdYL1f4k@CTE0Y`1_HrpL{k0)-{~u%!SY~7=SKF!{K3?6lllt& zrcAAO8Ez$#V0t;A_MCa}>xvjCu3l&L_3z!O=sN9}b#5R+dFC!DxV!@b^xvEgPg{__ zc3WftNKE?Hu-hM4);X^4*CelnpUKy{OBla}!pmS|3yy}kFy{LlKMQW=jhWq&8C0c+ zdR9O6MQg`vWU8Tf?RcQ?pz$nhB_}9wfDo-FuH0009wVD6o4@Z7l31O_I^vH1?igHY zyxo23%e%q z=GSj7@1{J&(K{;n0+(V&7J7E+)A6QZP_~M&pDSZuH@uvbel>ZVxOQvh?OHaCV%po4 zE87s-`xfM2LHDp_?N*XQRr5AZa0IcUcp{VI8hMlDPwDVkf_Nc`Cjt}1)bK4IxRofp z;5dZ!vdhe4{Akeb?x$NkkgOx(_YwShPsPx>MhzU}!lXB$`otz}rs2=L*gUb8z!|}v z>O93dn*cC<3z8^Pg+!fdL=$%@L3NWdF<}aibhhZ&7jHfTA`vN81!ky>_0<}zEMWfr zCPB7BZKhC-FC1N1dp;Bm5BQC&{4y0nwZr^~afS-4NtojI4+cF8*NXmEQawNDxcSC~ zo)!4mf!v@7tEX$hYEC3`ts9pdujT1^ysHk>`d~KVCI3%I8x`<{XA%ta%-r@F<4#y!CM+w80yNlNHg??5jn1Qmzf9|Ikk$JT z8bf070*ApKl*%&$x9c%*5P^p$SyzowRZSWkQD5)LgI|BluY83W;3blS4&UT<=U+4# zK_uwgvH<(F5hFHmC7{BsPxuDL;V5z6`uZd0dHfej#{6??HnX9x5ILBRjnW1+j$w_| z({83PX$sUo4p$RE`)xivho(l%%l+Hw!TyKKvderBjg zI1K=f;yNXui0W~LGkpca(Q~xGhO?So%jbj+%{Rf7_Zw0QZbZ<%M3hZR%e-e1?(qM^ zITNnAH1*EzkiU?m>JvYTq0}Z)TuA`?w+@evbi4lz)M}Yt#bxilV^s4~cl?41qJG=$)$hvh?q(2j}{mn08%VYBGe*RJK zBjuPNZ0q{cv*yEDu_@IJH*SqLi-BKo|&cRf(sLqf*u*C);7o1J1{55^+UxwJLC*ZcSpsI z;V7cw>_X{e|CUJm-EL`Meznk=s84*YJ5qfUV2Ar-POUeukUywX!Vm6fHMDFZR|-q= zqUx&c)k*{|`k6y|wSXupTeKeY@7kS9VV%b#{;_OTAj~GVqZCUd^Nj7Ia8r&edUp3 zP7PPhFw>@8?mJ-my_SJ34$BD7vRIPKTHZR9*^-m4_c!+7lkZO@FCZmxY`uXITzkZ*@w0`lp^hPh4qhzC{d1uKn!18fy=G_pAivsB zVbq<*f+3$okyYx-U!n|Y)d*9g`>sAo@_k#zhAVuw-zft7OjNq-X0B#B@T2NVSjAm> zOg?K)h=JY9%+J%0cmVovTgn+(Q+7)%z~INcf&UO`3rS+Z$?f+8e8(l|m&H4boeRUW zaeO^~&B>caupgsTQU=cS;;(GlfB2gCxVv1LG*wRxtIXxP^?7A>q9Y=b z(FMSa9S43mT#b_{LuM@ybVWZ}OV%O+XX^jLCTEeKW?#~ElTrm$S-wd3V-knbS>S_t>Nur5^KV`WK>Z|ZkIaTp{;J% zw)s#BpRUq+Uvg`VW+0ud4`FX{D^KhoxeJgLkedIk7)Dn>mNmNH-TQ*U^!b^Ky`9L` zqmF~3%4hzqWh3v$``w7p_FTnopB=6%1~p$nFX*$P7Xs`~f9Ph4A2*P*CK%h1GJ5DD z%}A)MT;G)6w8Ir9DD1_SO%Y)tGkG?)t}@LJ$JA^7HTXoV?wCx7{`1^kq2m@P>?dX6X5xTN>Z(Y6dvRJbP9OYF=it?JQVsztmFzJiPv?w%h zuNiu9Khb@EQFWs!#g}au|5z^#ESw3ocT<}rZX{$A{x;aO!VDsEl{zPk;BGn^|BH0b zmhAN*z5&@tYYW9osCajo*tL{7m%dampA;AJ{hR@$zyZT%V1JY->6k$7F<}#R72n#$ zmzLYLFGd|z88xLWt=B%M9AI#&!2DD{o{B3zU<9U}^u0`clONplR8z%O5~Dt*_-LNs zecp$uK!Jn@!u_oRO>vGO;S#}aP05};DLTbkp71Rr?I1`a2g4ag=^IzCrt;|2zL69e z@*k@hRBGkoRBy8|*e?bRM+GI1AAIa(3HqYk$BblFfA6B`0s!ILfBy*34p=0Il61w( z%o8sG&BBE?yb|R(t#?L%NYdsoUt}@|kN&;nT`!F@o#R$}0 zjjIVTngZkR?5+qbH1KyWtLhJW*!SIWDY=+6pYF(XU{HKwA3i}2Zr;&jXu|MaKl`Pd z=(ptbrD$*a0m#03qz9h7T8Eo6^>;=^CI58JVGk6GiZ)xjIqN4&-cuPef6lEOG6NZ&Q=}!-<#X zPr&VnvZ%d}_a<~77#9FmSChE_v8|gWWu&}ibqExz#l&~Asxt=|}Fu;J67h`d#-++o@XnzZ6qHlRFznPH~!LZ^S0luO3r?GbVs@*2wNX zpXhtqNwYd}ECz6kdgt7D4+Ewh9|taUoQ#eHD0!?!29-CpkKF{=(YzBK96TaOWp0To zPIrW72O<%p>a+vG+aD}PU zXDTltG&fA%V$Jz6o%!1*1Yu2sV?OM&H;7^KQ>QK}8Q(ab5Qa4!PQ<7`zpsri4UXm` zEQ*Mb2w1iQ92Oc(iA3T;(9^64M9YX9-25%2da#zY+%zHbM{}w{;Pi=6*%odu5*fxg z=}6N<5z2=A|36O%q6_cDd1*7mR_prVBPb5Y(5%Z=qlPM#RfezSyq0Utv$rYPk#z+O zz^|xaHI^AdQz9l9(3Otk)->pirf0E)=(!}zx-ic)s^RyGfHIiMYFi*t4W&#J2G^V5Vha^{O4$J?7p3; z)k1J3BFkXZ-Tspt11PaFvfM7*%pXt{CdBN&-47=}+;wA2rDMqmhQ9Eaez@hQg_oK) z7&;V@cG-DOHS?9-Ut;LH%*(IF?)ARdnPCVi zkF9!g0suSGPZ$_*ryO51K6(H>wi#09Cihc5ew48Z6U^#WaNZ-h8@zE{-{&$>R!kV_ zy1(0ZTZWhZa6AlVpD>@bXZ|)7cV8S`{L}yrfdJ#v?pLhKg#M5&a1|#8=p26mHpJb; zdn3b>3BQB!yV#5N8ecwQEyUp2<_a00^==He zZe?mVUM={14K8S!XE2@0Jn-?1s$RvX)yhf#Z&bjCPX)LiE$kC_s;Em;9&v?}H}d_H zW%P^2DN635%2k|~GE|!m)s|zrch2g~6U<}BN|s)M{8DDf>M(>O$3m$`FJX|gc zxUC;9IIb$j?f^je?Y|S0#7Ri=AOyMVD$4b+8WOl z@9*zdS62gDP?D08sZ(RRtzUN>oa-iQZ*Fd8r)Owu62rs8k4}zPcQ^X}^mq64ym|8` zD?3|9M`vJtvApUltTZZrC{Lun%yXpkxUO+YK>6TPQh0a6=7%7M+H)HKfCH)uvd_I| zcILO8XN*X(v=I&8GcQC-H@;qWUCXRnW_-pR>J3i&^OBqWQ#yjfcyp?K)br~Dy8mAe zWRCTtqx=I(q#m^az1{2d)DvXJ3GJY9bM4FQ~Qo&4e}pm9CJYszy(N}nnZN)1k3 zU)J*E`7tkjd-m7Z+1*YKL$KmL!b`pHq5|HV=fM?o59KQWxMsh$En1lM)J!|m;X;RM zz%Tr{+geD4$iPD*Ee`)EA{&q1;j$a!5DZmf-CP}*eSJo#h-t1**8PhTo*M;8RrgTk zSyHr_EzVlb$A{S3BxE-r3;z_>9V?)w|48lX4(4mT|H+JLI}Vbm06R`~f37=JL0u*y zhsPUSpI&p-KlCp)-+RG$q;<#{X88={eN4u0pl>!+rf+7b@97j*6&HXeB3YKcjG35N zeu>MMx3zC#-`leHs49a0tk6<_aRea-)sVUWA^CJ-wP~w%uYA3t^lZC_*y!7w0+bIs z<4tJO^PtUlYy@TM#Hr_v-#{8K-WTXJ{l2{m@9a{I!y~4I!1*G{y&vh$m~Z(L9loQ) zz8Pf1n0u1!ouGR-&u5N!{U?1eN@HCn*Kty3@xep+ShSfn(G07LAs5$C zXc<|bBYDu;W)utoN29H`JI_C;5O5ilwBD2%yen;K%pAhB z+kJ(8hs_L(KPTN5E*x=I*dJ_eYB9aRAC{5vrJ5tb*ANHSCLZ3DCWsSq@f7tf0XiXuRx>hedCy z$9xW=yN}m$WJ2V~4(I#u_F^Q)n{t3Advznmi@omz4J2>^vsOUlC%OZfTlMb{%df5+ zPx<(5)EJ#2zJiPlJbk!Jnqqd)(vnlU3RT*ro^J$7`}C{l_feehwHYNr;CmBT~QV!&x9IuTs$h*5pz z!hs$S8SCX)5rCy?0Ob3OLKK}Jj`>n`K&ge+RB*mR=!?XZPAVeh7Rkpzq$B}d3lX2H z1s=M0;3ZT71l1_MXcgoB+QJVtG7s;o6+EP9wS9vROAY1<_GXUT>N!m&T8QxQqa2b7 z$2*Wo3{afT)~x30n8dK?e6+#>fLQf_q7OiFqwiAhX$apL3J~N1wF-?jn(Lp3%oWfb z3}mT@TUs*VG|kzHR5@%ny8VtNLl(;;r@c16Vl2}8e^B&NmTmBLrT%Oo`{AVEXx1tQ zxNkn%v#s;3hDdS(kv7W+`=#scPABNQ9E~d@9B*^rY&M1tO5o>mXLHT+dapgZf&sH! zX?^jPXA2gqu%q6~ymRanHJ`W^=Q8{i*KMpcFaPK=#=iK|x_3jtzdzjFQeT)x_zjIM6X`^RGgKyW z9J4D$z~rd!b0)8LE40vC*_VsL_Y3}6_vVhexDI9=zmE;B!x2TtL~dDUAkhX0*TUk$ zo;ten=FRrEGXlG7f2)j+3C`OFwtE(Mf*Se^AN`5U^74I-ZRaGzp@CV>t#({UqA9o080b$gsc{ zMc9PA$i3%Tr>~U{^g|ORhS4omgsn$a7WcXh%|7C=3te~Hqy3~*f^5IDq~-B_zMDqr zn-Y`T!G&h~#!~Q0(aH_!B?6(E`m*W$`}9!Ib8Ws<*647-H(B$O{f{>fw})i-GzK#w zYq;*gdv|x->J=PnHw3uM4q0+b;k2s(WWn8e2H)T>z4op={oeCSKfb5xGz~|L?o%Jw zIo-SBqFD0#;BavyC8S`tZ%KQ>!z$y8Ij)bu1-JT>+qG7i7jl+Em;57GN-Vi}VGRuG z-akaZV{!Lf5RS=kSQAnW6$1TupDv!eiOC&|22X-(XhC5gIp8xc(y{F8hqp&Lk*G6V z#JUAK1ZD(;#sY{aBtMqYYy#P7(J3$9rOQHA66A2va7GSJoV~#~31$L_k@oLZk#TxU z#42S+i&>S$^N*To3pk|rQ1ZkuCk7?nPfV7g0#ZkdW*457P{|LzHe8VIzxb-PT0xHx z4HXFUg!?_&Tq{M(oFdW(EP%rMhOV_rg1B!SGfzM=tHXg4!G)b%{-46-Q_aC^hb=%6p*)NJIKFZR=fuCnDedx3A z4+aBt%13oOS;KG4B*c867MOZ01fU5w@1EOWB|mw11o>TIZD zn(3kcVIye;si0yV_bfM#!$Pog*J5oP-=R@R{uT!)A1M%e42FTi&S(=#CSMiYh};Wx zt2&Qi(rz$bGo^gy{di}?#2gx=G(+3HT-h4$${5%GSp1M!3SC-Ct%|O;D;whY_&>~t zz$Povm|1sPm#h-UwQS13;tK)@eeR2Kfq7aMNCe?id6_DWErNH1u1Ykw1eBf_F+V5X zte$X-hdsbfQ=dBRy2>%V8&uc6;gR;yvWU2f0g>Z01s*yG?Z1i@L_h8Pe)$qeC765D zE0T88NXEt08<5m7qa-v3`Qn)BOfp;UI9(Y51bO(2h2{=!CJg2XH+An6bWAL+JmIAZNb3erQi+l5c6@`ZW3@aO2H+<)0wG z8h5W^&c<75P18hkF2Jel!MUB8qE4{-EB&bqE}%>VLmI>ap9ukBY8O@@^vzMR?M=yR zV%dl8FmitF%`*|Vfp~3m+{QVA5*B#e%(!JV*Gz--vo?AFnEj;g500bP{;r<)&m@u!sYLneMDC5_6MH5z#RLPwDSFx0{=3n7%ouD9*-GU zzZJ=nPJlKrbJPH0roK2E{4Zd%CfjKYAeo~ z)(?uD0U1RlHNw=W#%T=NbjJUp6AuXS)m6XbeO2o3ad;eIF$!m3Qt*;ebFSHB$&118Z-T5J@TtX7jWUf{n;*CtjR08scx##0sT(c$^fqsT2 z*0dK9^%_Snpuz3mwnDaBmAl`0BXwz>Q^f;BuqhA|@ROW=3hUm9=e}e``S;--3bXV? zw_7?~J{Xao@Lg(grQbgcyT541H4HmULKcR!7i!Z87urX*-@EdLQgE9B2>i zVfxnNgCyR8N{cwL0XE8-UfH?H zplHSxZ6x-+*N6ZM?T!-xb+{dfTV-d-#bjLx1Lmyt$8jOTMx101 z8A%P&5$NLOcz4S?@8|C;nx>j_F__(A09o^Rub5E)s;)mv$Ylg#9dDB-ICUE4Zt$M? zos8y3k3d2vptSYqN1Nji&_-=dnl9WPincOM`AC6$>vSjeNs=drzTiCkeVY4%I8i~Q zPx{$|-Z-#bDz<&=@t`U{7!XKyRodkmO_kmtsw|_%pkYG1V_)U$pyA7dV~bi%#XSq^vkm^uQki z#=i5F*yYc)Ma`qXqbgbNUgu;>%y>ajR}D;?3zaW8j(~?mL}T!|t+nwiM|aI%`^tkE zgbiyM{M-_P2(hPU27W%gBl3cRwrRWlC}-#8?oEuH<|PRmBqq;2_J8Qax_=!>700jLrHl8>4$nxHe#cm{b2{{-{oil5 z-%>n+z^TEoVYsQvB{}>3MD3!^wC5@wl(J$M{|t(9OV@rNGLX**{47H9Sz}bG-whT# z{h&H6B^U9xUvz5l8KXAO#77U!i2s4XY4w^KEB?uTkCIQSp`h(idU|QJjUPNOx1{P6 zy$wS?<23!d6p)<6{oYr?Yn>8`rV9(`0_Dly(HuYF^}}#0FkOm32ra)!v1d5S0;!lf z><}xK+gDUS8Qkmybh)gwwk7cVm3xY->*;}{|Sd1k>Iu=|qwhmlZ>IF<(u`5S!#eLsg%JN;gh4Bg{zCNKWN z$8!RCaIYbN|NW=4SSH|n6@&!|-kS($_WEp&O#*&w)EsNQM~2$6{pH?q?RX##U{+Au zJ?6C4A0#@^_|>(ydxBl6mLx#5|GQS6FClP$OBKZkoF`yxwyrc_tQ+4dzk?}$ zf5X^D0yf)^CCx1M+b{lJAyX;vD(Kb7PAKqu&-hq@utKXO$_qf;vfBfbu~7Hc95HA=`F?VA`?j6UJ9^QaF;3ydA8f$&iZy?gdnT$lM0?FIW*w*_RVs_V#5I$h zJxCXO{Q9VptDRZ=M05S^lZ9q9;t}9LY0FLIs{e|vcn_2-1&5$5{xLzipy;eP-i^!i zfq+9nBEaVl&7l(kD|oS03o8_G^}cxx4dpD=qk>V|UB#)NszhFM+Ph0P9!)y>HkgX4 zo27ir26VgG-J)r&CqE7tKINWh(va<;cXdpp(l74w!F^KZK;!wsj5R>_wvjyUgv10H3FM&rR4; zp|hjoqY5Rc3FB^6btXZ=@Lm((I{PdC=^G97eFIj`vlP6a)NAiCwCUFKM$gGc%P5eR zp4QnIlAt(l;16}RL&aFg1MITLxjpHQ@qiAN8j<&3{ji zJT$Q;dZUfMpjIJ0WMC!$viER$3M%pVAuHqv!0SPx46ZA1U!(;89~zo!NSv?mJ#Ju; zpNJ_(d=eANpHaKLYoi_XCHpV6B=-yl<(8dmR{^fUFdGBTXL%ZAEi6^|;2O-mE)|A}AAhmzk43wWa@h$%Y3oB1}As+N?HEJ{84+irezwt9(e z8arUZphX(p^!hg$`$hdROW4o)JN1NU3+l8FE)$Qj0SXKbx`XZOoQPmzB(I1{&Vn>( zfcc(%@jy5Jc5E(Z=nMz->*{HH2PeQ@s3Dn05K`0@VzkIJ_c05ZhSoSv33p{X!sW&pN`2^) z03)C}YxDiqZpkb)S-85(7zojaoVjl8l7TE$8ISt-ZbO*ww>mAv0hZsDe)WHHw4joo zHo~!eq-l^rUkAE4R;{){mNp7Q1_s@jh+)uan5h#MOP#*(#}E#?CEB>OM|EprYfrF% zXVHEBbdi4etSz(sW#c!a$FWbSYuiqnU+0QU7ZRXnc4jnI@LhhTqDhc3peKMoGw_Zv zqgT~Oo%LiO;7JRwZNFfU3)a!l>bDLVV6*9?ajGA#6fmUmIW;B`4+*0U6v9O+(IluY zzxrg*>=6S>8?b(p%?Xr;icb9o6cGzglet7)tX4g0Hp#D-!=I+7+8f&CvnLePk9Z=n z0R5cktw7t?#6>g@)@@iXuCIxBf_$WSoaw&4k6@!Jkgu&2s z^DGs=nGS4-u{|Uif{m;XPox1p>xJ625(wpN{-leS7ss}4(0g61#R* zk;NbQ=n119vl$_?BL8o#WG;n}iwPyiRxAW1swCIo?)HqvHKng%}B+`!fcdhv)i9#X&$>-!%2583w1kR>JP z3$9xDRp@ zzeNfb=65hwT&$XNx9+#+ZD8o}Dm|vyY3i`(U@CLXd;U=GUlm>=z8Q)tGOpDM$sB5r zL?}FvZR{a-b=Ed=oI)xzAw(c;eVw;rGRpcWyms6d4jlwl7-LOZ*npG1Wq4g5H8A|1 zzZAXJC#Y-Yqj$(d4{+&^oaS}5wh3MyzRfh@`4hRqU_p#6hK>chLM^iZ+CPSsMfXi_ zaC3fM3Qr<>f|>_L9-#{BtJVjk6FI@!XK%vjMPD3QXmI&G!i(j%t?r){<@~yr^yUIlp91ZDS%hz#l1-{SQ!PM-{92?{8J%xeX;*GV;$%-jCk9d z9vHtH*zD_mXLc)X2Go^922wmRk7=Fi-AWJxA59@Ha^Qs2OrassYhCWg!Gn$Y0&nX0<(^li( zpibl6%?DPylIW0Y?ftz?TTTg=;;+{Jxm}(ZU6YE=P68K{Q=h!(_&$;vsejXkL z`jHHcmIa}{|5dH{EOBU-f8hc<=H{&5*d|<7yb8B-#PMtk#^8>)Vv* zeX**Z&)!@13Vx=^r22C=ule@MnL$ z(WZqc<|isF$ub1u3TZyRKl`SD3!}(S#*~_sIA|9Va`)#XPJj0oVTdim%SLGd%a_1l z-w_c8al^)$|HQiTbTFbOTiH>oR$yfx>>B1in91$IBL~1YG$R_<8&xoj)~t8A|A|U` z#qcoT8#@pfQBT3dms8{YgmL4xS_9R!d{A{#4AjRqN?^-RT-f*PHR^aqtT4Or?ZRqX zyn(R$qAUAoJ=E#v#9tedL&+feJ03tj^Lb+_+dcI?fb1+uY!Jp!=|@PHd|tWF`&rr} ze(D^bAz#X$JP(aR)^L{9Vh)~505Aw}!(+Um$VT=p63W<(tMt1U{pgtJkb2J-2V?Lh zZP0#CYL}}kvONS9<|3>NLc)QibM&YhZ&wSZV1C#KnU)#B7SlY;ZSr<0y8WLb#FV|7 zbN^y%vjNy$DipcZctK&(W@=rSbF&(`1C?}#L}fd*3KzE2{?an(8Bu_j(sbVb3!vFR z1j`hWs+>whP>Y?7g!w2}A1(L&sog{Ce!N{SzPe0d?RtTi4a=@Htd-FtC28J&;s~l3#;vE z5J%g*2<%H}*Qu0TvHu8Pck-5U)xlXU3L%JZTNp=lOwR?UM2x+6v+7^6U>QfAn?V$w zRDo+X7i{M_BOIJ>jBze5!x&_#Ao%c&-3B>WwBwQ1)i;&Mz|o59S3w?JVIM^# ztk^Y;^I94P!MI1$rMg;bmasXz~Ki(Ct4BF^S^?# znBTd4B2F*o8_Tvg&+gq`!>S3+>XBLKW_~)#3}0e^$)ZaZuWkpXY0-xm$vExTggEB$ zN$_K9EeTGfB|X-)`T+@cG43S@WqFSX#S0fJ!w>FP0e(pVpEEN~NPs#P;93gU5fgb| z@#>^}^dK~qWFzcScV8KOds~y=R5A>Rw(Q3vSR0X}tj-5M@|L7r;H5pg6o|lK>XBmx zYaoL*Y-2{6Z;W8++1=qmO23+`K~8c2TSfEZ~w25ZX1pPWKaT7@Q2VCDnt)BTZBHdUY0=+S%j$&_Fa>Z zkq_!IzaesKi1CGMX<#ZS6*D~uOWPRz6_&}g!~pd$zWe)L_>M@*9%z2cq9<~qD!;_| zg05_yDN4%nLG;a+krDznd+tya`}D8Q4)NXFv%^|qr+*3GgQ1(w(aK+yFZ!lMxWh0| zh^Yy^Sq=dbrM$>BHyt1VdSTZlS@^l&M5i!F-gEmRAs32Xur1v!#hvO=y38 z7^?T$48YFf1n=>wzFp@Dvgdc5{Wexg1UA!s>im@+G=2)YkUKTOAKF6u_0(~CU>#FV zc0gAiJ0y2ZT3MF&qEFPyED-QG2QXP>*wD%}prU)IRc*rZiQg4*cP_bZMOfqv7EDf) z%;-jaFcXn{y+MJ|NWtF@hxO<67hq|CSDt~hJ>YP;mj&;3#F&=MeLGP|UIrlF&wCyJ zKc`9onZ{bfP^ydek+5*ZzHYrwE-CId+{Y^#6ZQUk+1X0Bp zd`u*4H>@(=YZfS{tBNIzyShX_rI-iFDlZW{raHJG(r8Bl`Y>pT#l8A@4O z;WY7WS`(NYAeh;b?joHRp@TcUs-haeN9ya4k}>BNW8)99NL+npIl+eGp+aF)?KiZRG<|&J)R30X zMR9JN*c-w~E8=gpR3AarmKKRyc+RR7SVSS;z)zo2O>sj&r1=2S(#`E zrL^%Abo2{rjk3)c#HRQZSoq!bPn2ERx7zt*zvKzn@`)j`Z4xB=^l?r zrx0L#0l|C@krD{G?lzb~9Dlj*iV+y*04T_QkClA{)B-rm{e*0~I(l9&$nwO;_i?L~ zn{Hi=rq1b1cmugWP%x^pud~QOKnp0M(frlb#0kx-TVTyyz!Hp$v5Gcr3c>J;TFeAQ z{kFS^R7A0YEHRLd`-IC|F{BnE)89^+s-=m^9^#n)F8ZG>EjC>>Px2`Xd_I*-YUCS{ zHf`T94`7gnnBz_bzK9_%Ul&TCKgESeR?L8xG-P5pR7NFiyBFM9r2|n9L?si-u+UmP zOU8bu7*EXi62KSv1dGrx*JmLjVf$uGXDQtw4z3;p^=ol@fvZzyO)L5L>L=iWR|+SN z?D)Z0C?0#zw4CT7%hFmloCC8TXwnSUesf<7jO_x&7^FZW?UE#axS12r?EAndKq1VD z6Z2SGHWv@frxN}9&y~iFW;F2uqNw52sEYp-WCH5HE|8+lbs^+)G8KcZRq+ zQY2ypTEaGt^1J)#qLC%@j=LU6u2h1cleKlghm6w65H&q_C7IQSRzAnvs}tU!rG1Dh zGTq~HLMlW%-q<6g0e0$vVs~Rk4#vs{WIp@DA~jI}SfJoPV8o+L)#UpU!-x$9o9P@| z%w2a0gl*(5cy8)rQ*O=kXAo*z;QVt#{(Q9@!|;yE+A6yGZ1R6>U<^i`Z~n&fm+$#9uQTL(0H5B5npVSe5pxkwqYd z;5`OHn@q$(OsW9>AODo3%_rQ|7Raqs%uFf-rGLlbBiq-$3s=bIVsL@Y|0<<#D9 zcQ;xiEdR+Ec#0>OqMb$V!A@VHYVNK`_*f(03JoY|m#tPU z;^{f?5oWu@Bczca(h&oBald00?p7cQtN(H4h^O97$u|3T?LNSLLL5Ot(uK2-TH#+` zKj69nU%Ncbn~auLgLIQqX*cNQ*)GG6N`&B_Ky88(Dfbfk-?UP0SLdpm!>Qfc9*6Tu z6L#mAV31Iwi>RfE;izgItf9*)=h0>mQ7asK1{MC!Eed5Bg%Rd&(sX&4NpsK<>6R-r z2C+p5^PvtpQICb1U)*cz0*g_^!T&OM@j+hU4$i94yi)->xbTJ#adI#W66oxBK*-dj z#0j~AoO8_mimBFb61ej`zj4hPoi82}BT-*~B=OI9cU1;f@XI%rg$TuWHTd2}B=-}B zLQk5}b$5#S>zT~6Wg5MAtybvk_zPb1Q`jNb*SCrTNJ#hh11$%FPSGrK{@hOiCQpQm z^;)W2u5F_%Kg5ffuf;0j+pjQeeZywR=hm(N!#0kulJj82>WmkQPsSbJDCb$U-aB_v z`?8$Z62=bQ_&7w?i|6-kQ;zCS>TZ4CZ8^t)_p>>LrknLS(4`&XNJhjFhy-eCgNA!F;dHcBBBN2K#C0qK^u1?brY_`{g|&o>g?H zkbm@zd>$KC(7BQ35iSm-+m;1xC^k-zKCbGsxn6*E=UHp#lc? z4X>HYBGW^prSBGUy!g6Bf4=$rtT}RNA!vB%;?_R^J}*UoF0mMWVi#byM;~_l%Mm;vbO`M_Z2=PbQoy61}+F&T% zo~Ph>iF7{HJjmxCH}jcM;3Cvf$=h`}QGKTatrAC2-bZbvS6@$pR)lQ2U{IQ6naQ;> z(LxjFCA268->~0VOwW`9qS9fMy2dqN1Q%;bt!o+Li^^57 zf8gMap;kjbC8p(?Q%n$?s?m~89RZu4X?`0ZBaJ0-l1FtAz6K(>!+@psxb@re^~uI< zlDXpHjP_=$Ck+KBOQqyZ+SW8H;Qj%ES z4lB0l%cP?v7{wH2p}|gh+WiTum`mVX2tFJ5bfTpV_I4o$Nx=Ma*1?*UkM2iaX$;$b zwyM>c0q-^`9^o%>*aMH_raDNBL4Q6}$r7ugx33@6*JCvJ>4tC}wv;#RL-`LW&LUUxUZg&?qv*kNU^)&|mj)_z7o)Hl0O-0tu-v;%i%EjI)9#V8-CmN2TD)OSATFa zMJ5`hndK#oUEOYO%F^T&hO61bw0mgpt>x#hR>jtbrOBEL$6|psbOmVZ_s!wa^zkn| z1A`C3K%s15M<<3ycdKj>eX3)8$p=^Kq90wNoVYaSIiV%QN;puoC|U0lm~fC4BR1cN zwGaJULV|-2(0G(-j+2~`5NM%nM|CiSm=9} z!!dB!@Imol7MQRm^5CHY&sL}4U4@w$mM?C3^S`Jr*!9L%)y|z5=!?UScZEjCwUx_O zCiu$&&qXyZU$lF$IYOy<>>-rx1yi^r}9in!IpVmEz| zuYOj3=?lwB4s3W;ehw-kIS4tEMj^b3k?Y{>abK*oscYBr&oc2o>ji4Ksrd69!IT#{ zt*bKnWiv*drwO+!ZC(vHNK;RRpvj#}{z=Ky7sLIB%5cX7ko!uZEr*Hh>`Y3>L!Ic# zx*cl_$>cAvk3^~AFhG{MCNum&O^W;84a~PDYq}9jM<_TD6(}6U3=>vE`hbkw3c}wk zE>rWNnwiMPZ^D(`-X>OmnsO!&CaHFADVo%{un`Fy;Kj5&VuRfAd_!ALa z<(x}Ik2<*CdDrUC!yUZk()ADJjM04N3&|0lTj$9lS4t{dhhp51|IzO(6}~C{<0lpL zl<2B;Pl7Rjj!L)=SA$)NBM#yHZtf#jV~Gc+SQ{VD67CX#!QYC~nlheW-Cs(#%97j_ zG)SAiZu0)P04o!xD%X%a^PhVEsar|Up`Nx(8g)AH$Eex0PN<;g!i3n*- zUU>(>*?7QX(?wgLQ16#U0#0l?U^p*1wGNt@lNn1N3YK3J(^R5aDoi?{(4#n_jeMt1 zVG!S8=0kbwPtC=U^xB`Z=+U{OA6C`wt7tpz{qw8oh$1{`qG67hn2&RhtDYnOR>pNT zK9dCkb=@Uo0ylKeRBCXh=A|TG;J9sxZ|<5Ffb0}3SHd(P@Pn(efBuzg?EUG=uZ4}C z9XYGZ{#p3zW^R3(Q@4t??>vN#yXVpa!2W z`2<`Qe*G>L3h_3NOr&_W7j9>Xqn&pD2;>Z%{^D2?hgV5eV!QD-oxPkv9Wh7e!0pRs z81$92shU;x6?bh{CHM1F!TN$US}uQB_kJzUVgp~P0dkE-b8E_hG5lshBR|_h4ypd6 z@rKF>Jg3+}#)PiOX8|-97KgH98}UJ`ikL6!yT7=f0wJ1FYffJ3pXm}Y;R3nio?P?W z;|umszJpt;*qq1ehYj_I&CH03{`2=D3g3^8$kzx5hBTROj>72y4f;?vX}GXiWY82j zR9lqT+>w|1O9qEE&)sXc)_++#=boQ$9rbWL6`fW-rVK@4LZEf)-2sJnUhW~<^*DZ+ zLa4IMHJAC=Qe5&wMMe9Uin%|+5UeB#hF5*WQn3#39-ZZ99KHYWZd2s6Nk9uf2+wfG z+DhvEOL$Ig0=jZQwJ***gOqAi=j+xiJXG$vhxhAS2l=-!hu;+BcV%{ZoVB-C3*K>t zy~JAAsw9x2ZJRKEeLFI8K)R+a1%r$77X1!-Jz^`pdNveZTer-oH*r?7yBt1{HrO4G zANy0X+O;JakRq5VVglp)5`~7|d1X#a&xwpU`jxgM4Fs{22ljAZ*MocIz5uT#n{(!k zSL{3s?Fg1$rkUAl!QwKh2(8CkxMgG1;D93R7oaD|H)QOgTpmG?b=bl@PrpNg!?q&v z!R|N_&_u8>A{f~C6RpIU#8;eWLmlRhb^ZiOBqJ!6 zhPZ*_yaA-Vj@Us>F|yp1UDE#+zXzKAO~u20m>W=150y(uw)dlnqN~J7jIB1~Oo6x; z=HT@23;hhD90)6L1{r&V7S6#Ca{C?ifxb*(DCG|r-?pvXvo{c<=t2v(ioXY|WM}QW z5S~~EFbU;IkdwvzSaC>4JJ#QugtMrQLzb_9OK_rsx}`EBcRfYfbTZa%o_p4&KXa8l z{WoAH2_k&tz(pYR$L8sL9B`}|{eXSkz2&!w`i#R>T8Ng=F&w9i65W)|OabPZ=(?)R zf2pdnn!Ffvp&Fb|q;?HH*3d{PL9Q!-pu+E6ej|UCnC&0RW2Raxf^-DxcB}f6JIjDi z);sDUo78-ah)h+xg@3Xv(V@>K+vYHN8|tq5Ixgo|@gF9vjqbP6f;WN3leYEbZZ*q`uK=djHd#_B-PXd0WXr)^*J#OQv7a%7SrUuHyhf&5(BGo}fsfyn;@| z$#X%X_-fn-DY;V~?DgCAxZuZvGd!P=g}A@99xd_x$i&&XJszj3LGw~7MWpHK==-gc z(26DU8@Ltik>Grp)}3&%#;~H#)e8Ds@Lu{cqKEf~Q9?FzzPw%464W!>dbN3KtwCDM?(Pj*aM+Fhrh3KM8ZEytQKJMqVF9nTp- zS4AT_dh+`}4}B8v~s;xG}~VUhQ=P8h{- zcOEd^+OVti_VH_O3Bh<`!{yZ>jq`_Hu{<@3(qM=hzHn9$y{&jxvf4Mt{TBPFfI8)a zqwiWz!C&$#xq8P+Yix!EeF!Y_->@$&X&XvJf?DM4x4W}m;a5xfs4cgB8>lk!s;#%y zXc;AZuQra(ztmzK+?&JsT9?`?GRk zFP%#ZR9$=av!s7(Nb-w@K!Qhs;!Y(!&_o5^GJ^0G1_yK*Ak_5?bSCuttDh}MJ9A3@ zV&1-9UwlY%cJaAbthlaJkDath%psvD~iBHb#M*vH~-mv47E@ub1Kh~Hn zJUGY`@s0^n!Z!@L-zWtCq+z1J`B}|adjGX|ba5>bUv=jB4*WF8C@va&1SEd_ADrU} zNCF?g^6nHs6EN}}wFbjV+g3y?Nk}+T24*oFLiDdb%FpdDE~?>45}r$(n+bdYJr~3j2*-d}#aCB#+~A{16gzUJE*%R%06z~+PhZ7@&-mgL$l40 z#Mn21e+th+bn5*L__gkY#IV{nPOjx?9)Z8);7k(;>VMAEHolnEBIO$aP~VW#HuM-= zJMOAA8Lu=Z4JuVCpMl`5F_EU}hEc{#uQeJ+tWmSmm%)SazayOV-}1hH>#l>v)>=Ed z5x*M5MmX&6gAQj(?{vQ!Qcefup7kDkm0$H)B6^HfpvHH zgu$-q8JRkW^YB)DybF^jsZ+{;lFYw3Lk$hVD9;rz>}Cw1#e$wXsYO&1R!^ZF#jjm{ zzMt4WXttRmUM`=-@kEl5_XtTN*46()0rGW1X~8|iflFMyyik3iY*6|*`Dt2m7nkD$ zKlqP|SqDQskzLOnJztySR84qmtdQ;uElgklA^=*MBUj`}@KrQC<9?T==EA6ud`+UV zGzNxX|CT^qv{EGY@_9Y8@oxx*q!15n4hHgP0{je(rEvbCRO};7@luQNoFAu}7s=ZS7~Hy|1(z)wHPT)Y&8?h>>l%Ve5-;-%zWg+G?rycNL&pkGH2Qws3g z899{9sZwOg{3sndoM%;hvEjKaspb`ug(+M#K{tWHMF|wGCsc?PayrQ6Db@8I*QaGf zf-U_n{}?Z2FFdIc7aF~5{bJ0K{+|OHWzlR`VJsk8xSU;}#>tedC!^PNh555sU3N<` zvJf90CN{1|bDex0cQfHqadP+!iv0eb8zHT!9X!Qe{Rh1Vb|hlQsu#=~4*1I4LXj^s z5~xI~GSfJk#Rawgy;(iN?=zx+zG@Vym}6pyRW_JpVoZVQBG`X4-k^**VON_U$V)fu z{^%lZ$62C$Z(PGt=zhdkWgd}bNWh&InI8w^&MzO;?W`_eHQDGO*ez}xpq(~BzU_9y zpW24wMJt}~Hx=lh%2?sNhZsp|{wHfOvh=?Nc0UiPoJ+Y824;Hfi(_i>Iu%4Db-Hw& zmQ0@b96pa`da^m^)07hu_zQDqJLlrX&B`#H6)nSnudP_9PUE#_Goi^pohEM|_2)L# zer8b`)g*{toy&D{It{zMPXjBe8hoV2=iPp5zH^RXQ2X?s(Z481%5ZR-@$TAI{NV)K zsZ@B?Dycc|`Sr5?+Zy@_Q061YTSraGE|1D}|Sy=UJKj?lhpcDT}F&?Odn^Uh$WN}QEfwbSmIng1iDnsuL)bQE7 zSLkEk;s?6FjbPOiH`RnvsgN(B0e>-0W8Oxw1>Q#B zBCZFIA=(kjw#>0<&&=~fp&{Z#JLp=*8JXJvB z(3=mXBFJoi&T+jmP{<6mTQW^ay}?&RZhw;V`^(ofv4^E^v!n(=f%+4_W>eU5_x7iz zlT&mmLPoEtodoO-s_<=$f0rtbIUkeZv8XXc;XaY+tm!h-Yj>`fznq`!yQToaX5CZi zH`j~4Tsu&Cyi-rDziKb0eqa{~ zxz>GDryV;S58ap$01dt8THRfqa-6_cqP7{1?@ZagwVI`S%~*bDl1MDgI>{FFlL@KM z9EGb~6?(Z1;hn5}?(+UOC+2c-UD{X6Yk0uur4`p1K#)@L>c@=p8fLRoOH9;8CI5KI zNP{ib%)|{o6uJ6&C*VZ|%`7J-9ZiuEpO1@|)d?v6dObjJ3d=@i}^B%!odo{$jZTVH=-OES5F3QTm{$*jFl62O&GvxUQHTlfCE;db?%h6hW z@Nn_(Yc}4+I&vU-j_r0Z>da)?W15p&BT zTfcjhUfYQhoa-^Lv}-1FpjZqNtB>&5gaEQ+gLxG%uBc}&@T#fmpS4*^;EqYWJSTKk zn~r06T_hp{LKGKjDLhYAXg4mRS>FsEWv7ID1P*#x$`q8qq=n}1kyzvg#@Q8<5|3EE zhI)5f8?rxCb5R1H2i<}O=-yPsPks`arn}{=iXA<{kVY<|2Yn9%1q(_azJQ_gZPqx1 z{z(@Q=MoS)zA-qop<{dhgAoQY>DO>0=6UX>Qkl(a%Z>*bNhkQQyzDE3&U>b;F!Avc zmAswS^zXv}FiY~D{IA3dy-)5h{T*f#8k4$xUgJEiJly%Bc;YG*I?_HFB7zuiQ z__|(raH6PDJIK9xqIw{X3$Kh%hR?J_{NK`%875CP2q7F2PV&p<30A9wEzLCMJa)|2 zpu;Bf{Q+v}FG%|DN2*J+eSN#vF~Yj}FQe%Vw~J43wj3wFThgrr@asoXvUR*VZ-nON z1)L;iu`L$i>!m)S4Z5xHJfQ}dr#-FSm`_F4H1O(S@kfYa)a{vDt%;b?9j5&7R4m<9 zPrMIs7|WxY?QBkIwoQ%B%8O2`tUxt|bOaU2H57l!DB^>1zTFe_DT_R>Hd6$}X`=35 z4t~UneK&N04#jTk1o=#|wEhaAIktGAUFnvU65S%T##p1l8#2K+)oF+YCCfZY`VoC9 zQ{Wa4{wgo3)HG1zW98kQ_nl%qvvTm6X4!(tb~(rKCwq=xST*4Sh#M!HI9$rlSZMa| zP>VlWQ=U>H2-BQbW>4M}_h|re>E^~5nEX-;q3tfXQ~Pua`q2lP@5nF_!k9Dt$pi%S z`$jIUs&w=R3s@V|Ps)xZfri?Rf;WgSgG>q|&+=`n&jgj-uFCMWHPmyHW)RoF0rv*@ zg)fBG$%h6bSUS?|CA8svVEs!gn^_NG|H)t0Y`?L3HXKLm<3L9-ugL*3Q`2AMBUV(e za5~2R4cBd&xJVT00iTPk{tDn*`I=FVU-!RW!B$*~-{-(ZI!1h_mf{)2w|$2n{>sN2 zErAbS@DEosndFhmRL9rex<2*KS{2o8>SdyE>QifumyZ~S2*G>>Zz4TFJVCuk|A=?1 zvKo~X%U2ybEYh2)kj<9bO~-|w#Xd9h$pUC9;2YVFzzhbM3G2>YuS^fCUo$dYdQC|C zTL;E}INk#IUSt>uX~n)rLOt7QU6|Kil>YJbJ+WV(Kr(UMjWxC?7&LDW`Ku^mUP?Bf zz*#}srb8T4T{2YDqJSk?ugt9@x#%xrGi=~uA&}opzDwy5A0nI`cN^RY*+vgk41dYT zuf8Y8fGpP5x%{v~qBbXsOwf_C7P|f+AgtCO)=0-`(O1{G-G4#%vVWA}C8J;5%!kOo zjE?r2r`TkG5rY0w^eO8OBo`T;BXhe4L&Sl$Bs2&01fI(A+x70oIKwHZtbDxf7X8bC(2pb2KxA;2^# z^Z~%w(qT+jqw3oS@At@jFkKR+OffCN6)#KkkibALDOv1~Uc;F7*0-AOIjwGXw`I}6 zbj&0)0BKpGS%8y=G@bVK)5o?F+$$;`s1QZI;QH>~^Pv6j)0FU0u&MY)ExJi}efy{g zznYf7-l_;MV^VbDhs75vV1~3ZjR%bMGjun$6vWJDG)<-&+Dk3bkd$09Be-oE30;K& z7Bjeb&w@TbOMQd+LGA}PsCp=J=|j(U43<=Z%@nWJN77Wa38TwjucmoO*QUE46&`K` zeMplo8Oi^#BQfYR(EW_(=x(&RB7vKMCCOTLy!Orf zkcPbOM+bj{5<)pKv<$=5Y6H=j->A&QSg<(F`**S0vvGw0KsE5+e*s?I{+oY+6eg!f=WD zo(HRCU{gailFsiw)VG}$XSSQRnp{)4*kTj4Fs{*{Oa{V(rDCqtOMCE|3aREtlKb+Z zwvjCnr=1lXX+R|3CfB!}bX68k%bt6m@9EhUcZCWL`9N8yy<5c%C>-)36FdDajYtp| zi9a_z=0#MT#&k`A#@{iT` zzwEqL{dnEG80ZCa+GZYeCDt52I7F!U#rFkDzX4zD;`O(Q?NEVnx)?ho!OdcsLeH3< z%&3Amul+dw3Zc2^4eyKWBI!S9El@jYG#t{!a-5n6^){{NiD8OQ54i8d=O&c$u5>F@ zr|Wy?UDNrjT20MFj|R7JiC`fkmNh)x(S7o7Uf6SD-UZJcjp*3@rPIPY-Fk+lN`?zL zzH%|2vE-K)BFecXmD!v z@u}~QoxFY}X@8vfyPuKaOSHHNlCaz*G-5{Cr5i#^#1Am71fkpkA6U`R9SJS6cYlxN zmiDGYj3ispI*w`3L-}#o*!9yNfl*Q!b@}LVP2CVYK||xIvD~g)o^ZT&yjle&BN^`7 zQ`8orF|*dNt~aGJ%$&^nxy6KNC^i(5o4fpPI5#&s3wqgSkFhL&*Mnv3J45OnLUw-; zd_S}PgG%{Kc{sH&Wk3UaNvGHU?GwX_C>n4po|-;aKyR)r?mugX0wGH^q|&0lzD~xm z-3aKGCFT-(<>}A{NfWp&CeA9szVZdR1%Iv*dKctjDouV6p;Q>uBEcQV;1WgiwU0fw z@hPU9oZk4|9lx0&P)3-J@;`b#9;`FItWCc2_Odui;YNC{N%$RzR8ufBrQv)c2S2v9 zMCV>n9XUa;A1onTyKk@j=we8Oc-X^Vx9v>n>%|Ka@&!*nCa zx1e2+o0GXWqHS0qCX(B#9;a<_!Cj#W^DrYGmbv`;vUzx>2JfC8!;E$)G=%$u@|Aqb zzk?Dluh^6Z?bAGoqMl=;2vyu1@+r@~0vI}8L z5zJ(oyc*VfTa4OM_!IKje|)v9Qu*CPaj;|urPh#5o@CG9{a> z%=f20whUOR1onrcup1}ccTrHML|3tRX1cq+Kfog5k)91odJK8gx`Rovl6V_rKE_UVI{a@XL|rvN*R0`!|x0KO-r z6u~~@w$4nfhMI48l%L+HryxJMEQ}%EBa&k%sjIA>9deG2%u2$%*0eLBG{~EqlU=h5C)F{Z*sCMm9 z-qc-4OMH)h_>VZh)`xp|=NPhayT#UgE5g;OQAcA*q=!n~QtC^K{7!f#F6S&XEB5xR z5Rq^GgnXyPz_#a%Z$+ibVOBBOKqVcm3$YR*1UfXs(rA#8*xiZDU3&`ygx~9+rC~Ks zan)IZ;~rIH2wM%tpVKs16PuS&?a=D}&@H5owZIe{rBf#$de}O2CFRWa;h9f2@P?p& z;W}Bpz>%x^I)(ND33CfF!Na+mff&F+76~Od(2~~*flsqJMWAyMLXnCteYEAcUb0Xd z9348fqCimWL(DYqTKUhpsQK#N^~P5`bUxfvm$qeL)9fk-pWgEI(eLoWK7`I;lo~k! zYlj+QxcM$WK=s2ZM`|on8@cERu?UAw<5HI6@|?%U)aKmEF13}3X}$fFvCZ^Pbms99 zJu$X<6%YN_Xi^Q-D65_gfL?G{)#asTC_wZ+B3D6;j+KmaF;Ld7ASr07lfS7AG8NI# zcA2g$m`teS4B27Jb*v*FB43L64JfJmH6syK%J89XOq1b>T7mIohcsums%CKOW{7Au z2sc{63nCG>j=XrSF#7f6*C5o!57ZXvc|lq|HE7C3#-8FBE6-R&k~uHj@co|*h8%8G z)hG$K-&?Fa-70**)^-U-P~=X`FLproGI>^p=u=_|9Z3SV^(t*OoXTwXG4Ch0Q?lW^ z-wYkB(9$zk%cl$Q$yXj39U511AvawCxFBc;1*>w{i7V-5>>Hg`ToIWcjoWb5ac| zgE&zsqP1)?`51Y1JKi))gaz1eV!{|EPbTpd>zG*eyx9PWyPH@%AljRfl@O^C=Y_!e zgibonThd8@B1IG55hq8FZG$l$r7jh{b=~wQ!vaj2UiNxph)q7yWHB6qb}-Z($E@m= z(0BlxjEz|{E?6?xK)fo0JnMQ!!aLvs=@KdCUn}U~j0X)DrqT#Eh-PA#=YoUF_;l{y#g7_aZeqBL`wF9gf;pG_gJ)PRbQ(k7I)=rXAy zCAs^l+ayS{FrR7TJ;RvuRanr+dI{u^1Mx78h+tguSc8`cuzsKP%kTEe;EASRfQ87u z+z)_Lq7fyiB*pDW_eDhy1G-?{$qQ0YJ{SG#1k(Uc?4yEMfKTcT3@dm@a}uu}9qaMQ zSGX|)M9)%@LZqmQAJ4`=PR!@qCqk#Yd0UU6?G7h`&JbD)ZQ7i?aq| zFq5aSnTELB5P0O`P#9jPJ(ozVfo_c06EGC&_yNbCPJdTNxuI>ATo4C&ykF^#yR8y= zcDx=FU%!eEz$eqO^(_w0e&%@`G_R!EN2Js+KAFZNDyLWn9vB#S#UBxy1FGaud^44S z2vxRyzgB-9*_~%z@%Inahp`eDup{D3_^_9Cvqpn-9#1wKTa{gr_KRus#&jn|!YHXc zQ++B^oQ5NLtXEp-8Asau2Dc%A$2*=*$Oz=?DyG;bE6(pEbv880*-PHi&z7@Q^O!xS zN+!S`v$Wg*JYPSj6Mtfcn;{4l27XdzK0NDB4gn&hG2M_uD`A+*8FkrB26LWPap1JI z0Vy7?guE#s)Z?najm&ssv_Alg36zmZ?k*`3t6a+N?H!$MEX}b?w))t=jsmh6PUgjp z+_bu}pH%!CNfJ}y7HoP1ITQ83^P8e>0%;$1QbByn8BAI#sA5lMluIAgPrt=srk;%yoKjFtl}f*(`$ z%;=LkD;5c2iZ_N{0+u0w3vI)`9V@xOUfGQ=vs z__aI95MRiRg0_ln+vUz_J%SjO&{C#?0xw1-1qBe)#^z(NRPXGJVSG>xDNhb)w+hP3 z6l=hTpObWq(&^E$?LnA6hR;{D_ee+fY5OUlN>Cf0oi)NPRf&WLmxcmO2dZSwn=sG2QR>ZzKsP<6_KFF z+KMVVwasq!o@0mi-}+9#y$V(lU%zSmhJVe$XWHg&+v77iabjE10bsa1L*MWSUB5t; zK-283*uZ29o&uXR)#C(ZyB*P8Ls%Ri6UOU;va69(76;;iaw+|H_oLK@KRxyLEmr^&a$F=s9CN~+jgr2DqP_-`Ll^Km9q!k!!u2<-iR?9IkQhI zG|tCuy-M6L{9GlD-ZRDPNmlErbwGLu!*K$BJu_wo-^)=|Vx@QK&t1Dok>b22MD7?h zC!`03u!&^@uXbyeNBT6=F7e~2qdQg2O%-eOs_K}eyiSHASH zmyXD$=5nBMvE>n|oCMEI!x!P-tZi`C0auKp%Vy1*a2e{SAo_ZZ}9{4COoZ47|Zrb)`&DV+KkOZ)7CPsPb;$I;fJy4rCn%{-j zL@$MC-##6>@$GbZbqw_dF0NH1(1OLgRo~u~FaA1gmEtme-{*1-%bA4d7H;;jxX$fpRZr!1@85-XV`RM0%ykwoS9#t?l;C20zt}fjWI4$-wv12 z$MRK5B6gx%@`lEBFKZfAiMU=- zK&6pGR4?p?`Ho+)Id+z=E)l7O(%?>2nVd}a@z-CV*IVw@=I&-U%5yGroQCbRxI;r>#a2;F(~1cbNy z()U@rB%<`f`>WkxT%P**=Ec<&_s7Z$$M9`9DM5|oy5p~D5$BPO!2GEF^EFeveW3#z z{D2^VCLw{i$G)c-X2cE0(>CLBq0FFp!_;5byp8F8aW)mPZBmrix`WL4`oFk=RV94C z#(byFZN;kDg%TI|6BAxb7A@*3))rXc zJ1I(Z%3Q8RWQBC$U(`6*K+s`_+O#mk<^7TkA8FY;HeXVaAi?|2?9B#yeU8(JouM|w z`GohD4cz)Eiw#u$XQtrK%+eai!#|{KjwlNB%mNfFZU`Np80uBWf;(+wSE` ze-~TH7AMYwL+PH2X`Chd-r5!!El;ogwJB)(JW)KNh?MtLBg)^%M?M|w?d*&hq ztj_m#6Waeo-!5g63nq2^Cb>WbyNOwkTGqehdv(?2Il&%%yLwvqr%boy3O)Wir%X+N z?)us_y#Q^ms3D_vIC_;k$+dHO5-@ zL3nCTw8F>PK($;st($*q{$q^f6o2G)GuNtp(XuxYq88U1gv;K(Ss2xlYfRZ@%clFj z_QN_FvolzR7fTgyz@L{2)QFOrSW?F_P=G?8iENo>4E*+jzh+a zf*U{IaDJXjZe;m^l|KE3%Jj(+mPPsfpqy!|+v3&cAK(>0AKQ{F@aH4?H#!sM!#eXVX}&Ms=zH&+<=gH68AYM{6U*c5>lBPvrURc11J1W&CPe`x+Xu|3U_{`jF4f zyCIke*@Ti2HS1X(LR><%C7T+MSWM7#lYPxe4!RY>c09QIZ|C3&;3-4kU$p<97pWu2 z(nxc0#dmE1SQPx=%RX+oXy3-+*c{R4RPbQm19>ky(fJ2V&^md6!7jN{37;%p) zX(ZLQ6xQAUIPs@v3^!HqoHZ>r{JY`#pacc(s9j1-{w%KnH@z?Fe8RHf#K@|>22_mv g|47#V%LUCn$1T&y%tfg)9sk#_p`xW+`P?G>KUZ1>a{vGU literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_nodes.png b/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_nodes.png new file mode 100644 index 0000000000000000000000000000000000000000..ee6a7d6b893d2afd0559bf32cb0118a38917b841 GIT binary patch literal 22454 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 O3w5;gA60AGMgAYOC7-VV literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step1.png b/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..eaed64282d053a850c4353a856e272526e906796 GIT binary patch literal 12956 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 Sj$-+*=MyE($2E$ui2ngP{k@t1 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step10.png b/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step10.png new file mode 100644 index 0000000000000000000000000000000000000000..cf501988ac885674a6f9aa76c02ac901a0944ad9 GIT binary patch literal 21456 zcmdSB1ydZ&_clDcEbi{^!68V{4NlMy+#$FV+!uno1PKHQ79cnTmj!~m1&2+rV8PuU z?%%)O5AjabR8Mzbefpg1oSy0Go|$M3H3e)83Jd@Mu$2^LH30zm`4T*dhV-0V7jjuX zC+Mz<`tAUL^YgzGl*WNW`CJHc*Hn-Os>Z2ypED4f*Q&1ppf(Zn-u%DzS{f=^a!*fB zTU%S9ts&Rf*W%*hnr*ewF)`95yX3X08z%=nJv}3P|6E*LrlzK@AMSHx1qjrA&6AVHpF ziYmB6nHF3Z{QCxk8ZpRWNCxxHpES9J%XO?gTE7iptYCo3N@0F`KT^4De->?`MgdB zASODE-u%4B1?hG|f+%SJF)=Z6O?zBEefVq643{55-F%yhg6ikd5FH0_%Vn!R?-d;H)}f2KD@06j^4y>PgDv4!E| z+{x96Qa}{^y#`o3ys-vT0SG#eSw@>hK~hf-rk@!f$b&#ooIhWhAhT2wR=#+W3R?Tm0SjaL~s=?s@~`_n^9z$IpC5-uA9Ti@gn!QMd4^y=33fuQd|1wjorC>{)!(J)36lthRBF+?`2r)B!VNJgfJ z-n?2OL4DkW0WX2fA|dtG#HlF&XRS$XEr6pu=mHLR-SR{Y=mhT1c21q~BzSqXzD7#; z6AZ3jZ5eu$p*GTz`2@@~TnQ=K38c)M-iK$%`k9$cPBTT%P>LbCE||c0WR1;N{ICq9 z;|as_9TyKtVB_|O8VZPJSxD)!2?a5*e%gfzTEGG?VS>dQ_xNFfS77!%q09SjZc+{? z2n`F)pLMy4`JezQ1w&9OU*T?MgG7AYxzXqV5Y5!fLziG=y5ocC<{e2_uJUAe_F!AI1jlX;aE_AC0S>~7@19GZ9Ke5e zZ&IG*&$+5|_@C6!O93sQ01}{Q*FI4d4?p?@!+?vqUB?2OJD##%nC=|Zr%Dw-E=#xs zr$xApOm7X6}aEYWLOFm1q3LL?0X|cUN-I8Z8-ElNuRz#F#s5VJXvac zD{PS#h9^xV7#I(9omp(!IF>HlRZcz0(fI<*np!Xse#1wS1s$SHRfnK?p6SO}V~y1&ag49)B6v;J`#jEr!8+3I_vP?!b; zaGwq-!la?uVqo_N2nc{6%zqm4MoB6`7^CE*B+Cq7ND+~QX~73Br^6 zE$dL#DPf~W&=(tch9#n7X60g2An)j@mdqX zzNMiy!LusXYbw|ix8s9#30g^M?;F10=oo?npfds5zDb2$&qZ09V(Pr6^*k2wTuO+quXe3 zY3lPOVEN9*r^!bSF-nfX4hO`q1H-=-u*lDl|NZK+Q~@Co-KmeWe%0Uwol$r{9H(jp zXsFpklihu7QHmu*Yj^u1;K}CMQ?}Qt+)Edcoz8I$%z%mWp)cTfY6^pztrCE*M3<*{ zx{qm1QP0a9!rMU;J%8JL8mx%c zP63OL){7iA{vinvJ0D?fF}W6iHnDMFXqxGqA5UJ&?GIs1GG6nA3W@=5D1|V?(arLc ztP)nve;^?)#kpW8OhWFDb_cegtX%M9f9(uKA*#Na)yD5tg_@E$)oVu#WMOpEztqD0 zO9X%v9#WnGXj>;H{=O;R_al>H-e_AAo{u0<{O)v?28IWc!OyFyAdL7-lF&TGB$Eqh z(7jK8%zTMoVCqnhOxOM%B8YM}nIuin%pnw542ZnMo75G$77QMZ-Y;R{PNa5vMI$td zlE3)E@h$VeKNq1u9JXO5ks>Kez{A&#emz4lf;9jxU}2>4c=wr{{umcML>E+pG?lQ( z;Zbv=;Pd5$O?+qp%y-R1^yqqPUdL0L+>&GA_wR zZySI8Q9yE4_65U`OHA)YpIC3w z2;G?ooPdT7DLWUOL`@+4N83x}6 z{@%UTF^jc>X)FXl;4;`61@?VL4<^5fH@S{fSBF2b17`E&c5y9CQPCl)5UNXJR61)~ zNBl9%q1D2?_oy6%v8_aK?; z2G1P|{svN%MtA}*t$d^@N!k}3qXIvXQ3z{$18`nU@t>fmX#H#^t`fSyVU6YbTnoMW z_5v$Cg~}LJQyf_CfKA9(ywPEj%SBGtud?`36q0!b02Zo$5;Bh8Yd}7N>wZsOJlyqf zGoROUAV1Hm8PJ0A?iHjF7l38seIK5>g;I^>KI5PUmVH1f@beEe+~AR*xo;0ZwOxZ+ zeSsgGO;>XVBl)OVx8Xv4IL?9jFP@Vb-}mjrfvh(&b9~j4R;q=2Kz%QN=EKyvyI_zk7k~(U3r*TqQ&bYFYsj}B$R|PTY8U}$y!&*?397_Pq3q;ClC4`K_3(S z-rC9h^b=C&j}L=$NF%PxS-e_E+eC*ZsX1kkwGL3!Cxo3RfAgWZ1QR!Ct6z@$HZ7m? zdkk$EG7g;GzFXC~ChSfa=Fz^q!=OOn`L)K#I@jXqcEApix#~;`NukRyG@aiuszSO^ z-$@zMYW*-9`(~L{-e@yXlyyW}8W9QjOc&7}J~}H`Mb90)TQ?QB{oJK|KQk)I*e16n zwRVaJ^LlINT*pB*&3Tpy5+VSj!`21UTZd3V$HHJ&6STBMN}9B%+Z!C`&BFezhG81g zG-n007~`*F0=h|I&ySxBV|XZVy$(VU6#iPgNesK!t#)&cZ6R_#Djy#q@d_UG*0VJa zd{(6k4W{x&=YBv{Q3<#Yhm7*T)CPmw$4ePzg(t=(22jcx4c*|UkxIq8?sZ8&KHiW2SN!0Iwvy`H z`Cw@z*zbfh^Q7B!{x25bKmZ;>W-3IxX1u4|Kl$mPXdJi91XMl z+2x(pKcBg;6>_h8;9t6a$>l2MaxE{7$gW^k#CsYfkeza$+EW4gS)Upi)wX?(w6ilm zDM-`Z{MWQeU&@9Q__rx#w1J==O3Wl7^X5=OyB``*!n#k}HSJlaG^$jvK8#6zLdnZ{ z|Imyk+pbC~pNgj_FMo+L{N?Ms$>WTJ&1!YZ#%PZb7kY@Lr6nnH7i)TF%uq1vw}~82 z(7<^Le>*FEQe4~tGwt{BiJ%pX!$;NMYxjJ4ZGpE+5E@Q)B*?uC1{yi};)IHB^@;#~ zUFs9?wI*fmM`nb{!2K&b+@GU+hws_w)JYrS?C({sd3( z!^h_PtF^_h0VKGktC9mGB{{j{BfIs(M{zBR8<)t|)3=Fv1vqOqcIHBfeo;*S)#vcl zZ`&q>ePfslhQb>k{#qKhh*;*%&1yp+Awnb?3ozv9J zvf(fl=bM#E#VfZc0z=OuYL>+xUc9xO_a7`yY1_}p?v5VjKVIBz96jH`X<*udR;em8 z%I#Rtq0EZh%bzbUH|ic1NjcoKIDP_Evq>}6_O3K`}wOBe|rq>dq9(HxMZK6v5=441!h#}ex#)hS{Hf(DSO1TZoQPidbp z11`P3%&4d7;#6r%zy%iEU#wXr;9-|UNjrUgdW|p_nxVOC;yRqXtLcdb`FFOYtRs!nwrih z9w~RWODLjH(jNyiL9D@(Y)=%ja__@lS;CnPF_{*NOy3W#!27qXlIJS)%;>!UBiMTs z4PI6>oNeECYj4CqJ<_DDHZSy;qEMp+vTeINI&mKG*1FecH}OsDB=#@V9I#O%(n(!? znn{M`?FaOIH}=oJ)m);taWTH+q4fUR5>ma>mQeaL5#nQeg(b#5wiZX#PdWuU_v^3u zbU!d7%zk@dcg?D)n~z-55K8l-(|EQb5BndG4T}BP<3Niu3YAPU}v^ zIbbV1+~W$7RUUUOJc}`UKOmazrtjrW$>>B4%#py-BLDnqq-q2>PpE;1B}E@V_Qza~ z3jwUgW-^-k3=^HSj`C=r0-RZN|81-H#^tqgT~=fmTm{fsWr`Ei+#3me9eL?;E-0e? zYdsrgiIFSwFBBaWUST~VRUT#g6?I`Hd4&#;b_T!@AmyO28z$;zHwZ ze*tIPFs95yzfj|>lS=?NY9T(kF$k?4389saeV$Kiz~%BrSQ0?gnZ8>g+RO6$G+g>+ z1u380$F){ zegim>5qjodq^%XL84Q2h!BAkT^J%_gp{5!1Z(gB^)Bu*B2*l|@O!ib}5DR5J(G`Fk z+quE*&E!IgoU|>r@v9ZbWg2jep+8rRl}-NvQjJ_zBS*=rq{d^wr?;?bCmWLQ^jp-< zY@>l%V3Azlf>9l`K&|q)McWKg!!&{yo!)**|A;JK6z}DEk0%Jw8J*~l z2>}g4BBNaK3-M2R9qz^|T9F03DtMIO-z+~aA85~$a&j=6@NzD(_Ds$SD+!Plq^_)( z?K}<2sl9v>of>-tY<~G`{?^W%{J`(?%eWLo>$5SuKnJYSB41WomD#&V0+?q3uQVLI z(kX1LQbw!1F=5401^nHDVN8}(_seLm)seM_k7Ak9_;keJLXh5G&%BRJCE?1+dtGvu z{5mo6l-gH-r!A?VBQ=al*`=6($y=~N1CJsKgHlF%G%VP-A@Uoi1Yx1nLcu_8ZkwBv zBNebeB#uuDBX$2OO5b09zyegH_FXswHJ1v1QGZY3wBS8H@PY*VgU;#xYPbqYx3+p>w;W=`gatp`pnQS0i?1t z$&bPd0G?X46DwduO^FN-&}b9`-M$HnVCU9QdF)2cR`q_oCJs z`j9r~=_A`&0phO!{Tlpyv+TjYkamahKt=<^a$VITn>B)rjir_Ro zSl?K6e_+6I+86l0u?!Z@bs5seg>o|jGFwt!%SQ1xv>9L-fA>9Ux6iRFOj+zli#V!JTsI!vPnuHj{zea?~#jU8b zi{KpZS%IHw9H!t&kB|$bu~xV%u0t(mJ392qPohaJ;maD>%t4I75)vT$jXI!gwh1%+ z>2_HmxV@@;^IIZ3!p*Pj-h300mdZ z6~Mu3@%^-`{)YE(t|R6))!n9`=9OKzgT@8?oV3t?=>>Z}1TxfqOKNtEFkj z;p0b_iVZTe06<7gEc>rC-4B^ipqE6->UIMk+V140Ceu{!!jcMJ$;?Kq zE@wr2vZ(5Df-@hX>`cfHpHgKu){lnN<*hSk&gTQ$gsh(NHT8ixW^m?w%uwv(1|6K-X0xGivZ2d%Hfm&0C+Y@4KXU>)nVXq{Q19p(6N`IHc| zV(-*PJtaKwux2iPUB!E{&Q{mczL*j8Grq5@y6mmu)d;<2y)sWaDyVe(3v~uejCC87 zBn_Q5@|Dk~>uA&qUKZqC25LGhkYO6u{!7Ppu4qM&&<3BQ8Rg?8g1hrSid`0rGrd|fF=c$=JVSX~Z@fl4H{AqL$?xl$qhg3apPBuuS%Fq#A zR4~sUKxolUoi=}5=pr;@+l@;FobnCfGK@`6?7q2x66|sTgV&)Z1xJD>6!c+WS%Lmg za}=6uFulxr$@)ckv@qgF0zM**Op&1j8@wZI`->~Iq~vXr6g5~T+tPyYy0uy75c_#H zsOZus+1H|dYu-F7P77w1aw>uMzIZq`K$WJ8J|DhzNJp{Oz7@C@P)!ON4L_VNP==h! zsDX38_a%%y*MXZ#+;`7qRZT7X74xCj!UYLrzt! zPCNC}n*9AmL{3@HmZdfO148n6w5+oCRW0o!IT!;|l_2_@VoypO7mMUv&0Fz|ApU2h z34tFA=U=%~T(nYOC97xOTX~#ab-#RdNWB-5EsCy_us2h$g2MO8iRnp;`WR!Si0N5Z zazWuH+!8fd_KflLU|0>>_N;^wq?8arU-GzvR+_9t|7M*rP2MFU z!&32%oBurgM0rpI6raV)f)Mg(KF7lg9yEh8pnQgW98ej?v)@CDT=z-OaZzA+A{dSk zT5r?yM=$q?fqfYe-Q{bDV5m|NY4ojg{0NK|6YxYUbvJWc(Ehsh69rrU-~mJz0sDmX zOdnl|5o~k>)+YmK?ec8GYhIk2-@)riqMD_EpD*aP;7rpTQ4^r%EYMYt-73=bFyP)WBi4E|<~Vol`5qGL)XRrBuMM>XUVT?b;l zAw#4UpX7==DpMl0SH};@KbDn_f&lBn;in4^!;4Q4sHO@e6w}9Xkc=;Sv;I zi%&C)+Upn0Hwyq#shfnsK~AG67l_+4f;cZhT8jrnbeC-8M1nxZnFHyBvfQ~Ye z0>6KlGj?2JuObZsB{&F}9kB%>{xt!cV|>|k8@?@dt2jVcrxr)%(^oVN0r`u>pNOox z6wL06r#ee4K!m0j3z+K&Mu)#}*ni1_oUWa&tysr>=~s7#!SnY_&F@v+e@m#Xu^bgxT4K#UJS+>{4NttUch zVJfe=%26^+xK$WuN`Bxg2`~aF`2w!>BfpQpyi|057};3QPvT*Gz{((Ooe;)GhgiJ# zG)AVg-@4c}B1}I7@QCIi$?5iXn{AyJ!{HEkla71aBJqJYh>g(84-+US5?N(I_=At* z;y$LVUlBi2brIa$V09%(jT3aqolX^oh z>Bnc`)iB_C?KHmz720AKn)~uK(~kN&q+491n7amqAg^ELxJPv#YOaYh+yzU`Vh54I zs6vOu`H$FY9Hapz)dnQEEATgN64eQI{MdW=Km<06EIUGjC&W!k0?dz=y^9>+s%5iZ zv9K-(yy$xjUkCTbn%|59GmxSoCT~k}Ij9HFXxT4j``d&D5CGVKL^a8q(2{_Q(#<`tE>I^gG*ALXF( zt>D5<9YbL))d{bvMwh|>#c8U){=$S|sGvb_mFehZ;;>jG9nf5^YZVF^kdN`uAc>@k zXfnV8*+mSB?OXG<(ZVvOW1h%>0o1v!pP-sEl}QL(IPuBsMDl8#_QP$s>f~eAHKUBn z1O6_;J0#UTAG3fIvT6D?hi~0p0($7fXN(Yd=~wJ zatDt__*&r}>P?BY*#5cocr|Re~jtmfMyVS*iDG@D)ulL!}xz`!= z<(SrBq^G)DqxZaZ_!-x&`ZwC9l_jko!H^- z^zKt+_whBuVC|=m`+ZMOg*+0k-)TaqsVjyusJ|@`c(q*FrIsjc(sKCx{)g;)ZiLwP zChkpnITAxo^!6<@dV+=%sKraHJwMcwT_WVMp>cVP0d%TJlq8JB_2fmpu{PYi!u1jHpCQmW51yuYMs_Aw*Y zz=R)(68`)A;@chYx6&54s$QM(FytwgNw!77qCd%p+ykIe!1lqgOOgT9r3pwjiCgOo$<)Dk%SI9cKFsllbkuB1XTd|NvL_zzIe)DO%u{4!%W$M#VrYp zq_~4h66`X=cKu55>FWJmG#4n-lUi!+soWxm=Jo|MqDmxcbA2LQE$n&S@BV24(?R!3jy~^rE7CyHFHc-dh!_@lnh3R18R~|5qUY7uy8J5>owy&;eAFb z;_YOgKM8W{HQC+c7lXB)^NR3=%o|RLoi-wi&*^wq@TyY!V zHbdBOkHW%(D$A9*Sa#fEHpS>jO8^*siqnV>HbY z#F5P=cdHR8>(UdluKiAp&$V$`_0F#?v#1->DVLS;&gZ?)Z)+XQw?)NypBYHMoT(wI z_C@AxQ?K7iC7RZbG)Kc6uFwhlhUWLJNWA(k{5sHAR-Na+pIlg{gOtE2$;cL^DP{6+ zi&$d`LTH#-kA+XB(qIV4unZZ^acw{v+WC!N_RXN;e@I8@*w7Hq4%@@QDs2Kp+z78Z z>K!Kn$=OgXs9N_^kj~$XWXLmfzh1Cy2Q^!)iXfBp6~$P5!ScQoMM%G){!l(L1xwuD z*RFN`0(LO1z7-Z;)&;$hf6{o4wk7cwV^bdlkjzo?1@ym=%p_pI>E*zZQPnX%bQphb zZ{6w973D8~>v-6f=hkNl8)JvkjTH0il)08)WXt$cdMd6`=2g?7g>qsh5FE=BJP(JD zs+Q#*j;X+kd?rK@+Q``$EZ%)rT74i*89Fp5>G#NC{}o4><;#jHbv73&K~2=mCt4%s z%A3}pecdHo1^LTG0W%}e<%m;<7!x9({0EjOl{n$#5yu9LUBp+8Vtgeie;sZHjJi&r zi<14))|`|M#B7Sok7}*QtTn4!QoUi#h`Dk7hW$UBx&ngxt;af`!LUYc&7nBkr)O|E zJ@44A0X59EV|d?h@fFA(viUE5LhEfH`7)n2zF<|1cgFs^dy$IVa;@~meqhXHQyLVT zABANKmS?Twsf`m7GOu3{-Z=B@e+zI2=7g`8lBfOSz#^z8`$aGcu8xtrzT>{*hgc&U zpcD7=<$i*po(jqD(O7hznokNks{H*(yhoP2^*XO9pPB9?5smD0&oqv9`R)r~w4G)t z=N0A4D^vIRttqDIR-`Qm{vYTFbEn%B0#(OB)PpC}VEV#Tg)CTYJYH#=?}Nf{KBmqQ zx++2b(AvQfAhLQ>QrN$>I`&Z4`#H6VPADCY0NM=fy9GX0=X9qnMqKWDa;I{eq{?yo z!!au?TuG|ePc5Cp;HvD~VQUQ(4v-R%0>R3Gkr#ODa2V9K$d+3h5Ur-d^u_NVe7muX z=iLJ?D$wafd1*>CpSs_`D{yS(eGuWsvoXl%{37(gIiqmgL^jIRmr zWEJG)+Ry&6lu?~re+vicH_psc8%OFBgeXD*ta(cugy!RyfPz8)PRg?eF>D>@&J}G06Um{Udj{>tqI;N#qEn{}5GYo3S*HjM0oH!-Dn5T($Dh0*pih@^5(&0e8=yH@&ubd7S>6Hf1>ntKouHnEn~@W zsJge__!kkvyxf9IxjDac74{V=x z%y+l;W|p!&n$e8L`1n$YZgVUTX}8S)n1uyLmS^AV=XJr8&MxRM2$X{+xw8as?}4`$ z?@5k3-?(i{yAy>C)C8(2KhFD&dez~QaTL6E+vV8wqs4ty11tIB|^{AoBP;Xcb=M%5z=6ifg$AkK+|51Xjf9$ zj=QO_MYw9GofAV4_ne_o^jr_iRIJ|Ez4ZK!{Ew~EIU!7sJ#T{78^nPE@$XG}q+(x> z-Wvw7VOP$6Lr&Y{qXi+!|eiO>+cQ+e3u^B!%Yn=t?0!G{ZP)Uq;~{F`98Oxi*AD_DVj~gJWGxiRkwHQm;nnO zjz;WEW*=%!eCpMto-b~efw;~>v8`7wk-fDM*TZ$rPaU;M%m@-7fq>OzlfsZ8O_gVg zd99|?X}~m%3~*TdG%5hc&t+sk)eIugW%70Av*?ukEKjw}@ilYl#oLDRzH6soFSmIf z-9?JBhP|?pB71*g_7LONcV_$Y>4nTQy2{>Bz8H=YJR-;_30x)cGdMzNEEqG;q?_fY z{#q>&INtvTZ@$6!T1Qmvv&HKPKeePnA6yGM{X4kgV>mT$5&ZixZh2Zn1id*6W#+rC zOV)cGgHPuM4Vm+zrr?@9&qXZKvDf=C(Hv(Nl_&|f0-sy>g}GSTl|erCvoGIHw@zn(n7r*0;ZWBUH95*)AXBPj#X_;K!3}y`yzioZfej_k9(cp(%85G4BmZS98i*1 z(;^K$r6K@_Rb{|M%5Hd-lcTD#mNIfExCVbW+-l}!0X`Vd$TWMXFd%-6?KH)}nk_v( z`#h56pO(_%-|)^dV*|c7aDME^xY+8_OXAULEm<0@UK5DAh9qDe=GdFp)iA)qsMg^7XE<{ zFm#yce*t`Bc~wNtJhk4_7`UlN&=9AArm;|H2mHzgqT;MQKf&o&#Gw$_B%c)UI~5#^ zsg{cM;yW2OX!7%fmvDW=k9U8qGEq+W#_*R_H<9)OrlK43NjoU zI3DSF~ZxH_%;$2m5RQ0rLbw1K*@3&7z59$zpc6@=WQS^1rMy93C z>5c%D-)~)f3Ejlj`)df+V5QV?r!foSSMrY@y{)u2%+?n#%VM|D52_|ccej}-&OsIN zM%UW>BmZS8rCzCnW0ih17zYhdC3MANm}5S=FQNkuOWw$Z_}A0Cl6nf-Ybbb0#ugJ$ z?)d()E+chBmGnrT^}T-FKk@!RtEYNz7K8FXP%<6HMtTA;+n?R5;0fiPbf^wV$F#P9 z&GK#f6ljeE%TiCW0UYpF>bqZY1e4u;7x}tl||K zmBV(pti+RE>YX>v;Pwx)J0LO_3!G~hx zw%ov^{%2)I$@y4Miof-3ZF#2}wJ`zZfC!Bue|q`p!fdR0uF=!%Ir#6+`xedNcWx<$ zRb5*KheWVVE2DrKhH{^dOjhR_VUvej4o)P=nG{2*`4S6JqS|UD!UqY@KGA`?5mcM-rav&e+n(*ZUlP?SQdH3IHDZ5JfRGndM0%hWlwT!$ z`s1FC1U$V2%5L-$wX;4Nki>o)!IAUX33(-h@tH%8Env8>sB%1k2~kC4R(C(5YDP2m$)C@MrGD_BS8iXRNY|CF@69MjN5$($$!wH$e=0w^TW{?qb|d{yg_-a4u#$KANwixCt80pNkh6Kgw6 zZcz-w1w9>R=IcBuT}>P$d>5`iMu}6?JeHj)3c=_Atc} znUM{U#L%k`vSodqs$L6Y(|RdDWr}>;StS==$*vrlvAGjnM!%1md`OU=_9(Ohx^LXlHwhti36`fyIDdN~Mx8>9BCbp4R)f>U<1OYt=7C3VqW8kE<&l|M5QTpu%S*-KIDa zMfhD3w&FHbfz8UpsV^4nM&}bIxBXuWwMT=AY{Y*B#5FaM^ZT|Cj z<|xncG-K1(z@{lzKRY4tEd0s2Mg6h5<*PCFfkS}EZpb@Ez)*+B5L3Q_7kB2B?tN>g zv_S*LlmpQ`8i0m!i47Q)aZl{T;hID_g6N`2(&U!aFI*>xYiq=rOv&rov-MCTCdkMZ z1`15&55$$$CaGNBKxb^@kvTyrqbq0T4=tMeC;eJ@c#>geW_fjgZtEPfHplM2*SZRW zk88+aqh57KsN1&?AT%U!^mwkpBg9Q#N89ra&$l|x2ZE=O*iDM+9~0%%e#K0!+y+?k zVXEJWcSb$K!vJ4#S-$hL8y|7B0J3hlBnUdz1L>c$v((=0EM#;@rt)mWJm@HquT~~~ zT|#e%F#1TR&UNnp7zgWaWKk{XyufwEL5~mbw0EUIq?e5`V%NxR{H5 z{^sp9zDhfQ!j;3pT~SZwHl9@Ns3-iJ?I`|7_6&bFymR^u7yeRPR|5kcakYcxCP5>J zcanqo_p-Ds2+L4Z7vxKTa5MODHaT4_w~d7N%s=18ZVe9lVGpd8%3O}FF_&ZDL~;Ja ze$~wU=NXzp{dUaCoiUS&gZ$9DVCu)841?|sXkau5l7FJ=5`d#<>;69FhY@1xcY6_) zRfIKPx5@7F7B86W75Xdps!Xn75YDy387$=o){0DqEpH7^l7D#X+dO546$je*wAIwP z;R1nK4l98ebG%d>iJMWQmV3sI@$X#rhphJG3live8*sQ#9y8vWN*RQrLHgl8cQFDZExK(hJg44!&-T`0TAgxh62A+_2X%akGj-mv zxGs_qD3rJ6iZ1C5pZRXO?3hq=I!0^ysqTCBmsS))+-G|o?6On}aXP2N8L!(#d+>f( zX1$c%IOVC+pQqagz2zlaXsfX585(hwK^~KM;wOoY3S%^$;jntUIiDRP`$o4j+@0(G z1*nfjW_KiiYd!H}Fg93826}B&p1x+kzpPDlQ#f+!z2)LABY<*D@=k%2SEmN}4j~*) z{g(EJdFJ9Rg>iL+bD+vhg#Bk-HN!3>Q7wS`i^I(AdT-g1_$~YO)iELuijZlC{0h}> z`{J;FCrEQsxP0n8c72ymj^qb zyDht6b3oN6UY-MsvN^}>$+OKoIFzkF(AEWoI@#t3Pl&ljYFp3eD#z~sPF$EJdKd++d50s%~2{T>}G zi7ZTyMuW~v2)v4I2mfK(cSN(^0FXt*qmX}z15x(6P0A0;pX-axg|N7h0B3ff_>&PK zQTjJJ2j04T`D-3uCop0lQ3|+wNv8`=EzRQ}gtVS4oh2V99d7xwC2)3`p`DwCX1!CzpqkZx10Xcd^W*^3o`(CpfupO~=KW@not!TqdpG@!XSIrO5S6iX%MBE-CS zml%HkDE{5=$G1O4bsaz2H3x3IJ`EaP&`6Ixgn@Voejj;Pef-qb)zy5v#iB&xQz#*cU+GUbz4v9&*{}&M~rPkO0?ZmtCs@MV{D6<#&hk zfOmsrdxEZtksb8Ha_z_VaMiD~DY-2{V0G!^HBX^%TEA_{lTQiq3FrXi^;qet* zh7RD0I!Vv(1P&xCJ~x5e^CrlE>k{03@wc->48%y5S`T9PCyZ%v`#xI_j+q-D$78J) zhTV%3yo~IZXMMpn88FjKWJ`(7>+sl53Pw+IX&NDf^ubi=P#$v(UNV@VMZ#|leK53> z=!<_0A#xf3SFOxqj|t1{DGWCY5M+baDnKd^w7H@@F|Ct8db>CP3;nlDO&Vg&7v2=?0e1pq_|3q#v0 z6+CgW0eFcsni1j9v@3P>D4ClwK@t}F)!cRr#+}_TQ_82ZD2rZXGY(J}ABwecyT2{- zdTo5HQXwjb+v6clAVkPFw&)om;e(eInosUG;U`NtHu+C#8y4V*7sFNkA0B$6W%+l`}lo0A&|R-j?Ncbu0y1j4xx&r z+h>PzSTt(DR2hx~E^m6&iZJ8=L_Y>z(;`>l$$=^j0g`_p=~8#9Mavf55Sy$)7XknThyVQ-fUaq6nv2-X zS#ER>89RGUb0)sMTmSIjENzxo9iX?+6T=3;BMkJuL>vGUf3dRV01(`;Q$}n?+^qE;iIAQBO$x8%WRaDC8efgBnkz zR0W?TZ-Jmv7{8b*qT&nI-fTTl2GeKNYn*+HtX3On_MK3AQ(a`!4%}M6Yf7|4%&Nq{ zVN2VNqLI!o^Cn!Px5O$D2kp@juV3V!w)AatW|UQ*>%6p zv=`u^U|E0U+;`(8V_R99+vN^8soOYM8T0D$)z&@d@Y8J zwrxS?mBhiNytt+)b8D5W|jz8 zvR>u(+B;JOTtUXpB5L)-r|I^eBy*f*e9;klZZ62$u|~kwHpnuL%?>5bsO)nCS&DMou=Zn%|r>$zLV3zPT4} zsuQPOESYCH<2@Ah6c=Lu+?l_bPhXeE7YARt;$C2irPGr5fjHw*jc8 zVgmHDD$#LY?Cbuy^cbDt`_eLesP<1uE{2!U;GiJP`99QZ{uQ$o?*6`ZJY zK?l>ez356PUrFZ9r2<*a;Y_HePNL%cLbVefZNG_~a@~b#aHMXL6 z7`-gxo}Ae}TRojO;?vB&H%WhLRSHKT*Ni3~^&%dp7e5RjKl=@I4 zufV1RIQ{tKIodUtV9Z(%L<3s6CL^k{T5^ivwDQ(%xu+=}s3}?w;%Ic$QYo&OH2>qF zp*eV~ek@>51B)O5gI|;STB>1>t{OvyLgpMoxMX_m&M5=+bw&3Xl*>ndl;v1rDe2u+ zffJNDcs&NF;anq?62?sfC|2RqebV$HwL&)yD`Q3#mXiEqV;^+7Chtjj~fHl8@&dZMnF+B;Ah+a)8Acw zRdhyEmM-OzGHUZ4b9Qa$cX@_Wn%U7IpB2K@Vc~KcH#9F#y-L~W#^F}jYdv+q^-+#N zDoD82r*lYH%G@EQ_cSwjMbW|Yzk0HtmOax8+hX#N?67Fru`*4?sMC)thYBO%10t2K zf{j5V&fV~WiVhX$G2^G@=`LO{}+_w*fM%S>k1AVVvo>~SVhn3r0i*v^~)2T z6^ikJj|MC{hem$neh-z1L%(8ZWNv)&eDw*q3**zbudP zf5}m7p_;dl-Cnm=m*nXcPpHa}UQv)Zq7IQ@pRvSTQ@(T~g-L$k=!EvZv1h*LsXM8d z`k|sFO69t=IihmWwmPG8 z=$3k2vd5pR#D^O7)u82)yvCu;Jsx9uBiD0C;FXV|UYiKbRC>P{Z+ASMwRi%FK9 z{7(beCv`p99j*h=6mDXNWVx&Kl?zMLRExSbYy-TEzk^EG=qwVjgORG|e#EsqYdAS7u zYHN@FVAu9BL15Z|-}s1tv7<}Yi_U?vZ8=W-QP6_XsMC@}8&k-a<;aVipGNOb0t6dq zT^weZRK$gUbZK46*)T!Bysq7ZVM^b2XnW+p?tom8?hZeA*3SJW!DwhGVNQ-_JZ^m^ zD29`f9(!w(L-oTtxN}h zo6S7#{2i_o{8v2&^8iu%7fx2d4w=Z3~r&VoJp2!)T?@zMQlw8L1$n-Jzea z_NY?t_t2k@m~lnUSq9ZfxuU&La5+kuG)J)Vi091Acx zR#p`pIEZ$IyB?i8;o&ASh6`C1x)eYq|f)I>6$?uULY6Ms}zG74S-%Qq;Va@Hu`gdcMV zaU&5sRN_xC!G-V0FQKo0JoYdyj{CD+kG&mu_{arY->wnpZ<|2H8ZJhZ+enyPF`5~( zwpZ4cOUUY9W(IF9q-6zIkd1yls|W6CgMM6ec>!^#CPs_mXfh*mdrC7Ku96 zY%1pdvym4J5Q+YjrJA_uHyW7QCq)!KVTSlwHZ}srIcrs?$2j zfmvzKP`o&>Y~I8yq;4Z?7|>sFE%j*JZq!Gs%G|C! z7g&J73Y|40YoCoMwX5>Ai=PdE(Uqv9-cX?()qe~D^pDfCnhc~sY@U`QXKa<~zMniA zec!QeNsI~U#|DSX2(&~ktCOgHkvP)#%_jmYZ`NknDuD>;;`@a&QQ_AIkWY(`;RPrv z#suXBF`U4- zoVL57?%=T3Iz&}?GS25bF&8#tDOPlR2W-Yje*Z!bCLYV>VqSJJQZ3EC6JCCY;nQf} zH(5Akz_Z4=kKd%6$s4RgOnzox?>PIwX&ZZdP7bUPWyzlX|7|me+f=jKhq7G62eI<` z(VyM>7)DDJFXy_{x`mo+HRMBQD||v~8j5}|B7yh6h1s0>Voirzn3bsJDw&@(;!Y41 zB5uU*WL}wLDOxx(UqosA*eM2fFl_ns?_69nmj1Z_R31!iSi1%>1|T2+1t2g0$_2oL z0G9ZZkTD<+0{?3u#zAUC?^t(4-Wz%MXJ@}YBMpFNsDmCjc=LrRi6fpaj-8kBhm zvPs5`7a8(VhHtTazvr%uwYfYPw>E+({$*WK;`%(eTQS!qRR~Pe7FcSk z&w~c?yN@6Gw*ynhaxbJNTijg#<#GxHym<3{)n7#N)^|nMM($RRhCP{*Cv06C9UV>< z6kJLsJ+SWNz{@B5F--M7ybH= zB|`)B7<)ZUTRpTX9hx$@^-+>FQ3CL`wJB0>)D;>sdfGw9_gBcd%SO_~`_U}g{sOn? z8&gKYc$5Fbv<)0JJw{K0ShpW3*X8FR`a#mv!@~%v$n{_V~N-;Ma`x|X-zYk4Mb2@O62LHooF>owseQ~XeNM6JTEQNx<^h^!2fVki{ zmo?(pSsGRXBTM8@?wIc_D-zb_kxg!fv>1Sza-J39Ct$B{YD9-{+(BTK|Hs-vV@xGg zQgqemGk251_5phVw>)@@qf)eYOxd=lOZI@WzoYY-v?u3sa$2TYl$-btvM)#o!AC&3 zKtP10%Ot!U5fj)WCw^=rRLlb4mZzoL>rT3#_$k1s$;bu9p-6+4qMDg%st_PIVW@0ZzL~Cg>GH zM|dVc^85SFXO}Mp2KAIWtKZY&WUAEpGSr6@`&)+dyRipPiySfwZa8-VvWNJLn$>~~BR;%K=F;O12Vxu?dq?_y;P_8 zick24lT!Ie1AjcLZy;1jaU5gTq22kUB?c%P$8$g6b*JVI!PirDM^*>XSDmaDsqB?T z(hwNU+A}yC;~JnFIe+qW-_>c;g&_fm+6LK!Mi$q|CTc(Mcn54uu6$hdIMUEe)OqlB z@y#`NpjU+QIbl!uBML}&Tq*Y~w|VLe1j^>9T6kYAdg{E*jyzw`E*rO7VDoKwJvQub z)9%`Wf!c4|5)Pf}#RP(}9@qLw$V+no!Y8g=r2O?moQYNO)NtCCH4373zUJ;w(ZhlW z`zL(9x@lyNCZ|it;;zR0))+?Vn4JF-Vm$?>*)47?90f#kYlR$oJ^3=pAVo&bR{4MV zx|&k9s^m8QWVa3JM$9ujguO^**JSOO;0L#lkNQrFr$2)T5mldeg^4;auQqcf44mpy zGmlaMktYu;SlPXH{Dh)#;V%p54*Z7vA?&~1zW>+e_D8Tat%RN~66*S|(bCN3@~2Dg GPyYwLpQm#G literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step11.png b/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step11.png new file mode 100644 index 0000000000000000000000000000000000000000..cd8a232dc88e8f50973af86026d44b1510106f5c GIT binary patch literal 20531 zcmdRWg;N|)u<+h-z~LI)-7Q#f4Q|05f;$9<07sAjfrQ`$g1ZNI4uS-CcL?t8@a6Za zzV|=8t=jGFo}Jm&*`BGcjZ{~a!$2iL1poj;L0;w^03iOm1&=`y{(;+EcFTVN#Z_M4 z9RM)9|2sj6teB+#h#>cOa#BFW2-)601Y#qpA_)M$zM(yu|JPqtU0F-^<>h5-YwJ^U z@a^sGyVhSKA|jEIk;K2^7f!bKuP$z%9{ol;^H!$eOPvD)19Nk8ZEbBiL)o2s>#09} zl$MsdxVXG-%Fxl#Ar2W5iI3{Mm^%glDnLO-Qp;!IaCzQfK^-4Sovw4pK4;=4XwnZ? zA{Ib-uQFgDaAZSFR~K|6rb&SIkC*==2Lp{a3hW`_l^ZQMxP|TIhiA335%L-ZLX{CC zE_S1m#&^2^fIcZqA-x$NzKm#=E-$ermY)VFM-BA=$4WJ-bX2aH1I7SD{uT^w%p4~J z275EFV!=K4J^?qhi&zpU&?Rl4w_g%$fQ>O!naEy=RynF*h5{YZf>sN*9Qz`(MIc!d z!!~OUa$O(aJFyU@q?YNKzB2Ba1=zG;@Ff`)KiTK4&mbbg{39xO8~)d`zu;{e!$quQKMu3GCOKP+cG;RygM!~A1(^%o zkhTb(vl8Nhm9qf!KK+1AM5)(gh6o5l8cnJ*tITWX1x$wsNZa!W0=ng)D?x~~Ft{V_ z7(IZU3*=66##j_~0^a&fVLh;~GKkwc&97wdpU@o<)c;ANC|^O!W`VhrD};@mlI#(X zw!&vm@+CVswGM91Sh)*6u0iJbxrOc;;y1wyJvCLBEGaqgYbrY^DH$2|NN{sxMn9#@ zUzIy2FDcdhrjm|^FeK;2Updiyj9aNVS<8x8dT)ueO%2S>bO9IY8O!h)t7VNGZS7k> zHAr|a;!g~Wp}c3qOy>ELmCMD1aBUaJwhBp837n0$5P=K*$!W9F8#hlJ{1XLXNLCM# z{O4|MW|A)?&;2nul`XOC#VJbh(6FJ zUsnT3sdO^;ZUvtTg1;@SU5D>gP;)IlI=nvm`1n&1&NEb+f&waFck#nIRcet@;@n;> zP%Xo3S#xbos)ND1!wkx8c8(cdl0x!~!N+~}21E!D1`d`ux;HCG?;7rO*^x^Y3dx2L zSzloN-f(K*8wpm2xGVTFQIA1UF{mU*1-xbje`~KkvXd)XT&kra zNolG8RV3wle81BNTjwuYfG;Ks=Knl8EUsR>5hoJ ze^+!E7hJ3ErfbMW3kYNe{WcLal!W!O_>Y2GtAV8?SlaC1GBHX@^;iMLYFklzHQ1JS+FPnSvBH$i?f!4;(mQ{oL8|D@R0P zU}oP~d3|tD5hKb@iVs^?f1FYkH2YCqCXmU2WX8({fEdaI0M28CH-;b%!s|~!jVCui z3xWX53Q;5R?mJJSDBxGZ!|!`)J6<4u%xWzF6muSQjr+kxoNg zXeRTK3JUcy#Sp3rA&vrbe zH%J@H5BHc!9?}a7kqM8*2Rpc4goVN~C@EVYW#L0F;g9|wMN6*E%WCoOZA4nzI-dWE zPwynJA=zQKwLQ&zgAdyC-9MO?uROXwnQpk>NC@54T-*w>ffmm>ry?o81zlzCh+i}t zlv8-;t0u`lbbK8yI=o$~zM1ZQ5ctfsqElK3T9vv)nB9E~BEops_M^O_&HSPcA{*MvuH#eso zLG3rI3zM<<_qQXNjHIxW(i>`e_f@&u)X|H*@y*l+ z&c(G-e&!oKgo6qp$H9)_@-b;J1r~(g&FEgZ@mF7ks3r&61HeH0D(mEck zP7GSKrp=kkSftUueDJ+`d6`t2ti@NrdFwHf9{*&ng*1^>Jxof2ZCj|m>ce%}qa%v6 z`@yCbKz*^rkQuZq!2Y@%HPc)jHg;`3ALBqpLgqR;5_|xbtlmGgm5}Hru$cPLvGp#VRqxG>7^tHkzwHt+f(_1 zc!WgOPc+eAC_e1gI?W9$D~q^UJG`$=>w9fpAKwlY`D|8UXEh^Ra8?7zW;kIAIJs_~ zdJ0a^vB*pRRYS{c0(R=y=D0cCUgf7}`$ZC18~lQhzT*aaC~LU2Bkpetzp2e^&#@lW8lWy<5*6i@9dJ~!^m z9wK&?XnDQZlE!Z#K_0VNoeo$OF_D5*SES2{%R*nQ>Q%#kE$hL$VE!WRCY&;8Cf=BY zA58QVGBiolU>2ppCw|}g%!WW{D1Gv%Ou|WZUa#0KE@SHNQ?0$29*=o`f7T~$xom7O zpf*ST&H(Sl%d$%ljp@=b`Htp*i;4BF6-~JaV?o}B_EQ6CDFr`nACH(cY$tt`>9HY4 zqR+Di&1gX(cLTI(#|_DW^z=M#;fSU#(@AJk`{*XTXe4 zWt#a|KkS7G(?}PHo1rI$S{g-B+_K)B~!`b~9fM!DMZV=q50zwH|^pz}pyCM-A`0xP&Bx+>23yJ{3(rCXbPRc!2Ca%^_V4 z&gh%H(%>xSZyr@=x{W>coN%M{WZOhQ_pt{nGa&PPX}N7JrITN1C}0H-Mj-_2b_(uz zcfW%pgFPs!Kn>ofMm8$qM}OR?B_0GB4uIs?6w!rff@@DBhl^cs%Zq&J+8mgg8cm;7 zftaiEy*@K|$bV;S^(Vyc8?Nf=_%!20>AXwknV-04a2vTm)@>L-%PbE|SU~vu$>Src z!}R|!^X;NE;&hcYZf1{gk-+FI?IQ}+wTT1?Ax9B1*zp+6Pc2CS%&UN=t~k%uZWzn7 zQR)+q*y{q@9DR?{eRUyK!61~BNFzZGP7aJ2XQ9b?ovZ8K?KFgfh8@A{$1Nf+3C^1u zF(6cSq5&HfQ}pl)^zp3NJtP+XcE0aY{puu}btJ#t$winQ;bW$(2g{XyNC4sqvO4p5 zk#?}}DiDc^G-|`}zOwQ92Q{B6SO3XD8QT^jd1W%%r!Xfu|DF)iwqWK?oYB|r1ggmU zFMJm5#Tp|@#l!0MH5}swlg>Ei7Fy!-y@l61PR#J2q5XP~{YJran4gqHa1cDghW#Op zqzJr3btEM#K&(iKS zOQqr*Yxf33eLiBO8#{fn7Df=*_}T1Rl;2}(9eux=R!NYP>`-q+F-3}uzw&q z!%-qki`j4dE@ah9DFd4gd-1YtCdDgl-Y7|#n zV2eA8cnpgRTaW?rxQ;5JIx*vV+$i;(okNhJdO`n(gk$DnSZf)X1)4fi3vbd^5RARE zc#f6NfY(B67k8qlen8cNc*u+I!Dw6Wa5L#x1*gru$Z>NY;7doE0bNhb{<99S&Z>B{ zbmdh`1yVCF7jphD8dV7!o0nC!Bn}$TKTww|3e)|Fr>=ae)?0YDk{9gY+l_?!LiFjl z=PP0(ov-nQ6zd<=*cHz-;<9v#nj$=zZsOz!z`f?u0`l6?qnre*x_V0{ivE>GH-#8e z<7K`e@1^}c#m{C=N%VuVgylVmzJi;>cC2Hdy8r3cUths6OvAz`~f~^-)pPawLdk747iney^1QC5n3E zw$XIUvEJ=&*5{c%N0 z{KG^))OCIvy|*eyY}rF}HcsbB0*}kuA}^K181wqQL3D6?Tk`PV7fC#nb#h(YRKA>L z_1(mB!Rvsw#VCnJ6{sOBS=yF;qi;TMT$mceOg2B6vXCs}Qh@)X&WEvYnM9A@t+;rhvI zQ0aaZC9ri+r znpx4+@lUkocHXB>-j5#p6`ki^rHy3aoo21pz=~>qP=A#X`TL+%Ei;#AF>+TAPrk=9 zZldU9=vWdHWj$c$U*;DEXnRW&>Ww|WCWn@_GcZUXg`Ck0?9Y%#7Zl6LRJ5vS-W)}w zcl{tXWMRVMG*nGT|0hDFRB`V0>I}Xnxh0L(d|SeI^-g@1IS;LsyB@xO{EMpw>=0R! zM%U2$R%~v9Sw4BKFRs@SK71FKM+$Mvcp2GpjyyFLHJ(c>XkOG^C{~Hd_;pba2}(jo z+N5I(Ag8F3TdBQy2mZJrKe^n;KcFr4an3$;(}abG zFsDc&tJRGsrPJ&qf)_B^U9_(*QzS^=WybZD)Tmla-Zbsh zRM-4`le{&ZBf7vEveC+}?`{EgYT1eIK#i*j)D=v#@mdLe$$GzK>`^0-@&y&LVH>7v z|10&Gs3QvD?#mNNGhS{bPZP$AKJC$gvG$*mGOxD-c?{!IA`FT5hbe3+AmW60U*3n{ z;D)P}l8lvp{y?*tU#^ydj3Y>|U$_x?GJfk+k~zKP7xD}qKix2K9^CsloH`23JgcT3 zLSMf;U9EB6u@d&KgC(l(u@GEbRGSynsmke$adtmDoVD)u=vhCutySKza>MUaKyslk zQ-wmVEvfm1=SEaxjM9x%;TRJ9AY!`+X?)Ony-xX2wOxsL7w6VWfY4-lXF7&8_%9O` zZU4t}!8hvb9S&)$UTr7G^_zoH)az+V!l_@xZLVSS$kyt?b-%Z|qViIXEg(d_9w@&5 z66h0|XaSp-ozGU>a$F#udZeXaBl-&bFH*mIY%t0`Y&&}LU_&V`k4!s!x!fUmR2DJ& zwox$XOZLg#y8pYV%f@66sxg(wyOLCZSQ!>whwR@CbMPuJ9Ths-do$iILAAmYiW1ui z`J?9>z8rj}ZF#HK=Jwp_%wegh^E(eASmLT7?tj`{EpeWnRBuO{bC!3A)#tg3_kyIU zs`85|MkEx9Q-Dz^tfMS(ues42;%!QQ26zW~wb(*y67*&M4q4nBeBaL(x82z$k@cFY zFsP2>N24v$=WAjmjGKo5!5|d|tV!hAClG$k$jzkk>Wwn212sozf$BTzi}vKK8o^v* z@qPPGiL9p+;hmXBp??_*#ir}0{@NK%Tr<5nk=*HIrgxdiw%QbZHA+Krb%dq;klX9S zJ`XB}qyjt*-R05Lcg}(0PaPgq*zQcqFj8>q>cekk>u)S33=*$5pS31@C_9Fs>^+J{ zcqJq!+vt?pfi+Xx@Ay)I)gurktC_0SOE&9$NCh3XnWqr8?Sn!=P#s0=zrJ53WV{2y zfrn%i?D~dn6!(wmz;F{{TcE+tKM@8YWtjL}j9o$dSi9wQqHN0*D;`wp=Ks_^W>P=1 zTJz1?oTZH>@2z+Z;P%hHJrx;@5)XN%lr@1AcxJ8AdTK6rlP83)l_s%0q{-3>RVIAy zT>pk=QCd1DLk*eu_CzhHo6W(ky`e&5kaXyaX9FcOY@RFi@#_x7*9s*DI1&oi$#~IZ zEST$$Lfe+CCY$n%9LL2j|0fjhzg5-@U*1c@-mr{Ce}TQs3)l4MxY0);VaY^yp)a1jl!;rAB!9R?Kr z49WP_^`gKx8JUY{1iqSWLE0vT-Txbld12i0eI%T-Nnxn(=sPyZjHTm>pHUE=yxI!H@oi|I0O~nT zgIss{6w-j>agy>jf*?3cOmHUr%g?8x1(ashCImg9hqL37QDw;r7y52!;CFp^~|8cS^l2*C{FymbPk-{_2upVU( z%El3~a*7{QpgT03&N@UdooZ55rc%7O}Q*f4|10aW=bBO|`B1_s)N z-ORbH0?_k^oca-mPfGZeT)044s1o+b9?)!3l9Iig{|VpW5UPtUL-mG((VpmLvCLc#gf+!Sg_YtF9ZEB$mzt z7hJ#I@fbn2$^$=%CF8yv7>$L|Y0(vp+u(Vgd7t7lwIhj7d=ZmbnOp z2o>CnLrqY`f|=z;l=SCJ$PW%r=z|5Vk`ZJt(Pc@H?X(kvgjxQM6w29}z9;B38}q)mmnVq2*tbiDMq$3S86>0gWrqK5b48XOU`JLcg zvF0PajntwSa-+^~y<+M^M%!r7*Mb?)A#+)yYsr{#bKt8Gaj&NBNLsrW#t7dP6Y{no zT$O%D0Q~|%U7OF+aE*z!O;v}Rq;SAqB#$n;;{BXP0V^^V|L%J6{^c*^0E-ad@FQpX zLp;EH0?{WB12cJC4tuODfa`_F@qfEqQV ztY`2S7lYT8XCn$pBji~eM$Sb1Siy{of=q`w8`VU7BuXW~Z;S#Yz|4lAe7L1?+)RbQ z*FSFT+Kgl$pqwQ$BY|Z3_Thg>#;j5z_$TwfE3)<*;jtoV+ePJ=tPmw1=c4cav?HRt za6xx{-yaIrxWNhmSAAVkSv#EJp$|Z3yu{HjhyAL=kV@(gur?0o3akrWsabEQ)84lz zD@j(V42OX5*0moW>Q48NnNrfP)X(tXUueiaFEI#*Nto&u7{lIZz_6?jr=M#P^xPWW zSdF7dv;2-cn)GHGs8JF6(V|FQu5{RPwtnPfttDcsaR<1+eL8pj}K4kz=wI!r9Fwp&$+on zV{V2ciN-v|Jq1W>z2;)T2eaIgD2CP=z7bGE>Mov;GV&2+eEVBwxSxsfE`}L4AZqaw zyHQg#NC{c5v>zUpqrH}e(0w7hEYv*9`4^DW#MwiEx!AI=atfLHcnB14+!-HMSqhD_ zTCY;&WeU#qC`qr*GlIv8!k6%QFEKL0#RQE#_rCHkH+br~By*)~uzDO$vsi08aplA= zroFEQk3+4-I=BA7t-Pu1Lw<#5|Be#rO#=ac%6nd0OuD5A!+UElhsm>iru!S-`Ue$Y zacxy26h#V4h?u&|#eMYj#uA3(|M-mb((D9YasdhcszmdCDGr^-yh~1IRpSq4C(lW{ z-|4x#L5aQwDN@Z(z$219Tw4pAv|OV3ksIAoT<9aJVS@T|>(#XevI3?kIZ>mzLeuAi z#APca>2Wne5q%qoZ3|_Xww_-$fip#H_n?|YDmz?nnDYmZ+JJ=ZtXa^^eTL=$s6Cgb z9Vd!c@l3)^jhxHpy~8)JIJY*Knc$yg4fo9sZ`fw+jF-Te$Jk{m=f29?VjnUgjP!F% zdmX%_p`7CCgR$`+a(jfFg^HamOgS^{633$1P?XWf zAR%t(>|s0~AavoRu4qm|#{B8joZA$$qTO#6Tj-w2a8Bp*M1VNbT)e

      >yr^Cf4(i(EfOOJDbFfKLQc^!vt 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 P{zs~*p`%`1HUAMnn(+K@mh+k*+~dX^;+qp<7Bi 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 z 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step4.png b/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..14ef2e17b8cdbfb59abf87ffbb081bd4dacdafc1 GIT binary patch literal 14927 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 WF-wl20|Ghzv1+J3RH;xxM*c4aZtHIV literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step5.png b/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step5.png new file mode 100644 index 0000000000000000000000000000000000000000..3840c2b387140a953366ff351402a4f143ae8c1c GIT binary patch literal 17424 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step6.png b/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..0c8e3fe13e6e878c6138cf4b5b0b3f6d11a84af9 GIT binary patch literal 17212 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

      Таблица   Часто используемые термины алгоритма backtracking

      + +| Термин | Определение | Пример 3 | +| ------------------------ | -------------------------------------------------------------------------- | --------------------------------------------------------------------- | +| Решение (solution) | Решение - это ответ, удовлетворяющий условиям задачи; решений может быть одно или несколько | Все пути от корня до узла $7$ , удовлетворяющие ограничениям | +| Ограничение (constraint) | Ограничение определяет допустимость решения и обычно используется для обрезки | Путь не содержит узлы со значением $3$ | +| Состояние (state) | Состояние описывает ситуацию задачи в некоторый момент времени, включая уже сделанные выборы | Текущий путь посещенных узлов, то есть список узлов `path` | +| Попытка (attempt) | Попытка - это исследование пространства решений на основе доступных выборов, включая выбор, обновление состояния и проверку, является ли состояние решением | Рекурсивный переход к левому или правому потомку, добавление узла в `path` и проверка, равно ли значение узла $7$ | +| Откат (backtracking) | Откат означает отмену предыдущих выборов и возврат к более раннему состоянию при встрече состояния, не удовлетворяющего ограничениям | Завершение поиска при проходе через лист, окончании посещения узла или встрече узла со значением $3$ , то есть возврат из функции | +| Обрезка (pruning) | Обрезка - это способ избегать бессмысленных путей поиска на основе свойств задачи и ее ограничений, повышающий эффективность | При встрече узла со значением $3$ поиск по этой ветви прекращается | + +!!! tip + + Такие понятия, как задача, решение и состояние, являются общими и встречаются не только в backtracking, но и в divide and conquer, динамическом программировании, жадных алгоритмах и других темах. + +## Преимущества и ограничения + +Алгоритм поиска с возвратом по своей сути является алгоритмом поиска в глубину, который перебирает все возможные решения, пока не найдет удовлетворяющее условиям. Преимущество этого подхода в том, что он позволяет находить все возможные решения и при разумной обрезке может работать весьма эффективно. + +Однако при работе с большими или сложными задачами **эффективность backtracking может оказаться неприемлемой**. + +- **Время**: backtracking обычно требует обхода всех возможных состояний пространства состояний, и его временная сложность может достигать экспоненциального или факториального порядка. +- **Память**: при рекурсивных вызовах нужно хранить текущее состояние (например, путь, вспомогательные переменные для обрезки и т.д.), поэтому при большой глубине рекурсии потребность в памяти может стать значительной. + +Тем не менее **backtracking по-прежнему остается лучшим решением для некоторых поисковых задач и задач удовлетворения ограничений**. В таких задачах заранее невозможно предсказать, какие выборы приведут к эффективному решению, поэтому приходится перебирать все возможные варианты. В этой ситуации **ключевым становится вопрос оптимизации эффективности** , и для этого обычно используют две стратегии. + +- **Обрезка**: избегать поиска по тем путям, которые заведомо не приведут к решению, тем самым экономя время и память. +- **Эвристический поиск**: вводить во время поиска дополнительные стратегии или оценки, чтобы в первую очередь исследовать пути, наиболее вероятно ведущие к эффективному решению. + +## Типичные задачи backtracking + +Алгоритм поиска с возвратом можно использовать для решения множества поисковых задач, задач удовлетворения ограничений и задач комбинаторной оптимизации. + +**Поисковые задачи**: целью таких задач является поиск решений, удовлетворяющих определенным условиям. + +- Задача о перестановках: дано множество, требуется найти все возможные перестановки его элементов. +- Задача о сумме подмножеств: даны множество и целевая сумма; нужно найти все подмножества, сумма элементов которых равна целевой. +- Задача о Ханойской башне: даны три стержня и набор дисков разного размера; требуется перенести все диски с одного стержня на другой, перемещая за раз только один диск и не помещая больший диск на меньший. + +**Задачи удовлетворения ограничений**: целью таких задач является поиск решений, удовлетворяющих всем ограничениям. + +- Задача о $n$ ферзях: разместить $n$ ферзей на шахматной доске размера $n \times n$ так, чтобы они не атаковали друг друга. +- Судоку: заполнить сетку $9 \times 9$ числами от $1$ до $9$ так, чтобы в каждой строке, каждом столбце и каждом блоке $3 \times 3$ числа не повторялись. +- Задача раскраски графа: дан неориентированный граф; требуется раскрасить его вершины минимальным числом цветов так, чтобы соседние вершины имели разные цвета. + +**Задачи комбинаторной оптимизации**: целью таких задач является поиск оптимального решения в некотором комбинаторном пространстве при заданных ограничениях. + +- Задача о рюкзаке 0-1: даны набор предметов и рюкзак; у каждого предмета есть ценность и вес, и нужно выбрать предметы так, чтобы при ограниченной вместимости рюкзака суммарная ценность была максимальной. +- Задача коммивояжера: начиная из некоторой вершины графа, требуется посетить все остальные вершины ровно по одному разу и вернуться в исходную вершину, найдя при этом кратчайший путь. +- Задача о максимальной клике: дан неориентированный граф; требуется найти в нем максимальный полный подграф, то есть подграф, в котором любая пара вершин соединена ребром. + +Обратите внимание: для многих задач комбинаторной оптимизации backtracking не является оптимальным способом решения. + +- Задача о рюкзаке 0-1 обычно решается с помощью динамического программирования, что дает более высокую временную эффективность. +- Задача коммивояжера является известной NP-Hard задачей; для ее решения часто используют генетические алгоритмы, муравьиные алгоритмы и другие методы. +- Задача о максимальной клике является классической задачей теории графов и может решаться жадными и другими эвристическими алгоритмами. diff --git a/ru/docs/chapter_backtracking/index.md b/ru/docs/chapter_backtracking/index.md new file mode 100644 index 000000000..604d15d8e --- /dev/null +++ b/ru/docs/chapter_backtracking/index.md @@ -0,0 +1,9 @@ +# Поиск с возвратом + +![Поиск с возвратом](../assets/covers/chapter_backtracking.jpg) + +!!! abstract + + Мы словно исследователи в лабиринте: на пути вперед могут встречаться тупики и трудности. + + Сила возврата позволяет нам начать заново, пробовать снова и снова и в конце концов найти выход к свету. diff --git a/ru/docs/chapter_backtracking/n_queens_problem.assets/n_queens_cols_diagonals.png b/ru/docs/chapter_backtracking/n_queens_problem.assets/n_queens_cols_diagonals.png new file mode 100644 index 0000000000000000000000000000000000000000..0ed26e9ecb0d22b4f8cf1e01f06e378b0a72e086 GIT binary patch literal 30180 zcmcF~gz(cRr59g>n8A)s^#NKK_%B}Ldo5d#5}E>Sv_kdO_Kkd_t%hKO`G zjO`tM{k`vB@bdZadB(FluKPOIea?Bt*%Nb916nFBDgXdzFB|Gv0stxTC1iktgm^j3 zm3AdwC<6`c?*IVZ*Rx;njU*j6@g{i3(m)3&>*HA>{sHySHqi!v$^>fM^)r84b7SjE z+uPd&0s;PE#Xn}ovZ3#sbx$vEb>h#9r|i)^a^`)}Z-03dy?4xXd|3B6JM6L&00;n=^|Yh`}80su;fmdK96lj&&zQ@&z*VYThCDEOp9ZGWyyCmd&Z!ksNE>S@I4l6h{E9r zL3x~k#N6@xZi~rYH6oEog7y^d1#|IMNga28KQE)8s zLx`o9;=kx%5dUJxqEU?h61w<<+zq&+<+cjSjkAzB0SnW10spx42=raQyKVD#}&^x09o3(vBc7PW|tn!4BnKvB3>fPSw^XS6Qcvd9zJqq{M z>$Obghi}jv&Sq5!W5|O_ssFxtj$pb_SM>UH)ny}#mDO#q*&nJ^a*B8QEt%z#p4?~++{(LB7Z|WZT71|cd5e;69t3&Y%tKj^hcjsrO}H} zi&>s>d!Xx$)i{@jF34R8zII1X5fmUj$v;2x@Us}A9yvz3x|-|z=)qYAErK-~_E^LQ zBZ+rnt&q%eA2_=U;-BO?(Zr%I5vT}dl!qO#zW7UkVI@9>!tP5uS`xx{cqS8;6_<~w zu~Q@Ve?qn+Fp>7mx)l8rbK7y!IRqbJ@SmW?N6}F5&QX%kKT+Ee-jVh!xHSF~_KnkL zEOPnC%75a1x+i-D(}-`Q{7>LSXAV%|!~^>J(qk0(SGsM->{8e{fBACcE0nJEDTM6k zAEsjKY zFW8!OKeB0k@sNGQMY&?i<>$5?M(=D;83^&RyWcw~!@_V`1!Vy-8oXwA&LKKikc>o8 zMxRQi6ZS`-zLte@!L|=57F@ZS|8t=FWIh{>jZd)5iw^P1I^g9y-%X*@p2`96G zqTBVRF^9Hi0(IN&zn1@SG2%m)6``xCew#)8>k!q&CLh?Jo$@zlI!M74XWAZYqw%#o zeZ~_M7xN?WBdv8P#|yl`67{KM`JwGzGkz~}VzFFZWXT>rzgHeYS-`*mEUn;}oe6r2 z3-=Hu|w;&(W!3!e}lbVq4yLCq6>XVB;@fDFNO4DbM-Rp{nC zNFXqqELvH{t|yBfbYs;T2Hi_j`fVfT?)E2%~b zNp1J%fK6WU=R~8K`K*Ze71oM`y^XCf?Stp43E9`2J8tFV+rAMH00!9)7gSlZ&ETvn zF5)C*EVVF#*JqS1a4*XE3`ppym3JM&B1;A_v4^zT2ydybj=%R6wL%)pLy}wHA!g}w zW|efx+#nt23Nn`?*I~Ne%qOWYiXjrM{2uxM{CMGXGJQeS5dLBe*1uEA5!8|pVuJYw z>#e&EB;q3pUuQmXUL;+;bD|PCwRESfzzS$Qhvg?+gb}gX9UOjG~P4S%hLu)%~YTL*5< zZEd1Ao}%*4qFBbelrgMGBIZqI9v&R?--5Vr29$)~{T1GaJf;G9@$<~))%ElAAb|d~ zzp!8+wQ=weTR?s`^(yB>)S9 zUW9NEc;4Q?)n{ed9Rhfpy^nYpt+%ABRL)?}R3^xayJtF!3J} zUZ9k58Vq0KR}&if^JUw;dBwUY%U%HAIEpq0+dc;+Z5%J`nEhD1*Wdi2Nf5!t^Lxe( zq!y_Kw2-$?Zgx+Veymh6IG*UpAIj^8qC!uv8FIX@a z`8ARIrY2@2A_!#^1xalUw5S~}#3z?=hmGTghP|++D!<}=qbE=lfpE-=>ZQYkeDt?8 zU)z{SbFhI$_QXFc`YImyn%Jc5gxhqW&5+yF6p!~3yIc!82%Ik`!FXX*#_5wAMio$l zCC4KTm&@I08335qY5(H+;$Y_YF2L&Zd;1J2oZqGayOi0?k8`c^;ZTmHEHjK7!S-po zYvIG^;8>N_Ny4Ki+p_j>zn~%Rj;lZ~x!V`IBX6%qF$w(5CC4U)6FIk9W#oV;%hB?E z3b?9&EQ^WH`cO}k5;Y1o*OF}6T@*HP-mnVk4~BN24POKdE)!es5EuI8N`)@QkYGv5 z<=qjoPMmR4+?$7v%y#VSc}y0W(bD`t*6jlznvXfHp zpx=I}7s>&^BreF#@+JVqYwxngNjym%n`Hc;$-ignP-Y#l1un2}0T!GtsN@eFFJoR& z0GV+{%mb9!*VrlM?7oC-T)FR1(Yw^=J2jg-i&L zNJ5n4g(EA@=4^3|QeL+_#YZf^ zvjQ0a3IJECb85uHP|Y@cquv4b^=Z<@Ecd6;Hl&33>Qs`w@|sfL_PaKx2np#Y*cszP zV~l4DHBvb8-i4PMkZo@{d<24)ej?}8mRVLXs0DjK0^pfHn%$2$NA-1BmddJPS@Q58 zkfbr^7#RcXj=-cHTswvehbTV3-|RPory5~~ZRfM-nXU@HKLG)P(vS3|Ewin1`e?Zq z$a^>zJBiHW{6&jE@|IJ6isTk_+XngjsZff=yHITaMRtgOW~(hsW6Uj3ciY}P)Ex{_Qwx4U}xduHF?`jE7Ry!u4>`P^0lBSS1Oo{73=(z!!YPXR!^Fz7z+Y52#yJITo7 zi(V(l-!ZY#%m8MH@20*}20Z%H#8;7#MrxeLv#&x5vR^h#z zdBnU_f_34koiKu>DsjWW@OvLe4J7_JGjm*Isd}N6ac!3~_|Eq@oA#lXqlK$)Mz{L4 zLjPKp;i%tg!zpc;ZXb4#TO_2?*17_NzZ37DNAMDO!bm_6C7?3z!Y&b7kyFJP*oQ}Z zv09Q)Mi}JEf3RrxU(OG19>I}7Ab|FI7y9vYb`gXOfk`FAhzvn6)aLH8Q`6Z~i#NKy zH5T?}m>G2+1;7*4w`Ci#!tNydb-205PevYn>rBr4#cH{ft`aD$E)r>;j(nDR*Xl30 z5M1u*{~1b`m#5sq&%2;U$XtijEB{K_KD zb#yk#Vg6i%Ja&U*-W2-vBWsrD5<=OqSg!v?ps?$QX=R)4SUFx> z#lIUDDB>w6h0>G?f@ie*e?#AcDF2!PuZ5LyTt7T?+Afji$}+)Vxzzq<$i#JvAh_{s zpAciy-FM;A9v*#V$T^Wg*|KIyU z2wi*%RiPVa_xk&>IKh&l;K(5Dhh2$|#Ie+xOtSk3?D^AQ+pJgl16Joj1;hYJ5s z!~R`pInar~zvR#xo%Erw_famZOf3?yYcb z%teCMUxKF&Yjfz@d@<6g1Y_?DbFNYW)xfzv|J#unqJiYRU(RK>HKgbtsW4MPp+NM{ z9=z`C!vzywJ^U5*nd5|dY}}-W9REEjrU)XapP7X`}|MaqrJEY^;9!c zZpS;;id~DWs<*uIgid?Ty+9egM)m`sIB_JC3#2wK$T@M&yr_n5v2jkFGU4~4P68Hs zggc-#qeyW`b~)Z_R_JEH>5vdfuofx&9@Kc&1%HxVa;aCParHYY+Vh{hwU)|a{ zy?fLlAO2;U5zu#V4O;jD+fX?=F}vK_6+npD40D6%uei*gOy1iwGl?0#OI`6v^8KIA z-So>7Qel)GFl)NFB-Ac7RL^o|d6fNcY*z7~pX1RWYQ?AvMQGWMJPvZ@8}NFq+u5+3y@{5fffClhH&b2| z>AOF-XLi}WO3;y@81drPXS|pDN1=>-8pxvs^eaJx7|mcZN*y522`GPq``l7mu0-uw zwXn}Juo;L*~0t9Wxb01Hc`(*9HsVH@L8M7Gn4OYkm zn>mF(x`*rTYf#iQ#%*UqFJ!N+nMv>VUp2TIF+CNz+M zJYUCA3!X^f-Jr7O_juf_4L?*K=PQ;^cvC&00T&E$!us%uYSCOIPIJrhH;T zJYijw{ilV@tHy9(_4n&;z5>I=aZgEpCS~3@Pq2hHNmvjxqj&^V+fOoUA&cis3$M4nDj(~&nJ-1(Ne6@m?8-r zgkRhsxgSO=3F*~Lo$5W|C;lvM>&_Jtha0}KP3FOf?AhV{F^YnoR(@;z8ORbw8sv`wrqt4pRsvG%iyI-?B$!%dAQ@)%XAarCmw z;TuGFli@9QYnQkCDz`YQpN2LU_%nS!pEvY?6g~yvG-BkxV@m@VXg>MuyRm!29_8MW zO~CV!-Jm7_x=+#aJ%GIZiAp1PkPxV9UO;*c0(d(BlaWB5S@Rd2# zIAJGYFx;NYT`x@ouI0OSzer!+e#`=idaosZsoUnFfo8mglS6NtEP2ec>RQv)g1}#9 zS~0qYC)4W?`1}>#WI4&7Px8$PPH zV%;M0lU~sW@~%C2d2lT&CAA%$N#eKi>U?toIdMI<+Z0NyyeINv*ZZ|DHO~&@-RgHI zBaAM`2YWXt2|S3WU>~8A<4Fy{EY3wIa%gEbnYbL(}&_KYl}In?6Me)aWn zW0Fc7lNL1NzW1bFCj^_#`W`;ZvsZ!2W9=Mal?BQti_2tKOd*>kff^LQvbX896K$sI zufKlj4wmIF+z;zapE|n!+vRp~<-mtAZa zDh!~Ny6+%MDyye7W_1R+(+@0CBT72h4iiUUy-lM}kWU6~<0EsmvV*D-7ea%`ykC+g z7oSmNA5>QMRT^WY?LJKA!OMpIM$z`&kt!c4jC5CyC#0n!_M$xA zzd*SzwV<7$iZy>m#sLpx2-@R<+kSKSHh{2<`P4EAQO%G_;RGjbA!JqD6&{Vj+10tli?bJ-1UWIG$_ za*WPS6lor7y<4-84J0l2RUmc^oEBr= zElw9$!u6X#HTuwBKl*vUQr6e1)kxJ70X{cgyNWcRNTzwWt_>%Fmqp$BuJ^{u!l0__ zBD|&GiAtVsZj1I_q7PTg1J;M!IsoQggrZzYAPIuP`eGfa`=ER$k_p&jdOR)EytsX? zld7?8|H607ZlQ+G*A&&p4Uz+Fd`lhMde3FVE8f-13;@P6g6m=0+$#YY1)5fJ8?AQq zc}R#IK~ooaI+puJ?m~J~S?|}U*xe{U`*c15#2<#sG{rrphjh=W z$VYS|)5EEtu~>1(!bn$y&@WPbs@myjSfniAVf1HBCPnR1LHl`C&6QmB;rX81WX4Aw ztlWyUR!WvVx;M@XQSJ&b0KwE#%+Kwv#DD@k5mlP?^b4eX4-Y~k0WY>4+xN2FV}x-N zjOmHXOn9ZE1IXb5DwFs;`8jbrveIll`cCYk8bhMCt9ih?+nfULMDrWv(mr9T>}OGT z3lhoyNHTClmj}k|BM?n3_Oca(Q2&7Ycqq{RP6WP9Mz_NG((bz6NAxwJ)%%xVrW}_a z#f{V~e9zO^4()4NWN|FSe>a7M{K{HrM38$Or&p-N@V=-{>?{8Q?b+V&@ovkZylmMO zsz=O~=-K1uXd6;vMlstwGxX(@0>~^k+X@f`8;)R^=3j%p5LfmzsJbU zxv4Rja9l^Y=G;w0O==;DE%*v03iR8;@HR{pNZhAu-kN-xu9c>AtalvU=9YF5Q!_7X zQvY`rU_JN+AjMem^8ZB_%KqbG2E-@bT3Wah={$ZP!A0LYSuwtseTOW=xNPg8_0GmQ zEG1@VBmv0^Rm3$o9t%E`UJYI&$B3pmCqxBB?L)BXc!SiY*bbliGR)>wBt%kI>!2 z+Mtgl)8)HnHUn2is1m1;gt1=u5!v^R@s#SX#PWG7sHQTb)U)OP=_$}HA+yGsP_jfZjk@RtL421CZ7C+cAYqSlMT=oLqrn8H1 zXYb4V0_V1Hb`2pVgG!~qAy2}_j_^XX=EO)k;gp>6@D*^#=;liEH9 zJI%%$xRYO9wwzjnAf6yeepHjCPm?^^+DPUd(3A23-Zs*T$X4vjivcnQCZR?67kd!? zX0KJ(?RWPVEQO8T@Y1@rkm$>XyVg~1uqQD4+)tk_M$RCA0ES@&fsAdJBo<|Io3$eq zy5idWq$~Q6S2-O(v7P(VizNrk44XyoGHP7vRVGaerD7}0f~Woje5E!1q4CE>$0<8u z`R-j7#WcSsFAq6(OEESowwzw#oy=cS2XAffNK8q-;k5A6n#^uU*zC8iSL8=>y|^y% z0GC=(p}@j{I%hjwdV}<$v?pn2{Mt1eyp=-LeCKnm8wOTVAV2qT&{`i8;ZY{^J#p(> zq#yV(=sm6XpFXMdjB8edL!lKSSMsjqsFm{9;lgx#ggA!_HxUu4|kE zPS*X13;5+bx`LY7v||cSK34NZWO8oFShz4q$t_!MQYQyQm_7%mp30Ckwp^9$5nZ>8 zY5iVY@?ASLYc{KNPyPAaMOtyZAGyecU~5Irb8F5?iAEYOl=h?H5bo@sq_X6mU6ys% zcMsfrXp;_WH>03IujBxMVKS{;jXiCqqn_R10t>*{aE~Q)FSvy~`-|%v&L?xGPG|$p zNuOx*8_Pu{fuv%^Ni_ATRQFnKp86=KU2EoYEIRzAp~roZTj2A<`ik3PvpT1ii;xQs zq}!@=fMX}$d6!`WaWU}YscYfYdib+4F<}QI@a|I!)q7lP>$*omaYC^J>a;9##5Qwwpo*2 znB}&5o$%|5Xx_EQkCg!+D9N0i4Rx)rWPbaAzPH4uu#W-d%${A89r5Q=38m-C%?qps zckU=r_+^;o$oPG1T@Tp|xYz=#UMv0OBJ7bIL!;dxJt3!??6hVN)J(3eD-*;yuFXZd zo1Qo01G{kze<&`l3JD}X)B_P(OM(ZFZE^y1re~Hl8>G! zUD7g+%*~f1yHab@0YRdevE<#kPCFLJq)jPi+o9@-1t?^4Wa4NCG%oJ=W|&-+Hm3zn zWj0HJesxi*jl9(t54{@)8@MUf{mBXKLWK6GCV}Cnp_d~9hSYU0T-r||UAQzs_PCLT z4ke(w+~ic;jl5O|F{ZkynoiFLN**Q&V{fv9&F6MOit1)#GqPu2qJP+@HvuS9BGi)4 zK~9=E#44J^-SmH5eA<8d7bzHbn=OYG>mL5odApXXX|@8TupP3Jpw9&W(MAQ-yWQu1 zKDE4xbMUySQVHxfz-xc4mK9g)CC?ZXWyxP~dE;^*yIPisY*ncKn6@etTH*kSm!NSc zP|4A9z9z7g1No=U2;vJ+F0%8YPtB(zvn_k9NE_z0+}qxB3Sm&GaY9_B>?JsD(-q>R zu}H$;O%fd78AtJBX$2e*r+T?8?k_M*j^zRvp0sW$&t%8-0>8Id1%eC$ciSa*sWtVV zuD&3P;>m7&`2L1A2Ws$~=S9_4%kLbhpU6Lh>&r;pKPeBMM6cjurbc!G3?KLn;?h2* zA>N=5q(bm>YR+%jFwg!e3)q1H8|pF2>Mio;dg8|K%pWAS zObn(v0X4#Y*#p#zHXo|^&5UO}d9q2dw5pPi$>EznFw{Jx*{tlq=1|x8b<)RFasEcv za$K6ZuU!MLf((~?0rP9Iej_t9zyp3>x6l#GT$q{$?)#G<+kW)YOHtxPJ4*ZR(x1qR z2A!BBgP$W4?!G%aSwg@%?B;>aGi8mcjF`82%@nE#h}OrG8Fl_E^RFLiLKUkcbO9Z| zahWv2tDjVfwj}@~kTJYVm1tm#vH;X>&9h?JC2xvy3)s#Ku7)gi23?@BI2>Pr{`vyN z2ukVq-2@Z^{zw5g-N`kDDdg3ANI&VmZ}7&uZ7Tb-Kf@^iib9`?(mUf4$2pIW%uds- zPUIB6yyXF`+%dytd#TeI`6S3+EoEc!00`zco|YS9uG16c7X-Y&uS_9pIsce8kxUuW z`GZRTQVW^kD?sm;9Dvs5ObEYE+;VSP8b;ir#& z*J3cDZdr9vJ;Nmd87@+RxupH+)&cho78^QK55is`+09&|SVMj^lm7C+(7#%j9;v(D zGT=pz5;xPMLUrHlqLpsSj-!?wQRUQtu;KX2At1ObLGk$-`$BIi`2w7~MvPHaxbQJV zP9ahO(6iK)m1BEK#tsCI3MyXZA;YSO-HhPDc0GPJX3sgPQ*O)JWjMqA^aqj%Hjd<6 z+%!{=rCDm&zV7g)>(o-Q)tV_Rz(}dwU0s-(O4ma?^Q)UIYP+7?60bT;aN=xB#QvZZ zeJp}-;)!Ga(S2O|^VRouVk`HMaTMn9K`P{t!9A`Vbfs^5j8tU_SjNrF+v{3X>-3AH zWg^+>5ARX$H>8L;s=^}u5?`ehXJa^K28Y-M9w!F2UH?#j5w66yOnK=6HSk$nfoXwP z4c{nVlL<}9u^(XMD-!6a^M?GmFh5 zs&(%E?23lF_&1J?R&J)rw+cuRPLHhFE7NmniuWL~&W{*SH$RxX_!6BxZ>PUlPg7Wa zTYRrs7;z&~I*&KscVXY5XOAxeZ4M3V0ga8f zT6GNFmq5TeZryKJd5;72Lbv@wddK&`MBYzoRHgBro@=QljyOjc}iv9e}BRXJK>^V$8kF80>|@9BchQ#R1BtuN`=&Z`EAN*h+aJn z1Ik**``17sr&4G!!odj6>?7Fye2Fk%1mHpslOz#8(Su6x2fyD5unG(}azwnM6A0?G zYkfi5Iq>VqE)XwHiKszY5cJ^SX4`2uGsC7Vh{;!&?qSd-vmukH#vW6XZEnUkRzBD4 z6jxU4A6jTl#91+6j6v{!K8y_8L>~{G<@IQ#@SUE+3pXPo4DbLX8`-{2k=@5R@d@&i z&;8{~j|mA#H2w(+f_-+9BqOlsa+UOR67oB5cOfgbiR^JGXEGpk%D6w!GC-z5cnu;R zp&lcJvVp^2_zzSRC$=?Yi@sW@oj1PiD-f$oY*g4Kumd+VoKuM1omr#;joBFX%%CiQ z%TKf-$VgxU9hoi1QUp_;>41k~;$u_;mQG|;m=3|Yj*`8rmg(!JNeXMLbxuWD%Nig;p2QwG2W#_+oV40|cEKUZ(ZJ^49e>{HvoZD_a z*+rszA7vpw{|nrZ29Uo#_uvJxi!6{aF_To`lo=$&upcA{V{7mpkGz4R^&NUi_841t zlg%%fLZI&=;Yd!?$!r@)*V2kBwFT)OeWL5!|Cj6hGZI~Jd*{rZ-@Sp^gX->6ho zZsa`$xKt9qV9))loOn!f70EelP7bGa)=bIm`FYdLX`>xtp5TJCuKp3evtTp=skqfz zL-&{>dGTNTWK_o~vZ!5uF}P!!7jyW0iLXJx24DRvpPo%_oS-qT#)|!TQ}wo$<#|-QjHq@=Aq4A`6x#PNl?1ESU%T`P8%F-s zk8pGyRKWd58$FZUZG5Y-t~koU7H%W{>1ShF;5x)7m2;X4t7a%K_@+*GfnmZNK+NGp z>euZ}J1+u=$BEu8$ z{`6Mkl!}bN(#+a<2o*|pdB$}R8kb4nHQr(g`%#Gl5^q1Ua1Z}v^OTbbqeKYeOcSp@ z`s+MWr~||zxZU+IFZRt;&f4Q0o_6iE0QPpM<1Vh8%A@)6DLr$##>$n~l^wl`!#B7o zvv)|c=fL|tIWY}{5*aX%!|DAwM<1Qg&l@i{H}Kbq4VisNP8GJ`cjPsqgP-DmMUO~E zUb6!qHBdeYk^Dloc;W~_oFfe9{cK=~x^+X&55l$3eoOJu+zjFp95ly0L)ZLRn`?mn zaiJx(!b%gW+PSb+4GX1#o;wgy^NmZXNSDiHy%G2&yxhnSocJb#4>|yHSJvQAW&aF6 z|9(Hq;h4#HgLdbk*QD7=RP%zL&cDx-oSVWActh)`iav*-6$YLb+`e6+uAvEcOd zwK^%E;44$eAb#&LN}t&Dg}Dl6VvxP6L-E3^%Zk|2DlJ@M74~ zH=j;kQH)?6Y<~cmfxpxNIq|(n2vY?sv002x@(l?rRDwh3`A8CBuOYM z%SCE^P;pB``qeGz^RIzq5-cjpD;~ntNT?i%MbLVl&6{0#Z9v&5bLQHdQo0R%0^OV@ zr?7yI#SIZB-g5*Ne`gH9hfs^7l`_l8Aw4DyuwKyvIx=Ombyv`(kVXO}FF}0lDREki zIVD-BOG9}l5l??_m-D{90^LkTazQ+8ZluKg&RYI0zIlPLE2q4fctNpBfS?$bYn4Qi z%^mwzGFx{6y)G^gBA|E1#j*=^*Qkbk#x27BLLy#TcJiFb{mKag@EZk6Uit8P04;-$ zGaTr<&^?Ydrb30`3sWrt9-33}Fi8C2F+Xv`@gEjlHQrCC_sITX_IRXw8tI)sXgz!( zse39)KF9XDP*v(nppl;5g8HH>4=>k3CiBg4pkC`T++Y_b20BR+Ma{lX@3W`8BQ)@J zg0gdGLyLO!9?*Z$ap`Q2Lr+;3BM=VBG&3BFZC7n{aKlDxlTyvf)<15!|K~l)LfWHj4RSXoqXb`#7+m<9p)Gp%?A9Sui`A zq6@LN-cctZ5spK2B?;Hr847^3FY9-N!;>BpXDjCsm@8w&%K6?jQ1tM?&`_j5X|M5_ zAaNUZ!7Z$|q%HXg7?!0xnEQ-ZUW>kW`m={-r*Cqw&dTSk)+NWl(Urrov$bm;r)vZc zP@%B|@(#ypjC3UG7TX>OzD?vJ83;_UPG_>rWkvMYWt_YH$pVVWq|6rdXm%h?mcZIU z5Szw~=0IaAQaTFzfWchkL>ID`WhUGnmw@eTlfQgWsR}haf^&hM zskPaiB>=g{pw=TBxRo=&_33ovj1@{kk7B?riw_X@qcNrw@qzgHpGufRzvZon`)1GI zFu-|TOylC$Ub`{S^a2WA*yr9F+<#>3g|ylrd_z^~XJoX(6nIrCjZ;=o;rQwY?fICy z#`WwP6bcvn73TJSi(+~zhpE7z$bSCxcE3@Tq-`zfOp*|SUF^OCY0%mh{WBsJA~>tq z9*=sm;owsTefj%Nlxgp01}RbyZjM=ppR>am!GUwLzS%h+W}@PoUVV4FM{^0186oyE zUIcLNLHh~wiynS>hm_{w`q0eGHeioX5@gLbA(gX3X_SKPvM)(G$RHGGv)=;>>4`-< zYDzwO*> z4A7WP{V97T4>iE2^WT8kL*5?M0v9jcvDii=XXanj0B8qIo`l{vi^-+OmTm+e4>V?| z_2rKyo6)ZPQ^Sk!rxBot$BdrC;Lb z^c!2S{`|)Cb{+02B-^0_^lM+@VKabh&rjZs? z8A_U7M1uOTq2QSV!%umlP2kHkm1kn;MV|w^PkrV@8-rd@Cp;XsNwGXtcIN|@wTeNe zbk_*Lld9uS7GY=Y!XRYb!rg$|^KkgUQm?&9Hn^36qgh3JE$a zr1kb)@kR1+2@_u5I{Mbcy>*mTD$Q1LowD;=BIDnY>|itRt;>tSUy^_u^-+IQ!t4ob zPzluaLsuXhzMTF75~|7#HmJB<@wm3WFH3$QW|NlShQggks74y;|Ee_xJqY!dgll+C z!tXIB&OU#gj}XU{6i{O!%UxRBG^DbwtHG&s%=E$uC>+Cl_TPuo> zIv4^E`e~{G-_Pd**GX%f4))Yv%4eM(-}Bjh?*2?cIX4CPCoVm z7s^d<{0oTIX>m2#A!6nE)-kU6FbCa)U!IX@QX3rzyBTq^71|d2g*2Hhs$bvaAbLoC z_dhR2h}Hu7fjldS8#=Yw7&&OnI&nQ6o`HGCmz34VoYF|o8Zb0&;1%>`rM$fwW z8Lv{1!-jfZHUZU^w;HU+tehGY4L-a!(>|lrpxJDJen-|hJ_yO1$vO9*3!~g3vS9m_ zK;=(3AedwnQXmusl_*Qx9DdH7>$Glc2uzB;SDxBXkF?KwRio4z?nBd3ByCbIbTwNG{Y&(cjnWmk4xyaE z90=pX+f-}&VaQ66{?DwM?Glg{o~yZI2RS|Sw^g}Fegby9&&~Rd^Rr5?FMOr%qJU3= z;x7_IGun@AxdpRjY0SW#FoprnQu!yT*vcuxINh%-t)BQeQBJ zt8|lTKH!aouQF^ow|+d3kM~PQ@fZ7Ns>Cj%DL_(GekDOsoX$?ASB~a+SuQRjyjhwb zU=^9=Y8|m;Gl&BRKVqzb^GhBX%JcB<>`sNTIKVe&vX)_UPx1@L5eK1)2|@)Bg!gA$ zcbk*me}T8LA?^r7Hi!ZBx-Z^c#jZsm^E7&G2*YVqp|9=It`Y7h-!N8b_)6dvcBy8p z$lKmfYo`=r9wJ4#I4P8Lt)Vl18eJhEIK}}xQmVq=1If9_dNA;+Va(>iy(WCbbij9s zS08%5f(VK57Za0t_RC!Pl%t|DdB0rRC^4F#1>VUDI-F%>7p_E%cmYUL^9TI*XHZ6Z z%!gwiA?6)lu-2YE;?M4!r*G5fWj~%?2~U6o|8zhV{=O6x(EeudHjuo%&rDu@%Pnf! zR#G6ljrgrYgo=yhv z(UxJ%R&SzS|GxBIi4>aMFqdxV;b^8diEH3e1BaO56I)LiD)1MZuQ?Nsvy{u8QexY1 zjtb11ZRkgAq_A46EaNN1~aS}P8cRf47tXv8E4zg2S|tXEo%GSmUlXj4@{d9K@1Xj zZ;3~OM8)+3nZdeHNW)?R z1ki8W$|axw1kj2I&N47OA>=@-c5HsHu>knvRPJG>LT80KY1&eTM_p(QKMtw)1_#k= z1w|}wsqPC~YG@=xt8&bp8zPr$eao!a>B+mgfiGCPBhP6cH=7Jy4Ba;*0$M_ff?!}w zBD;SV-Mk$f6Cii_L$f>o2WoCq zzGUc4boFNp1S3mQ(e$2j+#E<&AQW^BJo;9fi5=kBROLaPdT&K;H%*J)g`xttA>(Ni zM*H_oB%X4aTRQ^QK@8H+xbe`ClRM8MFjuLFoit;2=desw4OZ=Y z-Y^gcsaQ)cl}ww`PMMHYl6a+CNMKg^VpL6TkDui2rO4bs%EMCqUrlUW5CM_PBz^7) zi;4_+VN80~g$JEuFcD^R{y#3FWW+G)#j3`bmZJq(^czOheI0KOE`>n*pPBNJ^49M;7w>}6Fp3lD&4-_3YK&zgSNS%cVV65N`J2J2}6anQt zn`m_d9y2@s?<~MgDj6D3Y=|61eFL=;kX8GX3?sptmA+?I2+*X(@uSJ%4liRh^)b(p zgA}3w&H?)S&&-KBy)R%K(laqW1Ak3v+&KM-qE_Csiv40nqgXY-?D9ge{89kJKa_QcvEuLDDeo_v?W{3zee$valI7_Z*JXf>2CX_NK<3*sCExra zOTgcxeMS4z!|NBKf{XAne+m7>nD_)4tj?hi^tp8ydG-)BL#!~z|KM3Nc^nvMVHmm5 zi=dN)U_Lb7)hcM-b&&@O93JJ1C;Y3jvkivJDBd>4q}RwL%a_s9lnViOzfmis>H;+V z-#kF?OqnVk2o(W}$`=+8B^Yn3+5C|=8ksUByrxE(4Un{hpC#TidB*hn&OjjzKN-J$ ztL@x2_Y^`nSp1KY-gApBZ7@ASC3e&+on>`J_wV&s3b*wFN;@))+4j2)rRM7*kU+J9 zz8&N%K=J9C*WH|eMyCIHGZSQdaS;ZPxd}O&=DWMZZy)FYEqrnyYU6iXt}XPN77uEp zI}-AgNGWSR!;T)NChs}G_-_{XXYIAu`mH>B&fe$3ZPZoAj(+UK zkX-?hQQGwB`Fvr2F(@ihGW3G@VBzU2AiF=|ZGJwmC_slQ<9np~GZ$>R;+g&Z@=C<4 z1*J_=#i-xZ%ka9l_A1^jII7^g_a6i{uk?{EBF~QY=aaKb;g|kvJ(=_BDfGRFQEK|5 zT#IEy(zU19a{w$i{(ka+Rh1qG*PQ*31z!6)2`7^Vj>1O&aZDLpqnlCgRGOMI4A(ng zqr!7FOx%h6$RD7)4CC09fsaZY2~_sq;#|tO$kRCTwse4>H2iqGJ!_I}X??_1xN7C` z2n!?~2Eh&U7*;W$Wd}Eh<@i9I`L`p=ijh&h|A`$A+|X7)N1mGV!D=fFl37nHJ&EG9 zg&klWboe4hNdf-~G)izprBe_?^Iw+|?ZtVTpdX5)!O(ifGtK0p?^pr|(TCO`XivxT z$!}O*>)aec=fG_k%2aH4fXgKMzs^MXz1{H!ekgGX7ag`paih{0&3-nbb0VCQ{~A>3 zZAOV1p$|$K*mF@C@>>7J8*df&jARi(%A0RLJn*rvF}MT%_;nP*Y7oilI4%-VUM<&WHgtJK!7sBf!8kUfM%K%SQeQ0l zbXXQ$2hFiG;n^vty89A1AAA&SH_kHCC_4o!#opKkSA9fyn?%g zZ*b`yUfpa|5XpHsG#XkW-~V=_QZ&4#t!~-<58?eSCC}3z?yE=(Rk1Xv)an16d(|B! z2_Ed1?OS(y6~c-Y42cZ}Kjl@Tdr~f}MhW{z;2V6ryTkplqG~|!zv7Zt*FC_-cmI8+0da7##93*nbX2yg0A!8 z24C}oU&1|f{(-o8sp|E193whMjeip7{Rh|b=tHLGQoAkexX$yS@K<*f9+=f=d@^_> zcL}%(U5R+rWvlvcpcdXJqA<8~>5e~fi7k+a55`&Ip&F13gegr=B#>c4N^*N8?oQ4X^Q#VL}>({N{y*aCc2q5Hn8K6J~z-4 z_yV6<&BcE*;x7yx62W9v&Pcj(~c zJH@f5BzpEeI>+{71F^>H>hQd3nx~1diI~!*EK$I?uj6t>Bp2w?RVt6o*l87?uM!$k z==-oBIa0J+Rn1ud;5i$qfp=MhjAyp6ot0ei2bX%NLC#~Y!e(0YcO5W78sw%mI-$mf z0UchF+!tXFQwx%*YYc>%9VR@Lt-NAoLnSU-Im^_smpB2C)L9WfrA=I7bVedccRKXR z$MoHT{unXLQGU=O?4Uu%VyzLMyQw4W4RJ~D!>Ht}XFzvsg1`o|+S-tEYL8zrUYnD>ps?kGz19f$Q^9gA?&Z~B4SE}zl_D$h%f+Tp6k0yTcn<|`1b#khH;fdAUA zkR!|K;=*!fcYuW{d=?<1|=Mq?> zl^D?qIwJ^FixgLr%w}lEnDvW|iB9Tu&u20=3b8vaB)|@7AzCD^roYnfgDfFFbXK-= zb*KRh0fpp%|ai)IG~?7aovAdsLBCf-SaC{ccXn11b|$vI$g0 z$lt@__0#V*g1&kMpZ+SRX9GA^Q~xO>y5@lJ&n3d>Meyrr^~wFoY6{GwUs^f?@b*ku zmR?sdYIB(&VP@K-^j00XM2`rTZu5hBEC?mb9?(jWcl74_p`t2x=2-tPDqCOE}I;0#Z&-4WG-%I{@ zm-K-ZV3`P>A_nu`s~t%5h%8iCy>MU4Yoit{Lh^210zDt;BGp!`+axVAD}-Zf`vMGK zZoq9sSy@OZeT}MHoyL(}e{8Fwvzo%M)A^`neT)ct_`k0jXwYx;XUf zxoc*oOgeA*O)Xk2_d!X|;RGHW&R4lXa9T~U3L{;uu=vz{nZM@U1__In`-iwo?F6z@ z2VaF-n`zM|nu?1#1=K_w8+!n}o?%Y#xJ4HGZR%N2cJPtU>u3YHkT`i47lN?Fol?Q|+G5YKO< zo?vY*HaAqh^z9#$H`Uz{KC!*HD-8v~#OES_aO_mVl^ylh!@ zO6Ez0E(k)m1 ztM)Tw4?PXHR3Map@f%U2QxfqOy0L3&j3aFsb1V^w3`J@CSD$~5e^#^Le0%X84r00O z;1!RTm*biCbFE&_nGTN4ur&t^GfDbX)7CtndVyEeP^5k7>JP>r41mypvucV%bjMES zaMFIBEk}>~_81bKqwehHdPrJzMc7NkM9{j=fJ`;wlmdj8f{7@&2W4^SdYJg~_hE;S z&6_V$sr?))LLLl+P8(x`oK0dH7D|JojyMtM!GSi840%1h;RAIK`6U})WDewO<#;uyikQ|k9^g>&4-hol~9&dedTmxasA1VZ(E`3zcQ{#m2endQEo zFpm`JjBDV*!-z7@m0Pyxbp_(X*OM>z9&4Lrm~FdtT*y0RIW&43zO}G#Jj_(PVpaPK zA=+kQOWdMaqX@`Hbf+42g^z9FqUU)f%}FnJRi2svj;nhqYu8B8Lve~jOw-4?;u4q% z8oyLqXy4k~lLv3AW4uVw+iJ2kX`8`Q#2E7PB4|YZYZ+_MlJ8dFUFM^GlTUqow3=_L zA2&JxG-dc#uxUH)ziqnL(}dS|ERXwd$U?Zp51KNOzXGmPyeyy!yXBT}=>s>^ zYwgrC_EgNq8j)u}_11l#cm&7#0<}}jJBd`>uQ)$IobCY5Ugv zsJWE;N1YJYydIYOwcX_RTyL1zX#aKP;C(wO<*hmg(1>*1`_&OSNDar)_-AHXbZGot zOF&5-c<*|yJ{fp>2`hJ#ab?R*7Rk+c33&W691VA1r(*iXnOyHu#bNyAKm|~~8W(*I ztLo^B$Rn-SmqoG}1KUi5vxDsGN2k?Bsoc9i67`NsA(71jMTjsM&Sb|J^Cm7jPZdK@+UL(#7^16$$kN8vKWche*8@Xhq6P^dmr zcfN+7HhJWjmdY(*IYfvM1e5_}fPC_IjfM|RftEG1mtyxDO>DHfb8jsNoyjn#L7X8q z`sfW%T^j$vK!I+{{Ps@D{)V|mdbawC4{_G5nl$FuXA{;rf!l+RUB%8>J+oAr?@a(Q zNQgpG0V3Oh$1)E7XJcuGRL-56sLH~FLd-U&Itw~yGLPMKP1ftOq{I-#9Z5NuDkRAq zeV6AgJA~*;ya^I>_wHF5oF}oI7rYI`4AHI+zPMY0iy)=^K@AAcGGWcdx!KuzSn4j?8_B0-N&0ZX;a2w1?6RVim+~CsgvIp+A#B5&=+CDa%)P zw!$xFuMm@PC{8B828RFIxoyaXj#6Kt&P=~6keNz-)?zewUP*|qmB$hgK|@TD?4QB= zNuEXhXJjlrk4HXh)$D*4xqNX&64{FhB4E!+FRIURUpkHmzO}Jn{k=Ss&#R>5CY{X= zFk`(h^r;qoY055BJNc4zR?wAUC=8Bcu6j@+umw^FLZb+?A`G-XVAcy$QI`Bv8^<`c z?2?3+r?-VefY+9~Dp2O>MaGKp#)-@Oh z`{FSTUL66)$0^V)v(dh!h@@Mz8Idc?zX_%AZnRi6@qhSJJxkqVc6T9$1~8JBtR4K> ziSB&x=?jqkh(kh3Z0Tj740ue2yqEjPGEh=4hWSZ)FMZBNC#touwQ0`o)`Hbua-z&aviiB=UT*WlIz(J zxy~-29&I~eu{z}}LH-bLJYv@SBqQy8#@LOY@g@YAR$K||)E$&c109%a$$uC%IVTOa zu)0u59rV)gFed@~?y0kVob{pN;W($JLT!X-Rr#INQAV&4L$R(;fgxunhvc9_xG914 zjq|s4_dH)+P#z!btAT^=Gl7ypK_@OfEYUiy^=B|KP}9jT8QmsuTNV~D#|9g__gc~U}{n-+_|477R=hX*1fa`ti zWB*n?!_krNM8zfwwnU@M43RhSAL)`~mdzx*GwaPjbnJIPcPe$_qFp zi-TdROOyHD*YV$PtL$&$@gY%NxH=I$EL4_ObyDEEk&!u*(~s4F^S>;T$Q=@F|R?Zc}i zBHu*UB8)m2l3Q@%BtqB{0aU zxp=ye5vgYHbFlJpahi`2m-oI5?D&slbMx#(Mn~Y2wJF>Y3j((&Z&Yfcnew z^M-6Y?xN4mpTopi?pFp|UPVJ*b-F1TeC})OcFrM9Opqi7J(T>=pvnq(7@8M^4ho)R zMUMFcABl?q4Dd0Bsw(?wZ{gS+yMR`07hDI{y8Goa_}W&>drK#5@QzW21fils@ITC# zy&v7`3)@CUGuM}a%gKh34W9A!aJJq79BtLxM-gXGP0I^kzHmlce)CeE{;oGeg@wa7|q{a9Z zn1_CYixp%g^Om$23!5S-Wg1Ay?D35E(>9yI8OyMZFVv(<&9U*=%d!VjwQC@`*~E6 zqh6&^?6goFp%=$6xk(fM;QReI*Ru#C(;E)z3L^ZQ2#h8*^C7Fmh8*34Tx%7?OUsG% ze^0m;nZ%f={_HD_U;7LKZQqbQ)2xs`r{-egwACKFDv4C#hos;G)Z9Gxa3fkSuC+QF z3HDs~m~!Ejea+p7yt`gYCOj2s6 zSF(a7)9be%wb&*86FUkvC?VI)99APeYtCzP)v-x7Ul`P_i<)!12UTZctqUP+3IM7! z77~b=j4at?Wu^qD81FLmm2~kePIXV>7Way30Z@Bh^ml>|!pxC{2iX;tF^!X0>mr50 z!RvA8VG<%1HZV$7Q9XU*r-Ys4Thv{hkWGJP2}EyK1F2g7>v`jzr-KFlRa{Cz`jC4E zfSI%`qmUl&6%}RUZ+{9gWv{=DpUB=B9f9g4BU-I&HiIBo{+~#dl&SMPd~ z1E{x1CCFQja{z2!$H($Ddpf~MiN`B)IAcTC;Qg~@-uemSAp4gWzR+q<^i+)C?1~;^ z>EHFldZ*4D1|>{?iLZcutw~X2@Si(af0er(al{Z@v}iq%&x}vf;d({UtA&_v(hLf> zAH%Z6_d1u7zsX%le|`l>l6IZuwtB7KV}0<3m%xPa_q2AtXqbk}Ic~E>QO$!zh5to5 zcmI@S><#%+zIfvzGrNaHabIT7bRH&c&xq%UA=}K0nqi{9X1E5{7ykGT{MDaf3)RE;se5kAhV|FIl( z!L13#kZZ1CYQuJO=}7a}HlIhZ*gO*Bc$=}$4G%LCN)fQDVgOqgon&D=l2~IR>`S_euDso^p4uJfc`6)V-fYr z^?xJTGV@00F9_=qqSDRJTS#1Skz^R>vA@pKXFd3N_aCg(kjE!m(p&u zmutD-+Hma(U`*@oXd25iqUA3-4HySMJ6h+`@J*NAd^76%U~Qw?TMw1ER9yfZ*_yHM z+{PtI?yr99ZXTq&JvFTclbxPdiPL8*MUyP5kru*8RCuj%o9B=@Z zjZo&v*OXLtqvt((-Fyn1;BacKrrKZScZU{a&wJfqFSB=`Fj_fx7p7~er7WF!_A?K5 zA%sWXfkQ5IyoVCb7J>3QYP>tu*du`1y#`ao1F*c#w5XJIW4olGNRz0X{3N%K?*qm= zn9Oo`%RU4(G<;CFrfzd*eT@w@``m(w8f?u6m+C(oWjhxsEd8gX2ljd1Fa_al-rb7a z^#;-}D2wx=Zh{FeFj_zN!r~6Zg3=9vjw@aAxo+q|&V4ui#Jg$Q99p1SD{VX3pSAs- zqP@NmF`>KKuoOzHOVPy%;w_0S zJGx*?$GO7Ul4j(ecE6L%pt_iMoL?Bc{=KWae)vBW6DPTCt~+lk6s(X8pVDZc2V_hJ z{PY9tom)p9(68Y^`w3@cK}Bh?3R@#U7aq)t8%n^A#Ebk{XC)HMJwp2i@PA1d*#VAr znzm3O1oZ4$>B7Cjjfd&2b4cm$<;0?Yg6tLw#jP47BvAAe8v$veM1QXgefxCvz3$jSss#Y_9`fCV zqlkle?y<*TB&BPB#o&6FvZ>!9Q(kW)0y9qYzDzoq0Xoun1T>Ge*E*6cihjsUJu?2fHiEJb)1KS?~m~C91L0u#tM?K)G@owuEu`c_K zqBV$eBjpj-3_Oa-CuciCrrwpc`MU-##5(UGh1@^|_kvM-UO_}sFCil#muD5%u((ekvXw*k`1IZb+4%#8^c z)@mhe9`TStMoPy;yw^V9!ngo!|0^Bk>+@5$3opR+H(%A^(|QD^DLrMzBWeS#D>b61 zLw13)E66|@j5fT9eXX9ZiG9`SM|`SiS)m4^_o&rBbn;_3&eS@7k(XSkLtG42Dd|5B z%#)k=x+7)Jyvdj!O9R9+q3xM>QU%*ZbTitKq1jN%(72AMN{=mL0DXdqN+*Q1WSGMA z)R}GyRf)fZs6AfNi*%Qa(7nqh9_>IcZMX6%%d6{PtAQZTeZjskutexU1qrD@`v8`) zIlHGkJs60=M}4m4fL0&fvz~x1W2U}}c3X!6pBG2%pF`90)cG$M8X!cgJEQj}eGF8Z zm-uXi#cU%AG5u8bP$>1S->K+9<_+(LMr2d{>+hJ*37lb$m&zlPUOYK~=;nxZ$G@E( zkH+_@<3?Vb>|QcOLDds4&%&N`uus^+ZcN-!siA@bNJrW?Y8?s%P+-)hN$@Vx9}#eU zb=|OKU~E8`Eon$Ip@99sy7@eM8_i+(lz4{XVI`1^GCnS! z-T;#HwUYO}FOplb9&Ew+r8jLJbsFjCBFx#=K?Bmz*t6MsHDii7Blx1EB_p;j1N9oI zu{aa1^CGBMv`jh|l5kC!KNwee<9wf{*ZbB5)D-~~S#Jj#qS}>}ZTtkLaXp?VtLz4u zS{-JQ`YALQ_S7wIKksMgUBex|E|DWIp@9Zn!;rmT6$Kim@VqJl-uW*&{T}Ng1Yyv; zwA!jx6uP_}G)Ik|nN-jZ0;-?c{O+WCyMLP`ht3s#&VjY>w1yyYlRtN+5cN{}Tc)H+ z3{|$5Jg7M~l*O4d1?4%^Ax1E5c@<$Kp{%DNa2YknCwi(5C|i@!{!h^UMVR(+L^w2; z8$4tW{A33jom5-z)mehCLBA$mZVDy@?g=4ZX2l#_%Ga7P<02%-5JSGREUz01xdXWw zrgIc80f*YVDX(v-(6WFUAxw2|S<19IVaCK+4-X`~)p3s*LTEt9+&YewCxOP^o6m+{ z!2?64$&FGezQkG-l+X~ve>9xo|KU(aHSZP!k&Rpo>`Qi@uFUUWtc;d-AUpg);1Xjs z3sm*t=WRjPR2Fk9>&vXyfoh#kx{KUfnjfD&2TS$tKY2?CC7=1y{C1lScwD=jGla>Q z1&*jpr5_d$K%n0b$z$AJA1Cljc&i@Y772;90N+YIHnN*Ry7R$c946jmHZa}COx#z0 z?|q^}eq&w_>=>nYz=v9wH{tizKk9K-)G+Su-yWKyy|7B1eQSo1oHn8~t7GTJ6P+p* zNr(qO9PNfLS|=AaA9Ij{x^SY)z$nm8aB2q+;>X$np!l`}gHQke--rs-v?+^DDTG3+ z-p@f^L3u};vWyfIB2)km@)mGWVIfNvz;zGBHTg!IP3^^M#S5ixy+fi20UXn@X?{dM zFZ`ytv$rR03d8UbTyzQ8-NSeCLIu&?6d1FT*~Dq@j^cm(27Wa6e|L0=8Cvj(Kk_?+ zwg`ga-F*QTZ3`8x`Yt|5$eVDjWN3O zq$x80MY{)}QihBB7zH2J9pWJ%u#;gJmV$(y|IZgH&Q5NlZSSiTjpiJ24x2M6%$*^C z|3Ssg`|<2s>TG6zahql(-Y&4Vt2rga2XdwoHerG$c-kiPEx2-Vyyw8`OO}DO*O6Di zM`9C_0mB1dmy^h3x$n&Qc!bS#98XhKR&bZ$gp>#Pe7$;ElpOGIrCs*MEeRqHbu{#C zHhh>U=-15lGy?Xq|H-47PL+P#xd$C3#~MyqIRP0YbD~-1bkr9De$slX`nfAfa;Q!` zqV|)2TgyXF4~OFcRWtyEl+c@@;DAFFdM6YiKm!<{NlU1^Fvu4f6ms8*_j+z%67*$`YUKi1OvQc{Jnnf z(6d^OhmKTWL|uJquB?)d2g4(*?D!B3%MnSfRIow+e5zbvH{6Xj z%R~b!T(L1$GaX4DNH_6B1Rjke-{s2f4TW?*8+o7{wS8=|sJYJ3SU*tIM!uDJA&Lb! zlzY1P{pjkgLrW$m#Z?)|LKax@ljHJ%kgJ~04(-UxNUM}cdgU2Z(OYT{rXt(MPQUC^ zDQ_yj7li#U4Eetx{l7Ux95&2*{7{}b=kL+({9)j+JM~7ksVdrImz?^eo(g5K;?(Ms z_3fqHBk1xjtwRN_0)Be?iTKE)1*RM5Et>@!D^J`Cc^jwd;%Ot^*6fZAO}mJ3z#An( zO4vtBDy-swo;Y^kY)cRJOt2sl2@ymMoHqsSN~~Xly#M?q@FLhg`dm>*0AuUjT!mdx z#UpH2L+@N>{-_|u;TU=+bBg?7Z%3+9NqAFO;C8gwdIg~<-EP#K*4yys$Unc2t1MW% z8$T)QS`bLry}kKZ)LjnCs41MN{@24@)9v1wuPl#EevpB;io+^A4%!a=bv5_pI9&2L zzeq;;53xyyzz__sffmw9bp2ck>xgga`eMAnDe^WVQOHiO`f;!((KOO%SSfotKcm1% zH`#>ht-eS>{(-SD39Z^pV$))SVPNG`3RlO-6?oGxTg4;D(-?<>0&aGUlIW+hh8 zo%7#k)hoG~UF#h}Fg0R5dM`Eir4w9op0xY+X7XR^mHH(B3#CJ~%%AEnXsETTccKe7 z(oSNR+T|mL@ffCVx&=Czaux}&;^py=bNZS8Ma-L`)D@C|sl*y@$!}5kp#8Jh71Fy+ z%j1_>R~Y*zn=pv=5~n|7I@d`*(B;VqS5HFP|MnW)!;p7Db zAM7Y#lry}^K`45CXJ7Zzjci!|O5%0&NdEEKde$FwJt(p}%1kKD_~O-Y4;%EP>t+5C zboA%lSvu6DN`3WgMOeF_`-iNK&jK@~BJY0NP(^|tchIF?G)>Z@T2&_#QTaLc>|g&~g7k#C&SVheD}jSfR^6oZiPd+3(>c zERWfmFqgep&+YT?c3sO{X%wBWNha-2I`|ratTSwn^k!t08HZ=D%mE~!16f&j)5hCO=tiBiYf!tlp&QlZp zpvMIkTgw`hhBT~wElwnU)KzAjs>m}fj^RA*yVY!c>eoMpWOE#l)h_EYa>;4pQ*Gu_ zJrRcQ-A3=zKWpd5?3e1cQ=?kM*0MjYSjK@vKFp3zx)mvM_Y`ZWV?=$|Nv~Z0`S3=70OF}W`rBZ8CakRrWJ~!b zwxRSMjB7e&whLNwVH~BIPj##7?E)RB^19=?i>@b^In0l|+k2FHGAhg_7XDDlH5LS? zf|2M-%NY*uI=;ZnZ@+EO;*lAV=Y{qLO8By~bW@Zc5pb3s5yXgp2%+fL>l=%0!TqrG z7%@zVPe|a%8}eX@VN)A41(C<6dv1D7)6RIzHt2(Wq~ovpG>uDK^S^WV425+RY|&%g zjei(2^_Qga7*v?MM25vUgSz-(g_pH0>_4Or1y|SUoF^h=`L-)I_pYJaHPMkR69s;v z7I;5Jd*PY$f>k1$&I6Oqw4+kOZY$L!Ri$5y+J(@Z;RJZHNtKaI(krAMN_2+d){!sP z_M+66{XwPav0U{f6*9c#UMcr8E|iTXCv-Rh}{!O%_XF zTHXj(M0zPr?X8~5_Wx$_`V{wqX|e)sZe#jSelXI>2k&_Rse(RR0U%Mp_A6q~b= zycMscTiQUyx03X4PH8dl8hcL6@v11d{m+*mup#g23vowY*0};uk?+4;R1`Pp%F6|9 zIfBnL0!`vkc8jejo@@3};y)Be*zOJHl>R6aJ$ zP27jmLjzc0^@1C$FnnP2=aTJrPDJmIB*r@y?2;G}$K>gW?%>}XBdRf>nZY6*%- z()BluS7Qeq2&R;jBW^z_eTO2kqgEY&7tQ{Ct^eR9FYNuXtS5;TALhyY6DWO?2hjP= zSY)MTool7<+>&O7iUeQFH1goCx7!+LN`k>ip>N1HSad&7V#JnNjXL{R zKIms|6ziLxZ46GC+kZJ@n5|A2#f;tF8Rs{4`{AtS>@u=!q#7A~Wte$!jc0v`_V0AF zkHm8S#O>?_Wa1H3B(m62 zYmf>iazI^9Y+F1<&=5r@QzFifM~~yDuEByQ_XHkqnSM?3%&&-AAG7+)-%u+{xoLyp z@s@t(nihv9sU6`{nou_pz=1L6y=QEfjBLEg78qz?>DPX5^e{k+Ev8D{_;>35xxOtS zB! t#^QWdpe`FguN!IKCnTZKAf$w55O{tszTDb0Gwmi91x``}cFsECyrWmog|SYm{W2sK}PGwqR1WC@Mm>BMK2p_O%kqS_xTlB$Nu- zmoP2%ecxx^>HEEY@AY24f8ljqGv|zRpJ$%uzCX|BzMu1ah%hzLV`C9!0RXU_(m#F{ z0372KZX;kAhxO-jR~QFo5B+nu0AT<0?*+xnu!}H$3EeuYrvr*wL?;*@uujK}j{)#H zhIRYWzxxACjm%Hb>GZ|L#nFY)w*zaHf2rHw-#4@@sy&X7Kiv`$@j&;*IA8GBStC}5 zD_7j_538%In^(VyPmEs=K3n&xF8Do?mjCI??}_z|jfBeaCttc-yZg^x@3zT*zEYkx z^mly0O+`Mo<7IcpN`|jZ=Ecb_^xMmn(b+ZM=*NqbW9xn2@^KMF07&4}@nhyb{nI~f z-1Aih?q5H|~pj8Xi5 z^Rpe}<*o42xyGtfN%TQYPZ`bJYEYw9+L-?A7>Cu(Kuv}9da5H`p`_=FQBTj#CHcg! zi;o}Vd>v`u+5E*;|3mKU@?-TaEveBjYNJ1rept}Z?@dij&xci)<}U@dW`)Tdt;!hN zDdMWD7i!)+o*CZebscmPeV%#_#CHVQ+T~JS(t#r6zxTE#@^BdZV3EI5Ks2Bn559dT`jm73hXBr=v@lILR z5MzUIf1P~a*s+q|b35BO-1wn!{WvZw{_y*HrJHM8P$jt>> zRE2PhbYuSG7Y>Q%`Ri-Z+uCxz`>Vg7scbln?}@$Qc>ecqA4AFVy&c?+O0?=1?)B0l z(y&Lq-0bE+;QkjW^)cp>wneQ>S?-GmQlH!ybt-zJ_kJv(V0n`DJrmy{T0ui+kr=@<-E}JEwRVG8apJUp&B@3g*150{5k~>)8w&AA}sn?2bDqk|O zw!f?%CH?L4MY$?bsY|n}ZpYpR2;Sy(dVkQ-U%X>81~1^4{=U&qDb!%jqSw0Ws7%^z zIpche)q5gi#eXlCa=`QacXn@Xt}A^kA3**_u3aAS-gc86yD9Rfbo}f~++4xeukT%l z*W!A)r?-uFC373zP}WZOZk4)4M4j_}Z9W~_POS{*Jo7Nm=9F}bn?qdw`P$rPD;Z65 z2|4G3TVHhYbQONp0!!}_VlV zAvk1@xgk3cVS>#nGd^Mg`aPSeXDR*}eDcOaopm2d;_e-QRKFIsHYGkft*i!gnXbI& zMkcD;_nu)L>I+Q$uFbv5^Hi(FD`79T&3y6Gr=9?P4gNhWw*2PVP-vw^>j?n^!+4gQ?dKD{g$@G9Ysr8-`}UPxm^Rx_f(^htUH0Le zp68L?8nNiM*STxp&$m7De7eFLbRkzrHEiRl%O9s(S^@fNw5-{s`E&Yj#EtXKLCc4L zKgvh`MhLaCw7%iGVJf4MbnJc{ksS0w_vfa@`>0=%#=15i)>)z?QYfL>Jr_TpvHg45?RSyr-L>JEq@Rz3(m=>PD`0-G54J78Y z|2;3!n0?Nza4gW+B|tOBGMN5oNx2}fr|=I^(e8LN$s*JJ>SWQTx8ZR1=EuDjY7-pa zu6KHdI0$}Qf|8^tm-egPf1kO<8T?eBU~zxRJ8`@1hg$djw6njEFp4dU_GM93K(xNT zqb{+FgYDJ51`hX4GGE!#N9RtyC!z=c4vafpjZt{cHezvDT%pOg?6P2-c&&r8cL--y zwriaq6V+m9_f!ghMayuUZ-Q!rMM14dPZGz%)IqT1B&E`ps0RgHlwWH)d6naseVpZq zvz$l1Y*$&m%V?@*)_iGR(s*cLX5#w2w%3CT{bu-y&4gv*%hNJFyroLOLApcm{^WA_ zB);A+>}k!|Fs9VyN7=Pk$*Ot>?UVhuk#g0(s*%0Ft;^PL-fyT7>hNs>hl*U>%P*KQ zqXEAx`7N2MK3*F*KhVe@0}0xlU-;p9Qz(#6y?k{@Jsf?7-J8-~`u6MQZR$BR~79AL^S{%m7l9M@kr zmAiVZ^)ha++HF41o33ZQrxY>M%}X<;20e-LYK8ZDwwJADpa&*7jk+vTTwQD``OKL0 z$KYp%4pGd$uIKOZqpW1QqfJITap33;EnfC$A(gO-jh{G5Z@$R4G?m#`P!elZ$w#8A zkylC3*r((}?+bBR(|`LMLM^5h%SK+tCVhGFv;(p>$d!M2e%@~tT+8$xE?!uD8_)T< z;bTA$H{$SIJM&F=cCx3WG}IgM;9F5S?cBucF*P8=mzUo&s5T8vfI)v2 zOoC3yS0b`A}(rDI+lrm-Pxax5L{T-WNN3d#cFStFqc2->Vm&J#j^{ zBM}mmIq+yOdGDxk;h33qP$cN&%R8CaPxRQ70Jj2~%4=Pred-%CLRmp6N?tvQSgLc> zYhzodjBlW+nS1?$GWzQb$XS|kK5M!Q_Q=C$9n2gEdaKrUul~=qv5a(RXp7g$xBN1Q z4qWO?R=}8c-CcWkzX|JmM3ELLCnWh!i0Zux2CA9H|1`b|XnOZjq0>jdYH&UDW?lUj?5YaXl`p6-W z{tD+#^Y;GDMF;$DUY{5#c+27bLbhtn*z>k%YMQ^4 z&508>2C?T`yND%cgXur|OAT4l+Y9F-YBUJwGX8SWoFMWp7u_<+(8O6n&g~_dnwY5K zh0XH2O(iw%9f=->VFO!IL$_s$cOK-H{5gV|fBWMw`-pK(H`9HW53>H5rDal@LEo8P zc@WWsA4Em1x!q=ByDy&nre+1V&A=sWao?LD=M)<`pUZ{4UmnaIQwZ=Enq43&et5@k zrySv4>Lp?EJ2k-d4u{91wV5}5TeFIos1?ntXFuS1=t8Hgrru{jmIr*6cT@M+*=by? z3i7%!;T6yXN=GiQ2pi2_nb9OK{5H8>@?C+W(dpRf8p4i%-`K}=skirk*vr4`<~+=L z_n-mgM!P?q&awM?Gr$l9aA`ZGHV64{co^RvQn!Eo`i6YXmRUiDVMgT>W_RsZlOSFe z{V6mo?}ZE;vZ);Gu33M=*T3_(_DfCg=LbyX@m@&8q)d_@4e2ev6scP98oYI;EfwE-qQ!(77X4~xe%xns`{~FtUW`$zm5-s*Inkdh7o8vN zE7EX>3`}CZ?p6yV>`gNXoC(|B*uz8GlTLbnf+d~g_>1Rz?bH2fdEVT|NtETczWpq6 ztY2c5PhYqFwtwwUpv%4R0(}QC+LH8We0hpUtrT#o;eX+NQ=#k)jcdgucG2PQ9o6>8 zS}?z7lyU`VC`6dV3iTnUnA}nXRrm7MEO3lGt>oP^+?f)q4=5Toqd!^QBJ^_HeJ8Gc zuRRs*b^_#tax+D0Dn_nLXCgDR&ufdZ?UA!;YOOrwmMShS^+?hLx zaO&JLR|#araEfQA4n3FsQs+M!M<$4ea_aoAw`*SZT3kB%Rm4=TJ^YYvP6f+Npd1S^xLS|1>pNEC|B?(^9q&T@Zx)??&f1GNFH6 zJP26-(-VE^gMjb9XGds1z}^4e8qes}c#q#cUF~bbYBjRkCA~_ObLr9cb4I88ub-SM z>@jg1bFTKjb2c_zIemDz|9bt5$UssJ2Hs#}r&nITyvlArR}wasSAL}IpdSdZ$} z`!?eYeiOFxXE?#;+fXnv&p~?~*{9AKt4X9+KBx)lRsU4tHIjM1wh0pO3$y#ZG%_rv z!ng-~)VA4J3zn=Os$<3@^D#CWPivIT9nRhz}zk~A*6{6iG2_T^zt`M7gAO(OlYpz00N|U`j002 z{;A=5Wb?8nhqSBTVY~ah^CUow#`IYS(>EPuI8Cp)te*U?Y6GFkut#kl2M$dX;43*Q zqsNRC*F$ZG=rx?5lU0Dg0hO!=I6+anVWJ-i^rr?DgZb#1q^73tj<+s=BFp>%Ok4GC zFzhv`u8UD5;KLz&6=gxVZ!=mGZJ&Nv!$`OzgtWJ>ksz>}X5>&)Q#sGF4dh)}JFh{rv7pBem0VaiEipv^gM%Gat zh^lBw-2*wFv%-`3sT5!Yb@#!<#~9mT{JHbrv@rtfMSptt(^W*~OrY_koDiI+~}|u6pmA61G8bLLX8gM31AF|X7%I!Zw|hjJJKI?7iVpVIsG5^i1ZlOn^}j_u*TczcFY9PLHWa_EAeXDa6HwD2!PMZP!E;FTt-xgt5DlX- ztAO}7Ihr%5O5e5ophi+8)SsT0|bx@p`Y>o4|Wa3dc15(?GJkT(`%9^Qt$7B zyd{1L6D+kcYzg+@Rs95dmuBTz)83=N!-StIp_&n#_!EcHNTa?_L)_-XS5n9fHGek9$~0JRTm2Cuptr9tFEP%&Y_ zrTId(B>8=t9`*|Lp@-QNIqbwJ1(KqH&{m^U^SC9eW!jp?dI4gu?8 zL23=VE(x!y3=$rHaDp?YY@78uf$1eR%LA<{AZrLrYl*oY0Ed>k#rUb)_Q>6)s+M~= zg<*r}JPgHGt-E9m3nAVZbe89AE;mN@6CF@}z;r*$n)$qsg4Wz#s+HC=eq=8VGc*+jmPQEY~)dh8SO^TQ**2o_6VNhPZ*W{90VM*5MNlaLHFVqA ztrwqQ1>LfR4}y$BekkL|xiDDd53Fc4{yP#Z-xDU6?*cfHHuK+NOJK$LZfQoW+HL;c z8%czKL=Z(tI{N8)qxMUti>{C(_E7wK7%oo^3^YM{WuWlph8RdY2=3jE<@D>D7x*b(^Z6VEJ9!9_feMs<=ThKjZ7xaOgdKwHsOq>(kEyh;3!XrUW){BUtbB-OdX1 z6KH~{dSZY@%j0upd&mQcBu3t}xgiEPfr@~RpE8tHZ}TgMKz_~v8X^>K7FK~0Qx0c8 zT@dSwtTCgO7+5a~>V97fJj#IQ)Q0pLlKPc0U2~QeVoRBU#%&

      I<9-=4l{lE!Y8g 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 LbRL#HK)(1F#U{2* literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/n_queens_problem.assets/n_queens_placing.png b/ru/docs/chapter_backtracking/n_queens_problem.assets/n_queens_placing.png new file mode 100644 index 0000000000000000000000000000000000000000..5072990dc2a69737bc91bf5dec6ea99f03a37426 GIT binary patch literal 21601 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/n_queens_problem.assets/solution_4_queens.png b/ru/docs/chapter_backtracking/n_queens_problem.assets/solution_4_queens.png new file mode 100644 index 0000000000000000000000000000000000000000..22a52e9dda908714261043535c0d23756fa5d06e GIT binary patch literal 5624 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/n_queens_problem.md b/ru/docs/chapter_backtracking/n_queens_problem.md new file mode 100644 index 000000000..9c559dc47 --- /dev/null +++ b/ru/docs/chapter_backtracking/n_queens_problem.md @@ -0,0 +1,53 @@ +# Задача о n ферзях + +!!! question + + Согласно правилам шахмат ферзь может атаковать фигуры, находящиеся с ним на одной строке, в одном столбце или на одной диагонали. Даны $n$ ферзей и шахматная доска размера $n \times n$ ; требуется найти такие расстановки, при которых ни одна пара ферзей не может атаковать друг друга. + +Как показано на рисунке ниже, при $n = 4$ существует два решения. С точки зрения backtracking доска размера $n \times n$ содержит $n^2$ клеток, которые образуют все возможные выборы `choices` . По мере поочередного размещения ферзей состояние доски непрерывно меняется, и текущее содержимое доски образует состояние `state` . + +![Решения задачи о 4 ферзях](n_queens_problem.assets/solution_4_queens.png) + +На рисунке ниже показаны три ограничения этой задачи: **несколько ферзей не могут находиться на одной строке, в одном столбце или на одной диагонали**. При этом нужно помнить, что диагонали бывают двух типов: главная `\` и побочная `/` . + +![Ограничения задачи о n ферзях](n_queens_problem.assets/n_queens_constraints.png) + +### Построчная стратегия размещения + +Число ферзей и число строк доски одинаково и равно $n$ , поэтому легко получить следующий вывод: **в каждой строке доски разрешено и нужно разместить ровно одного ферзя**. + +Иначе говоря, можно использовать построчную стратегию: начиная с первой строки, размещать по одному ферзю в каждой строке, пока не будет достигнута последняя. + +На рисунке ниже показан процесс построчного размещения для задачи о 4 ферзях. Из-за ограничений размера изображения на нем раскрыта только одна ветвь поиска для первой строки, а все варианты, не удовлетворяющие ограничениям по столбцам и диагоналям, были отсечены. + +![Построчная стратегия размещения](n_queens_problem.assets/n_queens_placing.png) + +По своей сути **построчная стратегия сама по себе выполняет роль обрезки** , потому что заранее исключает все ветви поиска, в которых в одной строке оказалось бы несколько ферзей. + +### Обрезка по столбцам и диагоналям + +Чтобы удовлетворить ограничению по столбцам, можно использовать булев массив `cols` длины $n$ , который записывает, есть ли ферзь в каждом столбце. Перед каждым размещением мы используем `cols` для отсечения столбцов, уже занятых ферзями, а затем динамически обновляем состояние `cols` во время отката. + +!!! tip + + Обратите внимание: начало координат матрицы находится в левом верхнем углу, при этом индексы строк растут сверху вниз, а индексы столбцов - слева направо. + +Как теперь обработать ограничения по диагоналям? Пусть клетка на доске имеет координаты $(row, col)$ . Выбрав некоторую главную диагональ в матрице, можно заметить, что разность индексов строки и столбца одинакова для всех клеток этой диагонали, **то есть для всех клеток главной диагонали значение $row - col$ постоянно**. + +Это означает, что если для двух клеток выполняется равенство $row_1 - col_1 = row_2 - col_2$ , то они обязательно лежат на одной и той же главной диагонали. Используя это правило, можно с помощью массива `diags1` , показанного на рисунке ниже, отмечать наличие ферзя на каждой главной диагонали. + +Аналогично **для всех клеток побочной диагонали значение $row + col$ является постоянным**. Поэтому для обработки ограничений по побочным диагоналям можно использовать еще один массив `diags2` . + +![Обработка ограничений по столбцам и диагоналям](n_queens_problem.assets/n_queens_cols_diagonals.png) + +### Реализация кода + +Заметим, что в квадратной матрице размера $n$ диапазон значений $row - col$ равен $[-n + 1, n - 1]$ , а диапазон значений $row + col$ равен $[0, 2n - 2]$ . Следовательно, число главных и побочных диагоналей равно $2n - 1$ , а значит, длины массивов `diags1` и `diags2` тоже равны $2n - 1$ . + +```src +[file]{n_queens}-[class]{}-[func]{n_queens} +``` + +Если размещать ферзей построчно $n$ раз, учитывая ограничение по столбцам, то начиная с первой строки и заканчивая последней мы получаем соответственно $n$, $n-1$, $\dots$, $2$, $1$ вариантов выбора, что дает $O(n!)$ времени. При записи решения нужно скопировать матрицу `state` и добавить ее в `res` , а копирование требует $O(n^2)$ времени. Следовательно, **общая временная сложность равна $O(n! \cdot n^2)$** . На практике обрезка по диагональным ограничениям дополнительно сильно уменьшает пространство поиска, поэтому фактическая эффективность часто лучше этой оценки. + +Массив `state` использует $O(n^2)$ пространства, а массивы `cols` , `diags1` и `diags2` используют по $O(n)$ пространства. Максимальная глубина рекурсии равна $n$ , что требует $O(n)$ памяти стека. Следовательно, **пространственная сложность равна $O(n^2)$** . diff --git a/ru/docs/chapter_backtracking/permutations_problem.assets/permutations_i.png b/ru/docs/chapter_backtracking/permutations_problem.assets/permutations_i.png new file mode 100644 index 0000000000000000000000000000000000000000..f47f45cde4c6ced85868c2a5d8e988cd14de0fdd GIT binary patch literal 13552 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/permutations_problem.assets/permutations_i_pruning.png b/ru/docs/chapter_backtracking/permutations_problem.assets/permutations_i_pruning.png new file mode 100644 index 0000000000000000000000000000000000000000..f3074aca6403ca6196f6e06991b54765ac400ff4 GIT binary patch literal 21640 zcmb@tWmr^i)IR!5(5a+IDJ6|aHz*+8Daat*-5`SqNC|?3lF}t1Ej6SF(%lWxDAIL? z-}{~q|MTfw*Ew@tvuE~t?!E4Nt^LHFwfBUptI8ALQsDvs2o#<_(*ytm{S`Wh4MTsN zW^FB`}6^Yi}xetUcS?EFFv4UNvu zu8jV*#mDl+6_x4f>A$8{MB>7aQSCe${U1Mm+zog`7Swx?mK9O9Wm}T#BRX3K06kE6 zCavu~y)%pFmembKY6MwC=1HM=KT&P#uHW4B_G&$di*`F%PWJ8}e^25-_q0uK?#Lx``kg?f7mtx}=|FyMPMsMv&|{ArIJA+;Gt_X93^XF-MG>knSNgZJ6Snv83A zts(F|YE*3J5a+Ug?VsOEM_`r{xuz0d)$h161jU{eMXp6hvsFgRCnY!njU($gcM*w|S^M7t1@%#@6&4O-~ z0%=&-{=Gnih}e7j|J>r@V`l>B06B`c!6A+6o9lm(2qPW*9aD12&bn^pWU%2h7^lzi zso=Q;CUO36bTa-***zs0IS#_#6{r?S7F9pzY;i{l5oR#idM7!K+=i<5{G1h0tLc!S zaT?a^+&rP1ov#OT9$-aCD7Sa%8yoNSEG3aCtISxsTcFWe3ED)w+qh$tX2=E$7MttK z4tDpl>~8>buL<`x@pudB%F3iK!wI3opBIRt;N$z{3E;$10P_EN^Z(rgT7ne7ASRYt z{Gx5I43=6qSnT`MsIV7D*rpPV??L>H?#+B-XFx(9A?cAsEU!fC!QV0{<>cTWZ~WK8 zHH^s1VlYkUsrG^r(y?cQ$AFv^cQAz$H{^3hfmbJ0A$O#9(rb92@8(9xG|^+^XByqiARhMhS_g7#eH_X_RVQ_bF#RuHK%Lb_kZp5lC{ ze+wp}Mv3((|O7D~6-f+bIq3^3y=&2PO;GhZ*f2Yp?NNE-bj73JXn&W5jN}fbNg* zwOsNWMjF;XpYeo5jZ|GG-TWOKFY`#KUx`s@o^Q#JG}%puc8_52h^k%4d}iL(h+H@J zUj>9`4e5|(&rQ+eN|cw|ELT8a%hjCmt=D`!gv(2q-bR8WseG{pyNo*->iYZIr2m~Z z;t11O`@L#P4dnp=JjCm{VV)MYh{$S}zyM;@O8IH@bfifymP7l=_)AZWs2wzGC5Cg7 zvfW~Up_dNpdymg~9vW3>D-8^sL8qSuf3dgRlSWj3 z?BdlsjY@2U1nt9cD+qPUlqb(UdD)eMrN=YcyP>PQVf7X%Rh{pW{y6-&hU9_tP(K>( zu>440eewPLlH(&|u`yoccJb684Ln@eD$wBuw;><=eG9?Ax@3PzJNxLI+X`Zz$3R-? za^dnf!9D4!z?GWp{9E)A`;ShKu|75mhL@p<(L{Wh?yC z!=btB2jmR8u*s$=eU_<*foHu3pF=@JtD$y@gHj0rSuMW#RW;Yk z1)*-a{8gc(C*G7WP6sdCK7phf^5Y>syo}0LO|pC0|C9n^6s1qF$fXwA{vb)%Adoo6 zPvvM0gCk>Wgvt5eb~^+83df)Z+MyC&z-b#PYO{CXnS)HvW~N;OQ2ERHq!QFjP)tB( zlT>a@e14igc}X@7tD~%-MeS+*oZEb|5qw`(v~%b6NL#NMvN!+S9#j9{)rIpX(KI4! z^k{7^$>W}P!CkCqv6g5t8RilWiw6Vy+jIYD5#o|yCZ;E}{b56=xyv0?=ese`b@jdJ zITx1T@*juhtN+|FBI%CyzY>^mp}UzEG0|EiImI7>rPThlhG(39bg1fV)X&Mxf(wVo zR|PzMGoMd`0he3}X1N62sx_AbXV{|wXq|tNS|TdoMpyNp9}Qt3X(9^Rourp~zH0Gv zXW6}ds4q(t#bdcTnpR0sw3JqTvH_9nJp@m0?!AB5oQgRTy`{=fa{l85-r}ncUZjtg zclK{g?M|-GSBar}dgC3k^>nJpPcKo+g}RnVp8yHj^MjRTo|Z3^@4?MK19VpJU;e`H zQ?jHGydq8;J~a68=WI~s?-`5q`w^YBGcT;YA4G9GlF1M*IS$w)jgDgm|L6+Ryhg6Y z|J5ors#EJLoX1GQFtrbw+~@Q=9~q3e&1sETy=$)zk8xJNyynUhL(A2LL*J2AP^Itd zaRo`Cxv)7OZ5JvDMI(Pw)Y&^P2*-A_uZFA7yTZW$;>zpief6lrd_x21kEFsSS4_%* zjVMzw0-jnwTzV7ZqvpV|n*;hGc`G7vc0tk=C%;ctrz4d_l2jTUD^8*Hw8YEHg0$AZ zclnArCBB>1@drlVPGf?^EkuaRs+6pPk<}B&@>^H4Hd8GlhmPT~<3sy%|EaFCyob8^ z=EXc+xP_o((l>k~9a>bZRMvQ7_L4VKKMa$UsO@^M8uzW%#RvOq<(%XSGEGl$sXuV! z?s%i-i;RZnc$Atkn(b&mJ1*g1UWbs z^h_>B9qS2*u2{k!LQ&tX(p5*08btMN_bBuqm$z3fXZH7;tHI=6#+7;xKZ|L%cE{b2 zAnO0&-V-j^-+$ow}5xkCk0 zT0AgfFPBZ^ysnOrS>_>J;qk4G=zOld_}|yvua(U%mVXx(>LX+ViKx3wspYt}1wJe3 zTCL!Rxlo1;v2PO|zxny?ye_{;toIdfbqt~6%J#m(FpGykC)KkRXU#;D6YWGCLdnlz zlKbIeQCxfaj=<#XPi@b*&+#`Um+h;|3aaM9e4*5X-v<*5ZA)R)*OxDZqF&F5^<5R6 zA83rNhNwSh-D49|VOPuz+`^fcNNbn46umo(JW*Z?*#OTS#_XA9o7 za|5)ad7x~bv@^)b4=&r5C;)Moh7;&=`9Cao033;KfGiRK-5Fd!h=p=^80UZkuwaPl z1Q|zm@a`OxlTL(TdHy8i-Awi60<+(PXMUg=1R;~kY_k%WQq<`Tfc=F89Y*FovN6sh zWl*4G^=&LS*B=`x=? zX7NC)2&J>*?rEH;4h8vVzF&OBh+>QiC{D32fZ`RX9X2<|=gpg?{OWI`)|WzzIA z<%<%km(c7j>oiXnBAOzy#@bs%BY43nHQ){1;sU|jF*qGdRysk&ibNX=s_xW?ig#Iq z{yka#3G(b1zyv1Mr7n(v+}aW&?t(~E5R_YHes?v8680L?$`XLX=a{x+xdVkz7^($y zQx;i)1M(Y6tW#yMVow6N3q5N#&_anq5ta(f?QsgQ4qSs2Ld_^yGPgub2Kkk z4dMiV(FD)zr^!P>ko%&|_*2k2&0EQ+>G9isRP?6hKj}kOI+1N-RJK4(!5Y zb##7ar_nQb)@5K*GrwAy);CE&}pNA}pxbB95SdX9^ ze&FJ54OCl~1OWHg;8*E%)%1A?q7niOC{8nA#9?8Wi=@=Yu*D;69yG;c8eneltJVhA zv6K!{HMtK00J#d=1SaJipm#tIMs%KkLdrMi$m;DjmEPnjq0?Hqhf&&imQOLGXx2g% z6ono=`G#UjPS*)Sv)n{}hfZuhlSIh#cGcfO!y+C5{fY(d9yn4@2-Sa~JK-jQl(E=$ z?~a$Gw!+3JdaV12>=2*|g?4bHMB6#PWv2yO8g?@QD-jaL7v1MjKiFW$K*a=s#&q!r z=Mg+I-$m#TdQv+1)jkhClDJHgAcLk?E#u0rwD1YNB9*}Rr!Eptfo~WxS6Dt&qW(d2 z{9a+C>|>2EQ8;>D>|G*+EY4D^wvEg(+?n@ZZNiO5II```e(Gt!7!)S!Y2giaAlgj! zebYH2Y~;B}M|jfHKF^61ilX`%QXk;kiCo)!f7dQoX5J@BTvKqtGLFz|2@P_Y6uoXY z{kMI5ulw(7QvHP8-p`Zw(|gG&_NCe4B?>E9=f&=a#s8In_42kZ$sZnE{f-ffDy_;i zXQ(&(Y5!sAe^wo)7o<1Wc}zzq-Hhl3i7=aDf?h5Q`rm@nyKmIlG9YOnutv6-vFJ?w zLrAQkefx+iOoMJ}JBH{fTMdcIkh-Q&6uPhjM`A;y05(|2`J3VT2W@zE2w$`r-`6sF zMDh)KJHI-=2eZ02S9)<||G_I^nI)Tgc1pV7_H6ePAjt!t{m*$9jE&_4Me0>C1)hir z+fgme*-7j-L}=d-df*?!-7pgQrA!7-$|l`nOC-4OP)*OVoz_5~KJVD3pvc2~4s%i7 zKobM=*4KOEaKEYmS}Gv2sjl{Qny4mbPOdb&Gs}mn+1ephakoZQ>n;R(D_h=VG0WOa zm#2plOvvo)6ww`xKg4O972`G;#ld9~u*8X_pJ*gKDy$H{E1<-b2EWw;M`jZN<5f#? z(Xv05>8RN40MFK5D(CfpjnkTu$ZOnMt~iC-3i)TWoUdWAY&>W@a31w(4N~FM-Hbl! z>l69ySkDmM8O^+)IPo??{YOabn-D)1C>ll#nt$r`O*5GEgJhdMn&77thxG;ABfEhO zgS+o^4fF020LU%>{>njV^w%eVHYUg8(WCcvm(xgY0i~O*`B!9V&&VhNREqBkyIePU zQ*~Je=A1yj-trL}J+h?!Svnv+N!>LVDIAbr@b12FK<3>r;PibMMDa*EUBLeLG;Cqa z^B>K+0fDRbhfXI@C-?8wGd!E*j!#R-bP(vA4K+l=e!V4J|7)UyXsRaZ1Crv?+ytW{ zuJ)r%s1WHKK8GN-Mqd2T|0sdb9x;#C6S3h1Kx!HKV%6}b-|~(5-n%J%!2tTI+mrBa z-hu0&?bm5Ss}sQN`GwIxx8?pN4bMKqmpH}7wfMlj;~Gyp2yz>@)4KCrwhRWgk5>2d zpDHSLT413iH!*+_lTJaH;oJo$2vs8v{d4pIgd-a``{h*GUDRUUu!`5DUvOVf``kEBF zemk2<{mWndTR=CU^?Iu+j7$2=i{b2h3m(wK$it1gKHi3-)>_MK*&84{qrYG5sgRx? zenYpue>@404EVj_AStZ9_3q#kxR`qZ4;KH)F?sb-eiA<%dfRtD=)tY)^6%75u#e)9 zz2hldASn4&b5)pg-cH2>3Gh;;G%{F$dAIch6L_2*>EgwpP*xT+BaEFv!By`~gUn`IAFp{uVqFXOMzP z*}N98zOaFn+pyTf4yp$JMG2+BoEL1*UNo1I-G&R^T{1|0nab@4l<6>Mr}s=&!2TGg z!2<&sM*h!mh#pYKe`L3tTRtqU=Hxd6$Ihqx6d~B^Sg$odQ|+{N1zlv&`P_qq22H2b zl7pBF_rFc$H`Br(u(>4(IInuO3h@urD4OjDDYl7^>4j#^II(KqVG$DRW>t8kLz6hc zEuFVV45^Wa?$NYzF-X-O<`bY+nuC>I<46r{UCe1=(B=*cC06+4&YyKj__E?Wo!YG> zHKh&{5}TC8=~Id;Y@Y=t1Cde`tdS8Fu>{54}fneUF93f2!Qv3^ei} z-um;!M$2tq>f(j^qQ|sxOEzVJXEKoN%pZL5E zgC^gJr&j30@1@@=MgP*;Od)xO$R8_z{>g^rV$2iZ9eBf#KiC0n8N~Wki*~~4zeZEw zET_5AFwhwz_~#|t*$cye2hURm_Ylu9l&ip%i!dG1#2}{L8qAl2zDJp+^i8UsyI4T0 zW3DjKdHMN|mbc=D^-gzwFMSZW({)Bx_t-rP;}i0ni=~PZKD+HcJ zK!p4wWr$*`!)YL^-hACk9H@9rlMldM1M!*!S+cS4mVz1ZD2xjgYYN;k2h0X;4n?w+ zd$j46`6y^3juf}hU6_=d$hA6~r}pKTx6A=O6; zLXy+sfOjDCyM4IY1_Xu-w;c&4L1P`hj9+T!u=sk%rJ*%q(u+=AbUcIdtb9}mXe5w| zfYYgw^lw7|iCU`rg7)9lAxQ2MK#yXx0)H^lHBgLCvqdZRDj3D zDj$nQ``lXeg$?%V6m7bBz7%(Ta{z69Tz-Qf*(w|*4uni#OjB-mH?wzjeh#&}&9DyQ zaXCFD?l@{W7om+YX$+*iJF{PW^^%^*xyJ0lW-Csj#59*uC@rl|J_`6_ftJfN_j_|E zh(Rj@PqI7CCN5vfG-MR>Zc;>xid>E2s<bv!RRPZ~yTsD!%LN%6ddpZs3jZJLH zP4)qLxU|!^qXFT-9t%L#ze})4QrL#6 zAAg!w6G;RfD4HSnu6~LU%rzx_#O==BJ`2+W#BVZBe)EZ4K7|Vg-QmL(l6587FrN5> zfdk%V8Z@B(ob`~Ni`&52f@N-m={;p;83|sFKg}fr*wRmQhaI}!N)q)8o-#&5RpS;2 zZ#9wwUwC7kIQ<-%I2=5{_FZ5NxLCQ;W~N7b z8l3IuMqANZ&pWve0v5cp{8nH{VtA7xx8LN)X*Dw_6us9+h}8Ooyv=l_ThLb=q3f?h z=p){&cWatK-(NdZ--aS=`#+@Cueo@{8Qd<-t#7S*n;z1{+wjAR0L1OC0n`~6a_evi z1M`;j4Uj^c>Cx-LTlzZGEx{oPdY2v!L9?OdIR`=h2jFZB?7f(Jd3E;`bH#(dlL$=? zwiAQ8yWq1t<#wsV(HpC+*bPx?``@N$H;WNqa%!Y9%ahL8GczpkMpc>^4j3z*z8;kL zG>EsG@8L7Qydy<~Ufvfgcj9}n=&wZFoTR2aXDSnxR;7sA(b_V!bIT6>LFN_N8+vOD z@DVOC1yi3iskorWHiUo|4_{8f%Clud=CIHb^#H0TE(QY+9mzTqT)ImmMy#Ry7*Xon zD29s9?S3R>RLiYW~iZNa0b;MF?Itsf##IlV#Wia_fj0m3r$#C&EI zk!zRtOR$l)4+xIi=<80H;C+2pYj2DYtrW|ck>7NvkVTwHfA~T?0ev3i>ENt)Tm9<4 zN@AdE!K!#}fT=bKq*hTL(;x*I8KJI8 zyBJ4h#DInQ#!p4K6*om!d^>kCrcrfS?RTF@JQyF0&fA87 zi$Wl4T$QfUb2DzNS9vYV`wFHaAS>}ExLmg9?DOx=w<*2H65${31GiB09lt4!K^uja(50d~DohZHNSOYG-@SL^m zFYOZYGRA3*^al=TD0X(Q>EnmoHmf*wB5T8(WoNpe7A^!5FOUR5<+c&aOu|nOs{jlb zUbaGw;;&dHjSSn&9u3)k{$;MuwfCSY((V8O5qO^_yClOCwLnFzJuCWlb&Rg~oFNK4 z>Qu)#oG0omwfj?BuOC;LGHzIh-VwBltK~0I8B9*zHQh2?Z zb_fQO^}k7kJ524K{7^feKhKYyb-cOGaS+<#v@T6`*IF-4x%zb4FZs3A*AH>F8gCE|`1e}Nr<1C- zt2mccF)(GvSKOn_0UoWhbv(7dDs9(z_hniSfm_cLAX)RG4i(R~(DpA7xyld>p~BD0X_%SR*hf5?_YXL}SD9;mqhmTBUVZ>xM8@yOPzJCZ zIME|IKM_j`CZBj|7SR1&EyN7G2_HInM9^#sQEZEmRw#@~Vh5g4H1?@E;~4kYBU=kU zcCdb;khQTRj<8!%8cMAH^@}@I6>1zc^-3BosQ>zKA|9jL+RbdmrKqm(-aiqzcfme&bN%yp0jPTeEKKN)d|XoOg(eN5zd zgACY|55zLyS!U496FC#qb$`r5YX(=}x%x+UxEhWbDOqusfp4-Fs8A_C5h_nf0o1Px zBeGnj;|1^-@aLE%C!{(J^>p>DtVgX=ej(!uBMmPdW?N}XSh9{5;=)wejDD{{?G8PN4t?o0m}Bpza*yrqSWYR{0W=YlG<-@}qZmSnV_%vLSU$ zei8EgllSU;BxHiKAwqJ&SPuQcHb?guC86a{RvZO9(DzL~iQe$!Qq@7!<}Rw3rcA3{ zl!#`dseG$XXHw|l?ceLI@7|*fi@a-^1{UF4p&t;H+`kU&6_V(w3Id*h zmHeQ0EQ(6x`Ec-B{%}?F9#V%@lZqM(RfQQS4?FOCi-|>!C?2zF{)aUc0BHM%LTLSd zJyYQ#(t@g)C^>~CnA?0txavo?sEnsX&HI``ik9M+1wcER&N+x>$)xhp^@)dh84ktp1Q4zk~YNa-WFj{^B`jJz{G?dh!# z*9}QVi*o>}-7lO3$hBdh&kW^hz(Xw)0;T&l*jRPOO0;r9z${p6SY&tsR_K}yEV9t8d#|N+AWes+2?EnQ*h65j|Q_TaK zzqb-`qWUpC*Z6@f9m_pOjkPRP0P_-{-F#JF;*uTK$W8vAUh!zix})28p(wytL}8@s zdkhtrKFisJ=o>@Tlh|!Oj^}D);jm5D9$F(_!F^XPGocT3LNNJO3s2R7-lQ=S=p$IN~uL{eG+7s1{t0iBNx7 zqIL60vlW`!e^(5qJ}u4%2G`34&DUmXm%B16lNz{E+SKwh9)M3qlpt515}3>_hLJB4 z(=a0Hn5z_ZP#5g7WhXB}`#pCXWCE(T;7m6%Dk7rwKqRzqjG;u)0i&Cj)>H z5Dsa!ilmfSw^~iqA&!@M#cFgNO^L=k4;t}ui4sfGX9D`Rj2GRc+~0#RRl%ik7QP&)>( z9Dq4bA=Ij$ICPj)&1``ufcQMwx-gF~F=tb*#NDkKE_K)&3F%h(cn6M>&-UtuY;7x2 zg8GLhD-8t`T1W1`w(D%QT%e|hH!0f+r}Kb*Z{&zUZS&{rG4S#1Ar&qvcc@_$ z68CQ0;}IY@_3n_=#j3MEz;>O(+7a8+xm6xthqLNp((XbS`PD};m zem|c}Sguoy4Tr`SuhRWdjwyNUjR%qlXv0tr#gOikuduh7daOjY>~7n7Mp~69L7cj? zo(sW#=m>v2Jzlm~F$^Db5s3aB5K)s{aprg!o+PnVm zwd%YkR<|xB)*%Bvbsy=z&DdQE>}NhZrNJTK3lVD#`N~fy_&tyFP2K0FSyb8+YjIoz zl>l}^4+q8}rI5^YJ_+Sp=VZtt`zB>~yOy&azavdUS^@ZcF`+ZMVoa_WeOwGP!jPJK zjNySC^vP4%d36!e<3~HGdik4nF;N6{1Xiy-G_%vTKn70G&v9PLQHac-sW{5m4f)|j zA{Mp*#yFhcqBFeZp*>R^*H_XazKruvrIj6dBk#m6vRx zMeqQX-!rG;Qvd4=HV*lAruu2<&Nfhi{8N6ww}t-ABaBW@L|mNVHoGe_tu@Eth3mOr z(2A|Ad$%q_kl6$4K%xV059D~)q}M3q^Rmx3HyT7LuFk;M1o;T|z{^p#!fLh329K!O zb&-fo4^2t-`O%x}vF3r8afcUXcVxVgWyLW2t2r-*1zR3&$Zg_$g7Zh{jM7ykMJFK4 z0T2m;Ky%}K!N8Zndsu0Dg$+IH5Wpb_i*;*u!TYyRHrnzhbaEh2QxYF8!Uj(E@fs@# zoo|{^_qV|WXZS*MCig*)h*X8PfBJ?+p!_hK#UAhB6E*QAh)DC?eQ}gRWnJ~F7P*Nb ztm3nYJFzfnK=1p8x`E}LwbUUTPpr0y}49kkf1Lz1@h>!C9wJ*bneO#QQw4kd3=;p+`$p4FJx`eJ1b=*O470A? zMCrYV3I6;&@fjS{7LJF%J?{q3Oco^vDe7WZmwj~}R($hWNdNxpA|zt8B%JX%BL!bp z_AT+Vd~D7p?C+EbNAyv<79Vz~7t0e`U-n9f7xAiuXA8&g-nnAlCkMrw&tjWW0@$7W zp7x~X*>o(7k`R^qsbrbJ+rXmb_0@@qCjvagI=u=A3U_tEtvF>==qs|f=rYI>W6K-A z*rkjmKEtc9nW(Ke7PIiE5df=2F=f8pvI~d`p7puU7<;dWm#(mG2EM69YX&@eYezni zyb~4c5bR@ABu7%exim>YKWCD=9*{a$^}^@meuUhIgMB`XK|Wrr=MYprlhp@9;V)Hp zkbKG3|H6mtRTAVV!3-kx9lJfvFUch(E1LrO>MTO%v{nb6n`uGH9dBf+8=GO`f_Y%* zGrAV-D|OZQ%fz)eA7ww`xpv&;6yFWK%}ugr$1()@xq%nDo*ThR7R5otGn82YeoyAh z&5b_N+%m~y7G>ay@Ymy)YGN4*HHc^Hcl_MsBEXl9TdyiHW9fHr?D23Eni)^Qtm>p} zONJ$Eqa*l3u^RUENzn_?{pLegIwg&#FE4EftekLNp@|B~N06dDxL`mD^r)!uQC^hP z!e8czIW0x_a+g2SCFb&7+3vNwuni55I3{Zxpc7fW2`QK_h-vY-?mq&3__7jUuwsCQ z-%w$Mck133(-Of^KV-d-i}1aT>G}r+Pb}i1*58*ki=b$ceKx;;?B_n0=s3rd zS|5q6Pu1gS8=1Qe**d9gXZ<1ZWb0wZhX;)l=2ma>ym!!Zciq`s6W5Cdo0={A?jEgh zFsZfoON9GI8E)QuS#i0gvaTC2*ROf1dhQWtM$=d51VNN*`x&d^`^-o#=b0`bTJF(`>7EBrq*}^M4A)HRH^b+_G>`? zSAU#-Y7ycoZJ#Hjz@>&w0_FBYz7KFErTCEG%bbFd$=^nV+6$NQW=-Iq;@w#XQg%;0 znSSjz#-CKO2HfZnW;Vae6A2Vkffmb;5FTsH$>#PP-A{3RQ^FZe;bxm!1J#0@Qs~yVyN2w{ZA_ytbxKr zpwFv4UMxiz?7hP5ad_vLZ*nC(z6(h26!|LE>`Z8^Yu8IY{=Bub^zSim_6qWvIYISR zh3{0ME5!`rh!?g!{o0CIEU(|%7@FYsqKo35CQ=aeD8_AF=Kp@P9(Kc zU9OEFmrnFgYh@r(S1(%qOHFa)6e2X%#J4GBKx}9&Bd6{WG+V!>qxo69 z2ugpB`PIfJ--{C4)^|Uc-+lhP6Xgt<+!bFLh8Ef0l$fuSr&t#Ehkks`=@F=N%-xME z#gF3}Cz9MCn(GvB=ZgK+UfRFifUzXL91|+N;sN#OX0ghgYCyItSnhH-6M8~lykgxc8Or44__0MGe1m(Xrj)nSzDvG3~uWbu9 zTbWvw#D+Q*KOf&2SOsbSw)uXrNjyEi3p}wNWM_nCBzNHp))hrKFxKVSe0RW;mEL@h z=`2F01_g zalPYX@-b@2?N0-O@mriMKPM&J{6;3imsE*au0(!Te4fEk`<~M=&J71*-3bN$&AZ)# z;d&bqOV2g?8O`dAf-6QdVtUG$x2&Cq%T}n1>nupqbkd0w04mrh!ZD2`c>$a7r{uo- zFDAD+y*gw3*EG+bZH$9ZmZxA z;F#!3Ns%xf94NZ5i;cFwC8k6pe{(?5cIbcgY+~qb^*rrqGCYVL8{C%LWw7zlNO$tv zviEIO8!nBFE^1@HY1Z(s9%X!fLU%L~BzbFiPdOm* zb!{I`V%=A~I68@#=mJ$QKVS<2|wG#Pon(3XTn&G~s#Z zTjtlHfDWmP0H@}VVO)HWVeo%jZO}g$;O_urF}fle$P-NPe#f@AK|f~D`DG;Sh~fUu z@D~+QHuFH;AMGKQuXbMq&F%8veTKfn93rOT!B*>Ez}r5lYpGmZD%rJr^UbsZO>5K# zMvU2NzlgYzM;hPJkNNPaHsko30R~5|A=Fkb2*ep3@4a+*v}U5QVV8C5O2;btCbak` z-}Qa1&k6n-E%pd&wD1Y_Xb_g95+IT<&x9OyUABX)P^b{RK`UjeKjo%#d7B7#o(*wW ziI+ozE6tuE%|>&cS+0D3@(cEZUJ4}Nx51#z=#Rc&^7J1@$A|FDp&!JPOM-I4Y9hLEr0ttqA#% z??!Z)I6;6NjaI>YT!wXovowvKyx!K>UTebJ z$T8cnTd_Rj3ol6g3+7jK7^J|d{(rp$Ad?XCbeU#PR37*#LL}~nR$rb$uJMcPDfd`j zSdA6D40btQ3%4Rg+z+Wa4Edl&i3vC$@zvUEsHcjxZsO~D{?*EZQ|F;zTZ_^%kEe&V z9Uz%9D@m$p{JSaLysgZ21foUuaCv&&`Q#~GxbZtLFc(SVua2_!rL$F*eiC!JOIIZ4>8Be7*V1rpjqJ(^OrU0$a((-?<%E-MT%bV3wt8b zFR9!zmWAKC9z4Mrw0hmeUXIWG^fSj^$Q@607d;>A>YBd2C!r9a^bGKiKJy=( z^CvK%uKBL!H*Wvac1-xtKBYIGO`(nJZu$9ku?mL@%ZDlWQymyc}f zOoh$?p9s{b(Q&iENFiGVwneaBIh-`%Y2UVHpf>Z2kzfN_;=7y2<;9la-*f_}^fHX! zLN%CvwDJfm62Y@=MhByDFY|APuOBn&be1|n%&H$g>8NG88v(Y{Iel$Lji4o+-e1Rm z&GGb%;FaBv*3bcCydf{TTYM z11wq?P{XnsR&%{Bce!`bE*7u!ZKWKvNK3gegj^^=`A7WnYn(Fy} zG3WBab-?s|la4&W`0e+^Gc9#L)TQR>Y>CnKLm>w=Q!;*ePf-yUQ){7PuId;WM3(|u z!i8ZyO*<&EO~$Z6j9ANlbTQvR*EL1BMg&b2_%Fc8o01cZNiu>kyaPo{>vn$gB^krR zo$aOx?7KoFi!rA7{UDzJwm5U&uTR)p2U92rI88u8ht1j#b*$X5%X>j!0W4JrAL&+u zvw^U=hj4HZR!6F^JNxS(Ysh}U!$)Ay%g0fb_=BO_&$T^tkXoVWsXHkZa%>nDhCQfT zDP(<$C=+>+jHDaBwlPQ_f@vgvrnk0 z*+u$4D41(K^xvI2eeg#<RTCtjbNTlDA?lbj&vC%j%xsK({So|B zv&ZSWxW(7p#&Gq4SC84(xj?gz7yDR@G{Sw;jZnU^vmM}B%Cq=nNcO>akL=rrsLKW* z_)}mmw90wK4rij?WHyYm6xEn$TvaA8yWSf2t??<6`xjs^)-&)EH%`XN`SH4v)o5Ki zC#>pGgo;M$T+GjW%XErK7JrGT^=+>jp2f;3mT()mb=*-sI2l&_mhk3pVdv^3#iE4G z9})hUoLYuP-M0@$PR=y%CFz*GAG55SqQTvW@pn^r{Lt@wEPSYP3Y~j7hr0?FG80J- zca^51F@dJZ_ zitM!(5pG?iQUIWm$2dZWj-Hquk9tOIPSypG(T+R#vLRiY=2J(lc@72%`axIw-dJ8 za@ei;Gk^Fz{*MEM{0lQNMB*~R{8!Zpmq*Wc&ezyMieUmH=)c~mx~pAYsv_fCwj%vF zP5E9h;?o63<`9^5sKMU#Gu2)!)ieLW>p4{EIwOMG>k%)uFFgNKb@GyYj(mia@yc~a zi{)$j*;yK32^>p0xhq#`|2etjMIsNO?JqUhsV?C>`k#b03GtA&DtU_uy`*9FiyTRTH_v6a+e}u)SYM$W#A7Y6~Rk!V_N(`sj~0 zGgbTPD(#ssWMkViMwN3Aw9Qo-;#;#q+n*21>6U7z%#$Eyz8BZ1sG#reGA}(rU+IVi zUFXUAMvs24kIRw_l1mX4|K;QvtReZNv4TVQMbw8JCVE- zJ?q;_5JgETSxHnrE{X(i@E>nI|@nIS;>Q4Pg9EOk>J{()>j`wF$XJIHcHKr^A{Jz(kt6Jf^Gr5L+ zP{;!o&2XMRY-~Umcws=I3VVko$^X>1jtNH{v$i5qtR3*YOVS={7&g1q=Uj|~KMFxq z|9XPoE5Glm+Gd4&;6l!XlJp5(s+|l>!M_T3S`O?C?384-@J@PoV1*O=kmnbh)Wv=v zq*VF*qVWrWSdtS)qKrx*%_06=g+1ta+l4Da=sWf7G>WOEsG?O7^~dA zt~=fxJbQ6NyHFjxR6MV!N0gHi#QGE5xI#E7R>-~rJfBII(4{7Qrk^jFd8RQTnZ>C8_CM>7M;_ z*1Xg$U+@ff;oQNrS?QCYBc~Q5a^d}JDwQ$iNXCoZ_9t66J86M#*&M__WbN4THC&5#*yG>M(;qsPb>hlCN^`OJi(s+-TpWqj`CBFp%Mg@eC;iKZxs)x7m%XfM zG2rh4^cD70`X8M7FCOW*UY4mXMK*ral>W!~CLYmD^FogIS=k8f`$vY9WJ$jFUl4-) zxZdBmahvZNo3m zoJ&u`l!69mGIMJ|V`hlP2ZbROMeG_%m~yK^RTt2?4&H3ZEPP|S`~K>|&HN*O=d+2G z8zD9kFNOg>l8x_x@61$l#$d6yWTGvkD5(|0CVv6l+mx}>U$$W&g2<(1^FNr7edsp| zAc6K4rzhjQcCA@pT5=$?|7d{tLaZ>RPp`IN!_${xkc=haf|N4?yj47G%@bck$!L>a zfV?`n@b*AQnW)~Rk8OEn}p3mvF$5GxVu5~~N-`a{)S zJigyVS&F4lKH8tyTVskr=uA8sCAuLkY!MPuS)t7R{tJ*=o08%lRVHh;B(1!l`jLez zG4S@m|JY7BXcp82n$v6;#aQug46Ar>L(acwX6wH??oNdKurejxitbq4jj}`*McCbQ zeoHR*WnSLjpWo(l-cZi)$fT!Cbbs5U(fi?SCyZH;bBP)Y)Q|yXh%eopBVRc_DehM< zFsai*GztXWAZD&=&$WAzW@w5dOD=@=p2GbRUWA#ca!{svS>dFm^j+l_o zRnF1m>Lgr!V|&nVYifHOQLN-?3I1}v_h=8i;j9g@y|!Hn)yV%l|MJ-vr|jUz#Gr*=t^sMl}Bes_?RD*jN9i2hR%wAmsve4 zB>n=A>T6>FV{A6#8@-io^AIFeAT5!4*1p^6M>_2HBd38M8++p6D*uQXu3xSM$?CHS zi{RY{MU^azL*ZUzxNgT2MwcJo8iLhhG03Yqp_;f7ql2|ssFnn5aF^2aZ1v-u-3WBC zuQIR%#J*p=-=(G?l^XB!`Sc_qRfAk6ZNg`f4TTle-$o8X#GVNhy7{Eq_bzQ~)6{8g zgiQO>jE|^SpL}m>BHXvTrZ{vSi6#_I(LihETF5WuLJVWt*lf(NKsfdzKMK z*@@{bjYz)wem~!T;B(LY;huZWecb1LKA-1#?zxZ0xe%7t^s`aXqPwxK`|%8)Z+yVO z^N)oqzQ!2?Ok*gXo8{Ohdc01ez7MQaHT}}1RF+un3RK#!ELL%WhdE|VTo+8c%Y+)Y z(t6sj&%;e{gAgjBf1Ib1V-~HBw^HqS6n-=M09jg*FU3n|yRlzxE^Mf@A)p zbGuIrop+$tGU#VSx#aQk+HNO((=^=Fcei>u2J5oB`$4qvVov|h3jh{;_eHek#L2)|&N9^3`)Eq&C=ch$wEw+AwMmUyF6 zM;_WdPD=fd<6N3_)oiZ#r!s|l`7Fw;e^+o1=(K!V*@Eic3aBg!@bbgR9=fR186P3N zB@%I9E-B$^!bq0Iz=GcamzZ5qZ1Mxs;ZQMpX%QW`MF2D{!m971Z!+*9I@4yAhKFoL z45wPP;QfBXlNwTLvibOa@$!iXA%s!8#yx16VcMP+pP^`~!Nr+(^xSR|D6iScaKbQ1 z)Z%W~Og9b=O;f>}W)^`DM-wfL3+pL-zQi+dolZdNR`x$N;_Tp=Fp(T%<93Bv~nQQm7;O^{PH1=^_5S|(~$}J)S67-t*!UyU0(z& z2uVX?R)=|AftVl{6ZV&n_!ohMw9Zk-)(=oc@9=&=T-89Jl>&58my*B9Zf>$m z+9iA#FMJ|SbeO;K;X&DYrno(iGS4As9TlFq8&&vJgf@g8?@Gm|3(kYns2!yCBN53w z@BzqGE{C$WVm|95)P=Q7&b;0b4HmFkdtO!$4Xx$+0@eRO_?D%PCAUgbZHFD)bw{QH zJ(x-bY_Xi*5Q&QQr)wPo$Gtc_Qk#l&2$5x%S=r$M&#hrnE{p|B1WAx; zAN6FjSn~Ped93l(M#NgKZu(q_jJ2UgoO2B{}{zS1(Ika#7y%a~a9 z8BJoPPp_SKa6)}}+eXnjauANaby5XUUiazod`~Gx>g0W!K+Pa)&vOTA9bKuK{45#9 zx_*^?Iu1rR4!(yaj>EH~^YRXSu3b?U2^-!VnEnbWhw1Wzdzmam#xme{QQ$?CI$**! z)qU(@!b>VP@R@!P?UZz{$Ca>nVmI%oIZG2XcosSl+w$TSQSGC8C9{v_R5pXS$iJZX zt?_ZmHHt-X1Q>Mj74MfU8W-K)<8Tci-_|L`fFj=_Bj99Z`XWR%0+1QQf6pJ*a=`ih zGTDDd*IDcNU{9a@5iNTv{th1!f4N`G73A)6c!}(A>VS*hbKxP~$8adJGP%w1(}le7 zU@DSeZrfL=b{C%AsLG8d>e+g9DcE({#?xu?BDL=u^#H>?Vs`f`ObVLDe^K5pIDd2^ zFY|Jx>)TVwN8$tT)4%ARg|gotg}wdF3dgc#xzlP(y*eEy54^{dU_rmvi--L|1n64n z2I?Pr7+MFJQ5PpDI;6*x{+(dFg(efc)aUmo;Qmp!fM<^61SoZY%H3`3hm#HIbrVyg zxJ{_|>B5iqk_>%po$_c>@b!)Vnq%?Zp!gnaJ=0reP8W)7O}<2Rr7RAn{c?4$a)avZ zSthVIGx_!uI2glg!AS}1)jn=W;ma1ap0ClWi0&~jfHeBb!&;UaSd_mC1!0oI%TsHR z+GjRsp~5%~BXuy5RJsT}<})lY9Izd%j0Z88m!EF$8OShDpixf23;CT*=K?}Z&a@$w z$)bB^=k!3iMHa<8ed@F|iynG|8Hpe2IJLx)!#|KIgzT0$xoL1SF*_-rWdmyF?Cm`Y;kVY z3H-5VkHjSJ&7;xZ!0jz0G_wfh7W?Jfx9+s7FrbP9kCodkcMa&x4OA}x zihsA6`z%ZReShQMvFz19?m2v!x@or(N1~LEoA6#aJ~|M)n(#UJ!I`JSFrKg!t>1@i`oH|(yF+!o0RxcTep(g4Qum^ zHr!T#BU4aUFCcHrIZ&*ko*Vx-jkfGGzByKp_LTW^Zoo6X{BIe;LfM<{g49cTvec{= zv>2U36IE{=5jT^)1KO)Ywlwl8#a1fV6kS4iv;$$BQ8{o@65uR8~tdTjbDv}G{;$`U_YFamy#b5qO%pn>PzW1 zuS>|Lms7=yRSfFlT-i#c>2UPWP|dt=?6NT2O5w2G@H#8*lc{L4L{V;6#7>)c=u<-2 z11qIE{LV6+mXN+5I`_=weYx&oDeb8vmJp`Q?K7k{2UL`x!z(bH#X^$PSnO5ByCv%0 zpj8^25_@QYXfYDo-8{}=trUe9f9a9H_dfkqUe6$7b#(pVn2pu=M;Yg4MbX%A^P%G_ zmeS7l{vN2O1EUKz*pmI7bbU0Zc$M_0BbFS@v3mvOi43=ao%Ux*eDV2kdW-TKufT2q z_WQn%d8DYe^%-&m^S_`;im_Ped&Rp}!eXw-1Unb$kXwm1D0st)z>pVCvtJ>hlY8@i zfB1yI(zs!4fSXVE%~f=fA|I^`(+am^&TM z$`#uO{U#uhn0;xDRVig4GKwbMP%{bIonM`;A05I=x;7md&@E={0IF>|7w4)6zgxw z+15g?i1L551C;bV145MXk#2-w0dNzb82wGQH~D@qfNDpOPKiTP-;< zfcDvLL3?~HMGi9!YAQdkuln-NHE)`sw`rZHpsv-&Z=x>E^V9G5`4`;3h-12U9^1t* zvU1^lggcLmszS9dufFSF>^;gzxzV~WHW?b%**U&$q6;49~`g#g-p6%5%L)lxj|>F&tU`}xs8xQMcztI$ zO;H>g>>#C!i)W?XIS-Ffp;kSdlQ#AJBob1|nYAGK=IbbtBd%xj$Ef`qxuN424Q(Q~ z;zD4UU420L_U%xI`T5S(jtjwBorrI9E)Vzs`5d=#$+G;Loxw%}2&l6PWXRrCsQE^j zKXg0;@S&F)7F;%z$^k&9MJjjl^pW4_LEyh^zj=q|i<@i|5R~tt@4hoYB%{&qD|+%T zRrc{{(WEz*8Gy7P-qqp}WdaRYPeU*~mL&%q$(MJEYsae{ln~8fKjy6q=9!#g_SB<6 zq>z-K*~rX@2TGCAJvLKuG=R>cYR7BAaXLTxTOm}Pt@q>Z)Ov`|V~-~*iuo>8!3TB5 z7yy`bsMvFI-MC{|9;d0sr!3dnifnqHE-^+3oC}oH=Bt?e=!hAc>}!1wt{JKd-aG$_ z(|TODNp((tL)#dkxM_Z_P6Ut*(|`6U-%Jnbi}Wqu4=_CC$dHhc*BYJ8^OC)k&6XNl zhn#h5%7IiAzZu!&f%38RiohsEiw;IBTw~EYVT+v;GgVVcmoXpq zs$6S~G<|3=&jD_p*`<}vVk+C^g|DpkfJB8?pfT#yi4&&;$NlYZkrSH*gpR5b{8+4| zv}z?fWCbp=)AuoDP>2FeP7Dc~%C|-F%!E4ca2#nOq0o=hq?!MO9d6XF>JH?gQu9x@ z3Pt>qP;pS4R)CvCgjM-%xd%-SBgCeRp6F+DmZa(XiPneJO=!L#6pkz2vYR{=(q4O) z^Hkz!L7G}wD6k;^@dX3IU7?PMPY;Sms`8&LS&Vfux3I*v zI#q>b4|CelJj#3fKC1DAdX8!2IXaS?s)!C^-CV_e7)(13>EV1uJoSpc3<6Gwyp*<~ z7U>i1LZ6={;R>_jZGc~Rs$Dh0_h07d|1ZN&?ebw7JkT1Esr|Z`zWtqj&fd_?3mvVi|LFS{uh?!gyg7jrHDid7}O%R&Ia0bIMHtmienH1^71y^)DfC;642 z!}C3``sB8gKWAVPtx5OXct%c$O|k!mIAw$tjfWfz;s4PWu8hR^X6nR+)+g7`Gs&Ao z9#efZfd?ME-EG`2@kb)Rjej1qEqt=WW4^!fCX`O8(4kZfx|(o(t8+r9TFLKsb z9oFN$=E>x(wLO)lPu`Qk_w~CytP&;PneA9lI-q|PQ)HP049j0T^C~A%Bh5Zap}%+b zORuN?iLZ0d{-w*3M^4WLhMk*}-;VCbw2!A54eS@qY;~D*53ZXg`|SA#yj)ZC?VU_y z4EeORcB!S?@s4%(HmCiJBRh$AalwS8n?FLK!9%BloGr#VvEv{1!G7tQc95tQ<6DR1_#5R^6{&& zKRX3ao&JpTQ)?+K$?-h!b2PPi*_cR)br#Y?;0I7RXMG3NU)n^L5}>2jlOVu%jvw!T zLp{f#TH^_D1yCcjlrX8FIs;J(nQWeOdS0xblfoBhWV z6ymJ~9khBBuzSIuS<|Qn1B=EgJ$g60HO0df%cgOVZh25i;qMNVhF(}S$+N4Wg?v?k zXT`opxw^PXhEQ^Bmzg{j1JuO1_b%;14+5_NfA4@R1RQHx(x!_@m-6?Sh9PgXKJCB1 zbQCxLJO7xnjIf3pnq0mh3xrhGd?T<_L|GjCDr1Lw6KdPaXN>&hfRo;_xMk$M2)E$E zvxFk{;)IstiozSmmOmBL4+O<59^d8oY47P$HLo)lprsVNknE#pb8;6bUG=ZZF+yfj zgv|yzPVzv8f|5bDyYQ^ehpeC?#Q5!t2f)y{@dG|hb}~V~d3+Mt066$2%A@%a zrA5;N$BZ*uUQ5=K*P?CtwqgKZ69(u=2%o=jtK4@Z16y353_kq9DRo^|vMQRS-8;_>Wz)e8Bzp3wJ4m%u?yVDVKgvH0Si&NiL> zs}il=ProAe>b${$s5V7RX{KM}Z2OQSyW=w6o0YIZG`9IbVs(7iifIGfSxo9E|m?e|%jqJy-&=H50~sJ!*o;uAZ` z-I^_nhTr%2tI4o;qRCUoo-+q%$-VCJZ|q7Cn)dcTqQ5?N_+ZyzCj}uYG;!YjFKcH9 zRw+M6^tSf=#;N`VPwIS}4YJ60ahAkb8jK@<=>}}qNh?LLX?=O-HXF6RqHVn!2{;~S z{+P)_eO=nyW3DzfNnikNi9|@eJiB3*G`86ZaEs-?bzcW1D-u~=Vm?1~PqjKOJ2Q$@ zaN%I;+@3OMbisnCu*5S^?}y9Jojxj3D!OM?S+ZP+htK^|z5#QrWO^hy8| zjx8cf*%c-1dydEaF1yEPgg$sum0;Kx&_Raxk~oo~gA5gv;-|_^3RfJ=O*>9z393>~ zxm2}2Nj8tGjYHm5b?i+RE^^sf z36#HTA}bP`2mD-n$Lj0cz*P%mG3DF#3y7My$eLMjFpn>uf>)%7Cw0BpS~ONDIkB{^ zDpmDnhjxB|Gr%@7!olJbJ3%P1x>q13rwXjV{p zeQc>G(All+m7wx){GHi!`|78FZ|q^&n^+2LRziS6l#pq4r`RPK5!{$+5#`%gKX{`c z`Xhnvy`zbNA5ZHUKqEdg`Gge;+Win!>6QJvzfx97u*@DBoQICF@6vSK#+9$dSU{n1`6D@4YgtCKx1o}p+%4FAtJPN zV~@|HB9>SN*8`JCI(!+Yv0cALLY1IURdh>XydInZE*Wv$2@!sc;x&-=8H!f zoXPo-(46ylYvJcwy92z*3zNs9Sd)?Y2jAY!0ZS%LM3$nbLYEH6TqBB|iCy#;2WL1F zHQm}glfO`tVIl^aiV--*+Imh5ZLQMfd`wdf*0bxd@yxni#=M$h!uPT<(%Rm$ zHhpJ~4r{h4fWv#&6=Xq8@dd@Xb_YTyj+NJGZw`5}*X!quWJRu14ZsyH`|b7suOVFF z1~1`K-IoqmH%F-Si&HBFt!P!2KQ89vWl)$6R49-hXRnEt>0OjkiXD8q@XHwIBk30z zayo#EG+z<+S67v2l#zb1S>bAron}^6UZrTYfw%Rd|4YxJHGjJtJ4YYo&%2x=xKHY& zTRIoLmLz1_YfdEPi)*h=nqKe5b@S;d1?%#w1~t{bwVhCkd&wmcp>q*xQeU ziV6Y{R2Tq(#sDCi0|5Uw5C6wD>J#5@e2)S8h%MSNGb?+9a z^8>?p9xEL3^*?58(4{2Bh{|u}1E~LENT$7+4}8O4fo1;}!@dSItfmkKTlf#dW9wDZ zXxgWB=dTYx{Sj1h`J;!RKAo!9tEZLa6{@@Lis4Rx5I{ z&4iYV`k#-^2ZC1Ul!lKPN4AQhl)-oTgaQM{BhJdkpAqFCvw9?|KQ2di{&aMaZd{(= zJO|6?hv<~gJ>&9mm>|*M?zM9{o<@q#;1S4^?VWiu$fZgGgHD5WW0Spr86*S`KDU_`6P+@dRFW?QI;=ZbQV>@Rx2Y+yZ-B4g>UsRYq`Yhdb)Mjhx4&OM#-ncTFFKI}KVZ0%_juMUOwK;4TnY zmV7iz_jsI4TTk`+q0x`R+d$+;;~*&wPdQS|yl3=%VGC_{`+YXuuZ}!42jciIeXMDQ z?N9M)PK!mP;z=9kp-yroL&OWxL zl)wsQ4X?&5+O|0ujJQ<}`|vh8c5ozm$89^P7Lp^bZynZ&Z@^I12uMcvz%haZcDOuMN8fPG?1kA3S4pjmTWY6n_ zJ0iiF(6{_H5qOte8a_Z^IZj}i^N9J`M~~K*Uk&Cx5M7GII(`HiABpU)@jMy*_3U;2 zOp8#;Qh|?bJ@V#2$JuA62Gw@ujHnW*Ag37pTwdOG=bbRTGVkGGu3rw34K#x*YZJHj zm(s0H9C_&-g9jYj?2Mj^+Dm&qlN9;p?z26hK*S5(IFNoLguLv9n8X9Y_+UWO@kZDs zTGPSzi-<0Nf#s>Bc)n8m9T{Zy5rfB3{>re^4|u(Rs_5^Qbare$)f!$Kte%~LL1rpx zXUz$M@dv@3lc3i#*icn`OMh9>FX!$~7O=7`_2Z;M2OxN&>RjVen=@I`C_)1n7UpLDsv@(v&s$_Pb65G@!nbmM(2!iI|xxP znN*+GL`j8`qCrjAe-ql5#Y}T`p0h|eue))`2z|NH%r#`nigW2Zy683lEDv#2%;Grl zhOi>PSBG>oY_zkPw zeMp%Cr96ZiR7Tw{$xq+an|3ss@>MZ(&v0Ab%qO6n#QaTpdcVV^kPXgqJa@Xf& zv4^6d*Y=N$kn5?OVdkhLJK;N@fYj?w_;b&zhq}Z;^yCC+w2O0ST4!GXx?@AIGsETG zK?h z%w5=G8X`X)xDT642Gz;?hvAb>gbuocS2U(lV<*OZ>HA56K`W7CBz;r#&?#?F9Flqt zL>$411eV=wiyhT8DEMr4hhkxll!&ps*EaVWc95wQZ(#=u4Y2h(;P7m#(gH9m(Agh| ze9QEu1W8p-io$tcJjq1HWi9exkwZpwK9rdInWv6ADKQ(n6B0YfLoeWG86WSmB=Gr@ zi5$QwF9&qaTy7|$b%)r=v5!_yv3mT3pTi_p?{xNo{=xw52P&vfhkyWwkiPQNMf|aJ zv^C7Rv{_<^Ju=_ty3M=MfaAfzYIX}i7_TSumqR{5B|3`w_=i5Ny)8sZ)!_YwJDp=> zlB?{99VXA!tX~9wi#Nhafx)ZR9ZIYHP)%ID=(pT%@nzLHWEGJ=Au~U2*hKa>rugI; zyqvx^oqch!HI*D|GS5}?2I)b0MIe{*%5`?8k)4vZQg4soS;PZTIJG^1%ezj^&V(6G z*ss4OHsrT<)in?NYh8EzOWOH4Itj-AZM#%1wA^m#BTTxm-P#`XIyGQ8{F=h@$QJYL z@u&F~Eh0~9IPM%)h{_yh>M(spz+zwfan`7#sMxhk-|a2tvfgjQ0EFNM1#f4jKZg{bEwp?f?m0ZgWceW`R_z&)dC#YGg`^|GkaW*_TvI4EA(@($}_*$Yc3@Nd|Y71hEuf z6r5eokWlvxo4dVlG4tre^K-yQzW-eWdU7XY$e7oZ>gNt9^N@ab*vNfLCZe`T~CB}j% zlWh^md!>6&lUaI+R_`;bV#5s7?tblJch7n0CiLCBGH(C1iUNl*r}o^qUTTVj6J;;1 zN!%WLFkf5IYA$M?0N3?_&k6I9~Sus!4_=@ZK?!~-S0wpvdQ_1TKZjj=!M6?e#^0m)rpDa@>G7`Z8PQ1QsQ?$ z3*>Civ7lAF7(Lt=u#^=W$_mZh76i9I!QNECoMEDr zPeg;MXO#b=FoyAuVm%sG#4swuifC?F5ov{j6*+ug`h}a(?bs>xXU7!tL4p`U47VW~pK0paLh^WF|2! zbc&i6AjX_VMhl@hP6HywAgE5mKyiT2Ph*AeEZNX1(ZDzPzr@8T;Vu?d`}bG1=#Uk7 z-MHIS;D#3F@srQxQ!2V(S1`eI34hiDZhTLd41W2u3V*H0pBeb&5BYyq@HCD;JpWms zzpMO(4{n<8{IT%wZli&7FrZ*~lICAWg&jP1&#GNlow|vT;TH2o^fK&_n@4DhtLp9t z`!BZ+ZZ=wNd#K#r_^ls90&{hzzA)?=z6O~O_ua{2+6!gIe-fzZ-ZL#ex+X%yvF*rH z$laIaQeNKk32knputL9~u_1SnljDx@qy9JqGkkSkK&oCYa(kw`z|m!;R5}E1ae0Ks zwr`<};^V11YpB9Mver|vU2}|2${AEh?!9U4*xE$(%w;KfCtIMfA5GVfPzdI%BC3}& zpdOje6eyj(3nTNW&!Zdq{@hcJJJ&D#s-Y5Kg>KT?OsO4mE|F zW~50y6bYlyp`G7}VKr6P9n$Cv!H!GA6Y~YE^KEzdj9+lREfyL}bKGesLCCXxr#;K7 zPeW)4fj^0>OyXV(k2dYBdkMwnJ>y)g3FW|ym}?fUiDWSMJ_N`_vHQ@#mPL$Iu0}l2 zyRF@`U1`H&cL$w6D2sF}Nd_1#p)D|PXRqw+JWspEU2JNJz66El>$HQ1+ry?%x>CSx zGo_g+6LO6I36YW0tN z*!uC=W*tuATaRNyOFE-UYte^$@|TgJr-sQ-4PWkh3mdLdE4y>Xxod#pV7Rkt`UW(l z4bnIDJkotq8qXwDNvEVLts|ehJlRe;<}!CSBu@>yL~^Cwt-~`oetRN+)!D|rpK1aa z&yDya{3|IdkL+JRnn*GgDp>9L*q&OAdYE>$PSN4CC(uMfEgzRQF9L$i`DkU8XV%!8 z%w})3>obVJgkgt!s_mV;;oFM(PUHTgQt5Y?|w4x*zDSPbBz4j zi&6iLZ1N?u{(A5~(%h%UFokq^>_wHt+?h750|kXA)0(dNpmvXf=AFE}R3XFF1sB%D zFd69|*^PYX#Pe!0$(5(WL5r%aVV*PjLbipyxLOu z7B0p8whL!9n^4i)+|B#ep#Sbwx6Q$CDzUBMN)KAOHiTZb?HaP3#b*QrBO<3YJsy)l zboY#&CBfEk<*%HVOG4T$SBIX?jyrE*py^RGep`hFthi^8V(p3-dim`E&ze|`z!xSwnz?|ikDt3ZzSUumpVb0{ABh!c6S z#3I{Li1V+N3BD;P6t%HMkRgOxVfxR&^t-5o0>JB$IRkURZPUneSD~uXf}mqmGjZ8* z*9}!ZCxE{UCX9r8ZPc=Wj}Pui*)kExkcI)$47l`H&h6@BQ`M`2qS~mzTx1*N)(`$p zGX<@M>_Y{FXWTf47#?7z?1Us4tB zBESUq1{LmCJV(gEGMmy>C~urtd^#det3i-vA4 z2iC#!)qd-NfXe~n%Z*(+@72P$*`MBlZ-lZ6SL)72skZC>MUoUk(Qs?-2z~PCA4@3w zuy4<=ThmYdp`2fwuXfPQ#La+Lc|avW*le1{yTSni8Op;H*?u$Dti}~J5`sTuOM!}V zgxX*u3{6=XPIy=5G3KUV?WKXJGT?wnNAvx6-bG+GFhHMg#PF-^uq<{j?uXU`TFViS zni@nHd?fwZ*Dy!5yjTz6T@6tpqxjAU>w+J$SZ^GAqU1tFtj#qw-el?92GXa*Iw4Gl z+_;sMK(!zL@MuAc3(B-kI08T&2c&mR#q`MaG?`gA`KB_bMbNE~KJ!dQgq3 zg#Z&ekjK&!W<(rVdKq+%fkBvnS|B$DRh|oo+%>y^Fue(l*ubf+4@F?n_+^4}7uF;l zD5`sla3lvA#)(bCii6H^e+Ms%Dh~vrvXN&<@weV6g+FX?hek+U`194F+qQq-AQWJY zF!shz@FhXCrhK?(kvk+v;v!)g4wQBLJrY)guNf4pK&iupO;4XLNF*wc0i=t-NO55AJ=BP4{|V-v$F@TRh*8CVZ0y_L+k(i}xh66II&*^3 z-rEmd>AdJbwbON))W><_YTiLxG=%{S|2US0&~nD zb3c|06-`#!q{&v=;wxY7qZAFOR@Ud-q}Lb#osZQI(^?nqAxtL&mnTn8k?-7V4X4ME za)ScCSm-fGzpQPap|Iokkz5HuNl{b%z@5|uW^81YG;W?M2?1}1p9LZ==_-(q36a+V zJLTB*)#L0r`b^=FH|47+8TsAg8vP5HZ32o57y|4PDGSr-zF{mq+c3RyZKshqzu5ht z?{HXQP4UL)Taj8~{G{cMe9xYY(87x)Eow}JPmIY#b$`G^b?!H%p)>c(sz#8t%{Cx1`UUlhNH3&@wa$#U5jrMv@-j=NhR&*zgF!XM(Ftd%WoLQRklD|NQ>#vkD zrTpdarZHu#oI}FD!PNmp+boU?^}JE}ug+d!({q&jOeCV!%c1j)K_SPwtMgG3|ED7| zS#56sV10M`S%8e}KW0)K6UUoph-!JRLu*9r9^E(g*r6OdS}`{gJx5e+;K(s%tu$h@M|~Fmdb|ABu4My&24{L z>8YPQ`>WFD8wN&b1y82{e7T4T%F?ne5u0$L8wwGRx`PO>#bS@XYo8#q{ zZ<*r3h3=SYi2kF*Sfkn<|$5Goxz6R zR0)&K4}%TXp1sMrnzH%U-vf)Bm17g8UYn|Uh|Zm|s0$Dee3~baoF3&InWsm&Neb!N zp@wSg1VX-Vth&ZV#!yD4+b&%@2y0+d()sj1_A>g!1hQWOi&>aqPp1x*EO5Hf-YSRLTT zoQ^F~=s)BC#-#-TYpX%;31A;#06*y;Q@7~VE*E-xi+s=fr;^<2`>GQFPKDfhYfB;{Q9=XFmO3 zvHsJ<3w>^}uY#eY=MI3}9l|((4BrtrA){q~Uw6kH0Y?uWyCEEp9cn#p(c3)0@EhttZ$w^22Q?;=AI{m7lI5w z5&G?eDgu6nJS0jP9C2K-e}IMaWtC<375Bu5qYyliEwt@xYf(^ElR0?1)HB)&0wb?@ zkBaz|Ci3t|TdF)eP0(DLt#O;X@Ca8%YZ+Pn@NSr-YIq~X-K7Hr`|(cVljg!5g7oXC zJQ~3mIl-65{8Bf1S_~SCLkQ%B}v}L=atm>r`k% z$Ngnt++|h=(*c8UECLt;gYRQS02A{T}+Nu&(oEQ z#UDs&VY{eY<^vJ_w-EzBZnC^7Ko#2DBtw01QU74fE7+&KTdufv)8;b>HM~z4(cZe4 z()qj74tRJZU$8$>yf9$VA7%f_AmsI z?7Jd%O?Bg#Ve4Z|E&NxpFha}R#;jST=L!37hDopFIFrxM)T9J9%w|JkoVcD?3Zt;? z>UM~^f14mZ1nSHeyzyqI2+Z2*G}k zy}_07;+CgyUDSN5^-3P^$I+KlzYqFI=%Fp8==*rPT{h}P_UQYPz6N4{vxd9;dK>rZ zNyzFB)i~H2QF%-3(s(B^BOOAxdLAm_afxT?T+`9O-KX!ye6QEVNZzfqemI;V?Dy3+ zO^1ymfMc$>4KozclbbQ}a;Zd*gfQOKi~kGtpy8fjTQ^0Uvv&qDW0zzvgu%<%x8FmgKpHPHYsn8_TUR z*>y*zwNu2bq5`O1E$0qO`h59OEzL_fuaLEk~ ztQ|*U`(bani%1=Frs(k|z&AzfNO_9^TD5pc+g`mZnLcK9#?(Jw6?`%AF_heU=G!#a;_#-)Y*7TL>jz&C<0(n&-o<%-9Z z_Qxt*J&U)wdxDT%7fUQ>6ew5`!U`OKYy8r(SHS5a^I6b83=m19l7p_GU27*1^fShZ9%?IWil>2&Bk=^5GRPbhW(NA;Ll}MZ5j0rr0M7m@ zarK+y0E(w)kr;>eQW6Yxj%)w?dtkFHSOjP|Yi9+Fuk5I4ukwPsUkU9{xO_sRTq3N2 zCRx})qZnY<-id^^W1Q%qszhhTopK3;D8wTVGIn7|kuEY;H#ON2p+V!_#<ZZ%5N#Z(F&c7013q5&H7wgBGG;Pq#*GBPhpzGu^uzUXdl7c*t1IDfpThAP* z<| z#?CCVi#2~zR#Z4~tXsJgG140wa5gN*hVVqTN206gCj0?VY^ifw*_A``I(@6&6=Mw_ zA_CkMJ|DU93HS)vJKJ1VU)Qf5ba~`8n{eHA=LgcW1fW{N9J%sxlCV`UnBRL~eRpmS z4u z{TW-12@-ZA`UHFv(vj$>kAV@;sJ{KOJp`2`h*Pp?D4AwL17q{;X2{|PeQ1os0Fe!e{(9G1Q>iz>~q1(H(gH$bC}(hv?ZsDmVyqAP($nG=-h z{~^YzL<;FjZb-a+@U)W<8z3W>2@;nR?n-JCd(tz?BYgu{gT_e))Qpf-9EYJGjL6*c z2?Wk%=P$EZO(0Zx+K02?XPcBgF`82tEb7zw^L-cFr{-*G1qA;CECJ)nd4CpADxfN}PPrr!Ze zVFS!8M5nXF7>%bOM8~tNR;J3H2Wv-Gk}Re6$ju%XHEsZ)*9yp zSWg|HA@_F|$0~qgndS39vA&lwFnlV-8eeq-kiD-4$Ws99k=1U>K;b$5fY+oLho@1< zq>}npu&e(^EGj9>W)`r#iHARlRkR%63L~BPmjo%`OH6%s(jzXIB{! z_C-uQe3qv6*I|I-^J0qWb^$7A6ovtyl)3Fgu);=K$i@lYX0gF=^Xi+lBj%#m0uyFg1~F$TDG^H|0WRy{61pI z)ie^ApyJ|tbmQZXvO|OQYr9ixd(!~+P2;-T8e8gnKplQ-g9h*<#_F}>n22Rm6}R?V zCvQY8@I;e9zZx56KTMo?`!^v&B+kXV^}>xU=FaIwkk`wZ-^C}_7&~ET3xnQ zu+e4+o=9rL#rJ|q(81+W!W}nqA`Wp&J-Dz!&Q~3arGF#i#<}SMSMb+mY#I@YqcDP7 zR*?j_%Vd`*fj!=+(pfh~X5Vt9P-GD{uhF;sm}h6oGNC2U_sM_?4L(NQ;VXM<0Rk=B`Bw)QRKZ&Qyx06g z0-k_H)W7fb`<=-vXhzz9?y4+LD@-S*m+rMMD~EQBp781`Ff$MNdtv~rVaix{GuUfK zc?*PScRe?%J^n)2d6Gn%zt0_m2ZK~#7SX!`lwOu9UVf~b06ewZE!VS}Ixq%xDZPpjt1duc@ zib)6uRR4ffw-S}1M5=O}T257GjPsntiT?$QUy;z(RECk^ z6vK<+^MnPn>Rj#q~zKxWH+qldK!1+VQ=UNPMZ#IY~Y8D@-Szf|@E@T?cTbU4^80bt^K zP#SleB|G4&O)i{C3Do2e-emt*|1N};t}|IQ=V!Q6SI}kj-E+aafYO!uDC#EyIMy2d zsl;z-W_Z%V$xAk`0C>iBXc1pLRlw4lDoD86u89xL<@;=KTU|g zzJ2WIdv45x>NppM`K0#HG&S*t{s$6I=ER>AfMWN&ncTK6!gNa7J!*G!g^2)`+Rzm1 zH13|5d>^I-P0YdCaCW8E@nY) zvl5e!i(gtAeY-0@Gbt<_(N%b5vAjlkc~W}Wd-o*}l=CpG?B(ieXi>S}po>a)P;y|v z{PX`(4D^|gzb-_c)ZR58iC{9OsTZTgGpvi%z(x_vdSrd@k4 z-{gPl^Qj929;oC*R5e1D70e@t>NO4yt6nro>(#zWA#1%{x%^i@ z_W`+-uJ5>0{Q5GqNRT9=#N>4cytF z(|&bcDNNREMM+*4i60{?4^_1KNZR3<+p%NHoFQR|xR~sju4?kLsagw>P4LKKM+{ZI zzMRFD9?|T~oGrM`HIr25(Z&7#LqJJOYvu%_rf=9<_hZhPm`9uzB`YS- zb+vc`uZpQ(Aq7zd80+240BA?RWy2};^SImhhd03Kv8RC3R%BdAyDnwTqh)7;Io?`U z!q%SQXsOpfOZ4{Rr>jPqC9iI3fRWcVz+r=as>=yRcqf@$)fgsGRA$!8CDVw6aI;fS zx_!n_hM=N9W3K7jv9$vdyz^+`OKVXgkiORxo&Q3a#6^?vFdxWaIkb32@YDO@o!9;s zFac+9Qtf+TEfk;@dHM5;1F5qwPE;WAg%Us{*Q*wxfg7O1-AJuvKWj2mYDS8;CoE@0 z%|)%Rp2M8H1U3f86C`p}2#vI}X31P)QROw!VChQ5fbnq=;DcNd$C}gfV*>cFTNeoj zQxtyyPXX&>3gE$~@xy7U+cQ2Z56N5t#0krbl`HzbA98{f3&H$Iy`!@qYDi`tlezdg zk?CArYaM#?m2{NZMT}5p;5QLUM%7Q8P{yCpz+nUZ*qR1~^K*2!{S6>tz+gjw|lo1va@t-<+~m z5^|B7w`5PWp)Yw68q*r++k}J~3Loa`v?RYARA+xXlEuDr`9KiD|2Xsa6; z2f_tjvp3phPe;+?oPwoFg%v6D-&95w=Vi+kO!N1L+6FEk3b`16D~#SK!X9_Czm1RF zV~wo4*C3Rv5!1O+m8mI~6lT5<^DvbQ6R;zMS4<#~s=l@?Hv5RT8{)*O%99G+e|QEr zTJc%yyVWsOiF2H=ozw5b2D_3wtYp|&R=X7?n{VYD<`%xet^J=`j(*=aJ1bcu=1CWw z970{9$v07Q-SS2Q(;D; z3>ts{5TN1!u<-lQzx`~B)*Rca5!kYG^3gv3sxJNQnb&La4DxhejAekU_H)(UyIcUi zY--b9Wnb5I{X4^UnCdQu2-vknMHkyph}2-YFu-ms!Jur#qyaRW>moy}!*82-hJIr2 zJPZ66mlku1uCsE)UEiD?o6|}pqYz;}o14H zve7ypxCB~y`jO9`X30jpj0kx}aXl-ET!|gn<&fev;g{?c`_U_4ZBrmEo5iR7KA#K6t^@-(d{(c;8U01&qkmw{PI`P}yY>##7k_;utO?fkQdQ<@e(93}nDWxIAfF11o@6kn6ktN$J1Hum8>zWYHNg X(e+bH$IQ?ARQ{T()|K4LmQVfS5`0h7%X70>0Jzvcq5T9f z?Bytj*Ajanba`Ol1^`*>)i313Z8B!;AjC~aSss-3vaDclaBSo>k)Kj%?nVQ}|4DbhJ+Gm+|rObvq|XNy)~>#@{1jb8~a2<6~dGd_6lp*;!dV zZm#{+-`CdGmiwt_uk6dFfAIPCHYVl`T0nUxJ=?{_MNdz!-Uw)~2dI&_93SGhH*XC9F9)^0NJX2i1PZ;pVm0(tv@k zff@5-L27cxwYf65a!&Lc#jdxXSSsqdllkd3I0tG*uJve^(8fd`=KZ~4Bipv{^(Akv9oBDyKmx+ty$#zLY7&=9yuns3tD_ z-If~pZ0AVmUGz?4aN&#blTm^zvL7n?WM8$7ja1wrj_C@|-X4Ov(3S++C@9E6#0EfW z%<~f4vw0x-SWmW7CIO1MQGgmxif0=2rMn5GfH2S@cTb={1JQy}pw4t41mDgvH|9C3 zq!|rzisRSrSuKuP#hDjF5{wviO3UjV|0MEv%?LDJ!Y|O@|Mj2eh#9908DZcRDvD2D z3Tb$b0I#f)lfuDSxiD&#Z01D?EUc@M_ zmrj!2OW?IqHJP(XM;@3j!#6V$c_7UVyn4JU!tl}NGBr{zT%fDbz0xQ@v^q-t2fvk7 z)7KQTKN6rQEnx0xoUJr9a_RqYkm#8KHTePIi&H7+%!Kiaed>69bdZ0ffXTD`x+;eht@m zYiiSXgVJ8uz0EDdM_+0So`U3MhODQfey{ZkK&oC}b=M-=!cZ!DO}fI@Ar&eRvljYl z7hQg@#_rb76<b@S%Io9y|TSj(3 zEY@Io01;Hw_0mtM7~e4;cF%BiFP|9632`@c_ASJx_3?UBu461WmFrRPax$aBHiA-f zzv5AWuQ-nXpY)Q3CqOB5=ACe1gL}YYZI}O=HTh6Bx2|DJ-L6s%jf?-Ub(m$yph)AB z9{r8?&OLL5^d7G3RLDLJ%O|0sJqt^Z&$*oZ9*M^%^(~1y3Z15cDe@rg)!)!^uf&6KMlAN@N?vliDau!q zem(43$y>BQ|EOmXZ?sZ8r-ovN&r&9&Q5VTuc<4vDWHI z2bMM>qKED6k^6!VSrR+4cRiCI7Y zLY7f`d(AYE6ccln@)$IT?G`Os1fkDmZ@H9|2MW|E4>EXosNwlNRmGi;3M-CqMMo171{(vs+^6`Ck0IA-c%}B*jAfzq<5%YUarc`l3P@aBMv8NtYur2R* zd&O;fEBlsS^_u%ZG=$+S{8NWBHIl#2pW0!ccXHqHPh4Nh&~#&c=sEO{4A_9p7Zs=S zzZ;#|8`z1doqK2Htl>X=?wVvP-grDIa@pBPB)Z9*)i|K{*EHjpLn5(I(p`7;pS_7= zC*weldR|(y!wF;|w%AWp#uKa&%7Kfq>~VYoC}s%{U6U4Y0BOD*U`L-CR6CA|Xfz*g zq;np8IZED?NxM?e4_dvN zhm9>cJPw_V`kh3CF?6_H?`_D$%{$sBo;EnwwiG@Zs&LsVmL z>P}z+NewT9ve}#r)?{0~I`*5??TmU_IrCnkbl)MNcS%M6Dj2@4`7ZjMfbB9o7Q#QH zWgHfJ+1p4er})ZxCHt-J-O;9wVT%{iS#wYID$t_LdU4U&+fqu@6#?4^TrPU+5@i!M z&T&w3gEEipUM|eo1?JnA)=$|z*~JfY9zCu1PQ5wp_d&VJDZ;xi7gkR#Z?~}#u_Fa-_ex7;e$d_k}8KC~m-~3p006i!3bGL8n;hKjNN0u#Mzfl#+ zNPz@U3RwUpkOdF|IDp{5kpSoaW$^zVhs@wxiQBM#l^Rjj|+^Ir=#F~+vbcO^W7V^mPe5vvB>~!mLOoD#nu?L)l zvxGSKL35iLZc*35#Mb3Y2~iwcflpj*moiI_+rAX!wRCh_zAd&O15hLdI5N+E8>n=d)(N2US(;&&r#ZV^Lom; zMVrMH%QFP1Vc+_G0{51WNo6*rGwJ8Qb@Rr5-)huuowfN#f)Yt&W5Jox8pfZf)@*Zk z|5Lvu+rIYK)MWWA9}i!3)+d@99nS^OpYc%Kcbx}?DpdOkNP#>+PeLA899xz&_TD58 zCnDJx&<{#0gukF?e}o=-W?2~faI|)%4XA{p+D3Li)p4~@1woo+t~iPWsAMG*hqd5D zQ2B8fqR(o`7hA@p6h#WX@l7##$w&KFBd-z3mDJ>bOQ}Vp2-u{fa~1|{afO$rH}8gM}Zqvbgw2R=}lgZjaY$)@zx7Lnh| zzGJbIZ7D*uS4R;FztSriIWk{F%mXKLgDBPH0K!MVU+7Y(;wN4qXO;wz{~*Ya*-WgS z5V)yuAI|q53?V(C22rZ;e+zt5C#s=8ZNbBY4Ke zaHUt7Vjtm*Qcw36_K$KAUwja~|7Zq1vCvM@)Uz=;txEb#Y0d0=?JZVAOz&;ccEES+ zYsZG_E4|v4=d2kl4$};2#Gje741OZ0rV`2RL4>|H-RfssLCQg&G0PAs`>iKZxak*X zsZ|f|YHCKzv9$-E?waGVM{Ihq9haSu_qtX8{e0;B;w{-)@pyckxpCMs&sSNs}&BpI&3+ejxkgW9k8SxCQp9$(u5l#YHdK)EM>o0gV=}R6Dv@ zfK!)4ohfUZnN zQm2MZb_Q5pCr#w+>^SAEL=ht%m%9pfoN}~A zIqP6%(`hDtKU9AyAMsOr^Ypl-D`F!cNGt17R%qhRQ*YRSZH4WTi%e_^ZJ?9WY`E!z z1Kc?n{GDj;>-x*y5BaN03|2>+p)yJ{>;c-}K6P`2${xA!D<;Y|_f`WEf0g>j_1;RP zE)PIA-Y(}mC&^9|c@c*72Q+azbTIbK1+O=Iw|T(gV6^UvlO<5!V0WlJK7T&EWo;-U zt^!w#4z%^QEEqlGbz^3?de$8h9!^Fp+KF7xRkA5AG$vTw*)GoZ>Y7S77iqs!voqV` zRYZoFeF#!>CChZoWa568c}o-M#P$v(40kGSNOeZw$Xch!h?N*b9P^BnbaIai2m{$;$*6m5XE6>&-Ru z_eZflhmm>&OtzjHeb8lK_$~Me+SNxj2*I71BL2wgy#Q3J&n$=ZOF9t~)BSJXG9TjH zdFMdyX5M(X3~c?6CJivN5+JFQf^UfbR^UGI(|B!(#};h-*JVGPDK+%{wh1UZ_?{)! z*UpM$_7L6slv4BE=SOmit+l^l#d9EnhkXBak)od${C16_U$~563rgRHxXh8s9${Dk zMXYv7Ja?aZav(^(P-xA_xP-+u(K-a~biabc zK-XkO^zeU~3c8SLLUlzRQ0eIrw-cixWHl8nW3FX>^^|IfC@p@q{{V6{Er*${1!M5L ztJ>S@9X?BxW}Z0kLm3KW?z{aCpw(37!;pIy5aNPUTr~b^IW?HPfg(a$(g61cRwl1Z z62PIsSbjbTWS8Q5;W0#@{05k9(Zn_TtZjqJw?}@<;RJUg3}EYcvP+X$FYuRAHk2V+ z%jhxz{7u)04N-g`0i}>Wdkl1DGRBmxjFa?^Zvsx=JKioisA;h5FM$ILb^McV2cl17B;{=Fe`&{rF)USd2?C3dRRK){| z0Azo~)i5UnvkE6T0U5ZcpfHy`h&(n$<@@O*7E9&m4j63r_=;}nSG&U50KtAd0Zu9O zs^R1c{E#a!JopKi1PmgFayjG_zNBD4!NZgki(3beo)&2VUX-+~tA{{X4%srypA`_^ z$bq2g0+97k3?XqgmJ|^n?}NhqYX)D)sFTVzeYPs$n$wHvISnF5YL3y8Nj(mLVVTce zGM+`ZaTC zUb=KFU_72Wh}{3ooVZ2*#|DbU_YWz~DfEyxtNJb#^$fWXaBFXocg8Okxlh&lj=zoy z$=RMf&#@3J(>-gxPAn;VrEF)=94V1uIYZw;&?m~ArTqMzS}pD3uY@FzIoGc4`f1AD zEf~drImS|up3=1nGJS6kR_UWBmbt#wvU0D!AV&RoVIitv(~uF1gIvy9WkxQ;)|ru* z+1RfVCh2wk67^QMnBH@$M0$(JPmS6~Dwh5pk=V6fI`&waDVq;OuS-4G>K;zTy}^cK zzIpbn^QpUdOX*@W^EUivQ(6$#wcGrWw083du!`#MA8f*PA5?DtOr;JQ?!{LG?G2K)shFDV{ zKXROg)O-*PMQsHBTn8Uh#CLgY*gpJTRPK2sU3Ys|;r%xk;+1ZAdCGS)+IZ!gb1j=7 zjC@8HCe%o)_U;kLuWB!Npf?O|&t>`tp?c@opib-O{Y|V%-OQ>`F@sB+Eu)%8ZR1=d z_8z~qpS|S?6TE9`H|lrv=0QqGV3Al2y~C*9r|3iUt9(rBu-iDGo+ zr$F*WT&7LIq8J+fdY$!UG*&ZS3QhY7fF4PdA z2NprQ=+i!$tM~lI>uE3Ei!*=gl*v(R?dgt9o@E8La+bZIO%g-+qQ#j>tFtR#MbCzP z#iy)O|v(53AH?Ir6?8aXAn}8`j2CIV(a{p2(uE;m0#pIq#raLWN z=Fx8yHpZJ^I)5f(oba9M=pE7V?5JT_--(3(>1iTmK>d{7Xl_xG3&d+T){*S}li@@8O#{ ztQHKbcCMmQzuxl|Z}h(yB*{e}_;bd<0!htekj0xR z2|-nrtSWsxzC-7o26K=CMG)X=_d|c}B@For$BbPmRw?X8i-P=MoItcmSECA!u@?DL z)4yN=$;<-GSf#dLa5JFIV)6Z1hL+jG&GNtuCdOlAwgC-_mjk`L*UM}XV~g0fn4z^-F34!#(1(r zpLlPXra#-YtG_H7VjAWY>~==jBkAk#_a#=bg^Dk{S24r9EJ? zJe$ux8WEj9@NE;2sgsl#o5$^ID{$bVu2FYXS3?N$Ha@T^CsNFnH5&{)eBK6-joHLr zVInu0JSrMm`28Ny>KZrCz>o#ZH^0$+qhD@lAOz#d)<2`??l(qHivjcvfVh2F)MH%% zP0VE6hrGNkfFMPVCwB?HhQ*6NyO-yR1rZ9aaClbPoE*AHAnWGC`253!L?jXHL?nThhhFhOTykwEsqmX=HJ5}s%2x+snnYI0{Li%M661K%ej`9U z-!~Ze!-6y#(bW}fUuXLyE{^JvxC0kb06d2%$6Jp-8stt@Dj1IM1|B>YPVM~J`}2dM z6~A%|6y&*iTfdtbFir<9RJ;A_mrr&Rf=+at zq(F=PI<}qxEZZlw8C6zzha7Koan9gBa8lQn@Gh+Y|Lp~^m@Y~wN|n}ey{sdt5fC0E)R`SXUzI;Y-nKgkQmBU?2_}Z2LF#n7nF7TfTTAf&qF9+Ao+*ILd74 zUhKK?lSdHQUG+W^*pk_yqHvHgD)1CN`=BQulD(4Hke_R>i>yJ)x3@ZZ_wVb)#Wxe5 z=1P|C0T6(P2mVkYr$382*#NrM?=j!UNhw@HsfoY^5Aab_ApA(C*d?sC7qiuLW8z3I z{By1Q8UWw@Zc&31!LQpIc8Z?muuRdAJ82?g`;dh8;gx$kpEw0`F-~)0BSrrR;DSHp zgvHt7eX+=}@B1c~jnTa5*j#6~R4stfgM5nCw$rM73ACwwRQu`yt%Zi{AOqM?^DJK> ztsWH8mD&I35fJv_Ny_5-KIGOT!#NsL?!|j_IjZEK-v-5n;f4HcAwy|A-4R1;e|8e@^uwfFgA@Gp1L`FS<0U1ZseqEbPG^&} ztmxuegwH9rWU12A6?5PUF!=7SG-7dw=Q+k&x0{4EY7oG`V;lx-@MS*=4t|tsGqg4u zM8dio*1!iwZh>TK{AJOCV&2t3t7^@VgkQdNcHOdeV2~Z6R;=`zg#S zFc+_!M7mL^)^3*Tx%IahGeP%)ZN9kLIKV{>I=@KEPRO-;?S2yg3z(4jQu6p@yWe#y zJ8j&Qz^ZJ}j`W>0ssMs6u{e4Ml9pP(1{)6HFSCid3%eicyW_C%rsSwd-Y7V*oiHUu z4LbfZtj#a@diSuorm%&mVh=v??Lbz-j%JMG`v&FXK^(fxn6GcG6v*Oh4_6MJJkX)S z=NeSy6joOXUZ?<=gfH!SMISDN@SN=Egeu|=h2Si)PEVZVro0V`>G41i4B6cyl%Oao z6}LFrwhM4ezGxL!fnqyuW;golcY3mdeUR7HDTGpz^wg6+T=V?wma{%p|MA5Li)JXd zl&4yoL7I9fA$Q#j)s@@mf2#eF>r;^yK*~T-C2}JJ8xieNtNW_8?jK=8tj3I>fh;k5 zk_DvdV%D9q`uh4>G)xX9z`Wa9&E8RC)krnP4WM=D$a-)%>9EWDwR1n|8|fip7V zC^Q6Q6~xTGAjTe?amWDyuVlpTKr#ZrLzYG%pK@7@ZeLs28>7*=j-+Uri$T+}z(Z{E z0n2#SR<_h0f}cWw%oM@G_&`ZC2-TBm|LWPWh=SJBQ7mt;6l|(zI@` ztqWQL)w%WEOOI9U*TXrRiCj_wK!F3sxX&_m3>CGx2Igsi%G?On@WusdH+$W{W?kJI-y1yzKYa$ag^Zs_`2W!BOxPnR+}HV@|440r zKPx48@`u%uHo{qplK)T z$mTct4+}M?p0^KoNKkaVw^hVtbW$cw3q1(|4rI;;A9>0`8_Bt3pO#3=DU+@5@)3Y@p zZiu)3=BVg}2(7r!+Vfsj)p1RyZ~Jwt^*V3(yv;z-UN*$+Rl;?}_1 zjtnE9$-5n5*3e<0oC214c?@p0J&dpP4+u^Tu#-@twf^9@z^pX*l%EMy*(Pt{nETD{ zOy9&83xQl&ix9sNbT|GRXhU&o315254FzLI6?e_~jtk)Mol|~SsJ~FM^oC1-)4aOF(H@{>WLl7|Z&ETM20}R*AlnAl**1n4msWG}^_KbH7GX}Ls zQd834PI-s?d_#2b;ywdN{&TKx5opOxFotHLc2j!C`d55WhOa(xgN*d9-8|#&>3qM%xtX4*Zw<@`JCp4d*NoH zG=F#k^bp=~rwPO&F*2Dt${Zuj=Vd41rMySVa@Uihe73+&eeu*PfdvNw?A=!NFEN4okUolh3c-`5xgpLVjWDxKZnP#wVE^ELW76O`bNWr3uCp0 z?PO4qVmHXrA~;dj6K<5C)6rmgc^Hf&wddT}B@RxN*At%E^ZW4|vx`pZ-L|cmwoJ0=RpxzZdUXcOn4m4g5&EvD$#NWx%%%O+mWnLta zL{}d^ILr2zkxq}5WW8ag=?lylp7L)xpGE()E+q;jkqPkV=CDOjGEToT3O72U`pr$E z*@5V`ex`D8$8R43{;t1rdnL2g?I5BaC(c76SaZ7cQ3X!dq?nQM;*saa=9=fl47+Eq zJ(S5%5~nH$dp~Pv1E9#sU;Z!e-u=_7{U3Hv&z=>Kw&h%`K4@=T&v+=_-^~O$?xYyqo=dx*43CqsWgGUI9Wle(&Td}n@Jf;F z4do^gJUjC`ZH7-WYL(rRyXj8hXo}bR;pV;Ck#yUb)>z7(936(Zd&Ir@KO`^jEK-}2 zNxp63Ckr42Uw#)aOoqJI2_{e)0j)dgpLX@CQ(pzOH9B#p3CV`NG5fv8@Jm>GDnNeN zo+zWSc0uxWGd$GKxRaw8Z@d@jD@^zSrCgG*{AnR19k42D#C_hcSqU@T+!LtgH~RI7 zA7-Y5j~0+#sYw0v)ZbO)x8^1)-F zme+TRiYkQGh>0>{WSEyAG6F9uqf9 ziGUzS#6=+q3hH6egSj9<{cVfTEZoRJ`IqyxFS-nrf%f(4LQ`Dz>lI((1-S2m3GOq* zg@YuX76Z1rH9`6{4YKb@#Ui#iDO=v~?di{kdj}LI}>OkVIaO?uOVFV5+~9WFmfY{a5~z9AYkaMC@%1pDm(R zjASFI9+}OdsX;3z<)AIKis;*2b-^-1{?iGkj;lfJ;9u0 zvKgFPw3JC?;CjPQsDt8|*e^B;mDoODdH!eMl@F5C@EU&vpy>)~{3wq31RNe8tx#iT zj$f8;!+@9#s3OCPJ_aWHn&28iN-3mj&h;xGX_lvgfhS%e-pU>u)WCF#aIp2=-N7ZI z#x{Y#U?cNSMV1s64KG^tJg*~ns z5cnXe@yt5@i&TMW@rxnd&(;WFY3FvN0Rnj_CtSzN>vVD3Vi<)ul*$-21G=q5^FiIt zksA#3xP5v%3K=VP>A8qL(n|H1EWn!DJT+KnxOy`uIouz-o6q_B$N7*6zEuc8F8UzH zZ~>W)1XSA4s`fJSVYiuEbGZmN3A!uH6IdAEO zG%E6+uvAfyg6{(d4e#*BTrtBgfJFvdHWa(hmMIJ_Z=Bo^lET7}14Fzkm^b*Jj+8?M zAj?W@nL~i(CV4*{@-i#pM%Wb)DVV%+-t9kO?wmBW@zn^IFNQ2XXEXcSQ~^WVEVnN3!Rd~K*j>Y2|xt`{nd3Mkjf1t@O*s1oq7#`WNP~J9x?|1LxUx#3Bn{% zgs^yj9HjF+B!Nb0jy39DjHK-KHELoosNx0Z;k0$p) zz9S3q|NG!fbQi#Cg|WF`v2aOL7`vr!BB-kfO$!K?x;RUEUx3PMPp@9s8nT1AR7#?@ z*Pse)Xm$u%-v?O_>CclyeUN1PD90~z`y*v6OPBK0?&qWr?W^aH5OzS`*oA6h;o_D1nTxpuNSHphm|+=5g#(B^BpuZS9}ru_pidll_Q zzHMS6A<3GoKhpG@v9E26i7#DxR+GQ@=>w|d9(ET?N}Ml`j?B*ny#J?Pp1&NI80A%V zyhAkit?p%S=9|YNQF(R+FF5xv`WRN0W51AE`FE|Su@B?Qr&f9eN&n!#+dq*Ir3~+R zv>P+HJAwK;Hy#Slzjivqf;=TadGp;`2+bN!A-cTKCP|*MOmA_J7#n&bV*~4-XiBp9 zlSpZbAa^l9MUG#Jka-a>_!5A`fS+9?l~p$h#4JPxTSZkx)u4e{BrY-%Fd;A{9`I)n zzh>rRK~PUssFd{nr~{Z7%r`(Rwb)7v-YsLrtOqe45-|LzPQ6L@Up!2;7{|NJc62(g z)cRB)itixDb^*vu=c4g|1TYmIIux`NfGotYCz3xgwM-v3jlxfS$M*oN45iPe^~o&P z+E!0bUqiQqOquN?vm$}ZY-C-x>}|vB7q^4xbKS8x=Q1RW_5Guk0=y^LWw@d)$G2lx zkmm2bgos#(Ma?g|HgEZFRqb`k*c?VauJD6g5^bT`^#om?v5xu)wn)wp9c_)LDXig> zOdI~8>XM$f!h1SO)v#8QJY7&-=iZj0WYm(ufBqOS#hyFxT%`OsbOnQwD2?GW_hdFm zIagiYX-a(x=h4QY^U9jri0I#I();2PmqkXz&C6~>Mn~f`1I26@bI<4HzNr4`OHy35 zJ16mpjJCRJ4$|_g!lF5bCKKP1Q(|f`k7x!YZwK)|39$sPZ_5Q1Q5Gd-h2NF>%kB(N5lh3`*YVjg|N@BK{@PwCd4=*0KcgMIA-4i_^U6_X87 zo|hxYtZEEq6vlf^+G%u@$V2k``RR4j%-W?JR*j}E*MCpqlGKMsHnQ19$JBfXcJ#Y_ z_VMc^#YscemdG{lSB%~LV^q`IG0jq{{+4J$Ku}^Eo#Ho)!nVjl6r9)0k8g>?PobA6 zYC!RHl4^(dr>mr(zsWy9XTsy17`5mm=nO=Wz_2UpyQNB zFimWFt2ZIOL(jqb>zp<;=xXZpG}Zd>pe)C~8>xP(9S;Uu*Tx&Liz_m|xi?Khf)fHC z{O2y@CJ8KqKu(F*wErI=8-oxP1#E>i9v%6cTv86zKg2tG?TCwIU@iV6m=pWjF{&Ys z35b{u#;cJ5XhLX&NiWs?rc<;2N*~AJ2iV#t4oQ9G&Fgr2v+$haE#lo&$kj;PO%lB5 zQ042hgRMQ1W^Cm1u#uYq*ehrLl3J$_

      RxP(Dh*1J*Lo8qkFkiORJHi-G)12;rZM)s#nG^$>^+o&^P%fQd5F@OR|z1??Hefs z>!ejs2!!yE5q5}fA#E) zNQ+K16LPN77wJL5!!BneY3gm)i%);xQ%ob6zNfXK@nuZkLM`?N6zx12)@ z(|UH zfZW_vh+&j*mYe)i*7O{yu#kM?M)v8mma0Uqh%cxf>%!rZrc~-;zW5Sz!?vc;@L;#2 zm-zq?cSA)vZaP`D-1QWNr}y7}eC2^pg!k?~K4d@ur_Z60Hqt8Rjns(kyDx4cw}?1j zec`^ydyi41X(mCr56P{BIDUqNp+3uS8~U|Hj5Y2@8$MWx8Knhw+BJ{>c8m%FwKFURn0Zsw$LVh5z;`w6CQ`RfPlAzpt1Y!wH(0ND&r_+21e8cYS92WA9X}!F zsDsP-p#1R+J+RX%qxhGWo*mF8h2X-kiZgA!eJ>nd3F3s`w=SGu%hYB$skhmCD)cfJ zI;KhUN~>=Ke;uA)T%pa8&~;ZjOeuWp-7B`DH#?-jN&Elu7b0~1Bm;}J;vYH_mn+g| zL{#c-$Xs3&Uc|yvM?xC`J0k%h|5#L?E3U(9QsSuxb6NCu`&RiS_rMrA%KuUYQ9%B# zwNTR6?~QNW9tOgVLT*otY2GR-A{(Hs0bJ)nTpCTd+70 zO4a1^Q!OhkqjEVL)P?E)vZPtTrhh%5#Dd*SNsMs!Ph6ha`jFwE_;26AGWU zH7l&~{v}bcHbu+Js(1OOE^?x(Dpz34HD?$I1wtvzXR=I9-LDA}(Bkp;oK6W&HvFvX zYx9;+m_cDjqV5*PzE4n?rkuN_{Gj`EMYF{*7BOt_v|PBa+23YD9@yap{g-KAJD6Y| zc~xY-^vs_xHVfygK(Zv037fq3XO+qvQF|w4FUBmTUasHzD{)EuW|0{|!nf}|7O+~Jb-=fD3)HO06|EP&V06O!1;N%=-dxAt9!5|x_dL={ZcN&5 z6X>SR@^;)Ow`$ABzPboqBl~$q&Mrh18xx8^KVSRUfDz!KhUqSs zEtW=36&echReTCLIIJMoU-o|>UVGR^2kJ_a?k%fdm}*=y4SqWW9m15Yn90mGp0x>b z&2G~GEnAI11JH0x0tAuCpyoE&im15!^e~cOFfNEn@g;n?P9;E2pJ9pZqXz?p9ebkh zGHB^nJWjE9Mw)Db@;n|Uu&}3jm?&>;PtRqe^82FC-0@FILg1I8ZF}?ZJox|9X96Yy zQ6smjXjOWLN5TTbQ7pFQjtn#4GM77-i%_AL^e7>`hd!e$RpD{3Ay3pe2DnLY7cqsX z#k1_b!G#Q0>!_Hwo4aRaKg(`s+$Gw_{P{}0u{UUBiVy7g@dNxoRi`fba%OtM^@*oS zg$P#y1#3)H2X{&@YFjwn_Ks~~zs;s^qb@#yIJ@Z41$jP?_v8HOEg^t32iG&}kEF}( z{h7=vQ4?5UV+X2Drl0(pa{53Nm@p?q5F(snnzMV>Ya!}%I0)ZOha>%WR(a!7dEbsG zOJroXAMWlrs_-&yZ1`&!rOhG}7!5hx7M?W?d+?WX-eE|_ZSIs^H<6xw4?9cMJJSQ6 zbZP8xHJ2>8${P62`mZBieZ-V5Nf`x)&r8 z@QPa+?uGNx2?-i0t9_9uMqEtTI0nb=r}6{hrqgB50hy)dcuMm9At)m?@L~$Q=LvBe zys5~3MeiPUbG-e=W}N&4Sh2_CzJB;6G~b!IN0QVcXPvsa9J6&^?f*PYT^7b$hRiM_ zRP#s~owibW>;^6;dp{1yma1c_*v~Tz3UXJTu1J;$c3fWE91?_oFu5Kxsyel4mv->y z2jnIGwlVp_Xu6x~mTe@?h>zkIhE_&&uYSpHE5F%|I-^4gB*?ARB$HC2GB z18$svWLVoYv$1>?qY#)1Z=vg_yzJ`(4#&7#;BfmpN0$`$NO``oCsVW-D5bC+=wxB) zpj_ddh-m9vz16Z{#Y9Aak*$`mqAvpqPbY#EFywbUq|NjTnV(Ss$j>n4i7q~|YR*V^G=ENA|4>j$<~_gbv#|v^KiS9WNr7&V?`8 z-sP4mi6BZ_TJ-q@T3=kLJ2#rL{Aj+;!QyRIeF0Ey!eS5@x?}Gr*5t!Iy4b3m5}5>A zLp-Bhk4{2#8rGj@ajmy8Aoas!42gk4HZgr2<^pj@oWlcXtGW=l1|!DBxuQnqRDR$tAX!pS^_pmw<_>_OPE z{f-^|rJgC_nsVYA{vjf{OYEER|Gfn$dt&z%9M7V+)-A@*3*IAC4kbD{bxEFdP zmgo2ikVVQ~b@OE@OE{%aH06#JRFvqA)nd3H|Mc+Zmda~mp-$52T&k8?hgzIGoV>=+ zSKuvG`_0zm(;UHF?vgZ(Fry04sLknlKr)Ozask5^M!VOdv%2`!0vF;QA*?gbm#k4+ zh@anM;&YT0g<0Ih@B=rL2?r`)ZV3X(5r5~DXcBQ1M` z#0=*WmwEqqh*`-vqh#?&jMWwbaL`KeP-6f)F8ly&-Ep@y5eO5MOf%&lMM;b(3#dOb$cHx=;4oMgZ&2a4#G?-SjXhmelx1e99e_q(im*>S zU}i@P#!%zSVk{hwqnZ2PK0WKzay^f>vY9t{_M1#Lq$_PDx) z7`JuM``uHfuZFIYbmEqIxC`pGAJ{)CxQGd{vdl2%{!{~)^f~sDLrWx9te4&i1k7f1 z(lB1IZ#RE7HUQaAAVrLAWe>7Pgg>pg5G3R=X4s(_P#L~FYMdq^LzB*o7nUn zoQh0yRn)vz1Xqc#E2$b*Q2xJyUj7qw9-4P6?l3#`_U+i$a@05}4u$N9Y%nkI^>XU> zbt8)VU{Nn7EMJnu>N9N~4d?GGK!ndi?A#SkZFo{RP3wpnJU^!8ScR0mv zll?(P*8T+7#w)NO&hCnzC9Bk!VX0_@UNcsDlcB0q*EJu79jS9r^$9z2p`~${G_HBZ zHsahMh_fyz#^^WO#5z#^D1A)KMj;e5tpZNu3cWUB$PF4Tn5z8Y^sPU*@QTK0E7h!V z1YDv~h|3o1&yo>3q=2LbB|e2p>L-hmBTL2cJ}lq>FPB`=>}XZ3+HcC~sgHj+0X`NS zqZxOdYGMI9eS+16{v=0%r0|w%!ZTL}y!Jm95VT%lx8*p#JsVoDQ>Kj!u}q#f11N7R z3Juj&j_?Rg_xVT|)*tg611oyTuJWQ%7yK2>C3mjJiG}tPZvk-#L57U6e!a(tXv=zD z?h}BL_UWMwYx-NQ^y6mY;tvkBcb&ffBtT#z>{&nXL2HmB*tm{cV-9f$)O}Y-enQ?i zf#}8c6#+d_A$yGXsajW^qg1W7qOewPbV)p29K!}X zTMnpBc%gUp|T3{ra~E2i1GOJuaJTm3!Jd`aaBrCm%=Z07ljWczZ>_5Y|n*SQfiB! zoA4KWbTUE>Hauv+LjKNWiGT!J0qu1#vvJfE zn_yOo9W2CrzlWpmsJGQ_hkYs7jWy?Z1bJI@H*SaFGv+x4mq-_e%EGNTj3Gvh6^qnT zh`~K`8r#ZxTtS5?=})7Ro2%rnOLL>dNMJwe`gFN*5WxfQGDN7H)lkZ zPTRM+3e*a!=%!x)JWw%m{qM4tE2LVc+5+h4^*gj@>(<4{&w}?d26=lFhx^1%DpHHXmcs$~$|Cu7s~kcC-({BIS2vQh$D2I=>uZ7gXr^ERoE#^{ zo4dk5od))M$hPZWE6%&oqYWZ>x0M!v=kj>Sy1TS4>2Y#{D!IgELXmsbqaVC5l1#&3 zwO0_9OsqL#Xh7yiDwqqI+ehWE7oI@5n?x|9LpVCjxls)=R6N?YB99QS7M|T$$QmzY za#2EAN_zOd=NF-$MvZQR!p*;naE->!WrI~i`SygU1^k~uM(I@^mPyQ0TZF|64o`7a_t&4f&pg4`*i>40%HRnuYDX z8KBS&tAo$)jrWO0A7215BI>ims=gBysnSeZ?~4f$IuS;d5uiNJh_i!{-TR2hwkLN8 znehRffYj6A-x7qjUYR%!WP>jY)Zf) zU`o^YvUTttDU=}zOsbS(D*z(`$IBiV!gr`YR#p!Mix8>pgWwjGQ;%~=bs7G-Ivxl; zaM5mZ-qvZ-D3ZW7Z+}OBnRFx!qX*T9mtMC*V6U&!aS97{Y*px}Ruz9SIPX+4JLYQ4 zQu&pJYtj9ucx9;HRxw-fO+GmSr}1mO?4Zchg;eX_wsmodHE&n_7&Ur3dr8&@Db=|wJ}f87l+4UNsF?F1x-7{dV2ZB z&@b;a`#s&w_V4?~KXUaakd_FN@jh6z+6RL4$^5LZ-F0%La4(U00sC)hw=dYfGZmsc zZ_8!lMAz}XIf|kghW^^Z69cih+%fX97MzXJj-FMSA^jkh_EJ3G^+NPubolj8o}y6= zGP5)SPIH_PX%IhO*g@UnL5zzsYOuyp`VhV(`G~Gi_F!UWR=2_4 z1fOk2JM_JAah`h!6>w?y3Z1mdyq2_OcRew(s_p9c?WdqsryS7zQ>tpF$z1&0N-mf1 zTYspJ&dYUjb;|KK8m~E8)jFDL7)`MyjZ?EW9YaY0vkxf45c z?6Z*WRh7W*=Z$#4?;)~O!25^cuL|MIt^2IKw|gwpdEaGeeq7c0^1Ux|^?m!wPT1>| zNdB`=vr8&$Rd<;*2reVVPCsn)uiXqvluUK312pfCxp2BH7BAl5K6kEMYp(YC#$rZo z2@k)sWo$!0gxQxJe5%?hdU$70ky~FQ(fF$@sS^1otH4@)u|y4dI^cSSV^5_VEpcOO zkwSa57H@cw4F1*rWSxM_F|V>w=7y7xpgja3OhNYbu^E^fSU=@L{&-Dhdnn4Cp-+Ch z2O7_)?m+9-Z^kOJ8>$Rk7RmHdZ|BH+5`DJ${=u+sCI&X@4EpIR#*&KbJWrDM!J=R2 zf`5?==F#Fp2SMOi=Df`WItvJKQSVvTjqkG<;IJ4{fZwUj9W6;pa{||Qh?^c`?BpZ{ z|4|DF2FydY=gBt3l}xM2&R5gAD6G1<->Q5~Qi907K-oAKbf~|pCfm}c1XdLRv5EpQ z+BCXf2B+7}9q|Bj+x`B7cVNuOJb4R2P+z=Z4GG#)f_(WRm)?O*GNS(djjoqN%|M9t zi-C+q=>TUkyD{^|xysPFj{f6vose#QMHVsn&B-_T zc3^3_-C1%sF~MDJ|Ezno33QwVOr3zfRu1?CuD_TKo!9QJxG(1K_DsY?2~DApI$+zV z%0Crff1VwCtoJ>$;d0{jfc|FjT;;w%aN;v5qj!6%5vB~ZKxhVTw^V4@aqRd((tq{_ zP*)EmDM17!VIdF#{HM>0u86^TUwp_PrEuP5Tdgx|c&U$^EVhf)NL1mTJ?68YFg&fj zh&R7`x(=NB(Os_IK2Geq%nVjBKg`9twKP!E72+LT+BnDnEV=C|Y$Lhb;$UnoGj3cc z5%n$HC_SjcIrhq~$)%L#$ zNzn)Gfm68kskqiK>CJ)e51e^q_l}w@3S8m}s>SZ*+O?|KB#xm33Mqu1(4fo&wHda` z6&c#VNtFbb2V$qUhrywz5;re8*5xhwW+JFgedZvKjK`5$FC>$i_STYVPYyk4A2^lX zf8q57JbKBIdw&8+YxT$>A@KU6u*-{EQlDUZ!r(6d*gHZi)&?E+yR`4I?YpjwFc;p0 z1CQ&UrQYti@K|6&fMDihTT@ZaItkn!?cVEbh{1QViYFD39r+1${OEN_kUgx05*!i~ zc=TH*V`|M+SAMUc)1oin3R|usPk5=Vc$719!eaL8(GCY}rBCQn*eX7?q^TEdf>v@w zR31E7Aj@e#bKClxbvxu!4mi=oV$>9iXttJnubp)HXLeO1TS3* zCRnmEwF6}WjNKH5hIegnh?f@P~u$l zec{m5DU+pU67bYbIN2#77>gRRy$Pg!Sbu{O!PPD!S5EcX@cHo?!Od^E5&YC*cvbBb z=CiVv5_7HFI+aXx=|&F*$Zqhk*eN+cBm+w!s9yn=bkErfC!VU0q?)C(m+v!9 z%N7_#=+g?WLmIu}4ZOXB^R1hD0xW!l962DkbRiinhuFd|-RcUr2@QA~U_#8oplTO? zU`0J~_Tpj=k4FlE; z9ac&FByRXA`S%0rjV#AW{Z0v$urL|eE8<_P3>aPBcAZ{LxS7oLpHG_pYrs7qt-Vll9h=MI1c@Xg;lc3@sJ}k>90E;5h4%xel87Z53JV`Jvt2MIr>xMnbZ)3%b0Q)r8 zv%sTB(qN7?sUosbqa#TN&J|b7VX3hf6JES!H#~#*8j;C&qt>Ju~wl^SQJ% zo~oVL+iM#ERfXJT%pSAgWTvPSZ|7l{b=HNXgu5%{NkrfPwfkyvist*&Q>5Wj%XSvB zy}hHkyZ3LOHoMB3ll=v&(FNoZ-z_n-)W+PYec9%H85nS`Gf>yTA9l*7{`n8j?gh&i zgXO-D*p4^JQh@YcO6uM%lo(B@rC7@jodxAL+`p0 zr(P(+RaAoU1v9hgvRocPy>^mBX#f~fE9;gP1MVALFilSWK=k9KGrI&I*MF?skogha zO_u*vG#Y$6GbE#Ud_%>z6T&i2hc?7nZDqq>Xw`+T#%fY5g3^_cM2DVKT0tQ~Yv0e* z%cigh3&r2FCt|4n!UG-S=E*0>CH3}{(z~He_qvw?Zk|&=R0|~?YxY(L21&T&yxQ0Kw4B%E$Lk*RodZd{2$s=8;4hm$8%UqUX6%g~uNruAXAiu|rHM`}Yatwp4 z9~k~F1ZLEIlD%>po+2;UQ!QAF)9~%zA;l7pky}oTac6S0>;5iML7vPjdZf1HIKZm1 z`z~IT&H~NYF*+cU_1{t-lwXGs(cwAGc2$V39ojo?dRojXHO<2)Jy22c&a+TVny4b& z!Jov1w7lyY-!yVe-3_Hb?hSQmEnS{12t_jgTU^ciVlSBC_n?7>K?&LH6T5Grl*)T=FT50mB z$i5cZ`8M>gZGE^fFCkvQg!3%HLtWjH@qvin^!J-DX8}F(QWR?5S`P}EA*Vf%W}-=; z0ubHYAaO+}>E`aj1G#kg|JFRo-qE7(V$xC(&9)xCLh(ibqodJdpIO{a92U|6iy&&a zN3b6GYCgqp8OYTmb;IX(*5Whr@$>}o75*2RlH4dH2f>7_^bSSgs_Sc?jCt!0BbPFHf?hggA6y0N=vpu|EAr8GTCKEanGl5jC;3Tn-i9OoV)h0z%frl z)Lgb3AoA}OA4Fjj#;rSL!ceTHayg+n4^i&~EGd+mU&V*zGA|1mW;nBBytaS?(l7lk zT`R5Lz=X8VLp!5+U;X~cQ#^(!rN0VB>p|U<>baBpt;;5VM4>;7`h2zZf}n3hZB1sJ zm&|+u8T)j@UypICp~)bbZ6wa$gh<2xB1vuU07~qbSreO&f7ESO7%^vaPqww0S=ANM5KnP`?(J}VjDIG0WCYUVLSw3UI= z7C6d%u>^-k$4=yjNVn z*DN7CRiEwz4T|p|CFqHQ_N$G*K`ji}zp^BUMq!Wgwt=+|>&iwCrj&s*q;TFVV!H)< zBGl9!A#3KzkWijz1T%|vz4bIscC}d)ZX{M0*g0D0euG@VE2-@JjJ@T8P+OqleWdkr z6RzUM9NuS_o&1p@)Pcic5Pyn#n-l?sMg8D}nVlOW4FTx+j0`j+D(X}Y-!Rj-$yqe3 zWb5#frASEnyX(d(r~3OAIiFonJTcX~#QUf8T#J`7qC`qq@vz?v1_RM@==b0BedCh1 z#y9>9MA$dpJ>TI}H;wHU1JN`)pj$<4H=@GGBs~OIfvdNJl@8KaTq-QS$TjQU9Nx4O z?a6)?cPPB`_G25%G{R2aaH`o=`IguXT2@JN!xyB4`^`K(?AlY7$Ws$Vj%NuP*sjS? z7Drb+*Z>)lws$L&+6|}7r9{4FYRmU*&cqI6dGD~M9_^VhKw*flO`${ekne$VkA_#% z6D5xMX?gTd3LE zX{dyhmO-Q*5CH2EV3C5Xt0m2zyJWOvGI*t_`mlBoX2D49_gO%K3PuRe%4^oc{L)i+!If=3p=W68&wr-! z1z@RR}5Ku7eIs+lhEC}&>ngzkj=Fj?j6Ah~zj0Ch}rw6OjzpO0&o_KP7Gt%a$ahx7Wyv#ZA zTZtJCw^e8IJKbz(^ENJ5@TXm`0mnaxr4D&p6J4Pk-lH= z^(yj>%c&YkvNFJtjor7HFu4(sJU0?Ou=K9ubxOeBC_X&}kF|)b(v;3JrOC!)y@7A)AxDmoAU6JHx_Ek!G-AZdA%|DI1 zSLhgC^dyHQR)+?gPaWE^UGd)p!F%T;a&f#?T$}Gdl^N+@>gN@vONmxOPvZ~k17vwG z=+t0CDb=ssitY|t&)!5clD1~P-gvDK1mm5T5AS<<68L$9oqe>RZSJN7X~?UhNk=fd zkUvR>{NOGb<@sM{KXC+9Z@grGnu=2>Gk&s2)j&8WI1Gir6Af4yaEtxZPeKb9pHSbl zshan?i7kapzbNm_?!W5NIr#nO7V;1!eH8(y2Y8dJU$O^}gW4!0nLs}WRMkHi8piv_ ziVA=~kUc3f-hE_Zwi`V=e4_05J~R64iIe*m|9y+f^rADgPqUdsIHRl2MJDG64RrNB z5z%Td>evojI5y@KfY=W$w1dGx>o7?vjJJ~0Ei9|2u4PZzDI@9yy`M!cw@r=F@p`#M zHX zX0w%4rJK2;u>Q!kaZ-YhHOW0)v<(kMaSygzg2#6Yn}f7_m-ZH`o92e!du>XB;A_i( z(4yvPC$p=v7s}z46499N&8)!#AxpskTHo-$>^#DGb;I5{2>SGKJ=cUc;em9Nw6?;D zrV3!2Vz;G??0|#y14ay{o{JlRFX%nBe-?(MW%aXS;K*Yfa0)8V(=j~RyoP}DI>me) zAYGu^6Y{o&n_vsNz{L!Bypi1_7n0POg|xa@bsJ?Z~j^Jler4`kS@G027$ArPkO*{d7@rNzv2JX z-Jr*bS5%?YPh})|5Op=1T>fZ^{*}RB2ySLe@yj1g zq*?yJKG5mmNo1(JN}UzD0BJT*5D2j2c}F{u_e+oE&W7CJSe zlMe}MP9y%UNbBbiDJhMM=Xb~d%pg82o}Vhd7tx}~poo0bLibW>>IeaFq^PgqBGW;A zf{J44p!9@;p@|5x-csq=uW!)e;Mzm#o#K@RJF5=i%DuHZg5Ca)=mA#bv*+vP#OK;N ze`nhXgiVPe_SlDB@bfi?YdFZ5h^S^ix^a;mkCzGxz)&0%*rwMB@!yyUDsYR;@_9jrwOf(So4*?<9mb(NDgGU$ z;TzW1<9;`39I`x`JeXr4U?OCQ`8IVA$ykiN~e6wLfeI;mk@aQPw|4E z%Se6_GG0@!pbjm?UlEU^>cjbsKYYE_9mftBQGn8mbqx`71pCnpEV0Vc&5*+>j1Ywr zV3Tf7XEdeX&?$=Y3vYG^=OY<4LKtA1jMShAhc(SpWr12NmBpVnhJ;Jp3B(&^y4)qA z2#Q$jM(2mGv|h*?7B#UnNl+m!cL4{lfWSCiE9U{%Z?KkTG zRrZzvZA4wy=p+PpcXxM+YjH|(cPUQM;t<@eK#}4UDOQRX4Nh@~;;zLDrRdG`yzjk# z@Au_T{>+@2v-Ub?PbPb<-Aet@?WKhyCGhNXv^6b-LUzRODm5MOf9_ulc;yN0jr;Ut zNPzmFD6RECsTVb*3Sk%5ZRImS=6!4l|Dtna&Q$7W=yt0VLMe9Kr?}`5BFV%Pxls2 z_~M+Z59d!tqt=^i@sP(iEYwapw&j+G{+*~Fbvi6iKZLLKJ!RcZ!)Ahp=vpgRtBT~d zfeMg%;-<55%*0nzS-R9`TmXYh17*!R|N8MDFqbQ`W)5q2r-}w0Fs8V*?ywte&boJpY@B_d#U=ZK0kWf( zpXU6ff8a0)`c;pO3Nau4>p>9P{F%rXi1{!XIw`SN#Ga66v4N;Zw=7iQXd%rPxx76)x%MUm_f%^%;i(gjFnjh$M5@*gfoc<@6A!f65(57V_iLN1;65>)$&Vx>Ik>Bhr}$O?Zy zX9f&;t;vx!hlwW&gEHo6WFA>nw=kqv=6Jbc`R6A*8twm8+}oLPw-mWOemz6ZI+z~( zKpns4N<2fcdGiXj^_clX-*HDTYR#m?6)yALqQS^IOU#VM?ViVht$(R| z9su@6Unt%~uFK|TAAvA+y4tOLhu>CMj4GQe zpcM9eSq3fO#a%vnljv0XJJA~-KE#?S~(WS&O8d;K%UDA}g<*N!WXO@lLN zDHFIWOuAM{f|^?5jIM8?h{9|V+|x-c4qu^w zdYp%Ox-DLrpCrWy(Sox09K^Ah1 z*<_@T8nI7r2*q;q$6)7WxKvxO`MHwDC;k)?l zP>t=ckN7~NY{7}|A<|lyK0xD{p7dbTqv&9U;Ud&Wh7wKFJ zj2K)^G`qqjU9>7V%C=59+nE1ta8Q>xIZSUYRl8R2CX)JX)7QN8%lqC$zxSGx7OpE* z@7uBKJQF0xjuQ6!hy0+UF}n=I$jItjEbi3*W?p&AMZ61gYY{gHL{kW|rSsw^cH_A- z3WAo|n&$lIvXT)1{$WSiMv_6t7~t!)Wp)&PEzv5M2CHhL*rUFAa=;)DCD){lmpRTz zcU}x6T%dlIQ1AuYP0oY+!XxMRZF|sVqOXW1fWpL+Cy$K>knamVNWa2IDDAWamx+%M z@gxBaKcVKR&?pzv-G!xkN=#Vu*wD>|6S$6NytqZQ;a0b^f{Jv{$cPWUe35;#=tmnB zRC`pkIYxUlkRQ-y55fjo1hvf*3resr{NzZkm9&0mnOlJG*Olf05Y+FiOU5HEc<+n4 zw9Yel)kf-0D+pS+W_VlLiHCtv2x9qzF}mys)Jt5|8QQLBt9H-DBg>%sO#;y;!ALyQ zcO(FFrvIHJHZ*L0aQtnA>ptjX>H#iK=--E@eR9SPxqvTtQ*v*W1J}rB#>am-sfs=S z2{5Ut^F10QFv{A~Fx+9Va{g}m4?xu9HevP6i<`rS3#*-`=fTo>GO0L7@CCM`G<#NeNUsQj z5(I#z9Vm`tw;6|S`W_SWtiC;xU2`pBfqf)GpM(`!K0j@AVF8q*$DFID;!pREykP)19^4K7+P%YkEK$(sXq%bKGS z`i4$>II&#PG9nfeD6&m-zJm0H6#Chmisxo+@kt&8-cv)zSn(X8xrW%!wX5eRgtVG; zZ^C6pGm_lc3KjbWWZ+#x-|_nt#ZCxF?7!{D2N(UL!;wr_UG8zGKo0*VfYyQJf;22d zI8tb_O+oGDOA^^MG|ddKn8TiVn7U@cb%R7-vtmsv(z~O599xy~fhJ8RVGeCedvUI; zUxRcNf%!vbuROHlH5|ON3Ruf5;=?(1w;qpvikq!nzL)#ZtKeb~+c^G{9d($r`ZY~^ zC+)X%)AXI2V^zL)D@9}IMa0S_psO{!j2ICZnsQD_agCXvC1ZmJYpe4QT7#Sf6BNnn z0}Td!T*FNKPI3`I~e>{`Rv#7_cL z#eW89l$?N9k}~(^N(i}kpZt(@9P*PBd~ivZ*0+#$K86Wv}wuMKPK3)nxO17bX8ZY`B z=%V#^N^cG&$Ao@?xt>CgYFwuOEJwo<5AcHM6inIHj+hxlg$u@6Z#L9@zyu6$*ihNC zGgPN7ilX_yT!eD_A#b$FQoffIY4gSTLjZsZPkvgOm%_~p%NDX=Bb=_FR=$Lq)s1oj z-LD@9A$o70*#KvS&;s+{tLpgg7Cgd<{ zhB6pHl_9dBzp>94-)J0${xwI23OXqnC#5Aw30G5&r`2s^*64vMObp^b41Xtx8=AKi za(uLO$rs3Xc)W8|>YW0gmSVf^X(QAk#g&C)8E#7%`H0fPNY zMXVMAn!cg}Y%Q&b7UTTONyA^|bt}Js;Kg6Wpu$EXVdiN%47Xc9sZ= z?f|j~X4FylZ&UQNWnsKQi-mQ{!9K90Ni#${80tsDWWwbs=-mYOw9YfaZePLfWzcU? z8(ekdNa-4gvVst_e-r}peN_MZ>AW>1>!EEJC$fCb$s%-#o`H{q0-0b)t)m` zMA?I@MTwd2li2k&-4od}pDW^ zLal5zuS|@HJ_4Vu%?~gAc#;;5_>Ee1ej+moxN}Plk>|f@GTQ&~SnT1C3FJgpi!$|Z zYo-IOIKC})7?r1~?=$s;a)f}3IW>9}QfR%=I66lryv2K)PdHYFn({ch$x_WT%$yKV zCEtvfuII5~b0CyDZ~{TCi9E{~L_%Fppf%yb%X!3;SHH%B))^;5YO}hr%X`+NrL%Vl z_M<7^Zu_C?0idbmF>w$w zz#<>m*JxDE1Jiu_z~kC7_j#l4MsM1(s*}mK5)UX97x?&5{VU5alL8QrgkfCjEM{_P zq*8O`yN<{~@=^In3{1iztYwWgN(*og8R34w7d!7n)8PC*VWaZ5+!P$9SYi+M3!XL* zKWn2ZJym1TIg?Mbsz8dDTFgL+be)?TGGk>Z>C~6-@{GhXZ-8KC=exZTISzt`9y`2@ z#+?%I+ldzdidnw`I8u)~La@xtZ{}SLp;I;)-1`2Wk^Z9#;)bOBg`;8OsJ~}jeT-Ds zKJ0({@bjO~VEvO#4k|#P;{IFYpVfGQVYArvlY(7ZYPLnh=HaLE?bXZo*eef!^i;b= zk8`O&>{G+5tuHfd6hm)-e!?jB`CteV$L~r35D%*lk3-8`Alw84d^u2e%;!+w-n&BeJZ?I2vy_2#q)DY1p{Zdd7zfk|(5=->nvPAG!INJE}xC{X9} z`-5%sc~%!^+zyNUXOl-h=kK)WHF}mt$_Xqx#{z(;KS71H3I~-uDmo2qS?Lv;dQx#s z{jYRzp|59Sj+9Uqh@~p~SFh?SD%7hYB6L)l5nC!5bIJge#v^j=EQ!E<>W}GaN_%xl zvKG$}JWkzL?lAbQQFw^#PJ-SuF`0WLFuZFiVt3C%U|mG!dBzZHUfJ!OAh7@#r&xAeSzrr;JW}ka++Fu6{zaaKC&*6H&VY?R%2DTbQR<_; zpiQFnMn%tR@UgNgD|bY{`x4Yu8|7ZB0R`S)&-x1CJRkrhim1w6x+gZ$fS-8efLE<5 z)J8>xoW}3&pEHyV<6U0I)Ah!C2ZrfHWNa2%BH{OTU0Cml_-L;Y$)ZfebI0v|ndBfg z{QJX8R45Wolb!NVn-uCkg!61-1Pm0stj0n}WbU##n)w{zQP=z?@FD<8(IKf#U?aDf z1?IcL-P`q8ham^j%!pv=o~n|OSWzYVUu%SaWsD_iN!)4s;a{gSEI z1Eri(OF-vraXW&n1%YzNU8q|UPd7cDXpOep7-=7C4MXQwctFZ;$83Gz;Ay;)9Y=(G^%M zAPvNQ=UIYQ#udoHD{TN4XbZJEB-qGFBuWigF%A zZwC>pct~ROw0o@T%Tka@<_3Qe;ph;x%=kLtSm^u`l(?gs_Hj?&w$Mk8khX86FhE5O zcOZR`A1IC0R6LzUc8A8x6ouQd0SV3@SHi0G&>9;4R0_jNbO%79d&vI-2SUjuRcC3_ zViIn-Hq0gy5A(#n|0A>JhF8aN+}(7HqAU1HmT6nK(AZJmAnttq+y z8E8Vi7`QCpzTC0#2o4BR-Tui%Oji^OXFAHWKrt_i49(>vB|G31UP_~ zd~UI__Z5@U{ZxtPG42HTrZrW}GJpPTC!xYue8!31r#GR0mcoS)K8`GlfuZOS3f3_v z2O9c|AL^0!ia?{`4KAeSBD3&efi90 z7AD`n@BK0+qs#GSr`Vv`@b}RVi)Gw8 zq&g}4gNXy(KN7Y_Lwf_O_W3f9ZK8QW(yP3TM9IC6Xws{rw&pA)1s)e%@XT)*QvOJr zFCz6cz}H7_ z2=#Q5H`&C$wSJ90Z&ocS#*Cg3mAMc2QWqg5C#F=g*X|Iw$l>j+fmcDc_9;suvHINm zv`OSvaZxW`&3*`N=fCUuUeiBP!N{+PwVp3x)D=m(TJLqv$jU-0Mn>(g-u8*J?yFKI z?kmSX-?-hLUGo1?Fu=xt9e@$|qqMh2(|IP_H+lw%>mJ8~j((>^2b&5D@p&FRkJ(ib zhL?D7t(-n@>A7y=LDmG5{VpzOfeSO$^`PLLsE(s<-yXJIWDZr=4O;)lwoJOt;g_y_ z1i!{b9~$aSOZM5FMF{K{$3@>ydYk)EzE*4re%p_4#z!4=dHqauxl*+7yoP>@#Qvg| z0G{h$doIoa8weKBQ>{3nt5*ovFi)#0WZ27RxRp~E{*mz~#8uq7z5ayQ5UXK#`LU4A z-Ek`2+u7KOI2F|$QaKSElf{lujgx39AVl`D!KLdrs803q;Te(JM=~Oy!(}rw0~nP) zq%mO3{Sm4Wi7+T!paJMC_S)VLdWMIlIgsP2kJTu%eGRsK;{OVw9)#Z#gnL}0lf7u zMUU!Z=Jk9QwZ@|{mAYGI;NPm|{=j29$nA1`75$MjN+1|Zb>iE>_$|DY+S;!S!3pLW zqIKMwCb~WE5<10Tp(_L%`NYz+wT`};+4Tpw^Fb)=!ae%-KE&3IVB#l5EAd_KgZrV> zLjpx;8s6rYql+wo!pV*#cMSpcs*COvfLQLF^6mhWSc3R(DYukC^Lc;wsUk_bTFkw? z0ysFxU5D=R?(zQK|HqPhuB~TF@3-u9fZzIB`&EIpoW)nN&x+gJ1>+UeKf+)InLwxI zA1ojt%4~8V=x7xC)2tZiLQZ(QDxw06xHs>L2XuG2a$zyZ72<7d3>G6%+3ZE$InB(7p_jpGc^ebro46$1a^Chn-M`)%cR2?)b}qT3;FcFk`SEH z85@f7JmsLmwB|I6xyA=INxI*90l^7kMSze}4g>^&iBdI!3t28h|$DYor1yO3BMaEw>5IcJ{qa)1F^7RSXwE(k7+RHp!`+d(J% zIUVrStQ{7=VR1EF=P5y8DUP|*TPhyyN5+48!*bm;XEM|VRR8FhPFGP9NGpPk0wQGX ziQ)(R*@13&;6bNs0;l^|?;aKzVUd5_>#nUlV1;RjOf$3))eOy_o`xE<0;N(H3Tiri z{8kWyy=$h;ErrjEF9WzV@dKiQK)D}O2iaau9Y7V<11SJl$`*2{=8S|* z;r)S1tfewkl^bVm?+Ds>!t)>`vM9%tkoMCkED*o7v*|b} zYveO3RI3QF3qfm7FG&A$13{3OVmVm;y*Nw1v6T4l zwy5TCmhR@)UEi^$!jePt1P%i*{mpcT6LL2AluLOcM@Ggr86g(_R$qV1(2loSwi*gi zfZ&=~Z3H)i1a-KKjN7rX$0cOtyjE)SZRvF|#KPnWNl5jElP%u80O$LKyq0myuod0w zvcQ-t$9mZ0c%P90SGeVO1Ll46IG}r$m{|5rB$s?LuEh%`>r--C=DIrU9z3h+0mnG;CNd)G%{ zO9hA2s#6f$Q9hv5;)2q}FPbEdnG@D&L5%ZsZZ#Ixfd>7KLng9(Z&}wUVS?5R-$M+_ zkv4TuI162Loe|31QJNN-N-?u>gR~(e!GX7bNkZ?erhfc${ozgoHnxCEtFh={1_)`l zV02u2-ZsQz#D(QBCo9TP5?}(j!+XR9zIM90qrh_MrQye#!6mJjMTi@QYaFj$t&D#_ zSd#}9MMVbyBM$K!h_MR)e^o#Mbud=s8LjF1 zDN#A}$Eg=)UmS253Qx@dMN4lYKMsx`DJQC4u|Vl?90z+uj+mvd07h9H;H8R*0f*Jw zA6P#pE(sT;wP}xD>zfy;Q8qV{$lB-ums_F;pt%7SU-@#-DsV#Fg}pShoP+Tys@&=R zOlf>9qw7aWDetK>sGbF1FsaLRCfh-KYQ+;H&Ds=Z-E>C66P|r|8(@*Iv>_FcHwa@o z4g|a!(|jootnVNeXph^fO9uE#=1@&^b2#c&XVoVTU*T#@ ze6xSNS@k~<91MPQVxbhf^vGfdr8cL3#(wwxZtWHY`Vd;7TG;Rd=?zZ}zqtAMBxdqzll!)NfD00o%iRyER&B^iomgkJ07ll&6ozc_+n=NlO~ zvZ(m7vn}rEN~ZLnBa|s46uv1LrL^m)u~L59W=yKKQ{VvNl>Eb7 zK@-lVTUV2hHg7@F>JfGDpoqZ}BLQeV_!Pw@?5g|c^)XrMqJi;jX+%4uTX>&sB9ZGT zpU;rBG_zlfRW1th`fhq;j3$zKg95dJh6ZrBUd@8|@dMw?|1n!)k6B%|pMFIw6NP>2 z9Kd-)Qc=ab^I4pGFoY0_|1K5^GlYp?c{68639i57`%+*pQ&uleSr8R~nq_cSPJ zKc)=!BCpqdxALOgIrl$_ zIpMXOi|Wm_Zk*3y4@_Px?dm8`9 zopUvG*K-S1yRP0Gx2;v9K%2h{+5PVw^Gx)rTmuLsAVKL|y%f=<#*@jL%JYkowU`gH zYmMg1^@!Me4z3x75jBIiSXwG-_txHC{VmtBl8^;^r0Swhkyc;2sR3if?! zar{q3wks;n75(KqX79_4y=;;>*<;rxNgq|39Or`bm7qcE)Pt0jNb&RfuyF%i_d@St zeEHq&U>?%gGujJ@wOL9)3ItS+<3J$ay0CjHBa{PjWp%nA;m3*eR&E$yduhXrH2g7~Uq6*vQ-!upMLn=M;nFr8{ zkawd`&vwWKQivKM&j;nhE!?%M4pG-PiT=^`|cAg+3(? zW#_dHE5Ff(TH`A6<|mwAc^*3)ec><JAp@==~x5Z>1*1!lp%+Fux8-F zB}RKQX^d zBUB>O-p-aR<6iKup#&kre7=kbym`Qa8ejuG)vXu5tJLQv@B$62kW!YY=w>{gTL3qw zoN`>=fYF%Am=U$x{Ar{Fa;&zxpDvT2kyms-MWio4?k`gRIFzJoV5JfMcQo9RBnSRb zduU8(go4s0N2T23U=2Qt=}*sAq6!Z&hsSVu+Xll=Nb#4Fhwbp}9Sa7UeSq|UU0NH) z(;tf6Ud6$m*eD=l>Ay8Q<70#t^+%Oio3ap# zcl<6_c-&;>IdR`~cQxer=EKX{mb-AqNd0%xT+=(KH7qOC&u_;WPl>MenuR}4(sm1B z=xR|OzCLy42h0VjFYRBwpG4SPI>!SPNy~w(rT0q{Un`I^)PSj0dvWFx2X;*p5ApUr z`4mem4W9m28^|cH&l7j_DrAU|*ppLW-lby0ETyzaBOp1S;Nu}wo4s|X)8{^1sEOfl7NzdLt%cc9CugPlkimX0N zt5|jeUvaILS1h9#+auuei`=UdP<5>hv;uC&Yc0tgFh@RyeU;}42!AI8r0q7V!Gl|M z67@({4uB7kPr+vr!hSNI)F;W1|rU9K~w=RV;6`7%nx9@qt+$=(P_D)QZ0B<7 zF^qz!fM|*|!{c_5w!;iO-~6Qc zdxsZK$?SgDd#!3cxOJUg^KjvO0fWSlqd5SiwSJe|We?Vtv7FMDKalPCI6b+2X1L>@uTMR}G#Ce!>%v{i(QH<+`YxoxCe#zbpQw!_0_q`@x3#+0rtw9T! zusz9c^ym&;A{fyzHuPo{5en=Wd{@7Ztx98A{JaUPFZ_w=q1VwnszdZmi^F}AIM#W z?HDsL?S>eB42i4dYSQxAC=A}6W9WX3AEuLc8%GzP9^{G4CGAi!il*O@>_kz3XY!pX zR+`zqfh@35)P7~X6q)zDxe_7OtWW{g?14?K@ zeRx5RR86^U0wtd6t&*`{xIJ61PtA;Dz59n{8tyfYVu*X6)hW4xJeA4I8 zxO0#@$?+o@lvJ=K+~-d51F}@y0T|@5%QV?B2EK9BxT}bB-4`x|vG2Wc#YKhlt0ki{ zy5k2yEwc1DnF8QUQ1WZ(BU5GBM-Xr`#;!=tW%a711FgfL#ywK***F0AhBbbQF#Vgr z-&XnJJ$~B9Y@SI||A;F^@og$p5oYJDE5*^BQN>a3e`%x_dkqI$4}ubBc+DP}8d*{e z7!?Gy-i88Qwohqb8iRYRF$-%bs#s^|FMB+>;h{N$)1evxw(@V*(cO8=@^-2MeY;H* zCJyH2w4Oh0WF}t4ax%~9qKI=y38cx(n1?044iz2Ebr%hIPHj2*HS;UH`LK^?JLRQ1 zC^GZw|6nBZEb}1QCKg_Aqx8(Pn&VqJESZ&F_|};_wc%pqQc<_1+-k6@6A9?T*ISNQSNrEQo0|lxEIdKq4zvuc zp#Z^#oF>HQfvNG`mQg3fGAYq_D%bPNrJF~g8~gsn=!@cKd}n1MyV1T3{jY##agQHY zK-K#*&u4mRY#wkoH!?QgMra7j45CRY-*CV`I(-?*b2=3Dj5|ZiKRYSI5lmZuwdubi zLFc_h)RT-)i&YutfR9Nt8U>;2+I)hNxoLDyiBI82h8ZbBv2N7svqh`>5-h&5CBlF6Os%TF&-ClhL5 zhKibim3-@f{nJ`Bh;r1=6B|BKFWdsQ;d~%1AIQ61*jqYTA^*XxbkeLsN1*SJ-SWL1 z9|=T8EW}pTB0Jl2T3;|H{mSAq*1CABe)`D7@-G{k-XO4mcWFl0ZbcFx=t6>LQU6yy z4iHTJ1F1L{uW1=z^FP4Hr;!A|mb|49c1y~BDDz~V4AC+>^hmj2ozAS= zS5Jz?Q|@wQXzBXj+FoRvz00(GU?oip!e^$BXAfHOJBMnYC1gH&QV-}F?YsQm zJ|+N(RuV2pj*lGI9D3EIe}^?pR4odP!9i#=^VUICm>X<9W$etB5^AgUGLoL#P*Gis zDuLJw=@Kh*>sTKscb@9;K9@5|TS;0;kA=T@a>>Mk`glC{vl!Sh^2BqkQZVF&5kR7} zS6@*2C~hq;60pBLi_`fO`wxVRFl85UBL6*zdzoOS-n2cLLQO{)t>@-ppiiw$H;!fW z`f=(6QRePhYWAs%+_19$pDWG*Ha+!>^D@)}wZoEv}V#;3;(wcvtn8 z1GeLRv|Jp2rz6w+q|Xdn2djNSY!&4g##?(il}}g^ZiI6|BV^0c_C`;Gq(I<6oG*&Q z7CR#v>x_^yAmFXJ+U><>qQW9fPLL?KF*Hg^l)CWyb^7`TTEjgAhPp6>*|d)pBCZn*KPi<-!e^DU?5B7SJw znkfBK>)rj!y*$&Ah`_1cx%0gsrvE24*Z4stdhaAtB;by8N`fn2aGB3-{dIfd{t~T$kHNNC{{}t`r4{jQb zn&0`f0KuNYhVe(9s9K6#M4`ql7EsO`!Phfr^Q-^--?N8*m^eto-<*XPE7$nrLdd-k zw&|rWrm1K<-nI5~j#>=opoUPqgL#rNsYbe(?0%lsTpH%1zFuvYOh@$Ze`;i%;Ymln zK%5{xbj9EwLkVJn2=^_qtz1#y1Vp=lh;Y0hws(?AN10(O0hRcLVm?^nH z{*QpZnhu4OKhY=nU44E`s3$HI_x~P?df(mhabLPb>G%@&3@#_*O zJZEEk0`U~p?>ZShFAPi*nn~y+HB*pLadrSZy_zsPe=r3KURQZzW~s*!X^Z=7+z?ZW z!r8nj)BiH1it^I66SmIs-b~Hi-Nh~5Z)!Ei5)vEHY^1?SJaOInDoD`umz8w$8j>WJ z`>+;v;}*$(u?o{vv;bj#=vrRUn|l48{_?^Bbqe9R{gw#bqFcVR?%On^9|~ho<`J0E zj|H)cRjw9xAh+^=QH*Z2Hjlb}6Xc_U{q`^GOQ>4ZCc;ZkEe^F%0++o1E=7tX(?k^D zAQGBz-ZD>6Ivdru5*wHJEsUOB<`$E9=Sv^sadZCy-vZHrQAACSX99%_W5jGNgw$KT zwY2%(>fKjc(nEq59%_sAA^4+wnAUuCrFljCI+0vIGujmm$cWex^YvNwC1n}SPDRGT zu)iN;OdI}vWFmZbv=5OI6om=ftDJdMtwIN7Je>j#QQP7GiSeKIhjBlsP(B~&Ah-yt zKozv#q)sJXA&Hrvy0le(D#!*xOgLdc1nz~EWyVLqUD-r)SD3!qQr(krB+m26oryVl zFDo1Ct^0mIq9+as4_!V4KgB+cN+{EkV3VX_=&o0S9Nf4~SA2maa$BcZ!J0~uKi7)W zxVE%eJXIMu4xW1}szq0b=VzS_$!bhG{t%df^WAp_`GZVTdVU#l^@u(FgWsD``}zBo ztO-_04t?F~6=c-ZEl$o9Q`RHOuki~++WqCI9#!w)RafcyF$&ETbDtC;q}qt&hQ`-I zTn?eX#;itziu`&n@Oo%W{{TmrYg-ORMuMj8a3Z_kWV7-M;Uhh=WCq3m=N>Lf{# za=S2&o#myO>(u_+R4Z$j!eb%c(KSCOJQ$mSfCex${lt+h+vnY46AXI+0x z>s;rLcVtFfPIR8GqPUf#Old)c6~T|!&)?mkllkFP>yQKaO4-eeSA9Mq_w);BzoE2! zU)bEb^vl52Y-*uwae-8Ef4acxYVmZv-!CGl;{>3RSEN>>hA10~DFuLxhhJ3XeFm!A z4~@?^x_0pH%7`Rj(3wCmdaY&jFbgxAdJ2^C)!NphdtJ&5nQho#?+-QWwEo%o3)Rzg4W6Ir`Me5=Lg`xU7apPRVn~wbTL}NfwSP4Xf zRAicO*&tz z-%%MVABHPHR~=`S2bX1X@_~dbG($BFEf(f=c26oQ2f2))7)bb=8zWE~5FLV~)K0Om zk7IApvKNCca?jw+5CQI+s6r>a!X}hY1os`t1--@d2hC71OZ1c;c+iYdr~HFwcuCn? z&wRzR#U-BX!{ntP>j|djWl7m8L=?#ZVf~<+*Ms8Lk2FY_TKU;uN1FEj!Vr5x#0B5y zRpU?BY!3I{qVNkYWnCPRne_Z-t4543f*oId*clYfv?5XINPjXrBz2UTnH zXDC8qDkkU$3fzwQG6dopMRN7@9FA|;QR-iScNn?b&vGw*xbAx!dHsf@jh{`OR4 zc+1Sjw9cv;6l1V`r|P!Z$j~RWNqAV>V)2G3ztk|iFK^hPy9shK4!QfRCvr_4-qY!l zyrs^LKLz#kow0ghSKnzWEZ=wqEte)q=teVdXzBckq5Vkw7?K(E@bPJbcT{2lZh{f8 zvMAff4};IBIpj>j!R+swbj%kTUXs-n5)7npc=O@^o3Fu_<(BaIL2nie*t8!|12MC& z%Bx#{xvbq~sL5+y9gUn|mAm`}0N_jI*D^X&+2`Rn^BJ7O+Xob*NWlNeXVb_2-=6e{ z$a!YZ;;l&OKg>|-$|P)Lh27CjCkJ)bV7bj`wjJwg2~X}PV?f;$089MT{T>zlB<%BsQ|N+fy1zO8=I3hQ#Cl_J>2~_P%iNCk{SUTx6;!F^KU+2_RBYd)fA(0C0Cj24NfejH z%+cLaSeH$=j$?=q&0A28i={?3uDf8{#iW z4vGNUa{&rezgmV^tu|(O?lo!F5qMCgHv{H116Z5>7%g;mk?|*PF9&{71s3j=flnF0g{Y?$YNxU2U4I zIR1fQ$rxy6si8D(UpYMWMc(CA8j}3!hyNvcVX#5mnf;&2m`Vd>$fCG{zxk#a*KLqX zaAVUb9S~}6`MK!tDmc5Ki8dfW!7$1C+bt*X-tYBl!Dqvg>rLO|y&K*v|BwjLnk}}! zDx^+znJrbT#KKAa{&8hV1`pi)KpFrEt_pg&8os5FK&IY5YiM8Fm{j@4LNa7~cI1(K zwp>9*2q-z{(1?I!Bxl+{ zk_?j5H2S{3`R1RQS$EyZlCSl(!r7l06S2=t)SyGxthM_l`lZ9q-LtZQ-d6FUq3f8 zPatCuQ#;zb%xkkDul5lBAiU!N+M@=5lPqEn2w+D7fX|Ng1s@;*^uO`te>=c`@#Oy# zhp>1^Fo^TNhHd;oIY~|g*~56P5N8C)%!gRIs^gr#eLXBDCx@(}PfdxT&d1hnCtsyv)@0DPyYrVI3&%LI*f#?%={0+E-3h&J zDcvvFa4q2FNtN+~nxT{PA+l$H0?q9aZ2I1H=X`>HF@7#I#B;*A!I4d1qj2&QJUhI5 zyLQs3XpAOaG)QAnQLedRz{aXG>xZAn@W;=)v5|^G+>W(}@yWvu%3Jjg3QZ=%dUv(f z>*^kyj+Ri*yEo>T{LcOucwA(d-}|7D)WOp-FJN=G-dAR5zx1RyiYr0CtkPeDdMBoy z?aSTI+(`s_pz>lU02?f zaOh!A%R^@}9gvkDHvglvut>5>T{LpM?y|#}=QYoO{PtM&4_&*pf8i2 zfq8tqL6tOOT#+v`ql)*)X^0Igr{y>V3KMR)ncz74-BRQg&nZpH_p6Tt!L#Fhx~W{} zMSQ{QGuQ|SLWm!y7e6W-dS69>)^wOu02*C+FO{~^gm*-U%kL7+3k+QGoptT3b}z5D zYQi_~v(Fp4QlVO?v&)xT&=^nuxlk_tv96G{`MHkwYU(kII;K0?y+-T;ni`#RT}MjU zz_IU0l+_(6@8YOiJrMO4RexOq$|Hr3>e@2!kmW$0u_N1hhm%1@yeDtj&)rRQHG|NNRJ(Lvnie2eToLt8G-fhWqaE*0WVgfTr+xk$33IyrwM87r;WxX)no)vNdUFDn9t$R+6@XZ-!3$G|2nT&q;z#7y* zoy-R6qotS5A+Wq)O*5|l_9ipcRSG$C1}Zhrk)#r-8|&(iPpxQbv_6%ZQMrBRdizUd zd9fvkYVhU<$HLXfA97e9-wUjfCH)*)<$wktOS=_wm`d~Mq|XQ}FC!xizx?9t;;mGf zR34VdP(s>3C21hC{QME=w_I)V(M^mNY%ElZ3JTNfGY77w{#5TiN53L`E#OV`Mw*GL zwMK;Qik;Ea@6QSNn>k=|iULE%IHe4UUSZ}~g^m}NQlMc9>MYZ8A6fdhy=}(Rum#WLr>rr%6Y@nrHO|4t75E^U$Z0PBEt?m8Y(IR)5G<@NoDVq|} zKhj*8jH{l%A80b~i}aiuH=3a8;B_5h@;~7e zIPXfbz3_MvwLs>6UOS2V!%_7~+m+kbKabo`TnIO+Z+v4X=8)=7PyH3*cvZ#Lh~NL= z_28hdzuTLhunXpVSCW;Vp@0O{mu8*Yt$3}xT#h80sl^6+hgY+aYW8`7cPdQPyxRA& zM{JCy3fU)JugrwIbBmG?9O?p`ed(K{n46{?B=Bm7q@qDdaSD${ZhOw z+3<@6y)D`-b$l~{s)()W3$08bHIDV^-(>Vz z+*=6aYu)=}i4C|8`JL!G_1s1KE3F1YZ%h+LSjEe}GwFYf@K1ScWWivZTba9Mndkn3 zC8aC%TK(gPmWp#xqg@$13&kfGBNzPVBwh!xDnY5GLoRMQW3tA9hY`^)KoEy>z4(!T zkj81;^Z`VpSD428Gl?btLODJr@yO_ypG|`f!{>bqMS*s%adM0RmyqU9DVsC)3TW#N zH8#l6LE%5tEU6&a={q&&@?AH4R2vf8lzg`nh#RCpXCR%>|KuCinRqgM}0Awpob3+i{%4>ieEwX)5Nj$!LLn z5;Hx+A@lJK3``f^>0X)B<34X{It#4ctezhhh_m)RwK-hcSm}_-6Qi$iV=-3Q5jlE_l^n-)q%2XG96g^lws0m+Z`sslMH`X4 z(u|MEZ7()9^s_#miU7aZh|b?V4zw>TtUB)V>y`KUy5WPMgZf0^-G-+*R~9SszzK|AagN#!Bab4=&l#O|Y?ve6Qgm92|}X{nr2d zET)lP(@S^ct%1#xOJOh9&VyI@m67o5${UUQ>(v^gX;Ouup=BoFoE~I0IGg=ES=)8`P#BqfkJidIxi8~PZ^o;93X{e)v`toqt%|(wEmkOFelTWf$ zU38M+epyE=$JQta&Z7=iRw*N{1sNTU)SN`NgLYwhSCqc3}q_yj(;T5%^mL)0->U(eHIDP52{I)2UC+TWDecZGg zzcBbxJTqQ#-UtgqDAJ&>LGKzY8{*X5J16Fg`Z>&#f30?00fcljbb0QDsUp=pGG5yL8MkD-%TwnFhA4NgK2YZOWOR z-IkkSfY5?MfEq!+eETI4|CZH3432Aeb|N3rve1g_gaHh-mm+wAZcxbd^d+|qB=q??NJPU5UR zYxWCKOA@=K%cEs-Jzusd1TsA&U;%e?t3=X{<=zks5bi0jjaBp&9r>ciVO$$<@@K?t z`^*?3JNho|b>ONf-H^ju=kRQ4Gq?86x5{}$D z5~p@L=BB_!pKCxL!-=iI)OtvXB*g;`u@1gM#>$jj!(*l>`iSxcRI&C-|W}dqoMl ze8^&)So)vc!;cEd^v>?}r$oT?{R9_NXA0xw76;pj6+>>Ayb;fEkm51FG_FUg6q}LS z!9UEp8~0V7bl!cw77tSClrKfR@8mw;T}YVKa!ApOD;X9s*n-g|3+tNXG|3ir|A z=L(8TeQuW0vqKb?c^s2(h+`|Lh{uU6IwO^#J{+lJ;eJdAvOt7Pp9g$^UN(rT{5vbw zuaK(&^oe|?LhLTq@9(a_Zg-K-4KRrGJ#;~|Gti*5p-H)7*Uln1+3*-HNB>sVaN^u+ zrxVxY*;WxAEa{7`j=ef?^jB|FwCokD&O39;K#x+mz^wg)Ikf9#kxaiJ-z`EY&E!C;?>_1=jofJp-%r zCOVJ+7C1+}L%6r(l}N$XmLGAte2cMaCblVz4prL|wDeStXJNCBGAWEPMM^D>U&GDE zC%*LA9wjZC-we4tL3L@;i! zmeOAcDSo1Gi|nIFksn_1^{Z?5c4w&RPoH|L7H~jTwUlB5KLj~X(@YH07d0M;GeJD4 zW&q|+!A?%yb?rM@XqzF6XN`_8(39Ecgf6Ld@$a=Q8Gg++%n#CitKF~qOma_9mLt3c zqaYTL<2`Uk0>bxD?D}uv^^iJc{P$3>&YD|lP zi?DfOIp+!5jTd@C7@al zRKHEdXK~F*22cT4J2)aBLQ;royPbI`%?EwlOjvTmw| z5i%jsNw1-0I&lkHK5)fuL}R%(s{kyPc#n%ig~b!Y37S7#mX_(_eG z$|K6()6i%aL!|Z`RN%frS@f;N*qcoL*GWve_>bqgOMH1D-8@<7998qkx|obLoPp;& zn`v3--!Ot7pWmTja%}Hx3nm_}jKK%CT~~~WB`Fb7w2SnyKYH0Is1*s&gc==4v8XEZ z+aVf6>?uJR+u5Higm`JA%Z=xrLx+Zw*0uw??v^bcw)B_>#nXz%c$P6ma508Apz-=k zldsJ&iCA8>r9M!Ds7{yRULBpGA|oemBc5og(r&dN>=+yfe)d{K)YT3dDMex}F4fGR zK(A4NmPMCXi#s0iYy&lQ-6@TbjeQ4#V`YfrcB85r!OT6aG1DF!*@elMP7=<-WU&P7 zf_Rc$u-|QKBR?UyhEMp)+T}6c9nh0!kUM{~RFB@e>$^(V@+VdGAR-E#ME8gGQ}z1n zSu;#fpN{Q_$F(V!mV7_`j>EBaZHi95W^mZF%X7KY%p8|r#i9j5in~~@y+x8;fZjGt z&x$!Vforag$fC(`20lx4o^76*>shPbV6&*FeDqNVvqKkLWATYpK-sJ!@ucHejuzsm zA1d~n`$;44TR7~ie2X@bwmY3CJxISJb48?1*^HhF;o%x{hhL#ucf>*FF#!L6xH=GOU zm6|ATZ?p41I5U}eFyi@T|JS`(G92;(fszL|J7Cnj^ANn&#yrT10mJF7Yj&+y%Bci- zO`RrCis_eccm)V<7R5O7o*0ekN!W>?SD4hby`aw=GS;hCYnu|-)ZU#Woqkd`%I&^k z{aDb|uqRo$%hG*_XB4Wzf9UPn+Es~e$`GOJjlV=4E^Lg%wriT8?SlWK&?WQD{0q+p zx}=R$sGO>aF%>IB7`^mH&zr#BdOL6HSkDZ(?@aCEYOqgxFQ;WRmzZ0o4RIji=cVhw zy82rPNIl zqrNS8djVB_a_6@5$)eD$MRb@9`_cUIjR(Qu><2A}X`GGqcH2P*t;c)r46b6d8uTEv zEhf%8_WV`X>#7*reWCGZcrIom;`JLhx|oSm662+s_D)n3b4>QOmdYDjPTj9&2U9Ow zj)&o!QK_ClT*vgA$@hC@u6|Fc?L1i{K4589JEcS5Y+i#m%U$aXjskw)b`B#%)q_|2 zj>U;JAv%zgdExWrNXUUD+_nDfIj+TSbVPFogb&GwY)(Jh>uh|!WrL6EZcaVgpjYf} zKBP+z5`(>=-{rUuIq9WBos;o%FM;!UV$BbLkDBl)A?oJa|9S|~;h`p^K|ICI{{P_c zKo@E|E!*^IbvoE%;78IJo|Mg5mdcUf$>~?-gP-ipr!kE(U)`8-pdzdMgrDN1Lw(O} zOgH12z9;3)#?lArO}_EUZO7;|EnHpC&}q1a)F($Cf2?HRdBr}&AG$66F?M@a3Ps?@ z7_9B~OrH>`*26TlO2foqUxp{nv3sYU?NJksm4g;<=kX|3tW1u_^PZqr<3OxVz)82@ zLIT7B`ygtuREOTuy_bz-*e#quxOwvOC$Vn)%f_0Qqe|U1o49Cx%*iYwxxNsd zrsB0wp5u0~*N_7o(*luCB8Fj)L{;cS%wO}Zf`$GIO|Yf+AY6!@hyw>m?&%G8FqY#I zK+?kgJ`y{q0UU8LI1eGQ%;5j<>_dTca)6Kn?8t|U1gHuB)gcb0XPa{Zf94(F zB{+W+7EmLIE&zZ5FS5yL4d>z{NQn{F|Z3VGx2aVd~62I^p*s4L;He90-4*I}Tpl!TYPm6qwln{}y`szplq} zY*xmspj$f==3KVW)_g0z2KfCx9 zZ0R#N>dTtlf)HCjd)i6&=&1BQeBNG*W4_THLG|;qB}M^)y4CmtHvSBk{xt2?MCd0n zenNY!g81RU73KlBp(s+1*kX)fSVj){04drfBR3Ix+Y~L%WBxjd0oLq}-P-R>(I2mI zLt{xTI6zh4HooOa+EG8P7+1%5KPo_t&zj+9`URF1wCW~Ew;^~>4O&reuOGwI9FBaS zBwx3Un$QSlI%G=4=86sZNjo;H2*WTQ&_)`_(xu?phh_|*-ObvF!JIOlamUFZrC7O5 z;7P*;unD&y1pQOKo6uDORJBJRf3!-W!x6WZKkdj=I84!rLb{~GQrMYf?EArh|DF9} z9>7a|j~SYK+CsEX2zcX-AnyVDQz$b2Do{-p-0ExO;rYCZSIahZHE&W}nM%!SJy^HW zRJ!|(Sx`_$%CDzMr|dgYZjulKchX@(3wzr7MEI5Bh1%v(XB~m-iCQ{N!HmJpa;aO9 zG7x743UrD)N(&USb35&^uZSz8OqP;qj(c&B+wc1(YO_^rn#(bb;11S^4zJ@S_oIB+ z?Hi>u1(EOOx+cPIi=GKruDoWexr!r4@Xpqs+jsmSi55%syN_l+g{5p8AOD4!RaQgEA%%JF-5`BA&?Z6;7~9nT&|v(9|hnxriK z(p_Dd%d(H(^LEKAPCX@?>I<`o3l2+_XHwgJ#QkMliU$}tkpk5Fm;}MQCz7v+MqloL zr%wARJ9>|RkSStD;nl08Y$6`mKnb}P6gl`*HdFjAF=}k|CDq%fPKm5_t52^X-RTDS z^SR-!q^}^h46sCi@^Qa8ic*K6^1K?TZjXCy#bptKh~=H0O$k8~BuO_rIPd~qzB_7RJBT2^nfgZ|m~(uKyUYNN zwuDJGZfoFU9(&xsOkkvOEOH6BcqT&W^L!v^?7us>NwHiP2l43T5}tbVH0il`A_-&z zPw||w+&8F2uUOQ?PUt2uJw|zf18*?)8G-<^SCLf-u%*O4UH7@nV+F4_{Z9225R`r| z#0+fKf}%(m68P8xrp0t}MD_3Q)2Fl3r>K!EC-LjjkNJQT5mE!U#BFPU4r^PhaOhpg zYTC+YU?yapt&EGZrjdLyK?LOdDd1QFya(iSp^cKZ{!S0GxEBk=)$uV`OyD4s6orQX zSkBz|Ay7k;Z};dqd-e5spRcpYJ`~_R9+pNAn8D%=!51}COV_255B(l9|9dTf@tZcL zK;H^fX(J9fFek=z9Kx_TkASclKC0Q#)ZT$~pq*u4y-aGVMifh`2iqL3>IHAcRN_D6%tt>D*4sDOI7NFobX4vH`8{}s zho%z>#mB)`4Ov=b(Cch3hmmnFBak}Geq7nc3e0QpFHvEsa+4mU%=Z&PDva~Fra+Ml zNh1o+7Hm4{g(yO?{KpDIdn&0{P#l#8Gl8N_hOd{tESez}fVmW$mJsW(4>9=hJ7ssa z;?;|RA>$s)Ep^wTmU*vibyD`{?8WPlDENf|UzkzG=Qk5s#pcSoJ@#)KAF-MffH@{a z$OS7GLk6DHDV%t~80WAb5uSp+TpGEW!7RL8usMIrBJ!_@re|H_e(lT8!9G{84;)Cl zJKuBv;Iji?ZhXMiM8$dkPep^Hw}C44KQ#aWhA!~2Lx2L!`A?O34i{1UNAxO0mHeXM z*@GK^mKf87vvf?9DP+Pyt zxFrS5A7~M|-p-t9e8vFnU2d z5&B+qs52N#dGA8>%yqW&C)b~Vx_Tf->w1ROOC(>w^ML|34znNtgm}?H?y=eiIr%d@ zOV{G}y3I$t4C!2JyTfiHngb+Kenr+HRWv_z-o-1C0LEK>3Zv}B1X?3S8mx9N+SG#c zCuf!6CSij((RbdTzV)+w9BmqQQ<1MP#2!-diNbo8T{*fs_@gQP&~NMD=|^hvWJyu? z%+#hVH%{VhF^i_^)FRv7$5@k6AMQz&$2FJMUhtp}k;ReZP&4Njf{wDI$+il0-YZ3C zA18(8vOTI#h_+AsPkin35*gi@y2I^t(qSXeap~&Jt{oX+bBaeZayDl+v3XwD+L7$i zbuvz53uCM$0&09$e9LD_ z>=e$=%vwH@CDr+Eo@HG=bGOXB&mE-)uGlz5^NV5&Id@2O^&-L@+w{KL2)_}8Jjg{pxAGz< zSgMGmDl+?1WGGlGzdj;)#R7l0cu~#Un@z4eZh)tmP@__8*}!ed`y7{n+sa;p4`^&! ztcYH<2{d=^h=2S#nE(=7G}_Hd@0 zs)=X`TQ;f<5xU=9FL^u#d9!$Nf_Le!Ek43_z2)#%E8$m|QM;xH9ONyyW`bk`6&%En zp!o2?93grGng>>W_?a)7BUUQ3%LPebhaL__|DXI?fo^hPcG>>6S5`m>8jhuoi!4NU z0TZ}vru;wMB+Qj|Q}*B1?>Wu@iJIli4M@NCzYUxYNEBAzX>DG)^alZIQ3}F0dfO(u z$sly6Iquv4w3Rrnal!$CO=n{(Bxtg~I5#04PAhLR&w}U%u$N+Ct)rcUd7LplF~>Ja zRQQYj+!V(w7kavUcF&dUPitr(fSj%0Tr1r_(+@D+r1{$o>VU=T!D8Mr;ak#!a(}JB zw19?#V^GytLH4IL2Rpm9%P_$ZPOONV4Q&D&(sC6QkLunjT^x4d;HUM$6Uo*8a0|; z0U6X}q5nWxQ+(E#OKW#YC+f8mxhUcWzxhh$444*V|MDIy8c!Ja+ily6$P`ebKf?Z6 zZNPza$NPsRZ-T{t?6L?1LM;Dq;}M81R=Oy64CvD8i_Zt8FrPu_hkMMRfE;0%Gal5# z$k}5#lv;rO%=NSW0VS}+8{h}O)3v!?5~Ir=ql`f79bxtO0EHYjCPmF6E*h=v8IepO z%rGP^b&7EVY^YMDRE4ps%pjA@x3XYy#OVfF|kPnlm&?^i?t?686EkoCD z$)dlR1u8ig`zjgM?}=8bMw*jYV3-dEKs$|kbGH&KDHZ6?FV(8jY%dokSAcxLf?WJnD2=V28Er~N!PjJLKci+6NIiwLeW`&HwW5}>*JkPGg?y_= zCi0{yAf?6-InaQx6>w*IgqrH7G&->$L;?An`sE5Jr?!wf%6a?iNC=r6+TL*+M~y}6 zQiBc&F{{yg*Kn3aV^}Sr$j^_gy@yBr6QQ9QQj}C;PIn_WwZt_uGL=RAzY*uMmKTPY z;27Y@4QC~Z^9XS9*>=Ug+M44ZL4Smppj>Ze;#yLsJpty&zDN$y47?-+NxV5@O1-Nr znaC{&*Y545BzBD_L4}M5_P|D%S>s8cCbEgT(>t_5izI%GHl@}zfEyn|$qo@Rg6Wg6 zUmQ_d=!v@yfr}${$bt^+`oGgk;;vKwOk3-~s{fsq6L%f^S6Un9{qMAdxa-`%(%P{7 zf2W1SHwz)02yEn`J=wTT;z;=2i;+Bx-p4Kk0d|PIW;~evSK)n_yx2b?zQbs;f3?tx zZ)(H-oCr@+Bsm%WS6mY&FY%AK)G#{cUvXUVP4|DrBY?^UI47Ff0h9PIBoXAzUpu5m z(Jud-V3+%tl zu|_6YlAMfOSa{~1Qbu~vvr?A)?@CfW=wv*|hosfJeu5|IU8GH30aWgH(28N$r-$!C zbBK8;x z_U(KqRgi}hyIm$P@>*C2X32;?B+S*w`3e@e(7IB7RRaO(d+CC<0jfF!!`LJvE>pcQ zv(H?z)$-#`VTdEn`2M!l?m@hp>FyLwIo^xtNJ76)v4hEQ;rkb!Kd0_vM+Z2t8$(EK zqC36{P>M-l(T=dZfNzMx^-Aqse@d83XE7=sTL|=ZM`X`F=RbUl5*59#(9fX7hnv=n z>(%jQ#fs2|{I5*Nl|I?MGym)WQYah(-8tB(d~yp3$NxEb5jp4tc3G1O!SnmvLHSQZ zqudtD@}Gvs-#cxOZd{Xlcj!`nxUuhDUzMI_HuE%ljL3C0XMg!yI?i~s$x$&a0V5L? zjacB_NOJML7=l%{UpeVXW+iDbxKARh3I5v6C2yhGq|)jzT)B?>=6e-#q9(AKv-Ddo zh8lN^&xqBF=`enr*O$K);uySaaww~7lCsM|ZDAeJj)?C%tVt@3*;nb8TIvdpaU7Dd zzUi0wZ5aoDlj}x9Ik?5jJe($s#4grSsgkI|PjIyYyhu;cn z_2u$Yg3VW~vxZ1rOnG>eVOZWkE+b7jDKEphV)Tuk;9Ns%mI1KGY?CayT**eUj6>+^ zbdmNq$i@BcGDsj3OCtzNNSr|gYyJyWms5&3vkyRqh+{(-5%YQf?#YKzJi-OZPGScz zw)Wr^!)r6T*H{5#cg#K=N?36_`|f>9GVz|pbm0AiD>-gCu>Cz9AG*?t{320^X)(?P z_V|AiL7UQoVc?%!%i%=N2F@@2n?a(Gb)|pPftSFwd1AHWdHCOamV)f5p>!=Sl&Pv9 zXXAF)LCW> zP7T^h#58l9;%@?T6P3s$7avr%9Z_N^^U*W?z7&5{snc2bQ>qH5?7|>#R0^QQf0Ot; z0gO$J)DGDPQ(5>LKzYYh@Jr}^?-!gMZ^-}Emure!9>k6gL_NqDhg5ksHuXA@ZwLS7 z1r18fUW{Vw)i1&QG?>HX>?wZ;EA?Ljk~BrO^^;)kBkN1M+0GHjR+l9&nUlQPo)8Vf ze+VR(u%wBq=LPUirOWwC6lt93y~KPF1D$S={)_Mx>KI&4_LD^#{aF7m!zj%WH5{E9 z)wfEaJ)bGEIim555F&dR_EAGAOt zUu>-q^#A7#S0Cb=-alz_(Sd%RVYY$lZ5d;T@i80XC4#XqZS2MPLX?*HwhMIO|#OBz-4>%Y(-hyCi? z@a0SJ@gR@5Wlz!N!mPnoW1-bEy@o!1Art9; zgz-}>;yb?oS6;;CbV#_}W%z-ch^ngJuFY+~Hfd~HR)S*!C92tj9$IQjEH60S?d%D; z+|D{`nXW@I@}TYgSljztNRK8m|M73)tV8KtdEkM}d3nAjM%W(b-`0c%hUL6t z8^YB|zsG(nhl8zouK0kQ{r~*|g@gZwfk1-)?Kr=>pU2DgRR?xt8=--HfRfTeSFg<=rEE(9c2@}*sIMR0!AXzMf)+sG z28Q^`33Y37tY0e&VNc(~$KySbz`-4J+xJ54v-fa%F&OItT5g$os`+i>iX7Wll9U1# zA#!%Dcl(ozl72YSChQ2#+cJ~EnVEt4OUMuqmwk>4OM!=hxI!TK1PS7Z70y;jY)Ofs zx2vEP#87BJJBLHc+Kh^t_W7Y4J~{kg5Gt@w=0dj|tX^DYU0y4b*)-!=bJcEmhBXfodhM*juJ6O=wB!aY>Jax7(rKAswP%hSqs;qus7=*ZqFHx zUPfc-q4phhUq^TA3ff86Wdm-YbDfJhXm*cUJFQx7 z9d+RUd}M}pm$&jvzE~cu@-CuUSaj@TM%9#Aqc#<0>V5(fE+?9s(6xGEEaF-~M0rR@ z?|!Rc%bLh_xyC^gjgb7)&7&qc?ECcO! z?t|m<0&o2pYj^w!nux-^-uc|w_mjcjJ2LeOgSz6t+y|mZ!q9*>;CT!5cg~+BGBO$nx&D&)@b=_VWw%dPh{u%U79jvrWA;PpcH&(m&nr2!oT!H5k=OZMc}5 zR7t0gHmG~*ny+p6zl8gEKhAQRlIB_s-s=ljzE6+a+R|m9;)1}OpO0p#P39okyXx}a zyO#%vy}zNK890_RGElk$2Hku^udnX9&kSyyJ0C?rcqlbN4IPMc!B0cBmT)c&;C%UPpN0#=2$#~a z%Hlm8r>2mBAW2AQlNPg+)VKE16ls1ZKkm^MQ&d%UG+4h>xMKL+;^(=r#E6KmF&SIt zGIPuafOizHT(dj|v6a=9xeTa55I%5V`=&Gs_x)LsS!ny!kr<(^ji(ZJKT_0Lyic6c z6Ca)Ofm#W|Hux&N&Y{IC5jNRiZyBBA+03Z%O_V=DL)`C{^~*&c1h9`_I~TRhW%naQ zu8ls=fTP}j!Uy{hlzA(Y5j(^wQj-1~E6%oE9l_0245%0UKS zEPq8i=EqJAKO3fju}lBd){XYOb`ksMHD-yIEC%9vo`4GEgi@oxy6(y zi4VaByPj1k^Mk>_im;?Bw~GeT!yJQ;CWjeEA)O)|e7K+`Sp$;DE|oT8g3H|1#x6G( zT{Cwp0w-yd-+WW3#pqL`z~&-k>36z|+P#CUU4#)=m?-e+x8icA=RIF|GP= z$cQrE`9V?g^?_ii(80a8eYuQ{wNQ!PJ4L5!B#2ulUpAORj$?P|pQ6 z-@FwackeE687<~PKrl?ec2J0iqow_~h2PB=kh|<508yNOAmsW*5Mq_MN$Vh@bMz9& z!;EC#ayFL2_j4};S|)l_6Jvgc)Yv=w@~ORZp9ym6|CNG?d3(^m7J8}JMJf2$Juk$Qyae4W6u#M^vA`-M0KPuU5f>)g@o=2+5M<*9xo%{>~S#_ zbe)Z}E-!j`5%Dfn8d|-B+7-{nt(1{0pNe*G_X-AXI<+oz5C3sh27Gy`EfO;PgnQ7A zpou`MgS0$=@@H8MZc_SAQuQ+%MV&aOhbBJo9`#`QAj;3whdM((e$H4J)RyDb3g<;{ zS#YoT$Qs~38sq9=&~oyS!Lgtd>JwCXICG=<9l$}l0CsuxZ=p)>h;A&#ycAClB{%@_sqj*0YE{`)g+3t})CK=BKz0?!QzFp{+{-BF|0o#WJ>KIJXXjQ|%=U zRfib+w_?HVN;-rtVr=dv-;OGNf#LLIHhvBNyW43{k-=-#t9IF&8FMfmMB%SF(_jiv zB;l~$a5vW7vb{%EiB_bN`=%M6opUb3O~8imA-W1UwF1lEdarEoUNJQn~dDCmN;hwAzr*kprA>7 z{vA{xqBJ6S%@pTDrZ%#64!c)tqsxDuW7wqUsa&tXX@Rq|vvw9Q9C@r0ww%2A>ontO zv!Mx$IS4O+!p)7OWTpi7%SqEazyg?>%68}=1~$njQ0!K0Ju#lGB?rzh_NSTTKk2E_ zw=km{qYp#HbTvwF;v*kB!m5qo7S0oehk^GY?cUFtPSn6z2p=;Pt$|~qEf^q{q6BIn zNc7-FT~gI`BtFEpEZ|1Em4rKTFlCk!TvIXFIerI?_W8&FLJ~=WKb#!Y-1aN+t30Xk z#G4G;5Q8no)Kg(IJh%6z+wUqHh2g6#y4M1PL!&t2sn8svPF{gLT;(OWl9shg`&V$r zp8%?dO4R(2GoQn)Sgw}toVEKwX=AHu>n4h^T>YCDT#;72@4yi^&83cR~K=7cxQOzz3SnQ`HoiQe!d5GiQ7Lu7C(&4 zlep4I24ErSu`@T3IT3h3(;8@-BYEc*P(SkTf6?h9l?ppas0>yr_2tDQ|e^G=rEe zEodPdx1!$pQRKo=NF{WT(U3HKpSmum<|JQT)tn zY^YSC2v`+vriAbSYMdH4qNjYvAo;J_5#!$Y39KDMUc_?Fn#oP>ZLD(p)#tY4CY`j; zz-BBVdGjoP;ExA-&;XS~w?%HeA-VaEuUABX1Qgv7W|2MSeKVSMmDB1r@VSe#^z313 zjb>s3n9~ZHK4f5PoX$G&F}X*Lb8vg;S1Fea8j23%L-0A7JxwPJ3V5u2=vJ-$sc0tu zJ=4!0WCrAHlUz`fU8AON+zXs=xO24wQf7v;`Z zcnQfn2jMAV@uBEjkj;;JbMhHm6K&i$$U!+;q&4ikXCH#S>&)X5fk&fe<~=OPWHBh= znZ(-~ds}-K%{@Oi@6a5q0C?8IAO;mq)#}Zo)aC@}cR~GL3Tl=27N=|y+33K%<452u z>Ci^Z(^utfjBw5qpqT_ry#yt`Z=-b)8$usJTs zKt9;}GBML5bJo-y3LT6OuLSdhZzn!s!f;gGmwF5unB=laaA2yTn+@5493b({xySS1 zqudDTNiRiev;}#MMZ~f7Xzys1bOCTpJ(0OF8$ECn9J~M~ex5~R`GS*Y(uXelV-C&H zdEW-neAlKo2>t8!ii^aHNcq9^!QR}!6I$#N>xL-+(&5^aG00K|Lvw&d57z?@FkM-h z3dRY9;K+_V+%VuF|IHJ8@2`cxk(p?Df>0b}hYoTe{WmGc=BDoo0vxn}_!s053v`!umVf}ng^g)Z_82MJ*3lT3PdM5_pUT%KY7e$6+QB8rQ zgb@L3$FpU#_-p|=UmMQ(_|eXa-?-a0J7@^L4p*8As#!5H8-iNOecGgFNgiKL_XFEo zudrKh^!j-_R|7d<)r4>XE(>2^6p=Ce&U8sMup$-5g2_(% zC@~0zj1R%|%8(gogh)3=q%XcLT~~hbIR(bf+2EO_7W*c~qPWv;5l{Yser8PK@df>5 z6M*1*5b4jHxHxAD2KXK(SASz>8Bs9fxlr-5Da2J^eHkwAW7ea&mg0el3-K0-xUjY1hz`2{!kEfqR+3KFx0M zW^=)GgM=#an#5W>+u`Xc z9IoUJT6nJjIMj0)$Eh-%3?cY2k6rd=BJ@FJ?g$$WMx;}%xj?a9JkbbzS=OP%?GP?a zHmp0YW-XW<8|kY11y^EL#m!!B1OC>qduRKp_{+0#e*CSdm|t+V!CyH z?&<4p_x1CHX#PUl?{#%rtomd0q@EebV4dKR!&^mHV1#E<#sFTJqWGZ(j-v1!AsdNC?^(eI^(k z+mrKu%bS}w7^5D^)=fmXsrl6Nw`W5!86|5fD5Sqp(fhc=ZSu1CRSMLH8y>mg-@deN znC5%mM((rIUh>bE%g@h=5pEZ?N-i5as-M7xo=8BP9ctHh)>v?ss)bmBC#g1^bsY*u zSd~MCh#X#rMRnrmjpXsY#?$*fW>#)SSVF50MkPtlmo&a0#- zG%^_-gXh5N+@oY%9(<3E_Z4ArsYBHRryN|vZ_3$IzD_x(BndZ0lw*BQxzHmy@6EHP zo70TwP_ivYMqibL1t2a**S>%6{}6Dw_!8RvgKJNY)S}eOTW7g4J2LWv7W#Jk=3&fS+3J0g^j*k6~>Gk0A6W>jALULe)^>~Tqg#m6zte8drq#aN(EqTY)=G^$ z;huD1)8>l(WcS!xhQ{A$p{c&i@Q-E_uf>k6PWjMBrpab*Q^i$6+y)LYfuo;(+v{6C zNXKP9-L{9y?%5U=w5?EBXq%eix*rJcjC}lY@+}~y^V~awjj+M zd|1zzpI&vBqGM7wZr!7@Vj`5WLePm7-32KTTd$TjXYID=EwXBGGz_nenBBMIM$A24 zSrQ3mlw;J})A{L}9YljVD6+4RN_!^Rax^*nj;AMB{uR;Az*5fIkK&MKezc|8M-$K2 zR${l25ggEXsB9mLKI361aPJLEGL`#M`f0iD)+Ge|V9Ywiec?^Q0Nf|fop?8Aj;KV9 zCMk$|>TBz}dD-i!@dgg_xI;+~zoyX^X+NxLi-GFgw4E|TmgQ1@HT`IgGv1u9_kRC1 z`#fA2&O?;7?J3wr?-(EJ>Smo2Z9+PXS6In7mx;!_JZME1D==5 z$^Fyz78;SH?0R*_|Y+bMD;v?wqUPO=)vIig}GI0M6)LM=fm zTfVH>C=v8ya^LY$56x=0%oJxX2CB@ERoAy=i?ipH8FHY+kG=*jj$itWxDpg)RNeY6}pi=|X1m zYfJXiuCFHpXQ>wo$N$8dMQiCOjj`g2Tf(tUF@`C?U|V9|%#GIPAs2Vkcd>fseP@Am za~Qqw9I^{T8ep$$6+PZa1S}4N4FZ0^5MW;p&TV*vVNiQ1vws#Cl4;4VTVYB(%i5C^ zayi%b%BiB?OjtIBc!Fm}E&(M^FR`A*qaLp6hpKXe}Y3>+Kj;L(q>`}g&Q;9c3Z%qRJI!&&>Mdt>2&J223n`V z>uZ@@b61Ok!`HnLac&0^=EshHJeVW=B(3?ghYM+!X-Ht~-FE-Wi(WF`MynirYhlB> zLDoA3Zr&A!P=q|#z@haJ8=Qh(bw=%mI4}D|>$~XZ_a3r-FAi?h`{+5N8pMMaZ&bLt z%vuGBf+BwY0Za4ySe|{wAD`7T98C6)k$Ri%YxgnhBK!A*%ZkPW#JlcUT6HXzxsTCl@)0S~47pna>Ku0uct^T@Ql02+Kq!lk><9R7W2=@Mh{<}qsYa5{B_ zGuLVFI2mof8v)IwcQ{h#UpQo>M1S^;;%~wKocUCVo-BFNa3XxU^Kx=j8Fk&!Fk35X z(ZHoAmO%PIX=`~Sy2OE^g{{3==mjOLY)4lIpZ8SoW#jb)qS3OS;qc0M(82Xzg&TQT z)N%rpIs}baEp$MsV{6&ZOSZ4HhA2_^i^jUp$2RQ~Yh-|W4i;P+Qp2l)8{~)@bhS{H@Prxuh#R>~<&7wg_VO~;BP0iF4 zY1vZ9CBqJG9U}R~4h6Bljj&ZWR=LXXk~Ei{1Fdll*TYdo*EuE{aG8bk+S1tRc@RrRVnI8wHyJS1l3K1)2! zH$pN{Y#Ru%#>`=owrNpcf%i`U$PEl?EHf6tE2$FBE3j88hX$;LOS6Y9B}9|Tivs05 zDrFWluTF#!dA(7h!-*uTd0E6l0ZI`y9hVtb$PAy-i=|+QX@rC4uI1}L?6F3@k8k7X z4VT~|)3Tr!qoa0vx~*1^*W{D)4!fFEpC(yOVxrPd$*$YD{S#*)RP<^wdwv+v4DP(D#Z=Z4Y&gY8*>G!ir2!)$)WjHmQ{D1=V)kk2MKW5iijrLXNbK1zhfw*fq2!be%t27 zyPqWO&g8QxvOYNmzeHP;^@a`@8}((V6~%wWQBXD4WsuJfEJG=k!p{%rm$!82*!x)6 z>Ok9wuKucAElEOmtWs*XdO;7-%??-lMo8CHGrxGC;u5a^p0paUHW*1-rwB@qG?vcx zI?^(p9=>(epFs+E%2>u8u}A7~Fy*DCX2EMQ2*BQ~1Ny{a0ju5VRU(s=&x@Nj&5+}_?E z5fLFSCc0T8efm?_uvB9k`Qk9hq5 z@PfAwy^#B!BNV@I)!Uj!EKxNcD|g(%{Cf=SfpayRBJfQ>zGA;?wl&XwS#Wi3*g(KW z;w15QSK{fNurdg7v0?aV(H{}W!%H|4dr=U+BZB1%g7&LsrVn8hK>+ly9;CI`Exq)d zMkTKy_orAFw!NC`(B}IvS>9V8=W2RGL{-rxGT_mC8!5Qj_dVEvTT^%zWJCDm7;p4s zC=33_>p0Ai6D?2&D(PhHu&ylPg95aqTGnWvu6&JfN9&p&a#p$&IH6ag`9-{DkeE=- zAiWVQD#ax{t9_TaRl2^Xkws6pu1WuQ*$S#hjl;yj6{7MZHKv0o{0+D5WbRgexnbrj zDEie+J>>Km*RxrxcNGy|56tsoyTwP2IROzIRK%VroDsNCsQabSZ`FheIe1B#-R59E zu7J;5X`>9+Lut-LgYSy>vtsUEFIX661UO92Cnh41Z>A`&$Fvh9bNdXo@9UA%x6l$;oKDE+BiUb(8AvbeGF<` z@9X6?C$WYZ0BSiS(SjT{y~?%3>t#IW?`RR9q^X$9yib2C3dMf52iWjwBo`%8-nk5NGa&N%vmp6VCiPA8gnh#qqk116smlcap_6-6z}RuP?ty9>w1-jw@dX?)jLU zXSh9IZ%fn6znI`n)znDpF`08pDc@-BN?JuEQD#wfUGO4H)M6RA2%(wq!Kc?Iq8BEy zE0r6WkAn&_A!WlXQoj_)ItFvBHD%K&RpzKOZ5)#Pd{JlSbT{VP+x+fY3Lq_soo@R}{RndVU-=Wjx>%m*G}^?>0-@yN3%q zD1|JfJcOPpEh~V>GJYpED!NHWeo!3p+N3|a>#}N^T8nHQvmxq&N|O*OJQ4Y{|Baaw zA9f}1kfwhPO{)Aet$lvEr`y*0MXINAW!J$(qp^9s&{xgGFW_C`(_+!@7_A3w6m?=B z?5h>d#jU9s2qMiH?d-tjTJ$)%C1}0UF7)*#6C)=1=a7IR0fy(E8C*6Efg-B1g1BEPLexWQV2XcFsCZ%m?W7ozY{($Alt zgFJ55-}B%6_8A<&9Ddb6&ZUVGSxfSyoPNj_?5I`C+jY&KdYqJ>H{Z1Xt%#8-tSP4T z$PcVa){y&=*7q%m#0-wXjqd0!GCT;mDi$ty*_pjOrC>r3;aLd!nT6M4fcX+w zVgL&ESYnj{_eZ9QkCZhEi1?7nUU~QDG6Fa+BS`$!!8)!$rfIUW{Zgd+68swM?R>IAU6Lf`Qufa1v$!Ofw3e>VCPP34L| zZxrBH`MEL|4H$5nc$c_up6YG4szG1r_4C$$j0`&oYYkH@AJ#p08-ga~-R;CY}? z;05l!*VpU@B!1y16<;uFe0=wguOnjpw&tIkjGaZ=A-1W7bS?A;zoMo1xAUjDz%J0G zPSWS0M(tLH{0up%p-FMYbp8CX z%qs}8P!JBgGv;V=eSighof=u!afRgt5r3+* zUZU_+u`;tSUE6A7l{@+loaXP@aJ;XP5Zb)uConxQUl}yI7or#mjoOgoUmxo3oYnZ_ z)#U_{2bQGyRG>NKRfTyEJ#DLBLWv5p1Jb6V~J5NTF)zv z^^>4)VKf|TlSsCgS1ZCYit`r5y|?!Z#y%Wj0u7qX@|y)I-_Y&?EktkUYDkD)=`850 zrD0nv*%k`EVe*al1+YKne-#}l>{b})a5_xaMwrZXuxUf@M!=3|v#YDC+7D|scGoj= z=XcwZS&35D9j~3a_Fn_;L5L2Kj*6p6wAF<&pJegj-(f!|i(~&7KO>=8ZjoXIc@Tff zlyj))p|YJL{)J*>=-P@rLpwBJ@1~z$YP8U4-rZaGxEsQr`&l<&JGxT1;;lG6Rc1YY zNy=~did)Rn>h|KB8?#eA#qsYlA2H)Tou0i+ycM(fNTPk|_7@$EUq^*UO}mwai}712M?s zeue=dVc_6KacfNaaI_pt^$-_-bnbG_GT4yS)3xN*V*6sy_u<{ts_6Ydl z^_mb}fCZpIyF?_yI4#|r4w%jzkjZIz`FosklVWVD6u?lk>j6D37sp^JxYkXA4JT`Y zP9N+p+9M60+*XUAd7Fhp5z}h5|sl4E9(U{GK8lzodG4p+nUsM^j3Q81;s0Wal6z zQbv{K3sZj7_=J87J=-Ei0{X^MXafbx;^aWX%vYT!d5P3c1W-z9^pG@M*kEsO*h?;1 zky*~UPxU4CHgt6*TrF-GA!FJrv_{3u3X}B8laW(w3aB)P&lJ*MwYVw1SxMQ{CNn`u zq7=Zk05#^RTA=J)mq{L^qv?2PHz7*8C!QHEPF@Sv`1r;-p1vO`o69dm7jA-|l5);X za^X``NLV7pxLqH3?#Ze;OL2MmAF`e6d{*S>s%)9iczXN_2qH)RB;&pQ zhQky-2I$csjP9_r)u*+K4mLzCFn5Q&=%#lz3X#%cQo<}RDS_6-$Uin#DU6U?JYr~b z;0hDIjNBx&z~BdaCLM|EGy*? zHrKy#K;hW9Au`G+@T*1p3*U>o8+)b#ZSvvB*C7t^qdBsEGxa>Ez?wK%wKn6Gx&=vu zH!6;7;|GT^INbH^n!Z>{J)gv1@ZAJy91me*w^E%j+=B-oxa_&%D!_pDWUMm>yDgVg z2_e>gu_Co)@I)Ooc7T_BA9Qi~neMN>NrA_`_j(Mjag?xZYhQ~KAi#zU8KZ%o14;DfzQs=RX4i_abSyO27Sw^JgK;&{%CwB&?P1?^k zrRwMBEFSXt->&1PblG!ry#P+rsWUxkvC^p(YEIG%hx1w+4NIqY=r-?gh4nBn10FR# z#dgFYm0}KF;V=$?_eivf0QKf}R3OX{OXUchcf`vom1#ClhE2o@!-Ju%>J{ zs9p8mqyBZ*Z=ja%o>4EQ>ytZ|xW3MDvWYzmU8NPRthpQj^AM_5)As1AT~cW(@K=^i zYh_n4idL&^oKAhCze^#t-^dZGdB&KGv}pSJnsxmc@1t%(K%&N_tD#J%i~L556GrOj-UHZ%)eVr%$t4SZxEjM~W(v-D~=r_%(>S?2Nd>X%5fE z2tYnkV$84zZyFh?x7iTtOX;-DD@W>tcAgies8RpI-;)x+7hAPM8=;;yw>2y@5={~Y zC#3?o#WQwaAqc}ab3O!=vnahubz_pMUXkEV?#TWd>PSYxvO*+x<|4=%8pU$#!3B3Uc#qJ%rPK%=KexEt&P;RYZZ zrvsHE?YFZR&b-0p$DLO8m_SqMkTOneoI*4^E9KPHQGC(;Lka^r2n-HlR+^?O} ze#hy@lcUC44jrGcvD8jzfIGQ3tt));hmH{ke5$<|?qGQEMl0>sQt;`r5o4b%YTMQN z`nt*a>y^>FqO0X?=Wi*NMXyT}YwR#}>gR}Q#!Y_GDhl6y6UeoLRJ~PT6Qfh>A?A-=#D`>*@zKmR$NeL# z?yu_^ODlKvlW|7wuU5jCx8j$gK&VWITpc;Jw%{DHrvtX5An5YP zBA9efI|W{Hq;1hrHlVu20A=YEh#)m?lwfqb^2J6Yt;ILWXMG^W7k=F6oTQ7vmnrLZ zFSnf>wjBK1Z~%kX$Zao9JO#W{7ySDYxxB8@@`#j=;$w7!MJ0WYg2sJGvnwGQF|fIP zyH@QJC9;mIB4ThDuJF@P@~99S`~E{E3N~~O?U@6NMSAe^cSwdZc3V-m&y{-TP|4ML z1aYhRuv((w1= z0_41dE+f|wYLv#xo#9r^Ix|~6lr117l-`Ixa19om@88Utq;|yaxHK#u=GE1J4>rtV zxg^scA+EeUXhg;P)lbxF|5wMme>zU$3fl*Yi(BrXbfD==i?OfkLXv+;V^_JsP@1Xx zjiKy~d6^?8(l4imsE{PQQG~@@4&BhMe(eShJ<7KJSGLQ4vK6LND+`q|4GOcpVmv7A z-rE=q317Eo(v zML`|LWnR^(iRJzoj@qNCPP&w5$Q+z(B`RYixlh@GsSJv25yB{bhGAlDTJ7@aWaRWm4d? zcyRY-!Xx9n|1g%slJfr0fH9#yJCfS%Le}HgxXJz?%@^!C_8_68pa=xfGbl4;x3j!Z z#;vyJzn*%zV(viUgDM53-gze?^|gFFt!BD}{gqC#68ZC2?!r%E==bbVtTv3V6&%M1 zUZGB`fx6z{rDePS*}dpWLx#;BK>xFNlhQ~R<4@r=gdu8~A|M^IWh!X`G zoM7nFs4iMrWjM&RUo=u6!E-BFVI+9!_MzR)TEQ>gjBy3kIKdvDF2!}48)A69_!s4Y z2oo4Cc)=+JS(Z;Ls%=wGp3~CH5;XUPdU5>Sbobj1ei8gcqzW{T6r`s1EML+{heYqv z?!@*%pKoW!>#t+DwrBu681vUikPIESYhXU%!cx@12X5RrbpvdqpdCqzd!&F++Wycv z)x`Yo0D(!+}+vTDh08Db?rQDm-&Rx=_VMEcj?0@FUK!=%Avku8F zHg|84!3KS`;UASu$YJR(aJ89xYJO5#k6k%V&t&`ao!;p_xbq&ZMjX68RWrPcaECF; ziQ+V>!1!HqVq-w}emrfN4FMjdo6+sV<~&5}O%KWF|q;1UFuesCr(Wp|>M z#z;!o#a*%|NhUxeWdlwl<%vq|?uf$AeL_NEh^s~pdvpjSW5U*7;9K9C?-)3_U-(|@ zx`j08q^~087Y0|}uFuW;{vTZiWGx2i`&POPM`PTSd@^fpEN<)B4!Oc7^a>=`jp+kxy2E4J3E_6-gS+trKbXZ+uPv#CGw*ndA8B z*qtNd`{1#>{f*qE!DkI)$hi^lJ%=RDjeCOgaP1N2%NtZr?3~ztPL#ppo&}Ow)`p#1D zhJ&C8;#%f{ITfy9E}wlxU>?;jrNFsRMcjclG#>j0_x3Owy~;lH%`eSRN%O3!-`?o( z;Tg7>CeSbW_Vx~}nW8}q2eA~=oo65Z?9c#`Jb)0aZ5+R15M04$HrWI;)^t@VaaFBl zsKpawJR!SCZe%t}M8huN&5<^z&>L)5{iL1}-y8W7#&(>7g;#bWGV|nbylLndg9$Hk{AkfdZ%Zo#F~o1y z5H<z>ax&rf@d@Hh>G-Oq4gStPK-!oJ>(@0kv*hJ+G1857{!8;#8UQki#0fRnT^rwzOcoa~ytcccuSH-z7We=7?-lYEX>(S0XxGH_2gV7pIY0PyT zgcxb8@a!eb1mf=5?P(+n;y^$0H;C$^`ge49cH*Xc%N5EWSFcQUAA6ej+{_06{Cy3v z)~bUwdd}dTf$9s=&sKJKZ!;a8({G=r)E~l^qgPkB33%lv`|V2n1u-Y07BEFV=eXz8 z(BRo&aAOi9`;cR_<^J?>KCBCbm3D^SBX5+H!@r?{IX`|HM3wwtyZtY;F@1I_#XfY( z;ziv<1GU0~XiaLPjM?Owpd>HYLtMj(9U_EBQN!xm$zqE=1#^=eIdjL@@iqXs_d0tU znNN4_N048Bxk(-1>qZd>HVkfj`MqpmfISjFjT z?tbO~jO^!XxpsVRm<6FM%B0*-8TKH(_`8ym0M;%07Ns!=Y~EqXtB`-czysuO z5>CQ#3;6JsX(10Cg3t7zl(V?l7CTOg6D7iY`bVk5CZq z{Zf!pM`bIH;L<=2`db0$*ZH!ez_k5|1*-}mPj0pc0TkAm_Qt8N76_$NXDdBgPO?nQ@%B0aHoJQU_K$IBF zM$qhhG0)HYW#MR`%55dB@ei;a7<&vX_ZN2wL1Zl?kVuY(kJ!X$oh4=X)^L-PaVypTOKEoBo$I3 zzF(=jdjyAuSOiD6!mM25Zp&Zh-or@{+Y{84ZvDy1Qunrsm9vk4(HTrQDKdXXg~yYI zexDVBz>CR4RpmL6zPeBAPGg(Mz+_E#e(`Pz3l?x09lak}<1;$t!|!F(Pmt3msQQF~ z&4cVA%G4-yeg$ilrsqCMIo@{2Q?3E0D zCu00q;!kr++kPX6HDJ9pyIJV{u`!P0mWg7L)jl;Mmq7+T6WeVQ+nh3D zVt~pnFT6y)D2^5h@Z%ufp`SjktO%G1djYz>|4|2=IzUu?6LlGG2vMx4yP?3_w2Q#&vEeFF>(`(ZC+fJ0d|D!4iXevuiRc6%Cr*40te!ovhTM*&yO^$^s zf{Ovq(S%i$hHv6@?7c-Fn?7`Lhz3tZ;C^=8%Asmw59uI5;H@wBTYJ778J*v%!s(Q; zteuSj%>a75ibz7bD@3Wdw9#4<`$09jD}M}(;=B$~lUR1Hq_csdq-^rWuACSUavYXB z#u6#Zf+*Z{2uwBZCD|(AHn%u@hCwV6_OpX(>MDQIw_s8~*gXaq%4+kSbb~FUzvvC2 zHqd!H$V<+~k>WYUD4j;fQ26kPHnY^#0I>_t+GP9SQAC(yPRm~U_6x2GN;APH(NG>Z z-7lKO)a0|7V8id0F1Wx+kYv&SQBMZ+B&HL`83IVCQ>A35)FiZ!F|@>^`eeD69q9Q1cP`KaNp&P4uPEnu!qBOn`gGMx4aVS zmCwW&@t>Mt9-e{^56(`-31R7Mw&5S|s+OcM$7<#D85NS^=$)B@hs^003u{+zu;=K* zZE!8k>9mo*f9aPum}Kz6M_nQ<`31_R_kjW8AHP(TdizlWCv3J6u^dOER4^TogyiSo zaN74uLLmV;j#IWs_H4#7_D_t&@Kh3U0Fp+^XFp@YOjjLo!)~+@-%imb?gIgF74$U? z7vBuoJ@hcz71ew`6r;1v_6O6b{A%_$=sh>S1NhgvmcED=s5>&21jjb{h8)P{7Pcec zU34~})1%2z2rQhOU`mSlx8XaV1N8Vg4>x6qSZMI@)W?{Q)f0lnZYSS!EAU+x85Y^9Z$6jhmA4v}eBnco< zf$pd8S9j~x$FSIO^oi3tp<|lnsHt&hE$o8C`Qy&jSF{rIMo7#k{Gj0vTPISWzxyFo=u}MUrg111&pNyE~Jbp? zdVWM%8|R?U5X<|d15Y>)LxpZ+8zZ3>%KZ*uc>hPsmm&fBRMjB-<-hWlmkP0V#VpP)nMm(Tyeh*k4RxjS(C50~Fy6 zGIG!QTirUm0SN|;OTLSD_B18yFgkTsa~!Ba!@3~Mu7H#k815a;un9tPz4OxCVsYla z{0ORV^PHP$Py&D2%k;_26>V>YaZ zx#<%mgys0(zJA#i|HmJsiUg>6U=?&D*Z-oXK-|2F;Kx~*AWE6;1IzW5 ztY!QT1RUl!i7DM0p?h9O`Q%jO>un$)3?6vKX&cmXP`;t^`o!K|44VXS*BpHU`-lK6 z|AJJ`3KxZ5YN#5Ru@v~a=aJK*t^+vM+h6fWWHD8VTcB>+E=C~Kmy0N5g~1+n#Y6T) zO~uS>fhU6?qt`;AI$|TM)2<~}$gjUl*VX9H9t@srF921|UTq4v|ENO_-&}2PPrjik zAPnY4cL^X}4M|Z$YGni$p%npJg5C%{f_uITYVIopyv>ZeubIL!$-iU7s$8}bP<+O9=H6~@pPgRB&9%uOj0miT|xv=u~H;yxaEVcv8N8t**O}l z{+ZDY5*t=^lhhbBkH4_hWB-Wp5yU#hLfJ4U6MK0zlWI<8_2up31j4EMGw`SE(Vkqu zS#9fXlLTuP{Fh0<&wf3`>#TczMp8OjhD1X29KI3Rb?D@nwIp0?$djdi2+Q6f%n{Pu zI*oF+YL@$2RPeMlbvWyXH*RnT{4?}%@St7B_l$n^sWZjy;&gE$N5-DzcO3Yaw@}0l zQub3p$M)b=^#^^Gcx9%QZTjA$kJZ9Xd^RHkzaH4XenLbMpF&?!#v^c>K!!E2bRl~7$?~BQT&BcTwmCX#$nq(b8(_yEV;BHEozlk51ASr*W=+j+ zoerb_b?z18rAT6`@nJg5WnlGy6+Q?y+Al*8dlmSXSH6pxoY#H(RP_Mw#|k!Zp@|1O zAch^jihs7V>eY6qHbuNw!~-uRm66GzB*L4nW-aB3x61vbO9_IK{(NUU*#a3TCRfIH zn=LafHQ)++#{sg+8W*g^TTX(#9bjJdzp%kV`HJ>EdBu%}6(H7Mh#jZNWY00Nv315Gl1Q&7KtmL&e?%uDy| zyH4}=q~DO$knUyO`jo%}Co=2}<>~xZNpf^eYumfn#c9lpm9v@49)W*+w2*_`T>(y; z`)3MBJc?GVrQ^5v+u5Bc$O@DM=%sftJEXlGRO4$%a&5k ziJ*P2aSjld6_?{i84=^D(8S9EFjaFY?*1Tg>D);%sImFu-&T>53T9|0RJQr?XpQFM zQ}f)u#)QBS>RN~-2UwP+MJAa~;mPmoBW20^J4WpH($Ir0G2V6LL3-pkG9#Vaz4gG= z!H*z=au9B5e6q`-f0q|hvsl_&qs0NI`p7d*;KMt-$BwpkwHdzb`fAGp3BDB&ZAJKe zDd@M6Otp*}d(?;L*-6E549pURk@+I0&Fb<>d0YEI;B*c9!;g$D2=V-+pisF(9VyUTYJ#@MCL10B{-Q6PUVEI1`3J@3j>xA>dt<~?rGj{0y>FYI!Fm2BW6w{= zOnCx*t6pIJ(;Dl!Lkg?r8`vj&ev?C#|4LJIXD|;@Voc&g`$S#2`&;4AH7B9{cUEM$ zS(74>m@YTPLYkaaIdV-%c*7jlh<7CWJ|#W=zV0C6>3@K60!Hi@C~AK&B{5i$6?WUG zm4#l58$S@hCNtfG!(@IEYa?wTJoVUQuyju?lhTSp&>@f?F&GQY`2O*CFb(k9Oek8sI{8lcX`Q7b6iC^}ni3zg_c_|R42 z@Ou-5i1m0i&*RzNqVE$|_S-&@V->DARXfPC;XVnja&5|t7kO%*-}fN7FI9>_$zXh9 zD3jJLeX1kAA&zB3;&;)qiEtcyM{$Y`Qt)Ataa`qhv)#MUTeZlvP^m|n?gb}{6IVnz z`gFja(do-c994Gbez7lVU+1^oUuq1C$T0HZPcaT^RvLGjp;>YKH_ZFsbg94y^n z3-Leu$N+v^7J=dxN{na(CXITS4YIKtnjo)zfCd-HHYAVOZw?P553x^e%p#|#q#sc%uf&Oo9a+RZ2z%r4z8v+4{8-G%jG08E#E}8u{>QQ#aT>#2Yqkbeb~Ap2*8J zvujfKo*ge2(@z*fm?6f|cnZ6&Gt!3~WxV|b4eppdMzVn;VebYN37*yjEp|_8XPdh7W<#Aoso>Ud?K$ z=N4r+hJL7Djeo|TZht|h#*KppEIyxt+P)3xaN^_(K*zuk7i46>c^!Sm_GkPC{~|l>2zX<|pgRxiKXvBX zcZ0?;I*mV%e(tvUHg8K>&`Q$yZb0(R?9ptNvJ`4mxl}n3UUF6BMfwQRjD{TXAHscn zjseDQMgsXRK>}FbSDd}neJpz$uXK-tFgU(n>EN!(uC2WqPac-s_LXXuKx*{5t;xVp zl4m+Bsx-n;9hXx;-eSeGyZ|B=A+}+6W3&0Yx(y9fXE)~LW3y>v>$2p)wb{<)rXaYS zoZ=$%nFfrh_J}x<7nxZ5bXouL~+^KW7zj>P1{w9Y-=m5-%3eqX7i^St8l@=Mb1liM@6Dh%0KnX z-Mi1MQsNyIf!hl_eIESuv^Wq`^z~y%INR3{Untp z)RV2?Q@g4L$}=p`UaVjo*C`G60**1$7)~@Q{Si0cH1$SSi>!9IOVFdwMEMV=@hxV! zjb~elm8JU&IEV{3-d}+BbU>Gvm%W1+{Bpx717;;4c}x(}=@0Z4FB0J*!fdK@0U#P2 z6}4tV4njR11-PexQyNrWJZ`C)KP=D68J^PtT-3nmGU{njXi=}LL3e18WiR0PZVx2G zQKgRduJp*d`3ZmgN90cge>~YyJ=VcCb+h|nL@?j*+ZQkHJ^@p|9sc&pqj>iNLjl1`FQ?^8R>E{8Y#31o|=?ku8LN@MZ?WVpnzQTe=%5f;)c{;n9`rG}fVZR%Md&hx z@A*9<|C=`-|Wd;=|!CRBjf3LM@EQ zT7;ak-KNfr)t?z^2n1J<6{IaZ9uBBdEU1{n2qeBWjfDOum-n|jb6@jezMxw4%229y zQ)8!pAGr8bvvY6K=+=wNQn>iexbgvRSxj>=QK=Mmb<`#e{(E=Gl6VoqzM1=w!?vQ^Pm)J)SL{b5nCeHC+O$= zPeK%eNb^wT06#R?>+-9vE}xTNKu(MS^sZ76Wn-^A`?h|PRJm<&anUy&H}lyd%F?M3 zK@~K+{ov;JXW5m7Mua-X_heK#HpK#As7zr2rcaiNskFB3gb}j56cj-WG7f58mMa8iB}4vs;$4Vy|`X_c(7%!;j~KkT|Pm+jq&) z7o+`Ffc2Ffuu&bIxTfZAk0w6(+Od)!prOo7>OhU19SFk^4d=k@uaId6JyMJ_e#lXT*&!AWb3qJkvtK`ImZnx#5_+kKI$k@{(QG+EU zNhQXJ*yvmq2@`0oRXPNB#5+7c%uW9(#cPq#0)&;>+!AJXTQ6SE#A+meW?q7xoy` z0`nLtD3MV*v5eS^+xEWBfI_1z#do2IVIUM+bx(sX>h6J%M8*<)!p#qD5ZTd4+ z;h0`kc&-N=kot-VmcdSG2yP$L9d;+L{RDJi>xs;T&(Nmb>xfckbEV32=Xw2t|HWhH~ zXRwJJ_4ALjO4h{{;(B`@P|=!@NS-T%H#S+M(W|oNs2PI{UIC)HCp9iE7`|!_ZAS*M zmbWEQSRd)-16uVxX&Y0}g>KQI84byCH~Pn3$vxE!mxY$8pfQR-Ct+eLd6$~(DQiGx z!L`nInixih4VQj1<7*>=0iZbGLVdhFyV6!|Okk<3EQJJqezLh_+w}lvn|onHXAf~N<<9cp zJbylI4GgpvGXX1=zis;}*){;5W2V=GR;I8kBiDvriWysR#v~)_4bqir%(+^-A<)(u zjg)6G1sV%4JXtA_u$qm8B<0`-uxkU2@fdR$F4dVSS2l%bzTJBq!#r7&4aJNr?Q|P? z+>l03a5m5Okomq4&8}$7`&+mMEYm-b0C(K<+C&7r*k}%+tRUvcbLo&DZ7v7ltL-sc zzF8MN#4IbnS(T*1ECPb6iK@sTk2A(PdPG^B(xxY7`(QadrzFI2SzN!9%5MW0-k^rO zee5GNol547twaQXHygLkSMlOXzlEb@xG?jal&s?K;_9ho2$@VRIxP&3bL3-Eq714Y zZybpgaKAasOp%Oa4!K{~8X^-!)9Wa2{^RU|y&pP_ukwLVhno7tPjFkYsXx8sG1%dj z{kCT{%X^I4uE1K*xG}HSBa;~BAOeL1Er!ok5Iebk(bTB&^m)j7z~?FEXLar&3?x4M z#Eqf7GNF^xOmowxt&1LpH)p`lvbChYemaE2X#%TsN?8msH{vt#Gz$cyrd)6YVII|k->CEK=5%F z9s+0@4PiIer>}>wm1yQ_-YCHS(Cl`%4lg3XQpqmpsySTcci$#SZFeTC zi=p~I62HNpL&j8hTRvY)g+PX;jWfETQZEAnkpqcz=ojowqkg>}f-2SHorEdKM_Bz9 z{X{zv29322ic3f8Zea0#%}AoDYik?fcDU@%~Uz7~EeTkLxH?A880 zn3q&8vAJ1rGI39Ez+53iE~WLeUqhtxj(#fSsG1%_5+&O`NB|H3>TYWQJ>p^9K3Q@k zTDzP~SmIhDo;0EA#*{i&q)ec#xWEX@pCRM4i^vwfu+H+_D8qE=bh*UPi!M& zbm@r8W1)!a;|uA*5HPo|mnVM0Ws+z4lt!FI+LPFncI2WWOnL*N=+&Vh743lWO*nse zmYE!EVi4bCgEUV6eV>=nJ~on(aym3qiR`7PnKRpH{Z^xZv)aW6z~k3V_PPw{a&>(# zMDp=DwhRV5flrE3!AbU71F=n%B)qRvP#=KVae z|Bt7yj*IH~{=OT)(hVzJ64D_pEFDr}(6E5CbobH{5(Xd*(k4_bnJ3tbj}&@i?Xx2?muS}t~{@%Yo$K?flyMT!KT*F7vB zxA+somm%Xk#KIrT^(?wtE+_j1I5}=$#O31eW=OZVfxpyvC|P5^V3PQxy|itp?ujoyVxCbUo`$~!m*o&b_3qn%E$nN4 zQXP$+VdQj_5pyB~m`j~2Cj9dc^(g<(78^G|WN3H9-Utv?uy8*YqiaEW}l*pM|tAgtHw?H1_ssmlP3d8TaNx|9*LL(2aas*;yNh`iP=f?+%3v!BJwmGq1xv^({xp&%f9 z8iF}8Eh!m8-4JXbtd;+dT8LrwzA${=Bidc(nL*;Z-|Ku@jBJtbyG$gw-8f*lCdA$2?LSqOsC z`cWB7T9nbO>fxv>flsQAHos4}w`Oj=a0$4&hc|y{5u_0_ulz&}u$3et48oN7|9x|x z8+#`{zZIA(EPDb3HwjgAMB3A&Jhio06s4jK-UP z#>xTuiquO%xvwNsTg^>|5zUvk-Y9r z0MFKfO5{&USm81Kz=1`eA}05KWw$kpg|jn5;@1q8T3s(MfHO3^+?Hy3P!vewm@$T$1v) zl2Be?SrRQMpTiuEn*UUArc?!ry|;5K&=CCL7YktXroMU;ApH3@oyz?q0{ZHr?*aX% zk9+N{&`SqudWjd-)GXw+u+J8A`h^+05(P!-wA2v3R5o{@7x9R_A&NI4YSh4tCXmSw z-Q*VbzDtlf60=;V%b?&fP0r6oBH{*DcIe$t#Ox=a-%+y=<8uHMz?Z~FsB|1v@Q$j| z)}83s(R}{QP+|PuHYOnXK#&GlUiW0+!|BVgdq6gnq>S%1(zBm#PKv!GeEN#>`*kAu z2UwB;ikOZ<9pC_7GOD0IuDRZ{x3&tqx`cnr6I}<6dwr^b9-P%(B?!o#5by|Id){kj zfFfH8xkuZ&t_fH%HhcknhRTJZ&4oF*&tto-= zQBXwP2WrfcKxZc;Uh)Q)5q5)*lU}dOI@+`iBg|Jg+o;3n0?AHYOg{Y}X#PX^Ccw%L zUg)OX0zT|<5F{6~lL7dsr)t~?cx>+Q_*s@W8v8hSM(Uj7GW}U(yo@9|>B`Ns7yI?Z$WKRn({@ z{F5c^EA$h3P-*nfb_#zsrga+82P+8pxEI8>%obVE@pN272N&%t#~21+bu42D()qL` zI7QgNcX2++G}DXoBvJ67qi>7tMhJg#{f#q=Bjxiss)DVeI|}nQ@11|No>qMC!Ttg7 z21wkdT?#uedSwuTH)(bz{;~A|EF!$bZLTw`8_yI zp^SLew-Rot9f5CbT=oLW`R#^6rLqT`X1qW(PpXQVvbB$O{s}jp`HPz}x!ctz#O<{;Q(t7c^I6%Gd$<3(=5P@>_=f$a-f_>a`;RvOLMtpl0}c3E+wM^1vA507 z?eE`jr2T@u#S7;=#!up7PvAYJ1cG$NDcjI@eIqUqQt}l$d(~OP4K({MV=doPhoa?` zHmOVgIha2Yx?f>A!ks+byJdim4pQ+PgguYzJ)@m2CikvF=w-U&uCUXv@GBzqvIO7jbm%stFr~3dW#Zu zCK`owi;t)B2K^As)oI|dpXQkgzW&<(kOV!(^Us8-9I)tXN#M_y+y>cM8kLbJKdf#+ z9s!RMYj_!d1<8fayy5A$RB;cGPl`AD(2CoTFb=7$9w#qm@C~_-EssfMup6psD$Ppl zA>9#doYTnRQ#jhrrTFXTCAi3g{-ls@d8VWq+O4DWiWuka)c1IZA29t1kmf>(>B4?s zBXjme5BsN=Vl_CG$KhFXIMr3K<1nV>&JsEhy zaz^*Usrn2}ERdVn=uqr@!F@(2#}StH>MvElZ$MVVcgmKg)5hE?htIS0V4=?T_9!*6 zbs{7@{3xD~FKf||2hlutvXFXYu>iz-*h|#eT*TNsg4y4aAAz8y+j<@jcQ`E^SSjnt zrs?!wt~C76D|H%Xxoi&A1Ud|X-A38`F;2VH`b%x)IG@V7M8&*UPZV258K%D) zk9E#QLI?2N)8AE>IaFBa;-k_C(0B8813*(MxKqOKH>!ZsGkUfmFV|=xQeK+O6ezCs zmo7sxAs0emvz$QhsPD`9nx_8rvWr`xEi09x9uq@7&B3lmgy?5~M9%<0tHk``i0?*2 zne)dQg^CpZ3&AW3;1>w!hoPN5$6pm6zWVK@fw?}}O%ftna8DzNiLi_rqEz|>EWIRr z_Rb_hKxnu#O&HNn{*Em2x99Tnpf|U^wGviRumnD|j0DTlgSNyt+!7SJ?>=d)Y;-=z zxGBrg>A7XDAXiv4q<6&6TLMK7;Ig#fJY=q^_;T#)A6iFAu}4SyPCnQ_Jmr)Db>MoE za68A+L=#+o2LWIp)g4|%YlKU{N0y*ge#SH_8gFbyc&o_2wDr2aaxX!^?VXPjxMW6z zGQV5Syp`Z^poDBE)8_tZYs|5PB%=W~{-ovL0XBVh2dUi-4 zwm!-(%~pZ^8UgZ=R$_P_@M@|J4M$Lx6ntGU^x&<%6ZM5U&m(l@2~r2`39hwu*&|q# z#>{$1;dK-9RvtVoK}%mJ-H1bI{Y4_i|NO)*zpu#8!(ep(Zf}k_I~@OBg5lF*QJOUw zg>oAq_Rru<2@$-6bxO}aX78!+#qui3pL#t9&3uHTgM{)vy3q|DNqL$bWh7#BpL9!^ zX$KvZpY{H?q@y`Lm$;r;9pVW9F&`cvkFiN%O97w)Pv%8qdW2Wb?=aT{cPAbOoa9o<-mq^?Cv0od&+SF4)rI&o%=|=d@mR>w&@oGQsz&ESMtkOIhk)Dm91_d|O0J9+*t2^JIs5ZEGXERN z>cdslgj<18qvD1#LfY@I*lTWhA1kaex)%@{E~bQE|4K?Q)*;F~(7-b55#vZC? zzMAzqzfSUQcCofcqj!~zJ&O<>*6RK-SsgMI9fGkDb8s4EB7XLwm&gfFb%v_; z!Ihc-baw#}2|xr8ZRUUkx`Q)=FK}btdGh8{X!6usP?=BfYM4Q0p?VgnKYm}erv!I| z8r-W=-7)Iir=2hQrbV}lcO?c&$WU094~>bjz{LY_0bFl9j8Z4ApGA6IGFva=9@pkf zZ!AuFOdid{p|?15&%n^EZr=>~Z>3k!?q;`9$r>TSb+mr>0ofohcJjaJFPI~7f%1=L zIu8o1;oyYeO&V+C71R#W>sh_>r}+G*9~PDw2Siw-I+3}@mN-TncH&V_vlJEaZzeWn z2b{X?Cz_C7#NS@Th@HABME?gjVCde z=dTx@SHfDf0Va=IvLT*LJ)!-gH+Iv;qqf4?;Z4E!=flGT+Hn1r@cnL9NEjaQuo_MVq$%+pKmL|OBA=o|6ym3!i!1qBIk9uQuKRUfB+tXirV3fzH}N95X6F3Ef`a>$BcIfHR&>>C%q*LT z&|Pn#*Tc)ljt5>(ofIYlmI7eQ@d+{eqeowP_d8{Iz;S=?Fj_f{mCiPdDgh zyCr=!OAL@U5k(V++R0m_G3Pd#D3}l$i(>VV=<-(&f>QvqqfENYr>UpK`E(tHl8Xah z*rqjZOGoDwZYrwzrF(rc--C%hZG$-THCrdqHPnW_DIlh5nO?u3 z^MjlCrFV=tRg~jA_P)&%{M@CXKu1}lUOD&esZTA^5)RpxKd)21yXKmP+ue7IHB2zx zC#SORA=fAcJkbHxpA&)8=5#174o(#w+E%dko2q+sl=>xxIXYs@QtkOH<>GPFBZvH1 zPOvM6|9H1s7Z8puUrgid(38#nYB@*sE$%k~Dh#Edpl}ytpq(uEiKct76=`%`1gGn% zWu4x3f?Tqix>6)&h6p}t{_GlB@$}zEw{#4f4VE(HZ)?`3>`v&Juo^tUZ%+3Bd|{psl+K z)&*h(u{;C62b_NANetu9{V<(M}j(2(Qjxt!5?zI)UC@6G7FlEgj+PZJ{OB
      RxP(Dh*1J*Lo8qkFkiORJHi-G)12;rZM)s#nG^$>^+o&^P%fQd5F@OR|z1??Hefs z>!ejs2!!yE5q5}fA#E) zNQ+K16LPN77wJL5!!BneY3gm)i%);xQ%ob6zNfXK@nuZkLM`?N6zx12)@ z(|UH zfZW_vh+&j*mYe)i*7O{yu#kM?M)v8mma0Uqh%cxf>%!rZrc~-;zW5Sz!?vc;@L;#2 zm-zq?cSA)vZaP`D-1QWNr}y7}eC2^pg!k?~K4d@ur_Z60Hqt8Rjns(kyDx4cw}?1j zec`^ydyi41X(mCr56P{BIDUqNp+3uS8~U|Hj5Y2@8$MWx8Knhw+BJ{>c8m%FwKFURn0Zsw$LVh5z;`w6CQ`RfPlAzpt1Y!wH(0ND&r_+21e8cYS92WA9X}!F zsDsP-p#1R+J+RX%qxhGWo*mF8h2X-kiZgA!eJ>nd3F3s`w=SGu%hYB$skhmCD)cfJ zI;KhUN~>=Ke;uA)T%pa8&~;ZjOeuWp-7B`DH#?-jN&Elu7b0~1Bm;}J;vYH_mn+g| zL{#c-$Xs3&Uc|yvM?xC`J0k%h|5#L?E3U(9QsSuxb6NCu`&RiS_rMrA%KuUYQ9%B# zwNTR6?~QNW9tOgVLT*otY2GR-A{(Hs0bJ)nTpCTd+70 zO4a1^Q!OhkqjEVL)P?E)vZPtTrhh%5#Dd*SNsMs!Ph6ha`jFwE_;26AGWU zH7l&~{v}bcHbu+Js(1OOE^?x(Dpz34HD?$I1wtvzXR=I9-LDA}(Bkp;oK6W&HvFvX zYx9;+m_cDjqV5*PzE4n?rkuN_{Gj`EMYF{*7BOt_v|PBa+23YD9@yap{g-KAJD6Y| zc~xY-^vs_xHVfygK(Zv037fq3XO+qvQF|w4FUBmTUasHzD{)EuW|0{|!nf}|7O+~Jb-=fD3)HO06|EP&V06O!1;N%=-dxAt9!5|x_dL={ZcN&5 z6X>SR@^;)Ow`$ABzPboqBl~$q&Mrh18xx8^KVSRUfDz!KhUqSs zEtW=36&echReTCLIIJMoU-o|>UVGR^2kJ_a?k%fdm}*=y4SqWW9m15Yn90mGp0x>b z&2G~GEnAI11JH0x0tAuCpyoE&im15!^e~cOFfNEn@g;n?P9;E2pJ9pZqXz?p9ebkh zGHB^nJWjE9Mw)Db@;n|Uu&}3jm?&>;PtRqe^82FC-0@FILg1I8ZF}?ZJox|9X96Yy zQ6smjXjOWLN5TTbQ7pFQjtn#4GM77-i%_AL^e7>`hd!e$RpD{3Ay3pe2DnLY7cqsX z#k1_b!G#Q0>!_Hwo4aRaKg(`s+$Gw_{P{}0u{UUBiVy7g@dNxoRi`fba%OtM^@*oS zg$P#y1#3)H2X{&@YFjwn_Ks~~zs;s^qb@#yIJ@Z41$jP?_v8HOEg^t32iG&}kEF}( z{h7=vQ4?5UV+X2Drl0(pa{53Nm@p?q5F(snnzMV>Ya!}%I0)ZOha>%WR(a!7dEbsG zOJroXAMWlrs_-&yZ1`&!rOhG}7!5hx7M?W?d+?WX-eE|_ZSIs^H<6xw4?9cMJJSQ6 zbZP8xHJ2>8${P62`mZBieZ-V5Nf`x)&r8 z@QPa+?uGNx2?-i0t9_9uMqEtTI0nb=r}6{hrqgB50hy)dcuMm9At)m?@L~$Q=LvBe zys5~3MeiPUbG-e=W}N&4Sh2_CzJB;6G~b!IN0QVcXPvsa9J6&^?f*PYT^7b$hRiM_ zRP#s~owibW>;^6;dp{1yma1c_*v~Tz3UXJTu1J;$c3fWE91?_oFu5Kxsyel4mv->y z2jnIGwlVp_Xu6x~mTe@?h>zkIhE_&&uYSpHE5F%|I-^4gB*?ARB$HC2GB z18$svWLVoYv$1>?qY#)1Z=vg_yzJ`(4#&7#;BfmpN0$`$NO``oCsVW-D5bC+=wxB) zpj_ddh-m9vz16Z{#Y9Aak*$`mqAvpqPbY#EFywbUq|NjTnV(Ss$j>n4i7q~|YR*V^G=ENA|4>j$<~_gbv#|v^KiS9WNr7&V?`8 z-sP4mi6BZ_TJ-q@T3=kLJ2#rL{Aj+;!QyRIeF0Ey!eS5@x?}Gr*5t!Iy4b3m5}5>A zLp-Bhk4{2#8rGj@ajmy8Aoas!42gk4HZgr2<^pj@oWlcXtGW=l1|!DBxuQnqRDR$tAX!pS^_pmw<_>_OPE z{f-^|rJgC_nsVYA{vjf{OYEER|Gfn$dt&z%9M7V+)-A@*3*IAC4kbD{bxEFdP zmgo2ikVVQ~b@OE@OE{%aH06#JRFvqA)nd3H|Mc+Zmda~mp-$52T&k8?hgzIGoV>=+ zSKuvG`_0zm(;UHF?vgZ(Fry04sLknlKr)Ozask5^M!VOdv%2`!0vF;QA*?gbm#k4+ zh@anM;&YT0g<0Ih@B=rL2?r`)ZV3X(5r5~DXcBQ1M` z#0=*WmwEqqh*`-vqh#?&jMWwbaL`KeP-6f)F8ly&-Ep@y5eO5MOf%&lMM;b(3#dOb$cHx=;4oMgZ&2a4#G?-SjXhmelx1e99e_q(im*>S zU}i@P#!%zSVk{hwqnZ2PK0WKzay^f>vY9t{_M1#Lq$_PDx) z7`JuM``uHfuZFIYbmEqIxC`pGAJ{)CxQGd{vdl2%{!{~)^f~sDLrWx9te4&i1k7f1 z(lB1IZ#RE7HUQaAAVrLAWe>7Pgg>pg5G3R=X4s(_P#L~FYMdq^LzB*o7nUn zoQh0yRn)vz1Xqc#E2$b*Q2xJyUj7qw9-4P6?l3#`_U+i$a@05}4u$N9Y%nkI^>XU> zbt8)VU{Nn7EMJnu>N9N~4d?GGK!ndi?A#SkZFo{RP3wpnJU^!8ScR0mv zll?(P*8T+7#w)NO&hCnzC9Bk!VX0_@UNcsDlcB0q*EJu79jS9r^$9z2p`~${G_HBZ zHsahMh_fyz#^^WO#5z#^D1A)KMj;e5tpZNu3cWUB$PF4Tn5z8Y^sPU*@QTK0E7h!V z1YDv~h|3o1&yo>3q=2LbB|e2p>L-hmBTL2cJ}lq>FPB`=>}XZ3+HcC~sgHj+0X`NS zqZxOdYGMI9eS+16{v=0%r0|w%!ZTL}y!Jm95VT%lx8*p#JsVoDQ>Kj!u}q#f11N7R z3Juj&j_?Rg_xVT|)*tg611oyTuJWQ%7yK2>C3mjJiG}tPZvk-#L57U6e!a(tXv=zD z?h}BL_UWMwYx-NQ^y6mY;tvkBcb&ffBtT#z>{&nXL2HmB*tm{cV-9f$)O}Y-enQ?i zf#}8c6#+d_A$yGXsajW^qg1W7qOewPbV)p29K!}X zTMnpBc%gUp|T3{ra~E2i1GOJuaJTm3!Jd`aaBrCm%=Z07ljWczZ>_5Y|n*SQfiB! zoA4KWbTUE>Hauv+LjKNWiGT!J0qu1#vvJfE zn_yOo9W2CrzlWpmsJGQ_hkYs7jWy?Z1bJI@H*SaFGv+x4mq-_e%EGNTj3Gvh6^qnT zh`~K`8r#ZxTtS5?=})7Ro2%rnOLL>dNMJwe`gFN*5WxfQGDN7H)lkZ zPTRM+3e*a!=%!x)JWw%m{qM4tE2LVc+5+h4^*gj@>(<4{&w}?d26=lFhx^1%DpHHXmcs$~$|Cu7s~kcC-({BIS2vQh$D2I=>uZ7gXr^ERoE#^{ zo4dk5od))M$hPZWE6%&oqYWZ>x0M!v=kj>Sy1TS4>2Y#{D!IgELXmsbqaVC5l1#&3 zwO0_9OsqL#Xh7yiDwqqI+ehWE7oI@5n?x|9LpVCjxls)=R6N?YB99QS7M|T$$QmzY za#2EAN_zOd=NF-$MvZQR!p*;naE->!WrI~i`SygU1^k~uM(I@^mPyQ0TZF|64o`7a_t&4f&pg4`*i>40%HRnuYDX z8KBS&tAo$)jrWO0A7215BI>ims=gBysnSeZ?~4f$IuS;d5uiNJh_i!{-TR2hwkLN8 znehRffYj6A-x7qjUYR%!WP>jY)Zf) zU`o^YvUTttDU=}zOsbS(D*z(`$IBiV!gr`YR#p!Mix8>pgWwjGQ;%~=bs7G-Ivxl; zaM5mZ-qvZ-D3ZW7Z+}OBnRFx!qX*T9mtMC*V6U&!aS97{Y*px}Ruz9SIPX+4JLYQ4 zQu&pJYtj9ucx9;HRxw-fO+GmSr}1mO?4Zchg;eX_wsmodHE&n_7&Ur3dr8&@Db=|wJ}f87l+4UNsF?F1x-7{dV2ZB z&@b;a`#s&w_V4?~KXUaakd_FN@jh6z+6RL4$^5LZ-F0%La4(U00sC)hw=dYfGZmsc zZ_8!lMAz}XIf|kghW^^Z69cih+%fX97MzXJj-FMSA^jkh_EJ3G^+NPubolj8o}y6= zGP5)SPIH_PX%IhO*g@UnL5zzsYOuyp`VhV(`G~Gi_F!UWR=2_4 z1fOk2JM_JAah`h!6>w?y3Z1mdyq2_OcRew(s_p9c?WdqsryS7zQ>tpF$z1&0N-mf1 zTYspJ&dYUjb;|KK8m~E8)jFDL7)`MyjZ?EW9YaY0vkxf45c z?6Z*WRh7W*=Z$#4?;)~O!25^cuL|MIt^2IKw|gwpdEaGeeq7c0^1Ux|^?m!wPT1>| zNdB`=vr8&$Rd<;*2reVVPCsn)uiXqvluUK312pfCxp2BH7BAl5K6kEMYp(YC#$rZo z2@k)sWo$!0gxQxJe5%?hdU$70ky~FQ(fF$@sS^1otH4@)u|y4dI^cSSV^5_VEpcOO zkwSa57H@cw4F1*rWSxM_F|V>w=7y7xpgja3OhNYbu^E^fSU=@L{&-Dhdnn4Cp-+Ch z2O7_)?m+9-Z^kOJ8>$Rk7RmHdZ|BH+5`DJ${=u+sCI&X@4EpIR#*&KbJWrDM!J=R2 zf`5?==F#Fp2SMOi=Df`WItvJKQSVvTjqkG<;IJ4{fZwUj9W6;pa{||Qh?^c`?BpZ{ z|4|DF2FydY=gBt3l}xM2&R5gAD6G1<->Q5~Qi907K-oAKbf~|pCfm}c1XdLRv5EpQ z+BCXf2B+7}9q|Bj+x`B7cVNuOJb4R2P+z=Z4GG#)f_(WRm)?O*GNS(djjoqN%|M9t zi-C+q=>TUkyD{^|xysPFj{f6vose#QMHVsn&B-_T zc3^3_-C1%sF~MDJ|Ezno33QwVOr3zfRu1?CuD_TKo!9QJxG(1K_DsY?2~DApI$+zV z%0Crff1VwCtoJ>$;d0{jfc|FjT;;w%aN;v5qj!6%5vB~ZKxhVTw^V4@aqRd((tq{_ zP*)EmDM17!VIdF#{HM>0u86^TUwp_PrEuP5Tdgx|c&U$^EVhf)NL1mTJ?68YFg&fj zh&R7`x(=NB(Os_IK2Geq%nVjBKg`9twKP!E72+LT+BnDnEV=C|Y$Lhb;$UnoGj3cc z5%n$HC_SjcIrhq~$)%L#$ zNzn)Gfm68kskqiK>CJ)e51e^q_l}w@3S8m}s>SZ*+O?|KB#xm33Mqu1(4fo&wHda` z6&c#VNtFbb2V$qUhrywz5;re8*5xhwW+JFgedZvKjK`5$FC>$i_STYVPYyk4A2^lX zf8q57JbKBIdw&8+YxT$>A@KU6u*-{EQlDUZ!r(6d*gHZi)&?E+yR`4I?YpjwFc;p0 z1CQ&UrQYti@K|6&fMDihTT@ZaItkn!?cVEbh{1QViYFD39r+1${OEN_kUgx05*!i~ zc=TH*V`|M+SAMUc)1oin3R|usPk5=Vc$719!eaL8(GCY}rBCQn*eX7?q^TEdf>v@w zR31E7Aj@e#bKClxbvxu!4mi=oV$>9iXttJnubp)HXLeO1TS3* zCRnmEwF6}WjNKH5hIegnh?f@P~u$l zec{m5DU+pU67bYbIN2#77>gRRy$Pg!Sbu{O!PPD!S5EcX@cHo?!Od^E5&YC*cvbBb z=CiVv5_7HFI+aXx=|&F*$Zqhk*eN+cBm+w!s9yn=bkErfC!VU0q?)C(m+v!9 z%N7_#=+g?WLmIu}4ZOXB^R1hD0xW!l962DkbRiinhuFd|-RcUr2@QA~U_#8oplTO? zU`0J~_Tpj=k4FlE; z9ac&FByRXA`S%0rjV#AW{Z0v$urL|eE8<_P3>aPBcAZ{LxS7oLpHG_pYrs7qt-Vll9h=MI1c@Xg;lc3@sJ}k>90E;5h4%xel87Z53JV`Jvt2MIr>xMnbZ)3%b0Q)r8 zv%sTB(qN7?sUosbqa#TN&J|b7VX3hf6JES!H#~#*8j;C&qt>Ju~wl^SQJ% zo~oVL+iM#ERfXJT%pSAgWTvPSZ|7l{b=HNXgu5%{NkrfPwfkyvist*&Q>5Wj%XSvB zy}hHkyZ3LOHoMB3ll=v&(FNoZ-z_n-)W+PYec9%H85nS`Gf>yTA9l*7{`n8j?gh&i zgXO-D*p4^JQh@YcO6uM%lo(B@rC7@jodxAL+`p0 zr(P(+RaAoU1v9hgvRocPy>^mBX#f~fE9;gP1MVALFilSWK=k9KGrI&I*MF?skogha zO_u*vG#Y$6GbE#Ud_%>z6T&i2hc?7nZDqq>Xw`+T#%fY5g3^_cM2DVKT0tQ~Yv0e* z%cigh3&r2FCt|4n!UG-S=E*0>CH3}{(z~He_qvw?Zk|&=R0|~?YxY(L21&T&yxQ0Kw4B%E$Lk*RodZd{2$s=8;4hm$8%UqUX6%g~uNruAXAiu|rHM`}Yatwp4 z9~k~F1ZLEIlD%>po+2;UQ!QAF)9~%zA;l7pky}oTac6S0>;5iML7vPjdZf1HIKZm1 z`z~IT&H~NYF*+cU_1{t-lwXGs(cwAGc2$V39ojo?dRojXHO<2)Jy22c&a+TVny4b& z!Jov1w7lyY-!yVe-3_Hb?hSQmEnS{12t_jgTU^ciVlSBC_n?7>K?&LH6T5Grl*)T=FT50mB z$i5cZ`8M>gZGE^fFCkvQg!3%HLtWjH@qvin^!J-DX8}F(QWR?5S`P}EA*Vf%W}-=; z0ubHYAaO+}>E`aj1G#kg|JFRo-qE7(V$xC(&9)xCLh(ibqodJdpIO{a92U|6iy&&a zN3b6GYCgqp8OYTmb;IX(*5Whr@$>}o75*2RlH4dH2f>7_^bSSgs_Sc?jCt!0BbPFHf?hggA6y0N=vpu|EAr8GTCKEanGl5jC;3Tn-i9OoV)h0z%frl z)Lgb3AoA}OA4Fjj#;rSL!ceTHayg+n4^i&~EGd+mU&V*zGA|1mW;nBBytaS?(l7lk zT`R5Lz=X8VLp!5+U;X~cQ#^(!rN0VB>p|U<>baBpt;;5VM4>;7`h2zZf}n3hZB1sJ zm&|+u8T)j@UypICp~)bbZ6wa$gh<2xB1vuU07~qbSreO&f7ESO7%^vaPqww0S=ANM5KnP`?(J}VjDIG0WCYUVLSw3UI= z7C6d%u>^-k$4=yjNVn z*DN7CRiEwz4T|p|CFqHQ_N$G*K`ji}zp^BUMq!Wgwt=+|>&iwCrj&s*q;TFVV!H)< zBGl9!A#3KzkWijz1T%|vz4bIscC}d)ZX{M0*g0D0euG@VE2-@JjJ@T8P+OqleWdkr z6RzUM9NuS_o&1p@)Pcic5Pyn#n-l?sMg8D}nVlOW4FTx+j0`j+D(X}Y-!Rj-$yqe3 zWb5#frASEnyX(d(r~3OAIiFonJTcX~#QUf8T#J`7qC`qq@vz?v1_RM@==b0BedCh1 z#y9>9MA$dpJ>TI}H;wHU1JN`)pj$<4H=@GGBs~OIfvdNJl@8KaTq-QS$TjQU9Nx4O z?a6)?cPPB`_G25%G{R2aaH`o=`IguXT2@JN!xyB4`^`K(?AlY7$Ws$Vj%NuP*sjS? z7Drb+*Z>)lws$L&+6|}7r9{4FYRmU*&cqI6dGD~M9_^VhKw*flO`${ekne$VkA_#% z6D5xMX?gTd3LE zX{dyhmO-Q*5CH2EV3C5Xt0m2zyJWOvGI*t_`mlBoX2D49_gO%K3PuRe%4^oc{L)i+!If=3p=W68&wr-! z1z@RR}5Ku7eIs+lhEC}&>ngzkj=Fj?j6Ah~zj0Ch}rw6OjzpO0&o_KP7Gt%a$ahx7Wyv#ZA zTZtJCw^e8IJKbz(^ENJ5@TXm`0mnaxr4D&p6J4Pk-lH= z^(yj>%c&YkvNFJtjor7HFu4(sJU0?Ou=K9ubxOeBC_X&}kF|)b(v;3JrOC!)y@7A)AxDmoAU6JHx_Ek!G-AZdA%|DI1 zSLhgC^dyHQR)+?gPaWE^UGd)p!F%T;a&f#?T$}Gdl^N+@>gN@vONmxOPvZ~k17vwG z=+t0CDb=ssitY|t&)!5clD1~P-gvDK1mm5T5AS<<68L$9oqe>RZSJN7X~?UhNk=fd zkUvR>{NOGb<@sM{KXC+9Z@grGnu=2>Gk&s2)j&8WI1Gir6Af4yaEtxZPeKb9pHSbl zshan?i7kapzbNm_?!W5NIr#nO7V;1!eH8(y2Y8dJU$O^}gW4!0nLs}WRMkHi8piv_ ziVA=~kUc3f-hE_Zwi`V=e4_05J~R64iIe*m|9y+f^rADgPqUdsIHRl2MJDG64RrNB z5z%Td>evojI5y@KfY=W$w1dGx>o7?vjJJ~0Ei9|2u4PZzDI@9yy`M!cw@r=F@p`#M zHX zX0w%4rJK2;u>Q!kaZ-YhHOW0)v<(kMaSygzg2#6Yn}f7_m-ZH`o92e!du>XB;A_i( z(4yvPC$p=v7s}z46499N&8)!#AxpskTHo-$>^#DGb;I5{2>SGKJ=cUc;em9Nw6?;D zrV3!2Vz;G??0|#y14ay{o{JlRFX%nBe-?(MW%aXS;K*Yfa0)8V(=j~RyoP}DI>me) zAYGu^6Y{o&n_vsNz{L!Bypi1_7n0POg|xa@bsJ?Z~j^Jler4`kS@G027$ArPkO*{d7@rNzv2JX z-Jr*bS5%?YPh})|5Op=1T>fZ^{*}RB2ySLe@yj1g zq*?yJKG5mmNo1(JN}UzD0BJT*5D2j2c}F{u_e+oE&W7CJSe zlMe}MP9y%UNbBbiDJhMM=Xb~d%pg82o}Vhd7tx}~poo0bLibW>>IeaFq^PgqBGW;A zf{J44p!9@;p@|5x-csq=uW!)e;Mzm#o#K@RJF5=i%DuHZg5Ca)=mA#bv*+vP#OK;N ze`nhXgiVPe_SlDB@bfi?YdFZ5h^S^ix^a;mkCzGxz)&0%*rwMB@!yyUDsYR;@_9jrwOf(So4*?<9mb(NDgGU$ z;TzW1<9;`39I`x`JeXr4U?OCQ`8IVA$ykiN~e6wLfeI;mk@aQPw|4E z%Se6_GG0@!pbjm?UlEU^>cjbsKYYE_9mftBQGn8mbqx`71pCnpEV0Vc&5*+>j1Ywr zV3Tf7XEdeX&?$=Y3vYG^=OY<4LKtA1jMShAhc(SpWr12NmBpVnhJ;Jp3B(&^y4)qA z2#Q$jM(2mGv|h*?7B#UnNl+m!cL4{lfWSCiE9U{%Z?KkTG zRrZzvZA4wy=p+PpcXxM+YjH|(cPUQM;t<@eK#}4UDOQRX4Nh@~;;zLDrRdG`yzjk# z@Au_T{>+@2v-Ub?PbPb<-Aet@?WKhyCGhNXv^6b-LUzRODm5MOf9_ulc;yN0jr;Ut zNPzmFD6RECsTVb*3Sk%5ZRImS=6!4l|Dtna&Q$7W=yt0VLMe9Kr?}`5BFV%Pxls2 z_~M+Z59d!tqt=^i@sP(iEYwapw&j+G{+*~Fbvi6iKZLLKJ!RcZ!)Ahp=vpgRtBT~d zfeMg%;-<55%*0nzS-R9`TmXYh17*!R|N8MDFqbQ`W)5q2r-}w0Fs8V*?ywte&boJpY@B_d#U=ZK0kWf( zpXU6ff8a0)`c;pO3Nau4>p>9P{F%rXi1{!XIw`SN#Ga66v4N;Zw=7iQXd%rPxx76)x%MUm_f%^%;i(gjFnjh$M5@*gfoc<@6A!f65(57V_iLN1;65>)$&Vx>Ik>Bhr}$O?Zy zX9f&;t;vx!hlwW&gEHo6WFA>nw=kqv=6Jbc`R6A*8twm8+}oLPw-mWOemz6ZI+z~( zKpns4N<2fcdGiXj^_clX-*HDTYR#m?6)yALqQS^IOU#VM?ViVht$(R| z9su@6Unt%~uFK|TAAvA+y4tOLhu>CMj4GQe zpcM9eSq3fO#a%vnljv0XJJA~-KE#?S~(WS&O8d;K%UDA}g<*N!WXO@lLN zDHFIWOuAM{f|^?5jIM8?h{9|V+|x-c4qu^w zdYp%Ox-DLrpCrWy(Sox09K^Ah1 z*<_@T8nI7r2*q;q$6)7WxKvxO`MHwDC;k)?l zP>t=ckN7~NY{7}|A<|lyK0xD{p7dbTqv&9U;Ud&Wh7wKFJ zj2K)^G`qqjU9>7V%C=59+nE1ta8Q>xIZSUYRl8R2CX)JX)7QN8%lqC$zxSGx7OpE* z@7uBKJQF0xjuQ6!hy0+UF}n=I$jItjEbi3*W?p&AMZ61gYY{gHL{kW|rSsw^cH_A- z3WAo|n&$lIvXT)1{$WSiMv_6t7~t!)Wp)&PEzv5M2CHhL*rUFAa=;)DCD){lmpRTz zcU}x6T%dlIQ1AuYP0oY+!XxMRZF|sVqOXW1fWpL+Cy$K>knamVNWa2IDDAWamx+%M z@gxBaKcVKR&?pzv-G!xkN=#Vu*wD>|6S$6NytqZQ;a0b^f{Jv{$cPWUe35;#=tmnB zRC`pkIYxUlkRQ-y55fjo1hvf*3resr{NzZkm9&0mnOlJG*Olf05Y+FiOU5HEc<+n4 zw9Yel)kf-0D+pS+W_VlLiHCtv2x9qzF}mys)Jt5|8QQLBt9H-DBg>%sO#;y;!ALyQ zcO(FFrvIHJHZ*L0aQtnA>ptjX>H#iK=--E@eR9SPxqvTtQ*v*W1J}rB#>am-sfs=S z2{5Ut^F10QFv{A~Fx+9Va{g}m4?xu9HevP6i<`rS3#*-`=fTo>GO0L7@CCM`G<#NeNUsQj z5(I#z9Vm`tw;6|S`W_SWtiC;xU2`pBfqf)GpM(`!K0j@AVF8q*$DFID;!pREykP)19^4K7+P%YkEK$(sXq%bKGS z`i4$>II&#PG9nfeD6&m-zJm0H6#Chmisxo+@kt&8-cv)zSn(X8xrW%!wX5eRgtVG; zZ^C6pGm_lc3KjbWWZ+#x-|_nt#ZCxF?7!{D2N(UL!;wr_UG8zGKo0*VfYyQJf;22d zI8tb_O+oGDOA^^MG|ddKn8TiVn7U@cb%R7-vtmsv(z~O599xy~fhJ8RVGeCedvUI; zUxRcNf%!vbuROHlH5|ON3Ruf5;=?(1w;qpvikq!nzL)#ZtKeb~+c^G{9d($r`ZY~^ zC+)X%)AXI2V^zL)D@9}IMa0S_psO{!j2ICZnsQD_agCXvC1ZmJYpe4QT7#Sf6BNnn z0}Td!T*FNKPI3`I~e>{`Rv#7_cL z#eW89l$?N9k}~(^N(i}kpZt(@9P*PBd~ivZ*0+#$K86Wv}wuMKPK3)nxO17bX8ZY`B z=%V#^N^cG&$Ao@?xt>CgYFwuOEJwo<5AcHM6inIHj+hxlg$u@6Z#L9@zyu6$*ihNC zGgPN7ilX_yT!eD_A#b$FQoffIY4gSTLjZsZPkvgOm%_~p%NDX=Bb=_FR=$Lq)s1oj z-LD@9A$o70*#KvS&;s+{tLpgg7Cgd<{ zhB6pHl_9dBzp>94-)J0${xwI23OXqnC#5Aw30G5&r`2s^*64vMObp^b41Xtx8=AKi za(uLO$rs3Xc)W8|>YW0gmSVf^X(QAk#g&C)8E#7%`H0fPNY zMXVMAn!cg}Y%Q&b7UTTONyA^|bt}Js;Kg6Wpu$EXVdiN%47Xc9sZ= z?f|j~X4FylZ&UQNWnsKQi-mQ{!9K90Ni#${80tsDWWwbs=-mYOw9YfaZePLfWzcU? z8(ekdNa-4gvVst_e-r}peN_MZ>AW>1>!EEJC$fCb$s%-#o`H{q0-0b)t)m` zMA?I@MTwd2li2k&-4od}pDW^ zLal5zuS|@HJ_4Vu%?~gAc#;;5_>Ee1ej+moxN}Plk>|f@GTQ&~SnT1C3FJgpi!$|Z zYo-IOIKC})7?r1~?=$s;a)f}3IW>9}QfR%=I66lryv2K)PdHYFn({ch$x_WT%$yKV zCEtvfuII5~b0CyDZ~{TCi9E{~L_%Fppf%yb%X!3;SHH%B))^;5YO}hr%X`+NrL%Vl z_M<7^Zu_C?0idbmF>w$w zz#<>m*JxDE1Jiu_z~kC7_j#l4MsM1(s*}mK5)UX97x?&5{VU5alL8QrgkfCjEM{_P zq*8O`yN<{~@=^In3{1iztYwWgN(*og8R34w7d!7n)8PC*VWaZ5+!P$9SYi+M3!XL* zKWn2ZJym1TIg?Mbsz8dDTFgL+be)?TGGk>Z>C~6-@{GhXZ-8KC=exZTISzt`9y`2@ z#+?%I+ldzdidnw`I8u)~La@xtZ{}SLp;I;)-1`2Wk^Z9#;)bOBg`;8OsJ~}jeT-Ds zKJ0({@bjO~VEvO#4k|#P;{IFYpVfGQVYArvlY(7ZYPLnh=HaLE?bXZo*eef!^i;b= zk8`O&>{G+5tuHfd6hm)-e!?jB`CteV$L~r35D%*lk3-8`Alw84d^u2e%;!+w-n&BeJZ?I2vy_2#q)DY1p{Zdd7zfk|(5=->nvPAG!INJE}xC{X9} z`-5%sc~%!^+zyNUXOl-h=kK)WHF}mt$_Xqx#{z(;KS71H3I~-uDmo2qS?Lv;dQx#s z{jYRzp|59Sj+9Uqh@~p~SFh?SD%7hYB6L)l5nC!5bIJge#v^j=EQ!E<>W}GaN_%xl zvKG$}JWkzL?lAbQQFw^#PJ-SuF`0WLFuZFiVt3C%U|mG!dBzZHUfJ!OAh7@#r&xAeSzrr;JW}ka++Fu6{zaaKC&*6H&VY?R%2DTbQR<_; zpiQFnMn%tR@UgNgD|bY{`x4Yu8|7ZB0R`S)&-x1CJRkrhim1w6x+gZ$fS-8efLE<5 z)J8>xoW}3&pEHyV<6U0I)Ah!C2ZrfHWNa2%BH{OTU0Cml_-L;Y$)ZfebI0v|ndBfg z{QJX8R45Wolb!NVn-uCkg!61-1Pm0stj0n}WbU##n)w{zQP=z?@FD<8(IKf#U?aDf z1?IcL-P`q8ham^j%!pv=o~n|OSWzYVUu%SaWsD_iN!)4s;a{gSEI z1Eri(OF-vraXW&n1%YzNU8q|UPd7cDXpOep7-=7C4MXQwctFZ;$83Gz;Ay;)9Y=(G^%M zAPvNQ=UIYQ#udoHD{TN4XbZJEB-qGFBuWigF%A zZwC>pct~ROw0o@T%Tka@<_3Qe;ph;x%=kLtSm^u`l(?gs_Hj?&w$Mk8khX86FhE5O zcOZR`A1IC0R6LzUc8A8x6ouQd0SV3@SHi0G&>9;4R0_jNbO%79d&vI-2SUjuRcC3_ zViIn-Hq0gy5A(#n|0A>JhF8aN+}(7HqAU1HmT6nK(AZJmAnttq+y z8E8Vi7`QCpzTC0#2o4BR-Tui%Oji^OXFAHWKrt_i49(>vB|G31UP_~ zd~UI__Z5@U{ZxtPG42HTrZrW}GJpPTC!xYue8!31r#GR0mcoS)K8`GlfuZOS3f3_v z2O9c|AL^0!ia?{`4KAeSBD3&efi90 z7AD`n@BK0+qs#GSr`Vv`@b}RVi)Gw8 zq&g}4gNXy(KN7Y_Lwf_O_W3f9ZK8QW(yP3TM9IC6Xws{rw&pA)1s)e%@XT)*QvOJr zFCz6cz}H7_ z2=#Q5H`&C$wSJ90Z&ocS#*Cg3mAMc2QWqg5C#F=g*X|Iw$l>j+fmcDc_9;suvHINm zv`OSvaZxW`&3*`N=fCUuUeiBP!N{+PwVp3x)D=m(TJLqv$jU-0Mn>(g-u8*J?yFKI z?kmSX-?-hLUGo1?Fu=xt9e@$|qqMh2(|IP_H+lw%>mJ8~j((>^2b&5D@p&FRkJ(ib zhL?D7t(-n@>A7y=LDmG5{VpzOfeSO$^`PLLsE(s<-yXJIWDZr=4O;)lwoJOt;g_y_ z1i!{b9~$aSOZM5FMF{K{$3@>ydYk)EzE*4re%p_4#z!4=dHqauxl*+7yoP>@#Qvg| z0G{h$doIoa8weKBQ>{3nt5*ovFi)#0WZ27RxRp~E{*mz~#8uq7z5ayQ5UXK#`LU4A z-Ek`2+u7KOI2F|$QaKSElf{lujgx39AVl`D!KLdrs803q;Te(JM=~Oy!(}rw0~nP) zq%mO3{Sm4Wi7+T!paJMC_S)VLdWMIlIgsP2kJTu%eGRsK;{OVw9)#Z#gnL}0lf7u zMUU!Z=Jk9QwZ@|{mAYGI;NPm|{=j29$nA1`75$MjN+1|Zb>iE>_$|DY+S;!S!3pLW zqIKMwCb~WE5<10Tp(_L%`NYz+wT`};+4Tpw^Fb)=!ae%-KE&3IVB#l5EAd_KgZrV> zLjpx;8s6rYql+wo!pV*#cMSpcs*COvfLQLF^6mhWSc3R(DYukC^Lc;wsUk_bTFkw? z0ysFxU5D=R?(zQK|HqPhuB~TF@3-u9fZzIB`&EIpoW)nN&x+gJ1>+UeKf+)InLwxI zA1ojt%4~8V=x7xC)2tZiLQZ(QDxw06xHs>L2XuG2a$zyZ72<7d3>G6%+3ZE$InB(7p_jpGc^ebro46$1a^Chn-M`)%cR2?)b}qT3;FcFk`SEH z85@f7JmsLmwB|I6xyA=INxI*90l^7kMSze}4g>^&iBdI!3t28h|$DYor1yO3BMaEw>5IcJ{qa)1F^7RSXwE(k7+RHp!`+d(J% zIUVrStQ{7=VR1EF=P5y8DUP|*TPhyyN5+48!*bm;XEM|VRR8FhPFGP9NGpPk0wQGX ziQ)(R*@13&;6bNs0;l^|?;aKzVUd5_>#nUlV1;RjOf$3))eOy_o`xE<0;N(H3Tiri z{8kWyy=$h;ErrjEF9WzV@dKiQK)D}O2iaau9Y7V<11SJl$`*2{=8S|* z;r)S1tfewkl^bVm?+Ds>!t)>`vM9%tkoMCkED*o7v*|b} zYveO3RI3QF3qfm7FG&A$13{3OVmVm;y*Nw1v6T4l zwy5TCmhR@)UEi^$!jePt1P%i*{mpcT6LL2AluLOcM@Ggr86g(_R$qV1(2loSwi*gi zfZ&=~Z3H)i1a-KKjN7rX$0cOtyjE)SZRvF|#KPnWNl5jElP%u80O$LKyq0myuod0w zvcQ-t$9mZ0c%P90SGeVO1Ll46IG}r$m{|5rB$s?LuEh%`>r--C=DIrU9z3h+0mnG;CNd)G%{ zO9hA2s#6f$Q9hv5;)2q}FPbEdnG@D&L5%ZsZZ#Ixfd>7KLng9(Z&}wUVS?5R-$M+_ zkv4TuI162Loe|31QJNN-N-?u>gR~(e!GX7bNkZ?erhfc${ozgoHnxCEtFh={1_)`l zV02u2-ZsQz#D(QBCo9TP5?}(j!+XR9zIM90qrh_MrQye#!6mJjMTi@QYaFj$t&D#_ zSd#}9MMVbyBM$K!h_MR)e^o#Mbud=s8LjF1 zDN#A}$Eg=)UmS253Qx@dMN4lYKMsx`DJQC4u|Vl?90z+uj+mvd07h9H;H8R*0f*Jw zA6P#pE(sT;wP}xD>zfy;Q8qV{$lB-ums_F;pt%7SU-@#-DsV#Fg}pShoP+Tys@&=R zOlf>9qw7aWDetK>sGbF1FsaLRCfh-KYQ+;H&Ds=Z-E>C66P|r|8(@*Iv>_FcHwa@o z4g|a!(|jootnVNeXph^fO9uE#=1@&^b2#c&XVoVTU*T#@ ze6xSNS@k~<91MPQVxbhf^vGfdr8cL3#(wwxZtWHY`Vd;7TG;Rd=?zZ}zqtAMBxdqzll!)NfD00o%iRyER&B^iomgkJ07ll&6ozc_+n=NlO~ zvZ(m7vn}rEN~ZLnBa|s46uv1LrL^m)u~L59W=yKKQ{VvNl>Eb7 zK@-lVTUV2hHg7@F>JfGDpoqZ}BLQeV_!Pw@?5g|c^)XrMqJi;jX+%4uTX>&sB9ZGT zpU;rBG_zlfRW1th`fhq;j3$zKg95dJh6ZrBUd@8|@dMw?|1n!)k6B%|pMFIw6NP>2 z9Kd-)Qc=ab^I4pGFoY0_|1K5^GlYp?c{68639i57`%+*pQ&uleSr8R~nq_cSPJ zKc)=!BCpqdxALOgIrl$_ zIpMXOi|Wm_Zk*3y4@_Px?dm8`9 zopUvG*K-S1yRP0Gx2;v9K%2h{+5PVw^Gx)rTmuLsAVKL|y%f=<#*@jL%JYkowU`gH zYmMg1^@!Me4z3x75jBIiSXwG-_txHC{VmtBl8^;^r0Swhkyc;2sR3if?! zar{q3wks;n75(KqX79_4y=;;>*<;rxNgq|39Or`bm7qcE)Pt0jNb&RfuyF%i_d@St zeEHq&U>?%gGujJ@wOL9)3ItS+<3J$ay0CjHBa{PjWp%nA;m3*eR&E$yduhXrH2g7~Uq6*vQ-!upMLn=M;nFr8{ zkawd`&vwWKQivKM&j;nhE!?%M4pG-PiT=^`|cAg+3(? zW#_dHE5Ff(TH`A6<|mwAc^*3)ec><JAp@==~x5Z>1*1!lp%+Fux8-F zB}RKQX^d zBUB>O-p-aR<6iKup#&kre7=kbym`Qa8ejuG)vXu5tJLQv@B$62kW!YY=w>{gTL3qw zoN`>=fYF%Am=U$x{Ar{Fa;&zxpDvT2kyms-MWio4?k`gRIFzJoV5JfMcQo9RBnSRb zduU8(go4s0N2T23U=2Qt=}*sAq6!Z&hsSVu+Xll=Nb#4Fhwbp}9Sa7UeSq|UU0NH) z(;tf6Ud6$m*eD=l>Ay8Q<70#t^+%Oio3ap# zcl<6_c-&;>IdR`~cQxer=EKX{mb-AqNd0%xT+=(KH7qOC&u_;WPl>MenuR}4(sm1B z=xR|OzCLy42h0VjFYRBwpG4SPI>!SPNy~w(rT0q{Un`I^)PSj0dvWFx2X;*p5ApUr z`4mem4W9m28^|cH&l7j_DrAU|*ppLW-lby0ETyzaBOp1S;Nu}wo4s|X)8{^1sEOfl7NzdLt%cc9CugPlkimX0N zt5|jeUvaILS1h9#+auuei`=UdP<5>hv;uC&Yc0tgFh@RyeU;}42!AI8r0q7V!Gl|M z67@({4uB7kPr+vr!hSNI)F;W1|rU9K~w=RV;6`7%nx9@qt+$=(P_D)QZ0B<7 zF^qz!fM|*|!{c_5w!;iO-~6Qc zdxsZK$?SgDd#!3cxOJUg^KjvO0fWSlqd5SiwSJe|We?Vtv7FMDKalPCI6b+2X1L>@uTMR}G#Ce!>%v{i(QH<+`YxoxCe#zbpQw!_0_q`@x3#+0rtw9T! zusz9c^ym&;A{fyzHuPo{5en=Wd{@7Ztx98A{JaUPFZ_w=q1VwnszdZmi^F}AIM#W z?HDsL?S>eB42i4dYSQxAC=A}6W9WX3AEuLc8%GzP9^{G4CGAi!il*O@>_kz3XY!pX zR+`zqfh@35)P7~X6q)zDxe_7OtWW{g?14?K@ zeRx5RR86^U0wtd6t&*`{xIJ61PtA;Dz59n{8tyfYVu*X6)hW4xJeA4I8 zxO0#@$?+o@lvJ=K+~-d51F}@y0T|@5%QV?B2EK9BxT}bB-4`x|vG2Wc#YKhlt0ki{ zy5k2yEwc1DnF8QUQ1WZ(BU5GBM-Xr`#;!=tW%a711FgfL#ywK***F0AhBbbQF#Vgr z-&XnJJ$~B9Y@SI||A;F^@og$p5oYJDE5*^BQN>a3e`%x_dkqI$4}ubBc+DP}8d*{e z7!?Gy-i88Qwohqb8iRYRF$-%bs#s^|FMB+>;h{N$)1evxw(@V*(cO8=@^-2MeY;H* zCJyH2w4Oh0WF}t4ax%~9qKI=y38cx(n1?044iz2Ebr%hIPHj2*HS;UH`LK^?JLRQ1 zC^GZw|6nBZEb}1QCKg_Aqx8(Pn&VqJESZ&F_|};_wc%pqQc<_1+-k6@6A9?T*ISNQSNrEQo0|lxEIdKq4zvuc zp#Z^#oF>HQfvNG`mQg3fGAYq_D%bPNrJF~g8~gsn=!@cKd}n1MyV1T3{jY##agQHY zK-K#*&u4mRY#wkoH!?QgMra7j45CRY-*CV`I(-?*b2=3Dj5|ZiKRYSI5lmZuwdubi zLFc_h)RT-)i&YutfR9Nt8U>;2+I)hNxoLDyiBI82h8ZbBv2N7svqh`>5-h&5CBlF6Os%TF&-ClhL5 zhKibim3-@f{nJ`Bh;r1=6B|BKFWdsQ;d~%1AIQ61*jqYTA^*XxbkeLsN1*SJ-SWL1 z9|=T8EW}pTB0Jl2T3;|H{mSAq*1CABe)`D7@-G{k-XO4mcWFl0ZbcFx=t6>LQU6yy z4iHTJ1F1L{uW1=z^FP4Hr;!A|mb|49c1y~BDDz~V4AC+>^hmj2ozAS= zS5Jz?Q|@wQXzBXj+FoRvz00(GU?oip!e^$BXAfHOJBMnYC1gH&QV-}F?YsQm zJ|+N(RuV2pj*lGI9D3EIe}^?pR4odP!9i#=^VUICm>X<9W$etB5^AgUGLoL#P*Gis zDuLJw=@Kh*>sTKscb@9;K9@5|TS;0;kA=T@a>>Mk`glC{vl!Sh^2BqkQZVF&5kR7} zS6@*2C~hq;60pBLi_`fO`wxVRFl85UBL6*zdzoOS-n2cLLQO{)t>@-ppiiw$H;!fW z`f=(6QRePhYWAs%+_19$pDWG*Ha+!>^D@)}wZoEv}V#;3;(wcvtn8 z1GeLRv|Jp2rz6w+q|Xdn2djNSY!&4g##?(il}}g^ZiI6|BV^0c_C`;Gq(I<6oG*&Q z7CR#v>x_^yAmFXJ+U><>qQW9fPLL?KF*Hg^l)CWyb^7`TTEjgAhPp6>*|d)pBCZn*KPi<-!e^DU?5B7SJw znkfBK>)rj!y*$&Ah`_1cx%0gsrvE24*Z4stdhaAtB;by8N`fn2aGB3-{dIfd{t~T$kHNNC{{}t`r4{jQb zn&0`f0KuNYhVe(9s9K6#M4`ql7EsO`!Phfr^Q-^--?N8*m^eto-<*XPE7$nrLdd-k zw&|rWrm1K<-nI5~j#>=opoUPqgL#rNsYbe(?0%lsTpH%1zFuvYOh@$Ze`;i%;Ymln zK%5{xbj9EwLkVJn2=^_qtz1#y1Vp=lh;Y0hws(?AN10(O0hRcLVm?^nH z{*QpZnhu4OKhY=nU44E`s3$HI_x~P?df(mhabLPb>G%@&3@#_*O zJZEEk0`U~p?>ZShFAPi*nn~y+HB*pLadrSZy_zsPe=r3KURQZzW~s*!X^Z=7+z?ZW z!r8nj)BiH1it^I66SmIs-b~Hi-Nh~5Z)!Ei5)vEHY^1?SJaOInDoD`umz8w$8j>WJ z`>+;v;}*$(u?o{vv;bj#=vrRUn|l48{_?^Bbqe9R{gw#bqFcVR?%On^9|~ho<`J0E zj|H)cRjw9xAh+^=QH*Z2Hjlb}6Xc_U{q`^GOQ>4ZCc;ZkEe^F%0++o1E=7tX(?k^D zAQGBz-ZD>6Ivdru5*wHJEsUOB<`$E9=Sv^sadZCy-vZHrQAACSX99%_W5jGNgw$KT zwY2%(>fKjc(nEq59%_sAA^4+wnAUuCrFljCI+0vIGujmm$cWex^YvNwC1n}SPDRGT zu)iN;OdI}vWFmZbv=5OI6om=ftDJdMtwIN7Je>j#QQP7GiSeKIhjBlsP(B~&Ah-yt zKozv#q)sJXA&Hrvy0le(D#!*xOgLdc1nz~EWyVLqUD-r)SD3!qQr(krB+m26oryVl zFDo1Ct^0mIq9+as4_!V4KgB+cN+{EkV3VX_=&o0S9Nf4~SA2maa$BcZ!J0~uKi7)W zxVE%eJXIMu4xW1}szq0b=VzS_$!bhG{t%df^WAp_`GZVTdVU#l^@u(FgWsD``}zBo ztO-_04t?F~6=c-ZEl$o9Q`RHOuki~++WqCI9#!w)RafcyF$&ETbDtC;q}qt&hQ`-I zTn?eX#;itziu`&n@Oo%W{{TmrYg-ORMuMj8a3Z_kWV7-M;Uhh=WCq3m=N>Lf{# za=S2&o#myO>(u_+R4Z$j!eb%c(KSCOJQ$mSfCex${lt+h+vnY46AXI+0x z>s;rLcVtFfPIR8GqPUf#Old)c6~T|!&)?mkllkFP>yQKaO4-eeSA9Mq_w);BzoE2! zU)bEb^vl52Y-*uwae-8Ef4acxYVmZv-!CGl;{>3RSEN>>hA10~DFuLxhhJ3XeFm!A z4~@?^x_0pH%7`Rj(3wCmdaY&jFbgxAdJ2^C)!NphdtJ&5nQho#?+-QWwEo%o3)Rzg4W6Ir`Me5=Lg`xU7apPRVn~wbTL}NfwSP4Xf zRAicO*&tz z-%%MVABHPHR~=`S2bX1X@_~dbG($BFEf(f=c26oQ2f2))7)bb=8zWE~5FLV~)K0Om zk7IApvKNCca?jw+5CQI+s6r>a!X}hY1os`t1--@d2hC71OZ1c;c+iYdr~HFwcuCn? z&wRzR#U-BX!{ntP>j|djWl7m8L=?#ZVf~<+*Ms8Lk2FY_TKU;uN1FEj!Vr5x#0B5y zRpU?BY!3I{qVNkYWnCPRne_Z-t4543f*oId*clYfv?5XINPjXrBz2UTnH zXDC8qDkkU$3fzwQG6dopMRN7@9FA|;QR-iScNn?b&vGw*xbAx!dHsf@jh{`OR4 zc+1Sjw9cv;6l1V`r|P!Z$j~RWNqAV>V)2G3ztk|iFK^hPy9shK4!QfRCvr_4-qY!l zyrs^LKLz#kow0ghSKnzWEZ=wqEte)q=teVdXzBckq5Vkw7?K(E@bPJbcT{2lZh{f8 zvMAff4};IBIpj>j!R+swbj%kTUXs-n5)7npc=O@^o3Fu_<(BaIL2nie*t8!|12MC& z%Bx#{xvbq~sL5+y9gUn|mAm`}0N_jI*D^X&+2`Rn^BJ7O+Xob*NWlNeXVb_2-=6e{ z$a!YZ;;l&OKg>|-$|P)Lh27CjCkJ)bV7bj`wjJwg2~X}PV?f;$089MT{T>zlB<%BsQ|N+fy1zO8=I3hQ#Cl_J>2~_P%iNCk{SUTx6;!F^KU+2_RBYd)fA(0C0Cj24NfejH z%+cLaSeH$=j$?=q&0A28i={?3uDf8{#iW z4vGNUa{&rezgmV^tu|(O?lo!F5qMCgHv{H116Z5>7%g;mk?|*PF9&{71s3j=flnF0g{Y?$YNxU2U4I zIR1fQ$rxy6si8D(UpYMWMc(CA8j}3!hyNvcVX#5mnf;&2m`Vd>$fCG{zxk#a*KLqX zaAVUb9S~}6`MK!tDmc5Ki8dfW!7$1C+bt*X-tYBl!Dqvg>rLO|y&K*v|BwjLnk}}! zDx^+znJrbT#KKAa{&8hV1`pi)KpFrEt_pg&8os5FK&IY5YiM8Fm{j@4LNa7~cI1(K zwpr-_JMK+H0-Ndo>kVYz%S?006M%N36Y~E!m(M%o+gn;%)_zyZ1ppdA{)MEL z_sq`xwo{P;fTEW59*o~i&(Qs1;hqZ@izH9mZ`yj&ylEmMLRvU}vuCb6@&Vre?W;N3 zvD`=g6iiT_>09yQ^IG8S z0R~^2xQ7fr*Sww8S@En;T-RK^Y>IFv8=Iz7NM+-o!-T8lvx*u8JR7}x4;Y=Uza%kF z)89`RWp1Uebql&1v&)8b* z-p7fCAiXvVptjA~*gc-9k-==TlvBLx?v=agD9?^1BkV$9!M?NBSgg}PKr zecS(JAkLy-S>Lq2=w4VSz(f!TH+b~PiZ2Gmo;UvN6;OLj69ANk5t|!s8Ot>`QoEM? z;$klg%iW6gx#VPR+A=l3?Rn1!%$nwJQRr46o9PIUeD2a-?%M|99xz^xTXFRlzAJdL}|I&Wp zt`qLY<&a>U5awm38E<6-O47~A#f6)D7(+<%6_>lscRd1Z4;;gotMSpmE;ca(bU@_V zdtcMtZAOL?XNZ|zK}!%GtRsClRMuC%*@Z=ZDnOu_5qr1eYK`)6RCQq7R{ylvZ02|O zBUlrKeV$ZgV`K+il=n|MRdl%H2Be1?7R60=#iL4%()Kp71#uM2OROp(MlvB_)5yYYImf-YKa{z<>F+! zjDzZXC2oh}Q$d0%TPDa$M~ZClCQyB(3+;*T*g40nHxpelayp@tT<5N~wYNYugvI9| z1l^km)^#cjXTJJfIz!YI*=4oq=nqQD%|Ka7BR13f`qAOLFWdy*5m2Gn3b^NvbhG+l z=bB?J<{qXQUMv z&;#eUXuINlv-ZWC#%-yz*!IV8FsD{{4Qug;d(-{;~S{sENOkyOU9BK$6G za?tV}_8?{w9}?+5A2#=}!TaInuBX8Q${jAmAa8wrl4Wgo?t;e61Px^p;sc8adZv6N zdUf5f?cb$6GlmlPRrY(xW*#j4t%R^*bFrm^lw`=#Q?1|E(5Q1zef^xh9?5su9!|b5 zdk*b9-G*=&*|r~OYVeJbZ^!J(ujiEDa=TV1DWKN4y1GfMc*|rVh+Jw)$@&qjV=&G( z)VL3!K)EZF?FH+0JUi#);Y|&_I4erNbH)238|}cupeNeXFIh5XC8QOO9K<~se<+qn zTx^3j7A?SFHQ@jAtIm`jALL{Kq&uCL0zZ0{!Caq_=>=EjKNAd$6As`UifvcEV zfEg43qd@@>8X6Swh5J>CUZ0K$ubED7y9lSbg3xX&KfTR*H9LXPy_UHzI8< zX;mD%XFfl_ST1dYydB)03f9oN+fjW9YPg-eJ1BDWTf0;Tz-`2^#2fpN{VC+7O)n%) z`ykKJJ5m3m9Auhkq~Bn6JRw-Ky{`wv^S~vzIeY!8Qmm0->CDby?!_Z5ojD!P6Y+X&ein?g>~*KezfL?~3mv5a zLl3KMbp_<7cn7E{cC?T37MFPFF;cHS4>hN_4?TWuANaH|V8ijPNs12dVdoO_@Wh{u zRB;^ml8Er*+t59)T9VfhDzeA-Wzip0_?v{{W;Q-jk37&T4I<$>mqJi%Nw2m&jcEG$ z>et+AiJ&LiL!cF%&8jDN|zdT3|vcqG_jESsa@mv=KGjP{a7jHa&Q>V0!G) z8cHCa{j1MSAIhE(im5YK*Czb-*#<=JDrzpOMJWft>FgfFQvtGHb23J5*-z=VnXNwa zf-O?Ki}BoL=_I}(xhyifa{x2{owrqq^}?_1{J?slkwCr-;g(1DI#M~0ZgVOSM+Hb* zH!wf9w+H5i0Je?vGnW9-BM313LL%$hcuSg6dsJe@CN-%oW!V6w-kGS82rzc{-oOWw zv60vKcFpVYFzvDPz~e?~P~h^b1!d;%rHIwPM}bO#@+nBB#4gKodl53TgTr3X#&FL! zRthEXQsKrk_cq0rUfJ=R8l18r-Yooq9aofkOQJ>spyj_KH+~6||JsfMSWRvkH=8|wG*+6ZasKnO^WM3`RFSfsz!bf^YjR%?b&*s8@} zeLwo28pq~=SC5(@!JPKrEMQlZ#DF{lUAtceCjvXSPXh}rVeR$5w@5S9?(-JWe!4X!bZ z9UcaH22>u8Ui%UY3ev}f7XzY14_;YFa(P_i{tR88%%ii#CF2Y7LIuXWjObq;vSTTo zqf=H-Vb9QIeCL+#OYQ)~qHKs1>Ml=Af;?NsSZ=}gAF*6qrB52GO*9K| zWc?UF^mJ^cb%cYwg|BW8|DwWjmK)A(sn|F^Zp{r3C?0YApJC=c89_oh#JxQ>1;wnb znSdS{=1?RRHo@Nw_-TsP@6*>4_ zNmDE+J^Jq2`$3UO#q--@LD+5urpMh;635L7=Wet}b9D&GNdD6ds}N>r!-KwelyN*Z zYDNI_BwAvePS@Hx^4N(6yNuyg@sPQ9315U;k~~HlGjx@&V*JX(0@w;b`10m_sLI4? z{%~p!$v&9-rgVDo8VNLI=M(r$obWOV>%pC<5C6Mz5#IFv!JEd}DEeDA@_a=$y44{Z7jm@mITUhQBjn9z5e$Bn{eCCXU;S?!7wY3G0&O zEIB;LEi*7bwk`YaRNo$;fk?JtKu^_TO0TChKZ)C81EDks9ymZhdw6T2<3PuF$7@RA4FmRBt3mGv=>? zwUw3h{OVYZmeV(4uJSUaE|za zAejB{MVwmdwT?aoFZC0Sj!P1)K!5e>4S{hx7xO=RuZqVQq*R1UBxa=cv(mR(HbPmZ ze@sEJod!4%0Zoa1iEtCrRY$|gG%np_mIuDY2=#&rSl$;(0(c1G@ED}>B<9*VleEO} zB6^SuKdT0!ba%W99RAAYRIY)NS+kJoe6p{|-CYxjB>O!4N&7IUZC zjAxh=@CWC7dYjl4|0hm3Wp`}|1~SV@8;zftXYv1Hw#ZHk!1s|eTdEz#YYKA*lt@#? z-4e7n-%Jd+G3pT^MxXd|`Bf4Nz+Fe5fJ{JF9uq#Njh`MIruseB4WMz44f0_J;AO~W z&x_3%_y@6=?G%=6#QNVavyocJe$I56H-K9nygXVm+%7#Xk-qZj4Zl?odiFDZS8lq^?8fZEWeXv6ZtIL1UvuU9P_55D0nV=)Z;>+p=sRpSrq2e428%Pc|*H&F#Z+CqXu0#G5t0fg@0Xx&9FYCGfR5O6QO- z!A3)uXbvWTQm{>o;4>+xj)4ZaNCm#l>TfaY%&6CE42KFT>BKiqRcGLNO@Q>a$2obK z3~ifBkz)JG8H^fyzUR0rUfJE+t|FCV0UKYCfUJ(2CLRz7E}@T-la=erDp68d^@#b9 zyZJq+{0K-2k3@Ro0ecz4x4ie#FG=166W%A73+R;qIS@cpcA2C`sw{jaq$A^zrrkG_CO~ojeB%Z-P6CAWW`h;xE~$G@fC8<(_48J zyx!$qX}9yjUVarLh=}Tqfn)zSpd204n^ImkKAtRbYi=EEMF=Cf{9{2}uXY|Q2jE2< z?3Y3y!2L^}P^m+OMYP`ulv_5hyd6!(`R&uW2Ch#)jp2M9)KwFaW%x zAq@3_RI7`f&!dLOz=bj}H~pq>aa(J{So*y{ww^y;$>TsRN+?!m`@>o>aWI@S_%TPF6RzF7Z2gZ5J^od z#wC}t&>;cw~ATaFyEf(jwXRiXX*@})Q5)5zCYEzdE2?F4P%1gKJDS)c%5^C+w z8GeE2#8S^I6wO}302-3jYtH$4ddb#Ho z8Q?-GkOe-10%?Km4J5a^(MpSL@kL``tLXCQ>KG+##?)60A3zIWMM5wVxb4JAmlibZ zKZ}$(Z+m5g;_VV+jnL3|GldfEw2GdcKoS;kLj@2!vZ!L6q@iXuqd<2#05oIN%#0gz z2{=a@Qx~V&MXI&pBrqs4IR5dvHZF<*V(nNFt>MtcG6})WeXERQHxn~@QJb_Nbc@MaAPs$Ve@pJ z)bTY`uTXqHzohxLfJbwdAsr1YH&7nnE5-^*)-ppm;;%W`jLgMxcUw94^EZ_tN#Pm2 z8F)*tFGK@bp{A?ud~blyF>{NzBo$7>L6j&UaMgEOxFl?HmUHvx{9LXG>Fr!;x9pJ8 z+aD7+?Y%p@f!OPN?;zf%Z>hQ4Y_$;WgMk1u)0;fb!QShbi*q+r5;VL7H=RRd&SS8% z9_$q?+htT8hv%c|06o?1O>2oW`;V9Kz5ygxtY;RONI3apE1XgJ6p-mlAOEk#WDuL$ z$Y+gO49;4~8SIZi->Za{R?}|7fqN*-SiElAdT`?zk?!56nsUoJk{~b6hAwLqww-l|nvf7bv z4Z)3xaeh43(OQ?wxG?e3;E=TY;b*6?nD!IxA*~f;?*mnp9x$&Lb=f&)4!rzIeChfM z7jzd4v_uVXerssN%3pS@SzSMmLKcK5V;qp99pIslhoLxJ6?iqtFu(02rR z3dCySoh{0gvA$;x&RO?-DW}mZ$W+V@RrKWymW$C~44IkXW!5|DACj;GEu4#?yXUZ= zR1nqfi_Jh-$I#d1LBbYv3zD%TKUiyDvRz;^s<#kjbaJB+86-F!!Q4adjwm+NFVxQ- zB{pq!TXX1t0TE|q?FE*5vBD#Lqz<@0fJru=9w_m3AbUFHQbvK-otk}5BVRK<2*>a5 z_Ed`O+!_6)}kCNAi65*-4fVg$xd7X2TEn~&Bbh=+-Mm^=`IUgHg(y6$H{ zS^e+c0n03sf8q7I!-RyJ!7Mp7D=>34vG(nhFgV-7%A%)~3D#9~d5#(05v)lQsj7aC z20$P>xFAxqP%(1M?_?66>txt%%;1xL@$Icea05xZa^oLK$z%3?+Bx15*Gh5;Pgl1m zEk6&ODg4_G**R&Tkc(V^`sQZy0w*;hUF_~q@+A>r)~jr5iOLyg9+DE*Rum*OJkVV_ zkW7dUfastQG#K!R1`L715ZPcv`*#2cj|Th#1|aU~paA3o1uVKO_@3Yy>EDG*=jaC? z{@~FdZqeqz5J){2$Q4@&jE3gY1nz{Ix|4lEaTfs41~iTn<9NKFIZ z#lS;W+1wv!K&FP$vgSn&JL@+$=PBChRjz(!6I+J&25#U2|8d==91Gygq0? z@W2!RBHt=1+A^)uJT1<90tLJkV2!o|i`Ta%_X%Id?gSKNVZcEsuw6N`UwoHgRa|g` z1ktlEv4^0gN+v36UhSoMDEj&`p(|t2yp6~!wJp^e{Ipg(_C3rxzDRe1uLDYm#had?x}ETF`vGsDv{bLu$a8gT0Y?aG9cer*CU&nx5ir$7s@a%i4m`0 zJZe;tf;{N>#!z2-v?+JDc~FU|5;!N$`E1wCVoC@1rhePxcJlnSmqM0BVa%}$k%lZ$ z(*iDbxInfDM{4QlYw9$%EG>U3Zp*D*(i z$Vodn-d^1jgkE1snd2Lm1U6Q*-#yme^0g>DFqv%I4c-nkpGF#^sxQqESgY?=l;0?j z7zkH*;8kz1at+1U-Dv9=yfcKJ^ZA#3o`h-&HyP8WPQuxOp`%nag{YHOo0Rq1{;!g~ zTDu@pbT#Bzen&OGtXCmnOQn4CQl@J89T?nRfIIC^xUhZ!WjZfIc z0Xe6d;2l=2EB_+?qo3j&ScIC5@xlgnM$KY5-_jaSTS+xzNit1MQ;MDHY*#UMJ*FY4 z3FgT91T}wNgTk&E7t((G6T+jVoCjI#_*!%<50=6PgPE=ujc4vEMb3*?^61@9Fkg#n zv3e-G<=G|ho_~9D;ofmI)+0d+FT_;fduK0kX1bqd#>77leOywC0zxTPd;*VSz?{@o z_i+52PGHs?^Lsw|Mr|(bfr$_b7_Kg@r&h)Gd+hMK?{}Uo%H1X@O5!{MJiqhkd1bJO z6cH9tnDTTms_|qjY#6g#2{N^v&+GNpoxbbNuHpEzzTLO555JgM^7~%Id)7oTw*bZF zj#h~~4B}I({-wFxMXIS?m0F6j!Jh*NGY$_Qcnnj>V{iO;1SPU~u$>s}@N@j7hW*<- z#f`xq@$65tp5zRK|I4aX&^Q+kJjgN)OC7k^@-{dU6;oTsyTfPL?Gkyri|tp0S>W7Q z6Ed*Ah>_KVJ|i-gNn%|;$GU(sF2ri_l0Sk175Ih~G@%_t(EGUe*BpUD;-?YxoPmG) zO*C?n!^Ll`@}J3e@_7X}(l&hGCiX0Zngbof#+4bNZI0vp15t2Ze!bLwYp=+WIQ1|h z8u$yC+k=MC4sswi3qM^^DeBb5W&@5+;q?*LU7s4<4yF_-{RR8@pR{ki3Gm%=Fn&%ay(EV=)ZLyHs3KXhbbw zovsFs#cNO0(OmK|Dsm!>aY2Ef02Z(2t)(wzjgqC_Oz2UMo_A?X^6D17l6TVtMf3X` zqij$Gq00tSq~dHX%Qx>$ui1&BeR>Hi&HTyea$Y3M{{)(LIeDy=#{&`6eLM9Ri}X8& z(*HaQAQA5BU3@kt@ng?ql5O1A)(=y?{8P z%z$jQL}lmJO+T1Sh4!?>(buXIs>}e5iiKvNE1KC;400jl9b z0EaM=ER&=#h@>8U(I@o>z+;TeF`fq=z+3Wv=Cji*3Cjo-q9FIHObwqc_O<)3LSA7P zo>9BMSxpH?m7F`*$xd_}^t06_3)5;Jg|*Lj&>*n}NOnw`xvMp68Zbk37hA8zJLF&< zr{4g3dF|7-9?!qxwj2ys`>*hEJL2NaGUPGVP<18Rgg}iGE0y=4&u_0J-MWmAfc{ot ziPnyM_m?k9R?B1!IVLpCYXZ%D>7R~eGDt+U{cy9Ce5OD86(oMEbZO{*B1D$o_0ORa zG4MZ32!K{)SdncCJ_rmaM!t}MbD_Y3f;ZJMWRE@bY@SfQC=WQYPTh@>cv1N1~*a* z?0?F*6!dl?)ynK2gF~6_&EfmRW`S)B1aFPJnzqeK=AFFcOR5HhF544}O;`(?9p@3# zc8)9OW0V^w(1PJxLPdyo^D~wsQIh6-9D((gc|Q!bntKogt?F*J5!7Y?E2=TxdMXKX zY^_)Pz$hg5I3kTh0yi??35b}-LI#4E0R=Vz94(nRxEKemJfh6-@7*kh8o|Ia(ruk1 zQeX`bmF@IKJ=zX0Q+TZcNE?Zk{N%MmnH#rgrUTo}b8*UvwsR*V|3yI_<^|&7lh&}~~P+T*lg-C6Hh?zvueXSv_63|GVpGOUM z2W!5Nz_d@{_rUKuHv-MB${fY(5a_xOn-r3+{tM#KI&uInWjp;XaC0Un$OBMEc;Jex zj&l}M6T?!lVy4q&o7v`)I+-U~`OZArSu2>{d|gm@v@EXVC}1haGX5vFxZ0m55FHiX zH_6ut7ylwltm!8qo%ep07oZ{Z*TcGE1`g%`-W!+C27Yw;zcQHy2I{>Li}<1A`K|BI zwHSfO_j*3DZ^f1Ob!QZ;GWGOz?Tj&4(@T%TOGigvnq!~*GTAkJM(p`(QOUF%9sIV@ z=PD{_0f1M5N1(D(=(d)l+{)4Au9!et%e!HsA&{P~w72&NdBOgl>i9n1655^HV&!(d zq#?}fG3};T*y&*vio~@o{!&Z;8rw@)5;%hr=GnAjj<=NmogBt4+b;kfS$FqvpX2x) zIqx}yoEC-}rCL&78px3A1HAG*o^cNxuQKL|97>aPIudy!Zf8DQ3_xv=5K9f|M6h`M zJG=Z{WDL07CWD-GOuJ33C{j~6@)!mX$*`bb_{LJOIv#)xV!>+qH8WmT{b@jh+L<%- z05qXk2gRT%h@LlP5=eZ?t$T9)%}!IP6%3aO_8Mi1R6Ba*7;D6E>T?W0(^&@6=>>+d z;31U6kM8@)Gf8ubdSBFQTQso|rmoq;;w_CKaBu7psIHQm3m9sLSgkSSfn$&@*@6mU zz7%+wZt{G8B~Z`xOx><(-N5#HGm6=YS8yar6Z~xR0K?FU-23V=)?%L>N|H#V8Oeoy zL7yENY|H`&is(oW>4qB+7wzkGKkA|momdC9GZKM;0Ur@Rn_=;RJ@7s6u&@E7y3dBC z7&sBwVFk)0?zk$jpcay#B#ti&D2N4~Z=iHa7@c61gI-cNz)E$TN)rh)SYa$k$32v=ENNxH z#t9t>HX?qRJx?Br(KT!ZqghC187c+A)VK1 zAb6X~;L1+`Ho~D2a?FU{xeoyWZE7^_y6Z5aBZ-IYf>v*0qu`)t;3aH1#b4Nz7Y6f~ z-|lG<>t9*U!ys+qi`^R$Okm%P96)=z4l^BYs{-(tXcB;|Ka_YkBG|x3FdZlq-wk@O zFA8+>qg|lpt-_WTlL0hvNRV0xpW*A9;9VNOr!*cXmfGG(GNwW z@V4X4=tp5RHrmra-XhWsMFOZ&$O8-nv{omS4?>&|XdwUCRe}HyAi%H(R1cW|jr!zy zz@feSR#1({!~W7sAfh$#cEpZ5KCwUVnol??$`pdwj{31RW6pT1J!~k1~P3v1eaZDzj%xa&)#mNBZJ9C1xj7)zNZuZQcc(innfm| zM-N5|&^d1pl-X62H>TXf%Q$loc;>M_8KOebbgh$p1`WX{0jT5a!OMo)4_U4D=PF<{}cbCIDM|W>2y9M zQM(g@@B8zN*&XtVyf{JQ8&c{T9PX&O>LRDqY|71|AlKdN+OF#;`BWg z<#zuOHsBd8Uvd>`0It@v^(*w0DLBkzHf%c6+4w~>w{{r288IYo*l5R9AeMjzTburV zQ?oBERFF``$~jc2L1NIPz9NiQgwz3h%VzZobddQVsJg!d^;6KSX(@!B7B5S+3}{^D z&zWrCiYrPv@?&8xoXO*2?qzIrE53{?uyLM=p>> zkxLytOPajBKulf{nne7Cd-xXX}P`igvsoKXgW&MI_LHM9-n`+-wL%IEKvawiuG4t-CD9J(JZT} z1Dr4E2Pw6}a;v24zW(~P^~)M|tHt8@ga2C*n`eJ!-Y@V-Z7##WOcbpZhX2^cv(Uv- zMhg(*rbe#(9CFcd~ottiOf}8b;cFTZi?0Q z1VgWS&Y}};o3VPe5R%b;2<9hGKN_hZ5HS8p)6dO3FMNxC3Jpu)8t%AWw*&r{PI_(khaOrWxLDWjOuuIAK1mEe3x&)cXrGy z>MbZ+QT}bMld*q1z1niqrQ{bvS7fM zjR7idga;z1)LOwD{uZPU5WVaaO;j!H)7GmY8~j1>(jr%ch>&R$M03kmq~$KEO~vkRyWLI(sLT?7FGIdTA_u|$Isfal0a(B61T|E$G| z-9?Bl6dEethUp-aH)^Prca?eb`nfEE0&DJs@;?p4sTot$@4y(qNfc6!Fp+73e}Za+ zku9xSq38{A!-arwJlH%KSatf}fwygFXFDzQkdWD<(NX&^ky7!#@n9(xaNy|YtS~HD zb@*kdlV@6AMWQq9ilVn6q3G-Z05RmZp$D@>(zD#qT1<91eDI^IYLuX2 zooM~5fX27e2=n?+uc@lZxM)8IrhbhEGPF^QOY3JSjtB?gt7bSx%hkn#JX@2HWepTM zreNQAkp^;Qzce~jLZHbg|2x5yG|5jI`uSOpSn>xFpXmL3(D6GD%~C|Pubii^R}32B z5WOG<2JKAk319iOh*9!{Cazso@|tn`5#}|Vs#lO@I!HU$xhtdSC2598rSVYeaKndG z1{8lPcpM0$WQN&1)ffU%@jod2**}!-@R#@4)|@HCll@7p?(#JGuVM>4;t+HpYz8_rWLEr3d z$73zWI}71u>^TV6tY!WWbJ|oG-f3R}NS7SZ&ZOmxC7MX(dJqld_FBPb)kJsDlus@0Pe8s^*L}p3e(8#rwPQCLLB(Q(;~JQx zmS`b3z!K=_J#8Qx!^6P-aEJszoW%Hhyidc2S&$+lZcn0s8yIId9;9Rg1-R=OYABH{ z0-IMK${x2EaHPufep}|2CpL)aBqhji+ISscOZ!+ zMuBN!J%$2HPm^v?ftT<_r2EeVfPWG=$O>o79q~N>|HQQyM&6?ywAQ)qGb)0WbXQ=+ zcXoX-9y!o8(H~OiGy(4zWq2_b*D%{uY%ko+ny^1 zd0Nh?l<&VE^b&@oL4yj6d9dEJ1UFLHdhOiNfM%33KZ%UG**^o_bC>b`t#hyY#3zhfh0p$99O(Hl>)3@GyaDX^|z{UGKcM#9ed}RSl&M?_-ImEq!hL zPbV#D)Z~phlq+O|BXO~Qn-_U#bL~C$63nNR1ZEgnYEBc;~OfDZbOmWqOYf9E#a7IKO9C%r>6>|ifFxZIp4SYfYT{0F5lgXK;9P*dsJLQg#%}dYhpj zZ^I0#>5xg1Mx3?k;=GI8?w3P`ruN_dCXP{at0;#g9Okw&mIv)KgQ>o-pyGE&@tT}W zXB9@kq>-b3Y+aASHxkG3aBh^vHe;#Gj(xA1mtO2TRf<6$6mX1ISK_HP#0*LLs3ksB zGM>y0=66~yw$%q&(eK3qNL-47it%H6cfISouZh2#aI-F}3Y6>{QmO2pS?Veuo?_9^`PMkUT?{xDATPZ*xqIT3x~Gd_!bKjIXsKdmcXA_UOPM?C7n zo^GwEy3Y6QQIl5fZW1txH_xLdkpSF-9}($BM?pxBr?Y6%3>!%tJ>+0b&Trb=)`AQb zan(!SDPS1wuDqpQ-@0V{OC72Bxaj502&_&YfkeL0iR4yxpMvfk@s44WroEBlz`hyd z(bbOUP8Zv|$dOIVe^7NhtAe#ly~VT~y!J{p6C-{+9gbOu5qEt45xA}J*6k9OnOvFj zFJvd6_ww)fHbi0n=a-8(Z@ia5&5Lc^w=+F&nBrBPymsgQq<0zWE@1lglULXepT=O1 z@~>~6yg@%Wqhl^R3HW2(wyo~t;?N*II~Q3?ZcH|tALd?w+pF0vnbbJ_}Hf#+@N$>eL~;8SDL>s#rx08-gQ34 zU)soPXoNXr6?5@brw-LAmv^Rm9f+-IJH4azp4D=*;i#(+%jVyTh@x;DkzvY*Vfb9Q-+ z=dLW<*k~b9UQT3R{riXcM3Dl_^5n(DGHORcKp(ch9%}t`$h?H|1KfO@4wW?gB}%Wp zqY2W_GY#SClf0eyf5BCj);^{0ZSAxTr&fg3k$h~f{0Piab@s>A)gs=N1AqCwxx!K% z7q>J(q%I#^T=P$)yk}zwe;ifQe0?7wH^&T8=@N7>wf7>Lc}$Hfg8bCnQmah2iId5a@x|hk!OHDivJ^DlIJGDK6b1g zX9X7ZsA4+geQq+>Mu&f{2y3#oD>E0fnN;QsW%)35@vGxn?{K8d_?c`QyC2N03Dt&r z%J7Sm9RpMVcV~RgwUudxcd0teAp8}sT7oXCy_oPiN@c!zF+pav%#PhTFj~BH{9fWF z1N|V3?#dsxoXjS^8_+a-+y>Ndw1!;-E#ZZ#)CHE;V@8w`# zL?4@vm_dCZourvI#g^bNznDLf*vLnNBL22BSxvE7bFA{mtIxrrZU|w0=7Og(KqZ15 zseFfL&>p`h*i|wAIA0z5qrO^Qi7nZ}&X)CS0>9-|X^|kINuadg)#TK%{*t%Sgn62R z;<77vF2c}tsEi4FU0Sn&NpPk0x^V*(_SGbbPH|P*gZGQ!ytG0qxb7R1*IS=P&X{LP z6vyrh_aA|MW;&l$ZSXfFvFmYIi$k%uX^+AOYL}lJKR>Zp@G}g9Bk`gf*^H}SJQpiU zK^Bj4{Rj-tIVkw|ex7PfLTb0|o|E;;wsSY&opCkcjaLXS^Mx(P-Kv>P zSBVI&CtN$5dpIhbk4GGi&1(KZRxhUC0#wl7S98}FHh|5 zuP*De{^nqz>gOPnBC%kaj26JpWRa!bdY4ntQ)6fz#;Pn?>cgob%#mux!6vQ>v)v5P zH&Jk?aeJ<_V1$*+o02`J?Vstw>&Vf@cyS5wHhiS5oBkB4u6FgMHvpUlJi1YkajPJz z&0W^G(QfQn>pYXPZKAG_HOj5NeT4B@Q7)bBObx|->ATMOj1wqs?NJ=3m0_V|o2FvS zvM}=`%9sx2*ztvXT-&cP)25*1)VVXskn^@TC8_aLOtgkk!}3$ z$7=Xpb#k?`-xm1te(?YJ2?D-P8!tejV4K+9yc5>I0P63Hf+X3;+0 zMSi!xTcMb1*{voJ#smcK8-dPbWv|VFv%2|x#IyM(RX(+<`0aGSDcoA&cpke^gM-K{ z*{4)cfp7T838?k9KIxBgE8V1oaXsw}xJrttGf5N_ZzX2l?%`aI{BE=4}`3W_mo4IlrNnO)KyjJG^nBt?O<_`yj@qJIr}VvSU@%}p-h&-Z_z1lYQVDd zn-|yxd3LBtr*3x3ZAIoQ;2;}%_T<`^YCW@g(J}D@A0~83@q>-9{bP^l#IiQsi7B?)iH+VS)_Y@-U$z~t~Asq8He^!wWhn*OqD*&v&e6=FCj@gefUVq9PF?0RVt1E%os;0KmQOg2xbGUN^USOeU`zL`jx-QL|Eo*r#%{&jM4y8Wi2o~lOhZAec~uduLCR#rA8C1rhn zCSxGuNDg^oViLLp9o)QeX+0Pm9BinsFCQz<9Xp%cp15mBVNn{<%$Ps5=KN(-DFgr% zfb>UERriI%otZ0;#{G$w>eb_?& zG4lV%ayrXk-&FJvs54!^N7`Frm0C!T*6V^Jv?Wz#;M>rBq<)*?Z~rb`VM~&H(PVyd zv!sr(ESA6Wu2`z`Va{J;+H2f{KOrPcp-hLsqc#v+%h=>GYdU{+^t5Q>Y%>aGee@+qD?K=YMc;l`oxi5@ z`~?SFN#JU4ZaIVDF1}F~l@^`LpME2wPd>d~AkF;gGjbk;HGVk5CdCpfx@Rtr+n;~{ z&bl=3bqZ)sa=t}4(}B!@i=0I%Y5OIQ#)0m|0tu#z5Mner#Tct2aYqM;>nwFu^bmcd zwA~2m+_b)DSvLZL*?cOWXC4J8e_fw*daTiS|AD7fTZK2A57vOGUP@OP7ed`zbeBNu z|8RCtV(B$7vIuzZl)zGWy8wwhbIzRggZt%We=+)0Yh04%e)F5U40X^&uSPuB2Wyti zJ+?3Pf$37&vxhV$saxLy-!)0MhdCUS(3;LmmjoRKs^43QO_Ce?te~A|*2&hPL)Udj z&M1#QC!wy&XSj_g=Sz@fIr$c>!_~HWb_G>g7<6w#r^f+36R)$P&~rGN7w}TyN{% zG|ddq_WaPVwg&$6Hw6|}6nKG>(Tr|h!|GkvxPwTU++A$0( zSJcD3Jz9UWF=xaN)gG7)H+k>KTk{6e!wQ&z1(oT# ziAo)@L2%c+RgDhapxiqnBKK72w0i(H#DhQTV1Ge`ZfHLA^0AtACwq(2GheMYF7b`@ zH;`>E0BAQL&8W2Cjg)hz6zMoKMb4}3EA;olELZUf2fX@tdl+ubC_!K5-a4iZs_5&- zO_jk>c&7mZidTcIW~{jE##J**iTp(%o{%9ACa)+JZ#n8;Rq$&90s>b^!MO-ee#=X{ zJ`BJEK0$c5$=6K|60s`>oLioBxg~dEqT-~7L*6R2^{-LJ4YywtSLS}n_kS&9b6;LL zTI>a5bSeUUmV?TqgPA2tmLb*2$k|pJpko*Z>GsKVMV2>f?dvnE>?qz})AYNVz|{o7 zBCWRb3FIqC(D#9TjrMIQqWSZaSr3}ak!@%!F>X~~hZ>IFb2TJA^4ojSBmr{Un+PJe zTp)s(kqX8)h7E7l(s4(@)r2|`&g-{~z^w9`_rh3I2IR!;py45%Ro`)8n2s^zc`~a_#k~Ntbow9o4YCldqBO$G-;@eaY4jzz$>wsMA8g zPN3E&fBR?#=$F#oZsa^DWgz8o@Olsrl5S*H%vglSY?0{v5QsqdV-Dh;VLt)nitV$r zZWd=ah-3m=R?@#n>@0oCR;~6R`A1LDX5it^)F^lbl~aQv9DY-`2Vr73v^E;{Q$o;O zd>-q_^}%Xxk|U8E7Q}JT<S1x-`n~@pv`&h_LmS^Fy z*N1IvA8-NvQH?zERm}$xvUZUdfOu!3siW^jt9Sm$zLPefak=V7nQ7I|aEu?K+3FME znq_xYO;*?up;BS*NOpzOD-HC$51RELGi={{I=g&fIYtBDmIFhs*4+Cah`B(?m9T^> zWs@>7ZGf)20!N4e5_DN6#%`JCx?{Oer^psSBj;BW-i`FC#>!WiEhnk_8l}%^M}~H! zT4atPJXYOlqtVu`3^sESb#U#ku@)@Ex%g^F{_U1ZRZ z8H5;xSnUrh!Z>L2dlBm7FCTz-s^G{5YaK|Ag)4t>(-_v30sTR3T0Tic4}d_GwLke) zGwPj?psWYk_KaLwKmPA?b8Mr^p4@gz<#S@tT*j_L37 zQ}9Exh4Afo=AQZJC3pDKOuwYMuEC?+^w%yIw4wTjjzV&IH9Lc~f~%Gj{kW}(`1KC+ zW^F{2Ri$Zp)b8ypo(y#rZ1?E~`{Lz4bAql9@FRuI`mS&k(8X=^`2A;pXToi0@>i7h zL)XeW*=Lq1KSzsgrwbOON2#D~mj6Cs@KfKbvIKYc!i$q} z(I2C64ZpNs{A5p%>K97hXKJPZwyJV>urCvL)XT>mDXo-!IBzMNHYWIJj zKn!Fim!e#M=awQdlN9I1>>!$h?$5_KEEkfgC?{2I=KfyP5hmg_N-uP{w&`7b)>7X# zxN=+FdhpsKan@3ZYAOD6bF2y5``3JMQ!wfz_z^j6fN}A&ch#(oPg?6R!|=j&RqBD` z{=!m`s80FWRHHn^l{iJJiLUV2F6sRWy#Diy2_-(PW=EGs9%Of&1Sz36tDy7xS6XHL z6#ltyhuvubi%47KascJ=MJdccGa2p8D!W>%CsId!jw3&2_QLkv-B+s2EK)^6thJu= z^P6jTKStzgg4h0&fyl~bGofhXJ#E*R)4Gj3W{2HYs0MCd!CbRnvoxXktP{OBaeD!0 z(R2n|T$W&&SLQD-0`aTbYhx7g8d3pi<4?jqJAxXYG4EILVF|+IduQEJ=gsJ$Wg?Ir z$;Qn6{KWl42or8oT14PX;Qc%^4K?V`qWsq*^eY1fXb$cV?XzW7T!%U!h^gzo>7FuN zj0bhW?q_A}ap@irrFOwp76KF0$WJT^rXDD{JCcUjwZt@Z7S~pWU{M}^!;sPFetK50 z+Ot`D^XCW9X1jPbu^d1RMFC}IW(0`KUErPV2Q#c=e9FF_`ZqdEMMtp-(uTf!Dg_k2gcg`-KFPK zIWXA?uZUbtJn8_u+s;8NvRu?`S{gwM6-!YpDaHM<`>^qqp~1;>2Txt_k#l*q7C*c0 z2i6)L06Nx$6e=>Gy!jLlGHr_S0+(lSo>kZIr~d8AZ`8sti~vRz^Y{+}X+@?TIuHe8 ztYPO`f-aX!6u*aeYcPpnHD$!xRzL4mPj$G+C>G!()WnunsEJiHrF!AC z{-qr*bzRTlx|)r602V!S=!TvX--wbG1b?aF2K9L?hH^HvE`>6vbMoY*^IWbGg3MZ5 zHPS2`kCFo0gx^~kPk38me6)`SMx$68Ixe>nSQ{F;^&wQ}Z$hVK)t&d+fsg@CHad}_ zFNF+#M_GlO4?auM}jNNDUk3sqczaLg}l5vl|C)cByXP6yOI_JKh+ZG1Pk8X@~K)VOmfU zVmUkA^cJdLet?bKK~r7Qma<3xRFBKRwaD0TB_Qd1EVu6hO4NIk3YEmjZo$lVEvlH( zTbx=L{xCxU^_91il&UQO>PBK1z*EBPu(z_M{-Zg(2lw)qanIYZ#i%WBp}wrV6e4b9 z*}JVL0!E1Q$fri|p%1nN)FSH@T6o!-I1~XC4~H;Ae0e3>TC^fXa}lrvF6$mrkS`LD zD<#CB$?&Qgb(I@C#%Um}Y6h_1=Q6yKJikk@WYy!e`D~mv1;7uN$QT%faUrpaK_qdq zt2eslg-b!7=JDjc)>K?ezRd`(~7=ICkXz1AM;%8^SarY$JQHa^Gz|r(( zMpn`|NR;$HDh{`Vv9|}8QEFR$a-z+HCg7TIPAv6Q#ugwTDt*jRUi)(t9q5BNmO6YZ ziB`C?EwfA4cGLom8T7+<-?fFI~zCt#Hs4A=5oqmLHH#VWo&~L%I?r!S%?V zs#JA~r|g;Eu_d)uI-rinc8AEPLaIlHTmhHuT`6xa7)a)X=X&3NJCYrpe$UusQk!Pd z{`f-9V4Ah^SLj!s=2Yy>6u}9`r$sqeN@QKP;@nh5#({;lm|8U44r$2~3-r_P(rqQ9 zd(oubyLUbS@DluqQ_p^Qr*LP3S_I(HKy{e(X-B{S6tv*wva&`mXFZ|pIpaQW}njNXLBZ33Z+^8zRw@l!6Z*K<=C`&mG z;w@9EM_aq22b7^4UmNc9%kW_X_Nh~tki{uP17y=x#fy4M%#r5>+;zgkt9`!v9GGNf zRPJ3dy}y?it37ZCs* zH#TB#Q!QoZO)m=`uFqh$Y_{!+Oz^W>v-sb6AIAFNAST}_k<WG3>Wx zQa~KT_xgqwT7X{5zWe9)VAIN322jX>HmwnvE#1t>^1K5s$ioAOytUT!V6xC3HoyE+ zZv<^>aKrn&c~W-j=O6=Y3*i)%0SoYz?*xJ%DqxITrF3P8=eq{d6YYPh3(3RT|M1_1 zx*sza!BRZt@KgYn#~$sD|5B63edHhN|cS-y=fqEuvDwN)_NM+8Y8x*cno!$=Z zjdA!zHu;a z@1A2sR8y{po)pY`Q{>ODPxBk58rS|6wubJH5^WWRUd5bSSe_@GW10U%Abmx&OO1pV zOV!iw=qcdMd6~GxJO7y_+#4LKB;{Dnaj^9+@nOiJP*!1D8= zowxokKnjgaALlVJeT2U#T8hEZkYL(}hCWNcT3&lyMI~&bfNfG2E3|M8wQwcW-oz`b zi=IU6qy$nwe@aC?F=Os#LG{R(x>53ISrrdr9-Kwi;~5sLIuOtij5$@1s(Ua0c+SC& z*)QV^263@peDO9-mZr$n)#x*!8u-OeMc+wuhCdOwD*t|{9cl_Pqsi50V9{dAHPM5( z@urxcPIEMPaNlf&{sZ+v{&Anf`5!3n*JLbixWdQ$JJ=?Y@=ABj)D-878BIo$==&mt zd5p7r4&oL0w&>j0yd3N*j(UazZvmNYiKVT2kw_#xCNmmsA5QrPyYohi@U3seD~Og{ zg<%HiW?X+YEu&aO2&MCWnn^?0u-J`D#@!Q_T2mHM(=@p!ZGIh0zA9=ugUjcj4slcY zyeX4YcI96_4b;u26dK4;U$(XxIQ7GES7T4u$YXc$4BPywnIJKM%y_f4G9iw&irwp< z9muI^Ri>5Dm#V+-)u7hTqItBVH||uXY2uhF%wF>G@z{EobkitMfuyvp)kqITwY2fL zWRH|1SwOUG{Lf0Fv54qgsi3aIfwVD;3pW;aKN9YzKVY-IsyH}lsjmG`V=jaYE<)L2+-{wc|j^UuBtg^V}*sbw`;8_^R-gVy6jT- z5V|G;m4IO%)|V6}$aQ0j;Xk}tMQyg1ai)VM}5DB)$JiW++&5p$@{1 zFKQ#v66}QeYdUrGT0LzZY+;Y!b0LA@M#Rn-_n_8J>pWkBF~KNbXTUxDHPFCPtQob? zCKHk%zyis_cIjOO?^?+}7{$#m8rm%L@gl9=3~Ko6St=ZL%&a=&bNtsLlfiU5$1wE` zVsDfI{Q7OrHkEBH(4$4)VE>SM|Lv>it=3?tD`-hI^owCWhUVs#Dqux5=4Av&?qMhx4+SiOvZn<<8yc&(l9Gv{$# zSpFqC8Vc-$uh9X>g2%j3JgZ@NJPE{z&+Zfv;2cD)TTevpJ@2*Fjt?*t?3p0Q6ZPa@ z$e--U^BrHAktYxTjTwV1Btbv`#Y`3GI`rw8_3NgCAZr`j#m|>irSu#5%!S^;(@%GC zbQv%}WG9l5-Or7gyE|U}CR=A9IQ;R|Z;j_7Q~mZ4mv{cf$l4cM-W2;iH>Mpsl<~(L z=&L%n%~Z4#LVx5JA)P-zQrn#kn8XxjnQ5{7ywJxPb*96^;h0+M+R+PKoa4s(8 zFw3%MW&xrT{^{s1ZhL{5065GGN{!Wt^z?xBO%j&lP>o4OUCfEcKNUNAsQ`oFgf^i>w5G>~UmA$w!}5@(Kh?-}#vf4tdQ@w12&oiD<@}RAk#;4fM6b zA~^pxpVt;$+>eWNLB!aMNzxv4`PMj1OMHMuF+}M%b>FNo)_8AXtOthW-83zCX_xso zGLUz3wAEFg+Cs;twuTwhO>!P&saEspKN=@AP96L^?siO7s=8Vgylt5x*UUSS7;$|o zJv<3sKMybE|A3PvJ;`6{ZT05-56IeDayx1IJF9!C*UDX2AO7zi@Y=~(K@?{}i$t0P$ zP%&i6^Zn`U>_*4L+2Lu#S1flYcXdE#{=4Yw#|ibyU97dDxSl4kX7O?X^ZtOfsHpA6 zWxLAN%a>Nz+r7=xa$q4i{ow9VTS;kg4zJ-JLu29{6rDE29Il%8djisvwvyChbIX_u z#$T}{KscR59}ik-B*To@O8O#;d(3s5>SMpru{`=9?_^4_jt^agJ$*zOs~`>feU#O7 zz)vq5x0fwW|Iw}sm$&7K>6a~|Z5_6AO;b#OYjoR3JdZ{D8w-jx@SGf)Wo6heA@rM- zOgX_H?3e~@i`^4)nx^(^+ekj8cBWK11>uCl%PnzVb|3G@aT!Ri7haXlpHDP5kAq0nt?)Vm{W)S!`z z>+|bs;5vYruZdr*W=`*1+kLUw^61FSZQ15;0o|<`Cv6Zw>n`j~ZZ)HK}V^=wVb9SmCR zf3^f`*SRsKLFuu{OdZ%AbMGuBmHz!jduyN@^`*lqGrpFZtmjcC--j<>m|x@Q{k)1G zSi0+Yvh*@3xJZxwkmr!s@wjOGa(v`F=WO@ot1uCQAO6@wbhjYc8Iz^_9J;vXgdOl5 z`OSZm8~?u~*9_uGnC+2#zhC5-q*ZJ?Nj*2zY%VgMHaVtIl`)n@CET5~@1jb)O=NkJ z{AvH=Q)=Xr{6Mq2BcgKrv^dS+CLhBl5t+0L3EFti?Q~1{B7T1(N7=E<(`t)W-;)IO zOo&_6T@}HDCfoa5VvT~BSnzHGPq=>iT_d25j8DBaB+Nu4D}gic6Jxl)>hei#`uKd+ z53Bd;;Lyn3d^Dsr-l@S~9&{Xhhdsayr&x^hB@bb)d3gyS2$0+9IpeC_2dQ2`CCFoBkmLB+aG>K%sxPG??*s3c~ z>@c_csgkqYTKrKVa0%Ja&ys$AtxzFPbq>rmjTq(>30(9PzdS2vML*OV0R1{02Ec={ zB?m$wl3`0V@Mnn(G>dt5I}0I5Xn7#IL|VI~I3V(@vXf@}z!pMzYJtu=cmSFpQ81yZ zI=6%1b{`5)^x-&~> za=k_k<%hl?b?Xu~NP4|m4o!zrM0wpjCmVslQJzNg*2Y z_JohKj+p8Le?Y~T*^^5PZX%YRcMI~1pGwCyJxO4zaG>oKPE@7O{VNT&(&1pyQBfu+ ze0%yv!1Ie=<=e2BP)@X3I>9%EIkVL6I+FgC+gXb67lA5LNiAN5*;2%u;6q45H(`=3bU0OI> z)#6TT9VL5`yJa>y#J|t+pWlr_TBlpdyYzW~?1sYAc~Eif@4^g`+^kcGx2!WyX-ZL{quXv(JO`6u)#&|hFx&zbK`#mZ;{-R#(2Y3JvjA$REbpQ~ZKnFoyf-tcW{`@*`b zq+s+X&r_193GZE>KtEd>2$N)PBAk-uM&&><*&Wl^4~BbIHbb5f&p>ca>{w^b! zC*6nc;iF7;Y;jk%{|+il0#cwh%G=iEHa9s1fk-wu%Dvqkh)D|K*v~N%@~_6W>8<=| zx!5xz&5Y(oms5u-?ljE{bpcd8v1u7ic1k__mBG>X6YKFJ%phl>uS!PHyAlj&%3WRW zt#o6`P*V574cPsiC>C@cOHSpPv!4FZ$VK8<;v>%w#$)*poPQMKT`%Y}4>C<;I*U`5 zH>;4rJVolwEx*vA+`mDYFd9>p_#3yJphKM$WMO#GLg|+Pb$-f930HL05}n{|AtmD-CsX0|=dJq(kZRuR>R#~(->q8QNs7BbF{3u0{dWq{yf zJ$j%yyx%#vz2UxBdZC`U@OffJo?noGdF6H1bB^ih|k_+YZ#w12p^aG<%}-~*9UiHiw2z_O>eQ+GsqkFYMD<% z5l+*P*HWq|w|zta^4a-k<%rBp0H!LM&*S&l3P-~h(ZuPvnPR#)%aAZ8lxYhHY6#k{ z-+!)nBZ?=SDVuG{R7BvC!7ICJZ}8b1dbgJW6h1EdpgBazxKl$CIQjjEKnqipdmf&7 zv+FHX5VIVUU7}si$8eLs5*j1k{FIP}THtvr^~Y^|=E(7k9uepjx`EQT$oqghy81W<4z}A*!uBU?~8|2 z*vC?H78EBO9%G0!HJJ-2qC)xuQoA0{J00ouE(XMBO<;1d&&d7{$SU|E?)mfYwzmuC z&dYI(9mTmPO=BGca7wyh?=pm#9UCpl3Rg-<{HNKV-Akjssk8Oi-`qs|wnJAQ5St8? zzBzGaG_&Dvkfl?xS>Dp3pu1K;K{jv4o6OLzg0_$-^__9i9ur>RE(iQO1+jDS^@Cpz zWjwNQjjJEl(z#x}lZYqt+XFI`G;yGuI8^YVBQ~1^_H2XfoaLlYy1J}LIqLgHsU z3yXnjBjFF-1j_Odf+NS^cN_)!1=D#0r)TV4*H#5-INJwcg5%f<*a7m%Dy!@iBf%e6 zOs*B)ChNy*40kP9Cf{?KSx9{PA^S2hazGV>s6wZ1yYKxX-g8^*S}kcJ{mY-m9xVTj zSjm7*kD@wniw{TwC0vINJ)>8FCSOt{Tib?bq({#!Ynb-A!vXXYOs&?}*fJbZtA<8p zPL@imi(sWiZIcc$RSZU6oH`%)+wr|9r?I?O2$n2VS8UKs)yS1L2dR3s(#8q;$+4%u zbZx6`!Bdmt?Ec0XqL6>4yynMb7Zi0JXu~+9{aNmIA%6LJ`A;un zZ#rK`s!l-DOhX4j7eQrem)VHg6;}&q4^5xj$mHBRw~D)?Un$rbC^%P(e^PbPxOxDzvS8P+SnNFAP2lvKvM~Ep@n!C*PUd#=iQ_a zTXbbrxX{tof2kv>Yn3p0AmgYvSX2lb<-vp8VTWPvKYDOs&<%M(y@Rx-b)K8tGc!Wk#&AR^9D?5c zL+xyC&Efar-GjedJJd1IOw99AtN|`+ZB^D(`ZZYb)1ajP3T(XqguA zB(|Pj8DH#2vs=vm3YEq!PaatFlm?o(n_-8#$h7uv?e=xwxz#?{9om#K0&lNzoJ->5ZYaagQ1&R*(>G+7yMbIHHqI?OQSpK73J)DUEe(g^BWOteBZv_d zWIzSc`T&o9r$Vya9v-|G28?*{bAIj@z119(Ob_z#5(eB!3tfdg-?{Qq{rrJwka*1(C>tP~7qW-V7X>pD;L{h62KZ2i+JQZ>5fL#)@;nu5%_$-7Aj3^Z@EN=u}dLy*ri{;8CqM<%Mvv4Dy z{5_KA-~)H)s*!Oi*+HO3e(>%-n5VW)kEjX*Ob}unVvcFJZ7iA<4yYf$MzDg2sp3sa zGv!U(Gn#9amWr>^;{2z{dNt?Amt0FOKfR`I0g(f-x4S!`OgrV!?EHz35`gWhap-9s zJLy!g9vtg!qernfQ3RH9+X9i-?hHFfP6+R^1R=YboCLLI znH|CwSaQJ?NZGF345GP~4Dzb5r(Ub1zGVPMaz`* z1R8qqt1~b}#!bd+IsD$RYG1W$Xz1Uf z#TsN`m7b9vPh;X0!KQ9a8(ffH4?2!CJ#6IDNX$>1>SJz7Qye4}IJ>aJAQ!@Mlnb6v6@-6JRVr#NmOx!kgG8Fo{)G|v#8mTg3W0X6(`5C6y zoMs+3W~&UQg!YpV&MM?o%fRSgjxH`PqCZ$r8-8QF&0ZSWsXLC} zsj*~r4xsoU@oA3rL1P~j zUm~jN0xR{@>BP^n?3*%gwDg)c$h+ZA)z?^{j2$&)p0$jdEQ zHRxkR011}WHYj!Q>`!}GF>@c>^YIPFS^#P>o9_N|c53O@<&$&ACSYSAUm4Z!tE|mu zT^dGX)AxSAO`1092&)}_7&`6G040T4VA}kYN{NdYy8%5S=h`0fpI~p}PC)jAXHBWP z%8WBPp^l)h#5BPeo!v&~Ie=QFq$_?J zZG*Tzo3_y3PMajR{9&kwg1r(Dx#FaRvf0ztkF|3nwkqum+{azRvlDc~-G1@`6(%D& zZVDtP5&PY_hh4gHgM_9aT=0$P^guk>orB|g1fb=`J*F9>GF%lrgH7S$>s)s-n!&?T zG4MP8Z#NBLQkc$qIZ$vBNJdoh)dC;=BH`mD`}9vhUlH;n6+|;CEy!vBIbS931d!!| z;SBHjKHMcdQo@ubpDb8JvGu7^4%e;p5gGnnwKuaD{l4KT2C?NZ#iJ6QJkIHROllsx zaMp(m!Ih?P>F|E8AynN@giUT-w|@}26cE`HF@Q|O?rsB&As%%CV-Rfz^?=xDMIG2j zk1T+_D|}{%SiT5$cbS7t7xh!8H;)sgxLl2F>QBi=dxH35F*qrCq9ufCwDuDM0O3>z zrMOoAf;afU>Jbv+A?J((AN4-mtmO6(z>STS{d>~r9I{l>jLd%}9IhSH!BYH9dDs%@_8am;(j&!R6Hs-HXJi!qf6(l%6Ql>*){corzK7iCQ$+6d7hdq%rb%Uyt0CE$N zW78I0{*xm4pc70(4u&GL6A|o*tunk3_jUk2k0R#)R4S0=Ie4{m>XejX(xW-=l;VOgVhJdT6@qTe9-ik3437QEOhy?{C!Lqov78xs6 z@<*^6OM3&Zcx(PBJYDZU%QnuYcj~pglvlsU0@{#IMamfM=I}1U=8SaYZqXr0kw5_V zC%=g%oaMF;eCn`o49!8g#b|)L8mQY3fN0=SJi`Ak5>WEZ4fBhunystZZSKT(63T9g zw#L%kXNXyu#u_{TH0FE%K7O4Xhqa}N*}9CMV@|wbO1%p>@CD!r1uSDdA0+StLwQDg zwo2f9C`I5{XuH;gfle)mFw=p4N@~m~LQEQ}-t=*q-2iu@IOO1)_^bNDEYMNxX#)mn zX(BZRNXjxfztwC~gftqc5_8SyssCGIORm~X8KxrHRw}Mm-GI`bP}X^+bBmdy8GeP) zO329UtGD?;c4DZ090z-?sOqL~E%4!E?II|kxL|?Om(pt7oI!6T>P#La{QH#dg<^*X zs$RErS;Px0`u-HgIgoKeUvsn*XtWARtM!{eE@YIjI)c}D0Fc_2J ze_8sFkykt+O;q&jsP0Gbg5|dETNSTOq{u7yx6tXuS7R|3py;v5}?kqp@d zlED|pI{6Q-4S_&Y0@w>Ir;8;juNVNpz`0M|XOTG}U>eqmwi0+a?a)Qc3G#hTlZ$~0 z@^6n6G#b+%CkLDHJAcz#*4KuZVGSh`i?)K}34@n!SlJQLVF_rU=GWx52T*L|e3(5| zt4~uUQEf?|u4pV}_>fZh!`0p;%v-D7*uN*T{PIYrC+T`!Wt}^IMguKFaNxTvs||*T z#<0(j7@k(mi zcTmk1A-1pA!1CIqpboZ`?Up)*^K-LAI znp!kx@{&g=0;BwlUp6GA`EKe8wx5@;X$DJZK8+Muc27SnRI^;uhi=FN0Q3zg>c^f% z>Fd^45rzf8G$TlGb|g|j zHJ=}8oJ8U>Jj&`>W-XSz!`U(|yPNFSN=ZK2{=AzSHULzAhOj~Zq`}?Ud`_>!08Pk^ zDl_lyJD;UyOYBh8^XJx;A_Bl1z``GlXyBWo$322aAAnxl@_O)px17SBw&5k^lQ3Mo zX8mFMJ_4)l9dad!9~F6pBmpQWEbMnaOkCto<7Wdex7I~2v`61JFEQ zl6ZCNl?zE1e=J%)2#H`Q7SEAt3Eel-SuH#dJt4jjT(ez2D+~xdm3S~|n5`1r2?;3r zsPMlenYwNGtv<=St(;e_7+K5RL<(|~9Qgg&W8SxG*K0jV^(KDXva)Z{$$q+!e4I2t zl<+cLXzLjFc8%wLV`F1y`$1*NX=3G6{Pjt>YQ3JMe^56}D`!94whM!ZwabUfKk$HQ*)t})?39#N!yc=Y7w<uWVzqZb;K=O`I5cdn^Vp2{$Pv?@N7gv;yE_dcdr^^GDU$b5NCbtQry}XbuQKRiF zaRH1Z{Mx7nSP6Yn+N)Up&NcG3ylnBSZM&L{-?A-Hn$P8MA&n7zO*XL4DE()i};6{a48LjMl0G}>0fabRIZrIc`l0JNJ-VplCjNisU zIl7XrieS= z9eqb$(NqtCgaopBg$&{$FVlNQ!O=?Y`2HNvkGyPk?kEpM3Uz-TZK*i!`t3pJOWiAQsNM9*J?%O|wLR`PD{eK{}(*nZ# zpt(x(7oGQ%X;0y}{3r=`bDlt{U6*d5d{%y=_e7N%C9R8P<9m5a$K>jh&`i02iHm@p^A=UdQysVqCu;DGL>XlTl2?3<$Z3@a-LXe~ZUjY-Ac}H|=2l@9hWoOq?4@zqBgMUiwU#5t`P%BXf8{~$_t)J7**2MXaT*Um#3b!;%uA4$ z+9cf(6aZjm|M@S#Z-MoiYp?fAXf7!<6G=5oJax;HGJ@&A|FkB)Ee z!}k^c{b@^YlRF;*JS!<2`Wgns6uLXm3ii-M`5>&lp2ry0&c}PNKMXj9rGRwN0n_PT z`~CoqEI@B7_<#+43A~;L@ojtuIK(^?8WUGk8AOiqt4rO#yw6xshx{23DV}rAOiNT~ zK<~=b=k9=bZ+tY(mZz_1os{^@AeyT@%{!cXFm z6D9Z@1Hhg#Xc~1Ox4Sr&j}F8rPT*vW+5&v$%SQl5&Q97dg1XjXz}S>9(=ePLi~&6{ z&v#P~yuIk=VKIiKUw1ZF=hcB-<0JK6hMO_P=YdPl1dl25rfSG5%A5Isn3(hofv!xn z41>6?`bbj4_kYX#RqG01b-+rpRgtm-@4BfQgp@2ZP57Pv2F*~xr^WrJxh=2ZdAius zFx__^%gi{1zbgJsJ4{YHF);m5?a~yGG&;F-ea!WxGoqM2q_j+_yz5i5rFKHt-kj$S zK0g}2YI-Ek?p@rpaPnNaA5SAcaX%3?($k+HxN^D=Q2*H}yZ%modhyGHtZ36(-(0KE z=E~GF|H`lH`s@5<{_x%KQdaH`J&6PRHDWm)t@yz3XSQtCC4Lf9?E~{4{PD$-@62bU QJpgI-boFyt=akR{065Z{Q~&?~ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_data_structure/number_encoding.md b/ru/docs/chapter_data_structure/number_encoding.md new file mode 100644 index 000000000..84d061ee5 --- /dev/null +++ b/ru/docs/chapter_data_structure/number_encoding.md @@ -0,0 +1,150 @@ +# Кодирование чисел * + +!!! tip + + В этой книге разделы, помеченные символом `*`, относятся к дополнительному чтению. Если у тебя мало времени или материал кажется трудным, можно сначала пропустить их и вернуться после изучения обязательных разделов. + +## Прямой, обратный и дополнительный коды + +В таблице из предыдущего раздела мы заметили, что все целочисленные типы могут представлять на одно отрицательное число больше, чем положительных. Например, диапазон `byte` равен $[-128, 127]$ . Это явление выглядит не слишком интуитивно, и его внутренняя причина связана с прямым, обратным и дополнительным кодами. + +Прежде всего нужно отметить, что **числа хранятся в компьютере в форме "дополнительного кода"**. Прежде чем разбирать причины такого решения, сначала дадим определения всем трем способам представления. + +- **Прямой код**: старший бит двоичного представления числа рассматривается как знаковый, где $0$ означает положительное число, а $1$ - отрицательное; остальные биты представляют значение числа. +- **Обратный код**: для положительного числа обратный код совпадает с прямым; для отрицательного числа он получается инверсией всех битов прямого кода, кроме знакового бита. +- **Дополнительный код**: для положительного числа дополнительный код совпадает с прямым; для отрицательного числа он получается добавлением $1$ к его обратному коду. + +На рисунке ниже показаны способы преобразования между прямым, обратным и дополнительным кодами. + +![Преобразования между прямым, обратным и дополнительным кодами](number_encoding.assets/1s_2s_complement.png) + +Прямой код (sign-magnitude), хотя и является самым наглядным, имеет определенные ограничения. С одной стороны, **прямой код отрицательных чисел нельзя напрямую использовать в вычислениях**. Например, при вычислении $1 + (-2)$ в прямом коде результатом будет $-3$ , что, очевидно, неверно. + +$$ +\begin{aligned} +& 1 + (-2) \newline +& \rightarrow 0000 \; 0001 + 1000 \; 0010 \newline +& = 1000 \; 0011 \newline +& \rightarrow -3 +\end{aligned} +$$ + +Чтобы решить эту проблему, компьютеры ввели обратный код (1's complement). Если сначала преобразовать прямой код в обратный и выполнить вычисление $1 + (-2)$ в обратном коде, а затем перевести результат обратно в прямой код, то получится правильный результат $-1$ . + +$$ +\begin{aligned} +& 1 + (-2) \newline +& \rightarrow 0000 \; 0001 \; \text{(прямой код)} + 1000 \; 0010 \; \text{(прямой код)} \newline +& = 0000 \; 0001 \; \text{(обратный код)} + 1111 \; 1101 \; \text{(обратный код)} \newline +& = 1111 \; 1110 \; \text{(обратный код)} \newline +& = 1000 \; 0001 \; \text{(прямой код)} \newline +& \rightarrow -1 +\end{aligned} +$$ + +С другой стороны, **в прямом коде у нуля есть два представления: $+0$ и $-0$ **. Это означает, что числу ноль соответствуют два разных двоичных кода, что может приводить к неоднозначности. Например, если в условном выражении не различать положительный и отрицательный ноль, можно получить ошибочный результат. А если специально обрабатывать такую неоднозначность, придется вводить дополнительные проверки, что может снизить вычислительную эффективность компьютера. + +$$ +\begin{aligned} ++0 & \rightarrow 0000 \; 0000 \newline +-0 & \rightarrow 1000 \; 0000 +\end{aligned} +$$ + +Как и прямой код, обратный код тоже страдает от неоднозначности положительного и отрицательного нуля, поэтому компьютеры ввели дополнительный код (2's complement). Сначала посмотрим на процесс преобразования отрицательного нуля из прямого кода в обратный, а затем в дополнительный: + +$$ +\begin{aligned} +-0 \rightarrow \; & 1000 \; 0000 \; \text{(прямой код)} \newline += \; & 1111 \; 1111 \; \text{(обратный код)} \newline += 1 \; & 0000 \; 0000 \; \text{(дополнительный код)} \newline +\end{aligned} +$$ + +При добавлении $1$ к обратному коду отрицательного нуля возникает перенос, но длина типа `byte` составляет всего 8 бит, поэтому переполнившаяся в 9-й бит единица отбрасывается. Иными словами, **дополнительный код отрицательного нуля равен $0000 \; 0000$ и совпадает с дополнительным кодом положительного нуля**. Значит, в представлении дополнительного кода существует только один ноль, и проблема неоднозначности положительного и отрицательного нуля тем самым устраняется. + +Остается последний вопрос: диапазон типа `byte` равен $[-128, 127]$ , откуда берется лишнее отрицательное число $-128$ ? Мы замечаем, что у всех целых чисел из интервала $[-127, +127]$ есть соответствующие прямой, обратный и дополнительный коды, а прямой и дополнительный коды можно преобразовывать друг в друга. + +Однако **дополнительный код $1000 \; 0000$ является исключением: у него нет соответствующего прямого кода**. Согласно правилу преобразования, прямой код для этого дополнительного кода должен быть равен $0000 \; 0000$ . Это, очевидно, противоречие, потому что такой прямой код обозначает число $0$ , а его дополнительный код должен совпадать с ним самим. Компьютер просто определяет, что этот особый дополнительный код $1000 \; 0000$ представляет число $-128$ . На самом деле результат вычисления $(-1) + (-127)$ в дополнительном коде как раз и равен $-128$ . + +$$ +\begin{aligned} +& (-127) + (-1) \newline +& \rightarrow 1111 \; 1111 \; \text{(прямой код)} + 1000 \; 0001 \; \text{(прямой код)} \newline +& = 1000 \; 0000 \; \text{(обратный код)} + 1111 \; 1110 \; \text{(обратный код)} \newline +& = 1000 \; 0001 \; \text{(дополнительный код)} + 1111 \; 1111 \; \text{(дополнительный код)} \newline +& = 1000 \; 0000 \; \text{(дополнительный код)} \newline +& \rightarrow -128 +\end{aligned} +$$ + +Ты, вероятно, уже заметил, что все приведенные выше вычисления были операциями сложения. Это намекает на важный факт: **аппаратные схемы внутри компьютера в основном проектируются на основе операций сложения**. Причина в том, что сложение по сравнению с другими операциями (например умножением, делением и вычитанием) проще реализуется на аппаратном уровне, легче распараллеливается и выполняется быстрее. + +Обрати внимание: это не означает, что компьютер умеет только складывать. **Комбинируя сложение с некоторыми базовыми логическими операциями, компьютер может реализовать и другие математические операции**. Например, вычитание $a - b$ можно преобразовать в сложение $a + (-b)$ ; умножение и деление можно свести к многократному сложению или вычитанию. + +Теперь можно подвести итог, почему компьютеры используют дополнительный код: с представлением в дополнительном коде компьютер может использовать одни и те же схемы и операции для сложения положительных и отрицательных чисел, без необходимости проектировать специальные аппаратные схемы для вычитания, и без особой обработки неоднозначности положительного и отрицательного нуля. Это значительно упрощает аппаратную архитектуру и повышает эффективность вычислений. + +Идея дополнительного кода очень изящна; из-за ограничений по объему мы на этом остановимся. Если тебе интересно, стоит изучить эту тему глубже. + +## Кодирование чисел с плавающей точкой + +Внимательный читатель может заметить: `int` и `float` имеют одинаковую длину, по 4 байта , но почему диапазон значений у `float` намного больше, чем у `int` ? Это выглядит парадоксально, ведь `float` должен еще представлять дробные числа, а значит диапазон вроде бы должен быть меньше. + +На самом деле **это связано с тем, что число с плавающей точкой `float` использует другой способ представления**. Обозначим двоичное число длиной 32 бита как: + +$$ +b_{31} b_{30} b_{29} \ldots b_2 b_1 b_0 +$$ + +Согласно стандарту IEEE 754, 32-битный `float` состоит из следующих трех частей. + +- Бит знака $\mathrm{S}$ : занимает 1 бит и соответствует $b_{31}$ . +- Биты экспоненты $\mathrm{E}$ : занимают 8 бит и соответствуют $b_{30} b_{29} \ldots b_{23}$ . +- Биты мантиссы $\mathrm{N}$ : занимают 23 бита и соответствуют $b_{22} b_{21} \ldots b_0$ . + +Формула вычисления значения, соответствующего двоичному числу `float`, имеет вид: + +$$ +\text {val} = (-1)^{b_{31}} \times 2^{\left(b_{30} b_{29} \ldots b_{23}\right)_2-127} \times\left(1 . b_{22} b_{21} \ldots b_0\right)_2 +$$ + +Если перейти к десятичной записи, формула вычисления будет такой: + +$$ +\text {val}=(-1)^{\mathrm{S}} \times 2^{\mathrm{E} -127} \times (1 + \mathrm{N}) +$$ + +Диапазоны значений соответствующих частей таковы: + +$$ +\begin{aligned} +\mathrm{S} \in & \{ 0, 1\}, \quad \mathrm{E} \in \{ 1, 2, \dots, 254 \} \newline +(1 + \mathrm{N}) = & (1 + \sum_{i=1}^{23} b_{23-i} 2^{-i}) \subset [1, 2 - 2^{-23}] +\end{aligned} +$$ + +![Пример вычисления float по стандарту IEEE 754](number_encoding.assets/ieee_754_float.png) + +Посмотрим на рисунок выше: если взять пример $\mathrm{S} = 0$ , $\mathrm{E} = 124$ , $\mathrm{N} = 2^{-2} + 2^{-3} = 0.375$ , то получим: + +$$ +\text { val } = (-1)^0 \times 2^{124 - 127} \times (1 + 0.375) = 0.171875 +$$ + +Теперь мы можем ответить на исходный вопрос: **в представлении `float` присутствуют биты экспоненты, поэтому его диапазон значений намного больше, чем у `int`**. Согласно приведенным выше вычислениям, максимально возможное положительное число для `float` равно $2^{254 - 127} \times (2 - 2^{-23}) \approx 3.4 \times 10^{38}$ ; если изменить бит знака, получим минимальное отрицательное число. + +**Хотя число с плавающей точкой `float` расширяет диапазон значений, побочным эффектом становится потеря точности**. Целочисленный тип `int` использует все 32 бита для представления числа, и числа распределены равномерно; а из-за существования битов экспоненты у `float` чем больше число, тем больше обычно становится разница между двумя соседними представимыми значениями. + +Как показано в таблице ниже, значения экспоненты $\mathrm{E} = 0$ и $\mathrm{E} = 255$ имеют специальный смысл и **используются для представления нуля, бесконечности, $\mathrm{NaN}$ и т.д.** + +

      Таблица   Значение поля экспоненты

      + +| Поле экспоненты E | Поле мантиссы $\mathrm{N} = 0$ | Поле мантиссы $\mathrm{N} \ne 0$ | Формула вычисления | +| ------------------- | ------------------------------ | -------------------------------- | ----------------------------------------------------------------------- | +| $0$ | $\pm 0$ | Денормализованное число | $(-1)^{\mathrm{S}} \times 2^{-126} \times (0.\mathrm{N})$ | +| $1, 2, \dots, 254$ | Нормализованное число | Нормализованное число | $(-1)^{\mathrm{S}} \times 2^{(\mathrm{E} -127)} \times (1.\mathrm{N})$ | +| $255$ | $\pm \infty$ | $\mathrm{NaN}$ | | + +Стоит отметить, что денормализованные числа заметно повышают точность чисел с плавающей точкой. Наименьшее положительное нормализованное число равно $2^{-126}$ , а наименьшее положительное денормализованное число равно $2^{-126} \times 2^{-23}$ . + +Двойная точность `double` использует способ представления, аналогичный `float` , поэтому здесь мы не будем подробно останавливаться на нем. diff --git a/ru/docs/chapter_data_structure/summary.md b/ru/docs/chapter_data_structure/summary.md new file mode 100644 index 000000000..e17c25b8c --- /dev/null +++ b/ru/docs/chapter_data_structure/summary.md @@ -0,0 +1,66 @@ +# Резюме + +### Ключевые выводы + +- Структуры данных можно классифицировать с двух точек зрения: логической структуры и физической структуры. Логическая структура описывает логические связи между элементами данных, а физическая структура описывает способ хранения данных в памяти компьютера. +- К распространенным логическим структурам относятся линейные, древовидные и сетевые. Обычно мы делим структуры данных по логической структуре на линейные (массивы, связные списки, стеки, очереди) и нелинейные (деревья, графы, кучи). Реализация хеш-таблицы может одновременно включать линейные и нелинейные структуры данных. +- Во время работы программы данные хранятся в памяти компьютера. У каждого участка памяти есть собственный адрес, и программа обращается к данным именно по этим адресам. +- Физическая структура в основном делится на хранение в непрерывном пространстве (массивы) и хранение в разрозненном пространстве (связные списки). Все структуры данных реализуются на основе массивов, связных списков или их комбинации. +- К базовым типам данных в компьютере относятся целые `byte` , `short` , `int` , `long` , числа с плавающей точкой `float` , `double` , символы `char` и логический тип `bool` . Их диапазон значений определяется объемом занимаемого пространства и способом представления. +- Прямой код, обратный код и дополнительный код - это три способа кодирования чисел в компьютере, между которыми можно выполнять взаимные преобразования. В прямом коде старший бит целого числа является знаковым, а остальные биты представляют значение числа. +- Целые числа в компьютере хранятся в виде дополнительного кода. В таком представлении компьютер может одинаково обрабатывать сложение положительных и отрицательных чисел, не проектируя специальную аппаратную схему отдельно для вычитания, и при этом не возникает неоднозначности положительного и отрицательного нуля. +- Кодирование числа с плавающей точкой состоит из 1 бита знака, 8 битов экспоненты и 23 битов мантиссы. Благодаря наличию экспоненты диапазон значений у чисел с плавающей точкой намного больше, чем у целых, но расплачиваться за это приходится точностью. +- ASCII - это самый ранний набор английских символов длиной 1 байт, включающий в общей сложности 127 символов. Набор GBK - распространенный китайский набор символов, включающий более двадцати тысяч иероглифов. Unicode стремится предоставить единый полный стандарт набора символов, включающий символы всех языков мира, чтобы решить проблемы искаженного текста, вызванные несовместимыми способами кодирования. +- UTF-8 - самый популярный способ кодирования Unicode, обладающий очень хорошей универсальностью. Это кодировка переменной длины, хорошо расширяемая и эффективно использующая память. UTF-16 и UTF-32 относятся к кодировкам фиксированной длины. При кодировании китайского текста UTF-16 занимает меньше места, чем UTF-8. Такие языки программирования, как Java и C#, по умолчанию используют UTF-16. + +### Q & A + +**Q**: Почему хеш-таблица одновременно включает линейные и нелинейные структуры данных? + +В основе хеш-таблицы лежит массив, а для разрешения коллизий мы можем использовать "цепочки адресации" (об этом будет рассказано в последующем разделе "Хеш-коллизии"): каждый бакет массива указывает на связный список, а если длина списка превышает некоторый порог, он может быть преобразован в дерево (обычно в красно-черное дерево). + +С точки зрения хранения данных в основе хеш-таблицы находится массив, где каждый слот бакета может содержать либо отдельное значение, либо связный список, либо дерево. Поэтому хеш-таблица действительно может одновременно включать линейные структуры данных (массивы, списки) и нелинейные структуры данных (деревья). + +**Q**: Длина типа `char` равна 1 байту? + +Длина типа `char` определяется используемым в языке программирования способом кодирования. Например, Java, JavaScript, TypeScript и C# используют кодировку UTF-16 (для хранения кодовых точек Unicode), поэтому длина `char` у них равна 2 байтам. + +**Q**: Не является ли двусмысленным утверждение, что структуры данных, реализованные на основе массива, также называются "статическими структурами данных"? Ведь стек тоже поддерживает операции push и pop, а они явно "динамические". + +Стек действительно может поддерживать динамические операции над данными, но сама структура данных при этом остается "статической" (ее длина неизменна). Хотя структуры на основе массива могут динамически добавлять и удалять элементы, их емкость фиксирована. Если количество данных превышает заранее выделенный размер, приходится создавать новый, более крупный массив и копировать в него содержимое старого. + +**Q**: При построении стека (очереди) его размер не задается явно, почему же его относят к "статическим структурам данных"? + +В языках высокого уровня нам не нужно вручную задавать начальную емкость стека (очереди): это автоматически делает сама реализация класса. Например, начальная емкость `ArrayList` в Java обычно равна 10. Кроме того, автоматом реализуется и расширение емкости. Подробнее это рассматривается в последующем разделе о "списках". + +**Q**: Если метод преобразования из прямого кода в дополнительный - это "сначала инвертировать, затем прибавить 1", то обратное преобразование из дополнительного кода в прямой, по идее, должно быть обратной операцией "сначала вычесть 1, затем инвертировать". Почему же дополнительный код также можно перевести в прямой тем же способом "сначала инвертировать, затем прибавить 1"? + +Это связано с тем, что взаимное преобразование прямого и дополнительного кодов по сути является вычислением "дополнения". Сначала дадим определение дополнения: если $a + b = c$ , то говорят, что $a$ является дополнением числа $b$ до $c$ ; аналогично, $b$ является дополнением числа $a$ до $c$ . + +Для двоичного числа длины $n = 4$ со значением $0010$ , если рассматривать его как прямой код (не учитывая знаковый бит), то его дополнительный код получается правилом "сначала инвертировать, затем прибавить 1": + +$$ +0010 \rightarrow 1101 \rightarrow 1110 +$$ + +Мы видим, что сумма прямого и дополнительного кодов равна $0010 + 1110 = 10000$ , то есть дополнительный код $1110$ является "дополнением" прямого кода $0010$ до $10000$ . **Это означает, что описанная выше операция "сначала инвертировать, затем прибавить 1" на самом деле вычисляет дополнение до $10000$ **. + +Тогда чему равно "дополнение" дополнительного кода $1110$ до $10000$ ? Мы снова можем получить его правилом "сначала инвертировать, затем прибавить 1": + +$$ +1110 \rightarrow 0001 \rightarrow 0010 +$$ + +Иначе говоря, прямой и дополнительный коды являются взаимными "дополнениями" друг друга до $10000$ , поэтому и "прямой код -> дополнительный код", и "дополнительный код -> прямой код" можно реализовать одной и той же операцией (сначала инвертировать, затем прибавить 1). + +Разумеется, можно получить прямой код из дополнительного кода $1110$ и обратной операцией, то есть "сначала вычесть 1, затем инвертировать": + +$$ +1110 \rightarrow 1101 \rightarrow 0010 +$$ + +В итоге и "сначала инвертировать, затем прибавить 1", и "сначала вычесть 1, затем инвертировать" - это два эквивалентных способа вычисления дополнения до $10000$ . + +По сути операция "инвертировать" сама по себе вычисляет дополнение до $1111$ (потому что всегда выполняется `прямой код + обратный код = 1111` ); а дополнительный код, получающийся после добавления 1 к обратному коду, и есть дополнение до $10000$ . + +Приведенный выше пример использовал $n = 4$ , но его можно обобщить на двоичные числа любой длины. diff --git a/ru/docs/chapter_divide_and_conquer/binary_search_recur.assets/binary_search_recur.png b/ru/docs/chapter_divide_and_conquer/binary_search_recur.assets/binary_search_recur.png new file mode 100644 index 0000000000000000000000000000000000000000..a67cf0f9c8372e246e5d37bf3c387d3681f72f10 GIT binary patch literal 13104 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

      Таблица   Индексы корневого узла и поддеревьев в прямом и симметричном обходах

      + +| | Индекс корневого узла в `preorder` | Интервал индексов поддерева в `inorder` | +| ---------------- | ---------------------------------- | ---------------------------------------- | +| Текущее дерево | $i$ | $[l, r]$ | +| Левое поддерево | $i + 1$ | $[l, m-1]$ | +| Правое поддерево | $i + 1 + (m - l)$ | $[m+1, r]$ | + +Обратите внимание, что $(m-l)$ в индексе корневого узла правого поддерева означает "число узлов в левом поддереве"; лучше всего понимать это выражение вместе с рисунком ниже. + +![Представление индексных интервалов корня и поддеревьев](build_binary_tree_problem.assets/build_tree_division_pointers.png) + +### Реализация кода + +Чтобы ускорить поиск $m$ , мы используем хеш-таблицу `hmap` для хранения отображения значений массива `inorder` в индексы: + +```src +[file]{build_tree}-[class]{}-[func]{build_tree} +``` + +На рисунке ниже показан рекурсивный процесс построения двоичного дерева: каждый узел создается в фазе "спуска", а каждое ребро (ссылка) формируется в фазе "подъема". + +=== "<1>" + ![Рекурсивный процесс построения двоичного дерева](build_binary_tree_problem.assets/built_tree_step1.png) + +=== "<2>" + ![built_tree_step2](build_binary_tree_problem.assets/built_tree_step2.png) + +=== "<3>" + ![built_tree_step3](build_binary_tree_problem.assets/built_tree_step3.png) + +=== "<4>" + ![built_tree_step4](build_binary_tree_problem.assets/built_tree_step4.png) + +=== "<5>" + ![built_tree_step5](build_binary_tree_problem.assets/built_tree_step5.png) + +=== "<6>" + ![built_tree_step6](build_binary_tree_problem.assets/built_tree_step6.png) + +=== "<7>" + ![built_tree_step7](build_binary_tree_problem.assets/built_tree_step7.png) + +=== "<8>" + ![built_tree_step8](build_binary_tree_problem.assets/built_tree_step8.png) + +=== "<9>" + ![built_tree_step9](build_binary_tree_problem.assets/built_tree_step9.png) + +Результаты разбиения `preorder` и `inorder` внутри каждого рекурсивного вызова показаны на рисунке ниже. + +![Результаты разбиения в каждом рекурсивном вызове](build_binary_tree_problem.assets/built_tree_overall.png) + +Пусть число узлов дерева равно $n$ ; инициализация каждого узла (то есть выполнение одного рекурсивного вызова `dfs()` ) занимает $O(1)$ времени. **Следовательно, общая временная сложность равна $O(n)$** . + +Хеш-таблица хранит отображение значений `inorder` в индексы, поэтому ее пространственная сложность равна $O(n)$ . В худшем случае, когда двоичное дерево вырождается в связный список, глубина рекурсии достигает $n$ и требует $O(n)$ памяти стека. **Следовательно, общая пространственная сложность также равна $O(n)$** . diff --git a/ru/docs/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_bubble_sort.png b/ru/docs/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_bubble_sort.png new file mode 100644 index 0000000000000000000000000000000000000000..51b4d97ee20f9b7d8f265dd3a5d150fc68773e38 GIT binary patch literal 19342 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 Ze*=c-^qfg(;)VbK002ovPDHLkV1g0!joknM literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_merge_sort.png b/ru/docs/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_merge_sort.png new file mode 100644 index 0000000000000000000000000000000000000000..1d3a79cf733a11d0492f9fb0721e0be566c7d74c GIT binary patch literal 21182 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_parallel_computing.png b/ru/docs/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_parallel_computing.png new file mode 100644 index 0000000000000000000000000000000000000000..564170df6b89402ceacb48d0967435d4144aecf3 GIT binary patch literal 19166 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%0DCeU&#zr_R0&${-@+9#Q822D&vm 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/divide_and_conquer.md b/ru/docs/chapter_divide_and_conquer/divide_and_conquer.md new file mode 100644 index 000000000..a46ac66e5 --- /dev/null +++ b/ru/docs/chapter_divide_and_conquer/divide_and_conquer.md @@ -0,0 +1,91 @@ +# Алгоритмы "разделяй и властвуй" + +Разделяй и властвуй (divide and conquer) - это очень важная и широко используемая стратегия построения алгоритмов. Обычно она реализуется через рекурсию и включает два этапа: "разделение" и "решение". + +1. **Разделение (этап декомпозиции)**: рекурсивно разбить исходную задачу на две или более подзадачи, пока не будет достигнута наименьшая подзадача. +2. **Решение (этап объединения)**: начиная с уже известных решений наименьших подзадач, снизу вверх объединять решения подзадач и тем самым получать решение исходной задачи. + +Как показано на рисунке ниже, "сортировка слиянием" является одним из типичных примеров применения стратегии "разделяй и властвуй". + +1. **Разделение**: рекурсивно разделить исходный массив (исходную задачу) на два подмассива (подзадачи), пока в подмассиве не останется только один элемент (наименьшая подзадача). +2. **Решение**: снизу вверх объединять упорядоченные подмассивы (решения подзадач), чтобы получить упорядоченный исходный массив (решение исходной задачи). + +![Стратегия divide and conquer в сортировке слиянием](divide_and_conquer.assets/divide_and_conquer_merge_sort.png) + +## Как определить задачу divide and conquer + +Чтобы понять, подходит ли задача для решения методом divide and conquer, обычно можно ориентироваться на следующие критерии. + +1. **Задача раскладывается на части**: исходную задачу можно разбить на более мелкие и похожие подзадачи, причем такое разбиение можно применять рекурсивно. +2. **Подзадачи независимы**: подзадачи не пересекаются, не зависят друг от друга и могут решаться независимо. +3. **Решения подзадач можно объединить**: решение исходной задачи получается объединением решений подзадач. + +Очевидно, что сортировка слиянием удовлетворяет всем трем критериям. + +1. **Задача раскладывается на части**: массив (исходная задача) рекурсивно делится на два подмассива (подзадачи). +2. **Подзадачи независимы**: каждый подмассив можно сортировать отдельно (то есть каждую подзадачу можно решать независимо). +3. **Решения подзадач можно объединить**: два упорядоченных подмассива (решения подзадач) можно объединить в один упорядоченный массив (решение исходной задачи). + +## Повышение эффективности с помощью divide and conquer + +**Стратегия divide and conquer не только позволяет эффективно решать алгоритмические задачи, но и часто повышает эффективность самих алгоритмов**. Именно поэтому быстрая сортировка, сортировка слиянием и пирамидальная сортировка обычно работают быстрее, чем сортировка выбором, пузырьком и вставками. + +Тогда возникает естественный вопрос: **почему divide and conquer повышает эффективность алгоритма и какова логика этого на более глубоком уровне**? Иными словами, почему разбиение большой задачи на несколько подзадач, решение этих подзадач и последующее объединение их решений оказывается эффективнее, чем прямое решение исходной задачи? Этот вопрос можно рассмотреть с двух сторон: через число операций и через параллельные вычисления. + +### Оптимизация числа операций + +Рассмотрим "сортировку пузырьком": для массива длины $n$ ей требуется $O(n^2)$ времени. Предположим, что мы разделим массив на два подмассива в середине, как показано на рисунке ниже. Тогда само разбиение потребует $O(n)$ времени, сортировка каждого подмассива займет $O((n / 2)^2)$ времени, а объединение двух подмассивов потребует еще $O(n)$ времени. Общая временная сложность будет равна: + +$$ +O(n + (\frac{n}{2})^2 \times 2 + n) = O(\frac{n^2}{2} + 2n) +$$ + +![Сортировка пузырьком до и после разбиения массива](divide_and_conquer.assets/divide_and_conquer_bubble_sort.png) + +Теперь рассмотрим следующее неравенство, в котором левая и правая части обозначают общее число операций до разбиения и после него: + +$$ +\begin{aligned} +n^2 & > \frac{n^2}{2} + 2n \newline +n^2 - \frac{n^2}{2} - 2n & > 0 \newline +n(n - 4) & > 0 +\end{aligned} +$$ + +**Это означает, что при $n > 4$ число операций после разбиения становится меньше, а значит, сортировка должна работать быстрее**. При этом важно заметить, что временная сложность после разбиения все еще остается квадратичной, то есть $O(n^2)$ ; уменьшается лишь константный множитель. + +Если пойти дальше и **продолжать делить каждый подмассив пополам**, пока в нем не останется только один элемент, то мы фактически получим "сортировку слиянием", чья временная сложность равна $O(n \log n)$ . + +Можно пойти еще дальше и спросить: **что если задать несколько точек разделения** и равномерно разбить исходный массив на $k$ подмассивов? Такая ситуация очень похожа на "блочную сортировку", которая особенно хорошо подходит для сортировки очень больших объемов данных и теоретически может достигать временной сложности $O(n + k)$ . + +### Оптимизация параллельных вычислений + +Мы знаем, что подзадачи, порождаемые divide and conquer, являются независимыми, **а значит, их обычно можно решать параллельно**. Иначе говоря, divide and conquer не только может уменьшить временную сложность алгоритма, **но и хорошо сочетается с параллельной оптимизацией на уровне системы**. + +Параллельная оптимизация особенно эффективна в среде с несколькими ядрами или несколькими процессорами, потому что система может одновременно обрабатывать разные подзадачи, лучше загружая вычислительные ресурсы и тем самым заметно сокращая общее время работы. + +Например, в показанной ниже "блочной сортировке" большой объем данных равномерно распределяется по блокам. Тогда сортировку каждого блока можно поручить отдельным вычислительным единицам, а после завершения просто объединить результаты. + +![Параллельные вычисления в блочной сортировке](divide_and_conquer.assets/divide_and_conquer_parallel_computing.png) + +## Типичные применения divide and conquer + +С одной стороны, divide and conquer можно использовать для решения многих классических алгоритмических задач. + +- **Поиск ближайшей пары точек**: сначала множество точек делится на две части, затем ищется ближайшая пара в каждой части, а затем ближайшая пара, пересекающая границу между двумя частями. +- **Умножение больших чисел**: например, алгоритм Карацубы, который раскладывает умножение больших чисел на несколько умножений и сложений меньших чисел. +- **Умножение матриц**: например, алгоритм Штрассена, который раскладывает умножение больших матриц на несколько умножений и сложений матриц меньшего размера. +- **Задача о Ханойской башне**: задача о Ханойской башне решается рекурсивно и является типичным примером применения divide and conquer. +- **Подсчет инверсий**: если в последовательности предыдущее число больше следующего, то такая пара образует инверсию. Эту задачу можно решить с помощью идей divide and conquer, опираясь на сортировку слиянием. + +С другой стороны, divide and conquer очень широко применяется при проектировании алгоритмов и структур данных. + +- **Двоичный поиск**: двоичный поиск делит отсортированный массив на две части по индексу середины, а затем, в зависимости от результата сравнения целевого значения со средним элементом, исключает одну из половин и повторяет ту же операцию на оставшемся интервале. +- **Сортировка слиянием**: она уже была рассмотрена в начале этого раздела, поэтому не будем повторяться. +- **Быстрая сортировка**: в ней выбирается опорное значение, после чего массив делится на два подмассива: один содержит элементы меньше опорного, а другой - больше. Затем такая же операция повторяется для обеих частей, пока в подмассиве не останется один элемент. +- **Блочная сортировка**: ее основная идея заключается в распределении данных по нескольким блокам, сортировке элементов внутри каждого блока и последующем последовательном извлечении элементов из блоков для построения отсортированного массива. +- **Деревья**: например, двоичные деревья поиска, AVL-деревья, красно-черные деревья, B-деревья, B+ деревья и т.д. Их операции поиска, вставки и удаления можно рассматривать как применение divide and conquer. +- **Кучи**: куча является особым видом полного бинарного дерева, а такие операции, как вставка, удаление и упорядочивание, по сути содержат идеи divide and conquer. +- **Хеш-таблицы**: хотя хеш-таблицы напрямую не используют divide and conquer, некоторые способы разрешения коллизий косвенно опираются на эту стратегию. Например, длинные цепочки в методе цепочек могут преобразовываться в красно-черные деревья для повышения эффективности поиска. + +Нетрудно заметить, что **divide and conquer - это "тихая" алгоритмическая идея**, скрыто присутствующая внутри самых разных алгоритмов и структур данных. diff --git a/ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_divide_and_conquer.png b/ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_divide_and_conquer.png new file mode 100644 index 0000000000000000000000000000000000000000..437eae7d536cf83c318303fa4e52d52546ba746e GIT binary patch literal 26938 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f1_step2.png b/ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f1_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5be706444ff3fc05aa3d91330c4327b39a6eab GIT binary patch literal 5644 zcmcgvbyQScyPq=*$Nj&B@*NJWtfk2?^YO0EQAP_!o3H}7Z z!-2Fu$_@w6C#ohMAP{Nq)e9u^kuu}UcP?)dT(#<OVq$%+O9qH$MKlsE96 z-9mRcGt2-eYm=f%wE4N0THJcye65DYZFS9&V?pk<6#**Kr!`_Khiqo(VuX9p8T#p!&c}~ z>mK8x7>)r2B$zr6M3D!==az$T%K=2>0MP>^Sn=N{f6}I7#_7lwlml)?g0`OlM4ycR zX!;u-API2_sjqlI_^+<)0IWDW|10wB`X6b>V&VtL53F*M7D%uN?H@<~hW||cznt-E z`QzLlTQz@t&ifnwqx<>SZPtxn#s2>pz$fk8OXJZG;YasQQzIb8v$CX{&+Dq#fRr6K zw190EpXZommL3f^N^g=hw&hy}-d2oXco0PbXsC&M&Z>OFAI%rwpq~dC(n79&J9R*< zEvTx2v$lU0a-nv9d87GY@G)v`lqqg^()N*Ly8T2`9h|iszRZPMAV-%ydEO5PMrFXV z+eQ+QpQXddZ$0rT5DDk&{+3PzQdN}LKG}M96g?>)Bv}V(2tH3vlmkXhLl_OAPy8*H z8F6=(wXUM#kp=h}v4G2kQI>rkxSDygVwhHJXpee41uO~~Yg`>f2;-{C*coY9g@?=H zk>LH(cFF~uyk}MLSVb_taoJH%gfKiA)IXodi@Jv=RprZaI%Z0VB}ujGHjJ#Ezb&yo({8kB@^G zkHS{>=V}hQP(M_@&j!h2Q%{|@NV{33Hg61xZ1-zSVtkF`v~1H6gPeUA-C~CwHJYAd zkfuDRe&duUL~Wg@>)-CCl*~VeSPr|78K>;skTS-G$%v(_6MwgBO=;w2_#l-1r--k5 z_^RKoI{Lqtz8t-LESAuH)4d9&A-#55f7v%|(KVW~OidGQ*KRl0@XwgNJsV^^in4>o zqGZD3(Z(sbcx7I%=)3>p_`+=FhiJ31%}7f~c*hTW`Al3GFp7UaaFLCV_fJ#W~^I3$H~;d@;pV%7gCy*feqru`rz1LD0= zinOLZfm94dVDdoXcg()C0?gw%S2o*7_+3=8;>seXZ^n%yo~vj3Sg19VLj-SL?NKo% zdiAYyk8J=N#d=~Vrfx@oKA-!xB@quQbXSPPwo8^|ZBUnC+qGGz2nyVVQyFT*2XT}s z;AaD*$vhIPGg*r%62iN1IJp<^5CU>@p=hJiGa=A1>T;4|$ikanvfkCbSB5>>5+5uN zHnUb>KCptUD!-PZk700rZB9E@g*Wfcw8uH>8P+pK)qEH~h73|)B0rDZ$~;*T!5a;t zU>v&)j2j-ZY8LtM-^{ zjC7YSv(zWpkQf1Vj$engI~H_UQ^%nF_a_08xdacbLgTJYuQe8rCbO9(so(cLW^Wrr zm?A6o0{7d4s^0Ahp^}{{pm85nuwD+HanBF1k*uif>}+MWOJ0PE9~XJ;I8jY%dI7R@q?h&mT{>_aicL8yGr6axlP9mvI3;NA=M0>6@69Seg`A; z@QePVw@ur}WokZ&x2kU0kuN|OmMYy_(9y9IPKOGzldjF(o;D(}m~tg;8zh-cd_}bh zdcN~CQVM0{evq0yx%^eU>F2TTX`j0NZz0r5o_G1h5=&!G*vRnDh#G&>tS_PRSw9#4 z!ZN#5yo@#ql+0bs=#h6M%UuOx1a+Xd@mxB6q9({m3BF5oZa(q;;;412O!k*O!P33` z2Mjr@9@A=BD4T%nz#DxEKb!*n5~e>+l-h0vfwvklf5o_Ir|>2!sh&5EEW9{A2!BF4 z;AwQ0+CN`$A{z0{C46xje!lxSrj>u^;_}*!dFgon&*$(>UQ}S)s?+oa9obCH>*fpo zJ+)T{Uzw?Y^}jf+LP1f{%4V*QrBFQPzM@vnTYyg8YNx#3o?WA1vptdbx^9rw6SmDUc4Mo_ z3{hb(Ho&dI;8tf&U(cP>S$blLJCopQQQ|RvifSG3j;Y}~Nye|(=_Xh3(_5=AoCNaB zA0O2th1)vd#H|J*ahw4$NW9lbrLy}L_XN2Rhy;o!8bpHB-8Cd+$`o-`N)X6pu=Fi! z3ZS{iYal@E>3Sz+OGHUrV+G;9eV>`d%R?otFAs*oWtdOG302oq)h91%iB`TR%9I!g zpaV6PQ4`i_FOjWAYPXV#WN9~^y1qBPW4L!A8q9p+1AQy$7w+fVl#XA%zme9yd^5CN z6&0wC>Xj2I@slp9R&$!Y`S7UT9A6``{%aN!$my{uReIlv83er;tk_%5$%gHqaB}N0 zK%>gnXK9?5XYtw(+=gEwxA(Y7I0p42Yv#Kczw9#7cFB&~T>mC{{Lv>QWa<5Lrz-RD&mP++vo8!&xdhsJnKK_{mvf2< zs%jBOvfPMs?aDGoCi{bdu3hGu3%i40M?ykN5s1vTYx+YPLP8-9-6Cohx__PnSehD) zly@iBxt~RhI|GKFON<0k)vqmh{(iG5(JjeF22$tF75~C2Splv72)+d0>nD0eNCbNV4wMG3Ckp34skhV7CXk;a?tE>9@D}SFHv@{1`i2Dbi0buKhaSN~Q zRO&kj=@_IIjf+z$XApH6xJBKNc7p=E!V6BIAk*!z)mhn}Y(XOOV2XM$agIC$yhG}S z+Fv@#sG^8WXi9i~+0BpMMflIy1jg3g0l==Og% zX8)xZ?bILATeK2_~OHs{v{nKD<^v>I| zOjfm_(nZ0y-Aj5-W8AA=1$TLJVyVM71tG&`kVl=ya!)r^_bVKv?fLI!(#rItR?putt}Z0_+d`W{zYht|oS>HE(^x?7n7cJHrrV zw-e@hRU#t{lc)WreecK8e0+0%k0FZ)q^L!}6C%Vrw+^S$uGJE?@kf>u0zVh1rM4lk zrEBOi=m)@q9^koKi*%qQ9^`o%<8=ez2@xycQtdY(uiekt%Igo9lG&)qYblrj&u$eW z!m{7+c@nMMQ8CSNx*Lu3`kG`u6&XRTVxj37e;?ekp?fPUjRh{lmPfIt%lLF6?i#+V z3OK>Gg*tB0B}IyhY<=K&a}={WA1gez@a{+&VNtmCqq@(6&$Xhc06&~I7q7Rhg+;ft z>hgQgX|z<}6;ZHY9g=@47AE^u5#z`Pk7j-ADBtfxSJIOq!JEgdVpgh>nxzDO+AAqO zl2-bVSi;aMT+a}q0YtlhP3jP&td`H#5#ZfU^fe)%WPy*KA*p!S-@Q_Ws(Oa)G<>#X zga6Wm8B$razAHppq$rCE-(3tel`HisNfF=^1_^+@w%_ptWEZ&I-F7y~SPJ+8B;SaV zforqnIhSIgPTwiy)#Z3$&s=X3-$<*rOYM9gidjprzK=Td7}w+l&+a&s<`%ariF3fI zf!0C7frF5iJuM|UqNoOECOK4_66$7pKK`@1$5OZHNZEj5CJS+Xw!HNwU7t6U?+1nm z9W&I90SldbKFg78*&%E|z6_iftPa{PKLU;?LSI%AAA76~=n=?R6~o6hpE78pUF4H4);$24>Vsf z#gg_1$TgStzS+>#d8`!3elSndUb=Szpy71oVd~Vo~i#nN- zY6okco)woDKeKG^S~I)@!3FEfmZ_Fh3-?* zllx{+O6EN%yEkAkiH3@LbTu%D69WgV*qd*@62_b}WGvVOEGJ2to3Pv79@7z_YV19K z2d&1-p3Rmo5oR*?y{veBSqBimJN&77Met5+I2i zqUk>h#=_k9KQm%Q@p~P5K)5k`pkxV=`cQF>S4!?LMj=P4OfX8vHGl#UT(E{WMY~Br zI|K0cgZhAfp6~z8$pB#WVY15OQ$H~@r*FQvb+T%_;{zWwCv@uL%VUf;PnYoY@3d%S zg^ssCmj{H=jvY(amV%`}FUAMtZ$bRSrzqv*KmdS5g1}%LLLfLKBm_YqT&VxN_^83t1KqAC+R_!<0rj9>G9`LbKucdfBd{JSojzp?=!PAV7A*l^)MFlH9+3E z7hI%bKc6|zic2-o^y2_E5=BfAK4aliPbP416#la|N$qA>5G&TA)|AIulw`nE&V4uK zTf`YsOxJ1?Z*mgM41shCVk^?2uYXi%j?^EOtJD$|nHEMIA(=e@j7bX2l#$@tWEa|Y zU1p?Th;)sN(#}mk4Ep=tmBDwZChn!l^H%MJvQkF~PtHeqV;J!oRes|0ewwqXE4jz(9TEf7=7#4Wf8)IX0 zn(AuFGYfD-I}79`k^vv>es=pdvrNXK&f5O<)VVjbpMENbvKG&)qHNY+nTHIH0LJf` z_8LskqkeHDq62n}>zNGX#g1bmW=B%k!5(sG-ibZ=Zp{y$BlDc~w9p}58y`MJma>krrNW*0PQr zJ&s^2CI!0m@eAPM1y%9lKk{YrbXWv63BB873&`o7u2>MQ4SOBpGhQ_>r?mvx@8(^y zfJE77X*OeUho4*fhEjtT~#h3f*(!@;QHop*?Enuq>{TySOA_@9-L3D+3ikL z6vaS*RyYsxdtMjJOcLsDPF-MeOmNp4`;B|e=TR4mE?!Wj3)Se_Z|I!~mA?p*f0WoJ z0UPx|s5>vG=`51I3e|Lbbj_b`e0e#MOP^( zRX6HX2_#K(&X=4Wls2#Z-p$pwFkeWMVc$da_FQab{^V)T#)}Nsr{3>!6TAAtJbygj zdG~>KH*vq7=eAK*0%~9VZbLe1Wixm0jK&@AusIxovG}%*7$h0RRA( zsfmFN0H9bR)Q&{3*hyQO8;h~~n4I?q0PYVvFL?hjw+IUa{cVi(fPyyBN!9{+`IN;e z03eev8_qlX4_TX^G2GtXzJ2@l%F4>z++1u`%;}fY)ipKe9-i&#?cE>ItfQl&|Mc6l zXV2tg^HlR3RRMr!zp25gGl6~647$f7H;6Xxew{)Np73~lQ#EEHQZa511>r1zG7xP~ zB8*v&CE*401AA^cX+PJB3#d35NS;n;zJxI(Xa@=%`IhuMZ{h|bWG;L@NY3~1kF*;n z)MqQL23JFKp7)%Q7+BV#lU5TiaIrG|A3boL@BGuXkb1TEo8OGDx71{q+BmAG<|)dW z7Ri!^uNe~`y9hUDs;2G_;`ioNULuq4ike*%ufud}zVlR+Zb=xj^Fk47qf=ZEQkC%HUKJiCk}Xk73aT# z%O`htPdvw1!}SMn8W&;cD0Vl|zt}%>|Lg7*9biUxi%vuD(H$ z7PWJ_Bh%acyzh>K{)oy|9L!JTXgo+`EF;2{aR(X5u`22Ee)=E!-ygL}La%ai8T6aq zX2CxW-cXS^@_*Xw<G|Ml* z{0hm;YNibzq_v8$w4X{~DVi9VREkpcLUDT(0t((3{ImkA%~~9z2C{^gT_l-a1syILsh;#19ENE3I|%uJQ-KFN_x z{Q(tb1BJ?xrKv|uvX)BImzO_pA6Rw1R!MHrH+OkaU3z8lqD|6%7olt3WQd{sL(f~N z*~HEQmbK8TFM@5E9mPGyl5nZnxg^Li2@%@a{`2T=Io>tWx6v|Kc$ zcdOg&;+-k8GZA)Y&W=c6pFbUIr&oz}=p`$D_NaMd`1X@v^TZEaZV(TF=yJZW)WF-A z@?EGIDxm4a@b%-dKh&jkZjage{_Rw)c7IC2Hku4f5Kn}Y#>yFQ2KP2-Z=`q`swH{2 z`^YBMyow=*=EZB8bT%j6{YJn#t)1g{d6&jDiW94|x9r?DQb&l(khMjXpG}$yxAs}P zy?HkI^vWgL2=7q%fgsgN;joKejE9u#D4!fKAR*ROXG^suOn{|1^R<|G?A{f&yQ9zF zL{ldutm1zjiP4{<5>-+g-Z$mtPx{J$r(G;#m{DeA&+E~7%&1~{?i%P(vcMxZ^2f^>JL|SCe|BCe42pSbNJUW}YfUcEVh6bPEyRr(E}WK#)DJOB^xU8b z%}J&%GpR!LMRL4NUo#ok|KYC<9{-HF*BjFB=4Kv#h2OdLmYbr02p7txn7y!Lg<{tH zn=qHHWS4ye%H+l2!efG9(MRyOgTran3TI&S`K)N<<%G7#RM;|uD zG6Se&zA(z(tsq0#T*wLSJ`H4;ewsX9JJ@3xt-$>qa(xI)$wkQoY13w{5F24m36Y$ko0%|Fl~o zTmGU$mL{$6;Xt2dNwSxJLT*{sXNt;sSfqB-*=Er4yGS19ddXt`WqaC`^W!$`l-%(M zWo5d!Q(9w@*u~|x!h)Ye?_33$PG!30Vb`%vp9CGa_WkQd8D2wT5LaGS{q}|~)m_>d zsHc+oeJAQf*hgs*C-x4vBaS4EA|%*68z0t&p|?y@c~-5>q#ui~Sg%*9ALs2O?sMtv zA6qqaN4qZL#9IUFqjQGP@*rElGzGkRkFKWSEo*3(Er!iIVKVdlED=LB&U1wfMu7F) znQ5iSs@p%xZY;~2UW@X~Rrszn=_eiM_8@~ZVsAD^wc~7Id^9q)xy1R~pO)OC#G@%z zCySDY=xl%HGt7rG&YHywfCbacWj~2%IRP#xw50ZHOM$`~DIn-E3y%`cxwIUJR`tb@ zXalF;Y64%T(F{E`#D$_kK%c*-oHni$0t9#E4=YI=LL@T8LjLeh`t{+HLLuJ zPqX?HQ&)OojXc1tN9>bd)uk{Y4a?F_*N>%c3FZyAUx3w++)LIzj@g(1xtP*HF+^V+ zp9Ac07dC^mZ7*&ldA7~`rmjVJSvQKma)ee|B{LbwY(Tvz3xk7s@s8O|va2jHMl(%7 zcE}F-+r_ye^P^wh+xu58yeAF_f!*v0rDFg%9NsjmNRzTsE}(D>_4m#VW<;e&%pcrH zXWNKJE#xK5os-%G|8@ZWhYFwlR$rNZo0?WK!mCTy#0Xw*N74|C3~JxM!u;i- z1x61BDtE}x-sS??EP*B=1rFap&#BX8(Y#1BuOy3bEP`1CoPudnAa*?>$lhoEAQmKzod_#!6#0gB?+U;pGleIAS43YD+*OcjUq`jq;ue z6&V9|pVH#|5d>tg4mQnabB1;}ix^>L6Aj*dd2#;INGu<3Kid@zXqFr7Gi=mDRCagx zwxVOb5S$Icp9Q+Wa+ey(F2Hf7MHPCI4Ajm|x=IKCRHLQv@n*6Kj(b>4O&tc+peJ8} zYaxeEqP0a4mWCgWNEYm6zC5wdhF%(cRarDIAS$@!kl@8VE1GC?z6sSb^qSjadzHba z*Zq5rVt#=g*Wr;Io$*Vgttai&pzjaWrOMh41^%9i2#_26G6Qw3opESF$HpU4B9sJQ zO^GD-rwC2dp*JOaZXsDHXRYhLfzKMANf{GHP-S?}+!GlGDVoIE!te@-bzKu#)vvtF zHT3CLPbe`G$M-=7F~N)9jS^L;1g|#n_(fT8SQreJHf`1AX|JGOfJd~YX(UmnjbK=# zv2q;<@`xw-e0U({{XiL)oR{U8<^nIY7CsEqP^S4R>)NI@`WD15-u5;>B8RI~!TDzl zv>7i33aMZOoU#N}j@NzTWq#!M>a$2mvl{eaJ?(ewW#0=e zaqlv&g}k_2`7im*E)bhcxIk~($JO2~A*hr;d7fv#_c&oD&({DB^oG@X+!hkYUc4ZI z_c(pkGQ=U#UuxAyjV=$k!1D|BqTKssX^}t&?)Q}3#Bw#;*6g$J=z=1xXz7lHGa}`w zPI~SXFsegM=Hs>a2*^vgT~a%57ufg-g@05KIi-M)jLQc!f^W)`R!5zYGPt7{)h|N7 zHIJ9yR8kXgsx*};wve%1A_{iLC4{~V>FoV{xapq#%_UdMnRJ=^R*PAH?rU~lFLvi{ z$@xnBRX5-7(DY;nL4{5%$y`}=7J2?CWFb@I`09d@c%pZ776U(Z&V1GmnYJjh@tVPD z<=qqhJ~4J{1{^qeC954DSq A;Q#;t literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step2.png b/ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..27ec075b4aed9df48cd5a9260fae7b2aa61eeea9 GIT binary patch literal 6176 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 TksZJ6{s^k8Xe(DM*+l#YN0h!> literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step3.png b/ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..bda652ace06e744f1dfd6e48d0efbe7e30d95605 GIT binary patch literal 8042 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 No|2|wv4UC9e*h@G6L0_k literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step4.png b/ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..be30dbdc2f48af1a1905a446c483464e5b8accd0 GIT binary patch literal 9277 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step1.png b/ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..193a3e16c95d1d3c5132facc65663304358ad67c GIT binary patch literal 7711 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step3.png b/ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..f514516eba8e72c2f326f14984e8d67ebf1aa5f9 GIT binary patch literal 9156 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 A761SM literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_recursive_tree.png b/ru/docs/chapter_divide_and_conquer/hanota_problem.assets/hanota_recursive_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..3dd92805457cf56da87915919ba0641d397e50ad GIT binary patch literal 13391 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/hanota_problem.md b/ru/docs/chapter_divide_and_conquer/hanota_problem.md new file mode 100644 index 000000000..4f5af6af1 --- /dev/null +++ b/ru/docs/chapter_divide_and_conquer/hanota_problem.md @@ -0,0 +1,97 @@ +# Задача о Ханойской башне + +В задачах сортировки слиянием и построения двоичного дерева мы делили исходную задачу на две подзадачи, каждая из которых имела размер, равный примерно половине исходной задачи. Однако для задачи о Ханойской башне используется другая стратегия разбиения. + +!!! question + + Даны три стержня, обозначенные как `A` , `B` и `C` . В начальном состоянии на стержне `A` находятся $n$ дисков, расположенных сверху вниз в порядке от меньшего к большему. Нужно переместить эти $n$ дисков на стержень `C` , сохранив их исходный порядок (как показано на рисунке ниже). Во время перемещения дисков необходимо соблюдать следующие правила. + + 1. Диск можно снять только с вершины одного стержня и положить только на вершину другого стержня. + 2. За один раз можно перемещать только один диск. + 3. Меньший диск всегда должен лежать на большем. + +![Пример задачи о Ханойской башне](hanota_problem.assets/hanota_example.png) + +**Обозначим задачу о Ханойской башне размера $i$ как $f(i)$** . Например, $f(3)$ означает задачу перемещения 3 дисков со стержня `A` на стержень `C` . + +### Рассмотрим базовые случаи + +Как показано на рисунке ниже, для задачи $f(1)$ , то есть когда имеется только один диск, достаточно просто переместить его напрямую со стержня `A` на стержень `C` . + +=== "<1>" + ![Решение задачи размера 1](hanota_problem.assets/hanota_f1_step1.png) + +=== "<2>" + ![hanota_f1_step2](hanota_problem.assets/hanota_f1_step2.png) + +Как показано на рисунке ниже, для задачи $f(2)$ , то есть когда есть два диска, **поскольку меньший диск все время должен лежать на большем, приходится использовать `B` как вспомогательный стержень**. + +1. Сначала переместить верхний маленький диск с `A` на `B` . +2. Затем переместить большой диск с `A` на `C` . +3. Наконец, переместить маленький диск с `B` на `C` . + +=== "<1>" + ![Решение задачи размера 2](hanota_problem.assets/hanota_f2_step1.png) + +=== "<2>" + ![hanota_f2_step2](hanota_problem.assets/hanota_f2_step2.png) + +=== "<3>" + ![hanota_f2_step3](hanota_problem.assets/hanota_f2_step3.png) + +=== "<4>" + ![hanota_f2_step4](hanota_problem.assets/hanota_f2_step4.png) + +Процесс решения задачи $f(2)$ можно кратко описать так: **переместить два диска с `A` на `C` с помощью `B`** . Здесь `C` называется целевым стержнем, а `B` - буферным стержнем. + +### Разбиение на подзадачи + +Для задачи $f(3)$ , то есть когда имеется три диска, ситуация становится немного сложнее. + +Поскольку решения $f(1)$ и $f(2)$ уже известны, можно подойти к задаче с точки зрения divide and conquer и **рассматривать два верхних диска на `A` как единое целое**, выполняя шаги, показанные на рисунке ниже. Так три диска успешно перемещаются с `A` на `C` . + +1. Сделать `B` целевым стержнем, а `C` буферным, и переместить два диска с `A` на `B` . +2. Переместить оставшийся один диск с `A` напрямую на `C` . +3. Сделать `C` целевым стержнем, а `A` буферным, и переместить два диска с `B` на `C` . + +=== "<1>" + ![Решение задачи размера 3](hanota_problem.assets/hanota_f3_step1.png) + +=== "<2>" + ![hanota_f3_step2](hanota_problem.assets/hanota_f3_step2.png) + +=== "<3>" + ![hanota_f3_step3](hanota_problem.assets/hanota_f3_step3.png) + +=== "<4>" + ![hanota_f3_step4](hanota_problem.assets/hanota_f3_step4.png) + +По своей сути **мы разбиваем задачу $f(3)$ на две подзадачи $f(2)$ и одну подзадачу $f(1)$** . Если последовательно решить эти три подзадачи, исходная задача тоже будет решена. Это показывает, что подзадачи независимы и что их решения можно объединить. + +Таким образом, можно сформулировать показанную на рисунке ниже стратегию divide and conquer для задачи о Ханойской башне: исходная задача $f(n)$ разбивается на две подзадачи $f(n-1)$ и одну подзадачу $f(1)$ , которые затем решаются в следующем порядке. + +1. Переместить $n-1$ дисков с `A` на `B` с помощью `C` . +2. Переместить оставшийся $1$ диск напрямую с `A` на `C` . +3. Переместить $n-1$ дисков с `B` на `C` с помощью `A` . + +Для двух подзадач $f(n-1)$ **можно применять тот же способ рекурсивного разбиения**, пока не будет достигнута наименьшая подзадача $f(1)$ . А решение для $f(1)$ уже известно и требует всего одного перемещения. + +![Стратегия divide and conquer для решения задачи о Ханойской башне](hanota_problem.assets/hanota_divide_and_conquer.png) + +### Реализация кода + +В коде мы объявляем рекурсивную функцию `dfs(i, src, buf, tar)` , которая перемещает $i$ верхних дисков со стержня `src` на целевой стержень `tar` с помощью буферного стержня `buf` : + +```src +[file]{hanota}-[class]{}-[func]{solve_hanota} +``` + +Как показано на рисунке ниже, задача о Ханойской башне формирует дерево рекурсии высоты $n$ , в котором каждый узел представляет подзадачу и соответствует одному открытому вызову `dfs()` ; **поэтому временная сложность равна $O(2^n)$ , а пространственная сложность равна $O(n)$** . + +![Дерево рекурсии задачи о Ханойской башне](hanota_problem.assets/hanota_recursive_tree.png) + +!!! quote + + Задача о Ханойской башне происходит из древней легенды. В одном из храмов древней Индии монахи имели три высоких алмазных стержня и $64$ золотых диска разного размера. Монахи непрерывно перекладывали диски и верили, что в тот момент, когда последний диск будет правильно перенесен, мир подойдет к концу. + + Однако даже если бы монахи перемещали по одному диску в секунду, им понадобилось бы примерно $2^{64} \approx 1.84×10^{19}$ секунд, то есть около $585$ миллиардов лет, что намного превышает текущую оценку возраста Вселенной. Поэтому, если легенда и верна, нам, вероятно, пока не о чем беспокоиться. diff --git a/ru/docs/chapter_divide_and_conquer/index.md b/ru/docs/chapter_divide_and_conquer/index.md new file mode 100644 index 000000000..ed69ea202 --- /dev/null +++ b/ru/docs/chapter_divide_and_conquer/index.md @@ -0,0 +1,9 @@ +# Разделяй и властвуй + +![Разделяй и властвуй](../assets/covers/chapter_divide_and_conquer.jpg) + +!!! abstract + + Сложная задача раскладывается слой за слоем, и каждое новое разбиение делает ее проще. + + Принцип "разделяй и властвуй" показывает важный факт: если начать с простого, многое перестает быть сложным. diff --git a/ru/docs/chapter_divide_and_conquer/summary.md b/ru/docs/chapter_divide_and_conquer/summary.md new file mode 100644 index 000000000..11030f7d0 --- /dev/null +++ b/ru/docs/chapter_divide_and_conquer/summary.md @@ -0,0 +1,13 @@ +# Резюме + +### Ключевые выводы + +- Divide and conquer - это распространенная стратегия проектирования алгоритмов, которая включает два этапа: разделение (декомпозицию) и решение (объединение), и обычно реализуется с помощью рекурсии. +- Критерии применимости этой стратегии к задаче включают: возможность разложения задачи, независимость подзадач и возможность объединения их решений. +- Сортировка слиянием является типичным применением divide and conquer: она рекурсивно делит массив на два равных по длине подмассива, пока не останется массив из одного элемента, после чего начинает поэтапное объединение. +- Введение стратегии divide and conquer часто позволяет повысить эффективность алгоритма. С одной стороны, стратегия уменьшает число операций; с другой - после разбиения она способствует параллельной оптимизации на уровне системы. +- Divide and conquer не только помогает решать многие алгоритмические задачи, но и широко используется при проектировании структур данных и алгоритмов, поэтому его можно встретить буквально повсюду. +- По сравнению с полным перебором адаптивный поиск работает эффективнее. Алгоритмы поиска со сложностью $O(\log n)$ обычно реализуются на основе стратегии divide and conquer. +- Двоичный поиск - еще одно типичное применение divide and conquer, в котором отсутствует шаг объединения решений подзадач. Мы можем реализовать двоичный поиск рекурсивно, через divide and conquer. +- В задаче построения двоичного дерева исходная задача построения дерева может быть разбита на две подзадачи: построение левого и правого поддеревьев, а реализуется это через разбиение индексных интервалов прямого и симметричного обходов. +- В задаче о Ханойской башне задача размера $n$ разбивается на две подзадачи размера $n-1$ и одну подзадачу размера $1$ . После последовательного решения этих трех подзадач исходная задача также оказывается решенной. diff --git a/ru/docs/chapter_dynamic_programming/dp_problem_features.assets/climbing_stairs_constraint_example.png b/ru/docs/chapter_dynamic_programming/dp_problem_features.assets/climbing_stairs_constraint_example.png new file mode 100644 index 0000000000000000000000000000000000000000..5333e445ec6116ee24ec3d85093639604a5c361e GIT binary patch literal 15988 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/dp_problem_features.assets/climbing_stairs_constraint_state_transfer.png b/ru/docs/chapter_dynamic_programming/dp_problem_features.assets/climbing_stairs_constraint_state_transfer.png new file mode 100644 index 0000000000000000000000000000000000000000..d6bccd9527e6197c646afa8c6b0dcd2ee72b2c7f GIT binary patch literal 12155 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 P2LSEc2I_UH_A&nhqGvGe literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/dp_problem_features.assets/min_cost_cs_dp.png b/ru/docs/chapter_dynamic_programming/dp_problem_features.assets/min_cost_cs_dp.png new file mode 100644 index 0000000000000000000000000000000000000000..a3a200e54929f1b4f2b636c2e4ce59872bcdebad GIT binary patch literal 16698 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/dp_problem_features.assets/min_cost_cs_example.png b/ru/docs/chapter_dynamic_programming/dp_problem_features.assets/min_cost_cs_example.png new file mode 100644 index 0000000000000000000000000000000000000000..c1c605c6140c98502e72fc9d93fab96fb0b35a45 GIT binary patch literal 14208 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%0AUHq$V-b${34o6qHTId_xLI}62ecG6+K_wHm3 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 L(Ne8eL5KezjxMBr literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dfs_mem.png b/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dfs_mem.png new file mode 100644 index 0000000000000000000000000000000000000000..700c8efd00788d5ef01c28dc3d3516e5f1ac24a2 GIT binary patch literal 18179 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 tfz3X`nVF0Kfu^S`iXt%-&^@Ul;LP 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 BkE#Fw literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step11.png b/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step11.png new file mode 100644 index 0000000000000000000000000000000000000000..15a41d5597f089875394d29c3b45b98ac413031f GIT binary patch literal 13299 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

      k80mvO@1RAblD-l(g8D7XdOqBf4>ps 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 A?*IS* literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step12.png b/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step12.png new file mode 100644 index 0000000000000000000000000000000000000000..fc78e4844bc4cea75f1acb765b188cdda2f100b5 GIT binary patch literal 10244 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 n3Zbyv03GlQ&;Hqeh70~5%@kV9 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step2.png b/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..9fa018a3c2270beeeeebb61cd819827938e8fe05 GIT binary patch literal 13573 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step3.png b/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..c162ea7073aa6dad54d209ff6a3aa3fd10125bac GIT binary patch literal 13347 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 IF~YU~1)WGI=Ep=2JSgd*-Q$*&a3 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step5.png b/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step5.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba4cf8d7c3de29bebc07b5cd163406878be8780 GIT binary patch literal 13305 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 O8yqt^TB_?1{{H}T_YmCx literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step8.png b/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step8.png new file mode 100644 index 0000000000000000000000000000000000000000..21cd7bebebb748c61b454f2899dd2f6a212adf6c GIT binary patch literal 13672 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 Ooj7WAq)3N!`F{cP$~$fV literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step9.png b/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step9.png new file mode 100644 index 0000000000000000000000000000000000000000..8b320b9a3c1785900d609e8de8d780f66d2bc562 GIT binary patch literal 14173 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 J#m7kD{}<)3A65VW literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_example.png b/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_example.png new file mode 100644 index 0000000000000000000000000000000000000000..ddec501e5840fa110d696dbb3765e7ebabe8b737 GIT binary patch literal 10439 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_initial_state.png b/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_initial_state.png new file mode 100644 index 0000000000000000000000000000000000000000..7fcb6cfc614d78386a3b2a1634cf7ea5ca32bcd8 GIT binary patch literal 17993 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_state_transition.png b/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_state_transition.png new file mode 100644 index 0000000000000000000000000000000000000000..1453044e1ff9690f419c43c56f33282035dff6b1 GIT binary patch literal 15876 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 Yz&-NF_r*8P0m4W9s@9d_OPI(17r|nrdH?_b literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.md b/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.md new file mode 100644 index 000000000..99d5e1e8f --- /dev/null +++ b/ru/docs/chapter_dynamic_programming/dp_solution_pipeline.md @@ -0,0 +1,183 @@ +# Подход к решению задач динамического программирования + +В двух предыдущих разделах были рассмотрены основные свойства задач динамического программирования. Теперь исследуем два более практических вопроса. + +1. Как определить, является ли некоторая задача задачей динамического программирования? +2. С чего начинать решение такой задачи и как выглядит полный процесс решения? + +## Определение задачи + +В целом, если задача содержит перекрывающиеся подзадачи, оптимальную подструктуру и удовлетворяет свойству отсутствия последствий, то она обычно подходит для решения с помощью динамического программирования. Однако извлечь все эти свойства напрямую из формулировки задачи бывает трудно. Поэтому на практике мы обычно ослабляем требования и **сначала смотрим, подходит ли задача для решения методом backtracking (полного перебора)**. + +**Задачи, подходящие для backtracking, обычно удовлетворяют "модели дерева решений"**. Такие задачи можно описать деревом, где каждый узел представляет одно решение, а каждый путь представляет последовательность решений. + +Иначе говоря, если в задаче есть четко выраженные решения и ответ порождается последовательностью таких решений, то она удовлетворяет модели дерева решений и обычно допускает решение через backtracking. + +Поверх этого у задач динамического программирования есть и некоторые дополнительные "плюсы". + +- В условии задачи фигурируют слова "максимальный", "минимальный", "наибольший", "наименьший" и другие формулировки оптимизации. +- Состояния задачи можно описать списком, многомерной матрицей или деревом, и между состоянием и соседними состояниями существует рекуррентная зависимость. + +Соответственно, существуют и некоторые "минусы". + +- Цель задачи состоит в поиске всех возможных решений, а не одного оптимального решения. +- В формулировке явно присутствуют признаки комбинаторного перечисления, и требуется вернуть сразу много конкретных вариантов. + +Если задача удовлетворяет модели дерева решений и имеет достаточно явные "плюсы", мы можем предположить, что это задача динамического программирования, а затем проверить это предположение уже в процессе решения. + +## Этапы решения задачи + +Конкретный процесс решения задач динамического программирования зависит от природы и сложности задачи, но обычно включает следующие шаги: описание решений, определение состояний, построение таблицы $dp$ , вывод уравнения перехода состояния, определение граничных условий и порядка переходов. + +Чтобы нагляднее показать этот процесс, рассмотрим классическую задачу "минимальная сумма пути". + +!!! question + + Дана двумерная сетка `grid` размера $n \times m$ , в каждой клетке которой записано неотрицательное целое число, означающее стоимость прохождения через эту клетку. Робот стартует из левой верхней клетки и за один шаг может двигаться только вправо или вниз, пока не достигнет правой нижней клетки. Верните минимальную сумму пути от левой верхней клетки до правой нижней. + +На рисунке ниже показан пример, в котором минимальная сумма пути равна $13$ . + +![Пример данных для задачи о минимальной сумме пути](dp_solution_pipeline.assets/min_path_sum_example.png) + +**Шаг 1: понять решения на каждом раунде, определить состояние и тем самым получить таблицу $dp$** + +В этой задаче на каждом раунде решение состоит в том, чтобы из текущей клетки сделать один шаг вниз или вправо. Пусть индексы строки и столбца текущей клетки равны $[i, j]$ ; тогда после шага вниз или вправо индексы становятся равными $[i+1, j]$ или $[i, j+1]$ . Значит, состояние должно включать два переменных индекса: строки и столбца, то есть состояние обозначается как $[i, j]$ . + +Подзадача, соответствующая состоянию $[i, j]$ , такова: минимальная сумма пути от стартовой клетки $[0, 0]$ до клетки $[i, j]$ . Ее решение обозначается через $dp[i, j]$ . + +На этом этапе мы получаем двумерную матрицу $dp$ , показанную на рисунке ниже, размер которой совпадает с размером входной сетки `grid` . + +![Определение состояния и таблицы dp](dp_solution_pipeline.assets/min_path_sum_solution_state_definition.png) + +!!! note + + Как в динамическом программировании, так и в backtracking, решение задачи можно описать как последовательность решений, а состояние образуется всеми переменными решений. Оно должно содержать всю информацию, достаточную для вывода следующего состояния. + + Каждому состоянию соответствует некоторая подзадача, и для хранения решений всех подзадач мы определяем таблицу $dp$ ; каждая независимая переменная состояния становится одним измерением таблицы $dp$ . По сути таблица $dp$ - это отображение от состояния к решению соответствующей подзадачи. + +**Шаг 2: найти оптимальную подструктуру и на ее основе вывести уравнение перехода состояния** + +Для состояния $[i, j]$ возможны только два источника: клетка сверху $[i-1, j]$ и клетка слева $[i, j-1]$ . Следовательно, оптимальная подструктура выглядит так: минимальная сумма пути до $[i, j]$ определяется меньшим из двух значений - минимальной суммы пути до $[i-1, j]$ и минимальной суммы пути до $[i, j-1]$ . + +По этому рассуждению получается уравнение перехода состояния, показанное на рисунке ниже: + +$$ +dp[i, j] = \min(dp[i-1, j], dp[i, j-1]) + grid[i, j] +$$ + +![Оптимальная подструктура и уравнение перехода состояния](dp_solution_pipeline.assets/min_path_sum_solution_state_transition.png) + +!!! note + + Опираясь на уже определенную таблицу $dp$ , нужно продумать отношение между исходной задачей и подзадачами и найти способ построить оптимальное решение исходной задачи из оптимальных решений подзадач, то есть найти оптимальную подструктуру. + + Как только оптимальная подструктура найдена, на ее основе можно построить уравнение перехода состояния. + +**Шаг 3: определить граничные условия и порядок переходов** + +В этой задаче состояния в первой строке могут переходить только из клетки слева, а состояния в первом столбце - только из клетки сверху, поэтому первая строка $i = 0$ и первый столбец $j = 0$ образуют граничные условия. + +Как показано на рисунке ниже, поскольку каждая клетка получается из клетки слева и клетки сверху, мы можем проходить матрицу циклами: внешний цикл по строкам, внутренний - по столбцам. + +![Граничные условия и порядок перехода состояний](dp_solution_pipeline.assets/min_path_sum_solution_initial_state.png) + +!!! note + + В динамическом программировании граничные условия используются для инициализации таблицы $dp$ , а в поиске - для обрезки. + + Смысл порядка перехода состояния в том, чтобы к моменту вычисления текущей подзадачи все более мелкие подзадачи, от которых она зависит, уже были вычислены корректно. + +После этого анализа мы уже можем напрямую написать код динамического программирования. Однако разложение на подзадачи - это мышление "сверху вниз", поэтому с точки зрения мышления более естественно реализовывать задачу в порядке "полный перебор $\rightarrow$ поиск с мемоизацией $\rightarrow$ динамическое программирование". + +### Метод 1: полный перебор + +Начав со состояния $[i, j]$ , мы непрерывно раскладываем его на меньшие состояния $[i-1, j]$ и $[i, j-1]$ . Рекурсивная функция при этом имеет следующие элементы. + +- **Параметры рекурсии**: состояние $[i, j]$ . +- **Возвращаемое значение**: минимальная сумма пути до $[i, j]$ , то есть $dp[i, j]$ . +- **Условие завершения**: когда $i = 0$ и $j = 0$ , возвращается стоимость $grid[0, 0]$ . +- **Обрезка**: если $i < 0$ или $j < 0$ , индекс выходит за границы, и в этом случае возвращается стоимость $+\infty$ , обозначающая невозможность. + +Код реализации: + +```src +[file]{min_path_sum}-[class]{}-[func]{min_path_sum_dfs} +``` + +На рисунке ниже показано дерево рекурсии с корнем в $dp[2, 1]$ ; в нем содержатся перекрывающиеся подзадачи, и их число будет резко расти вместе с размером сетки `grid` . + +По своей сути причина появления перекрывающихся подзадач такова: **существует много разных путей от левого верхнего угла до одной и той же клетки**. + +![Дерево рекурсии полного перебора](dp_solution_pipeline.assets/min_path_sum_dfs.png) + +У каждого состояния есть два выбора - вниз и вправо, а от левого верхнего угла до правого нижнего нужно сделать всего $m + n - 2$ шагов, поэтому худшая временная сложность равна $O(2^{m + n})$ , где $n$ и $m$ - число строк и столбцов сетки соответственно. Заметим, что в этой оценке не учитывается близость к границам сетки: у граничных клеток остается только один выбор, так что фактическое число путей будет несколько меньше. + +### Метод 2: поиск с мемоизацией + +Введем список памяти `mem` того же размера, что и сетка `grid` , для хранения решений всех подзадач и отсечения перекрывающихся подзадач: + +```src +[file]{min_path_sum}-[class]{}-[func]{min_path_sum_dfs_mem} +``` + +Как показано на рисунке ниже, после добавления мемоизации решение каждой подзадачи вычисляется только один раз, поэтому временная сложность определяется общим числом состояний, то есть равна $O(nm)$ . + +![Дерево рекурсии для поиска с мемоизацией](dp_solution_pipeline.assets/min_path_sum_dfs_mem.png) + +### Метод 3: динамическое программирование + +Итеративная реализация динамического программирования выглядит так: + +```src +[file]{min_path_sum}-[class]{}-[func]{min_path_sum_dp} +``` + +На рисунке ниже показан процесс переходов состояний в задаче о минимальной сумме пути. Он проходит по всей сетке, **поэтому временная сложность равна $O(nm)$** . + +Размер массива `dp` равен $n \times m$ , **поэтому пространственная сложность равна $O(nm)$** . + +=== "<1>" + ![Процесс динамического программирования для минимальной суммы пути](dp_solution_pipeline.assets/min_path_sum_dp_step1.png) + +=== "<2>" + ![min_path_sum_dp_step2](dp_solution_pipeline.assets/min_path_sum_dp_step2.png) + +=== "<3>" + ![min_path_sum_dp_step3](dp_solution_pipeline.assets/min_path_sum_dp_step3.png) + +=== "<4>" + ![min_path_sum_dp_step4](dp_solution_pipeline.assets/min_path_sum_dp_step4.png) + +=== "<5>" + ![min_path_sum_dp_step5](dp_solution_pipeline.assets/min_path_sum_dp_step5.png) + +=== "<6>" + ![min_path_sum_dp_step6](dp_solution_pipeline.assets/min_path_sum_dp_step6.png) + +=== "<7>" + ![min_path_sum_dp_step7](dp_solution_pipeline.assets/min_path_sum_dp_step7.png) + +=== "<8>" + ![min_path_sum_dp_step8](dp_solution_pipeline.assets/min_path_sum_dp_step8.png) + +=== "<9>" + ![min_path_sum_dp_step9](dp_solution_pipeline.assets/min_path_sum_dp_step9.png) + +=== "<10>" + ![min_path_sum_dp_step10](dp_solution_pipeline.assets/min_path_sum_dp_step10.png) + +=== "<11>" + ![min_path_sum_dp_step11](dp_solution_pipeline.assets/min_path_sum_dp_step11.png) + +=== "<12>" + ![min_path_sum_dp_step12](dp_solution_pipeline.assets/min_path_sum_dp_step12.png) + +### Оптимизация пространства + +Поскольку каждая клетка зависит только от клетки слева и клетки сверху, таблицу $dp$ можно реализовать с помощью одномерного массива, соответствующего одной строке. + +Обратите внимание: поскольку массив `dp` теперь может представлять только одну строку состояний, мы не можем заранее инициализировать состояния первого столбца, а должны обновлять их по мере обхода каждой строки: + +```src +[file]{min_path_sum}-[class]{}-[func]{min_path_sum_dp_comp} +``` diff --git a/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_decision_tree.png b/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_decision_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..7e3dd7b0572265544d4973011a0a7f555b9517e5 GIT binary patch literal 12150 zcmch7XFMF=7x(NgYxNavqr{3t??fj{wCIB9EQv&P(Fs-;HAD*{Y6MZE*VTmx(Id+0 zC5W2np7r~`e%?GUo|(^lW_RY?d%maKbMCowU+ZY8kdrWw002P#P*w2}01)DTf`kE|3L&1oD2y%O*q5zbAXWGF3A$TsYDGvaZ@ucTg*X_A= zH1w6OuC9U`gLZd!qoSgkuub2`zUSxX%gV~)mT|`?Cy&z&Y;0_#5?{Y8@)Ws-rRZYF*v-1s^}U2v#-W?t` z-M7l03B7|_pCcfM++i+xY+}3!t$9y+*;P9-r$2pFwZ=3Qv0W)ESNnYN&Jf$(n?v5v zBKyp#rw0l|r|Ra*cYe`J?bc_2d98wm zgQCr8afD)mTl2T-^%>BlodG1f1g41FlHq{W{gVe?ghtk+5HJA&3y z9sFcN04pMx`bsHI{wK)(N*EkkM&h!wlBMEuiGO2Gi!O4X;izAN!F{=~pbt1G9Eroc zvA39Gh~dNj>M_;+;9PO6*b5?pMoYusGR+m+|15iH&_8y+Q>d@V#r?r>{OdZMgd^+M z&t_}4y!EuJS%&U>Wst0-rS7+L@@#FGJgqhaxYz}LAQ&?+ zy17;@8}}QdR>Bc83WJ-?P?4NhZUoM&K3kGRV*obhVILka0i{xc{MMj1Yu6u4`5Iwm zF9srktQHc!ZzN$8xJk_FwG;=^wjT@?gob*y!WYk;>tS4bFq1M|Mo;*S3UEvL=-pf4 zK7o5)eqs+{T;y~DDO!JDFcI;oAG$y<&3D5hQ#2b{iOwQ{^$5)U z7eM~xlU2~5ATPe32_{luR6LX9Q4h@#SR4R6?oQ(4RetBC;w-IZm3vtjg465I3ni&(<>$GVxKE zNEZ>omx!m&Fmj|c>2Jw5CRoPt5<%0Z!E9v1f+QBCqEB_NS_fE(yNE(lTWD|}YA)?3 zdFGXy8_kUmc?WVYB~v>{39Jdy)G!yxc1cg@xDEawwP}xLwSO4ez|x+<5ssK`x~WZe z#5Iu#hM7#qI6IKgVCc8@$VLEPM6qv@Nz_{fHIT}fQ*g`^46A)j#KL3bGv6I7vCDJr<*&>sDQ;8iV2hd$X~8K^r?Y^b8kE%;LF$nsC_$X)lsC;*Sl zvG=$-rfTX|I9^l~hAjn`N&_~txHrf*nyJBuO@kuj%$eZfra@`c5^g-$*!YxtxAZWD z>V@ZEn%{AbPZuz)#p(oBVK-^RL-I8(?+t;?Xe{l82yN5nPY8|X9)UHsF_q+kxk95X zG2NoTkoHdoWWGqfDCGggjV)J6J~h6d@p6H_9Ejj$HD%SaKkuKuDHJu6ZdPJ^U-E

      +vHM&^Fw^b;FZ`rJ)ydk5%1X{qrMw+;Z^@i@J05 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 a(AD<${VkiFPIKHf$wMVA#WDqS@c#k%Y{HlT literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step1.png b/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..ad1e7cabb1e949da13d9f95d5aa25ccb88f13f2d GIT binary patch literal 9059 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 Z9t>Qxc}Uzb63h5orKzT?TCa?b`d>Mo)E)o; literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step10.png b/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step10.png new file mode 100644 index 0000000000000000000000000000000000000000..a7ab4a99a62c3dd78a4935d836ef59336d7a68af GIT binary patch literal 11703 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 CVp?ke literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step13.png b/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step13.png new file mode 100644 index 0000000000000000000000000000000000000000..a0206203c19fcc4a09b0d1953a82248e5f287c75 GIT binary patch literal 11705 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step14.png b/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step14.png new file mode 100644 index 0000000000000000000000000000000000000000..26e72721f1a2dc50310f1e03cc729aa69be3a81d GIT binary patch literal 11182 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 BuY>>q literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step15.png b/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step15.png new file mode 100644 index 0000000000000000000000000000000000000000..5863be208b07bb5f00103a5c7e223165747d4fd9 GIT binary patch literal 7944 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step2.png b/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..1a64a088e1b15a56dd929899f3b12740dbf0edba GIT binary patch literal 8185 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%0D5kTS1=3J1!j{`aMwy3QgW>dp7iAv9_y6&r%&Q5M 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 VHx=JAIb8pfMOV{EqecxG^Kb1ST_OMg literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step3.png b/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..e7d33c928ef8c8b9299fd464583241ebe153b738 GIT binary patch literal 11339 zcmch72T&AIx906;fFUOdDoI2@NrNIei~$jeiX?$y6cLduBA|p;L?j3*ARy5MN|u~y zK|w`8BuX4|&N*-Uzxv<*-rKExTU)i;Rdc)N+}r1#bME(@(<#V6Pm_uM06hSJN$dRC zO8`(~hwv{v6}DS{D|sE;(Yc&Aa|3|+%ikXqCC+>h6GCp6G*5%9M&1eR56N)fzD-(y}i9ZGh2gW8@r=DV+&*J>+6@wK0PdbprWGE(f8+D^Y?_rM3U9j zprD|#jz#oy%~n(Si-?!mIiI$7wnOVnoSd9263o4Q{FGh*m8|5;OUKVd6z6>34GI9()%6mGT(5rHeGmY?FZFj`ZxhZc zt2vFxY}7k=4OXj^EuBWPnGin~W8J}0WeFS)=O`^fSc>sa0yi9bFX&k*0UH4z94irP zaPx<#O!fUF8rL{IC&6QVsn7)<>VNBEB_Go~^eFmQXcDQo{S)ge)=O|q{=6!3_4>y- z@n@{4N`0_|eV*JG8bZADDTBwI;PK${nAa6>M)^41W+iL~mE)g75`miq)(qJ{<7Y;! zB9B76#vLL=iZKUSfyqY00>mvbMu&&qHW83fSHH#~fG+IP2|nXN*Sw^@Q0ItAG1Pa4 zC2$u$AK`@+n$;oPCD_zr_d^g9WyJfeSf1R>b*BhTeMCdqHSTi1359`!TwHi~$Fyqm zHbGhnX%Lm)EaO5yvN8zHS3taa5A$u<4x*bOkOYpk*ar+1qGN9RYv%eDAg(Y7E@Gf; z$)GB7$k&l!%|vg;9J)^oONP|`04{n3YDNaji|ff!qUxuoxr+VXtuEeAG-wnlyZ2QH zodz!(T%^{zM!vq~W=&LQV)x)9pYXmXENk=I9T^jqK+vbKr|~&o_TlXZVJ*^!X5YGe z^|~6D>cdsctH?IEMK6rY$!>O0)Q;2aXB=35-dFhXE!Fz($f3^(UMC){b{&R)CV)VO zS1nF~CvAJz1MYuk=w)Uob_6>H!bCvLYH9!&Al%CXXbR?+=?$<$zC)I&-cEb;CE(Cs zBwTFR2690Ranp?qP;Dq_UgeO!MU3s5C4Rn*El10u^SXx>o}dIbs^)XCb3dM*Wq>MW zss3?7k|~~`h8t~&YCb0G^}9OA-2)R8FzIbecePe+Y;nW?B8636-@IyjpTm6iMB40Q zr_E^9{m>)7rWUx35O@%Fc1JFN2Vb51saZXVMOx7S z4&j3_ZyX>@(2Dcjuy_Js?fvkXZ`gnKshEcaU$d>GVZ6j`{4^EMUr(WWAr2ztBYS5< zaDOZ|_8{E7-4P^7n7@7_p23Vxa6bPGB}yBvHzH+Y!$;+c8;(P`MA-)&)*=XcEszM| zxXjTQ(7xsKd|l;5d(?_=LVix?+|==f*q83T_xjO1;rXTR!#`Qb6`A+S9_2)CWnC~W z%>K=v<9V>%am_BfBP)%5?tp16tAaA3(I46HI<4=TKvf@;YA_4Azsf03+Y`-7V~*R6 zRvKx$Vglp!NAha!l z?#cXA?~ux|$-8;S*x_QOY%jl_80l5n6a48?15uMFq>-E$xRIIS#V%gDE;(Vh#p@^R z>{ibBaO;b-;vu945l7~|>82~W&?REwtj7~NOD#Ie9Fyav@XfJ<6f`?j)1M=6sWM7}11y^+A#9c?rVV^x;PB&51cir5k{~&s%>#KxD zg_`iboP&?ALyziA$}1l?6@C6X-kXzxaXL#&&38-&)ipY@_pD6!&c`jL-Fp>%Yu2-+ z%QO!Ijl&vc{CfBY?kJjaiCFE;-jDp zZ&J=juxkEeFfz($o8tmKIibC3An))FFuAM6eOj3YAMUhc2C{qkuO35c0>AV<4*w&f z@;VX}?hH9Ly=gCW+!HP%1 zr1Z;>CyZy|M+^6C@4-LSDpae7t8N7{*zyl^nzl6#RlhjAZU@x&!@X<=JQsl;H^vuR z7RvAp8^)hqpvU+CBY`0Dwn&qeNM?h!w^s2mUZp&DwxV)(+^^zp?~gji8~}$;FKRve z96oi1at=HgyI6;tpF8xIdF_>P@`PP0jAf>g>dxVU2wF|QejmS&NVePUP{lZ*jH4IK z>4dT78;*JGG)A3iRxt!Uo>}%3(|S3xfytEO;|LJk;|e<%WBw%G zuE_3|)o-VSox@>Ye z@DboIJ9Y@!Y8je&qixLiKC5smKl+x5QGh(7N<^h!nXZYE`zEe4@b$feLY-%6T+}l% zCda|*&Xn9vSJAkxx79?f)wJf+1u#&uZ*0I>UR1=8gDmh^w~z6#*>wR|l!_%~yN+p!*weVo~=K!R7enrZ&tK z2KUrEHO8tNTULv^e^7!R*>*!LEe2&td6MxlAkhDbmygmhZa>EPs_EVtr|x1d;zgq~ z)xt+ia*o!`?WLT#bfJ6ySt+l57ji4OpRH<2_tL~n-~XU5j!&M=~x=HFA3zy_sQt! zPyHA`M`+DsxmZ&BnVZD_IS7*ANY1F{An0;#cXdh zov%jT+>?*8y~o5$g(K;9>hujhE#L1EC8@?VYTG50ctqcyO&1x+o)Qf(|I@wQ@MHB8 zM#&0Ymy8a{v8*oICaP^k#@sO|SOo3Y9HyuGAnn?$>&Y7qVCiBe<5>M~$`p>*_1QO_ zB*$E#$e{#5(8o20gHYUg01+T|BG5r_tbjuh!u>Bq^S&I(e0V{`BOc7mFD#q_PK zc^Cn(`w!#n{g~$0wCJnDn4+9O8FgeO492{_ufQqzU$m?EfduTb0liOSpvpu4cgpqO zP-|C6C0(|A-ppxG$4u@^UQs}d*@^e(wn(hRgueZk5{dov{U=39c*-xRwWi@ZlROJN z-Z(0OCr4ww{KS)0CqEV=gGG*uukDZz69*HCVh{Z=>htA>4=f<_f9nG0UVyZ8 z!#AMNb(ult7~ePVc;13!>%jmpiF4UrTI;0}Q>J?}3^6MHeh=v|RGXNWdT>eO3`CJ6 zmOZy7W#|GGPx!Y0-XNH#vRn*#69A6UxG}D^$X9HfR>7H5MK+_nHGU=m_$ZFJX5wAhwBvxHMtRMa&LZ zgYQpBRwUkk@W7gyuxpW0|2k=vCs`JGYNEnK{=+tCx2J({ zF4Jr|eEVhZw$b+u2YW~T6~QeD#ry7TNXipDZ`M8-92G|Mvqr*4dq~nPng~#UWV~x0a{OC zHEiCVjqF9nzlNX!g9S1F$B_S*Aug%l)=ZJ*c!5))C7x0Ywch>a9sKh)h&q@d$U^G= z=3JcfbP6Y5|AZS>Z~?R&32uu8`-tx00?jNVhVcct&w{ucr+%CfA>otHftK{cCbWd* zx%PyoCG}L}_pPNY*T2%Iy@@k^#yN4?#<6=nr}PiD&h!wk5l5ZCj4@4)d~f7uV_q~} z=Fr*Frr`0tQH7HY#^#a^L-YxYCC#S+C(Pr=+G2;e8Ub_bW!Wz_4rFfFQ!e_Wzt4v0 zNNR6J|Bct-ZWi>m-G8wb03Lgt-PzUUC$?FRoigA@U+3k5luyTG-+N}gkXm-V-I@!2 zaKRr~iK(qB_{q6q#@hFm83ZKBPl@RvwNVfsgHiKWz6h!RKmlt8UKT2v(uIBu$#HJA zd(&4zwpk$C-eLZlzk@|jykl6&{}uv^VT3ye>Y8e-`q{90)nP#svHGOeLVK@Ej>(mz zU5LI3Xlea$K%6caWAFh;Csitc^Cci1&nA1ZqQ9!#7W&gu#HW5xiCK=fxYpcR&-ruX zZ=mv@npoe1zHNfLwZp3C_C6;FR+L2dziigy&iyc$hyD)mt$bPH*(8a@|1?k!-|;yE zvTLvR)qLW?%#EYKiaTbUWo^|~1DDMuaR!pekV)B4uKwK(+PRnT2WPK3)~X-D+(sIu zgqLocHt7MNQXM&_hM<3LxC3oHk_7d<)4f0B{EZ5fbWb~bj6|j=K-)uY&O@(2?Uv`( z_kP>r5%Yo3CNVXZj7Kc)Y|_Ja1e5_s=wpZpp~>V0%DWo6!20Wc!v+&lp4*{yKFxc12d#o8^J`Lh7}7o)Ju z@$Ww1DSB8XaW4C1-|JAuin>yLn4v5>C7ClPAD|Kc?qB%4-|4mUkkaSghgd2OJ4jSt z7AYPZwm*tY@~giQ2(A*h$&|Q07_d~ji17^mz=k#}a{KaiQ2*NRHr4nV5r;ibjQ$R= z%1Ay|YDaDMT#C`(`kx%bAf~?6=eMA#A>e&t?5O{K$qgl>Pj@0t?PJcdTdy(;uke_7 z{*z-LUhaJu_a7^1hzSk+CZU7$%BqnXGQAH^rM~s@eH-8!raj;g_mm4>-vy-#UI}_K zq#=)ZY7z%(#V5f;J}6rJD{`>pLg}x%?-v=A{^o+ypl$n+M8RD+-nUY^_WHZws~CMR zWWV?a!`^@kTq)E8>5{$5A(&UJXbzQ5Rrd;XdF+1DNuY+OtazUoCEe4L<2Pk6I?9rK z=XD~N*F~Vg0A0qD$J;%qbDnnO^xQ7ITMwz!H5I?~HFP{MSbh`UCmEk|u5G)%ui|Fv z$46H|0arWpg*7>H&99|KlHNFU@W`v_-hx{tjECC1cLMj{EEfjcCvmfE$Vda66FMaH z^mlqGdMbW6T9hnbq+lUQk7_X0&z24l-Yq+hzLvU%mKUMX9ma9tV5yy~(lCddWxZ$Q<^;js^@Xo%za*XTJ!+tP zZ$nJ)MInEQ6F<3&sZYeVw@%JY^nCkC=Jb#;=;c7Q`Mqd)i+kG66C|={BA8AgM$aU; zq^HkO>rEX~nvyGwrO$DAWioU5Rfy*Kdh)~>OIY9kfdDVE=iX+;N>atYxTEj?$6`S? z=J?ODSlN&pPgFL&kdfbYn^B3h_$Cg-QN6f=%ao)_&zor88P7vaI>-n3xsX$Y9(G== z7|rLw1UrVJ*;9={0Oxy!x-&~M@H+u!UDtxvt=J#g@N6$sRYU!~0(+7ofnvbKm_ z>3&J4x5rl1088}ci=s0^VvG+dNtR(*+jm-y&U7%|&5XEVHrqs81 zEjK1o47+X&WV!d05BJeiKL5y<++8g93HlL8O;O5@xHy&3_o$D7^0{kJ+_5^=YiEDm@}?l{Rd(TY}ju zEKtnMs$RW+p+=HFke7r4)3Ro_3Tli>bgin5B0hJ?^`yBd+1Yfq+H}a(S8LV05iqkm z*lL*>%VIgB21MVYacYMmjLbal>vR>magGSM*xRf(b2QZWBo}Zj|4^eH(mGb_(`?E| zhu(4T%;C9L-&>nomT2r*7rh13&NDpn5}UVkBxip6c8GKZhsUcjqQgUj*NV3CCDGnxs{E}C@${Rrf-)I8 zYeVdHaL&PZF|zTGO-<(lHN&VWbuy)A@I=b2T=z`j6lv6F=j7y!u^D&B7MOl4H@RwJ z*+flwH*odIksa?TF#`zJCo5ZYi0AEWN48yGwiZA(o@u4K_-V`%fGCsbp~A-8jA`wL zYpVyy-3zuX^DxxxRh;){bR=V zfNPanWvYRI_liE&wdI9ufo&dyruZsMGl3QUotmq;p6Wdpr;TUlaDM`ubL_a0h{r9g zTQL%RZ6lf>tg`FIczF1n(4QiAQM^m^0hbt@;o9q$D`wmt0j6>~4F`?0szgM zxpqMB0KY|@_Tw_W>Rz$=UrLER47_auYw%pRoMxsDHEvcgw62M~pR0QGy^6)3VViQb z^KU#iLA3v4!zsT)zI^7P6`l8!jxhhlePO=pre4c0Ll=h!ZM&szGW|CRVIJ7<;1;;) zA5v!ft=D&lefJX8*NQ}oNLAAxla{BVUDoLy$~~;S6!E}gm&;EcTIzX)k5^oC=O8pm z`o?LYR=SVNbLHvQsl45{-Pt@la1u%Cd!>vj_hy@t{4$HI$94x7Iy92K*H>5iBgFh} z?{v^o=Atw9Hi60|s@+Yl3v93Vww@dyY)@=-2$R>-{?YbsR-K{a`GKdVoMATr{1dn; z9kAO?x64nRtd}E>u-qVSr#7n|G{HIL1W>k? zTIu|I#nyKU^qkF<)x|dtntZ5o)R*2vJho^q&NAEVZK#K~IkosGt8Lny0hnQmzDwF5cN)sfqRJUn)e4WkJ0-RgU6P ziMW?hN0YidSo;2epB0(0c@lg0j)_Fwd$I%mlM4|PU@pyE_0T^rC)dE@0Y>4xM zEQl!5|2_8Y(3^UA{^3wOJ!-T>#gb*Uf1iU{3i7vkbQ!{(h2@DZ$%Grq(`#&@Z z-xQAgy0@1qPd9KxpOY^})z)6K&ge_CV)ule(kVo3WxzV%XBht1N1cKnKFTg*AdhDJ z(b6N{4EnLzl21a^;B9>&)SAv9$^MFS!K;I8F4tjj8CJ-HC34+%Gl1cU8Zr!6ju5j|B0l7DChNUZ?VuXW0`G5U>?2?5 z^#}mcnL}R)aQVJjv9QhKA@ksj0atu|g zIsP9ecrq_tInB#M9br^2x)BXd-f2XL4xEjtI5b75#+!pL*=!{P3FDRGb3;=tn){Q9Yce zH`M;(9xLUcuZkuB3_gFq1yH@WAPL==(|sh>PM4FoGq!sqiIsf#VExZ)XG?YV;SSCcfUJsWW8-=IdM*K98vj}Y#JT;SsvxIbS?Gx7({aF^IK6N9&}JpVln95 z*01q-8t5v$I0WaLiJbe#fOq3Rsmkkf6s}+APfkjmXzKZN8kx0m6hbBH>!{bisG#<7 zG|lycx$dkRfAI4GLBGx-bsUr>@l&T?=gIZ#_`|$skpy}RMIkiyy-QOzj&4DlSFT@O z3QY?iIL~Zg5h#8tcOy!$qIxbLSl`?z1WmeQ1_|3G~n|CuD5@ zU{05L{)J=)^(}DL$3f{PDI@*2%H`CP6)9&tHQt)8Va0h6HR2#zOves!+4gzBaxQn9!P6Vp# z(&z#Wb@bg#lfsJ_`?9J>li3E76HbJ;Q@yzxk3Zb#(dy5{&Cl^>TRLsA`uJb1{%Zlc&uMa-4~dGASjm4LKR>K%m0NQ1 zYlVS~aufbn30r=^7NzdK2Ko*_! zvo(;8`Q36sR3)xQS-3LeE^gLW;e7&YvXi-~1pU0yJ_-X{a>9jua#36b_khY>*wyeI zL)tnwb&So8kl7|9^0mq;na%3Lm`}p-nf=R-pZLfn-)qO++ixC%%df9B&3TemuVgvp z%ak_eI=odSI4T}&jp|rqZYqq~%K=4aq|}3#L;Dap7~&~x5;C=>$;bqr(X1SbM6j% z9U*yNjbWW10{N*@dGb>Aoom`*r6~`7u5`-v2o;`ZzG$fG2U2vV)-MXmt~ipd40s09&ATI_Nl2bWVm**G= z>#bcbS25MoW=Lt+_8pGAiE{x>5v}|Mj%R}aL{5UsTL%&a%0~4p+D2WaL|Wy}x%|Fq zCH(RDqusj$gBp&S{$I{2pFZYt6{{u?nVXG#M9DfdO{myc@7I^P+Z)f0$3JCf!_+dQ5y zqvjsS9;p_DiLZKK!DB3=p8d2Laf z0yU;)KlP|(u_)e^B3g}R8ascHvG+Kj6UFh9@1osPzEoR=(nBsDR}NwE;A8luoO8mh zBwfzS>qD^Y-S{L)9fE_@s4v-?75G0r9!LK`pmbsw3QwUDPuP`WuPU$m<_* z2hG|}IVj6_^}f?-kvOGglkUe{a{5Ta*|KQiK2_eZC_#{853RoNo*YQIQ@m_#cjSp> z(Ip(V$a4%i3HV;Uo;*wc0wzO$fxsCm(JhAKEPowEWrOlS_o`ITL?+Y4sFpP9nyW|7 zpL9w*p608-iYmcE3Bou9kpNkiqVv|F_T=fch*Y9cQ*=FnLgEqR#nYJ|*30mHc6mQC~Ont4#Gi3 z=B>@QaQqqw{WvAcd`8Ix@oD&Z^Iglw@v^q?R3HJfdTKDJth6{wQg3N~J6XSY^MD zOPA~P>Cs#f2p@0wI&-`?g?Nj#knT^m>JKNG0&21(_ZqcCW|At)CbhtVnrZhJ7lE*^ zCuXczo__Z3((X^mex~I*?f5fF)4s8 zic_rFb1En6+gOCg=Hx$ReRqS^j=~|3oae{@ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step4.png b/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..7e25bb0db40c6efa00737c93a2b8581cce14b8e8 GIT binary patch literal 10862 zcmd6NcT^NXv+vC80!s!_aug*90*V4kT0x8?MRHnHKqX6#JAi{&0SOXE zf+$(Z5_Ul)=eWQEZ~VUR-SF`YZxS9jO1s=Im~80w#AW#VT70D$%4 zg|k-yfDZi&b>cASjhcS+CVFFZzhLeO0Bj9^e_)&pn*jO}^t^gr3&?L5oI)S4j%W1F z06<|ZGtKUAeH}yHYdU*-djoUZV-uUZ<3kfm6I3eoYGq+qMW~vZTF-D_N=j;5TbsRu z!-EG8D*KizDyz0TsxrGupFe-$b=Six*)k-Ac>37`-d8Py03ZrnJbUJv-_O}$r{{^y z{P2|o3>W@hn#b;*fx1XivJp6y=)+hy+2R3GOhUPZD58|$nvkf!u5%CF{OrspuZJTeB!QM zqME-LVyc9smc?8Du8@?)a^PXjYKHsP2`B*uAe<;#K-6cT>`OBDgg2du5HepE_ua;n zFwB((KoWQms|!Q8pri0`U|(CRP5IBl5Nnh|p+tV-2f9w(l{2GWAXq$#HQHC`Is0{jBvjMB1x@Y3) zBBM$a$Zoudm~4n zb!Zg5J8f8&nU&x_+Kf1HQKj=0XGvMD63`Pl1v_Q$e@8cHx*~Xp`Z@2qQEk18;iCl?Aa6Lyp!j zB|d|)MD^=DAwrbZdvqM-Mu4P0#d36)dZ<)xHd%CFll@2e1~j24sa2JaKMQR0$E}>K z@Zl~O(27^KcL&HxOV(c2RC9{Qx1rfdZ@MuFggR*F{k^PyI!FSy_!C@xa{&gJL>I%r zRxC&V9Uw`K3r|P_S3gf84qj!Z8PQh#hYf6S3OS$DVZGmV68_6tu=&&+s4LEs`RzFm z6y(7^q$4-`EK43sy$V+TwI_C2Y(igyu!+-k_9pcZF{J9_r{fmhdi*8sw}-j7q5oj? zX9tYczO=Io(43~<)}&YN-jET87Z*Nc2abPSW~H*J}LdCJM z`aq})x5Azi16n&rl2jud!UbZLl(Cs2;!Qwk+^12iuY>y$6CiYrHMCETQMPNj4U2R3 z7I>Y2QY97xT6NKuqVQazqyZ>W7q+i#IhcCByFzUpEVi~Bf7)?E{<5YLDG_T^qh2@1 zMKI^74nAwPyl!?@)+xH2p;f=WqT=y($XxWn6(h_bFXWa26xT@iyphs>6KgvkB^<#( zS|AtxJg-J6lwvcsoq2!J)f6Y1+niA!plkp~UH9|7$Tt#a#~;l|P>-zapjf)sH6IJ# zPGEIE3X_t>7RMP$DRMGubY#zx{E?#jKuvOAw~oM8qi_~j6hqY)dYBH>IWYOnU=s|U zo0&wpU2K~3q&}@$IjN>o7)^U74ymw|L%5mCgq;#bcmA)!0t%rxwZGin$f>BWpv@F zzcaw@!Bc$m&pbyVop6ULvuIV#Y*Xy~vXV;DeB{~&*#bxKsgd}U++L_50UOWqJvlUf z=)$0;MM0{N?#Ke0*s6xj{n7VhK?s2Y4xRV}1I;4Vd%{2(e7`k{c1W zlZNY)8uaT2oyAiOuK`h)*(5`qqAnBkzi*p?_jt&lqrHio9{eqCP+Ydg!>{7orEWuR z0i+ly*|anBdZZR336r1}F2dcVb==GO*M>Eh_(v{Hc-ResvvRblWsb?1PNc;xTwWjM zVM1ZhEQ#DiIZ^u;g~|D}$D3k?s6`vV%w^{}@RXiEeUixUt~pLDhuw$&7cWhDC{oNc-@FbdVN^+m9z`?*;~9QK0B`nS-fxXYadLfhCvQHXZs=c6rT+%fjOw%_}AbA7#WZ0Slp{S3D{m|3{X z(-KYhkD&2i3Q-j3I8+)W1^@L+|NSGv^}DjPwU!qt8n!TW;`(LHPj;iohypT4gpO_q#T{9KEU zi1w9@+M1)j_F`@myC{Y``d@suHUoUSjMTXQ17H_4p?Lgk(e*z zL>KMmQ+M-lX^C=S^A7SE17h$_oit_6Ancxu>$zX#;vSkZCg{;IdXMajj(2sy+{_2r zud1tDw*jS=o$W+{y>2fx%Y?%11JURFSWm()PY9L8=zaZ)%zDF1+9hvRPa}IOJS}5Z zwjnZB;{7ad3?8_8)(jB$+}_51xmY$K%1aeIowBdfT={$}or2!eIU2_)9wfE!jubOt z`#sUN_?1VfMui$-5C?cW`UoqNf_V3KEU`q&@N@^1Y8VYr#jcJ1(ct z5fW6@!id6H4gfp^12|C-iw77*0q6n%a^N8x4D7=L*e3w=PnMwlNaltlt(O3#Vh6bFhiTtqb`oI=N9pZB*?@&w$Gh<4ZARY?=xuHJZswz$fL8PSeo z|F#9*gwS#MOC|!X+u;r(U)UF;%KY0 z`;Zfls3oB8QS$@Hi6?Ok?$frL*!~L3<}?`=f~?u3*;JGNSOnn1NNFfwNpreWq6BMa z6+B~f&mA{b0QI#rqcLV#=>ruiaNS?7wDqa7HOVu*^a@X~B-fv$?P^XN29it4fkF561|}%M;ZvQsIm(W8Utv^OFF0Dmb(6&`Vf3uznVZZY z2l7}FVc4;(V3DwDk!Aeb><)CxV3UuMzS~Amis@VVu-vlwkN)E|8|NR(hkMA`FwYH@ zI77M{pXpr80prPp-;r#n{7NjTXk>;goUo|@p77Nkz*37{=TG1^AWW(-a$%dDEse;F z_X!8}c@cLt?zb7VKg+$Tpm44DiER*C5Jqm_2=ck-aQ+r07ySK76w4tB|FwgEFH!Jt ziNeYgE8At{z|?;kjk{=^2(mM8LO`u?zfu`dbtJz7i=$+)hiwE+D1wk5n@j4jrUV`^ zNS_Ut?p&y{WJHB@UH_N4ao|zXf3`pl#F#5>l>x*qu5+dF5-k85armmm1L9&99iC+EnKHk0#5AIW^AP|T}1 z5H^s-t%2&Wngf{$q#H4)dH@BP20~sDDM$vf0qqw}F6+%rk~=9(=k2vDYKO*DSX= zWM})$4jg4lyJ=^oP?{?zB-DsP&I9*aKiqGptj$4XfwWS%oVKzt!-^Ox<5 zZ_U*tEUBX^%w7!cz1j9;FS9P{&Ls}~QXTb^o$*EeFdPrmuK|y?O?F}MCJdx+r!hsm z_&=?NA)yzN+ka(`{kpVNH?{tBnHh)b=q!S4e~V>>`t3!k+UX4|t8Ps0X_8*&%bmJo z7tEfeaYqauh9>(&Af6yUWgfix{VnC;&NuIT!*JY3k~B`sYQ%}5YHb5C3qgOn9z5{| zKYqEnuymXUN%ANX*Pf@N7sXLDg?GkH=@e$KKT%5=9e0aJvPt)=ls($g|1e@q&$^$L z-tQHV85mk$B07Un;bb6f`ah_l38)77Y6MfY080ji6HkQRfUi%&&JWoCk9dQIq>+@4 zg;dFZ+T|kSwGd#V(lQi){FsskYlYnUP>Ri#X#WB=7LR)8yWqyG2nvl8%^J7T$o^&f zARNVeuFCpvP_pd#zd zU5aDMdHciJySuJjt0_nr^}=l6wH4bV0i(BF6*CVokdA4ej`#WB$WdtZIQB2>Af#WR z2HTo$ce(xa0ODyge&jUP+4<6v)nOZ6iStL9|N7)P%==8CqHZN{_VKq1->w5rH!h)} zMMxm$tq%A?_7U@!RPU)tDb$jpfayzQ5wJ)Jo(}Ld$52qWJoCg~VsqhFbKwySg|FYZ zr$4^`XOLh61uIL8ff+y6%k6K5gMeS&3XLy6cYEB=Im?xHYc%+dtj4ng@>n#JAV}^> zR&?zVBNe&WhTv#%`MEOeX?}LJAyW1~qeztxpp6ubm*p9Rz4sC}J>aWb?N+5JPd{zGf!Q5AH1k#lg*mh%ns-7t#fbw2j1=k7!Lhpe$(__zWs!D z`_haqu3 zfD3)vFZJ&ZF|(v8z&xsZ8E<*mHXt(nb8mscx@tsQh23gI{P1wMPN4vc`xsy|wwh%^ zX0|Gkv#R@%JHUEwWArfn_fau48cDGeZc&tc!zPD5JB-S@w+(6-n3 zaGTz4MY|qGga>&mFg7&(<^%OA;76)k?`X&>ioW_3o3~FV^KQm_Zj9N(=b2m6qW55svi^1~lEm4|00RO>y1Cx1-D ze!4^-dH(~4`nJ>H=65-`Ymx(hO5HL!rl%$xaPN~QB=oR`SPR57pA2E@lazFFN!vP7 zee1B=@4G#BtPf*`t3&V$V1I_{pK$n(BP?yQI|IE zoEGN!bBWK}YhH;dO;drFy?b;_%eM7%#|iK5fkW_Jwf2dWlo&dA_`aA+a^;cn6Yw1k z`KQcj(Wb{09-EzP%{qS&j@z>w)wL8ZXU%-yk@hv#k@u>Rt#bayOgGt@EFie=XWb?GHIJ+I92ALsz;(Wy|k zWiU&|x~qY#fbX@|EG6g9H1??PZ(|l%eb03yU*9jBh;~6&T&cP&-5_63+A$nVj97bXMY-+gz)ZskzENK7^V2oU9}jr@>j0{izIVyJ zo0_4445XaAVCM40W3DWOUu9cWyGQ5XovI^xQoCkAMDM4{jNqs52Qia2E_1u!?44?E zd|q+vn$N;&4Y*2#`sfYsC~9Lw@9@C3u27UTmE^ zbFQWQ=J2}oyOdO?t?YR&{BYiD4JG+Ih1^KR{4#j$^gOxHrL^FBW!zn1?^VlfNp}|@ zZd2*we#xGWvO$Y)C5^cw71Kh~cC_mG9#*h>J+MWK*qUNcmXTc>?Rt zF#sfLE{tx~URMCv&$B26+5@NHnQVkCs-KKkjr@8m2aD9AmnT%OKnN=HJ6 zK590g+vW4ZW*ewBs9!9IuZ%Ar)9RU?(R^OJu=ll9-U4cQe#plCx4i#+ay-(rtRiId zQMm)qlshH%jF_+LcW1XkT?y7nkDT3S)@?^D6{b2Fo6ZU&ehrQViL;5`Lo0br>!;Bq zp?#*aDlq>nI zzyiKETQ$3~6^PKqNd0EN-E95Q_cmavSa}LgJ;<6yquFi64K!qcLp8}Id}+y$iA+=? zBc*^bt+Xj@yO*w0c#EVQ*WL=05a~_|ysS0xH3Hgv?J8rO=l1xC_Y3l~7Fsj>*CL;{ zyouPw5j5c4vjxl)kF7(Viuga8UweNMFL!unY0h)v%W|}FX*=R;l_?jE`jdR@=v8i& z9D{c&URsRs;>)zNSHKfVhPyd&A3Aum4r+R?1lHVM=UERL^fAFmeKGB_2WbWz$OaR^ zD0bYn?bY)MH1CX~L_QaFI3-q3?C}R24{{+KIUyFHDKn^+?V+dv|B`(53LKF}&%=}% z+;^An0rXpSz;vAV>cFz{CPyDV$#A7Th9~)~5vg3``e8UCS;Li;pc-6tbkLlY^0~@H zj+J2lQd|%dlmqog|5QGG|AwQO^8-G+VvvnEY^mcg(o}bMr z4t;>q?#KKXXfhTTsg|56%|^*$X@~%2X$)1z;E%u6YZ$@e=|TG^&`Zq~MB6tC3*t)qtNTk%P%T(zbM@WUmo2J7w#JLf^*`$3Y<5 zYsl>coUFgIYO)ef*I7!$FheS8t%}LUuT;g66$VmFw>GfwA==?35aSls%198Zari#2 z#Qz}#SXh&e(>n*ZS?$)?0W%IIVD8z8i4VZflc1F*l&ihUfk>P-5=Tyg-IjEnY_1qC zq=1=lYCm#>ZgE8%pDr+v1(|8k8}Q zzF0rEnl*26WZjMMnLkZPlcAnpR2*r8RH_-5^?{}=r1BAs4KV+{)-xLRiLc^O$AHrd;PKpIm?{_YFJF zK?V$le8o+2i^ODWg1Rq{-)XD2!$P~iaf>xHUKVr|u?i`eYdV2!onOQ|?#v1jM%hi? zW&UYQ0d*$;=8f9BqA(Z3n_-cH@}3F6ZE2k7Llq>P9-P?AmA3R>S^|Em@q~jxDx1pw zY^2JB#nW(`=-od!g^rd{Ku(2$SA6q`RfX_bS59Q?|cMw@E{un*rg)_slkm~C}mg$Yv$Y;fV&`{Zk~>`l>u;Lz}FRgVGsMD329hoq>{nwq#$C+ zL?}5AoIeLoSy0|G5_YF8D4XK=>PDQq8oVShoeTc0KXMSZ)CV|e4K>U;w zGJSn^hY2>rg6?x|93v-#Rb@S$7OvUv4Ob{PrB(>E<_SsFcxxh`g=6SQx5lrD`-b1n zF=n*y8T1YJ@0A%M0FJ{fXG;4fS!7#Fe2I)*ddhbLwp|s%`zrr*iQ^TCwKrv9a}5tw z*&tIO@M3YSh*XJC<)59^>LTZf#z(!WM2QRW@h&z)ZJX<>wAg9MzAdHGb&6faEfd2c zGBnmlSOqt>9vfTZoPZirts2o#2d~$>iAla8{>!gKOJ7wPXzrhqR$5ZEUDkb)Ep(1; zXzfVq_PeJa9K&=|pau~p%5Uwb%S(sxJ;N6V=H6V8cY7d`Rc`>k4v@O4p>f*FcEUv6 zbZ#f=ptnqsD17+~96%e{+#2l-eGbm5sogjO@H_^aqWrd!EgAIH540CZt`Jn9NexQJ z#ABf#Y0s0v%DFya&I=pUu9~~o%1zmI_+NEL7TPSVf6O+}zx9vA3 z`_^ZhXt=1Wb3eaIYXn@+SJO_X`un7rFB4W9cPzH!Mp!8tFJ7&f%ZNPM<(#hAJyWm7 zn+(i9{~Ei)>B~&n3KK?cQt%jTS^ndGfdqRvdU^ug*E|hf!!DBN$o?3=1GfCg-mM1H zmhL_Vh00`Qcwp@#*jn=zMn5f?^CYbOQKYo|Ah68U_`Kx#T% z_IY7PkWSD_y0QquF;Od5$Q5vzQOw?Tu)tApFX9*_Zb_t_#FZNoN2A%t?>-qRe7q-w z^H5hhxm8^m`I=Wi^#5u#{Xa4x%0?DE40f`6r-9iEP8mhvq(lhnk1ZSswaOj0WrUN> zl7*s8XqUl79tJq(Iu1vW)H#P9CL!Tc)R)kI%C-Glp8DUCaPRosTyOlSosa;XA)1vy zk0;#X^2nWo*iLRVXTb=W^=2%0_5SFQ*HF_B%q+WjunY6}Be!dnO5yE;OsK$X;z+B? zt67bjA3jZDbsC%V1pn#?r!aVP6yDU7Xc1>bt|{TOUrKNk&F7tTOBFnJqgZ8r?yX+0rfr3LUc!@CI7OHU(Kx zSzm!fiNLo5J(C$n<<`EncEs41#nd~YM;C}c8U`61xeBmT$&cr)#T=c>V(eDTG!{Tf zyFZ2kX!pxO7VXj>+2!nSRUOmgm>LzAUZe#|njCxARz3JBu$5}Zt8@ksJOx+lXsj*1 znce&m+h-bv&WI!{)_wHW+LHw#dWGWoGqdpdvV)yKDz ziF9=eZc2Qpp36X_c|kyb2gjucBb9GWmEIg;*MSy=z@P<(4ofwS2Y=5X0k%uoP3$#*B1 zSO3y@Dnf^5&cEkLOGF1P>ZZvjyuHTNSKDINAvE?b_B2kpun_eQTUHr*XmV^^pqDjm z-;uWDuINu>*}ANI@X}P}IXSe>yaWZpbq=L2LwqLZ?Uh^x+BYmj7ip$u3JYV_LGqVp>I<&hVQT{5S$HZIc}LLA2p&wkxpn^+&^l zkJBt$*8w^ZOVZ?wC)3zxnw)=ZE!ifvI*9oUa}rc<2MdDDCs=0N@7T-3^U?Q=y3CC} zZ!w>!Ka+_7>)pw~b{=DG+~|1z?N)9khiT5Vob>$?u3_b6MeC1S9Y2;aj#(VhV@WF1 zYA)Y+({Q-`-Hq$U>K98xS`IM}9^F+AmVzzNtfBSpS+}2%hgenjps0rzucH05-RoQJ zrMRS@aU-}an~FfuT_aYclivyQ!iic{?mc&wAkIou*tN1(fm;r zH{!Q7B)fB=mb*Yo|8`r7?fmFOtnS9zXXrhn=%O+%=iRm1KxCF zejPHD&fAQIsM=i9vwgJ;P7lL7EtXQT|D&_~uf+bQJ@8P+h}}sEHg9O1$78DgF2gzv_ zl?MUIf&#LDlB49X>>ZykocE^loqPZI=1kA*bX8YZ_0+GbyJusKF6uBb@G<}ZnDlhD zE(1V={)D@581%N4bL<*=qxaUe@CAVR!=C~@mSW~ZDbNJpY|7x^si`Bsnl-^yZe*F<5Sy{E0bGWTbJufBWoj6RaN^(2HL(1Jbn5!K0dy- zzTVBvZG3WKd1cwc(z0y$_fBVh#XyC1rd2qC1p51hw>6)B5X+YH^b!EVKu_z;m7wqQ zBe6HW|ILeB@`<{`^)_3?JdDcS@IW~AS_0x}td#BhO49h$(?sw2o!^R<8HZ4f{yUG& z(#4$)?a-*3j@Ei?b1$w7pqOqmo9{rO&f8zpFUhEIv-%iI{@mc}YM zSJZryyfG%ZJsu6R_<&+M$`$(iBOdxP>%~G8swpvS3=$z(q=QoYLs?s#Faluof&g_# zP`5oa9%2)b%uEa)d(UHMMgS0&6}?Q}=-Z^c%2ICdF1#8#y0Du9nDM*n3P>o`r?6Ox zm5pTb;B7D6P8Zmin`z1obpg8*kXh&z&@%MnG=yDbCp}b`LuSmI%JIeR88b5&4}H+N zVF)5nIajTR410%9OCuvIH%&THTTE>X7H5M#$fzPyyAlZDCw4GvvPNARnOnbZ&-=Y} zV=cTe5~Fl6spg?DX$0Q#&7O|xp)iHBt~*I-6EE? zdWkEDb4QREe0sZ-nUP$4seEqZ8Q#p8W)sE@yTS8@6DEU>a=GPAp$7y>Z>itPmv1C$ zz~$To@qCPqnIdc;s?xFsQR0?⧁jhF%NOsBh8?gH3XmG^ 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step6.png b/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..d5169284de6a3a465c4f29916b92e0eaf6f5390f GIT binary patch literal 10896 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 Y=9>ELRMxyF{`RDyu5&T(0{-ED1Id?>t^fc4 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step7.png b/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step7.png new file mode 100644 index 0000000000000000000000000000000000000000..0616a9084f64e22000a419813584be1fd2e3e016 GIT binary patch literal 11456 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 C+%(Dn literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step9.png b/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step9.png new file mode 100644 index 0000000000000000000000000000000000000000..e263154ec1bc7262fd06288a771126016ae53d6d GIT binary patch literal 11503 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 XgrxF7wb@(cpPZ(e&ZUA2qzC^E$%Z7K literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_example.png b/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_example.png new file mode 100644 index 0000000000000000000000000000000000000000..7c8fcc70f98582b51ee5d0ae333d8e154a113545 GIT binary patch literal 9274 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 D7jbq{ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_state_transfer.png b/ru/docs/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_state_transfer.png new file mode 100644 index 0000000000000000000000000000000000000000..14064a993bea31cdc4dfd88fadf653b646c3fe70 GIT binary patch literal 19714 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/edit_distance_problem.md b/ru/docs/chapter_dynamic_programming/edit_distance_problem.md new file mode 100644 index 000000000..d5bfa3a4e --- /dev/null +++ b/ru/docs/chapter_dynamic_programming/edit_distance_problem.md @@ -0,0 +1,129 @@ +# Задача о расстоянии редактирования + +Расстояние редактирования, также называемое расстоянием Левенштейна, обозначает минимальное число правок, необходимых для взаимного преобразования двух строк. Обычно оно используется для измерения сходства двух последовательностей в информационном поиске и обработке естественного языка. + +!!! question + + Даны две строки $s$ и $t$ . Верните минимальное число шагов редактирования, необходимое для преобразования $s$ в $t$ . + + Для строки допускаются три операции редактирования: вставка одного символа, удаление одного символа и замена одного символа на произвольный другой символ. + +Как показано на рисунке ниже, для преобразования `kitten` в `sitting` требуется 3 шага редактирования: 2 операции замены и 1 операция вставки; для преобразования `hello` в `algo` также требуется 3 шага: 2 замены и 1 удаление. + +![Пример данных для задачи о расстоянии редактирования](edit_distance_problem.assets/edit_distance_example.png) + +**Задачу о расстоянии редактирования можно очень естественно описать через модель дерева решений**. Строки соответствуют узлам дерева, а один раунд решения (одна операция редактирования) соответствует одному ребру дерева. + +Как показано на рисунке ниже, если не ограничивать число операций, то каждый узел может порождать множество ребер, и каждое из них соответствует одному из вариантов преобразования. Это означает, что преобразовать `hello` в `algo` можно множеством разных путей. + +С точки зрения дерева решений цель этой задачи - найти кратчайший путь между узлом `hello` и узлом `algo` . + +![Представление задачи о расстоянии редактирования через дерево решений](edit_distance_problem.assets/edit_distance_decision_tree.png) + +### Идея динамического программирования + +**Шаг 1: продумать решения на каждом раунде, определить состояние и тем самым получить таблицу $dp$** + +На каждом раунде решение состоит в выполнении одной операции редактирования над строкой $s$ . + +Нам нужно, чтобы в ходе выполнения операций размер задачи постепенно уменьшался; только тогда можно строить подзадачи. Пусть длины строк $s$ и $t$ равны соответственно $n$ и $m$ ; сначала рассмотрим последние символы этих строк, то есть $s[n-1]$ и $t[m-1]$ . + +- Если $s[n-1]$ и $t[m-1]$ совпадают, их можно просто пропустить и сразу перейти к сравнению $s[n-2]$ и $t[m-2]$ . +- Если $s[n-1]$ и $t[m-1]$ различны, нужно выполнить над $s$ одну операцию редактирования (вставку, удаление или замену), чтобы последние символы стали одинаковыми, после чего можно перейти к задаче меньшего размера. + +Иначе говоря, каждое решение (операция редактирования), которое мы выполняем над строкой $s$ , меняет те символы, которые еще остаются несопоставленными в строках $s$ и $t$ . Поэтому состояние определяется текущими позициями рассматриваемых символов в $s$ и $t$ , то есть состоянием $[i, j]$ . + +Подзадача, соответствующая состоянию $[i, j]$ , такова: **минимальное число операций редактирования, необходимое для преобразования первых $i$ символов строки $s$ в первые $j$ символов строки $t$**. + +Отсюда получается двумерная таблица $dp$ размера $(i+1) \times (j+1)$ . + +**Шаг 2: найти оптимальную подструктуру и на ее основе вывести уравнение перехода состояния** + +Рассмотрим подзадачу $dp[i, j]$ . Ее последние символы - это $s[i-1]$ и $t[j-1]$ . В зависимости от операции редактирования возможны три случая, показанные на рисунке ниже. + +1. Вставить после $s[i-1]$ символ $t[j-1]$ ; тогда остается подзадача $dp[i, j-1]$ . +2. Удалить $s[i-1]$ ; тогда остается подзадача $dp[i-1, j]$ . +3. Заменить $s[i-1]$ на $t[j-1]$ ; тогда остается подзадача $dp[i-1, j-1]$ . + +![Переходы состояния в задаче о расстоянии редактирования](edit_distance_problem.assets/edit_distance_state_transfer.png) + +Согласно этому анализу оптимальная подструктура такова: минимальное число шагов редактирования для $dp[i, j]$ равно минимуму из трех значений - $dp[i, j-1]$ , $dp[i-1, j]$ и $dp[i-1, j-1]$ - плюс цена текущей операции редактирования $1$ . Значит, уравнение перехода состояния имеет вид: + +$$ +dp[i, j] = \min(dp[i, j-1], dp[i-1, j], dp[i-1, j-1]) + 1 +$$ + +Заметим, что **если символы $s[i-1]$ и $t[j-1]$ совпадают, то редактировать текущий символ не нужно**. В этом случае уравнение перехода состояния имеет вид: + +$$ +dp[i, j] = dp[i-1, j-1] +$$ + +**Шаг 3: определить граничные условия и порядок переходов** + +Когда обе строки пусты, число операций редактирования равно $0$ , то есть $dp[0, 0] = 0$ . Когда строка $s$ пуста, а строка $t$ непуста, минимальное число операций равно длине строки $t$ , то есть вся первая строка инициализируется как $dp[0, j] = j$ . Когда строка $s$ непуста, а строка $t$ пуста, минимальное число операций равно длине строки $s$ , то есть весь первый столбец инициализируется как $dp[i, 0] = i$ . + +Из уравнения перехода видно, что решение $dp[i, j]$ зависит от значений слева, сверху и слева сверху, поэтому всю таблицу $dp$ можно обходить двумя вложенными циклами в прямом порядке. + +### Реализация кода + +```src +[file]{edit_distance}-[class]{}-[func]{edit_distance_dp} +``` + +Как показано на рисунке ниже, процесс переходов состояния в задаче о расстоянии редактирования очень похож на процесс в задачах о рюкзаке: в обоих случаях это заполнение двумерной сетки. + +=== "<1>" + ![Процесс динамического программирования для расстояния редактирования](edit_distance_problem.assets/edit_distance_dp_step1.png) + +=== "<2>" + ![edit_distance_dp_step2](edit_distance_problem.assets/edit_distance_dp_step2.png) + +=== "<3>" + ![edit_distance_dp_step3](edit_distance_problem.assets/edit_distance_dp_step3.png) + +=== "<4>" + ![edit_distance_dp_step4](edit_distance_problem.assets/edit_distance_dp_step4.png) + +=== "<5>" + ![edit_distance_dp_step5](edit_distance_problem.assets/edit_distance_dp_step5.png) + +=== "<6>" + ![edit_distance_dp_step6](edit_distance_problem.assets/edit_distance_dp_step6.png) + +=== "<7>" + ![edit_distance_dp_step7](edit_distance_problem.assets/edit_distance_dp_step7.png) + +=== "<8>" + ![edit_distance_dp_step8](edit_distance_problem.assets/edit_distance_dp_step8.png) + +=== "<9>" + ![edit_distance_dp_step9](edit_distance_problem.assets/edit_distance_dp_step9.png) + +=== "<10>" + ![edit_distance_dp_step10](edit_distance_problem.assets/edit_distance_dp_step10.png) + +=== "<11>" + ![edit_distance_dp_step11](edit_distance_problem.assets/edit_distance_dp_step11.png) + +=== "<12>" + ![edit_distance_dp_step12](edit_distance_problem.assets/edit_distance_dp_step12.png) + +=== "<13>" + ![edit_distance_dp_step13](edit_distance_problem.assets/edit_distance_dp_step13.png) + +=== "<14>" + ![edit_distance_dp_step14](edit_distance_problem.assets/edit_distance_dp_step14.png) + +=== "<15>" + ![edit_distance_dp_step15](edit_distance_problem.assets/edit_distance_dp_step15.png) + +### Оптимизация пространства + +Поскольку $dp[i,j]$ зависит от значения сверху $dp[i-1, j]$ , слева $dp[i, j-1]$ и слева сверху $dp[i-1, j-1]$ , прямой обход после оптимизации памяти теряет значение слева сверху, а обратный обход не позволяет заранее построить значение слева $dp[i, j-1]$ . Значит, оба наивных варианта обхода здесь непригодны. + +Чтобы решить эту проблему, можно использовать переменную `leftup` для временного сохранения значения слева сверху $dp[i-1, j-1]$ ; после этого остается учитывать только верхнее и левое значения. Тогда ситуация становится эквивалентной задаче о полном рюкзаке, и можно выполнять прямой обход. Код приведен ниже: + +```src +[file]{edit_distance}-[class]{}-[func]{edit_distance_dp_comp} +``` diff --git a/ru/docs/chapter_dynamic_programming/index.md b/ru/docs/chapter_dynamic_programming/index.md new file mode 100644 index 000000000..e8a109ef6 --- /dev/null +++ b/ru/docs/chapter_dynamic_programming/index.md @@ -0,0 +1,9 @@ +# Динамическое программирование + +![Динамическое программирование](../assets/covers/chapter_dynamic_programming.jpg) + +!!! abstract + + Ручьи впадают в реки, а реки вливаются в море. + + Динамическое программирование собирает решения малых задач в ответ на большую задачу и шаг за шагом ведет нас к ее решению. diff --git a/ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dfs_memo_tree.png b/ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dfs_memo_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..a5da3474bee8fc8f8def06cf900e29a2bd008b81 GIT binary patch literal 17551 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 JWt~$(69D-~AbJ1* literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dfs_tree.png b/ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dfs_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..793ac775f79b86eabc62b29afbaadb3b6bf7c765 GIT binary patch literal 17222 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 ZC_iCpdn?1~jQ*7)EukP@^49Rne*;Dw5ETFb literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_example.png b/ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_example.png new file mode 100644 index 0000000000000000000000000000000000000000..64e9171da77a5740c67a8cb52d1090e22d6edf86 GIT binary patch literal 12428 zcmcI~2UHYY(`L^w;1DDu2neV|$%5oCDuPIsEK!gkSwM0a6hs6;L2^=&BuLJ200GHS zkenpv9A<#+8Qy<)zjMC*chCO2o@4iP*S&SCo~nB4-adq=t14V3q9+0X;IiUFxyJy2 z5B`Mq!tub{Q5x?v@J8tLP~QarNPlAgL!!A!8Ninim&XeCfV^(TW$*!Jbywvs02D?L zW1eE?tEww&Jvcr-K0iO-+S-zqmTqWl2nh+%sxC}ROFKfU2iF8=Wo6yZSh@8sr+0dG zae2wo(z17;KeS_1C-LdJ8ad|lbaMOP=(EpBP1?!uud|g|lv_t80I&dxa(A^nM%N~m z9mXo4NR5$)1Il=p-vFhx=b^^7FK!tO&W?Mniz5Wz%pECwK1RHwj9v%M9>>cTJ!=u(R0s$RA_v?BDE>q8Zy)i= z$-#jzbpQgPMj(KH`v^)vUH_+-|NWX+i~dV%26{KIw9>#o1Frz0e=d!91Y1OfRRo}! z{{ZoC-Tem)b>Nf`v;jNz|H}mziT}(1axgUb>R@#KUtFGsn#ks1V+V%up9_-!QjL=P zf8m?4lHE#`gf(gYVLTSU9rthiwq##-(sar4JJ>^^oJi;|rJRnPGzm<(1hFYMm`T(K zWA{RSd8}ieY+alE z(erf-WGzt*Pqo7>oBU1bIFWD`vdH?gpC%K$Zr?IneMx2Ih0MVfAb;6*hI_o-gYQnx zK5-oXJz>?+wCc-?1nrTk?>CH5(uUa{NN{aH@^xElwqwEGBNh&?o*35V7>E^<(x| z>Jq1nDX$=4AJ8j0E~^nX{@ac%xv~s@l1V}R)QFUP|I=Ta-j`Iu_Ft^y0^r$F?0-J| z*g>bfo;h)|^EEy>C?zc){nji0%2)wf|iA2E@?XePRO*C?7T|ecW7n z7F1bih)Ez$rFHgi%Ok>?n|j7Ofnq?P@%pe_X`TPTvpvDENs7hHz*dKfW+9`VBkku? zYC1DB5G$5b= zwIse%qRn8Zt*cR;f-_8E1@A1>p?c9V2ksRK$5f>XPpuPb*B|6AslukRk@>2IGNCOzt z?cjh#gkI0Iy?$COl!gP71rK%m4i7{3!TwDYpQZj`QK)WTsndKMecoHb5U3?Cx9@Xm zs%^nrDU9t}y}pp?$B@M~>_Md5^5Ud@ntYGFnmS0P@pp(-km^A@5tfd642 z_oWqJ<>y&)J5pGh;!nEcS-=bIY^$e(^*+l?ANr^(eua)a-x{fH7{Qn?f(-swo&&Jr zS3LIZQ7DfQ^v3+W!F+(Q*Ok9FyZVOLOx3S{{e3UUeMBsWR2`QiespHwRTMj3Re7@; z&o5>`w9HIbPK!)-VqPf{#a0D zARSiZ@DtG|NvS=R1Jl$&2qIGt&8Tk_S7k3qtjmYD#yiJ_!FIJEN}8rv#orPpp|Nn& zIt%8(sHlJmJpoo?F~4%fDL)=;jOYN>p2lV|{a<>m>|DY0uO zL31-WX3XH3=H+6Qffh!$kps|!;;qNnBCBj7-!eT#jZ{&cJ&YUS$*E^t!0 zP2_p^uls&J6fK+X5KQLLY0H=bnkOS_>U3WTv^y{7d)YP0P}&BJ3k??GiRI0q);&IB z*sfbNuz>|O;c+#BnLRJ6>6@MuzDM*~?N!JPq@iZiAN;C^6K#b)G}ABTks4T4Qh?ML z{+&02E;2EjuZ5sEb|OGl_f!Iw^4M&x83ML^IAZj^4?AMIX0PIax`?ss5M8U5q@W#RcOUggGch`E!|UNT|Nh^FJrJnqV22d z-7UD|>W|CrfFP$7`B)Sm7jq|m!4+Xoy37=TKO1NqmRF-8(-^#wj8vnM%TI7GZfT$B zGkVV6K>e;Qz&3#ox^#eFMjn(0_b@Dh7dJ}4uCy^*b09^IOU?N3*KUBAG@V%tBLufV zzANLP#m@7Zb#atH<+R26M-;ABqOK942qSkvx#c;S$!0!9wueW6+ zWQtsl&;9p4RP%R0p0Kd`%05@(9k_k7Xy1CoxXc0|1K>#Dp~%Vj{;=+nN#Y>t;2!xU zB>3`~!uIhlV0W3Ml1lWI;TRDK?j`YS6Z4X@nxjK$7wd7UrP3QnQUF2@w6%29hq{)n zyEw!mK52Vd_Tkffj+q4atf1(??9yT$;@r4;K?EdESz<8rfSqP%mniGJs0FlviogO;T@jBe2p`AUo zNS$WyajyxC?#eAq)&=ima5cz>ngIU+`sNx#+b-8Ylf(2!3+Jz9@}o)bU5gEQ$%MFY zEjrlp&B9+&RNZJITDzMH*==j~LiO@${mh;T+vcl*wnv1x)!aQS%_pp^W^z+h9X5=$ zD3JENS@`E#Tq&@1-YbbEBsFeVptyln7EE()CZq$ts$>u1U(Pu{fA2%{ zu+<7ZXU5Ee8#t_Xe7R}BGjj8Gk&5oE+-u&tEq5ZnXsull(Q;~4sC2zrunZBVL|(xG zxB4~Hg|K^;5MQbACX%mav8bB(`Aq&ApnS#$A_uVYzZacyKR)TEN*Wt5>24}=sHiSC zl!5miIIK{k@GjPS@84tWpIXbTKA;A8wK8y;kAKOgJ*TZ8`8wc7cMAvhD3N;ISIhy_ zc^ojyu(3!y8>i3k!G-|fIO_lnOcHvcR!7>5?cOzH!p-<8W6*tq%HR~uiLUw(*l zC?#PR57NnKVnJ5u-*^W#wA5FXP4MkPb23Cqp>^ck0p>GjJ*tv(T~!SJG7EC;!ZMp& znZ!$1kk84K7pM`L?1cFK`>yU1IN1o|C)auYV}UF&lNv! z>lht#UTZs&Tf=5p#H~92NH6Tg8pxyOX~ZQDv?Q*G;0iy561_yEZdh0_Uvhb)T~+R9lr)w?i`rX8Et-sx0?h*)D_liS``**5NiG1UH31 zaOAj(0GqnU@PkuaQ01pgZk{v(NqHr^~ChJs_=#%Em0Im;nS_*;TWW- z=Pi1=(HDgq?)F6MkrA@N{vqz^;Oa4JoEx(f9+;@WmeH*{b1Bizttlg~9qTxH#v z+pr5Ln=qansyEZ?`OqVx-B16}`TTb+3s1kFJ2*m0d|OQpLhdB{Pd<5DLSUw?{l+B-C)VKs9M>SZ zUkh_`KZ_#3tq2_F_P)$HLpj7?jMsIrT$y4B90~(ODXcnYU*M}IUMb4gEN_3hS7d$q z%;L{~2I~ACa$REU~8Yh5a9rS^1#y{V(Epcfdt+M{) z;-w=f`7-N`?~Qx3VU!}BIH2{@TO?D3-i=U5*rUs=Y{#-259&uyJ~V%1{;*FFCMChZ zc!9m{$BlgZ01A99yccZ1IC*(xK{;__J?T94)z*j0>3p zp71;oGym6PIrD53xvpIk0DlDj{gNw_Q2s=~%_s0^D z(Zt^aGm(Xds+rbyhM}dbxJVBB@2Fb5Dfwuj;+bwOJo7z7A)A=Vi7h3A4D0RR`Sg@Q zs5x8PTB$~H|0`tKrGg~%S*}#vMb}=bl-XvrredD%AK&w7dFlk%pzjGRX*)|^#_6VQ zB?Jz_@u`r+#Hbl_We%tUkXh@P?(_oH@ETKa*V79X;;i z0p$>sC?}*#|4G@=PKZs6f$6uW1%x(@pF<07aS-EZB2Vfv-SfYZ&uhL{yo9e2S}(c_ zz5X(X(p5Ya1}z634juNga#tR!I4MyD)FPW+WKCpDHy;AH7@ft5F#%J$KsWT@&a?+p zNmWe{KG^1fqaj5dgqAOw#I%C?>l?4z9@SrME{xevi+Zj6vfi4a=0HQ&y>7FB`{zMQ zH`P1sVSGItix^6?OA}8$M0@&+Mg18<8Y`9Bw}0(+#Wp%HY};N6qxi|)z!}}JD(dy2 z-^9m$i;v=35M1#p4NLa(Ej=UXjnPi?<1;PD&a39GC9lTHz>SO;A(C$rHg3EcL$P`S zoAYp7IJzeUcz}+u0u_FQbdGq6mVmvlBboATvZavG( zc-)dw2H{x;S*x+*NQJz!X=M`#P&;;SrKvzkeFD24Q5n+VtD}g zixL?3Q1+m{S9SRt1hg5b7^s+Lh0X9Reb1uD+35d;g_<8v11vdm;4t+sCki7%jsS_s&inKseu_{NXO`Rw^6*gFTa6=g)gc@W%xDpBYlVdlI5R|<_ zuzfF|G*Qm2&E7y_azwO5e2J zwPh*eY$v-gv7yo9^0P|93)c0E%nc9@#dQ@J;9kN?nIE84i59@2u))*zH0yW_aiLU- zPY+L(^uB$bGB#;Jvy1%ekZp?a-~Ec%E(|g}*|c~)!DAB`2Ebus0I2v~{_FIE3T(+B zzgtE*1iHAN%HUkOJd7Mgqv`=Hyl20Ew$8*_bQzn1h#rZ`oKz57ZVUTdz^3TT=HzR^ zd=b?NR%2M*C~lhtICUtojLr`u+PN75E@F06>`-m01x#Ou6=>lC;4Z#w^-5;xNC5HD z{-ywK-Sq`VfNm3}Gd%o{S8hZF_)bat#cdk!OTT>p7BK(Ee;_T-YW9;w8*!C8ek3)G zxkzo<#H`B&c`GeoP!IryDr6MMSvA5EAqXApv+ho*eJ>F%c};$W<%i` zh}=IvdZaGdIL za$g^L)xZ2;z?^K4dxS9PGmNa{;@7b(QkXilESKf@%iHtwp->Z3xZ;58(nQ%}Zi#)r zDTxKCP#G8I0poTc;QxfcL!L#in;U?_00a^M;N;-33kt9x000IDkN^ZAX92Lne|`E- zhyFVu)zd+9kN!SWp8AKtQ4log6*Hy8VR`lDwtz==@wRLdX-;sKw=}HJSW0*vlFWCSc9yW7^NUI`q3F*P`m!uBRO7 z%??DBccV7%$v=jy#8f^?9Xw8=S5&)9qo{l6Rhfea_4$=6LxaxV9li-M{ze(KNo%^7 zIxI;2H!`P<%|MYz;Dp~@Q=R9xe|ci0boQgNR9f#hfVSok0QLD(pMKCaB@A^v>|V0- zmhweI4v%Kn?aq~vF2AL_QVUNBgRNY$B-+$Dw^uBxvloTNdfaao5@#s2nN+m!7X{6; z@Su*1oQ!18SLJ$^KI3VAfN$ZAJM-FZR`1K(X)Z5KJb{umiM1|PFzVe(ba^gbDI88` zF2*iY_bq03_&7)g2puKL5Mw!E*rYmF{oJ8sdX%K{5ZCw67KZFAq8IG zObea3Eps+m;JyE;UExL)BuL>tzKPSje9zFxRZF;Ub|9MqVo~XSnwy8})7&&& zhJ&R66P~hp`BxySKjQWx_2XwtF~8SfS!Pa)5wcf4cf_|RfAgx}iUBmgEpQEOr(Q7) zH(1uOSJ$0+Zh9@s^Et%w)3d0_d~-1*korI|&vF26e0eRKOEre1fUrB^yX%u+i$s~` zW*Iy?pKW!d;5~HO!(^RFo-LK{L;Gsv)6W8T2e}r1>o$Z6eB)~;61Ys+F_~6$TC>$o ze-sT(nh?scEwF`-#rqInOCagBdt;wrleN#W{CYtJV%)7)DB{jbYW4k$1FjyzKgJ2A z&PDFNAdY}|O=RwvIDGv+-h26e0DNm-xImvEisLS(pbhBCu+b-b@lk11Pl>32fws{* zU|RFq9v)0A$eAqCZpTYH#n5X^+p~R*IzQ~y@n$dI0|0hJuA6#gWyQk;T^swU^VKMp=LCP0hHW+5psx*?Tg4c!V}7-t$=`}RcI2i( zAcF^koR{N6M6@+6IOhfM3^Tc-okL0b>84#dQSL%0OUh?HJ(}WKxqC$dFCY?qncB0P zSyDsx^Gx{hdtR~<*GnTAAaN@LiD{<#m+Li<-zVKNzqA1zuf{iK=uDIGRUZvBzwx}{ z(HSsKcHT($*?1Vz-hJs2u|W6WuRNrN1*GINz<)*pxs@tp(neBn=B27<2CsjF6x<4{ zc6~w8`!}p0HL})@mMH?#((`_T?Wl@Wz_98?R?L9W=z%Iy`~gNDqH583D}%2n{X+pD zdCWn3FXena{}u6<>PC$BCvS%zQhA&b1Y$9gV&+KrR#1P=cz>qP{7rhP7>sS5NJ^ev z_j|I5Mk}N4sL`vGg%rtD1k<8L&x68u4vkCqjQx=SzpBsGX)b8)q1s6Oh;>K54SN8^ zG_6hYfXvzZ;6D7r&>r+|nb)CEO5jp1#=P2Snu{C;_fH6c!T+K6f5+MXo%{b)h(IPm z|MOn)ujBvkTgU$^J^#*vttrcunf!hVe>ge1!NiT_E)qE3SXKZKBsWm9L=9wg<^~+&eiWc$+4p{jA*{^5%kmF zK6>3qakgV7+$tk~2jq*KWik==GFKccy1fTyC$XZ$)e?#+7DYFXlnL}+AHQF^9=L}F z0J3WA-vT5j7N^oq&q>?kADKne@u8e@%BqcAmKkVKKhI@vqO9UMp>jy4cYy8D=5Na} z-3GrTh)4iqS^oIUAsgD&9WCZHAMR2$n!;+TEwnI5|JcXh>dF5@2 zOZMLTe7oecKZH)tzlvKaOuV0Pf|ElUm!TwcOB*{ZnR8j6dmLe@mbb=lAVf*bCw|UD zeu{t0alY+0GDsqmo9`7}H|!vKwB(MC7r(#oIO1&YRa_hb z33t+z<{OFFWs}nm?|3TMsRy%WB6J!V{4~>iXDIf~crqZ0<}_Fr9tk^3Ki}^!Gm);^ z5D&{izt>7r#%kBn0OB=2 zi(X!o*?*AvW;U^oW*QSvG1-zn)PCvBDGREM3Qbw@yeVBckI}4HOF+dh>lVtoiJTr% z#!*_9)9+oln@3c@9r}CSm9p^;Cv(`gUYoW36iYg4(Aqm2QNF z6w_|Z=u)1#u!#x6f;`qW+Wa9=7g3QMf>nbvhbj+mx^xgzrm`9L`AvD`b9>Wb@+#@< z>X4h|DPyN{BG^=PBV=sM8f)jjsuAH3RiNDal5srt2CS7)< z!w`r0C!<-33rsqYm6v(t8`%>I@%WQ&v$6->a@8-ih>=7MZZ$}aCsgS3`n^I$f*&7- zMmF>xjzg1I>*4IBxN| zOZj((y>#{UJ!$w7eKAcAlyR2!+=vhL0lBW(7y>BxJ`?*ZQcPwZceraj`WgJ|< zuw{wWauqlg+}qt1`xq%7&_U%Mk(lt{t7;~eh3a&Ww|Z=BDv9HNufPSk=okrm>3{0_ z{vrzn+>0ruXZYoiBZ7Iicl7>bM0ug29}I72kh&mcET|*Yu<;(i_aNHc8cC`n+(-G9 z)zgOg@li~-Gk(5pS#)AAd?{;JfN$WVf1gq|uq%#|Gd`Uho)<^)R0?vSmT!ftpA}t4 z?PbVpj6{or#AU*XGSJY}RFDPVzk=%48H+1` z)lG!1hsVQ?3?a{K^`_Y05c%he93NNReMrvT8_ctKnECIE<*5{rik8aep_QxYJD z-3B2y5JyMiC_kh7k5ldP+Mq#xY;W?P5|SUKg{H(LLtL-EyLxTzlkq7zlprSkPHpy=5(%S_NI7IK>@ISP zOOae$vHO6qqY3k5`Uqn@N4$oi*A-G8V(WOjSd6k5rF-HSTVzqRijPv zYpLJ>mv8chq}Ru=yd~?(h`-edv6j5<=N@bwoFDsAhdLFrM#{I;_~p1urJt!d*!Yh( z+oG3Z&9{}oesr`dmSkz;=f@^R1yb>uh#`@D!ocogoi7sv3KrQ^zy#~uYw(YpZlFx4 z@N~|Y*s*OB6v4pIL2yIBqbLX{0*M6co&~)BYj^!;xEv_{AH#go0hMamN7}~#mwxGP zpPR<+8%cN7b#G(B@1whw-@iEa4ka0^8q~B(l$XcGmU~;Ip?_Ff4c}L!#aZbES>w;A zMLS0Kjt+O&9&faEG#_fLvF+1$FPG|ce6989PQN!$*pRMgy}($VB~y;>U{*`+wR^oY zF?Em3e-do^fj1x$!!<*{@up7(SU;>TB_Z>lU7 z7ngtLk}j`nsBDb0H=q%2+0Lhp(i~NKx<_kq@Obp~fj64(47(e^hq}(hlges+0q)zC z@%!>5cZZQBKN|b#@_4>o*~g7ET!wZv_wrMtAV6D%Rv++S_S1rIsl7LwlGDGy;)J4r z?DScImOiXPv>TZoVNsu-NXWAnM^b;AGsR#6{--pT()6U5Rg!9lc^?{9IR3+f#18++ zIfr8U)UA4A?%~lJFm86l0`mH;v%+uP>dAjtlB&mVCHCC<+H(G;@3`;@Qc#LpQri5< zK3{USJMq>JJ>*G-Z_Yc`x4o~xRJd0Nl%`?^WYh`;GSgLU1ivRLbZ2Yjt=NsrDS6gV zlXdKFKmQf@b|+_>H|C{?!`HC`!;d10>`TUhe)@_UoylV@jMLxR)^$X>ehCEt6sF|U zeSt}<_h4D>)rxhyMf8yNc$2D`DBh}y5W(-E zjO*i-_HxK5_Un$AuM}W_DIq76wV}l2qYuQ_m9=4z!FoJ49M54~@oUP(${nbwIaFE1Ls zi%T2xu5DxVTW*=&gOG%o5=KbE2*GnxN-sscnl5(V1{Gh}A4|oFuADxq^XPHpj+Bz| zx6B7OP?6#CyPj++KGYAd&_No@0Q7jSrySC`aZqK1@pFo>SY_}IMa&Unhu^0;J=?GQ z>SRZGx8rv2KR3`#>xqK>vZ1=xvu?W?P3SeU2hR`D`ovcc|ty z*fQQ*O`X)GxmE#clF>B4fpksYbH((VBWFhN-RGvFYX&NK`C6rabq8dO?F)Py^rLol z@Vp(IeJ#e!Tt(b7MQu)s*iU-!up3}I;@(#M{2alAgk*6;iqAvGEa+|LSaS_3Y2lGj z3CM~{;=FFulHCtVud+7%LBg%=yqE;ZS{jI@io@%3&ewO5>a3`9Oygun;ljMCO4qFk zk)O`7?_#T$MArBpqytS!#>>^FL^n~}mH4NnUv-duYW&*yecwG9I=9*z)^8&~?x2|7 zQqEb4_4X4xNZNa}z4?@l{qYHLkIH67b7x!mAzERo!uy}fK2s+hh-RN6(4EQhM@j$1 z25if!i0PTH;A$TiNX_7}$g$OD3{b~>0LVcGh8>w-KJq=~*lUCT8;-_u^O2bcCB?Mk z*SU|Eu%@se)8{~~VF3YLINGLzfM+8T5*Su={9hb`fq(rT3j4+TKYuVqc~jV6 z0*0#EM09>WbMFH`s`_!ths&rxew1vV`)6Ro3_NvXxS_632GZWsV1HXf++I{0P@9T6 z481gmxV=|*_FH^$X~QZQfK1<{c--lmtIUp&9K6#lF#7ZQrW~@-&-}4@rIE@}ci`(g z2UJSCgO&M34w9lVIupGCG4k|L%wYFKnb3YNdu1!ZRox$(%;B0I(B(O4>Sm%YqvK0@w~zznMU`Q9IoH=5k0glA*(CAiO-X6P8S3g}V@Ap)&%&!A8_ zd~s><42sGx#RsZ#dG}0T{Wr`EZ!!P? literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_state_transfer.png b/ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_state_transfer.png new file mode 100644 index 0000000000000000000000000000000000000000..6ce1be6257f7ec0cf5ff705daf1e5f522d34d50e GIT binary patch literal 11967 zcmcI~byyVP_wUT?E-c+4xfUg{2Cc9N7)VK@!~z1+2ojP5s30LKAV{l}Afcq>0s_(~ z-K$8~D$;cqzxVsc{r>VkzkBC-=9zitea|_cbI#|Dd1szzYhIfzzx_VzZ3MAEA&2@el%XlMwj48C;fQg(Lsx%i2u!R~S5L|pr);l(+F zM1zYlPwedM9CO1vD!eWL00y|OqNL|NvNZnW#hW2^R1ZZHY5cYP@58_iDxvUTDw&MN zTVI*t4D@|6Px!XTdclDQAldH!j{}Z2bn|+|f5sc}sE9cTbNCES-=9|4yB`E;Q=x@` zI2Z<4|IJA_LqYVcVR?M`KKJl_rKGIozWAs^<0Oyfp!g3>Wi-xv3W(G%6$Q$BW1PLi z@<5}*VL45{H@QESfMnT+z{74Df_(<{NJ07WpBsyP!&eQ_?vU%9FjK(bHBEYgRFcMm z*<)FqP|NJ>IQa)~~oGh!NnRl44!w!@5!J*THLpkL@KV^U~qWF)?nUsLRpFqbH zICL0w=xIa$d?P*;iSe@nnuCC3UC=p@fuMYlatdFeg&Oj$$wiR1q_b(6DjgUg##$`U z*m#Cua&=O`X~Dc8&eq~igPSFa^B~C_EbBKv{DH#w;ecjFhWS|cT{j{5g~R}<5K=T%dmrN^~26Wpcr_l zMN1G68Q86H{os4k)TSlZ88XacZ8<|Qb@6$2^|4HC7$O3bKg@jH%!s#1@xu(aZ5_rdHiS{MX#Vg&{Gya4QNyQoO+skvp$1~FW z1ux!8HAUjrvSfJ>MT#n`x+@Kfe;xDqoik&A&T71IYKMKV2xX0{o^BP|MabWdO9N1M( zrofK_Ew1@cWN5@ts`xt-aexZveF%)Dvg(HdqM_m0HoPUK=uY<;a$}yE)yj_!GQiZe z2kZlgbz_-oRStOH<fdWDNZ;Yr2>#l%jJ8jKF2X=!+#+;e=P$4A(%kx-{ zhEQVXS-%$u$4^s78qAyN^V*`@>JGn)+nn%e=#GICxoa9adic^uXfk>is@aIfOzA(O-$#c6dB zNwm*^cubJT@_|NcV8&SyU#XMoB!O_vfM{(wK1@Qr)K>0ryrj)Yb^zBU+Syqeg$MK` zM!)$IltLj;o>GCQ$1a!GB~uV%sainNj>q3TlPn-dKhqT^j13+?2A*T{HNC3s+u*KivN%dr2Z#k6nond*b>N1t8ys4LINLeJ_O`3CS2N>h;Tb=<%tx6hW{PLurA0LYe z<2?A?a}47QSSerp!T9G_n~0A6VuGzQEd@S7TBW+$8$`SC!|T6S=Eq+#f34E( zNUo~?Y_{to*RU;>FjVEW_GcF~JN6?!Ayw}4b`uS53kH@ZQx7aXoqj5Dcjhz9j4^uL zIVdQQ%d`J;oPTtiVTm*G1W!$vHF*fydI9kG{~qlKJrPAo9Onzazz0u77p`faVuVkE zM(dk@*3S?o3_dl1-pi(m!`nn*kpUQUmjp7TdX02Z>(IlqrLGgf&{A1EFS+t;; z%)!R&#EgR2TWtiiS}?x) zX{+C!7~4xHy{Xb?C&*KIg%#lCX-TQuUZHbs%#7ah556AMwF_)%t|CYmn#SGEv?~&8 zGIl)*GWQS@1z_#szR8;hIHEr@c6@C=cpOXEMQ=Kqyp3ZdYK&dVeUCz{9#_Cmn#IBd z`Pe`j7kK@~)tbH9b3peCKHWUjX$)zHjug^WaGIQsk+zo7+*B4yKWl`aDAtJ*Y1X$N z4JYddrN$zw-Ke$*@8r6}5oWix2?G5#oW!KXcHZa+gc&xKuTFbW_&C8qs!l7Xi&_Iq z3YTJ#MS2O4p{{?Py`Np5e={gv6iD;D)%Xri?58H!PV0Q+X7uK5Vxb{?yNo93q;BoC z5$)y)d6M;7qpy>Bo*-%~Ctt#Z2$gSZyUS7BNT`r8(1N8+kUj@QYH%ThCyyQY)4ZQiuN|nFJ2wmxe2?d6aGk_ zhuh1QX>dg6HbvuDF^gyO$vqZmV`_w>@9zhAoJ~xMqtit*)r+ zA3O}yg9+yB7FyQ{Co=T&y%xMJR>goIdG7&%xgxoHWu&u;f#l|t^TJ8#zP}9RTdPlW z7LsZ1TJ`%F3jf@Iqw*x?L8}c8M2}?yet+(jj6E{zlD%(Hkw$Iu=YjzF@yf3on9$#a zQNxu(qPh}bd~z5IOyGTZ)r(-u>oV%S$?RJHMCM3b#rN`oDeJ5GpXKe_);R#uOn&$2 zwlr2#<{da&s6uwlz{=Y2tX_%OS5_Z8tnFy#b7dAsdPeV$odR?MTDqy3qYPBp?eleO zN+SZ^E8Jv(0m#*ng%~iUR{24dUQl(y=%V=OLowjHSZrZBr{>3BpUO+PjH?sk3J2F* z6qUTU?%wN?3j-bw8pcXk&GniN!-nsj#i5AF-!5rzOZN#t>EKchb@h^VVJg&G&K|^4 zEAOR2>R7`-j3ssD{cxRA9gVVYf?(2x#`sDB?+H^oBt{5u5di}OImZqN&Gy&1le4X7 zKTu6{$i|5RO2C93#LmJ;!SS-Jo<#tNmL0D4mz}*<1R!}y`HPr3MOtx&iTeAN2oufy zh~gXM7(=9)M?|VjlUwJQ5(ERa?p4yCleI-*(1hEN>+jEIM$cdtZsN-FXkk`e9e@PA zm4TIoe3`R|wWZ8w*ivvM4n9QV7-20cg7=3t?>(@-sRJo$6Bqf~P>h@^i1ZcozDHY7 z{c%kGJlOk(Vyj1D)m=i}gpvuy0P&RgdmpHgTumxUa zhqkL@W!zVTgzSr^GsSZS+7Azlt?qvpz+LlXz9C!XE5LDee&ynl2X*)xlBKQr(u4r6 zcuw~DSX`W0!dSq$tx7TADMO@PNhuozgd`S07fj2w;Qdi#!ZGB@!CdH*hlQ5Z5}d(Q zRLafuw}D^Vdko>J`qr_4b9LAHPT+nV(`89-8%S(mL*-sUD*Sn4wEr>N$UPsKColv;q*>J6T1&9(6ya(Tusm6i z{%U(*q9fQm0^CFrejN`~dhr+lx7Hw@I~zkUf#vhj;D|q~b8Va7ce#G-u^_LgXp2C1 zpI#gi%?K+~_dI)r5;_-P#E9`EeHPEIixwpOwpUxoF4YgawlI;3+d_ zMRd=~gRzF0mqzgKIO?LnB;dh%vvdkWP>BKYch`1MYg*=U9H1#kIFLH;Rr8P{66Iaq zGp< z6Q~|N!j)b=-+9VT03zhYF5tZWjnkMRLt6D1}i=pETjwqK$&D4ncDWl zSs2GXeP0svEYD_gX?BL174$ikkb( zPTjMycKrn5u_P|(SlVgV8ajbWdfoYTM$R40o0;edUO>=Gb9!SZNain2(n}7!qDK=F zDiMP-7OAk&3G=_M-h`P?y}xIu9Glx;a`Og0^Xuv(fYT}Dz4;&#gj_FxZI0C*pysk) zqy0qbGoY#5+NO0~>A0&hH8xdCEFC_XTeUSn{;!3-B(h)}2lE%6Gd2b{ZPZWnU4%Qn2w zfnIN34lfL~O~^m2F&vgn)P@kQQefE%)El z`Pmlv}<}xrer7!v1i-%?l7g$wjEa9Gsxe0%#&T_1zwKgxFkNn=U_t?rsAf! zt_%Y_n();1isl&14RE3?vhjxwf4YdAfGhqDE>1+PM^h-l#Koi%n-=B_ipxOPb;RjsJBWoWYav5yG41bZnM5V+o1&}v+$q*>c5(Q zxGj)i_k;bs1W(Qxia$)+)qircadVSvixUSlWV4Q9t!o-sH5ygE4j#ly3?veNJVfi| zK}UfhhX<0(&@Q_Er$KYBr!Zo)IsQW@H&fj{JQIQR$XO*0egJ#=YB8?(XHa7mJbvM> z`R2mHDLphJK%&Zd>F(MUR4+@!GY0eTwtSbLp0WR1G34%A9YEh@8XKDoKEIJ6pIB>Y z&B#vnaSNH_#M~iTUDCU~a56m+`6a%;ok#{iu;`gp;qFrklwM-YD=~8p zep_B)FstZ+@U1F(UUJ;_6qH#a!*fU9AW{VN@dVe+DY>*qRRwy4zZTIhDu!;RN+%FH zoM5&t!Ah}X!DH^IX7h<){lzIB#fWjdhN}^qi3k=;j&Uj5}F(T3* z`%Modo4~-A1dL2rT{{XWaEg;$olIg zv}X;9jH13&@ukqoOrS4L0Mh7ZNq=R~q;eKap=sDBdxG7GT$;eBzs8YUqtMtVq|AX{ zbI#R(JvNPOnEQV>cY?;sC9A!tupRK!gJ<`|dZ@I?nZ*$JS%~{x^1-i{%pi5TIV9&~ z64lZCi@fWswbKw$<9~BPlyJOFl3p^5|I}Io!{eE+hEo%v+?>4_eey{6mZoU2!v-7~ zbe`#iGIqag$ZXy+EKPf^`su?va_j`ziOU0Q$f4)%Jim0+f0~_I7(pgnG-OLB3E{Tq z`J)*8UjuC9A;X+KohAOko-~Qn<-m-e`LrNjl=VP4BvE;s`>}(y?Ogd!ZL+Zt8tnm; z(4p*|2*ABNzqI~K5n5>3AxO%yO`7w_nP))SSbjr7=wa1JnG*bIc4P+#wXATmof1<$ zFM-M-x9AeXS#fL&fC`f=Ct9gUXRpYt`MFQNAge1yYtP$BXDD4>h?BZ|XzHndl=>F7 z^ka#}l{ex2e13(cP93=KE2+S=bM&vkY1}KRhl8D2=8KRhd;QTQXamywizCLzhB-XT zA0}a9y6vfo+(kG1>>Qwygys`NOAfpyD!7T8M{M9RfNP?BFPp*LBwJ;RG?sL2>G#t& zkApr*%{3trvx(i%8D}|Sv&%x#^^67U@y5@lL+lqUI zTD|6fOs>GW80^hPF7r#1!|7Wu>#3{#sgCA{94N!sRTKU&^bxvKV@-$M9MgfPF4pNx zO|~(ood~dCzWgUeO1hrhkI9g_?tcL6R>Gg4?#7S25gPPnzVpjO0Mz8>+thhfRo40| ztMyjNCy2cEk|_c_uD}8k1li6w&!Ei3ooz31l)?b&?hVrz0g3TS?!5{07jgsxPk?PF zz;Bn~AKXdp4)80DXC3axz~9~!M$zKx4&T$xW1Jj=kCr$ef!l+?tklb^n2+~4D!jIk z3BCnIG>$_C1gl;1bF3t@W8S$&6WLdmQ8`B|2Qk95c#(P)VK@d88~ZU|Q0Z44GdyQ8JzfubjV94v8VZ1mx6j6caL?h<`o)aoxh+#u_?JjJIaJ9e z@U0)kgpC?o+SrbZ1Yv~2HJ2rXi9&e*v&!w>`3ocWHV7?`_nGW0*zqTisG$emYJZiE zp;t61sSi85E!9x^3T|Hd#D0E!cl!N8S!D3107_bNI}`BAnc#Mf7X@b~PJXL9)O^7D^y`cKVcn{4+4gtudg)AOcYU)SIhudMuT0Mzfn8#rcM`r zJ08p+EWKl_>mG68NXDp|XKmw6&xAN3g74>yT#7s0Iqu4Iav(8;XbaE86r}ElS8o2| z3#Ijecslg{(vvB5HwVn%f4uV&#^t|a zio$>3wa~pR+PvV&nX?qdMMGGOu>DjIJxd zt=s*QX!H~I`MCC)gUNL?DuIld2&hv;x~R@pIV3;F(2JmtsIMpMAv{gI}9!m0Pj zTY`m7I-OsGg-}UEpa>V!TNHG(DiRJjjGswW9FYge?=t{TN1$`lYOP&6$KOgB9!_lu zsmIcMbY#{8p~1n+_*9O=*dp~;&;BCqW$p+v_^H^Wd+H%@M9jzy+siZ3x|FN3bCx>fdm>KgPnBV5vzwEX}~_s(kc%tvFY8J zWKW-wbN%&o*KxEDn3G!q+_yJ&3r&yT0)k2lkm50uBDUBR+XhGoCbbWO*;Blx0sOy5 z3;7UCIDA~?gGzbDlQPl!xdpr5&N70?0lQB|2doW$dh$+EVTvXo&-PM0pYJ^xa?QIG zi1TrIdlO?YK#g&&z^7pCK}PVGiEQ$*Jr@kHY%6&vRvdm@T(EvA>c~ze3t3lZ!GS4MadhV-1}f~Rko^ki=8-vap;`C_07^Oy6LwG%k>YSs|3N7O?@{db_kDk!K8w-@EX1Cs zy+UkRlQGx#(*&~KXT{;j1{rZ65~&SmnEwjRp5z7>bi4rsg{^q;2jzqb4zQ{Z1@wg2CQ^k208qqzNOB&+%s znYIJz@6s?*j=HQkWYJScy{Y3(1K9+P#eky^rT@*N;+?(aIL~UJ!e`C_-$fn$y@~L& z@!Qe+&&C5LGk;6hE`~d=4~eNwg8FKFVbzy&7>p-1`2!qH-DNI3I>;w=p3b)n6x#Vh zeXp`S{6I}6^`KKTv-n#LotpD%nyTTSK)W%N1B0rW#n|>vCI7_J%xj_1^_UvuqxiB!}FrZN)*4%L`&W)?%cJJ`6wIu?Sd zzCHVP4VWBSb{a86&(QaMBKPsfmk#>U^aqu{mg`h04XS!?e`g||hTqNk`{d}7w1281 z2vg_E>?Tpz5`M3?4WAe6BY9YZ<$cqwy-!-uma|o++imH0jzFmVyTm}J*wG~!kgx0( z-Rj0^mp~ui1~jR=U@x$@eurOzmZ+Cqrg&iuGQ3pa5!KtGV3tK_oNfNpHvQdWJNSFd zc1SgU=mQ^_%vr3UPEN+w*iC(pZUEoU2A4OzRBegMoJZrn1CPtg z1tWo~Z}NDN%4EQtueWcIzXMFpj^1{k1^5ae&UgvV-^X^gL%dJIvvmHv(-Z7qCOtF?G)I^t2j;7t8l*zv~+M^bvCatF!0*hGQRNY%Wampz|{7gM^CO~QxB+$h~2WZxx0DAj6~n*;n~-z+%l9WH@3fgxzJms9yIxA zUM4QR>#WHeGGdEzQS1Z*K3UCgYm3Cm$GesmI)F}NAsD$)R7W0ApaT1_C55ALykJ(l z(la+J!n=U|sCS@W=yqS39ctAdo0X7)*m5pU(HZ!&J{^WL)7q1V_xo*DDT*q60yk&( z&Vr8NX(eYVi-^#u3`k$~@gzZt|FBaK@lu}soWxs|8$s3TZRa~@1 z=4lzVgN8ap!p|_5Lh?Tc6i5F8C?+s)?G2K@XHR|Eleo<|_Ta9w*)tG9O{% z1L+lK@4ceppv51q7>ZQeb9#I9m6!<#lp{C`5JnPdt&=8FuyE>rEECc7_Kt1Gz|*OD zI8#cBeqS@&?*#GPR?uhz7}@SjwD?jUDk0V#moiZLQj*|jG!-LE@`?fiCzPH|z5c^Q z#40MglJ_7+W=2ab74J%>Fq>b1_p6f`Z=~L)Kb%UQG5IKUxV&#UZtDQ|I*&@tcX8o$ zPr)A)caKpj<<@Q;!?w>$bW`I$SWI))+6S168ni1|AitbRW+<%X2D^N%-KF7mKZ506 zgS~dvnc)DkX zVZC;6fAVXdV(f;PL5uex=F8c%3bq3U2CUe$!_@aHK#SvJNlMoxa~6RnsS%C%VBtd( z;`oa3EXeLB?)pW(&F_k^UwOO8?Flg3)~Up>n^9t5HD<%W`}qv;s=pA zn$e5E;d?-rY-Yw$&n#!ozoXUga(iE?p&_$A0ToS7OQcZI7 zdB5~Dwfl{jy}W!UZ@j#y-pk9`i=`e_$edUau5&HRFLn}v)zSx%fXBF*Dk^*5T+v_h@1>UHBIk=a}Uia?FM&9~1-d-1ge@-2#PE`ECEy`KY9zI@<8<*eBi zs4$4`MFBmVmcq6vo(mrULBSFAM~yKpIJ?UF<;L<+CmQXlSHOD7G&i_2e1jK5=*jr- z5u!bmHGNubQXG$0NI}#`B)<;^G8GYTcM_MBK;2P?+q(z%ml<+ovF<_AZ1|0b4x@c} zhAq_vDam3UvY`#1GJc2JS6tg=Y0VTZQqwRg%;Ixd&$h5H_{kenCYYbaT@ZM;s!+f> z`K)3`+T6U2g8|Z;cSD6=m>{!vT$FI2`2AFskrU>Cl?{I~ao47+-tT+wP&*n+7x)Ld zZ{5?yH|#~{a_v&3Kav8Q>Ipuy>%w^-7Jy-E~(XRnxf1jgSgxn$=tCQ?={Ot|-! zbAnEKK_4{B-tOiF<<65b`>q+mn{xbSnp91wyGhMzPYvUH3ZF9(?HhD9sTgpRvdj%a zlIyQE@1@*kB6?q$4*d}m_02;{gGL-mR{14Og3fFX2Wah2Xx!hhgRL1P6mVpf=@?DeZj=uxejiyS-$^5%mgDb zFTU|Obm7N6HKz3BJU#UwZr`UAvAW@xbl{!JId+OUt?B?i#hta85N`J64L`E zh`?K(k}kV;;D(M7+Eu2}1?4?*oDd&920|sj?}a;yb9`qc{hU&`f(VyfXpzIcGx1M^ zrStqL%Jx&7f~PktgF zn59~BuFi^4rThmQ)_*%91K9o2t(HYl^;-bI#Il#yCUcski|@b!AGlFi>cYBZx(iHcXWrKwpYBpTV@#PaaM@LmmolX3M}MFd zZ+ZpLZjs5zrP;3e+=ybxurI3Ar>s0V%DO|OYwm8ux4shko-B)>8zmyRG=o<++vRXo zcRj=jchpLm^URjt)A#(m?6@C~9BQ^~i8M-j2Nkgtgvc^jW8L<{J7v(8k5CCTI=!te zSnT`F;8(p1>d$oLQw(p;u6&$UXDk;dEWg4O8_Yr%sXCAkbiu^M2>%y(COb{|p8~Cb_L?8p!bVWG~fEwA^&e|10Nk(2`;LI=w}kDFIe#U z`mqr}wHDGS)S+x7?3SZnvRw2=s}2Zb0|8xy-Pv9rkrtvrU0Fy zj8k&}h!}+D?n@c%Dw@|*i9IRT%1!saWodntqyd2$;~8tMww(^Wimg&ip@d|PxLs32 zw-!YZNW}cWITR}gb-!;-dwFF!(NM(FZ{d(ePoCWxs1DAduC-!X8()-z1}@jkB)r+UTw;hXs^E364WNS&tcSY}s~x2LbaF1SmbDw&FA6wpQpLd<*sFq6dl;&D!Z{gVO!DxW1W;CRaJX zX>gqyyP)wvBVr#QX1jksNAGL*ba!M-N1rn}VS4cSHbhvZLROinQyOFGeEk@AK!S_P z=!?W=BW<0KoBmCOH;ZV=Z6q{8ceRV|l1jCma%+jT2wg`2cx}`ZHL^1oTw!^(J-|zt z*TGagMj%-2$u2-Nm6XZBe!&tgJGW*ReXW}`Jou>DeWbbZBys?wm~4#3Jth~OGd~ipKb08_+-^x z^kkY7BA7Gb`x0;Oxlxig-(1893Sae;plXdr{ZT-i=S+QbOj@`y190_Cr#)p#@p-UW zPkQ0n=!@SIXsm)||GD*kT`;%ky8YEp-(MT+-1)O_;)DB=HJWczYiC}~8tCh)vMlneQ_COfOZ70$nL0B>N}&D`QLtVgax<_C z>jME-nIQ?QlCD52NA|Zx56Vqh?^N1uO<#efs51Km(P?J+hg1QNLrAC112!Cg#AO+!~KRtGfHV}{d*eI(}w=VIN%q14Q_M1U}p@cL; zGyGjK)p&9*CTV;|4#guYPSs}z?DbFccrxO(<2MFu>*g;|X6(HQWqNwNR5K-9HQh{5 z@z$cBl*KWmu*9>mx%c5A{0dJ$V#qM*vy?Fkt=*{y4wLi-oDVIqKoUV*%=d7RSIUa5 zy?}mZGv)F-Z<==p%WFMcEff`EBsimTWu$L=Naa402GF;rO7bo3nj dSL7_%gg#wQ71%FLmN;s9T~$-1;4(h=e*x7ZctrpJ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.md b/ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.md new file mode 100644 index 000000000..b781b8d95 --- /dev/null +++ b/ru/docs/chapter_dynamic_programming/intro_to_dynamic_programming.md @@ -0,0 +1,110 @@ +# Первое знакомство с динамическим программированием + +Динамическое программирование (dynamic programming) - это важная алгоритмическая парадигма, которая разбивает задачу на последовательность более мелких подзадач и за счет хранения их решений избегает повторных вычислений, тем самым резко повышая эффективность по времени. + +В этом разделе мы начнем с классического примера: сначала запишем его грубое решение через backtracking, увидим в нем перекрывающиеся подзадачи, а затем постепенно выведем более эффективное решение на основе динамического программирования. + +!!! question "Подъем по лестнице" + + Дана лестница из $n$ ступеней. За один шаг можно подняться на $1$ или на $2$ ступени. Сколькими способами можно добраться до вершины? + +Как показано на рисунке ниже, для лестницы из $3$ ступеней существует $3$ способа добраться до вершины. + +![Число способов подняться на 3-ю ступень](intro_to_dynamic_programming.assets/climbing_stairs_example.png) + +Цель этой задачи - вычислить количество способов. **Поэтому можно попробовать грубо перебрать все варианты с помощью backtracking**. Если представить подъем по лестнице как последовательность решений, то мы начинаем от земли и на каждом раунде выбираем прыжок на $1$ или на $2$ ступени; всякий раз, когда достигаем вершины, увеличиваем число способов на $1$ , а если перескакиваем вершину, обрезаем эту ветвь. Код выглядит так: + +```src +[file]{climbing_stairs_backtrack}-[class]{}-[func]{climbing_stairs_backtrack} +``` + +## Метод 1: полный перебор + +Backtracking обычно не раскладывает задачу явно на подзадачи; вместо этого он рассматривает решение как последовательность решений, используя попытки и обрезку для поиска всех возможных ответов. + +Попробуем посмотреть на задачу именно как на разложение подзадач. Пусть число способов добраться до ступени $i$ равно $dp[i]$ ; тогда $dp[i]$ - это исходная задача, а ее подзадачи включают: + +$$ +dp[i-1], dp[i-2], \dots, dp[2], dp[1] +$$ + +Поскольку за один раунд можно подняться только на $1$ или на $2$ ступени, стоя на ступени $i$ , в предыдущий раунд мы могли находиться только на ступени $i - 1$ или на ступени $i - 2$ . Иначе говоря, на ступень $i$ можно попасть только со ступени $i -1$ или со ступени $i - 2$ . + +Отсюда получается важный вывод: **число способов добраться до ступени $i - 1$ плюс число способов добраться до ступени $i - 2$ равно числу способов добраться до ступени $i$**. Формула имеет вид: + +$$ +dp[i] = dp[i-1] + dp[i-2] +$$ + +Это означает, что в задаче о подъеме по лестнице между подзадачами существует рекуррентная зависимость, и **решение исходной задачи может быть построено на основе решений подзадач**. Эта связь показана на рисунке ниже. + +![Рекуррентная связь числа способов](intro_to_dynamic_programming.assets/climbing_stairs_state_transfer.png) + +По рекуррентной формуле можно получить решение полного перебора. Начиная с $dp[n]$ , **мы рекурсивно разлагаем большую задачу в сумму двух меньших задач** , пока не дойдем до наименьших подзадач $dp[1]$ и $dp[2]$ . Их решения уже известны: $dp[1] = 1$ и $dp[2] = 2$ , что означает $1$ и $2$ способа подняться соответственно на $1$-ю и $2$-ю ступени. + +Посмотрите на следующий код: как и стандартный backtracking, он относится к поиску в глубину, но выглядит более компактно: + +```src +[file]{climbing_stairs_dfs}-[class]{}-[func]{climbing_stairs_dfs} +``` + +На рисунке ниже показано дерево рекурсии, возникающее при полном переборе. Для задачи $dp[n]$ глубина дерева рекурсии равна $n$ , а временная сложность равна $O(2^n)$ . Экспоненциальный рост взрывообразен: если подать на вход достаточно большое значение $n$ , ожидание станет очень долгим. + +![Дерево рекурсии для подъема по лестнице](intro_to_dynamic_programming.assets/climbing_stairs_dfs_tree.png) + +Если посмотреть на рисунок выше, то видно, что **экспоненциальная временная сложность порождается "перекрывающимися подзадачами"**. Например, $dp[9]$ раскладывается в $dp[8]$ и $dp[7]$ , а $dp[8]$ - в $dp[7]$ и $dp[6]$ ; обе ветви содержат подзадачу $dp[7]$ . + +Продолжая это рассуждение, мы видим, что подзадачи порождают все более мелкие перекрывающиеся подзадачи без конца. Подавляющая часть вычислительных ресурсов уходит именно на них. + +## Метод 2: поиск с мемоизацией + +Чтобы ускорить алгоритм, **мы хотим, чтобы каждая перекрывающаяся подзадача вычислялась только один раз**. Для этого объявим массив `mem` для хранения решения каждой подзадачи и будем обрезать повторные вычисления в процессе поиска. + +1. Когда $dp[i]$ вычисляется впервые, мы сохраняем его в `mem[i]` для последующего использования. +2. Когда значение $dp[i]$ требуется снова, мы просто берем его напрямую из `mem[i]` и тем самым избегаем повторного вычисления подзадачи. + +Код приведен ниже: + +```src +[file]{climbing_stairs_dfs_mem}-[class]{}-[func]{climbing_stairs_dfs_mem} +``` + +Как показано на рисунке ниже, **после введения мемоизации каждая перекрывающаяся подзадача вычисляется только один раз, и временная сложность оптимизируется до $O(n)$** . Это огромный скачок в эффективности. + +![Дерево рекурсии для поиска с мемоизацией](intro_to_dynamic_programming.assets/climbing_stairs_dfs_memo_tree.png) + +## Метод 3: динамическое программирование + +**Поиск с мемоизацией - это метод "сверху вниз"** : мы начинаем с исходной задачи (корня), рекурсивно раскладываем более крупные подзадачи на меньшие, пока не достигнем наименьших подзадач с уже известным ответом (листьев). Затем в процессе возврата постепенно собираем решения подзадач и тем самым получаем решение исходной задачи. + +Напротив, **динамическое программирование - это метод "снизу вверх"** : начиная с решений наименьших подзадач, мы итеративно строим решения для более крупных подзадач, пока не получим ответ на исходную задачу. + +Поскольку в динамическом программировании нет этапа возврата, для его реализации достаточно обычных циклов, без рекурсии. В приведенном ниже коде мы инициализируем массив `dp` для хранения решений подзадач; он выполняет ту же роль, что и массив `mem` в мемоизированном поиске: + +```src +[file]{climbing_stairs_dp}-[class]{}-[func]{climbing_stairs_dp} +``` + +На рисунке ниже смоделирован процесс выполнения этого кода. + +![Процесс динамического программирования для подъема по лестнице](intro_to_dynamic_programming.assets/climbing_stairs_dp.png) + +Как и в backtracking, в динамическом программировании используется понятие "состояние" для обозначения некоторого этапа решения задачи; каждое состояние соответствует одной подзадаче и ее локально оптимальному решению. Например, в задаче о лестнице состояние определяется текущим номером ступени $i$ . + +На основе сказанного можно подвести несколько часто используемых терминов динамического программирования. + +- Массив `dp` называют таблицей dp, а $dp[i]$ обозначает решение подзадачи, соответствующей состоянию $i$ . +- Состояния, соответствующие наименьшим подзадачам (первая и вторая ступени), называют начальными состояниями. +- Рекуррентную формулу $dp[i] = dp[i-1] + dp[i-2]$ называют уравнением перехода состояния. + +## Оптимизация пространства + +Внимательный читатель мог заметить, что **поскольку $dp[i]$ зависит только от $dp[i-1]$ и $dp[i-2]$ , нам не нужен весь массив `dp` для хранения ответов всех подзадач** ; достаточно двух переменных, которые будут "перекатываться" вперед. Код имеет вид: + +```src +[file]{climbing_stairs_dp}-[class]{}-[func]{climbing_stairs_dp_comp} +``` + +Из кода видно, что после отказа от массива `dp` пространственная сложность уменьшается с $O(n)$ до $O(1)$ . + +Во многих задачах динамического программирования текущее состояние зависит лишь от ограниченного числа предыдущих состояний. Тогда можно сохранять только действительно нужные состояния и за счет "уменьшения размерности" экономить память. **Этот прием оптимизации памяти называют "скользящими переменными" или "скользящим массивом"**. diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dfs.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dfs.png new file mode 100644 index 0000000000000000000000000000000000000000..601afcd7d1d7e5c11cac29828caaccd790d92f06 GIT binary patch literal 27551 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dfs_mem.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dfs_mem.png new file mode 100644 index 0000000000000000000000000000000000000000..32a7f21d7e16790c1b5d608da653c2a68ced26f1 GIT binary patch literal 27298 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 F{{kxBOdJ3J literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step1.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..3e83181e44740e3ab47d1dd21678a78de2b3daad GIT binary patch literal 15216 zcmd6NbyQSe7~q>>Xrxn+4rv4gq(MTuyGD?bR61u+1O*Y4Zcw_rVOWScOMS`fO{&>6m$Uq6Ws)l;9#I%7vFea zpkKJ|&rCc3fUxWD4;0T$NQ>?SdFU$317$;Wo9I6fdpQj`0H}<{zj^)_Ute2YUlD~u z$>we!92{I;UP?$veE9GoGb8JZ-N3-m;P084j&{WI>bk3|>%4%XMY4vnl2UGczOkvf zbX;U&Y~1nb>D^p>{^S{|Ps_dK;I3Sn5C>PU{k@7_2qkE_}D^VwIQv=r)`+ZWKeA7Ny7rPNPpgZkmi~FE-JS_S~bCtyBfMn{Kw~{RK zmDj$}F0U#y84GdT`~VX|?|(D9pRZ=Pw@^a)sB7M}`QCOltghJtB{vI2F40*v1frIj z8Z67NfinIrj3nuufP0d2ccS-TiYAoJ*Z4```URr&X2!iUCp0a0AW-I&+1{R{rIGsE zg|*j!=$L~86@lcJ<&%zheT0M{MLrPL4}6lz_#nJ!T?+MO3Kshz^AIBmw}*;x#3d+DbFN-f8jo@*L^4066X1F7wJ!_FMP zygY|dw*HX45r-d6=9b}RZA0PjZd0qL7ERshw1E&9AN+d0dsY6G$#$`8L%$lg$lvUlSKM^YOd3IT^&d6$VgZ-ld52ByBq4pNh9x zJs@3fY759EPic@Lf_f}=UMZ#j3zHxX^NP=h-%fj<1kUcden0-cd#H1)@@E_5aQqoNYW$tBQ)%z_0?_~4Bs)zX^$l&Lkf^cUyXNJhDG>i7 z9WFzUC?P{q@IUuDZL}@N!e|$Ut8pMc_5#gmiQij17bRgVb0bB9VW$+R(2aF)=Qr#M zDgVLCRsQ$xRWluIvumVA3IC1XK}Drl4Q9Gue1&lbR~x~)mhhibyyiQ1YQs%!yAWO7RjIv&G5u!Jg9k^1%S0uWzqe0a4=4ERvBtCx`uD7 zsRh-}x7~jJLx@!yU@ERFYd-ApzUrR{3=Fd&S?T=~XFvfHd^MOmtLI<*QttcA76-%S zIcm|^SMehtZ>V7q)jB)y{I}r}&y&+c5KrXtRd$KPtQ*)+e?OWrBWQQciV!)aT zU|^717+^yaQ7v!&Y{(I~)^aH0m(9#Nn$_aWOTGQJ75ob#cC$sPuMRMkJ0jI=aX46( zn)i5&@xcw3((u#gr`|)y<;g(#12BJd9~j5arH7_CdWbqtEZWL;R=v|mwDrLrrygNA zaJHW}%+owR@RYULwZVjZ{-E;kuF9oVL?RYSdt{3A;BEQEtU_xCF9z@S2gk$U7Tet2}CJSF3qoVGe z++A83D|h@ccT#sR9Ch;ue4zo_u0NbuTQCKMW4O&^4~=uxIV1+F(M9t`WG z(P7Yqw+Rru**(~2@}GUBR2=>>Oyh9%DOddpwYbKcQvpZHmB!EbWYEQC7l{GC!Rxn4 zSIrL=aZ`7h!iY!^iC1Gu?)ki;YNF zp2~6f7!Is+>sS{JCZ+kA`Qsq_pUe1@BI25>sO>w1lPOlc=P1G}rHs-rGurmD-#!XG zvUNRv2WS$NW(tcc2O#~6EKCMz_80xqfM97zTiKnc()wv_D+m1fw6y)rD+=2{3$NdX zk)2rWTl8M7*)X?aRho=0?YLdzh^FYivsEd_ryf0j)Rkv-5n;ek{>M}zkb1Ubuask> z3fXiEgG=w=;aUptDPVC;%+S_oz$cghc{9?}E4?4mJLo5rk-!;wD16R>DPTe3!KsJ3 zzTsbd44ON8j8k505W6WSV!)-|W?5=jo^5K2uP#-R_{6xJ8x(jyh-b_DVRv41kC8

      AYqi{kK&t(7MnOf!!1rWD!H#(Z}0`tNJi@-6pZ zjV!a?J0$dK@O~9&>jM28qpZ#~SX}Guoz&aglu)qq%{N+M2i-<4qWkK`)utZ+tuCbG zYVMyo!CFB1E07-#8{;{M0MfnFP;=I8lI$_kcAmp|1S1R{>Ow25&wiERXwPA#4zGut zI`ds*fz9=iQ-ZRz1NJ%U<5J@2|Jtz`x8fc>~SlMr;fbCTxXr`0~Dmv$F`o*Hj{jLccBwqMLC+ye4B>1XHVnD>l za;1k(4~~yjVtq6jmG8Ju3ME-++SKJacg`crdT;-fgADoSyC=Bh#Vj-87%9X`@%p>5 zaFI-tKfV-VfLR}?EFZ?jwdEj05DJ( zcimZB8c(_qL;1|kp}FeGq-;DP`9l_?j+2IyeQT|1zhB@SC?v%ccK;ddDZc62R@B%A zTq?{HP#SQPft#NV;sQh9>j}6Hoc1-Dl$qJIrrxL?7WEW+iX^&!CGvOK>9Y zFLA40Mef#&DBc-^o9|JGze)_G_*Hx*xc@zh`9AaQDevf7tYInt^ZrZLAMQwb915kq z*Xk2q{u#Itj;*!rTPnKr9O~{=LOMq%tuh)zVit2crsV-u2Hvw=l;;xtHa$iQA6+> zmx&L~f%%+w5?9_kR+CNIH?HTauTT`LQub7k0{i^z?s&MzJ6l(p2&c_?c3aflm8g*3 zWvrjs?o?0LFC3Tw&FtGH=f#dWnSw`f*u&gRvL~UyaW2+$5NVQQ_4wEfD?*!avX=t- z*)#dfxPFE;q{;3_R(#QmTwyyg(e%q>1O6}{+t2*1xKVx5c%F}}%@cMycUK zDax0=dWO%dFr+HEA6(y?ec_UV=^8i_G-85`%$!p>r-^fX5V<8XfmGrm2aXeal8$%p z3V2_$iDzDTNk-kN3>eOxingPd5lx<^XO$Pc5VPRL*B35yDY#&DGW~0|(_L-ddNzLj zh5`Ip`OT{N>dVbi>ej_lOvADI7xg3^Q@@#9AUqmWR$_K$!*1j@hh_-%(|zCYm@I-=NQ>?0VmE>*%YJBtTuM7;5|NY zXz#G=?3&``2O?7#mzxe(hCD2#btP5>nKuvp$-Y??a{~UDlTznJRL?gW+`udg-$yu< z9!EnO>XZk(K~4MEVg_aNm3|C}W9>j51ko2+?@%l_6%`UYAeUJd@bv&y5OHZuJ20a`JI^Sx;whV8vk*zHJ$Gr^Teg`3*Xq50K&=rJRRZ~xb; z4sR#X^wH|k`St$Ub-eQOK0iyi|NVs8V(g8sBoMtWTs~f0?IB|KP&Yc-_uvbTO;sb% zy=&wn(o&t7zPJ|v5tFF8A6$J=G+2{9ugRbVe@9m!DkYH$X<)J3IwT>o{Lh#*_Lx~0j^m}x67Fu@t$EsSp2J0j>FW?>izxX zcK1zZ{poAQ&xh6yXM>p3WtPOzwMv1y@VD9OBeP~VO9Tl)Ng$R`!F}7J>e@*9V0$-iQ9&7HUg!0X1 z2M_1Q(Pm`c1J6`i-CdCa>(Ootnn9wXJML8`3}T4zAK zQJfm2S;z9su5^{OK`5_fo}Cu^hzBej<*bY6?$I*7!a^^}-5qn=$Th`pNwbAKADZgk zC%T;7;;CpWj+03THFf{Au1OHc>+c#cEskY8ug87APMlR_%a-B^o}>R)jGv6sM&~ny zTdi~W6(~+n7^|E4inBG@!3x2_g7b>SLQ_65ly?cq+wQ~s^j=Fa)M0VC=EBrfSxD~~#0!<}&{ljg1|7mU15O8q^4oz9uk=@^~zY@D! zdG!EUH7CuF*zxWuPZ{2bsBbn1iN?=PT=jMaS(d~ZEd20S>#kijM@s#x>HxUrxzvfR zE5acudI(~&xBp>dbTeUg7&F7gnOLxyvC9jTpv8kw`~71{s($mf&QUb!KTZ2uA=pvliFI5DTs^V;(Q zV$VsInPiia^Gjzj2%ais7{g6W`uNb>Ii@(3)wkQe2i%9mj1Y0Nd!tX_z`MBG^#CHh z65NArtGt|Je_yUKT=)0m=TDV>=aWI#ndrfxIyi5AQdn@b``0)Kj~CBv;r}GGEm)_? zY6+S+DzkR{6hvfc25^JqRb}F=FB4jHYqV;}JOSox;2PTIRQ07oD{qwQV>qtn029Q) z_KqdPf(-hld`z8FmaGYehUz{|d9Aq`zx*5oxtOi>9UJ#Lo#$9B<9qu^nJmj4+|s1+ zlJqfXg+*PY?@ITu0s!Ca%0Yg*Ne`s}{L19eOkLb>%Y!mqPvP!0qz!$FdH2y7qdQMX zczs0!I~kOJV4}RVk(3D3@f|`vqI)-_x^d(VCVzCPW=uZBp7t82rpV-z_#sh z9EA{S-luMZPO3~flv|NqonV}UM3457s=}Pxcy{EfJ9y{qB`M$A%`v>S+d@t{Xt1vN=F4bsk*y*Yb46S{j23w`_uSd}Lrv-Iu1pE?GdYJcxGj)3?e}%#EzqlPx^{^aYew9+IpH!PEGl1fz}ymS@4f53k&XTxvU5c)hT+ z#o(w*vL4;nW{fLS{RIC&(B4}WUsMxoIdeNjap;~r3E@QESBjBrM@ z(Lnx3Ad6XjeuO|yw%0NS8cw&i`~fKgCI}J(-y#ezGx!jVrt%ExATeL}4yE?F;thmY z7SCn&5_ZE=VS|MO^#KtCLOMMKCRk$tuyG<+QKB7)?+^=eo7>on8m^#tui1sRa z$^-`{4J9G&l4Q>S(2hODjW8~cr%rA%gj5#T9@{-;tKn;(;ANehGw!)a zI=|8}*0(*H`e2AUd0XS!NR!1^JnfeB0Y9tgNdCY`D9*B!hNz*nS8(N2arA9L^x4H7 zw&SYa9iRO^Yy9lbuzbPDrdBa7crrfMFM8jP*yg7_^v4THp8T=dPJyDI+=7k0uY4Lq z@1pLJU#f=wOkzK0;7Ha7XxCE)#5qov{+MMEd6{taV5~7yZ(A`meF&K4V;1c>n_82) zWn7#wov{5iZx359e6t?=Ls>=IR$#5gS^?O0Jerc=u9YR?Jdi7(Axbhb(Q_6b%g2Z6 zZSGJadKnVT&V6>#u??yC6<+(ObNqYKVOoU#f#3cL4BDri(Fku!d zapcFlM~~Lin8DM{>}hGlvsj0`IAqN2f^^hGz9TfLX9|5YAj!drW}^dUk0SGP>r_T2 zcrETVBHfsHOZNkooz}|pYCNZ=8s!Ra^p+ABg2g9;Me-7x2zsz9UJr47r^(7Bey8#a z;fuJ9wug&&i3dL`!@J=k|b-}5fT9n^o@L9a(G*Rn5`xUE;|jKgM(9vCu&NcD&C zaK0UkNXzWPcf;Oj7%17v=8YYTZ#TyKH22~+m-xUT_-+B*82B6jK|y2nOp=3OEpBN^ zv}um)b3dOncR^bY?!9x~n8@i;ceE9>zaY5@WEv=%y@&pjNG`AgFKM1v1wc8u!}UV& z{CIS&7W_$@EO-Ye~cpk`-`4Q48_S z#K&Qmf6Vq7+H4&~v9`WR4Z#Kn6#~ONiLwHmp={@O1^~O_P(Z&Tda#qK*{{S>$hxjIK_^cif$unDf-jv8zAw(p>OsclD`Q(J=qhF^Y zq#}bI)>^HLe-Z;`2u(SJI|Zdw5{@xA5@r{Ao)IIglf(UfV+NmI>Q1M;zG7LEVPu9k z3av=?JV}0>hDY}GmB|lZL^C0~2NBeb@(K~$LO9Z*mNn8HVhtKFm+>0uqf5%fe+Qe; zmHVqv*-T2!RPH>6gSw4NW`Db#!K~p*I%D}PW0eH6vW*Sa2OQ}BP52krt~$9u{EpBc zJm<6a+-TjUkemvuo-2eLLD-!coOPnAnkg-u_8c5%+37-Es z1vK2J6kSjg#GJ=5-TSJ#9c%M&DgCP?vYL3^jS8$@Ke>4^JYgNf6(k zpmH3xbAlfqw^rubNkT0-Le-!h-L#HVxY0gulG-X?N#MdP5dHi3&@HWNs?n)%?uf2E z%%OCl=Nt+u~v9=2{P&m*_^%~;3Pf*rz#yqH3!uq=yW_pOrdyclG5h=bZV zkMMO2zTaTN)2dq8wcmZnY+Boo<<3IE0@!V)1zcQnd4NB|)d`{{z3WWB$n=6_Nj2_~xtkLDBak zf(+gx9xBQ5)JbAe;Q!J?tF!JGw*T3Pf?pL{dhe z4?%F5}kmNwwP^x|2Q zy_3|V3#QKn>zm9R-wqag?`yvz1BQl#?0!S1ZYAZW>b6ggRxqS#4#(jU z)?!-aoaD_dvE)aTQAD|}To$>Q?cO=DVD89E&MO^F%wjMj_7zoV%sqm1F^F&l)S?F5 z@GAIK&&+GNOzw0*VYh`ERBCXd9R`Vqh)P`xR;yMCMzmnjINDQ6XLFQL_Nd@Vsm(?5 ztW&Gmvpz2}HMq^!1!h^aXe>AaySqm7WJpEf;mPgKMK|mqk+xr3zHO?XWW6q{5wB{Q$H!$cXT}V2@+@-Qx3`?l)&CWn$}S zlfUpa*qQP$yrbM|f9xbT1z-D5A2($B-g4xWO%QaQ8XQ_q1vQ+xDLHd1lGYJg{n~w9 zKS!J{81HRw{}xbNF$;7Vcz8cO#eldtF$z$0bY|s1bWHQPGe{RZU(8wPhY`=D`_{r9 z=ea8fI;PHiROHqWPful^9c4G7GIfE7$&A2q1V%rWAOC#O(;z6^;|#lTY1Ft6armf{ zTi&|~rb}`4$sr1?k)XDM%TxxPF2HdP&T%RdLuyz&ZQTmHM9i*F$6wEzoi!X~KE8vH zKngl`6d&hGH$DzCfi&*mXd4M;VX+i0Js|tJWNp`D_1NonRaT1M^ikfoceo7WsiS#I zfBbn7mmn*!P}>l9EVazA?gf6?_4sS9Dw_70p&i!lXY@L7i`P8$66~@r_6p4o;F|ek zX=|!MBR8V=04y5dPAzypUb}T?JTDyN#J8TGzx?HzM6x)}iRESa(`~w??i~9Ezg1I8 z+}0N!)?-dvRZf0*JZTO$NO(Wap(PT~@7!VA{zL8jRU#$(r0R!j?RjGv!?%E9X6-2` zt{m~T=C;pq%syRLL=D78I2~QU!(c@fzuCX4@p3YKwu@_6A0K3>v=@c5rSl0zEf@3* zzWZxv7lRC}LaPSvym<3|wYVNz0p6|z*U(PfoVBqD{H7nvpzti;WulrqDyj)WG0F zyLlx!av5>(dC5yBxed#Rqj^vZHL+ci1ewmy;**=tfq%VU_zkzBT)l;0*f*cnXxOZfslG3YLXVC3S?dK8AL9)X^Y_i=}bn9oL^X5On#UuBeSe^WkJ)`9Oo zgCo#fbQevJ!H+4Xo@d$8xW(!Da-Otg6Mx3av@vte?%_ZMwKl<4TD-`HpLe4zY5m2I zgQk*?_?f%LgKH($DVQSC&HbzXZ`RWuA?hmc87cPzUSsRQ>F-60NAVt1jXx_k{6`vk z5SJ+CmvGUd(PiEA)!#!j5@65d9?Ohqf&SAMu_$)jHXsw*bpyCp$tFb`vz4) zgT3}xS?9W*{!-T)wIlv?{gMsA@POEZnV_UoMpq8vp2AS7S)+aY_dvTT-1;VUO1A9AJ^sPv zPsuAKEC&&AP0(*ej$HxF&N0gaz90&~4$ejLYa=1k&m z_eix-^Z@nXnpp7hJEpg3Kd-@a3>b5G?u~suOo+MCSDK@aq%Y_&ggsIl-I?sFHo^Ra zC72CG>ahLM)>ir;5_Jz}0_`{!t}tMQKa_q=-mA+bp6_MH+1+1eec{2$-rLG$D z7_2b28DKStRZt>}1m*XJokC5J&La3ct^?p+dJH;B+4^5~9Um&H4oHi&<}q`(jNANS zvXG1JlU>2V*q$AhGUC!)P6Kq^m^GbU|V?+DEk~J#P*d?))O! zK9!9+6P>8weIeOwvIqH1l9djAm|%y$5dfZ>$E{+KO|)zTm-PZJ5TPBCWbZdgjvPOD z%w6rCx_O{|k2AZRVLYd+*lv#|acnw2;uVQojaPqX>4!7lWb6b(hT`LYLSP2=s|@b9 z(Rhi)7v-eqb6i3&amTM|IuZR+Aig@Kh6hcX{=L&fmQbqtt3+U)FQ(#=?-N{RT_ckC zfze;17A?OMM9Mo>izavuZV*cF;-9R#d;C`3dYg_?col&YmeACy-&c{o5>tT)7FxMa zSUYp`l**aLzLyv1Z$4X%Fz0Vik+Nc2lx(5?ZldJ zJ>S$EZ|}{_D=c^%HUp0j~ilq5OPY0-r^sLqP? zKPNQWy_5ax*dM76bN-fTAA>(8wt8BT37B?O|4n#2bP7MEwGspvOUt0MC=Sf=!ewl7 zBpX=r&di_a6sw&XnuE@*ct+naXv2k)ZE3{ivCC5TpWofUA2DZ82`IvW{Cv0`x5Sy# zPq+Fx*IS(MVWNu{T|yX?Cveb^7N}21`U|thV;>OmCM*neSqI$A=Os|G(lW#+IK4vw zmg95!c$s0#nXGUlwh&Chn}^rgGQj`S2Oj?HixP0dl@c0uulGjTDP$1`FBId7tHc)Y zCT*`XDpM_;Kj-^Tvl$v3qtk+z+r~{^{gLq9DZ&0xUMmkjSOSk5^+v5_(sJ6~5;8oP za?P+Ls_VV-H+!wS;8JSDc|H8nt3c(Pqkr3MzwhgKJP%P?zW0?%TvYDvTG(Jc ze7l^4u?v03g)!k(Z}6jthyK|UYc}cll1~|?O@?>FVQWq%i(E%C5aWi(6ZzkB1VItN zx$7T{^A|c>D1L-?L@)o&UI^zHY&~5!ulFulFMfddFFh2QLs3yxa>k6r1w(-S*A;O* z1)aW6B#~^+zfq{tPECrK+_CxOoW<4@zw~K1H&hc3FO9zu_8NGn#R1_rVh4}hmu z6W)l=yG-j_qJUV?Qq!oUb<+Mqk6+CiC!l2Y5}DLW43E8f`RK|XxH!eXUZ#JWr$hAX z1PsWxuYz2EE9>&=K$5$4O7^)QzaiSKXHVDN`fMhXd!H?@_fPCo=g-n^Zw?n^I>?s*2XVDrFACuxU7_iempw_g?|DlGCg{^x^krN%5e z@@)o}?h#SA=h{ftGtaLH_Mc*md-WGWD!lQPy6{uopR~?y6_<)^xDuI;@+3H$SHG+h zN;Hp1QV!yD>1-&w|1yZuNiFdcJ3R=_S2-{LsHS&YDktfu!5oKbZPDaOnW-X|zyz)a zRRsDHTr~wgg^{FeLWqcy`l>qN>5I}5!>%3&H?TF9OXK*DY|9t1#dB1@;--Cx2tuTU zK(ZS~Qi#WdA+=GRQMq0BCjH%wp0uo!#pXQTqgv>p>NsUtyvO%^jmN7KGACSc$f4?Y zm!vVIr=E@>{5@4WAedvOQb!0pk@^YM_Z_M4ovmv9nlP65_<|04fKi;ysl}eg$=>8) z=GU4kLP@qY@aMHc4Xa`PH^)i0wD$`XF_HL6`7%{6yk5LW8}WrEs_zOND$ z-w_&s3UcDqFc73u^bqQ6U-rk1<`F4V3Lz`)6WSsW!U3EGEv&4069%8UMsYngXg7&; z%-mDVE7R$ZCf3W&6r~6}M2hQqck;U|Wo!<^?!KV~j2s%@YC)i9+lYJemxlHLl%gXX zA!*dce*~Q_#6;?vX@TG)+>)|eS9FIW9_PEdpd`Ypc5&1!yNe@fvl-oo(l&e6DSn^4 zTJ^!zqlAq&c%zPbPnKd-#lE;S$O{9)0l!9j-_&mdJc-t8r}T_MaUg-Kmtnw&0>>v$ zxA@Or%1Kdcrth)w{hwh{0+XJ}Mme}$ZBx+`pcq@^;EW&q9?&Z)C-Bw)2b*#Du`!JU zEkIv;3dnA-(L?DARF+4&RI0lY=H9Aj{rS9Sol%qBx4^HDyJ<7>WO3kU{_yID@k{xf z#~ALs^Oarvd!U20q8QsIJX!C;mzMh=!Ka*n!E5nEFoLC3Pb25KS>jd58~lE!T3nef zya77qO=mh&Lc@DlwAV}mgNW2qdcbWCQX(%l?OUeSo;4!fG=c|&2KQl*_fW5{5OZA! zEX|54Js~ywsqwRkQEO&|)mFRr{(2`%@JH@P@wDxKf`I_ zac2=%=htoekIT=2l7jS={?z{gfad|kjvXS~wtHs&L)A#Sd} z9uA`#CP|%YDeG3`!q~5hG2!)E=EJBMdbY~vLj_kNuT-QPO3Hwh_AT)W{UZxGoW_q1 z{zB(tb{+qvhtt)e7+``)h`zz{{L`zcz`-<)9eSR(g)}L4twPw-^N?`@Qzimujk537 z{gm*gx(pDIJ*613;`wQxR%J>`HdR(3mJmd3hfpJ&!d6#D+J}B2pYMBKvsh9|2)d}i z_GQEQy5sKFfde0Ckt0vKKjROd9iz{B0K^zD7T>RZt%Dc?kfy_=cav!BXlDYF{aUeq5VVqEW;8vl=$mu+hQRpC5A;x%tmJV+1=WfY zJ!5~xi4KxZ%Q67?K-z$IgpK zi9gg3&NOCZUcillb{~9fGSLARfG|gNS1<%+Np}5ht@u> z;SZ)i9h?WlZBi;~%Opw>X_ zCh47_&)-s+;7GZMl$~g$0?ttn6LKannLVWNGlxIh(kM&|KIf;J$(_(V6CeP5Z8)CE z*o>dkr?@}Ie_GIYs5{>Biag1+u3#$Ind2E>!w%$0o~tgeNjI0fz-2;emb|g4AV~ZZ zIFX>lWXwBSZDBdPnBs8!fc>EkQkN;pzW4PjV2hS}5*7jFn&3}4nLpAAqG82B~ z5(GVV-6)a6PZ4(8Z>i|pWAlvUC93|wPwt&!D%UTh_9TIxy^5u?bL z)aN&DG-wkLGA8u=efD=q-#K_2jIdq59zU`)m*aXqrALH#K~ap5DzmH$BKKu;h@DO=1>%~G}{fH-uZ#s}!+Us3aF6S2h) zc1n*=G<%;I6SKL=BrVupeo%Hj3?J!RI#zL&sSTxm*)Ygv_7P0$SB=~@>N6}1(6UK5 zQcDn}xxzCN4$u>wN?kYXS9#njzp*+p3>--18Y-^fERGm4cwC$q1h0I*Ko@pzBLVaI z1Ea0gqmdOUx0j7A%Txa7(<5Sks@sr7%%QRC>vNcof);?xBnzgZz8VA41}e>(@s63+ zwt^NPH=GC#qKO*}ZZM*0f#AfUoU%BOP)78Tc*95H{?unq17LY#c}D&?V%0%6W?o@) zS)4Z*7lMvb?Xfi%7T^x-(7PfO_MKFx%%k?i(C?CrkngwG91jqFhRgLbf-SNe`+hLw zqKD}kj1W!?k#oaC_{n{fC58a<#1J$)h#bHOkwdeV`=56aVQ4$PqLWX}{FC~N6bNP9 z7zFuhuFCzIjYF<_28Rd7dfL7Oh~H%SU^Dt@x4FCBR$tBauV>N+{p6KCr~enB0OPW5 z_W-t1acTy{Dc>y-{Y4PP&dQ(nX4ldVWPmpj6oAm`EzrT0^U`1Of4ZDoj_$=R-yqIl z$5QDaSSp-~F7X}81!!!+5r39f zse7MP-?jxin=>TchjSRKUv$x-$1?E|9vP!th`~R#A%3Xxq|xJhKQ1fCSU;tfC*l&J zziTu)u`ih_a2y(biqi@G76;?GOE&843jdS%(ES;#`o|^Y@8kvmA|v8%ETueezn6E& z5uext)B7>Bbdv3tZ<){wGw2ih*aLSPxwGY_oAP1}hE-6;vBuQi&Drr0dZAn~a?U>( znW>->-Pru{L+cpW7bFHkvtWw4KH)ayN`IbKGWXQjC`;F0uSFYPd!CCM<6=?s87(qBUM9he;r+rV0Qh2(BiJo9(2}fmd2Qw%8MuUub+n!0t=-2o;4}msf zdlKqjH2gjjd()e4HAS6eds7%6jm=2G=+0*8n;btHeLs11sph?Ay@Kpj(DjEF90X;1 z7rl5#DTgr;g0#M1kyLJ$p&`FwPC24~@MWbgtg`JHCJu7(gYQNmgXJHS0W+Hr)bz{` zKKB>;aegVb^ESXs1)EUQ&wn0g|6E|+12ycDr2ID0SkI!{7s2b|$NGo$%ljz8C&4%4 z)~)=Xj%7#Ybd{aS(L5JoI#*Dn;({$z>*!~T6Px8o+dJ|49}0~ew>d-mUxxqmEKg&7 zyXLtx16};a8~I4Y=)T|?IP<=KBHwA{&*p;vVn3Z0#qO)?t>3GDEGK4p*V}zuhp)y&lb=^t6SQgdXkIaqV1pI;D(`4|Jkj26jrqiM`c-5H01xV c)N%2#{Yv_BG~~LP_%Ei4qNYNbJoL?f0J#l{;s5{u literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step2.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..d8b7614a2e944d7479755a67ce333613e351cfe7 GIT binary patch literal 16445 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 O?zz13<1$&3H~$ZPhhvQZ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step3.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..2fe7a2d42614555d30e40aee7495d90459cdc85e GIT binary patch literal 16784 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step4.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..42db7910b45a2818c3c72cefcb0a40870feccfcf GIT binary patch literal 16630 zcmdV?WmH^G_%(>0(=_f5!Gi`*aBq?jf=h7s;O^QGAxI#>f=kfg?$R*`!Gn7ff?MMb zxB30wcg@`U;jWoav!>T-y1P!*Q@d9ihC{1-mLcDu;000mwJ%6eV0GQ~nkYOAQ z^v78~pAGs0*ZsMn7XT3bxO;=iJVbQpM9@oH@i9<2NWX#p0eva2CJz8L@%UGkcjfIg zRdp0@Z*Ng3R77hytZ?i6{9H;(Dk>@}J1Zx_u76-~P(M}E)z$So;@jlR)I9&w`Q^Xs zn`?@SigguL21X`@ePy>_pSzYiCnqK!9v@04M&HaOCG;N>;NUp5qGa6@mpwdomr&^q zp0aDn!~nnyC_RZtV`RP+64 z>qLFrvWIx5p@D|_|ANO8h!V z>N6aHQ4wZ+Dyk76YFdwn#rTzDFl_o}hj$Q8cS?Z5!AIu#GgabZdJh3zroMl=zQEHi zv6`1XUC4QLdq9-U%OC=XFw^ zG>KX59fonrDmC5w$Z7UqvlXbETS8<_9Y0CG7&Ri)--D7gPqy&=JayUrc38JH)L<03 z=IO?55$Xc$L}I1%l6NcwJ5RKj1~m~mwK-ulAC6#9o$OUR1t@_Tdl*x5fhA6msWTL) z^5cC_z(Pj{U*N~^i%VdliE%R>n8C*29qHIJp6=ues9CwW1Wvpl2HC_G58$u_5M{r( zkVc(z@ew$=ly^IRb8SC$dG;0K_vqD!x%Segkn76DiSfBtm7T=M&50+bKVL$m|F(*B z4kNy~y&X_5D)*>Q56}dmH^hc#RI~e^Y%zH?AZHUp*I0E|+Q1)FKnrueG*Q_&{wfkHhI zv8+$Px4n@GpZOvQorcoIrk>;D()5sm)fn9BG(RJ1oed(9wOoV-ZH^`19}0Jx__)qR z-wsnj%<-2Th``<5)(h>jP4CEbFHL0e1@+&_lLwt9Tg0G=3-#078!Jer58_6ggpWW<6vj9F&b41wb_@F`M5bXrWMkJ1YJd8mm^gbvn!Y;S*q|d z%t&Q@N)S3&Av}8>JJGcBw+Ad|z`A|*d zODu%tfs`s-Lj@zXFb2WDvfFCfDihRZ3~4^Z#qwiBTnK`)d?6(6pZFna5i)()y6CIp zd|*8($!-wtl|*EW&c=Ps!gA#-*P(3STU9zhj#aJRMAxj|(jjgM@P#imsl!#6Ft$f` zuy$X#3aB?j2W9XHI1qJ%9nXU$4u5E?!}WExHrG;wFqp3f0sbt2Tox;}a1QG*$@C1X z@#gJX>0v9c{-@h5Cpl`GT^ab!h|{1znEY$g>*=cp_LJM`t4GvKLjS*ngACK!FFPlQ zbh|k1cRTs}g1%Er_R|C6Q|(rj@UUXIQU-c5d?yNr;9NQ3s;2OPP)1)I3K)_})gs*+ zml;+4Bo}}XXTZ?ujpz|*8 zw<2rHw_0O9N@mK39CT(VfX-o}aFs|H__}^sPwVK#sTFN);^R!E!5)A}*P${r@`-&6 zehcs7;*z^whPg2KHf%m38kd>vCNOq+!r<+}_vdG>US#E6bcjv&BiEcY9daZC6xGUt zx=Q7Rf6!xkS#DWD`(4=Nm({-+-+P^+8Q0o=%^XZ#G!XGQi+0;i+KhmA|Ln;5?dCbI z4BJDS9T*pWiGBCix5;qRcpz6Ez7=A0Sh*3$i3ko1yIjnvT`i$G_a?hsT)e%IfucMi zv!5o{)+RTWnc=8YotlTXHL@l+y)>K+pSRqfH0;Yaa`!tZ znDi5w*Jikn2AbGti1E*;XzdnJq9kAQ-ZY?0RHZW{>2CzP8n?dZXxtWkXxTWejDMNB zr~(L3R0qDV5Cca8W#P zaXo=%zBKM}#;pFpK&F8-K<{Uymw5TwB`SO7I!NF!2p8Fe+i#v@z9qdk)V@#zJhoag zTztrLEPmOr&w>cdEI#1&X2Wtnd*ze(@|p$y-FvEgjZ0Pkirg0omb?S9g9z3$2ovOJ)2`jYEM*?wq4$JA@!So&>2Jwv^?*ny# zwhv!c#r4it-B;Fd-NPLB=Zbx<>&4xcM;`@HX)I?$#CP9GeEK419=2~vj>rpBI6t_W zW0UMHqQOtB)c^jwllKp15nfM_8eKUx7))>duk}N9=(}f`pEs-RO{>1IB4`lTtj?F5 z^52Yi9Dts19)9nbMtZji)qxGyRABkV!|Ns7jnde7)`^##h|@&AII6!}w^LGdyH9=i z2r$ILf5JGHtZ_|U+@x-AHL`>Aa)%@4U0$^hl?yd6&OcRT@~agaxwd^~==c4er2!;U z19E++&=eWaXA&}A<`r>0WHZ19x=v{b_!`M zFk9+&P#1{_-rGrSTf2$O!d^3jI|;!uQnK4DO-R|csGv0FSQ&9!2rC`@6WtHPQ1LQE zl`XtMC@1>|DIbPtTJ#3AB)H@)`L&P^|G3W#=RND6_&6x>^)zc2a!K2)!pxP|-aqhZ zk)Hw6yrvVQ=)FE5h+%0i!8G0dr1hW`$Ev{Y=>~R?MC8=^;1Il`yO7`oTnLLd_@Mjk zXuTM&pqHCzD@C7l#%oCb<~tquOX5Gc)ksrpkP$nBWrd&mD6#v>QCDNW66D9zEa1;} zDcJbjHUV@bUlU&ET{>X>!U7kvJGS3$FvU^};(Oppmm&JA79AqL>_AilUNZ8oy?(|_ zfkdUVX4P(f0;+y(F0i}NK>eAM`o@9}^e)SsmqdOm2vVwUS+TKT3<2bKfFW(QeOh94m9yYDu5jKA~om=i8=!>+mL z>YS;o0mCO;G+8@huXWwp-r<3aQLYBgi`vu|ke?qO9CYqWNm)EBB{*oENszt0V*qaf=a{N7wS%j{(!ZVQL z*K@emr#LY_R8j5ZOyZk5Erp*spFUR6jt!69?|~fW_wv7aua)*heGM^B(mPti4CQK@ zWl@#1+HOGv+l@x*Ldu7o>M1%3~Hhb|OwC>Ci?*nKlg)f9)5E@g9# z!)d0?cM^*MTpolfj@*}B`vfqw2o6D<`A99~Sj=*U8g+N5T?Ir72u(bb;`+=jRn(sI(TicJ_tiJzXMeyj4x|uQ<9i7-oaL+a9Y(xF}P)TwE`08ExaEwe;VDU$O#P6jC+T&Z zGVz@oM;?W+cneu*gL;`_MCtmk^vn|za@z30h}ogtR+YMgIAWt9Za2MEf4m)slebcd z2;H`?NrVo@I30kDj;-;bds*zscS;BpDfQv;yCYVRe}}Zr48D2^5+ysGPPG%muQkJX z5yT0wZ5%>iN@AK5a%EAagF^zKrf8A1APWpYEaSV&hm$Y^$faV$+m<*Q^hNjA1n#1^ zuK^IiCPlg^5s>n>{)wx{B7P&W}8 z_~4PoTbEOZ0n^UTAR9N!C&O~-F7iQMpUBaTJc|YrRTzDhFA6i1jlk|O-ks-gP7g-C z1YX8m{U=!dcv^4|GrVV9h~xc|o=ATrOH{IzHQ4>>wlFLs=S8V+u+(F4l^TqTbM_X$ zEVaE)JFotl6A|lFsyj5u4Z6Nll#%^`LELL#UIv|NDlYEbQHMgdXB#_g;Hu`GY@f9% z2Siz6X*4f6Kzz-v#Xsdp6B1l^73s}=7Dn-OKsTdqT1pl3c`cUx)7B*LnM;|gTeil_ z0T55HvN-_u!2Ga5l?U4VfbsZ@gm~L0VYcy6f{W`P-pgsunSycs)n^`dxB?CXe3j7D zEuNgUA6~48aoSv2qb+RVD^(*2Dx^K3Ankl_+;RE@t{{@2+ILU5_dMFRm=ZEa5g!=* z4%;_c@C_lKq@BRikiV2C1$<&A-d^)HfTF&Jk`d+NCy;xGXJyRi9&Kz$D%ff~kgCQO z!7l$2POC8xpKwUYAoG8K6Tt`$luQ#=ThX)M8N~uuRY>=YFpea$FIi$IyA!8Ix9_2S zOGWIfLEy#0Mo)t0puV)+|52K9S&~(#Le_G{M|)FP_=>LrRDPgHYq1zlcf8vVglra@ zXifI=v=}(aVr&;W3p81Nhq<~^7XWq7McVVok#GISmY+yh>mOxK{#L!!v3qN~>@Sjf;;zFruE%fx--_c2emGS=#Wst(l z(8dXmM}tlSul=(C0a~OXy!X>1#IMR}hp1_zSSRZ=9QRH<>EwUO0J<$am5Fih)Zui0 zwc?5Q5oR?!A&o~KwGh=xD3|O2VEUl(SodF>5Nx@G?IfG*RiCR6tT7cNTDG6&e*~NK zHvWj~{^Y;8FvasHMX2ArYVd7_5NwC-cFl=4H#ze(^P|2qHS}dM!lm9qluBWZ|E(yB z+ub^wy}RW;DYEE)wK{cYR!SmA>C-{OD?o#_kIxRSKbHkwq*sPqU)Km()(B&&f2Op< zm%`u;u?F|7gl&nnbuVh(bhq~(ZX)S^}beeMr1WP3Z{=C(9vNLfS#9SczpBWkR z07KDHGdmS$_%@vvPcVntB1|94eh6vH+R&i>t_k8?h3TK3qlMi;r#kI^oo##^YTQ8A z|35PT#f&q-GZ80x6H~ZI+J~cgGW)sa>}G((N~DX%x(u=3{U*JW(BsLN|IUdQkJ!`q zQB8GEq}_#Y9n7PAeO)hOq#iHY_;wn)cidL93IoU&gF!6S7MQ=P*<}HwF{wD$5q*f`!svFfjv`bS|logeRMP3z(8{#0E45WM>Hn^Xzl_2|0bY$4>8$`NHV=D z6S=)LpF+OJJdr0Vg2C@fLGGBEgc)rF4xnp5TSMDqhTZWch$d(H*o50Z)I9QN?lphr zS$TH>{zMz~C_2ghjm=##M4tbe0$W1jlKEvF-kq&3l>w(>IW@A|^}IVGcl)}qn3e|K z9$s9Yjy90oc@L?Rvc((6h0W+mH#awj^oeVYco5CeS6F*tL#V?-KOD3pK<;aWy*#(X zxbqL@NEb7>+kchikKURhUw*ptJrUtQL4wD4F;@%uNh%QDD7&d7NN~!*d78T85Fe@q2Z{y_Hm?}(~Cwn-e+_?rZsn;-_F8)Y^GHSu_t z+WJ0%RULQhu?i;uc4z9R%%de_awzu(RQzdR5jpeL0MlmzO;UUgv{lmHdcSlMD3|{s zdF1&s(D72_H6&PcH%KIgTt^7W_fb#!ZKeTVUJnNG1H@+=2OJ1*zf)Y7;+IrS zxOVZH>q4NEZAeIm3OrT^evH54serCNpX@c@lzsEV@_-#o2+rcD0Sd{HhbAJ+j9_2zCVnxS?D>i~Ne2J4C7ESPT|KdgoK~noKM|)ex-bUE&Y*qg^yFx%Bu>S88Jc{yzREZ)oqL= z9s&I93WC%pGPjxL(4Va|R(7AWD7vW3*bH`{8`)Dp--dnT)*r({g8w1px=jG#Mj9$3 z!}y#R7T?6O0j3AZ0AO6g^)^k&w;smY>3Dy>*B*A^w@0(R;l%9CQiJp_a6jP6bEp1? z^W9nFsjUQ4o28PXH2D;#8BT}PP3U%G57C_A;Z6yZ%f+pCCS?_^gzt>bUUJMZ7-z?a z8m0t6*zR!_Q{?uB&g*g)j0U*IV?)y%z6{`YKTTwA7wO@4F#fFK(0>P5k?pUvhVo#K zdHshtDnJQy>W$ox*I{xW9QlQDeB9zsql?!O~~ z^|$>5J&PC-<{WtA=C|*l>xG%VY4dYipdfdHzgpejMLg88Ou`nXR#4{QWif`|uGdfX zA)BX{V*?$GfC{opsf+j@EqKz7(ygM5XudBDY#|mis(w;@3zlCEjs75b!M-0UNm4}$ zAZGDUX_OIY3b1g1(Eo$c-v6zDgC%kXC) zQ8cefnbn0bfPORh5D^Y~8jRtPs0jk-4V(4gX{aK2VIK|xdu*^ZP`+4E3n?rFAdGQ` z2kumxMHae_NxSBQ_&$G%(alsKqexCLdKCPfX;xZMJh z9T&0neDy@l)^I{Xux@c+O;@)e097?Cr_eAWMttjS{Tt0q{m^b^1k)Kck@s_F1&=Ea z5SIi#-5jqg0`-@}2{pvk`vG|hfm$$1tRVxqQ%I1n>YaPDC;*vb1|cZ*DN07}N>%zJ7R04S z0%?km#Uw#lkjy^$f0Z08$rbJs_ar-f>nrW$cw(0W#DCN7VfLSd@7_E?gK$i3HA;69 zT}d}WZcn~9CqpJAh=;S_P4KE|j)zLLsoIeu+7sOF($~0^+V4(!RQ?iH0 z>f>)cW`vOsaobJH(g%RB?GnrTgo%t9I9z{KwnakIb7O^R03FeKd9pMiCzeTuY{9;n z2{}H(M`uY){PKOt-7Dor_z)pLYVj?m4k%Lr^)xtOg=4TTbh`w7&ZOpAlzX2pI-VGT zu1QBjgKabJbQttR=+ZCZZy)$Hcl5tlsgQ@Sel?dI3iBm!7krNH`|lC@5FHgti-HH| zdbfiYICo815&60)3fiGl2Q{G2?;MSp7_O%^tVIXpur>6|-dbcKLpzU9#b;kqFD`N! z55s12R|Oa7amXFm9$>B$O9?kw!#f3p49VGHl-G?T0-%|?Fb^eRmTzbyqjdGe!x}`r zlC7}IquJHjOS-XlWzaJR`;tLy^|nT#l3plHdSJj)4%o;?EjGmSuxDS|=sL)9|73q! zBRo9kd^^3j5h(ao`9VM@p-&wf$1H{(+eJucN8Ll$E2-dY7A=e40c2Rk55*v$<1MD; zBjoTLo*@tAPAGl#x^}dTnw|Bfcr2vj zwIAvjeDkBJn8~=c%p4eLS$tmL5D4%mS{%aW(M@2hmln%i#x8QH?TbeAnm*YGu@^c1)laf2j_! z$&q6&rT5q!#ij`v6v?@Yc zOp<|&97sU`#6U?Dmkc$W$S&{zlj}`BU~L6Tav~1DNXWhiOt<7AJkL-uBL})Ts6(#; zoK#e85xGVB;ST}yKGN)B?0^)=EoIFU83&a$CZ;kFFqB=QM+HNtNXF(5=3EeiN^l7= z@;+|}g&l6J70pCJz77fNT|}r#AYRN%4NfOzny2!N4dPvaOUcrDY-%+epeQSj;M$yQB7fA( ziit&tb3*RF7Pi1)U&7cI*wU7eIeI@gS~ zAa(wHLye1;YZh2%iq{=i&M>w+fjA!VpNa(U-zi8K{J-^oR}d{Sq3`~`E>)?*$KM{@ zF&Hw0%tG~Uv%sGkwEKrl#Q+wb!h!#b3YX(2^__z$ENPBrLz^&Q^$5044_P0wdU>aP z@jrUZ3IFWr>5+Ydc0Nv9@CM+NiQ%$065~#w;!FI{WtCIkj=6`{pyi72$fEORi$8k) zED#%K(_;kWqZT(uSXTAu+-m{ee_oX16~KE8hpHF-Pd6opwmD#Ogsjib+4@w;I2Lye zY@J2WCH65Y9~5WN{AxTuIa~Z-{EPfg6ELfSN#(s4FDxd-C{Ek00Oz$Qw23SlY>lUS zv@v;-AKfpA)0f9^tm>b369{s zHP^9mUKAg+!hP^fherTF1R*e9SV?Ux+*m3QG3R^tEI8yviIdQz7BTPQtHgaiglD8g0DG#_&u|34tdU zlgDun7P9Mdz2k^^Wv3S{@Z^VayZJ_4Vs}l!2dc6Ak~11gY-A2VHeR- zia?THtHi2ysGiyUheWg0NATy^r8}90c2WOgT+Ndr?35hp*5$P?AC_PL>ijs9fbmGN z*j0%W@!7>IM-WV>1)rq?Tl_X7?2U$#82AcyBfgFpp-qTlmkXR<+bb58LQGxGQ9eNI zGKk^IOYYFC^64}q5fBMq8)1iy@P)Hbun8cFvFZPLN2=K z%U?%i)>+Hw%P4e&oge0nTm6E`5VAd3hgydUod#Nb+#l+sgRUiZDi1=WcQt-^T}W9P zxec5eA!b<+A*1wvn@?$&r7EjbTul~?;qrZIVgoaxtde6{xWBr8IC_}aD+;^Fq3uLD z@8GR#y&hGB_bm8j+Dd#A{#tB_*n2a)2ErIfFXMrW_QT|5WmjyF%9p|7X*1D>kj3Gr z%9*&3g^Z-NZ@i7EeUgZz3|nu{0$YhvA*2iSoWj?7I-ne@Iq%pSJ+EzgGR(V(B=2l1HV%mpY}Yif=)k*ZkC5%?=2pvksiBg zFufn{vkD61VSPO05@@Q z-gFv|z3=7}p19b>s*AgSJfd^*Olo1lXcr4(G5e-`*D@jGfG@!fQokcnI(wh+>?U3n za@&8T|7E}HG{o__@$^C9Ed8!p(|1Q5hN

      G`EjQvTxNxj{Q;5I_Bl7dW`3a#;XC` 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

      xmX~RT% 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 OP*v7?giy43_P+qi=$Ie? literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step10.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step10.png new file mode 100644 index 0000000000000000000000000000000000000000..60069032f2d82d14d2b6a824f43a6a01ded61209 GIT binary patch literal 15299 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 CS~Cp* literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step12.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step12.png new file mode 100644 index 0000000000000000000000000000000000000000..97ac26b99cb629db2a79fc39cdeb697715031033 GIT binary patch literal 16251 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 bRKYc_-)mvjRJW%S|A;kJb?#RxBcA;qY-Q{m literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step13.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step13.png new file mode 100644 index 0000000000000000000000000000000000000000..175fa7ef046cd739fe1d00e3c2300a57878e87ca GIT binary patch literal 16440 zcmd73bx<5p_bAvSxH|;*1b3H#;2sE0kOU`qaBCtsApwG0LU4D7NeD>@9yB-vcXx)J zd|z$V`)8~6SGD`zbaP>t7o9*7Nxe|Lf|$#N5*c08D_olEP#E z>76-O_fL+r;8LMN4-qX?0iQ!!;#sYF&)wZM!+iaI#aCHfSJ}6=gKGWX(izPXMjRWSzVJm7kNA@?xurO>E2{ecJha%1Q7#md( ziy3|6{1!RWCB8tg=1T^Xl!w40xr7o6HO znUA@f?D$4XRmhAYDbC!3EE<~VpCE(fa>XH8T_rfy$3c57n3a1MO;5^xSI*4H#&ufP z1n$hzMhI2P%peV&uA69eWiHfO&kCIuUp?SjG26| zQ%}G+)om-w8-!wO)r46z{hrM@c-nXR1Jb?{;~KaJcVuP~Z~|uca^@N2p_usAAv+eb zVe66MkwRuzu%_ZR55Zf;US8wNy?1g_J4fSF@Cc&CbvUuxQL|4|_JKaP>fG0k)OR9DUiRA*es9*(`?<`I`zho95ND ztJ-y&?Cl#;M;K`gp=)ZtKppA~+ds>myYtsZRJ)VuJn+}slPmlQ-Q?9Y zGdbmiC4OXtu!ooj&A$5~PX8rhc)PuvTK@2cn{u-ZcpHyM?<7M$qAl;{H7yw;%JUKM zIQ`M(ndK*JO_v9rmH`uFVxm>KlZ9>O33F)xl>a)FAm1vHa}s?_BoW8Yz=>TxSVM~UNf?~a3GhYgRZ zWkcqMZ)V0;X)!wOf#)1uqi}z5QP8j%dp6R-GMLeA#LHJ5;Dx_-A+iq50QL)W;Qe2f znea?M7&eOrm1#oJR6^ z4PxrhH8k~0I%|42K?`~>pC`zNi${q*pd}%un{^Iy#WUq3gwyq6=vZ@RH=GY^w)|7z07Rj2VPy6xq@DI&j+ z!@!^Bfxz8-vB?pOZR`Rjjd0@TKg?)Pa!*4FY?2}t?IRKB>tf+h?AhlK4C2Z!UZx=< z4wWf=jyI~ReXBy3wGOUcPz>U)XKX{Udn&c2=Lxo#vAG^RzfbJEK1mGTP4iI% zu$kbf(48L@g+Yf`f7C8k(oPJkQEotLQ3YqWPDs|@eG24p1hVOeE#!4ItM&Ad$v}-g zW8sN}_Xl;c+4~X9qDhwIE(8zTBw_hfzUf+ z9Htw)zD~hy|Ir1LZ<%~FPUhc~k5=;P!ahH+`@_MtyH^>DS{nU4@vSo^=d^Vth)Et(-7RnR<0z}y`DO6@OHRq1M|!0>kjGG z`4i#k+P;maw})I`y+#v0c7NEk$C?;KpY_+WD`wo*EDUo$nlDK*maL!gY^*P$l21gDvc z29oD4hCZxgSC8}LB!6`OHUMVaYubYjOo17is`9IV^6dUnuTi^d+P}Z+_+HZW8544Q z9rduZN;h7{1BBT;VnrkZ@~7gvXAQc+-s^$T3l#B%!JMiI0l6n3MjPygiLwFhaLO=ihS-aXs5@S`37 zDDVrLC(rr&GD~qdNV@s@#&P^StnDu?oK%hJv|g{XAl<2mUD|EBe8<(jEwE90#XzS` z>tp3Mj$TwmX-2Z=A3IlB4F_z!@lG4Ria+XHmkSVx*h7P7?#_#ko!?n;8!4J7u12P? zAx21qKbLsj^olEke3JfqZ{H0MGd_JXw5`;u6fqf78+=@roQ z@<4-~BE{=rF%MUYvP(+u8loUeg)W@ZT3FqW7xCVsL~#=DiD$aN)A9llL(usFhwBxD ze!=iK>J`*B^-JK6KFnc@QSg_D%NlknJ93HbKtN7bLIE6Cpd4n9ymybaX<`{Ewl)XVb(HOT5JIj47aHrl6rKCb5rvR*zKVXFcUyYwf+wyL#gCiV z)|^98_iE82gH_QPlw@c~mFcJ8NhaTws0bnbKf@=Ew76HZKKBBDcpxzZTyswX6~q;zBs*k;$c3aO`NAHbl5}sRES;31S&4fs%Dx_$ksW0gy3 zF-($Y7CN!cA#%%axIUKA?5cCZpB>#tzUZT>rTznZ<?_=!Y3hdy#3*4QTJPr0y;t?$HGffV$s2+Y>Qe1C(Kj_(s8qVijskGl#2shASK&WD&C3dolk6n|QX< zwyWj_{QYu~A#7w{) z^j^eAKV9&d!#6Feyo+04Foj_h9(fL_PAP%M7Mx@FbK-o99tOY<$7>BLt_T7kMO|B#n2>9gif%ZXlC>suhvq*>aj{TlG?g{{sVJgz&|gHm1aeT384w{tn+fW9LAlfekH3=dm3gy8wEw4hH~i zV)Voo0RSMH(*OGoq_d9TzF5GMvD3_@@D+^6!PaP2H~sSSnn(b0VUuXABfBs5rdbOBqJl)$q-&B*{oaJ`t`$djSt)i*aGgm_{z^1gz?Y3=Shx@C7|L& zq|(Xwsj4}uf!@pM42;X+RydQ!A}k2A71(@$;gpIn;!A)Q$irwx+-vx|c@e)_iunC= z{}o3SuQF0xWOm`+IE4KvPgJ^ucIfrvz zM(hwKM202o4 zY4W*|gOOGG-@i8I_5lyhDGURp%>zqPY2)T7^3G=UFz9NYj?m<3%AB^dl1T+}V0#$- zM`zXgTuZWUCGssIhKE<8keIREUP(lS#3@H$z~;IKI+1FCF#Bh5ry8rPb|6FV#df?Z zcDlf>oWlP-um%O*!V4=|-0aNRBWvp%zl6kf64-c=mhiMxgK-;9YY6JvN7i zR~!YE3xNZOQ*g-+dyx@7Yte+nKTxuW-BS->sv&_4#{9=16S(5!6ui7|hRr{(P&h$q z50&5PI8%v6KRqnK*AwBMQGCS`r|q;nHKOeHES9M}ES{yMG+BE`oE1*?qAURv4vtN}&X)h!(En9Jo%u#*>~u1?Ph zJyiayOCwuU$~Jtj1pgq$VIAP*U@I!{p%h9cdnqi0oQd-qDMMas1dps4g*$u`mX-Sk zbLn{>-`8L^Mj;kAcIBSbML{Ht41#7gkSQ5<9LZVQveOOp0sGh<(IH^aAqN|lK?o@P z-`i=NB{jH5WHIyTg9Q=Vto~I$#})LSKqwnB#Cb5^wwC71<2Fv%oG>c;B*d?_}nhSR@a>)KmBE=%P z#W%lQZ3XlR+A|cf0(-Ydi@sRs_&&lMQ)SX3UJUS|$+PQWUm9vrA8JznVKWf*AEO&- zy8n8mtfQFy$@?Hz+jSylmp9$icxs3-!g_`^Nl@|mS$}i}o7Hl7vHFHqn+N)s^j|wK zD4dwBKN9qxSUAtcmgPgt@krcq(sC-o0EXXLZ}g<`i1U0@!Q+=w{{pRN>1UmX#aKG6 zPgyy2=l*KXt|Tl8{t~X<320d%dxj23Q+d$*;5{wI|5=Cw(9x>%E#4IZ1fF9tp8Si{ z|BvypT5vgmaVz5=j6D7=69pU_m}2{pFjc#AKjHo>bT6$Y;Aiy0Xl0=cfeyF_b?ssB zH)jhi)m^8R|025X(&I4_3Xl9Q?~?&h0W|gn&2>i@YBjhsm2p2e_s3{&kZxxX{=d<3 zV&91c2iNaM{5v@}xTRmooU!?rTZj%Md62sQsL!aQ-X3&}{>wtK;kQHcf9@BRKD0?@ z_<7*{o%9_Z3$(|Qex{^p|ISyO*}0(SULR(8sLOPY(C%|DJtM!`Bt1(7)*HQ%ebadz zoP+q{NbLv6DFVf>M=y#S`w2;iK-S~_*h>nL{HHNiJP2+Rp$;v5Rj`DYUsa*WEPWp# z0}!6?D9zd#Ga>b7w?(^*z>lo-I-H11!?(Pa^riTPvzOMf{s7&c&{DPwvGvaw$YA2x zeS}R{mL6!=V|%n-%|3EB$8PkcqX*WcRvV|keh*Gv(@R{m`3P*;O??f;AHz7LVZDcm zFR^>@^&ikLLu>)-ZDyUnIiyUzdb9ss;l*WgdKx$E`WkzD`Zw z)d!G7@~;mtOuD#ISfwVE?B0nk2z3^4m(H5Y0Fblks0^;HOPM0LTE4L&q%z(0LXw+H z<%K#&+b4uI69Zt(fn@XhH8x;6f85E_Q3+?Jw0>M|XQ78PY)`fj(-`c+{0|19tR}ww z7w#T1_^Ob?`isd^YFp^z=B&0TETkds@K4hr*%V9hhk5j{$4Pm3DnT&!mUw@_A{7|b z8<*k~+T1)<+LzsXgD}S!Ecjqh%H`2&PWC{PF~GSAexIm8Cs87(Coh>kHwa|P5kj}(U;-ad-xyazkDToV#CV7jjplK01-X?l(GF5{xKzj zb8$xa;s5$Ddw#V))3^CLq5@$?yESN|KKcxUZ$%AF0L^C6?Y{UAb!&UObfW(;a9r1sJUnJMl z32`e7r}-~sOX)AHr{I5heoPPDgk7^Xz|n|beDqWl9OH8`KNJxbOMl5k2_d-gEd~m= zaRhu{>A7zk(HGs4J+L5!=yyFGAP)Uw3N9Un(<*{_hG8xo_dh+NT^foFxP}A}P8}@t zB`u~q%X;Yj)ZBD@GfHCZJjoxg$&UC=VGe~v^zGK(E;@)PvVAJ>6^E#h$w|`nE6ZR( z;jZGQgE1}HbzF26IGzF|=a=oPV9sAbWGdBW*K{}=ZXC7wG~qKBF35Db*KNmP~;siG_(&7jsG$+N;(@ zkHi|u(boJR8n|1^%Dxy`7~dj=NGU(nKKtrScXOcaPsg%okw1D@(LeFwmU975U`Yl+ z0?%sg+wph~VF+km&Ew3;eZ1vYZM|;k;l$adB=CtOZ-DOf_r~Ysdr)%w5(fJU`77gt z^I8_Q?f`m>DQxC`c9fD2Y2FGG^5uFl^p&@J7bMGD8(N=}0VTJJVreV?T@vMtUEPVF z(oH@3GfD*RI7$D|62mIAHW6y^BpPU%CCN6Lu*0urM)Fz-lMp=v7u)8IRuiVdj~Ey2 zb@P!JR+j2e^Oj#T*zjii#-;W0;urcF1Q4mVd)T_2C*YkSo!@I!GA833IRnfIsztdR z804jasiw~!(Ow14fj`{ioL3z;tn6U0agODl$791!>F z+90chKN^>H`8@dSyBMbb@)^#sq3Amkwo*1I{$m1L4t))5;`&E1BCPZ+1h4Q8j`= z?FHl)f3^V<6r7_FH8WhaNHNea<*Js=9U8>dQ$Og+hBHP`<@E%pJwUv_QZA*&hrFaL z$LV|acMpDFy6XokNd9Iq%1IkCMzQGTtpAfMBLIv$?(KdxGmX({@iN3Hyx^=!>4~)| zhS6Of9{#jyhQ?n)j47V*VhYc>rxB^iiD;Wq2<0@4-OC#%&MOaF88ixeFx%}%x}yyq z2NDl2wSOkbGa!OiDnG@6yi9q-ZL}iVD~oe*xmi*`Jj-kUC9O5FMVSS0IjuGEW*(oN zpkQFC#7SU*=Z*O;Tk{pqmw9+vjJ?tF@%1^_3EchkH`jUvDRQf&KMo?zJ9L8Ug)H#e z`ZOmC#sl$cZv4U{86Qjj)~EMFB=Pv>h^h@=cHmU!Ku2ALUl#%nl41{mJcX;-G3}2+N#^ zCxrg22|YJy+_Kg1Q}_ml`a3wf0NU+X?8aU^MizB`T!+eU@X#};f?q?`m;Vto*gFxw zaNeK|61Z9zU~RYr_{m3@pq(Syf5K6F-(93z4(3PGn}(dYb9e42VI%LCEfua z;8-T2Sm=BOA>>0?5m1_p(jQ9Ve8R&AnsFc*vGGN5;-|j0Qt3=W=)|^9X`SWz`7jv} zCV-rADcFJl0_?yW_B#s_c1uQgQ{^=MWLp>K4&G3HDI8XK`kpPLEBaqLTXcZ5mQRIn zt~5zfTHAjv+1p{hGV~tRdd2iJQ7LpB`6GxFwBkl~UJx(Z+hkxta4D{80@6RJ8xLp~ zb-G_Igy|$9bx98ePlr%K{{+8?2QUaA8kAIgc^u{fi8@7V0iW2kNX6AfLMhNI0nq1q zt(Dx2r+jLeP_1*(cLS@Mj*e`_=*bePI;0h?O5(+WU>Skf584njT2uI+tSV@3-f^j9 z2mWxm_^T21e;JVp$)Uh(trZ$C?-NeY_n3aECn4X@T(pQ2spb~3h}Jm*lwbZvoyS5J zvZyl>*6yq$3_Bqkfd5Pi5g(te3n zFI9~bww{#0OCT&0PBaQnz__4-!s+klGu3~0Q);c!{`T=@yHU*{Wz|rE_Ppc5nGv;8 z#_j}}^$sTU5@@$EaWgbOcP>(TVnfGSLxv;}CnCkZPwbIO{cQ65Zf`FDz-?%tlb)LM z?#z|1uc!Z&ayGpn0ORmIpNho5+xGstrihI~iP}$A<#x&CK&jdenOO|P!(LZY{zOTiCG+vnV6jH$JVHgj;`Hh@Ea~3?D(Nr1)O% zoxFT=y2=tWYxp6L53sw(7mE}azUyZaIczevMnyJE1rzvUp965DyMTl?#wc&u9hou z8W*#ix=ZLHV!rr$K4eF7KO)RAPd9>=(iuw3Sn!F!2R~4J25$Vs+Zz|D^KGWR|4sSN!J z%Tpo~60qhE=SSicLfH5B)paaYgMMGAO=8hXkIi@Np_L$fc|(mExjtuYs&IBRId7X2 zEl2Z;9ujpdNj-aVN(3>9jhBl#4gjx{XdDa5OzRt=!=i=(JkL8=-5#6Dybu~{=Z1OI z#Auwp;a5gIWmrrLe@0@0^F9OU-``WD0SmdxaS&M~6D(bum~>FRs7g2PNmTE>KexB} za%3xx)Zg}^)E>nI4rmy`^FnofbBG(Am*u8o9o?Pu?COA7)f}EBz7Pf?h=dXN;~{g2 zRwvf+_8woVJO(7n!0Jykk=e-H*-7;SAk&6eqPkPIXNM`T5;$jkc5r!mn4$UIHpD8{ z*AQ8bjkIjmF^O)aNQu~ZWh24VSXUbl)gu~J$|ZsgaUmJGE<^9GJY{GE$P3p-Aydk5 zroph0&oh)@9k5ec@2FApMK5X()-@2RQ26nk4Pxc?^mH{Nwmnj+)i~tC1ctR)EMJ)` zMjm&QYwBKpM|`@xIfgas-yuI=Lvp)qE~M}nb(B0j@0TK!*g+)PDn`B#PbTzIdb{d< zdfyiwm(JUpv^*YQf4}MhB#AABeI_FsEQ3~0wDp()_fVw@5t$f^)d8mDt7T|XwxG)8 z6xrLe5=~%vbU6=|4;7ey8pJSuYMnDg2*2CkJw3gOZSQ;Os(skHMV*%pe`3x+wV*1- zk?u|bs*`U*8{W2ab0NmpefGaQfrkF7z_Qk5kwXQ$;_S)u=7&@gBc}$f3IJu#?I*JK zyRN~BOU4&_1Y^0MtnAI*^mD$iam^oD1*aQ|0!`1|8UvioFh}ewFAb;H~j7`%J zJ8P|bIXIBp_C2!x;Bl?nhRihvou})>`O^Lfh#mu;SLTH}FK2vc>AbJ?fx^JwswT18 zl_^J`$qt&S=m<`8ucQ}@ZME626mxNE?d6tYfZ5F!b+5@ODRot)tpi&>8~>#Vh{;w~ z3WfRcIPS1v5hyNAq4W4jo14&_G1-AXn^H>H zP%A2^WzEp;WV|C-+IV$5!#muY8JgLq5|1^e=u7BY{=5$0S)pvCYC5U|%D>0TDFuyV z%@66|a{!*R-rVM*et*BGs>#9g=5rbsHu(L>xmI%$SP!10gl%0c^cfaBS~A{R=DjQ> ze&QopUT-N|VQ<&cwJZb^Cqjr~to=5k+=dOSq5(iX9s_=ci!z|Pj~`Z%%sSs_7RFDy_}H^9qg6nmpdu3j1tQ&-FEl6K?@El9-HVbwUX%H4oZl{DQ4gN{+;=lmdv$3?AuB{bp;n#e$rZh`s_t^T5bR-c7EvKAK3aF56BdR)z>)*gi32C zG0m0DCD7I(2DdV5RD4v0?Ix{o%kU6W}x6Ls%kwz$|}QX((0MJF<(Pv zE)P^MA@zkyFb9xI;1YuH2o&gR^QB&SVhF*6Gl2wex;mqf005GsF z%j_S99c7>_^>e7l^AKu`J-m?e;W+3JRN!znA{ztACyQ4o_Ls6C{f?znZj>x}yq@ZV zVs~~Sk;QhB!grB-j2VF~u@SMv2BX%{Nnr&SG!<89b@53d-5P{pde2!lh!`mMDhiKB z48X^zB1>L~zmRbM>#@Gnax3z{-QRJmgzp}oA`fkq^yt+y;B7_15PUN`zmdSm&!q+ev>{=9IdwaGIwp^SanuF(9ISAtZNj=p5(3`%dOtFZl0yQwVk#aX5MZ6~UR6 z4sv}8%-#PbuY+hHXolXQI3PB#t(Dxa(1M#=@0*45@ks_0|JZL|BDY&YnBEj905JYR z|9zyTC7%6VIC&2of-D9d>z=w|-2sS=UC4&K&D;GQh&Q8&Ah$mC1D1lpKrlAN_xstO`4E0x&B0C?O)@9iPXa zWzEEXEbIG?WV}SkpG+YD+qb=y1Zw&KW*~i*st78;#0CIiP$1z=3PxViG$PFnP*Eub z^3-2)^nOy`tJB36F7JUj-Yc2JLJ%&w0UWRWPhDqli$29^X~>b04gh)G36F3AAp7)VVRSL)o}tniVy^84cg9K^D~F3^r@W6o*zkriVcZub$NcqW?l_p}tc z$oxFG?<1PQ!fehKF=ro4FYfFaDWKa#`BD7MGs|yr(K#Zfn4tExuE}wc`n8Y$R%p1x zcv$_zQ1P>c#vulorcG*bAZ-Q=gj`g?&~QUkGLJJ7X1AmpU6F2h2i-!61Wae7Kx>H& z$^>w`&BNJ48MW-6TULd47 zhM%f*vG8#>^u}EPh;~YJT61OuFqliER>a9cMw{(S!U1?5Xx0sV;c85PBsmHu0A!jM zZlcx=8PC688_9_Y*5(LN&$vL}iP89BAs=|fkui5e)Mnmg<071!AQ!785DDcRK|(Ot z>~A`A>7%V!8LuW@_eWf;em=b#c%W>796P{i3f_3E6=ThyR{cM}0;Yr~wk3c)16FvC z2t+^&pH+f^-;B*ZzPQG(<8$!P2$HA@kK68 zRvEKJKKMY~grWX01Xo12A`YS|%XSI_!I`@XryWe9ro}`EI}uoO0nrybwMs|PU5x$Y zb@i=4+Un>%f^WPFa_X4ScV=2TF0-0h>>ng5*=ClP`Ln#F4~s~j^*j*=c=kG8zz#@% zv_%UdD1fptrAy6VvNHqN0pG*lwLq1p3?0arz63rE1RN2MVDBP=Iq9&GRYy-4&bhvRovHj4>)k6~A_>U2 z9cw#bEY>KQkPL8#Ovbo41K(u*A^Uv>UqH%+Uwc}TqQ2tyAF};yc@J3lE zGol=tr!Fg~9!P}9)ctKn4F(TM|H*9}y)TyqMbPAGnv#K9^SGxFJ!dB1jcN8T*w5yJ zbPoe%uD@FBxsG;sIKX$R%b7RZGK3&0k1N$h*B{_B#s#h!J^Sy^uIocJfN_~8u(GfO zP>(_oomG88T?RPF;$m~Lwr5~BTF2(AlY1~AgU6<4=v)@KEaK^=*An2@I@$@-XG(a; zdS#Ev{q~IxH+%}7_d|iF@)ap4L`rSMvFM6FY(WXuQxjsPiDH5FITP%nK>n7IF}@xS zVk?B=ZUY}kZ10a?WR*@DIE{S)-+pRS+8aBo)kaQ7_YR{lerD$QEbY#{c`~0DQNyF^ z&%fL%{6xXrIJBED_#ND7ev>gl)e5BrEPh82>k$D-PqS4YLj}%5(mgX^h@z>|FsXpi zXCOPE4nax*iH|3q>0_bHlm&Q!#NT6F5NgV8ex1L7TAjh+P$mqSN2l{5W(^SF_O&j8 zG7Y$3M$H{nsQf06qPEo=3j#=RHDYNx_D;;GKFP5>ibQ@aT^d zd#{qwtKScR8{mNNE82Np`XSOk8${- z8x$B4=0RElxVmT4pkc5p76c1+AcY4O!^hxAp%PCRvftVpm^!_W0qj=)Mv(x#G{?(( z>NGol8_A`|u#_o)d{ReOz}~Lo*qUmJM|m9(*qXW_2RJaQrvY-2x*rg|#?p7S_Q1iH ze4X*w;JKo3{#9KI+F)%w4{>}jRbz%m5OE0c4*C$iy_eW=^C`Y&1SnU6AmyJ!&Nvm! zfR%UEN46diWJfjEr-VqpYCb$Y1N?&@reI(q6A=#*B_bd`rqQ=M2&LPD`lU=c4nWt5 zr7iK^^>|fO$@gI7e1M1JmGfh6@KD2E-~=SYadba)G6L0cw}wFfMN_>_WJwZJ>r*fT zFd_KC@ui>Ix|AKW7z?z+7wE5b3=Vol&l}Y6q6hFJgZPhGVrO3?2b_^&Q#mjMn}Uda z_^uJ<6pseV-Yz_!1+U+g-pUGpxVKEcWiB*iCQZu$vz&os4m`aZ%3{CdMeW#}-9!Gml+ zDKPmRRFU*0K<9ID(#LFW1-CsVntq}Z82&_#;W(sFDMiq495QWDVsqHHe2G(+>;ndu zJ(Z6B&W6os+x!O}>}PwViInuZ&*#lhh~-0{xB5sQjW!EsoAUt~a&siOJO<#_KhrA8 zVf7nDe)o*9(%9aAA~s_)GW}f+(;`)-&-+kVD{Gxmn-1V}7g#|<$MOLv1ddLQua*TE7Ukmx%i|Jj>8YSy6t zZGneRJst3Rq$TU5=)%lNn7-|2!j@k zEpkmW%nG=AX60@F2d24bZEc{w&oAKl5REC^#G=y8=%q+B+F_D-5r#>BVgl=robaA7 zLIf)JKYK%>3OuHPX3A~WxFl2PFe%)6$*hIE5`xTG0~_;gcn@4Dr;=O<`t=g|gk$!G zOmRAWDL*$*PW4Sfg}=yDW!SEpEe59i9pWMtfl!|^i9D@%PR!Qi7d>(uZ27bq3k82s=beRup>0uS{DUC?s2r`+<7pHCo?c- zy_ZZA!b@QW+kh?lanFZL5^y-~4vsaR`o7xi_c^guY7CDc4EjMa_uDYZc_62ljCOe& zwm87);l20C++8w9YJveE-GnJ*08<;*hCT|#5b8HdA)gYgtzCGe@l)NS!_+c*9%)?f zmi0r$&6hI^i)g`eH6Q%V0%v;-z)K|18K?~Ob+93g$w?p;{p1QEm}euppV=eE?RIeSpKM{B$0UH%y*iCkh+( z?O&R&r3RPl)9h<=u@M|nz*Zyh@Q;_xqn@^F%fTif3;N-18b~G}T|h6~JoxQJ$@FZc zLN|_K{7|R?<0t1O9=a{`J;#&sM8N!pz47;LeAt5I+-l_k|6pJzqD0ne z9wM#$uooW$uSy>5n?vyX!*hKwwE+1M-SYt~@J~YOzBnM0jk3Z22@o^N<6bmFrTmJj z4p+-44^~<77iS*xX4#FaA73TJ6yeh0WL?8M~}HmpAs$6VR`vg`wEP`@;^Gpr{vJ zdqXWjD8==xqy?*izCQE2H(MQ$1DSc$`~MHtcMjC<{k>#rU!Q?2zJ2;w6pQ&i6xz(l zzoy1^#0&ALLMeOmj2vo14w7MrXUWV=ptK|{6dME>zNNe40#Ni04>5p^-f}{3-Jo}Y z00;=6H`~w~JpZ{ckDsSO7jb`2xGkkUTkKWB+_17H0HNarojMg>Xt^fzeU035XgdyQ z-H)UHp1My5fqN7K5pFHYxBhj=+V!FRd-Tt_x2O?MEIaYw#K`y1`|R2ebKsL!zYh`>wP#t_e6g&sr7M zAGmt^Jel;B8xJ_$Tf0UJ!d!%0m*5|^#MDdaYI6mKnsl;oQXyL1c4RnA;1A5%{80FZ|qNzc4c2Oe8T^2POW?v`#kLHE_ z4N*%^Sdld~uyqJj!U*V->IpC})&?Rst#j++H`OIf@K0P1fG^a;632e@bD zSHjY!IcpEcQZAFKvUte&3X!`a5C5y^)tB*Zl78;lVo&&EEa1bPE^rAe4{@}$uyFJ0 zCbsA*_E^9@U8uhuMKb|A8Cw5Yz*T_Yp(r|B$>~#6ctZ6l(MAUlDUVUZPaB=(=Q<8`n`336u+n;iA>!tM{3)-h`R?lLCy6lx(R;= zK&@1~sHC%mGvjA|-3XE(pxD8WCiZ=c&zHq$tHy-ozmfi@Ym49aO-ayF1z?Z5h7Sks zqm`EP96psWb2|W>T^F6+%7Go~&$Rd%+QVKQ)yP`{^0W{*!-GF%SQ}Y$aln(D?-^H) zhkMSzLk3!>t^k|&hYc0k3@j}3S%IguAv3i_a&x9Nl`@iHk85(X&>XGhQyb<_=Fd42 z#u6v5973k5CM{%nKWYYaPb}}k9KBFGYbI9u>qoJCtjHV60Np=4p2wjb{)y)6BKw~D zmfu$s*u%J@0q8|+`@Q$%N{Xa{Er=Esx&1k2KRPQm5I~u@yE05V<@{Y^PD>6b>lGe%4czi<(--6~ z4cPIeLCUC!RQP={3eYMJ&~GQSCU$*Owkuq#vGce)l#YoM0r-8i>}W7UJ;)50eh|>w zmL5DU30lUYyx@-Oz=Z19nA1Hgdl}3$)s#+Kcl^933FJQj4LobKd(S?UoGmPPJ|XSG z9>C2US*m0IFn&%5THnc-YR_MUEFpJGhbA1)j$;eR&$I{-V9eyX2fq>^z}lwuFGK=+ ztWgq^C^iZlqnnZ&r)Q03)dBFdZyXL!GRrw8`Dt6yb;M(t=8IO$r;eh8-n5?CjE^&0 z=6GFKw=2x$H}bqRnWR)eX`oAI1hD-I%w#8ifLB}ez)ok&Y*z*?#7ym<4 NSJqLgRJ4Bie*xVh_v-)v literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step14.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step14.png new file mode 100644 index 0000000000000000000000000000000000000000..2bafd6a176add62e7798819de8d5064745add67b GIT binary patch literal 13401 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step2.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..6d4f6ed2f4cdc7dc7eb143d854d2cd1d6050b47f GIT binary patch literal 15615 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 N8mhV~mG_WO{~vJc_{{(S literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step3.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..9bf359c339d55462d88b1427b99024cdc157f502 GIT binary patch literal 15601 zcmd73Wl$W!+b=q^EbcA|u($>Y1h>WA-IriV@ZiBVL~scnJOT+$aAye#1WzD9@WtJO z+u8iKYRDFPKkcQ-H@sEdM*0swqTB)qc!M<1-O zZLD&8dpo&vxwv+|da!zSb|x(?o$Nf2o0k_I9X&KOWR|H{GkqeR9P?*#y0fEmRzTU! z&HdnTzjvVzjYij0RP_uVTwPtowZ4ColA)!oT{+UZzP@g4V>`IGciXFbGZFPHIK;a& zOtWO`_KQq;?AYyE{nW-3F)r?sx3_d61oI{^Ktox`+nB#4Ym zt~=gRhwZD&Em!Ik1VaNq-?Z)U!1g5;ca?5V@QvYU`_&Gq;A|TvhxTc1*uGG8eRy_j zxb%E2_Q0$Ns&eAQGuT(h3VuqoKfN-&v%2Hh*%CZW2R;uLFl+D*a{H78?)y%~TCu^r zI;u}?f(+TXVr{P$q zAA+F!XITn~5CYhKmyDTTR^MMyZUsdAIC@sh?B z^~pN0mYIQW?V4k)=lG-Rc#}=A4vuFKZ2x=;kh`45Qa!GmZG} zdc*}2>hr&>pZxx*ahmAa*LvEFd0elct#?qevuXdmOVdp)He0u*3pr$ijDwZ!9n{D? zvyd||<0fy*BnROnLW~7eWQ80IqArD}aIq3Uhb}(6l25*qVQ=+1U`32Sl2a%Y5Tt|$ z{_xxK7g;PceYVrxHu|fCp^?$~FcjcwVA|xBqed?*4<6C9tXjl+2cMSoz6D6`mR4(l ztzp*j6SzVbj!3ndS>F%y9s>^kHZ@{Bl@ep^l8>COuWk-LfkfiFlfmtBNHNG)ECJ*t zMS>+%{2hMwlG)TWQF-5@VJXc9iRf|xO5W%tSG!T2FrT?XkJtX0|; zX-OW#dBE4oEPxV6=;Ji8b(lq(@L&+J%;5KX;NLc{{TH05FNqc=8)981JOL9N){q{n z6Y!ZNU0?yekUgOE)l(>TawQaLCf~3JFiRBzaZ28k;_2l!y2dYOdXqj|mj+Eg4o9{w%WgnHE z6GeJnoPPB@>G>oP;&36X6Vxbg6u`6ZLy%c(0l|~mCgVn;^t2GwZuqeMDy0GdA}{p( z@dyVJ)kX3gQ||`BCJX$7F|3&v=ONdL9+LUPH4DtSgSWG9xzq~)MZ>LgnLUBBzTK?v z8vzolEIFK9*@Iu_wXMB(59QiwCZi(CUBZtB1aHF~mJ{f}mmg_rEGAm2N&BCOU8m-p zH-K?leywtzTgMj%f5+R?qMj3svShuKwyj6~5Vg zo8nVjTLJNdckVkM2a5N12qOH=u_EQlz1#i>*0coG%6}^Bm<>6wr=QDLmYE5=UI?H> z_2cv31cwF%$>xS)lO<;d#J?RfjU;pz&eCufvkA{^QViC)_Ho1d)2{S3z>Jx*?iqs{ zQ(dWu=oU@Q=#BY13&*|r^RHy53kN?;D67jZtH?-QD5tuZS0^6&on2q&7Z1+dO!!Ua z+P7u^w%q8ey5PE|i8|ox{Fv;j8LhkAtlcBSagrzTi)5&$+Xkk#qXuv+;pAmI^s{<7QKPBnh!n_Wo!K>=`lCspC;R&`_oY8O2JB& z*p;^v(^PQvve5Ac3-i~`Cw$GHY_?D@`Li1sHz4M>-6c^$L3n6i#_Uc$=^&!2I~PSe zus`uH-2a-+#)<9W^b6mfq%M}+QR=TqJ;qO+G?H_tU5g#2M9k$_O0V6U(|aE_|7XU- zZ9X%7a7S>L3#oS`=pYsv^mZ?N5C>Z*KT<_IxSr=!*Ev?GV{NG}eC}a65$Suk@meRF zocGbHr(}rR8LvlAMzOt^KYUUG<|jU=fo@M}k35)MIcsDprikhttQ$8ql1^YM)14=T za@wCJjpkQHDA6~+4^8AD-RJK*-o^SgaFYg5p(-O$@`ATp?RdABp0Y5c_mn_B<&6)u z#o19Zm$c<0+OwJ~+r$Y0*-b3ot{0i&=jMKenGGCnt_Ir^$w#3pCyDis9402A&-G|UcZE3;`XOjz4`<G5 zMk*0P+9cXww0?qDqt&a+&f8nc01s>9pPhg2lg+!hesHa2jFUV0`=BPrM{wyGohwDb zcGTMuW69fv8uEgDJMdK$)I#`mgFkwGdp zX6$1fx3N!wsjiuQY&O(+a+qe}579I;*Bl6okU20C{k zUbtmq(OyK}b+Yso{pyGBC57*Jw4y)=K9zk=@*@tmJwZlLWvs^aAXC4I_a_6pHfV$c zwv&GidY7E+t7Qk-7J_U`-%5eqB9PRnH_3#@D$DB|>xy7sZSCG`13uwbb_0&c5IQ$z z3%SR_mV{!ZFjq?SM@UBoSoCb;qjTJ6qCaP%pGLLZ39>oZE<{qL#_rM2=5z>5GC@L^ zzYW|s!M7>TF>&oziGDroh^&G9KGcp+KU2YZB#mvV^5cfT&Ae_pldEk2DE$4Adl1o5 zrbx{aDuQLopqK1N;Pn+5TywEC>v4%-f!l@qZW!|Cnk3`@)MGRRv*aZT0V`7~GW2DE z@JIc%2bT@tV4Kb&y(h9y_Zb=EFD{zDqYZE#J)=Bs$G5p9WZto)^cPj~ z8}#M8D5XOCsl{z$5shs+AAO^0q?RhbV^PmWiBJ`QSF%tMkxsq#8q4l?q`=7g`0h$z z;?BwI1J_E^@zHAXO>Wk_kCc$qBaDf^s>uqprD#*1(h(wZ*P4=AXKf;u3)ezUFWZYFZ_#qSm09rEPS3 zF`06_gFO;ThL*+`+WCk+<|;ne)lPb_H3W?o9EQ^43-Lu96k&H8Z(~EO{ z6q&uVY&kAax=hY>Y8RxOQ)qR5L(zkjqhxA(x_UQePNA;gF4r(0t#QHE)?uFGbpe7& zMq610Ve=Emi-{=#*Gby5sqtz_vl{lBZYqM?+TZ6MX7iVtpjCH%iEvE%IU;%3tihr8 zKSGMB*bg3#k1B$Qt9Fy@a_#M(r~9&-xGbk%!-}!l=i*wJ&Ic8dUu>nKe_Q~?BB&&C z4%gYAsq3f83T$JBb`Q#U9<~~EuII9F*4k6iYKh5z zfEA~Hy(U5ID&jO2CCvK-iM}xUSl-s*??0-Abz_Ng^Gcf9?~cH+aE%GJiddu4bfv(w>eyt ze+>R9b|4r2w}hVnGJZ*(44vC%$N~pY^%~3sUPDMS7=WH|LHZE91VEre9?Q2#`XLNc zE$xU*(SSkmfWTNHeV+XiHXH~PaLbg^NRGJQ6xyMqwqino2SNa`fiMZmue&)}gxHEm z06EVB?;oY@#`(w1v%3I}M+WTs<7|J!#WbB0!~ailF}s`m>%us8z1WH5XI`7 z_a+)ptC`fi>dt;J)x*6C{2gq$Pmdc3YScl1f9ozN2nL3bW;;15mHCRBI_PNtf_{- zK7Qk6N8W$S!Wa*z$h^I(bJJr(sq}2M$}#=*m8p990sU{+L!zLUfE&iriT==Xs%x<_djA8{T-Gpki? zU&j5y^ZIolRhfue-)SJ=w%lUlug`aPu9w@*#Z<`uTDV&R>+WobMqbOV4@8F0F1Kz@ zH^E|)8mE7k;Ah~j*c6Mr<9P}8dJWw6TO0@bKh-^OtfOK_o{+eSVtLfzman3|RpuXE z1R~hz(H;TG=@*||= zPy^b?o%af`>b^?+aMt^f0<7mJlV3T*Bm|^v*NzWRs!0_o!u^HCj-~y*etI@t`PJ6x zP80O#^T4~%Oz#)AaVvV`0AJzf8r$D#hkex{RpY)mKZe(yG$u|EJH9taZTiOrYmW7@Lq&t#_6wpcRV3}i+(LBaH^-KA9zJ{!to9mP2Nf5 z$o)4OgFmsbfkM-7RFQ_}X{njdx@&kKaun!4ZrKzFSPIKR zU9uZND=g0jhr1L>oC|zEi;)l4tmfH|Sn{)FCUt{uwC3_&=jLo%B0rtWp%% z(2Ane=+VcymTAQ}zOey<@z{Hlc9a#&(} zum<&-E7uaVqW|lo?Rf8dkGz-Kl=Kws1CAm^QG9trfR0gYa@pK2dOsGMu13{X**Fv# zyJ&$Y0AM&I2o$Io^J)EGYHm$Cp2In@7%djN=i3 zrY)TxdFSk^XA!=wQEt*@*ci{DEK@}+pvg4Zxm1_2^&PQOQCH&B!^kI(3q9G~8aoIvF2D6&hYHf*UofZ_L{(N+7DD0-6`=pJ z0;pRkAvT>R*o_Gah$YBXGUUpV6J<^y^e>cHQKG*H-^B%QPQOu|{fC?rbyL>$BolHf zS+K*Zp7oF%3RH!HeI`kB|B0KY`1_uBGF_Xd618_PXZ2!^mCydkzrye@y9+hfseBcp z@GmCbgEw)U9!PxnPc+QN{||hezgy#cT}$Z-(b4_c;@M?5XhWUO6tOCUKK} zosQs@ySWt%*?B4a^LeqEPs+ac&~Cj7pN*j*$#5Ox+UnPg2RdxUGZTLsfRw>wvc{ZO z`cySS!gIwx@$Xw7CPRqcCs9uRXru{jmzk|W=Tu+ii=eO6iVMHcBDUMF2ND8!0U{n$ z?bE2UO1UKZ4y?)5#e@(pXDxXO3I7Ln70I+4jodRG=Vxk|FGa+MDzZ=79PynvP0Jk& ztHbe~_prQo@9=$8E*3cqkVypscAOh0Jj)G-oZ~NZAc+e53@xn3khp)9>43`)qvo2p zC3^Dg5y~$7KH`^A?Nj`&X6p@G$CVyy1_5NM!!pJL4Uukh^i#)-9dA26L3az%Jf2SQ{RiYnsw zkR5*;-X70j$s0qA0T411dmYo2y`*n!c$Xyd_?cm5d*Xrx1xD#W{=){!rx!eGNOm}K z?NeBb=5W8gIuZ~9BDWwiFgOJaRg=;-TQGkwRs(5vUo}8jvxP~9Yem-0Jdb(f#A3t> zVmzfGRh33UiJol1&p|zkQPjU#N!oN%shbD2k_O*Tx?gGBDLP zRk~@9{fNuNr-Aq$D0QpD8sJ}h;`+G@n=TbN?SuFR4aPljt(zj>dA1*?JSTk$gY%g% z>y5qxa<5HeAinu{a#uQz<$p_i6gCOiS0R`Dz1M!gSJctT#tRPiU0R1k{ybNBSUB>tk*_=r_MFLCgbi5H(%1fb@hIdVIK z>qj-nbU;<%gLy;pLOjYHvn+g}*}c*OT|H!7;*+NG(4~@*1HK6?=pT1M+wzZ=0c{G8 zL$#2+eD6fD|Kw1Mys4)gmlzbNmVAtDLP&=AO#*0^aKjyZKJdT?pCN%3*{Jl|rL`sw zc>Gjh5img!znR8tYD|ItE8#-^b32k9)jM%FYQ+7%4_DcYv#RU3Vha-trE7&A`zYXW z`g$+$ThS<=LMk?$S@jU_J&c~^I=sR7>dGL*y7900fgyDr^ikH&q71-f3xsUvSvR+9 zsr{N2hVMYlqY0n0iGua{{0CvTK5bQe3X3)(6pe{>&~-?5ev3Y3!4p|HQnqTd8F$xL z1Uh>kh5Dj%~>m(&#O6 zeb*TSBjg7~$4%Qenwa&pyq$rh{i~d90Nhm$peJhSMDY=NQB_{eaXls-_FZ=qH|9cB z@$?kzR2goe z5$9mnZ|LqAN&xGT&wgG$zrqDcuuq|2;A&aWe#7_L@p;&h&^LY-Oc7GSXlR2F!j6d> z|GD9lVN(B(Z%IBR06QGB`UuDaGWswJsz55x*g<9Y%S2tfgvj<%e=ZV&pLu`DryQDp4B-Ph7tTs{;qpp{NHJRxY& za^Vd(y#s^9^A6@|<0x5SkgVcfD{YZ@Q$v;I}n%J5gGwm_16lgOH3$T->jRQdRIlW-U z(V+M(u_*CB-fMW~396G$MAjJDfn%J3pF^cEj{fg}hh(@r$Y5khiq4VJEvJ{sc4}ba zK1Izd7Hr;)`tsP?l|abnlj;Fu4#r)zeq=&zBs$(p;AQ#?J5;G_yn$y=e&_$O*0Q9e z)$n-5u1`b1i407Cvs>Kj_9Bbiwwy_ZWks_@rIw->R~l-hJ$o7Az4Bac?O^X{^s>^s zKoihaDf*@CSk3`o>(E%XB`H0=?_e`hSw8p~_ot!y%8lH>gKhU|{M}Gn6T6|7zyjug zfTh{pMw+7g^TDp2r{#(Vn(s|tu;g=qkOAe8v+PH?45Ob>7A&8b;Qb%dbXZCkppCly zy&A|hQmNRsrJ%!`8!Kc!15TNW_Ex8{8uFEPqMymL#u2}lg$)sPzp*4v+}|)-B3+o; z4-44j=BC#Js?qWRoqon~#@KYdj#NxMSR_By-p!1gKJMEZ+w7zi+3A!#WrrVy@xV`2 zil6dR2(MDXP^(Ttl#iwD8CmGE@91>48p;OR61;i#6KmZH$*i_@U5{QfEv&MrYtm6b zx<;!WYnoa@26D-sX498jJU1)F)r+O(c`X~!jvXim3A{4kf>bzBr;2}t{>MkPVf>N) z$BZi55+)hGAnJ6>JU!&z8qdDcyIsYSDzK%1rjbJaOBpwuHtK3qLP-`m%G{?pt~8u- zEP&c$L*|8tlfOs%i>f1cSRdU3FZ?=#j><9pN?wz^fo6X5g79bfIcBV=|0MD%0N5|L$Gcdr$e?cApfQ)~L1_s*r zhjIMhD~FZElrU4N_X8=8Vi?ojk74f(X^~Z)w7E+Jfg+jcxq5p}j&^o-lF~6uZKI#Q zWfuV2Mejbv2o?M$GwF7auD=2RcaHv@1!(ZJyBlL~Wsj+ot!^Sij1qL@0r5P=xL&%9 zpT>#i-i2XT^LrYQKFW4%zYc6sZlV?wi+9xlop*n8x4)>FvCPiE*u(XkvhN0kFPM}u zQKJRf^ueZiwyVb%j!uF3MdDSt*~apkN{`hm4B}OqlIFcBHjaJ7D?C$+ z}Kciw)xoGK9^cURV7n!iCh#1PFZ+i|y! zCA_2G7(YSeZ3T6t9(KAj%1PlYU#(Lst_61aJ?+dGRKaf{FX3? zZ2EM)kgeIOAN6F`Ly;C~AcB9_Qa;aD2=6l={6G?CKD>>wqSw5V*JWsG2oF_qW5}y% zFhziBBzY+jb=Rr}a#}ARVpP&?{$zFG78haC_n-{CC%x3tJGffDWpGf=9TyV}ftcI;+fhx$u?c`h=Pw()w2v|K*2#)Jdi)3{36 zCE#rXcr=(FhkLWj^PrEHb+Ll!}zYu0Gx&0@ZgnbA`C^j6-O;MjMo84DJv zt*7P}hr;&u2gg3La70PeZHXV`@t5Tc|6F9r9qWLX@^W&&{mA4#Hk)LGPmG1H?%m7G zHWd+!V)%~neu&|t`gl}cOvldjy~GHuMJ)3dA7W5DH^;Lt=UZmBrW>w1h&TbTjBSKm zqE>$9j0_JBZ27&kJGHrJYo84(hzFomMSnN;udYJOUDBUpa!;WZr@x^vWQz&_fdL>A zfC3OQ07Le_GRTF8+gh!ItjjN&U(7S`>ml6U1Wc}lUXLqAK!N`cul-wP;a-aQrVXD9 z`&|-`XF+sF3P7VMSO2T@!sGG>G4J&Z0)3a5_oVpB@~b}AOw^uiSurtVBkySO{VLhy zkJ$>J-Ec_oxLUGt85_=0vvEE4>~;as-4u+W6`yW2JZOP zxpTS`9)Aom2euFW*n`4GS%wCa3IvFhY!c6}yWx>`a+%dTyPFWNKR;h)dcat(lSYVj zTp5uzTbzJNTSn=vLGGb}l^^ZsH^5CR>;2H!^%Q4}p$O}Gwv{`n=t{%xx_2b_Q` zPp*Md%8O=&0@p$HJ$5}EAi?>$PSooJ4=eeHzx^pW!unjWQS}9GtUsBdmc~?XdOJ&| z|GdoB<-S!1Hszk&cl)eZ)@xpTIc!nOv)H%;(Szs@Dwh_M9PNF+2k?&(kK35aicJjm z)4bgXBY_Bw-?tFqbC$y{cw0y(=BB7UoRqohS4h9!e)I+~u3IPyKKn<;Axc>rI{x-u zrv{+;%O??9FjQ>NHIw>kFtcn$VthT#0?fNS9BQ0} z29945#hp}${YPq1hV@oTLVrEP%_6AN_Y2y6Y zw#Az=^PA>{O7Eb}wf=0?LgSrm=jP^8m#L4K+G&^?jH)_FQ>2Ju^qViG{r2@bo;RXIT-2|NvN#xqJw2bWR zzNl);Y`^7u_Firb2oac8OZ10o4HtC=`YVhj0-H?RP2d>oM&X&ArYQ8%LNqEoiKNucZmo z&MkuLF)|XgNIyJgQq)tb`1TBI2B*XKy)Ha8e2}WLjt{y}1XJ_1yCCVcmJ4iU9y1e= zb6`4=4{y(vJZun9nLFtMw7cf% z<-d90gHk4cQkl&(>fW#+==go_hA_#ajrKp{p{o(8`hxWe_Cq34(KqH=6lM zln2a;!T4p=fE@nM<1C1yPLC|Umm$Y#rcrn!U}05l#0FojXG4{`(4whYmn6W$E`~j# zU-5=^#*Vt1Hblo_T zIx(Fxoc!9Y0C>x$*6-`MVQi^E;*&OQ$Wx(sqwZQZZfk`6-q6N5;7+Szgq>*xeWXcw zk-gq&?GMVCs9TaF$W^+q8<+OX&E4q1l zf+|D;M@zLubgFMd+ofkheJMYwqT3vDEvgh|t|11<4NZ1uim`8JJnDllEZB@^gZcJmuI$H#5#qNqKo3bNDbsQVyH`!kNPhCdS8c{Ifkg=-4Hwt= zxy8~6&zPMLlzT3gH3L>5-A`TSR~XUo2u}X-yk9G;FFeCH0(b+p)X ztALPFA`0p^v7d|c;eN)>EVi%kcp?1D!St5LZ33PJd0;Cn2^YO(W#)pXyS7R~{vMMg z!SX0UsZFfAbYO{9&l|``y$@?Vkhn1tiP=*zi>Oa$`dnKv#_7Rq^th%ISS2VOaJ*~9 z_cf6Hmewk#NQbk8Ax?)Jox#E=h?@O^*;*gP{=DY$%^iI5LMIN$u94#;+&^JQWoNsL zMGZf=5xt?1d!S}xrRcy2S;m#rMf#om%w>a5{c^!{UGv2>4dVJsSPgLg`Thn5RN~sR zK;HIxd$60Bav!KHv7s<~xph!()oK+bQ-fc+5E2^1eJ$iV)LI=W_30Fby2`|KVTuQMRpt+?4!zM|Jx3N#=McGi#A#pLD$D(S;MQj>ewu%<3lW!^q1z&za9$3Rr z@^`@#S_MnU^79xBhU|6mGjw!ZXo2ix=$^PXmWS|_9>VS3@M_9S-k;7tO zr6$j#pPXl#U?+@)Q+^r3h$twzIcyXh9n^n0ufAJ3g~%&GIZ~RShqdnnT0+%%Kb-qf zXJ%S$;U@*9TYf2l#IEMNF-mZP=-XuR?r*g4!0mCyIpC58?A7IN&5BU-y7mXEs1iEs zF=gX?qOBbK!+ovVPPal*uRX~kQlWR%@so47>-$=won6hQCEHl3)4eDCCeImJT3__b zCqzG^go@w4WovxQJhvT+OgP=hmP5UaL@vUlF96xFz{N_4OA+umy=k1ipi8dJI`aKB zWT5)b2wrYxxAZJ-=HvyC`|%0gvY80By0jKn5vjg_u;^0(b@p7Ejdvb4eV^T^$J~FV zzlF`;`%-=v412&!Tiw(oB#B!5Qak+%_sj%4{s{ z;T-&@wNtJj*nDBZ)Uq1q1~JZHCKXZ0QmqwJ6cj}LJ}r0UQa!dTEK9dM&_o(sYl)d5 zGYJ|pfzyX!-|h=Z!td7@zkXidgn9vO3|MiioXM7?{o`)(T$YDKab?&i_qxCC>=}&` z;xK$f8(*K%ao8Hs=_d+?b@z5zBQSp$sUh4~8j=`rV1xHycH1REic8MrIM;~L z9et-?h8@Y)_ABu%!OM&;VJ*3S)~E?<@Y$O&gcQx>rjm6dp)vC;J$Q7%)v4(v`<^+OXgy(-zZToEbNV-~Z&sGbNw0FlWGn0+A2f#rP>Feo zHFr0Av`E& zeU*IX2W`C3c(Wd*^RL*|?=+4Yy;x15GMA=DcK9IQff~G-tNFU~kU#oX0DS#$v9$c) zmE#I}^kK}-&wv~%o*WpQ^<>D#9O(hanV%q+Mo8Y{>>Z-S&csVk05)E#U~@%pPWxAU zD1>t7=amx(?U2JdHQtO z>v1Js)l6l0RD<0;_z6B3QGY9kF8?lZTLubV2HaipWWus@hsYp^uFTX>Waxt~vcIr>hU^?m*Oorz;dkP4?e3;o-vO=|>AD8Q|C=kF|F_NS zwbhGj$U~R~aRGF^{$fyMJeraYbJkBT8gjZ*ir$gd?J7pmy`u_ z)KEtP_dg)E2NYM30CO%6gXH|n|3kF@Vcq}d0vtl2j}H=xnFT)9*XU_ze;F$9q zEf(Bad1HECg=F+j^6!)mzLCa&)PHJ$;g7Z@c_nohXALQ4i6mQtZ$$o;R|BENymELn z6T2axX1*bBWe7%il@mxoecr2{G(dy42u>X*=lIvO2zXVcDC-|j>SCEIlhE_hc;dcd zeiUo3Meg8>5$Qx){2l(R8GN-ONW32AL?G%l8|umD&5H^v6|bF~f=Z9?dGw2>f5(IV z)vaQ4FUdahB(}GL{N0+iw?gXbEe*)3l3+ypfpaF`$IVE5Z6=| zatN`v!D?avp+Y`DZb$s-KyD6BP1#z_AF1W7SkAhrg~_)<6F-8Gz$!^Wja=ytTfGiY zdEGsdaB+;=wIt~!Ppyv+L-t~srw3I!fIUFHL&Sue&eTq44_AL`+Va-CsRkYl$pbOx z{Mz-l-(l)%&BMfz64mpHP)oM-H2}#JM;a(EUL)pNkO%TORg5A;P%>02_}l7a_dCO= z=_iz2*^FHxcp-B=HcdaS3V_-&kXAo!51(--YgD5h3s=9nnk4f=8qbmF-zE_w1VD)^ zlsXnu+FeglJu@6XzOE9yEctxp5ufb%9_zX9crXweR zi;n>%Cd%_K=0RrEcd*PObxJCzOd341ABOQ4P2b5}-m_harBnyN?X~Ln0@3WBl07dj zM29SWD!+x`+x+mOs7nEwbL2ZD$7x$v+|nZoPabOY*VQ}KbnDD=exV4}Ei3m#h=v=) z1CT(LV@X>Y;}u9_z2$9KV)qC}n3dLx9q_VbCL zT_MQ8Z~~3o_(`3DUGNJr2}c4VbjvFl-Wos1_B8vMlJRBcy*M_MwOUPcZFZk&vuCQ= zq(H=SLe}5&FKLHqb)=rh?{a1s`j3gHybP>&KmX=x<3v6_zzl8kS2G1a+jGV^$j;Y! zYVwNZ65|_utlVT#6XKf|f=dkQO>Bw0t`7aqvb>ERag~PoM#D)56*?(fXZsv%s13;H zK2n&_y#NXF;o~2LH|Fya+g7_?r!HfBF-DhM`7;Z|7wN$Z%v`pdglNo=nD6`@Nj4vB zv;Uq509zd@Y|Ng2Z#x!$m+_c_?%HYL6XZ;mauYq$5>8r@pJJZ=BN2+UlVV-1{O@`C bGyia)N2&f5Z{My literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step4.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..2540bd01af13d8ee23b684332e00378448d56e76 GIT binary patch literal 15752 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 Z-*=J%?mSiW>q!7ml2d>2Lk1r5zX9VJG!Xy* literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step5.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step5.png new file mode 100644 index 0000000000000000000000000000000000000000..e04b449f841592e66d56472eeb57c49a63115dbb GIT binary patch literal 15329 zcmdVAcTiN#^DlhPvI|Sj0+NHEWI=Ki5hUlFR*@VP$?1R~AP5Rbl%PnE93FC7L_so2 z&I^L%AUSiF=X>w1Tep5yZ~f~1FzV1nJ8^dWnzMx1ONaKt2|QF z1poy06*h>(!TufR@IA%;;k!RF@c;mlZ`VKYJr4;zwi5KvRaO8>`x#cT1-RXPjr#yl z5l49b_`1KRwz~eqtE;Pt&9jB&lRtm|93LM`NlC@q_GV;cMny&S_xBs8XjM%eO2tP_ zOis17wl6F#%-$V@%(!@@P2Pm&)nDBX z0`hv%s6%@>#j7hT>2fm4oWBS|E%m0-W-X_fhwH9ed%PwUT3T4`|9|k@y_eqCP(8ts zNr?H#@i9mSAI{VjaUKr$Q-UJa=B8p{u(+IwfFE=GAp}V2-t#eAx9U6TdDF#IWInVi zD|3YmviwFLq5d$S)oNw#6qBYcKR~oI^?v@9$j9+V0UknJ! zJWQ)5C#$pSIxB5f!FO%|%Ox6W=)q41U>E zN&5WDQm8NTV0$AC=r0ZpIWq;Aoy}K8OJa=S%VUT^HrhI_EV0rT>4vV%;JO8{oR1?u zhbTV`z&Xm9Y6$S@D=-4>#xx*dEpd0Q%py^Zso$n9b|W6cKtF;kQnc3PNx)o(M}fsf zy`kriaSepJ?Q$~u41X}l9+h@f`yp#Ip~WQMYtvJ1c2@zjS51kjy7EJRz9gnk<_d~1 z@sfomh$Bob&u(UCKxmHjgDJ-$X_54i0?L|~w!X4Zj~S`wcM}u{=bUKTHggcr@Tpo_ z3jm6+)qQZ|lWjb8I>2Z>F1a%fIyeDlEA7f|N*WEc9NS__fUmy^xcKv~Zq@e*S-I_b zPkFX5q@yQJfPPn*VS{rONZGu$)QED{(MH=#Z}g|V$aAR}0Cq)c<30OiD5E;1#=A_G z0OKWfNZ%W;1~vtmyOffmev{%zryUeBUx?~iR;{O3&oCj}rw7iQ&HXjm zDS;X8UXw`{vK9>(T9bMiQvauY=u}Ljoxkxge-*DNmJ{vx^`q^gBabt{()y|h$mvr z@&Yv9z!A@4LUYc#V#hn#Fn2096X1*Dy_p>7DkOnM7>e{W8h%~HtIgYzxP=qwNME+I>J(%qu?&Z#Oc zXs3u19SQd4Y~s4^rc6b%;|@~L2Cc)z4@A)1SlQfv4i_TTFdZf+K`>LlbBdV36Q<5z zySC=hBlZFJ&{c3J0VeJVi#fiDIvMdcAGV$)Eo#~!b{-*KE=*`@>HalGNOZ)6UTF94 z*9v|R=3L)PdPOIL5E+;dlDa%P>1^sLsC^KwJan&7;9@>l^8XHAa?_z!eOd0}L#;GH zRdSb+?R0y|zP;@iss5@VS$gP#J_>ov;|O^W9%Ks3u~7p;A{b!^vf~i^m;`|n}d zbxur)I_A?TNC6ZU%Q}Om*SZDeXz}G1w{9CpfV^yY?iF%=cNb4+5IYU5JNqfT5Sh`) zQNgBa-QZ$-?+BF%bD=E~RmT}X1xukap_82v@d!@mP-!@DH{oQ>xHwSJxi^ESk?@bO zg=wY$s?rK)`GIMI&=gAt5y%=16* zMS$j?@!~$-@m@dSKF57MKfB!34Bv5vC5$DHNjnr$Zr9#{$V|l7r#SO_8wnp?QK0Bk zq*ZQwWDf+Uw1!Re49|f6p1gwg$`cI7Bf0&)b{69><_G(0lD+oPLFL8WRis}gGNNWR zLN{>=;`1xzSf4+EIr|&YJnrwAWmfc`%4?kC3=k~)6-czr25ChLSc?YxnrsAVDj~|v z7fmRSekPH}y?=VbcKG+n_9la+(EL$RgN^O`QPxnc3pJ>{e!i(lBkRLslLk`M*{#w2 zEJ-9Pxlu5*T6u-DsHx*OE-v|`(BwzI)1 zaoL*+T^50s6Sz9C3Jbov!44bmZQqqxurhkL7;L$4z(PuRey@J)cX)n_Otz48q;_J1 zz<0L99T|s@5`jxzWi_6A`jv7TKj*esAPf7~K^l|#GkvcP?0=T&lo6oFh296o7{u>K zA5cNFBlUl;`HF^3TY>rv{nBhk?B!b<~Dk>P9Fu!J3jQG2Q;@quZ=9;jH)5Git zK-f&a^Qn^dp%W5eoGzE~D?9tSfwRaXHyCS5}4raX4`nv9|qc)<to+zhiViCq=wr{h z?pP|9+V2N?oedP@>|*l?EiIRVKJj3~tfG|I$L-)QPCX}|Ry%vy=NVBy`4K)-m7@NB+mTeZmZ+;S;@mFYuJ{3gNqZlur)i*eVx;bg0eWQt|?x`mjCB{)f|o=SFd z(w~;}DeKT}8$q=y*{&M}>s)1U9oV9XQ6srFzBDi=44`hn^l&m2B z)UJJmK76ALuCio`>C3n`4BQ{uy`6 z^)iIto5%hxue*HzX{8LoBrMNftplk@n@cTgKC2GhPnz|)eRe>TpOT`Q@>%F^^Icbw z)aI7)>dRETf_s1SUe$n~PjXV6lE3rA$N62Lz6ANy$lM3!Wis++BwNN1xs9*va0x== znPpXq$84pr7V4FC!VIxXSD3lz&GDBhgH+e~kj_=JeGBka9xaiIllP z>}`IqU#Q1wJr(k~?2ml^aMslbuD8tOt z$$tyTUtEA+*#k8n5N+dN!bK^W2zTyNL`Dq)5DnL<0z_(?s{jGeSl+QNPcTfPodqTph+L51?6vui#w;gG~Fm5d_jK%OE_CGWt$6WXT90|ez zmh1iih#d!jB*XHThsap4yX$L>$gbr>09MR@O^PMLwp}xT!LLHge>wYWmS#P_Wf_Uj zeR({|`fq)XqO8bNrrv7);#|;bFUwi>_G_2>4=xf({_VWO@C)gl_-NK(V$%BIcHsv_ zsO{`**w+-Au~FY@7@ zqoZ~W`)=qDb$SLXLJ5wdMy-_mH_vo6n7k)40Gn@ABKZ`UB%k5+oY-ZX>hW)CU2x+` zA2Jr>;pAkXs_E?f^NsA;Hvik`@P8Jb5G*!4r*U89tnW!HRWFZJBn zz(OCFFQc8T^5swK>A~0B$#xz9Eg7*%TaGye#hL0 zlovix<&!$)o?xiFG#_Ve!GC**ccc)w@Ah~Uaw9V-v$b0Yif0=Vq}B{@6G#y&(zW`a z)zfMxP>FZc`;K*};{Vdu3SnN@I9Y^yI0-tJ;59pOjv8Ag()FXE#v2iNgxb@4l+UceoEH4{MV1>-?@SrYR3<7y ze9@aqENZOimo9s$C9=6K(WCQrG;oW#9XnpG+$QSmI!k4+oA)2Nua;l5@CC(QQygj= z^{90_{xkXI16F zpYv5j&wTUGdS6?Vk5+>bS;|8dnxctgj+GQX52V))bUOF2xt<^OfJ?r)#j2GB{qkeR z(ZocN^kNCXybs28T0O?dboQQKyA2Hw>oZn9lKk-!n)<|B#oLW3_aC{XPE zj*S`au`W#ABxjqVP!_H6w_r?}ao_=jupP|B2^wulHS`+oLlNW#h|?ZZk?>_Np@S0FRy zIS*zJb}ygy&(FY@SsKWfMkU>_&2kXtG!H7?Mzd86ueuoTo!T zDC(+ibHar8$yR0MNPZxsVD>*2^ypuGZ>56wiL>Q5z>3c5KB(#u7u zNt5k#W1r?Or$Q@L3X=GexScnwvDWc~RCz%FNyh&7I<#t2PC6h*zJBJZ7xGY)({BZp~A;Tc=+)e z>|Cot2QnuV38(A7scE&!7b10ssp_CCUy zJmd#*-h4u{A^|eYI-zz}XbdhkabP860>QNvX9YrgzxK^{TR3aNckup|B#cO@^rJ$x z_}th9vB?L#bO+bo&5y0WzRqzh=qz4z(33^aE^H2RS45G(j|*W;t6{>Mh@s#GBg5_9KDJ~w;@1inT$gs+0X~$TX@D~u<)t|ks@oNR zBd{pwD(;v+TV`{0=JHoa$*y$0lSn-g!;jy+{gu2|#4xx#B$u5{?s0J0pJQdX-Uij& zY~iUcRxRSLAyI^|CaZv_kP^<$`tJ8QR&S)U_UN(sL^pLyf*n|cg0d-qQ9Gr+Sgjh0 z2i*p>UOqt=+C>2%8RjK^dGK0~t;d!LU8;d-4nphSeS087<rIMSW#jrgN#i4(U*6U_z}ctJdP86AM_bII~!4^?5mG!$GE<%EJ4 zB!i9+@L2XxiouGv^X0qtzdp`WD`e`;q)7L8A~Fybz#1sQzI*a~Z9opjfdk)>KY5-I zmEX=HFC-6;GPn`$L;_s^XqyITX2966mB$iU`B~*GKA9vjjqlrKK&C`^(H*o=vENRs1SySw%6cc(`; zu*5(Le!Xz2;odMf#DN==IDMqwD~GAGvwylRzutQLA3J59cJBA#OTwAafH#uNyi~|K zC=}4UOX-};qyvoxz4-)eiYX+YKm5ggF=yRu-sjyksROwvhXL~~z*KQ8me~4E-gs{$ z%=zoIYLAO%^-G{=9$I8mZHGoQy?xs3r18MK#*9HYh!+$F@KmcWZ)Y}h$-n<7ssX;D z@N5+#&y5zI7HOEvxLl}z3Qf4$eQ?87f{=s$e6Ba|ZvN1~yvuL1ClI7Ka|?Z>==5{+ zN1mb~fuja>)?WrVEeQ@3&noW&fJ*tC?xMS1Tlm__Wv^k*CBR-Dy`jFY`m;5B{pg6e z<#sNrAfkkm+e<0_N}UdK-wsQwN{=`OAkVg1dvT1sq5G!kDejcCsH`*+px^uO>mT2F0xEwy)gbOA2e7L@oJ zWIjl+gYB27kQX9A3ZbtG7$E8j6bbwlV@9hd4sc?qzphh$^B_a z;@7-ja1qfr0QoCjpM@)I|LRrrn9LmT(X_xA^eEcZ~Hv@(U z@n^ATTGNR4*HM#TcuuOXqyvsk$WP76+3umeh2B^n8Ta1XWP0nnU%?;>J7+?YVbV<$ zU9L_i#jjl?g%A0b2pcqa`3>u~j-23Z^2Iz!v8y9jxRG*n{}HX?^4`=hTglIe}*43Qoo4!1>jnrN^* z0;sg6{3KaW z+30_G$I|=!>Q!(Jqer~V{3fw021uYNPEc#8omB#{z17t$thfhlLofeRvO>5CB%nRZ z4_{E;#%@4JJ$G`!v#>!mx)?0;C%bQM)praCVut{!d}(cPTS2hP13p1X>j$=H--FGx z&O)(N3smKnyxr^f+}~ger4P&V323p33>S}D5wAGidZ7g)3Qh9?k`tdLomw)v=_DV` zuDJejq9{lMaUE_*Z8f9=je0pgh~zJ~%A)XgPFNkjKY3Cn^{zE-Y|3re16{=bqceTU zLajD+mBeOo-)4agEjcVB(oD)L@)yvgF=6K6EIy(%F?pQ7is| z-%#_(EG}WoCUq!1J|1yH438wToN6_`_0jq;yqTbw?D+ynr1;XA+uxYO_G^ad zx)=!wq~MzB8cX~~icvC!*;|SsnW#V1q?yU8JUu>CU`tl<(Nrk2|9kX(;YAmMejDm*KXrM2dWN ziWfWhoP1@$77N>uZGvZ3-|I9?pK*u0d0|kV1oYgi#@9LGVPQf?H8_7hnBht{hpdzV zsg__eh2`fXDo{Iz{Vj0xq6wqtk>~^9+-DCzDtojI+X%usc=5L{I2*Uo+G(ykg`+pK zHf_TaXZBIezFt+Y@dj2~zdjpY>r%zUt&_{YQF1?Lex=I@Pa)Pz&@J(WqJxyozxd^U zFJ5R9{zc;3u>tp)fzfS6p8YvEv@%s8ff1?G3|xo-nFU5CTBGJ(g=rruGu_xYcCBy6X1KRau$B=;=0=crYy{ELp5gC zPJPSgi~$VD@)^2r(#zZzJDIr-CbooF=2(W%zmNbH8@L7u0Bq#J!Uos)!8JPY|JaC0 zy=`>OtD95BPz_7(!J#60cJWvHGBV>n1PHSBaQMzKTUuJiM%=`D?uUXgl_!+wCJDp~a?}hnA!X4iT9=X(6L9Nw)K`UXR%R>(8-JE~(T~)%L`-pg4(Cpebh-p9 z9+4}tl_UWrSNd8SnUm^rV``<#*d-n}X<6-C*7jpc_S&+S*+Kw$N)-DNs#iKxE^c}K*hdHZKU=QWV?7A_ah4^Q z-Z%fsN`i96NThfSfx6wy{eBOTO@L$9Pq6-Ri&Rc8Q)&Kk7Js}N-6wE$-pOI12Wug9 zk}aE~D1y0H)#t)v*mQbFVMdwvdRUhU(Dz>J-~ZfNH_be_?7ypq$liHxpL$KADs$x>l;N#S#ED3oE-&u<*by0A9L#s}a zrHG<@4t{lX_bN8MZ;@_H`gK~rXC|=UtRP2oqF#lrchVC4;AAnKGs7J88C_b9Y*j@V z3!GWln)Hv}YYXlq{5XXJEhMo+4vhL;=F}()gtA8o&WqmHbuU^ZLX;cj&gH*;a9HB> z$Z&Oc0tkec>xU~D9?MeuO(U+1#)1nU%FezO2~SleEtB%xd=0$N5Z>(fjwe}$;rv!& z{oC|8KGSh3c zeAk5KO<7`G+A%u+3p&oO3^}%XV)XRPdNs$0f=jd}x^Md#yrpPYi}`A5`mo^fN4ci& zS(`(sjm{npk4uMzJs_mw*r|l_$M0KL_Umwcmz^xR;H#D*s(@gz)%>ZssWrK?Gp~cc zc|3AtA~yJV5S@#d2HY!bw#Lju;P_Dh;O%hgNnR(x6g0JS7AT(9vwoS}24{i%l~8lf zHYHeKWax{VkIjzgB4$qUCXw>MQDW=2sZG(A0bU#siFr(p{Z_(mF|T*0Z~%tg)czj@ zA9vYTE#HSWZZ&C>?v%FeN)z$z@>sn1$6p&o$Ei;P?{` zl#7lfXI2bo+{|0;ye(b-H_ON(z5q{s>gUG>svTXx*u>KJjjD~#=a$poQy->}2a5Q0 zoR|F>fK-x2dae6*(xg~6^kOlC%fl%XBNRrZ4XJXIq{Qw~E znJn$Nvx`7OyOZWOyFi-X6}~_2DgYiuq#Y8PAJcU6Wf^D-7V-Cw!ejGYb12u+d$Khu z4!J*i=+8WyW-i$FD693e4NFgTf?c>5E+qO&NtV7WXX25K)yShx1Kiszje=Zs#u$iS zJedec_oioTy{viESxa-^{VW)j5a;P9s!VV5v~{3SxeBE1nk~VzJ|HHrZBIB{CH(?54^SRNt_tgf>?su_s1c2XYN} zm}5qa?rIRBTum&7Px8u2;<}d(BT>diww@7bDfZn{rS*-?#Atb>x8UHPY&x=3Q(+Nr zHV=Ae)1DqWm8BSqF{q`DG1&A-*)s)G%=CxJX%At2{DVC%%VuuH?R^~jK5T$SoFr|* zgW`VU$EVAIYoDJnNO9q44=ApGAvyCDya6ORzSQVh>#7qIpg*g**g#}&Lez~<{yYFC zO#}W4=og5aiSuuLDc1?7!sBs@a5it(a`2v@ou|48N@lot@Z&QJumOz|L3rq z*CEfdtPr5Yx=ZMjbp1l)@SBpU0m%$?t~ju8y8&QCVB9e*-xOG%bW)4jmr3G20$|38 zrQ?-N8Q&vaLO2`pY8}PWY`Fbik0J0*W(;Bk#%(en?4( zjn0EPD@_5tjh@hieeqT?4|c|d_ohsuKg%wwbLkJdzMtvXsxfH1UDi^#sgH*f!J2e$ zEKCCs&FQoY)$g}=?oMR^lE@|=3O=-r-AL7wcrm*A=B%43$w^f5oknr7S)#es2xH+o zDML*~y<1_U>d}BFFq$*v5z<%B`tVN-j`mXF;v*L5)@Plg5WZOYi8$w|v#jY~&M$Vw zZw3O6{szC>`A%!!?Dgaf5Nk@1!_h*IX#Sf40s_TiYuBT#EDg`;hAIQjT)UT-gPWh* zoV>=d2Mr3Mn6O227Xk2nQ{b z7$2bRg199yotq(De6Y6w2NEey2Ej2RYFz(h(ZCNTG5AHR|I80n?X;wQze+e9iQxdY z86lmI@LI0S!K2@0WDr{h8RXyWy%75>d4(}W29V)9eg+<^NvYHN2(qV(@AeH;2Fu*im< z$8R;>2;FtqHHo|+28|0^b?ji;oF?89Z&k!SadiVq0O>=8rQ`Lnt*@EelT;IoXJE>$ z=ZAo_t5Q_H0HgN>Jww^dSQVIJ*X%8kL@aLrzRKwt`NmdmEDIdWN+!Sr>5RgDCNe}H zK6hkIogss|PJoTE;D)p^&I?Psu2no^r;E;=w{r!T{v*CVH5^hzzy1yq%A4Wz(?jW$ z;P~8FNq_s^S;NG}D-p~p!61H9sKL)8e6+Dan3X8taX{A30MhzASABI$?8Pr0IA-b} zfa-l|;%lko06o~w$YB!?E@s|c+>!u|RkE&HX4?~7Q61p=HtHDCK2PyyXQ>A_d*`X7 z8Xy}%dDDb4H~~kScL+ur3!FZr4s1A$KkRI<1DGQ4#Ymdk|7vH-EsEU*!nd{7PkYor zpCGIC$-fQ23w=s;d~qvaO?w@IV(75rL2EG{McX3L(uS!?N}D~KN~;r7Bm`(ukXGpe z;60-|Vgy(WE)I zn#W?PS*1_`Ai#SdF-rlhNoe$MZ|tPcls0h#0-Nj0u)%|dF4<{X$mFA04jP{A*O;!f zb#;9|rBISe>1+_c-sMLmF5gq!%d4^`l}BG6gi6bd2d&TkEM%Z6DU$Nv4m00J3YNAI z{C*oM4N*hequV*VBrz_kekts1AIZr{v!O~FQj+-l?k+!Z2#fq zOwxSwUR9>I+O?7P*?Zf?^?Qa+WprTD+`8RBS_pT|Y{CpgTw+myMUK|je3QJUY)j7@> zG~Fn@Y4QU5nwH?+JOP;;u+fvL3T7JlN79DtF(LDACf9JXDhF=&U)w+(V z0p1f=rVK5tu%X%K&6}I)T6@6fg|sx_uKMfJ86&79b`X<~Bm9#|q-~D1 zxRXY3~#%Tok0`qR=^7*{$2>sO=YzmG2I@jmsKO)B*_}B65RC>X0mmC+D z@GChexhyNgnl8nrsl^{c#WIs%6@u2JJ>vuLW-e@R+JZ!o9y?!FCF7QRkHOhTTdPlx zTvegJQ|ZsL?)XPF6<#ijUK;&kQTfBe%w_jg3M_1wH0jZYsk;n5JoSK{nt|NUGB!N_ z;ec@%m>3Pi)Gta}7*N_!{KfdyA`I*p>B0A$8rJ%iP~7OKmm1xzn_Da`{)vE>zP6Qr ztMwLaxHVcbIlIiihq}_!=4I`AB-^9Cw!Nk266sfVNHP_4H9Td?m+9LwP_q2`7EF4g zxpFA#%>X#N#V*f-p<32vzuli;4W? zsHd%HE&+M}b#WbN!F69+8Tt|k>RgS=5z2Jx1SsnoZ0gNY+?L~tcnF@&SPSMj5b?>a*1_oFY-k%E;K#guH(05 z`m3A4_)>j3a(o}Vn83o9A2`vH{*RK8+WY$^1LWC7mo*6E;F2s}c@f9nSDin%`Wk6a zBK^%b-@i8uSlUOH-@w@LfNT1e6K_YVow-0|!g6yC`2(4-j#08~`gJe3F+Y`TTOxf9*zimn;YWS6J9 zUsD3>>?uMI8zxNnNuc!%E)1SoZKZvTYIN2!yhDcLSkRL6=?`?7IOo>N9`INT^e8nyh?PR=|Y%+a!RUuL;M% zs*Umi4y%f2?U9^?q_Z!Cg}*@kL~+- z@impDGrQT4jKy<%cUZ(uoie*QV7nLYaPzJ><UfLG)(h7AnT6`peXYmS;MgbA~gu=QSq_gqqI2H-@q>UWdZdszm) z#qkIcku$^BmPvY(Nfpt2m8!)xicEyyb6LqFNu zi!pEMDdS#i#C7WE8Ng?&+<2(<`g0FtA3C836=RP~6WEr1CwJ0lN!e(Uc#()}!f zEegMpLGq67?Alf;H+sY-H@b;Fi)GPOVTuzLFjMulIoFut$^<689#!_SgC>6OXa4u$ zGxDqR&yPZoZ&!?zv8UrQ?|x1xog(0x(JH3Vit6O3JQFDx)l`=K)@fjC;wmoep4$Kq z!CTDdM`rkM?M%*paVZ76o2r{p^ndG|O%1X{Ra}hK`(-}a%NOL@L-I0RdAB*-t);}$ zzed3R#iXy%>VKi?Yn=KT!Tv8Rpr5d(3S?|gT4E;(b_B6Fb-5GB8T8Tqo&J&g_W)3I zG$WQ3d)Y1%dneJ<_-pA%e$apG*@1{bB9Y)h@K%JA40#v{GaRDJ>Ux3cjCnf9Wj_#SyCfv;N zF!mNphl}f!i+esZz_}Gt9+TQI-6X$USp>*TjvH2KoZA8&QhC#bvXNC~~!SqqdkeQH?h91yv+aOW#` zj@oD&Ddz?~7Qmg0QrvNXTT%HY z1v+^ZHm;-=p;LA4>IgHDg5uol!rKjrNRg88P!9wxBCkKJ$YO2e*6rjRKE!oj)_ZEX!Q+kSbIcBgqim% z(HPEIcZTG?IhRbF*1$G6XPoGK7VXV(OH5Zb*&>bOUYRaGZaOkOBRlZpG28NzxbI?e z<9+~t=rlXfse&&LOzDpcge=ByciyxS&a*|N*i7&2HS@KYW6bb8$9lYoIr5bZOz3z< zPHR@GmQntRllfb3e~L~muElTbf-UAi+Fu0R(okwTa%}P!Jno>`Mv%nAKJg%&Ex^4rYbk10*0m?z^;?~BV4V(7C-nUwq zPu8o3>c1OvZ5y4@;u#;x;5&u}EX-|7RhahwUYuvz;(8Yeg;$1#EM0e0d8nyas(=dp EANhYMQ2+n{ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step6.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..94238d709547f2cc9151284e80eb180473ad9b31 GIT binary patch literal 15292 zcmdVBbyQnH7wCHu0t6{;En2L&6)oEk%k;DIO$1 zahKq7!}qOs-(ByIyVm{Vt+(E+m6bEIXZGybIrGb$ot;QsZPk1D5AXp1xTp41Ngn{P zF_+*GC>G}J><6zc<_*v7si_A55OviOOHAYIL8%D1<-(>s?-Yv-#6t7m6tl9G}c85y7L1|p-PhK7f$kf$ce+Edd=M@OeQ zKBXt0BU_tV4v!B;S4Wo?m$o)HJG*{&4<24!U8$<7HcT~_6&9J8n#HyLxb4-xnT+uB z55U949bP{0Dt5~q>a))Kep?|~^l{>Lt=8rJ!m^v2=pRiJ0AK>tl;ofJ%xup&y3R~J zfdAom6BGZ_wm-%49D2dIe|x)l@X=g>to)RNwKz8whr^R5P3Fj@N-ZlBvx@&8lo!yZ zxx5M_TP6YO8>{8D9~o5YbHbG;-f;{-Jl-}L0tUyiY-=BivFd_C!c%Y4woAN~p#pn5V;i6_|?47Yw^10}O)94QNhTY$*oR)V(ldJ2|lMC$V&8Y^04??9MQ-}YoJ4A1hCz6oZTMeNA8`xM5HQW z#}hQ`*BWy9Cle&q_HxWr4g?8GS*cYsxNbERJO? z%)0#?$Mh#BNwKZ+wcKkrm?}|ifi+FGcrPaar7qH60PtC&j9tYg=}fyhIHm6q$FzLR80E+yt-rd+!xF7_6zH^UOYK z!LEQHEnxBCWXV_bnQP6P5$9RSI74Y6(iy7^@Uh}p$pCcGlknF z9~_Anp5{F4_}6kSRyqX$yI$5YUiTHITOoQtF-D0I{wH>iX+evVJn(+M`e(^2|Bm2Q zRltxaIWtKW*F&qKP@tXv0bqk8(22a49$=D4N(+iEGdJv%9NWRgZnX!T+P$HuzheL& zzY^@9|750(3qN0*i{bq}-8x2!vr@pQ8_<@b9|tcVMUxc0>dyMgsKV-S_w^XRIo&zIm@o{vlXf2K@hEm+VZs z^`NnMz-SwFP?c^$IHE2|-8IN_k}Now!{OWY?p(7T^WhK9$~m5psL z^;&$xZQ|El6B2Aq(F<&)g?$>y;m3Bybla+o1B$?LM zUyx5|g|?b> z^M_^qPHh6RgYM^Hj}VUGh<=+&Kw*|tV9&nTu4Fo#b79!x8&5caa)tG#Xx%%}@Ht4z zu{Ts1IS|PDRg(JKb-9!4)2N%1)zWV*WD0)<-kRzKT%>&Ncp$!zFTz9JA=H!wbnKsh zzFy;{depzaDF2r6a(LnD&_5L@dkQ<>+w1RNAV??$6fBNf1wE5as6Rvs^dgz_`V*Ax zgEb8LMzr8_o8cUvvM87Iz5?3A(LKfbT;`;&t~YyY3zE35h64TEOQ4PyCytnO2mH27RTV6ez+p+#5l;dL8o=wmd_KsG(rp}+P{)0&d= zBNc`wdq4I{7CTLY@#8Lg7P&>)1>|EYvU@_uxzE=F*tq9^yTnA?t9%udLL96%(j5dLC$Bne(~ltv%boJ*W5)|B2e?U&r5#h z-T)8kC(v-e$bNLR7H8r%{s&K!MEgrTHz_>ZzkkE1z?vS0a+kI$pV}_Nb>WE@yYFzw zxs1=v!rqBE_A(*vJ?#9%$*ETN)&M@&_}(bikz1~So-K z*Q^Z}^MJd{PVrR=`-qzmh!!zvkfVNrv-$y+mbc7N;@@8*`ZNrlfNH;SsT|w%cor7b z=m`H#-+74GVdCo6FJLzuQmXvE|dv7SaH(mdGg7rl| z0bPIJNyw*J$nN{?roCEaC!yOI+`sB#%Pv*Y8lKtumZg%y5yl&(YxSB(r!h6%0Dr$n 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 E0EYLJng9R* literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step7.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step7.png new file mode 100644 index 0000000000000000000000000000000000000000..c7596e5a5642663f29c0d1abf2fcafcffb948b4f GIT binary patch literal 15533 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 E0bt2?$N&HU literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step8.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step8.png new file mode 100644 index 0000000000000000000000000000000000000000..292ff249e27e4928a95f0027716b202b8fc0c0ff GIT binary patch literal 16081 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 TQO~pX{?#fgs6VQZLxuidoH*ef literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step9.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step9.png new file mode 100644 index 0000000000000000000000000000000000000000..3fa0dba95f4ab253c1d5d6036fd907165d3fcf77 GIT binary patch literal 15803 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_example.png b/ru/docs/chapter_dynamic_programming/knapsack_problem.assets/knapsack_example.png new file mode 100644 index 0000000000000000000000000000000000000000..9fb448fc3c2783df90c3ab8e9683d3f9c7c42b57 GIT binary patch literal 16345 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


      G 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 bqTHbOOmLn#WN*&@C4DWUBwh5vB=~;-=6#Tw literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/knapsack_problem.md b/ru/docs/chapter_dynamic_programming/knapsack_problem.md new file mode 100644 index 000000000..d02945147 --- /dev/null +++ b/ru/docs/chapter_dynamic_programming/knapsack_problem.md @@ -0,0 +1,168 @@ +# Задача о рюкзаке 0-1 + +Задача о рюкзаке - это очень хороший вводный пример для динамического программирования и одна из самых типичных форм задач этого класса. У нее существует множество вариантов, например задача о рюкзаке 0-1, задача о полном рюкзаке, задача о многократном рюкзаке и т.д. + +В этом разделе сначала разберем самый распространенный вариант - задачу о рюкзаке 0-1. + +!!! question + + Даны $n$ предметов. Вес $i$-го предмета равен $wgt[i-1]$ , стоимость равна $val[i-1]$ . Также дан рюкзак вместимости $cap$ . Каждый предмет можно выбрать только один раз. Найдите максимальную суммарную стоимость, которую можно поместить в рюкзак при заданной вместимости. + +Как видно на рисунке ниже, поскольку номер предмета $i$ начинается с $1$ , а индексы массива начинаются с $0$ , предмету $i$ соответствуют вес $wgt[i-1]$ и стоимость $val[i-1]$ . + +![Пример данных для задачи о рюкзаке 0-1](knapsack_problem.assets/knapsack_example.png) + +На задачу о рюкзаке 0-1 можно смотреть как на процесс из $n$ раундов решений: для каждого предмета есть два решения - не класть его в рюкзак или положить в рюкзак. Поэтому задача удовлетворяет модели дерева решений. + +Цель задачи - найти "максимальную суммарную стоимость при ограниченной вместимости рюкзака", значит, с большой вероятностью это задача динамического программирования. + +**Шаг 1: продумать решения на каждом раунде, определить состояние и тем самым получить таблицу $dp$** + +Для каждого предмета возможны два случая: не класть его в рюкзак, тогда вместимость не меняется; или положить его в рюкзак, тогда оставшаяся вместимость уменьшается. Отсюда получается определение состояния: текущий номер предмета $i$ и текущая вместимость рюкзака $c$ , то есть состояние обозначается как $[i, c]$ . + +Подзадача, соответствующая состоянию $[i, c]$ , такова: **максимальная стоимость, которую можно получить, используя первые $i$ предметов и рюкзак вместимости $c$**. Ее решение обозначается через $dp[i, c]$ . + +Искомым значением является $dp[n, cap]$ , значит, нам нужна двумерная таблица $dp$ размера $(n+1) \times (cap+1)$ . + +**Шаг 2: найти оптимальную подструктуру и на ее основе вывести уравнение перехода состояния** + +После того как мы принимаем решение по предмету $i$ , остается подзадача, связанная с первыми $i-1$ предметами. Здесь возможны два случая. + +- **Не класть предмет $i$** : вместимость рюкзака не меняется, и состояние переходит в $[i-1, c]$ . +- **Положить предмет $i$** : вместимость рюкзака уменьшается на $wgt[i-1]$ , а стоимость увеличивается на $val[i-1]$ , и состояние переходит в $[i-1, c-wgt[i-1]]$ . + +Этот анализ и раскрывает оптимальную подструктуру задачи: **максимальная стоимость $dp[i, c]$ равна лучшему из двух вариантов - не брать предмет $i$ или взять предмет $i$**. Отсюда получается уравнение перехода состояния: + +$$ +dp[i, c] = \max(dp[i-1, c], dp[i-1, c - wgt[i-1]] + val[i-1]) +$$ + +Нужно учитывать, что если вес текущего предмета $wgt[i - 1]$ превышает оставшуюся вместимость $c$ , то предмет можно только не брать. + +**Шаг 3: определить граничные условия и порядок переходов** + +Когда предметов нет или вместимость рюкзака равна $0$ , максимальная стоимость равна $0$ ; то есть весь первый столбец $dp[i, 0]$ и вся первая строка $dp[0, c]$ заполняются нулями. + +Текущее состояние $[i, c]$ зависит от состояния сверху $[i-1, c]$ и состояния слева сверху $[i-1, c-wgt[i-1]]$ , поэтому достаточно двумя вложенными циклами пройти по всей таблице $dp$ в прямом порядке. + +После этого анализа реализуем по порядку: полный перебор, поиск с мемоизацией и динамическое программирование. + +### Метод 1: полный перебор + +Код поиска содержит следующие элементы. + +- **Параметры рекурсии**: состояние $[i, c]$ . +- **Возвращаемое значение**: решение подзадачи $dp[i, c]$ . +- **Условие завершения**: когда номер предмета выходит за границу, то есть $i = 0$ , или оставшаяся вместимость равна $0$ , рекурсия завершается и возвращается стоимость $0$ . +- **Обрезка**: если вес текущего предмета превышает оставшуюся вместимость рюкзака, то можно только не класть этот предмет. + +```src +[file]{knapsack}-[class]{}-[func]{knapsack_dfs} +``` + +Как показано на рисунке ниже, поскольку каждый предмет создает две ветви поиска - "не брать" и "брать", временная сложность равна $O(2^n)$ . + +Посмотрев на дерево рекурсии, легко заметить наличие перекрывающихся подзадач, например $dp[1, 10]$ и подобных. Когда число предметов растет, вместимость рюкзака велика, а особенно когда много предметов с одинаковым весом, количество перекрывающихся подзадач быстро увеличивается. + +![Дерево полного перебора для задачи о рюкзаке 0-1](knapsack_problem.assets/knapsack_dfs.png) + +### Метод 2: поиск с мемоизацией + +Чтобы каждая перекрывающаяся подзадача вычислялась только один раз, используем таблицу памяти `mem` для хранения решений подзадач, где `mem[i][c]` соответствует $dp[i, c]$ . + +После введения мемоизации **временная сложность определяется числом подзадач** , то есть равна $O(n \times cap)$ . Код выглядит так: + +```src +[file]{knapsack}-[class]{}-[func]{knapsack_dfs_mem} +``` + +На рисунке ниже показаны ветви поиска, которые были отсечены благодаря мемоизации. + +![Дерево поиска с мемоизацией для задачи о рюкзаке 0-1](knapsack_problem.assets/knapsack_dfs_mem.png) + +### Метод 3: динамическое программирование + +По своей сути динамическое программирование здесь - это процесс последовательного заполнения таблицы $dp$ в соответствии с переходами состояний. Код приведен ниже: + +```src +[file]{knapsack}-[class]{}-[func]{knapsack_dp} +``` + +Как показано на рисунке ниже, и временная сложность, и пространственная сложность определяются размером массива `dp` , то есть равны $O(n \times cap)$ . + +=== "<1>" + ![Процесс динамического программирования для задачи о рюкзаке 0-1](knapsack_problem.assets/knapsack_dp_step1.png) + +=== "<2>" + ![knapsack_dp_step2](knapsack_problem.assets/knapsack_dp_step2.png) + +=== "<3>" + ![knapsack_dp_step3](knapsack_problem.assets/knapsack_dp_step3.png) + +=== "<4>" + ![knapsack_dp_step4](knapsack_problem.assets/knapsack_dp_step4.png) + +=== "<5>" + ![knapsack_dp_step5](knapsack_problem.assets/knapsack_dp_step5.png) + +=== "<6>" + ![knapsack_dp_step6](knapsack_problem.assets/knapsack_dp_step6.png) + +=== "<7>" + ![knapsack_dp_step7](knapsack_problem.assets/knapsack_dp_step7.png) + +=== "<8>" + ![knapsack_dp_step8](knapsack_problem.assets/knapsack_dp_step8.png) + +=== "<9>" + ![knapsack_dp_step9](knapsack_problem.assets/knapsack_dp_step9.png) + +=== "<10>" + ![knapsack_dp_step10](knapsack_problem.assets/knapsack_dp_step10.png) + +=== "<11>" + ![knapsack_dp_step11](knapsack_problem.assets/knapsack_dp_step11.png) + +=== "<12>" + ![knapsack_dp_step12](knapsack_problem.assets/knapsack_dp_step12.png) + +=== "<13>" + ![knapsack_dp_step13](knapsack_problem.assets/knapsack_dp_step13.png) + +=== "<14>" + ![knapsack_dp_step14](knapsack_problem.assets/knapsack_dp_step14.png) + +### Оптимизация пространства + +Поскольку каждое состояние зависит только от состояния в предыдущей строке, можно использовать два массива, которые будут "перекатываться" вперед, и тем самым уменьшить пространственную сложность с $O(n^2)$ до $O(n)$ . + +Если пойти дальше, можно спросить: можно ли оптимизировать память так, чтобы использовать только один массив? Наблюдение показывает, что каждое состояние зависит от клетки прямо сверху и клетки слева сверху. Предположим, что у нас есть только один массив, и в момент начала обхода строки $i$ он еще хранит состояния строки $i-1$ . + +- Если обходить массив слева направо, то к моменту вычисления $dp[i, j]$ значения слева сверху $dp[i-1, 1]$ ~ $dp[i-1, j-1]$ могут уже быть перезаписаны, и правильный результат перехода состояния получить не удастся. +- Если же обходить массив справа налево, проблема перезаписи не возникает, и переход состояния вычисляется корректно. + +На рисунке ниже показан процесс перехода от строки $i = 1$ к строке $i = 2$ при использовании одного массива. Попробуйте сопоставить его с разницей между прямым и обратным обходом. + +=== "<1>" + ![Процесс динамического программирования после оптимизации памяти для рюкзака 0-1](knapsack_problem.assets/knapsack_dp_comp_step1.png) + +=== "<2>" + ![knapsack_dp_comp_step2](knapsack_problem.assets/knapsack_dp_comp_step2.png) + +=== "<3>" + ![knapsack_dp_comp_step3](knapsack_problem.assets/knapsack_dp_comp_step3.png) + +=== "<4>" + ![knapsack_dp_comp_step4](knapsack_problem.assets/knapsack_dp_comp_step4.png) + +=== "<5>" + ![knapsack_dp_comp_step5](knapsack_problem.assets/knapsack_dp_comp_step5.png) + +=== "<6>" + ![knapsack_dp_comp_step6](knapsack_problem.assets/knapsack_dp_comp_step6.png) + +В коде для этого достаточно удалить первое измерение массива `dp` , а внутренний цикл заменить на обратный обход: + +```src +[file]{knapsack}-[class]{}-[func]{knapsack_dp_comp} +``` diff --git a/ru/docs/chapter_dynamic_programming/summary.md b/ru/docs/chapter_dynamic_programming/summary.md new file mode 100644 index 000000000..be4c09c40 --- /dev/null +++ b/ru/docs/chapter_dynamic_programming/summary.md @@ -0,0 +1,25 @@ +# Резюме + +### Ключевые выводы + +- Динамическое программирование раскладывает задачу на подзадачи и повышает вычислительную эффективность за счет хранения решений этих подзадач и устранения повторных вычислений. +- Если не учитывать затраты времени, то любую задачу динамического программирования можно решить с помощью backtracking (полного перебора), однако в дереве рекурсии возникает множество перекрывающихся подзадач, из-за чего эффективность крайне низка. После введения таблицы памяти можно хранить решения всех уже вычисленных подзадач и гарантировать, что каждая перекрывающаяся подзадача будет вычисляться только один раз. +- Поиск с мемоизацией - это рекурсивный метод "сверху вниз", а соответствующее ему динамическое программирование - это итеративный метод "снизу вверх", похожий на заполнение таблицы. Поскольку текущее состояние обычно зависит только от части локальных состояний, можно убрать одно измерение таблицы $dp$ и тем самым снизить пространственную сложность. +- Разложение на подзадачи - это общий алгоритмический подход, но в divide and conquer, динамическом программировании и backtracking он имеет разные свойства. +- Для задач динамического программирования характерны три главных свойства: перекрывающиеся подзадачи, оптимальная подструктура и отсутствие последствий. +- Если оптимальное решение исходной задачи можно построить из оптимальных решений подзадач, то задача обладает оптимальной подструктурой. +- Отсутствие последствий означает, что для данного состояния его дальнейшее развитие определяется только этим состоянием и не зависит от всех прошлых состояний. Многие задачи комбинаторной оптимизации этим свойством не обладают и потому не могут эффективно решаться с помощью динамического программирования. + +**Задачи о рюкзаке** + +- Задача о рюкзаке - один из самых типичных классов задач динамического программирования; она включает варианты 0-1 рюкзака, полного рюкзака, многократного рюкзака и другие. +- В задаче о рюкзаке 0-1 состояние определяется как максимальная стоимость первых $i$ предметов в рюкзаке вместимости $c$ . Рассматривая два решения - не брать предмет и брать предмет, - можно получить оптимальную подструктуру и вывести уравнение перехода состояния. При оптимизации памяти, поскольку каждое состояние зависит от значения сверху и слева сверху, внутренний цикл нужно выполнять в обратном порядке, чтобы не перезаписать нужное значение. +- В задаче о полном рюкзаке число экземпляров каждого предмета не ограничено, поэтому при выборе предмета переход состояния отличается от варианта 0-1. Поскольку состояние зависит от значения сверху и слева, после оптимизации памяти внутренний цикл следует выполнять в прямом порядке. +- Задача о размене монет - это вариант задачи о полном рюкзаке. Здесь вместо "максимальной стоимости" ищется "минимальное число монет", поэтому в уравнении перехода $\max()$ заменяется на $\min()$ . Кроме того, вместо условия "не превышать вместимость рюкзака" нужно **ровно** набрать целевую сумму, поэтому значение $amt + 1$ используется как обозначение недопустимого решения "сумму набрать нельзя". +- В задаче о размене монет II вместо "минимального числа монет" требуется найти "число комбинаций монет", поэтому в уравнении перехода оператор $\min()$ заменяется на суммирование. + +**Задача о расстоянии редактирования** + +- Расстояние редактирования (расстояние Левенштейна) используется для измерения сходства двух строк и определяется как минимальное число операций редактирования, необходимых для преобразования одной строки в другую; допустимые операции - вставка, удаление и замена. +- В задаче о расстоянии редактирования состояние определяется как минимальное число шагов редактирования, необходимых для преобразования первых $i$ символов строки $s$ в первые $j$ символов строки $t$ . Если $s[i] \ne t[j]$ , то существуют три решения: вставка, удаление и замена, и каждому из них соответствует своя остаточная подзадача. На этой основе выводятся оптимальная подструктура и уравнение перехода состояния. Если же $s[i] = t[j]$ , то редактировать текущий символ не нужно. +- В задаче о расстоянии редактирования состояние зависит от значений сверху, слева и слева сверху. Поэтому после оптимизации памяти ни прямой, ни обратный обход сам по себе не дает корректного перехода состояния. Для решения этой проблемы значение слева сверху временно сохраняется в отдельной переменной, что делает ситуацию эквивалентной задаче о полном рюкзаке и позволяет использовать прямой обход. diff --git a/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step1.png b/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..69dd3c79e77dde019fb83a450b36ff62a67dcf0d GIT binary patch literal 14318 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step12.png b/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step12.png new file mode 100644 index 0000000000000000000000000000000000000000..d817e2ce213d84cb84cd1cca7d67fb436b80f34b GIT binary patch literal 14483 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 aLn^zm!IF;}aU1^Ct14+dD7%Mx@qYjhZL?MY literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step13.png b/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step13.png new file mode 100644 index 0000000000000000000000000000000000000000..9a4656660844172f36c7c9a14175e7bcdadc824c GIT binary patch literal 15518 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 NLq+$|S0(t%{{aUZ?Xmy> literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step14.png b/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step14.png new file mode 100644 index 0000000000000000000000000000000000000000..59bec0d902ee577a7f53c9e9f087df173e448447 GIT binary patch literal 15151 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step15.png b/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step15.png new file mode 100644 index 0000000000000000000000000000000000000000..3bbf0b3730065fa304d65ea488fc44d989ab206c GIT binary patch literal 13707 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 OswinFmOZg}|Nj7i*L5!d literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step2.png b/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..08aeaf4a51ae71e43f2af9aba490a42a7d11c956 GIT binary patch literal 15044 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 Un0&RjHvbe=m9!Mg9wJ`;56XLbrT_o{ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step5.png b/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step5.png new file mode 100644 index 0000000000000000000000000000000000000000..df5c40a673df0a4a5bdc4b2156aa30575aac7cc7 GIT binary patch literal 15468 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 Oc2`~RPN^E|$^Qj?f20)v literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step6.png b/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..ad578830e68bebb92c454a4e2c1019cfb7dbcc9c GIT binary patch literal 15376 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 W)bt;V`xDn&HZ|qP56cx1VgC!wM@LQo literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step7.png b/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step7.png new file mode 100644 index 0000000000000000000000000000000000000000..a954ea2c9bfa80ad145b72bd786f15a023ec4250 GIT binary patch literal 14847 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 EUk^22a{vGU literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step8.png b/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step8.png new file mode 100644 index 0000000000000000000000000000000000000000..c726d6dcfde3de719a10c2f6a6c422e7593c74b4 GIT binary patch literal 15288 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 AKmY&$ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_example.png b/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_example.png new file mode 100644 index 0000000000000000000000000000000000000000..b0fbad560ae649d008e79b6778ecf2f8fc23c5fe GIT binary patch literal 11714 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 R;`UeKbTkcbmRv`M{}zd_pFRKE!T#c{;P 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step2.png b/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..fc5450a3aa831de3279111a2bfa70a6200994af4 GIT binary patch literal 16614 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%0Du1&xIO{nu}}K|;S;lMly?|yzTi4? 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 KPs$Zx5&sv%vP|g! literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step4.png b/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6ffcd67c830f7c7d75296bc2dc88f7bbd17a7b GIT binary patch literal 16587 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step6.png b/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..49441c8aacf9ed264e9e23939a027767d3d242d4 GIT binary patch literal 16394 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.md b/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.md new file mode 100644 index 000000000..4a2ec53ec --- /dev/null +++ b/ru/docs/chapter_dynamic_programming/unbounded_knapsack_problem.md @@ -0,0 +1,207 @@ +# Задача о полном рюкзаке + +В этом разделе сначала решим еще один распространенный вариант задачи о рюкзаке - полный рюкзак, а затем рассмотрим одну из его типичных специальных форм: задачу о размене монет. + +## Задача о полном рюкзаке + +!!! question + + Даны $n$ предметов. Вес $i$-го предмета равен $wgt[i-1]$ , стоимость равна $val[i-1]$ . Также дан рюкзак вместимости $cap$ . **Каждый предмет можно выбирать многократно**. Найдите максимальную суммарную стоимость, которую можно поместить в рюкзак при заданной вместимости. Пример показан на рисунке ниже. + +![Пример данных для задачи о полном рюкзаке](unbounded_knapsack_problem.assets/unbounded_knapsack_example.png) + +### Идея динамического программирования + +Задача о полном рюкзаке очень похожа на задачу о рюкзаке 0-1; **разница состоит только в том, что число выборов каждого предмета не ограничено**. + +- В задаче о рюкзаке 0-1 каждого предмета существует только один экземпляр, поэтому после того как предмет $i$ помещен в рюкзак, выбирать можно только из первых $i-1$ предметов. +- В задаче о полном рюкзаке число экземпляров каждого предмета бесконечно, поэтому после того как предмет $i$ помещен в рюкзак, **выбирать все еще можно из первых $i$ предметов**. + +При этом состояние $[i, c]$ в задаче о полном рюкзаке может изменяться двумя способами. + +- **Не брать предмет $i$** : как и в задаче о рюкзаке 0-1, переход осуществляется в $[i-1, c]$ . +- **Взять предмет $i$** : в отличие от рюкзака 0-1 переход происходит в $[i, c-wgt[i-1]]$ . + +Следовательно, уравнение перехода состояния принимает вид: + +$$ +dp[i, c] = \max(dp[i-1, c], dp[i, c - wgt[i-1]] + val[i-1]) +$$ + +### Реализация кода + +Если сравнить код этой задачи с кодом задачи о рюкзаке 0-1, то окажется, что в переходе состояний меняется только одна деталь: вместо $i-1$ появляется $i$ ; все остальное остается таким же: + +```src +[file]{unbounded_knapsack}-[class]{}-[func]{unbounded_knapsack_dp} +``` + +### Оптимизация пространства + +Поскольку текущее состояние переходит из состояния слева и состояния сверху, **после оптимизации памяти каждую строку таблицы $dp$ нужно обходить слева направо**. + +Этот порядок обхода как раз противоположен задаче о рюкзаке 0-1. Разницу удобно понять по рисунку ниже. + +=== "<1>" + ![Процесс динамического программирования после оптимизации памяти для полного рюкзака](unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step1.png) + +=== "<2>" + ![unbounded_knapsack_dp_comp_step2](unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step2.png) + +=== "<3>" + ![unbounded_knapsack_dp_comp_step3](unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step3.png) + +=== "<4>" + ![unbounded_knapsack_dp_comp_step4](unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step4.png) + +=== "<5>" + ![unbounded_knapsack_dp_comp_step5](unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step5.png) + +=== "<6>" + ![unbounded_knapsack_dp_comp_step6](unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step6.png) + +Код реализации здесь довольно прост: достаточно просто убрать первое измерение массива `dp` : + +```src +[file]{unbounded_knapsack}-[class]{}-[func]{unbounded_knapsack_dp_comp} +``` + +## Задача о размене монет + +Задача о рюкзаке представляет собой целый класс задач динамического программирования, у которого есть множество вариантов, и одной из таких вариаций является задача о размене монет. + +!!! question + + Даны $n$ видов монет, номинал монеты $i$ равен $coins[i - 1]$ , а целевая сумма равна $amt$ . **Монеты каждого вида можно брать многократно**. Требуется найти минимальное число монет, которыми можно набрать целевую сумму. Если набрать сумму невозможно, верните $-1$ . Пример показан на рисунке ниже. + +![Пример данных для задачи о размене монет](unbounded_knapsack_problem.assets/coin_change_example.png) + +### Идея динамического программирования + +**Задачу о размене монет можно рассматривать как частный случай задачи о полном рюкзаке** ; между ними существует следующая связь и следующие различия. + +- Эти две задачи можно взаимно переводить друг в друга: "предмет" соответствует "монете", "вес предмета" соответствует "номиналу монеты", а "вместимость рюкзака" соответствует "целевой сумме". +- Цель оптимизации противоположна: в задаче о полном рюкзаке нужно максимизировать стоимость предметов, а в задаче о размене монет - минимизировать число монет. +- В задаче о полном рюкзаке ищется решение, не превышающее вместимость, а в задаче о размене монет требуется **ровно** набрать целевую сумму. + +**Шаг 1: продумать решения на каждом раунде, определить состояние и тем самым получить таблицу $dp$** + +Подзадача, соответствующая состоянию $[i, a]$ , выглядит так: **минимальное число монет из первых $i$ видов, которыми можно набрать сумму $a$**. Решение этой подзадачи обозначается как $dp[i, a]$ . + +Размер двумерной таблицы $dp$ равен $(n+1) \times (amt+1)$ . + +**Шаг 2: найти оптимальную подструктуру и на ее основе вывести уравнение перехода состояния** + +По сравнению с задачей о полном рюкзаке здесь есть два отличия в уравнении перехода состояния. + +- Нужно искать минимум, а не максимум, поэтому оператор $\max()$ заменяется на $\min()$ . +- Оптимизируемое значение - это число монет, а не суммарная стоимость, поэтому при выборе монеты нужно просто прибавить $1$ . + +$$ +dp[i, a] = \min(dp[i-1, a], dp[i, a - coins[i-1]] + 1) +$$ + +**Шаг 3: определить граничные условия и порядок переходов** + +Когда целевая сумма равна $0$ , минимальное число монет для ее набора равно $0$ , то есть весь первый столбец $dp[i, 0]$ заполняется нулями. + +Когда монет нет, **невозможно набрать никакую целевую сумму $> 0$** ; это и есть недопустимое решение. Чтобы функция $\min()$ в уравнении перехода состояния могла распознавать и отбрасывать такие недопустимые решения, удобно использовать значение $+ \infty$ ; то есть всю первую строку $dp[0, a]$ нужно инициализировать значением $+ \infty$ . + +### Реализация кода + +Большинство языков программирования не предоставляет готовую переменную $+ \infty$ для целых чисел, поэтому обычно приходится заменять ее на максимальное значение типа `int` . Но тогда возникает риск переполнения: операция $+ 1$ в уравнении перехода может переполнить большое число. + +Поэтому здесь мы используем число $amt + 1$ как обозначение недопустимого решения, потому что для набора суммы $amt$ максимум нужно не больше чем $amt$ монет. Перед возвратом результата проверяем, равно ли $dp[n, amt]$ значению $amt + 1$ ; если да, то возвращаем $-1$ , что означает невозможность набрать целевую сумму. Код приведен ниже: + +```src +[file]{coin_change}-[class]{}-[func]{coin_change_dp} +``` + +Как показано на рисунке ниже, процесс динамического программирования для задачи о размене монет очень похож на задачу о полном рюкзаке. + +=== "<1>" + ![Процесс динамического программирования для задачи о размене монет](unbounded_knapsack_problem.assets/coin_change_dp_step1.png) + +=== "<2>" + ![coin_change_dp_step2](unbounded_knapsack_problem.assets/coin_change_dp_step2.png) + +=== "<3>" + ![coin_change_dp_step3](unbounded_knapsack_problem.assets/coin_change_dp_step3.png) + +=== "<4>" + ![coin_change_dp_step4](unbounded_knapsack_problem.assets/coin_change_dp_step4.png) + +=== "<5>" + ![coin_change_dp_step5](unbounded_knapsack_problem.assets/coin_change_dp_step5.png) + +=== "<6>" + ![coin_change_dp_step6](unbounded_knapsack_problem.assets/coin_change_dp_step6.png) + +=== "<7>" + ![coin_change_dp_step7](unbounded_knapsack_problem.assets/coin_change_dp_step7.png) + +=== "<8>" + ![coin_change_dp_step8](unbounded_knapsack_problem.assets/coin_change_dp_step8.png) + +=== "<9>" + ![coin_change_dp_step9](unbounded_knapsack_problem.assets/coin_change_dp_step9.png) + +=== "<10>" + ![coin_change_dp_step10](unbounded_knapsack_problem.assets/coin_change_dp_step10.png) + +=== "<11>" + ![coin_change_dp_step11](unbounded_knapsack_problem.assets/coin_change_dp_step11.png) + +=== "<12>" + ![coin_change_dp_step12](unbounded_knapsack_problem.assets/coin_change_dp_step12.png) + +=== "<13>" + ![coin_change_dp_step13](unbounded_knapsack_problem.assets/coin_change_dp_step13.png) + +=== "<14>" + ![coin_change_dp_step14](unbounded_knapsack_problem.assets/coin_change_dp_step14.png) + +=== "<15>" + ![coin_change_dp_step15](unbounded_knapsack_problem.assets/coin_change_dp_step15.png) + +### Оптимизация пространства + +Оптимизация пространства для задачи о размене монет выполняется так же, как и для полного рюкзака: + +```src +[file]{coin_change}-[class]{}-[func]{coin_change_dp_comp} +``` + +## Задача о размене монет II + +!!! question + + Даны $n$ видов монет, номинал монеты $i$ равен $coins[i - 1]$ , а целевая сумма равна $amt$ . Монеты каждого вида можно брать многократно. **Найдите число различных комбинаций монет, которыми можно набрать целевую сумму**. Пример показан на рисунке ниже. + +![Пример данных для задачи о размене монет II](unbounded_knapsack_problem.assets/coin_change_ii_example.png) + +### Идея динамического программирования + +По сравнению с предыдущей задачей теперь целью является число комбинаций. Поэтому подзадача меняется на следующую: **число комбинаций из первых $i$ видов монет, которыми можно набрать сумму $a$**. При этом таблица $dp$ по-прежнему остается двумерной матрицей размера $(n+1) \times (amt + 1)$ . + +Число комбинаций для текущего состояния равно сумме числа комбинаций для двух решений: не брать текущую монету и брать текущую монету. Поэтому уравнение перехода состояния принимает вид: + +$$ +dp[i, a] = dp[i-1, a] + dp[i, a - coins[i-1]] +$$ + +Когда целевая сумма равна $0$ , ее можно набрать, не выбирая ни одной монеты, поэтому весь первый столбец $dp[i, 0]$ нужно инициализировать единицами. Когда монет нет, невозможно набрать никакую сумму $>0$ , поэтому вся первая строка $dp[0, a]$ должна быть заполнена нулями. + +### Реализация кода + +```src +[file]{coin_change_ii}-[class]{}-[func]{coin_change_ii_dp} +``` + +### Оптимизация пространства + +При оптимизации памяти способ остается тем же самым: достаточно убрать измерение, отвечающее за виды монет: + +```src +[file]{coin_change_ii}-[class]{}-[func]{coin_change_ii_dp_comp} +``` diff --git a/ru/docs/chapter_graph/graph.assets/adjacency_list.png b/ru/docs/chapter_graph/graph.assets/adjacency_list.png new file mode 100644 index 0000000000000000000000000000000000000000..86984a3e1dd3bf19cbf6a74affb5619a794642db GIT binary patch literal 15210 zcmc(FWl&r}v*_7f7I*jH5S-w_-3buf3GNUiK#(O^aQ7e~Sn%M^0s(?UfZ${a?gV!p zx!=8Yf4zUN>P^+DnKRvex~HdmrccjAYN#tJZ$jC_e68z8MYIk>c!N_ObOdT;Xv4zEjqT(VuJ3H@EuL5lw_r}eHQj} z)Lu~-5K9hwlg-=64E}I@gJpQ z;h&aND4lq$w9k;uPJE&~u+c7V^N2K->1ad=W#~=IV6*8bs~vF~)Qh~} z9v{EgMtKAiUbwi_9}CEHMsX+3D@EibL+(9iT`qdL+s<>6m+m;p$k6OAw{K8Ul}_&W zqC;U=V#^}!)Aq{u3d{pR<%wEiWFLm<&&_yEFB=pjzIIZjoGJ&rU9Za>bGkRv4nkl` z#9A5QeidBa4%lIEyws=s`VuT%i`-&(#Edk3A{@)B@V=yL#!MO%(O=+of3C%>R;0S| zXQ4)h@ol8-?h+EK#K#n8F}8dx{=Bz8X*EMW>D6;3!WeUgr*-9aT$?Cog7y~azU$;I z^@s893rC1?%py`>a-$ua$$9OSVZ580tu<+mWviU)X7eJDJ-lSp3O8?4&@*YpLJCEq z=a^7qH#glu5}Z4V%#3@9QI2S5XvlR8*9v-6W=P$iPfp34l_-5Iw_|ST?8Ug|{^;~+ z7$+LWSf_x-K}*BHHVrv2XU|V#{4MzFz%1i7NEhyP@ah{UQ_F7tG|mtaS@r3-73wU$ ziu>osm!bq;Llj$rP8U#p>@HY7@1deblFJ&z7qIF(r=AHdbhS~K2q%$O!u+yZLf*c6 z$6R)vH@|AMYdhdCus}}0{V|1Vj&<%(^Mpo+n}Ox4U&rJtR3T9j(RbupY^oR;>7#yY zuZpkuXOtNb2N^IaEB5^5FQIfa3_{wCoUuslolZ-;k;WxczP$91-BBu&T7S|^IxACT zzQjmOy9-6+&_VJ-y~iuTOq6hN)nz?@#KoZpd;SP$xk>5=4&-23mm7t>Gm{?$lg=9Z z>YnBkBx^hqA`PDXSQs6v2#;EqG04}T)CX}Dur?nl>zw=|i%M>iBJy`GLqutJqk%#c zUqgQ@f400-B*I+Nj`3P3Rg~1rby%NySGB?d9ugz*cs5~gEEJpjh{Hd3gcBvd)ZY3$ z+9^G*1t$ZSJ8q;L(lTy&Y3IUBMGd1LE0f{7365aEQ~nna=x?D~Tt z*7W(J8rbx=FJc_e_o*8a$MJB9GblST9(5ZddGyy#Lh_abzLDF+(ERidcy=&J<>mtV zUmr&7t=&S#KotqAnb&LY#*ivB;8ApVJ)~5Y-^b17qW=bR);bKM>#HAq-uUh;N+ZKJ zqN8UUPoKXgf{JRX*RiD-{W+V9O_~N_t_pXXnOV*`ZVVCZh^n64`{Q6s{R}d&9 zT$=to!e1}Ro2yr4=Ox3i?&+#gX47T|!)%2P76n;mmF&r5?@fC*`NPYM+I$9;Jrfbp zLu4@aAqV0|JCqXLt`&Q*C!h^i!okYZF8v54HpWS>V6vz_Jow4{okZ$~mp4XZWcUg3 zR80-V3FgD4f2S%;?xo0hohmQefzH*3i|wnOt=3CbBGD(lAvoD`* z=+G*e$V+CYr;W+d<+m%_izrfn)MjZp@;y&Ub44uZ>3zSsbddIM^PVjVoO)|#SQJR=|pzOK)PClmFz``Vu zOL_trMfbtmEZX4JJW={s*eYcVT@;s*cU20NIo+psva)K!x4*3-3#pUtvl3neMo~+7 zHJ?;5E<1aXK741<<){y$XgXoPO5NdQpi~ZfO+Cm}`Xp6kydcqQ6kcRoq(lyk?;+J-L`PMQNQ!LQ}rwl#PUT_^$b6_4FL1 zM?0mnKV*SB#$Da@AxI{SoT<$p>s{iokui!qLg$2ngsxn>6CLE6mSk{p$7Wt6!~OU# z?)aZ_W#jg$gKXN=%?6=q=UZq0)&YSxcdBmV%vsNkOC8+f^mz7TX?cAg9+F&MTxPJg z5APiZ;B%4SG+^QXWud1X$oqU-O?e%cF)kSLivP*PFo4z=T zm{f&*K!5pzIx~WcjM!~lWF7;hC+B!ou@zRO=M@rMXQG(w_$|LGjZf$#T6c6S$x2I7 z@Z^;)Z9C=*%~n{Yp^*F33ZWMMthCf(V$dJ^rXj|`LRh7PQ}CEh<*q*nVn{WALBHru7&$*+)jb&@m;1JJ^A|`mw zx8q%JubuqOtHi}ZI41h`?%ttVp=3}TEV*;{ZikDczA~OKaGe+@zmD15p)M(@cat$6)7opENyb5zwuXHqFFBJ}07yE^< zQiCt`pRu_sBz?5O*!FALNf+|SRzccTj% z`$;GMozafeDysjIOHUc^QQ^OFAxxI9wlV`VS` z_sclY8SJoHDNA1JNf?+q?IO6H`yjTyqKb4`j`mWTSV>OfH4!iaBDXC*;$y}5Py(>- z?l_7P==^GN#FqfFC7V!k*{rFEk@XybX6@F9WV{$tQ9epkqhBo{F`@KAzf9c%CWSUHoM0KHp%IRRTWbF)$CL3W-SQ*&4Gw!Rjkw z+?odle7B|sGRD_PvT!J``ON%Ld2SpYx@fy0feP9n_E=M$WnDKU@r+pv?;c-7VubWYA!69w&B2;*lHrFNM|b#cAKhywTMJCRYiBL)-VIpCVy z=ywGA^Sv-arAVe6;bf-lwmvboar?kPQ$_Jd+c^}%7(d`OJQP7!A0|o+!`1TxythbZ zz6zQOs_|Moz6phsrzZ|=>z@x=iESo>;0ln0=cIFW<}=ozWo(9l#X+#Bq0fR2?_*et z@ZJ-PYO}guHHZ?zRJ*ys8M3>J+$KNN^#KfaLFs0sUej1RzEAi~FJI(ji-wyGTY`i_ zRjRl+HNhX*CIiU@$-cXh(HDGd?W-MMw38H7OG0@}D+5ytPoZKeU zDC@yuEQOEtF?6P)-Gh22c&0a>uxwKXMzXpr9J<*8Om_ugqA1PAx{B6Rvr5kc%dEc# zo~$ULC^E;rMXyU-zC_h}n9Fv6n_XXE!%;gn>4UsxyF|X=jRNn>bjT+S<$b;rK3k&1 zQ*m1psBMI+J7kE)Z^ZwaSz#UU29ijcIpiORbx!EDN<5c7(dqb4y!fD|MGOg2FI%tH zY{|vW9{)Ca`U37+zyvq?yH73oXFb|Z!9kc@m2Wc?x4HID%yCOaViLLYmtp2)*N$XY zvK)lxR7a?qlc{Ejx!;QfL%ahdSp6{8&3qodG24sR{82hd}`yIlzJQ2 za2(EI|7p8W6&C7Pa9R2mKP;as^i>fyEMKqxWqPB0z^8r`W;2Vxm;_AHDc9GzU`>7= zkj|6xY3No@M&gK!g;MOk?BVnI$+scrHMw+lqoxYC(sJW1?hoN&-H(9vJiaP7lNRaJ z4*Ad;$+Hi1uQnRjhARZIAbS$OK$=7 zaG?WYtiOb_0TT%4R|C;%`LR2lh-!S!Zk-15e?K=bd#i7wgkaV2)!x;Dz%0~$u^iHz z>KApNYCos(`f3kwSJ;mxd@%|i`J@J#3QDjhn}Wb{XKC()m*xem1lVB*X090-)BvW6 zj~x5kJ6dFJ(v}doGMYK2D0>J5mL|tNI|Srgj}f~sPRuWef5imEv0={Ic)gbjYn}z44VC0jdLLMoNRSA?5Hp;vCVNbdQl(JtUh0kWi4AB zDS-(Ksc5E#1w7j?Z_orZpftdK%f~HX6Sc{ZAxn%FX?6+(zpro!O-o#?b}d5Y?i7zO zaKD`Zj;%-id)9?uGZPqE+g^PZ-Af}sY=Ou67VrBZaC7AqvRci}mnNXfo;R@ERl#1E z6NLKQ(8RCA<$8t(9Vi2}Yj?84B*cBtX(;;`@mY~HIf0C|+M_TIxao7he2aB2?5p7! z;KBNBR~7{_QrYNcNFK16u@g213l|ufi_QUx_J?aVS)^^Ea9wCzFc9yKP}>1T{jZGD zxV*dipS;xzaXWuBbIoNoed)> z3@_JI=GAOuV&ZN2bBdX;>F+vnt*v7Lncrg(GUk1tjQj+Q!T!i+*(__C%i9K`y{(*!87>>A8>owuQr zvN9J}-(+2XU(yw!3)4hv>K*I(n^=}Gw+{}eQU!yyGy`Z80Mb?L1kwUc#~1-PO&=RM z)#mZZno^glt1SJ{!~*W^oc0%GuyBOe=qaI+`3pSCvrtKN^Jg5EC#(_4c}YWjYCXM| zX?e77T(fJ*6)3&TE^SvnrcANK70XjsqL!b5zI;FSWetE2THHjFAk_km)s>HzmR_I0 zS5up76c{v>sS#aszlrn66N9knR^}Akla1I41(d_4zbf3f&--73;QYLXH+=p%i~xSg zV+`%5jdmufT^G^5u2&ZO?o+#1mjo34s=xc7i>5w|esUuiJ0qiR%{ywR5Y z(+?hFpU3Jwg#&p$FQYi!^nTgoLnK847e@XfXs|(48rL)A?BYyvUp-Wkis6E_F#>RS z7=|jqb*nqRwEy;2F%&>`pV2dn>D2#KsxDoYj0qQ42;7Y2%v9m!IT?c{<&*LEj=Y-F zFl9G3mkT0kbNAcfmR^zo+nYp{t(J=fCU%clBcZ`~v`D`J{VTg28+ME1cTUxlwj3nS z*mL#Hrc`jugC&~K3V}E!DjUB!d?MKX;9yPEclZxBaI(1KFEu@G{btFVc5y?vji&y< zs-*=w4Z&+KfKvK`(#TLg5bq=UpZo3a*DGf8&64D>XzvgA>IzF^%Yk0#2<1POe?)b` z9~}}aSp~RH9I(8Og{W5gq1Ybl=g5O1i`D9&7>1Q7;_jhhhDpn)^UAbDv+}w7gC+r6 z3J+ekCT+s4-w&r{!ip<1SoY{NxE(t9qYc(k)OC{b@|~3uPQ}{#(%-Ii7N<4AMnE3} zw<)7}F^|b{Ms2?*7X5FKf9>c<6)^D+I16ScA;T)-8_-3qQsAW@2i1EA&jQ;vU49re zl40!N@s9)>QwYN>vTN-8N{n`7Nx|D0ER@ruSO0^_124T;2EZ&8+%-2$fMK&FFJMB)4O~5!P~gOAox3AVhNfB z-d6AO1CFTxzIVaJK+f=AXQS&%0AUG2?aXYJ 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph.assets/adjacency_matrix.png b/ru/docs/chapter_graph/graph.assets/adjacency_matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..b2c7bd83234233df602f4de4ee9915b645e5a618 GIT binary patch literal 15305 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph.assets/directed_graph.png b/ru/docs/chapter_graph/graph.assets/directed_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4847123f972df2e2e56efa12e169e7f181cde19f GIT binary patch literal 12494 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∨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 H^z;7#PZvT+ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph.md b/ru/docs/chapter_graph/graph.md new file mode 100644 index 000000000..0299ae3d0 --- /dev/null +++ b/ru/docs/chapter_graph/graph.md @@ -0,0 +1,83 @@ +# Граф + +Граф (graph) - это нелинейная структура данных, состоящая из вершин (vertex) и ребер (edge). Мы можем абстрактно представить граф $G$ как множество вершин $V$ и множество ребер $E$ . В примере ниже показан граф, содержащий 5 вершин и 7 ребер. + +$$ +\begin{aligned} +V & = \{ 1, 2, 3, 4, 5 \} \newline +E & = \{ (1,2), (1,3), (1,5), (2,3), (2,4), (2,5), (4,5) \} \newline +G & = \{ V, E \} \newline +\end{aligned} +$$ + +Если рассматривать вершины как узлы, а ребра как ссылки (указатели), соединяющие эти узлы, то граф можно считать структурой данных, выросшей из связного списка. Как показано на рисунке ниже, **по сравнению с линейными отношениями (связный список) и отношениями разделения (дерево), сетевые отношения (граф) обладают большей свободой** , а потому и сложнее. + +![Связь между связным списком, деревом и графом](graph.assets/linkedlist_tree_graph.png) + +## Распространенные типы и термины графов + +В зависимости от того, имеют ли ребра направление, графы делятся на неориентированные графы (undirected graph) и ориентированные графы (directed graph) , как показано на рисунке ниже. + +- В неориентированном графе ребро означает "двустороннюю" связь между двумя вершинами, например отношение "друзья" в WeChat или QQ. +- В ориентированном графе ребро имеет направление, то есть ребра $A \rightarrow B$ и $A \leftarrow B$ независимы друг от друга, как, например, отношения "подписка" и "подписчик" в Weibo или Douyin. + +![Ориентированный и неориентированный графы](graph.assets/directed_graph.png) + +В зависимости от того, достижимы ли все вершины друг из друга, граф делится на связный граф (connected graph) и несвязный граф (disconnected graph) , как показано на рисунке ниже. + +- В связном графе, начиная из некоторой вершины, можно добраться до любой другой вершины. +- В несвязном графе, начиная из некоторой вершины, по крайней мере одна вершина оказывается недостижимой. + +![Связный и несвязный графы](graph.assets/connected_graph.png) + +Мы также можем добавить к ребрам переменную "вес" и тем самым получить взвешенный граф (weighted graph) , показанный на рисунке ниже. Например, в мобильных играх вроде Honor of Kings система может вычислять "степень близости" между игроками по времени, проведенному в совместных играх; такую сеть близости можно описать взвешенным графом. + +![Взвешенный и невзвешенный графы](graph.assets/weighted_graph.png) + +Для структуры данных "граф" используются следующие распространенные термины. + +- Смежность (adjacency): если между двумя вершинами существует ребро, то эти вершины называются "смежными". На рисунке выше вершинам 2, 3, 5 смежна вершина 1. +- Путь (path): последовательность ребер, ведущая из вершины A в вершину B, называется "путем" от A до B. На рисунке выше последовательность ребер 1-5-2-4 представляет один из путей от вершины 1 к вершине 4. +- Степень (degree): число ребер, принадлежащих вершине. Для ориентированного графа входящая степень (in-degree) показывает число ребер, ведущих в вершину, а исходящая степень (out-degree) показывает число ребер, исходящих из вершины. + +## Представление графа + +Распространенные способы представления графа включают "матрицу смежности" и "список смежности". Ниже в качестве примера используется неориентированный граф. + +### Матрица смежности + +Пусть число вершин графа равно $n$ ; тогда матрица смежности (adjacency matrix) использует матрицу размера $n \times n$ для представления графа: каждая строка и каждый столбец соответствуют вершине, а элементы матрицы отражают наличие ребра, то есть показывают, существует между двумя вершинами связь или нет. + +Как показано на рисунке ниже, пусть матрица смежности обозначается как $M$ , а список вершин - как $V$ ; тогда элемент матрицы $M[i, j] = 1$ означает, что между вершинами $V[i]$ и $V[j]$ существует ребро, а элемент $M[i, j] = 0$ означает, что ребра между ними нет. + +![Представление графа матрицей смежности](graph.assets/adjacency_matrix.png) + +Матрица смежности обладает следующими особенностями. + +- В простом графе вершина не может соединяться сама с собой, поэтому элементы на главной диагонали матрицы смежности не имеют смысла. +- Для неориентированного графа ребра в двух направлениях эквивалентны, поэтому матрица смежности симметрична относительно главной диагонали. +- Если заменить в матрице смежности значения $1$ и $0$ на веса, то можно представить и взвешенный граф. + +При представлении графа матрицей смежности мы можем напрямую обращаться к элементам матрицы, чтобы получить информацию о ребрах, поэтому операции добавления, удаления, поиска и изменения обладают высокой эффективностью, равной $O(1)$ . Однако пространственная сложность матрицы равна $O(n^2)$ , поэтому она занимает заметный объем памяти. + +### Список смежности + +Список смежности (adjacency list) использует $n$ связанных списков для представления графа, где узлы списка обозначают вершины. $i$-й список соответствует вершине $i$ и хранит все вершины, смежные с ней, то есть все вершины, соединенные с этой вершиной. На рисунке ниже показан пример графа, представленного списком смежности. + +![Представление графа списком смежности](graph.assets/adjacency_list.png) + +Список смежности хранит только реально существующие ребра, а общее число ребер обычно значительно меньше $n^2$ , поэтому этот способ существенно экономит пространство. Однако для поиска ребра в списке смежности нужно проходить по списку, поэтому по времени он уступает матрице смежности. + +Если посмотреть на рисунок выше, можно заметить, что **структура списка смежности очень похожа на "метод цепочек" в хеш-таблице, поэтому для оптимизации эффективности здесь можно использовать сходные идеи**. Например, когда список становится слишком длинным, его можно преобразовать в AVL-дерево или красно-черное дерево, чтобы улучшить временную сложность с $O(n)$ до $O(\log n)$ ; можно также превратить его в хеш-таблицу и снизить сложность до $O(1)$ . + +## Типичные применения графов + +Как показано в таблице ниже, многие реальные системы можно моделировать графами, а соответствующие задачи затем сводить к задачам вычислений на графах. + +

      Таблица   Распространенные графы в реальной жизни

      + +| | Вершина | Ребро | Задача вычислений на графе | +| -------- | ------- | -------------------- | -------------------------- | +| Социальные сети | Пользователь | Дружеская связь | Рекомендация потенциальных друзей | +| Линии метро | Станция | Связность между станциями | Рекомендация кратчайшего маршрута | +| Солнечная система | Небесное тело | Гравитационное взаимодействие между телами | Вычисление орбит планет | diff --git a/ru/docs/chapter_graph/graph_operations.assets/adjacency_list_step1_initialization.png b/ru/docs/chapter_graph/graph_operations.assets/adjacency_list_step1_initialization.png new file mode 100644 index 0000000000000000000000000000000000000000..5005d40c194df2d57bca3a9e40b3b68d93e15cf8 GIT binary patch literal 17698 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 LuVYUfahLu9&cu7N literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_operations.assets/adjacency_list_step3_remove_edge.png b/ru/docs/chapter_graph/graph_operations.assets/adjacency_list_step3_remove_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..043fd13e6fb2e4d8756bb95d6ee78f265c52e007 GIT binary patch literal 18509 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_operations.assets/adjacency_list_step5_remove_vertex.png b/ru/docs/chapter_graph/graph_operations.assets/adjacency_list_step5_remove_vertex.png new file mode 100644 index 0000000000000000000000000000000000000000..0902fbe3a7540817579a77b2d63450162eaba0a8 GIT binary patch literal 16816 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_operations.assets/adjacency_matrix_step1_initialization.png b/ru/docs/chapter_graph/graph_operations.assets/adjacency_matrix_step1_initialization.png new file mode 100644 index 0000000000000000000000000000000000000000..0e37f6e27d40ed3a52b1b1119e811c59a43b35c3 GIT binary patch literal 15546 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_operations.assets/adjacency_matrix_step2_add_edge.png b/ru/docs/chapter_graph/graph_operations.assets/adjacency_matrix_step2_add_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..300f802fb11cff4d6935e9384e11dd60e7c70d81 GIT binary patch literal 16570 zcmc(`cT^O?^Do-7ft*1=f*?V1P@;gaf(S@dvZO^&k|dEFb_j}!1POuyf+C<~lpGfW zAX$kLR}jgPC9`+={_ef!ymNm4ynEg~Z_n<|Oigvwr>d)~dS|;I8yRTPQgKiL0BCiz zuiO9tO*%#NQ6Nc&-5d!=(t*-T+tLRBx-TamC`F8plSG7kZfL24k{+%F(gn)tvi@ZN z%HydI?N8cYG}1HCBoc`cb>V+zXXn=Ec6WClKYo1a(xv9+=H2k?lamv@y}d2tEpNMW z-sHS-cXvN*d4G6#xc@rTGTmZHP%8-lUZ8X3vPr<`^29H{98s2s_Q;z#36FMgAGI*d zr%cq9lAg|mhILgq`1=J9EmX_D$rC0i{{Q#oMR&ucSc!|(wjF~X%_r5m+U$)wXP+D%{OQXsAS?q>WxutqmBpa_gHqfmL4!j zQrGu{z2pdQ6-w}HwAnNd!hPVti{z>CAmkaJEYPQ-U9R`lZdn~0r*egN$YqVzsoBjR zeRBmu*=;Ps&*whfWtop!_k7YkcoD-HJ{^Ec=X3Tw)6<%8_=m)En%K%h(F5fPT%Mcp z^rh>&lRY07jhRi?3expec@#?0METTVGKk($h0QMwrTW`!-JiP`I&&@?w>LhSRYc|$ zcR2Pa{H=f&BU?=KThx82R}%+GgWx#ypKRJjI&W&Muu*U!HVZc_k$HshPPkm#sAfq^ zpviM_QlqRY_?qS&NGaTA-mClC&t5 zb1--0R;#e%M|U;i^6s!_23f^k;t#7(8#%aN9G230J8pp*gI0sC&@BD#{6-R9W!$@w@bW-^H<>{Z$Y z&a3wr7aB|awsVtA-J5?zLF~n339G7_>E%3w%}nsLS>-c%Eo8QBDf}Rq&*b;z)EBM29=ETb+oCI|uKw6x&=#%Q9_0!=-{sdD9;?jB|4iH4 zs6HP9tj|nz>hNFLK(SjwVlKE}{E)C|84pJhtZcl`CELPLL;Wv2(sX`AKGEUX*nW7kOBU*)^Scqu^lP-qOiX!X>pa@lMSxk1LyuUZv8YP*Cm|g=QIy2 zJzCrsQaK+GK(+SbN(+Yt51KI3F?V5vjM5N6cJ}QN-4*6P7H|D!L0k0xZBskRJcegk z);>%OyEevQ`eNAg=*ez!f?lP{&D!R>^Aq|4Al>OF3*6na^LnC@?kA)u?sm|vh36t8 z^r`&gWpz(f7rt@nYG{)ArNe%D)oM10+^>!XIF zUztXBK?S*}f)tgS=H%-1Dp__}t$67kBpkD5buFfB!6dW2V8~BW0EDac3TBCndOsf9 ze^5*uKx0jZXYb$h^d87k%UI>^6~b@q$yF!&zm7i}urI+_WYR^t6+Z+(XA^N7Q@2Nnef?oH))l|GyZ#Z3QYq_A8>#@z7 zn334};ZH#CU6oz7iSeiyBYh#%(Dv}A%nCH+lzt|REr1)2&uO~fR9UV_Zed`j68Dr6 z+D)GW!8kT+^EA~ZuI$F-i%NrnnO`|`#3=B|i$7B&6MbO3odwdo->g-3#&R8maAo>E zF5E>a(mYD(#k^30&XHpSE?G0cGuu)&jN-8eYf5B`qj=w+4p#zNHO<;sax=?;$w_DthTuPBo#8=;0~vapN}pMx`>Y`?uT8-2A|}gcI$k5~+@Vxl0}M zXK(kM_g2NB?ji+ys2ld+?SZNw$XR{jxZ0q-$Q{Z>6e@%ce_=vqomEp55gs(^Hlq~m zHc{FF>E8OG!uiE3|G-`>T{&1c`FcuE>eEO;{c&@lx z&5V}7a$g-GS{bN3lHfia0G1Wf3l;uTYjs##v^;4Wsu@^@W82iFSn;=fj-NIuj}=rO zHo1a1-gqW2HS##7zB9{y={(zJcBBHwG7yI7h~%30V>Vj;ljZqp>ZB<4B*C1F?^bLV z!su!q#b{x1$+-IU!g!halY97AbTLBV&*h16J&`{Xm~F(5m*pTAfqZ?cr!DE8DMV%AZaD|h+z;zCA9-xJ`^%FZ zVdwfcn9X5hKi?`eR1QwMlKn)*PHJLty|0l$N^W@R_Wa2_MfUXk^N7#ajJ`e9lJ0tr z=gZ&o**gk4Db@JW^TfMy|F33WYsHRZRf$9zU{F{*=C@>IYP#b2$0f8dUBMP#ar@3~ z7b_?8n4rFfot)|j;vl>#6J@<^j_7L|B|PWRFim-(9_yKDZad@|HluNGs-WNxPL4q2 zgyo|agR~>8CMkS74a(F8oI8FTKUcW5FUX^sfzD=(<$SfAnldx>XOO{*(ddt6OL3i? z{vGhLe720CJ56=0+$}wIJbvpO2rs3@r2EDmX!<@DnuxAmHzvL~>g&FcOH2uKm(Tbi zCiQ@dv#S;o&R^YD``7c}+jW*FpBPQ3pw5>>qJ!2M4!dmiHzOCF+^Q9l`a*?ta2IzV z(b8esb5m7;pK>O=h~x5r7j>HsBQ&jOPCLN=nJ8naj;I=q=I!b)&y@ z2|ukm;$j;fUgPoc>pfSRxzzTGTiAX`QS_3jKQ-tSt&6c2Lp-^9Y_W|v!9w01Z8cu0 zc$dwhkvhUu!Ld9am$@Q)e#uq=GKw$162Hap$ut8!ke7M_rWwiQZaag267 zyae>7Vp`sS(Y7vUsiWL4>9i4NeuJMBnArhZv%mK>vQOXBJ~i<~AHwe2Rwyzn9BsW@ zyAzpBu88-g?F-AT=`arzI8m4IP@SZ7sDJo@75A_J zJ4bE)&Vv*>u)g_)5;&IA5{4C3`oE$*s(O;|(Bv)umrzXVA3B58m0M}tPljk8^!q(J zO|}*#QTZJV;4Z4i_7LwLo$pH)ES*MbF{4g!MmKtXHb_`!^|w49%N`|S>bQ|XgEtV& zeXXCup$I508{UJTo4L-DrRvpQuCb@*Quc(DgG*jL$#VQfncwnu;MejQmz4X-VkFkR zLLcJdrd`MBMv9dm&6fmc^>OdNtYRqcSnyIr{NH*Dvwc735~$%Ep{T$2Gh=2pl2@1# z7I(R*i@+vDNly|;1PTzvOF`;qiU@!q0RapoF#it{z?{$k!wC_fNQ?*okvRW5GJYz! z-{@?v_!ISOXRpLTRGit54GHK-fSEU5Wshunf$A1ft&5|li6T*$w`8t7dxP69I>qwo z!nq{ypkn;$kH^VOOL*~xnGQAK~Nm(r>Ifm>7iDu7^ire2_)Kv6Fc@aQr7V`8+@@^eOI>Zt82s5PoPP zzDEHwpX_6ta(z0*v#{ecVI`k;iTyjsK_&8I_UGB{}P$;E2BH}x##;@ zL759@qv8)}ao9d1WFHS%3!W5t%ENrKrXGhde z9=y<^v&)eo3}LekZ##gIg&U6QRMuY4jF8K=>)>r;=)mvN1SIZ}RLSEY8tLhc-Hd8w z7T)d))W?*E+*h;j^_1##hSP%DZw{RlfTR73!sVLI$eA|m8>l^Y)6K1ElRNu!$i=AC zVBiyh`^l8Rgg_Xyo1SlL7Crl5sjC!cy7`J+g$|~q^Abj}Du6x{$-sCVSmO_2)LOr# z>pdJdX89_U(&)E5y~QyDk?w3C=<|y(cD2|awsU~Vuh~!ez+0;1?Tas6H+H68qgxU= zd8f4l-RaU|W|X$-Ef%bhN#R}Fu|iA2G*F#jFz9KidWfKTa#5( zbSq*8h(k&MlXU#UgnWd9Ms}3pC=ogEW%#!i)#2$#!6(x!*!c&nYu1Pm4Y*!)c4xOb z9hH98S=070C|Wdg$ae6yA-*XM*K1#U>Ji#X zwZy8^aifJWjZtl16k=TQib zxTvOYXMtHfGW$I)0+-b;ttnvlTXQ`S@!LRPl}qt6Q}(YBJ~ZnAN_Or+(%z|$Z`s0? zTT9CG?OzyZPm}9uL}>97CzxOBMD9=d%V0%T4bJDX!S^=OihQsy1&P1^#7Ou*e-?ZD z%SVsZ)Umrr`zhk7R=LaB44{!Rk0rPHK-y%k1kxsm{%IS!<( zA&#g1P8=o&QG6G$!7FF)`NT>jK&yA{zU5QwvK%kOtEfS_jrD8Kj58)_?!7>ggV&ot z;7`K^4n-eLYiU<56jtbS^ruHEcV5dZ;kJ0G@Ap<~-(exxU0*BqJ;`%eKvh7?(iqqy zFo2{~h~5-I{6XU}_QOL^ZX3A96j1f8Rf&|CyKFh`T}Ze(NsC!%HhO%9UcjVX4UK8hhH(ij>eviM*K#b8s9c2~0a#ac`<+8%&2qwLdl< zD9{onDfaTvGzYEjOB4VB{}fXp;|ADYtac1pLU@Dt5#KO`Ei;x1q}O@)1B(?<_T(pE z;_@A>fJZ@3yb13~n{*b-l9u za6Ve(`9*0!0p3t-)Rnu|Khj^_3G)!Wj3lO!RP?+DH1VDbG~V zHiO{8i;0kDyi&0bA&^XbLhM7?WFZ$j2?kLTNWGN#hxC%>ZKCF=2NIB{W_C2rdZv(j zly@*d_R&flO}?!D(XC6ryEYG;biaAEYWtLtf7s?Ig%s1}nQkpTCMTIZClbO=(;Xo6 z=zdRp6tsJf!cklSh|-G8YUe&{4KTKRvTaxJ@T1G)g!G4x{lf2h6GL2xv|>Gjb%=}C?~uH?fy@BV%%vyQZ3Q2uf` zcM2H1lvUvCQ%1GBcXXV4C!^0GxAjnn&PYMNqM|o_s@Zz9uI+sQI36R%)`pp$1kGcR zJSTPW{x3_hA6dv~y1O>y+8!F&rRW<=0XNe>_6W=Od}`q4EuFeKuBM`0o4ftiipdgb zt&G1-TV`!;dmTyY8EeL}ngf*qBgVD6u--%@#*W&NMeR4R`onS$uH&5_2q~xh;F~E* z8U!J4o}_VESo@pSAd}!|WJCVhWtZ@QA?u%x+eWkr={W6oWX>|K2W7NlBEwoOUx3%9 zQfT1}!wJsPKlrV>{;Ri>(Oc*Mtuv%{CZ3)GVAGnz;?QZ;wt`DDTpDnGub~*dGfA{(>wBxr#(4e7k3%`9xr~V~ z7GpY1l9>1KD_#zOz-v5Q^9- z!Qo{!v}BK5tvQ{8X^n&#IUk~pVvDpQ?Bn@zDe1P8+IpO5W^r_%BZ z%%$Ul{J_stBpeRi$T|+)y@JAZ9eo2xgUR~nv|*hNLJbH(x+^TQxc5KS^CRM9dIy36ey(~8b*52q%m_NT38^foxCA~sd&!fgNda-QKR)RRQPa48MKyU!|Z5C#P3AtpFIaE*qa z`Pb{W8}>UjlSG=&KaQtdl;9b1L~Wq@?EQ$01>4cF8ibz=q)~b%8UGEhMMK6G8fa_X zEXe<5_9gon5P0hY`d6ZVJ4@TC6TVc8LzjgG<=MRTKf1mtx_Fn}!aS6FSU<}U zow<|HO@@+=QtA_+*Jnaso8s85c97_3?NW@p}7s{8977n=l2 zHU~#^#EnEx*k1gmXn|KFrMP%jvIy@d#RMV36v{sig)*BG#G*+e1Hsm{?-}%X78Kp7 z#S_L}G}aF?hSJ`|*1Kv<{~)bgYO_bVQYnk`X}8y@Nz^d=xlm$xsrd zSRV0)<>EP_=E;OIM?Y4R8+lS$QS z3^z4aW}BgS8d$6DslXa?zS8b9fJU49@-JNjh#5(NFupqI=Ucr;dync1!udcZrla91 z8ybuMcIi~MyRDk`Cc=~kKKq_uJLH=%_8z#5{SaPw(Bg6QZHRJrL8C|llNTVS z)w0hHG;U}y>?P`Bn1IXJI~*-+!|%tA7<p>dr2FQB^fH7khcF8r`NyK6rDa~HyW~MEw%Ccu>kK}7fYGtZktu-+ z^GSYjilr91yCQ7D@#q3jtU)dn$|ir?24uN$*_(p#@O^MgbS(}G@Dm%fWR*mOMa#o;ey0L1`l5=Zwh)QP zw5C`k@D}M+rf{$QKu+)r@asPX`wsZRm*4Y03O&mvjfCHiy+dM@z{-SksCRQ=1Uu%u z?PqJvNlKPmp$bitfSw}pK@bYcpYVAn{TPuOZ^tnH~IDKlL9}5s3P){ z?x~gfg1Ce5dW>2Bap|zJU-*^~$mcc_2hlbJ0@eh>vD4C8r<#l7zO4zErHXp=0e=g?YRkhuZzA{$n3PyT@-}z zh_d4qJ|&gomrAh_cmWN<1B(&Hy1Pe7&LaL%C8Iy;3pYQ-_36InzqhL{f;9kYk`#qn zWw zE)cTJ8c<8YgWKWjOMX0Xyyv%`m_Id54fxta&oU*D!^WK322Vf2Y--`pwQms*!7CdK zc$B^K;40=Eh;tu^@lJ8Lj#p0_g0I$~fuSTXxZ=3>;0i__6zC44_7o_!73iJAtq^PD z2n6N|ot-f1HzNDqChqca?RDviYmYYF8S%!{6oAn(BJM2W7I`eJpC7NMa zLETLcL0IWXsh#I10#bQ@(&T&UTf{veod*PjA>yYY*_9AkCpJ=xd;5tuFm#~qnnyA2 zn-i3EL>(tXbz(`VjxaV1kk6%A&}NH4{juTvN6NV;l7>_7BQCrHY&zBrqy+{%$0ut6 zuHtWY)J{Omap5^f$~h-oKT{nM7eHSuJhy}A=*kc9qsgGc(;jCUksRN?qALnn0*in= z(0Qv$g+;T#m!N-~X?Sw$uPz_7iJa$w>X{6g3=tk%tM^ZQ5oY&;qMaMxfy{pC@!DaI zM*|wu|NdJ=Y3|#1nY3q8Iw(iF>~P29?^lvw<=r+zyqU*df4ju@3adDeYVJk}U(o(7 zl?CyK+$eYmQ{m2d!3xTQyx52%l)_a}Ul`b1T2fJn4KgE^$fiC-O%iS#HIBkk0!HzW zpLX~|5X2hZ_I>pb1S+NF;<`{*(2o=$_<*|oG-kzv;RO#u2zY4`11KL+F?f>!e>PGC z>~DgRBmZ6ocJKy)g6+_RNyLR$NLeJ|np^R*`lGy;NRrl5yb+aB2UP9s_{Ca-!*LGE z7~XfJLSqiql)`$zgc{J@XH%cKz-|Il3^gr_@Fr2ee&9K!Hm!WwAn>fLDCUa`7&pc* z1G-x`S2ANQ0rfalG!+8~I}0mQr8Og1Haqb=2FA5W;k1~>WORyB3(tvitUG;z z^d}hCB+;Lc=z>*qfBc6A&h+?)Y104yYVXOG7Kj0 zqfMwL5*7zf)6f}yR07OK9-*wF7*g%sqijcFZtLPNuZe=JyGfi`Q6$3=n1_fBQ0Db^ zujJuzgQ;vLd~eLh22g$re;=p#9p#SGWj7qkFxo(L zHd8Scps=pl_CTHk^K-{W1&(>oKZ2~ejyZQK8!cgh_ugUGOiH6cCyX{1ytlbOcol3n z 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_operations.assets/adjacency_matrix_step3_remove_edge.png b/ru/docs/chapter_graph/graph_operations.assets/adjacency_matrix_step3_remove_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f60f65be534089a3e8e0a0e985175bd9855074 GIT binary patch literal 16298 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%0DQN8I}t+$scx9>Hd9!A}RY@ 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_operations.assets/adjacency_matrix_step5_remove_vertex.png b/ru/docs/chapter_graph/graph_operations.assets/adjacency_matrix_step5_remove_vertex.png new file mode 100644 index 0000000000000000000000000000000000000000..7620ec14fa0618e0f94f2a58610f5f65bb512a88 GIT binary patch literal 15872 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
    1. vhdkBD}rx5r9 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_operations.md b/ru/docs/chapter_graph/graph_operations.md new file mode 100644 index 000000000..b962fc2a6 --- /dev/null +++ b/ru/docs/chapter_graph/graph_operations.md @@ -0,0 +1,86 @@ +# Базовые операции графа + +Базовые операции графа можно разделить на операции над "ребрами" и операции над "вершинами". В двух способах представления - "матрица смежности" и "список смежности" - реализация будет различаться. + +## Реализация на основе матрицы смежности + +Пусть дан неориентированный граф с числом вершин $n$ . Тогда способы реализации различных операций показаны на рисунках ниже. + +- **Добавление или удаление ребра**: достаточно изменить соответствующее ребро в матрице смежности, это требует $O(1)$ времени. Поскольку граф неориентированный, нужно одновременно обновлять ребра в обоих направлениях. +- **Добавление вершины**: в конец матрицы смежности добавляется одна строка и один столбец, которые полностью заполняются нулями; это требует $O(n)$ времени. +- **Удаление вершины**: из матрицы смежности удаляется одна строка и один столбец. В худшем случае, когда удаляются первая строка и первый столбец, приходится "сдвигать вверх-влево" $(n-1)^2$ элементов, поэтому требуется $O(n^2)$ времени. +- **Инициализация**: передаются $n$ вершин, затем инициализируется список вершин `vertices` длины $n$ , что требует $O(n)$ времени; после этого инициализируется матрица смежности `adjMat` размера $n \times n$ , что требует $O(n^2)$ времени. + +=== "Инициализация матрицы смежности" + ![Инициализация матрицы смежности, добавление и удаление ребер и вершин](graph_operations.assets/adjacency_matrix_step1_initialization.png) + +=== "Добавление ребра" + ![adjacency_matrix_add_edge](graph_operations.assets/adjacency_matrix_step2_add_edge.png) + +=== "Удаление ребра" + ![adjacency_matrix_remove_edge](graph_operations.assets/adjacency_matrix_step3_remove_edge.png) + +=== "Добавление вершины" + ![adjacency_matrix_add_vertex](graph_operations.assets/adjacency_matrix_step4_add_vertex.png) + +=== "Удаление вершины" + ![adjacency_matrix_remove_vertex](graph_operations.assets/adjacency_matrix_step5_remove_vertex.png) + +Ниже приведен код реализации графа на основе матрицы смежности: + +```src +[file]{graph_adjacency_matrix}-[class]{graph_adj_mat}-[func]{} +``` + +## Реализация на основе списка смежности + +Пусть неориентированный граф содержит в сумме $n$ вершин и $m$ ребер. Тогда различные операции можно реализовать способом, показанным на рисунках ниже. + +- **Добавление ребра**: достаточно добавить ребро в конец списка, соответствующего вершине; это требует $O(1)$ времени. Поскольку граф неориентированный, нужно одновременно добавлять ребра в обоих направлениях. +- **Удаление ребра**: нужно найти и удалить указанное ребро в списке, соответствующем вершине; это требует $O(m)$ времени. В неориентированном графе нужно удалять ребра в обоих направлениях. +- **Добавление вершины**: в список смежности добавляется еще один список, а новая вершина становится его головным узлом; это требует $O(1)$ времени. +- **Удаление вершины**: требуется пройти по всему списку смежности и удалить все ребра, содержащие указанную вершину; это требует $O(n + m)$ времени. +- **Инициализация**: в списке смежности создаются $n$ вершин и $2m$ ребер; это требует $O(n + m)$ времени. + +=== "Инициализация списка смежности" + ![Инициализация списка смежности, добавление и удаление ребер и вершин](graph_operations.assets/adjacency_list_step1_initialization.png) + +=== "Добавление ребра" + ![adjacency_list_add_edge](graph_operations.assets/adjacency_list_step2_add_edge.png) + +=== "Удаление ребра" + ![adjacency_list_remove_edge](graph_operations.assets/adjacency_list_step3_remove_edge.png) + +=== "Добавление вершины" + ![adjacency_list_add_vertex](graph_operations.assets/adjacency_list_step4_add_vertex.png) + +=== "Удаление вершины" + ![adjacency_list_remove_vertex](graph_operations.assets/adjacency_list_step5_remove_vertex.png) + +Ниже приведен код списка смежности. По сравнению с рисунками выше, реальная реализация имеет следующие отличия. + +- Чтобы упростить добавление и удаление вершин, а также упростить код, мы используем список, то есть динамический массив, вместо связного списка. +- Для хранения списка смежности используется хеш-таблица, где `key` - это экземпляр вершины, а `value` - список смежных вершин данной вершины. + +Кроме того, в списке смежности мы используем класс `Vertex` для представления вершины. Причина в следующем: если, как и в матрице смежности, различать вершины по индексам списка, то при удалении вершины с индексом $i$ пришлось бы обходить весь список смежности и уменьшать на $1$ все индексы, большие $i$ , что крайне неэффективно. Если же каждая вершина является уникальным экземпляром `Vertex` , то после удаления одной вершины остальные вершины менять уже не требуется. + +```src +[file]{graph_adjacency_list}-[class]{graph_adj_list}-[func]{} +``` + +## Сравнение эффективности + +Пусть в графе имеется $n$ вершин и $m$ ребер. В таблице ниже сравниваются временная и пространственная эффективность матрицы смежности и списка смежности. Обрати внимание: список смежности (связный список) соответствует реализации из этой статьи, а список смежности (хеш-таблица) означает вариант, где все списки заменены хеш-таблицами. + +

      Таблица   Сравнение матрицы смежности и списка смежности

      + +| | Матрица смежности | Список смежности (связный список) | Список смежности (хеш-таблица) | +| ------------ | ----------------- | --------------------------------- | ------------------------------ | +| Проверка смежности | $O(1)$ | $O(n)$ | $O(1)$ | +| Добавление ребра | $O(1)$ | $O(1)$ | $O(1)$ | +| Удаление ребра | $O(1)$ | $O(n)$ | $O(1)$ | +| Добавление вершины | $O(n)$ | $O(1)$ | $O(1)$ | +| Удаление вершины | $O(n^2)$ | $O(n + m)$ | $O(n)$ | +| Занимаемая память | $O(n^2)$ | $O(n + m)$ | $O(n + m)$ | + +Если смотреть только на таблицу, может показаться, что список смежности на основе хеш-таблицы является лучшим и по времени, и по памяти. Но на практике операции над ребрами в матрице смежности часто выполняются быстрее, потому что там нужен лишь один доступ к массиву или одно присваивание. В целом матрица смежности воплощает принцип "обмен пространства на время", а список смежности - принцип "обмен времени на пространство". diff --git a/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs.png b/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs.png new file mode 100644 index 0000000000000000000000000000000000000000..4b7fd506a659968e11da119b303aa09bafeb8d89 GIT binary patch literal 20301 zcmd3Og6#(#m|9gQFSn(+z2SKhMeqMZ`eX7d;z|De4aa)yK=a!{kWxSIXO9HWM*7lUsY68Ed6+3 z0suNd;jNU0*ZltCj@BMO3Hm5QXx|%ctRrM~^k*ePZ_LCz*wTGhLA-C`7xAwQ1ZjAW zp#R@)m5I4bc;I7!gDYPwOvDiSF&R|#ND2o@yW)wVTy8&owkAh_4KXROCOl-p!$UkI zSSIeZQt4HU6OjdYr>U=#LsK@nVHD9jHAz|ZNa(AAkuwoVF($;V3M<^c+-gP>Q}X)2 zqp%4G>0p^qT&&(!+@M9cSbSS6a0q2R1_nm9?mvzqK_l;A611JLAIAA8Mv*3#RIXHn=} z%D_WqZN9)3`)fN`ocmrwMYJOI=FmoUUuA9lo#TX!>ocnL(v-?Y-iP{>DV5Dw8Eb!g zS4Blnyuqe=$AZOatyv(%PrGBw8{y7Vk~XCNqEbnBerCRSr{JZJ?B36MdF!NkgD_0p z2FQWvLwy2dX~3qwj*(&IRB?zjR<5+B%JwwLJm$k<-F@ z`mXcBAM|wdsp?n9hwJ`G^i4RUdopv=x!n)%hB2&8sb+7PV z{4%jtxLj^FP1Ddj8|Z$5xz41N-dB`NK5wUg&Cyt2`>o(+a{N0kd~*C!t25U6fm)~g^V&P4AOalLD8#>nE4CWrBS>wK}i^~TxfG7+oOGxRw=DBL^uSvm<$ z7BpmNVSYD(W5U~HcDf@3lkC9Ul3%w-yrew|a(Dl$V5sas#ae+z^&VEKIV`pEj2Aj4 zZaW9R?;0eI)v;zi48l26k*tNrTBGQUH~?$<_K{165?e&D!13=3Xjh|^b7�wZtwW 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step1.png b/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..46cc9149b1859d3d00ffd78ddca6ef6289ca0728 GIT binary patch literal 16201 zcmdVBWmFtpv?y5JG|)IC!Gc48-~hfM7{*x8Uv$9S9B~1a}Al zg1g&mzHjc#o%imWwPw9HKc?2|)u(oCKd1KIb!u0bx~d!=_G4@S0Pqy#r8NNn9W@01 zgrcGT&T}}dP=8pi@&+CNfdBpe2a03Er$7Ng9-4BJK-mw<4b%z5RzgJr04k$#t}X8A zU#Kf<%iP`FZS7vYZF=)(_0ReFd01H3!QsKp%}vK#XK&x2sHkZ6V3x$&Q7-i#lDV6i zIYlK6Lw0s{y2(1;d0xF^uekt#7Eq9u(Dt3#PJ{d8&=SguX2Uu#9gk3a`@=C}%wN{i zkNXd&t5~Y%KYS(3i_j%TiT?ljfxKhjO2FU(U`YjBO0#vlI@hNoT$9DfK0uvmh(GUY zr;`Bzs5=8w$MF(Zb6fABguoA3|5kj5)mtJ^2OW_lh2>_GfUKiQB7A0cO?k8dP6LVv zvOlAjc?n2;lxLw>EF$7@{@D@%*hXr5`Vt3KycW2)e0XAB;*e}}uD$8j{J^k#sP+@K zfl&Bmqu2|naLq?+(|nP$rw@?3em6}`z7-x}ZtG$@I?#2_Q#2!v?KGM)y;%o454T98 zeEyO2BPh4Cc9?&TVpB#)w1{5pb=BV$du}7%-Jf@W(D@?OoR+RwOrgZpDGjboWpbjui$ zb{h<7bTa7_ioK>y1unB0@E6e0cUg&4yp?3+M$IY_TYS!#uuQTxC-M%15eJU56AaWGwC zZx$(vAW$k#s{zl7Q*u0jMUyN094vCQ6gyoDzHU4%m8Fe}OnhFL=^qg`Jf$QJ96=DWuRrhh*j`IuTph?U!$^x|0_;{D+*C$i>^%<*sg`YB9HH`f z@zsw6IXx{qdTAcAABQ~U5t(5}cV^{Zk`f~lz%Lh|=5r^sujD=jhd}R~!~>~q5*-W# ze*F@$A9M^0bDCAM!S*(ag1WL#*WU0wpOJy@_HYi89baq;c{O?DP+Zy%8{ly}^Qpe5 zS?#v)k0C^fvH?$BOjWyIlF)FFAUD{O9Ri(mus7U>$a$dgR)Jv_ORYH0?Tf%@nTYqv;RNskb%~zm%QfHh@oMSD;ekP=A-7WmFR3FbxWcm5hOMfjAoSTRFE!-VNI~*f=NT!{ zv3s@#XeA|l-E#gch?A#Y{S()ZOKVGk3Ea1o!neFMb`c5WF?!ZDT$QbYDtgm!wkfy) z1FW1y;O$oTWm?+A%MgZ^Hk0orKCB1g@eXiZvO9VW%LpJ!lrxLB==nZ^FPX^^uNca=NppET*g5*nReo7wg* zIxhHdmecwGrnBgX_+|TDa3wxW9rB{+7LWeub9aL|Q+|KR&-QI>{fc`rn{C25rFn?K zjj0B3j?R(BQiZu?oh>D(s6ay}Aku}CfK4J#hiW(H+{pv<=%#gi+pZkKZFpr7?0qq$ z_^ER%e0dj(ktp%_2M)3v_&coDGnOXG~K0Y@{7uP-0)B*4X@z~McjW|814 zJYl~T>s>a=p+bW@;)%uiVQ&J}G==I~ zVpEqT^Lgv6drqvww*0pvj;d`AUDH7t=kLCliN0!ac7OO!19?g7d!FVi{$&af@Dk5U zoX3-G30t!f{8DMjQ?TfU2D=HQJ<4LUEwX*p#a*mCU~5$A%%)0Z2EVo&KDN;Q9W}-p z@aOztuDtCsb>Cku<5CHV!`WflT8NNR9 zYqwJ6(gSK2o?)ss57~{#!+YO=Zapz5!ExPBVj3g;s|*NX4BCu7gKuJ-M;)|#TjwwU zHa~azxY66`f;b1wzPSmsi#d>4oPnVF@C_%-0~k70ahu4>dd!^IF0Iff+t~(3lSXtf%{f?5m@Z zv8x6=;MNSt_bMyYw>ff{=pYNNRn9|qy`neQ1mX@;taG1&!Ld$;g)x2-) z#vw8{S*?Iy{1{W25tw)j#Bw3xT8F>Zd{eGsUYt=ecm%tU1qAEi&p^5uAjtVBSU>VC zflCued5P}&v;93fJCqigQ2>g12pSEhov)*3xXZ_AXoRzjZZ~{3ZJ`45!w`q)>W{hj z@N$qe%|p+fHb_iSBs7FbH+oNZ>ZLVazaTN}mK*86=pf?>aVAN$N78VFfdTgZr)a%T0}^h3QrB+)a)WUV+-;FJaoRc`_E zKD>!c%}xuD4ieGM{h41I1Mr#u;b7`fJBHPa$u#KY9ZIiduTDjqys}2_&Bg+SFCf@w$Yq# zHkd6rBdsSIm5oSkt+9at?^)U942hc`1#d$1V5GLC8ssq?Uk;8g23bdogmd85O_9z( z`{g*zHJ8~j^lLP4qw?nntl*|%S=i=iGd#zPM70Qk*&g(n?Qb|SeGC^R;R!4H*z-G6 z;_W)TOW@MSbnqZ%iP*#dQ>ULiXe;`Js~N>}=L`*IwbT;Y$^7jy@UETU%V0?mq3%<2 zn;W(nI0UhuLYFCY?Q%Z-?jeKZ>|kC1J#UA~_|Jw&N@$=6kxbfEIO`PL3W)&9;>d3#qLSuGE%ssUDRNm(1Faq`GhsoQB(uQmUdMSmNmum>gL z!qnugz1qv)Pi$NwS*GB|cS!V#IxYgql^ixYX?bCs2GY=aY0TLY`#>eEdN}+4f$?^I zL|02$aALSF&ON&6%Y63KM`WPUd|Jf-a?Fb<)SQ-KSWCtZgjh;LPLm;6**arXvqK9SE!C?RC(mgX2;$ViyD|w`dO$noR#dV|hjr?~stp*ne?zmHF1hxj_}U|3HyE z|KI`xgpn5n$^g66e|eD>_Ad$83dI)~_@A9hBM|qhy8$SRq#d;pd3y4|zh>AGY~X>P z7&e2oOGy9-2pcsX0DncdLXQB#CJKOA6EukdJlc2(1ZdO=4^iV!1fa$VGTazW6G20_ zBDf41v$jG6lNEhcQ@3@1Kn4AgF#pG?pe{! zKt=^F7y?5`OCj#PhI)npJ-`FqdyWnUK;-!#(0`N#p{4-!p!om~_`ePAod=*Ci3TVp z*#R(?hj_qK>ueB!@*aTl8QQ(4{>uSM&b?fKJs1GpdkTg0|0J4__I~pI(G%@nD*&bN ze>Xr)90q`zMBpEt9?7vh>ps?Ep&**p7pR<;l`1z}sEzl4VlJRy_!+Z?2*^E^RJ5DK- zD0M%&DfRkNg&5Y|sJ^$e@6jF`{1Ac%#Q&afv+p@hC@)+lJE1kC8gjZ9+h{ci?(rQ; ztcoY9?_vtij{8w}&lb0j-F>hzHrJ}glw*)dRkou71S_+OC$8dH{Sx1|Z{~*PjH0H^ z`DE=zH=C{3Ro1Ar-rCxQ5&Lpl;Dr-Vk@z#+Dz++iW@Pxt>@SJR5y}GtBIK3hEtFbL z;sX>p!&S>>)bDFj#IjhrFtxlzDSW@io zZDc8|6R@{!OG(DtVLBDG*@lubq4Ed&Rc)*lHc&rskm(eVm3< ztf6C>pGDzi(K>ohW^Wc>rdaHlx?_{8hwKhg$W=jp zf4)T53ct8aL2MomyM6Ur3P3Mtrh83kc}Dfgt6WeO$2C;Y;MPmidWt%|-XLIV!p3FQ zr|Q9+hS+``m~VN*QHs#wV!q@nu#?5vCT>7)&PeDliy>X&x$PZlVdNwk2 ztt1*9$2$Fly3WF~Yp<)N4Or>4nVZ-c>J(X&MVMLa6!#Pow49+Ec6npEM87WB(CQR& zxY}wYI9=fu$5vNCbWdr0vk3-Mioh>FQkiQa+GbWo(S_{Q%(S1L`j>x;x%(>sRWrNw z-R?DT4H*twIldcHoFVXb84L7W|NLk4n@mgvQ{mPtouW_kIPE^gzq+av8n!Y%%Cddp zxHbRsO@MPoI%MblA`VX}qW#BB>K3}s-R%%x{n@(Q+^PAs{Qlzl`y_xs0?{-54B-Hd zaM_rAn0a7p^Sc>NjBYn(m!TpkTaRyQgxFl)F85iUH1_ZgR6@HvbhfdE>FOAoR?$u-Zrq;UVFD8q) zoT+5I$c-}AMTS&N`iz32mNQS5->|;-i=z}Jq8o<@8P`{Q4(Ze($&?lVt=6J9sCgmM znkD!Da6V9`a)TV)kYw%wwroqoYDJH9ORW@4hEoWa`t^>Jr;fPS!DC*W@1pRHf)=hQ z7*gJG1=1Zm5xBNYqfy@8d=mbxv#E>xjPDu^WI;zLnll!$c)rIYtrxJespl^n7epkq zw@Z=TAruQ5h)dgt!-B!=^OP{^Qv3)}@x@k%C0$Q=)tot>=ZBO}QJGswEO0%3G z$aYA3lV?M?b7FSaWfNSCH+#vkWG`Nz;G$|j5!_iJ{(Pu#BgVh9D~%?K=D^qtQ|Ps+ z$%UW@j{8@6iy=jU1Ft-VS-FYm(?1*s;a1^ty!;_>>+aDDr|w&J>1dM`>h+%Aa@UW~ zxk;DiLiF|^&t2*GN?J#44mqlCMddnA=-0yR-dDjrrY2;A(5o+UE80buIE|N>cWs&D z#2#pG;`$1;&kwQeJzYNo`-@XY%@KffbECP|z9cjf>-RVESM*2gZiabLP}Q9f3-vyo zu(|aNZFW1i&R1pgx^TPhUF8inUf3%Z-*zj#A+^8q*v4d>Ku)(tJTmA{vNeSHzzwpT zW-063m6n_9r9~;6mOs;gyi<1(j~$no{m6CxSmlMsrwlDJ*REQyjbrY52U)N$M{(^t zaF`dW${rdaCGnQ>LUwXt2=%1zSM!>rnUBKrc!m+NgLOj|{)NQy4dBO_6Ybv`6H*FZ zrbW1bbWG8vNbfJAg0!iuyP^TMHxE;ZeKiR(;GY<;M|Tr^W<1AY#X`c-iC9+BxraV4 zZd}b}CuJj!sAEs@ zBH}Ozus~tPsOQ=br53l=q_&R#$+FZoGvv9?2UbfXG@}~H8kCzdU3e>y5-u=c^9ZH;U3L5(X>qY-AtlG*)#TV>H!73zI9}8x#$gTn zmC&f{vgXxU-lx1zMguW+*N2*gM`bC6?GZ-`Ppqm(u5BZ@QMpENF8wE83d_o@l0}5( zeUVUVx9xm;b~d@K-07XIGX0uQgMzYdZ_lN=6{V4~cQe(<0?T8-oE!qZFLJ^6H5+hW z_5K4wRaX-Y06z>>Ta`WoX&(Qq09PunfRC#K0Ww3r`&#cW!5aR3p(u;^7Q}!Q@&vXNExw zZ%#i+pJkq^ns`$T1f^2sz1~|G||%<8u92d&M+1K!wnF&)n-@ zBA)nFv!{f5g?|Skr0Z8be0Y0⁣<5WL}NO8>p}b>3`5+vG#MV5Z(o7jnRNcuzI-M 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 F-vBWM;Ryf$ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step10.png b/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step10.png new file mode 100644 index 0000000000000000000000000000000000000000..fd085c825a948914d0d84f6ac345697740036f24 GIT binary patch literal 29920 zcmdSA1y>wR(=a?MxVr>`1a}V*0vp`j-F=Y|JitN-BuEm1ySux?MsRnR1b2cvAJ_ey z_eXqt&YYRvF7K|Yo|^8@>Z)=$n3R|R0N^OdOKSoE%F`ow6dm$(yUOLXe!5|}$s2e8 z0PgSqE>Ju>?z5*qK^~fNl0d~U)y`7`YWGIv4FFVs#k#Zj4_`@LSzG4u@o{5gBcvsG z@9?&>v-9feN=!`b^XJe1{{35AS-!u&9~l{iy5)%lnhtG-GioDF=N8Q?7?hBb#^ej<&t02-q8^B)AqnEyfm zvuDZN)B%nPE&xFKPl>E@XuF;X4KNo6E_%QhgL$?a)wBSP(c=y|~%yL*|)&4O@F>gULyy0T`LyX#IPfFW8lek#iOakwOs zPMuKRg`CSNU5E0i@SFYJZ_^*SygEHkrNSx+q4>HXasA|4f`<_rjyFW9 zf-_9{^b*D%-G!A{d{397feY1fjZ?#Xc4s~B z*h`5qy>3Uk{lR?A`lCHfna-k3dEWQ;{*xoGf4z=No0UvfvT#v(RvJ9N?%82_)bN!E zdFpC1bs?X*$HY@H@}NaMIao(SwUjA!?=Rjmm|d;$uHD0s$YhQTd6kzV=EY1hes4?- zSE9G3k8U-1-`Fj%p?X&RX;v_EQqFTC#qRO)k{RzY7L zn`XHg7S{Yrhqx2GQ(`mruke1Ki8lDKz{Uy%MLG)l%(?@Rf zZ1EdE1$b*VXS#Owr?<{f89BWRD35sYt19MrPwmhhEc5q`T6(21LYL1L2pUN-RwbA{ zBrZrFdNw)zJ?5U@->*Vlp3`*pr51UVKsUch6!N?jkEevE^1c1z5}T?Yk5#45t1>Pa~-D`zz;WiXZZ1!>5~bvzpL;^U_1~x>W(3GF+FxnW4NbWYJKCE2#$foAHSM z+G^wV)|4MI0F{&hqC1WPeH(wJ>)3KS`3RBA3UWaf6PwkMRp;fv#o=_yW<_~OBeR#> zgi|>gIP#dpA-$ciZLZBQ=$IDEB!TgC;pO4O+}2gY;OIt8Sz*2`MplN2)uEEI^}-8J zF8+gGyhe=ybwJ8eHLkD7);muEH|j9ljB+5O1$phm*QnP`=k{Kc8uj@+dV_-|1GLJ! zF$2hGKict_aCfQ(y#B!xPfuOLj<4+0aIE)k3MGX~DZeN8e67j2P32qEVS;<`URJ^R zV$p|Y;4~bFjyR3mHse#5^5}^gCB~nQW-q<--bQTg*0!_z>#Pna{JV=C;B-a#KQ8p; zd-X!H05^uDCgNFlC2>g!UEHNNDGyxVO13v@DLmJ>X+iPDOEyGwcs;w32Ag)StawM= zXW=#07a(WVYKW!e(%-imQ^LrLyv<)$_FdS%i1yYlaFG!nkFk#fCo4h%l-av0Z~TP#UKl6c&`AvZBv|xPwwG%hJ|(-^vxsRfUy1^9#`Uhh?b}$c%iV^m z&rcR{#j#7CRYXP7&M?=PpLrk-sFzyXTbG7FLY>7mGxH{(JBNJL1#XV&l_NOnaX5W% z!My~(q*dFXSkhL3?U#!iHYs^Df*TFK(Cd1ljg`s?nl zHp)Hf1LXO>kOwlX8e zgpoYhn@1}@REX#>nsn}+q@Oqn+u1f{@KmA+zj;I@RxhO*o+(?p7y}oz)coWs`a(lP zUQj+4Qqi#vjQnYDX=~vd26ZzxL&BR=Ff0RF2IT%N`GJdUntDl0|4tubmTWyv znoOHIBOy2*v-5l-_}xQV5MvD|U6ddv%O-WBHuoYtf3`nx+dJ$>kyl{FV;*LF#OBvO z>xDP6BFOGa52A^?--}oM`hY+4b?whLNqq~bld8v(wmdBhI)39rC>=BNGC;1>K_SX5 zA-YF!;}@djF}#}d{K-~Kx^lgj3ZNrlf19wORVFVZt296F`)#;=dfG$o#s<++$M!%C zdolZ3?A@D765Gnr^t6P3{apW+Djrc=P;bhY&Y_^si0s(Ct@d3b2#g*nf*?xg z*s{wfyvZl@NGV`i*fc?Azzu|0Ga47nYk+A%F#3QG-vw*n2ku-ZU6`g+y~kjPk$WQu z300F-y|519_Skar^_nPH*fd6V^vgFNx7!G!p%K3pNY9@ZJD&6C)gmHY+qYq@4en7^UCKgLtZ zGu5bZYKV?U$@3Y|_PigX_3I&wLUME1Hvh${*N13#1tgU}F>|Ym&xVp-C8GiiagLSc zkSpAnaAHEzg6XqGn(`FvBw1dJgNruJ;@qqoJxi^2B=y!>aDZuM#DSPz>`9$Vje*Az z%1d02c4Wo@W74##@yIK+{q+=*IJupU#x}3ipzm zRi2SMiP0i-#^w?n4i7$9j5=0H4;kY>32ttImMULL)5m<><|LA?*4ix6&Vbl5QB{>H z5Y%WCLZ?N_VVVEI{ILc-Hr7F3m3c&Es-i^zG%*loG;l#AZ8b2=EnJxR7BQVM!I}yb zcpzjMwt~MwpjX%+?E?m3UPtn%jG%$gnMm5}28(BGA=tY#Pm*JR?dN&81hZb;ep=o_ zQ8!5-eBTL(&;Cvi9tHO3UK25J2xVzL3~ne)*H(a+_~EpPLXyCF+beDMec?`l&#;(^htT+Wa`GjdM7!b+39n49<# z9lH3z+gwhR`dJI_IKC4HgLH>sLId4jMXRaIT_fe_YLgRG!4Y}h+f=aJ(zFcSl7-(8 zkhPsM!V@El;uHT+k#WMX-Tc|>n0a)4ZIROQUrVx>_^bSG$qj`Pu_H;F zWX?iw+m}#*(k#Easy;WU*d@LGn$;=@?HI>mGxDi}1|L%RIvKxzs2zQJkGG0rnZUMV z7M`hK@Elj-ScdAt3?Cx#XP`)lS8KPeK&5^N?>R?pS%{!jV*tHB^bgit8#IM^+~7wn zfoP?}E(Y1CNkPfJ zXkzK2`fvqwek+T!*ajAraEjIN=Kf$Ah?#aT*qd@Ck2%$NSV@U^AL=(6J|bHr}NdntwZcz4gt$^VOy zXdow5L%x!P3y$ri#`|&+v~O`Y^A&~=P;V6KymI_hR6E-to?w+*;}tdW?Q*UfFMfqM zR*~)50tq#9xouQNUtu`h0j@U$Y1m}Z#Gx=fbZWIman4Z>IV6OR4q5G_@v1Q@r#ZzF z_6e4}z~NZoROx(vXy|z)dOjiy-Z=*eTZWYv@h+_Kl@(*!7BjdF5-x=CXl^?>Rbay0 zJ^Y}00;9IYtD9a{g*s@I`W;5;1uOI_quBf6S6DtVzDTI;{0v!j%h*ssdD_)6cl zPEp(~C3+wtf=9c)BSl*P()GBeGzij+x(`xT zs0RJ9OSU~J8WV!gTQBTgX_>A&IX$UI?MN%t^9f4Nt3-l(owrL4k#J+@n4jW|7LM-B z&ru_+$`Dsi|1JEAwdnJ1!5?PXTHYbwHrYXY5|Am)J`G;F&rsusS1UAJG(u!#zRK zPST*{1NNXdJEx$}ZE;>irWimtht-gvLY0^@tCFV? z$*I@8M^^BhOF5z7t0uw8MicXUD^*xL7z`dQz((s49|hu#*&Dlm4pH8RO)R=vqo(UYSSh_i6z>Uk)WW#>a1dldW-^X!D3yrKn6U zc?FN_C8hne<&JKn{Tl1S8mj7VFf$5v$@-lfp@18Z6%Tx=RM%&vT@1kbQ4ewJt;q5L zNY(FB80v6=7ObSYKg#ONyBo%bMFPxXKw4=Uqj}%`*A@l+qEHnwwy?+J1yV@QmIxD* zb_%yN!(xquM4Mzz*!h=~A|qS3TQ~>yd+~A#*gd9>N#mUd&*(@awkAJt{?pNylbY1V zhX8AGb99RhV0njVe%%VObw&<4^6Ck`5A*T%Y13)RAA)~rUHX&?=F+*a1h@L$7U!aN z5Z3nQim`Q(9Vwgqh8@J15$i<@eSfkMYU(W}8h>&;*w1M-0wk||(i4eF%lxrS{j}gY zFn^xPL%?#7Cpk11S><@eaRprIHk0tIQOXTk9B48wPEDp(X7f0%?jc?`!8JYukCv#o zA8tYDD%yg6WbOmyh#qe_Dq#85h^Si^z;Vtp!e|qbl2=BI$ckmyDGpwV)p$707Y90Y zestiy+%YH#ZAaqM%KSvqses-1kwp$I{?|73aia@je-|b&P zs2t6YmBG5$Fw^b83Pu}L_K}KUk%0ChHb6K|Z~OyqJ^s&Mz&jnSOgZ8A`O7n_k-o3| zIOES^e_q>SKuGM?p87WRLM9fNAUz}a6sYFCoX`EqO3Ds0ryJL`72N{$(UAu7wViLJ znuYt1cQ|$%n<_pqG3$l#kz`i2!jTNGIt5Y}1P3!2WQ#^nk8PzQCR7 z0Xx>AwSSjbzUDn_wQ-Y<=&59r{$F3=g)f{LC3e$s)@`hBT zw+N$U)=j8+R8jY@^AfUepI-5ky*$ou&`41Cr3@iO#bvBQfjJUSn!fTCuZ9XK==|}g zv@I9|3$cz=(igwObu%_`TQI-Kgb+`VG`*dmGDigQLhR5mM^!u!Kk<-7!AG}<#v#zn z*N9KUpf8b3!?|v_qjzO0W=la$=rwOU-UU*aC1{v;&D7z5&PIbgG*2ACV`pZvkC71oH|5Ny~8AT(*}oI^NqY z(OwFWb`OL`e1p1XqwH4-;pH2Kw0eWF-`e8ChN!sewLq__9<#=taA<`WFl;y3k7mvq zZcdLp_z>jCmlp;mLq0$ufY@kf42 zmpglKWD@?-A9d!{xme2^p9X!hs4b26x}C24qfVBR`IddJv46ZBFqzS492S*vA@X4N zF+wW;Ua~RA=#aZ63uXt=y4Mubumoo#qS>?{$|}H_+E$-EBk6K4zRq=HNN=6vZSIBk z1_eui6BSMC#!l$PYc_R|9sm>Ex{L)l;3#>NKv+bV53OynnBcMKQ;N53t=F7TM|p+aglt7#kH<$Whe-Ct(Y#~L*Ei3^Osf6&iJQd{zFlm++UqO^*tie z3rULn)7D6DLWy{9c)cnikeaXjK@#^zP5-eYmyBV21P5V^a=d;rShOS;d(aE3feF!! z>gA+~R0sRm0N-`rFpMf03j+qeXgYdOq$frc{_uSaMTsYCmYiqYQ}XH4xm)a!Z1% zAy9!k|7C7m7?^Fve;blF&iRfJQuPhj{&2b500)STVF}e~-zcS(ftd}`I6UQk`mWCQ z#R!692k|*UGPEp%L%7~g2q?)UT@M6nPZyy2yc+#WIsOw7PtN}q9P~N1YK@{05j=4C z*%5}tg9$Do?IaUzwX+j!Xx`T7t_wwyCs?!K^6SvQ+mF@lOZvan7K7u3r_zhz53utX z^2Z8oa4qL7GM%;$17`RV@MH+NGH9>E3|1cpWjeaRD_=YCS z&$?yv256Jzl_Mv%Na+lJirpPm3}O~OAJTQ$>L6?ep}{mw8=q1to6aW{vMg4e$nRcf zzX2ZPS@=DT6hH+8NANUH(5QBPijtp4dz{ri>clrZ?Ogi`#gBK@sDbO#l4qQaqV0>k zJXLz5d$$kEu*azUAao=l=+l%hFF?h-848e8zKGGroOu6+vD+#o-VtBLu9wWp{Mu#b zta9&g7wgD7{SHTARjw02M_Qp3<^dDJa)4?!%Ymlz(B+V(h}=Zbk%pdU>D~e1)tVUq zU9H|{MGE-TK|#V_SG^5d9*pdYLp5;d{~gGgOqD-{fgMgAbY#e^-Nj+LDq1=9;9(`QL9IXwnTKKo2@hqi{_o zjPEi2*{ez@Oc_)SmIV@Eos!BQdR5o=Kvm0>=yF3C=I+^pb9JYGjVF9cM<$*o_VB+H zVaLB_^r-ihV%P3DtpGggJwG{axvWoS89;6xN2;W&}_sitYHkI+p|=(UX`l zafk(7{Rf>~aC6s|mI!z*)wO3P^N|nD@RI{aAjOg(XqG`Wug85z<9wwpM>2V*))_!W8#zRh4 zva!MVXt>Z-mk$XZx5AI0S86b!(2b;5B`?Io%UC7;q?o zZq$O4!X9jQG>A_Bi*7Y@=I)HXoDt$>9=umtB zeKnX5CgP7G@ZYm}Mq4TQL{YjYChh;4VNsDX1_c-i8~!+e8#*Yhaot*JLL24(cs1u) zCB|oowxI&Tp#U3QB=1mEt_{gkpEft*^m5U~IwcGM1E59p*Z!+5Iv9gF@BdHHgMBHq zDkA99AggC|Zh2u%B>g`uMG{-eE*DVne`v~5ySi~Ul=bB-OHKen3f+ADOD(7J3%2E_ zmQ@_mP^-A$&3}ffh-T{*P-PFI`_DGH17@59d@A*DED#g`H-V@mT=W+N(uF|(lO#&H zv3~%_{fhV>1F|va=O|i;Z1CF3V7MGXb0T+Vnc5H_l{Dhi7&VM zn?hc58G6F+LLDrk`xyE89`G6$;dv+z7oaNchA&u7%C}d^R5V4lM~$A8QbYwC>UJdM zSrm%}i3hC^z`FPG3_IGLFE?=$k!O|gSPifK$1#yGFZ5`7@!n<6^r=Kw#oX{bJ)2jG z<@Bdoq`t#Xp~to4g0X_31~Hcx+cd!Kt{F4mDR?gQL^D1H&Yr8B>a;+QLOj;D*6jiT z%JPE5UVT#;)w)S(Z5jyjA4`Hi!;46sM6utvaEYDe#71_U?I=jIc%0BO)V%*P(J5}E z>;#duLx?OU_?`0rv_{}wFN0<0cYe>*yM`RnE$cMcYMW%5^B2@fA?h%2FWi_#%M!Cl z*m26p89aNTHD_N7J@_j`;{O~MpbcV@f>XuSEr%+XmC8@h%P?`Gtj|8IB>X2>G9Vin zHDF^I%S2Gl2M+;Sh&R>)9yij^OR1liXJOiS|CyEZsSs`s2i+O>C$liNimKjf zB0mi(5acIMhhmy!3TqKr8SNjoWi7}~So3ZOmArdib`{uebxkk)4n_H^)Mi%=Q`Y$B z)b^hwRW2c5;YN%k7Rg|WD$GXC$3@*eE@5{O14C&%;R=Aw!**bMFI@H6h@q=;ad=!9 ziaILvTWWGc^2@9;7yjgIbeb8SB&L!@l)`s~0gVIYx93sEpl}k{(n?3c;KdT-Qkf?o z@{m&|OG2b^qI(X-Z5M%zSx92%c(F0G5twruVarrReE{G5da09#nMLfF>>$1nWgz+i zP*klQJraT&6^3}GTKQ<3f_-Ql&05mAXo7yS?;WXi40eLP4}PwS*e5&H`H~5)N(CI@ z>u;FlY7Fa61sM?IZQiJ$!6TvjPZv^{<{qz>Zi4tK3W-w9TrXN9W2F{o+m@C*R$||* zc0BG~9X#ARq+}jO?w}{R!Zlq?x6L5toRWLK4n>3kLlqZ+xD)r2BI!Kw-YJji$8kDm2VHfT!*uYzXKA!a^; z$vdznUW$!>#jfiATR|Ny?!uJr|6N3nB=y4l`16FC-fGFpSBh16(jbC-^UUX2N)6)$ zNDMUPp#zYYJH03Ku-7wJKRk7X=9GoI#(X>%El-yaCpp%|*1_|Gj?I06k;`=r(BnmW zM%7K2sd0%l-V;ImeMgDfY#sC}LB#jw#o77?pu-v=fe)*~SpKjSK0adv zzD41gVD(-!JAI~~lhj5e&9NA^DS_8HVpuPin!b>5iFP4*KjeNsLEJQOJoqc}5aV_7 zFi;Kzz8Zx<_ud>v4S!`0;5{_T&}_%~X3-k9Ep zat!bEvY8Ll7qj#NUu{@1`!-z9s09b*D`0nKBg{9LR=141T?n;)wiZ85Bwx{Q5%erG zt>!9{Jzxq8WcInm#jd~)X=NBK7j+FVea61O@~yp@-dUAV45;?a5Kf*7EV(_T^84#! zipKKjZ+QJOB_s=qT8f!fhFIDAY>G_INC-Q6gu8Hv7Z#p>cY$CFK{XWI);C$@o?%E~yuoO@_ zeiPZeTJ2StpEelOm0KRnx?J~}Ppdy*Nq6T>krf`FLv2mv3P<1HF)banOS9|DS-m)7 zNt}tVvVGhWp4X|dMU~t|G_yIVUxsbOIRp$W9Kux7?p@^A&!t7+K`VT^E(Si|_@H)l zB=nP>9N7Ja91*o#OLAyzFPj!PB9y4SgI8(0hb>T+fuUKX81M0H$8X$m2#%a6gW{49 zI(ytYXrRc7)@pG+QE&V43oh{=avT zXP8-km%0T}ocIA+rnnj9+X#=1q7%+0Bu&pjAg2x7Px6`jGemx!#ETQ z3y`1s__q4TD+9Yj@3a0$hbRIbV9J7vU{|tvk|<3Q+;ob(=@RJDQG*c!uOH)p6we@? zXv0k9!Vu*TcOZFlojw|++L-uMMHII!6?Ur$?Ik1F;))*z;?A46O5#XOupTpu-XOvu zopdGxpnv*w1i|A9)SLscjid?0F(ZE0Fib?u!LB6yw_2!JaiuKevt(MB&v9<~MSO-HUMZb16jV zzskYrn>WZF+y~F%Shhnf7@hwxs)OO`b4TS6q|gvVf*{a#eA4LE@?I|qYvJMf_$0Z4d?ScgC6c$A2GL!=4VieNes2}Z*w9NT+5GwUjH*}-d%ny65tm7 z>10nz!M!|LW`!bqep{=!n(~+RMKjb^m@5^k$~Sqr140d0ljo1L0wJ zyzNUnZ;bF2rv@qy)4)RCN`~NPDKa!PyeX^NmYI!lq&ae&qKTJT)sI*pG2}Cx;JkZJkG(I8e%r`C%d|YDP;xjyR{E zZ%CXj%|`j1Ce+1Y`u#PRw7GL91Yw!q_rBT?co;xIaIqRa+>;R+XE*)L4={C7eO^iY zBz?UAbs;1A|A{V8>_61+tY}VTRi`hQ93?s7&D(U?#rjq8G)2=%sy1OchU3lusD1|( zjX5P6KC^Vnm1V-*X%#oRObKN}6IXO4YsxmLOW`)-;Awdhw|V?w;>2-vzHR6&D65aP zWMc*vkWX)&kowWbo%bK6dx}p!`r>$5{g0Rdl9zsy#n8P_M>j5Edn*RCalv#{z$VtrC z-MY4=z4a}M>J2qOOxZ7(__D3$%0d@~5v!kpM8FI4Jcn&ZV@fD^XQ*Vly@G^%NV0p+n?f2Ec5T1>9Y8iDF zMyAgJY|4nEkU*9WVV|Dj=l7?)PbT)$3lA3>P^rZvy_!4X3C>ow1j*kY4%;#dGNc|YTfW~>%t;|%Uf|1pW}dSV?n662@`UIaz4?rRUzrJN)npTf|p8Y zkYoDbfA_dVMEwy3g^w6HQEX0q&f=Je>|}J0e)BeigE!R*BRy}j6~GgzU2j~iT2#&7 zcm7%rJ(;oT4q?eZ&XY)NXwF zI)I!={i7XAkSfL9 zk>YLObn&+T^kZKY&+fC4VaAF&dI}^^p#JFM1zjB7$bxt(QTB%~h!SzjCg7ryD5&*YD`$1yd1#`bz-D&XdlOtcg0(^K) zZRHXe)x#XeoW(otOFc7_ebS;<=ZR)!+L`_+>3o_<)cYUx!3;5q-JSnqus>JAF*J5* zIp;jEBI*RpZ`dfYen>xO7{SwPuN!e1+8JP1S>+wFFf$MFY4wf@L7bVdGveYhpHyii!`ik|bWd{oGwPqx{@5 zNbJ8r&cf4fu%C_2-$y{cbOfyK>|2>&6)F#v0Z6*sEQd*_*Xyqz#*;PMZPQ4fM%TrG zR4t(e-+<}~{GJ0iUa$MvdaXiiwiR?X|zmm1#RBq5pq9)TEU9r*beTqjg~w=;$ox5V#0J%@Ln(`3`wDs8GsNx{REPw1p1eL?;VYO{0Z2*43bC7Dv_zBh^4KHwS5C1Ul)qg>x!ExC67uuK1YYq z;wS7d9FJuWg3vPivy_kN1o0r|a!9b*Rlhsq*^g{vr+`H4s!5v!;J2o|es}7hFIYBR zWel~~+2iIsNulaoFSR?FwPbgC9UK9CR0u#8eF#A&OmS#aVxzWF0|)Vx(uDcG8}yLS z9{_R*Q6qRAt4i@dNN;vl?mX^*jLu&gNJJm7OjGP zoxZ2dw&!>=eSdBIiwLTxTO6ef_>X2R>g3Ly4y$KcV!h5H4dir?8%L!MDY}LeZKjpX zoo}wp7W#wGiQAmj^2{Q|?clD>k8?X0>qDnB(ktV*mRUJX&N}x((XT|yLir+gIJ=@PQ3WGM5h!-_uPG2Zo#^%aI??T<@_-dcQn zIWqzUpSkDB4j z3#_szaGp*%EOu#r{PC{MdE_t6WnV%MmECvrrt9^@KgAyN5!UdhgnjOZ_Ht^h@_MH% zmC)-HiT7d^U+EL&leMc|Mt)&iq7Ehr@NQ-bqR|x9Xg|y6%=Yb7zkFft)4psuJbYug zc&|Jtc|2A4d4#>VDhr!?!Nae6I_dOkk3e43(X$u#g~y(~YJP2IK*0;i;HCJ^A>qqg zYx8heEUowf=LZxLpSg_K#~qz+Z3x3J)?W*1ffkqAhB2G?MU6x}w%2A>r=qD3_k#xf zu$mvYPY!Lrf2CLcj7;NY9&7u*_1lMebKKa5U#6|-VI9~LlShOPQJxCsr8NDQSM0?x!5{~qh$3T>UiL{`08C8kGGz`{3Qma^}!DhC?E@-n7cLghjXYg^_*5) zPjeylh_Jq)+8{&e!AU3jLwm^83{llPA|@Vk)haCai_(ZP=Zj* ztxQI9hez@wA#!CyaIeK$&2`OYZE@W6t|4#t=2a^QgEr|lM zt9iVpWYT5)Z{5x$an+>znnz^?@PHxMO6+ILiCst~hV$XaMQ_btO!Gv$A)QETks2*Y zt*+W;B~UKWXw$@_GuR$$H8T?(oZxXv>o*fiWzI7jjIk<-S#+k_XJ!eWEkyh~rHyg0 zN(6)m0Ow6Dq@k6kIJTDxSbpqoPZK6lS2wR^*d~+;?gpuMW$M8Bn)S57!g&avkss!o zgKzhPE{0`Z>rj9CX|3eQ)sVo}_LzG($nYlz`U4zd@+h*>kT+jYP*#!LXH)awi{(R9 zk6|iZI#^~hkg+o#u!2f3A(QI4FVF`}lj3`TK(pG=v`NC!k1E$?3&InF)kHr`X8dYm zbp^I3Inr58eCZ+H=Zvf3$+zQ*Z1?dsh)dq8lraGaU>ku5FqkZ`T73qp<3Cb#C7M%M z;&uI;&qf3t72}1E$sq$!k0-3}R_rQ)=V{(;1h8BU5NOo~oHQ=%suZPynlcpNbVbhi zV(ZAzY^BUY|ITbWldjI7)%ELN=iR2{eIyIG;s$y=Fj_HnCUYxB`+3ELT9_*Z6>w$- zC)5c|<4#iUN~dZlrS%uksD|i@`7#nfz7oPt*ELjj(61&u7hl^yj?zF@0_C7cpiLFH zePRC3+$#$cQ>Its;`KHO?6vU${!Ul_8nJ;GH{zb4>UQ~VyW<@_YKNr=6_82>i;W7j zDu^b6k89r9uJf5ZBZkHA{t0Es8dEDb4Acc2INe@iu+)cvpsO;o+Bl*6@uZ5|b&r-Y zV@gS#ElyHk`&iPcFGR5H%!C6r1BmM|x#260nt<|i(itD)TH78z_ zL6s8(Y_Gy6=de~9p1WeE?edy%&JhFrr9Y4556H`#{xg$zc%febokOy|auT-7C zr1R9>)16iN&f*4ur&|bpHs9ZTa4+wEEm;4{SWh8zlmd2rea=cmTE&j&KcstE z&?jyRzexO>Q*HIlAtM1oT>U$R5Y`V$7{FXr$5qEBmKR17o^8CFnGcW;Mbcf%6(hq% zkOqyz2AV+mX>p4%=`rHg1A(&qu@I^*_fLTlbg=$fFJs%#5KyrsJZqx=^kB0iXaK#A zm@r$MdGynVR=4V-D1+s_rtX)}T}>&{OSA9zK^(VLJE9+BWvyq|IqB(R;56k zp`$o4H8#rcC8%1YPiY8Yyuu6mUo)KBLVz+;wV z-ulbQh4?^}y)i0q@CKB|xUZ}hDwG_RecTxiZo-`9 z0nG5tb|kH(J`laEBu#*#{%sedgDx#~)hN%+HGjRe$a#s2vC+w|g$(8@Z8&5uh~~pV zu3{xS-jgeAyB+bc*+_&GW8`x${4mLpw153;M%J5i>ZORVjHuFiw09sW|2FPHc#1H7 zXou)QI3o>lFxec;QUj!Yc1y#7@;d4Gv(Yn)pJ|al16nqKh5yKtSCv_wwNiv_{~2XW zc{=_w>I>`h-^eEmSs(D`Y*v=RsfgK=pfVZM^N{C8x$bfDk5+|aP+$H|Y&C$)U!<*~B`uGqPqOD#qUSnGBlzd8`+| zj{+{wSMZY&2#120F@y(0U&|%RgT;kOiW^-=_V3dE@-QGEh4fwb>X!o9wCGu^0rZus zp#$FtMVA*o%`c#WINBl7C$0f#vlZa2<@34!4b`iYci3Vqh)6l)*G4IM$J2n7JW{oT zyR^F@%pQMbG2$I!dh^u1B@FZ7uL=A+hn!y;)wa04r*U8&j2A94zKYJ7z&71`+TduC zbM4xNtc*fPVV7-wLTpKR=lcBwXIMhTu8A)av9cyrAA4`dLeWz`NP9~UW4u-J4)1gL zPCi61nf+QzhVFg(n7!%DtRrfrC&DU>YwRwJ_n3%Oo!b;r(JEB$8hEmLkT~vfH1C-; zlwSH7E!WHnN8hNL8H9~hq|*yM2{q)KuY(D{=lHuxczB0Tnp9Z z6_P+Iky1k+nRO0XU5nWAI-20jl2C97y8Yu1V&8+iY`3h&)4qE~t(3{R zWyHzt(-Au8^g~-)ko711_a~>>09;Wa@ z*a$VQl*QZ180Uu+d5fIdUi%6e`5MaHU7f(1WS=<~)KV7n7Wdyz6Kw_O!obTg`AubP zSEdWdK+tpM57!HX-u$HbdwgXQd?Cc`EZFv{!SNAbT9!ebZ)kLX&+{(GM*1E@ZUVd- z|NUw@)9tJblt*3O475d|>PWVxuDw^Pd4$3|P^m_L6sq=JDN1R9*#fk@`{Xd2ZZ84b zAr^fJzToMeKF^ikiaqeF?F41>_=vzh#t5w~;dcPCdsJL};;VpcXP#3T!mr55bER#_ z&dU@c_g_hr>uiOf9_6RH_L4fJjzqt8f@^O-M+BW|5=Fe zC3A2HLltMp6l*`t$IhAieEQY-OFb{L6`*4)*2@ z&bY$0&&Q)FCvz#rkh^qgrau5^HtTl4FgDx(96tjax_x7`N76m8g7y0U>+Gr@qI`n> zUck{^(jeW^%~66NA<{?*(%ncMD4>L>ARz*$($XOfhoq7g9VaL$-Tj{5_b+(g`|WP$ z`RqKivvV`Mv$IKL`1Pwy!R2ywY47bWgAYCj2}OT$$JQ^@*_xchsnh3xFYAjIWZ2`$=3aEE<3Tfe39l=%a$DQegzc24yQM^m){&;C+<2m@75+7`;0 zq^<53e9uqr{Y?)rR4aO-70=C2A;7%X`b8yGb~=O51pq=Y@8AbNOb=4%=3|^FFvsev1OA*qNW{BQ$1pH{RAUO5i%%tGW216&H$Y(cD&G z_4v5kX{BsMz>b3muK)EVe#c5#H+mO`2>{{}yRV-Tz+Ut4SMGe|ZcC`iJU~#*WG6NS{=7qPPpSJY(-PzNAQVf9BJIM^A5B-iMt`jSvN zY(}NDD5@5#aV~irC!r$cf-b{gnEr7%N`;jNXz1W1l$#ruxu$sD@ket^Zh>G9KvhnA6$C|t7{)hY@o-ShI z)6?|Udtau=1Vn?Dc6}Wozxf}9-|5I)Fy)Pi$sO3hvkt%$d)!`1CoLLQ`hZ-Ig}3F( zYGmCwdPJEm#FKTnSH+GQ0t~hzuA^SWSkL}h%;vPu{Yn1;Bkbw_#q8z%Tdv|~JDqCW z=DaPM6rz4yCLCdXHw~mqc}g-l7kH_meD8mphz64}CNQ%DY$$>cN-t{p?zr7YWMsN2 zW$P3EtyXGe;9H{4xUefu&xAJNlSMkm>ICJ}nmdf~A;3J?s1XMs?ILr*^M$ z8E8oqzwIH6EQer4WQ2aZf=zL1ReGCe8u3HQK-VvHGba5jBt6o};S(ew%0?d!W->9# zF5Gxge?SB%Ep8anWrC(|tp%hFeh0=^ZhP+vCM*mn{oV^%BKQu(GkpIfu7lt|7E?dG zr8hw67I?)48l{fneM#C_qrb{yA_XeH=H+GS4{nC!!3lx6xFwzSnwVu}roF-!p1!pF zm4m*{DOp4ajT-aMtl!#g{g4DZGM^%Wq#^(s*puv6gyAGCc3vPPpQ7=*;kqsr+2}B% zU(QkgDYMS-ecYmOga^GGMm_JM4T5>}`QY0eMFiD`{x#a=C9!8hVt?7-ENqKlB*EdY zHWQNX{j_7UlzYi$-G50+4AJZ$+eWN|P89-6T?`+gxCqH$KQuRhF@NYK7__viFaxi zEJXYqyWIlyGDNgsINjLoZbc zV)AxI_Cy-f3{>wBVmLq?x(MD$0f!Mp9NlLih=Dw|gK!W4lAhSKUB4!6emFY}sEu~* z@3;fJYHu3$V^3EKg3~E}BnRn!BRenO<49sC6h%=N0jMtX`)4RJ83^E<_;KiD1Bjnm z4uLwBgg}FlA?70)Qk6RLaYx%Ldkzi?__>DtXE8WXPKv^h3NxUBYY>pAS|QLk-#m-{ zqfCP%fCCPfT0n#Eml2^u_20J^P3+ z2=EwP4%zm*L-J-}KC*JWAM+n;a)2no`{?W%)bB+VN~nYGWKD2SBr4Qk5vF{27 z6^w@Go8Q)`tZOp%N|>H$_qQy1>%yzhr2J^Lz%}_~ zR?20GI&fFeq@|gQ$zW=pIPoXe?=a|~K|QA@{F*FriiymmFa&U{umH)9zzF@v-zOC1 zkp38Fa<6v|EI>Y%w5KdbA&|Gedisp4s%#6+o@0BXbmaFvt)=3aLKQIx=GRemUu>S^ zrU3&OT{Qv7Bd2_@VpEva`WYvkHeR^X7o)%=Yf_p0;@`LB-ljUdPx$qx)RTBU&LLZ5 z`Tbo#qNd9dgCQPZz7@3GJWS`P>OoK@7c}Jm>2{|p-S<{k|1kx{iz)6UU{IRcGwR@f zZ<8x7jph4tB3L>6fZERk)ue*l1t*#<caXVE^GCh}eoZ6s316Wb=6p@I|JPjW*o6n(WDgpmS21A2zZF|7aD zo9|htXg(GFmwv5!6CcA51Ynum>R3X=3U92!;($Ku=oAAgmKbSiT>gVBf_a!8HoE=_ zfkAf=0=m`O5N;+IdLhpd(@CH3G=&o@33AGPJQ&)O$uX%Jh++PFOy5X@m~Cfq5_=t5 zZ^sfKh6tI<8PaVECmZdPu%3Ev#fYkaIXWm9I4p6tK>ia^*X5i!f+3HaxMq+Eie`jk z<{JdAxS%3mpw0u#=v}|iuLftqO(!W@V4wJ)C^AwKA8iealdx()o=i+v4&(F!_Ji2T zLml^TQEhf%EoXsPISi&keP(J<0#0rO06y;yjf$-4Kwu{2kQaq$f{-_Yd(ticiNN?n z9$VWgsKr3OrOQ=2k@>uUN#>KwyyjX0t9L8Sdc+1M9$)0(+wJyxlB1yKXKtTIs!;=w ziDkn|FS?2OFx?L;nW@4<{R((E<^tyq)(Q}CrB%`XXk$lQ!5RJMOyDm>(lPq1Y}1;o zY9y@IJ$(>*#ET9Tx2g1)OHUSzh`ZE>iG?nHL?EAn;{jpxc^Gi4dpK-?2$3RQXbgVB z(t%f=;h-c`IhQWqAf_@I&=tbSx`n6wx;OpcHW^m{>d+|M91%i|iY4q)Li7(kdp_eE zGbfMKRZhN8+@y5~b?}O}GO9~f|IWD^TJldMoL6TDO<0^XnsV49=JLrs42lkabnQ-! zuzo}6b4aWVw6V)pQ@w8YRrs(-VD5C6Z1gYO)l;Gfgs=p~$j0w01$`82QBZX`^^?V{ z?><-cj>-O|e{CW~aj?LP84y5FTL`=Ku(0SvmpmcLE)f@d&2=Gk6Paor$0x&(`Ui7H zF4uZ6ucHIcwO9C{&zRBj{tAj;eTYzx%P3HVxKvY{7W&4#3-^r{#g&>_X-|X2v_>#U z4Q|iM0tzUwCCB{kRtjET-dio|x@xL5sr{24mt+W?r`-bF+cOQzv)agO$w>7Qc~uuqPWv z%=5zw8IF;|ngB(BvlaEF(H*O%2Ti0jWS2A71cs1u4{%$wJv@f9Iz34DN~w$dx9oMdz*=WIV_fR> zYMqdb2lZa2mS*cb0?GweDW2$OUr8>hYWE9iKsbQX!kTz;Px(bL^XZV{I7SBUOUb);iIf`Bw zJ1!qw4yN)kf#rQKZ;&xG&koMIS4s?&@nfXnOX&GHh%ACzg33bjj`Wa<|2K{DES>nq zu~K~H4^~@V=s)v=PI&l0nVkh%6OIR*``+FV5Go5WH(I~cWikDkP_kdCldE)?+RUvzNuYSu02l~h| zQ2^KZF5~eJueQqQPjJj0xo|o?Ay5NYA@Hh8R)`_qji%XD!yrbuv?s=LK;+MugKK|?;u!{O{(9%c|DpG|J$Dr zt@#DUxWl|X9egN)zvmi4_!Xe699l&IvE@oJ|9d#$LPtp3MCeR|$~9)s=TS&5`TaQa z1x*7%6YiQlHwVcZ_R&7jb{BN{5=SYdY$_Ckam-^v0n)DwIvC6qtn7;63)ILDDf#Wq82 z$Iu>jsC;O@^_h75V?LAukDWFv>XaE=P9l(G!xGbQ*m9Df5`vlAab zfPQKuYGLeX{UV=6_WiUUsu7ks1hM%s9zb|y-4;alJS=LXkw^@hHtP&R zCf03Cz@;UKc{jNTDK?AgR?sF2?>x!)lju(?4Mt^snIOe|2hM_E#J8dvj=UJTZW($! z1^)I%mqAHXO1!la#n?pvAsVFd0>VzM8pZA5czi|Rq+$IKuP77*s1OgU8+VTt4JJLy zlHmZe`mm>UMY&&}j}|&SjD+(^@lvh{aHf4af{flSaT!i@)oXx_rheL?3PbIurN7iP z4Is_g5J)#_@rXrePsZ6>bH7}$lXgcFzHul?iawt5vK82XutLeVdAt(j+k}99d3?{R zmIsx0`Xw5lU0cS_1`w3HX@sCOA}7qrP)`c1tPEGDzS^lV-(4nWG;70Dczioy)@V?A z!5cgk?HQw-oIo~%wRXia77$%bz7r7-`we3ry7uk$%dGQ}-i>jcQ?MVm<#J<;Rc6ff9YMq zYw2&Epf}@d1Q08?RG(x>C~y)AWr!9>BY1EQaCKV4lZOXY#oO^OV&yGhJ&k+%K)k#s8Dmm(Ak2VF6U$YL(oLqd#PEnLG$eiw=#H@IW95uIXE!?XUss{tj zaSzo&#Oja=!-pZLp^S*`U<+=sF@5CO2-MD4M3#Qs2iV}raUDW=Ti$*C!+DLrFn#H1 zuaR|umvql|8z##>XUBv`4z|&VZR|m&`*@W9c>EV{4Buulfw5l~;$s8Bbjk)avnxs? z;}#p~!FdY$w*OXdw~$OS=p{MF0YxHRn3f4W$t z(mAV76v_6VG0(iKCykC}>rwFTG^5W}l1#38_5HRvOmHx*uiJe25$`Hwl%>5$)8_6U zwm7g)au7Fq%hR99H4#E^njCI_e*M?g?Bv(h2u1LfVlQFis^~`>goqC207&xHGPKJw z6J@dquLOhx^&IzRDyRww<4)@*?cdU0_eQr%X$ZZNp?I!28cp+&%90^OsY(_axzo~F zwgb2s2V4IN8T{SN#2oD;Wc{w zQA|MLns3%M=Qkv{=UDtb?2$JKjh_#Aw%*Pc9?q3;Iw zie;xJ#-LSJbNFjwwVKur%z8n!j!W#i?0Q10(0?P}(}Jr|6ruizBV-`0Od5eYl4VXe zbd-lQmgDc1ILC;c>`!`Lz6$5*6)7=MD?+-(N0YOR9bF4ix5m_yVZ8?+UtW8UABa!a zq4o7Kv2^Q-7}%Z3NUQu;Hm@wXNj=xoph;@UqE_67eP?#o@7BJ{M=IeX2VNPnEJ3~) z^%mD=b4!@G-lOGGyj4l$5uf7z6oMPcDDmduLaQtR*eHdM718!xaBn%|YwD5E%&T^) zSZy~wv$Op3_yc7>^LZDvALNRT8AG^@fL)1@`vf`BhY!QjtWtUwlIM~uvxghKBfbyr z@i4R1qc5Rq-yhZoDx z49J8a!mt@to83B<3-e&CWq2;@9Q?k7eSc?+$}?}PIN@DUhl0hCoRdFFJq@W&rxxa9 zRo$93D(Tc2!v4QQQqbpz^7n8NgBOJ4!aNy3iog-Cp~z~V#Bsy zJPW(myYKLuQ`)k2U@#Y5?^Gs{taD3*A*m3tHE<~csF*yyxH_%W7ZNc;eeMnC&Pqv7 zB}>*DGTa9u!48>$NJa9e0%BivvYA0dVDaRXX>GTH_YziwW}nL%G-veET-|VwXg>%#mEQRU(8}O(VRB*N(wxk*>Fpo`2X(j2hS@ zw_!ykCPJ*Ws1gB_6)DHVq1P>B6fuFQoCJMJ@~YG#)vb+ZEq0(IBinD6rz{Khal5YJ-k)$SidFTNG*?H%s|?Zl1vpX3%z#Pwj#VEGgFn&So}jqeaBcT%PL!vD@-Oc zk9<~NDNjfzM4MeAoVqO5cm9QX;qTrQdn_J;{&C2(cNmS8-+xis&vvs^y{ zGt^g8rsZGQVNR9M(KmWh(CusbJfY=_?uPibf7gALpO{-|@>ofJ{MWs09oZpDCSc4I zf~z9-P#~d+?O*c<07Ti_qPK6Q>Br5{@aCFuzkJ}Pcj_%DuInFL99204VNQN4WjhM z15XNe-D=9lSI604n9M>?BH<-3FdEA|{CD9BMk;0o`?aeVyXu5Kiu9=nA5`IdMC~hE zZM5?!(`xbZ7ixx_^3nxdo|a37=$%~j0WnR=c&cKiVcy`Zr@!t!4b8`w?F=@<%)_wz zU3kGOoGdLD68Yixp{nrY z2NO`*$_$j;B7NFFmV=qX(Bdp#n;O~QOiemz0c7m+?;fUrmC%6Q{+LJC?`S-99jJXN zN7gu>p7&!@NLosmv~09fp4C1)3?n>RuHFbAe%lMXN$)(V^=r&Cj8;b~Zr`o!#~#~b z&aP!v`S1I)j6t(W%_|eAwddE{ea@scJKW4vzRm5wJ}fHYkH`;Sm3R=d|3DWH5BZuXp+t;F`V(;W!8!4)|>K z`WRpAI{W7*=28l5PFADitRxVET?GFkehpubX|k)zZhImL%A@~T>6@Yoy|1E1SLp)o zkokJZ=$ND-P7+*z>DQ(?R2Rg-6Z3y|L*Egs+B>C9WZJXn4UwTZCwaC}IoH6^>dD(W zDOmSy^~nmf+*;!a4EjnYOGJdx%Ip~)s)VS&@a-+9909AowUq|C z+r=HSSuJ~gRf&@9%8uEW*?#KtPUDqA?l7zk>>TT3jAH?}DM5-Lb%j%c{CLHy64oW7 z1@+u_4^n-}kuMY%HE^XRz6+a>XEYBuwFKb-U(z?fP=7ea@8ulI0@oCYcOn+GiT0*< zlkM}g!cgT74`v!WSEp0NQrDcxnxDX^)Q3$*7PiLF17{|*7n6X%C$0Yq{XKI1 z^p&oM$JvB(r5fxp6!{HNd0YaFLxsU>Vq5JT1+}vh1bT#N(`jnx$g++2x2i0ZU6&`0 z;5vcs@?P69i}y>TVZh)kO168`T7-(odPxby&gb?I$6Mr^8a9S|;H87Q$!8p7u%&m9 z8}cihWZEQh{)U&cRYMiF)HR--c}6e~L2TFqUWSFGRMs%`hv6y!LL@%ng8G z#5(GZXT6ZFw`|Stv+jmG<;ci$nrrFYzxcu`rro;kLhf@1H?(3Pb#^a3yS(m20GMg# z@+OtMy$^0P9R+>*tT+Mt{kfZBaysQt>3`ZW{F%pstAraNV;Beqf7dE2 zTv|qo+XKuDa##V5*1oBtvWaNaZTOvJrg(_C9(&@O;^pm8Sa82YMQ%?PAJgO!ZK{Ga zuz9H1@(Llg!d#z4b`Gk)MdQmZ$94LWQuH^4&1g;ooA`SHUoq~T(k+ps=OD`}U^nW- zyd6tePObAt6pFUb-o!sBn+B3)w{N6;q`syEtmZ=DxQQuCD6VhNcVjmz+2@*YTbE`T z=}>Gln?=XEdBmiyAZ`<#>xl}(5|&Gw9BG^KiL@MJzuc)-I#ZP>%P#H6w?a*JyFEu% zPKEGOD1qV~mbWH0*HH0@h0{lzlbnn`1_DmJ*A!D*8lV}3Z2q(`K{12E+KNGfZv{+| zVj&ge)-5-o&#xKWUUv^$WdH*fSmInfr^ypB-aAaM{nfo+;&Pt~&v#VCY;zVx#vngA z!fsPnjFOpHe--7jGu=~mX%VINX?rvH`n9!gE1c?68 z&c5_AkfUZA3iZnRwHnNqd;^W6xdWW!$UjWRpR)Wul(}E3g8aMN6e;REayBwz@czH{ zO9~Xj1BXjG@Jq0F;lca#Ho+aIdK@4Q@dE6}gTG$GXRjNXzP@QkV5UP_1b~S#4T^je zw6vsNX@aR*e>=q;XM#E9nO+2nnjwmC+HkF2s~ zrI<;SnOr->u{KHEEvxdB;eFIIE$C>?!1gzjzi;Pc5M-73j$r@%Q%iU-S{)oV@e^6L z%ZbXwAh2J8ZATe)rBK7zz-WzT(@YU6Nxxgf8;KV}(4nOlj>0mUdm0b5jdm-z1*KmT zR}djz=|}bvY#(yne@C?)4J6N>+52iq%%X(?<%9lIH~tRI$Y#J7vUR&&!{a8|kNWj= z_6I$F!@9-{#VhaBN#zWj9WF_#Z2;y^%-rk^a1!C~ZBqpDiMNV5z05%$1XDsYxTH7Si#$ zqOd4L8A2(qKayO3h>-?rglB2Up#X$S~~nnhB2*edbB z?(2Gd0SOXUWq2mv-)ow31F<)oCRy!-$^xaTt{L9rN}$d7Ss!7Kc^EzaxPyk&%hhe( zvf~@woKZ%T(49?4;TFFig_E$3L!=QXRjh;_AL5rnm8XdAN$)cDml+=xn;vxmY(zeRp!B44Bf+DGU9BkhOX;A{Vmt^p; zwjS^-Yjm88)@U`vzv+;|0RdI?f3PV1^Cu)FU zUCdID2al9681j%Ae5?<-Sgr1xNOzsNpZQfUD6%W(^9=aBdCqAFAT+AGt{HlxE9{8-MYX!INu-$fFj9HW93X z8bXc}bg_S*I^&#(Nf>#)^ZenLM+ZFw_Y?P6_h5hhibxfw9V*gvo<(djqsq5QCWkBy zpEj*S=06L%>`#(!`)6q5WfU}j38x!JB2_S&7ynFxs3Y9>JTnepv0P6mwKRtfVs1-; z!ckyV!W4!wXXyS#{dV_8A3credDf6}HFxF0-@Z~_RT>l#CL`ccmV~uVnI8nHSl7ZI zNa}jcpX1%Mj$A=vIMeUpfDMRjR?zV=2@XYpp;>#)gWp|&o7|HPZ9C=+R zj=R&}Hfw|Wuy4t`ny~V0$-mvi$F_LONG@7itR`PTE{N{v^>tX{C`3Ev1I9}Ez!d^G zDW5P%AT~xI1PAS5_~y2yc{C`ke@ghKb@g#G6N=KL_Q*W24*tR0HrrbsOm%l08MzvR zH6C<=7etvFIKQ(tos}j_&%Bkb&+yp`!s9iv#3EXq;yXnn&(@bTh}k1WQFbgH5g~EG z3v@dROqf3?tM=YfbhAp6&nY-R4@Dro3w4y>c3))q!B3)h@2pTGjqqHD*_>%u)iqpY z`>nqZr^oC8BZP)C!60(`>gvOL$It1DT<#6ogAH=d1Z&6F8OIJ$H2mc^6CQ!eUly!F zzJo>T5h5H&H6%Mwd;z)^YDyk7e$`kD$a#`^xPEsau?0A1v8D(1wFc9oh2OIyzpx`g z2oJ=`YO#%Cv6?``o{3%Bn6If%A{>ZCu zUkK6u6u94EfZRv2LzMHtKy$sTB$f~JK;NfXzpefO;|GqzdV*0EBsG+aFm7C(9D9Vf zlKVY$eU|C2UE7?oW;+*Vn!rb&5(j|mfZ9$>VwUHOj1p^u5}(*%qD1fCC-M}N>;flS zPvLy-H)P5uBRSw?p0G-uEM%e$m3vf$eQIqm6Qh4em#LVWya8ZmW@Oc zJJ%6n-Cu_6hL=iNAcHf$_{-2Ya+L=WgwuiI!eOn05&9#&(|KAbsj4>_XQYq?+-($R zigCY=mQoVfTW%>^W$bxHgzW`3&^R_+l4Nn08?k_R+C9UTrDFxu?qadNjwgwX{fQl8e40(Q*SPVm{Et3IgYWXFgAr-|Eo zCv{l*1?%w(fJDtxqjODA+!gC{y1QrF!#5#Lk&1uSpbb4BX=^1shZDV((eNGkOU|MMbS#N%(!3 z*bfMv(=Y%?`(0GY7|)tuJy)Z#(!;@Y9LWZQnlP-Tz^H#(wUmD!ceYQyr1;TES+TV7 z(5o~BFW3)>assM!P68-yoGR(x1S&Zel-L_}WyGpU!hw)T>5~8`ja*NM zE@ubc@ySZKIAr*f3?7)Hg%Uy7LAZb)D_-fa#5@HEDT4fYNVQ~f5(F^uON%tD;Q#Sy a9~6B(?HEitH(v4Y>06rm8Wn1GG5-TMuGB&R literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step11.png b/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step11.png new file mode 100644 index 0000000000000000000000000000000000000000..404bba24584e25fdd60a10befe2bb4e8b8712d01 GIT binary patch literal 25540 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 DYtuT8 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step2.png b/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..aebbad5af8f43bafe0074dcc812e74da2b86e7c6 GIT binary patch literal 25119 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 NQ&mT$T*)T*{{TKZAN>FT literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step4.png b/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..3d779047fb072b5a5148374b623620db7d96d396 GIT binary patch literal 27920 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 U90*^Y{g>#mlDcA*0y^~n0Im^eF#rGn literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step5.png b/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step5.png new file mode 100644 index 0000000000000000000000000000000000000000..ca96dca7647ade010f3dc3a63a6cfb446300ecae GIT binary patch literal 29684 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step6.png b/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..46dd1298a7b1af5baa8006db6bf023ef5914e78d GIT binary patch literal 29961 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 VUaC=2zWT>NLseU)NXaVXe*w8WdF%iH literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step8.png b/ru/docs/chapter_graph/graph_traversal.assets/graph_bfs_step8.png new file mode 100644 index 0000000000000000000000000000000000000000..e0021dc1b13f871ef59eb40d29067172c508b184 GIT binary patch literal 34865 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�tguJw%v6xV7^X`=ZLx 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step1.png b/ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..aae144212b40f9fdedcd4c476ec4356f5b01c314 GIT binary patch literal 13569 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step2.png b/ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..35ce55ac6cdfd34d8177794c92a09736d758a17b GIT binary patch literal 16629 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 Wx{l{#Bg){ild_V!Vu^xz@c#i1jeJ7@ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step3.png b/ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..46831cec1f81d305fe999c941829a1401287cd93 GIT binary patch literal 17666 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step4.png b/ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..8555d9e73b6684f0f3c71b2d6f6eeffeadb27339 GIT binary patch literal 18294 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 za=x5It--GZ000000000000000000000000000000000000002+8b1LEuJ5rA3>rNE O00005)KnGk0e}bn2_Hlu zpvz$%uPt;T^iVbN0)Vvr@(oMoCZ&fKVP5xCl z84+U~TNI5HSa7ZbEJ(6~_a7<%_@T2F^R$>x1tA8saRXv%)3?T{ILO@ z1=^CN7q`vT8vG+Y?mqe`pDH$@M6yw$j%T)4@{)`RLxZh*UbgbD#H>)VbDDRoc=!XO zsJZLDH*;MHqqvJEf1_l>hcvDQ5bw)XwxIQ7=)9pJ{YK1lvPlZ}>8|jqmAhU_rEwKW zGeZr3pFUgCx3siWU%fbzm}q&v^xSeNYs!_z5{?G<0bN$W-HX8s>4Z;z_OBX=Sq`QB zrY+E-lZ|+1M<_;P>=4e~&9O=--vX?@{aH%Q-Bb^QvN>cxK}W_cf2WYiAw%4I1mc8Sh>?&btv zvLb`6CtOQ4d-VbwnlvER!modzyueSMv-;%EHHLY4c(CP+fa6iY$95B;DvoAh*O_H7 z03SA1pIzwszGgpv(uF?!vsjgz=(soA_<24V@9RWsJ96xn*815{GpBiKdd?1r?-w;s zm&VN3iG=j{SKk4423?=U2%`QH5Ysq3xpjiVh6c3vyX(%<26h1jG?KfaZBEhos! zC4EkXKR4Ev^%%FWIV&w=*v^bK2NOl{{Rus3gvLp#QGtQ!A89ri9UDF6S&QTC!wR!L zpJ*586~Jh+c!_Wx^IG23E+C`>c87#q2#G?IV1!R}uDr2r%q{(EnI2aECf~2 ze(l=F7Q&i5oL9mNYor(73!!lTw4Q7x>VgTsysEyhU^+}wBwEGn3Z|}!mhhT^-4Df* z8%bzj2(Q@kwEa0p_>;=pdbnB-%mitTzr7@PC>$1e;+etj9cR`2{a?Ys(|)S^6FMTh zufFElAqIT|?l0XEJ8`xT!y|^le!~ZOswg{L{pB^p%Y=O6_SLB$hB(i!k2?I5(Sm zruWPE>&;v-KtwUMD%l60q#vG2Xt1`EB4+sadw-jMDyvz+Z&HiO@@&)6qt;|&YKAyd z(v%NO-@{aGcbtXJSy+J*#irf*S3*@v)x!(MRNP;(NZ+O!T=C?JHJlR9*f1d25rnou zt4#kib{A1WKf9^u1Qkgb79g?GtBui?@c*OQSD~P;7SP_*6&rdjjM?agbf6p(E<1HP zoFH3tt?lW-g_1r+81A{)1=~tpo^}KhdDwY2JrL3M44Wf=zQzZ;*@m1eY<2rR+pj8f zb?z%2_LS6D`8y%L12~^&N5fG6@|)}o)iUgc?ip&oTkI_EHcWfFnxXB}up1mIlXKEq zcJKpfdyRZdiOl#`!@PY|fmokYvIs}AL(9THwF#?L8HfuZoVYLZoZM0S^FtN zgNDOOg925Vdo^qNd}qf!i#AmiWqm!zKZCeH$gdJZ#w4X7vZ)UhMe2;hle+6hu1&a! z0?SjwmO>O82&)Sn9ZBS?Vi8ReSnV))gsQCXewP-sRm7)o+Sds*krpTn7VHYz4B3gc z+p{W{PDxi5sVB&#=$A&0*AjoY{~s2<#cGQPoDehDXLtxoI` z>(cC&H|xH;7FQ-TsT7Y~v|*B5xsM)FZrbR*1gEa6kKM&YejVWFI?7I;)fsW#=AO~F zlf-2dXSZR7ab`WTud$6e8sPjhRWAFX^cgh_C=gl}Ep`zI&* zo2u{`XIM%IfhTQtwC;A`4UlwTf5h6mR>MX6A;~)6-XgPGB5is`@ylCQNk+;2eeW!J z4D^%nb1Mw_HiP=(LHF)epW~K5x=3)!uB10M_*Yg|b{gZpG6RF%sVV=>;`cCZU9*3C zk;Yqan5#v}c4ITO_@8=9z>De_?jI#XzUID){PnmAe6vPFb`spq|OT)w!7eCl1GSW)kfEhh8 z2NtVh0|-j&WGOGog?=7h!8f1)VhiS9D}yrpT)LcQj--$xb0&D^wo4Hg31+2$ZK%`U zJQ?5WR=&ApGBHkuc2a-kX7-668RXcDLcIDrwEyU_ZWvn>W}3GE+DClva$S3yUad&| zxTBYb(&X5onX(su8w-4NlY4h<$x4(8%qDY^ggn{6g$6uYR}9aJCJqg#;T78n<;;Y* z>e3@)!2ZyT3?o^q2F}xvyV7$efN2?0xvFl6rb^pF>yLfmakY~mDCF7^&IuiTY*3k+ zKa%D!@&3^keBh5QsbYO7LBLh)A3tq~=%QyR94D|64qON^@J%hiM3rs2$qTFB^v2Zy zhM(2?+Q?kzhma|@@Fi2MwWSylW}TS@oWNV< z^I*XGcD*TXm+M{9?|;~cyI_Np(|-l7=Up`>bFUL%>9_mFm!>CZa-Ub!$aULZ5%AXv zx4N=v$w1Uhj`ddphI~iGBB0RDcK|tOoJ@#G3LTG`f3I$T(&|Wkryj=!@|yzh48#AK z5FC=JQX~1|VM2uRAllph-O;Zl8vTjQVyY4e9!N)2e*U=be@(hWoX7Ovda}a zuy}`tyn8*9ffs?ClO2R-YUBTT7>3tlg~BCP9!xJ~>m+&`m8^sXrWJR9SHm~Re!CD{ zH}4Gnm-V+XkCR;K_Dk#&hqp@^2caV`;-cT9{jYVcwER&~AyL!JH@UCm=~-P#tGb5& zgSF~xOJGYS@hUitK=vm1v}FlW(3OP2a9u65RqeBR0na4IuY97!GH0-86r)Foa09&8 z>fOdOS=qqeo7hg1h;cDbCF*HVe&aOV5b(MU0CeAgVaQXS@xTaq@ z*)RlF(oup%!19|f1%PA!if>B1s;x=?gUc=zrE%y9dsqcAki8*9kC!<_N<0s6;y^m0 z;koN-T}|U*G>k=BwM2D2c06qgpj8u%&_*4si9Y}cZ6t& zR-G&;ehhtDo-aLBhE?_K-r3{DFDCa`G`C`iKmQrI@GEz)>_=Wi`Bx*C=Z3uz*t?~* zG-FkLYB()+-2LJe<7D^Gl!09%aJ&<#5=|Vf-K}jD^9y_8`uv1Jc#$Kxp}3}*FB#; zt@MX#?KtjUisbS6AmOsleWQn0Ll^x{A#2{yT#53%UCdSdOTS)&QY||%1jAii=a|AV z=vgKzo&O{#SC1q_!*9D|PxO~xmqC!q!cY00#!uHfgJ(wriFI2fRp6Q5CmD3@GDI|I)uKYw z8cD))lYs{cRzw$>`i$f|^0=~nwpk)2(v`4@Bpm(3i3De}{I$n1L&|r)z4c!@Jx05h z*Sb!Q{5O6syVcpJ)Tr-4F=(z8$3NJrN!B^mU76q#P`9%R2tEhIzNcxo#WY@9(a6MdjLvGg+> zvel&p?&d5&)FCYnAR`Z%qFEplU4cHJ!S$X%A7ZR!O$?c^SH-} z5f89%27@7%m?|aHf6MbhDkPB&Y-?K7Zm5TBS2H;x&GO;E$G~K zk+_aEtRtx`zyUNem;@M9;)7^-qGUHN6c2mUqCQmCSnTBO@=f~(9*I8XH#%5s^uXks zZgZ~$M(~PQm9(y}g`fN5WXi5o>S{=6oA=fAfR=UD(xp)oX5Vsl;Mn(fH1~l*8#4E) z_0y;C?f@DhObzoFKlrAv>yy{d|2_}{SLJ`a-|KdLv(%$#s(THfuie1wkJjV)&@lBW z@yLKEsNU6ZxV`>X&18x%Q4l#WlIdZ_8ieY?usT=3RcQ+H2UwN|SgmsywudXdpjw6} zqX2+6V?aM{&LvkoNPf~6Fv*e);$ePGePY=Qz{Y{zgt_?NQ83)rDr0$CnE8u9xW`L@ zKR-nL@Nv)MQ-4Dmyd8}he2wIg&mqHnrMf!R647@66KK01D1EKFSmmOzg#r&}Zb2)> zy4rHwUu8hjWuTT>5C&Mzl+LQ<;JiO-)LR$MhA0jQ`w zTQ?Xwfcaq{9SCRyzs(L0g24xo7E?J~Q>#BYAx^tuFZ2P^asPC^!ww<%N>i%$eToC9 z38Tx*@T|nm^_h(T`ZqTpLB30dx}d%6t2K{r9w$Q0*Ma?$4Jmh@jIlphp}kpgw@G>| z8SSsV-;_#6hUVAA)b7A=k`&YfZ|IJ$}rLzFL0l~qIk3TlQ)-rsV#_7xvcEqp0( z#{Y1eeJHj-SI(mR#gl|imH^1h75^r!UkFa9c}Vh5gMlg1xYWec&b10ABL(Sd)kzr@ zx~n8jhJ%|$aA_aG!JT3i0=t<&dVU$0!@Jh3Pl`6tPa3uc{f`9kIR}l3ziD55e=i2G ziRGyh#V&&B6rneGCt;nci>VLfIy&5ZBd?6D*WL!~ZPcG#;W#;M+R+*(9-aPG`eGdZ zWVR6e+JN0Ek6iLytq>}?Yrne%S2Mt-!9M@rM!p$fo{p~&eX_bhcjifhi1h6WQ)>Rq z;FUnO(Zwykx!62iVK}v9ej`%`c$FGb%Vj?|e71P&^L^$zr`+jlSS4;QHov#bb!05G zw?p6+FFy#W?crPHzZ~o5EH!4u9p?|v{{%R81b8!;9n>}T_gLF(5H~Ge;l=oEan@(D z{{glVHB?K49l!sv!W2KZjK)$ac?@;)Az%~g)=T?KkCm9Ccc%4OdIm~bM$#m-`blU#}VCMgDw)5<*yAoS&2?H&oHEekcySuuL9Ug8AB{ z_XIA*(ZXT_1o}8&ycAZq6|u$aa3F7{IO;h~kM{EC`Z`_WR9etc0d<%)BAohb38r5m zx@!CS3KX_PxMHqo5mWuh1Rh^F&eXs?!v!C6uZyfGV}MolLG6g=1Hl=NFLNv~@J8pp zXuFWjg9B92R0_F{ruk{%bS($C{q?CvSPq>N8RIX_@d6c+n<6`JqFE1KrIjHaWs;`E zz}KM)IcZ_|tC1TUWGigfnywgFaa!=)&_>3Rce$WoqwPw^+D)$7fXarK-~}?>| zZ1f!t4-|`sbtv=)t?;`k8FD)8GoO5HTyxX-$vtx;AnUE^a2HSgkgdqi5Zhwqp{Gyw z0-5H5Qwhebn9$WX`)%IT^xkC{mLE_aV4X<$FzJiT)$RReaJ_!CN1h6#)*Uyb!Z?k> zs~-#X-4Dgmej~A-<^XX6E4_W!u=yXgY(KpI*5P4H2zPy6BCt>FAw77S0tO ze>~xI!Pnn(4Nc+;bPF9h#@P9Sr}59_2C2yt^~4^$z4<8WbIwsI->@P%{mQ@1kdo6rxRp^LlT?4w|4%k z?lm1+den^*!MHmwN;%_hN<6Ps8}6^v9H_s3BO;~&Is?oi!+Np|QY2Qo3QSrrq&nXZ zss4AYNfh=P^hm+TT8L`0EPWuq3lng>?C#xZt->X{FTJE!JFluPRNtHswN7vKN_X@z zDcpcMDO`kGgl#0@kDfKn9}no@aT2Z^za*QZoi~*D%<%z5MH((=>)Gb9sDzJ7Egc*Z*-mB|39FP{cgoQ*B#G~6|@yEK5R_$^|AjCfELVBUL5m{(qw0PwkcEx zU##fP0&=;;au{dlda(fDP@pA9la)6oc!~xdc$k4U8`y|z@o_imKZyhP(sxg}9Vy$@ z{*>t>vCt89P2cyK$gUtU<;jE^8E~E*XIZ56ZKEHMsZvN!Y-t+D_X_5H*o_(c6rNnnZ?0W zUSsv$d=>lJU1H0(*!W>EelREeU0ph^k+IjGQRBXt>?Q4zWK&i zDVUs3dU9HR*8q$>r0>1OUAd7%zRXOpxpgJ5sG!1fgyy%Vq9qaoyXcOSCqCRj7>BI> zv3%N!!tw)Siy3L(MVQq}>F{mPe(wIl%L_p5_-5cD2Cb)3;o4RV@hpH4$}i$r5)>&0O7a(5koo6~XuqF8d=P1O0ZdVqen1 z<-%w#mgOgKNCR?!&+fU>)@~RzZg8{o0e#6ni4M)#>1#zbBpd^&txcdq+K9aC!WMt} z=sGicr$klwd<{l=isy_~%!T$3AhFLVhHe_$+^}KG*!bvc&_!meI|{cy!RO=&{X~bR zj=^gDO4xroh&F0Mu^~I zp0x z_?!z}8pZK22$T8mxGwe?#PZU z-zCGtJu*Fy^a%cy=gk@On z2Ll(2@(l1kqj2wBUCerD(tgY!`6rktZX?z4^Xs9s5+h70+=u`eV62LG&w=|4dtcbG z#|t#}j6VD|_U_B76MDVg?H}}Jrkd+J*#2#%WH5hdPKAGG7*x*n?IMj~7~t;=R8}V} zx?z}&Pb)w11+bBmA@y<81L2RUMM|eMmn`?uhSvbai3f0KA{XS5{+DueSaDi*h zG70W+&#r8QIIf74Fs=2oK;EB(jU3dcQEUw}{a^WXV^2XGU@0QpA=j<`}G*SUPv^&#% zsdmGx7AVAERxH5uVnP!3tz?slyAxGK@!38&rbGz5BXrsh;fpD%GU}id9{*}X;ks5V z%H_-jo&sFjZA=|`>IAZZ9_#D3j|K}C!eqGR=@giVa|VEFf?TuVMiu^;27g4uI-Qll zsNe(B)MsA0&qs^X23mPZ1n>v<(=G+YdChrS`kMefJ*!DmMq#|{ zEq70%Qxgf>BRw6f=!^e73t;8dW&Jf>h4NpK6;b>YBkqrPZH5!^20mKb0)K}XtfVhF zaburVXoAWuPLWH#A$12=EQ*3DH<0M6?T;vosD*tU400w6ef0X@Ml)A-=1HgCTo+g% z9SnJVXBAw(&mZv@z~)-WaKg>M^0$jjN`MARPeV@O{P`ag?3_}OA{Z`5Z(t0LpP{@Zr)#2%-%#sE^>`>6UsLzvd|K~o<^A>NNNO2!y+20EVNZ)NH zT{h?=N#wnfXkRN1(g&_UPI?;Qp$#Yx=-w~yBS-Mu8fZT=V9)!=!^H(M5CZj4@*>yh ztiBZ2WUzcdy!Q}BB0<^G=KguVVW~k|n*25OY`NTmdqvdy8UF4=EJ-0kn}7WsiRBG#9w|86?*b zrM`!%&Pi`i@>iRoB;hS%4XEtA_FDM^XFjy@t|F?pFo=4t_ch`>1+*TD$bA!0y7`%% zjNw?}x+S%MNzFs7?d0dY??o5F>QJqPD%O=;^FWL8qq0-=WXE;Gl2&1yuNvmh?D#-C z^0J9#Uzwv5SPJ|nY4Au1$7UBuupEDvVytl^O9qDjKk(eW2ljbkJtF*)CI3pAibcr= zK_P8C>Yb4-%Q;kfpdN!iNcj0>WA9dFRddRe*ic9c99IPs zi6+0vGo;j?R$ZrV_zdTre7Xb(#Vh;i?nE9Y6_Z~8G~khW-AX$6P>u3|n|6ozyp4C! z@7E=&(DVh=vugXrSzfW8yb?0lt@!{$!@-8vND8Rlxw}+%Pnp^H0$Ci~uIU9?X>Kkgsp(75(YcNvUGP`}8U>I&3# zP(a$+zoI>5vAv9|^Vf7dbBh75eg(cUDP+OrM#aGfEo~-o5Y)cJo8n~8O!FtWJ46N< z7mEHli>C}3(Cm>u;r+;Ub|`1p2RgTbr&DlTr_9p5UD4l`yPO(OrGPS7?P7+1XYTGO z_XL3m@#78Xi2{UZ&WtN`KG5f9*PJK5?CT9O*a#n2{*1@^AEA>WP%I}`*X5xuj>hHrcV!B>@WnJ-xbMIfpJAoE12qSfFFpNCgdkCpfEUE#H&$fLc15#EL9*2V}!=v-vbERP9LYUmx zn~P07|3}J;g(07KFN+nuG~v!}x{P;b#$1h2`KrfNH;cyCqwxihgG{0lPK%79NV)CZ zg)eIzdqpm7R`*#B)h?KpmeNQ=kElDD1A8ve=EEX%n6rbqir{Caf=@`~63x&4312t< z=~G+iIpDyV`{tvzht4hy{X}*02yDXW9BnnWetY~ZCm{4^R7%hoIkGE0_`UpCz4r&K z*SIOig30?8gf@-N+NpD_j0-B!iX=qxj0-bOFh$C zSglG?>M+O#0WA+*ni0Xb_*)#~07H9w%D{omm!LVxFEq zAK-fsurf6u{pkE|PpDA#>0`$ye7cd2GEFtI$Bn)JNlo1O;WUBLx}y`=rq9n&D#pjay`r$zEp}ME)amR-Z1}lW++2{JW4T+?Hd0l&oCC za1oFFp&ro7=kXu(Uur+wiDJRHkff7R=<=$5KMo%@D)^S7+x> zHV~}2yl)P>Rry?0-Yo>$$nlY`3a7ihy&DzyIy@T}$AO=^MdHO|FWtUsTkI;n{Fc=E zaYN9BDkeaO_`glFRp8he8|xZ$Sx>|Z{t1eC!334g%uxjkYP&}(y8jpAG3~rBruIs2 z4R*Ej$y(@szoMEhBT?=uD&{4M?Bc?b*~IuJPc8n4S3xnOonZ26W~-PO03V*(R*t@i ze{MI!3}y`Rv8|+!0^5M!lq;yXCW+SmD>!W8uC-(?_~1Smi^SIDtce2SJ@RBW>4(q!FB7>8UvgNc}PbIG-vdA`n3?_&n)vm^7AVq+V_e!=(tyES|kYJQ1Gz z=iz%%nb1fA4C8-q>G#JE^~#LuM!#(EqZTO?p5tMA7&_*ffSzkt(TlH4OF)?W!djEPRll zygi*?IUm^jM4wU)JMWg{yDCC?6$THg1^Jo&GvfttsSJBp8kiQ*;3Fy&xz&b7>7Tx! zT0f%KVYB1aF{~AvVq0X2*q_JCB#nKiU3YTGo^-8>xA_5PR-8*H{KLqB``f8G(o_Cm z?l*2p;|(D=DLC@b3YLEDkU@0L7w%2=HZul@UA3B&B)BxqJ`VlI>V4HXgH^I!c79e) z@4GAgFshB~R-#_Q%Y(z=X$a&Y0}P*FI~p!^pfDDEU5*@$qefL|1xLVxPGV;s;?X={ z@ixY0g*;#p!Sx@Fam#(ad#$eJYWu~f#3z_G7RdC(hCuIUq`#{Yh0KuwC#tPSO_SOq zwD6zsHcRX$w<^k4pQ)ZB;mENTpkOyA@mW?RV`^nigM!BDAo5{V zr1rjOVEe*IKDz%VYbI>AZnZWk<~*D_eA89~8%(GZ{ZpbxbHnLTPEVM&nI^2?ds4CO z1q|_zn;=D7X6o1O`NMFj8#vAbg=sJ7AoobC>h6T--Nhi%AWKFtGb4ppzu|_!Qs4B_ z+i`c-Ud-+aJIfQ{m%R*B*0ey@6bjwgG_g>>lfSF9xWD{<^x#9B9qCEDEnkTOrlb`G zn=5M~0V$Lr?F;(6!s={QqR8e>B5*Jb(bELFf4@DR8Bf(!zZVqu7rh>^{FCN?2!241 zD@S!?+T(0j->wIzU6|wjKHize2XP-Mk9+Q>i|)i->zXR-A@MJ#oSPiDl-jjqc*U+M zg?9qeI-)xbk+{9MI+t|`q3!k>s9Kxdxb+KT;e!kCGfhZTk zqVR89XHs3D#>HCWB(M_SLuc{Y+6(P#giuaKMc|xXpY-)zA94koiUJEvb&_5;6?|iv zznPm`1QOob3~BkH`zs4_6UXLlb;0XjUG%^0;y0T>&l!^}>CZ<4ze99WI;79-PCmFd ze8-3`l|*0`aDg2AJI77ad8MI8sSvG!!Z?XOi*ocw#;<16z5TtQ@o@duyPqCyqsL9N z%c9_L!MK0QifX@TVTthfK0@-DSo{MQ^5uI|J&TXpCNY~fYjs8EzB7 z{w1h&s!yQRyzJ*kH4Ib=ET{*)IjZ(=$Ma{2<9b}5OdDS7AceLR4R=f*B7{y1FhGum zCY_N0g9QLZ4ox(}0U84U67_!oy#41!5bdAPcy$bRY{O433=19}J-MZW#yuw@zZ)bh zRY*sUK0mRh$-siH(9k-X&vQuR(+dGKfV08a3Gp#lB$kGJt`P4jJ(P*%M2Xi2d*SfY z51FD00XaIP(9#B+H92 z(7k|`P@CL%?_;ZJyv(!N)XsKNQyMx2A^bT%LY?H8n_1U#>82l$mcC$z$m=a(1!|fy zH!)}NAb1lRQ6-<_!+ZbXcqoVm|6e{%DccG86p|T|1QPOyl0Kv)e5j_Qw34k_qw(h1 zVx+L*r!`zSaW3YC2(6@G>Akfs_vX80Ckoo_=v2eFH4Bu+72~>HdgIDi*HlIyx<0zU z(#LeqNcWgv+;9El)g&!B8ja(G^8^70#aBi@hU^~7dzfR@%!F^H`>FBg`%ap{M0es> z=W`$H6-_!^yTqn}YY_B*{A6M(VHAZlPLZkb+IS2X2`t=4HhO%tDl5IVCX)BvX#+jl ztd>O=19=dQONIZ_Y8F>Jx(z*wdwiRV`@@v0x&(*nG-0eSq4m$gvxsfqBvIn4Tg;F{ zXf&}$80&b08_wIK4=*)Y}Z{$>GyhE4==smdY6oNi%&i8j2S zuwvg#Ts2HHM&Y0s7bWYscfTdV9N&B*GkshZ+7FKs)^EAd6jWB@3`?`S)ZM>Z-@lQd z-+osbzDw%Vwx0G^0}4g>X&jj3p2{5l5c4Yis?|&a=&?o`X9@BC9lZ?bW}N^=Sjrhn zz>gdX1q{{`?~XBn@rg$oP+0;sLUjg%0p+Nn0NP&I>PPO)OMdaJ80sv?!s?-OjSTg* zOrQd(W~nuu^1_Fbh5bhU!edRJ)f7~LzWk*v{_qjCCZ2MSjcq9tc1%fmWgDr0;}6)e zvs|}%!|S2)$aTiw#pnhz!afNo4p9QdAfw5;!A3REJ@ru-P$@&+YCK5sy#4I0-YTcO zQF!W^p3|qxpwNdg`K30@CpAv_7-IXg17_N&#jUz zo=UEW#exS!gDHI82YuTtg=;f=-6xFrk2)#?8YnkbR!t~uxqUHxBB$aR-_b(utve$W--30*H! z2}KTh4a(NbB!iOfGTAOY{r?huHY(+Mq28W?>VJ&RugL4K{$;)SAHPueN+w5S1>dW6 z>HoQx5533Ga;QOM9?brlJ8_E;k{sf+@4R#teXC;cO|aah%(;VOcg0XD>pV=%r6M?f zt0@9V~5v-W8&mkdl@+o$F*RHLX*I=-l=}2QHZ7)<4Jv{PT z{q3SJ{`{0Vd6+9zCqSpi1g2i4qm0Hpjor$uvi!j_c;JQo5eA3JJh^vFc|U(hzl8-{ zD;y@4$3$~C-#OVk?x~!&bohfC(3u-ay>-Pgd-7+hy86pq{}D$D1Iy4eiTmue)8(W9 z`WKQqG}0FLx#Wv%N!!+G`zyI#m)t{J82kO$F}Ow&TY+~R+mYF!;SvA9=m`QdA8-Xm zfo|W;L9Lc&!%qQ1i*!Ybf2TeE?`o(go-xghWNoHwj-&MU(KPL|?{$ywAJ$bQB!ee) zxYd5y0|m&PEEan==+8-?aq4)7Sj&2o3ItCmgvNvC+9%7mU`#dV&d4Im+0L(5>W_mZ z%X7Z>@%BUCJc>92{}Mia-5TK)+L&@s?%S(%85$it;$ld|v8MtI@qUZ@bEJ zKyur!awQoQ@<>X(pH!}41tOt_5q9KA)QexTE3xRR4)L}PBUHuEz4awHvGA-VRaR*T zexKX7nn|4&LHgvbw|CvEeV=sV+k2h82-f4ufpd^eK6ms98lP;~6!$Xyi9XHDUl)@d z!HukCiQe*f-!QR0p7XnE)=`#g%5j^WkxznaU1TKGxiDd^bJc5&b*MAJ#+GQ)gEU2s z4Iat46FPJ~fSOJxC=LV*wv(C^W;A-w?RQV}*)vFfeB~=u=eGQBkUe)zrBO6O*2f{R zNWyH$t%049$fGPQ0R$77dG}8^yPX?f=?+X-LsdL7nTf5K)VU~irI(~{IqKHp<7F;~ zQ#=X1r;bFK{gADUIu~v$A1~u(`HM`YR?qlkfv3d&=(}dEsTuC9cUo0DxzaPCa$fKI z>>J&vk0#%jSw>Y1e35r*r(;KR?$m{Qd8UhRvfyRA=4yv!0iSz0K7-~5p$5L}$cZ1t z)Z1Uq~zPk&X+K+I!gnC$GFcgMX!wH z7#u!$qWma)p^Y@33**P#hf-~UVV2Jb$!odKsn?Bt=M=x)2iJCNl2H)~R@vUT%@?Jy z4;i_U1Fkmwf8o(j=r+O^=+B%7F_QU6EFNWAqBw>?S zIT4*u!+9IH?v3$UHK7K8*|(fMul^Z82nVRMXR!KLPt3aUm?f_GTV8FKK9RpgO?G2a z$s|dWur!jNL}>!wStg2f#@H#6Fh=Q03=gipC5BeP=WEg{m{k=L*9T(<@jC-*enhgd z{xb2h*l}Szw5yj^kjNkdRxNKY@t_xR3;6~ztnLbC--{V`vXG8_4iaCY>B9KPr0yID z{$_=L;7n3~(fm#!6UmaP?ENhX-Fp9eVbKSKhclKI*lE-|)Uy*a%y&KSWI%IAd?&c- z7|!0HDB1b$g-fRdZ-j{{kuyG~9lV(p0w*~qBh2+wOMF26;k3w9XioO{n>U3f91{39 zvW=b1Uk_*`s!Fh_k#GF!2Q+mYRJmocAGZ~_;gF;_syUZ>eWx4tQK2`9b)JW1AUF_N z2mvRNP}6iDFd^;%(7P)5bBkJt!F22y0jN-0jpy}YmsCkx#nrzZlU|vU8rT1&o9gx# z?#LRm6-8q;(|_h9Se&@Z3)g9C<3?x{es0KHwdR=SMJl1bch%6KZ$9e1$W+%8Y9Qvh z_toU)g^Cw2ovq^q6?l*_0$^it_KhZvfCqCj*jSC-z1h+)_3}m04e3w%6D;|thL9*8 zj~S*re};Q2P3wRdzHvW1j+0npI+;1Ww+iQ!jVJnDT6n@XR~#fMm)!{Se4|-Je*Czh z^4?Ww&?BS+{NwlA+4!b=DPWE65#KbTKNwbVD}EtiG3hJP&(7PEK>I~kNB%f0dK55`G*<8+nB@$JC()xmyg@%l;$UF`yOL%0-ALG>KZ0*D)Co9UWE_# z6XDVh4{9egcB4BCUp)_MuDeZSf3Mf!@( zekRW!D|MK0DA1;vJSHpi_b8tIMaaIyV?yCapoU$Nx;}Dk?Qz|Dt5*F+q4Ms7 zGe=25LnS)_wWh3K=Nn^~^w z;bVNev&GuzQ`p5KOXH&fFb>j4X~A75o%$T#bOK73brCyaJ-9=OwBA&Jcs`3z4j z(CK@@0|58>2#3k>3m0?2{9=ZNiJ-YS-B~zxuq10Pr*`_6r5Ox6*i@5>EZDRtr~GvH z1*S?Epjsp-KKpHvfyfzRob!pEdEr$MX<>~pT%<3tJAp=v<;!7KO^HbRc>|msGcAbB zjzLfrMpneGJ-vX~1wO!DFwndXvV!uq5cR%KDkTcedp;q33W*nkC%VECA*3p|O|lFI zYlTm>qhopBteV_IrCJ8>f^SsNkHsif-eK7XHS&9bE;ydvt75uIEZbt)k+=Lws35x) z8IX5Zv}#3hJ-7~4x%9_X)hqIJsWp@rWjz}e&?M0x+B*%nQqQpQ`;xy_qAZ}%1Ch;v z(ZH@kbvOds)Nyp@S>2>7L(_WXm#@RbE$pazoz>p=R~pYudZAF}_#s<1PA%dKxiJB_ zyfz9pNh|j@CZhpUcBd3)%KeTV_A@@m&X5mgX^_qTOyBs)ki8=S+QrY7jXL-Q1S=pT z`G*H8$(kGK<^pDk2zCZ&LW_t$(B3(lgLwMLY)-SICCdn|fOUZjhV!Y7;fjid>9lx^ zRMX(ypg95!+4{F%nzvuhk zPR$5%-L$*mp89toUEygWKc;FfwKqI;F^3< z40cr6F;Bc~V5;tmqZY8q%3E5rG}_yD5)yqu(g0O>EAj!N%Hn zYX(!>t6R&Qzay4{I@Pue;G@Cv1S;H2yUYkz(OgfL@y4T{7Yvip{VaNlDVgRWqlIgnmL$n~qNt*y zNv(f)k@fLgy5T0ZGR1U~iD_mbvifv-?3x`ZW*SPh)jp37>Y+JinQr@B`^Y(6ylG%EJRz#Ea0HY0B8u(X5TVEs-F=rk{@v_GtPaGp z``CoME8->o!r$+tlj^wsuLQxCdgljuQDz~Rk}x9I!|;Y*7ygR*@~3;r3g*=+RIh~zuQT!xZLTohAiHDyn8`15i0-8kF{HE{DekvA z>gA67S6w3*Rl#j4;1A{g#;6q8RCZJd`pNR-C=`SbvT4f?v21K@{ z)yU^7Snx}HhzIjL2k`_SXDs~O&1bP$NzF(m`?E5wm#sNl&+E9=Ay}!);`I{YF^}{D z%0@O`pMxl|_Kd24JX}Vl$v&KhQm5mCr{$r*D_+d{{8fkiK5>JdAolVrgvsp{Ba)L7 zGW3cfQKNnLuG+33y{PYutBpFzjM`Bl-W|z}(?VO{E zSYn)Fc)u`&De70*#1aHptybS0d(!DzdQZe8ldkPYxU(u3LP@lw%p;ru+m$>x+V!gW zCQueXo{Hf4=UAz|Fk+5PaHS)9ULD_zAXWU67jYs4Lzkw< zN?=gO#=x*ObKK!6blBk1_@HWoeTDbz&tu~o->dJ*8;!<9e7ME7(?P8N`{qd&T+fcG zjXN8Ms33Z{yI@eJsPfwf+gwd!D4PQvtK|n(5QAEHZ^m2PJaKYIMXl`fCAKMeR3X30 zR5Gu~xaGZFsb|8DqozJhnOg}?s=Wg|*=R6Gn>Mdb7Z}SP!C$zT>j$f#gF#A30XN=? ztGxT4<9ak)Kj0^c#Rc5%-q#8`V#{Z5JC&JDZM$nViJu$IOr?O$-2iiv9kZ?9cBJXt zGu`=6!E{hlip*6&B$9OpPN@vGbrCT6eLw}5K*0?MIieS&c3|~2{9-|JhHxlrp;Wbg zlw}zjQs373w)_p*>`H^37QcdlqT(4NLTc*m+fF2d7^77)6(uyQ_dH1yW<+>rtGr~> z#v9@$tK0eMJ{x+gT=EP3i~smDe~b7)zG-g;wHj#TkbtrRi|abg82mZiKMxRCawL!; z#~;CRqjlWHDKGvc^f9{`mZnq{C{|Dn&tm+ zqo$ajgay6*agU3dLK7A?K&e~CmhMitX>#VgXllBx2@6>S6|ZbjsGygV9mht+0N!>R zySS7AN1?Ic|MAzUC(x_*b>5PD{eK0d1Y7$HtgXfJUll;$(gDodg`!(tf|&l#wNrQ3 zoelv6E*-#Ku-g5eDuBR`4`3|6rDJ@k9}vKs00Q46fNdT5Z5#hDfO*-?i$xIN>H+K{ zwQB60sb9RqkvPXc)BBgU2l5V&>#)6%+ShTF%1^XJoe zFl~=7cW%Lqc6&0_jdw;Fbq5_g0$rX!L$td)+zG{U4Aoww+Z4u0v8?uZXK(K0LH^xkN$eCtQMy?v&0avmV?T>`i-V4N@M zmkt+99l?9|a(~r3L4fZPz>?$iPLS>G9LqiPDKg7v;{f5CSNlutygLB|E*ijb?sCfK z(_;>o#lK%9e_jN6c>d|t?_X120D)@+@Gq};Uq4_!0tg5oa8Wru+%Zk=4ja#n->xQr z0tnw!jnf?|BGO^wje7P=>It9#!cPg{G_G5_SK|HQUHy3htiAjK2m<)->+d7Ll3&@^ zcMRZ15kUA#x#rjIPW2GL)PGaZc=j^o&1?78js8e2hdoSp^hg8 zUR6{7Fnz4Y9SR`u!TJcUPEm@OHtW>0`Bsksj44d1*RIYR4$4tZ&V-V z)iJC)j{ryedem|q`UtSDOT=^D%9_y8zOqm3R>Nh0D1gA{1Ta!v#WeMtZv9Vw8o>J6 z2=Fn0(~i;-wq-s&4gsbY0Te*Eihj5)#hkw-fhCs7Y^muG!21&Jc?9?{1s;LR`w`$s zVp$)Wo40&{!xZ?%6d3p<`EdgLQkT_>>0{mpu&+_1Ixm9MywvFz!ipzXEz2Nd38ZIiP1%;Ibr{#rR+&#=>0A4a z@rI9b3~OJ?9h-H$8KjH@h-p3_X4}g$)LdR(*IDxK2w;StKe((?p5L==EgKKdEz50r zY<@@a{7?S;+WRwK%0K+yN$p|*Yyt?sLyDAh`r7vew=e(%zQR}quH{Sr4so3X*3_CG z3iw46>hk4(hltxnw3hrx0000000000000000000000000000000000000000pW{FD W@It)eHzaZZ00005wkrph!rAbR9uy1O(}L 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step7.png b/ru/docs/chapter_graph/graph_traversal.assets/graph_dfs_step7.png new file mode 100644 index 0000000000000000000000000000000000000000..4aeff897d4f39ec510e6419da9ba913cc8380324 GIT binary patch literal 20863 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step2.png b/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..596998ac98bd7e71a13886a58816e45b82beb410 GIT binary patch literal 13482 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step5.png b/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step5.png new file mode 100644 index 0000000000000000000000000000000000000000..446a7c4cc76450b869bb6c356f767188d2e39feb GIT binary patch literal 14542 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 AqyPW_ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step6.png b/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..a3de644690ec6e7e650273ee15aad52612a18f2a GIT binary patch literal 14333 zcmbWd2UHZ@wl!MS0h-(-K}ikrktK@+g%$+_1<9b25dle(K?wyCRH6YvvZ8<>L6Dpp z$r6>&AgLuPNhD|f0?#@3{%_nj-W#_WRP9<}?p?L!UTar)tgWR+LwSl4000{GE0=Wv z01Y=0Js2ds+sZg|8{SdeyK=)F0B9SJ{=qn5S~ge+y6dVb1NmL-zu*Iu?M2Ot0Prz} zYR~e>Uq$*T`@`Dc$8wHb^O4VR*A-ATp~0DuG3FJIL6`Mxmv*z3D0E2PtC z$NJ%Jh}+7+@0({nL{C~3npiA3Wk0iOzfiP3O|+`M3BsfJpMT3d%8&Z_tuUqZ%ZZA4 zf3j>v5N`X&-w825aNIMkD>?#vJUB91Y@FoNxFu4EP z5cJT6^!W4+U}n5-9EBB-gk0(Z54#W;CRTzf5M;$qSlbwoN0EJ@vgnnz-%AuF^`v`09e0#RQmNk0?` z^-3^4GeHD`D3-nXA-oQ_CUp@2necen2a5+$C@dZT|J!C+E)+XyJIsqRzl4LtzSjxM zM4*C!TC0NzgW-QPaMf1;z0v51QY{2)!Cn&gj(ji?W3e=!nUh%A-9#>Ka)FHv{Gmb{ zG+*0UvFH#^Fqc(Ghn7z%Z1>dGatayy0SzpOpEy>t(@?`#m(lAj^`YeAl(-k(31w_6 z#NQ_9d=u{Qm5mi?Ehs>=5Kw;lU|Srqv@nIhs4Pu89oAnEM+iXLjb>&6R2|LV1vZAq1Xe{gtd^d>{Jt|lq`inpTokg+CIt?66c2scN7@YQ9pm(c=V8*~DAPSA{-Ndks^CLIERNaqv3gf3vPkTk}t+DUb$DcIei;%53 zHPC#$p=et2f~A_*BJ>3x|8pCNY0C1Rct4!7E4PcQu!b=Ve(p)n$hSC^Fe0^ zwoAb4PrycR5eps+`9|GRJ2@RA%|$VeYc^m%sA+YpiJq6;yLorNyXZqs=G`!Jqcc=v zT3P>?WDPm*vb)udj>*bP+s7p)Od{GxYNyL&>durLWZlT*J11yhBx=;;QlN^cFdXZ0 zu4NRDJfz-;a51S}3@z-~NxL(2jd4tRQnPN`qhe%s()Xp8LoF-eU;qefYPB*N#yIwL+`=7r07OI@c;qlYd6B<`T`8b2jablsKH zPmUA86&+Y`<7H(^S84o#YhJ^CVAbMA{XusZ(s+yiS9g5y`(f9w18q*?_tb1?%jy

      +9MV!H}w%4}ba#Gg~qYno(QoKzPP@Wm@z@GL(^X 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step9.png b/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step9.png new file mode 100644 index 0000000000000000000000000000000000000000..eb7e9a910f253a88129e9f7f9caf4bdc2b0e0950 GIT binary patch literal 11767 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 Ht%Cm-Il(Oe literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_initial_state.png b/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_initial_state.png new file mode 100644 index 0000000000000000000000000000000000000000..867cb5c1ba2dfaf22723d380bd08f65eaca65d4f GIT binary patch literal 11287 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_long_board.png b/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_long_board.png new file mode 100644 index 0000000000000000000000000000000000000000..6fba96745404e538139276be0dac9c901fa690c2 GIT binary patch literal 16639 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_short_board.png b/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_short_board.png new file mode 100644 index 0000000000000000000000000000000000000000..caaaa25b1c0add2dc2bd530473dd62a03619f7a8 GIT binary patch literal 12560 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_skipped_states.png b/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_skipped_states.png new file mode 100644 index 0000000000000000000000000000000000000000..8bfb4c7015937613b734c04277ad4d5872357336 GIT binary patch literal 19246 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 z000000000000000000000000000000@N4)7kQcftuTBhK00000NkvXXu0mjf;7m*C literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_greedy/max_capacity_problem.md b/ru/docs/chapter_greedy/max_capacity_problem.md new file mode 100644 index 000000000..154c8108d --- /dev/null +++ b/ru/docs/chapter_greedy/max_capacity_problem.md @@ -0,0 +1,99 @@ +# Задача о максимальной вместимости + +!!! question + + Дан массив $ht$, где каждый элемент обозначает высоту вертикальной перегородки. Любые две перегородки в массиве вместе с пространством между ними образуют контейнер. + + Вместимость контейнера равна произведению высоты и ширины (площади), где высота определяется более короткой перегородкой, а ширина - разностью индексов двух перегородок в массиве. + + Требуется выбрать две перегородки так, чтобы образованный ими контейнер имел максимальную вместимость. Пример показан на рисунке ниже. + +![Пример данных для задачи о максимальной вместимости](max_capacity_problem.assets/max_capacity_example.png) + +Контейнер образуется произвольными двумя перегородками, **поэтому состоянием задачи служит пара индексов этих перегородок, обозначим ее как $[i, j]$**. + +Согласно условию, вместимость равна произведению высоты на ширину, где высота определяется короткой перегородкой, а ширина - разностью индексов двух перегородок. Обозначим вместимость через $cap[i, j]$, тогда формула принимает вид: + +$$ +cap[i, j] = \min(ht[i], ht[j]) \times (j - i) +$$ + +Пусть длина массива равна $n$. Тогда число пар перегородок, то есть общее число состояний, равно $C_n^2 = \frac{n(n - 1)}{2}$. Самый прямолинейный подход - **перебрать все состояния**, после чего найти максимальную вместимость. Его временная сложность равна $O(n^2)$. + +### Определение жадной стратегии + +У этой задачи есть и более эффективное решение. Как показано на рисунке ниже, рассмотрим состояние $[i, j]$, где индексы удовлетворяют $i < j$, а высоты - условию $ht[i] < ht[j]$, то есть $i$ - короткая перегородка, а $j$ - длинная. + +![Начальное состояние](max_capacity_problem.assets/max_capacity_initial_state.png) + +Как показано на рисунке ниже, **если в этот момент сдвинуть длинную перегородку $j$ ближе к короткой перегородке $i$, то вместимость обязательно уменьшится**. + +Причина в том, что после смещения длинной перегородки $j$ ширина $j-i$ обязательно станет меньше, а высота определяется короткой перегородкой, поэтому высота либо останется прежней (если $i$ останется короткой перегородкой), либо уменьшится (если сдвинутая $j$ станет короткой перегородкой). + +![Состояние после перемещения длинной перегородки внутрь](max_capacity_problem.assets/max_capacity_moving_long_board.png) + +Рассуждая в обратную сторону, **только сдвигая короткую перегородку $i$ внутрь, мы можем получить шанс увеличить вместимость**. Хотя ширина при этом обязательно уменьшится, **высота может возрасти** (если после перемещения короткая перегородка $i$ станет выше). Например, на рисунке ниже после перемещения короткой перегородки площадь увеличивается. + +![Состояние после перемещения короткой перегородки внутрь](max_capacity_problem.assets/max_capacity_moving_short_board.png) + +Отсюда и выводится жадная стратегия для этой задачи: инициализировать два указателя по краям контейнера и на каждом шаге сдвигать внутрь указатель, соответствующий короткой перегородке, пока указатели не встретятся. + +На рисунках ниже показан процесс выполнения этой жадной стратегии. + +1. В начальном состоянии указатели $i$ и $j$ стоят на двух концах массива. +2. Вычислить вместимость текущего состояния $cap[i, j]$ и обновить максимальную вместимость. +3. Сравнить высоты перегородок $i$ и $j$, после чего сдвинуть короткую перегородку на одну позицию внутрь. +4. Повторять шаги `2.` и `3.` до тех пор, пока $i$ и $j$ не встретятся. + +=== "<1>" + ![Жадный процесс решения задачи о максимальной вместимости](max_capacity_problem.assets/max_capacity_greedy_step1.png) + +=== "<2>" + ![max_capacity_greedy_step2](max_capacity_problem.assets/max_capacity_greedy_step2.png) + +=== "<3>" + ![max_capacity_greedy_step3](max_capacity_problem.assets/max_capacity_greedy_step3.png) + +=== "<4>" + ![max_capacity_greedy_step4](max_capacity_problem.assets/max_capacity_greedy_step4.png) + +=== "<5>" + ![max_capacity_greedy_step5](max_capacity_problem.assets/max_capacity_greedy_step5.png) + +=== "<6>" + ![max_capacity_greedy_step6](max_capacity_problem.assets/max_capacity_greedy_step6.png) + +=== "<7>" + ![max_capacity_greedy_step7](max_capacity_problem.assets/max_capacity_greedy_step7.png) + +=== "<8>" + ![max_capacity_greedy_step8](max_capacity_problem.assets/max_capacity_greedy_step8.png) + +=== "<9>" + ![max_capacity_greedy_step9](max_capacity_problem.assets/max_capacity_greedy_step9.png) + +### Код реализации + +Цикл в коде выполняется не более $n$ раз, **поэтому временная сложность равна $O(n)$**. + +Переменные $i$, $j$, $res$ используют дополнительную память постоянного размера, **поэтому пространственная сложность равна $O(1)$**. + +```src +[file]{max_capacity}-[class]{}-[func]{max_capacity} +``` + +### Доказательство корректности + +Жадный алгоритм быстрее полного перебора именно потому, что каждый жадный шаг «пропускает» часть состояний. + +Например, в состоянии $cap[i, j]$ перегородка $i$ является короткой, а $j$ - длинной. Если жадно сдвинуть короткую перегородку $i$ на одну позицию внутрь, то состояния, показанные на рисунке ниже, будут «пропущены». **Это означает, что позже мы уже не сможем проверить вместимость этих состояний**. + +$$ +cap[i, i+1], cap[i, i+2], \dots, cap[i, j-2], cap[i, j-1] +$$ + +![Состояния, пропущенные из-за смещения короткой перегородки](max_capacity_problem.assets/max_capacity_skipped_states.png) + +Нетрудно заметить, что **эти пропущенные состояния на самом деле и есть все состояния, в которых длинная перегородка $j$ сдвигается внутрь**. Ранее мы уже доказали, что перемещение длинной перегородки внутрь обязательно уменьшает вместимость. Иными словами, пропущенные состояния не могут быть оптимальным решением, **поэтому их пропуск не приводит к потере оптимума**. + +Приведенный анализ показывает, что операция перемещения короткой перегородки является «безопасной», а жадная стратегия действительно эффективна. diff --git a/ru/docs/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_definition.png b/ru/docs/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_definition.png new file mode 100644 index 0000000000000000000000000000000000000000..31518115362cebc509e1241a0594add3ddec8123 GIT binary patch literal 7487 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

      t%s1C%)D8oJM4GU(7cVzlr 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�nu#9SEvYoP`de$7p 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_greedy_infer2.png b/ru/docs/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_greedy_infer2.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef5f68119c3e950f55ecae419527a78d3356fa4 GIT binary patch literal 6292 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 2 \times 2 \times 2$. **Это означает, что выделять $3$ выгоднее, чем выделять $2$**. + +**Жадная стратегия 2**: в схеме разбиения должно быть не более двух множителей $2$. Потому что три двойки всегда можно заменить двумя тройками и получить большее произведение. + +![Оптимальные множители разбиения](max_product_cutting_problem.assets/max_product_cutting_greedy_infer2.png) + +Итак, получаем следующую жадную стратегию. + +1. Для заданного целого $n$ непрерывно выделять из него множитель $3$, пока остаток не станет равным $0$, $1$ или $2$. +2. Если остаток равен $0$, это означает, что $n$ кратно $3$, и больше ничего делать не нужно. +3. Если остаток равен $2$, дальнейшее разбиение не требуется, его нужно сохранить. +4. Если остаток равен $1$, то поскольку $2 \times 2 > 1 \times 3$, последний множитель $3$ следует заменить на $2$. + +### Код реализации + +Как показано на рисунке ниже, нам не нужен цикл, чтобы выполнять разбиение числа. Можно использовать целочисленное деление вниз, чтобы получить число троек $a$, и операцию взятия остатка, чтобы получить остаток $b$. Тогда имеем: + +$$ +n = 3 a + b +$$ + +Обратите внимание, что для граничного случая $n \leq 3$ необходимо выделить множитель $1$, и тогда произведение равно $1 \times (n - 1)$. + +```src +[file]{max_product_cutting}-[class]{}-[func]{max_product_cutting} +``` + +![Метод вычисления максимального произведения разбиения](max_product_cutting_problem.assets/max_product_cutting_greedy_calculation.png) + +**Временная сложность зависит от того, как в языке программирования реализовано возведение в степень**. Если взять Python, то обычно используются три распространенные функции для вычисления степени. + +- Оператор `**` и функция `pow()` имеют временную сложность $O(\log⁡ a)$. +- Функция `math.pow()` внутри вызывает функцию `pow()` из библиотеки C, выполняющую возведение в степень с плавающей точкой, и ее временная сложность равна $O(1)$. + +Переменные $a$ и $b$ занимают дополнительную память постоянного размера, **поэтому пространственная сложность равна $O(1)$**. + +### Доказательство корректности + +Используем доказательство от противного и рассмотрим только случай $n \geq 4$. + +1. **Все множители $\leq 3$**: предположим, что в оптимальной схеме разбиения существует множитель $x \geq 4$. Тогда его можно дальше разложить в $2(x-2)$ и получить большее или равное произведение. Это противоречит предположению. +2. **Схема разбиения не содержит $1$**: предположим, что в оптимальной схеме присутствует множитель $1$. Тогда его можно объединить с другим множителем и получить большее произведение. Это противоречит предположению. +3. **Схема разбиения содержит не более двух $2$**: предположим, что в оптимальной схеме присутствуют три двойки. Тогда их можно заменить двумя тройками и получить большее произведение. Это противоречит предположению. diff --git a/ru/docs/chapter_greedy/summary.md b/ru/docs/chapter_greedy/summary.md new file mode 100644 index 000000000..2e620d748 --- /dev/null +++ b/ru/docs/chapter_greedy/summary.md @@ -0,0 +1,14 @@ +# Резюме + +### Ключевые моменты + +- Жадный алгоритм обычно используется для решения задач оптимизации. Его принцип состоит в том, чтобы на каждом этапе принятия решения делать локально оптимальный выбор в надежде получить глобально оптимальный ответ. +- Жадный алгоритм итеративно делает один жадный выбор за другим, на каждом шаге превращая задачу в подзадачу меньшего размера, пока задача не будет полностью решена. +- Жадный алгоритм не только прост в реализации, но и часто обладает высокой эффективностью. По сравнению с динамическим программированием его временная сложность обычно ниже. +- В задаче о размене монет для некоторых наборов монет жадный алгоритм способен гарантировать оптимальный ответ, а для других наборов - нет: он может дать очень плохое решение. +- Задачи, подходящие для жадного алгоритма, обладают двумя ключевыми свойствами: свойством жадного выбора и оптимальной подструктурой. Свойство жадного выбора отражает корректность жадной стратегии. +- Для некоторых сложных задач доказать свойство жадного выбора непросто. Относительно легче найти контрпример и опровергнуть его, как это видно на примере задачи о размене монет. +- Решение жадной задачи обычно состоит из трех шагов: анализ задачи, определение жадной стратегии и доказательство корректности. Из них ключевым является выбор жадной стратегии, а доказательство корректности часто оказывается самым трудным. +- В задаче о дробном рюкзаке, в отличие от задачи о рюкзаке 0-1, разрешено брать часть предмета, поэтому ее можно решать жадным алгоритмом. Корректность жадной стратегии доказывается методом от противного. +- Задачу о максимальной вместимости можно решать полным перебором со временной сложностью $O(n^2)$. Разработав жадную стратегию со сдвигом короткой перегородки внутрь на каждом шаге, временную сложность можно оптимизировать до $O(n)$. +- В задаче о максимальном произведении разбиения мы последовательно выводим две жадные стратегии: все целые числа $\geq 4$ следует дальше разбивать, а оптимальным множителем разбиения является $3$. В коде присутствуют операции возведения в степень, поэтому временная сложность зависит от способа их реализации и обычно равна $O(1)$ или $O(\log n)$. diff --git a/ru/docs/chapter_hashing/hash_algorithm.assets/hash_collision_best_worst_condition.png b/ru/docs/chapter_hashing/hash_algorithm.assets/hash_collision_best_worst_condition.png new file mode 100644 index 0000000000000000000000000000000000000000..d50bd751190ebba71c41ea856e8ee0bae97fbfc4 GIT binary patch literal 17593 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 O2s~Z=T-G@yGywpULzsgA literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_hashing/hash_algorithm.md b/ru/docs/chapter_hashing/hash_algorithm.md new file mode 100644 index 000000000..82e89dd60 --- /dev/null +++ b/ru/docs/chapter_hashing/hash_algorithm.md @@ -0,0 +1,410 @@ +# Алгоритмы хеширования + +В двух предыдущих разделах мы рассмотрели принципы работы хеш-таблицы и способы обработки хеш-коллизий. Однако и открытая адресация, и метод цепочек **лишь позволяют хеш-таблице корректно работать при возникновении коллизий, но не уменьшают вероятность появления самих коллизий**. + +Если хеш-коллизии происходят слишком часто, производительность хеш-таблицы резко деградирует. Как показано на рисунке ниже, для хеш-таблицы с методом цепочек в идеальном случае пары ключ-значение равномерно распределены по всем бакетам, и это дает наилучшую эффективность поиска; в худшем же случае все пары ключ-значение оказываются в одном бакете, и временная сложность вырождается до $O(n)$ . + +![Лучший и худший случаи хеш-коллизий](hash_algorithm.assets/hash_collision_best_worst_condition.png) + +**Распределение пар ключ-значение определяется хеш-функцией**. Вспомним этапы вычисления хеш-функции: сначала вычисляется хеш-значение, затем оно берется по модулю длины массива: + +```shell +index = hash(key) % capacity +``` + +Из этой формулы видно: при фиксированной емкости хеш-таблицы `capacity` **выходное значение определяет именно хеш-алгоритм `hash()` **, а значит, именно он определяет распределение пар ключ-значение в хеш-таблице. + +Это означает, что для уменьшения вероятности хеш-коллизий нам следует сосредоточиться на проектировании хеш-алгоритма `hash()` . + +## Цели хеш-алгоритма + +Чтобы получить структуру данных хеш-таблицы, которая будет одновременно "быстрой и надежной", хеш-алгоритм должен обладать следующими свойствами. + +- **Детерминированность**: для одинакового входа хеш-алгоритм всегда должен выдавать одинаковый результат. Только так хеш-таблица остается надежной. +- **Высокая эффективность**: вычисление хеш-значения должно быть достаточно быстрым. Чем меньше вычислительные затраты, тем выше практическая ценность хеш-таблицы. +- **Равномерное распределение**: хеш-алгоритм должен стараться распределять пары ключ-значение в хеш-таблице равномерно. Чем равномернее распределение, тем ниже вероятность хеш-коллизий. + +На практике хеш-алгоритмы используются не только для реализации хеш-таблиц, но и во многих других областях. + +- **Хранение паролей**: чтобы защищать пароли пользователей, система обычно хранит не сами пароли в открытом виде, а их хеш-значения. Когда пользователь вводит пароль, система вычисляет хеш-значение введенного пароля и сравнивает его с сохраненным значением. Если они совпадают, пароль считается правильным. +- **Проверка целостности данных**: отправитель может вычислить хеш-значение данных и отправить его вместе с самими данными; получатель затем вычисляет хеш-значение повторно и сравнивает его с полученным. Если они совпадают, данные считаются целостными. + +Для приложений, связанных с криптографией, чтобы не допустить восстановления исходного пароля по хеш-значению и иных форм обратного анализа, хеш-алгоритм должен обладать более строгими свойствами безопасности. + +- **Односторонность**: по хеш-значению нельзя восстановить какую-либо информацию о входных данных. +- **Устойчивость к коллизиям**: должно быть крайне трудно найти два разных входа, имеющих одинаковое хеш-значение. +- **Эффект лавины**: даже небольшое изменение во входных данных должно приводить к заметному и непредсказуемому изменению результата. + +Обрати внимание: **"равномерное распределение" и "устойчивость к коллизиям" - это два независимых понятия** , и выполнение первого не означает автоматического выполнения второго. Например, при случайном распределении входных `key` хеш-функция `key % 100` может выдавать достаточно равномерное распределение. Однако этот хеш-алгоритм слишком прост: все `key` с одинаковыми двумя последними цифрами будут иметь одинаковый результат, а значит, по хеш-значению можно легко подобрать подходящие `key` и, например, взломать пароль. + +## Проектирование хеш-алгоритма + +Разработка хеш-алгоритма - это сложная задача, в которой нужно учитывать множество факторов. Однако для некоторых нетребовательных сценариев мы можем спроектировать и несколько простых хеш-алгоритмов. + +- **Аддитивный хеш**: складываем ASCII-коды всех символов входной строки и используем полученную сумму как хеш-значение. +- **Мультипликативный хеш**: используем "некоррелированность" умножения; на каждом шаге умножаем текущее значение на константу и добавляем ASCII-код очередного символа. +- **XOR-хеш**: последовательно накапливаем элементы входных данных в одном хеш-значении через операцию XOR. +- **Ротационный хеш**: последовательно накапливаем ASCII-коды символов, причем перед каждым накоплением выполняем циклический сдвиг хеш-значения. + +```src +[file]{simple_hash}-[class]{}-[func]{rot_hash} +``` + +Нетрудно заметить, что последний шаг каждого из этих хеш-алгоритмов - взятие по модулю большого простого числа $1000000007$ , чтобы гарантировать, что хеш-значение остается в разумных границах. Стоит задуматься: почему подчеркивается именно взятие по модулю простого числа, и какие недостатки возникают при использовании составного модуля? Это интересный вопрос. + +Сначала дадим вывод: **использование большого простого числа в качестве модуля позволяет в максимальной степени обеспечивать равномерное распределение хеш-значений**. Поскольку простое число не имеет общих делителей с другими числами, это помогает уменьшить периодические закономерности, возникающие из-за операции взятия остатка, и тем самым снизить число хеш-коллизий. + +Рассмотрим пример. Предположим, мы выбрали составное число $9$ в качестве модуля. Оно делится на $3$ , поэтому все `key` , которые делятся на $3$ , будут отображаться только в три хеш-значения: $0$ , $3$ , $6$ . + +$$ +\begin{aligned} +\text{modulus} & = 9 \newline +\text{key} & = \{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \dots \} \newline +\text{hash} & = \{ 0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6,\dots \} +\end{aligned} +$$ + +Если входные `key` как раз удовлетворяют такому распределению в виде арифметической прогрессии, то хеш-значения начнут скучиваться, а это усугубит хеш-коллизии. Теперь предположим, что мы заменили `modulus` на простое число $13$ ; поскольку между `key` и `modulus` нет общих делителей, равномерность распределения хеш-значений заметно улучшится. + +$$ +\begin{aligned} +\text{modulus} & = 13 \newline +\text{key} & = \{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \dots \} \newline +\text{hash} & = \{ 0, 3, 6, 9, 12, 2, 5, 8, 11, 1, 4, 7, \dots \} +\end{aligned} +$$ + +Следует отметить: если можно гарантировать, что `key` распределены случайно и равномерно, то выбор простого или составного числа в качестве модуля не так важен - оба варианта способны дать равномерное распределение хеш-значений. Но если в распределении `key` присутствует периодичность, то взятие по модулю составного числа гораздо легче приводит к кластеризации. + +Итак, на практике мы обычно выбираем простое число в качестве модуля, причем это простое число желательно брать достаточно большим, чтобы по возможности убрать периодические закономерности и повысить устойчивость хеш-алгоритма. + +## Распространенные хеш-алгоритмы + +Нетрудно заметить, что описанные выше простые хеш-алгоритмы довольно "хрупкие" и далеки от поставленных целей. Например, сложение и XOR подчиняются коммутативному закону, поэтому аддитивный хеш и XOR-хеш не различают строки, состоящие из одних и тех же символов, но в разном порядке. Это может усиливать хеш-коллизии и даже создавать некоторые проблемы безопасности. + +На практике мы обычно используем стандартные хеш-алгоритмы, такие как MD5, SHA-1, SHA-2 и SHA-3. Они могут отображать входные данные произвольной длины в хеш-значения фиксированной длины. + +На протяжении почти ста лет хеш-алгоритмы непрерывно развивались и оптимизировались. Одни исследователи старались повысить их производительность, а другие исследователи и хакеры сосредоточивались на поиске уязвимостей в их безопасности. В таблице ниже приведены распространенные хеш-алгоритмы, которые часто встречаются в реальных приложениях. + +- MD5 и SHA-1 уже многократно были успешно атакованы, поэтому они выведены из большинства сценариев, где требуется безопасность. +- SHA-256 из семейства SHA-2 является одним из самых надежных хеш-алгоритмов; на сегодняшний день не известно успешных практических атак, поэтому он широко используется в самых разных протоколах и системах безопасности. +- SHA-3 по сравнению с SHA-2 требует меньших затрат на реализацию и обеспечивает более высокую вычислительную эффективность, но на данный момент распространен слабее, чем семейство SHA-2. + +

      Таблица   Распространенные хеш-алгоритмы

      + +| | MD5 | SHA-1 | SHA-2 | SHA-3 | +| -------- | ------------------------------ | ---------------- | ---------------------------- | ------------------- | +| Год появления | 1992 | 1995 | 2002 | 2008 | +| Длина вывода | 128 bit | 160 bit | 256/512 bit | 224/256/384/512 bit | +| Хеш-коллизии | Частые | Частые | Редкие | Редкие | +| Уровень безопасности | Низкий, успешно атакован | Низкий, успешно атакован | Высокий | Высокий | +| Применение | Устарел, но еще используется для проверки целостности данных | Устарел | Проверка криптовалютных транзакций, цифровые подписи и т. д. | Может использоваться как замена SHA-2 | + +## Хеш-значения структур данных + +Мы знаем, что `key` в хеш-таблице могут быть целыми числами, вещественными числами, строками и другими типами данных. Языки программирования обычно предоставляют встроенные хеш-алгоритмы для этих типов, чтобы вычислять индексы бакетов в хеш-таблице. Возьмем Python: в нем можно вызвать функцию `hash()` , чтобы вычислить хеш-значения для различных типов данных. + +- Хеш-значение целого числа и булева значения совпадает с самим значением. +- Вычисление хеш-значений для вещественных чисел и строк устроено сложнее; интересующиеся читатели могут изучить это самостоятельно. +- Хеш-значение кортежа получается путем хеширования каждого элемента, а затем объединения этих хеш-значений в одно итоговое значение. +- Хеш-значение объекта обычно строится на основе его адреса в памяти. Если переопределить метод хеширования объекта, можно реализовать вычисление хеша по содержимому. + +!!! tip + + Обрати внимание: определения и способы вычисления встроенных хеш-значений в разных языках программирования отличаются. + +=== "Python" + + ```python title="built_in_hash.py" + num = 3 + hash_num = hash(num) + # Хеш-значение целого числа 3 равно 3 + + bol = True + hash_bol = hash(bol) + # Хеш-значение булевого значения True равно 1 + + dec = 3.14159 + hash_dec = hash(dec) + # Хеш-значение числа 3.14159 равно 326484311674566659 + + str = "Hello Algo" + hash_str = hash(str) + # Хеш-значение строки "Hello Algo" равно 4617003410720528961 + + tup = (12836, "Сяо Ха") + hash_tup = hash(tup) + # Хеш-значение кортежа (12836, "Сяо Ха") равно 1029005403108185979 + + obj = ListNode(0) + hash_obj = hash(obj) + # Хеш-значение объекта узла равно 274267521 + ``` + +=== "C++" + + ```cpp title="built_in_hash.cpp" + int num = 3; + size_t hashNum = hash()(num); + // Хеш-значение целого числа 3 равно 3 + + bool bol = true; + size_t hashBol = hash()(bol); + // Хеш-значение булевого значения 1 равно 1 + + double dec = 3.14159; + size_t hashDec = hash()(dec); + // Хеш-значение числа 3.14159 равно 4614256650576692846 + + string str = "Hello Algo"; + size_t hashStr = hash()(str); + // Хеш-значение строки "Hello Algo" равно 15466937326284535026 + + // В C++ встроенный std::hash() предоставляет вычисление хеша только для базовых типов данных + // Для массивов и объектов хеш-значение обычно приходится реализовывать самостоятельно + ``` + +=== "Java" + + ```java title="built_in_hash.java" + int num = 3; + int hashNum = Integer.hashCode(num); + // Хеш-значение целого числа 3 равно 3 + + boolean bol = true; + int hashBol = Boolean.hashCode(bol); + // Хеш-значение булевого значения true равно 1231 + + double dec = 3.14159; + int hashDec = Double.hashCode(dec); + // Хеш-значение числа 3.14159 равно -1340954729 + + String str = "Hello Algo"; + int hashStr = str.hashCode(); + // Хеш-значение строки "Hello Algo" равно -727081396 + + Object[] arr = { 12836, "Сяо Ха" }; + int hashTup = Arrays.hashCode(arr); + // Хеш-значение массива [12836, Сяо Ха] равно 1151158 + + ListNode obj = new ListNode(0); + int hashObj = obj.hashCode(); + // Хеш-значение объекта узла utils.ListNode@7dc5e7b4 равно 2110121908 + ``` + +=== "C#" + + ```csharp title="built_in_hash.cs" + int num = 3; + int hashNum = num.GetHashCode(); + // Хеш-значение целого числа 3 равно 3; + + bool bol = true; + int hashBol = bol.GetHashCode(); + // Хеш-значение булевого значения true равно 1; + + double dec = 3.14159; + int hashDec = dec.GetHashCode(); + // Хеш-значение числа 3.14159 равно -1340954729; + + string str = "Hello Algo"; + int hashStr = str.GetHashCode(); + // Хеш-значение строки "Hello Algo" равно -586107568; + + object[] arr = [12836, "Сяо Ха"]; + int hashTup = arr.GetHashCode(); + // Хеш-значение массива [12836, Сяо Ха] равно 42931033; + + ListNode obj = new(0); + int hashObj = obj.GetHashCode(); + // Хеш-значение объекта узла 0 равно 39053774; + ``` + +=== "Go" + + ```go title="built_in_hash.go" + // В Go нет встроенной функции hash code + ``` + +=== "Swift" + + ```swift title="built_in_hash.swift" + let num = 3 + let hashNum = num.hashValue + // Хеш-значение целого числа 3 равно 9047044699613009734 + + let bol = true + let hashBol = bol.hashValue + // Хеш-значение булевого значения true равно -4431640247352757451 + + let dec = 3.14159 + let hashDec = dec.hashValue + // Хеш-значение числа 3.14159 равно -2465384235396674631 + + let str = "Hello Algo" + let hashStr = str.hashValue + // Хеш-значение строки "Hello Algo" равно -7850626797806988787 + + let arr = [AnyHashable(12836), AnyHashable("Сяо Ха")] + let hashTup = arr.hashValue + // Хеш-значение массива [AnyHashable(12836), AnyHashable("Сяо Ха")] равно -2308633508154532996 + + let obj = ListNode(x: 0) + let hashObj = obj.hashValue + // Хеш-значение объекта узла utils.ListNode равно -2434780518035996159 + ``` + +=== "JS" + + ```javascript title="built_in_hash.js" + // В JavaScript нет встроенной функции hash code + ``` + +=== "TS" + + ```typescript title="built_in_hash.ts" + // В TypeScript нет встроенной функции hash code + ``` + +=== "Dart" + + ```dart title="built_in_hash.dart" + int num = 3; + int hashNum = num.hashCode; + // Хеш-значение целого числа 3 равно 34803 + + bool bol = true; + int hashBol = bol.hashCode; + // Хеш-значение булевого значения true равно 1231 + + double dec = 3.14159; + int hashDec = dec.hashCode; + // Хеш-значение числа 3.14159 равно 2570631074981783 + + String str = "Hello Algo"; + int hashStr = str.hashCode; + // Хеш-значение строки "Hello Algo" равно 468167534 + + List arr = [12836, "Сяо Ха"]; + int hashArr = arr.hashCode; + // Хеш-значение массива [12836, Сяо Ха] равно 976512528 + + ListNode obj = new ListNode(0); + int hashObj = obj.hashCode; + // Хеш-значение объекта Instance of 'ListNode' равно 1033450432 + ``` + +=== "Rust" + + ```rust title="built_in_hash.rs" + use std::collections::hash_map::DefaultHasher; + use std::hash::{Hash, Hasher}; + + let num = 3; + let mut num_hasher = DefaultHasher::new(); + num.hash(&mut num_hasher); + let hash_num = num_hasher.finish(); + // Хеш-значение целого числа 3 равно 568126464209439262 + + let bol = true; + let mut bol_hasher = DefaultHasher::new(); + bol.hash(&mut bol_hasher); + let hash_bol = bol_hasher.finish(); + // Хеш-значение булевого значения true равно 4952851536318644461 + + let dec: f32 = 3.14159; + let mut dec_hasher = DefaultHasher::new(); + dec.to_bits().hash(&mut dec_hasher); + let hash_dec = dec_hasher.finish(); + // Хеш-значение числа 3.14159 равно 2566941990314602357 + + let str = "Hello Algo"; + let mut str_hasher = DefaultHasher::new(); + str.hash(&mut str_hasher); + let hash_str = str_hasher.finish(); + // Хеш-значение строки "Hello Algo" равно 16092673739211250988 + + let arr = (&12836, &"Сяо Ха"); + let mut tup_hasher = DefaultHasher::new(); + arr.hash(&mut tup_hasher); + let hash_tup = tup_hasher.finish(); + // Хеш-значение кортежа (12836, "Сяо Ха") равно 1885128010422702749 + + let node = ListNode::new(42); + let mut hasher = DefaultHasher::new(); + node.borrow().val.hash(&mut hasher); + let hash = hasher.finish(); + // Хеш-значение объекта RefCell { value: ListNode { val: 42, next: None } } равно 15387811073369036852 + ``` + +=== "C" + + ```c title="built_in_hash.c" + // В C нет встроенной функции hash code + ``` + +=== "Kotlin" + + ```kotlin title="built_in_hash.kt" + val num = 3 + val hashNum = num.hashCode() + // Хеш-значение целого числа 3 равно 3 + + val bol = true + val hashBol = bol.hashCode() + // Хеш-значение булевого значения true равно 1231 + + val dec = 3.14159 + val hashDec = dec.hashCode() + // Хеш-значение числа 3.14159 равно -1340954729 + + val str = "Hello Algo" + val hashStr = str.hashCode() + // Хеш-значение строки "Hello Algo" равно -727081396 + + val arr = arrayOf(12836, "Сяо Ха") + val hashTup = arr.hashCode() + // Хеш-значение массива [12836, Сяо Ха] равно 189568618 + + val obj = ListNode(0) + val hashObj = obj.hashCode() + // Хеш-значение объекта узла utils.ListNode@1d81eb93 равно 495053715 + ``` + +=== "Ruby" + + ```ruby title="built_in_hash.rb" + num = 3 + hash_num = num.hash + # Хеш-значение целого числа 3 равно -4385856518450339636 + + bol = true + hash_bol = bol.hash + # Хеш-значение булевого значения true равно -1617938112149317027 + + dec = 3.14159 + hash_dec = dec.hash + # Хеш-значение числа 3.14159 равно -1479186995943067893 + + str = "Hello Algo" + hash_str = str.hash + # Хеш-значение строки "Hello Algo" равно -4075943250025831763 + + tup = [12836, 'Сяо Ха'] + hash_tup = tup.hash + # Хеш-значение кортежа (12836, 'Сяо Ха') равно 1999544809202288822 + + obj = ListNode.new(0) + hash_obj = obj.hash + # Хеш-значение объекта # равно 4302940560806366381 + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%20%20%20%20%22%22%22%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%D1%83%D0%B7%D0%B5%D0%BB%D0%BA%D0%BB%D0%B0%D1%81%D1%81%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20num%20%3D%203%0A%20%20%20%20hash_num%20%3D%20hash%28num%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%86%D0%B5%D0%BB%D0%BE%D0%B3%D0%BE%20%D1%87%D0%B8%D1%81%D0%BB%D0%B0%203%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%203%0A%0A%20%20%20%20bol%20%3D%20True%0A%20%20%20%20hash_bol%20%3D%20hash%28bol%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B1%D1%83%D0%BB%D0%B5%D0%B2%D0%B0%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20True%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%201%0A%0A%20%20%20%20dec%20%3D%203.14159%0A%20%20%20%20hash_dec%20%3D%20hash%28dec%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%87%D0%B8%D1%81%D0%BB%D0%B0%203.14159%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%20326484311674566659%0A%0A%20%20%20%20str%20%3D%20%22Hello%20Algo%22%0A%20%20%20%20hash_str%20%3D%20hash%28str%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%20%22Hello%20Algo%22%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%204617003410720528961%0A%0A%20%20%20%20tup%20%3D%20%2812836%2C%20%22%D0%A1%D1%8F%D0%BE%20%D0%A5%D0%B0%22%29%0A%20%20%20%20hash_tup%20%3D%20hash%28tup%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B0%20%2812836%2C%20%27%D0%A1%D1%8F%D0%BE%20%D0%A5%D0%B0%27%29%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%201029005403108185979%0A%0A%20%20%20%20obj%20%3D%20ListNode%280%29%0A%20%20%20%20hash_obj%20%3D%20hash%28obj%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0%20%D1%83%D0%B7%D0%BB%D0%B0%20%3CListNode%20object%20at%200x1058fd810%3E%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%20274267521&cumulative=false&curInstr=19&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +Во многих языках программирования **в качестве `key` хеш-таблицы можно использовать только неизменяемые объекты** . Если, например, использовать список (динамический массив) как `key` , то после изменения содержимого списка изменится и его хеш-значение, из-за чего мы уже не сможем найти прежнее `value` в хеш-таблице. + +Хотя у пользовательских объектов (например, у узла связного списка) поля являются изменяемыми, сам объект все же может быть хешируемым. **Причина в том, что хеш-значение объекта обычно строится на основе адреса в памяти** : даже если содержимое объекта меняется, его адрес памяти остается прежним, а значит, и хеш-значение не меняется. + +Внимательный читатель мог заметить, что при запуске программы в разных консолях выводимые хеш-значения отличаются. **Это связано с тем, что интерпретатор Python при каждом запуске добавляет в хеш-функцию строк случайную соль (salt)**. Такой подход эффективно защищает от атак типа HashDoS и повышает безопасность хеш-алгоритма. diff --git a/ru/docs/chapter_hashing/hash_collision.assets/hash_table_chaining.png b/ru/docs/chapter_hashing/hash_collision.assets/hash_table_chaining.png new file mode 100644 index 0000000000000000000000000000000000000000..6d9f8f5b408a42af1312e955afd04bcfead07f29 GIT binary patch literal 22339 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 C4Jao7 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_hashing/hash_collision.assets/hash_table_open_addressing_deletion.png b/ru/docs/chapter_hashing/hash_collision.assets/hash_table_open_addressing_deletion.png new file mode 100644 index 0000000000000000000000000000000000000000..0564af14c2c7c854159e3250c6eadc5d2ad80125 GIT binary patch literal 10895 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_hashing/hash_collision.md b/ru/docs/chapter_hashing/hash_collision.md new file mode 100644 index 000000000..41abe3daf --- /dev/null +++ b/ru/docs/chapter_hashing/hash_collision.md @@ -0,0 +1,108 @@ +# Хеш-коллизии + +Как уже говорилось в предыдущем разделе, **в обычных условиях входное пространство хеш-функции намного больше выходного пространства** , поэтому теоретически хеш-коллизии неизбежны. Например, если входное пространство состоит из всех целых чисел, а выходное пространство ограничено размером массива, то неизбежно несколько целых чисел будут отображаться в один и тот же индекс бакета. + +Хеш-коллизии приводят к ошибочным результатам поиска и серьезно влияют на пригодность хеш-таблицы к использованию. Чтобы решить эту проблему, можно при каждом конфликте выполнять расширение хеш-таблицы, пока конфликт не исчезнет. Этот метод прост и груб, но слишком неэффективен, потому что расширение хеш-таблицы требует большого объема переноса данных и вычислений хеш-значений. Чтобы повысить эффективность, можно использовать следующие стратегии. + +1. Улучшить структуру данных хеш-таблицы, **чтобы она могла корректно работать даже при возникновении хеш-коллизий**. +2. Выполнять расширение только тогда, когда это действительно необходимо, то есть когда хеш-коллизии становятся достаточно серьезными. + +Основные способы улучшения структуры хеш-таблицы включают "метод цепочек" и "открытую адресацию". + +## Метод цепочек + +В исходной хеш-таблице каждый бакет может хранить только одну пару ключ-значение. Метод цепочек (separate chaining) превращает отдельный элемент в связный список: пары ключ-значение становятся узлами списка, и все конфликтующие пары ключ-значение хранятся в одном и том же списке. На рисунке ниже показан пример хеш-таблицы, реализованной методом цепочек. + +![Хеш-таблица с методом цепочек](hash_collision.assets/hash_table_chaining.png) + +Методы работы с хеш-таблицей, построенной на основе метода цепочек, меняются следующим образом. + +- **Поиск элемента**: передаем `key` , по хеш-функции получаем индекс бакета, после чего обращаемся к голове списка и обходим список, сравнивая `key` , пока не найдем целевую пару ключ-значение. +- **Добавление элемента**: сначала через хеш-функцию получаем голову списка, затем добавляем узел (пару ключ-значение) в этот список. +- **Удаление элемента**: по результату хеш-функции обращаемся к голове списка, затем обходим список, находим целевой узел и удаляем его. + +Метод цепочек имеет следующие ограничения. + +- **Рост потребления памяти**: связный список содержит указатели на узлы, поэтому по сравнению с массивом он требует больше памяти. +- **Снижение эффективности поиска**: для нахождения нужного элемента нужно линейно обходить связный список. + +Ниже приведена простая реализация хеш-таблицы методом цепочек. Следует обратить внимание на два момента. + +- Для упрощения кода вместо связного списка используется список (динамический массив). В этой реализации хеш-таблица (массив) содержит несколько бакетов, и каждый бакет представляет собой список. +- Ниже включен метод расширения хеш-таблицы. Когда коэффициент загрузки превышает $\frac{2}{3}$ , мы расширяем хеш-таблицу до $2$ раз от прежней емкости. + +```src +[file]{hash_map_chaining}-[class]{hash_map_chaining}-[func]{} +``` + +Следует отметить, что когда связный список становится очень длинным, эффективность поиска $O(n)$ оказывается низкой. **В этом случае список можно преобразовать в "AVL-дерево" или "красно-черное дерево"** , чтобы оптимизировать временную сложность поиска до $O(\log n)$ . + +## Открытая адресация + +Открытая адресация (open addressing) не вводит дополнительных структур данных, а обрабатывает хеш-коллизии с помощью "многократного пробирования"; основные варианты пробирования включают линейное пробирование, квадратичное пробирование и повторное хеширование. + +Ниже на примере линейного пробирования рассмотрим механизм работы хеш-таблицы с открытой адресацией. + +### Линейное пробирование + +Линейное пробирование использует линейный поиск с фиксированным шагом. Его методы работы отличаются от обычной хеш-таблицы. + +- **Вставка элемента**: по хеш-функции вычисляется индекс бакета; если бакет уже занят, то от места конфликта выполняется линейный обход вперед (шаг обычно равен $1$ ), пока не будет найден пустой бакет, после чего элемент вставляется туда. +- **Поиск элемента**: если возник конфликт, то с тем же шагом продолжается линейный обход вперед, пока не будет найден целевой элемент и возвращено `value` ; если встречается пустой бакет, это означает, что искомого элемента в хеш-таблице нет, и возвращается `None` . + +На рисунке ниже показано распределение пар ключ-значение в хеш-таблице с открытой адресацией (линейное пробирование). Для этой хеш-функции все `key` с одинаковыми двумя последними цифрами отображаются в один и тот же бакет. Благодаря линейному пробированию они по очереди сохраняются в этом бакете и в следующих за ним бакетах. + +![Распределение пар ключ-значение в хеш-таблице с открытой адресацией (линейное пробирование)](hash_collision.assets/hash_table_linear_probing.png) + +Однако **линейное пробирование легко приводит к "кластеризации"**. Иначе говоря, чем длиннее непрерывная занятая область в массиве, тем выше вероятность новых коллизий в этой области, что еще сильнее способствует росту этой группы и в итоге ухудшает эффективность операций добавления, удаления, поиска и обновления. + +Стоит заметить, что **мы не можем напрямую удалять элементы из хеш-таблицы с открытой адресацией**. Причина в том, что удаление создаст внутри массива пустой бакет `None` , а при поиске элемента линейное пробирование остановится на этом пустом бакете и вернет результат, из-за чего элементы ниже этого бакета уже не смогут быть найдены, и программа может ошибочно посчитать, что их не существует, как показано на рисунке ниже. + +![Проблема поиска после удаления элемента в открытой адресации](hash_collision.assets/hash_table_open_addressing_deletion.png) + +Чтобы решить эту проблему, можно использовать механизм ленивого удаления (lazy deletion): он не удаляет элемент из хеш-таблицы напрямую, **а помечает этот бакет специальной константой `TOMBSTONE` **. В этом механизме и `None` , и `TOMBSTONE` означают пустой бакет, и оба могут быть использованы для размещения пары ключ-значение. Но есть важное различие: при линейном пробировании, встретив `TOMBSTONE` , нужно продолжать обход, потому что ниже него все еще могут существовать пары ключ-значение. + +Однако **ленивое удаление может ускорять деградацию производительности хеш-таблицы**. Это связано с тем, что каждая операция удаления создает новую метку удаления; по мере роста числа `TOMBSTONE` время поиска тоже увеличивается, потому что линейное пробирование может быть вынуждено перескакивать через множество `TOMBSTONE` , прежде чем найдет целевой элемент. + +Поэтому имеет смысл при линейном пробировании запоминать индекс первого встреченного `TOMBSTONE` и затем менять найденный целевой элемент местами с этим `TOMBSTONE` . Преимущество такого подхода в том, что при каждом поиске или добавлении элемент будет перемещаться в бакет, расположенный ближе к его идеальной позиции (начальной точке пробирования), а значит, эффективность поиска улучшится. + +Ниже приведена реализация хеш-таблицы с открытой адресацией (линейное пробирование), включающая ленивое удаление. Чтобы пространство хеш-таблицы использовалось более полно, мы рассматриваем ее как "кольцевой массив": когда обход выходит за конец массива, он возвращается к началу и продолжается. + +```src +[file]{hash_map_open_addressing}-[class]{hash_map_open_addressing}-[func]{} +``` + +### Квадратичное пробирование + +Квадратичное пробирование похоже на линейное пробирование и тоже является одной из распространенных стратегий открытой адресации. При возникновении конфликта оно не пропускает фиксированное число шагов, а переходит на расстояние, равное "квадрату числа попыток", то есть на $1, 4, 9, \dots$ шагов. + +Квадратичное пробирование имеет следующие основные преимущества. + +- Квадратичное пробирование пытается смягчить эффект кластеризации линейного пробирования, так как пропускает расстояния, равные квадрату номера попытки. +- Квадратичное пробирование перепрыгивает на более дальние позиции в поисках свободного места, что помогает распределять данные более равномерно. + +Однако квадратичное пробирование не является идеальным. + +- Кластеризация все равно существует: некоторые позиции по-прежнему занимают чаще других. +- Из-за быстрого роста квадрата квадратичное пробирование может не охватить всю хеш-таблицу, а это означает, что даже при наличии пустых бакетов оно может так до них и не добраться. + +### Повторное хеширование + +Как видно из названия, метод повторного хеширования использует для пробирования несколько хеш-функций $f_1(x)$, $f_2(x)$, $f_3(x)$, $\dots$ . + +- **Вставка элемента**: если хеш-функция $f_1(x)$ вызывает конфликт, то пробуем $f_2(x)$ , и так далее, пока не будет найдено пустое место для вставки элемента. +- **Поиск элемента**: поиск идет в том же порядке хеш-функций, пока не будет найден целевой элемент; если встречается пустая позиция или уже были опробованы все хеш-функции, это означает, что элемента в хеш-таблице нет, и возвращается `None` . + +По сравнению с линейным пробированием метод повторного хеширования меньше подвержен кластеризации, но несколько хеш-функций приносят дополнительные вычислительные затраты. + +!!! tip + + Обрати внимание: у хеш-таблиц с открытой адресацией (линейное пробирование, квадратичное пробирование и повторное хеширование) есть общая проблема: в них нельзя напрямую удалять элементы. + +## Выбор в языках программирования + +Разные языки программирования используют разные стратегии реализации хеш-таблиц. Ниже приведено несколько примеров. + +- Python использует открытую адресацию. В словаре `dict` для пробирования применяются псевдослучайные числа. +- Java использует метод цепочек. Начиная с JDK 1.8, когда длина массива внутри `HashMap` достигает 64, а длина списка достигает 8, этот список преобразуется в красно-черное дерево для повышения производительности поиска. +- Go использует метод цепочек. В Go установлено, что каждый бакет может хранить не более 8 пар ключ-значение; при переполнении подключается overflow-bucket, а когда таких bucket становится слишком много, выполняется специальное расширение того же масштаба, чтобы сохранить производительность. diff --git a/ru/docs/chapter_hashing/hash_map.assets/hash_collision.png b/ru/docs/chapter_hashing/hash_map.assets/hash_collision.png new file mode 100644 index 0000000000000000000000000000000000000000..0091a0abd9c5e2cc0316f338c10fdd28ede1776b GIT binary patch literal 21034 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_graph/graph_traversal.md b/ru/docs/chapter_graph/graph_traversal.md new file mode 100644 index 000000000..fb25ee8dc --- /dev/null +++ b/ru/docs/chapter_graph/graph_traversal.md @@ -0,0 +1,140 @@ +# Обход графа + +Дерево представляет отношение "один ко многим", а граф имеет более высокую степень свободы и может выражать произвольные отношения "многие ко многим". Поэтому мы можем рассматривать дерево как частный случай графа. Очевидно, что **операции обхода дерева также являются частным случаем операций обхода графа**. + +И графы, и деревья требуют использования поисковых алгоритмов для реализации обхода. Способы обхода графа также делятся на два типа: обход в ширину и обход в глубину. + +## Обход в ширину + +**Обход в ширину - это способ обхода "от близкого к далекому": начиная с некоторого узла, мы всегда в первую очередь посещаем ближайшие вершины и слой за слоем расширяемся наружу**. Как показано на рисунке ниже, начиная с вершины в левом верхнем углу, мы сначала обходим все смежные вершины этой вершины, затем все смежные вершины следующей вершины и так далее, пока не будут посещены все вершины. + +![Обход графа в ширину](graph_traversal.assets/graph_bfs.png) + +### Реализация алгоритма + +BFS обычно реализуется с помощью очереди, код приведен ниже. Очередь обладает свойством "первым пришел - первым вышел", что хорошо соответствует идее BFS "от близкого к далекому". + +1. Поместить стартовую вершину обхода `startVet` в очередь и запустить цикл. +2. На каждой итерации цикла извлекать вершину из головы очереди и записывать факт ее посещения, после чего добавлять все смежные вершины этой вершины в хвост очереди. +3. Повторять шаг `2.` до тех пор, пока не будут посещены все вершины. + +Чтобы предотвратить повторный обход вершин, нам нужен хеш-набор `visited` , в котором будет записываться, какие узлы уже посещены. + +!!! tip + + Хеш-набор можно рассматривать как хеш-таблицу, которая хранит только `key` и не хранит `value` . Он позволяет выполнять добавление, удаление, поиск и изменение `key` за $O(1)$ времени. Благодаря уникальности `key` хеш-набор обычно используется, например, для устранения повторов. + +```src +[file]{graph_bfs}-[class]{}-[func]{graph_bfs} +``` + +Код сравнительно абстрактен, поэтому рекомендуется сверяться с рисунками ниже для лучшего понимания. + +=== "<1>" + ![Шаги обхода графа в ширину](graph_traversal.assets/graph_bfs_step1.png) + +=== "<2>" + ![graph_bfs_step2](graph_traversal.assets/graph_bfs_step2.png) + +=== "<3>" + ![graph_bfs_step3](graph_traversal.assets/graph_bfs_step3.png) + +=== "<4>" + ![graph_bfs_step4](graph_traversal.assets/graph_bfs_step4.png) + +=== "<5>" + ![graph_bfs_step5](graph_traversal.assets/graph_bfs_step5.png) + +=== "<6>" + ![graph_bfs_step6](graph_traversal.assets/graph_bfs_step6.png) + +=== "<7>" + ![graph_bfs_step7](graph_traversal.assets/graph_bfs_step7.png) + +=== "<8>" + ![graph_bfs_step8](graph_traversal.assets/graph_bfs_step8.png) + +=== "<9>" + ![graph_bfs_step9](graph_traversal.assets/graph_bfs_step9.png) + +=== "<10>" + ![graph_bfs_step10](graph_traversal.assets/graph_bfs_step10.png) + +=== "<11>" + ![graph_bfs_step11](graph_traversal.assets/graph_bfs_step11.png) + +!!! question "Является ли последовательность обхода в ширину единственной?" + + Нет. Обход в ширину требует только соблюдения порядка "от близкого к далекому", **а порядок обхода нескольких вершин на одинаковом расстоянии может произвольно меняться**. Например, на рисунке выше можно поменять местами порядок посещения вершин $1$ и $3$ , а также в произвольном порядке переставить вершины $2$, $4$, $6$ . + +### Анализ сложности + +**Временная сложность**: все вершины по одному разу помещаются в очередь и извлекаются из нее, что требует $O(|V|)$ времени; при обходе смежных вершин, поскольку граф неориентированный, все ребра будут посещены по $2$ раза, что требует $O(2|E|)$ времени; в сумме получается $O(|V| + |E|)$ . + +**Пространственная сложность**: список `res` , хеш-набор `visited` и очередь `que` в худшем случае могут содержать до $|V|$ вершин, поэтому требуется $O(|V|)$ памяти. + +## Обход в глубину + +**Обход в глубину - это способ обхода, при котором сначала идут до самого конца, а когда дальше идти нельзя, откатываются назад**. Как показано на рисунке ниже, начиная с вершины в левом верхнем углу, мы выбираем некоторую смежную вершину текущей вершины, идем до упора, затем возвращаемся назад, снова идем до упора и так далее, пока не будут посещены все вершины. + +![Обход графа в глубину](graph_traversal.assets/graph_dfs.png) + +### Реализация алгоритма + +Такой алгоритмический шаблон "дойти до конца и вернуться" обычно реализуется через рекурсию. Подобно обходу в ширину, в обходе в глубину мы также используем хеш-набор `visited` для записи уже посещенных вершин и тем самым избегаем повторного посещения. + +```src +[file]{graph_dfs}-[class]{}-[func]{graph_dfs} +``` + +Алгоритмический процесс обхода в глубину показан на рисунках ниже. + +- **Прямая пунктирная линия обозначает нисходящее рекурсивное развертывание** , то есть запуск нового рекурсивного метода для посещения новой вершины. +- **Изогнутая пунктирная линия обозначает обратный возврат по рекурсии** , то есть данный рекурсивный метод завершился и управление вернулось туда, откуда он был вызван. + +Чтобы лучше понять алгоритм, рекомендуется совместить рисунки ниже с кодом и мысленно проследить весь процесс DFS, включая моменты запуска и возврата каждого рекурсивного вызова. + +=== "<1>" + ![Шаги обхода графа в глубину](graph_traversal.assets/graph_dfs_step1.png) + +=== "<2>" + ![graph_dfs_step2](graph_traversal.assets/graph_dfs_step2.png) + +=== "<3>" + ![graph_dfs_step3](graph_traversal.assets/graph_dfs_step3.png) + +=== "<4>" + ![graph_dfs_step4](graph_traversal.assets/graph_dfs_step4.png) + +=== "<5>" + ![graph_dfs_step5](graph_traversal.assets/graph_dfs_step5.png) + +=== "<6>" + ![graph_dfs_step6](graph_traversal.assets/graph_dfs_step6.png) + +=== "<7>" + ![graph_dfs_step7](graph_traversal.assets/graph_dfs_step7.png) + +=== "<8>" + ![graph_dfs_step8](graph_traversal.assets/graph_dfs_step8.png) + +=== "<9>" + ![graph_dfs_step9](graph_traversal.assets/graph_dfs_step9.png) + +=== "<10>" + ![graph_dfs_step10](graph_traversal.assets/graph_dfs_step10.png) + +=== "<11>" + ![graph_dfs_step11](graph_traversal.assets/graph_dfs_step11.png) + +!!! question "Является ли последовательность обхода в глубину единственной?" + + Как и в случае обхода в ширину, последовательность DFS тоже не является единственной. Для заданной вершины допустимо сначала углубиться в любое направление, то есть порядок смежных вершин может быть произвольным, и все такие варианты будут корректными обходами в глубину. + + Если взять в качестве примера обход дерева, то варианты "корень $\rightarrow$ лево $\rightarrow$ право", "лево $\rightarrow$ корень $\rightarrow$ право" и "лево $\rightarrow$ право $\rightarrow$ корень" соответствуют прямому, симметричному и обратному обходам соответственно. Они показывают три разных приоритета обхода, но все они относятся к обходу в глубину. + +### Анализ сложности + +**Временная сложность**: все вершины будут посещены по $1$ разу, что требует $O(|V|)$ времени; все ребра будут посещены по $2$ раза, что требует $O(2|E|)$ времени; суммарно получается $O(|V| + |E|)$ . + +**Пространственная сложность**: число вершин в списке `res` и хеш-наборе `visited` в худшем случае достигает $|V|$ , максимальная глубина рекурсии тоже равна $|V|$ , поэтому требуется $O(|V|)$ памяти. diff --git a/ru/docs/chapter_graph/index.md b/ru/docs/chapter_graph/index.md new file mode 100644 index 000000000..0a7f42391 --- /dev/null +++ b/ru/docs/chapter_graph/index.md @@ -0,0 +1,9 @@ +# Графы + +![Графы](../assets/covers/chapter_graph.jpg) + +!!! abstract + + На жизненном пути мы подобны узлам, соединенным бесчисленными невидимыми ребрами. + + Каждая встреча и каждое расставание оставляют в этой огромной сети свой особый след. diff --git a/ru/docs/chapter_graph/summary.md b/ru/docs/chapter_graph/summary.md new file mode 100644 index 000000000..444410f07 --- /dev/null +++ b/ru/docs/chapter_graph/summary.md @@ -0,0 +1,31 @@ +# Краткие итоги + +### Основные моменты + +- Граф состоит из вершин и ребер и может быть задан как множество вершин и множество ребер. +- По сравнению с линейными отношениями (связный список) и отношениями разделения (дерево), сетевые отношения (граф) обладают большей свободой и потому более сложны. +- Ребра ориентированного графа имеют направление, в связном графе любые вершины достижимы друг из друга, а в взвешенном графе каждое ребро несет переменную веса. +- Матрица смежности использует матрицу для представления графа: каждая строка и каждый столбец соответствуют вершине, а элементы матрицы показывают, есть между двумя вершинами ребро или нет. Матрица смежности очень эффективна для операций добавления, удаления, поиска и изменения, но расходует больше памяти. +- Список смежности использует несколько списков для представления графа; $i$-й список соответствует вершине $i$ и хранит все ее смежные вершины. По сравнению с матрицей смежности список смежности экономит пространство, но для поиска ребра в нем приходится обходить список, поэтому по времени он уступает. +- Когда списки в списке смежности становятся слишком длинными, их можно преобразовать в красно-черное дерево или хеш-таблицу, чтобы ускорить поиск. +- С точки зрения алгоритмической идеи матрица смежности отражает принцип "обмен пространства на время", а список смежности - принцип "обмена времени на пространство". +- Графы можно использовать для моделирования различных реальных систем, таких как социальные сети, линии метро и так далее. +- Дерево является частным случаем графа, а обход дерева - частным случаем обхода графа. +- Обход графа в ширину представляет собой способ поиска, который расширяется от ближнего к дальнему и обычно реализуется с помощью очереди. +- Обход графа в глубину представляет собой способ поиска, который сначала идет до самого конца, а затем возвращается назад, когда путь исчерпан; обычно он реализуется на основе рекурсии. + +### Q & A + +**Q**: Что считается путем: последовательность вершин или последовательность ребер? + +Определение в разных языковых версиях Википедии различается: в английской версии путь определяется как "последовательность ребер", а в китайской версии - как "последовательность вершин". В английской версии исходная формулировка выглядит так: In graph theory, a path in a graph is a finite or infinite sequence of edges which joins a sequence of vertices. + +В этой книге путь рассматривается как последовательность ребер, а не как последовательность вершин. Причина в том, что между двумя вершинами может существовать несколько ребер, и в таком случае каждому ребру соответствует свой путь. + +**Q**: Есть ли в несвязном графе вершины, до которых нельзя дойти? + +В несвязном графе, начиная из некоторой вершины, по крайней мере одна вершина оказывается недостижимой. Чтобы обойти весь несвязный граф, нужно задать несколько стартовых точек и обойти все связные компоненты графа. + +**Q**: Есть ли требования к порядку вершин в списке "всех вершин, соединенных с данной вершиной" в списке смежности? + +Порядок может быть произвольным. Но на практике может понадобиться сортировка по определенному правилу, например по порядку добавления вершин или по возрастанию значений вершин; это помогает быстро находить вершины с некоторым экстремальным свойством. diff --git a/ru/docs/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_area_chart.png b/ru/docs/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_area_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..a8a7a6e3f667fb3657aa6efaa41ff9db254e4d7f GIT binary patch literal 9441 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 Q?!SWiCrwTiA0yoSA5OU)Qvd(} literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_example.png b/ru/docs/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_example.png new file mode 100644 index 0000000000000000000000000000000000000000..e52da1aea2bdd5ed7db09f08e5102a97a56074c1 GIT binary patch literal 20050 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_unit_value.png b/ru/docs/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_unit_value.png new file mode 100644 index 0000000000000000000000000000000000000000..a70174d68a255d4e3c6fdaf25935ab9ecd02af59 GIT binary patch literal 14882 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 MqQ>JgdF0#w07y$k{Qv*} literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_greedy/greedy_algorithm.assets/coin_change_greedy_vs_dp.png b/ru/docs/chapter_greedy/greedy_algorithm.assets/coin_change_greedy_vs_dp.png new file mode 100644 index 0000000000000000000000000000000000000000..56810bda902dfb91832c8382baa0594220dc7943 GIT binary patch literal 15505 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Жадный алгоритм (greedy algorithm) - это распространенный подход к решению задач оптимизации. Его основная идея состоит в том, чтобы на каждом этапе принятия решения выбирать вариант, который выглядит наилучшим прямо сейчас, то есть жадно принимать локально оптимальные решения в надежде получить глобально оптимальный результат. Жадные алгоритмы лаконичны и эффективны, поэтому широко применяются во многих практических задачах. + +Жадные алгоритмы и динамическое программирование часто используются для решения задач оптимизации. У них есть некоторое сходство, например оба опираются на свойство оптимальной подструктуры, но принципы работы различаются. + +- Динамическое программирование учитывает все решения предыдущих этапов при выборе текущего решения и использует ответы для прошлых подзадач, чтобы построить ответ для текущей подзадачи. +- Жадный алгоритм не учитывает прошлые решения, а просто движется вперед, каждый раз делая жадный выбор, постепенно сужая область задачи, пока она не будет решена. + +Сначала разберем принцип работы жадного алгоритма на примере задачи «размен монет». Эта задача уже встречалась в разделе «задача о полном рюкзаке», поэтому она наверняка вам знакома. + +!!! question + + Дано $n$ видов монет. Номинал монеты $i$ равен $coins[i - 1]$, целевая сумма равна $amt$, причем каждую монету можно брать неограниченное число раз. Требуется найти минимальное число монет, которыми можно набрать целевую сумму. Если набрать сумму невозможно, верните $-1$. + +Жадная стратегия для этой задачи показана на рисунке ниже. Для заданной целевой суммы **мы жадно выбираем монету, которая не превышает ее и находится к ней ближе всего**, и повторяем этот шаг, пока не получим нужную сумму. + +![Жадная стратегия для задачи о размене монет](greedy_algorithm.assets/coin_change_greedy_strategy.png) + +Код реализации выглядит следующим образом: + +```src +[file]{coin_change_greedy}-[class]{}-[func]{coin_change_greedy} +``` + +У вас может невольно вырваться: So clean! Жадный алгоритм решает задачу размена монет всего примерно десятью строками кода. + +## Преимущества и ограничения жадного алгоритма + +**Жадный алгоритм не только прост в действиях и реализации, но и обычно очень эффективен**. В приведенном выше коде обозначим минимальный номинал монеты через $\min(coins)$, тогда жадный выбор выполняется не более чем $amt / \min(coins)$ раз, а временная сложность равна $O(amt / \min(coins))$. Это на порядок меньше, чем временная сложность решения через динамическое программирование $O(n \times amt)$. + +Однако **для некоторых наборов номиналов монет жадный алгоритм не может найти оптимальный ответ**. Ниже показаны два примера. + +- **Положительный пример $coins = [1, 5, 10, 20, 50, 100]$**: для такого набора монет при любом $amt$ жадный алгоритм находит оптимальное решение. +- **Отрицательный пример $coins = [1, 20, 50]$**: пусть $amt = 60$. Жадный алгоритм найдет только комбинацию $50 + 1 \times 10$, то есть всего $11$ монет, тогда как динамическое программирование находит оптимум $20 + 20 + 20$, где требуется лишь $3$ монеты. +- **Отрицательный пример $coins = [1, 49, 50]$**: пусть $amt = 98$. Жадный алгоритм найдет только комбинацию $50 + 1 \times 48$, то есть всего $49$ монет, тогда как динамическое программирование находит оптимум $49 + 49$, где требуется лишь $2$ монеты. + +![Примеры, где жадный алгоритм не находит оптимального решения](greedy_algorithm.assets/coin_change_greedy_vs_dp.png) + +Иными словами, в задаче о размене монет жадный алгоритм не гарантирует нахождение глобально оптимального решения и иногда может приводить к очень плохому ответу. Для этой задачи больше подходит динамическое программирование. + +В общем случае жадный алгоритм применим в двух следующих ситуациях. + +1. **Можно гарантировать нахождение оптимального решения**: в таком случае жадный алгоритм часто является лучшим выбором, поскольку обычно он эффективнее, чем поиск с возвратом и динамическое программирование. +2. **Можно найти приближенно оптимальное решение**: в таком случае жадный алгоритм тоже полезен. Для многих сложных задач поиск глобального оптимума очень труден, и возможность быстро найти субоптимальный ответ уже весьма ценна. + +## Свойства жадного алгоритма + +Тогда возникает вопрос: какие задачи подходят для решения жадным алгоритмом? Или, другими словами, в каких случаях жадный алгоритм может гарантировать оптимальный ответ? + +По сравнению с динамическим программированием условия применения жадного алгоритма строже. В основном нас интересуют два свойства задачи. + +- **Свойство жадного выбора**: только когда локально оптимальный выбор всегда может привести к глобально оптимальному решению, жадный алгоритм способен гарантировать оптимум. +- **Оптимальная подструктура**: оптимальное решение исходной задачи содержит оптимальные решения подзадач. + +Оптимальная подструктура уже обсуждалась в главе «Динамическое программирование», поэтому здесь не будем повторяться. Стоит отметить, что у некоторых задач оптимальная подструктура не столь очевидна, но их все равно можно решать жадным алгоритмом. + +Основное внимание мы уделяем тому, как определить свойство жадного выбора. Хотя формулировка выглядит довольно простой, **на практике для многих задач доказать свойство жадного выбора совсем не легко**. + +Например, в задаче о размене монет легко привести контрпример и опровергнуть свойство жадного выбора, но вот доказать его истинность намного сложнее. Если спросить: **для каких наборов монет можно использовать жадный алгоритм**? - обычно удается дать лишь интуитивный или примерный ответ, а не строгое математическое доказательство. + +!!! quote + + Существует статья, в которой приводится алгоритм со временной сложностью $O(n^3)$ для определения того, можно ли с помощью жадного алгоритма находить оптимальный размен для любой суммы в заданной системе монет. + + Pearson, D. A polynomial-time algorithm for the change-making problem[J]. Operations Research Letters, 2005, 33(3): 231-234. + +## Этапы решения задач жадным алгоритмом + +В общем виде процесс решения жадной задачи можно разбить на три шага. + +1. **Анализ задачи**: разобраться в свойствах задачи, включая определение состояний, целевой функции и ограничений. Этот этап присутствует и в поиске с возвратом, и в динамическом программировании. +2. **Определение жадной стратегии**: определить, какой жадный выбор следует делать на каждом шаге. Эта стратегия должна уменьшать размер задачи на каждом этапе и в итоге привести к решению всей задачи. +3. **Доказательство корректности**: обычно требуется доказать, что задача обладает свойством жадного выбора и оптимальной подструктурой. На этом этапе может понадобиться математическое доказательство, например индукция или доказательство от противного. + +Определение жадной стратегии - это ключевой этап решения, но на практике он часто оказывается непростым по следующим причинам. + +- **Жадные стратегии для разных задач сильно различаются**. Для многих задач стратегия довольно очевидна, и до нее можно дойти за счет общих рассуждений и нескольких проб. Но в более сложных задачах жадная стратегия может быть очень скрытой, и тут уже многое зависит от опыта решения задач и алгоритмической подготовки. +- **Некоторые жадные стратегии выглядят убедительно, но оказываются обманчивыми**. Бывает, что мы с уверенностью придумали жадную стратегию, написали код и отправили его на проверку, а часть тестов не проходит. Причина в том, что спроектированная стратегия лишь «частично верна», и описанная выше задача о размене монет - типичный пример. + +Чтобы гарантировать корректность, нужно дать строгое математическое доказательство жадной стратегии, **обычно с использованием доказательства от противного или математической индукции**. + +Однако и доказательство корректности может оказаться непростой задачей. Если идей нет, мы обычно начинаем отлаживать код на тестовых примерах, постепенно меняя и проверяя жадную стратегию. + +## Типичные задачи для жадного алгоритма + +Жадные алгоритмы часто применяются в задачах оптимизации, которые обладают свойством жадного выбора и оптимальной подструктурой. Ниже приведены некоторые типичные задачи, решаемые жадным подходом. + +- **Задача о размене монет**: при некоторых системах монет жадный алгоритм всегда дает оптимальный ответ. +- **Задача о расписании интервалов**: пусть есть несколько задач, каждая выполняется в некотором временном интервале, и требуется завершить как можно больше задач. Если каждый раз выбирать задачу с самым ранним временем окончания, то жадный алгоритм дает оптимальный ответ. +- **Задача о дробном рюкзаке**: дана группа предметов и грузоподъемность. Требуется выбрать предметы так, чтобы их общий вес не превышал ограничение, а общая ценность была максимальной. Если каждый раз выбирать предмет с наилучшим отношением стоимости к весу, то в некоторых случаях жадный алгоритм дает оптимальный ответ. +- **Задача о покупке и продаже акций**: дана история цен акции. Можно совершать несколько сделок, но если акция уже куплена, то до продажи покупать снова нельзя. Цель - получить максимальную прибыль. +- **Код Хаффмана**: это жадный алгоритм для сжатия данных без потерь. Построив дерево Хаффмана и каждый раз объединяя два узла с наименьшей частотой, мы получаем дерево с минимальной взвешенной длиной пути, то есть минимальной длиной кодирования. +- **Алгоритм Дейкстры**: это жадный алгоритм решения задачи о кратчайших путях от заданной исходной вершины до всех остальных вершин. diff --git a/ru/docs/chapter_greedy/index.md b/ru/docs/chapter_greedy/index.md new file mode 100644 index 000000000..836f1a144 --- /dev/null +++ b/ru/docs/chapter_greedy/index.md @@ -0,0 +1,9 @@ +# Жадность + +![Жадность](../assets/covers/chapter_greedy.jpg) + +!!! abstract + + Подсолнух поворачивается к солнцу, постоянно стремясь к наилучшим условиям для роста. + + Жадная стратегия через цепочку простых выборов постепенно приводит к наилучшему ответу. diff --git a/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_example.png b/ru/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_example.png new file mode 100644 index 0000000000000000000000000000000000000000..13267c97c81e48e6d80d6473ccb6b87485a97df2 GIT binary patch literal 9271 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_hashing/hash_map.assets/hash_table_lookup.png b/ru/docs/chapter_hashing/hash_map.assets/hash_table_lookup.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc697688848a15f38b5173ad4942a29290fb9df GIT binary patch literal 12402 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π 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_hashing/hash_map.md b/ru/docs/chapter_hashing/hash_map.md new file mode 100644 index 000000000..6312742b5 --- /dev/null +++ b/ru/docs/chapter_hashing/hash_map.md @@ -0,0 +1,591 @@ +# Хеш-таблица + +Хеш-таблица (hash table), также называемая таблицей рассеяния, обеспечивает эффективный поиск элементов за счет отображения между ключом `key` и значением `value` . Иначе говоря, если передать в хеш-таблицу ключ `key` , то можно за $O(1)$ времени получить соответствующее значение `value` . + +Как показано на рисунке ниже, пусть есть $n$ студентов, и у каждого из них есть два поля данных: "имя" и "номер студенческого билета". Если мы хотим реализовать запрос вида "ввести номер студенческого билета и вернуть соответствующее имя", то для этого можно использовать показанную ниже хеш-таблицу. + +![Абстрактное представление хеш-таблицы](hash_map.assets/hash_table_lookup.png) + +Помимо хеш-таблицы, функции поиска можно реализовать и через массив, и через связный список. Сравнение их эффективности приведено в таблице ниже. + +- **Добавление элемента**: нужно лишь добавить элемент в конец массива (или списка), что занимает $O(1)$ времени. +- **Поиск элемента**: так как массив (или список) неупорядочен, приходится обходить все элементы, что занимает $O(n)$ времени. +- **Удаление элемента**: сначала нужно найти элемент, затем удалить его из массива (или списка), что занимает $O(n)$ времени. + +

      Таблица   Сравнение эффективности поиска элементов

      + +| | Массив | Связный список | Хеш-таблица | +| -------- | ------ | -------------- | ----------- | +| Поиск элемента | $O(n)$ | $O(n)$ | $O(1)$ | +| Добавление элемента | $O(1)$ | $O(1)$ | $O(1)$ | +| Удаление элемента | $O(n)$ | $O(n)$ | $O(1)$ | + +Нетрудно заметить, что **операции чтения, добавления, удаления и обновления в хеш-таблице имеют временную сложность $O(1)$** , то есть выполняются очень эффективно. + +## Основные операции с хеш-таблицей + +К базовым операциям хеш-таблицы относятся инициализация, поиск, добавление пар ключ-значение и удаление пар ключ-значение. Пример кода приведен ниже: + +=== "Python" + + ```python title="hash_map.py" + # Инициализация хеш-таблицы + hmap: dict = {} + + # Операция добавления + # Добавить пару ключ-значение (key, value) в хеш-таблицу + hmap[12836] = "Сяо Ха" + hmap[15937] = "Сяо Ло" + hmap[16750] = "Сяо Суань" + hmap[13276] = "Сяо Фа" + hmap[10583] = "Сяо Я" + + # Операция поиска + # Передать в хеш-таблицу ключ key и получить значение value + name: str = hmap[15937] + + # Операция удаления + # Удалить пару ключ-значение (key, value) из хеш-таблицы + hmap.pop(10583) + ``` + +=== "C++" + + ```cpp title="hash_map.cpp" + /* Инициализация хеш-таблицы */ + unordered_map map; + + /* Операция добавления */ + // Добавить пару ключ-значение (key, value) в хеш-таблицу + map[12836] = "Сяо Ха"; + map[15937] = "Сяо Ло"; + map[16750] = "Сяо Суань"; + map[13276] = "Сяо Фа"; + map[10583] = "Сяо Я"; + + /* Операция поиска */ + // Передать в хеш-таблицу ключ key и получить значение value + string name = map[15937]; + + /* Операция удаления */ + // Удалить пару ключ-значение (key, value) из хеш-таблицы + map.erase(10583); + ``` + +=== "Java" + + ```java title="hash_map.java" + /* Инициализация хеш-таблицы */ + Map map = new HashMap<>(); + + /* Операция добавления */ + // Добавить пару ключ-значение (key, value) в хеш-таблицу + map.put(12836, "Сяо Ха"); + map.put(15937, "Сяо Ло"); + map.put(16750, "Сяо Суань"); + map.put(13276, "Сяо Фа"); + map.put(10583, "Сяо Я"); + + /* Операция поиска */ + // Передать в хеш-таблицу ключ key и получить значение value + String name = map.get(15937); + + /* Операция удаления */ + // Удалить пару ключ-значение (key, value) из хеш-таблицы + map.remove(10583); + ``` + +=== "C#" + + ```csharp title="hash_map.cs" + /* Инициализация хеш-таблицы */ + Dictionary map = new() { + /* Операция добавления */ + // Добавить пару ключ-значение (key, value) в хеш-таблицу + { 12836, "Сяо Ха" }, + { 15937, "Сяо Ло" }, + { 16750, "Сяо Суань" }, + { 13276, "Сяо Фа" }, + { 10583, "Сяо Я" } + }; + + /* Операция поиска */ + // Передать в хеш-таблицу ключ key и получить значение value + string name = map[15937]; + + /* Операция удаления */ + // Удалить пару ключ-значение (key, value) из хеш-таблицы + map.Remove(10583); + ``` + +=== "Go" + + ```go title="hash_map_test.go" + /* Инициализация хеш-таблицы */ + hmap := make(map[int]string) + + /* Операция добавления */ + // Добавить пару ключ-значение (key, value) в хеш-таблицу + hmap[12836] = "Сяо Ха" + hmap[15937] = "Сяо Ло" + hmap[16750] = "Сяо Суань" + hmap[13276] = "Сяо Фа" + hmap[10583] = "Сяо Я" + + /* Операция поиска */ + // Передать в хеш-таблицу ключ key и получить значение value + name := hmap[15937] + + /* Операция удаления */ + // Удалить пару ключ-значение (key, value) из хеш-таблицы + delete(hmap, 10583) + ``` + +=== "Swift" + + ```swift title="hash_map.swift" + /* Инициализация хеш-таблицы */ + var map: [Int: String] = [:] + + /* Операция добавления */ + // Добавить пару ключ-значение (key, value) в хеш-таблицу + map[12836] = "Сяо Ха" + map[15937] = "Сяо Ло" + map[16750] = "Сяо Суань" + map[13276] = "Сяо Фа" + map[10583] = "Сяо Я" + + /* Операция поиска */ + // Передать в хеш-таблицу ключ key и получить значение value + let name = map[15937]! + + /* Операция удаления */ + // Удалить пару ключ-значение (key, value) из хеш-таблицы + map.removeValue(forKey: 10583) + ``` + +=== "JS" + + ```javascript title="hash_map.js" + /* Инициализация хеш-таблицы */ + const map = new Map(); + /* Операция добавления */ + // Добавить пару ключ-значение (key, value) в хеш-таблицу + map.set(12836, 'Сяо Ха'); + map.set(15937, 'Сяо Ло'); + map.set(16750, 'Сяо Суань'); + map.set(13276, 'Сяо Фа'); + map.set(10583, 'Сяо Я'); + + /* Операция поиска */ + // Передать в хеш-таблицу ключ key и получить значение value + let name = map.get(15937); + + /* Операция удаления */ + // Удалить пару ключ-значение (key, value) из хеш-таблицы + map.delete(10583); + ``` + +=== "TS" + + ```typescript title="hash_map.ts" + /* Инициализация хеш-таблицы */ + const map = new Map(); + /* Операция добавления */ + // Добавить пару ключ-значение (key, value) в хеш-таблицу + map.set(12836, 'Сяо Ха'); + map.set(15937, 'Сяо Ло'); + map.set(16750, 'Сяо Суань'); + map.set(13276, 'Сяо Фа'); + map.set(10583, 'Сяо Я'); + console.info('\nПосле добавления хеш-таблица имеет вид\nKey -> Value'); + console.info(map); + + /* Операция поиска */ + // Передать в хеш-таблицу ключ key и получить значение value + let name = map.get(15937); + console.info('\nПо номеру 15937 найдено имя ' + name); + + /* Операция удаления */ + // Удалить пару ключ-значение (key, value) из хеш-таблицы + map.delete(10583); + console.info('\nПосле удаления 10583 хеш-таблица имеет вид\nKey -> Value'); + console.info(map); + ``` + +=== "Dart" + + ```dart title="hash_map.dart" + /* Инициализация хеш-таблицы */ + Map map = {}; + + /* Операция добавления */ + // Добавить пару ключ-значение (key, value) в хеш-таблицу + map[12836] = "Сяо Ха"; + map[15937] = "Сяо Ло"; + map[16750] = "Сяо Суань"; + map[13276] = "Сяо Фа"; + map[10583] = "Сяо Я"; + + /* Операция поиска */ + // Передать в хеш-таблицу ключ key и получить значение value + String name = map[15937]; + + /* Операция удаления */ + // Удалить пару ключ-значение (key, value) из хеш-таблицы + map.remove(10583); + ``` + +=== "Rust" + + ```rust title="hash_map.rs" + use std::collections::HashMap; + + /* Инициализация хеш-таблицы */ + let mut map: HashMap = HashMap::new(); + + /* Операция добавления */ + // Добавить пару ключ-значение (key, value) в хеш-таблицу + map.insert(12836, "Сяо Ха".to_string()); + map.insert(15937, "Сяо Ло".to_string()); + map.insert(16750, "Сяо Суань".to_string()); + map.insert(13279, "Сяо Фа".to_string()); + map.insert(10583, "Сяо Я".to_string()); + + /* Операция поиска */ + // Передать в хеш-таблицу ключ key и получить значение value + let _name: Option<&String> = map.get(&15937); + + /* Операция удаления */ + // Удалить пару ключ-значение (key, value) из хеш-таблицы + let _removed_value: Option = map.remove(&10583); + ``` + +=== "C" + + ```c title="hash_map.c" + // В C нет встроенной хеш-таблицы + ``` + +=== "Kotlin" + + ```kotlin title="hash_map.kt" + /* Инициализация хеш-таблицы */ + val map = HashMap() + + /* Операция добавления */ + // Добавить пару ключ-значение (key, value) в хеш-таблицу + map[12836] = "Сяо Ха" + map[15937] = "Сяо Ло" + map[16750] = "Сяо Суань" + map[13276] = "Сяо Фа" + map[10583] = "Сяо Я" + + /* Операция поиска */ + // Передать в хеш-таблицу ключ key и получить значение value + val name = map[15937] + + /* Операция удаления */ + // Удалить пару ключ-значение (key, value) из хеш-таблицы + map.remove(10583) + ``` + +=== "Ruby" + + ```ruby title="hash_map.rb" + # Инициализация хеш-таблицы + hmap = {} + + # Операция добавления + # Добавить пару ключ-значение (key, value) в хеш-таблицу + hmap[12836] = "Сяо Ха" + hmap[15937] = "Сяо Ло" + hmap[16750] = "Сяо Суань" + hmap[13276] = "Сяо Фа" + hmap[10583] = "Сяо Я" + + # Операция поиска + # Передать в хеш-таблицу ключ key и получить значение value + name = hmap[15937] + + # Операция удаления + # Удалить пару ключ-значение (key, value) из хеш-таблицы + hmap.delete(10583) + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%0A%20%20%20%20hmap%20%3D%20%7B%7D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%0A%20%20%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%20%D0%BF%D0%B0%D1%80%D1%83%20%D0%BA%D0%BB%D1%8E%D1%87-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%28key%2C%20value%29%0A%20%20%20%20hmap%5B12836%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A5%D0%B0%22%0A%20%20%20%20hmap%5B15937%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%9B%D0%BE%22%0A%20%20%20%20hmap%5B16750%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A1%D1%83%D0%B0%D0%BD%D1%8C%22%0A%20%20%20%20hmap%5B13276%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A4%D0%B0%22%0A%20%20%20%20hmap%5B10583%5D%20%3D%20%22%D0%A3%D1%82%D0%B5%D0%BD%D0%BE%D0%BA%22%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%82%D1%8C%20%D0%BA%D0%BB%D1%8E%D1%87%20key%20%D0%B2%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%20%D0%B8%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20value%0A%20%20%20%20name%20%3D%20hmap%5B15937%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%0A%20%20%20%20%23%20%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D0%B8%D0%B7%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%20%D0%BF%D0%B0%D1%80%D1%83%20%D0%BA%D0%BB%D1%8E%D1%87-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%28key%2C%20value%29%0A%20%20%20%20hmap.pop%2810583%29&cumulative=false&curInstr=2&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +У хеш-таблицы есть три распространенных способа обхода: обход пар ключ-значение, обход ключей и обход значений. Примеры кода приведены ниже: + +=== "Python" + + ```python title="hash_map.py" + # Обход хеш-таблицы + # Обход пар ключ-значение key->value + for key, value in hmap.items(): + print(key, "->", value) + # Обход только ключей key + for key in hmap.keys(): + print(key) + # Обход только значений value + for value in hmap.values(): + print(value) + ``` + +=== "C++" + + ```cpp title="hash_map.cpp" + /* Обход хеш-таблицы */ + // Обход пар ключ-значение key->value + for (auto kv: map) { + cout << kv.first << " -> " << kv.second << endl; + } + // Обход key->value с помощью итератора + for (auto iter = map.begin(); iter != map.end(); iter++) { + cout << iter->first << "->" << iter->second << endl; + } + ``` + +=== "Java" + + ```java title="hash_map.java" + /* Обход хеш-таблицы */ + // Обход пар ключ-значение key->value + for (Map.Entry kv: map.entrySet()) { + System.out.println(kv.getKey() + " -> " + kv.getValue()); + } + // Обход только ключей key + for (int key: map.keySet()) { + System.out.println(key); + } + // Обход только значений value + for (String val: map.values()) { + System.out.println(val); + } + ``` + +=== "C#" + + ```csharp title="hash_map.cs" + /* Обход хеш-таблицы */ + // Обход пар ключ-значение Key->Value + foreach (var kv in map) { + Console.WriteLine(kv.Key + " -> " + kv.Value); + } + // Обход только ключей key + foreach (int key in map.Keys) { + Console.WriteLine(key); + } + // Обход только значений value + foreach (string val in map.Values) { + Console.WriteLine(val); + } + ``` + +=== "Go" + + ```go title="hash_map_test.go" + /* Обход хеш-таблицы */ + // Обход пар ключ-значение key->value + for key, value := range hmap { + fmt.Println(key, "->", value) + } + // Обход только ключей key + for key := range hmap { + fmt.Println(key) + } + // Обход только значений value + for _, value := range hmap { + fmt.Println(value) + } + ``` + +=== "Swift" + + ```swift title="hash_map.swift" + /* Обход хеш-таблицы */ + // Обход пар ключ-значение Key->Value + for (key, value) in map { + print("\(key) -> \(value)") + } + // Обход только ключей Key + for key in map.keys { + print(key) + } + // Обход только значений Value + for value in map.values { + print(value) + } + ``` + +=== "JS" + + ```javascript title="hash_map.js" + /* Обход хеш-таблицы */ + console.info('\nОбход пар ключ-значение Key->Value'); + for (const [k, v] of map.entries()) { + console.info(k + ' -> ' + v); + } + console.info('\nОбход только ключей Key'); + for (const k of map.keys()) { + console.info(k); + } + console.info('\nОбход только значений Value'); + for (const v of map.values()) { + console.info(v); + } + ``` + +=== "TS" + + ```typescript title="hash_map.ts" + /* Обход хеш-таблицы */ + console.info('\nОбход пар ключ-значение Key->Value'); + for (const [k, v] of map.entries()) { + console.info(k + ' -> ' + v); + } + console.info('\nОбход только ключей Key'); + for (const k of map.keys()) { + console.info(k); + } + console.info('\nОбход только значений Value'); + for (const v of map.values()) { + console.info(v); + } + ``` + +=== "Dart" + + ```dart title="hash_map.dart" + /* Обход хеш-таблицы */ + // Обход пар ключ-значение Key->Value + map.forEach((key, value) { + print('$key -> $value'); + }); + + // Обход только ключей Key + map.keys.forEach((key) { + print(key); + }); + + // Обход только значений Value + map.values.forEach((value) { + print(value); + }); + ``` + +=== "Rust" + + ```rust title="hash_map.rs" + /* Обход хеш-таблицы */ + // Обход пар ключ-значение Key->Value + for (key, value) in &map { + println!("{key} -> {value}"); + } + + // Обход только ключей Key + for key in map.keys() { + println!("{key}"); + } + + // Обход только значений Value + for value in map.values() { + println!("{value}"); + } + ``` + +=== "C" + + ```c title="hash_map.c" + // В C нет встроенной хеш-таблицы + ``` + +=== "Kotlin" + + ```kotlin title="hash_map.kt" + /* Обход хеш-таблицы */ + // Обход пар ключ-значение key->value + for ((key, value) in map) { + println("$key -> $value") + } + // Обход только ключей key + for (key in map.keys) { + println(key) + } + // Обход только значений value + for (_val in map.values) { + println(_val) + } + ``` + +=== "Ruby" + + ```ruby title="hash_map.rb" + # Обход хеш-таблицы + # Обход пар ключ-значение key->value + hmap.entries.each { |key, value| puts "#{key} -> #{value}" } + + # Обход только ключей key + hmap.keys.each { |key| puts key } + + # Обход только значений value + hmap.values.each { |val| puts val } + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%0A%20%20%20%20hmap%20%3D%20%7B%7D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%0A%20%20%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%20%D0%BF%D0%B0%D1%80%D1%83%20%D0%BA%D0%BB%D1%8E%D1%87-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%28key%2C%20value%29%0A%20%20%20%20hmap%5B12836%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A5%D0%B0%22%0A%20%20%20%20hmap%5B15937%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%9B%D0%BE%22%0A%20%20%20%20hmap%5B16750%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A1%D1%83%D0%B0%D0%BD%D1%8C%22%0A%20%20%20%20hmap%5B13276%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A4%D0%B0%22%0A%20%20%20%20hmap%5B10583%5D%20%3D%20%22%D0%A3%D1%82%D0%B5%D0%BD%D0%BE%D0%BA%22%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%0A%20%20%20%20%23%20%D0%9E%D0%B1%D0%BE%D0%B9%D1%82%D0%B8%D0%BF%D0%B0%D1%80%D0%B0%20%D0%BA%D0%BB%D1%8E%D1%87-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20key-%3Evalue%0A%20%20%20%20for%20key%2C%20value%20in%20hmap.items%28%29%3A%0A%20%20%20%20%20%20%20%20print%28key%2C%20%22-%3E%22%2C%20value%29%0A%20%20%20%20%23%20%D0%BE%D1%82%D0%B4%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%9E%D0%B1%D0%BE%D0%B9%D1%82%D0%B8%D0%BA%D0%BB%D1%8E%D1%87%20key%0A%20%20%20%20for%20key%20in%20hmap.keys%28%29%3A%0A%20%20%20%20%20%20%20%20print%28key%29%0A%20%20%20%20%23%20%D0%BE%D1%82%D0%B4%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%9E%D0%B1%D0%BE%D0%B9%D1%82%D0%B8%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20value%0A%20%20%20%20for%20value%20in%20hmap.values%28%29%3A%0A%20%20%20%20%20%20%20%20print%28value%29&cumulative=false&curInstr=8&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +## Простая реализация хеш-таблицы + +Сначала рассмотрим самый простой случай: **реализуем хеш-таблицу только с помощью одного массива**. В хеш-таблице каждую пустую ячейку массива мы называем бакетом (bucket), и каждый бакет может хранить одну пару ключ-значение. Следовательно, операция поиска сводится к тому, чтобы найти бакет, соответствующий `key` , и получить из него `value` . + +Но как определить бакет, соответствующий заданному `key` ? Это делается с помощью хеш-функции (hash function). Назначение хеш-функции - отображать большое входное пространство в меньшее выходное пространство. В хеш-таблице входным пространством являются все `key` , а выходным - все бакеты (индексы массива). Иначе говоря, передав `key` на вход, **мы можем через хеш-функцию получить позицию хранения соответствующей пары ключ-значение в массиве**. + +Процесс вычисления хеш-функции для одного `key` включает два шага. + +1. Сначала с помощью некоторого хеш-алгоритма `hash()` вычисляется хеш-значение. +2. Затем хеш-значение берется по модулю числа бакетов (длины массива) `capacity` , чтобы получить бакет (индекс массива) `index` , соответствующий этому `key` . + +```shell +index = hash(key) % capacity +``` + +После этого можно использовать `index` для доступа к соответствующему бакету в хеш-таблице и получения `value` . + +Пусть длина массива `capacity = 100` , а хеш-алгоритм `hash(key) = key` . Тогда легко получить хеш-функцию `key % 100` . На рисунке ниже на примере `key` "номер студенческого билета" и `value` "имя" показан принцип работы хеш-функции. + +![Принцип работы хеш-функции](hash_map.assets/hash_function.png) + +Ниже приведен код простой реализации хеш-таблицы. В нем мы инкапсулируем `key` и `value` в класс `Pair` , чтобы представить пару ключ-значение. + +```src +[file]{array_hash_map}-[class]{array_hash_map}-[func]{} +``` + +## Хеш-коллизии и расширение + +По сути, хеш-функция отображает входное пространство, состоящее из всех `key` , в выходное пространство, состоящее из всех индексов массива, а входное пространство обычно значительно больше выходного. Поэтому **теоретически неизбежно существование ситуации "несколько входов соответствуют одному выходу"**. + +Для хеш-функции из приведенного выше примера, если последние две цифры `key` совпадают, то совпадает и результат хеш-функции. Например, если искать студентов с номерами 12836 и 20336, то получим: + +```shell +12836 % 100 = 36 +20336 % 100 = 36 +``` + +Как показано на рисунке ниже, два номера указывают на одно и то же имя, что, очевидно, неверно. Такую ситуацию, когда нескольким входам соответствует один и тот же выход, называют хеш-коллизией (hash collision). + +![Пример хеш-коллизии](hash_map.assets/hash_collision.png) + +Легко понять, что чем больше емкость хеш-таблицы $n$ , тем ниже вероятность того, что несколько `key` попадут в один и тот же бакет, а значит, тем меньше коллизий. Поэтому **мы можем уменьшать число хеш-коллизий путем расширения хеш-таблицы**. + +Как показано на рисунке ниже, до расширения пары ключ-значение `(136, A)` и `(236, D)` конфликтовали, а после расширения коллизия исчезла. + +![Расширение хеш-таблицы](hash_map.assets/hash_table_reshash.png) + +Подобно расширению массива, расширение хеш-таблицы требует перенести все пары ключ-значение из старой таблицы в новую, а это очень затратно по времени; кроме того, поскольку емкость хеш-таблицы `capacity` изменилась, нам приходится с помощью хеш-функции заново вычислять позиции хранения всех пар ключ-значение, что дополнительно увеличивает вычислительные расходы процесса расширения. Поэтому языки программирования обычно заранее резервируют достаточно большую емкость хеш-таблицы, чтобы избежать частых расширений. + +Коэффициент загрузки (load factor) - важное понятие хеш-таблицы. Он определяется как отношение числа элементов в хеш-таблице к числу бакетов и используется для оценки степени серьезности хеш-коллизий, **а также часто служит условием срабатывания расширения хеш-таблицы**. Например, в Java, когда коэффициент загрузки превышает $0.75$ , система расширяет хеш-таблицу до $2$ раз от исходной емкости. diff --git a/ru/docs/chapter_hashing/index.md b/ru/docs/chapter_hashing/index.md new file mode 100644 index 000000000..20a8ad0ac --- /dev/null +++ b/ru/docs/chapter_hashing/index.md @@ -0,0 +1,9 @@ +# Хеш-таблицы + +![Хеш-таблицы](../assets/covers/chapter_hashing.jpg) + +!!! abstract + + В мире компьютеров хеш-таблица похожа на сообразительного библиотекаря. + + Он умеет вычислять шифр хранения и потому быстро находит нужную книгу. diff --git a/ru/docs/chapter_hashing/summary.md b/ru/docs/chapter_hashing/summary.md new file mode 100644 index 000000000..edf1905a5 --- /dev/null +++ b/ru/docs/chapter_hashing/summary.md @@ -0,0 +1,51 @@ +# Краткие итоги + +### Основные моменты + +- Передав `key` , мы можем получить `value` из хеш-таблицы за $O(1)$ времени, поэтому она очень эффективна. +- К типичным операциям хеш-таблицы относятся поиск, добавление пары ключ-значение, удаление пары ключ-значение и обход хеш-таблицы. +- Хеш-функция отображает `key` в индекс массива, после чего можно обратиться к соответствующему бакету и получить `value` . +- Два разных `key` после хеш-функции могут дать один и тот же индекс массива, что приводит к ошибочному результату поиска; это явление называется хеш-коллизией. +- Чем больше емкость хеш-таблицы, тем ниже вероятность хеш-коллизий. Поэтому хеш-коллизии можно смягчать путем расширения хеш-таблицы. Как и у массива, операция расширения у хеш-таблицы очень затратна. +- Коэффициент загрузки определяется как отношение числа элементов в хеш-таблице к числу бакетов, отражает степень серьезности хеш-коллизий и часто используется как условие запуска расширения хеш-таблицы. +- Метод цепочек превращает одиночный элемент в связный список и хранит все конфликтующие элементы в одном списке. Однако слишком длинный список снижает эффективность поиска, поэтому его можно дополнительно преобразовать в красно-черное дерево. +- Открытая адресация обрабатывает хеш-коллизии за счет многократного пробирования. Линейное пробирование использует фиксированный шаг, его недостатки - невозможность прямого удаления элементов и склонность к кластеризации. Повторное хеширование использует несколько хеш-функций и по сравнению с линейным пробированием меньше подвержено кластеризации, но требует больше вычислений. +- Разные языки программирования выбирают разные стратегии реализации хеш-таблиц. Например, `HashMap` в Java использует метод цепочек, а `Dict` в Python - открытую адресацию. +- Для хеш-таблицы желательно, чтобы хеш-алгоритм был детерминированным, быстрым и обеспечивал равномерное распределение. В криптографии от него дополнительно требуют устойчивости к коллизиям и эффекта лавины. +- В качестве модуля хеш-алгоритмы обычно используют большое простое число, чтобы максимально обеспечить равномерность распределения хеш-значений и снизить число хеш-коллизий. +- К распространенным хеш-алгоритмам относятся MD5, SHA-1, SHA-2 и SHA-3. MD5 часто применяли для проверки целостности файлов, а SHA-2 широко используется в протоколах и приложениях, связанных с безопасностью. +- Языки программирования обычно предоставляют для типов данных встроенные хеш-алгоритмы, чтобы вычислять индексы бакетов в хеш-таблице. Как правило, хешируемыми могут быть только неизменяемые объекты. + +### Q & A + +**Q**: В каких случаях временная сложность хеш-таблицы становится $O(n)$ ? + +Когда хеш-коллизии становятся достаточно серьезными, временная сложность хеш-таблицы деградирует до $O(n)$ . Если хеш-функция спроектирована хорошо, емкость выбрана разумно, а конфликты распределены достаточно равномерно, то временная сложность обычно считается $O(1)$ . При использовании встроенной хеш-таблицы языка программирования мы, как правило, и принимаем ее за $O(1)$ . + +**Q**: Почему бы не использовать хеш-функцию $f(x) = x$ ? Тогда ведь коллизий не будет. + +При хеш-функции $f(x) = x$ каждому элементу соответствует уникальный индекс бакета, и такая структура становится эквивалентна массиву. Однако входное пространство обычно намного больше выходного пространства (длины массива), поэтому последним шагом хеш-функции обычно выступает взятие по модулю длины массива. Иначе говоря, цель хеш-таблицы состоит в том, чтобы отобразить большее пространство состояний в меньшее пространство и при этом обеспечить $O(1)$ поиска. + +**Q**: В основе хеш-таблицы лежат массив, связный список и двоичное дерево. Почему же она может быть быстрее них? + +Во-первых, у хеш-таблицы повышается временная эффективность, но снижается пространственная эффективность. Значительная часть ее памяти остается неиспользованной. + +Во-вторых, она быстрее только в определенных сценариях. Если одну и ту же задачу можно реализовать на массиве или связном списке с той же асимптотикой, то часто такая реализация окажется быстрее, чем хеш-таблица. Причина в том, что вычисление хеш-функции само по себе стоит времени, то есть константа в сложности получается выше. + +Наконец, временная сложность хеш-таблицы тоже может деградировать. Например, при методе цепочек мы все равно выполняем поиск в связном списке или красно-черном дереве, поэтому риск деградации до $O(n)$ сохраняется. + +**Q**: Есть ли у повторного хеширования недостаток "нельзя напрямую удалять элементы"? Можно ли повторно использовать место, помеченное как удаленное? + +Повторное хеширование - это разновидность открытой адресации, а у всех методов открытой адресации есть недостаток: элементы нельзя удалять напрямую, поэтому приходится использовать метку удаления. Пространство, помеченное как удаленное, можно использовать повторно. Когда новый элемент вставляется в хеш-таблицу и в процессе пробирования попадает на такую отмеченную позицию, эта позиция может быть занята новым элементом. Такой подход сохраняет последовательность пробирования и одновременно поддерживает приемлемую эффективность использования памяти. + +**Q**: Почему при линейном пробировании во время поиска элемента вообще возникает хеш-коллизия? + +Во время поиска мы через хеш-функцию находим соответствующий бакет и соответствующую пару ключ-значение, но видим, что `key` не совпадает, а это и означает наличие хеш-коллизии. Поэтому метод линейного пробирования в соответствии с заранее заданным шагом последовательно движется дальше, пока не найдет правильную пару ключ-значение или не убедится, что поиск завершился неудачей. + +**Q**: Почему расширение хеш-таблицы помогает смягчать хеш-коллизии? + +Последний шаг хеш-функции обычно состоит во взятии по модулю длины массива $n$ , чтобы результат попадал в диапазон индексов массива; после расширения длина массива $n$ меняется, а значит, может измениться и индекс, соответствующий данному `key` . Несколько `key` , которые раньше попадали в один бакет, после расширения могут распределиться по нескольким бакетам, и тем самым хеш-коллизии будут ослаблены. + +**Q**: Если нам нужен быстрый доступ, почему бы просто не использовать массив? + +Когда `key` данных - это непрерывные целые числа из маленького диапазона, действительно можно напрямую использовать массив: это просто и эффективно. Но если `key` имеют другой тип данных (например, строки), тогда нужен хеш-алгоритм, который отобразит `key` в индекс массива, а хранение элементов будет выполняться через массив бакетов. Такая структура и называется хеш-таблицей. diff --git a/ru/docs/chapter_heap/build_heap.assets/heapify_operations_count.png b/ru/docs/chapter_heap/build_heap.assets/heapify_operations_count.png new file mode 100644 index 0000000000000000000000000000000000000000..5014f4b2656ad4d007eab3d61c7667f62bb6c799 GIT binary patch literal 15303 zcmbWebx>Tvw=Oy}3^2I6OMu|Pf-?}@g9ic(5+JxGI1KI{+?^1D69_s4f&_xQPH=Y* z^2qPJd)~eO+^X|-)l~0Zd)fDO*XrK8dLlK|6>u;qF#!Moj*_CR765?ybPE~&KkKh!`)~Rvy9(u#Zo1)8XH*5R&vq5CO@bZxY^X1TDhS-I#>tXy! zHswEf|GzH;`o@Gt%h5#Rt-l;!BL`iT|Kn)z$^$pz86}frr#<=E-MeZlvy#6LOx{!V zCC5VE$wh8-g_}U!haejgeTNvf(c%{~8#7~|($9-q{k@yD)8cSA!)qFShf47Jmv(`4 zxJf6RmW$f%ckLEBRyqT_pz~C(GD4Zx1}tC{AE%3u5Tv64PION~SI&Vn7&~7Xb_ISNnY!h2m=^958W$-yB6QcUiHko< z7P-QHoceuzHNx{-P|ta+R~1p$%i#aY&G+Pj(0aq;6{;m^OrKwXZ4{ixQtnOkYu-w@ zVSU5t!sPOF=1o}+i~e6f{~I-VnvHVd-_nQ|#Jt7qeGDB945kZoi-T&fr78Q`IJNV6 z&KQy3>EL14 zyROhbTZAfuv)4jz3GWk2>mcM>VseXMeP&ObIdpfyXt)X^5;e8*HfXpG-lZnWVNI;X zR4kQt!6Q9_=Z82UIu_!pLGutno@fN_hOtZj-C%hoSy;bFtao&_Tl1sioo6&F!Etts zMi}wv)M6xDEw8`WMzW8AN6t;EJbfww^qeM#4ooct++%QS-_{Ai^D>Tk4e-KZN`wxWiXjG4}wgT6TBg@_tLF-c3iaRd(yPKOSQ!xq73 z<$o?l1;2;=!FOPrWz8x=yf#?9Px8 z>9urjuK2{+7o9PmE*G%sVC?2f%;Mvh1~E{}S#ngD=W6Rw?xLH@@@*uG)S2nGDnPHQV@&mEYDBFyk@ZJ7bU+O-mXi%AOTz9bGPnQ`#N{$FJT zA;$mOh{k5y*r?YURT6L`yBdmel7I(NAz4FV%8OQQzr}6 z5oOXNE=gX|0P+xr7U`6VV#$i;^;awPaBlQO{RF2xO0T==3d$FBhAu_ zK{cp2PW|kxIdQo#*FRs zv@ME2*TX4+(G`jFl=x>nM%Yvc$pB9`4YkNq>|HFL6N@_J%OlY% zz~vnH56SLzg{oa|diMRt4Z_aO#-f%*L;pJM#~Bq|ujOB^$QkYoqsB->CS#u#*Js_R z?S@N}++K|rDeoSu#p=+Vj2nKo+}v)MdhX4utX1y|w8{OYzdlbAt4!V0^V(R6MFCHi z?aD-fV_fkiHcg!t*_wZCe0=L&Y?G@Ae(Q=?q*(%$=5rz-{~+$5n*$%Jxal>-c^TcN zV?UQP&`^0l-Sq6CFV_CospzuaNbUEJ>|A2T-)vo`P5y+IR#psF!=p(y%0D;;-PDvo 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

      y*10Wcm7zbglwcLxoa9C)g7pg>R7E$J(uyf8 zzg)8JZgP{P&OCIQwUPH2Gb$W5Cu+75B^kk-h9~;WSW)2U-sRNvD9q;TLyC>|8$a<4 z1&(rDNYX=Pi@RMUSi^6(!nRW12Je&1xis^9TlW3--?L2xyy!ReObje(rjpGb-gXxw z^uKm3=IWWOz|y*Yl_nPcih7uSv6^{wS_?EE03T#tp3*0w9tS+&WZ*xtn-5e)RXatj zX!!s2ywK>P64T{qc$C9`o5Gu2((Ou!k&E{J;;ZaaI7>|+UA&u%79vTa*{ja)w)fop z{1-ZJzSQu75x5KUAOLuv!6WQu#*{G{FCKx-j*Kzk#1Gm4S6&DI;}CPpAi-I2(VMs9vw$L*<;qxrwD+6b)c0Zma@k zH@$4n$3<2?qHd^gU~kHZW$?y`M_2;y9`^VD&e3%)O5m9>__`Qq&suGiL?@8+(nz6@VyMqFFJ z04@@*Q0{?%**XZWM}_r0_!^*thq>-5v-3fR_-t}EIJI5~Xo;7;D~i0H*~(L7$*Mgt zSMMsl?xlx=j|)NGJY(%zJ(+$6lW)p;0Mi^7{XwGei*Gc!JYQiWs4p`{BgG?%Nox4; zkO8^my{`#?izeavz+oO)o=%;mP62N-@?4&&y#pqU%eUJsM52l4iPEUq;zU}qSP!a; z0q5IeE#R6jCYkg57l%)}&VY2sPru>5?@=wd-IFoK&=aljJjeW!YrJMZ<{moi2%lp8tIiv|7&-h;H<_KI%=wSM7xD~`&lNtT z&0vvLr;gz<5=lDuYs>c`y?;h=8-)Mb)z0#`iBd0TA52!T3CE&RE+DeNKTZ}6ofO)2 z0dEj==aRj7#hU)>be%vb3F3kVEO7v7KfbN0lk}?4Adn*4rwyB)6}(=scrTno^?1Y9f-fy%sXS}9trj1;DJvfi4N7+p4H|`m;iulbSLh*HBVEy7Iz0p4 ze$8)vRq?s`RRzs$9_$3IrF0edv!t|7xXuB6J}2o>e50q?w zI9z}FJpai9zly59F>!Fxc@?vCLkVVF`)w-p3WFjH^Hn47Nc>m)7RdsqpS0jlvmtw% z?hf*SN1uv`*e6)T_P<9praaoPP@}bJkDr^nT9BXXDNnrQus?5*2@uJ@m4?2LS@AtM z=4yH||572UB$~eAt3?@q9c582Ux56(yF>de87WQP5?;}dL7~5lsst&~F!U@Q-)e61 z{GiY80UPG{_3aN3@~N`)&yVj=SUFjKu6FFdn=Ba>bN?!D610E#H;#eG@qn2M{7L@y z3ag`;R2XyCh~(J6E9Fv-NJA9DRtr(jOiq5w%St0;`JN*gcVSRln7RqMM*MVI{C{%6 z&94u-lRy2KmO9+xvOH#Ml)24 z)a88_XGiw!rAl4G_kkj)ZkQcyWk|Ip0b5iHjh7rdPqq2fK zHDMzm$4Pg0R@~tHa75|8Kg?({K?up@@&roz&f5R^ zvZY}@{Wm8FL+&*@a%TpNAGMlkbN_ZR322`^RhD=AQy1jvb)(X?aul6vL5)EHjg+{j z2DY{BH)1}7l{NM09wUVR7WnBcwER8a;eL8x@5dg6n}4m0roJDC$6!5D)qjuV03V;8 zLL;(J0|qtLf$LEl)-93*3FNb_k={l=kf-~E zaP?EA9@mx!H1*h_k>D$1A;TxI#&i%QTfYuXV&c<*i!HY@^YQTNHa}6xYfT^qObOV= zQdR#^(*&zy%zVC}4PZjB!gru)0*E(cRTcY0irDITIVAdt3?a7qXQ|cWi2qDe9ne>; zK(eZ9Mf(dI>0m`WjN+Lr^1t!-Ke~lam73G=VrZHJM(kOD5c<2$_PrYis_#EgbQyKo z1Ee*6)N>N);mMIVNUsLxkLnb>#qQ=JmBYd})H7k0zz?ECcf<>;Q;S->rNfV^0K4La zwajuQ4Hg2ux4(wdo^_tLQ#^dysLWAZ?Dftwd%x*&&F0qOd(=)bZw4~)v6j`ZyTRMAO?Vxo58gmg3QLHzDaeWJBeGUvjV5 z4UgsP0uEU?&b)?(33yN9XVH04#^wzl4(4hq12#lxPzOl@I@Lswcr(m6*$zxV4L&e+ zX|QXPWSP4S1if7!I2bE(@ynB>+u=hmH8ACd4>SF`FMw$D8vOzLog1p}^;TF)8R0#$ z6#wPN2)LbAI5~OKZOwOLkQK>T01xnwDyJ6oT}KQEQ_9awAG>K>>POx2jYGkkDeA4Y zpT?H=q69S&f0|Sx)3POs!b^9KMMBrnqw<%2KPPl>Rm~Ydc?Us%_EAa;QS7Apt{c&B zAcz}0`X!&yv`C@h8{WLCTjl=bKg#wu5u43dQu@BKDohYNcvt zY649YCbLW)9M<9=HWnmY08?}MJsTAz z(5P&^Q6E_0^oWHtcgkTJ1oAV}Z=CYwNf9t*59>*=AajYcc@jTPsS+?A)Qe)SMiN)) z&{6rNWH#3Hbgf0f#{`Kdc+rc8`vo2rWjo}-s?=jI+oe;uU&{iQaaF8EX&bLzfk-Lc z1nuiTgjW9q-xW31ro#=tKh&B=5B`WXGLIddXF(MR`=Ay@s-<9?Lfrd10j{%D@honq zQdA$cC@1~dT*{6`uso@49VV?jIHrn#gPx+;ZH<@^HHIdZ@|S6f7MSKz^P)%KHFPSD z*x8@P3IlvMv0%h=`V7`3`i2#xKd+j+p z`M{M|mB?IsmfcUOv85zT#X)*L^hsUZW>bxn0S3C3I&y<-l&J5MT#{z5amz=x;I?$7 zHEihn3L-EiuA2+rH{JbfE?KMI4W!NMq1#T0gi?cU7Kqy`cTt?_2>6G_NH_tvF{(Du z$h{u3S!3z|1ky_Jreyw6a{H;MAo*SdWc3AESP>LEBU?Sz24d0WHPJ7VSztJsglRm7 zEpor2x4Ycn=@yqhb+}{hyJAZ*Ef7+_+ke7o(GS3S}sjUQkU4gX#Rk zzSB}#o+<_xx8vnt6j#8e`s7hND4?oP@j%<9W6E04u4dN97mhOlQnHlqh@HWmw@l+Ka+0k<2kS*6K*Bh)co{x8~Rk}O#1U1x-MdPkK5>v7ZBwXc# zIru3JffT0Von3o4SSxI2(H@g$>P{3z9fi=%YWK>F@U1D(A@pU*qwr~ z;X2d7Hrpx7QZe|sAJyo z9YPvWb4p2Xb0}uZjGh@;`BV71+~CRbyFvp#Pzus!=G^%w{9@7AEQ74IY=;el`eD4} z*l59B|J_t^t&)sl+z$uc>P8W>NaP(6ScHydnswJ37t9SW{;6GB_vtZUP=3+XTOQgg z4wQ3=KO$hlLv4$IyDz5K;PRy=oirwYDlcTZ10A<#`Ysx8zbt?X16e-e?SN=z)FwKRYBM~S zipcpF*zzqw?iJREbVClWe`*B$(#b~&av1?{H_@04R|dXVbBloQcDhnrt3rFji4wr0 zwF^SZ`FCRTTEGK$lKq=Z?5;31%VZIx8C>B7cw%LnwjRVMNo|2{;k>Xnt45Wv;a5cL zJjznhXw1CCL`|sIbV=}4tttLzpc`8hE-AyjAN8jAt_}G>20R82DmP6ZT-v0-$)rvI z6#R85VEEz0-n6M3H7zjK0vo$C9lIrrk`S_n@P`ia8d?v5Eq&K3R2LzICJA+Db!6mK z*gb)wnYO&-UQoAEGfgYr4m|2vAr9I#pO{JQ4)p(H5$PqNqf|jadPkHhy%R)wm)?VP zL3(eQ;Qu$XX1>gtFZ0%7y}WzQ-DjVD&b@ggZ{@xA6BQCd20{P;NYqr7o&o?4_9b`- zAA&ud=J1E3uC>dbdz+ONtN?`;tEoC@EP&#$mgyv>&J6Z}s>zT7 z4hZ^O(nm;pTzFH@$8m2^AOIDYfzI#j{Dm|cL8lnO5JN&#iizi@-z_r-?n%hnh*vzG`;GKl4S-iQa+<-@LI`=pm^SZzddPyTqCiLO>Zdczv9Ql`%-;$HJrH9Yb6l>$LTwA>+mdwR&v&|o#|%*kzXiGC#aC8CTaFe8 zO31?Vm?72K-Bm>eZa;ob;TN@dkv7DPsjQw8Pd>UNQQ#MU?VfITO{6P2zS&|O<2Tr-Rvl6;vfdqkJ~Z&5h?x%VyokG!X?X?^9o&fdBNJ21C%Z?H5IcCyexuT|PVEsn4?75tfmL>Mwbs8=gtBC~&A9*rF-SDM! z#DD}uv!bHdeJjU*g~!h;F8wPEPVaXok`N1Sa$;-vOalkpvLzwGJwr!wnf+U@Q0T_M zc$sg4_zaqD=x$Cz6?F6cFlvxQDzTbi5DTC2 zy(<_`D+1RqbJAedqk_*q0yo{R`yMHljaKEB4EN1>WUwNhs6`2@z=?(WE9L4Nq`wIj zduOfpsu;jN(YpNKy|6=(Z9Vb!<@c}%&7HioG}6Khr?~g7lnt@eN(~M^1YiZx!;LNU zn@q>PLX6w{Jki5Y6omj8g&Ea4vYuFkjnkO{XfoFN#m<&s49l)FG}3TJ39HfWXH5a7 zNjj3oZI9s&D>R3pv2dBN*C?Z|iSz-kGe2ZNzasOmh-~D1h8b&Ox^>N<&%yQWrtT+ zldD1+s8G4bZVw)MiUJLR2nnDtVP9>}OVWHwZ{`;Axk9{m>3#WeO&1HT)SUA@z(?BF zPZT(CyvRIT{`O>HC>_XU&>r>NeXO4QSHb-#L(DP!LFI{sDrrX7*CRco`H^RZqm>p= zZaZFQY!~;cLAd^#j|4fg!6*%RL{{;p>f!Y0p7PP2f}5u=AKsKnVtC?o4JoS9K=W_4 zbbNnzdtYm`=-i8m#N*$R0N!7kBeJw}R~=0mlWU0_25Y^^xw}mBcS@(xO462XQ+B-($B{v(ZP(RsV1w#M6;7+fX z&^*WO{PF^?azW$#qn}7v?&?olTTeu>t3DZH*vRJAjMR}#%&aj2<8TtK7FWXf;iBnB zw&l-h)~@npSKccT^%7UdNf^MK0x-?`Pp$iHg?^6%n0%xT1rJgJS*+{%l}b(Q3>m6Y zSS)f!o@oU-c94O~>?P^VwL}gCrhEWWITw+GtZUysw0*BP7W!V68QR>>F1R&x;MW)) z+{xIK z=cFE<=H$o8U&X%zNjlVc$Jcy(o}T=ZA;Zf?!R|nVE$H&z@z*Z<+xkZX|v#|Jj#V+5q=JdN9550hQHC`f_*xWqEbv&&eV5;$! z`Cfe4Bd>q_rTVK!f1-CG%G0oMyJtJB(z+nLtjM=v=(YzVGVmnn6@mrHa{HP1+`BJr zFJGMos~?J8Utf8j?VQxmZinO(T^E%xa-F&JM@&oYdC7I80Mc`~@cSClX-{&_%I%*2 zzHHdYw$0*CPR0gJAzKjLu77Ov)~4o&Q}!unI|O67`?`Mg;k!CX7Ub29)Dl*^+rnen zjuM;h*m#q^nEBZ)wjf@pK%Umo`CmTtun}f` zG0gRBPGZMI4d<(f5t4hGA^G_|2k-Qvw#Vv3>}3J1IKtf};8JDe0Q9*J7rng*Nc)t4 znQ+kCw?G~qtbk*bb)r&v5}`IA@YE$d^kkE+_Ql+#AhrL@dPv)HB2`J;N#~x@+}<`5 z+FBa#b8hiluU!t!iMw&`n#60sh1K5*X|GiT; zvB;;QyG3jP;GOv0CUmTStvM$|f?9HVX7o#tBGuuAzg7*%V@pDbETO$2utFudxtV8k zfz}%AG`pQfh)w^?8sHwfsJD-K3QBhR&S;`-y$$FGG~K#NUewMlXGiV7rp@w#+HwAq~=r`6l*W)#k&+^YBlCNO{HH#QewcRo1r64babh-nCIy$Mr{k!f6S#@lh56T>?_9Y146TOZ5!f+wX1 zY#W`BHJkmimNYH4WKPG)2Z5yb0u)8x3ufGDKKtI+0=D36%Le|8Ahw4`F{?{gZH#L; zyCoe)tAfoA4V9sc+ZyJ*U}g^YI>%7#Rrmg<_)HHvc?JS>VK~v+(tW6czPTi{*Fu>U()VD zBwnPj&6>C`0)hx{8-!yTZQ8K4j0-Y;`-yvN%MERQ*)=vlcaV=y|LMt(md%CFy(>*K zBMLkkPg+zjozK3+u$j|WT8Gmk?kC_m8%3OoPHgt1!5eG~^-LO9e(8=>&uwo0X?Gl- z|JI2Jvz>WfA|c}w=5Za+KqUQY=bC@}G^6p+rOlZVwWRFc<{D9p;h!~MnpXkD26D@9 zcGVHif{i>5IbY;_Nv;NUN-tlK$?kmbgn;QqVp^A^!8xP_v8e|iOZEJguJs1O(b;CZ zpQCdhe&ej!FZ`n!7QqkK5kUja$la2IuYc+N6+(#3*8A>{#5ITpv|UT4MN=7Z=NJ$DrKS5PO6xct|u*~m3zUKgNE*OPxRyZF4Gy58Vj@aJ3F zx?#lMQVPDEEs&q}04Ty*mOl&VtMe@Iag>l-ONZ(l{ECkdtwLK4P$6cu=} zv}r!uxupioMhs_*TKL?Du2_XWzc<3h1codlr>+dPT<&@+qMpPbIKdN%?`aO1OLNd? zPKuTFUpE)zEhG~cAwl~BNY|zI*Wk`s9>SRVDb35HEt0|R*U0AUr)Q~#SGvX2RrCry?4$briV%)fiqT3h49~ce%ShMv+Fl&_{4ku=77Mm zsI{9_eT5%zn#J&8BW256b$#iTOF5O}_9xz73j#sA2z+JJo>)}dUJcg2KP@)61P+)V1FeIjk!Lv>9lZY?eK0?=rhA$TBGL*dlNP-wn6- z#xxKD!LN(vY8&Lz9SQHocf020&K)*fWzrkF^Bafs=>j}MKziWJ0LyV~7<&mxGFzxO}WIS<#jOOASAI=;kWX z-(M2Be6}okzfBfRW|qmwz>2qa;HQ|f@p%NBZU!M>o+Y@SLYu3#9e)OiCaq`?1d1K9(ls^f(ufadCeGlqNBI-vZbdBgQ!MZgx(Dy zK1aI8_&Zo3mnYw>B((BOlKzXIdN5_aBkOrk5l*ZRL;jrn>dkSaQ|4=SgL(J(&w{28 zl^yp#l!3FKu35SNg0US}@To-y{N;i`oB@LGOZmDzIq-|_o9slkJnfQpc_yR&p~oIf zl{)j!>6FR*n@3U7a9k|*^%%6ntEea;3ZvYTY4p;pAoH-KFL|d3$&EQ}C>@U#m22ol z;y_iAS0|fsOgJ+}|8hquc0T%mjq*>!!_)OC%`&n{#V+i$pHYdOpYu-aL|G^ff+UfX z!XqZ^1cpiJHwks^RqDh~^L%ExNg<5EL?!-xWPoSvjeei^+)s{kAGJ3AVyXZBC`3y!aEqLDMcW*E(8!69P5QTHPS*WH{Q2q`-ROT(GM<|WM;k3Q>7 zHrQqL;^Dq!4$gk7G#hEA5`+$G5&D-W-tFBN?G(`gIG=73wZflDVRUA3LJh5l;D&|7 z_;LQm&idrf{S)*v0KcANtbH1f>3K*Lwl}O&wYu(i>#MZ>=(#B-RnYe15$EI#l!z5} zMM8rz)WhCV@zoL&{{$()PL(45uM4!#55aa*A8`W@dJhFA)c4fTR5`Qz^T`?F`UkGL zB0uxMu-EUtjI4Z48JW^4Q|D|#g?5w2W49Z&kUqHrwi6M*!zw#^)2EC&6^n0k4+$kZZBnohP!F;(G8ii}$tlUHy}>mco6-nGWqz}#EuC+E zejQ}dcU59X&wdl0p<%~$lJ3V5RcD}ZR6H9EH9)Ay;-mFMifAT5K#`Ldpi=R!JX#kJ zJ_K0!6`6Q}Pk}Lyzn-s+s^2AxTs+Jfbrx1)ZOc`#H-obgqvckDzOiVR|D?-~k?%Ln z#07f{)Co@oljq|Tk9TsV^YMjPnQ8Zgz~9i>vSOma9{qJm{bfnq>L1u>=tuc**`l4Z z0p;D4-)-kwk=JiTWk4>NW1RzXaK|op;2h*~20_FVn9RHDzW{~3)KHUHxGGOj#O-Mi z#+rgC4x@XafKS;*_2Uws(+q!A zar9h5=dK1TtTs1=Qp;28N;rg@?KJvzto&`dA7=M6x>&y=0dMZ+S6Y|nFOq^Vbm<{z zDcrqHH$C!e^O#ce7?2$gOuq54Ps+uwan@4dM#5GXV(hRkv4}PZ`T*u#)> zFO0+sO-!FY^N9Fo6{7Vs^68-UB$RiEmoLM|oxHc1zFoht)8cLDrPfd~Lm5y*SKWga z4wAsW{RM!26kp~$z_mKsewGPCO;#-%i02hN)Uj_eD2IVB^C5yuZ1#^FiCUi#J9e>} z#(;?M%kXAMGUb-OPo0gvNumtx$&?OeosX4&4FWYj$S_tL7VM8stTcSca>u~=A}>KD zll?QXO+D=kBzY>X(B(&e{(ioj>M&W1_j zYzj`@aM}6!ut#;x1mh@xIl=D=?!z!9MFvRoU8n!Oa*rqd4!HKfxAY3fAAVHq%Ixe} zV;Z_;2L^9_bbY&my}=w!yl|B1Ht6}1gXvY&r-y|!8~i0YqzF(9xjvQ=)xEWx0%QUV zOIa6HAC_NlZm5Bnq@T3#eYogE$G+wf{A*)G%C1;i_3EJ2xS0U?L)+~^O_@XCD|5S7WnE6%TAYLqLz*Mu4|4mnB>RJ3(hb%Ny;5Nu1q@C|T7jBlaA z>y4V?IOJ&CKI?qjgO)!J|L)(e3O&&B9_}BojF3bUukIl8ZF%)5N)&p8d{{JZ|6@1J zB`ubYQ>aJ;-;@o;e-0EnU(MBjbLs*Y9DX3i-r(IH_p`kxu$FW8vgm3SS6eDg>#sFI zV`WDFJE&nW{%g$;d7Kj@lR6wJBVxiIsfQT~b{=9z_f+_U|AMZsH)dAU-l1e*OKs)_ z2Oa<+ddGJ!6=z8CWXb?E8nqg|Vc{WyB(BLTeMgPb7CD?V(8|vyBS#y)szEopvNY7k zgA}4u3+ZN{oJKixiE^31S!NYy3_{p7XC12A6~LQv%q3t93?UdF%v% zg{(W6BHO7LHrBvqgUTrv8;sq@Lu1<)?)77DN4kJW!8PV7907UtIxQ=D0op91OuT!h z$SiZA-koJQ5?Bdpj_6uwC>scJFu~UZ3AI9p_#%|z=|jlRy-|{k4+C#~gfl0$wrts^ zxn8p*qktoVG{3VzZUoV`GgCx`h)bqM*{RFlW-<;BnunJUpT(6fd%Ox+TnO#tLQn#u zsOE!>9SrU(wft>DY6MYYW^m7-H9a$>%$i`}jvWWVyl#KnU6iJuDh@HLwg--Szsv5W zX8yKFissJ~oyQ3o;l1QcgyU-bf$I9W9U$=YyN!025<2*Kw;ep0HFCCW4RBA43DkOF zV0`U+SATwwklxE(Xd`m!EgfCh`X8LSKl*<^7z zLC}IEaL04Rb8_U>?@bDordRfcPngn#4n{SMMV8(Z@5zA1BIqS{X;G z-v{NHe{R(Ap}$1c}N+HrHW2Y-J#Dvxcj%z$^_g?#&3+v9ark(ARtChf=zsC)cAu0rkWYcQ3y-H~fk7LH2G{J$r zLWV-X^A#b-Kh_JLWT~Bl58S6*Tz)yn%$*^`W*@KniHXL;El6^p-W>7VLkl>M9&8*Nssqdn!imXFiF|ifYT@-L!rllIp{ot;D+D`RuVPdwV;mHFE_KX@L03|wNO_?pw%Nmr00BcLPd|4k&lJX{|)iMeJ}A)NdTFPqs!{= zEd*r9n+kAr9obdscH%PTBjrR|L_y6V39pjUunTbjI z_8(i=z7z@A1$c@r2*g0Ige6r#}$oU*QfGt0FtVmDT%Sb@lI0ok;Q; z1KlKfFz^W+7}s#aedf&MQ-aOz^9Qmri}JxT-T_e8O|h`GdEtOeGV1ek0m}c$*(wIi z{-4hRV5NQP6kTk9xo?7n#;&|^_0|;Pu~lH%_J4i4sRa$e>P9(ir)}mfPWX2y4 zi_Jg28l?PBse8)Yr}3-6r~jtg=B<;ew#L`^Yz<*A zr##uBj!iON6oA>18V>qpG#%7jJowQdibYYwuHV(#rq~NttNWofH&uzkR;9m8aJoLf zOX3@r+`oZ=lSY>l#o_kA%@E`?EL z_)=rH?yL`3q$e9wWAD5y=CR8yi1%jNf*3==4z@lwEQgX6H->eCFIw`j-M?OoOH!r~ zl@~u#CMbKsd*ecabxHj#@8)|prS}yZ!v-6}jczk_=F%>;LfrNsSsluPa&!E!dmXxd z(YEpKd^-I}DC8w8ig(s=_7I^uca`IKNrHY#QlJoYBKOnE&jcZP+v|Dmp> zwo|}HG?UR#c=eFcmid5e zej;POHCegfm>h?K>kFgNt|Q5ojMF&)Jb%&RAfD{K+T>{3*y-lp;an`+iC%Hut8^0T)Xb|&h@Z(0 zde_?5IpxBNAzYTVxa>#2+48_HFLPTO%?M<2pL6q%BJOFf$w;^7uT64$8DbVoF9&CB@`!reb{2;s6r&u z@yH_vogYf~YFqI%LwJPgIqj|2Pd2w_nuu^!Nr*GSx7L|om6v7~%1|NHsmlyi)9XLu zFA1^?R>ZoP1!;rpUDh;@6^RcBCk343_kGJgUCb&0|p=HEV7S4K7AVdUSCWOJs5wHfmaAix)Q{U9F);=^}M zL+qsCXqO2k)h%N?`R+o*C7LYAw7A$A;vgyL8k@sO9N2W}D%2Py#L2)aCWOSD?WhfQ z7x+y)gcA*PvWTpyLf)mc-$iD<(2xx9rW!JQ<7K!@KB2KoN3nS50hJu94V`CtLdS}# zCmu?mM}HPiBO=-LaqG-H`^f;8aFvf*6M=|k#r1U(3z;E1H@~P5lf&+)J8IYNzVg6~ zkb&xV@h>t#4)wM8w1HD;92|BE?)p)kY-U*>$($oA!e53A*|Ih)XtAhp_O*ZjUJ@rZ zNW?)@ogLqO)IsXYIv>bk%cgg02@04aHxA{2Y`M?vIsI9KQb3^ky11Vmkq5&@NuYB| z4?a0aS_BV76m#Asz5om=+OaeFQJlV$A^Zt|t_3ZT&35kw7IGgv)Ek9vEY+j@L)Qf* z@CW^8goZ7VvWQA&-{m2CbiXSKVu=LqiJ)QycDEhh#=k+X9as!EXA|$*pzq+WFLd5d z@qtM9n~+3+z&@(DR)4QZ(6qRcP~7vTs9hHCwI9p8gh4vDY}BcOzH(wPH6@~~nfAYD zr8x)OZEQPU>OlQj07@_e!prAm z6<2_iNu>2!RF{GU=e`^FrK>kf`U+FjOWpVIf!3uqK_cqAJ4QI(2S_3Vzrg5&r|Dh5ydmTT(pA&|VCYZ?EY?!|~ zkqoeaO1gdzF@&^Mp@7kcxT|Y`cmC(~KMWnNc?^9C_(nbb;*Zvo2&8LnO&?=CD8;Li zNhr4e2GP)35R!+Zfah$mx|hh_EEC0*v-)@$PQ#8;pP=;R*XJW0_mjf6T0GOOpALX% zr-63(K!;?rx4>N&749tWvANAg?ymF4%pG2x$(@oRc}XUVqhwfockjYl>Jw|fsQ+5V zV{hE!#6IJI@b&KstUK!6I!Jq;>UYT9KqZ(aU!zC#u8a-MlHl6!GU)`v(u z*CPVlL?^h*0>pFqZ$FzK9OX!RAU=5y_p`m~w&LS4F_s8yXdw#mmSF#chlfIiq{Y~~ zpiBeE@thT-38-`@O;S9i4Tn`tGEfKVZbJUR!Z;&x_gfqf$K`MSNq>zsCdu0D)5Ko$ zp(XT5z#$p(5B0k2)i2-CwoboZ)c49xIwX4p$cKFlA^u~Vdy!i5q0>;#Ugdb(od|yr zpnK0r{AvvINQU$Qqx92<$BX#XsY*`9;<(J2azHbX)Zy21HK_%D44F)0-$GDU)0eXe zZQ%i@&n7#b8u{ApRRI5=59Gt)HdSxgn(a-A(QXO*d%Ly}pfO}{xNDeAnl4ygZ9CdL-cIJ08hkdOf;#~KjLZf9Y&BM5V z^1x1HqzIh6zV7~b`3n0uZxhh&k!zKpIkc6z-=?XVvn+mhh(G1@LE9)*I^%gBvnQwG zZ3VwXu?Uri)j`(X;%-iRN}qE@9Z0qFYjPtHBZ^WoU;v4r$$VoKMA+k8!tmpJ56(KR zW;vH|ab7{A3bXY?w@o@vMT78VKK9e| zslL>>=Tf9j2V5t!-$Rdp;;4E zB?zI?SSp&ktN{8h$N+PjT8aA#Q=n-MX39Sv;`|}Ya64XHRD*MIM54~hsi_!atPi!0 zr@S7HfvOHx*~d6D_S?R>1pv})D6YE&AD_rNU+GeVE6-{^(Za_Ck9pYZhzEm$BRmyp z1Wj;g*c%(zArYnO_Itro?Qa0s5w4ByG zMNunmhJUE7XHPhrL`q%H3?tP+JvtWiCeu?L;qAE(`PB5k-Zg|-KZ}-*)hwh|JfkcE zMnv}5A;g6!@e;5i5{@v_(ObT(1Qf5LO~ieRF~|4OPmu!;9}}tt2v@2Nt{=RmmUPVa zMaCY3dPZ}?lmZRzT@5t9ROEu4_ysM5^H~3!J(v77SvGN}al4X?91Oj%M2gT*XVtS0 zS|Z)qnYfzzu4+<1^q}MoUg8uZH{lEjUvdwTNItV??nZ5zSYOEK^*&jeiGe8|Vh#^+ z2Oo<6tqZ7lYHx|ZTXQ|ri?ldz*97Md=c!j*O1?0s#ia%JCI6~InPW5R&aoi553&)I z`A|Ho+fq`)KG*(M|Jv1Bn-mm4h$H#HMrXh6+%Z2pvBHbJxv29whC^L=El)mbwZ+%H zjc-0pL(a7Nk@b`kbNMgnFtdGTPsInxF|8))lh(-%m&VZH8Xq>L*<8a?mzC zwc!-p{3w7RbIOw^U2CZ)*5~P#wV`yp`v_?FcN_rDVp-0b4XV>s8_Jjr8J0b+3n!3d z6a^jN>w3UYG3+iRHSuyNVYRt)dGM5<>cETr<;!T(>}YV6vC##F3^T0ys1v7|Gv8!S=VUQNe~wJgz6mvbQPEZ_~U{-;ZQ{Fq|y9|SR2 zw$Cwh!f?#NfeTS*&EDyU7AfExatcpU@a#J|x-q@$8!+{YHS}nq9<&DD+H=Q)72iAN%p)NEUL(5($lBR29+6)-jHud-FM8U`XKk zJrn`sJ;wMuatYwnv0L3xx=n<}(x$mJIld5nS;M@a!xw>3le+W{6+cg<^e118ql&*6 zqXnsuWJFFc_5&%!w{K~=yFUcB7- z)8^~P?6>&;oQQWnaY}Fns(JdpSsB!t#|H|cixbJ2{yq*wP@xC=m+q{^yEnw*N|paE z-gKDvkcBiFJ2q1QK(i5&UM~ZGzJqgyBuGnB=ysmp4Z_g)iVIL#UW-e?(+{CMfG>K)v0;uJAJ||K)~<9i(|%>CUknq%08d#j$Lm zcRG%A-F-ZRE#T&0oayv9+^Tu-k@j?*^Y_Xz{7korw)J-ROsfw>Jic$nJ zCM~KC4Xc+vlAQJ^(bBU54fsw>UDa{T25cc785(!G96H=b#w*vhm>os&td@L{c`epV z6MJR2J{z!wLyprxD7p>&PEk+&hsZ`$LOJ~>O3lV#r_G(s#d3w0_(C$>h?R%TV@Pj} zcaO*X=6Jt5d@rRKy$3T`&75IrcQr!H!0Rn^PcKqB9nN|jC8OM*yH^AR{Poa=Y?lw^ ze2{vmcL)*bWl@>s@hTVwB+Gy+XgcA6r>XYHtnrq`k2$nR=f@KUM}=-T>3op;Ud97G zn_KOT#i!Ak0YED)fspE;U|7LZWB@h%`17WRDkQnd&&aRtPYQIB&SwCXh_8*Op+AGq z)l1p%+7{QNjF%`MjHxpjITQ>h&lWZq8duM{5>=Y5z54^V|5R*q-ppI3*C^#BS&i7} z6OO5OsbcuA=Xx0s(#^sY8T7_x(>xEG-oI_I`hG=)yuy)OzU6LXFrx~t>|@GYT?PJv z1aApnTnye-Hh&=Ak6(}YIv_wYDDJ?EDUH2IQ)+16J~JLPov`>bY$f&=u*a1X{H+_$ z@XC>;t9Ge2uE*VJFW>j6_~o7W8RhW5Uw~0oSWV0(X8j1Wl@|WCke4bXvXZ0A{?Xut z+~&u^OgQcPDKWRJ5$j}Cp7-Z<4sc>4G7vJvGMSrHKNe@)C>Cd4tdRvYw)2;tQh=Wm z=!oOGH%r{`I+89{x^lQPJMWaUdbiJIClXO8Fa!H#r3TH^zc3_Hz75=4$zEs95rDwn z2su4oN0XubKd^NG-tv9IjUisddtrqXujV<&pV`dpxWBs)rvk&R(cj4^?eh6LuBrrC%Cnx2@kBb`T8!GYc{D$Ax zSfD;3BU?KWKzqd-+tqsr4~}qjceB{}x42mAwe-lbWbexBDYE``&vNCg_@TK5DP?xD zOCR&H&`q%poxiinmQp&xuGPR+nXoP9en~!%CzX8e5Qj4#AKo*opq%B$f_(jk z6hrrnR&_4aBDq$E^B4oz{#+1sMpqL=u|eP&9f=2Tb&6u-jkcMz^a?qSV@Sh0?Bd)W zme^T}-xh7W1wuq4vZ{Y&anmp;1Nm5BEm1X*pw*YfmM^O44c4pL%g3r&>`WzQ$PLzj zEh{HbH4VH@9{`2bmmiL6Lk&L_)aY-@n3%P_^#-uK#_^s=qe*}ZCL||Lrhy@yh3B`P z{t$McDlB5w0J-v32g>>dcKM6Gg}R$K}q0i8XPhDjWXdPj^e%HOhZz?rg^1E-U{x%dJbMa1_QaSO-DZ zXW_#Zk`Gt-oL&fg0F-=VF7l4LNpvFFZM(zvU3t7|C21T=9-NZ^HUBtnX-~1s-0`6& zrp>Ywnu~!99X^h)4h|T2!)2RgRRrnlQKmrhP!T!=ag!E*pL7HI2qn^3cu#;n8<~o4 z{jOJpQ?y*+1wL&Z;7UWQ&Nrcz;lbHikAwtim4R&S0va;Ohm~$g{zmi~2DKZziiCiM z?ae$h5KGU*MSa)uj#(Qna(X4-Xdy7P>b`>Oi#H6t|04dW3sdUXj0#TabRq~&KKj;w zSaOnFg0N&1#~7Y9$90JAqy)Xyp&|_S;-+WY++$kas?aYfu}5mx6%!B!D>U))dc))? zY523WNq*!>$p$0J7~|LhodVpWQ)(Yl07Uf5bc~BI7--DGw|YQWG_90Hev@Y~pp>P} z17*cRumL*Q0Z^F2|BFQ%A4Wy!Do-$QQD{}WOnC28)Y6;MYk!5b?2p3GVZrwRx={w$W>HEDg0bN!6w9~41o9T&)+p;ow0wN}&R@szP?*j;8JXPmI>z|SH$q3w z&okB}9HDd&ZiGtUh%+T7KO&2&*i-Z363+EdT&B(aI4z~4h-tep*+S->kZ$Gl)kdHXt$fAVEc68y}@Rv zVEAmop@jf+ssgCCWM*F*km|m5D{L-1IMk44{k{?T1y`^z49eOE zwR@=5QTWBEeYrv^AboecmkU!OJ;2 zD0%^k9>qm{-;<^n{2zrc2r%p;Xy}^e`cc=o6!ZDKROhjdA%OeI84tECMXB6Fk-e2d zjzmx)P54C|ZFK$<@4@K~P1-W}0DUCz+~su>2_SWlY|MC=ELk59D!4lY_#5 zMpmHaC7N^RBREC{_$GSiEfkihxrmR=0c$=50mL+!yHAw?hEj>j^(erq{O&g*O>*Qv z`>p}NHwt>p0wE@z0SPHiQ27gJ)1S95-^Jj=lt{t5X*B44%9=Qd+yd|r z+f$Nda-{9UvmKCjd+<}dmBl;8ucWk-!u~ixfG4rMY>PlDj!|>q6|~wu z3gb%ID*w7#y4+?Vdla8t^q!3)WoCNhcj~Omqx;bj1E^K?XHTcqvCq-5T@BU&%K-+C z3Am3)^2;5C#fg7?07T_sYM*w^h3*2H!5XQ8mR&0C=r_oz{04~j9U|om<%-%gt%FJ* z*$rIaQ16up2t=1~29G(gu`a5@WR+F8iJr;fNOiwi=pFR&JE_Rvfn^eV_GygqYS@Gs zba2dzF-RTZg-zsK8GzAV@H8S6&tG9$t@(CxKCsXLbfZQXW?wV(G*Yv9V;gu^0l`bu zjxB`<`Ne0Dq1K(P=zxA=Zu2Jxzus5X0P%WzeY|N^+cCL9K|@vE`;sl*BgH}^yVMbE zIVn~PW;sb9f>SFxAJORHs7Gyp)$u*^O2WRU#S1MU_?Iis!g~TvmX`jt?^_v(h6el$ z6I;IDR}Cu6>Xw*eLe3iceNefzdj}vr0cAc=E2zBBD-W1$`|xY!e+x}`{-xDTwVgz2 z-8U#I|Eu?^sI|ceFHp^ zyG}+_W2NhCNv*kd5u3+S9G>Dpf|4D2Qftb#?T~IZVf0B@%``%3g|=dC7JA!8?H0ZI zeYxAnV@WrrQC8ro`*nZ&t-KFBJXx#T@Tebb#%l)+w9UeSzja;Tnb`xJVu6)GZ&q1U zc((4IR&-pcJ+6KSLY7OZMx>IWGV=Tv8x57OlKEhrye<`>?DB@174bCuzfEQjz>?Y* z3DJ0&52CnR4yo~xJuTz7FhWs7{VA49ic*H3F&*1q$L){vglndOTA>7x5jv@Ei;%9f z-b1(Gs6?zVfA~D=q(;dMbm66&MLH6~rU+4IG z;W@Q5Z-3`SfV6$8zzPVGp>XVn3-fS*4)_B48lO>jKg1in+bi6fOeh3|^neIM1AtpS zC-)2nrrQ;sMW488wH})n;;fetkpQU;A@ww?1_>^cVqTkn(x>ZCxzB#hgVc5!(evE& zwm)XlFy272sG~lvHy(42Vlo84{rriHZ>Y)cV|~>#aa6w6GB8!Itmb z$cJuM1>zy)0|p~FA&Kmem~9_g>f5<4&5J9dEYw#abtUO*MRp@1z#L_5AUeQ9pJ_B*j9TLm6UBXl?<=J8$SAevB+_9X?7+>MHR5Je3|?!C)) zQlftO@<2xy*>=fmJh+~&D?M|>C%liXU&zXn?l96{PjQEC#mI13}6!lLk!{Onuqho*2JE!LY<~H|_{@@X15rEBfIFx3-wQUn>MF>o4|n5GH;(DTP#i zs%WQ1jlr!n0szZ^GLFt~@5X=SQ>ouB6?Aue3${5cT3wTIMKUAHl34S9o7okhM1>z& z#B#AtrYy_4WVi+aLINC_V<&e&bQX9G@sih)Km}_?*ofyu(XPdx&V?j`-;N05N=#4i z(74M;{b$Akj~67yoFn$i;%|C`COWoX?yp3W(4f76T2egycq>z{`lsU01U?=<&E!-? z5hj%opqwP?F8F=UHE8r5)~>l?Zk+}Ai>xie92`M5ceqYJ3}I^AOZvb5(FRsNlf94a zjJU#JjN(J%e$~6Km77298oj2dS;k^U+r(* zWgwKUn&I!K)TNrirSN;6B#eoM_6D5&)yC+`pqO&G48l-=MToc~Q3si0RBEle8uE$y ziOPL3a=)7Sv3srohy3p`&gZ8SM{GNGj~WKY+?y{;`QBsphTV^%8=B%L@LFfhh5wIE zt@NGkM2-IPlUQmLsgj~bQN+@UB|1c_s-D{Snz7HNcCnUZsD^PHOIvqZt=d&>Q3(bK zjU^aMDXOSSY$>7{YD-m+wpZ`{59a-Np68tRe0V>d^QKpzqE=7VFJE{yKy9bwR-7Km zcX9oiJoXb-Z-pq;)T#d<(rx#c>&IlWH?@OjnpeU`7ADP_5pmN^;f1{Q&ntA=VL$b z=jVi^=8wK%1<@VJ(2Q6q{~SQUu?;_SfR|1xte7hLW%{mg5wr1Ayw#XoiD$Q65}Cvn zhfrW2q?AERf+W1m*52j@QMFLEo)*)Ww13rm3wn=>X{rxb+k7s3(iXmOV+LyuIOz^vK~ZNHo)kq!5ld(jfabnMtDQ`&QK z35VSA)Q-&dt-moWYhx0;AQ~-i^sEJaRJp|wzm59cMRDc99fdx80sW$&t@rjS3x+7@ z6vvNGTD9Z5XraNaRY8Axe)h#)HIxJET8P?okpX$p=$7=qeJDEvun#7eGzL0%4rNzE zHx9PUz<8Q?gHOK0BZvRQoMGr?VkxJx0G9MokbYoISgHhsz}ZXGz@h1jvD*=IiS2 zbD`@c)(_p>mFU55E|@nVE{D9r9FI1fFz^0wdBqhIl3X)g+z)|6I-df=cdUYJWs^%% zhF?_$awk1f7T#ki1e> znMM=#8Nh-wVI-aUxrf*Z+za|ss$BwK>_7t!|EQ~-~L@ZQ?RvHN4ZhJ z1gl}*<;`i^a*1wMBV$uvrR;n;ebY9L3Ankl6{U^@&r362YN*BS5WZsXeO+Bt)5S0A z^3yt%vW*MDF2{{S4&57;n#7`$(GYADU%0i{Z0D{cOw?7hMhxikSls?gMCS8Sygq#y zA-a_`djk2I8MEvMUGxQYYLJ3`pNAdNQduy-$_SZs9 zi-$vmSIBf<+^ygFW?S<@j1pX8OX}#0t58i6#g){YkihPchYX#H?0w(kGC%{}cCyOK zop*Pr-TmUWHy=j%dkZM1k3k8ipP5#YMQvcKX>e!!xT7Gf>H78~1C{O?GmR?!NRF3X zjpc1>K`9sZ^{5Y}Ux=i?xgx#CcsZS*Uqa;LoXXoN=q_pe$48ohW zy;fdV4)9Xx4?q@wgzKKu@KSgf{Iq@SdR7e%_N>sfrgk*MPP($l-S<%UV>STLmWuxP zVBe`WIDv|~mtPyUn`?Tx{8>>t9{yA!uUOeRqFh&%9bn<`vvmOPr5ZyfT)p?~p6-U; zOanASR0>c^Tc)b$D16H%!iTu;IIHzydYrbNDN&~tz1J)k%Rp|VDgzUwUa(OB@TM%J z{g3*DEx;lIJ8U04o?d>*I`F1-P+!o~`$F-Qz#3BAo<3;Um)1y-vHpeZC+hUC5yLP~ zds!Xh!5I`%55UMTs4>tQj4J{yRAH2=d41onqsu>!6zct0Q#X!oc{|^#gKi8c`T>4; zvF=o?dhtmwtdt+B@q}6e?Jt|}X5k>(M_Hxk-5FDvN7nHOBX<>Z1-~c#)IsE&QiVa} zkJpmBA8$zJxh%|Th464sxLPEK4AsE8q0rbYNoi$3pdY4`kw-KVsT|@jJB>{Vous&( zv&r?uTg7OGkv;OYr&Rms$AR<2@wZ9C?fw96z}s{eG*!U>xZ!k9B!>!Nu&h$sVgK-W d|4-Y>7Kn^u2OO7au{Pfk>#Giy6bt{f{{k`i8AAX7 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/heap.assets/heap_pop_step10.png b/ru/docs/chapter_heap/heap.assets/heap_pop_step10.png new file mode 100644 index 0000000000000000000000000000000000000000..0d50b1abee57b5527173db62c2d0032a4c1672ed GIT binary patch literal 21897 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�VMs!#(_WXqbMj1?zZ4$zaTBdS*im(gt>ZC!JE0C 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 UayWyo{@+?lO;@#2**5xr0BKGi2LJ#7 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/heap.assets/heap_pop_step2.png b/ru/docs/chapter_heap/heap.assets/heap_pop_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..6a38e66b10ad2c5c120a9d112e55bad747033b37 GIT binary patch literal 16686 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 EKlYXd@c;k- literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/heap.assets/heap_pop_step3.png b/ru/docs/chapter_heap/heap.assets/heap_pop_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..c137305bb621865a7880fa8f603591a79cbe0438 GIT binary patch literal 16587 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/heap.assets/heap_pop_step5.png b/ru/docs/chapter_heap/heap.assets/heap_pop_step5.png new file mode 100644 index 0000000000000000000000000000000000000000..d7d6fd1bdfffd395b596ca2311279fbaffdab491 GIT binary patch literal 23982 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 Cb_QGk literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/heap.assets/heap_pop_step6.png b/ru/docs/chapter_heap/heap.assets/heap_pop_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..9e9f0403c3c75e9a8275a260248ef5105fa98397 GIT binary patch literal 25032 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/heap.assets/heap_pop_step7.png b/ru/docs/chapter_heap/heap.assets/heap_pop_step7.png new file mode 100644 index 0000000000000000000000000000000000000000..cb0cc88af27c44967fe6ca805896dd191d5b310e GIT binary patch literal 25567 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 LIu9$A5E1_cxH#aq literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/heap.assets/heap_pop_step8.png b/ru/docs/chapter_heap/heap.assets/heap_pop_step8.png new file mode 100644 index 0000000000000000000000000000000000000000..f39eedd99014b1b1853cd9c3e1ddb300c1d800e1 GIT binary patch literal 26503 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/heap.assets/heap_pop_step9.png b/ru/docs/chapter_heap/heap.assets/heap_pop_step9.png new file mode 100644 index 0000000000000000000000000000000000000000..a97ca8bbafababe987c285f088c619d89fddbbd7 GIT binary patch literal 28508 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�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 DW=DEp literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/heap.assets/heap_push_step1.png b/ru/docs/chapter_heap/heap.assets/heap_push_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..cd099ba2cee1d92c7ce22b637e9abdc4f40a310b GIT binary patch literal 15924 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/heap.assets/heap_push_step3.png b/ru/docs/chapter_heap/heap.assets/heap_push_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..6012761c98d499a21d7596be0a8dc6787886ce3f GIT binary patch literal 19991 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 i;s3DGe?7Pi-V>zhL(%751U(SHC&=vUbQ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/heap.assets/heap_push_step4.png b/ru/docs/chapter_heap/heap.assets/heap_push_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..0c8ad98510126fb8757ce58de2df8c37964ca88b GIT binary patch literal 22304 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%0A&mHiYV*m*&MfD35di-?p5@thy9A z+oeHKg{y8j*jH!TT9nN=M00K~Ws1RPjjSdaV$Nvi6>F@bKHEe>OaxGZ?tOiN-f(`E zl{;etb{rPDY&hd()S(J50h9C`f~Ql?rA4a@DG{hM-DBb%CNeQ|x_6QD9f8UfGqbDV$s)H!U< z=+l~4e&Z+gAjuWEfk~X2zq1L@B?ntL{G}%Nmd`1^(u^iSFhc96nu5{@t(tEjuy{JL z$R2aCO&>Gm$~H_o18pyXug+iElFK)e5}i73(gU=n)NW9UIKj$2a)ckmWx5*(G$5|aeYrmG$F(s zAk~j0x@#TCp>p0yK@}R|PuW(bP4uSP-zes3J=+{OmZOw4R(-*E zQ^jF8RJ?E6srhn3=saSx(@4;7qvr2LT9y~4GpN-C^CDc%JvpnZG4-&x2s+r2OTVNJ zO1uLME3aMqbbb)Pcf&G27tjJOM@ZNwg-W$--W!VH74LQI6E~4&DSf-w>Q4aEXqnFT zjDc&2Az|b`Y_9O|y{u(+MS{CB{sqjIouZi6pzQB#pXnjTcP^&{4QtT_cf_otuT0Dd zxP9PgI9|tV6C_S>F{`%CIDJRGDEE!(7Fz;qg8I2paT##Jp|)-vmKlx!Hg6j0YXxp!2p2wz+9Enf^e;tRekiND2! z)P0a2=y}b{F_d=ayO}MdbR6d!&1Ubin!`h`ZeWvAAk5@_HNSz$h7@^*>B0!9uM?GUr!&Bzj-H&+ZBo*$P_P=*LD7; zm=`v7|JSjr*C2U3WIagKbfK~|wj*+}D|`$bLo|pPu4`SE*6m)D`!h~qv9kKUwrvwc zwgbBKH2S>$*LDE!r9QcwooIv(T{LRhzxCI}ZQe}rOKp4ZlUdd2=SVm2a~o5B^mB)_ zIk)A^=$|1Z^m4dGDBV@+)Wa;_z~rtX?EW;{U;mI}Gr+K&K%VRx5`ne6bRh4<@7L7c zOU&i6j@8y8uHw;!^15YZCX|@!xAruw@;EvfMtu_TK_gH6+o9fF%FObsk?T+7T%nsD zkS%{t%&av}sMW3IH(4`{&+y?8=cPjsB2kh5A`Vi7YS;Ky)?>Qry}Jv&`|$Na^;~mn zm(NxDfP$&U4YO=#>f6UdsGp9HQXI(Wpa*NOC++-32O{6wA;CZs%*RAIVxM;v_Z;MP zK!&!-ZQ}cBM)REh69Y)!TkqQ|(nW)?Xm-$cHA*ZVEAl&*imzC)GW!gEhu@6f0r)p0 zApV~~XBXh)UmtG{?xoCr9luvewY~?K;}=r%wqs{^1sMjLh~RMuT{hy3j$L#~3lfaq zbyC7l3!Piu?Os!%Kln#iQ~=@M66@p#GtGUuG-c-D9o4KK10A1#ON!{<3Pwstdj-8z zE0O3(`nnP0e!zR zNXb!#L0ekyN_|Nv)MW%>eK((!g)%&0eMIYh!pExvT{zXiG>W-O8cQs=0ljUTqOSbYem7R<0Sn&W7&V=Lgm9? zMjMG9yt#Z|`x~8|gS_kufy5~zKiuL_s8&%M;KrUC3tW*+QOAZB=)-NBTx+uOAq==p zqY8N5i3b};79vM~V8%O3u_&zdWaF zfC1Kz>eZp9?4v4}H|cM>kzZ?SXBvw+8d8y(#5B+a#vk+Lw63cs=Aa;7c_;}0-6Wq= znw3es+m$ogH=p&c*!LBjFH#~j7vqy!6%x0@IW)&wL&0wL1v}G0WAX-Qq75oqpN7Dw zcy#ReP5%2J;FIk5!hp$q_3|>!vI)h5ZH4}E_Hj`F%-6VG?|Xm*o_`bw8dT}vAAMJH zoLnOEY?MFh(g8B2d1%^IxSM2=mQ9n`oOSVPrfWK_#vkaC9Q4y|^|?8?qY``ily{GO z2-UEf$gg;;h%1hDn%uY@1aDpbp#{yqYLxxRGS+#oPEo0a`AJSi?Bzo*o7__%Bxrnp zIVu06IBUcYwTrtRS8g#Qn(WwCX!*q=u}7jd#_S&G7LwLqyu_Z@ej|K|IQx}y+r WW%t30lT!a|eyl02uKlco+^L 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/heap.assets/heap_push_step7.png b/ru/docs/chapter_heap/heap.assets/heap_push_step7.png new file mode 100644 index 0000000000000000000000000000000000000000..5a34e814c3feb8538a1f4abeb49886312d39a144 GIT binary patch literal 22835 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/heap.assets/heap_push_step8.png b/ru/docs/chapter_heap/heap.assets/heap_push_step8.png new file mode 100644 index 0000000000000000000000000000000000000000..c69cee6985caa39d813f14f29598dba9a480efa8 GIT binary patch literal 22743 zcmb@ug;&(i`#wBduym)y(j9`72rQ`xN+_koib{i&gw)a^DTp8-DWFoTGzcsbqKF_3 z(v5UC{MPs9e4oGI*>m>n&OI~tb=@&@53e(9l>Y7O6r`-A000W@8ybcHAP8TfJxCbg z<1kO`5#fWx^@f=T0Fym&D-G11uAi2sAn%gf8}dN;W~`RmuOo!uQ< zTieW^tEp`%&NZt{AwP}NjC^n}&5OR)Jqo%9019YpsNVG%T^)~dnK5R@{>DA8O>J`* zZ9ZvQ_6df^K>mEvcKY>l^o_lp%-yxZ3vqc)P6Ctv|6Zs4?kquO$3u`Ww@zn#ENQ-- zSAva%CSNfU_(XYNI~wzsW4@ansq1^1t|AbOSBwiHMe061bsSV73~)ax!s6=>^dP}< zOI9~}uUM2A+o$oWLW8T9tprECr#}W023G~;WSpvX6fvnKzM{B`#@w43J$<}aR2;d( z8z|5tO^X%Um*}=qI11Q+ECeZChC}-d<<9vu&q}L6^t6ORz5ygyh!V@?IA%Y3pPeeQ z#Yt9?E$-V6Bj%X`To@&pPZ&Fum>XEGqX|peA^YV7hbEbU6knYu+a|I&X3Fvu_@!X{ zE)o7qP>yoYV@Ua-5K6KQ6qsFnZe+JTVB1kEXcNzYLhsyz2$+q0%{ym6kZTGo%0h!l zD6nm#`)(I6pbIa_m08Jk9l_6(>iClsCP^_ZO$5B%$&4NBsMwSjB6Js$Y4jn%pUSXF zg=AA>ImpLfJjNS*OvI`L>xB9ow^u{@3^}GjEV7U zAMB@X;N;Ub6a<+aEVTq%bRBQSbej7YnL5E1dIKfN-zgw6B^Y$8qSNZw*8*=%!RFt@ zi;;rpIuPO4oETlMe%x$|^2ika8K_%!hAZ#O#bD8E?%QbB`^;lpxS4H$Dq?A3~?kW{bHqt#K8aWbyw z6sj(n5ez?4jJmN|98eLIWC0j-fignOwPYq4d41i9auPdl z5FM0cA`NaBUL1qX+UstWFvdS9#p3U3;nS|GO`c_wqJ%WgpTK^UThD^P-P1| zf+Vp(OxB40L#B~@r$^=^x=;ECL5OCPGL*kfPVuU;1t@erDa7KfI3eYq=ljOD+%D8w z6tT+8#4%1Z8NBhNKB88V8(*oBr^}j~=QTG!lTK()l>o5(=~8bkUz#X#rBaDI`FyutwC%-0-@b6}gv*FO7wq<>u zxH4ge#DP6p`4Vv-^*8tiD3r&@#;N?U=3Mv22)>NZ)v$itdsLpBkPSBPBWVMFD4hgqh_1`*L2ZN81t6rDyL4s4R z1|%F9_|?(l{@6ca6B1Mvy?9X^?Ag(<@lrm5sO5aWo+F@*4HO7lGgzF02T-{(=k37$o5 zwM2KHG2vQ_v!PIRpJ#+VXjKz)2^M|9YVIF+xBC}~Q^4hW(BMFs`on7-)WgTt6;P;> zL*SNg0<9J8p=oQbM;k8q|(V!0Mh9T!+R`#Hp(fRz={#K z)n|`UHp8cEZN7O)=y1L30Od+AAgVMKMA{avzOp!%E!8?aoHXRLlKrUrQ z2%_}O!WtK5cJK(N{{=fg#loNCT5znm)+K0gxe0;X7i?_i%WN$ALF0KtdAus=@FS6b zX;pi8y5!xb1G%Kc)2xO1(m)VgJEiuyIo0ydnO~|W>kdytpo2<04=!6}2%)~L4V!Ry zpDwg5GSP1yUwPC($v}n(lY14;^<^QddtCHHcDU`&+=CMA(_a$;vU56*|ox zR%W&|`Ro{R?cmAIhTpmo+Q(!kh>2eX7T6V(vT>DAsWxA~PLHN7{d%^!aRjE^a-+pG6G45@)8vmdFOy5(UgI<&RNW{R>Iv?^deMOVmg$5u z-%GK})tm>vn{+?xnY@|Zsu9j73@FHK$_@NuSN&®Ad*;^~!KqV|AY3GL2>wVmG* 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

      AXypqrI#n{ju~14N+wKCb@wdkE*10V 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%0ATX#2?5}~3#p7Q=ym6*oywFR{MG(a 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 $i_PW9}Oyj_>3AHxo(}PL8Gi zhII%{J}+N6Z_&-<34!o=2~7$da89=QD(jc5&HB@XnM;LPVH-tZfg0tus_q=bCNIxsy==-ddEux@-?X-< ztYZc9L@RH(TKVEY=nhC322_Q#Tvaq6*>Z1hz5#~}WQ>ZfnM%Ko>?w{i?U0Ye4K9FR zQQSUsE}sdtB;&_ik@vna1YPNnHHNsrp(ExMZpyBQu7R7w-xOumuN#DFf-1*%CJo+N zH{K*o(iJ8T-6w$Zo|)4M!LM{n*L6_KmjM9^Z5AGqGCY#`3R7eVm$D{vhBGm(#9JKe zS|9>f3qfA5*w3lZY?^=ov~rg#S?h(!>*Jwe$vD(%qq~{b#M~ZOX5*~b-&AVm7ZcxN ztnwQ%GpD4kR}mgspL_jFH{E6Xj@7;8${o!Fxf?)#o@Cs)r&S%*Zy2cO@rMzk);C|R5`|iHTMM(j*vaR;t^fk&sK--r+A!YEoz6FWDRmnoQaFbr@;768l zb#)JXRd`DpWAkkw%~^!NaSadzhkqDrnmJ|y!z@wZ0ymn#ViG6j2QR%mn1$2}6<5@2 zg%J&Y;kjr(qtl<*Fg1Pc$0EN=>zksjyEK_y%0PW=)?EYI;pNaFhuJ(h7M}EFfO<+1 zp?Anoj02AfpQ#=yRT*$A-l4Ml#6znUP;tP`mgzN&$fu?WUMH-Rb$u zYe}2d(p}g5nZqm9eaFc%GT$@I_Z)4VC{XWWMM8BNQJcT&ZES-%_1MJnyI~LGP1IZJ zp5eac2YnsY0m^Io&ET0@)J=~f*!m72pw{&TOU-bGF$KIudok$}9g!u|eZ!49Mrub58rRW};JJw6X71&DGnqV#=5 zW}beRa8utfuJf|eh9hL5#OY&RbMw$KuS&ViGGWjMMF{ zH}BT{fHev}btvQ*CWpkmks{nN#Pl)pIS5qOp;7NOu!+ziO1J9+xtYPiTpY@CQgZS` zGuzJevx_i|!@AA+aGsxvYzvt6rHh>+5p(4poefSH#*QYQNW->?H2t@?Wv(S!c>5MR ze*QTd!`1w4#dX~liw{Ca@Ph-!?;5!EmL!k-?UBZBX^(IlKIc145~Jqb+Ws1p)g{2b=9kF7F!TlfLj*1fwM9?ka zFwoIVwE+JlRyeK$oA8XDleFg0IMJz~eD9M9@oRQ$tz2V@XSZ6$NBDkIK!7JgjN^Wf z4Lqu7j*tksl+)*%~@{_5=y7> zINFQE`&1u|mN_2{L0b=Ctf$akaWS)+r0aWID58|ZEpBbQHo4Jz4y;vyY*yNJTjN+z9TCOn64ivvmTE!;;5k@DZ!g+9b&c~0+|U0 zx_K`+QGBx>f5!aCuE`;1ws0xrMVN%O(~HbchR|Sep*`V6feE>dchS?gN=LP0t z@i9X$N+#$|3)S66dj+_)*tV<$8)dF)@%JZc@EE%m#MfGMs9eT;#{Ek7q*0t)OP%9yCrB z1hT=|tnHqC^b!;BqCv*?$PhNf4BCE0199qAuPaU|K_D%;-mQHHUrvnf)#FX$3UDpT zEV99N9DPylxe)W$fxW$!_f~I=g9eM3PuOTW4gs;7n(6yL4M~dxE>%cSU0+GChv|zH z_2|a7>^U*#?EM4okQGc7jh%I!^NNmEW=AX|;C(tIQ2qpsEz0qOq>ydLf|KJ^Lxw%g zch`Zh^v4b=bMcCK-8u{@cPixpymWt!9s4{E3Jp1^j28>zpx23~-l4M{rQhcCT$_7Y zs6c1K-4gn;@|^7fFWURsH}#^EXkqwIzAC_9xyK#VF)@k$G4O}2Yg%RhDv4tiJND@1 Vz%E%>+RPtR`-cAYDh*rw-vJ}b2DbnJ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/heap.assets/min_heap_and_max_heap.png b/ru/docs/chapter_heap/heap.assets/min_heap_and_max_heap.png new file mode 100644 index 0000000000000000000000000000000000000000..5453eb58d47e0eea8fed6667d960975afe4dc58e GIT binary patch literal 18581 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/heap.md b/ru/docs/chapter_heap/heap.md new file mode 100644 index 000000000..fe28867f8 --- /dev/null +++ b/ru/docs/chapter_heap/heap.md @@ -0,0 +1,532 @@ +# Куча + +Куча (heap) - это полное двоичное дерево, удовлетворяющее определенным условиям. Основных типов кучи два, как показано на рисунке ниже. + +- Минимальная куча (min heap): значение любого узла $\leq$ значения его дочерних узлов. +- Максимальная куча (max heap): значение любого узла $\geq$ значения его дочерних узлов. + +![Минимальная куча и максимальная куча](heap.assets/min_heap_and_max_heap.png) + +Куча, являясь частным случаем полного двоичного дерева, обладает следующими свойствами. + +- Узлы самого нижнего уровня заполняются слева, а все остальные уровни заполнены полностью. +- Корневой узел двоичного дерева мы называем "вершиной кучи", а самый правый узел нижнего уровня - "основанием кучи". +- Для максимальной (минимальной) кучи значение элемента на вершине, то есть у корневого узла, является максимальным (минимальным). + +## Распространенные операции с кучей + +Нужно отметить, что многие языки программирования предоставляют не саму кучу, а очередь с приоритетом (priority queue) - абстрактную структуру данных, определяемую как очередь, в которой элементы извлекаются в соответствии с приоритетом. + +На практике **куча обычно используется для реализации очереди с приоритетом, а максимальная куча эквивалентна очереди с приоритетом, в которой элементы извлекаются по убыванию**. С точки зрения использования "очередь с приоритетом" и "куча" можно считать эквивалентными структурами данных. Поэтому в этой книге мы не будем специально различать их и в дальнейшем будем единообразно называть "кучей". + +Распространенные операции с кучей приведены в таблице ниже. Конкретные имена методов зависят от языка программирования. + +

      Таблица   Эффективность операций с кучей

      + +| Имя метода | Описание | Временная сложность | +| ----------- | ------------------------------------------------ | ------------------- | +| `push()` | Поместить элемент в кучу | $O(\log n)$ | +| `pop()` | Извлечь элемент с вершины кучи | $O(\log n)$ | +| `peek()` | Получить доступ к вершине кучи (для max / min кучи это соответственно максимум / минимум) | $O(1)$ | +| `size()` | Получить число элементов в куче | $O(1)$ | +| `isEmpty()` | Проверить, пуста ли куча | $O(1)$ | + +В реальных приложениях мы можем напрямую использовать классы кучи, предоставляемые языком программирования, или классы очереди с приоритетом. + +Подобно сортировкам "по возрастанию" и "по убыванию", мы можем переключаться между "минимальной кучей" и "максимальной кучей", изменяя `flag` или модифицируя `Comparator` . Код приведен ниже: + +=== "Python" + + ```python title="heap.py" + # Инициализация минимальной кучи + min_heap, flag = [], 1 + # Инициализация максимальной кучи + max_heap, flag = [], -1 + + # Модуль heapq в Python по умолчанию реализует минимальную кучу + # Если инвертировать знак элемента перед добавлением, то отношение порядка перевернется и так реализуется максимальная куча + # В этом примере flag = 1 соответствует минимальной куче, а flag = -1 - максимальной + + # Добавление элементов в кучу + heapq.heappush(max_heap, flag * 1) + heapq.heappush(max_heap, flag * 3) + heapq.heappush(max_heap, flag * 2) + heapq.heappush(max_heap, flag * 5) + heapq.heappush(max_heap, flag * 4) + + # Получение элемента на вершине кучи + peek: int = flag * max_heap[0] # 5 + + # Извлечение элемента с вершины кучи + # Извлеченные элементы образуют последовательность по убыванию + val = flag * heapq.heappop(max_heap) # 5 + val = flag * heapq.heappop(max_heap) # 4 + val = flag * heapq.heappop(max_heap) # 3 + val = flag * heapq.heappop(max_heap) # 2 + val = flag * heapq.heappop(max_heap) # 1 + + # Получение размера кучи + size: int = len(max_heap) + + # Проверка, пуста ли куча + is_empty: bool = not max_heap + + # Построение кучи из входного списка + min_heap: list[int] = [1, 3, 2, 5, 4] + heapq.heapify(min_heap) + ``` + +=== "C++" + + ```cpp title="heap.cpp" + /* Инициализация кучи */ + // Инициализация минимальной кучи + priority_queue, greater> minHeap; + // Инициализация максимальной кучи + priority_queue, less> maxHeap; + + /* Добавление элементов в кучу */ + maxHeap.push(1); + maxHeap.push(3); + maxHeap.push(2); + maxHeap.push(5); + maxHeap.push(4); + + /* Получение элемента на вершине кучи */ + int peek = maxHeap.top(); // 5 + + /* Извлечение элемента с вершины кучи */ + // Извлеченные элементы образуют последовательность по убыванию + maxHeap.pop(); // 5 + maxHeap.pop(); // 4 + maxHeap.pop(); // 3 + maxHeap.pop(); // 2 + maxHeap.pop(); // 1 + + /* Получение размера кучи */ + int size = maxHeap.size(); + + /* Проверка, пуста ли куча */ + bool isEmpty = maxHeap.empty(); + + /* Построение кучи из входного списка */ + vector input{1, 3, 2, 5, 4}; + priority_queue, greater> minHeap(input.begin(), input.end()); + ``` + +=== "Java" + + ```java title="heap.java" + /* Инициализация кучи */ + // Инициализация минимальной кучи + Queue minHeap = new PriorityQueue<>(); + // Инициализация максимальной кучи (достаточно изменить Comparator через lambda) + Queue maxHeap = new PriorityQueue<>((a, b) -> b - a); + + /* Добавление элементов в кучу */ + maxHeap.offer(1); + maxHeap.offer(3); + maxHeap.offer(2); + maxHeap.offer(5); + maxHeap.offer(4); + + /* Получение элемента на вершине кучи */ + int peek = maxHeap.peek(); // 5 + + /* Извлечение элемента с вершины кучи */ + // Извлеченные элементы образуют последовательность по убыванию + peek = maxHeap.poll(); // 5 + peek = maxHeap.poll(); // 4 + peek = maxHeap.poll(); // 3 + peek = maxHeap.poll(); // 2 + peek = maxHeap.poll(); // 1 + + /* Получение размера кучи */ + int size = maxHeap.size(); + + /* Проверка, пуста ли куча */ + boolean isEmpty = maxHeap.isEmpty(); + + /* Построение кучи из входного списка */ + minHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4)); + ``` + +=== "C#" + + ```csharp title="heap.cs" + /* Инициализация кучи */ + // Инициализация минимальной кучи + PriorityQueue minHeap = new(); + // Инициализация максимальной кучи (достаточно изменить Comparer через lambda) + PriorityQueue maxHeap = new(Comparer.Create((x, y) => y.CompareTo(x))); + + /* Добавление элементов в кучу */ + maxHeap.Enqueue(1, 1); + maxHeap.Enqueue(3, 3); + maxHeap.Enqueue(2, 2); + maxHeap.Enqueue(5, 5); + maxHeap.Enqueue(4, 4); + + /* Получение элемента на вершине кучи */ + int peek = maxHeap.Peek();//5 + + /* Извлечение элемента с вершины кучи */ + // Извлеченные элементы образуют последовательность по убыванию + peek = maxHeap.Dequeue(); // 5 + peek = maxHeap.Dequeue(); // 4 + peek = maxHeap.Dequeue(); // 3 + peek = maxHeap.Dequeue(); // 2 + peek = maxHeap.Dequeue(); // 1 + + /* Получение размера кучи */ + int size = maxHeap.Count; + + /* Проверка, пуста ли куча */ + bool isEmpty = maxHeap.Count == 0; + + /* Построение кучи из входного списка */ + minHeap = new PriorityQueue([(1, 1), (3, 3), (2, 2), (5, 5), (4, 4)]); + ``` + +=== "Go" + + ```go title="heap.go" + // В Go можно построить целочисленную максимальную кучу, реализовав heap.Interface + // Для реализации heap.Interface также нужно реализовать sort.Interface + type intHeap []any + + // Метод Push из heap.Interface, реализует добавление элемента в кучу + func (h *intHeap) Push(x any) { + // Push и Pop используют pointer receiver + // Потому что они не только изменяют содержимое среза, но и его длину + *h = append(*h, x.(int)) + } + + // Метод Pop из heap.Interface, реализует извлечение элемента с вершины кучи + func (h *intHeap) Pop() any { + // Извлекаемый элемент хранится в конце + last := (*h)[len(*h)-1] + *h = (*h)[:len(*h)-1] + return last + } + + // Метод Len из sort.Interface + func (h *intHeap) Len() int { + return len(*h) + } + + // Метод Less из sort.Interface + func (h *intHeap) Less(i, j int) bool { + // Для минимальной кучи здесь нужно заменить сравнение на < + return (*h)[i].(int) > (*h)[j].(int) + } + + // Метод Swap из sort.Interface + func (h *intHeap) Swap(i, j int) { + (*h)[i], (*h)[j] = (*h)[j], (*h)[i] + } + + // Top получает элемент на вершине кучи + func (h *intHeap) Top() any { + return (*h)[0] + } + + /* Driver Code */ + func TestHeap(t *testing.T) { + /* Инициализация кучи */ + // Инициализация максимальной кучи + maxHeap := &intHeap{} + heap.Init(maxHeap) + /* Добавление элементов в кучу */ + // Вызываем методы heap.Interface для добавления элементов + heap.Push(maxHeap, 1) + heap.Push(maxHeap, 3) + heap.Push(maxHeap, 2) + heap.Push(maxHeap, 4) + heap.Push(maxHeap, 5) + + /* Получение элемента на вершине кучи */ + top := maxHeap.Top() + fmt.Printf("Элемент на вершине кучи: %d\n", top) + + /* Извлечение элемента с вершины кучи */ + // Вызываем методы heap.Interface для удаления элементов + heap.Pop(maxHeap) // 5 + heap.Pop(maxHeap) // 4 + heap.Pop(maxHeap) // 3 + heap.Pop(maxHeap) // 2 + heap.Pop(maxHeap) // 1 + + /* Получение размера кучи */ + size := len(*maxHeap) + fmt.Printf("Число элементов в куче: %d\n", size) + + /* Проверка, пуста ли куча */ + isEmpty := len(*maxHeap) == 0 + fmt.Printf("Пуста ли куча: %t\n", isEmpty) + } + ``` + +=== "Swift" + + ```swift title="heap.swift" + /* Инициализация кучи */ + // Тип Heap в Swift поддерживает и max-heap, и min-heap, но требует swift-collections + var heap = Heap() + + /* Добавление элементов в кучу */ + heap.insert(1) + heap.insert(3) + heap.insert(2) + heap.insert(5) + heap.insert(4) + + /* Получение элемента на вершине кучи */ + var peek = heap.max()! + + /* Извлечение элемента с вершины кучи */ + peek = heap.removeMax() // 5 + peek = heap.removeMax() // 4 + peek = heap.removeMax() // 3 + peek = heap.removeMax() // 2 + peek = heap.removeMax() // 1 + + /* Получение размера кучи */ + let size = heap.count + + /* Проверка, пуста ли куча */ + let isEmpty = heap.isEmpty + + /* Построение кучи из входного списка */ + let heap2 = Heap([1, 3, 2, 5, 4]) + ``` + +=== "JS" + + ```javascript title="heap.js" + // В JavaScript нет встроенного класса Heap + ``` + +=== "TS" + + ```typescript title="heap.ts" + // В TypeScript нет встроенного класса Heap + ``` + +=== "Dart" + + ```dart title="heap.dart" + // В Dart нет встроенного класса Heap + ``` + +=== "Rust" + + ```rust title="heap.rs" + use std::collections::BinaryHeap; + use std::cmp::Reverse; + + /* Инициализация кучи */ + // Инициализация минимальной кучи + let mut min_heap = BinaryHeap::>::new(); + // Инициализация максимальной кучи + let mut max_heap = BinaryHeap::new(); + + /* Добавление элементов в кучу */ + max_heap.push(1); + max_heap.push(3); + max_heap.push(2); + max_heap.push(5); + max_heap.push(4); + + /* Получение элемента на вершине кучи */ + let peek = max_heap.peek().unwrap(); // 5 + + /* Извлечение элемента с вершины кучи */ + // Извлеченные элементы образуют последовательность по убыванию + let peek = max_heap.pop().unwrap(); // 5 + let peek = max_heap.pop().unwrap(); // 4 + let peek = max_heap.pop().unwrap(); // 3 + let peek = max_heap.pop().unwrap(); // 2 + let peek = max_heap.pop().unwrap(); // 1 + + /* Получение размера кучи */ + let size = max_heap.len(); + + /* Проверка, пуста ли куча */ + let is_empty = max_heap.is_empty(); + + /* Построение кучи из входного списка */ + let min_heap = BinaryHeap::from(vec![Reverse(1), Reverse(3), Reverse(2), Reverse(5), Reverse(4)]); + ``` + +=== "C" + + ```c title="heap.c" + // В C нет встроенного класса Heap + ``` + +=== "Kotlin" + + ```kotlin title="heap.kt" + /* Инициализация кучи */ + // Инициализация минимальной кучи + var minHeap = PriorityQueue() + // Инициализация максимальной кучи (достаточно изменить Comparator через lambda) + val maxHeap = PriorityQueue { a: Int, b: Int -> b - a } + + /* Добавление элементов в кучу */ + maxHeap.offer(1) + maxHeap.offer(3) + maxHeap.offer(2) + maxHeap.offer(5) + maxHeap.offer(4) + + /* Получение элемента на вершине кучи */ + var peek = maxHeap.peek() // 5 + + /* Извлечение элемента с вершины кучи */ + // Извлеченные элементы образуют последовательность по убыванию + peek = maxHeap.poll() // 5 + peek = maxHeap.poll() // 4 + peek = maxHeap.poll() // 3 + peek = maxHeap.poll() // 2 + peek = maxHeap.poll() // 1 + + /* Получение размера кучи */ + val size = maxHeap.size + + /* Проверка, пуста ли куча */ + val isEmpty = maxHeap.isEmpty() + + /* Построение кучи из входного списка */ + minHeap = PriorityQueue(mutableListOf(1, 3, 2, 5, 4)) + ``` + +=== "Ruby" + + ```ruby title="heap.rb" + # В Ruby нет встроенного класса Heap + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=import%20heapq%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20min-%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20min_heap%2C%20flag%20%3D%20%5B%5D%2C%201%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20max-%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20max_heap%2C%20flag%20%3D%20%5B%5D%2C%20-1%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%20heapq%20%D0%B2%20Python%20%D0%BF%D0%BE%20%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D1%83%D0%B5%D1%82%20min-%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%20%D0%BF%D0%BE%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC%20%D0%B2%20%D0%BA%D1%83%D1%87%D1%83%20%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D0%BE%D1%82%D1%80%D0%B8%D1%86%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%2C%20%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C%20%D0%BE%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0%20%D0%B8%20%D1%82%D0%B5%D0%BC%20%D1%81%D0%B0%D0%BC%D1%8B%D0%BC%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20max-%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20%23%20%D0%92%20%D1%8D%D1%82%D0%BE%D0%BC%20%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5%20flag%20%3D%201%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%20min-%D0%BA%D1%83%D1%87%D0%B5%2C%20%D0%B0%20flag%20%3D%20-1%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%20max-%D0%BA%D1%83%D1%87%D0%B5%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20heapq.heappush%28max_heap%2C%20flag%20%2A%201%29%0A%20%20%20%20heapq.heappush%28max_heap%2C%20flag%20%2A%203%29%0A%20%20%20%20heapq.heappush%28max_heap%2C%20flag%20%2A%202%29%0A%20%20%20%20heapq.heappush%28max_heap%2C%20flag%20%2A%205%29%0A%20%20%20%20heapq.heappush%28max_heap%2C%20flag%20%2A%204%29%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BA%D1%83%D1%87%D0%B8%0A%20%20%20%20peek%20%3D%20flag%20%2A%20max_heap%5B0%5D%20%23%205%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D0%BA%D1%83%D1%87%D0%B8%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%B8%D0%B7%20%D0%BA%D1%83%D1%87%D0%B8%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D1%83%D1%8E%D1%82%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%D0%BE%D1%82%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%D0%B3%D0%BE%20%D0%BA%20%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BC%D1%83%0A%20%20%20%20val%20%3D%20flag%20%2A%20heapq.heappop%28max_heap%29%20%23%205%0A%20%20%20%20val%20%3D%20flag%20%2A%20heapq.heappop%28max_heap%29%20%23%204%0A%20%20%20%20val%20%3D%20flag%20%2A%20heapq.heappop%28max_heap%29%20%23%203%0A%20%20%20%20val%20%3D%20flag%20%2A%20heapq.heappop%28max_heap%29%20%23%202%0A%20%20%20%20val%20%3D%20flag%20%2A%20heapq.heappop%28max_heap%29%20%23%201%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%BA%D1%83%D1%87%D0%B8%0A%20%20%20%20size%20%3D%20len%28max_heap%29%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C%2C%20%D0%BF%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%BA%D1%83%D1%87%D0%B0%0A%20%20%20%20is_empty%20%3D%20not%20max_heap%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%92%D1%85%D0%BE%D0%B4%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%D0%B8%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BA%D1%83%D1%87%D0%B8%0A%20%20%20%20min_heap%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20heapq.heapify%28min_heap%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +## Реализация кучи + +Ниже реализуется максимальная куча. Чтобы преобразовать ее в минимальную кучу, достаточно инвертировать всю логику сравнений по величине, например заменить $\geq$ на $\leq$ . Заинтересованные читатели могут попробовать реализовать это самостоятельно. + +### Хранение и представление кучи + +В разделе "Двоичные деревья" мы уже говорили, что полное двоичное дерево очень удобно представлять массивом. Поскольку куча как раз и является полным двоичным деревом, **для хранения кучи мы также будем использовать массив**. + +Когда двоичное дерево представляется массивом, элементы массива соответствуют значениям узлов, а индексы - положениям этих узлов в двоичном дереве. **Указатели на узлы реализуются через формулы отображения индексов**. + +Как показано на рисунке ниже, для заданного индекса $i$ индекс левого дочернего узла равен $2i + 1$ , правого дочернего узла - $2i + 2$ , а родительского узла - $(i - 1) / 2$ с округлением вниз. Если индекс выходит за допустимые границы, это означает пустой узел или отсутствие узла. + +![Представление и хранение кучи](heap.assets/representation_of_heap.png) + +Мы можем инкапсулировать формулы отображения индексов в функции, чтобы потом было удобнее ими пользоваться: + +```src +[file]{my_heap}-[class]{max_heap}-[func]{parent} +``` + +### Доступ к элементу на вершине кучи + +Элемент на вершине кучи - это корневой узел двоичного дерева, то есть первый элемент списка: + +```src +[file]{my_heap}-[class]{max_heap}-[func]{peek} +``` + +### Добавление элемента в кучу + +Пусть дан элемент `val` . Сначала мы помещаем его в основание кучи. После добавления свойства кучи могут нарушиться, потому что `val` может оказаться больше, чем другие элементы в куче. **Поэтому необходимо восстановить порядок на пути от вставленного узла к корню** ; эта операция называется heapify, то есть упорядочиванием кучи. + +Рассмотрим ситуацию, когда упорядочивание выполняется **снизу вверх**, начиная от только что вставленного узла. Как показано на рисунках ниже, мы сравниваем значение вставленного узла со значением его родителя; если вставленный узел больше, то меняем их местами. Затем продолжаем выполнять ту же операцию и последовательно восстанавливать корректность всех узлов по пути снизу вверх, пока не выйдем за корень или не встретим узел, для которого обмен не требуется. + +=== "<1>" + ![Шаги добавления элемента в кучу](heap.assets/heap_push_step1.png) + +=== "<2>" + ![heap_push_step2](heap.assets/heap_push_step2.png) + +=== "<3>" + ![heap_push_step3](heap.assets/heap_push_step3.png) + +=== "<4>" + ![heap_push_step4](heap.assets/heap_push_step4.png) + +=== "<5>" + ![heap_push_step5](heap.assets/heap_push_step5.png) + +=== "<6>" + ![heap_push_step6](heap.assets/heap_push_step6.png) + +=== "<7>" + ![heap_push_step7](heap.assets/heap_push_step7.png) + +=== "<8>" + ![heap_push_step8](heap.assets/heap_push_step8.png) + +=== "<9>" + ![heap_push_step9](heap.assets/heap_push_step9.png) + +Пусть общее число узлов равно $n$ , тогда высота дерева равна $O(\log n)$ . Следовательно, максимальное число итераций операции heapify тоже не превышает $O(\log n)$ . Отсюда **временная сложность добавления элемента в кучу равна $O(\log n)$** . Код приведен ниже: + +```src +[file]{my_heap}-[class]{max_heap}-[func]{sift_up} +``` + +### Извлечение элемента с вершины кучи + +Элемент на вершине кучи - это корневой узел двоичного дерева, то есть первый элемент списка. Если просто удалить первый элемент списка, то индексы всех узлов двоичного дерева изменятся, и это сильно затруднит последующее восстановление структуры при помощи heapify. Чтобы по возможности минимизировать изменение индексов элементов, мы используем следующий порядок действий. + +1. Поменять местами элемент на вершине кучи и элемент у основания кучи, то есть поменять корневой узел с самым правым листовым узлом. +2. После обмена удалить основание кучи из списка. Обрати внимание: поскольку обмен уже выполнен, фактически удаляется исходный элемент вершины кучи. +3. Начиная от корневого узла, **выполнить heapify сверху вниз**. + +Как показано на рисунках ниже, **направление операции "heapify сверху вниз" противоположно операции "heapify снизу вверх"**. Мы сравниваем значение корневого узла со значениями двух дочерних узлов, выбираем больший дочерний узел и меняем его местами с корневым узлом. Затем циклически повторяем ту же операцию, пока не выйдем за листовой узел или не встретим узел, который уже не требует обмена. + +=== "<1>" + ![Шаги извлечения элемента с вершины кучи](heap.assets/heap_pop_step1.png) + +=== "<2>" + ![heap_pop_step2](heap.assets/heap_pop_step2.png) + +=== "<3>" + ![heap_pop_step3](heap.assets/heap_pop_step3.png) + +=== "<4>" + ![heap_pop_step4](heap.assets/heap_pop_step4.png) + +=== "<5>" + ![heap_pop_step5](heap.assets/heap_pop_step5.png) + +=== "<6>" + ![heap_pop_step6](heap.assets/heap_pop_step6.png) + +=== "<7>" + ![heap_pop_step7](heap.assets/heap_pop_step7.png) + +=== "<8>" + ![heap_pop_step8](heap.assets/heap_pop_step8.png) + +=== "<9>" + ![heap_pop_step9](heap.assets/heap_pop_step9.png) + +=== "<10>" + ![heap_pop_step10](heap.assets/heap_pop_step10.png) + +Как и операция добавления в кучу, операция извлечения элемента с вершины кучи также имеет временную сложность $O(\log n)$ . Код приведен ниже: + +```src +[file]{my_heap}-[class]{max_heap}-[func]{sift_down} +``` + +## Типичные применения кучи + +- **Очередь с приоритетом**: куча обычно является предпочтительной структурой данных для реализации очереди с приоритетом; добавление и извлечение элементов имеют временную сложность $O(\log n)$ , а построение кучи - $O(n)$ , и все эти операции выполняются очень эффективно. +- **Пирамидальная сортировка**: для заданного набора данных можно построить кучу, а затем непрерывно извлекать из нее элементы, получая отсортированные данные. Однако на практике мы обычно используем более изящную реализацию пирамидальной сортировки; подробности см. в разделе "Пирамидальная сортировка". +- **Получение наибольших $k$ элементов**: это классическая алгоритмическая задача и одновременно типичное применение кучи. Например, выбор 10 самых горячих новостей для списка популярных тем или выбор 10 самых продаваемых товаров. diff --git a/ru/docs/chapter_heap/index.md b/ru/docs/chapter_heap/index.md new file mode 100644 index 000000000..7bd9f1699 --- /dev/null +++ b/ru/docs/chapter_heap/index.md @@ -0,0 +1,9 @@ +# Куча + +![Куча](../assets/covers/chapter_heap.jpg) + +!!! abstract + + Куча похожа на горные вершины: ярусные, волнистые и самые разные по форме. + + Каждая вершина имеет свою высоту, но самая высокая всегда бросается в глаза первой. diff --git a/ru/docs/chapter_heap/summary.md b/ru/docs/chapter_heap/summary.md new file mode 100644 index 000000000..0e4dd33f3 --- /dev/null +++ b/ru/docs/chapter_heap/summary.md @@ -0,0 +1,17 @@ +# Краткие итоги + +### Основные моменты + +- Куча представляет собой полное двоичное дерево и делится на максимальную кучу и минимальную кучу. Элемент на вершине максимальной (минимальной) кучи является наибольшим (наименьшим). +- Очередь с приоритетом определяется как очередь, элементы которой извлекаются в соответствии с приоритетом; обычно ее реализуют с помощью кучи. +- К основным операциям кучи и их временным сложностям относятся: добавление элемента в кучу $O(\log n)$ , извлечение элемента с вершины кучи $O(\log n)$ и доступ к вершине кучи $O(1)$ . +- Полное двоичное дерево очень удобно представлять массивом, поэтому кучу обычно тоже хранят в массиве. +- Операция упорядочивания кучи используется для поддержания свойств кучи и применяется как при добавлении элемента, так и при извлечении элемента. +- Временную сложность построения кучи из $n$ элементов можно оптимизировать до $O(n)$ , что очень эффективно. +- Top-k - это классическая алгоритмическая задача, которую можно эффективно решать с помощью кучи за $O(n \log k)$ . + +### Q & A + +**Q**: Является ли "куча" как структура данных тем же самым понятием, что и "куча" в управлении памятью? + +Это не одно и то же, просто у них случайно совпало название. Куча в памяти компьютерной системы является частью динамического распределения памяти: во время выполнения программы она используется для хранения данных. Программа может запросить определенный объем памяти в куче для хранения сложных структур, таких как объекты и массивы. Когда эти данные больше не нужны, память нужно освободить, чтобы не допустить утечек. По сравнению со стековой памятью управление памятью в куче требует большей осторожности, а неправильное использование может привести к утечкам памяти, висячим указателям и другим проблемам. diff --git a/ru/docs/chapter_heap/top_k.assets/top_k_heap_step1.png b/ru/docs/chapter_heap/top_k.assets/top_k_heap_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..4c65da3e65754933be2676d17643ae7ecea3b743 GIT binary patch literal 11528 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 MqjtMQ9vk#O0Jx?Nz5oCK literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/top_k.assets/top_k_heap_step2.png b/ru/docs/chapter_heap/top_k.assets/top_k_heap_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..3e48b96435a60c79dcf8ef36fef0ee44065b12f0 GIT binary patch literal 13248 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 B3(^1p literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/top_k.assets/top_k_heap_step3.png b/ru/docs/chapter_heap/top_k.assets/top_k_heap_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..a8ad575920f97bce51fcf10ba37bda49c01c6121 GIT binary patch literal 14349 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/top_k.assets/top_k_heap_step4.png b/ru/docs/chapter_heap/top_k.assets/top_k_heap_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..2539c08eebe74ad858919b1ecd77f7c98be7fcab GIT binary patch literal 17151 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

      Yhy<{8X$5}_yP!EDgTWc5W!q`<&aw| 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%0D5wz>dZ{3mM-K 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

      + +Появление компьютеров радикально изменило мир. Благодаря высокой вычислительной скорости и отличной программируемости они стали идеальной средой для исполнения алгоритмов и обработки данных. Реалистичная графика в играх, интеллектуальные решения в автономном вождении, впечатляющие партии AlphaGo и естественное взаимодействие ChatGPT: все это изящные проявления алгоритмов на компьютере. + +На самом деле еще до появления компьютеров алгоритмы и структуры данных уже существовали во всех уголках мира. Ранние алгоритмы были сравнительно простыми: например, древние способы счета или последовательности действий при изготовлении инструментов. По мере развития цивилизации алгоритмы становились тоньше и сложнее. За мастерством ремесленников, промышленными продуктами, освобождающими производительные силы, и даже за научными законами движения Вселенной почти всегда стоит изобретательная алгоритмическая мысль. + +Точно так же структуры данных встречаются повсюду: от социальных сетей до схем метро многие системы можно моделировать как "граф"; от государства до семьи основные формы общественной организации обладают свойствами "дерева"; зимняя одежда похожа на "стек", где то, что надевают первым, снимают последним; тубус для бадминтонных воланов похож на "очередь", где элементы добавляются с одного конца и извлекаются с другого; словарь похож на "хеш-таблицу", позволяющую быстро находить нужную статью. + +Эта книга стремится с помощью понятных анимированных иллюстраций и исполняемых примеров кода помочь читателю понять ключевые идеи алгоритмов и структур данных и научиться реализовывать их программно. На этой основе книга также пытается показать живые проявления алгоритмов в сложном мире и раскрыть их красоту. Надеюсь, она окажется для тебя полезной. diff --git a/ru/docs/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step1.png b/ru/docs/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..d3ff211c417fc7ed389a8edbfe5edbce3ce05224 GIT binary patch literal 7878 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 KRLM)@p#K8w>_Qd* literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step2.png b/ru/docs/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..517a5d592ee6d1a934afc66aa1bb84741494a519 GIT binary patch literal 13020 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%0DG>FW*7is>RMAvMJ$-_nq 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 ACjbBd literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step4.png b/ru/docs/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..0a9c71b841d6e2718eec296965f35cbe10039a49 GIT binary patch literal 11992 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step5.png b/ru/docs/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step5.png new file mode 100644 index 0000000000000000000000000000000000000000..d056fb7465c2b49962c4e1c5cd44d677ff9e49ef GIT binary patch literal 10427 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_introduction/algorithms_are_everywhere.assets/playing_cards_sorting.png b/ru/docs/chapter_introduction/algorithms_are_everywhere.assets/playing_cards_sorting.png new file mode 100644 index 0000000000000000000000000000000000000000..b16b05d2de38ad612465cbde80cecd451df3e752 GIT binary patch literal 51137 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

      ;cAi<{w$~XvS3J?8g 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 s8uq6--?iR" + ![Процесс поиска в словаре](algorithms_are_everywhere.assets/binary_search_dictionary_step1.png) + +=== "<2>" + ![Бинарный поиск в словаре, шаг 2](algorithms_are_everywhere.assets/binary_search_dictionary_step2.png) + +=== "<3>" + ![Бинарный поиск в словаре, шаг 3](algorithms_are_everywhere.assets/binary_search_dictionary_step3.png) + +=== "<4>" + ![Бинарный поиск в словаре, шаг 4](algorithms_are_everywhere.assets/binary_search_dictionary_step4.png) + +=== "<5>" + ![Бинарный поиск в словаре, шаг 5](algorithms_are_everywhere.assets/binary_search_dictionary_step5.png) + +Поиск в словаре, обязательный навык для школьников, на самом деле и есть знаменитый алгоритм "двоичного поиска". С точки зрения структур данных словарь можно рассматривать как отсортированный "массив"; с точки зрения алгоритмов последовательность действий при поиске слова в словаре можно считать алгоритмом "двоичного поиска". + +**Пример 2: упорядочивание карт**. Во время игры в карты нам нужно раскладывать карты в руке по возрастанию; процесс выглядит так, как показано ниже. + +1. Раздели карты на "упорядоченную" и "неупорядоченную" части и предположи, что в начальный момент самая левая карта уже стоит на правильном месте. +2. Возьми одну карту из неупорядоченной части и вставь ее в правильную позицию внутри упорядоченной части; после этого две самые левые карты уже будут упорядочены. +3. Повторяй шаг `2.` , каждый раз перенося одну карту из неупорядоченной части в упорядоченную, пока все карты не окажутся в порядке. + +![Процесс сортировки колоды карт](algorithms_are_everywhere.assets/playing_cards_sorting.png) + +Описанный выше способ раскладывать карты по сути является алгоритмом "сортировки вставками", который очень эффективен на небольших наборах данных. Во многих языках программирования во встроенных функциях сортировки тоже можно увидеть этот алгоритм. + +**Пример 3: выдача сдачи**. Предположим, в супермаркете мы купили товар на $69$ и дали кассиру $100$, поэтому он должен вернуть нам $31$ сдачи. Этот процесс можно наглядно представить так, как показано на рисунке ниже. + +1. Доступные варианты - это купюры достоинством меньше $31$, например $1$, $5$, $10$ и $20$. +2. Возьми самую большую купюру из доступных, то есть $20$, тогда останется $31 - 20 = 11$. +3. Возьми самую большую купюру из оставшихся, то есть $10$, тогда останется $11 - 10 = 1$. +4. Возьми самую большую купюру из оставшихся, то есть $1$, тогда останется $1 - 1 = 0$. +5. Выдача сдачи завершена, итоговая комбинация: $20 + 10 + 1 = 31$. + +![Процесс выдачи сдачи](algorithms_are_everywhere.assets/greedy_change.png) + +В описанных шагах на каждом этапе выбирается наилучший вариант из доступных в текущий момент, то есть используется купюра наибольшего номинала; в результате получается рабочая схема выдачи сдачи. С точки зрения структур данных и алгоритмов такой подход называется "жадным" алгоритмом. + +От приготовления еды до межзвездных путешествий почти любое решение задачи связано с алгоритмами. Появление компьютеров позволило нам хранить структуры данных в памяти и писать код, который вызывает CPU и GPU для выполнения алгоритмов. Благодаря этому мы можем переносить реальные задачи в компьютер и решать самые разные сложные проблемы более эффективно. + +!!! tip + + Если ты все еще смутно представляешь себе такие понятия, как структуры данных, алгоритмы, массивы и двоичный поиск, просто продолжай читать. Эта книга постепенно введет тебя в мир понимания структур данных и алгоритмов. diff --git a/ru/docs/chapter_introduction/index.md b/ru/docs/chapter_introduction/index.md new file mode 100644 index 000000000..0690c3b3b --- /dev/null +++ b/ru/docs/chapter_introduction/index.md @@ -0,0 +1,9 @@ +# Введение в алгоритмы + +![Введение в алгоритмы](../assets/covers/chapter_introduction.jpg) + +!!! abstract + + Юная девушка легко кружится в танце среди данных, а подол ее платья струится мелодией алгоритмов. + + Она приглашает тебя присоединиться к танцу: следуй за ее шагами и войди в мир алгоритмов, полный логики и красоты. diff --git a/ru/docs/chapter_introduction/summary.md b/ru/docs/chapter_introduction/summary.md new file mode 100644 index 000000000..1283c7ac4 --- /dev/null +++ b/ru/docs/chapter_introduction/summary.md @@ -0,0 +1,24 @@ +# Резюме + +### Ключевые выводы + +- Алгоритмы повсюду встречаются в повседневной жизни и вовсе не являются чем-то далеким и эзотерическим. На деле мы уже давно незаметно для себя освоили множество алгоритмов и используем их для решения самых разных жизненных задач. +- Принцип поиска в словаре соответствует алгоритму двоичного поиска. Двоичный поиск воплощает важную алгоритмическую идею "разделяй и властвуй". +- Процесс раскладывания карт очень похож на алгоритм сортировки вставками. Сортировка вставками подходит для упорядочивания небольших наборов данных. +- Выдача сдачи по шагам по своей сути является жадным алгоритмом, в котором на каждом этапе выбирается лучшее решение в текущей ситуации. +- Алгоритм - это набор инструкций или шагов, который решает конкретную задачу за конечное время, а структура данных - это способ, которым компьютер организует и хранит данные. +- Структуры данных и алгоритмы тесно связаны. Структуры данных являются основой алгоритмов, а алгоритмы оживляют структуры данных. +- Структуры данных и алгоритмы можно сравнить со сборкой конструктора: детали представляют данные, форма деталей и способ их соединения представляют структуру данных, а шаги сборки соответствуют алгоритму. + +### Q & A + +**Q**: Я программист и в повседневной работе никогда не решал задачи "алгоритмами": распространенные алгоритмы уже инкапсулированы в языках программирования, и ими можно пользоваться напрямую. Значит ли это, что рабочие задачи еще не дошли до уровня, где действительно нужны алгоритмы? + +Если сравнить конкретные рабочие навыки с "приемами" в боевых искусствах, то фундаментальные дисциплины скорее напоминают "внутреннюю силу". + +Я считаю, что смысл изучения алгоритмов (и других фундаментальных дисциплин) не в том, чтобы каждый раз реализовывать их с нуля в работе, а в том, чтобы, опираясь на полученные знания, уметь профессионально реагировать и принимать решения при решении задач, тем самым повышая общее качество работы. Вот простой пример: в каждом языке программирования есть встроенная функция сортировки. + +- Если мы не изучали структуры данных и алгоритмы, то для любых данных, скорее всего, просто отдали бы их этой функции сортировки. Все работает гладко, производительность хорошая, и на первый взгляд никаких проблем нет. +- Но если мы изучали алгоритмы, то знаем, что временная сложность встроенной сортировки равна $O(n \log n)$ ; однако если данные состоят из целых чисел фиксированной разрядности (например, номеров студентов), можно воспользоваться более эффективной "поразрядной сортировкой", снизив сложность до $O(nk)$ , где $k$ - число разрядов. Когда объем данных очень велик, сэкономленное время выполнения может принести заметную пользу, например снизить издержки и улучшить пользовательский опыт. + +В инженерной практике огромное количество задач трудно довести до оптимального решения, и многие из них решаются лишь "примерно". Сложность задачи зависит, с одной стороны, от ее собственной природы, а с другой - от запаса знаний человека, который на нее смотрит. Чем полнее знания и чем больше опыт, тем глубже получается анализ задачи и тем изящнее ее можно решить. diff --git a/ru/docs/chapter_introduction/what_is_dsa.assets/assembling_blocks.png b/ru/docs/chapter_introduction/what_is_dsa.assets/assembling_blocks.png new file mode 100644 index 0000000000000000000000000000000000000000..6059ee7ccfe993a9ab59ea4c1c5f57379c4ce965 GIT binary patch literal 417130 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

      KmIwMH=A@yd;r?+ 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

      a|8$0-^y311+YpE$^0OOa(1Xh; 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 ZgWb|q{WK(2j_j|9tc=o&(r0kr{{YC^itPXZ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_introduction/what_is_dsa.md b/ru/docs/chapter_introduction/what_is_dsa.md new file mode 100644 index 000000000..168bf1803 --- /dev/null +++ b/ru/docs/chapter_introduction/what_is_dsa.md @@ -0,0 +1,53 @@ +# Что такое алгоритм + +## Определение алгоритма + +Алгоритм (algorithm) - это набор инструкций или шагов, который решает конкретную задачу за конечное время. Он обладает следующими свойствами. + +- Задача четко определена и имеет ясные определения входных и выходных данных. +- Алгоритм осуществим и может быть выполнен за конечное число шагов, времени и памяти. +- Каждый шаг имеет однозначный смысл, и при одинаковых входных данных и условиях выполнения результат всегда будет одинаковым. + +## Определение структуры данных + +Структура данных (data structure) - это способ организации и хранения данных, охватывающий само содержимое данных, связи между данными и методы работы с ними. У нее есть следующие цели проектирования. + +- Занимать как можно меньше места, чтобы экономить память компьютера. +- Выполнять операции над данными как можно быстрее, включая доступ, добавление, удаление, обновление и т. д. +- Предоставлять компактное представление данных и логическую информацию, чтобы алгоритмы могли работать эффективно. + +**Проектирование структур данных - это процесс, полный компромиссов**. Если мы хотим улучшить что-то одно, то часто вынуждены уступить в чем-то другом. Ниже приведены два примера. + +- По сравнению с массивами связные списки удобнее для добавления и удаления данных, но жертвуют скоростью доступа к ним. +- По сравнению со связными списками графы предоставляют более богатую логическую информацию, но требуют большего объема памяти. + +## Связь между структурами данных и алгоритмами + +Как показано на рисунке ниже, структуры данных и алгоритмы тесно связаны и сильно зависят друг от друга; это проявляется в следующих трех аспектах. + +- Структуры данных служат фундаментом алгоритмов. Они дают алгоритмам структурированный способ хранения данных и методы работы с ними. +- Алгоритмы оживляют структуры данных. Сами по себе структуры данных лишь хранят информацию, а в сочетании с алгоритмами позволяют решать конкретные задачи. +- Алгоритмы обычно можно реализовать на основе разных структур данных, но эффективность выполнения может сильно различаться, поэтому выбор подходящей структуры данных является ключевым. + +![Связь между структурами данных и алгоритмами](what_is_dsa.assets/relationship_between_data_structure_and_algorithm.png) + +Структуры данных и алгоритмы похожи на сборку конструктора, показанную на рисунке ниже. В набор конструктора, помимо множества деталей, входит и подробная инструкция по сборке. Если шаг за шагом следовать этой инструкции, можно собрать красивую модель. + +![Сборка конструктора](what_is_dsa.assets/assembling_blocks.png) + +Подробное соответствие между ними показано в таблице ниже. + +

      Таблица   Сравнение структур данных и алгоритмов со сборкой конструктора

      + +| Структуры данных и алгоритмы | Сборка конструктора | +| ---------------------------- | ------------------------------------------ | +| Входные данные | Несобранные детали конструктора | +| Структура данных | Организация деталей: форма, размер, способ соединения и т. д. | +| Алгоритм | Последовательность шагов по сборке деталей в целевую форму | +| Выходные данные | Собранная модель конструктора | + +Стоит отметить, что структуры данных и алгоритмы не зависят от конкретного языка программирования. Именно поэтому эта книга может давать реализации на разных языках программирования. + +!!! tip "Принятое сокращение" + + В реальных обсуждениях мы обычно сокращаем выражение "структуры данных и алгоритмы" до просто "алгоритмы". Например, хорошо известные алгоритмические задачи LeetCode на деле одновременно проверяют знания и по структурам данных, и по алгоритмам. diff --git a/ru/docs/chapter_preface/about_the_book.assets/hello_algo_mindmap.png b/ru/docs/chapter_preface/about_the_book.assets/hello_algo_mindmap.png new file mode 100644 index 0000000000000000000000000000000000000000..cc061a0b0f3297ed2423f07ce51eb7f22db181dd GIT binary patch literal 157698 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
      5LfA5#l37ZyH+Vs-J$PyDG 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 tIeq-Y0-+XI5eq@->v0$*$QjYV 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 TP5NEb00000NkvXXu0mjf>^1Fl literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_preface/suggestions.assets/learning_route.png b/ru/docs/chapter_preface/suggestions.assets/learning_route.png new file mode 100644 index 0000000000000000000000000000000000000000..4ff7a3d0124da9609af50a0e429ed7b40fc14001 GIT binary patch literal 17172 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 Kneu05A^!)-Pn($l literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_preface/suggestions.assets/pythontutor_example.png b/ru/docs/chapter_preface/suggestions.assets/pythontutor_example.png new file mode 100644 index 0000000000000000000000000000000000000000..c76de89f0a1131067800843e2a10d09a98b8d948 GIT binary patch literal 74149 zcma%BRahKNu$^7p-95MjcU@e9Lm&`>1$TE@91<)LGna$j#h z%yfTK(^Yl8Q`J*F9i^@+kAX^x3IG6xqJoSj03iJ9f)9}4{@p%Fp;Y}FJgX~f%l;ew zKbwJp!NI}7KVd8^ECmIH*x1;Ao%s0psHi9z8JVi8DnCEJ*VosLjg6DzED~zSHBAv(wXyi_5F4tBdn+6tRk=^9vq)L) zraorqZ*A58X#deYG(Nk!|7+xzakkOn)yv7j$(JwQ4Gjq~jnS{Ke-~C4evkb=yL}m+ z8w#urJi58@jB2l6m`)$<`{?qkWNKu5Z^Np#{Ihp`bZ?tO@Nd7?`mXgQHOsR8iS3fU zV$fx)* z@GI)*p6l-X+o{!DI=Ohby1%Mfl-t#ntvmBa*e82*w5YnVV|BTXA}{XD*KLoF*~&`8 zrn^Boya6XNL|hUaeg%SHCLiTk8P@A3US4hbmH+Lj$fFvPb=HUnY|3V?8tn%`CY# zss0g~)J;=W3qU|&z{I5{C44I)^^Vu%TEWbz%(V2UQG2{~hra^=q7+kW zhEiiAsJ}jQw86j2t%}ASSUSHy*G@zX|EYP0VTI#EM7v1MwdtBzj-9lnJ{RH7t| zzuRjaS~I;MQ~~F4?POcOi^i0Y-HW7UX4Z06H7}*>v_fRAx+H`|ie_yqe~n=nby4S6 z-$oYUG1}slOtRggON`r2yJeIj6jH1o_&MnAo2x*~1 z^{X<@NJKW5g`-YK2ppXk$>(8AWN>n9N6x`2O<(F;D{M{J)@@b(jZffk%CfM633g;I zrzi?sfz+aT1rDp0I(*dE`Rf-XTZq$Uo&^te>#5N;cpU^|exCvxZpTt!<&sr3nZ>JMhJuZdni=^p5Oa{ngljAQ;@^ouSB zOJtsIX9zOoHA}Fith#pVz?VA)5`jtg3LN+6b^ogU;nw^~3oIiei^&NSXHR&e$-AQ{ zFC*nQu&Ebm(7^(-2l0ZDPx6tTv`v^5>~4cTdt?SVm>Ryl%-GtG5LLYdr1j`{Kt}^9 zdH?S543v#s_OzvF2Jzjys2`Hnz>-GGB`8Zqvd6@KSKx<|?u5=fx?ME*aWG6s-4J2l zseG^E8+DFpd~om^)DxCFCYYjDQ66X#g;Ue`s6zpYTlTzPrmOaj|0b(7;Mqs8dF%OZ zXXHm*E(0^*vb%!;eY_=y3_nOgO*iqWRsCd~~^&z$Nl$7}eck!|M(_gJ=;Cz&d zO!QMN%MfV@QZ9ijcn*I^r@g)+`{=d=kq#OB%OGeyJ)8y73*ASBm6QVZWX}*qH;?18nDYQIVEisol;O z8&B)qb$;mJ3y-`=@O_aE`H6cD0vg%ZF?@W`g1P-j9`)Vkst7(lexM{WDE)YO{3Blh z5H_rd>J+@uVXcJ=N;X2tvhj#Spyu||AnO8S-+Rg8thHN?ot(A=9u@{YBeZxN^%T~? zV|!la#`+MU>tG%U#_E(`OFjM??30CaCG)4a^kt#1Gj$K#v?6HGouxYA%pq`{H3Vd# zVeS!#NWzWyyusASLj-P_iw#aP(8+Z4)EXe85S25M6|&fX3tI7~Z4${xK3f?g;y80Y zM7&vSM)E{x8(+o>-b{IzAs1+FCbjhd-MPB$RY)5d?LH+kmRY8_SC)awj>S9b3ug&E zI7*~gFJfLUbM--lA@?G7`Uv?sIj~6hJ(48vH6>8q(3Y%|U6UItbh1V(kq>tE%(~@Y zJU?@0yH!)5x2?9PaAzl@*@d$tw#=bNBXHA52q&tPSS+3E~T9B z$6%4q@{=l6ba&GG2vz%oIlZc>Pgb2^vIW$iGl1@49ijquXgPq>zeNik{zt3t&=G_j z{G7L44J#7<4>Zx?-QC@4q1WYQR1*HJEIyjhx16G!*g(G;q?{BXf=rI58w=0BZ<6+p;1^t`_s9K!+$rpDJMQvemVAnG8bCV`bBddctb zh_CPjgQ?{vG@%u&FvTc<(X#L`*R~Mmw5GOB%pi%~Gv|fCkM^FSGAKzFh7TS_2Khj+ z;mG;&x@RCoH!;$c*Dy%T(4pnIEzDqE5AvGbIq5oaAM@Lv=N`*0@Cj~QZt=CcH#1|D z;*MDp4V&aKg1SQ+ik^7_m~uLM5dW@PbUcRLAuV)lNUOg)?wI0EwjDhe3?f4!=nk#J zr>sOJhw6ZbdC|^pb)i{VJm#||8!{yQT0Q(e37t*Dr6Qd4A4gsOOb9AqDmA-Ui0WI& zpE`08cK%j~8lz#1!dh1@H1n7e%|H>{{mEFs6=S_*dZgFTKjrTyIpD(8oF_WkEYQI7 z+02fiO)58sXIuT}?(oDzOC@));1__gADmHW0DiSX*sCM^iO`>$))3o!bFqb>d<)dgR*p{kE zxisP8HCy4A+&=)Ts}O&VH}a_O3;8+iuATP``iw$1)_#XA|40Fvyz+W~ zFAY_oEjIX4q7F`fI!P;Q+`1)RBB;+Il2~tWsom#N^W1s=kPJd)Vhrtz8EFe=zhGzR z>7yKmlc-EJ1#VB^z4&v#~#=)+jthwMUQU z4xd;x_$E84e>39VFEQ@}Y0lR7rr+-nu9*r7F+Qjt=JgdP*w*nBkUA5vF7PF^r6-!! z?p{}pe;WSLBc?^co50o`?e=khd7p!D{_Y!vtdujSHtJ`NiOFjhxD2iz$t>)VAmu#8 ztlda~3tSDM$-xU?12byZZe*WNB)?Sb`vn+~%J^;;Qhc@aW3&-b(0k9jLb-jKwBX&I zvLpXFhWbG%Rt3UQ#%SUUg>M#zz$4wy0vq>V33>}(>89CHkm%P|uj9xL)L&)O`B>Y` zGpmi!Hp;JaWMfYn?%MdOxs#tX^xs7w&aE+*Iv)-?L)tvAkIH7Nj6SuJ@zUub6R-V& zl~AvKhW@PxY8SLYAeI^i<-wQgxkTj%3U zX=*uxkA@~&qPz8b{?oMl?-H}tGIJ9NA}kq3nG!#5&_c8*G7T6%er_9)xB9*Hl4_UT!M*S60^Y}r?R>GW5i?I{+@<_nU%jJ$9*|2R zP-{3VQ^!u}LHSx5xTGHO;P|)8igSY09q|ZKbRvS^cqG-d3eWrS65m=LI1gO=5>a;e z+;3bz7&u|Hjv`^4$+Na$o5{z$iBU8P>^YBN%Km@ZvFFQE(P zWxiCAu-?>7sKkcM3j2paS-m>dFrru_43nX@IGqPE_!;#~^4K1s*l!+)k*_jr^Sj@= zUUnakx4N+;rLM0j7CSS<8c(x1zz>*%Q`T1aVNho03snkxJKgMH|AG99tumjKxyXrO zQ{ASZIl4FHq5!#_Zj^U)sF0+^Vx)Pbl4O=LS__@*kfZO~!NGjh{s&fULefMJmS+mu zM7UwTtlSR`_rd)bjReqog< zB7onk2BW(dOO%CpFgYpqS&=(FahEN2Ul%Y5?}2bx2!Fa5O~SRhJ}wpLau{(`6>9^> zQ)-+r#{~q+-|5)#@jH##0z>NPXSsL)9JXZCchXMLWNLt*L<`@F)D*c|0v0MUt`V3Q z4Z#S8?+flh0RTEVF2qn}*JwI44YtS(*eqv)WU!p2L9#CHfEpGaYAGo>g!7HelcyA3 z+|?JsD6a4q8FnzivuZ-TTZGQj7BHy*&u5fk2K7Jg$L?p<2DiC zft@(GBwtUC4j*q%HZ73FW%eB0)A=SK00I1gt~bGe!^xYs8!#HqmVSGn^Vkla-wt1? zfu1s_G0}sBUjTo-fz-~FskAj4^ownX_~D5Ar`eaH=MUgKd%MJ~if|DOkKb`d@bL*y z5d?nb@Ay2G<1-1@HTVC8=s8Vu4ezPh zH7JB&&5;*&JZ&uXueBovJ^X&kr8JHwX3hDxsT9BJF9xGB0zV=W8{!Dl(QQ%fe*Qt7 z3knZyHJM#`PmCPIgf87Y z9tforA2mh+>l+(0rl5-W6)-iGA}|2C;c6bJSe@GfkbodA5wLp84dMVf^%OM_C{=sv zy8cQR+N>`vrhs{g*tEl!ay?pQc{={5h#WAwImu`I#tUrTxr=v87kv4UmZyL(V}_d? zs<0lUG9zW69zTuYWSb=Gte9BLh;>On>}HYhXZVle)?maP9PDh%dTUgvKv_0T*)lYg$alpM1xa^T#4lcks;v zYC@vFd_s*VBu>c06EnxXzKizzppT^vy~Y4ahuo=U`kUPmhd$4XryU>r96zn{K~GN| zIL{=c!obE6pG0F;;Nwl|xMOuRpCh_|2+k^*mX^@TnSBB+ZDTu?B`06hEd(aR zzxh+4!nYRdm~N7phVhwpcM@PP@>uZEF#(43B7+MeTk)dz*+z0z8nawsP45!5QSl7p z#khSGK6VU)13hnZHH;Vt%HM9LQJuDbYA>C2sI06!v#i#5`+?KOEgEz5?Yk7`!gAPn zK#2lq-0KW%s8$R{C{j{8t3rsMAi(2cBp^`}`>EX!9`VUuTfwGyU>##lS+UMDU+L>f zC2)}>IDF$xk@(eIEuin@w+K(n&&29_(R^_gtV2}}%rPq&^o9DtB^%OTku+^_)F^AX z8@)#}T>5gBKYdeNM%c+w7FQ&3g5F1zu${k3KjXr%JXigTpS^C^TUt)V8-Hoo{uX^A{7- z66BO%&FRY3a%r_;ALc~;vVqcPQTXSpw%k|p6>9AoMom*C{6BI2av2jj(kWrmhlSp2{Mu5`yVGju*?o``30d^Xn=|Q5}-_+)6G_uhVna8<5 z&sVIJlMlX+%?uUmE(a#fW_y{N1x})6|1QZNvxeH6E_3$brc`I z7GaHOQ_+Zq<9CEcl?2kc8K1&H*1rf=KkpOtk*85*aZ4{D=&+nM z&G5O4?!K*%yjU+?V%;#SVCMQ3a?x`2yq#|v^M&b%k{S6xu7JFfXpYef}W zwlyh5cU14&wcysG#v2}U(4he=8kpnN=R7-jS!|!FS+P z-b!$)d&}3u!-d@E+6tLu__H}M{HB{8+8w-te)cf9HfAB@U$iu@6ems?#WeLDM&Bf0 zydBoDCRo0k`^|yFp(D46^JAJ6F%^LfMn4R-w7`axpb%WF?ZBbyKcnR^#t{1)lT*tl z9m})HGjkdtk5A!sE4@pY$Np}zn<`K-b>dy2Q|35mQIA-QO9FP;v)9MB1cifOwehF< zG8_wajHPPj86Kv81c<{UPAOgZ*p zVoPr>b6HlvFmfdMh&^%h!p%eS3Y2s^$BGGN(nyjbzevN|!Fb;M0)~1iJ?jJBjl_=b zYPrA0F0=)<_q;4@eKiLh?Bev`3kLn1olVg728O>qc^@&KhxWpKW}!ck7zJOJ zhE+SKlxN;aAxW6rBA03v+?WkDmdWo?A2#uBkDVJLsipPF!LJWp%|DK^IjzZjz{sWd z)BiI(ysu_`=jqyhz2ne-N@ITvD7}OiuP%$hSC0lbV8UN7aQmRKmCi1J@HYm&pHD6A z4?hm1{xp^qM%p`i=ZnITnL0vXIUCMJ{T8nPFFBK^dgP@SBC>Pk^{r}+`tcFOl$ruo zh=n3FQzVALefim3BA1e}V6`Cj+vV4rvz>}mS99@>y0$H4v}adjJLdUbx&Q(qEnAm5 zP6txTMpI1aLJ8TlajdO>p|I$8xYlFvPHM`!4l~mdTOA^7Z)uZ;HoFYuX%{T}k>5f* z&r86Jk~HX_EBuImXBcNe0lvD9Ew+9Rm|N);eB(b>+B;9`;07iJQYKM!RmPBCETMqM3-2zY5pX7GShS>MIlDeeH&hQhGbX?=jtf_@Z9y zsY5WORX6(u!^G|*=iJ|?Z(lV+KU4b1^f!Nc#)G*r*E4iib(s!|hp*C*cYY*Mdw!Wj zy9$W_l%9U2#`FULk7+UW+lMWu6Ccf}L{W?v9pMI|hu(t`E`!{YL^uI-Hbzu+6rLOs za`3ycl-jR9t>Rv5N;X#T4Nc}0kIg_mXeD1$MnN`sUv0w6VR}vz9e>a$-1N{F2~AdN zxc^{K?E78vpEkvBPa`Uk3SNCD(o%aNiObhyrU*c~XIfDvLm!+VdN3ors~5taB6EBs zjkK3X?EMM~?IvSJN@2J@a%dg~oH&TD^lY3k)l2t^8<#tN*K0}z%{n24!J!go2`Stg zr6Uw(hFOcLT=M&xDxBA`b6WA# zNKK&}*k@RB(1fdTiI!9{=MC9~At~I5F!Gg=ctklPWaF^g*wD_7?uOs3n&Y7IjqNDn9oFR(r+0~S8VV){*IeQVsr`#wiTN*RkB`)9$qLz=h{SQ+6Z=farLJv*oQa4dJ7 zZ{gJs@Lx%^pT=xmgLl}{9%LS|)O!WW`~>tkBZo=S#>i!Ze)Y8%@AIJ!3SJ zfZNYfzM+1~W5tF5mZEK$DNQsKKx&UZHfdIpHz9*{4o&W)RT-s+5UtiUc$zPCfbca1 zD-YtN*A@?o4h!R^AAgj^O~=99JrVwp4&;6fZg9qR~JIN)k!n)k~*P{&r~iO0pfpbFGhWBJ@h(zLomZ-oS7&V2DiJ$?Qe{=TkC%d~P#( zFI$HE?$v#td^C&AU#jnaObO*ETw|^$!p1ujmfO;l(BbBo3XX23q6zIk2UPPGHh5vn z-*aIv63jA1nk{U1W)Z-*Xs2aEkhbRq$wmbG>v)~M;TXshyQ2`i1;VUF^CJ{Pj?5x{ z#i`~V1y`q!#~Au}k|rUQNBJZ6)w`Bw=v_x<6~$iOe?IqeYW`qTZ1GB5YyWJ}G`>NQ zE><^=B+~!w+1j~e_Zis#ofceB1|8gLomg`T-~PVH9Ia^xC$?Kk&YbiV*%Aki+>{C> zO$uqME*hx5$EL852v(&YXUmzmPsD^u!!$@?8VFh5c3yl$Y+dix?AY}0YHLeStTNK3 zX<>wj8fhVK0pq{mezg(6#>;Kk9_*A3;p9~r92CY1vjFO)?`ZRRz)zN#L4UrT_WN#Z z+F!rC;E|kzDo_J_ij6lB!W~K?`Mqg&|tMadCW%w1=2JrQD&|XQv)s7nQ2CZ zZ(o=Ia*8Q%*Xt4o;MSeYEoC;CC<%!UUy>KB{Sh&g)XfBOdLhxeP`g}ms_f)d8XqTz$eSoCtrg5zAN z-O-=MmfWf1XNKQ{oCwIpzzR%suGuLaoKWJ}@2F_h=p_kOU9<~S5Ik20U;&gd z2)5=MS6;YN=Y`y?!>3Ffm`;3)xr8z!cKH_Lw4Rx5&wZf` zHH7ffS)KPkjmbefMuW8f@Ntav7R@Z!Unds_Je2C#@*a3%{IiAA0(+3AHE1!0!AA47 zqm5p?C36nJWF?AtJZu#eFh(GH#)cJerh20yp9EnzCmO;E_*8&P={@yFL5g~N1j&i` z-|292YNVlqe5k4XpVbz8$>kPhfJ}hY_1Kj%+ocMtarEq%nW64M@U)o!m(gH z1!#|dCA_yE?=^ga`pptr1%k#@^8rjIs2dbEQ%8UKly37lH*s_EnHXHn=z|Mi^h8Ju zkT)%Xvl|^r(Sh89pG4a(4Yf2<&S|ee!CFG7Txz6(EyA}R^yX!t5_X8}-w3sIF?CL>lT=Av;P)1a~pGEG(wOEL<@4XDx+ zx~>Edv?ISBt#$8}l9JMgVyoeXH`h7SUd?;RuWQSynU(fQaQ4I5=Q+_3)&}5){&Yh6 z+4qt+3b$73O8dq@K28ir|IdvE&U2coxG%J0BJ3l3T-BroN-%jP3EmG9eT z494WimfB_$tjDA)NK5mmrH@8$x;~x7GDuB=D4`3EGlw7V%Y30N&4z~3L||b^$C9$m z$99g@T6x&?VgIEIiT}!9uqN=Fn;iF-@Z^c61!2iNv*bPO;u8e)WPa)pkdC+s#PPZs1T&iyFu%zJ%>gvthTE+T%d+`R4Y@o)LA~b=8XQ>Sx+3tHJ3;*e}^Ls^9402xn9|pw>a~z*8qs^Wc8%4iyUk&ax3A zEN^2#w=W@UP01j-&>SObqyW}s(a^WWEq?=md5q5GTKF5UJtCx4#j?##8X+M95+p~3 zGdR%!pU!%HMD?Y)Ifw+zh(?=Wf+$~K_K-ghxzGqxrs6BSR(Z(sb|mO(_fnQ6a0rW2 zKUO4^i|Cc{o?wqg;eSr%gcc_}Cgl`M-al}+rbIA3@FT1q6Dd9?j%sBR?BE!+ zC(=_n-|z|L194bgzfMCu`|tOlS{&o3<1 zUOKzFe$A=sA^1%?o(bT7&#X(T(?MnqoprZc4P>D)n5HZgG;#QZiHq->UdKaX&7NWb zIx?nf=9FaFbp5Tr2x>*A#4_MP%f;qve_!9n%?K(urnM^v zK=xWgN<+&>dB%xetfNqL1Emw5455y=LP6LtTUmivcR({*S{bQ3ENpKo!=bSQUPoJr z3kft@tYI`Id3vtyoK??*Z$_4B4|z;EmX?RL)FbVc`ou13%?X>6^~|_pZzn<>md@T%lJypNtH! z&zcKO(}&-KXbTh9yMD?e9vl6`Lf~QRkJU;JC^T371GmaGyIV`5Gdky1xhu!mYH-cH z88vA{ljIn9H%P#;2%V%@+v0aV`@3Wob05iSKiz1))9CfT=k2{*kVT<~#$C9FEOs>n z`QPeM)CpT4lCP`{>JBK?8Nvdb zPV7=}dn5zzZ1^eO${I8)JW$LUAl=1*i9g+d(aj!n1ky(k!*h!b&scABj2gC~ zng0yEn6L(TAXipgIoqg?FpTgvP2~a!6~Y*6qc@Kagu*!trc1;_dhjM;RinGo;75B zL|YaB`LwC>`B4IULPH?0y@nJAXUqNM&ye(+$;LV)V4UNQ+9-qKBt~Z08#jMi&seiW zWEbLba5uheFDRB~iz}0?h0#mMmnko3PQz_+P(b}x&Q8xrUtdo{cGwa*cDYe*-W>X0 zf+Sb1#K@G8;7w{(4m_dw`(6A&4E(9G0?2Y1s&I<%?wr^Rb2RXC-C76U)cjIBwyP^m ziOKMk{e~T!L4<1`%9*>DO`H1iC6Z~;BY?U*@Y7BtXsfk)Xz1AC`WAdy3)Jj_8g}pS zaX0h9 zBVO`;@51Ld;ZNp58UTGMuxtRXOODSA7{cDK_2eA4GpO7l#}cW za|D|^*JOwm~;4q>` zQ)qbvzrtrCj;nS&?qK{3A{<(7yICMJ3Q##7ZexRVfvI=nn6rLbFhTZ@8~2Rz%-9`= z#i>Bbj_wT&!pkQ!$>+vUv?W8{H9J;Hc8D`ZVx)ZAyZPc|W2Z1z0n{AB{wejoz|W)* ztdNvIugSaD#(ySPwcYIKa)g{O^@HpB^Aul6C^$I_;E=r%4WmFuB*6yAD}sQU!Q{WA z9?t0T=->naJv11$8ZFmPPnsW(w_p)*!TFWtWpQzSiEKaP?%z)(;V zRuB@~)P0{OUb&=MlS zO<+x#Qrjbatmqn_QRis!7hm-of&FgcaB|ZN$*o0!YaBKy&6GFKWeQgNoL8Sm8R5xu>q6XJQXk`fNz9%R*nE=~@yK(DC-_(VZ*U*UjhX{t)dfFpx`W$p7vTv^0*! zX>B78k}j^ibz**V_C@_|#1Ho%N!3e1Zj>AfDdnVuKEf*{Y0yA4v>l5HQ60}4Q>vNe zJE+I3N7m53A?&_+aM*wxEI*6KX?HRog2LV~YBETB;?a<0@7{QG#3{If1r<^S=hzhF z@5V?d5hShsR&N$K>+1I62ITT=)?Ax(UvA_4?|A<4b6WyACv%M7*!Up88$JY^+{`I# z26b0du9Fny`};uJ^nG93JS@$HnKGTS{nQyG?wZCKrT1m)OrlZ?%owGe+QOJcS-GvB zIRpD)m%o5)M3cG2a*hg0i!3DUSZV=bRhRRh0Q!C$Q2vapWzzz?^fPIRWZf#rZ65n> zvxEu_GwX>L?S8H~regbmHtvFiMG5ohsp^8DpweFIB9@@Dn@5oG1vXF9xg(aC(#K?| zC--2BW-0gW|BCan#2-K((iF@b`2xxzy5uDaEfrV^UsBRV8o;*+5o+lgqPP8@;uS0yX9Z$pyyHr%*izST+kt` z#h_?x9wKUDBqD6viDD!uj3`X0?E{-E&7K$oYL2b2?-pq@10BssGLy@DEERR**<>O#h~g(qo{~d|ikuC@ zx)tDH{n&5e2DU5tYAUWE3mX9R-Jy`CWU8zT7upnGlQ*G97KoI_cmNc_mfG1g9l2o& z(uuNdR|SvtE5^ej%r6~}{_v;=PehOwMtaJ6o(R?)?1EB*k*NH$!h>dHvviaDMPEN> zZU|k=&q;W|K79n`WN(E_2d#Q;i2o*r=|hu|xS5zeF>{#pk+$%m0pRzP5aF12C*Roe z?P5qtN%E%+gw*%uo1BxS;(@fwTbbZ20ODTFo&*Q4$eRDV(C8XG&j2-rzqDXi4W7#u z^*8){ubMH|Xuza>PNXZmx%M=`hcEIqXG z3y4jDQ<>z8B)|+p4!gI$AP!wi`2GtH4#gOWJsGI?sGTS0&ph)5Xbx@{pxVfgLA~uC z=o?}2_|Ohy&uCL#Abthb`r8#SdLV*BR%Ig9EXh;sevcl2 z;G&o|oywddfE6Su$7KBPhN2mMT$2KMnWxfg^8NoZi6bl7Gg_nejsTq1CyX5~DzF6i zKMF7X3S1{VeK-d6XW{C=f)eF`{!3x%yaW%_!4~w=9|7agkAVG?duj<*Vzndv>R}7g zM{`=y1Jymfop56H!-3d>(k-?U?*7RT=4^M)_vm=ph+_V8T_1Wm`k&hBbEUhbCW0Em zHD&lSdRFLvanm&PqEc@+1BSO)bBF2x6$p16#!Ki79|!}rmXM$>@QriNchcxzQ9Oa$ zE|oKKkvDg~esZtu^?5Vk9yT_}A@-a;6e}*ApkTC%v)Cl~a2ZwR#Ag{ERg2RR33foa z^rqxa`VTt8zo*|5?^s2_y{E;tO+CA3jZLUZcc}C>Z(&GSYiK+~5ZvuiSrqoPIOa}A zYSpLrW)J(gxpx?G?x335^OW<&NJ@I8KI_f8;ushGg}98Y>rPk!UZOXVdF@A>kC9&$ z;K|`STz@7;cjbHswKSHB`18kH&X!_Qe^2Hm&Ic09$rsDO&swm+>pGYPJ-%QZRB-!;NQ+6# zco!AvuKkojGI1GSE?5@Ux}))<(jANJV;td{U;E@SW(17qH;{xyl&$Ljq06;Fj0la! z@A53N{Q?#5HS%+YM=)!bA}6{DF(R@LXof0AP8#s_+BxgRl#VUN+fSf?X7xCF(V@lf zNIVp8_h@Uv>6kwyFHJm(peSP?5F31=qNM!XPmo^+m1FqLeDg)@FV41oQT1DRAY&UT ziEbhj`|}^wk3;V1J~&C(Tj^8Q{ea9n_!FhJwxO%&?8-uy=EW4p!B1d_4P@tQbJ@yI zUvssvy2X_*lPx6dV5ZYBtu_X2uKGTN8MAiTJ0&jooWi0memw#fx)!3*EB=Ti{=cR9 zRugU2!{B;Vk*sMXA3{WWj@ZzKMl;9KHZTsJbFO#lcwfRC+!pDJaG@Tm(a#<#Gms6R zx@jJS4Qwn4gI_eW<4Yxc`W3^}kIAG=g7oz3L-dbZh8067&pmf4mIqvvj1w)H#9;t* zS4qu-pG<@*urr`Aszn2q2NwH0DW-=(ZU)#XSxf85xf^wel(OD|yz7N6!*Ky(yHeMw};L?5(uhXeB zr%dJK>q_A;9$xkDTf}ZwkGGUds2J^6vwx$`iP9givK~$`fxU28v9$@O@Fd=7BU8>k zyiLt8TpGj1+dLwHp7stIV<#s3LF9QZbS3nc3LE~@ZF8hBL2$UrSy+q*!db)VfKtd36NjAjaKm3(*M%WsRh~3DsSFww*--18f4X zY(_M+;Vx@dgFq^xFA-Ngt4qBzYfp#U{@{>hB9X`zdnD@?q_MCY)ntC@h7jb(c@9Wj zkS6GZpy^Z5d3X53Ia7z6v6D?%*-(F(E&9n;t)*EX5w&-E=#Am}cWS2({*KQ%tv+tm zOyGkHAIhUYI~R#`qZs0Doofl07eLc`#H%czMaGUEY7LN_Eu^6);zo3satP&S3F$+4 z?CVAKtd+CFmmF8;(A^hcO2M*RFss0Q1?M`juP6UV%1hDhV!{=J^5@f z34}7gOBHVK?=eIjw9w{4F@TSQy?k%Ty+1CKYDcfc8bF6n+z0Auq&57r$=SO&suiVhi>ZZaf_xoj0G-;cnK!`C@ zg*(=4gGj`(YDy;pZhhP>?1;^{;)_dk*k6F0swHS7(dnJtdA8-6^@1e%%~<#i_6fuN zilx~MQ4Z0;o5l|z0nl3!%i+;x-GDLLHeCw;Ifm1UXz|5IYJH!_rq6gF=)3sc%@~DY+N_91#*>h3wgJ+gSpku19(h zET4;vDL_-j3AG2k{=S}2Iro_9TSUHLgyj0#U_X=PqSJ#g4OeG{HKnF@6e9><>+Y*n zC4PH}_Des=Oj}W`o6o_QdiYI}tPqmodHC})vB47wwWl5r)UX$Wf2P7rG|V)Qpj$56 z{%-NTy|iB|C?ogBn=~|Rwy%5XY=bGFo`D|~Cq?-Kk^rKF)=LI#YuZ}_|6U1ES4bxj zZInVlwP4(G2#kOK2Kocz{rl}r^tmSxl5s7P`jW~`w-)yznv?f)2$t5|LZ=TRl?qnS z@mGCMf^pr{B9y5alGLN)O!_ZTiHZQx%U58=AIN7>Pg2MX!iE~4fQ`ve9pyE3y)l0) z@lO)Oa0s|%twNNlz{YN5R<)Yyiht3}SVXCyjWkU75Y8~KcYlC=^nb?{NK8=d^G#4K zpf02av?;q!V5{Zc3nhF=q~m#IXx2R3F_)QTb$$RT2V=E3oUy$v= zb+8GkGh1is9C4vS2dfUh-{?Dgm?N|Kt1}RVWP>h%Pm5WHH?Xs2Ej8e_9bSGh5aUg> z;jVZNkR3Ih zeQlPclk#=c=BohtO&w@A+js)ki(ljAd^_6Ql5Of(05J$Y_~d-F_WGx#$onOYox~YC z4w$?176@1E`Zg%edrcwK_S516I@2-dS4poF66O06ZCapT9`DtPr0_|aIKs9L6fmBBeru7n+$Z%b3piP-%b$roGLAPHykx>}*{3I=LM z)}S1){frNgempCty7$u{I_dND!%sg(xSK+o9Av~WwoY7wgg#pPo#n=O<1&1u)n-JC z-$!D4&5D?33;AnF0nojyM{aa-Q7%dHNB&Tlh&%j{8}G7SrC9nL@kfkR@NAau-R3H4 z&Mgg?n3?%4(ok)2;WwOMu;#NzOD>4*bVL75kcsweSaY}mEArjD5ar@bcdMsYPUved zcxiWf`&nF?Dw$vh>KAg|Gy-JBYs84DY#_29Z2uOX zPk*4*MJks2WID|LfIY+m9Zwcq;6Q#pfBpA&uR{;|D^3@0KC_^;DQ@?J?(^kyt?qy! z72aQ7XwVTy$+`<|Qi9-@cNhG5*%50i&cKtBq3Ew1|@elB-KpuA~B``;a3(4lKutA4spw z`%qBFNy3k6jBDIMH>8+e^^AMh$0*^szKJma#Wf9W%X%wE4xVl&ZD9f$Wn+aRs(JZ2KWizrJSeWtvs2 ziRQu?A!^uCtHkvcV=%orxkD1&T(9-5{&5yJhViOCl*bL(Zkb^8Uy(xr>oKJ7=sKb7 z6A(QU8`-$?`X2y(K!Lw=bh3q-X}5KU|SonpWp_uyZ31f*U={{ofgGSJD+5M+R+o-2gYGzE>8!K$DZ>Pwq#;0 zz}Z=VRsgL9_|O4#tbFomsl4crw-EbO-Y@LzbWfl9a83%!`6y8J!BK@42?v`wz^--* z49@vAj?+T8u<*nOAU0ag;t8+?Ie=LaU9RQ#t%|OtPF(-TY+8(Bu17CpeXiz2SFl*2(rj3 zi@^lF>I)xdo^7gVQ3kt5oxz#G;d9jlLU-Eu&HqrvIg>=CUhiciF4$tx5vDVfpMMTu zEa+>cfYb?U1(<^Evy4NJ$NRjC#*?ddt2N5M1TdKy?r%4Tl3F6Ut@AR8W2(?2YMTL~DOQVb7aOX1-DfmcV52?tBz z8MS!h_XLn>_EdP~nwMiuA``vG8rKAclMM$@!Ii#O&qSlT44`5+0RsQG%@DqrzZyWL zy=K?p^VoZQ9FXvi;2gmHAcYk=CU)e(3M!lcYR#SrKUA6HEoIj`0(h4Ww$g5-&(x3? z(y@c`^tAJ`1P%?&j0+J?+ zC;B6e=1968Kq4B)YsOdSo)BdYKOl9i_0v6^js^wIW&;>y`S^Y5)PyXI`K+17MG01zqTk z2)xjqJwOz8L10WdqHdrVn>nJ#0OXDu0Bh{h!RtV@svuiN%wvwkC`Dth#W!aVRkqe_B? zfGqm06h!VyXI{_L%a|4Mm1MW~Ae$;EnpH%@iJtk)hRH}S zIfg(TbiNrtZ;PL&{EmYMzB?CkXi>nJnVVUh*!3J~(Ie4{neh{Q zQ5gX1{nb1Vz!ubFNtbDr6c9{L@yu1Zybl3z2envI&&yps1hEWOnX~|s1qvH-xLg4{ zA)*hxH6yTr2~cyLm10dTKmb}6;@g;QM_>};fXXx*lFK|)A!Xy^>b^!soCpXRH`}V11Pl{)<)`hsy_j%)53hLVG zD}=0*3sAs3Pjlw|J>SV536wej$Y}`B<)#}i-z3@TdRR9&zD+P%clgvs09|nFMKLVEN zVjq4|2w>W7iy|F@&vE{gT|WO-04X1*z)`*k*v*6CDt5k@|?*M;H;3UofJgp9{geZRYO)4 zDyfpTZQlfN8$SaKG#@0|vEu+QJO{2*U;pB+dqqP~os#fGB>=SZdSz0n&*oRN2A)-| zmit^Fz(%G70A<(;G<>ieqU++?8Iz?@;pDJ=Q$oND-EjJ%{l4B!evQ*|0@u6W#etj1TdCC6e4OiiQF;lirpL&M?l zx*8v8AyB9RPeBQhDRNLM{r1}xgH@3Z%W;9kh=43HGJ{5PSid!*k~^M9nBy{Qz@cN# z=JFy#3xKPsK#5n_Rq5DdTaJ7zKSjSF7U;fqk=!E z&U{ztQ{UCC1Wz(9h^RJa_j#sK3i zS_=0jt{ssmkaygkunE$1DJ3^>EanC#KpfiiD%D4i(-YMP#rU}tQg-a-yI8XpK$wE| z$iVYv0IO#bh+<_c4U`?%heZ;lN5DS?pb0)a1<*1D9>dOZPlu@Wda(pnc^ONP0Z?nw zy8!+KZF;^5aI*mvjY|srk>>`mTfDgg0@gTkQrHf~36L>X6II5NWsYTl(r&8hyw~_b zw&zA@179*lt5_9@9Ok4{73yKaZVLiz5zag)3Grot+Htlh}x*(6}RzrXK9zujL> zDm3Ok}Fu;kQ9VL<*^}8tPUm z+j1Iqx`PQ(BLdX7MYfrzo+xEdbq*O~ve z=3HRF;79wcY!JV8E-FR#IsVmfIp*-=J9jn z(EsMYV;0`+2l!Lw^~558lxe&OpgshN(_Upt zM{%|L>m1&^HCKUCECk*^-UwaqYhp4cd3y|j@oX4wPjvva7yg7RGmIn>UF+)0^$)Em z-!|y?p`0dwju+}_7S|c<8>hU(LQ=q9X9i;b*IPFPbEmdV;^qSZ)T(#8!R&T~-e>?L z&W#5!cNH*MvM`ykqR2_vDsWN+ylzkc2#WPUkt+gV-9)tk+IB8im`Fn)jxS?t0yy+B zIvsOYSP7u6m7|E5T2(JXL>rIC;|Cf~YNz-kZ*1NTX_;bo*3lA9jAK(HAd$diz3J3% zj%~ioOs#MKM&Kycu22x1R;?^x_T$BFH<%Z@0DdZaVtEN<(*ab=Bod7havCcbLTAQa z-lAPhfT9OWo`(6F0$|`+&I4}}ajpo+%}4kuwq^-D4W0>t!<7IM;-B>deoUc!bu1>H z&=dfYkz;{^f`EvSQPe&Ja_Q=~T4^a>?DhkEu?yg*k_IBBlFMblW&-#&iU1`i7e5P# z2sr@|%O{t=RbOnwg{`>{&|_FI;w#t%a2LS0DMOs;#)EacGePiwTmpX~y9sa?!1o~) zcx`tk$S#1}?q3Wb^%tHb2)vCT-hNjSKSk~W_+z^XaNXwz@RwZx*L{@Vbf0tMHvH zsai4r;-3q`sG!Vu3QGg6PQZ0*|Ds}z!-o5YQ;>xFomoF^vcEIr1F1H7Ta{Dm=pgy=A z32sw5)Pn3;DRjhH)eg0>obKJS*adJG!1viLfw$XVo&fi!Vo-&g{x#`uUaPfYw+@}?^j({aBQiyi?P*J1E}Hot#N z0olu5FJ=xzrSlGO>x(-=QMWGX@W2q{8pUYLeC|J^DL#;FvO}NO+b;lxRJ%QH+xL}v zC4lRmU28Nl>%F4PC5z>(Z#v+lNCt=LgwN;mpB+NhmJs|Hn7G6MHh5ZF+@b&yv|RdM zB3EnlO6A{q1DgE5_H%1)gZV!oIziem zJ5OYRj*hSKy@hqlZ`{btSlf}y5L}f5M&BI+>18uH8LubT&Git3#kZ(i9CC^< z(?F^!2Ft;q-w4VXari|Grv@NLT(n#~cI7GXo)S3Q#$+)OY7qVz#0OgFO~H3GCONY8=phXR?)@aAwTMs(GMFNg4hvaRlsU122 zDv>|w7Yc=$8wkkB$xQaOA8&z4eN)y^yAgmS!6-Ca^|u*-zkBe8mzy-)e=z}H3Ba$u z{9-$w0;g?I{Ly7GX%fF;(Ej$4my`i2ng%E>UiI%czTXT)^WG{?MY z{v=_-LycHp-%R9!3-C0KSJDFPWC85^CwaLz=_zNLF`pFHtCQ+@IZ(y`rHFD8oD-Y) z0J<@d<@w@Bt%v(12vw3}4BatQ@dvPy2`Y{+_?rQ%zYT>!9yQO;Q!z8(lK2ykeAQF} zkinpLJUZBoTVR747h6{Wp9Anu{b$Mr$p4qc+~$WM+M6kb7wp$M9ZD&Xq!uqw8b)`t zaFQIcd4|^>bzZR93n;V|hK`@!-rjl$KnMeHRG=zfDEkP!=HG9Clwf|_CnXx@S;oAN zC+tc4(;CeIhz1L-WJJ4Yl?>O10CE{jOQ8JMz+TC=Z#ZgL%>jP|WJmjS3%obfQcnR0 z!SZs1em`rL>+*diqlbbTrb;@fxacYwU0(Iq=gejRhClH!gm|b58q+l46^FA9 zP#3^oM02IM74U>Hzqe}$4UKnT$-lJ$M!Xc>B;1D-z>nxGV%MPa0@>gY=^0ALq@$tr zoG^e(seLrMd9^JPd@|>I{27b|s^^RY)u;|eA{3qhf&&1S9{apg$lEPu{nZ$XsGkHY zX%H#^q^nL&eX+LJ0c}%cFYEmJ#sa`oN8@m{((8#H0U#ys??eD@X90Zc7$6tP7Tv!{ zKvJBOt&Zq18=w+gG@gjh%VHh^Cc#%sqgMgblS7 zDg+-ztb<3**+F5Thl0@9?yanIT4V_P#8g@4>y^$r*iF~`)(bqC3I_J3W-;rBjQp0R}1N?p5 zU9jT|rdehKkqsv1PRm`Hv1_18)bML}KBE}QW_=%LHmn_b2-5Z!4|~_xV84yEuh!j6 zv$+R_MrJ|fd;qi=WqZ5ZUS73h6n>(Mo-EGXQn57P$nR%of%|T^+HRV4(~f5eq%YM& z=7aO$%xwWao#7o?{-j~6-vtha0B)8K0mBZ}!a*Yh5Dqj$ENDl}3W#B_0LKeF&kG41 zRFyNRv{^k26cF#H42UxT_&5+vKw+x@mWPKUz%$;5!n<6i^l%knp4Qb1hW7XBvr5?l zmcQypLDO`>30V5|FdXf2fZ2_QAgnshwtW@wjRDxPkvb#)A^6%q>e;X%a&#A%cJ5j;^Ye6OFwZPd`OZDJr?;MS z0YBSo9#o9+Sno~<0a!EkBugaSB$XY=l8#>{rS>WULw?q=g+0Kh1m45ill9yDF7RJH zfx>@lHW)3({IUW5uGfxy{SyCF17rw>Si+6Op%?)sC?N$J8nYWGs z+QpKWd5IN;x!7^@hX*Yv3?WU>0fjwc4Yf?+q1nj*tl$wGUg0CXHS+7p5Vo=b`Yz6D zH52IIWlZynWigErtDV9lBJjEHgetVImCj1F>ll7Uc^3EGOTE5cCy~Bs#5-fqG6xt6 z)7zBuHgp;aQutH}o3iI@oo*ZP9`>rd_u(4g>;8)Y$a34{-2q5g9b%Sy8HsVPTO`b% zVYETvi^J)mpdwu~_&HQ&p>}W)Ap##L0e7SUPEYdEh==T7NjV*U6s>m$z01{Vz(YZr z0JNh}mB(>c)D<6xvB5Ug32WeT43PHA{bA*5dA}@JowBQ=OZ1IJero7M<7FfV-Fso| zz&n_w{&tT6Zmrh?(ARQq6SrfFw9M}eKuv^U_ai|QyAgqeMYOUtKEM}KX#ix#3+WLNcRu~2r4)4qigX~Bi6^_#LYhOg}7hHVbD+cfPfrBtqmW2WD zK#AEhgR(PeXA zow+;%`&BO(3Xp`=OEeaE2V?$U8t^ku``Ukgc6PD{|XBV!Y5JDobx^s1E zdENv}Uji@`dpv=!`1?6_@%!N>8+zqd`mXiAM1gKaQ2r08ee@xE8NA^<3@DExybqi zzR6J7h9>m8Ui>_+1>i+^aSd&;ZSsGQ(*-$VVU z1W5D+_%FWgAcD;4Jdl`cySROu(IsAGeus~`+^&G0PfS1!8J7SE&C4Q zGp^fX902c#FSyjCrnS+H`_#svsr$r$OigJ}{o#0%I+B zb{Kf!y?DR+ri#QefKk_p?c2i?9H-+jyzbb_*pw0QKEH4hT`55EnBwHE=}e)JNn3g5 zl$roJv63lpEpK0GD?o}SoxHQ4wp6aua=BedcUUKi+`zZ%3WCsF5c>k`vVDL(#&-nx zy1|<_Z(hGLq6xii<*Tuo@$iKOG?;keU%_YAp2b%I+}Yf| zwK;=2L!RjMJEwrz;ME&Dz}e0D+0B!{&d$_kVicp%2RF4w+#UlM&ou!qM6Yg9<+aVk zl%I8Y#D7S8OlE7!69WQkFy5HM?)p~zj(-MY(WeWp?i8R}mUt^)8Ie0-&%e!hoM{GR= za40^)-sJ)W7r(fjE}lj+i*5irF(5LDIz#^1hEJmcZtVcU4G5lbgr|Y+9fSVva{yQF z;QnMh{{v3FxVu(GnUJW`JUf4SY#Ugj`S@N@<`bKs7@;%&X+7q-13{ty#GyK$$B^ zG;K&mV%T$%l>}&&930t=>Jd~(2~9)XlH{zmQI>@wot)Wf2Z~+IOQbT2vIfX#LQ$#p z=gbJ4%%Tq7sZCQBWY&SC6{y3$0DmCB{v60Cf$=4M7!dofRe7(l{2*{otzFPX-$9h z(-&Y@ZG`SIesUYk8LtH^Ze!;Hw0IV9JifY50VdiCP>hFgb5mCpU<_h(Vf9+bh^PK> z7|hxnpt&l*D=-3!^G2BTH32r}09}Eq0K?0e+jKJlE+XK9$&Asd?i66w*&>oJ1t`k} z=A%q8OO~UAP!nLP%yg8I>()sXlVqiGDn;7_=|i$m%sq;(fM zm-9|42%IKBK3}0AQ>-Z~Ii+-Epy*)z$yEX7E0vNK6~q!-vMCqKIcr~l-MA01C)npc zKr>p=kDR>c=Fky|B@k|Zz#ju}VWCBUk#lG!tSy3!0e2@+#}XI^<4N3;SRcjhTfmhK z;Ceg~*_?!NJHET_0$^P9fw3IFLBf3DS>K9?xO5%x%{Nwoy zFTnmjz)$R*YfmCq7{|ZIf9TAF$pY44hGEvU2$9MqEsDrZP(%emFe(>;idw6p#>Pw1 zbd%n)i5r{En(jyFi}n+AlYWVQgTC)Mqau{O*j;Va^=F*H!^|0)w7)**Jm)-I3)j0B zSf{f1cSt5sRI_F=(SUaT(VxoETa3-yD8kt_Z0V3CFAWAjXF%z59{8>bAZTuIAei$d z5DYd8{nIpTmI0%v{SuVC4=_omzX%S~e|(AKByxbMlvZwM66B2nWWGI{Bh){A{`{%l zrVV#V({p`GSE?q!y;GSzKBmj`KJ0E8S<^mFm}k!z(zVtZxn3Lb9`k4SFfwy$!aeo4 z%fS5n`_J_8WK2y?A3vr!8X7&GbiL@NA6Mn2AMTSNcYYn7H9TLt*b>6lnLp?PF7Xuc5Ov6ii-0z8ciU%C)lqO}fh^}mu=A;25_rARM9 z8f5`*4KIaTv!ETTeq;Pl;padR93t#JJw0|1CW1I4xB;Gl@KD7m_OH;w{~iI}AWDTb zxAea61(w>9AbP?-1V|&T=KFk8fZcs^M+A5l+0iqv?`tNPd6Mp+Hq+?tKAjpQZ)+)* zRskMq0+b$;tH_nF5+J?iWdfA@&CbTeAPcbpvA5R-2p$mx;T%9PnK)fYa;8(iGg zb%3L(m9>==VP#)I6UV~tYA&&PP)!=4AvhUO*wMB9)t!~{Zn=aD24{zIMRBneY)2vK<%tWfJ|RY1W2FpVc!|wlIxCX7Dbx^?1%sjCsch;kA8pL{rU*- z9}A&Xd(M+y^aVs&alsp{MFH=S4}^(;pAroLV#wzUMPfc*OvYW|mLx$YcUDIBtCdQ1 zcVrmnOeDla(6xpw4<|rld87aeD=OQACPOM}Fro?P-k(ooy}!mY0S~a%&*>5>Y;hLg zcH&!vR2YVozh(=^5-ShgAv_o#KJ?G`k|PVkeFWIfy#U)6LLWC5LbuKVY9^yjJ2^T! z;cawi+xM6px=)T@F$YLGlUf5u&6?zLExeTUXJg`SEhF492iWyo`#i@a>C!2{<{Y4^ zpZ>=(7}c4!rqfD}k0~K6T6@OfbHSH00VdrkT>vZ-{plfZkJ*kp!!20`Ga2Z~2RWmW za}HbxaPZgMs-rj>i_EgnQ0s*?Py)Nf`Gabuo~@K6oWlmABMa_eJsh1{My|@OI8$cD zyTk(41kPwwnIH>9Cfr&#h2qLgv6@}RGybcEYK(iV!NPlrR1-(LqqP-Tx+>NPj)vt zw2}8P`!G%(%mgsMlGTR5nHAYi2+9INQ{^FtYbLv1?Sax;3c8kP8FUGk!ZTt9O!JR~ z`v~xT5#U)dgr`TpJZ&k4(76uqq_1TiAYF~pItW%Z!@YRH)6nh{Z5^N{vzAN?X+HY> zKt=3?AU>r@9 zp@3s%H0oHFL7AvyV;35+dHS`OzGMm)a8cE7LnN8Zje?b2YhcfZ!2b9F837+8)^)&| zGQJsdx>Dn+kSvE+1{Ss|t648DM`WZ&hz}gzM}Y5*07*u+qa0SpP7t~kqje{Uq)p;A z2f=j18l4$@^6bGc7dt`vmjs*`bS-Z(Lm2c31A!k4O_`|2WoQOwrVhs z62*bhfWr|OZ580JtEGvZ(4hHrj*eRz#@v|zL)-p9G>|E5p#@K2YBYQ(>~8k}_D8j8 zTk23Z7-uhhIxmQonS?zYvd2=rK>)q+<>)BvkxQ#8GO#mXy`KYoKLjX=qA1aVs8lGF zACLB$6`|=kwS6z}hjcIS6Cz4l4Tdy+(i9Mh>4-k*->=#W{PdHv<|i*69FbeQsYJ<{ zY^$RJ)II^3fRt69IepwGKYmDlf6xjvXxZXE@`6q?(j+lWfc!|_ZXW_SCepzi@1X+h zHDz4W{z$a8!2t*`m`H=7=H}cF7i~e@9XbVgBeTGpV~++NZEtRFKWZHU7nVjVW7%Rc zn+74XP^;}f@`2)6%1!(I8^v9;V4Wm84|upI0WKbQr;YPVTl00W$x4-w?deT{RT5ql zzbfvoSEeyo&SzkXyH_TF%Nww9RaxNg(Fte5e*tUaKryfY1QRE`OIIdPOh)Z!Vy|6* z4fn%`vjGlGu1SDWDf(4lTvFx8^S&R6gud;5@jwgLNCB235{mu!;YBqVvX1Zh&*Tr8 zR)P6}mMkFWC(U}Pl2)(f8~Lmn%!eJ-VAPXuPMe?Y>7SpKnbAL|T^O_^$Yb*ElczR` z%JT8I3V#2F;DM$A!*fMh;5&^`nsQx=QUBS=|OV%>Ds5(tRbDUCE;MKtr&(aWr5@m(Osh;oG4j{0MjMTIR`&q3j*-wKm{l)bGl`Z&*?UoLmy&TKfd(tEfQR?y_S*8vJmKKt!cw4=s& zgGa&jGm{iSF~n>Um`!nITvoNC zLUSh)x#Zthgl;Z_X{!kRhNnr#d!l|?F--Vd+WLo`9v?rggDr-|aTwe@q9X6$&^sgo zULQ;j6Kpjnre($7i#x+DNrEhA{58MEw2E_r^I-#9mpq9f0cXg)XtH#OHrU9)I6I#D z3J9!m9xDv{lc}x5Oc5H6L?UGZ>|4RCb@(8$HD3_G*6VJo0I3+omGT+^e*amM-+ue; z4*{)M(}3NJt0Uv8j)eiZCwI&MN{R0_2Q>lCf#8_mwSqD^hbEk>HaAxz4mrc+9-Z0m zg08|tS`~%l=#DR51*F1v>roI^Qy}!ruXsQST)zOP>%FC69k=scV$EE3xFw`3jQOEEHlVCV1(f+n=13INM!cY+{D21$~1I%w$ZL5?=EpeKVQ znojSy287oM@V7QT6VQU<;b8HxxH7iBNI0eeN8aonQD7KIT0_c(0DEfrxeft#?I%*H zM3%!D#V=OVBM!(TPFO}P$S=)*86J@l-#PU5XaY=tV2Q1-fa17*0d9;fEp7H=(+@yk z8e0`DCUh?eaHNntFtMIZ!;T-|-c5kZRfe3Hs!v`W>{25!qf!Z$3cZZIGUzEX23{U7 zGRDKTVS`S7ll=58EzP#}pU!*VO@KU|E^LhxZHywziVnIU3vK&=$*u#Tivz`^GYH@W zm=xXZ`Kr}B6an5bE-k=M(F&XPnSDMJu8hPsC}Rcd_`oQ{{E!i73Xq;V1lU1#30TR3 z$=hMc+k^q5s{wNq%VqSKD_ z@Vcn5^Im$S0we_hn*tuC&F&&G7+Hu?IJ++GCdC0HUrzz`Wx{}%yf;#z+@ z!$4tID%A^!ZUNINU@igQlvg~QmfUv1wQhW;EU*+U^aKZ29ime3DU0QCowH)MRQz^l z$U3~X986DGvu69S%gzL5rE81;X-eZ*ul$<`kRJXy^u8D1&0Yp`r?})gz&|?t$4Vwk zOvTj^4}(%18PpvbAoPmdR=rh#Q?)k^fy*gPfW~}4N_`;{0nWzRd@t-a*3~A!wZwlV zz*qqU?w|n#m%dBweg#(;@T>y93gF+KuaC0TdOU8%I|)!_rmMwjMwTo?$?&RAlmobv*E~W<2oZi4O#hj5n!{uMW^=yymd*C+sj+-1TlGiJ`1jp ztQ!<|EkCwk1-H4d@LjM~fJ>e?3NTp(!V$ndGM4>LFYL&fvhbY~;en}z5D1kNG$IvH zqSr4#fdxey>2f?Lu(YN53r;lwFuq;wPpQQ_s%WuWB$Y15vs*-l?=L8-#4C!b@}eAM zR9>}MR9*@4uL=O)IRb26CtpPbNN>NN1H3~Op>Hg2zZaM_vbajv^X^2O5dde?3!u#G z#4aRa36Hp5--XtVB!ZkY+fdi=77mo^fZKTSsLbT{ZQcq8vCS{4s%j^K*b^?)sOg$b z+VSk~+Y$ltcPG1hp9Hzd-1NP`)4KsQQL@D#-kSb$)qp0m+1RZXpz)PiR7+3kHKx0^ z2$23c zqsWsr+r;(EY2N|CSYqI^9{Luz?a8;Y1NOmoyInE1MLVDLAu4Ut%QwHjFvGJY1n^&I zLgr_diJ1=|C7zRfp-FQ;ZUNp8;Nz(!KjC{~KA#(+{y%Eiz258L>IP$PuFxIwx|l)2 z0{mhCwTy;Q&wKy@T0J*o_yB4}yazvC!IOOYspSRms&epTtGpHd=i(exvY>iJwvfdb z9ib@g%F2owFUB)`A$0f69wy%2;GXN=pm&M>-RJr}^hSfh=n6CGMFfy~;s7f70M0#w z0D>Z=V);ywXeHxYZpj~LF6;L@mG}P-Qljmk+NQ`-F=CM+8}J$?QchgxT^BAe490A` zm{0Dy+)=z3&oF?4zlRv>-S+X(n|^=PAG{e|UtZr}*r)ccu7T^B4B(GjfHnpIDc9PT zVgN0EXPyEU@+1Hw3*Nkqxnq-IjH1=6mO>MNzW`uAi-~{{Jn~{=1wl#Et8$8W#2E7y zAzkBlf@JytN}fXiXAdDJDGCpE5nyAEMSQBdYGKq0wZtfb%?rRR22bWHF2$NFUN%x) z1nE%FiWmV^5iiE`3*c41KfL?>vj5309R1xN_C~#ae~;?l^!Pz|bJL&606t~`%1DgK zMI@%9mJuSn=dCpnErq#wnFZ2Z=#JF_tYm1=aFoO}38tQ&sMPgh3VMSbN~ z#c8QEIu!+)oP7ECcc2;)0yu^57{IDtvP$Ct1*s|`N9v#_1#r<$Hdc6`A7VDjQ+K|y`wW<|0m|7^5h&QYy zZW&njDcj3gztg5!pfZPckGGsI6wX3`&xnp$69SJuh}Y`ARDRRRZGg^Ho1wxfNgIR! zPT_k7&|pltlWN>YC>%BQf8N-4aNkh zSWIH4iP=qFIUUm}fW@R=BXLOP{XzhLSO7=;%ga&!&A$UkUH7|#Yf!g6pf|d{dfU4l z4EPUb(zF4@T>zPjg{<5p#e+$Mm9#72Ucftnvl0${@f^Zc5b-wC0&<;60M|-e#jqL^ zmd1Xj#)Uiy&IRo3e~2)_S+t=-iUqtOsMdC^?KN*HSLyiYO1Z71?bs6%g_X#fJ3egq z#PaA9EIXEk1Bl+>a=BrHYyg9cn&zBEiYb&+YheN( zsKVqc15?WQFbUu*zJ-aqWmQ5L#iWA)39}bKduwS` z=J0FWByD1&5s^cN)!55f=FjhCFu+Y0dv7S9dxMXL{Y#>I)xSZvKYTmfnrPTB% zSbf3*u~n7a2G4#3l2hSq7f9L+EnwStc4}~!#{q;kVUt*GSgDx++i6ORKugbTJi!9| zO9hKY9pl!YCbpi9B=*VsfU59CVNdLKX{lRojdz|*~gjf;fXR@yiT zpt2SB_ zWHkBAFJk)YlOVz!p{MYj7NCf++4OQi9jvw~Ore<~_7(U*mw3%>1X4ju&b{L8ULI9`t_yE3~bLs#2$&bL#-;cT!?!*QEiEon+S}THl zl!=TnCqWpkTSgu37?M~HZ^zVFJK~hbYjC$%w>#=P0O62hO%4R&J_)=*?i88=U@t)1 zD2U)UZi+zq7_Fax<#^-x_+Z^31n?_nY61SVgaA(A*|k%IeFhYwUb+>`wyFTy>q&yx7o^!7GBBPF27 z;$egZI18TH>i}N_;eLSA1~8D=ZLZU>9meqi6UIH-SVDu3{28+i-`L8&Q-V)XTMJMb z@G!yxoCS}05=1xx3kz`Uy9H332x3AL0#CcMSp@WP$EFT|>D-qCFQmr@saMv33COzG zv;nZ?eQv-T+sU450R8r%5>LT+-c(rtmvk-V2rPo!wX^!ufN8-DwQkD{Nh-R*;46d$ zI17XY_%Ol(oWfHF&~FuEf(Zd2xotKPgR^!L^F$%bvv!XXpyKxeXxT0qb3nA#TK585 z$*9MKM&~TNSw`FHE`(`30oTFWVgXcM#GE<}1+aFN$(FB*oEr!i~JelOXpA3vdcg96)`EQrctUcLB6;6ue<*!UXIU0K{A-_gMg8dIesLBQZwN zo9pQ0mUjFN95-yaL=I2Dwglw{sP(y^1M*`!uLOv7E&O)rJ`ESE;=gvF#D5bO;4Bap z;KK+Da0*Wyz^rv%wd3)>3!p9yv`d601QA}Y#~QaPX>8lpv9!dTs8+|vV-^0JumESlv%4eo3-E{qNQuN4n_rmCYx}-!0O9a# zt$P*$z2{&JM7*p^6ydCu?R7Jp9{Xm^3s79yaxZ{q;OWZXDXjY^wL>(_uaEs9C_P7P zK#a#CNW3R<0&Pc*p|#5(845wSiBz*Wi4C;ZaRG$}&q+H|12CT6^)oz> z8RDeFkN`4_T(BgD#S1`Lltma8aRCDexWiFYusKbtSH1A#^yBn%v`6bX+R_EO9OUpz zj0rJZsCoF$^1d_eX6O)DS~3bA2!x(ztRn|g`cEuL&E#iuV>G>K2l~JvPub_{xD%jo?>F#TLT@|uHGR<5mmzTi z_Mm0e1|0fQANazcWy0aWMlu}En3xrB@IJs{+7H0d?dIMZpR9jZTqJ#ESX^Dt^_gLC zE$;4C+}&M^6n86HC@urEXeqQ5cXusXY`C!&cXxLv?!5DS-@m!$$3FWcJL@FbNfs8O zuAnH>jGI#L(u4Z0ncI+B9%^$B*c09&aIr8IODLqNIrX77vrWilah)dmoyh0W_tiOH zsv>m?*)N9;7gcV1Y7<=*@^h0v24IH1v6Fy?QOCqs31o2eE9zIwIQ({NUeXwNmj$EX zg<3f?y?6ho643W4$V8~RO+Q~ptky>NXR3nMD)9Qz{3z zLDepE1TkCrDAGf4x&|E`8f-Gp?1OgH%|bp~^vVqt3`$WBudu$l;t`?^mWP@Ec_d*Q z@_#x}1X~eRIsWom|K9dC)|wJP3m9h&{SW0Asg(53M#N^>pj~&NWlciN2*jS;mDwc? zUR|4EAVL$C_1$-*?$E?^RRi$1V>!fjE^Im?Fyp~8@d)WA{3IMV9MgQGhO;cmzRL#G zlPw33QgH~3-o_h{rWD)3wArZu=tT`^_zZkr zgmDm?KKb`qdfg+C_v*VtWH-X1VFZ{>$s2A4`iy_k*_7KVX5&R&m!FX}pB9 zp{l(J$FMP0PrKTUNvcEP8X_LXxIRYTmS-cBIeb_4nf338KLfsoK3u)7VDe(2it~yg zYcr+3Uj3odKSb)}r>^8V$z3ZBjhz|wQ~a-&kUJa%rK^;3CeZB=pwf!7EhvF>z9A3L zApqta?mF0P>wY<$OC*;4VCKKEsGlZSRi3!}cn$e@W7ZRhyE~Ai275kZ^q4)ZVdfHJ zRGJZqwNG+Xd$r}c`p8Q{YHF;Q+-rLA+x-JB-Gx8#jCW8g1Sv;$iP+x1)?}mdB!R?^ zrJMdFHb(qm>a6IOTWA!zyz~P?j`Qq=E?0FY8{K^ELGKxf~{_zx7*3Fx-=%audYrjZud3RR>YKe^F$i|*<T3J7-{C;3%HF19^#1AqW|E z8juV$y|jxF~z|k(aomzYjF@NX7Xg_03ScPqy=q*gNi$35}8U(Qz zgo57^Qm?sMPk$H5MDge$l+HkAdu-7DrJ~yZ7By z|B3j1AV#j=hqpQ3tOq%OcORPVH+w;HS1rfXOZW8I1t1OdPgk`?#?&8Wmib%NK zS-EjZAAbEN{bf`~15Y91m&_#IQg^N#;_> zPyL7l_3_cZ3~44btP5G(Fn;a}wan>6DDwDzyz))Nhi2Xl*_2`qLw0eAHLk9&X@#uST_OI?ci)BKnt147u!= zr_|7=dxz$xSI*C75kp{i{cqAdEB-CDb>k+G7FBb8ve|oAt{idbR0GL>8QeKQ2|YAS z)H32PqPH>S70x?W_|$Q8gxh{swO#=!)Tq?CZv~dnA(}rVp)FJ~ZI(+s$_qQ6$gK>| z?uMbM6&K&%t+=dMYld}U;tMv1It_U5OZ`m+HQi9GD*1Gh4X5~!4LheIyOV+)OlR+M zqB@vERAN!L+D%9IIDR(XL+%#FK%)pkIl!6&fT%}szlH*SW!&4TwMaih7LtSn7wm$b zu))k3B;DLU6_LhI8+m!*A`*kT{Rsp=X@ciJaECEfJu^aM?Bw22O!LV z&Bjqk*)Bk$H0Hcc-R@e!%n{)NpYzeuM;hjs4^dVuv}M{1tZCl#j%%>GgiuH=6da+} zB)#X!0rv3L$#}Yr*0uDIw@c>;)BDNVBz1uz1^OJY|9^!H9#^2sh;NjRg->*d3qGLEfR1OPL78-Yoc)XWKa9CzE& zxLpxLI1V5uLe-Ru|M)r#mmBB*nt;ibT zP^J|h=`CROtTjsmfl2**?sK?t%j=3fPC*ZsDv=aim`^x&(e)N{YUm1DI%vS0?r)E+ zZ9HljpV^3%5M0=>JpRVGRUAZc3dw&D=XWj5rzHPN4=~16$MLPX29)>E{${jTFq-=7 z*1v6^yA*bH!RpkgpHA3SjKxiqpPkAXtc%BCaglg5yS9?HDuCrc#Fu zQZq`PSzQm%-{H|+!|GSe|KKt%klp`#^4Z%9ytH% zksC^o>+x4AL)DzKAoj|xqOs+EYcgs^ZGA9u@o8%_&}EBP=1(-DP`09+a5V7GIe@15 zW8FNMl%r6xW4SNmB*|oSF&3sPj6QO*+?GWk&{m}S||Q6lr5siGqk3Z@!> zsf3p7qXxayaMj)zSt4OVs+v{9PsI8oKXiRUC0q4Oa}D!9q$P^b*N91YdnCCrtr0U} zB@biKTXI^+8@X_v>Q**>4|1|FP&K+c@`U9%?fIkAug}nm_!=u`hFGk!{>HXjU7zAO ze{ezLePsM#cgU|VAED+o;Ne1hyGbJMCx5?o{4?;a3Oj7A^c{w=t`|+}7-FIdizBO* zJ7~(&g=lg@GEKIjA`O#~BE>gpkmb#K8gCwc?u-%ZTRLiPWRpONNG#qF18mBgQ6zA~ z*Y$(D-r1?+`FW)~r{YyMsSjQb4zyq1G4gVgR?)TB0gsm$<2ynTRwww&5l-OUZfi7x z6y6kfOwRQOlciq!;dn0yRsf=5n-3o$Z%9!f0>zIRu^+L~GSskbr~4&^OH*qXdl$N| z|3w*ZSb=WzpiRkL=n0duAbT9N~A$m-5X9`mtjv9y>|zn|}z#qLbif6LdygEW5MAI#Jx6j)y1{ zWuu5GK-skbK4niHkhJ$mxhK}5&zh;d+kHa;``5}8J?7Uy=Z2;};gaw%!m|M+*FR zEvC$3`^~y%Cu}KK0(7i$PD?qAVgL=FK$~li&Ok@4XuPz!y>qx~uCjy}&Oj0tOwxlL zsyH~m{F}C8hXtc>{qC?5N7K5;#px8`lwx#;ssiMJH^DrKPI-uh1F2EI5Ugj5D}f_$L^8LcH=~9Y(Qo z_P`D!f?8zfR~P3R>CkRCjI_?;ezzPKkbVi{PFj4;?n(vR{jg9@fG$JmMjARf;!7LR zy!X#4k+4ERc<+@Lh6rwqQOk>XjF z5E~lqyz=PnfZfh&g2(GpUmZ67fWp-=Xpowv!O|?hlt~4_e+Ve4op}P zM4sV+$C&$@w2si2f1akq!zYpCcL!WBuRnX9S~+Aru^Reo?~^0j>jVB<%mQB{JB z>R>V-3%en~|4=)-_(783ys5F)qc<)Nz1qh3h%EV=T~j=}F^{dwScdEPtnV>$F%uaJ zbpqWUX&-Nv~BW4Vg6g zzg_FzT?EF%U$s_`_xX>wfTKi2qRYqP?IafA4k^x`cbxW++_kMiHfnyHHw5aWRG$|Q zP;e4$Pbz?)e-)OWOGqu|AKfcxDe$1yTS!8i_mRI0s**H2f8*r6jUYj8oG7(kyBERiz+xz-7NII?{Adtjt4*nMa)>Yj6| zIM))fVfMS4;4LTBsjw;?aTf*juVzSWS)|pROiK0I=N`*v6`^7W%CZa3H2zif!f)C1 zHog^`b`D!e`w+=AWFZNZm9rcHsU$Td9Ne)=2}3}mRlr%YK@xdg0@}8U0Y1?UeP`LJ zlv8GhM)Grd)MF+m(dmnyi^{hXU~&S~(t)j)C~S<=Y?5xvWy$YutWePUD%5`hWd0Ex zj98C+w{iKKR>g3x$2I;T_ASr36ZDF!9j@0fxL$|5T%a30Uj9sBqT-3H6&Nu4^y?DD z^+FX*$2U*{V?;)mOPlwRNx0A1%}zJPGOI?VK0&3(`YxXDaUG1AGNe0ultHPDX-$Y( znxOe^m!ulX3Hi3PP73IuoX#ybu;Fp^CG`WojO{Wo0P=OQOD7YpFu_xmaII9Zop&h2 z?f6v2EXgJtkk5}s=RJLnh{O3PzTyKba10WHWC^~~l8+Ju(` z#n=r(qrNzZ*dnu--K{0C{5?Yi_3(i#5_NfCD75^S$W5hj3qMzXlG0;X7Re1}Y30zq z$UwB#SkBqUlDyJ}e{k(9Gqxlfv~0}wq+BI@jt-RA72Kqf=!Kf#=Dh8U@cg>Y81;@` z{IEH31y>#jjCdmvR81B!@h^N*LxVX6_W~fB*p|0t_#PBlV~xMqTETAye9j%)o^^HX zz+eCMuLDN4(Ds_sa48DiTKK{6NS6I$Eb?Ii#0aL{LGHrI-^AYZc?!!%VJ;GY>B zl<}G4Tj7q0v-W0ZV}ik@zTi}06YvnbYJe^R&ofNmBGi=?nUv7rxCu0X2u4A9pv(%J z>V?%@J}P?42Ge~JfV^n$i=w&Qoxr=7I$rjPXaSuL*?w-isT8J4qev>~;?JlRN}mPD zxWZ4IRU|33nMod%X|-?NOEdHHI-q$*{+i&yE9x%=!SMrl%Osz3*+@*6_cLNkN(~04=<14w;1Zv%2`O#TA~b@xA`gI{Kca&qCk85dyAf$F+5oIdoo}%p$|lD zLtEXeXNK4I!#m)24_Q%d{--y^(bjSRyyKnhms@1od*Xho)IWn)vjLYD|QR{5KbjoP| zp{^+2I)4c#6Npp)Y@0*tpvh=23e2U;WEUAs3XxwQEaG-leG?GpTOzo;vGMZ8fy$To zB+#M1Xw|At5TPS}5Z1{CLe@+0rL?Z5qwc{DeA)a^1?y0NH113QikJ313c^hOc?4(_ z;VSW^Tlc_><7DSIV0wdB9j6`GS>-NgQJv%+U;=vPaK>y1DLnU?c{f-=(?Z!8X{zn^ zcDzoHAw-^$=JQJ9($dm(qknXQNcF)Td4pwH_n~&l-uoLZF_lxk)Olu0L7+n-BA6Hk z3}$7yTv>ikUl1rS-=>U5>n$BgB3Mb2H9I0ZPzjLr^vq^dQ+2{0jJe7LsM8)q)dI)( zhz5~rS;=7Y2}rqOpzMn&c<&M^t0uDh?P|vpi0^cDm$S3pH3psD8unFSwJ0^%vnXnS@QP5Vie0Rj4L+N43NbRVLJp~@>>w*Pw?u5 z0sPJijJS_#4cU2GLHREQT#eSMbkN3l>j&#`BDW*6D2!_LCf>~~eo*(=eRgp=-N}m< zv%pEM9hK}Sa#l^KN92cax7`vtyk#1+rQFd9nna2)VR7T(C{X&j zC;?MyZxpnwLJ+}2AJPth3g$-)eUIm&Pd4Ry<~YsvbP=X=T#~Wf+o>EGDnC&0j}*@_ zxYgwU=B8FVp6&rL{cCByc)DA->I{1PZ8j2m0>G_HSA`Q={KjR3O$2kV@VE>w0r96I zh;Oyca`~j)b{G#9aBIGeyJ)_iCcicd~7>F;}f2+R_VczAv@hLfPtR#v> zj_G#lY27z{Hwse?kO^53#f+u#BH^1LI&n}b=MW2X8h*Tb!kdrYJY>2)r$zoTOYqdEN4Cj#HSk4DrYjSqo=LGthM*30h~z4h>u*&oa>9eJm}|y0n_hVj5W};tf<|uOlH-^OU3X_-#&N>0ru28F z&9fz^!HKHy1YtBXyM#@G)YAu@@{+#;n^p!P`US4skf}I5PLL;tF}CMW903IfpGd_Y zL>$5={CHe+i_za1v+u>BGyYao7T@}rWExOWur3s?H4q!Q+xR77Tr7}a1i)t1w&i~8 zm)*)dLkA_r(SU4#0ZsQio#W3ZNu?*|d?icV$#`^&iLB4;)6)mPKMjB#*l}R+51zyF z%F|%#E%l!f&0k|B@b~0@*k0YOibdiYs0B3<*Gl}^MH*t8Fbve_Bm2!ggfTl_SQFFN zvQqHLu?!`4m|?R_Tk3p9sy&EaTQ3XuL*l-7Z!)Lz?~^#EZ*p^5Mb)gC6JKl0zdA%U z${LuvBvw$(JK>i1HFD$`DS!V%2FoEhlaK-$$y?t8Ex$*&o8Ca3j*>BJD;%2{)9$x*xIS1dSbb#phw16{nCrtDh7bHWii4KhWqG#2=d=N_9`>rw{Nx@Wik z_=3&T!5jP{+LaXsF_$fErAJ_nQZWsBj(XyPE)0^y37!(90+*bjae{7vpArP23R~T= znwN;@eX);0Yw#3YsgIPdcy4uW_sGoOzkUDg{>?wIF0y*kTZ41lqGO%pXP#=|^u^z} z`LyS#WmB#YL+`A5p$)dGRU7GrbiH2a1ykEz45ku@jBI)oJV}9`Y^an7zL_MlpUM&Q zBa&-}nolo2Y16BCfZ2PsFsaj#*+So7eu`DcRdmWYLcvm%oC%5aX z{X*wf_aKJNwPIi?ThE#pymBmar^fwj@GJ5W9*4wBn-m^mv?|EJKp9EPToM;$dTx#l z3p;H2IPhs^*R?a8TCi&&us*|$%EEkWYoPf84z?Ks@sX!HE65J*jeZdf=ZIIOQl&{! zlK_f1zc?l)zeu^9Z)1@@1Z*TsZAbN`0z8xS?m&C+Z<&LWfxDcM!)(ut)A#|X2nkFo zU4$#2RPW&Z8mI(fr?AJ&Rq_#pZdaS@XQMwG`1$L;k-j>|hSCXVKLGEv%3D7-h~6(~*t#RLv+Bx|Zp zLbe6{zmUc=-mH?sG-EiRxs%g;)2dV9JfigGa% zOB9cuiR5`%pCxQ{#F|T~8XQ@Xu z8`KfgOi-(7fVf9+cE~iUPJJiw_0)`|??dR&Ac!4n4?VZg%+T=E zR4bbairxw!=`%SflOw?g9OR@lmlC5wz;tMik2AUmZbT{->bO&1o*xlAgy^n970bh2B#3bbJV`P_4>j^^z|2Aa&L@6JD$l(> zpS@MRa^%8UG4$t*tR=LPlTr7z* z(;E%%&G#{)R}V+2>wBTRj>yEAU|#QicWtdTXt^BN_j#j0F{BkD_IP`e-$9`-9J*5g zV^}}N%cZyZPM5h_3YOB+PE`?k!u3LXheFHBavN+LufG{0jjv4`MSb}5$Kj)alvXIU zPJ)&muIf5li2u$0hCMFy{2aFg!GUiV-Qsj7dL<-gz{XA`en0LI zpsnG|_?}-Baccr`YrZMToh#x5u;qw_6hAodrz|dAM)<&iaDD2Uss93kfV4M+!N01c~{!|GtrC8^9(Q(O%C-UvK$F?x>B$hr}$i^9V{-0E*t`h(8SF_!XSv3S}}uh1aSA+(<4d zAl$1a&zxrvV!sFV>>y~r>E4ua#hE{NdXAX!`kFlks5F%~54d)UgXA7r1wy2Dxr7#H z&=`1^w)ws#(7~H0ZMtH1^+V2_z)$x9Sh@9zh|s3lcg8)aEP}#Is6~~l+aH{{2)5P~ zg`s^^Ft!lCt7BEvRYDjYB0|gK^k&eHxA3pd!+ACLm;|h3EyAFaKRX-f*)X?9@O7^P zoEjCow7}FeZP(;<*m2lFtA(FHx$kS}_AhO4KhB$VX6h_eR;lAIer+B*s5vhc3z0?P zBLRDu!^YoX%aU;h4B9ojO>4`jxT79ZaRE_BEXMSIPz8{M)8rSAmF-y%S<*%0lbB$* zXzNsz@MD4Ko(JqE{|@McyKkot#o5G{xzMr9!Sl`9t2yXeY{df;sDo!#=KN@t9La&OC|HdD(b5CxDqPS$IqwULM0 zSX6d^mp_31%f_Inr=suDmCvonJ-!*3?D7;r?Cz8Au@?|0c$+DRjirIibxX09g=KML z_kJzt_T$b{01;a5hgC*U*h=~XnN%bN(g3|#g-b@`u*<-I&!ZBgCYvTl%W7Z#mV7C! z?$*pf$oPtt!+X-uI#mNM#f-Jkfl7n2{|zp_^D$L#Nyhys0+sKC%pOlKt^kROQD4Pkw$MnD98iLgUPU_*=fa5IXoU0 z(=7e&Hr+dK!{)agq6W|bZ1emaOJQmkGroYp90TO56#WpwOH&y?H{y%&e@p(Y z@CRCQBtt35{%kBD^mv$zucV^n&Cu4bHewCzBNP6?z`(}76Fyl%K7S~}TMYsv1FnwI zg;asAMf6BP${aXEwAC@}`Sgo1$w*$y&)#Nd!~dGeWc6Dj zi#f?=c-+t*sq5Ql1bVXoS&? zTmy$qUj)SMf0PP73gMEQsS98h-}sl5@GTBI8)K3XMH51UV^su=<+q6c+Zp~n!gOY$ zT*ZV~`Q{7DGFX;VPMH!T2Sef0XpX{Z0U$7tUF7sMhAMcz0z;#0GkClc{o+EBYd+Ch=DVKN6s~T&s(J6$BHGd zw4OzkcV;@dIOGlx6cqHQ^Nj7mqiqb|6>!_C7X}PYt{6!u>R5obAu1}30I^Xd6(xA! zHh&c$*7Ke5Ds_wc63N%4e&Z3~nZ}Ho;pDjT(eWDf;NV(W0bIrHb*$Hn8?o6NFN`M9 zswKP#g^xZ+ci9T0T~uFbTfaZZvv&+?M0Fs&)GzC~+|=O2;`N{Y`rLjL^DO~A*T3wKmY!ma;(s17KD3GzKi6qik za`D$DgY*oss{K`zSXQwrl)nW_O9@!=qmwgzEgm2R_76)9>M6gCi5fGDOtvBz<}Fc9 zdlGKQXX$Q7S=-uvGBI=-u+eTD(;q(kEgGrtC}3+QT*nMtot#)3eCbyggTtLL`v)GkWktKp|ed|95y?5fFf|VT+~5c|S|n4V71T{!#i%u3t%{ zisluH+Pm>xzsH>b%31HET-AhYl=itPiTi9nxo_`RA9Yn~@GPq#%< zF)eSt95*eCR*OoudVdFA4({!L`T`7`#rbIaZ$N1ft@rP>4VY?j6^8Phgu_x9qFV<@ zL+Ny~AU`z9&Bt|AR8E-BBc*;T0ZW)qzJo)_O?3^ek+Lxlt5L(^ZU{X;Vjc*HZX9vi zm#9b0`uL0yV_m0pAG~7)mO3d7Jx3hsn1~3EmC^ieLCamw*Wu5qb5tgeca!1Ag@Vhe z6gLv9uiHn*<+nE{OXh2x-j1)aHB=_-Q0yG@l4%6P8#qheSWEz_$-^iqtQ@VmKu2!+ zuUGiTQ45YQbKPW#M|>Dxr7pR=uqy@Jve0rX@ESdXauGb-EYK5vyKwvscJPaT1a2kM zt~oJRTg8`$13$k0_+ab3m-ze~!YNEQcQ(vkg^j(|X`OoUP5t>F7!-K7kDbX4?f->1 zo(gwXok4srFU586>Xr5w8!8Jw@Kcu>)F`q$w_4%A&~@e`;TDCALWmfYWnoh6+s=Yt zgKnJ5!7$9s%6Z0%7?vIy>~l5^Mh`$h-5d6o6V9-4u<&h|su#4U$T%#5`cT2*LR6mN z-H@2KW5M6!mgm=Bik@pqC`~S3Ow<2JjHJUy58OyjovO3aJhZVrrXvYuV{}FuG>o z()7M-nyRzDi?>xWW5qp`;e5p&Y)|jaPdI*YDrmCGsR`BUq_S}IkDmjhv(jTJgL82~ zMG)pfyriVj@g*Nh*zOXxtNrbRya8i9=*jok&8K=L&3iTYyzg4{xl?ojSoKJ+F(H-k z0jMO{PQ2hDWX|L>APK<3$xIhi=cU%5=k6j=+31=QjK`Gfxaa4a@Mlf^fww^(j~XG{ zqrp}Riz=o$X2NF@u*mpotx32n?sYd*l(s z-r6U(kJi)-7v9#i4*O6FrO=9Ej}pPU#2$Eys>DFaOt2q1SnCTK;jK-t>)l21HTGlv ztv82Xp5J!f2|fBg$2Us`dlD$!kf&XmqF(G=>YSPTf!V1bEDSrS=f?(NCILy!245cU z&R;oggE9j|{GS(#;PJ?>y=InAJE*mRv|h?A$h8ix5$^x9#P$ow-INd-ySL+AUCbSo zEPSbKz|8N8NCm#?lOucRmn@+H#|Vh~Sb_odA7#92t+n}Ft zerLB^AmgLP|4Zw_yEPVMB>?zlUL`><7q6636Heu|!|rNZ&SHFy=9*)1tRPnKb*KwS zYA@&3w_hx+r7^}j3`>h?=8`s-ikEMCcGh(WK9NV10MZ7HaByNjA)T4UoAAI2J9lN2 zQmz4{CJJ=VPviK=06rHUjWQ=!52Z}p{lhtr7@Pf*6Fv9zc_;94_|lmm+>HOxFvD|_ z(WvgLlc%-Q7wJ9Kb+>%>g{AL*0{Nmh?(aaPECHx$d?*=8Vv@-Ptw|kVfE`T+YZ2)%`}VJKAqwMt`d14Ma!ER|V$%MnU=0Qp7h&Yf+X7Cm$c&N0KhQ05lmMEB3xw;!gIVE1nG0~~t`_<~o2K{9{nVek0Z zK?p&b#1KPN#)n;Ga5D!?>3Amc4>o*nRIDKw1q~EuqS`>SU0K>wdgnkhVg}?&{%AfFhvI^vR zlesnhv?K)EZjn1CsRt*=4CQqagU{2f{QgVQgtVAl8t)BCv~!4Zq1w=yja+gJ97@E| z|Nh-Miwh~H#fbj%MkF>hj?Zqz8;M1=5CE+veu5_P(oH?fD$wwh5;r$YcvQ9g0Mzdj zh!JlD=np(+o4uNZ{Egkg-1uC4??vMhx%6n_@~~6O!s<%LcZt9w#R>}_*^u6HNNK># zK3SvIs+heOF$`zlKSgXPpcZcc9RK+(@_E+ISxKL{{Kp-}Nc!nI15NAjx-n5G{=c4X z;RgV5 z7-T&#f?jsZ6l)-AIh92!PHzq=SM>u$q}P0gO^XsdWX`Y&Ui{pnGLA2-XPS}&*&r6z zSvCZ-SJ7!zzp-JHqEpgD7GhP_folE$%VkMUt8AkDn_ixN=L=`qR8x|r5Q^+|0nzCO z3CViYx^*8PwdjEue-HqdhytM9M;V8d&;$WhM&xu23Qaa#(c_zMhm%s`4&?#&)Wv*& zQgBhRhNU3$Q8|w@4aZdzC}Ce+eo`imCt5*BI|YATiPvsMy33z;H@f}@|rsrMvtdU zP;dePUVL-r+8j!BSD_drUx^A9mqd!#XE&pM)Z(X>Aw}$k%2Pn!JZSuwP(`gRzE_w9 zC9B0_CW}KJj?xFF|Ae`Ql%sz&GY%4(hnNrK0Xvw34Ca4dQEP3f9e%z6?t7#06dr7{ znIJ%{N|^O$%A8M1(%^k``<7~_{J#BU@cM&-dyJGQ+;+d8nFW!J#WQd@gWIu9*K0vL z%DF>07MG>X3Fj%y#_IGxa8y3@lY6A)^pZT#JB1X~!l+zjaYx68D+#0m_-zzGurq$x zQpQD&&0q5fX$pi0wSW}tM9Ug#LbXCw8$jm|z2HdLv+y)EL2;c2y*4d*Drl7t~QZRi!`Pb}o^ zE94I=mw6k^()`ZjM{U5H0Wo~g_LV&8o1Yu(o3~0>K=qEVpQ)otp^W>NTt7n;Ze(SZ zm?4jEkH3h7DybBZg7__R{mlR*{49%H2j!Swg@iI|VL-ve-L73&N+j6k@0=}{i>c%3 zbls)Tr?<5&cBCXIzvgdzCL)C`EQ~lh>H)fm9@%hRd&pG0gV?C5S^KuAJMl$nn4XCR%$4@!Hd4NzThcClbh;IX8h;*%*%#lmU2#it?cTFsMa67eRFJadByD zH#>|1+8nxDOFIui+9tPJJ6+>4C1 z5rUl14;yL0SPb=%@F#3CLJ<_I4-p+ zy4P8>3?ss{o9lfDJM7O_2^!#yqeDJ#*RP9KT>`-@wa~($U$Cu)1O5>M=KRe9=Frj^V?r++^F>r zDIC?na5J=XwR`KnQiv$k`ui`BKtu&BB)=cEcbW%_1QXbA;BTYK&HbdZgEr?cd$UfC z+U3~#-#jYwqKB}YYh4B9EBapj5wP{eR-;R9v%QB+S`s%Jg69!YkiObfx{NG-`MbxN=vYy)o$_=r6Kw5^oWEi;l^ zpR=$o5|-H1D{M?CrJ=Cgt<0ijjlH*=Bv}8oP6Vh=#B55Cp6< zFxT-*owyfK-ZkW)a50A)ng1kQZ&4>@rF73XV~|7Ip-l&GhVdREhxhG!Q=qy-swENx z;m!`HLd+*r_c&5S_ZT@VXYXT)&e zzjr5wE2)5ioWRFls0lSJa!m~XQXEnB%fEFF81RE?HNkcx(ZJDF7>4Hzb}Ip0-?CW- z9<=V0d%fP!4i;iUF^ogLtc{uj)(I%~-Hys0UOM(E$vPPw9*I%}a_QPL(lk>sNf{Hl zwveig=sSz6AB#Zl{+68a{0h;HI=NTIvXrhsHw z=A{on1IAIZiO9(vadiv}bJql9-u!DNqG9pgBp5#v*8*GV7Y_@Jk^bOM<;DO77Uq5! zMJaZ9XiVt5O?cNm4|@6A~V^;(KVNR!gh}&z216VKJfbon#yypTFZ4 zdvtOk&_^i!y;KjBx;TbfJBIQfe=w~SX$BF|e{U^tEfC}$sxyeF-~N#P=@SGlEdAxG zf}UVSNG-3e23Bk4g8#;$&H&D|!5BW_V?=}k{vU*|nO2!~yuXTPJCg;Ppr!vUvhUbH zEObcYzPh?1MrxNT25cF*o9pY#P1MTS+V;vjA`Vm_EWwqK}NOb^IaZ=^5SQw%ymp$&~oY~e~Y zuq5tQ(P~K$VN8)u9nLx-jVPf)?BgMT&x%?|{Zk%5DuSh=NQLU9=*)UWw3Zu*BVb*A zHA5=NsNp}7>yd6=IL113|E$IG8QPgkQtntTXN#A&ttOZ!x8aPlWwm|!A4X9;Xi^$F zwOPf=DIfWh`gES%T?O7&68y4DrT~%%xx(zDht2fQNlF^o;;xTLb_q<>sDYn~EtAxt zitx9T$kx_C!)YBo~GMV=JVw*@uXPe7Cubj&brH_H7M!f8J(T3kd4^Vv5j_YoP zU@Q(3#MJ)cu7%+9`x8=M%t4IYZ5#ZRIZqHzZ?;AfG`|bw|IWk55nusLYHR#}w$x8r zl^v&SI$cd~NaC!@gLK;BOJ^d2Vx*yuH6(~ilDhcMm`I>W%y{oKh*HN3Jl~%IXntq2 z4{M*{h83AfW%@l-$}N;$@C_!t{A}&zxC%pdl|V zelh%+YX^Rk^7%kvff8pL`Rer1>1}OKv|!=qUWS(I4p=igEGwtXr)$9$m-_lC1D#R2 z^ckriq9ks9msWVHWL$Y{*2B2mgV~hf{f77%;N4}mLeR3!cMw@^6urd zSA0Jv*a|vCsVdc*rC&KAX+?2tj7iGLyt!@aJX0N-wmr;#zJ$BpVpe4Sd9JFy;&*}q z-T%QwP7k$G5RPY4D5pfa zzwMposWN}6AiWQSIKHzC*!t(Ytpfhqr{NQ7i?3G)Cmas3I|fgUw2=*i3k8CM2gec3 z{GK1|S9AqHb|26BfiKVMgy_hVDjGw7*^k1pz=b+678)3kXF2Hk%uik6q=R!v z8&NQn+QM`VtbHYaW5L(dOc^8#s{Y&7v}y2WJvPUz^X|MNQ8^(ZYtHNTrw2x@rB9MH zl&z;etK<;_Z1U`9Kk$1@2uUfZ9rg|W+*e!+q^!P{Ex0#(2>z;&uQ>GR`<>(2Oe~1* z*Y{vy4p^`BcnKQImH`g6MBw$U=4<=%)6H{ayiQZVv;P+lLSG+y`$%PI#np4k*F@^J z8uK$5f&1l4+7Al!3w?1@UGeAp z-VeMb5aNZU*xnx96vFk#y0NZj@5`K=;D^VvF3D{%m9+i*FXQ-_m&6vha1Fj1p^Q`` zh^berh1LGghu}cr>a@SPCrACe<=x!LEsf4KajNgP9bLsz!8UxP-Fgz=jE59IMkg7> ztV2)vUJ#pp5;_if^WaSSGhZb#YTe25QcdT zL1xPTN7Y+LMfH8}<9C9gJ0&DUKqLjEVUR`;M5LvWZX~1zq#KlwPLb}eA*EAFYG{z| z5aBz%-k(2yzcp*tnl-cTbNAWj>}Q|5=iX-{TsK8gQ@iz-0em*Ed~8!+Aqe_!GVPZ% z`z$`}VW{X$kKLrS1-YY^qSG>co+uZa#f%45hXDf4tr2xw+ ziO-(uU!uQXYu{k=JPcd=nsF)FL*%i{vUs^VzduU#VkPNpIE|d480p1>>wVcT0Xo4* zWC8T?{Wo;~p^p*kVoF5Z##5kDr0*Y0M?+^((XEGAJ-TNbNQ=rLUgY+Y8Us$hj-%tvr zANqPuYnIoHF0r^$;|}+TT9Z*zp-HbOA41F@DFH)B5fL&T|X+Sie-O zl&*@%Wz6&qF(G9@Uzm!HK1NSh*M`Eut;o@?HYSzg*x0BmwX%%o*`tiCFqUPR8I=KX z7l+$zK8wT-W)eKTm5Cd#j%E#6%io3EeQfaXXwRqYO*X%d>RIez{%|uW}7S6mK~1*hOj>pUK^)x>@S#BUbhtrEe&7wAcxO$m&&z|@$z*_wyG?UomY zE=1O3BtsRdMX1l-L{=kdL^}#1-x<|6yJw29!ov^D-i&@~CQAk0tSgD5+x)^OD`q0z z^!a=X?znC|un!_aWCaEj(q=fD)zZ+^tXZ4!NCXdTILFF8soK&cHQLEi*UyDJIBSnvx@}Y}Eqk9cI{pRcdEONNp+Toan$dGf9+iNSJu$zcDqgHHIb27{hCvo2 zneZfrZz|aKq!1RTIA=Mjf2?40s?nMZWO?jej*gHA$km96_HGbZ=6}^G9~0IQ5fd4C zV#V2|a$IsMN5W7LI?BxiROx@oq(jxK5jy_q-Q}Ip{Wgq_FtZw)=u#7L`uX#IpG>1#;ae`Yf#{Ocik84hE2zqh$K`^0 z{mwDG%L6nKEAriC6heSh9|8Ta6q$V#WVA}Y|hK{$;xF}3j}cqvAGh>A?>tF)rmZ&RYh)Sw#fPhUP#3g*01* zQA2|07iUgE+eFY0Usv2|9ZDb`IqDg4x*S=yjc;~wuC9M{Z^BdK$Fd3le?g~lcx z)@Z&ibWKwgs~w(oF&PnFzO~r=Y5_i-w&8C(z^T)nu z0`crU&8LjY{IV+nhX-69DQUuPr|HwyicC~cudK8C; z*mBx;roCdU?(6C!n{+#%Mu}rH9RJiZY>m#2I)0BuJ8b~bw;>%DVmSEjINWx?wZ##9 zUPAM3J&b_zOCg;D-{HGBR0?wQ*{WkB@Y9ScA^yk6KBk8%*yC=cfF4qU!;l0|EQ2t= zcOJwV_mr?TZ>Q245|GvaWIk-C9Itftx=9==Pp4h0OCfAth4F?zQ4I&VMP56a3pC`FO_6En{Vvt#viUl*+L@;zBJeex@@2j{ z&P<(2bb-H>*7-vT>=TE$9VElg26&nNMR24s)@;xmig_EHn#%?;4XS=Nv;NTD(nYmq|A>c|wo zC)GcXhRxDW5zkq{vDlxC3m#E!GuXStKs=7RwK63j(-^T`)2R%wdZO+T7`F4=V8HU0 zF+`z1s@0l1S(%V0trc^#(*aBsxlRV?Tg~K*{uZ+?)kV6DNzEB=)GXQ08Q~qVuy~01 zm(X_E9asUQBO@b{*Jn|mJ{4$F!YOX2u8JEtj}OaNSmCw(WKf3lqI?43;Orq45lrxG zuSqU5tSjLyi?wsmW<{i9m$7ksIgbH5-a)SFWSR zvK90u(LXs%|AyP6ZhYu?2|8)kF0w8-SLE3QODV#`GKMQ^7cJ#?oXzR#soMdGH)ZuU z+!z#++7k?LjP{gp`yoHRV94b5VjpE2#$8#Auc~JFto8Ei|##G<6yFO z|4f}oYf}#~6;jq(x>1^s79jr$o>ML`w*ldZ4`z55I`NY#>Yg_&Qo(pW_#PB#>6MOb z(Ff9GbRMeuFTa1~-~MqmIRPC?p7NFy*Uccaq2QyLV+!#w=PMq54@&K?OQ2jkCy)5V zEBkkZO1!C`nuBoXS00QO6(7`iCOQ_QSIfY4WA7=!`Oi11w36q}EfSJfCa%46@($iZ zW^rg_l0I~S2zi8#lOhdf3?&6+4_2PQ;Wug22!HI@fcgWVFYQ72q>sGW13bHE%S#tZ zCk89I%D3BCPH1qW+gnuES^woy(eI={>-^(uIN;TE8J1~e0SGS$Aia#YIgeFRQ&W{f zrv>p{sDf){m^VE7_*9HM3C9Dixg> z_N+(L>xmwLjNt_fg!r;!7&lvo8qVckLXZUqG^u>S=oau8vEC%o#BpC7D?+1+3_!Dw zE*@xwkL>^6OzU^XzX^8O#iHbYJv8kyUQnsdRgAV7mw|7I?(BWb!Tht)k*34pTf=`b z&nne4G+aTjH%5qBB*pnd%+h0B-EdhrjVGnX{5vUrT{`cvSLPgg1>ix1j&zwfyY8PN z^ucp2L?XPobG<-z5D<{sFrN1^bQ!B3v{+-0<2U1X$HC(jwf?%{UJnqy=SRd`K>Dca z0SU|C86Kk$t_?c*;rL1J7fEWO{tu5QtP9CzhbgtTj$-#eAnUVcP!7gDP@%d8z?l?f zc;VNAdt1YsY&U00=x8@BIIn3ZGd0(c26T-LJ%6{IV|G!eQ+UBi*d|*=^@+D&RO=aU zWT;`63Sx~K`DyK`Ej~j??Jj_CC89Dpgb69LJxD!$a_`GyDxJhn62RYr9o)Qr$o#DA zeg6hoPE0+e)tqiKuVFt;cj)%6Jz8396i^x}Y9pL&!V7+hT6_ob-m`}^XlH1?Qf8}l z#h7Vv;N0!fj4I8ANymNx>2Omir7wN+v+4cj-p6(pSGB0Yf?8+gf5t1|6?;zBvL_c`=Nx4lO^=>)viu0UaW43*T;qDZ%$?F=P@Y{A6+$ju z!5=YvaltRw`!2?X6h#F)`pOzz?l=PoU)s`T&1i81tPII>HslEFXF71vwD5x8@sZz; zKcs*6bk00=xUS{zA3%5I%p|bRQdAHWZ3x`c3rY#uzQbf2N!&ulCWxx*E6Q-DtjEjU zYZ67ClY(d2bDkc!?0LLdT7CG?ZMHuzKIr|QZIE1ktnWuM(HE!r&?c7rwX=e>)m(Wc z6QMvi6};ehTn0f9fn6HdLw?Zc+vgqEIb07HE0L<;Hk~k0N^M>x_Cce)8sN%iJN_{5 zIn&K`0z;W%?wk;@yNQjCjFC+E&fMz-41yHpZ%=?p*yq=g&EG0e?@tuUHEk3h1oM67 znq&vaX(-X8NxO8V4{6B-4lrweTas%J4Qzp5>0`^z0Q zc&Qi0NqiH?2o9YYYU9kMd$d{`V@8)1nx(-D|NZtwPNyT5HR`Dv85Q$&!J$EpV?P-Z z!x^;G>Sb7*&( z?MP2ND~`Sz$HV@n@}40I1y_~cmwe8yVc)J^m|LiHZ{hOxP1NZA9U+r@udxeku;5fP z8g;@6NY`ZwX*ECn!VieFuGH=0)T)MlsfF9)`ULzPx@!{%k|@#`DFvd#sTeb+-GNJ^CIRVzvhR3BQw;6|16;8?Ftih&Egh@9o+pa;NDxf*1&G(_ z;9q9wHnb>iu8AWFJrU`)B6m)ZSxhvLuIcis2yVl+kjUib%H{q%NiAkWgn42%2gA~@ zc`c6!C4+jYAa&}8C!Q;Nq`A!XlEJ^U0$-vW9a)A$Y9T_!V?XWAy9T(XspT^4N!m@9 zPi+GjkD&4okk!>4z(XFxOu7oef827-!NZ-(&ry@Y{7QymoS2o0d#OU2a?~z2xD0OkXC*i^C@70zh|k`X+I-=MlvL$`oe-0uejGZ=-02FsW0w2Xy49kbH;S5RllP z7M*Xo^baeZBWM%3J`oQf3bEl?P&4lZFKNu!@L}*62CJuc7xP_{^2IYmWdsmRTM$ac z$T9Iy{ARPW-%+S4>Lt@nO^OOYs>@j@=MK2k8^V!mj}JhS#EUjx6+8RseJ=r%^ZhtLLHGg zea?ck`rZuM1Fj7KFH#0+YBm(iCJF;sJ=?@WZv^8n1rISKa%1hP1^*kfajG#yXczSa zgN%jF#d~s+>cux4p{H` z(H^#vhhQ%ZEU}j^E4^fhJqkqF8RYvUZt~^Ox8D&JnoXdR0EhJ_&Rl@EA=ZrgrcoXw zIFKTm2eEaxaEyEz7frZ2R~6p+FHKJejg>sRg<2*lydWV#m8J$jgLw|Yt1l7Else(o zm4d~;Ixnbg{mo_rC2KMx0_l-tkBv^kKqlq1&%w_OxvJzlzJbo3BchDoA1zVmpFE3V^RS!9HRm(2wHjz#Kibra_|%jN~0=HUpL^s@lPXz zD9~Z_SvWnq6AO|G+>TG~Tt=!OJ{?E_jf+M?C0_wbegCwV5g|PT$L21T=~cF|+e}x` zk1UHRR}%Y?^JifFQ!Sh3W&t_Yz-;uc*1-uxOS1s&y8x(_s3V4n=Ibp_49>8<6U`Rh z2{7}?k>I_neK(aIpv zkEpoz69jz`rr;~;2J+<9fk1;OT)mI_3MHV}J#`@T{3<94BlK})tPY6@mFK+_kSW~I z`OBOK%^)`hD9y!}H;SF?&!<$!>Q^Y60-i@{ugNBHR7g`XIrF$J94Ng1LD8?BsHp$s zyNphz730A^IXnK3e3I``ILMxtIP;()mQUkI88wvO^M(7m|34ooQ0%YZxGJ|?qIDv|Z*Gc*C zy4gCB{gtnIF`b(Rtr@kRkQ4P(nNHUHB#2aom<1;C=~L2;;lW7q+>EKx7mu0()tJ&h zr0I6wK6y<4*)=O+q!yfkBtT$@U?}V`m6^vNZMqK_5I->QKfN&;X(vMRE)Y|r=FfC_ z$Ua5^TC3zLEISj2HZn$7sj|(rjZs|lCJXy+KVrf?6rBA2@Z|E)3FDqpJ-962ThLQw zvY>?>@mqcN4aR&X{T0gN1b;=@$t>fK8$wKL1c#Xkg=1(E2|rnln>E`_pj9fm~e#{x9Db0=>d%z0vR1)8dadLnp61j z#7XtkPV35TUv>NT?163V}WuiGej!NG3dK0Xvb;ERJTwB~3CzI^+5+};1% z;_dYBXOX>+sX%Eji<0lSBTG9-bqY&`7$Tl{oMl zd}L*hVL&XF{!ijrTEicq9{C-!A-%swvi1&dw0QDt%u<$M!7cKb677dsYCj$YC8wX{ zk5GLK$LC=Wo16oSLaw5L^^Y7=jbPi>=;rs}ATi|28x?@oQ;$cE@?t) zK{5HU^Cvb9H&&oAGMmOBL6imaxH3FA>cgS`V&1qIUsfVmtJL8}ye6WA&qLu-XFEl}#yDGQ^LV=L zYlZfrn`^|FS63X51tyraRi=LXM`*D7I32fhxaZf7SSm~-q;`gCzty52CW^jYc{Ed- zEDzMC3Ec4);HxPNdOeKl-H%lj78^^0n$sPP6DGX7Hd}m1mA!gVU*8qBGPtzH$rE9o zN`+Q)t_2pvQb&a0lfmT6h;N&G(xfnfDjJE%sD}#A->LB-*P39FG0VumqLvdAKabJ#PT-~}ofUT& z3@3ANzi=95O9%BF`N6XOmKzpqj`oD%P5_iXP?+pBE${f#39??-5c0&vst9Mj2*%69 z^nlG%Re_nH>g3u+>*p}jnNK&0*{{+15oM;|SPTOyGX5~|n~)G-Se~5u!Hk|F7*lHk zcn!IeN7Tcpa_oR~Q&)9(C0Na1TuJYGPqs9HwpJ7ug&GD3{NyXzjR(#H)be!*+ggR7{pbE~{o3EcH5r#Ju>^lJN=jD)C2K=Mcr4=l(^@B@&4_jFt1W96zpzbZM zh(q^`iEq8ih7&H=(8N0a*aH`@1v08)o7TE;Y^ay~3rUQh2M{$q96*7;Lqiq_Us%sl z51=}&U~?O{<9&gFsMjr`Ua@;?3eZ`yQn|1h2bTnq2YO``EobCRH|_05;ZYv2HFt=Ld&F9?q)ve7tR+8tmHyUmIWQsM z>!4TbQi~SE*1Sbe?b@4SB)`v`bFV|`wJE281>y1BZ{99i^8q)t7beoI{Heo>$u~?_ z$K?OvoBV!sM7S)0sQ^A2UVyFHt$BWD4oWiWUCs=GqW_{niCrZDw@wD~DA{Al=kQXP z0~8xAsF1nu!zD%0*Rl*d+n&kKiMDjzsV z59BRvi+hj42JtxXT)oimg??KEb}p^0t|-1y{RhAQR~)kU<%(NLi%JxgORGnPrN0!2 z3FDNQpWO^7*m`X*8X+G@W=r4sb@qb5+JLL?ZP)9O-5>Wm^B{#`YP*yUN|nNYjCRFw zXb*L>r}eH}=@x(KE$Bm0N}DHH$*&PiI75bNrL#5dZe{Una*{PGASbM8r&DLmx!7j; z5KvmJZ7V(;R#{DCAn&pkgdc01$ieq5m&zLUAF8d3Bf-(u9Jf?T>SpNYHM|9`;JUKa zdNLEM#S=S%qP$$%(JzAugH>Hom8~^Qdo$InbGxt?9p7W$s5e@Uh0HiDT(*~hp7jEv zHhRp!G8LK={?ej;O!^m{R>ldp_G-5g3%7_b5gJ-$ouFGhlC9G+xMfXPoOWb&5#!;A zz8AB+3w|;5v2c*w(OLU+G1z9fj3?_zgxcqRuns9QEo^F|`1@J`7=io){><>g+QmgQ zVTxL-k*ya`6m&6-{zF)khomY0`#iIe3b&NGmEh>W248knpuAg5Y1~k)deR%B7klPE zhsl+HsldvaIX)Op1JZjXI_ULassQn(-vVsDN`?1A7$1HhdzALb8qJ)+61AYjng>M* zQv8{txC^Begy7>qqbgQWy^o|>R{XH^^90%;tuDp3Bz|}}uQf-tc>xO??D#Mi*0B9D zwtcR-J^foYfQLFfmI^Us(7Ix3_Q1Qi0+?$VqoA^WU+WqcLV_Wh#xUgYMIl0-{0_GyF%64TqbU9^bZl zn{eMWdW_g0`sDpbHn42>2kX&y?Hwl^;~tsuCB^AxX864JAUM!8^nD~O{J|kbI^7k2 z<8F`Las6jGSWrOr6}}$UFtriqU9&mQ=*ez%9P1!-Jey!|(7f58{op05=A;2&kG_M7 z)G?5B?(0hF*E75jh~~p=V_&@Ex%d2|Dh2lC1*_>kPrt`3);EeQV83{^zjbyWq778R zJZR|!knJKE83veTOM8d{yQitb5L@L=^48_RaWC=Dm%2tYdP?~Ro68F-`5CRBEb<90 z^)jj2pjkTyPlsyHd>drd=#w0(MWwWX=|BOvA(lE2P0-rF>&qHh6x=A-YSt?7wV%K1 z!(%x_Vp!OgV~xGLYmJXW?FUy|LDS`0Wk2b?p6Sm)NrXqP;y%Z{zdzU#s;+478KCHm zL02@|kh74kH%9d3kXx}kkNpv*qOuYhWUGjuFGD1Kig&n!c4&kbSkWe3MArCN7+s76;ZQzc58t`FM+Xe24Sr>p0?1LI1 z!!zN;tF*Z*^FbPrplxTq*YXk%33W;SP2CCcy ze~dDk0Dhs5k`9;zRQeAPw4vX0Cl( zbBJH@`NwL*m=$LOyS`WvU&$+65-eO&=M6bkFCH9|y4(RX!n&JBj6> zK-8L|UExcDxYL83#t0q56g(aVLs@~xbSDMn4qcnylD~WBi17!pRTT~7&{(F(sgOTs zr5P+L2`sce|s8i*lFgIVet zek!9zP}7>2lLCg$pOvy?Epf=`08oX_HCCxfCu5=gic3n?z70T8XhroC`NJBpM!@?G zig3I@mP#Ce%@67)gUzLc%hV*&P%lHRXg83vwRm|_)qZ9BR*5y2TkZ0SpR>7z! zhsCCtNMNEsy;r$SYlijB+_7ROpt@hwf={}IAWk>Fw+ws_Mmxb@#ovY`3&vIypL_G0 zKqKkW_d`qliX-OI74p^P#xB>P*+H@ULun0(U#VbRWJ)D$8&}E(QTW7z$%$awwu5lk zbyZaBBj8%^CTKD`EAW$x2w#mzRjRRsa^Fz)fAdEeaO{Jaf48IA(7T1&X?!qG=as1H zelCw%U7!TZJ0CgETv^)+3WPy)rvbA%zI~vPdVkR%rTrHT-G*Zck{^jM1@%#*D({+M zSE!{EK>s>vcIJYmEp2GTz%Y8zxq7{G8jQK{Fy>&NE`7V*ZU3Ni66T?6@yw#^kOIb% z!JN`Lh#L{1YQWK!mSH28ZZ>xbssc*zZ4hllu^~*v0bQVmle;~mmmJg7dj7dCADBjs zovwTdZO7xfk6tkGHYZZ;bhpj^PEQ(7IQI{`bSiUdIF}Pi%?SUHYp?F$r42CyY2*I4 zpvY#I4TBwd0N#X;{Mrim(ItY&=M=3etXtL0q#^rz+I}1tcRqd`^Uk1*T|EXBTsmAj zWYEgArQgXkYMAzS3ZmqnWuSkSMLuyn>qnt)H2YrcA^|yc6C)%yp$h^R9hfu`gsiE^Hrh>9(ITt?G zmg184w=R@-QT~#U>YIAO=Q>|4vB#KvZmI~XMQDzKRA>Y~ zEn>r;7hzX8E_7<#=>kLDo)Bq^VIa+tlwm_rY(sVgM-kjQ`V-V0tL-(xGh)ZhOq$=J z|Dm6rjez8)M@C2gyd_l+DP~-#*e~1QuJ2jk*Y|rg4Bi%DUcGn(o=RkJ2aQZh!(eJ1NTKQ3dm=*6iaO`eOeFr% zV5Y+#vZ|_}^A20L8y#e&NifGRY^oQW@`#|~IesZN<}-lyb#6ai6?8hY-da?a#;kje zzls3H!hLox(56_ie1|6|Y`N0XFj+zpV zKVZ`5Z~UxJ@>O59=7)cZ-R!G*&K0wf{3IE70(PnYoyh1zMwaw`2r_2y4F3pMAC@H% zqKzvRXXVl21Va2JqdExJbi%q!+r> zOJ5#FYGEVui7`zFR>k+RKX8o08u~0DY1yD?jt(}7Zy=#h!q1ValFb)8+>-aV4|+k` z(Vasq}vFAwxgl=T#JuQ8iBX8Bt~(^+y}1L#wgo3Zko@aXi{ljd4c%DZ$gz zYJ zpM&-DbyBA=4K`(3>{LsyE+a?0>q2_q?*DpU)E}$X*$>9=&1(Ta9zLl z^%6^S86b2n$R^i4e@a&jQo1S-pJ^Z2JhHU>0lI=5~pGK3jMEtji`6|DpV8+Ct+MlG$LbuDJ z7EAKy%JcaQifhW)>v~z(0sDKNL)g`2rl7CS^>5V{f=AR0rxatSD`jP*lixA3bpHXS z_3Ui{Q$AR>{K?73GpU8;s*P($az!?Qk>qbU6zu#Yp%|anqfNh-wx&11>hVQ@>84mK zk(bk-^DVJXO^%0WfqM_nwW(q)ZokJsT1IIk2$sDdGe)SzV^}H=nza_1pyKQqARgO0 zfdRijS|)TGkrd(HIt)uBYCkLUwTT?@>Jw>wlTSAZDE;ktV3zmKQMsp?+T?QV~7Zq3|ec{pB=`JqB^zH&g%2tH!2bvSjNP-L$}`9 z>`H#;Hu4kj^Esap5Wc^=p{c6E$Ox~aTYda6|CBk>NxTePu~*sa-@xKF@I##g7{T<# zV)6t9c6rMNd{Ez2o-gBxc!(4l$lwyHf9^awN88JhX@pua_IL+~ex&lwhuh;}`$}Ql|AU z=HsX)EI+m?vq2cX`gfJCn-zYmw88or@-JL2JwJkyCG_{#uI9V=&K&5#k6hEJZE5*o z5Kb~d(5&!}eEa8b%4eiMxh!;U(=D#abY8aN1I7=UyX-H2MJ6YWxhDvhg71|a3)KTd zK8fa43X#NX;k*d4%plT*VV9o;ztZfxN5iU`FfVyWAO>hvvN8w?#q)!pLO@Us@HUvA+bf+q*b`_JL4i z-&7mJ!;oxDnW4~cldt>qD;Y&sO+?rNOnxO1!Cz2o5}CSPb=N=`%d`UD-U)aqlUYK% znbGenVPwq1XF!rz1^|zQuU&y+Kl1QM%Z`p4uGtG+EHgewGY?O3yQ z4}i)~M&tnKO#%Ru|pJ9Sh^tUt$O}4&bikXNj5n4 zOEM^!3s%q5nmshwKBh@XMAlP9(w$f9%IIy;0isW!f+G7JoBg*eX*;z@exN{#CQD=i zipsH#@Jwyb0zI)5ki}mLOweyA<|08z#<~JxnzV|Zsv4oDx@hUgds)a)`WWmxETR(U zwqXpW03rIvmMQ?(fH3lhKaAnu?&Yoj643|t8c-VsKGGeI#^>mzMVX=#{lCS9HrSLW z24sie2mYN}*`2^K;NSQ6a*!iBG%|rJxyS$S*b`dRY7R&NoxS02v+y1NzrT&aggAcz z%g8-F9Ub9kW5BJSB}60WegrfDc;lmgU>iS~r*pGVm4+PoW#g-nQs;GMNKT8J!vH62&tuhbS&(uK0OxsFqA{>o~unWuV-uW3$+b-q@Ds6XK8Fgrf< zXG0wa40YS)|KpXv8srGVDIjEUxdue0`829aq^!r8jd_4c1{9uO8-W{ebeW4J6z=n0 zT=K1*nwPLlu%lXI-nKJHr8s9tSQ>kMUhC`!ZLS$j3F<*=sQX{|yYLgh6Nh?bErAJ` zP=0|MUtlLSgrU9ZV}o%oe&sJq`okJg9Xc~_LBAKV=#r66Uo?BI?yGp~T1QW8Q?!(N zt+gM07v1^*wV{x6H+?xi5B<=lVB1&ftO&+Hoviw1kkI5C;^Mgf2*@iQ)X*ti>EfZ? zk(~YDD4p!DJZpV@4|CXd1QXdsZB5Cl?<+@EK=AL_zOigr|xZ^xZVNTD&>wM(94f7l_vZ;m(Jx- zH)xX517$TnOJyj@GQeow5sZZ2Xq)W7O^^cN2&{onSY*ecpgGg3C`sC zTSP@hBT?6A+>T)(%)X|Q8(9zQgFDYT4f~uu5U3BBYy0T8!8P%)ZEECb7Oon323Np$Z_r3W zqb@>QqA)CnN{oNZ;nOu)6Y$pfH^vnyKEpeNY0Lia-vi3qmmpt)cZedMM_a(wfHx;n z{){GDGK>q&ZXrn09NZ&me#9FzCS3+a)<8Sahq7BQ+_5^5#(46WK4Ys7CQfvgKmnXG zOJqzMr8tZN>(63ys@OJu>4hAwoUFIMJtalJj!w718bOEP@6+-tn*;52z~nrhB(I5! zY2u9If!e~-GwS*;lJiXOm;H#~#I22dh4cLphCuHrZ>^R%9^!VQS*r;Iz{}z`F;e!rvWlcLW?7u-3wOccLQX zOZPtrc8GRw7yYSepuWsRVYu&&%1`#mAF*w8e`@A$D(%Qhz@(U;FQ9N#<_Xez?*@7n zd06(wLJnkm17hx4t(STis-+uJ;*(BP|I$Mckvoahc8*e$59-x}6fxwz1@SlZDlB~FsHC=`q+$J!>uyXP&tcegzdof#A> zsQ+>^VWpM@(!g#4w!{z@>qVj;h}|!_7mxp{hz&UK&=B|muLa2l!v+~4$j|-3z4rtq zne}VC=LTZGyY#*}dU;Iq=mgY`*>kUvPYP^WU#=pnS0r@Au_1%4%ZoOP!{R@lNEAH8 zEwTswZp>?eVClXpA9cHU+$ej?%gLpyb=lM5ymu$@o^%P{=qnAs%5Z%B8u5N*Pte~H zfv5ayW6rc7t3KginA+oi(+J3!&e^^hc+b~kd!pX`*^+T#o1Q_{#^*lL0V?koZ$DSTRRM>8lA#z>-|vu;U@-m`VJ|=VFlO*(Y&gjB6;Y zu$xU%HzB_HC3-b0jbU6(En}6cy$0S%2UJr?L;X?Y5glm!Dy;bVD>9*eIH5 zp&yB5IRCkeCi`6yoY|k)WM)ODzKWth!%pUTV-f)K3KWB>ZTpRkHqkp3ZP?UX$PkJiWzgC zV>+ucYrhP#-2DZ5DLm`A+=I+mQf@!!u=D)EW=ws@n6{#1bbiKO@ev*G0vY5{za^n{ zhx55fjmOCNr@CTR8k5t$3syDO24L-ezClU}w!pS!uT>{6ZflPXmY7}&-9hEfil6T) zl1IE59zKOIHv4n_ScEUYP&9RTp;wahNN-zJyDflz`^Tr@gEtaTL-=Ui`9fi;qnSg3 z;~|Dx!_E5%+!Tcr0YQ?~U|sDW-@2Oi-#l6o@?XL#Wp@R=in3_bbp%Nk|B*n#_e|K{ zK}t{wZU$f~!}-{}-@OO2XHO73XY>08e5Bo2sf6peVQb$911VoTHn0}#eqNJcSV1$4 zeGL7<`~q=$(TBnNIY0`aO}8T|Hr=QOE$q-1AF>~1K3pHei9B&nr1RrhXa@Z}+4B&= z(cO@MXIOZ08ViG^US>jH(=-7Ey?h+f+EdGzvzSHLvG{)j$hvV~uGN1b5R&xvuIHcuEatzE5O}psm$(rv~pLfRD9?Z z6D|@m8YVO4L64I0pz)#b&>a6a53gGc5Y}RtSM!gFUS*9vVaX@TpnCp`)pm5Xt&EE2 zJuV*=<6C^WnhsapNM_od8r4r00S^%t+uKXiD-tibX^)oA$`58+$s+y?wu~7Je{Fq` zd2o{DkFqD=et)bO>$f&$uFz`CY&G)*m+;shv{y3}3`4sIVWkDfp;R-h_nhU}|CdDH zn}SAYZe9^l!_ldD(ph z`iu})?eK|?Frwp6XdfVAD3WflaumK(VovAx@L&qSYHPI%sQ(`VyEhRWqZNNMO2-f} zUG?ROyRD_@F@am5?lj~_<$D)Hu9bvA(jilM#JdQV)hK@un($YLZUkwl?KM_nENsk3j zi!~yJc|!$EPbeOG41A2N)uqz=Tz$fFV73#`^(lqJBrvXRMU)>c_(YjSJ){IEO4>k- z8lv)#_pB|OpDm`@l*zyjiApbPBk+HOzxgDn;M?%>$jDO*Df8YJ^vk@Ed`ybF6dYve ze^f3sY#qz)O9?mq0ScNG?#{NY?k@3&AE=@V8+hpv@xR&XD1jcyO~3(TC!Y>fzmZy` zjMvoOYdE6Q&ce7%vl#y=*>UQU96ygj!-Pjq)n_5@4VPtG4!L9n^9P3V`s%x2Xh572 z>-$gZ7~y{kWh%q;K}Wr34v^#rMjRD{Mv`z70kI;tGM?3hzgG|cH~sz(8VO^W_h(fy z44M0!J#k}hI|&!}BnX*g zZ@+(W^{hZKN|!P#fIH*|T9S52_i{S6=qYG@3F=r|9m(5Fg3Q}}jKCyZ^Lk5wLVNPx zR*?L?8A#XkDVv)~<%l?!zDKuTG3D>DPN|ijfpH$)a~7zkjz_9Ov=X8sqB!zQ5gv81 z5;pv>Pd^K@FpzYXEBY)H-o!6iieGP`H6Vu&EEI4)ob_jTRG8{B@Zu26dGm*WRmO^x z8bQu)}3pPYnY00Es06? z`QABa*Z<26WcHVWN(c#X^A&up zKt?ntJxmq(U|ywb&=pBT6ev;9pUzmf4vSd(QDIcO zZYLg_O`?NJ?&qCB_m2@05JyQf-YQojEWFO~T9uYfaip^$ycIWX>j!B46|Hmtw{aw0 z;RQOoBrK@W{Uf#e-g{mIbw8v>aSK+?Be+HW|C;*la5%m%?%7>s_1>bb5-o^M5LWN? zD@wH0LWD*1XsbkzE(B4d3xY(8SVWf~x)7^Hi55Lt-pTuW|9Iz_d7itwvvcm;IdjgL z&u8vAtcK?O+4~V)yOJE`&Wu{@{zr?;O47F5IS2NoQ6)zwV_vs*!e3Rpgs;cf3*dAX zSSwByuuMw-dS>$JhSFSZ0|g|l1E#wMk%DHMqP!XfzT;YQ9|$)sZ_6!Et8|n-*FmcJnlIX&5J%$IrRwc z`c^w7W4qq418JY7aGUXM_a~Vj2<4Nh2*p~)*1iPEIRCsdBcn`oR|c@5a)2)tS+=3& zQq50Uv+V6ib zeH*5S02%ThVoVKAutS*qDncSCzlpm%YXYD8LC(O@CF%LtTM$wB2MEQDvHSuoN&bgo zA((PjwNp(0AHb#RlB1PEugnbY2jXMV?d{#EK{{8a%KwAER14D)6w1sv+d{}Wya|%F zJPtV*{&&PM4cGyd3yizx+85&kzw&(HfjLzGIDFFf$a25v#QcR z?6pWuv|AGHJN)h&Ee{~Qg-J#-BZzWb;3LOP&DzcvM?l^&#B+zwm~%nAF+x;&PbMDs z!G-r@3Ci@*0lgIg?pupaPHn%0YUfgceOxafHk(jS^{=%>&}WxL?Y2{h7n|9}omB!S~EoT1K2cVC^e2gv18COWoMA%+^=3 zp5M;%(s|_*7nU!S!11Xj!v=yA9-=c57CuA?wE8R z{^?MsLA&@#l)%c#KQCKR`SF-0pCJi ze})mKn0C`w$?Eo=ik?$q-RZ6|V%gW{d<2b(SM~!9t#;D-gAAO*xxa8B$7IR{Br_kg znPp$Wv*~`&?Jnz>I6ZxyAR%^J(>v3+Hf7W{lf;ZgxWTF|@$kVrpA+w!s)5(*`dv=5 zZe^Z*>n%@j{i)V%h0;FF0?R&_30ig7*NHtpeoz^3LhKLnOr-OG))+Tgy$46{fS>>E zor`Xw+IRg_b?$3pKXns_4J8Ym!z&{P?U<@A-gj-*D84Iy-S^@hHid$)1gT17YQ2_i z-rYnC`h%5#_lL#A8YEz-YbxNWujESZEt6ujuA-s{oz??xoJd&8=92XYN=UAGrt^Xa>78c#Y ze02r%OGal;d4SZfTp_QPw;|>NpR~ngz6fO|AbC17R$(G$Bv|8CKdFYSOws_wqawl# z9VEwa*{EkAND3pHARhu?lR_0mXCFk_?nuy-1gMK@&(V&ZGNg6h@fPb;i_{q6@F?>~xg>H2uS1OQ1t%4(qq%1` z*^BpQ)8<3N(;29zUn61t9zdxS)eCEr}HtU zwA2dUDoGK@9TX29(yBfYj$FY{c}tcRHi%i*PZh>w(u+-*S%BID5|*7*nEjMSa?crl zm1MXKMdT~yF3CW5OWmnmchOg~$M(T_Y7Z=p>(;maqh1gRwj<|;9s1$vir~4$sruZ% z`nFDAEIM!h;}fqWGO@EBqFuuMF>uXiHDDzd|86v|{nt^o>pNo}TD(%t@~escTVmvJ zX)`|?b0f(E03D{Zn)AR(*0Mqptcuh6bdP%7UJ~$16&7E& zlFCxMowfe;>6Q1I_*Ib1nm5BM>fAw_H>D%F1lb^7eQO?Imcirk;%M@V!AHpF(?Eg} zTBK;3)H?=GT(mo-FQ9{z)i{mPcwpXp5KTEu$ zF=IB)cgipiUWCWxER?lk-;}`ggD>VX7g2=H4|tX12zEmfE4|$<3FmMPap5klwo?gJ zNe_^f(9?BFG_&I+^?)hUf!K4MJ(H2V^{<~-CW2F|J?*^|?kaQ$dX-PXM9uDnJm8BR zjejoRuXyKY=^x|eoeahO#Om125eAYgqF(#;<3u?cvzBdU^97J~01f)pU&(&T*}Wa$ z;F%H;yyKA-iJZw|jCdQ(@Z||WE31LAsRQJ@zSb_H>PLfaC^0=Fzi+6F#pCAtuw1i; zC!ZO{`CgNdH`L+{diMIrf@buOmF(+5$8StG8oQSlh>+{{N66xt(!i5cMb7C7KuPF6P_Oik`KUJ!{| z9Ith7kuZ`3ww}D@by`p_A=RISx6`*AiZe#rh5ez{?ZJ`%&&yElQG{!`VKkqWB4vo- z_q`TSEaCGXvZHg|MYH@fbUEQR1!2>j@>>sohM5~W*IPtYIRI3W+2c_L>=XCMO$?i5miwTg8j0Zugh#=!Iz>l#w*5pZ#PM3cZi_yPi}q^5(paHl+Zk1RjBpdYoW( zB^@E(w|5j^)&7|^cA z&aY%`(Dh{B%u)L?0I6bZoowdW#WJKaQ6@e|vbwAL$(U8xIp!YJ-J@_G61Jw^;E-BydTb$U|b>jH*k# zR*KY7AF5mY(Ng|QwZ#*$6q)3}(V65Kz{rpsagTg}mm>H#ic@Ukw>!p%n-Eb#89OlZ z;|Bzkyz!3QaIe5WknColY-x!oQ(J^au7OWT79YqZlbL%A%Yd|_XFPhI8S}yBV$qny z3hPN)JPF8S*wqrR(oOX!;B5ao()791H-bXz{o{GJ>3VYc!B(O!G9Ut*E$Pap?ntu6 zB?HjurG*6(aUbrVd4gkwyP?d+ez(&~xBR&ou!OD)=|_;@v2IjrXIAM%3;2pK;Txo| z#FIT?SpJ?G;mIwH1RYy}<{JRC!`|iuT$VKPkD4mIwCZ{}CF`&AkqDf3NpxICHbLEe zG)1UgkWd_9tSy0eC!|3cOh1{aS7OE)JZ(M?6pWG?`7gevww6y6s4RXPIaOQYx?37F z@9+eM*I(_`ZY#IHDGyzqjmAgxL^$2j;&I{B#-H$U?CuMB2fn?PP5|fAjlN5sc7mRf zEB*cu#yyX!r=i4?FG7!tb}#-ksi%0yky6WsVGlc9G_bw@!$2|g@7oINIgtoqYw@lB zq;jLxrLIX2{?x#BHIdBMNPLMs72g=e(@8nz%uo`l|`Wa}rFc;g4J6S^IpSQrdjPP|T@I;NSpL zQ=yF-zcX9tKe->cQ1fW|!*s#a(W{M-0)_mZ@ZZaq=RxxQOK3yP8XK;_mQWL~#Sbd@ z(vj$o&IJ>#2%ocXF2v(U@YVLY&lc;9Y%AF2eE@KKpmbd?yHbw{fT*8 z1mMIRTo@mefkaUhG@Kjz*MSw+iKmUhpC|C@oei_U=H;_pHBY)WKWFQe%X0m~@Sf?5 z&L6I1W8Igoe@V1Sc=3Cr^xE%=xKBG03LG)>r)nr^Lb-`NnZrl7eUny4k}q__RxWbk zRE9aUhxdXnOsiWhbsj6&8ezC5^hL|BiUGZI71I1vI{j{_;1?UBQjbq!yxuXHhtX7! zG(2$7GjVt_Cg%Dyzv8Y#2}0h~8}pv|Kd7@pFCS!mlkF%5z7uB^lTNZgK5&eu;kC$f zLvHA5=J9{1lwotVFf?)NYppk*3t}-#G`LiM16#pOk7nOrV?$8YVPEPu?8KDijq4VE zo>EZif6}HQXs&e=Oyk!6U2V+BYTzmtzE8jw%FY+^baz%;B&w7KF?ysN%0F@kq95!l z&-&6vgBqcQu|<|)zkfA@>ate+)%1Pn8kDQ>Nse3k4vlzz;lvd;Q{d#}To|O!Eztq7Hdi?NEUUdlHaJD;b&j;S_ zS-FK+OgL^{RKYA8HK2dpA%_oi9G0V4#G!{d3qtZhCBen{B5Vyx@hTRKYu^sLuuemo)yW5XbM@pl$Cy$V+6fRpK|r+gxHsUG68v6y&|HaPq&E$- zHnM@Y%C+kg!E--#oPz|M;*KcNKwGx!4jV}BW!+6XHy ziwq(+Q-Ig-1DJuw*uf&xL{fP|K0_26GVHzuy*O0<;?TDdfBEh(`pB~Bp#g=kB0hZ@ z|6O{-!|>N!NVdC2=wX&&?Uw?_lK6rIcj@hylAh-X2oBWGvtl{8<>eD0k`024lw^B8 zUPo%-)YmEb+W&XlwJ??jJdk)B8R4v7=&`Y_F%oD$5o+cnWXAg=9B)(3Xj2wQ!hEW5 z_~S%Vc(4}SXkqzcy7YDqq9dxPEfJv6>HavCMmt#6hLHNYN9vI7P zqq_L}GnEIKjKMNh=9+G-@kNu6oyX1si`oWVk21`i-t4i^J2EPocpcUp#PAx7g0MCO|x(oX`jWj+W%%c&LrStXYw7oofOEhy^lsK1U3%uh@S48 zbZE4{mvqU$cn63M6B}-R=bQH>EoA|jT$&{Mwao@p zsP@aXuv8o=h*N>$;GEdEyy*aB{Hz0e#{4XVC063c=eE7haxO*BV$CxZmvEUR=8+n+ z(+Y8G-UNEOw*XTJpt6~^ON6uaWN zO1k5b#4y6+1#5NrR$rT7r2YxCMbayK$ju3R!t}xx5#M|j4yX$Q=Y$707esGrTP1I;q;9<$h0-b*)Y`4ZHr%6J z`q&f;XhE$azL0o=82(1XA3T}PbTdI!bWsghR`5={@EY=AO%P;vyoe^ly0ey06Jx`P z6e+FPsDa7*9fel6`YgUTMaym@cy`d&k!he0CYZCXA8u>DS^*|>7 zI8e+L4`}pvgE^417(Oh~7@52%OAyD~iE#Ma)abpKRK^In5+g~?)X0dQ-qh&5gwBWlw6k1h20qsfTEKkJQ?<~ReI zL3LwlT=z(zLkRnXi?b+%cFtKD;!0+EAK>$O84Dn3zjKotx=97nGYa`bAVVVH+$Rs@ zAU{Iv@o`*-_Y<#M@Sb`?L+J-K#`4^DoXnd_4lC61w59P3ZN)!Go~^S}-3{7Ot1rcI zW?0V`)JxyMivA9Gl-cQSf0deu%h|m2X?`r84s$wNb|+s__4(-e^355PSG?$6!^*d^ z80m><%NWtOLCSkH9%tm;*&b)ZA|02EP*o@`67zl|Hh%2vgu2kY&`{0g^nB}ACgb^D zX&F$i)!?t$o%S?0dFxrnpj!&}kqleul-*CQv|tMHDHOrvlPmtWApWJ*C*42jsAy#x z`RdIt=C5VNcCs|$$^zsnI%GU0MYHH`8r%)J`p`oDfxlN8*_~>QZWu z!<&~2HLJOLo||+hYhU(m1>YO=P3S})4TVZaH^}2$q~bsIRp0Ni`^+3|C!qRiFO}z@9*YUQr3sPVIOs&oWN+;Lar(Tx0@eekw z+Ya{W-t7&(iNXu`2!wDWX;t5nD0H>7A7}0?(xYgz1E092LaU(}h_I~FW8K9XC*1EoI zdAG~Aeb>ZDzWK!o$ss=Q`FZC+%NHsSfxLterJPtjy8CHF@pi6wHoLHkQ>hY>XS;$- z5rvG+7|o3eRDvFXkL1QKCEdl_d=G10J&6eLj`%R+HO#$GNs~$4mBh7Bk5XEi3}= z-ob0RLEyHYNR9PvbWZsc?&Is5coC}WFI4^j1JDDaJcuYw;q};%6+s0TQmoMTJHcQ2 zPcu*2>B<(JqyQ(}oT{e<8+4K$OzAN6Jplj=6)zY{l4oj%M3-sbQ_?ysefGz_eLG=# zBtJgnrA7AMU0p{%%sM7-PN1G#<>B`I30ozdC(Vvwz51KM@xPwAO{3drgnEN|CsD~J zI+>kbM~eQvevT!$&dY*3pSm z*UTWeD#NRj(6vR zz^Utv^DWj+9N!0OhTAxJ#I8P8|7Td%E_hMy&!$PDWU73tGN6-BKsY^JPmNMZ{mhG~ zy2VlK_iATHyg1Ld@_0h0(ckEDt`$;&{2?{@JHf`nl9%1s{9!w1xmM-)>l1cN*W)Yr zc@q`|@pnjkm3td=IsR9j0&_(#VxEhShO|9Q6#dEDGJX?q!z=?3ID26qg*&ziNvSxD zm@L>NGcfNOTzM=&BJa;)zc4zKIR`Z~ud-izEC3UbNLDtN5k>FsJg9i3Y>&Cz%gVnY ztC%jj9Rs)Lec5qygLE}3VXNefHCy3b=tR+Um7a&;=Sx}i@Y+7cBe^%1T{qZ@zvGat z@KYs+5sG?0E6n^-3x3)ZqeE!4&Z@5dYF_%V+-qb|2XcqWD3Q0eFhU?UC3U^|Gs5A@ zssDF3-%4WY3&hH#8gcd8OL{r4(}T%f0*ERLlTi7-&eHK64nwcc=yO_)j+q#HZFSZ6 z$5XVHJD)4Nh=f<}1@3gjv_X0;lqY22@$_CyQSl|ly_NGkv2nEh)_(XYk;<&9@n;T2 zCTW9uY42ja@5Q%#6|+oC@b(){@f}^?Za&}5=W5#+QVm=1M!Ags-o{1S4oBDJrBC?h z$qE0gd;M%si7~o}&$aQd8V%Dgf@KI)mcN5=p3?r%KGha?tmc-Z z4~o&FvxAat{cV;Z%Kok%q(?o}q$vki+tMc^eH%=lC~X>(B!W zZm67f=LPN^wKqPzE}ja^TtDhNO?Aeyy!h4ghA;Jnmd5!o5#yOv*2mW6YU?U4tu*fc cZ@pP$O)@3=V8LOk0f38^n!akSGAiQ#0O)metN;K2 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_preface/suggestions.md b/ru/docs/chapter_preface/suggestions.md new file mode 100644 index 000000000..26de2a6ce --- /dev/null +++ b/ru/docs/chapter_preface/suggestions.md @@ -0,0 +1,241 @@ +# Как пользоваться этой книгой + +!!! tip + + Чтобы получить наилучший опыт чтения, рекомендуется полностью прочитать этот раздел. + +## Соглашения о стиле изложения + +- Разделы, помеченные `*` в заголовке, являются дополнительными и сравнительно более сложными. Если времени мало, их можно пока пропустить. +- Технические термины будут выделяться полужирным шрифтом (в бумажной и PDF-версиях) или подчеркиванием (в веб-версии), например массив (array). Рекомендуется запоминать их, чтобы легче читать техническую литературу. +- Ключевое содержание и итоговые формулировки будут **выделяться полужирным**, и на такие фрагменты стоит обращать особое внимание. +- Слова и выражения со специальным смыслом будут отмечаться "кавычками", чтобы избежать неоднозначности. +- Когда названия различаются между языками программирования, эта книга ориентируется на Python; например, для обозначения "пустого" значения используется `None`. +- В книге частично отказались от строгих правил оформления комментариев в языках программирования ради более компактной верстки. Комментарии в основном делятся на три типа: комментарии-заголовки, содержательные комментарии и многострочные комментарии. + +=== "Python" + + ```python title="" + """Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п.""" + + # Содержательный комментарий: подробно поясняет код + + """ + Многострочный + комментарий + """ + ``` + +=== "C++" + + ```cpp title="" + /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ + + // Содержательный комментарий: подробно поясняет код + + /** + * Многострочный + * комментарий + */ + ``` + +=== "Java" + + ```java title="" + /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ + + // Содержательный комментарий: подробно поясняет код + + /** + * Многострочный + * комментарий + */ + ``` + +=== "C#" + + ```csharp title="" + /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ + + // Содержательный комментарий: подробно поясняет код + + /** + * Многострочный + * комментарий + */ + ``` + +=== "Go" + + ```go title="" + /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ + + // Содержательный комментарий: подробно поясняет код + + /** + * Многострочный + * комментарий + */ + ``` + +=== "Swift" + + ```swift title="" + /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ + + // Содержательный комментарий: подробно поясняет код + + /** + * Многострочный + * комментарий + */ + ``` + +=== "JS" + + ```javascript title="" + /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ + + // Содержательный комментарий: подробно поясняет код + + /** + * Многострочный + * комментарий + */ + ``` + +=== "TS" + + ```typescript title="" + /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ + + // Содержательный комментарий: подробно поясняет код + + /** + * Многострочный + * комментарий + */ + ``` + +=== "Dart" + + ```dart title="" + /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ + + // Содержательный комментарий: подробно поясняет код + + /** + * Многострочный + * комментарий + */ + ``` + +=== "Rust" + + ```rust title="" + /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ + + // Содержательный комментарий: подробно поясняет код + + /** + * Многострочный + * комментарий + */ + ``` + +=== "C" + + ```c title="" + /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ + + // Содержательный комментарий: подробно поясняет код + + /** + * Многострочный + * комментарий + */ + ``` + +=== "Kotlin" + + ```kotlin title="" + /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ + + // Содержательный комментарий: подробно поясняет код + + /** + * Многострочный + * комментарий + */ + ``` + +=== "Ruby" + + ```ruby title="" + ### Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. ### + + # Содержательный комментарий: подробно поясняет код + + # Многострочный + # комментарий + ``` + +## Эффективное обучение с помощью анимированных иллюстраций + +По сравнению с текстом видео и изображения обладают большей информационной плотностью и более четкой структурой, поэтому их легче воспринимать. В этой книге **ключевые и сложные идеи в основном будут показываться в виде анимированных иллюстраций**, а текст будет играть роль пояснения и дополнения. + +Если во время чтения ты встречаешь фрагмент с анимированной иллюстрацией, как на рисунке ниже, **в первую очередь ориентируйся на изображение, а текст используй как дополнение**, соединяя оба источника для понимания материала. + +![Пример анимированной иллюстрации](../index.assets/animation.gif) + +## Углубление понимания через практику кода + +Сопроводительный код этой книги размещен в [репозитории GitHub](https://github.com/krahets/hello-algo). Как показано ниже, **исходный код снабжен тестовыми примерами и может запускаться одним нажатием**. + +Если позволяет время, **рекомендуется самостоятельно перепечатать код**. Если времени на обучение мало, то хотя бы полностью прочитай и запусти весь код. + +По сравнению с простым чтением кода сам процесс его написания обычно дает больше пользы. **Учиться на практике - значит учиться по-настоящему**. + +![Пример запуска кода](../index.assets/running_code.gif) + +Подготовка к запуску кода в основном состоит из трех шагов. + +**Шаг 1: установить локальную среду программирования**. Воспользуйся [руководством](https://www.hello-algo.com/chapter_appendix/installation/) из приложения. Если среда уже установлена, этот шаг можно пропустить. + +**Шаг 2: клонировать или скачать репозиторий с кодом**. Перейди в [репозиторий GitHub](https://github.com/krahets/hello-algo). Если у тебя уже установлен [Git](https://git-scm.com/downloads), репозиторий можно клонировать следующей командой: + +```shell +git clone https://github.com/krahets/hello-algo.git +``` + +Конечно, можно также нажать кнопку "Download ZIP" в месте, показанном на рисунке ниже, напрямую скачать архив с кодом и затем распаковать его локально. + +![Клонирование репозитория и загрузка кода](suggestions.assets/download_code.png) + +**Шаг 3: запустить исходный код**. Как показано на рисунке ниже, для блоков кода, у которых сверху указано имя файла, соответствующий исходный файл можно найти в папке `codes` репозитория. Эти файлы запускаются одним нажатием, что помогает не тратить лишнее время на отладку и сосредоточиться на изучении материала. + +![Блоки кода и соответствующие исходные файлы](suggestions.assets/code_md_to_repo.png) + +Помимо локального запуска, **веб-версия также поддерживает визуальный запуск Python-кода** (на базе [pythontutor](https://pythontutor.com/)). Как показано ниже, можно нажать "Визуализировать выполнение" под блоком кода, чтобы раскрыть окно и наблюдать за выполнением алгоритма; также можно нажать "Полноэкранный режим", чтобы получить более удобный просмотр. + +![Визуальный запуск Python-кода](suggestions.assets/pythontutor_example.png) + +## Совместный рост через вопросы и обсуждения + +Во время чтения книги не стоит легко пропускать те места, которые остались непонятными. **Смело задавай свои вопросы в разделе комментариев**: я и мои друзья постараемся ответить тебе как можно тщательнее, обычно в течение двух дней. + +Как показано на рисунке ниже, в веб-версии у каждой главы внизу есть раздел комментариев. Надеюсь, ты будешь чаще обращать внимание на его содержание. С одной стороны, это поможет увидеть, с какими трудностями сталкиваются другие читатели, восполнить пробелы и подтолкнуть себя к более глубоким размышлениям. С другой стороны, буду рад, если ты щедро ответишь на вопросы других участников, поделишься своими наблюдениями и поможешь им продвинуться вперед. + +![Пример раздела комментариев](../index.assets/comment.gif) + +## Дорожная карта изучения алгоритмов + +В целом процесс изучения структур данных и алгоритмов можно разделить на три этапа. + +1. **Этап 1: введение в алгоритмы**. Нужно познакомиться с особенностями и способами применения разных структур данных, а также изучить принципы, ход работы, назначение и эффективность различных алгоритмов. +2. **Этап 2: решение алгоритмических задач**. Рекомендуется начинать с популярных задач и сначала накопить не менее 100 решенных примеров, чтобы познакомиться с основными типами алгоритмических проблем. На первых порах "забывание знаний" может стать испытанием, но это нормально. Мы можем повторять задачи по "кривой забывания Эббингауза", и обычно после 3-5 циклов повторения материал прочно закрепляется. Рекомендуемые списки задач и планы практики см. в этом [репозитории GitHub](https://github.com/krahets/LeetCode-Book). +3. **Этап 3: построение системы знаний**. В учебной части можно читать статьи по алгоритмам, разбирать каркасы решений и учебники, чтобы постоянно обогащать свою систему знаний. В практической части можно пробовать более продвинутые стратегии, например классификацию по темам, несколько решений одной задачи или одно решение для нескольких задач; соответствующий опыт можно найти в разных сообществах. + +Как показано на рисунке ниже, содержание этой книги в основном покрывает "этап 1" и призвано помочь тебе более эффективно перейти к обучению на этапах 2 и 3. + +![Дорожная карта изучения алгоритмов](suggestions.assets/learning_route.png) diff --git a/ru/docs/chapter_preface/summary.md b/ru/docs/chapter_preface/summary.md new file mode 100644 index 000000000..d3debdaca --- /dev/null +++ b/ru/docs/chapter_preface/summary.md @@ -0,0 +1,10 @@ +# Резюме + +### Ключевые выводы + +- Основная аудитория этой книги - новички в изучении алгоритмов. Если у тебя уже есть определенная база, книга поможет системно повторить знания, а исходный код можно использовать как "инструментарий для решения задач". +- Основное содержание книги состоит из трех частей: анализ сложности, структуры данных и алгоритмы; вместе они охватывают большую часть тем этой области. +- Для начинающих особенно важно на старте прочитать хорошее вводное пособие: это помогает избежать множества лишних обходных путей. +- Анимированные иллюстрации в книге обычно используются для объяснения ключевых и сложных идей. При чтении книги этим материалам стоит уделять больше внимания. +- Практика - лучший способ изучать программирование. Настоятельно рекомендуется запускать исходный код и набирать его самостоятельно. +- В веб-версии книги у каждой главы есть раздел комментариев, где можно в любой момент делиться вопросами и своими мыслями. diff --git a/ru/docs/chapter_reference/index.md b/ru/docs/chapter_reference/index.md new file mode 100644 index 000000000..1ab64b41e --- /dev/null +++ b/ru/docs/chapter_reference/index.md @@ -0,0 +1,25 @@ +--- +icon: material/bookshelf +--- + +# Список литературы + +[1] Thomas H. Cormen, et al. Introduction to Algorithms (3rd Edition). + +[2] Aditya Bhargava. Grokking Algorithms: An Illustrated Guide for Programmers and Other Curious People (1st Edition). + +[3] Robert Sedgewick, et al. Algorithms (4th Edition). + +[4] Yan Weimin. Data Structures (C Language Edition). + +[5] Deng Junhui. Data Structures (C++ Language Edition, 3rd Edition). + +[6] Mark Allen Weiss; translated by Chen Yue. Data Structures and Algorithm Analysis: Java Description (3rd Edition). + +[7] Cheng Jie. A Plainspoken Guide to Data Structures. + +[8] Wang Zheng. The Beauty of Data Structures and Algorithms. + +[9] Gayle Laakmann McDowell. Cracking the Coding Interview: 189 Programming Questions and Solutions (6th Edition). + +[10] Aston Zhang, et al. Dive into Deep Learning. diff --git a/ru/docs/chapter_searching/binary_search.assets/binary_search_example.png b/ru/docs/chapter_searching/binary_search.assets/binary_search_example.png new file mode 100644 index 0000000000000000000000000000000000000000..ee928584241f23e4729e8731122a00ecf336fab6 GIT binary patch literal 11717 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/binary_search.assets/binary_search_step1.png b/ru/docs/chapter_searching/binary_search.assets/binary_search_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..b3fc9ec01c495d1339c6d8994ca1d69838de06c7 GIT binary patch literal 12576 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/binary_search.assets/binary_search_step2.png b/ru/docs/chapter_searching/binary_search.assets/binary_search_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..3e1f4ca7deb6c7210c221334420c55984e3c5aa5 GIT binary patch literal 11228 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 TDzWnPkFp!eTGvaiS%v=(?oeNT literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/binary_search.assets/binary_search_step4.png b/ru/docs/chapter_searching/binary_search.assets/binary_search_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..216b4c94fdeeb4a6c7f1ecb50a05007384fcb58e GIT binary patch literal 11131 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 QRbRHaqpG7)q=XLsAKN}tEC2ui literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/binary_search.assets/binary_search_step6.png b/ru/docs/chapter_searching/binary_search.assets/binary_search_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..0452971a6c7f3f74da4f6c14dce2ea5fa7cf3a66 GIT binary patch literal 11009 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/binary_search.assets/binary_search_step7.png b/ru/docs/chapter_searching/binary_search.assets/binary_search_step7.png new file mode 100644 index 0000000000000000000000000000000000000000..52970eda678c03141b7645d54b46b74aa3c39db1 GIT binary patch literal 11241 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Двоичный поиск (binary search) - это эффективный алгоритм поиска, основанный на стратегии "разделяй и властвуй". Он использует упорядоченность данных и на каждом шаге сокращает область поиска вдвое, пока не найдет целевой элемент или пока интервал поиска не опустеет. + +!!! question + + Дан массив `nums` длины $n$, элементы которого расположены в порядке возрастания и не повторяются. Найдите и верните индекс элемента `target` в этом массиве. Если массив не содержит этого элемента, верните $-1$ . Пример показан на рисунке ниже. + +![Пример данных для двоичного поиска](binary_search.assets/binary_search_example.png) + +Как показано на рисунке ниже, сначала инициализируем указатели $i = 0$ и $j = n - 1$ , которые указывают на первый и последний элементы массива и задают интервал поиска $[0, n - 1]$ . Обратите внимание: квадратные скобки обозначают замкнутый интервал и включают граничные значения. + +Далее в цикле выполняются следующие два шага. + +1. Вычислить индекс середины $m = \lfloor {(i + j) / 2} \rfloor$ , где $\lfloor \: \rfloor$ означает операцию округления вниз. +2. Сравнить `nums[m]` и `target` , после чего возможны три случая. + 1. Если `nums[m] < target` , это означает, что `target` находится в интервале $[m + 1, j]$ , поэтому выполняется $i = m + 1$ . + 2. Если `nums[m] > target` , это означает, что `target` находится в интервале $[i, m - 1]$ , поэтому выполняется $j = m - 1$ . + 3. Если `nums[m] = target` , значит, элемент `target` найден, поэтому возвращается индекс $m$ . + +Если массив не содержит целевой элемент, область поиска в итоге сузится до пустого интервала. В этом случае возвращается $-1$ . + +=== "<1>" + ![Процесс двоичного поиска](binary_search.assets/binary_search_step1.png) + +=== "<2>" + ![binary_search_step2](binary_search.assets/binary_search_step2.png) + +=== "<3>" + ![binary_search_step3](binary_search.assets/binary_search_step3.png) + +=== "<4>" + ![binary_search_step4](binary_search.assets/binary_search_step4.png) + +=== "<5>" + ![binary_search_step5](binary_search.assets/binary_search_step5.png) + +=== "<6>" + ![binary_search_step6](binary_search.assets/binary_search_step6.png) + +=== "<7>" + ![binary_search_step7](binary_search.assets/binary_search_step7.png) + +Стоит отметить, что поскольку и $i$ , и $j$ имеют тип `int` , **то сумма $i + j$ может выйти за пределы диапазона типа `int`**. Чтобы избежать переполнения, обычно используют формулу $m = \lfloor {i + (j - i) / 2} \rfloor$ для вычисления середины. + +Код приведен ниже: + +```src +[file]{binary_search}-[class]{}-[func]{binary_search} +``` + +**Временная сложность равна $O(\log n)$** : в цикле двоичного поиска интервал каждый раз сокращается вдвое, поэтому число итераций равно $\log_2 n$ . + +**Пространственная сложность равна $O(1)$** : указатели $i$ и $j$ занимают константный объем памяти. + +## Методы представления интервалов + +Помимо описанного выше двойного замкнутого интервала, часто используется и интервал "слева закрыт, справа открыт", который задается как $[0, n)$ , то есть левая граница включается, а правая - нет. В этом представлении интервал $[i, j)$ пуст, когда $i = j$ . + +На основе этого представления можно реализовать двоичный поиск с той же функциональностью: + +```src +[file]{binary_search}-[class]{}-[func]{binary_search_lcro} +``` + +Как показано на рисунке ниже, в этих двух вариантах представления интервала различаются инициализация, условие цикла и операция сужения интервала в алгоритме двоичного поиска. + +Поскольку в записи "двойной замкнутый интервал" обе границы являются закрытыми, операции сужения интервала при помощи указателей $i$ и $j$ тоже получаются симметричными. Из-за этого в таком варианте сложнее допустить ошибку, **поэтому обычно рекомендуется использовать именно запись "двойной замкнутый интервал"**. + +![Два определения интервалов](binary_search.assets/binary_search_ranges.png) + +## Преимущества и ограничения + +Двоичный поиск показывает хорошие результаты и по времени, и по памяти. + +- Двоичный поиск очень эффективен по времени. На больших объемах данных логарифмическая временная сложность дает заметное преимущество. Например, когда размер данных $n = 2^{20}$ , линейный поиск потребует $2^{20} = 1048576$ итераций, тогда как двоичный поиск выполнится всего за $\log_2 2^{20} = 20$ итераций. +- Двоичный поиск не требует дополнительной памяти. По сравнению с алгоритмами поиска, которым нужно внешнее пространство (например, с хеш-поиском), двоичный поиск заметно экономнее по памяти. + +Однако двоичный поиск подходит не для всех ситуаций, и основные причины таковы. + +- Двоичный поиск применим только к упорядоченным данным. Если входные данные неупорядочены, специально сортировать их ради двоичного поиска невыгодно. Это связано с тем, что временная сложность алгоритмов сортировки обычно составляет $O(n \log n)$ , что выше, чем у линейного и двоичного поиска. Если элементы приходится часто вставлять, то для сохранения порядка в массиве их нужно помещать в конкретные позиции, а это требует $O(n)$ времени и тоже обходится дорого. +- Двоичный поиск применим только к массивам. Для него нужен скачкообразный доступ к элементам, а в связном списке такой доступ малоэффективен, поэтому двоичный поиск не подходит для списков и структур данных, построенных на их основе. +- При малом объеме данных линейный поиск работает лучше. В линейном поиске на каждом шаге нужна всего одна операция сравнения; в двоичном поиске требуется 1 сложение, 1 деление, от 1 до 3 сравнений и еще 1 сложение или вычитание, то есть всего от 4 до 6 элементарных операций. Поэтому при небольшом $n$ линейный поиск может оказаться быстрее двоичного. diff --git a/ru/docs/chapter_searching/binary_search_edge.assets/binary_search_edge_by_element.png b/ru/docs/chapter_searching/binary_search_edge.assets/binary_search_edge_by_element.png new file mode 100644 index 0000000000000000000000000000000000000000..d04393b576037cdb27f63e6e7365ea37d2965219 GIT binary patch literal 11754 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 M>X$F%pCbnS4>eGMLjV8( literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/binary_search_edge.md b/ru/docs/chapter_searching/binary_search_edge.md new file mode 100644 index 000000000..7669ea47f --- /dev/null +++ b/ru/docs/chapter_searching/binary_search_edge.md @@ -0,0 +1,56 @@ +# Двоичный поиск границ + +## Поиск левой границы + +!!! question + + Дан упорядоченный массив `nums` длины $n$, который может содержать повторяющиеся элементы. Верните индекс самого левого элемента `target` в массиве. Если массив не содержит этот элемент, верните $-1$ . + +Вспомним метод поиска точки вставки при двоичном поиске: после завершения поиска указатель $i$ указывает на самый левый `target` , **поэтому поиск точки вставки по сути и есть поиск индекса самого левого `target`**. + +Рассмотрим реализацию поиска левой границы через функцию поиска точки вставки. Обратите внимание: массив может не содержать `target` , и тогда возможны две ситуации. + +- Индекс точки вставки $i$ выходит за границы массива. +- Элемент `nums[i]` не равен `target` . + +Если возникает любая из этих ситуаций, достаточно сразу вернуть $-1$ . Код приведен ниже: + +```src +[file]{binary_search_edge}-[class]{}-[func]{binary_search_left_edge} +``` + +## Поиск правой границы + +Как тогда найти самый правый `target` ? Самый прямой способ - изменить код, заменив операцию сужения указателя в случае `nums[m] == target` . Мы не будем приводить этот код, заинтересованные читатели могут реализовать его самостоятельно. + +Ниже представлены два более изящных способа. + +### Повторное использование поиска левой границы + +На самом деле функцию поиска самого левого элемента можно использовать и для поиска самого правого элемента. Конкретная идея такова: **преобразовать поиск самого правого `target` в поиск самого левого `target + 1`**. + +Как показано на рисунке ниже, после завершения поиска указатель $i$ указывает на самый левый `target + 1` (если он существует), а указатель $j$ указывает на самый правый `target` , **поэтому достаточно вернуть $j$**. + +![Преобразование поиска правой границы в поиск левой](binary_search_edge.assets/binary_search_right_edge_by_left_edge.png) + +Обратите внимание: функция возвращает точку вставки $i$ , поэтому из нее нужно вычесть $1$ , чтобы получить $j$ : + +```src +[file]{binary_search_edge}-[class]{}-[func]{binary_search_right_edge} +``` + +### Преобразование в поиск элемента + +Мы знаем, что если массив не содержит `target` , то в конце поиска указатели $i$ и $j$ будут указывать соответственно на первый элемент, больший `target` , и на первый элемент, меньший `target` . + +Следовательно, как показано на рисунке ниже, для поиска левой и правой границы можно сконструировать элемент, которого нет в массиве. + +- Поиск самого левого `target` : можно преобразовать в поиск `target - 0.5` и вернуть указатель $i$ . +- Поиск самого правого `target` : можно преобразовать в поиск `target + 0.5` и вернуть указатель $j$ . + +![Преобразование поиска границ в поиск элемента](binary_search_edge.assets/binary_search_edge_by_element.png) + +Код здесь опущен, но стоит обратить внимание на два момента. + +- По условию массив не содержит дробных чисел, поэтому нам не нужно беспокоиться о том, как обрабатывать случай равенства другим элементам массива. +- Поскольку этот метод вводит дробные числа, переменную `target` в функции нужно изменить на тип с плавающей запятой (в Python менять ничего не требуется). diff --git a/ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_example.png b/ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_example.png new file mode 100644 index 0000000000000000000000000000000000000000..1251800a03783ea257425c2ffdb87bac1e38a0c4 GIT binary patch literal 12103 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 M@~SV&pPPsN2gZ(u-T(jq literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_naive.png b/ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_naive.png new file mode 100644 index 0000000000000000000000000000000000000000..8d875e06592f3541fadfdca8c031c0d1c72baceb GIT binary patch literal 9307 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step2.png b/ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..5172f7f541fcee4dfd373b7d6f462b82744303b5 GIT binary patch literal 10168 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 LXsYI1#y|Zp#N~AE literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step3.png b/ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..4ef582eebf8d7da238d84d0f597d78d00a2708a6 GIT binary patch literal 13886 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step4.png b/ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..b03ae6bd840e902adcf3c86a6fe54d64163794c9 GIT binary patch literal 10749 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 Ut74&h?OD5uqQ;%l+vunN0kNf)QUCw| literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step5.png b/ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step5.png new file mode 100644 index 0000000000000000000000000000000000000000..3687ed28d00613fed897389e5efe4eb9a34cd294 GIT binary patch literal 13707 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 Z3{tl?UtQN0zF0ZCr=+e}EN>qCKLDHT5#0a) literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step6.png b/ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..b1454fa1d0bd2a932a6449c3c2308e9ba935aa3c GIT binary patch literal 10634 zcmch7bySpJyXc-_fMKYSkcL4;5Rj1W5o}T#lon~EOJV>U5R{Y>lx{(KfI(7H1*Bn+ z?(RB+zq9T->wM=s|J=LoyB72Ar}ln&o(;U#P`gcuU`7A{DDU36p$PynVF~>KCnCJ| zK3{!Ac#%2XF>nQds`2ax63s`&LO?=XHE%0|f-cs10synRu6iASFX7}zW@qw>8YCc;ruO#sCMG6cy?T||of%XW^yvAhoSfXxp1y`}4SRw2wLTan#K#vD6fLi= z+1S`9XU!iSA1$j=ifVW56wndQM1i|Eu4{V@Esat>NvMKiCXh~9p(MI{r>EN+(PG1| zpox#mLq2BS&RjmvZIp(+HjtW0OVHu}>*E`JEn_;jwsKzXD(;Z43Yjy#Nay&To5agC z+ook?6zX*zjba&1tbPD2;5Vh#d%wQN2s8!%DByo_K=n(_X`L37Yc}Ll+Xp)0NSByifn%`GSlGesiDcl26rB}%es6r+D zO&1D^DQ2Afv#w1jwyxS0^Ti>O2^I0K+Z8iwIWxQ)VXHw->#xcj^F;aM3*LAC)ro5~+wmc@#I2l|S^CmhVk8q|w+R|RB+IR5zT|ES9DT?<*Z1%COu}px3@2JNlhnxC~J{|hg zy{v%h`y1~;ZHeuNjnP`BS$|6wMIUjZJcI}uZ$fQ4oHoqqRPs#l1(FR)v|7N*AnOQO zis`n3z+Bc{&pi_EfOQirVZ^!Y)iR(_Ex&w4fIX0;`S9NeJ>hbUdoEkvMuI0eL1E!Fv+W)hRn^7rXj$t7$?@BETol*wuT( z)Lo}ZL4IM}F$#MLQzr(YaEO#IbmUMJVWU?_fU?JT^v&i75y5K1Tpq4g5Em83jIaDG zFCQD8k!&g9V9N|IO#7Vc#Q$q8&(ZuAg~Q` ze9F8!6#j?_=gd}70*5|2k7HC!P$OU%ajtOZecD41h=qDRCB0LMy?6rz+CwFiVfJnQ zzRFHlFlb{4|M31FIA?8&B^2%}v=+yqs} z-AH%{ug4gI`Vox&|_>+G;4?u)91*lnwDi!l5J;3 zT5)kBz&Xxjx^D4nDOXdDlGlUSDd*Q%3>#C_kc|cndT&K@yZ>P!Uw~xvlA%QPip|nE zm+owIopgY29+i}YMeFYtSvPA9v8_UfKQjT!^m_6OR>3>rgW^2icX7&jN%vT&Eeo5n z$DbZOh<(a#Da-HB68y_A+|~Yvkj+xtvV?*pQQm)gzQ0qUWq-U2mv~?X)nD;T<5cdP zFQj1pR5_dJ3a9Yy706culj#M5PsLX$`>=Ge?ZLv-I}j?;5=;B|irmE8B+*KuA!Z%F z1Kt6}^SbA+S8;G`UT6(xlTnRvkDQS7a#*RTh5z#8?69Mi5g%b?)*fkg8-7g4^GXt@ zhn@N~ab+BFYU?a7e>9<%;*#kU~36_t&HBXS6-F!>I{Mf%qFqjyrAE4SbyMEwIQsJ#p z+Hv$Nxg6=4x*QvmWGt0cIHNQ^MuDs-DW(?cN-)US4YsfS=#o8c>Au-9>4#Z&^E7<2 zII*;HeKPFOdnuz+1PV9U+hjFWP(AjStu3x^u)tR_7G5YRJGWNP>oiCu%opM@`KvL2 zQM7<5^O^t~9oke5papHDrvHI|Bb%q;C*q-2J5Ybh?=fufokUNA6O+0+2fx z^=GTF>lncIY?b&H1^_tH)NZW?M|hP8kq{V=DCi9gUJ?gSMf(7cdLvbCf# zGzJvm4A}5JFfSw0ziJPgQ4q)|G{FdnI7tb?(0}X!WJt&bf-UGXTlS1|x`x!o%lXeX z!-r^;z1A-+0)GMJb)%lGvPDuN0si_k`}QXnTm{DC zLD=i>>Jnj`XC#LSKkOG(t#@b6BjK8>n!bx%I9oI923atv6s{P=NTXr!wdc^Uj`L=_ z2#6*@VaS-G4pTKNgo%i-orzitzYxLEP6`zXewed>td)K*R5vmyy@aMYQ$<&0p9LU-U>ZSJ=3av7z$*ug+mOTHfL!CuC~54Xep?)`NUcZvhHxR18{Z*cUpPk%+LE+>VQmn;b~ zd_K!U-)G>kYjm8rwuDmTENSHdeZfNLnR6d|e+3`T4oIL!ow?;d)p`g`JCn25#aR8- zsO%E@??HZZHG_w%G^jKEOvy^e%N-nhefm#MPI&(&y?yY)?u|n@q-vo`X73i{8hI#y z#Q1GnLrx~O&UVJx(c;$?p{D}qx@(a4X9!hDnaFzQJnyj*<&tl@(aEy&+eaQ`h2OL) z>L}*6XoA7E-`Amzqpz_c?xRy(pTH9b>-(7PZ@Mv_g;%{*yY=V0f_HNWKEI(K33juU zSx*ESmgPr9*2|>@r0Q;*Y_C2!K9W1dN#k-Z3CLNdzvRNr5~du6w-95pBDUMaM!mzt zw&h=MR4WqF=?()UeufdRPaH{Xefd_xIlO;)#WN8HW-YhebAK(y>q2E;UnLV75w?;3 z+~)b`$5>%F*^|0zW5rAvpWP}=#j~Pee+RmWC3oJaetqcmsC;wKcm7Ky*DZ+x6-)>8 zA{yLf(EsS}$?eng88E~O{SE6x32b1+_tJ3t2r}hONVkC59fEfu-)6%g#vRbbyAEFs z)G$3O!$t#&3__HvE-R)B09PHrt7%Jj7VwXEII7 zt-mU8y9Wvq&$&zYU46*r^Ql}5n)u)XH*TuA4<2z=UZ|$0o>gff-Fley^|}vSScU4h zwYj4{&3{vy#|cjqQ}N)j>(bq`WFeCMLaFsPx%qG+S!V_J;2*V2OQ4VbOUt>8ejIoX z^-s3}gsMGbyo))j5=#=!3U?WlR+Z`~7|MWBX}t@)hyim8K1lAj3?OCDdN zdKuvNBDH>DZG4OS#Id-eTRlIO@pdHeLRgWl*&GRTQGhk7(Ea3mKzML+iG2|HutjM! zz?8d6?#(`F6d{3wTsr)O={Kw^eO*&mZb)Gf-$s(2tryKSufq$>;IX$cE5ONQ1wkT7 zGs{ndI(0A#kq0SQ+{7Hb+{87{fFo5;`_fmST-w_3OYJ~ zi#4xuoNpIU=@IokM*@5WgQw#6Z_7eqn0!P8p--5ooesg~r0uGM?D+WRt<$bG#DuP0 z%W$6V2ySxci&u<}bliA)T3wk|aQ$@%NLVVJ-k95PnxL;YmO!h-h z`q(VD;^9N=oSnosEvhX=VVhymYl8D%Ip5);uMSsFcu{a%Olqa?e07J>NMDJ3eDoZb zf{!8A_1h#ULO@<982505P5e=Cs9ju|qlsmCf3^LEyePljOYYU1^`96dnr%lSZU~7N z(4BDmnI(OlSfqhuc&5Mem9rX`n78syv6yktoX|qC%LR&ddTlX^1%}g^W=NNPwXg9x zDp!3wXTG_tOk>Kyf{mT7G)|uWCN2GX-v2{o)Umdp?QV-KckzsAh+%eOCb4kIl{{sa z3)g2G9&_>So6Rolo$K$(!n@9KLzlSYl|4z88$DuIbY$q2luh=eOs3DL->8~nu?yvg z95@pN%`m=@RgH;^;ZQPwE;YVaHRL_Ez05acY;3qC-Zu~5Q}f*dzuy7BP!DkfwM-V; zYH_7&_o%~yy*7-^SN7(YxUZ|g8^RT@uo0;X&h1yqUNlSdpyq>z-{Br8+}wM}47jST zHplM%W*+Bk;X(OkfNHlwbt3C(=d|vb^>R^{*~441NHK?(_%a;B|aYdA-^Ny-{_J!0{=4SBog zyjQ!VBro=!?n2Yx&nO3tig;=f`D->*e3D%DJCmr~nt)5&qI7)he$gvQA;Dp{L~puw zbi$GHuX`9%?(P>T#MGq?pJ3lBeqX$pas9@=?D)nAEG~3FMmjb0Hyixb&pMi9xErs-BN~{zG-PJpMB)SS z@6>O(-CRG)=ImdynwuvS3o;VXeN1w;iGS+ZAw8SprS<;4OntqUlndgbuAtmdCC#tz z?=9qXyS2zDKQ?qQ;=l3_O|9oVyr3^pN&0}!t7D*MiTvQvHyC41e*1y>r}%gC@N8`H z&1;rJ)8B2@MRO&uvD5SAvTw;`+F2s_VBq(AAlL$Dm_2?xIqNu|{ z9`k6jA5#t7cQF?C-&Fii^L^Z|jrrwi5ba9^uu_nC5lBW!z@anpPI{zszDzQao_O!F z&WhIemtPvmifBLPNyyPQ!i}{qr8OT4QlC>}Eb$f$!{eV{yEOkQx&Ke_^5&P#Keet$ zMUMy}rK*!TPd#g*y^^;rHOo=-!Ao2ZdnstkMTlU?h>_mAY7vz@f33Etv^DIbi_SI0oT#9YFW`y;s{1YvGIvJaYa{CiAKUR9~Yl zrPICZ>2Nf7iJt*SC;(wCfMQqj!BZ#_(4)Xn7a~Fo4M?Y+!>s}vBClr=81DL9ZoN@N z0>@iJyeOX>LL(4JoPq{n&LZ$lmaNrfR?}jDzc>6vx!e{bhGB)UH?0ZzMB6wF;?xTs zkx<|i?RC35bdqvfa&ku62)|61(@hfi?X4Mgz2ntMqrZ z()SOJTS5TP^-GXqf6Y}7KvPsd-SyCQU}RZ@<9Vb>g5gLO&uJ@OQR$L4)8l~<4v5>uWE>B!<6ar-f9 z_2w=!Dvxri-SVe%pen;l(qOYcqq{jHt1U@&Abf5n^0FD~v%}J7c{Y@r*k!68S0z~K zQ5aj$j3jeUp%NBTW3uc(YB{!TPHVi~zo#r>;+^-0Az?2Yj^-E|M!ICbQkj=>|2^?o zil|K3M|Cd#?d8U)V~D+cqrSw8L`MT6mDGX_zS_;3?maG2EfIx8Tf;zm{p*V>>X8HHdm3B? z1tJ~Gd3@b@X|FdrL9PhfJP8Dj-=2~z0hp!}_7wTFl=5 z(xDG-)J8NnZgx#hWXTZCdFhyU47medmcoxDXmFm-y4`jtPOLq;W&cg&jVK6XSI*yk zET0!>LaL^jYji-BZ>k$J4=k~CI=X-TTkQe(M%Pk}K({>q0eB&j;|O(>U1x(;5I;R$ zwcUYOQsHI3$N37$Ai}&u#rwtQ@+*PlrS zIRp3~=t6}kn43c(S-KEL+iJBZ49J=>?C;R3na@veQ^CV0sKpbEg1`* zk*q!2ZX5Gl((sqo;%WxI;ZLY=kNs7dfut@m<3gQVHU~Hovg`1yeG#QnXp8_)G@u8o zMy|AP4_W_x$HITSlxT;^aPC@n!qrz~ICw8zv_w(ES@}-^4RVSD4GlVKc()#_hX#ML z4DX?l7)b&4^O6YmWfUOvZx{+rKmiCGiu^w?1~k&<9aK-=RR+)}=P^SIw-cgEU2c0E z&8}&LQ!lc(S(S`fPn*DdH&JA0d^99$HHzt8LP5;EWhZua1>0_!;-!Z#TKd2KVl-&( z-gkB#ooARG_Z|#fIc%@h8~f5PPyP9YYx!#VyJDl=Xp<|l{7!Q~d&W5NgR9Vp{2LEg zO4Nqqo9`Z0K<%ZqUb%ex!0=>kfN3{Fv*n3cZ0+jq^s>9C)y{%U-l$*SVZN#Ywtx!+ zK85fsBd--?$9PY^DDplOijje?`Ny)dJcT;3NqyA8sOBdgOg;6^V3&(+Xuksb#=ug$ zwqAGa@F<;s52+G>?m{)vFBBR-d_K+nVDLyBGQc}1dk&LtJJe5%pBdJTZ9g9Bj3aGI z6;QtI?JrAKz+OkCfb~d3f8>I|dxZJC}%)7XsN_cqlGqczVTUO(RV{=&b|?rbQSS%1SofJcGTM+~n8Ib^5Y2pt7iOIn5?z zLo)cvtnIAEROnTumudnb`b`I)nLO#L7R)1!*yo(v7>b)bW-T`u!eywKFWTBicxtl` z%uP;Cs{5RJ`RuFF-%mTZBgcl>VBX3#LGDcOTFZ&n{fGsPKZ%NJT-7`gOdtBmGUwyf z?hEVCWkW-M($r~_tgFny z!B?o6-6B%$E{l044Mx0I-XpAm znc+m8X)-Dc4IEg5>s8xD3e_s?pzTr0sZ}A@b2Z~b@0A{h3xlv<7Gqc0fA@*ZyK8lo zZ26GL8y9FdYjJ;Ud{Cu}aarcJJ4xZy#++si9Jx_A08YTvzM?j|>Pn_NB`#ZPH3NFYee$@&7`#zP zuy7Tnd~8VmJ$PsSGEmQu$mx0J`b6F8J}o8%ibY~L6`Qj?N~RG%W)y8%)Kx*eY*-N` zPPE+VUbg}XzG7>5xOn)hIDNIq7DT^rQyOlr?7UUxcrTze9m?9IWK*S$S*602t5e{D z&F}+Usc-vhuto;ATPz{GxE^^NvzFyiYVD_C3vOV^E}lFDv^$#ugs6q4HG4*PWP#4; z_cBPFagn|4V*SpI08I#UwMHy-%@lb_yV-gFMbzz&_XDIr(;)JdclFl`@7kf-m==-m ze{{qLW#drF6iM2cC#oE#tf6;k`+froh7)ZP%}#=gxg4MSTM_eAAvE0SQ%0Xa+j|fi zNz_5DxvKctO;9Kvm@dyW)z`lf4q){76T_e{A71KmN2!MUVdljJWFY!fe4dA3kxy7p$f*44(%-1MgM)*{qD7PiV%M$^PM z!7$)|vNZV_=b&d~L`HLT;sn^=PP31D@XvhI`fv#Z^3mfT4CiK!6mKX_3-_g;^3^Gp z@m-&~R#pj1nU8ri@XP%%2PwKex2m9WdZ7KrSR}v}(_C7~+&KUabu@(OYd~f2owOkA z_31Jxety)X8blp9<+MB7%#C$%JJ1p=;wboBt9&KD{}rvrv@}ep%1vy?F3`PXsw{~l zGIpiv*Iv@Sxeqo^Bd?cGqRXkI@~%!tf;{q^FXY`&QC-U+j~Dl zNb&+7&ar6TdR-U-$BKY{e}!YA4(ll&qHHhn^9FjzSiw%Jwy&P1-{tPFXG;$&B}|_e z-bO3;u8jHKOyFa>)HHJn+-OF*=LC@XnNW1%QV!gZbw@qAp#EkU4oF_Uf1VFgVL84z1_hn}T3^+=_ z&Nk-=rgrqb>)%`uyv8t8Sy*p*_B(Z7VjG2IOhQ8aT)%cS421^%9$<$fWWPWu?dZX( z#9Z=t_Zt9%FGclFgMOCQ=+ZxMQo3Lq^*!f6J}WnO5F7)nUI}el<q`3fmFEdR34=`ZgrBEIopg zFG>Gi*~`mC8}<0Zu*1)+$`iMV;rJCuRt#&8a%PfUi{O&xFPna~#NVV4z4C- z#e~(XbFy}UkP$i1W94PPI(8w7X0-fUdHapzk>w`76;e1}fd&(R58iF(Cj3zr14B7^ z8asSMDpHIFTPO`Q(GoCg9O*e1AnruT}ZPTV5SwCFDq6gJL z#!?7CB$CvoXnp2qjY<6YSq?E)yWcST%04d zALa_Mgy(UAhI*_$(VE@@R9kpuN(sCX0~U7(N7gDXIcj|&RnIhW-ZK-beCf#U#u}$j zq>&)ayFLKh@uQU_P8^4&sFY;1UoK6?^^1y%210yO2f+DsNS+JPo}S}OMto;EgfXa% z{Hja-OcPfARWK@NQL-cH4KK&7y{Pb1QM$@G{$SKJY@I1}3+bXA5)t{44pX8-)ceoJJPPRe8lvH(2 z%et*Q8$4maG_O%3_h#VswKFa4bTboX7sfP{91DgQf?xVg(l#9AeEsC57JDR1Jxm+* z`I+Iy_U6Y}g)A2da`bHgRR|Vpd%9iI{wFaNz}DEFKV~NW-QZdKd~k#t8tw8nfF2hv zyk~Z@vTNGmMcZ}d+~=M@?%mJKT6?|g-EVx}&sr0EztGjbLqbST2ml~aQ@y1J03PlX z+K+(Yy2B4Q9^kqwZmK4p0FZvYd_&&wkuuX zy@IZ$fy%|j#oXN7?Ck8};o(H^H%Pq8d-;r**|<( zT2U#V7`>*0JUuD)Xn$cP-F+@1<+2Ur zN=759EjT7?Ma;???&jrR;3Ib3aPI$qJ)xQpch5XX~0EWL)R` zm(YR>3HBW|Dx1EI$9n;ElsdMyYQR<%&{7?>fKy)~o8H+tFK`38C3uKw7gQ3G@e26S4&SGQZg*LukD)&6)Sa(`_5mfdMI_rksQ$`rPhzKjGso%n>dB%{AhrdjSeJ3?Z+yO@xD4ndc zt5%v5-TZttw&+=sdONLxfg%pag>*(KJ$;tI?TT;l2i53*UTcXP%c4j2qRcL9fW7Z0n)<6C`cB%fM{D9|+s zSdQbJrzkXFFs?E{GHX+kK&Yh$UPjO_jKU7F)cDX~Djhh730ZZYkwMbEU)+Jf9}`8JndI8rYrAx<{x$|CU=`mzIEX-XKl(wX!5?ma0rKS2ut&L5o0Sb)U_Z8a#ejOb$n=6w8$0?1c zR^45tTHVJrN2|xgo6Ff-0+VFA$wFz&)1p%vGgC*tzFvfrDS9zG{I+KdP9)g;l<_Je zb9uyJ*NZtbupztmkp~?MY29!WMk82p#V7nvv#Jxb!Gc5;Jl|o0BL4W95j+Pl^f^wSFdMWAm=JKI zb#JWTfGM(L$_7f+{|sUT_v6!i_~m6KNz~gnJ~F40d}FI6<{g%Xgh#<7=aV}tgoG;6 zs-F2z`_d71?T|Kv(16v;8JA@}^@5%4wpQ_0E<$6178;0Z}s=p_TOu;vbyK?w80vDh;P zSv#KO^X%BRMt$iCf8C?OJ!enF78~8*!xhC392%RSzYEA<+7n}WG}>+N59PKg<5Rng zi{hOa%knkJ9+v{fj-;q2y7wKWmEamlbnm%CbJ z!I!Lh35`-kExe_B;)(W$wtaOw3ukVGsn==)MPTKU)psLWGveLq>MBL9?CT7fiJJva zR^Z6TB-n)JC+6Dl$`J8%p#c-gF<3LM=N!nfOj^lXoV#R!AUZ2V) z^-TuX)5r$Wf3s1r;VkcGu5#HDc~4!ae?U{tB@QjaqHsQKCYvn@d@_&Tz}+%!#a5V? z*ZlJqTGD>(r*&Nh4O*K6Girh?@Qtg8#!5Yl6X>v2G&1~YuZZ>^N|5}s9eCo$gbm;@ zSI8_Ss5=_yiJb3f8~s^h#`SP(bG>|G9RELN&ZZtB%#yxzJJY4c5B?gHBwEX3eReeF z^d+iID~u2q$-5CCzHt6#jP#*wiKu|tZ^j{E6>qP-bjLc3q8c|M5v zG-@N(mD1|yk4t_Om%JZL@=hL4GhU|;VlIr-wsPvB4g)?ljuuLPAY;?^lhuU}a5naP zPM}0Mo@$BXs5loG@;_U6zXscXh<(XhZXB%}9{eNfM;!ADlK%0${t0opZ~e!5RYF$W zhLT@~TQjX;G4GmM78d5FmX_8E=exl9mdIW*V_CpamRvzx@-74Z-kJn4VGw6Q5xV6u z{^94heQo%A&O0pr3-2?ENa4B(<^!R0RD8Ym;3gI- zrWjYdZln94l@O~Bm9_BHgiQDqaxNB@BoaU{EGEmaTj<{aLMqdJ8;w9>k^Fm*YbZFv z4N-vW0sJ{2X9dt(xGC^Yj>e6l@L`T!+z37X!5pDIIibUHDU#x>f=$f__#NXkFuhA> z3(A{Kkg{MU5+nq=DhpXX8(Ij;lgL)Q^rCuew5E;y&V}LiOIO^lJ@XL#|GcUyjq>7r zLP#Z%MlLoK;qtioa{umr{2A8~>qT6spy7@kWFp`bN8qI$fNvnqpM#4Z=Tg|M8+sju z4x{K<<452k1~Pr80nEqy&?g971dLIC-?9>i;Pfg~^)Z7f6TuP-&;i`e1liAmJ}jj~ z{R?~jXV4>9W79R>OY7DzZ+)+HAJ+#6> zO2@DN=&_?qygOPn{{y3!P+km;=4(FYmpNo%@vsPkok-7dvza<1ayJe1wqAb3Gn%^UkXc3i;UFpppLl zA8yW9${p{&=h^>6hWF^+HPlVqqS^F@XqOGDp>rihCTOq$FWhAt^N8bDaBzY;pq06y zs^FBW0-50dSt10R^}|sK`<6cYZX1h88s55Q>QQwUw6Wn9dG>icsAIShl`7eDTP8*G5=Ot-Z zP0-P@6xeH*=K+KtCUxl8f&(3lWg?WJq_?Q7gvvv6iG`AMQ0HgfpShfWHC>$V+5b`G z3%)hr@yZs8t;TJWP{7FE0|%1a8i8m4B2_^?J!>H=ShesG*5aVgty=Sxmk|4!!%34S zU#QLV#^6!GXBeh=l}4Qi+qdeNd8S*}jt^OD$S7R!krptGkF&n*w+xO^E%=phd?oR@l^21jfX z4|6-{9Z-uy?8LtuR-Uxa=xJZQI{w^^=nb{XXS%ypfesrgOWKRJ-1Keuc(gBt)#wKd zlU^EC5(^bgvxx9Z@LTTHF)ZEN_bE&XHE6d}dCyI`TvIy9((D|j+PC&xl~zFI(Nv|( zH6Mfe@JCx6)g?12p*>fGntV!FUXu50I)9h2B@bI`;Umy12zbYJ<5~ZOhoCxrlY!k! zb!H8|1Oz9s*$|E#_bpL@3SS5&=s*tk;T;^QJ`NI6^t1bI3+ z6x7P*m#j(J$-}+{XyGqLTCs$2*KTf`3$zdO=PlUfd8{XkUS~?K(R1AQ*G&sq@U~@K z)sy&Ya7{6J{3^SmFjtJ}eN(jImHs}_WY?UkKAl+xRahxu*w_r2gqtA4f#2JeCS6&WlOWZ*Y>zXc-R3>ijUI zQAGQAQ0y^(R0n3n{94x682RncfLm|quJFl)p9D^a`+qf@RclsCO+F)k;K*C{lGWFx zT6PF-{1R9+&qb13&_VZj5xKOPeBM9r{a&|^Y@&BGNeIy9&-LkqH~H{|t^Ul7dMnXN zZ@pM)$|c>$S<=CCPojrc1ElG_?@u6@>u54Mnn!FZ5cS6O_up_k9+J_L8w7$r$8%}<4EDu5d}7vim$XeHA?Dn@yEqL7rzK3>*_7^{%tfT zO#@$-Y@z&v`*gR0mC(F0X0PqkMy>Ta`^8#`H$UlzJ&-%gJNlva*d+PB3gs)_4F*z3 z>-tTM?(=~sYR>p6oVo$a#YbrHvMTY0&O(i4r_uDBRMO5DVpl{TnO2v6&g>q6FPrtp zUG8f$Q%`3qh{qL5YUIaKM zXU1?|t{Hr>Oc>3I`nWrzerK1l9whI^>&%Y}0xIH)OMF@VN$FdsCeDSHSLvr5C^>Z; zqIIgvxATiu8y0hKMtA5#!7g|n zn7_f_-9B~p_4&h)NT^aQxg0e$SA33Q#yXiFuR`bq zbNh;78Gb7NqApJL$}Fh9V>r88!F$Vc9vqM+uquQ{0~KLvsHS7*jvV#9TQBwU zSE3BtS=aT_wH=H7QXdRis^Z0F`@V#oig4UD%-_|Zj5bCxAN?`ovd}j*{5b5pH7?^~ zo+#dE1i=;vC0+iF_TL<6^{R6NB*4@^{}RlN0M>RXp6%2H#i0NgC4u^#zk%#Hp)=H} zZ$Uih+U5MPXWZE>+yy^27xwwj%U=|+0`${&y|CpoMF9A&rw8^)H7ei~EmHPBzWixF zW&hd`4gnvD{h8&n8mN078Q|eYF)0d8cVEcoR`4SJo0$HW2&=Ha9#QO0Mcn3wSh9J? zrRaWs;X1ylMNeTi^z+ZeQ2O0bB!$^YH&G7hzl*ZaRv~y;8jg`u@yRm<^ZFIp9YDB$UwYBw&*?{zgWWG2$w3SjB#K-$?Ek0HgKo7-~tz||VA~9_WLwpwuoM^6?AK&K~ zdU@t9J_$gvT-%grZ?cdwPh=#ftgI~9k}^pJoT7GYA&1i!uL1x0CJO2kLAdEWL4Ylu zc?I93lq)A(O*hxTNW+s>2ug;?x}ng+HOOLFs>=d6Bgh>j<0pn4?m>L?Arxp(0Ir~b z0UDt25TJz@WV~*@xC!UsfFQ7S(0(g|!|kgRB-d~%I#2(+}0C1Blut7 z{(o_H@zP-AvG1S~_aAY$Z5eHShg_deV6{?lg)A~bbYNN3>~~(s&BU_^R}VRYHhmIo zl0}=%DYjW)cG3aVJA-2;I4;2jg6z$${OZpw(A_&H5sE@MQ6fyp!238>Tns#`nG~kG z1E8PzKrTh~ZBM0K1`o0CcR$x_J!Wyy^D-+kpotJyo}jHM@js613Ca21v(vl6CGjs49F*XG=k z5~n2*(hz0t!M#Lbr>u{~GHJixy1u=qmE+v&+;0=iMuFVu--_ zZHGdH(b`~{QC?o-{+Yd=-96VFJM-ifflL}dN9UR1U?-4m)hVi|(bHTYN#8{D z3KO04jQsLA=>xe4#^s?E5?&O@08fN(DKQnyZ0dJ>e8pz`Bk#9){;|{KuSa6y)Y&ma z9iK>0G~#cO9)-^}mzKN-r}7>X_Ew>tT1%Illr)*Wt#@i^RyyJbu6v?^AB0xaxq+sM}45KfP-FAr=^ag=?i=FcajnRkX>@0a7ZC+2U#%tRo zI2Z}5iUdyGOs&vfKI-*nn(gbYV+*)3~s9d2qWO&WG@)xF_siHoWI7&RdFKimRF zEZ<+RcE0E1oO8_NwA|nGoDN7sd}Il@*E3;MqhPEX5@iYU!e2{JTbuTZRbMaprr06& zMq2!8n<9ZPX+Q0U0$fD+*$LN9-QC>{Q$G==N2a-t8_GD0XuKOW#A&Ad?NE!#C?-|f*bWT6+G?4Jt`EosXi5=d+&S$VzLuWHsK|MsW zVE#tU(s=Fd{A+@ZqpbxtENJJhUPkN1-@l7@Y9Nc#4NqLTkQvQK79s*oXA-@}^WMkx zZKSs(^Myvndm*L|p^#m*3mK!ad7~F%wG$rpCrsXc#}h<9N1a@QeT&Q*92lbf#NSU| zd>K!W2nCY;(FFF*K4XiwZx?}cu4YNl-q7O20-B3hPo{x^{)xCGI27_irWwvj$JeE@s}JMyIjYX*2|CP2FdkXR zg5=Jv9sJXASsB8cw)KTo=6RJxDpmqBGxqLvDUk=SI_kxP1QzCA-&_`4n9OBH_3Z40 z6-xBgF}R=WM!FVVl)W;}lI1&`!td?k^xUPdOtz+DA;!F;LF+MJedf@02kIuL5*Q3h z7n+F4(udnF;;W7%%okE^<9yBL%D#2Y1yHTllcc}U$$S?C*Tyf_`2Kl<$Z?y2vnB8} zoX~BFIp^ieI5>7+)f|%aDjbcL<{>dy_ATb!9L}3>5 zN_g;!e#>Xm2LT~BvUDNm8GuoIZnOa+`TV4)HLhZmn__5X>vc{wSNpri8h4I*XKwCg zM(_D%Ja|4EJ)6%cNsLiza7iyIYiOS{R&(dY*y&bBfXe#Nj1o#)3B3rDt^#{@T7_5L?ONf z8KsNn%_03Gx56okj+N-B6U}Rxc8|zoMcaWnC0qJq>06SP%c7YF^*k&Eaut78R#vix zW~Z>UY1|Z^?98O7qpRI#K@E2HwfyGm!!#I0ApSJ6TKc!cPvd>0M!m+L>0%PhQbOB} zg&5*d@ek|bfRcs8#esB4e3v{${?8Y$adFWzO`h+99O|AR2`0vs1T8F*n-(JoCh+HirV1r@haBh;^J(Wy&X zy(v6H`rP2mATy=0th=o~uBmhE5IFahDjG%J%f;kSa#zqaLaQQ6?a<;`C09^1(Mc6fu1TnYWP$cLgzcD54o@!X3g-8kL0NZn zmIf|I=a#!xhn;(2gDa7v%RO&%eGaBo7t*cp)~g4+=IkLxXXr6J?AA!{lT^0|a-mH+ zNJ?}L?Gu|g*)Ib5YI{&2L)|6m>fcuDHNI1Wz&wI6<*4}~X)*Iu!s7xS76%^6_~b@5 z7GBpV$3iKv60#3jRN$@-8jeilTlb|cBk)9P++Zi`$lnpiea)$zTQUqi-kvc04c3WJ z6<1Ndsm^NcZ#3$Vr48df5K_M=e^JO{WY$D(W5IZjoe*2H)8l=m=SjA{>q zsYgDSN=O;8xn04`f;bhHY?dOuXP5y>CXqrj(ta;Xyr&J4m^M<vN#4qqyRVh>(|#(FZ{l6=%EJF<0B96pYZQFcOkX}h_qT~|i^_%!L|17-Bpoujw^zGBfe3aiy zax`*R1gJYNYb*Rc;ExUQO7#~w0XNJwgRO_;*Rm5QZj@vb@xN^rdB@=DH~7-#`-G$i z#6n`=LAtxzp<;OZu^t0yzoAQxEU9kY<92tn?9_frtCPc) z1}5yXv3(u=?1=m9_OBFt5ZMH9pdFVJbSA@FY zk1`39>wd3nV`&(%9h&jNJ@9wbAT?>MbQl22lFMfS?l*T@fYm5PZ_%l~Yi`Gn{i}NZ zSe0cEavABfeo_@@Lq=p5Gh&?#Zk*(PI!*8h3X!sj(%tTlZnVtKe}`1LI@~m=js3%x z&|78{P3!?fM@}f;DD$R=a3_%p>1w8=z{ypPQy4r$x?s6cJ&@ta0HzPHQ%i4jS`kw= zZ@L}Rd?}eHK44q)Ysar~<1paw^;q=zi;N!fvutegE1c=4`u4c2l%c%tP<<%isok?a zb8?!yB5xWd#XXq@rjB9G9hkz_H03oZc{<)=-Cl4LFN*S6ReA|1HHgL5_E@p8)jCCka`%TG=vR7ic}&dR%H2!r}~lW#Tz|aBI@rDpwvIJ zoAy$PnQQ5dk{uD=KZz$q)hRq-ml*I~zeo6&79c@*wmmF<@28qP1fBM+Uk1dd_>#TW zX|S;-2H_LT=%irNMK0tf6gUuoUrPb<8}7^lF1;99fM}8f?NljVzvb9KUWO2CZq zfs$(`9_hK`Ja`c<&it|nYTaLWT|?3YD&(*jP?+olgjPafuQ@yEKc8yWOiyxaYiiK) z5xsc)-CeEsz63r$47@wQ&rXzL{DNa%a4C-_Nb^`ak0Res`~X_ADK96CnM9fwuY2DoxWzj_?J*2py9Jd<2s5 zf$g4KvojCq8A+4bghn@qG|3v502hn&Tm1{WhSgt*bAz+*Xvpr5Z3qYlr~`xiL^|kJ z4p~AZMtxsCK8hWIySIa@7z>&*fS%6u1Am$-ugNpa-<=yLV69E9K7Zdmem3H_RD3sh z#FEnu%-3L=RPUE+iBzSjO{|l@S|Cc^;)wHO8-(O-#gWk_`<@G+If z^b`0;w?SQ>pw+od%-&`d5|Ii$5dAy{7y{AFF6om*F%WeBC@g*!|ALeIPexcZ z>_HY~l2r-v^TRpMW03Ko(t((??Pxd--&_(!!<_YBlS6Rm(&N^{ zs$Jx_rFwfU>Cx(WP)K`NiwMyfodIQi(2M726<*unMVL7Y!D1z*koJ->-uT(Q8IS8% zeh3HKVAX2ZL3AhcOL>fqC+BxtM(b2}bsAFVzOa13Hb!x-UrFf^@(7`ANV% zZ@;6vowr_6>wj|I<@?wVMLW>Emg8K5p}f1R=(RqMC)m2gi}v7a4>3?ZjRdI0Gsy7S z=P#7by*=6WwRa1u|KR25#TmbHtM=26aZGuzyt|URGa*Dx`i~4`zsts`UesK-`{;uQ zlmJ%0%GXTOfhgZr-p%)B7;cd%pbUrXra`d2q{I;+FDut?Mag?6*5>eqI_1-u3sh_?+gu z{9$Nsja`6sgy|X`kk#Qyj7FE8X6%|D&6>LS~C5k*!07LGue$h9pgxKBYcMji;W^T;ml=_=AHRV;#39(AecCK_HvO7-5L?< z=&TzlIYy?_+l#xCt=ibA0RRF((f43(a+&-__biu8`BLdOK3%PB;A2vAXgOK{Hy^e^ zYP^gyY3?z6<=Sc#$g;YE@o0JJSnKDI_EgpEbDU%KwL4%jQn!_OzEs>-ugr*!mTlOJd$F z#Gi)1V$yk0uRB(bZf=C0E#=C(Gz;9knb^3bf2YLR$=v(>a(mEBhzfr0-mti-eV&PX zG3i`;+#XMvC*0bk|Jb1QD%F;9J|Sz$-?xC`T{X&0LDdwuawv&%{j;jLxF zdCr&t5|Bq+r8$Bw`yMq+*6M~-vCa{+AD*tx^8xPqYrPzIuGDs2)Ow3I7On`8C_cd$}uW&{Yjl@P8g&4AA^S$+d^Ia$6w`tmK^tYz; z2}}4Q!_+-!qbR|!RqFxrMPX<`O7{0wZ^-exN49n9N3G(d8Tj-evy@TsA-Gz};K1f#h;XIUIIC00t5O3YNe^SLJU83lzsSNSX zLvn2S9vNKKK8ke+A!JSqQU8Mam2C@O?E0fi&YIgVIJ+o7tkzuzT81Rd@{66@?*1a3 zSzeM#Cud#5{bN+Rr~vVW%QBNe1Ihu<_m_uH(tJxrkyzP_dmhu$S53r}JiiD9lSafT zzlk6!!8euoUhJhH>u-p)?A#=K0iKff>s&`w{9z|ptd+t9yp2ux%n<9vOHiQm;)FW4 zeyZcofM-9=g*Q3&u(XPXIfuc`Qx>uL4l3&WesP&ER#_l({&C9jUldxV;^(~=&5s07 zqeYn9iO#-+=Uj2o8hXVwANLTtu7N|0STbp*T5{{fKUUke)IQgXgs80p1D9P98@JU} zpGZSL+S#u-hy^NQMHr0wdTj!?g2^GV8|wb~h4>SqjJWIyz?)A>!C#fo2b8Q#bGIXQ zUu;)id;Xezz@D{A-h7>$(nggp^+Bn}j+1KJV%ebO{egIG*E0i%%QY0wiQZD}^{f*U zPIByBzk|~uQ37L2tCe{^F(Ol~_XC2rCtY1ov)T%ByV~_#Yu;@*bcty$BFV9<7E8g) zu~to71uVD-asX2_FA2KceEl&bB2_PW{60dqMd$v_nUDds!}ranJhjy`;b!fPrliUY zQGG;hgF4jMc~5h{fRPN=Ud`*M{K|wCM0rcIk(!+L2ya(AEkRk(K=sUS@9y$nDdbZ0 zMH|9xzjPPTZ|F?+Eex>mpscR9)VRF?bZ`9?M6;C83QNrc&>THT=}e>ft=(LU_mkzR z8!R`nXn5G`{|uHqey9rZ$l;_@n9gM{J)LtOo1ixDp*Y^H?3ytt zOz4Dh?S$L8BC*vXpPU|YvSr4Hn_kUg_q7!FsPxqoxSAbxPcY?!;||sGz>mdbp;6Hm z@ZN@`Cr|HPlaWgut*8{tbnpItv{-3oR+#io=gNo9sJ{(L1C%xP^aE@de-*UJlisbb zN7Bz|j#-b4KPbJKm7&IF5CJw!aqj0chl@7lsdtp`EvaA^+CN%WMOs{}?qwX5PC z8m#o>kd<>>C|MTp_3(VF6Oj`_Vr@yjmpprZF%gC*-cSKf zdRW`h>gbBt__%7F{*}ki<;cN^4kdQG9vXf!fgcK71yRh14N;{5cSCAA_@V$QU_${U zMBW0O_ggxNHnloP0Oem=J)a2o!9-HB;vIg24|i4P8H&wIVeH!9X9tp|=O2K}=sc)q`m-zG@>$~R@?HWq@hg^EPH2M{ zMT@isr{CZyZQ`aJYcbWwtbipEFHL!tmh}5(6P6Fp5%XZJh&I!2(A+& zkmqNC5P^KW=Vk4;s1VF|0%Fg_oh3BHwmd95yNFauaEW7Ujca`|QuJ4~W1bxfh~R1i z$6CNsrt6oR=3)TZmYa_<@TAXEaHP;& z3S9AUIwHa@soB>hZlPa8Gr7%@*)}+#vnk&@Y`&e&-7`f~h)dO$-_5Wviq(>dT>~8^ z_RjL0a0K{F$zRT%oARJi^4t8YV87p8Ueg=c!~kX!@p(?%ZR~{dU0v^rh^Q~yGfT+R zXa3g=l16WGCwVuPUmRKo5T3@1T;>rwGfEZhF3op^=dZnuGRIzwgN#w4Yy!;~JCy34 zNv&pESEERq*)}K9h0~LDH~02hr*3X$ZTm!RLMR-JC5meIynEXjk{Kh*5LpG;?V5=$(}BZFit#y(g%wPJ?~?I zbBVf>2ii*xE-+(0FfBbnqBc}T4^4)NGLR};;~w{Pv;SQF3ja$Uai~eq&!qJ99@}9~ z)I_hUgT%JpDp8&6dyQ|WJ`N$;UJrKEavUDK$^AI&f&M;qZ6$FwxIPismgDfTrn2S> zq2&n~RxVi(*ZSkmU){)Da&>!%kZHHvh_^m6NaTC#-8}xqrq{ZavQ18kPA#K%(1Kj3 zg-s#^#`8syy;M;!f1cL$2|W&)WJv+1nmK}`^N;N{{FCp-e~)GU_8Qt}ah)Jw>TF2? zayTZ~TOUSqE!EYw<3-}W$85%+Dkl)z-JWjec2ti_$PP;Y)|U7?WsLj@d%8?Bf(_es t1`fILrYQ=dLyG^;@7?_GZ}wo?j#%Og=Ux*^?r~gdsi|n+Dpj%${U6RYJca-O literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step8.png b/ru/docs/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step8.png new file mode 100644 index 0000000000000000000000000000000000000000..bf6fee2c50893c141fcba2a5647a7ef111c97877 GIT binary patch literal 9686 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 target` , это означает, что `target` еще не найден, поэтому используется стандартная операция сужения интервала в двоичном поиске, **благодаря чему указатели $i$ и $j$ приближаются к `target`**. +- Когда `nums[m] == target` , это означает, что элементы меньше `target` находятся в интервале $[i, m - 1]$ , поэтому мы используем $j = m - 1$ для сужения интервала, **тем самым приближая указатель $j$ к элементам, меньшим `target`**. + +После завершения цикла указатель $i$ будет указывать на самый левый `target` , а указатель $j$ - на первый элемент, меньший `target` , **поэтому индекс $i$ и является точкой вставки**. + +=== "<1>" + ![Шаги поиска точки вставки для повторяющихся элементов](binary_search_insertion.assets/binary_search_insertion_step1.png) + +=== "<2>" + ![binary_search_insertion_step2](binary_search_insertion.assets/binary_search_insertion_step2.png) + +=== "<3>" + ![binary_search_insertion_step3](binary_search_insertion.assets/binary_search_insertion_step3.png) + +=== "<4>" + ![binary_search_insertion_step4](binary_search_insertion.assets/binary_search_insertion_step4.png) + +=== "<5>" + ![binary_search_insertion_step5](binary_search_insertion.assets/binary_search_insertion_step5.png) + +=== "<6>" + ![binary_search_insertion_step6](binary_search_insertion.assets/binary_search_insertion_step6.png) + +=== "<7>" + ![binary_search_insertion_step7](binary_search_insertion.assets/binary_search_insertion_step7.png) + +=== "<8>" + ![binary_search_insertion_step8](binary_search_insertion.assets/binary_search_insertion_step8.png) + +Если посмотреть на следующий код, то видно, что операции в ветвях `nums[m] > target` и `nums[m] == target` совпадают, поэтому эти две ветви можно объединить. + +Даже в этом случае можно оставить условия развернутыми, потому что так логика выглядит более ясной и код легче читать. + +```src +[file]{binary_search_insertion}-[class]{}-[func]{binary_search_insertion} +``` + +!!! tip + + Код в этом разделе записан в стиле "двойного замкнутого интервала". При желании можно самостоятельно реализовать вариант "слева закрыт, справа открыт". + +Если смотреть в целом, суть двоичного поиска сводится к тому, что для указателей $i$ и $j$ заранее задаются цели поиска; целью может быть конкретный элемент (например, `target` ), а может быть и диапазон элементов (например, элементы, меньшие `target` ). + +В ходе непрерывного двоичного деления указатели $i$ и $j$ постепенно приближаются к заранее заданной цели. В конце они либо успешно находят ответ, либо останавливаются после выхода за границы. diff --git a/ru/docs/chapter_searching/index.md b/ru/docs/chapter_searching/index.md new file mode 100644 index 000000000..41d043c08 --- /dev/null +++ b/ru/docs/chapter_searching/index.md @@ -0,0 +1,9 @@ +# Поиск + +![Поиск](../assets/covers/chapter_searching.jpg) + +!!! abstract + + Поиск - это приключение в неизвестность: иногда приходится пройти каждый уголок загадочного пространства, а иногда удается быстро зафиксировать цель. + + В этом путешествии каждый новый шаг может привести к ответу, которого мы не ожидали. diff --git a/ru/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png b/ru/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9ef5735ad02ff4413e6a72d79d697d44b4d1ce GIT binary patch literal 8933 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step1.png b/ru/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..85f66af7b0111e3972c7ada17b87551f9d3fe909 GIT binary patch literal 10492 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 MZFH*OB>w*Y0ww>Ci2wiq literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step2.png b/ru/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..673ca7dbfe337b19bfa6a8e55dbc0b0cc81f7812 GIT binary patch literal 10751 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 RKId=GH4UB1g%|Om{{yo}@ht!V literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step3.png b/ru/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..039165ea7b4687b88476139d848dcd462e29ccff GIT binary patch literal 11261 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/replace_linear_by_hashing.md b/ru/docs/chapter_searching/replace_linear_by_hashing.md new file mode 100644 index 000000000..5597e233f --- /dev/null +++ b/ru/docs/chapter_searching/replace_linear_by_hashing.md @@ -0,0 +1,47 @@ +# Стратегии хеш-оптимизации + +В алгоритмических задачах **мы часто заменяем линейный поиск на хеш-поиск, чтобы уменьшить временную сложность алгоритма**. Разберем одну задачу, чтобы лучше понять этот прием. + +!!! question + + Дан массив целых чисел `nums` и целевой элемент `target` . Найдите в массиве два элемента, сумма которых равна `target` , и верните их индексы. Подойдет любой корректный ответ. + +## Линейный поиск: обмен времени на пространство + +Рассмотрим прямой перебор всех возможных комбинаций. Как показано на рисунке ниже, мы запускаем два вложенных цикла и на каждом шаге проверяем, равна ли сумма двух целых чисел `target` ; если да, то возвращаем их индексы. + +![Линейный поиск для задачи о двух суммах](replace_linear_by_hashing.assets/two_sum_brute_force.png) + +Код приведен ниже: + +```src +[file]{two_sum}-[class]{}-[func]{two_sum_brute_force} +``` + +Временная сложность этого метода равна $O(n^2)$ , а пространственная сложность равна $O(1)$ , поэтому на больших объемах данных он очень медленный. + +## Хеш-поиск: обмен пространства на время + +Рассмотрим вариант с использованием хеш-таблицы, где ключами и значениями будут элементы массива и их индексы. При циклическом обходе массива на каждом шаге выполняются действия, показанные на рисунке ниже. + +1. Проверить, находится ли число `target - nums[i]` в хеш-таблице; если да, то сразу вернуть индексы этих двух элементов. +2. Добавить в хеш-таблицу пару из ключа `nums[i]` и индекса `i` . + +=== "<1>" + ![Вспомогательная хеш-таблица для задачи о двух суммах](replace_linear_by_hashing.assets/two_sum_hashtable_step1.png) + +=== "<2>" + ![two_sum_hashtable_step2](replace_linear_by_hashing.assets/two_sum_hashtable_step2.png) + +=== "<3>" + ![two_sum_hashtable_step3](replace_linear_by_hashing.assets/two_sum_hashtable_step3.png) + +Код реализации показан ниже, и для него достаточно одного цикла: + +```src +[file]{two_sum}-[class]{}-[func]{two_sum_hash_table} +``` + +Благодаря хеш-поиску этот метод снижает временную сложность с $O(n^2)$ до $O(n)$ , существенно повышая эффективность работы. + +Поскольку требуется поддерживать дополнительную хеш-таблицу, пространственная сложность составляет $O(n)$ . **Несмотря на это, в целом данный метод лучше сбалансирован по времени и памяти, поэтому именно он является оптимальным решением этой задачи**. diff --git a/ru/docs/chapter_searching/searching_algorithm_revisited.assets/searching_algorithms.png b/ru/docs/chapter_searching/searching_algorithm_revisited.assets/searching_algorithms.png new file mode 100644 index 0000000000000000000000000000000000000000..21186ea959fef60887a5b7ef79b67e8003c8be6d GIT binary patch literal 26082 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_searching/searching_algorithm_revisited.md b/ru/docs/chapter_searching/searching_algorithm_revisited.md new file mode 100644 index 000000000..8fd5ef1c7 --- /dev/null +++ b/ru/docs/chapter_searching/searching_algorithm_revisited.md @@ -0,0 +1,84 @@ +# Переосмысление алгоритмов поиска + +Алгоритмы поиска (searching algorithm) используются для того, чтобы находить один или несколько элементов, удовлетворяющих определенным условиям, в структурах данных, таких как массивы, списки, деревья или графы. + +Алгоритмы поиска можно разделить на две категории по способу реализации. + +- **Поиск целевого элемента путем обхода структуры данных**, например обход массива, списка, дерева или графа. +- **Эффективный поиск элементов с использованием структуры организации данных или априорной информации**, например двоичный поиск, хеш-поиск и поиск в двоичном дереве поиска. + +Нетрудно заметить, что эти темы уже рассматривались в предыдущих главах, поэтому алгоритмы поиска нам уже знакомы. В этом разделе мы еще раз посмотрим на них, но уже более системно. + +## Полный перебор + +Полный перебор заключается в том, что мы обходим каждый элемент структуры данных, чтобы найти целевой элемент. + +- "Линейный поиск" применяется к линейным структурам данных, таким как массивы и списки. Он начинается с одного конца структуры данных и последовательно проверяет элементы, пока не найдет целевой элемент или пока не достигнет другого конца структуры данных. +- "Поиск в ширину" и "поиск в глубину" - это две стратегии обхода графов и деревьев. Поиск в ширину стартует из начального узла и исследует все узлы текущего уровня, прежде чем переходить к следующему. Поиск в глубину стартует из начального узла, проходит один путь до конца, затем возвращается назад и пробует другие пути, пока не будет полностью пройдена вся структура данных. + +Преимущество полного перебора состоит в его простоте и универсальности, **поскольку он не требует предварительной обработки данных и использования дополнительных структур данных**. + +Однако **временная сложность таких алгоритмов равна $O(n)$** , где $n$ - число элементов, поэтому при больших объемах данных их производительность невысока. + +## Адаптивный поиск + +Адаптивный поиск использует специфические свойства данных (например, упорядоченность), чтобы оптимизировать процесс поиска и тем самым эффективнее находить целевой элемент. + +- "Двоичный поиск" использует упорядоченность данных для эффективного поиска и применим только к массивам. +- "Хеш-поиск" использует хеш-таблицу для построения отображения между поисковыми данными и целевыми данными, благодаря чему запросы выполняются эффективно. +- "Поиск в дереве" ведется в конкретной древовидной структуре (например, в двоичном дереве поиска) и позволяет быстро отсекать узлы на основе сравнения значений, чтобы найти цель. + +Преимущество этих алгоритмов в высокой эффективности, **их временная сложность может достигать $O(\log n)$ и даже $O(1)$** . + +Однако **для использования таких алгоритмов обычно требуется предварительная обработка данных**. Например, для двоичного поиска нужно заранее отсортировать массив, а хеш-поиск и поиск в дереве требуют дополнительных структур данных, поддержание которых тоже отнимает время и память. + +!!! tip + + Адаптивные алгоритмы поиска часто называют алгоритмами поиска в узком смысле, **поскольку они в основном предназначены для быстрого поиска целевого элемента в конкретной структуре данных**. + +## Выбор метода поиска + +Для поиска целевого элемента в наборе данных размера $n$ можно использовать линейный поиск, двоичный поиск, поиск в дереве, хеш-поиск и другие методы. Принципы работы этих методов показаны на рисунке ниже. + +![Различные стратегии поиска](searching_algorithm_revisited.assets/searching_algorithms.png) + +Эффективность и особенности перечисленных методов приведены в таблице ниже. + +

      Таблица   Сравнение эффективности алгоритмов поиска

      + +| | Линейный поиск | Двоичный поиск | Поиск в дереве | Хеш-поиск | +| ---------------------------- | -------------- | ------------------- | ------------------- | ------------------- | +| Поиск элемента | $O(n)$ | $O(\log n)$ | $O(\log n)$ | $O(1)$ | +| Вставка элемента | $O(1)$ | $O(n)$ | $O(\log n)$ | $O(1)$ | +| Удаление элемента | $O(n)$ | $O(n)$ | $O(\log n)$ | $O(1)$ | +| Дополнительное пространство | $O(1)$ | $O(1)$ | $O(n)$ | $O(n)$ | +| Предварительная обработка | / | Сортировка $O(n \log n)$ | Построение дерева $O(n \log n)$ | Построение хеш-таблицы $O(n)$ | +| Упорядоченность данных | Не требуется | Требуется | Требуется | Не требуется | + +Выбор алгоритма поиска также зависит от масштаба данных, требований к производительности поиска, а также частоты запросов и обновлений данных. + +**Линейный поиск** + +- Обладает хорошей универсальностью и не требует никакой предварительной обработки данных. Если нужно выполнить только один запрос, то время предварительной обработки для остальных трех методов окажется больше, чем время линейного поиска. +- Подходит для небольших объемов данных, потому что в этом случае влияние временной сложности на эффективность невелико. +- Подходит для сценариев с высокой частотой обновления данных, поскольку этот метод не требует никакого дополнительного обслуживания данных. + +**Двоичный поиск** + +- Подходит для больших наборов данных и демонстрирует стабильную эффективность; его худшая временная сложность равна $O(\log n)$ . +- Объем данных не должен быть слишком большим, потому что массив требует непрерывного участка памяти. +- Не подходит для сценариев с частыми вставками и удалениями данных, так как поддержание массива в отсортированном виде требует больших затрат. + +**Хеш-поиск** + +- Подходит для сценариев, в которых требования к скорости запросов очень высоки; средняя временная сложность равна $O(1)$ . +- Не подходит для сценариев, где требуется упорядоченность данных или поиск по диапазону, потому что хеш-таблица не умеет поддерживать порядок данных. +- Сильно зависит от хеш-функции и стратегии обработки коллизий, поэтому риск деградации производительности сравнительно велик. +- Не подходит для слишком больших объемов данных, так как хеш-таблице требуется дополнительное пространство, чтобы максимально снизить число коллизий и обеспечить хорошую производительность поиска. + +**Поиск в дереве** + +- Подходит для очень больших объемов данных, потому что узлы дерева распределены в памяти и не требуют непрерывного хранения. +- Подходит для сценариев, где нужно поддерживать упорядоченные данные или выполнять поиск по диапазону. +- В процессе постоянных вставок и удалений узлов двоичное дерево поиска может перекоситься, и тогда временная сложность деградирует до $O(n)$ . +- Если использовать AVL-дерево или красно-черное дерево, то все операции могут стабильно выполняться за $O(\log n)$ , но поддержание баланса дерева увеличивает дополнительные накладные расходы. diff --git a/ru/docs/chapter_searching/summary.md b/ru/docs/chapter_searching/summary.md new file mode 100644 index 000000000..fc0a8be4d --- /dev/null +++ b/ru/docs/chapter_searching/summary.md @@ -0,0 +1,10 @@ +# Резюме + +### Ключевые выводы + +- Двоичный поиск опирается на упорядоченность данных и выполняет поиск путем циклического сокращения интервала вдвое. Он требует упорядоченных входных данных и подходит только для массивов или структур данных, реализованных на их основе. +- Полный перебор находит данные путем обхода структуры данных. Линейный поиск подходит для массивов и списков, а поиск в ширину и поиск в глубину подходят для графов и деревьев. Эти алгоритмы универсальны и не требуют предварительной обработки данных, но их временная сложность $O(n)$ сравнительно велика. +- Хеш-поиск, поиск в дереве и двоичный поиск относятся к эффективным методам поиска и позволяют быстро находить целевой элемент в конкретных структурах данных. Такие алгоритмы обладают высокой эффективностью, их временная сложность может достигать $O(\log n)$ и даже $O(1)$ , но обычно им нужны дополнительные структуры данных. +- На практике нужно анализировать размер данных, требования к производительности поиска, а также частоту запросов и обновлений данных, чтобы выбрать подходящий метод поиска. +- Линейный поиск подходит для небольших или часто обновляемых наборов данных; двоичный поиск - для больших отсортированных данных; хеш-поиск - для сценариев с высокими требованиями к скорости запросов и без необходимости поиска по диапазону; поиск в дереве - для больших динамических данных, где нужно поддерживать порядок и выполнять диапазонные запросы. +- Замена линейного поиска на хеш-поиск - это распространенная стратегия ускорения, которая позволяет снизить временную сложность с $O(n)$ до $O(1)$ . diff --git a/ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step1.png b/ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..2d5d9adfc9d790fb7402c88e2424dfdc0fa647dc GIT binary patch literal 8262 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step2.png b/ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..039a8b8e0a7829ef7061d88faf15b63a2e4a46ca GIT binary patch literal 8888 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step4.png b/ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..ce7418fd996143fc64aa3aa00bee06bae848c3a2 GIT binary patch literal 8966 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 B|K9)r literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step5.png b/ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step5.png new file mode 100644 index 0000000000000000000000000000000000000000..1577000156a9e08b0fdac5a15083fefdd5652b4b GIT binary patch literal 7190 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step6.png b/ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..6437d3d639aacceff388bcdc6f52b9cd58bafc94 GIT binary patch literal 8724 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�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 So*DViQ%zZ0sX_t%?!N$RMx1E? literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step7.png b/ru/docs/chapter_sorting/bubble_sort.assets/bubble_operation_step7.png new file mode 100644 index 0000000000000000000000000000000000000000..e1aa85a1d3648ecff0c3cf00c335a7db909259e9 GIT binary patch literal 9418 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/bubble_sort.assets/bubble_sort_overview.png b/ru/docs/chapter_sorting/bubble_sort.assets/bubble_sort_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..0041701fbc8d4bf904c9db19d4a100e4f32a77a5 GIT binary patch literal 23343 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 W4nYwGL@9vte>F(*P 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Сортировка пузырьком (bubble sort) сортирует массив за счет непрерывного сравнения и обмена соседних элементов. Этот процесс напоминает всплытие пузырьков снизу вверх, откуда и произошло название алгоритма. + +Как показано на рисунке ниже, процесс "всплытия" можно смоделировать через операцию обмена элементов: начиная от левого края массива и двигаясь вправо, мы последовательно сравниваем соседние элементы и, если "левый элемент > правый элемент", меняем их местами. После завершения прохода максимальный элемент будет перемещен в самый правый конец массива. + +=== "<1>" + ![Моделирование пузырька через обмен элементов](bubble_sort.assets/bubble_operation_step1.png) + +=== "<2>" + ![bubble_operation_step2](bubble_sort.assets/bubble_operation_step2.png) + +=== "<3>" + ![bubble_operation_step3](bubble_sort.assets/bubble_operation_step3.png) + +=== "<4>" + ![bubble_operation_step4](bubble_sort.assets/bubble_operation_step4.png) + +=== "<5>" + ![bubble_operation_step5](bubble_sort.assets/bubble_operation_step5.png) + +=== "<6>" + ![bubble_operation_step6](bubble_sort.assets/bubble_operation_step6.png) + +=== "<7>" + ![bubble_operation_step7](bubble_sort.assets/bubble_operation_step7.png) + +## Алгоритм + +Пусть длина массива равна $n$ ; тогда шаги сортировки пузырьком показаны на рисунке ниже. + +1. Сначала выполнить один проход "всплытия" по $n$ элементам, **переместив максимальный элемент массива на правильную позицию**. +2. Затем выполнить "всплытие" по оставшимся $n - 1$ элементам, **переместив второй по величине элемент на правильную позицию**. +3. Продолжать по аналогии; после $n - 1$ раундов "всплытия" **первые $n - 1$ по величине элементы окажутся на правильных позициях**. +4. Оставшийся единственный элемент обязательно является минимальным, сортировать его уже не нужно, поэтому сортировка завершена. + +![Процесс сортировки пузырьком](bubble_sort.assets/bubble_sort_overview.png) + +Пример кода: + +```src +[file]{bubble_sort}-[class]{}-[func]{bubble_sort} +``` + +## Оптимизация эффективности + +Мы замечаем, что если в каком-либо раунде "всплытия" не произошло ни одного обмена, значит, массив уже отсортирован и можно сразу вернуть результат. Поэтому можно добавить флаг `flag` для отслеживания этой ситуации и немедленного выхода. + +После такой оптимизации худшая и средняя временные сложности сортировки пузырьком по-прежнему равны $O(n^2)$ ; однако если входной массив уже полностью упорядочен, достигается лучшая временная сложность $O(n)$ . + +```src +[file]{bubble_sort}-[class]{}-[func]{bubble_sort_with_flag} +``` + +## Характеристики алгоритма + +- **Временная сложность равна $O(n^2)$, алгоритм адаптивен**: длины диапазонов, проходящих "всплытие" в разных раундах, последовательно равны $n - 1$, $n - 2$, $\dots$, $2$, $1$ , а их сумма равна $(n - 1) n / 2$ . После добавления оптимизации с `flag` лучшая временная сложность может достигать $O(n)$ . +- **Пространственная сложность равна $O(1)$, сортировка выполняется на месте**: указатели $i$ и $j$ используют константный объем дополнительной памяти. +- **Стабильная сортировка**: поскольку при "всплытии" равные элементы не обмениваются местами. diff --git a/ru/docs/chapter_sorting/bucket_sort.assets/bucket_sort_overview.png b/ru/docs/chapter_sorting/bucket_sort.assets/bucket_sort_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..202eda7aa3392bb2aa17f280f8b70f3bae8bfc31 GIT binary patch literal 33824 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Блочная сортировка (bucket sort)
      является типичным применением стратегии "разделяй и властвуй". Она задает несколько упорядоченных по диапазонам блоков, каждый блок соответствует некоторому диапазону значений; затем данные равномерно распределяются по блокам, внутри каждого блока выполняется сортировка, а в конце результаты блоков объединяются по порядку. + +## Алгоритм + +Рассмотрим массив длины $n$, элементы которого являются числами с плавающей запятой из диапазона $[0, 1)$ . Процесс блочной сортировки показан на рисунке ниже. + +1. Инициализировать $k$ блоков и распределить $n$ элементов по этим $k$ блокам. +2. Отсортировать каждый блок по отдельности (здесь используется встроенная функция сортировки языка программирования). +3. Объединить результаты в порядке следования блоков от меньшего к большему. + +![Процесс блочной сортировки](bucket_sort.assets/bucket_sort_overview.png) + +Код приведен ниже: + +```src +[file]{bucket_sort}-[class]{}-[func]{bucket_sort} +``` + +## Характеристики алгоритма + +Блочная сортировка подходит для обработки очень больших объемов данных. Например, если вход содержит 1 миллион элементов и из-за ограничений памяти система не может загрузить их все сразу, можно разбить данные на 1000 блоков, отсортировать каждый блок отдельно, а затем объединить результаты. + +- **Временная сложность равна $O(n + k)$** : если элементы распределены по блокам равномерно, то в каждом блоке будет $\frac{n}{k}$ элементов. Если сортировка одного блока требует $O(\frac{n}{k} \log\frac{n}{k})$ времени, то сортировка всех блоков потребует $O(n \log\frac{n}{k})$ времени. **Когда число блоков $k$ достаточно велико, временная сложность приближается к $O(n)$** . На объединение результатов требуется $O(n + k)$ времени, потому что нужно пройти по всем блокам и элементам. В худшем случае все данные попадут в один блок, и если сортировка этого блока использует $O(n^2)$ времени, общая сложность также станет $O(n^2)$ . +- **Пространственная сложность равна $O(n + k)$, сортировка не выполняется на месте**: требуются дополнительные блоки в количестве $k$ и место для всех $n$ элементов внутри них. +- Является ли блочная сортировка стабильной, зависит от того, стабилен ли алгоритм сортировки внутри каждого блока. + +## Как добиться равномерного распределения + +Теоретически временная сложность блочной сортировки может достигать $O(n)$ ; **ключ к этому - как можно более равномерно распределить элементы по блокам**. На практике данные часто распределены неравномерно. Например, если нужно распределить все товары на Taobao по 10 блокам цен, количество товаров дешевле 100 юаней может быть очень большим, а товаров дороже 1000 юаней - очень маленьким. Если просто разбить диапазон цен на 10 равных частей, число товаров в каждом блоке будет сильно различаться. + +Чтобы добиться более равномерного распределения, можно сначала задать грубую линию раздела и приблизительно распределить данные по 3 блокам. **После этого блоки с большим числом товаров можно снова делить на 3 блока и продолжать процесс до тех пор, пока число элементов в каждом блоке не станет примерно одинаковым**. + +Как показано на рисунке ниже, по сути этот метод строит рекурсивное дерево, цель которого - сделать значения в листьях как можно более равномерными. Конечно, совсем не обязательно каждый раз делить данные именно на 3 блока; конкретную схему разбиения можно выбирать в зависимости от свойств данных. + +![Рекурсивное разбиение по блокам](bucket_sort.assets/scatter_in_buckets_recursively.png) + +Если нам заранее известна вероятностная модель распределения цен товаров, **то границы каждого блока можно задавать в соответствии с этим распределением**. Важно отметить, что фактическое распределение данных не обязательно специально измерять - его можно приблизить некоторой вероятностной моделью исходя из свойств данных. + +Как показано на рисунке ниже, если предположить, что цены товаров подчиняются нормальному распределению, то можно разумно задать интервалы цен и тем самым распределить товары по блокам достаточно равномерно. + +![Разбиение блоков по вероятностному распределению](bucket_sort.assets/scatter_in_buckets_distribution.png) diff --git a/ru/docs/chapter_sorting/counting_sort.assets/counting_sort_overview.png b/ru/docs/chapter_sorting/counting_sort.assets/counting_sort_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..4257881e4d5a700c848bcc1f7174007a754a0a08 GIT binary patch literal 21062 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 VR-VpK+x|zPqNt(pMb0Yh{{TGc>m2|9 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step11.png b/ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step11.png new file mode 100644 index 0000000000000000000000000000000000000000..9bf3f29260690db070a07cfc66d64ddd0099ea69 GIT binary patch literal 14664 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 P-zW0YDj#YjO@sdz-@6Au literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step12.png b/ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step12.png new file mode 100644 index 0000000000000000000000000000000000000000..6b6e134f29f1a525d34e5990bc70186ca8cf00da GIT binary patch literal 14821 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 HA%p)9RcFx0 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step2.png b/ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..55690c269c8c28396a5f41abe4dbcc6b279f23e0 GIT binary patch literal 15287 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%0DGrhFX1)&tIZ-W&C3kX>|J>9(5^MiSkS;Ro@ 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 N?`4#vt0YYV{}+3igTVj* literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step5.png b/ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step5.png new file mode 100644 index 0000000000000000000000000000000000000000..ac0e1a1c1a2d89e124dbdd700da507150a28a002 GIT binary patch literal 16627 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 B5aIv; literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step6.png b/ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..95bcfa3b6cbc7736e7f75b06af319d107c987cac GIT binary patch literal 13649 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/heap_sort.md b/ru/docs/chapter_sorting/heap_sort.md new file mode 100644 index 000000000..b7434acee --- /dev/null +++ b/ru/docs/chapter_sorting/heap_sort.md @@ -0,0 +1,73 @@ +# Пирамидальная сортировка + +!!! tip + + Перед чтением этого раздела убедитесь, что вы уже изучили главу "Куча". + +Пирамидальная сортировка (heap sort) - это эффективный алгоритм сортировки, основанный на структуре данных "куча". Для его реализации можно использовать уже изученные нами "построение кучи" и "извлечение элементов из кучи". + +1. Подать на вход массив и построить из него мин-кучу; в этот момент минимальный элемент будет находиться в вершине кучи. +2. Непрерывно выполнять извлечение из кучи и по порядку записывать извлеченные элементы - так получится последовательность, отсортированная по возрастанию. + +Хотя этот метод работоспособен, он требует дополнительного массива для хранения извлеченных элементов и потому расходует лишнюю память. На практике обычно используют более изящную реализацию. + +## Алгоритм + +Пусть длина массива равна $n$ ; тогда процесс пирамидальной сортировки показан на рисунке ниже. + +1. Подать на вход массив и построить из него макс-кучу. После этого максимальный элемент окажется в вершине кучи. +2. Обменять элемент в вершине кучи (первый элемент) с элементом внизу кучи (последний элемент). После обмена длина кучи уменьшается на $1$ , а число уже отсортированных элементов увеличивается на $1$ . +3. Начиная с вершины, выполнить просеивание вниз (sift down) сверху вниз. После этого свойство кучи будет восстановлено. +4. Циклически повторять шаг `2.` и шаг `3.` . После $n - 1$ раундов массив будет полностью отсортирован. + +!!! tip + + На самом деле операция извлечения из кучи тоже включает шаг `2.` и шаг `3.` , только дополнительно содержит действие по удалению элемента. + +=== "<1>" + ![Шаги пирамидальной сортировки](heap_sort.assets/heap_sort_step1.png) + +=== "<2>" + ![heap_sort_step2](heap_sort.assets/heap_sort_step2.png) + +=== "<3>" + ![heap_sort_step3](heap_sort.assets/heap_sort_step3.png) + +=== "<4>" + ![heap_sort_step4](heap_sort.assets/heap_sort_step4.png) + +=== "<5>" + ![heap_sort_step5](heap_sort.assets/heap_sort_step5.png) + +=== "<6>" + ![heap_sort_step6](heap_sort.assets/heap_sort_step6.png) + +=== "<7>" + ![heap_sort_step7](heap_sort.assets/heap_sort_step7.png) + +=== "<8>" + ![heap_sort_step8](heap_sort.assets/heap_sort_step8.png) + +=== "<9>" + ![heap_sort_step9](heap_sort.assets/heap_sort_step9.png) + +=== "<10>" + ![heap_sort_step10](heap_sort.assets/heap_sort_step10.png) + +=== "<11>" + ![heap_sort_step11](heap_sort.assets/heap_sort_step11.png) + +=== "<12>" + ![heap_sort_step12](heap_sort.assets/heap_sort_step12.png) + +В реализации кода используется та же функция просеивания сверху вниз `sift_down()`, что и в главе "Куча". Важно помнить, что длина кучи уменьшается по мере извлечения максимального элемента, поэтому функции `sift_down()` нужно передавать параметр длины $n$ , чтобы указать текущую эффективную длину кучи. Код приведен ниже: + +```src +[file]{heap_sort}-[class]{}-[func]{heap_sort} +``` + +## Характеристики алгоритма + +- **Временная сложность равна $O(n \log n)$, алгоритм не является адаптивным**: построение кучи занимает $O(n)$ времени. Извлечение максимального элемента из кучи имеет временную сложность $O(\log n)$ и выполняется $n - 1$ раз. +- **Пространственная сложность равна $O(1)$, сортировка выполняется на месте**: несколько переменных-указателей используют $O(1)$ памяти. Обмен элементов и операции просеивания выполняются прямо в исходном массиве. +- **Нестабильная сортировка**: при обмене вершины кучи и нижнего элемента относительный порядок равных элементов может измениться. diff --git a/ru/docs/chapter_sorting/index.md b/ru/docs/chapter_sorting/index.md new file mode 100644 index 000000000..9db36262e --- /dev/null +++ b/ru/docs/chapter_sorting/index.md @@ -0,0 +1,9 @@ +# Сортировка + +![Сортировка](../assets/covers/chapter_sorting.jpg) + +!!! abstract + + Сортировка упорядочивает хаотичные данные и позволяет быстрее находить закономерности. + + За кажущейся простотой скрывается целая группа алгоритмов с разными достоинствами и ограничениями. diff --git a/ru/docs/chapter_sorting/insertion_sort.assets/insertion_operation.png b/ru/docs/chapter_sorting/insertion_sort.assets/insertion_operation.png new file mode 100644 index 0000000000000000000000000000000000000000..f3337a49a310c40e1c24197ae081ee89963b7d0e GIT binary patch literal 20131 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 Z@A#m3R~Omk5&?k9o}C^$7~4r_{{npvt(O1* literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/insertion_sort.assets/insertion_sort_overview.png b/ru/docs/chapter_sorting/insertion_sort.assets/insertion_sort_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..c0e3b7c8c8ae41ccc596b7ab81a80d42b01afd37 GIT binary patch literal 19612 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Сортировка вставками (insertion sort) - это простой алгоритм сортировки, принцип которого очень похож на ручное упорядочивание колоды карт. + +Точнее говоря, в неотсортированном диапазоне выбирается опорный элемент, после чего он поочередно сравнивается с элементами слева в уже отсортированном диапазоне и вставляется в правильную позицию. + +На рисунке ниже показан процесс вставки элемента в массив. Пусть опорный элемент обозначен как `base` ; нам нужно сдвинуть все элементы от целевого индекса до `base` на одну позицию вправо, а затем присвоить `base` значение в целевом индексе. + +![Одна операция вставки](insertion_sort.assets/insertion_operation.png) + +## Алгоритм + +Общий процесс сортировки вставками показан на рисунке ниже. + +1. В начальном состоянии отсортирован только первый элемент массива. +2. Выбрать второй элемент массива как `base` ; после вставки в правильную позицию **первые 2 элемента массива окажутся отсортированными**. +3. Выбрать третий элемент как `base` ; после вставки в правильную позицию **первые 3 элемента массива окажутся отсортированными**. +4. Продолжать по аналогии; в последнем раунде в качестве `base` берется последний элемент, и после его вставки **все элементы массива будут отсортированы**. + +![Процесс сортировки вставками](insertion_sort.assets/insertion_sort_overview.png) + +Пример кода: + +```src +[file]{insertion_sort}-[class]{}-[func]{insertion_sort} +``` + +## Характеристики алгоритма + +- **Временная сложность равна $O(n^2)$, алгоритм адаптивен**: в худшем случае каждой операции вставки требуется соответственно $n - 1$, $n-2$, $\dots$, $2$, $1$ итераций, а их сумма равна $(n - 1) n / 2$ , поэтому временная сложность равна $O(n^2)$ . Если входные данные уже упорядочены, операция вставки завершается раньше. Когда входной массив полностью отсортирован, сортировка вставками достигает лучшей временной сложности $O(n)$ . +- **Пространственная сложность равна $O(1)$, сортировка выполняется на месте**: указатели $i$ и $j$ используют константный объем дополнительной памяти. +- **Стабильная сортировка**: в процессе вставки элементы помещаются справа от равных им элементов, поэтому их относительный порядок не меняется. + +## Преимущества сортировки вставками + +Временная сложность сортировки вставками равна $O(n^2)$ , а у быстрой сортировки, которую мы скоро изучим, временная сложность равна $O(n \log n)$ . Несмотря на более высокую асимптотическую сложность, **на малых объемах данных сортировка вставками обычно работает быстрее**. + +Этот вывод похож на сравнение линейного и двоичного поиска. Алгоритмы уровня $O(n \log n)$ , такие как быстрая сортировка, относятся к алгоритмам на основе стратегии "разделяй и властвуй" и обычно включают больше элементарных вычислений. Когда объем данных мал, значения $n^2$ и $n \log n$ близки друг к другу, поэтому асимптотика не доминирует, а решающим становится число элементарных операций в каждом раунде. + +На практике встроенные функции сортировки во многих языках программирования (например, в Java) используют сортировку вставками. Общая идея такова: для длинных массивов применять алгоритмы сортировки на основе стратегии "разделяй и властвуй", например быструю сортировку; для коротких массивов сразу использовать сортировку вставками. + +Хотя сортировка пузырьком, выбором и вставками имеют одинаковую временную сложность $O(n^2)$ , в реальных задачах **сортировка вставками используется заметно чаще, чем сортировка пузырьком и сортировка выбором**. Основные причины таковы. + +- Сортировка пузырьком основана на обмене элементов, для чего нужна временная переменная и суммарно выполняются 3 элементарные операции; сортировка вставками основана на присваивании элементов и требует всего 1 элементарной операции. Поэтому **вычислительные затраты сортировки пузырьком обычно выше, чем у сортировки вставками**. +- Временная сложность сортировки выбором в любом случае равна $O(n^2)$ . **Если входные данные уже частично упорядочены, сортировка вставками обычно эффективнее сортировки выбором**. +- Сортировка выбором нестабильна, поэтому ее нельзя использовать для многоуровневой сортировки. diff --git a/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_overview.png b/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..748486e8d3254cccae1576f5e14752b1434bb36b GIT binary patch literal 20301 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step10.png b/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step10.png new file mode 100644 index 0000000000000000000000000000000000000000..1737047ef8dae7ead4f7a4e222a779596423becc GIT binary patch literal 11724 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 T@y@sx-HXUet4NhdngstZ&d%fZ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step2.png b/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef0f87363dbc76111f3520cebdce1f32a7e4be6 GIT binary patch literal 6566 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 V5CN)u-!=ZIXx-4ip08#T@=rAvbm9O2 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step3.png b/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..fc17e8d341e80f48494960b6c11981a5917d40b9 GIT binary patch literal 7021 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 OkeZ6Na`7!}$bSG0#hr2h literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step5.png b/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step5.png new file mode 100644 index 0000000000000000000000000000000000000000..21743d9b5382c9f64ee631226e43031aa2e771a2 GIT binary patch literal 8249 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

      FgdlwIXEK@ zRrO-wmG^oQ;x|<6I~2OUel~IL!2I0>92&S4FY77lo)g|4&&>9AB-b-r-9oi~0*u5Xwu@UjbUpLOLLC0SFVvckH#cpVW zaN*~18a6Q?0$XD-_lvaf5qPQ4$+FwBu_ zA+c2MauRh-WbW0pxRC3pNB-{wGCJP`)j_>K9LUYS(krf5L*uMSW$*@)m|TMud>=(D zNFl7EIK&26sblVoqkwW;pQN5!@_33Xu?%k^;qs}zL>ZiA`!YREPx1Widk27ZMe zy?GNiP1-ih!n;&lJ9;P)^`u)o8ejj0tIsvlb#*$jjH|$Fa{?b}PyTCyB|H@}v+35@ zL9^U+Fw}K?3u}B-(GCc&@aL5+qtIlLm~Mxa6edA9U3im1Tx2(`f1#<# z(8jy_^?cy(v!j{aU$Tciqr@TpTgfII_OxOp@yYvV<~k%YzKuuJIe-fODaY7(LeqLz zf&Z3kC?xkVpXcNxos7vhkLSi^WR29{p6|apzkj>Be_PflLgN}Fe3(NB&0m7{zc=__ zn*F!){Ey4|efcSFO@u&7O$1s)<%@Lw{ux1%?i6E&v_+F_a33>RQ^teE@ojK<6#9iKGa3hBwaZy zqy7?3pqj_H<_|qGBm&~=fBo;d&j0c77D+R76LyH5PNW#pVNq#BYj|I2ytHG_RxXew zeTRbN&FaAG>x&v*l*1se!h^fu=A&Qw5WXxF}eZF?3DKK46Y2eSeF+)S1KYJ|)2Q4{^6BFv&F(8nx0x}KCja&um7(EA z$;+cUr5kRcnG15AZ-e!@nJ;y_3ABiI&%S+8-;Ji)Y=et9=Lpjwr>I2kyq;3u?fXeP zTz$LmFCA9=zTR_=FSCyuO&uk^0w>?R)KTv_a9SQbZzzW?vnYlJNqh{*9ye}fKt{B| z+U3vmJ0TTYoBYN%Ys>9y_JJLbha)3Fx}YNuCQo6Bg~8!z&vezUB03oRH3UlvRqZdw zc^pZVhb&y(oUL^3+COQc3!7+s5aWu$%V7uNawsOS=SzAq<-G(lM7x0thK+tkA;Jyi zIP2eMp<7YD-DoOcXw1#>VBsQ$2(X#CdB>ypa-bd`yCgNLR@#K zHW|Ws-kOy0v+4J~C6bnX2vI6MjwAu}CH}th7EhDdnPp2qbXc2x63qs9rOL7??4ihgJcY0GVL-#)0MSmnc8A8s@N#lj{28Nc;n-)F zZh3VuCLfoKje1#~O=`Ute>7MvkMB#DU;X}8)8np^>r>fZg%^g6l{6I{bEHk7KYt4I zE~Hx3f4iT!{q6hbR2^A?>WXRY(5;mG9`)@r(hIJ!8scwJ`NaR1UBs{80y4B*SzhJN QQu5bCOHEI;N(CMEZ&p8T?f?J) literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step6.png b/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..8e88eaaac935e885abbcf93e99c6a8cb72d4e772 GIT binary patch literal 8645 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step7.png b/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step7.png new file mode 100644 index 0000000000000000000000000000000000000000..496fbf8047fb9a86a00d91e3978a48b34ad571d2 GIT binary patch literal 8872 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step8.png b/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step8.png new file mode 100644 index 0000000000000000000000000000000000000000..9f4be45c499ede55733cd56a38723a052aa8a570 GIT binary patch literal 9502 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 KrBtneiufPm(uKSL literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step9.png b/ru/docs/chapter_sorting/merge_sort.assets/merge_sort_step9.png new file mode 100644 index 0000000000000000000000000000000000000000..33588ab877d0875b70a94b95debc1c1ba9d1af3c GIT binary patch literal 9760 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/merge_sort.md b/ru/docs/chapter_sorting/merge_sort.md new file mode 100644 index 000000000..65b11d5ac --- /dev/null +++ b/ru/docs/chapter_sorting/merge_sort.md @@ -0,0 +1,73 @@ +# Сортировка слиянием + +Сортировка слиянием (merge sort) - это алгоритм сортировки на основе стратегии "разделяй и властвуй", который включает этапы "разделения" и "слияния", показанные на рисунке ниже. + +1. **Этап разделения**: массив рекурсивно разбивается от середины, и задача сортировки длинного массива превращается в задачи сортировки более коротких массивов. +2. **Этап слияния**: когда длина подмассива становится равной 1, разделение завершается и начинается слияние; левые и правые короткие упорядоченные массивы непрерывно объединяются в более длинный упорядоченный массив, пока процесс не завершится. + +![Этапы разделения и слияния в сортировке слиянием](merge_sort.assets/merge_sort_overview.png) + +## Алгоритм + +Как показано на рисунке ниже, на этапе "разделения" массив рекурсивно разбивается сверху вниз по середине на два подмассива. + +1. Вычислить середину массива `mid` и рекурсивно разделить левый подмассив (интервал `[left, mid]` ) и правый подмассив (интервал `[mid + 1, right]` ). +2. Рекурсивно повторять шаг `1.` , пока длина подмассива не станет равной 1. + +Этап "слияния" снизу вверх объединяет левый и правый подмассивы в один упорядоченный массив. Следует заметить, что начиная с подмассивов длины 1, каждый подмассив в фазе слияния уже является упорядоченным. + +=== "<1>" + ![Шаги сортировки слиянием](merge_sort.assets/merge_sort_step1.png) + +=== "<2>" + ![merge_sort_step2](merge_sort.assets/merge_sort_step2.png) + +=== "<3>" + ![merge_sort_step3](merge_sort.assets/merge_sort_step3.png) + +=== "<4>" + ![merge_sort_step4](merge_sort.assets/merge_sort_step4.png) + +=== "<5>" + ![merge_sort_step5](merge_sort.assets/merge_sort_step5.png) + +=== "<6>" + ![merge_sort_step6](merge_sort.assets/merge_sort_step6.png) + +=== "<7>" + ![merge_sort_step7](merge_sort.assets/merge_sort_step7.png) + +=== "<8>" + ![merge_sort_step8](merge_sort.assets/merge_sort_step8.png) + +=== "<9>" + ![merge_sort_step9](merge_sort.assets/merge_sort_step9.png) + +=== "<10>" + ![merge_sort_step10](merge_sort.assets/merge_sort_step10.png) + +Нетрудно заметить, что порядок рекурсии в сортировке слиянием совпадает с порядком рекурсии при постфиксном обходе бинарного дерева. + +- **Постфиксный обход**: сначала рекурсивно обходится левое поддерево, затем правое поддерево, а в конце обрабатывается корневой узел. +- **Сортировка слиянием**: сначала рекурсивно обрабатывается левый подмассив, затем правый подмассив, а в конце выполняется слияние. + +Реализация сортировки слиянием показана в коде ниже. Обратите внимание: в `nums` объединяемый интервал равен `[left, right]` , а соответствующий интервал в `tmp` равен `[0, right - left]` . + +```src +[file]{merge_sort}-[class]{}-[func]{merge_sort} +``` + +## Характеристики алгоритма + +- **Временная сложность равна $O(n \log n)$, алгоритм не является адаптивным**: этап разделения создает дерево рекурсии высоты $\log n$ , а суммарное число операций слияния на каждом уровне равно $n$ , поэтому общая временная сложность составляет $O(n \log n)$ . +- **Пространственная сложность равна $O(n)$, сортировка не выполняется на месте**: глубина рекурсии равна $\log n$ , из-за чего требуется $O(\log n)$ памяти под стек вызовов. Для этапа слияния нужен вспомогательный массив, поэтому дополнительно используется $O(n)$ памяти. +- **Стабильная сортировка**: в процессе слияния относительный порядок равных элементов не меняется. + +## Сортировка связного списка + +Для связных списков сортировка слиянием имеет заметное преимущество перед другими алгоритмами сортировки: **пространственную сложность задачи сортировки списка можно оптимизировать до $O(1)$**. + +- **Этап разделения**: работу по разбиению списка можно реализовать с помощью "итерации" вместо "рекурсии", тем самым устранив расход памяти на стек вызовов. +- **Этап слияния**: в связном списке добавление и удаление узлов требует только изменения ссылок (указателей), поэтому при слиянии двух коротких упорядоченных списков в один длинный упорядоченный список не нужно создавать дополнительный список. + +Детали реализации достаточно сложны; заинтересованные читатели могут изучить соответствующие материалы самостоятельно. diff --git a/ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step1.png b/ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..fe106fcde4c6f273071163d8410d356069d43662 GIT binary patch literal 25182 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 Or>vmyxLnROQzhUUII_g7Yy^Ghn3ZnGz6 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 RV;=(ssHtcxS1Q_s{V(9FKzRTF literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step4.png b/ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..28d829ef7fccca357798da5be5f4f28a816ee693 GIT binary patch literal 25689 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step5.png b/ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step5.png new file mode 100644 index 0000000000000000000000000000000000000000..b6e206d4f7e6deb16d0b85dbc9a984401e1117b9 GIT binary patch literal 24960 zcmbrmby!tVv@be$&@EDuqS7GUu|c|1q*0WT?q(qf3J54ECDKSrNW)e{IwX}=T3Wi_ z#&gd5nh2CvVOW%%ni~;RzntmkFf-253l$`wAJ+$_V)HJ zFE3|iW}Y>K933A!d56g6uO*4WUqr>Wcl8gAj3=dKe<-hRX!$yLhwsmyRi@kQ`frW5 zx3_;UEKW984(BCTd1!u#_YQgt#^B&zti%u-E>IA>eSenp#^0~kF30M`2D#r zQ(tnrvkCa@%ib*C*8VD>8{!iENi<=&M9J(808BtdURK{{Vm-siJ%^W4vHZFE+fufi zWc5+WT>Q+l%iuYtugs{&t~M_a%X`16*EcKa-USRLhM5AO899gq5P$(vCX7#z00jYn zONy}_4wz6Ft8xD?A6{rc90SgG!O$`AUiZAcDD4GmQgA?SscXw!zT4R8I}0pX zVJ!7Q-282{IN%hwf=zs*NfTRN9tD1=Kq5A+$+8&j*4fd9-H`FD&pfacfprr+LCHd( zA{ZW!2wnh~tfU#D` zR%}8z?8ps1^*4dzFINx2uD}jYmy+(aITD?wL&@-r>l*&77enrxRvgBpq?V|A8}ImA zr)L^weHUYrzp?rHc??W?Hw;F@E-Jw6Y}6M1_ILYuN@N4N_-wq0EiEjuk^DgUWN*b> zn2O0@?%g#@x(<@3=pfei-(<1zG*6CvU4^>4cFyYb#^+>#hQ&w8krypdm95ak$ zQ{j-#3Bc76cokaDr|a*BO)R#0dzZgx?D)oQ`jVud8~r>qy{4flIk_$5L#>6ybsB6u zdes4YIuY_Cs(2om30xzdX}0+`YD9n>motp7FXYfbl3^ z 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step6.png b/ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..d8855e6d6117ee51db449b8c725beb5cff52da22 GIT binary patch literal 25341 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step8.png b/ru/docs/chapter_sorting/quick_sort.assets/pivot_division_step8.png new file mode 100644 index 0000000000000000000000000000000000000000..70065c795f544ba67a39f4bf11faa620de72c4de GIT binary patch literal 25432 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 xbKLfxup@_@gyYN+ZytW>s*_!r004$1%k literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/quick_sort.assets/quick_sort_overview.png b/ru/docs/chapter_sorting/quick_sort.assets/quick_sort_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..66f1a5dec57510a6be94acd5dcc963394785fbbe GIT binary patch literal 19173 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/quick_sort.md b/ru/docs/chapter_sorting/quick_sort.md new file mode 100644 index 000000000..401f98139 --- /dev/null +++ b/ru/docs/chapter_sorting/quick_sort.md @@ -0,0 +1,100 @@ +# Быстрая сортировка + +Быстрая сортировка (quick sort) - это алгоритм сортировки, основанный на стратегии "разделяй и властвуй"; он работает эффективно и применяется очень широко. + +Ключевая операция быстрой сортировки - это "разделение с опорным элементом". Ее цель такова: выбрать некоторый элемент массива в качестве "опорного" и переместить все элементы меньше опорного влево от него, а все элементы больше опорного - вправо. Конкретный процесс показан на рисунке ниже. + +1. Выбрать самый левый элемент массива как опорный и инициализировать два указателя `i` и `j` , направленные на левую и правую границы массива. +2. Запустить цикл, в котором `i` и `j` ищут соответственно первый элемент, больший опорного, и первый элемент, меньший опорного, после чего эти два элемента меняются местами. +3. Повторять шаг `2.` , пока указатели `i` и `j` не встретятся, а затем обменять опорный элемент с элементом на границе двух подмассивов. + +=== "<1>" + ![Шаги разделения с опорным элементом](quick_sort.assets/pivot_division_step1.png) + +=== "<2>" + ![pivot_division_step2](quick_sort.assets/pivot_division_step2.png) + +=== "<3>" + ![pivot_division_step3](quick_sort.assets/pivot_division_step3.png) + +=== "<4>" + ![pivot_division_step4](quick_sort.assets/pivot_division_step4.png) + +=== "<5>" + ![pivot_division_step5](quick_sort.assets/pivot_division_step5.png) + +=== "<6>" + ![pivot_division_step6](quick_sort.assets/pivot_division_step6.png) + +=== "<7>" + ![pivot_division_step7](quick_sort.assets/pivot_division_step7.png) + +=== "<8>" + ![pivot_division_step8](quick_sort.assets/pivot_division_step8.png) + +=== "<9>" + ![pivot_division_step9](quick_sort.assets/pivot_division_step9.png) + +После завершения разделения исходный массив разбивается на три части: левый подмассив, опорный элемент и правый подмассив; при этом выполняется условие "любой элемент левого подмассива $\leq$ опорный элемент $\leq$ любой элемент правого подмассива". Следовательно, далее нам нужно лишь отсортировать эти два подмассива. + +!!! note "Стратегия divide and conquer в быстрой сортировке" + + По сути, разделение с опорным элементом сводит задачу сортировки длинного массива к двум задачам сортировки более коротких массивов. + +```src +[file]{quick_sort}-[class]{quick_sort}-[func]{partition} +``` + +## Алгоритм + +Общий процесс быстрой сортировки показан на рисунке ниже. + +1. Сначала выполнить "разделение с опорным элементом" для исходного массива и получить неотсортированные левый и правый подмассивы. +2. Затем рекурсивно выполнить "разделение с опорным элементом" для левого и правого подмассивов. +3. Продолжать рекурсию до тех пор, пока длина подмассива не станет равной 1; после этого сортировка всего массива будет завершена. + +![Процесс быстрой сортировки](quick_sort.assets/quick_sort_overview.png) + +```src +[file]{quick_sort}-[class]{quick_sort}-[func]{quick_sort} +``` + +## Характеристики алгоритма + +- **Временная сложность равна $O(n \log n)$, алгоритм не является адаптивным**: в среднем глубина рекурсии при разделении равна $\log n$ , а суммарное число циклов на каждом уровне равно $n$ , поэтому общая сложность составляет $O(n \log n)$ . В худшем случае каждое разделение делит массив длины $n$ на подмассивы длины $0$ и $n - 1$ ; тогда глубина рекурсии достигает $n$ , на каждом уровне выполняется $n$ операций, и общая временная сложность вырождается в $O(n^2)$ . +- **Пространственная сложность равна $O(n)$, сортировка выполняется на месте**: если входной массив полностью отсортирован в обратном порядке, глубина рекурсии достигает худшего случая $n$ , что требует $O(n)$ памяти под стек вызовов. При этом сама сортировка выполняется в исходном массиве без дополнительного массива. +- **Нестабильная сортировка**: на последнем шаге разделения опорный элемент может быть обменян вправо от равного ему элемента. + +## Почему быстрая сортировка быстрая + +Уже по названию понятно, что быстрая сортировка должна иметь преимущества по эффективности. Хотя ее средняя временная сложность совпадает со сложностью "сортировки слиянием" и "пирамидальной сортировки", на практике быстрая сортировка обычно работает быстрее. Основные причины таковы. + +- **Вероятность худшего случая очень мала**: хотя худшая временная сложность быстрой сортировки равна $O(n^2)$ и она не так стабильна, как сортировка слиянием, в подавляющем большинстве случаев она работает за $O(n \log n)$ . +- **Высокая эффективность использования кэша**: при выполнении разделения система может загрузить весь подмассив в кэш, поэтому доступ к элементам оказывается быстрым. Алгоритмы вроде "пирамидальной сортировки" требуют скачкообразного доступа к элементам и таким свойством не обладают. +- **Небольшой константный множитель в сложности**: среди трех перечисленных алгоритмов у быстрой сортировки обычно меньше всего сравнений, присваиваний и обменов. Это похоже на причину, по которой "сортировка вставками" часто быстрее "сортировки пузырьком". + +## Оптимизация выбора опорного элемента + +**На некоторых входных данных временная эффективность быстрой сортировки может ухудшаться**. Рассмотрим крайний случай: входной массив полностью отсортирован в обратном порядке. Поскольку в качестве опорного мы выбираем самый левый элемент, после разделения он будет обменян в самый правый конец массива, из-за чего длина левого подмассива станет $n - 1$ , а длина правого - $0$ . Если рекурсия будет продолжаться таким образом, то после каждого разделения один из подмассивов будет иметь длину $0$ , стратегия divide and conquer потеряет смысл, а быстрая сортировка выродится в нечто близкое к "сортировке пузырьком". + +Чтобы по возможности избежать такого сценария, **мы можем улучшить стратегию выбора опорного элемента в процедуре разделения**. Например, можно выбирать случайный элемент массива как опорный. Однако если не повезет и каждый раз будет выбираться неудачный опорный элемент, производительность все равно останется неудовлетворительной. + +Нужно учитывать, что языки программирования обычно генерируют "псевдослучайные числа". Если специально построить тестовый пример под такую последовательность, эффективность быстрой сортировки все равно может деградировать. + +Чтобы улучшить ситуацию, можно взять три кандидата (обычно первый, последний и средний элементы массива) и **использовать медиану этих трех значений как опорный элемент**. Благодаря этому вероятность того, что опорный элемент окажется "не слишком маленьким и не слишком большим", заметно возрастает. Конечно, можно брать и большее число кандидатов, чтобы еще сильнее повысить устойчивость алгоритма. После этого вероятность деградации временной сложности до $O(n^2)$ существенно уменьшается. + +Пример кода: + +```src +[file]{quick_sort}-[class]{quick_sort_median}-[func]{partition} +``` + +## Оптимизация глубины рекурсии + +**На некоторых входных данных быстрая сортировка может занимать слишком много памяти**. Рассмотрим полностью отсортированный входной массив. Пусть длина текущего подмассива в рекурсии равна $m$ ; тогда после каждого разделения будут получаться левый подмассив длины $0$ и правый подмассив длины $m - 1$ . Это означает, что на каждом уровне размер задачи уменьшается совсем немного (лишь на один элемент), а высота дерева рекурсии достигает $n - 1$ , поэтому требуется $O(n)$ памяти под стек вызовов. + +Чтобы избежать накопления стековых кадров, после каждого разделения можно сравнивать длины двух подмассивов и **рекурсивно обрабатывать только более короткий из них**. Поскольку длина короткого подмассива не превысит $n / 2$ , такой подход гарантирует, что глубина рекурсии не превысит $\log n$ , а худшая пространственная сложность будет оптимизирована до $O(\log n)$ . Код приведен ниже: + +```src +[file]{quick_sort}-[class]{quick_sort_tail_call}-[func]{quick_sort} +``` diff --git a/ru/docs/chapter_sorting/radix_sort.assets/radix_sort_overview.png b/ru/docs/chapter_sorting/radix_sort.assets/radix_sort_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..4366787b34fca3ce008f031a2150d0dda7614786 GIT binary patch literal 33876 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Поразрядная сортировка (radix sort) по своей основной идее совпадает с сортировкой подсчетом и тоже реализует сортировку через подсчет количества. Поверх этого поразрядная сортировка использует иерархию разрядов числа и последовательно сортирует данные по каждому разряду, получая итоговый упорядоченный результат. + +## Алгоритм + +Рассмотрим пример со студенческими номерами: будем считать, что младший разряд имеет номер $1$ , а старший - номер $8$ . Тогда процесс поразрядной сортировки показан на рисунке ниже. + +1. Инициализировать номер разряда $k = 1$ . +2. Выполнить "сортировку подсчетом" по $k$-му разряду студенческого номера. После этого данные будут упорядочены по $k$-му разряду по возрастанию. +3. Увеличить $k$ на $1$ и вернуться к шагу `2.` , продолжая процесс, пока сортировка не будет выполнена для всех разрядов. + +![Процесс поразрядной сортировки](radix_sort.assets/radix_sort_overview.png) + +Ниже разберем реализацию кода. Для числа $x$ в системе счисления с основанием $d$ получить его $k$-й разряд $x_k$ можно по формуле: + +$$ +x_k = \lfloor\frac{x}{d^{k-1}}\rfloor \bmod d +$$ + +где $\lfloor a \rfloor$ обозначает округление числа $a$ вниз, а $\bmod \: d$ означает взятие остатка по модулю $d$ . Для студенческих идентификаторов выполняется $d = 10$ и $k \in [1, 8]$ . + +Кроме того, нам нужно слегка изменить код сортировки подсчетом, чтобы он мог сортировать числа по их $k$-му разряду: + +```src +[file]{radix_sort}-[class]{}-[func]{radix_sort} +``` + +!!! question "Почему сортировка выполняется от младшего разряда к старшему?" + + В последовательных раундах сортировки результаты более позднего раунда перекрывают результаты предыдущего. Например, если после первого раунда получилось $a < b$ , а после второго - $a > b$ , то именно результат второго раунда станет окончательным. Поскольку старшие разряды имеют более высокий приоритет, сначала нужно сортировать по младшим разрядам, а затем по старшим. + +## Характеристики алгоритма + +По сравнению с сортировкой подсчетом поразрядная сортировка подходит для случаев с большим диапазоном чисел, **но только при условии, что данные можно представить в виде чисел фиксированной длины и число разрядов не слишком велико**. Например, числа с плавающей запятой плохо подходят для поразрядной сортировки, потому что число разрядов $k$ слишком велико и может привести к ситуации $O(nk) \gg O(n^2)$ . + +- **Временная сложность равна $O(nk)$, алгоритм не является адаптивным**: пусть объем данных равен $n$ , числа записаны в системе счисления с основанием $d$ , а максимальное число разрядов равно $k$ . Тогда выполнение сортировки подсчетом для одного разряда требует $O(n + d)$ времени, а сортировка по всем $k$ разрядам требует $O((n + d)k)$ времени. Обычно $d$ и $k$ сравнительно малы, поэтому временная сложность стремится к $O(n)$ . +- **Пространственная сложность равна $O(n + d)$, сортировка не выполняется на месте**: как и в сортировке подсчетом, здесь требуются массивы `res` и `counter` длины $n$ и $d$ . +- **Стабильная сортировка**: если сортировка подсчетом стабильна, то и поразрядная сортировка стабильна; если же сортировка подсчетом нестабильна, поразрядная сортировка не может гарантировать корректный результат. diff --git a/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_instability.png b/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_instability.png new file mode 100644 index 0000000000000000000000000000000000000000..3ccb833c8baf9e1fd79ce42fef1dc253488e95df GIT binary patch literal 11893 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step1.png b/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb8a7fef6199ff7ffc5496c4f0506360638ad00 GIT binary patch literal 8503 zcmdUVXH-*L*X~LJ5;_XfF(@h)q#Sy0Dk4qkh>!pZ(hR){2`F*^0goskRYgERil8L) zO;;k|p+g8n5s)5wha1oPzJI>&en0MyJI1|xj5X$-bM3k2Gv``s&b7zhF*l6$*jWTw z008Xz*Djj^z(~J^e?ubZWGm;=9Xet5x@O}G07uL3277UlLx?Vf`I_qKfRZlZ89Kw@ zqHUxNz=uTEJ%``=vNsIPuN)p8PEJlnR!3}YZN~Dx3%^R_E@G_xZb;0Q&aOY zHKnMqQ0>*^W|UR_*SrNoRuXM81prZ?e_7i+Xk?xe=krDd;2nCT?=b!PzCXSJzB?D$ zO%(PHETt=xg&Ipj_tL>gA)IdU|Gz8iRPNaYRBPyh!rSMgRgh+!QSYPMMay+TutP@E8+bkAr?U$;#oZ9CB?)Ed+sHGkBi~a{lEAjUvkt! z8za|ND~!$aa0bex_guisBzVTS+NQNlT<|~KtF^f%V{Aa?PciDPpOKsAhm;bPhQl(j z4@7DgL&m&z&T+o0B%EY~F`VFsocCmnZWc{%-wG$VPhCpeeyAbQoM%KnM zm&MxPZoyH3sFV-;0jgnNd)w-}AI?oqEPJMEp71@7hr|#>y-WSk*VgBlTn}{`JcR~I zjYHiDnHkJfm7iSDfmb?ZWmsd}G?g&4F?NM+QxLj;et50Yb8i14<=AU^yivB(aUVi; zt?Ou@j{-h;Gq}Tg(`d|=(Bj2TUCA^OOWRHgtLd`>5$%l9OeNX61Cn!;Z4A1Dm2$?$ z^SXEO&5nyhY9*cL4fx>1`<0mt%JV8IAKiP@wC9t(NxLM)i+HFRt|YRY9w*!V(=sP)IcFu_Pw*~I@vv~KET~EjUX^GIWW|57d5|Q>p59(fP5XjufSpfjs#; zqz_dkHXKY{(>hb7860uZIYBv94*jiQu?7w2=Wt5*^jiELQt^7pIDwxU9APm&_5 zp5lbhhVv5^bo?LeTvMr8bh%u~BiLoj z4z>^7=7z$zPmCxnsAj6+Buz9Xcp*zVCY9T1YEkoVZ>+vA!`3W_QUhdGPC(AV2YNVS zxby(p4jHD@qJ;hXQjNXjDK$ER(nfoQ_ncO3TPcVGJC%(k-Pc{3+^5Z>!Q;Cx1*Q3PeW_ls4k->UBeP2LNdj095Y^N^sX#S@Tl>GJ;2qRH{D zbmQ)m+bVePuxhWN>}wAmFh+$KP-<5dN(qcy#GI|xxo26mf?tOhDlh%`l4muxqB4ao zjSuN{&;Q>f2xyMEF$~nc%L_ySsX{(2s>S4Z1p_VeBK5COSkRXPqlV^D9vlz89j3ZbAlGJ=nUZjcPu?M-EXC*C){S07iu#JO6ZSCYP@8~>fJi#RKzGJf_C z)CKPPn;_KPXX~!8tFKFA(X5@PX|h)LjfnBpAcdTpTC{spBgz%o0yI_P05OC0V(1DR%H0)=|&@lHX|Yj~s$>zCEoK7TtsEcivChYd~m* z?yALC;Nbmh* zrmkq6=nd#>4!=&__>&Wv4nc{?@9nozysS2)6lv0jH9lWc zp}U5|{%1{u%qc48kfM9mBwfuq^kEqe%{p{jexGz;%VHh$2Mg`3k_{=kR#IA}UG` z`@dOelM}=8S_$90osv{744rJ@?_s|rbe$>6LK{T${AjiMOgCQ#Gn~$$Spc(IFZJbI zz#)SZ_ddr;UHfC;g9Lt;#LH&I@h;$GAq+WuvEI8NlVWPg53ThlQMwN8Qm_~8f^xNBkD~wd zPUDGE>wT#ayGx$w=5LZyv>8mCkT^4@iZ8gpiQ#`-4oYrbkAgjMy{($UR7N}fx$N;$ zlP9yN+FKm%U{B!ja-!y{nnwsWOsI&kT!CA`t-4IqepeD5lgFD`k>E-{ou7*!ga`WG zKI@;KJZE=;Cl;|)8E&<_cLVlFkI`#6fIc09(1g{*m%Kn$YEWpeOx-glJXVo`=2vXv z!@HFX^1NoA+_wnJ)RWZ;@&UdxJud~QlDL&iCVaj7aHY}%on;%UEnJCBcSiqdI-F?y zRM#6cTdkTM5)Qh@GS7(@K5_t`dU@?w9tR)h*J)K$*~@hN`k7HEAm8&;X(FY8kIVij z{$#Xm*lYNno8mRs2SfG6t9jilkmO&M%+Q`ud#MFn+TH-Ng;|e3aXGa8&IsF*r({{+ z*YnsRY2HVkF7l5ixldXlqyxiyV`0_}YQT(bf7H0{94JL&EI`vmgqN={9-RW0UPs_L zzee0ILzND<+@`T?%Rzos1#cTc9RrVCc?(33D%4_C?U#Z9tn4Dn$}} zw}4rjz*2Ws7EKxXS5Lcbh5R`EIRvKUS8j!bA3M9(HS!Hq_}-M6LH?i!7q7Sl-MI{W2}= zJ|A)0=Uu7Y6=&aKt%W1Hws5WkV_>{0%mYNzzncL#1Oe>vMcMn<;a#>u-u0ky=5B?*lwow(bVOuNEc^ zr^D^WPu#Vgy_!=LJ>qfu7%E&KoB0&b1}s`IB>V=QaN+4B67b;RTnw-1L=-T-0t_&s z9GJ^xHY@G_HR2+Ah!uk&Q77;-WfF(gy@Rn!KH51eHAA->O2#Z)i?31=*RK8R0f(E+ zLrfTJb9i_ljQ_-!atpypls;%$VukWJYeiw4`|GUre5WyzfG_Zm-dpiIsF{eXa4rqY z{o@Lxt1!-B25E6jaNz!?`q{;vmoXNCo+mt?*Sj6YQJoOd4Y=k^c}&HyL+v@;Ugr9X zaFTP)>%ZUFPr1eCpa)?VyMMRFc*Q^cu^x{lRu)%U*dq{y&2PlnCg&CmnN4Bd;5}$8ZeJg3=WNYJi_lCii*nN35eHF@XZw3RmIc~7H2+Iw_!moM*0C-+3Z)km zeiDS$rVz=k{&f0s|2_eoPZtj_29SRX=trWr^1nOEJIj6IuY#pB^D5uhyOLID>3}A3 z@zStL!W?lW9y|Nf-6#|je2>+X8_xto?p@Ue@P>f{FYD(naIP)!mN79Hk$4hPRbD%R zgx*wbn*}jPByvC$F<9!z-tGnqyrC4%w!*pPC!-<9`u+fM5QBX1mUVP8TY!r?fuPZ> z!7UcVgKFA6FbhL8RKoWvHh;jfPvAM9z{2@d8lm=fbQYt%kFlOT(@=jzo;JSQpWjkP zQGh4`avZd%C?q6#n0y4IalA#EJ_X0A+^luUsm;alQqM$K{S4B#u(52-8&c??HD~5Ii_avyqbx4PG|Wzq zb3rzhJd*)J(VyKAuH%%qsKrfX7{4xZziX`{LOdVcpKHg5@1*dg$*~zRTjynOC}(ry zEe@s@i+Ny+$rGiV(Aiy6wu0@|Cq8opu%Wds)*L)E2QL%aE$aDl`q~pu#^fE2nH&6V zi=_RE?WNSVR#~I=bvclp=WrmJb%gppcvEz#&ZD79Nd#L@S-z?J>?!mHNW@9=*ciRE z2sj$VgZE7M^ks;_lrUK-F(O3>Z2O}$OoOm+tkj^mJdFwSbt2Xx;Ztq494B<}ZF~2# z(2^4_UwMmYcQavES;I}{fCt1CLTb!CJZ6+9pIt$KfZW)eQo=kTm)> zCLYQFGb?4ws=q&GOEX{u8_d@mlLM2hp`yZ*AU{8CX>IFW*b5fg4aT8C+q-;N-Jslz z%jbEkHVlG4(`w;Q_HVsN&AHTt@XF@=oBda=t7bnJ{w~3DP@cm(wr%zfuTod##e_ta zOU?{IqF@!+k{gZMVb&b!QOg?=fV}9k*{V^c(60|HPfE>_H+RoR$8XwMC#?VcM)oAA zGD8l7+Z(^$0ZmpYAf&QEw(E1A!_Mn@xa;TIRsE+Ydrh+qS|z})LqovhV8J%`O+`lX zt801>gY{ra8vP=_ervKrzD_bqKMjpvSI9s)z%V_@AMcu`dEUj9FCQc1ay2$*Qq~2Q z+9u75hhkwt_AuT}3w-Z+aSK9rp(1PLcXxe8WUU>r7e>7ALeP5nF&ARXVuBCuXiD;B zoKk=f@sO|NCMKVF`4m|eP` zAC@R&<*j5~?br4>7@R#!h1}s@O3{j&ay1oRB-RROKj5y41|KmalT}Tfzk8Xzce`;v zq{T<`1davTR&H+B^K|@FeoQdvwNis4Dc;1mnr6=C;9KEIEMH18xmO)xz0CAKCn!gRM@1U+Ud0LXqQbH76!fv08mN8Y*=24dq?&W0>DCBadX!%T3&f)8dYH z{o9GJh9;Z#MfxITr{Aq#x%N~L;RukA@t-xH;)&o0Un4(=JSj>qoAh=Y;l%RK&2Q#E ztzLh8Om5PXLM-OP@4bc%`Oh5Y|0r>{C(HO#mhLZ)4y4%bC5vsH^$e3$%olik^6><* z_!$1dNf3Rrzp{4|+m&Cvh%+hua=|$4uq11!zH;KmU?*0?!q*mkf7v#Hnr`l2bKtYJ z+n$J;;p&4wm14vc`i{RandzplR1r@5w) zqnEy9J2Piu*&#iOY7z0G-xN+xF2oi*j;x1oWo{D z?mmRmp7l&}azKlljF`=M*buYUfjW$M=d#=4ZQ|QJ+NpWrae>G3+v&X(;V+iF8X{dw z-@80=Y*#0FmoFrX>)Lx21lxuu|M+R{{Uq^6aHur=fluKN8;V+NhCP?mMZn?Yn z_85^}vr9U8scAFMs=Hax3S$ACe6!_|Iv1xBLfo%au2w}(w)Q-_drVd&*2v7PI*2*L z@%ylCMKX4B!zO(ycDkH?`pZLj)=Vf{PlyRG)?&Hc4x0*C#D4}z_wPC0AAg$pwzk+k zuA*r}VaWn5DJ863)#Z_R5a8!oH9yzhuD2?)Ba9xaN4Mu0j%&7;&S_2zbi1}Ex>u{h z=kJe)`@x?oGGf#jF}B$35q}D1%$@ShWBBjH0#ht%za$}hv({=leI+s$mbxH(fq#Y1 zfO|vuOPta4WM-A@bkq{I)3(0Wa|Y{r;dMa;9V*dMO}MMEY%%+jJI-4Xpt1_RbSlGE zd3i>vKN8u61_FfU{2)-+N50I6E(d^fGw z+vbg1b>sls@#C>}XgRvyEOcb|g4I5r(Vn{4wDPQ}XU9QcW&R9%ezRS7=V-EOoajHe zcI!PAZfFwxcLZ5TWMSRe-|=G$T_Z<)%muYwF;;Al+@ja8eYhm{d>8Bl{k3AHR}5O+ zaV4~1Y68D~e4;+^x_8gdv?KE5?%ROZvR|c~wCQ09l(dwNh7=^yaKf>affKB-)Z_JN zA?HhIlAW28QdY4ODCvzlFLFK2jcs9s_xOnSDE8 z(@>6d%xr(ddT3J#40kupKmxjCVqk8s`7C-`=?UQ676;oiN2v;=vHKM+bG3VW7jaeo zW#c9B`E!|-ZUgT5>tjv6r6rXqA6_|vMOD;=cjfh5=vGIkJDc>T<+St;ooF;$C;XJ|vw`L??B zB|NuP@a;c#xsP@Al^OT==NeF*9Bk7Q#h_@t8}BQEo^W2p57NyO2qj0YGZ1?Y98Z_{ zVT-Ieq}w~?EkY<3>-?u_&NJ+uGW^%;s%d_W`#{3-=?_uAgJmzG)!SVi@HiQZoykl0 zSQ#7RMU=h74rW?%HdPk1eJfdLU9&#yJ&O5m9>rZgPoB*AU}{VD)F|znS`nsZ(sz%* z#=H7I;CnJ?8*?tFOfxeq&))u zbTa|utM<3mP?Kfs?XaZCUiQeaEHPL6qztS|I<{9R+x%X|dc^Edk(0LjG`4r`PhHzT z@lK3kL!K9;M97;|4XF0e(spI>5~o>`0l#7Kua)3W7e-r$(8;Rey85~U&+F{MZY`}8 ztyqxxekYmDreEI%!jk;wwJ!ZqqRX+GX!a!V+f z!t%{W%cgEaD9NI^RE@BMp~jt8Z4TG>mCTtLTV2j~`Qj&8dM1e+y)BL?HD;e%4z7-* zO@f>)chUUJ<0|o~^W$wU;+4;)1f6O|=6Tq^3nbD(gzLom;-@Q1Y@Q$I9eKbkul9SV zY@diWh^d{QC|l&mZwpi9aT0I$BxrsYsiGiw&QqH7FvFb_wGq7QX7XG;Y-D|SVE=sI z*{>eQOZp2Z#ziw!Z&=)B)Udjdt5i2Asr-yjH6$ z`ppQcyRmGXSVt)8;K(nYFq19KDBOF*qvteT>Abn&85N}vc+wGt`lpKNf~mW>wxiVY z9@TDoEHogp@t{jLyqm94AFL!IXkBPWee`gT+@}4V-i24ZunX_*tMigKa(38qMQ3=^7c z@J3o9&Xb`-s|EExoEQJ!5$`#tIJ`R;9IN}Kz=DABQ2xphaGgIq99tj4cs+ zBB@s-ndZ>P;7F<+B2|*!!KDR6@jwf}@Bj{A3;>P<3|s&y`tJ_f0*Fn?h$G?Z2CU)% zTqy+H9X%IPcQ@HQanfYYR|Ur4wFagZEZ6Vau0oWYV!jvuJf!aUf?~_Gz6?fgnbB?i zf=SGM#!9I1YMsG@u4B+W3)LUuAIw#U#?>STORuz_{&LswS&*HSe{HH}s$2|6HUzK? zQM_%@$64)+MCKBwY7eVuwxxt)@kgD$6Kpr6!RMy2d2}a{@seq(ACxUQ6~iiNoHf^TST#AuKbdb7Z9MCz^9BP<2dbXjV05rtrglOfK%Yyy9G` zK7gs|GZ?zxGoQF;_dGw$5b^0<)|Fp9)n44tPKCVnt{vshslpmCV03xJvBfB#_{r*> zdrSY1cW*xK#jwH{XqWv*rzF?K^mo6#`}@I=WKZ8fYJ21uGsfK_G)PcygK0M@-pKTk zPps{&-U55g{*;uh>}#j+AWIk$tW%L&B`)cUj0YQ%yJlRQ8{b(|eB(cmGePCXl|EAn z6%S+eY4 zCi)b8s`>tmVfV(OWR?m^Hz5sYcV?-5uSuew9XX{1IUPd^QyL?j z?bI@pNC~NL18e$R?iCUyEEpL$5`#62xM%qAa^AuF^GV^SI*=GuLN01BE_Yu?b#8J> zE>(j)!|?)dxjT;2D_MDZni`>=MA6M2b)PjYW!Ri4oEVZ`r$ z0sOy*kUtj389ggjtqKeeAke;2_I=6#FC1ALT^%Zf)i}sWX+7=&kW}$L5p+X6{Ad4~ z5;M=mDEbzO4|vy`c!)BWV!9bi6NmjDrdaz4DeDvM(vPUP_rEpuuNYr0(ZNLiFTF7@ A=>Px# literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step10.png b/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step10.png new file mode 100644 index 0000000000000000000000000000000000000000..3b16d59063142082d9e21d2ba4fee13e36da5c3c GIT binary patch literal 11571 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 LeNc7Z_St^{S#^~6 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step11.png b/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step11.png new file mode 100644 index 0000000000000000000000000000000000000000..0be7affac0875362f97ec6983b94d653f4062074 GIT binary patch literal 5824 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 Cjc;oJ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step2.png b/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..60b7a66b3cf7baaf0b63b4dd97b11aefaed84971 GIT binary patch literal 11536 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 ICl;aq3vL*EegFUf literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step4.png b/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..268095edd76a2f19e8ba17cbb1f4c130741103d2 GIT binary patch literal 12005 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step7.png b/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step7.png new file mode 100644 index 0000000000000000000000000000000000000000..3cdd7bcd3dde7705afc5a4d7c7a1c3b8aa0b93a6 GIT binary patch literal 7957 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step8.png b/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step8.png new file mode 100644 index 0000000000000000000000000000000000000000..f7af01c7f6f040393544d139684cd19c4a4357dc GIT binary patch literal 11873 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 FzX9)-4iEqU literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step9.png b/ru/docs/chapter_sorting/selection_sort.assets/selection_sort_step9.png new file mode 100644 index 0000000000000000000000000000000000000000..2ef613b0c5156e2d0547636be1b045b1f251e0db GIT binary patch literal 8252 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 zęBc4PWBhJYC^77U@z8KON3tWCbyQlDd$dN`{XRZ4GMmqklV)Fk*4T?Q+NNoFf zKwwwtw}!l#dC3h+moy_9bs9rYJ-nO{JSy|jLLMwC*){!r3oKf`j@Gl#V*QTv=&|$; zo1o!kLX$Nma9jye0EB@sVh&;s1fU3j5Ml`NnLE%+B`!`yQ)@<*zHtq)z=odK-C9z} zCyLtJs%`l;*FntTL5cei?0b>zU$xY{9yBa^>T=u$yLLiYw&cfxlqF&{?5302zk65;~AaBp0-(qw4TGG6jmtuW` z)x+G433&^AX1ghsENBr6H_-WFGovYhMa;)7Ww(>Br_yoB$Bp0etcf{xDXqLU4^9WR zxxsruilu^J-$0)>JV@mqN8{p>7uYOr7iAt)v_JG)>a$$y7++w{-8f}7V4DKhR~(tD zt-`ep^z6S+x7A6-y=zWxZZ4p-!u&4%@S23fg8~;rj_|4&&t^0H{tz0us_q}^FD*)H zn0pX=7gR|HAH9k~j|HK_vGw}=WSmD@RJ^vMERQi!{&}v&2jrn798v6OMk*p7C z1t*L7ZFX>*uTI_VW^hzj!1X{mra21{x8nepPzk~CNAcBBKM_S&4dqPb|tBA zi&wUV{NtRk{ysy;XB{F6w4t+CoLWwkgLFmQdNMqGY=lMbde`3hCUd4sBd-A*d6(M{ zL}$E*g6-kr!Vc_B9(-Y-eckfvZTnQjBaAL zYGAr9AMRA=e05BB(rTEaj5wG}Ljk{IKriUQ(A)LravG;7Jx=HR@p~jzk8g_;nieNi zHSwTg2j{-a#~J(T8b#a%+o{{17t&RSexsf|93d>Lj=wrE1E6f^^WopEH#2P zW9GfV`~!GdNe5lnDx4NADMRX0`+&9xQtJd=c|_VkvgMRNH~JSlb4}be z3E094P|%-lQx@`^8syMVDr(d*6rczL!s^EO_tjm^BaLguIND7F)pBsc;MuAO_?k(H z`)LgPezJ`w#5f*nao4$vwf7K_q|;VKPZm^glI9ww6;zJR(buI)Fvx21N&?4$*AH$dvx}qbM_#l||fljw8tbA^x$BTmpmzUP{jgcK+Q80Pd^m KsFWyKh5irpJ0*+& literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/selection_sort.md b/ru/docs/chapter_sorting/selection_sort.md new file mode 100644 index 000000000..ff3634905 --- /dev/null +++ b/ru/docs/chapter_sorting/selection_sort.md @@ -0,0 +1,58 @@ +# Сортировка выбором + +Сортировка выбором (selection sort) работает очень просто: запускается цикл, и на каждом шаге из неотсортированного диапазона выбирается минимальный элемент, после чего он переносится в конец уже отсортированного диапазона. + +Пусть длина массива равна $n$ ; тогда процесс сортировки выбором выглядит так, как показано на рисунке ниже. + +1. В начальном состоянии все элементы не отсортированы, то есть неотсортированный диапазон индексов равен $[0, n-1]$ . +2. Выбрать минимальный элемент из диапазона $[0, n-1]$ и поменять его местами с элементом в позиции $0$ . После этого первые 1 элементов массива отсортированы. +3. Выбрать минимальный элемент из диапазона $[1, n-1]$ и поменять его местами с элементом в позиции $1$ . После этого первые 2 элементов массива отсортированы. +4. Продолжать по аналогии. После $n - 1$ раундов выбора и обмена первые $n - 1$ элементов массива будут отсортированы. +5. Оставшийся элемент обязательно является максимальным, сортировать его не нужно, поэтому массив считается отсортированным. + +=== "<1>" + ![Шаги сортировки выбором](selection_sort.assets/selection_sort_step1.png) + +=== "<2>" + ![selection_sort_step2](selection_sort.assets/selection_sort_step2.png) + +=== "<3>" + ![selection_sort_step3](selection_sort.assets/selection_sort_step3.png) + +=== "<4>" + ![selection_sort_step4](selection_sort.assets/selection_sort_step4.png) + +=== "<5>" + ![selection_sort_step5](selection_sort.assets/selection_sort_step5.png) + +=== "<6>" + ![selection_sort_step6](selection_sort.assets/selection_sort_step6.png) + +=== "<7>" + ![selection_sort_step7](selection_sort.assets/selection_sort_step7.png) + +=== "<8>" + ![selection_sort_step8](selection_sort.assets/selection_sort_step8.png) + +=== "<9>" + ![selection_sort_step9](selection_sort.assets/selection_sort_step9.png) + +=== "<10>" + ![selection_sort_step10](selection_sort.assets/selection_sort_step10.png) + +=== "<11>" + ![selection_sort_step11](selection_sort.assets/selection_sort_step11.png) + +В коде мы используем $k$ для записи минимального элемента в пределах неотсортированного диапазона: + +```src +[file]{selection_sort}-[class]{}-[func]{selection_sort} +``` + +## Характеристики алгоритма + +- **Временная сложность равна $O(n^2)$, сортировка не является адаптивной**: внешний цикл выполняется $n - 1$ раз; в первом раунде длина неотсортированного диапазона равна $n$ , а в последнем - $2$ , то есть отдельные раунды содержат $n$, $n - 1$, $\dots$, $3$, $2$ проходов внутреннего цикла, их сумма равна $\frac{(n - 1)(n + 2)}{2}$ . +- **Пространственная сложность равна $O(1)$, сортировка выполняется на месте**: указатели $i$ и $j$ используют константный объем дополнительной памяти. +- **Нестабильная сортировка**: как показано на рисунке ниже, элемент `nums[i]` может быть переставлен вправо от другого равного ему элемента, из-за чего их относительный порядок изменится. + +![Пример нестабильности сортировки выбором](selection_sort.assets/selection_sort_instability.png) diff --git a/ru/docs/chapter_sorting/sorting_algorithm.assets/sorting_examples.png b/ru/docs/chapter_sorting/sorting_algorithm.assets/sorting_examples.png new file mode 100644 index 0000000000000000000000000000000000000000..bcaefebe50d5bafd7a001e8db2e697adb9ba28a7 GIT binary patch literal 12018 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/sorting_algorithm.md b/ru/docs/chapter_sorting/sorting_algorithm.md new file mode 100644 index 000000000..556f56a00 --- /dev/null +++ b/ru/docs/chapter_sorting/sorting_algorithm.md @@ -0,0 +1,46 @@ +# Алгоритмы сортировки + +Алгоритмы сортировки (sorting algorithm) используются для упорядочивания набора данных по определенному правилу. Они применяются очень широко, потому что упорядоченные данные обычно проще и быстрее искать, анализировать и обрабатывать. + +Как показано на рисунке ниже, данными в алгоритмах сортировки могут быть целые числа, числа с плавающей запятой, символы, строки и другие типы. Критерий сравнения тоже можно задать по-разному, например по величине чисел, по порядку ASCII-кодов символов или по пользовательскому правилу. + +![Примеры типов данных и правил сравнения](sorting_algorithm.assets/sorting_examples.png) + +## Критерии оценки + +**Скорость выполнения**: мы ожидаем, что временная сложность алгоритма сортировки будет как можно ниже, а общее число операций будет как можно меньше (то есть константа во временной сложности будет небольшой). Для больших объемов данных этот критерий особенно важен. + +**Сортировка на месте**: как следует из названия, сортировка на месте выполняется прямо в исходном массиве и не требует дополнительного вспомогательного массива, что позволяет экономить память. Обычно при сортировке на месте переносов данных меньше, а скорость работы выше. + +**Стабильность**: стабильная сортировка после завершения не меняет относительный порядок одинаковых элементов в массиве. + +Стабильность является необходимым условием для многоуровневой сортировки. Предположим, у нас есть таблица со сведениями о студентах, где в первом и втором столбцах записаны имя и возраст. В этом случае нестабильная сортировка может разрушить уже существующий порядок входных данных: + +```shell +# Входные данные уже отсортированы по имени +# (name, age) + ('A', 19) + ('B', 18) + ('C', 21) + ('D', 19) + ('E', 23) + +# Если затем нестабильным алгоритмом отсортировать список по возрасту, +# относительный порядок ('D', 19) и ('A', 19) изменится, +# и свойство упорядоченности по имени будет потеряно + ('B', 18) + ('D', 19) + ('A', 19) + ('C', 21) + ('E', 23) +``` + +**Адаптивность**: адаптивная сортировка умеет использовать уже существующий порядок входных данных, чтобы сократить вычисления и добиться лучшей эффективности. Лучшая временная сложность адаптивных алгоритмов обычно лучше их средней временной сложности. + +**Основанность на сравнении**: сортировка на основе сравнений использует операторы сравнения ($<$, $=$, $>$), чтобы определить относительный порядок элементов и отсортировать массив; ее теоретически лучшая временная сложность равна $O(n \log n)$ . А вот сортировка без сравнений не опирается на операторы сравнения, поэтому может достигать $O(n)$ , но универсальность у нее ниже. + +## Идеальный алгоритм сортировки + +**Быстрый, выполняющийся на месте, стабильный, адаптивный и универсальный**. Очевидно, что на сегодняшний день не существует алгоритма сортировки, который одновременно обладал бы всеми этими свойствами. Поэтому при выборе алгоритма сортировки нужно исходить из конкретных особенностей данных и требований задачи. + +Далее мы последовательно изучим разные алгоритмы сортировки и на основании приведенных выше критериев разберем их преимущества и недостатки. diff --git a/ru/docs/chapter_sorting/sorting_examples.png b/ru/docs/chapter_sorting/sorting_examples.png new file mode 100644 index 0000000000000000000000000000000000000000..bcaefebe50d5bafd7a001e8db2e697adb9ba28a7 GIT binary patch literal 12018 zcmc(_WmH^IvnEW_xJ&Th0fM`GaCf)H-Gf^PLI@BvxJz(%hbFkYySuv&d1vO%_wT#^ z?p~``)j6y7EM)ZCY;HoP11*&}XiAr9;Yd&E%oF6AgW|cC>+$Rk4sb6 zR%K~O%L7TfBnBdxCAi~|>%}0F%MG#@o!2;e42d-CQ`#8|4f|yj4}%w1uDxy!uR{pq zpx-tB4=gaAv@J8T0h2P^;ltHRKp@k?$=LL;OEXDhb8}2C%XC$0{sGaM?9(`*OWN*h zFg4t=0&_I}q2%cFdPD~NfrT~XZ--MNKuj~WnC_XhCe6VvYN`P+_55N>jaLT84mu*G z{-)d~`l#pA_p8$)En+mh<|^nbNOpAWrs43oCTtMd(p_9==te@2E`TfZ^Wx*8u|FqF zs!|%>j<5!4l|lzZZ-2PH5#Sjd zGILj;@+dx)?EWpM?a;20OBm5`eTm>)cX%9|f1Dv?8kwrSx3CN{?~DhGg!FN-LpLU+ z)yFItUy=Eh^i8xqTi~?Dmp9mV=D#vcsr8tr4%QMe>mK~LohBu1n9R}lmk+C#FDf#^ zov)`jT9_N{MT6i3q*gVs9AVg2Hk@+(N|Q2L+jO|AcnxZixEEZ|fk*`7!vKvx<$K`dFeF<@+Z|t1+1fB*#6A4M zT~)cbWql;XO#rs!o z8w)p$i(E!!`k5zuB`A%V1mKO;@ZHWkehU})v~NG)yGCKS4`2G8xI7y-9uG@3BLF(q zkgf~A){Bs0?sZ4?K$_v0QjY%)wq&H`syxT?j82%Adkb)+-v>`fM0p)vjMr{`3Q$3O znR@vk6(wb{7kp5rPX8|C;4Q%8oKG72ThIFGi4Sy%>ie3jUwIHI61wfYAy_;7;D#QL)_wKeVr(d*V&k2^#8{fdo zb&>~^LP|*yM@{BgZeLJMNB-i5MyAYHsm|DpbUGO-8zVc#a`mZ@6g^g?wT{~rQ$>~B zzE+^sq`pGl!ppM%sOh<4e!}1If^34Qz$AFt!av=zwsr9~kCnn(=`(kZ9If=nq7ful zXjw9@obiPB4-SGEkt!q~Erz5Ds2GmfsWb?~;;}TeWKP9K%6{fOH3Sr_F9nzOr2(y` z-&Mf*uLktO{R-ae6;gltBBNAmp`^|^YD+hBE!vKw>MB3()|nLw@9fDp$rV`2*L_#)M@SsrsY>zZgBs zX1M#j-*Gz=LTsSm{m97zB7^k?d@`JVWmFWB&kJEN>0vdB{7W$_&N#4C$L$iZfuc5$L1fJQ{o1c6&hxizu z7h53ku`kJzWxedfJ{-%m3i^^Uki^^=sCg4DaZQ~22j#OQe3lFJKu@?~T?JI0Le?zjA>9wHJ-ON(S@$2b#IFnD z=#Yt&BXtwzgal4{II@<`24jT zFaY-1x69sPMS+O-Fd4db-72$XeW+uoNdMr0I|cTVVp$*1GRDMul8V#^(pk?GpcW=B zvlET;Umx8nDm4=lIVsyhvHU4gIQTZrY{b8BHZBCDK&{8l>I~U@O`cV%ZRSZpDxqY zt?{2)rQwd7U&^ftBm>t4&#YZ>2&p#63rd8Fr+jBo?!9Pe|F*~K^Z zZ&CIS{&NUkzbf2^+=QKowxXji1WpRN-+F0`;yB>1-6L0ECS$2r1fT9GEI8K7cpLel zX+}`Be*tkN-6s#{NeAo{ntQ$2?@O?) z(;sY%=uS$0y=j222@6r99vm4r)aVwXx7qh5M*^7ea-3ic%@Rb6isrN<;o9hV!Se5qRLwXC#4r2 zO}QF#Nb!61Oc5wYHcJ|w<#kdJRPO&gBi7h)>(JUHc`5q1jo`?i#9F|a3pnZgqh{@L zgHd2?2gUz?HsS!wXFm4v;V8ie?+^yb?pUq8plD-O*@$d#{Q6kO;8?-N=#40K`CC?6m5NI95>`05oOjKF zb7+Vk#?hUknF-t|3Z=%)Z7@A`cM6N|q}%zB9(@3``ec&3Y7E)4hWvxUK333p^s^xg zoUbYn_a9zn10I%G@XuvXwLuU|V@Tx3$^9ync`s<-=*=0>{k3oPK`?LRtFu7aH%}Q0 z499d0DJJ4Hk9~6|k+q?H%1OB-mCU7SEm>ybMa7qzHP=yxXi`Ko%ItbyVPfRi74y68 zt^tR?_y~>ufFN~1$AS~H(z3G z{ryM}YnR_=Y6|Sf=@uAi+xsW6hZcWLKH~f0>MvKWr^a{?bb@QN=4cxXR`C|#;s)!B z4o@r}dOi!4PofpLEG=*Q2Aq|?Sp?VnNw0kwDQo97a+UcnIiGeN0w5#L~O?JzFoLz`k%8SO=ph@2QFQQ!K{Mace)PDDEp(nX^Y5xd!FGf zo?=V)t5XN@lTXpBX{k;f>rSZLrK|r!G11(_-IIH7dfxKtxxF!qjuBPYlk244LHKHZ zu_`7oix;JUf1jxG&JjdyHW55)T=*kkM%DHH`-=EKy?SjuhHF%xTpo9Z9%3hsE4c0V ziijz|OSYp6cS9&W`fkl%ePoDJEcp+uninVZJ69e{?M-nEDy)c}M_wc1Rma$wQCp@= z+}wH>HTsfa1r)KPiTE>pxDgsxd@0}51yeLk4imK_4csnoQTiiBmf!#lsXvM{i*x|e zp%Q>Lr44VGuN_ht81g4?;MT0%oIZF%$L+6Drkrf>^4=S|oaqz&N4&W|xe~lvvxk%p z$TeN&r=V41%0C9?F?uD#OuMxAr1=T~Ur~iA=x8h+)jMEy z_%*d+>7{^V1sMBdNZevdgx)C}@iVNHykUACp+BlmSEO1BW}Bvz4)cUgO)&$8g3Q&X zKJos|QtQBEd0vJg%hsmg>2 zVN2_~-_Z9X9SXcnV_&VojhC>PHa7j#-aSr1n)SkwmuOSrPQ2NzsNh2}GLtzCh0mM?5DaG)QFsMqn5#UjA5!O_g?cn~2x(pIUn6yGt zWa$z5V85z#0a`^r0P~Lrav}8ot4^Z>=;jMVJKp#gx~xrla&>i0LN_6FY2iI~=);|I zCJ@Y@ysK?-ig^lI<~3rzTata0dpnpoh1Gxsbj(Tz7~c%6aWBFnTTj%RE!Qt_zUmQKN;H;6MVPG=KKdS{3@LNogVa=L^im@|*hDtEo-MjT-gDN!y;|QN!A?|%K1eADd z>FGd{J}Fm0_-SOcSHj`xkLNofOc+Lpmr${7W5;$&3n9n z5jt&6JetWb*Z9bubS3MQl z5pUY)EB4xEviN)1{#r2UP3SIM=Ic~}@nLObM%qsyR)X^wqw*tnCAsENDL)EbT^3jq z0O^g6ePzTRK!>I2G#j=R7a;gDSgwzljH}F#;}>4>y&vh$=~4ElnMjjJj=b?jD^r94 z5i!t!4A%({Z?pbRfGktdxvw=J2Vj6XzCds_V|;lI68H@$l1wiM&5Uag(;_T6D=vrK zmLuZNIjNzfy_6)5c!*`i$?@3eov(LP)j;|#2_a?(Y{01~AoaPb@cdm-HH?L3ZgAXh zyLm4#hoVGp7E5!0Y%%7MRAd~ zLX_|9y^1K(Yc7}ME4zmZZGsBTb~)C#D!%}+ zP>=o*^>g29X~yjI^>op7G_S|pqC4m5b@s)qNmyQq_O%S3hM}K2Z+L=u2?TQ|QZ#|C zp1+$z2q6sTym+&5p+J%GXh3twp?+ggNm)069Wr@ndalDRs2d#l*%2jdF?jl3qqA>a zbKUHz)tQb-FSxfJj+BrwG0AU9$hkl>Ab)I9l}w^!9&;yL)VL*@kXb7ncYGvcoFNgM zz*$^R>R)8i!ho7q@@fM}ErQ17&+%pb?0~14uG;xqWUXm%K2h*!e0~<;M9JlQy|=1$XC)Lit*W(Pf9+Oq*)S>G(&`+8?e$5}T0^AO$b<3#8OW6pdhvgY6)hmo z7qH?ntdqH(4b46^+wp22m7u)1h(c2rh;*D|?u3edYjMJcwm1#H>a4#@;G~N@A-cyo z5_%wjwWF3Q+5aaI(^3fy2>1;SrNw~$0*OGJ{|?4*5`)g5!V(oh*q=8{AR&oS(r>(F9Z@Xt#|EyB@bVVzQ9K?tWBZ z^cmj7uZ4fKj4Z5^hwv{hM#_CkPh(xFP;^8RYQ+XvdS_14uRJXd%0*RpSys0cCo_HN zjX|lfgEgC?J8g!wW5OJ_5%;;2D3?!Wj0B`6oWl*l{%O-p*VopjSRWoJ@t|CnKTAZM zk4P{Q^x`zGZh@{y-}o@S1hZ_^0uHBT+536RV<8vy6TrpY8^||Jm z)!%1pQ4Ur^BQHOVP}@#NO2PUe@+oCgUX347PY?2JxOE`9j{P%y%Y{rQb4(#0W>1Od zlm@|*=x?vZ>^Uas8+o?6tOhkWPXFSAiMS76zLv+=P_eQ_vSQRv)-qbTBs&P6_VG4Z zthjZ!-+7t~Lxw)BaaT{`;x#~&v{!XdfuM1dG^(0R(x;T2t_)s9Ab)O~dz!zd%f92g z299!1;0T7N#mfI|?_C?+O5Ytp>bEYPy|Fy(Z-n#nR=tRYMe(d2i0}rgrF3|2AM6>$ zvSppZQ@MmtBR+Xo^I21kB5*--O~KR>VIphOIx8+R_pCf=d4G_mxigaDNCW^0+N_0R z>1K-F?HWvE|FZCD&4^=53HRK{S|AB+F@wX0ul_gD~FI~8j@`|I2t z)0f$Cdo_I0$Gngb9l%}dz_ycW$Y0)L)qN`NPl(!X8BFN_&czKsu{WSq)f zffat|Cyo!VT=)^Ts?LTYiSbLW4)<~yk;AGt_rGC(eM*^D-B<9|*p$U7pI&SPPx`DS zA8M$c>4+eWe7ZKe0h^_;M~mHUesuEp@SEwv8~SYSFa5zO({%-hn=nD)K=1{*NIe-_ zIe=07F35cXGCa9lq`9dR91kA(1^i_ z1ku~yh3mKD^dY4sdAwfK`6Q|stQrYy44s@pRUJZcX1Ok{!Io}SnTC9O*~HKG8n4G^ z`n{3F#~3s)(wEQOR8^MLmKG$LyzCjDtb22y%x&o&*1^nEME-wnm~qJTWP8TZ8%nf$ z9zJ9Hoa13+X*)h?m(kVutAmTjR_iEH|7t9~^RZIMiVlJB>>@bp@k>V%+}7E#DJ@an zBktQ`fMQ}hU$Mt9reG7=I#`}f=z`K1gz*8GMr*B-ew9fLW1?Dha2lO%&Cb|7b_@@vgJ z2Jze(Jt=iOIF*rx36Ctbp*NIjt%?z(2Qz;;_ybfY=106V06i?5tOySIjp*bXA^Bsy z?klqXDQN^igZ^d6nWR!@*1&th(Pzo5`>uY+{oDO(ZM6F_RSRh8N% zv#w&J4ikh!S*DMKA4ba?lFpDr=Ls>UO;y4N&X!;zN7Kb@!%A=6+)|Q6&)^=R2DZZg zI^oj^g_?sV?783RvO`!c)rVicAkvXZhT6jW@P89$xCyH?S@heoXStG^9pIe{y^U0D zb>(#|LCVvGvzP<55XIqUQDd#vzyT?_e)lFjWJ)#v14y+AO}jvnK_sP#+C;_M?<2Zc zI>RR64LFTe7PhgBxi@ClIUedkfz7uq7EwQ7Y_`J$3+qZSpvh({TZ04WMGL6DsgIf| zW;>!qXwR2o+`BLN?IqHHhYBlAKHkrUf+wHDxGlr{XvH%!3UgmGccgMSCi>-SF4F~D zR2Ba5&mu64_yB+J7K@wSoDZN`{vHCAp|gu>$!)lSap3E7Y&alygpBD1JUOrHKjifm zFL$w7VVDQiV12m%(Wpjwg{qLslb!rw7$oRtI^?oo0qgnSE!pvi$|%1>LCe!PR!dDW0tDE=K`;9u`gD96 zuc?e!ei_7vvow#1GFT;#V(ht5|)~wd}ImMgn9`|kKc&MT)Xg|)D#`Ntqt~8|a z0oPDN_t%E{q zrqBNFVXXg|ZAjRm^ma>JpoEsE)3x0Z%9%^QvlKU)sr2U+`s0fQ(DakMo*DF$erSdD zoGmtfQT0^_V(*;eQ1_F4)v?`a&o{OoHJVz7b1U^&Q#!S|<`1SGolw(Bn{9mMltWGJ zE<|KH7(7GVI73Y_jmUQhlBu3P!O*+k+UhA41!-@k#wI{9ulnnQ2a;xW8HKoaUyv*# zrZjBE!+AWv!jN1UIMdJSuI^dhyR^-EYnlO|--x)dtr0=vai4ZGX1onll$+yk#06>ZSS%^zs~Lwe7GGmRhQmnQI?g z4&__FXv&M5tK(~IB1d}p!Kb*Ns>D2R1a4^`h*dS$qQSpBt5AiiM0d)k&KZjeKVe^h z0;K!=)v9Q&)2>oR!Gpg(=ORRJs$Ax;p>`l?$CEc=7h!~sb5dhxeSFA78ZU&p`7ku_ zvC*1u1RGVpFhe~@R`rwwSy?R$Zy=?ze?h`x@ zi~SLRb4JSa6kDNw)bhb&45?D^8m#B*n<;RpvJ*$dKzy9OTK(ZK;}kV(+XIM(+(5IN zX)JI~Vek424F1GV1tE4`Zuqs~Z2G`lfk$608ipf_HE!Y~fIS`I7A=v2qjZDMwVhU- zEY+(Q_ci#BaiS}UJew`t&?fW(`M|zRH94z!%{mjT`^$HUI>n9*glMzc2CDXm__%9F zPPlF9SpW8c=;4JH>ML-p?DCQj%~oTjEt*?xLYDJB;9(-GOSJQZiqFFBgS3#7QCc$V z3=buh#A zG;lEX&xZ6ldb4@(xzha2NtOI|CQep&&@3uT+VJfiLJu@r48c%SssPyYC&bfn7P*jZb|1pJ8B;T=bddfr7) zcj}F?#gjnyFp~2Or{^fR-_h|KXE2kBM#Nh5$DD#)z(ZIX(D}KdqPcHObKe`R< zZ;h(a8vBs2VBHn;X5~ERhtWHmN&Lhdjh2tPdK&t5HVFLvwzLMhi!bPUyO8U9JJj1;203S#%A>p>5MIa z-27yI{W;jB#fs=$ekvhk)PX)d2#RITdMM^0Jq`hb+o@B|C7k-d4W%`kH-yOjiB`Qf z0g-r>vz;weAJ&~s$*o5@QPQ01Rtr7w@=2A-MAoFmjCL&=$g#M0sG;dF8p1Qfsr($-~uv9v= zp5&3;Un}?Gz3SZkrkwb;Vl&B}O}(Hf`09~C{D2xhv`G3fbv$m3{9^XiEmJ2|x6RU< z@4dgQqj#@SRo!;&-ensG1a%~j-cHg*9XDHXe?(A|>rnt+h@=5k3h^v83KGc+xJ4%` z7UDincNOVSsGWU`KdhP01!nF-i;lYeUmkgcWQeHZ)qw#t3H>2g#h(%xg!O|8OqP|D z7VtyJfJUO-v8U!`ofgDL^BNi^GGqGUp;VU}t#kua9;AdUF<-KD`V{B!b)x6BFseSa zG63DZO(@Pq83@9xYqMR5M@wS$O%`9j0rD{LGwWHa$xcaNgdTenEktCRzonHjb|1TK z@T6%`^=$|li_pUK7TEt1i~g2L<}z@DU&(xw9tNEk+2y6-^6``%E{((va$OsE{Q?ss z$20~uIB3t+&e4j>)21MOSF`1m$(n@$y*0(vOWr@OgweEpi83Ff9xvxD%M^pYr!nB% zs6^mIM{xcpA_g|}-x)0HUIgPL(5z%|&vZb=e?$?eD@F#_4K}iX(EcN4kZ##f0PDI3 zp;H)O3<9p{p)f+4M8&HXdFk1F-FrPpy>3WEYkRu8Wt|Hd%G>bqwk5f|f~)-wu`tbW z=c}}Z%+m7LGqwEFx8R$yVi*o!RQhHoWs>C}(WZy)W`|~(f&DX~dKEp!Z`h~If@2vp z`oWXH>5wDKtM{P89ayilQ02D3D1A)R&!zKnr;DQfBVe)EK`Lj?pQkYUEA^S>K`PyU7gOO!J4x%Q)qV)|&&05$1 zejksBdddssfJ5d|Z2!H{iCM6y0K?yOS$^-tk*q}y&18Sc#*8{mqRuG6gtJpMl2Fz_E zs0>d~Sut2{1@SlS31DWWu~Cc(Lg9IVfVrR4`rZGZFNyGOUF8sPet4cBG}?^(44nQV z&2xkxbpD27Uj8cgAvp#r{#k{0ei$vmqXFl{Qn-nh3wkkp#45@g)r|YAFR+X zBB+^zh@@c_E!eDAWK3a3q?_i(8VllA-6@vEx)E80wyD!B%unqQa2bYY96-;&9U1Eh zv05i7k?$524;hCMH<1KzbgjW2UPpk~#l8!oK0b=D`nle5!79Xz=yN?Qowk z`}#f*xJrx#IAY>fEvP1|$|PIb(GNFzgR}hlFbAeSm`>|RjT!%~j6NB(0=AHl3FeTm zRVylLAaRtN7f40W_GqfI>idh#;^CTu5u3SSmxK7JI37xl~n#o za)*bi%iaT1T9481|NrOBfG31o;c6Yfc*kJ8Yq!lK3Gn~)uP~|kUo?y97hxMiAVKc9~>JqIi`SlR+P zekGeqkX7(BL?ZB1(&UiF#kolb-H7O*YKzzFIa4#C2|D)peWfw8Lhth_IG%4l#{G1Q z{l|@FmyiOK)s@DH`GQeiQ0s)6w3la&jdj>WBEqiszI62d^tQl`s>X-9Z#R5Z z6?iWF3QI7~j^2Ov9RzXY1ihmeX!s1)6hi+Wew~{zx&t)`&@lt1dI!2SE0I^B^|v;_ z19FiR_m7Tf?_YoiqKSVjrr$4sm`axN?2{tHKNzJI7zO89LDb$+R(ee-x`qCI;^S1U z>QBWVx4a7d|1=Qazu?Hb?`hTlLHnUU zY*>w-+GKDW(^RY1vHlv4rQ!Xqq_0+**U0h#;Z@#Q81f^YIpi?@_cy<&{O{b7GvD?! z|6_&>9q*%ka)Hfzx5(}wQymCyW2`akyKEbZ>$_P$O+>MDlQ~zTbN=|=7?fSEp8}Pp z-&<6a_qtt>x{L7{vXBjahu7hCWT9_;7ry>1NjHO;(%!=P+65~~GZF3{ul~?$FoCj> z?e^Y5M=rG@#@$rS^;)vx#|Ge7EG4C=Q$}0lRQOdUQb5L*hyW=O;%TDg{L#km|C#Yz zCoG&J^onp*iE!bvO(&Hs%xAH{iN`JhTJ$20Ck|a^tT>{WTLp>{~Dk%yGisn)%9^ z9yL7YSpyTLp=pz8kHW(osF0SH*b9D4)oGILT68F>Espy>HA4jVT?~~cGpWKZMS35uWG=fw8^^Gl69Jd3e>X~pkp$9}YGM}t9{Nd`LmrL|^-dDq*Y9VJr4JRPFN+h`L6=hI5AtV% zyN@BiRRc^}k^1hiQ4mO;$9mF)tF@bJ;sTxCBREqrDg>BwQD8&1)Sk4q(`#YArpbGqbGiUG7oFc4s0 ktP^>O{r{CyBgQMd$*O0ga^9Zvzn5GY2}SYpFQCBx1&AI3aR2}S literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/summary.assets/sorting_algorithms_comparison.png b/ru/docs/chapter_sorting/summary.assets/sorting_algorithms_comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..28bae7893a1bad3ea167472028aaf3a8c355aeb9 GIT binary patch literal 41806 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/summary.md b/ru/docs/chapter_sorting/summary.md new file mode 100644 index 000000000..b0c6c4be3 --- /dev/null +++ b/ru/docs/chapter_sorting/summary.md @@ -0,0 +1,47 @@ +# Резюме + +### Ключевые выводы + +- Сортировка пузырьком выполняет сортировку за счет обмена соседних элементов. Если добавить флаг для досрочного выхода, лучшую временную сложность пузырьковой сортировки можно оптимизировать до $O(n)$ . +- Сортировка вставками на каждом раунде вставляет элемент из неотсортированного диапазона в правильную позицию внутри отсортированного диапазона. Хотя ее временная сложность равна $O(n^2)$ , она очень популярна для задач сортировки небольших массивов, поскольку число элементарных операций у нее сравнительно невелико. +- Быстрая сортировка основана на операции разделения с опорным элементом. При неудачном выборе опорного элемента на каждом раунде ее временная сложность может деградировать до $O(n^2)$ . Использование медианы трех элементов или случайного опорного элемента уменьшает вероятность этой деградации. Если всегда рекурсивно обрабатывать более короткий поддиапазон первым, можно эффективно уменьшить глубину рекурсии и оптимизировать пространственную сложность до $O(\log n)$ . +- Сортировка слиянием включает этапы разделения и слияния и служит типичным проявлением стратегии "разделяй и властвуй". Для сортировки массива ей требуется вспомогательный массив, поэтому пространственная сложность равна $O(n)$ ; однако при сортировке связного списка пространственную сложность можно оптимизировать до $O(1)$ . +- Блочная сортировка включает три этапа: распределение данных по блокам, сортировку внутри блоков и объединение результатов. Она тоже отражает стратегию "разделяй и властвуй" и подходит для очень больших объемов данных. Ключ к эффективности блочной сортировки - равномерное распределение данных. +- Сортировка подсчетом является частным случаем блочной сортировки; она реализует сортировку через подсчет числа вхождений данных. Сортировка подсчетом подходит для случаев, когда объем данных велик, но диапазон значений ограничен, и при этом данные можно преобразовать в положительные целые числа. +- Поразрядная сортировка выполняет сортировку данных путем последовательной сортировки по каждому разряду и требует, чтобы данные можно было представить в виде чисел фиксированной разрядности. +- В общем случае нам хотелось бы найти алгоритм сортировки, который одновременно обладал бы высокой эффективностью, стабильностью, свойством выполнения на месте и адаптивностью. Но, как и в других разделах алгоритмов и структур данных, не существует одного алгоритма сортировки, способного удовлетворить всем этим требованиям одновременно. На практике приходится выбирать подходящий алгоритм в зависимости от свойств данных. +- На рисунке ниже сравниваются эффективность, стабильность, выполнение на месте и адаптивность основных алгоритмов сортировки. + +![Сравнение алгоритмов сортировки](summary.assets/sorting_algorithms_comparison.png) + +### Вопросы и ответы + +**В**: В каких случаях стабильность алгоритма сортировки является обязательной? + +В реальных задачах нам может понадобиться сортировать объекты по некоторому атрибуту. Например, у студентов есть два атрибута: имя и рост. Мы хотим выполнить многоуровневую сортировку: сначала отсортировать по имени и получить `(A, 180) (B, 185) (C, 170) (D, 170)` , а затем отсортировать по росту. Если используемый алгоритм сортировки нестабилен, то мы можем получить `(D, 170) (C, 170) (A, 180) (B, 185)` . + +Нетрудно увидеть, что в этом случае студенты D и C поменялись местами, порядок по имени разрушился, а именно этого мы и не хотим. + +**В**: Можно ли поменять местами порядок "поиска справа налево" и "поиска слева направо" в разделении с опорным элементом? + +Нет. Если в качестве опорного элемента выбирается самый левый элемент, необходимо сначала выполнять "поиск справа налево", а уже затем - "поиск слева направо". Этот вывод кажется немного неочевидным, поэтому разберем его подробнее. + +Последний шаг `partition()` - это обмен `nums[left]` и `nums[i]` . После обмена все элементы слева от опорного должны быть `<=` опорного, **а значит, перед этим обменом должно выполняться условие `nums[left] >= nums[i]`**. Если сначала выполнять "поиск слева направо", то в случае, когда не удается найти элемент больше опорного, **цикл завершится в состоянии `i == j` , и при этом может оказаться, что `nums[j] == nums[i] > nums[left]`**. Иными словами, на последнем шаге обмена элемент, больший опорного, будет помещен в начало массива, из-за чего разделение завершится неверно. + +Например, для массива `[0, 0, 0, 0, 1]` , если сначала выполнять "поиск слева направо", после разделения получится `[1, 0, 0, 0, 0]` , а это неправильный результат. + +Если же выбрать `nums[right]` в качестве опорного элемента, то ситуация станет противоположной, и тогда сначала нужно выполнять "поиск слева направо". + +**В**: Почему при оптимизации глубины рекурсии в быстрой сортировке выбор короткого массива гарантирует, что глубина рекурсии не превысит $\log n$ ? + +Глубина рекурсии - это число текущих рекурсивных вызовов, которые еще не завершились. На каждом раунде разделения исходный массив разбивается на два подмассива. После оптимизации глубины рекурсии длина подмассива, в который мы продолжаем рекурсивный спуск, не превышает половины длины исходного массива. Если рассматривать худший случай, когда длина каждый раз становится ровно вдвое меньше, итоговая глубина рекурсии и будет равна $\log n$ . + +В исходной версии быстрой сортировки может происходить последовательный рекурсивный вызов для более длинных массивов; в худшем случае это будут длины $n$ , $n - 1$ , $\dots$ , $2$ , $1$ , а глубина рекурсии окажется равной $n$ . Оптимизация глубины рекурсии как раз и позволяет избежать такого сценария. + +**В**: Если все элементы массива равны, будет ли временная сложность быстрой сортировки равна $O(n^2)$ ? Как справиться с таким вырождением? + +Да. Для этого случая можно рассмотреть разделение массива на три части: элементы меньше опорного, равные опорному и большие опорного. Рекурсию нужно продолжать только для частей меньше и больше опорного. При таком подходе массив, целиком состоящий из одинаковых элементов, будет отсортирован всего за один раунд разделения. + +**В**: Почему худшая временная сложность блочной сортировки равна $O(n^2)$ ? + +В худшем случае все элементы попадут в один и тот же блок. Если затем сортировать этот блок алгоритмом со сложностью $O(n^2)$ , то общая временная сложность тоже станет $O(n^2)$ . diff --git a/ru/docs/chapter_stack_and_queue/deque.assets/array_deque_step1.png b/ru/docs/chapter_stack_and_queue/deque.assets/array_deque_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..28a3a5828bd6e439c97c1141fa39d0202ad544b2 GIT binary patch literal 21385 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%0A?NwJyPdt@sI+^_&)@;Bo;8W~5Pt@*oZugl$|mLT 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_stack_and_queue/deque.assets/array_deque_step2_push_last.png b/ru/docs/chapter_stack_and_queue/deque.assets/array_deque_step2_push_last.png new file mode 100644 index 0000000000000000000000000000000000000000..74b605fab2c9cea7ae0924847016fe3d779a046a GIT binary patch literal 16235 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 E7c&uuz5oCK literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_stack_and_queue/deque.assets/array_deque_step4_pop_last.png b/ru/docs/chapter_stack_and_queue/deque.assets/array_deque_step4_pop_last.png new file mode 100644 index 0000000000000000000000000000000000000000..32bc76fe680777b2b455b358a59cf5d9107deceb GIT binary patch literal 11002 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_stack_and_queue/deque.assets/linkedlist_deque_step3_push_first.png b/ru/docs/chapter_stack_and_queue/deque.assets/linkedlist_deque_step3_push_first.png new file mode 100644 index 0000000000000000000000000000000000000000..bd4b412a5958846a90b8134cf654f6854ac8c96a GIT binary patch literal 14419 zcmcJ#c{o*H^fC`_mB5J&wb9>Yp=cbT6<0Vti3}G^t4zQ`4|BJEa$b) zTn2y+eT7?b81%9B`iKqsz`JOhx&y%ab?*x= z$BP#)^78W5Kg4biwomIYDgW;N2>=nCKcjKQtM}i)lv|QAK-zpxLJE9A(W`+y3PcjQ z!1d?7_O)c;zB)y@q6t5-8T9~k;{V@%)cE_8+^Eh)kgf1GgzAS z-d<_}FMsB2C1UTdr=B3rU4Nqw)zHtiFGfO3EnEZw$&f@9B0<<{kr2cY^WX>>OTe}& z%98h|XnO!_lT<<_jI@vB) z&zIM_H9*jyF!k86yPK=GkkdOT1x83Uqdc$pXY`M<>)I8<=hnmWeMYPEdH7F8_E!3Iya1+W$(PrVmm0tH0Z0DL z{i`Z!G+%J++4`e~NrhTp<1dWFxg@wJqF$@6ODFWjqCDleke*%KY^<|+3tR##`#bjH z$ZFgE&L$A{R5891M;_Q#y1Lz5Bctg!8SwT;=&!BIt6Gy|;pxKCN3XFdR91F&<@oy@ z?MtG*8{|)Xu`s-Nz(uK+St*2@M5_V!M(pDuo%N7YF1n}AUH*G({&IGfUu|`;b-`%K zi_YtglF0Cf;nWkUj zmHhGI90zwI(thsV{8e|5vt?bO^4~xc3&s*v#$-0FhZuS4#KZW2w!-tua)>_$32>JF}7q+b!4FA)LGJ##vJKjAu~(Q8RwiK z){ynox3T})v(qR&91+IBkHLMwNF*XK4wnXC_#lG(AI(8AWGFppBE!tn;=E(0s|EhRyPVG0FFC7uzpIosTzFmERV%NJJYjzDPzpz!W5D#FLIfh( zu9%!*$U*U?y@zwns1#zR^yoZ{+j`1NmUg!MR30=j4T7KYZ>XKZgfC*kj1P+-L?qCQ z-XtFKIf!J%=%uDY7W%7Lf--^nffUB~sFQz+m+ab*vkhhP4<{O=_i zx;Z0x#x{j`fjZktRwPT>b;MmJq z;>9`|07|q5lcD0Q36Hpopnm5_T%XA^Ib^u#;bts5iDm(YujCf;yi+}vum9tZ##p;v zjls)jA2_Lfua9C%m2>i+thq%)Uvh50A({(<7$|$09b@>dLw6 zg)%uW^}6N{+yb6jgFRRatcy?o$c?h6+@{z9bwL$NPEmwf1)BAHQzAW>i>h~eBLt|o z{5J+-()tt4#vrHg08e^l!6T;9C5574AVN#yK7iS<1*xw;nf?e7T3|SJ3e(TKO=XsC z-rN}-nP~zQN2gkvT?tsP+w?saDd`LA{)ozJ;RI-Ss=Gv8`0tc*aX}VgF`dHpOi!L?^^*5pqKUO;B^==Cffc)EK1)hi13j7C*WE zikb=EdF)o^G1k>0(r>y)dC5Th|HxVYXA0X<$bV(*waf;;{I1{0Ng|N+vQl?6kQC$| z1jDzPcnVmg5#&(X4wQ+k0GM%{AUikfCijtrEX#0w7o!6&vw3C0)jx#Of?A4a^|uk* z<%V7O|1G;CgR^53Dr(&SmOGufl#|ujeCb}cm-vb2o+r-bZX1$lCrSbx=`i)l)ki31 zv_ndWE)FTr0Cx!N>1}WLUg~Yow!0w|7OZCmE65o=0&;{Zy8RVS&y+e9(S5i+wM|dam=6Lfk zNw>b6e*q&PSyo#=^<=GIE}1R#zW1XFxGKDOFol zf4`@~3j=V%WG#b?x==q)L{3ncTjs^>-(le8O7>*Q=GCq8kJFAljs9iNNOXUb=wx$C z^dp_1e7L7;x%6)oMGk4&$^-#z>x1hSyTQD#;Dxhrf>VaQPZ1lLu_D#cv-gU)oMXU< z6yo~wuQ|iqNBR7vzU`BJloG{2N#}tpm!S1jjMuws?ZRc+VU^*5!8@hrnAcx_v5L6o zyE}M0f%)Ex8*T}`%7Vm0S}E~4nYv@eINEw8Gr9j|$i{R);!f2vLl7HRt3cFI0@dLl zO@Jz;KS`gyHQx2C$LBC|_1KBrQR98Dn;UBF#5`TsJh`bUj$~B&pOnSIoe{YFWWufr zvRmjW)BCj7fa~n7L~X=tYqw>e8VF)3PS)XkQFCUFJ(m12SkLkx7FiZ~xM320}ddcFxWo;_Kw7Czvh4RF+vRey0WE0a< z;v{3ehFfeEJ}YDG^E5y_L6-3`*%XIYG3VB=*PgepqZ^x z1YiHT4?3JNlJH-nQi8kG^lpV*>h;wP7O4w})H$S{d+z%ru9)R>$$_m`Actl__DpgT zOVZt6Iw71@GajJv5?|o+!9d5WgZ7)e{gFwofah}=FrSf!a|7g|2rce8lXAZ`fwL^k z6e;R=d%2I%zdK7V3yo9_=vKOhy>yDqeo&v4^F!bYHIdO^J00s~0`-|c>mUj9>|_J= zYsF=zYc4}$r<>!R-_q#l#v6pDIbRBsTU#u`mipJ0hbEoSAyVhw9fZ1uf3dh>;D?79 z=Y&PsJa@?Fx8m^zWfBcihZU6idzbQ(74$uVfG%I|zd@s}gipSoIA8jc<1ffZUR2jx z2n7Q>E?>T1zm3J=3>;=+qh0l*z!Lo_Myu6*848P%;)U4+2a_N%c;ZS z)SG4XJ37d4C}2WIML8bZ)qwvwNM^g?Td(EL^A)iiNgD9D6nLb?fo{CtsKU5H>! zM7q*bcfDS9mVxugoFtvs`=@OZ{IAsyP<12j`qeAtnCMuM=#|uOInB`|_0I z8kqi39(kJIOr7*g_wUs>wV!4MSGvm!5J}iIZ`eWV!A0a=N4_1Ox`kxa+`}C>0lr`dVb<$(ocx*jXsvCQ${iyNy4_zVVnJLqseR@cf+%M;V zAn%UNiKA17OySVytB2UhPw=f7mP({7fB5*fpY{e*Mc5uyeZ(yqBrT_Pwn&mjAy`3{ zdrpaiT-b=o-A{>iU;W}cLuPi-MV!N-eIwtmk4KI{q9h_55GmKK?~w`|O_E+EP5N1u z9QGS7@oZ`Mf<0)S%j@p~85Th| z_N_%T#zD_nNvI_bqv{)6O8}TZl+^P`LkjUg(^ae4KkF&PJFwrBUQ~W`($I|L14J6n za;2t&vMUbF7(HkUcz;ZxuVCTm^Th`ksCgCc>l=tsAio~-4N{>L|N0)-KsHu-x{t^$ zyG0R^eaB@I|0^)fepgFkiQ~y5Ry~9Foii+(Vvmj*w_m!lHoCu|CLEn%wTO`if~g~k z9+^E{c<{mIaU^nu3Zl*(I(4o@!vUN@K$JDs21@{LPZ5k5+PZ@E8$@?$1i^(S{>{g&QBtmAGsC zThTo%h@!j27>8tI{V}H`q61gFcuIY7>Ivw_7dD9$4NvXC=&pEXmg>wBG|_OB7VV+ z&-x#J^n%VLKAE?)H^X7&(@w0?mrtB&oN1GdKi2NK@(9jwz%Jao{?dicRlLs$WIN+J zC0JU;=nT@Zo}avCaAVL%{*4H!==5dV;?SHX;kQ9U*I?-*le>ZP;-aLYv(FWW@C()=OQh~kg$(V_OafA;#h$8$Gg0MJK#)AJK3uP|FaI&8^ z1C~Ivi2$X+2amQJ|fYsp`kx0_+3e?)D zSf2}lAV~Ao4rg9tRmwpE28JIl<;8ZzP$oM9Wkmj?YO!M|IWl{nC6tFiAigo$ebUE| zliQ=v6gcg>vq*2_%7ap8RBW#rQy;_+CD)8#m07=RbAOQ~Qnz68=BwRJGU*AqGy!zp z+4N=*rT&A-4|n}O>98}$bI`m3Q`wao@V+6WT@y25vkA_LZ3VVc*aP=im%PNRRUnGZ7D8RsI)z zJTlQ>w(uY}!JDqXoXtX@L_^s#Di_TGiNpvg^3{WFU0Por+#2GsC!-SFqRUO$n0%GV z#*8D#ai+OcV5T$$JE%AUfp)g-igP};RJ>}zg+M^}`ju~X#o^@qXI(}`TH{4BsOe+9 z&hLs)iI5PZK|*BpDFZS1Aqp!c8I{9VG)1Y)4hg@c86tARu|D2#Ve6CSfhZsiGEBT=tF{i}nEoM}yg;?!6% zsMxVW28jeBHCSaGj>e0~soiJ5Qj#=eKe!?b$*~b+j*#NvMUJ!<6x{%68G|;|T03ia zP;bI|b#7_F%ok}7SdLBAMxnxyFRVvmOWjI&?x)iC2q^@aGD8HK0y@7e?cQ(tTjy_+ zkkAoz4q7JtK8BKt6vik<9&|zW`c;o%mjvgN5~fj2nwKcN-@hK+%V5>z%(vIf9n6YO^ybdfgpD0Y(e8RUfY zW4@H#51eTY?v4+4aR`ds6j=5Y+UIme{}cOO7$%TktskXe$Dh!YLLkRaI(sB;?=;9l zd|6d?q)oXk2Api?R=gFw^x7w%rHAnr6~Hvh;9n>j-#GE=IPnDq8)gD=O~fdv1plz zZw*mDjD~Hqq2+q1R+qC-w#d)GFUxdm-XLb(Laqqz{7b4hmbotF&{omIPIJS{o`$5J z0`;rpseIv^f%@t?4jXqu16?jb5$pIleqPzBoI2;nPR~={`AV*?Q#1lyOrdkJpZ946UpoRA?qx#qn~>Uw^57@4^s zTdF#V)(iVl7=_}L#>#m#SB&*6mxoScad=z-PjEM@KycgBl{X)R(#XuRJIT6roHzmp zCz)M7DrNEh+cHa~0h>xa5t6np^2}M!TA!c+hi^T*#Cseyp>LVmzb+X?a6p=uVXo;Z zN8xLM`$?BKVI~eT_9v5pC`nrzad!4;KOjl%VNO`SDwfR~1VnhDx_^F0E_0G?=o>e( zCvxmJ>bGXtiQ-~ZGv@F3IT6fck>v@?-%9 zty-q{NCRXHi|x#^=QuI^;Px28kIldgM)?|!1xRUwGQK>DyY)Z$WuvZ31Md?l+ytg(Bnf= zrk+0Xm;q>}s8Caj*7=t*{3gUtQA{GQlfY<+Fq&qXDi7m`9LCW4FKmZS``4O3C zPpb*Y0|s=y@d`-UT+()R;cGuX@}RbTo)6q5dY^~tA8D>aY5Ip=O_M3?Nb4OS-W%5GM>>^fsczDDnQ>%9eAgwZ>gf;X*ni+^Xoeqc|SgO|rfjeL8;Q>e7zuP1(o|D)# zZg69S;GqH*#8LSLLDVqi*gj?rB{wK1DNZ`R?HBp{yHzkuEJnrw}A`(!YwWdr94?DZxO5hzQp~`*e)Id?&`u^h* zfdGT_iiOA(qeuI&_fbXT24+oNUDxjP&l`&Lh0M8Xprqt?ZCQgUcUOoEux1L>S{l9O z4rr@S11Dl7AJCxmojtP}4|k(i=h&@oT#6aKXnS z(|0m8YEg&l>ezFMxigsfJg9WMF#USZoXXvtu-RpI`ne^&^xM!e`d~mERHhz3nz^Xr zeW7*ke7{D$oT7Q;N|>1ZM**cpf{Cv4Jj=POj9-=3Yi~1xoO_Cg6(ll+-W)!a%Gx|U zoyqnt-x?zKSq~fTcbL(%>oi)nbdQ=9f>cCjSBy_vGc!X7#T|KYUgwg=E79XIxbqM1 z(`=%^{Xj0(PvH8uZs!PjF!dkNCBH{fK+*s0W-l=CNoHa&1EuD>*85zXvHyO0p4qe_ zY(3OKHE+Rqzf|cY6;}}D7iHvnLDr>UNaNfDA0h|Y{(8}7(p1+3I=W;XM>pRndB1!n z2bL!{UR^d6y;qad6Wzm*h;i76+OV&$&%`VVyvY=?=;j7mPmG6qDA}l2|7^x7=RI0I z<>o7CN?%7cumqJ|atRCE)=n|=#9Gfa$va=59};G!R9@t=dZSX4^W_!Cj$(AN52bT1 ze9d44NvGzR#QX?5@=LFhiDw(O-o!L8`;9%G}J6q0-(_Gj|JQ9B)*x&?7@r(r5 zTx+7)Ih5dgc%MB){UIp>ee;-?D}UMdE3YGlkjqO?P7Idzzr9(mz;N&qO`s;dxU)Dc z)%%=4W%P>Kb$8i+VHkKqA}@zG(gRCZ#9gH?_65f@ zA;HbTd*;jBS141PW&Vc1AUt=0bqstdkH9{Nf^hy8GC{4t~$Y@*YDlqgc_4qgkA7Fj0D5;>X#BlqMUwxZR!C;C+%}E{{ z*h;|&jDb6}TORo37suNqxtLBcHs*eic>g0EKPJe{?d_4o3DDj$fkLbl25<^w;)xTv_U=ZI+N}T?MDFEz`-@6N-OtlP%w&osMj|zw= zxlfchj_wV3s=omMmEq=J(Yi|c%aXgcP2m^0m;Eaomi<0@SjTXza z4t#2T8wWJ~F>|uRvn@@m=RzXtsLEXUjg#P1(;5>9_-^>8*^Cs9r2mH2#D|Z9HHBC0 zRs=AfEC2HF!C8_R-UGc58un^wlB|KsB)7c9X{*WiN9#m1(KgI@{b7p z&|_^~kvlrhx;SW@6jA`wm*W8&$`lrn%FyY`ylZKOj_rj+i~NSej2jD zK#LBibb~Zj4VIC9(PK#ea!7L0sUL3@a|P3mjyw>seUrpK$AKL1reHrPmyUL2oXv}O zSK1T=jMqQ)D|swe+Q8*%TkL-*t>)<0IUv7a_;_U~^MsPWgoK?Tdwkc^6?K*#(rgLPr-TY zk&xBVitOQoE{qbMIMPsZ^jQ5|>cnZQ)iLre5zM`JNAME%(?FL#&0K|AAAzwES5Q&x z0=WWdWTl9wcF$9Hm|FyhNnOXp@7=?bcy~T5h7JD?^IQ#b25qOYD{Ob&S` zQg7j%-gt}4B)F*4)K!bMmHC7Ctr!*4_sU!j!2<^io@rmmbQ)i7E4hc*i zoot&qNuBsmd~SpD*PV*vdT|UJivlz;{ZE?cN6)!SMQYaHq62SAYX9JK5+P zB!SJT$5N?u4Ho42$lcuiFubh(E6;?J)_M?A8@0yF_F@GLW>Va@CDJE-FK&kE{?vm^%o-*h>|oAJCXN66Ar%DEw#J}#AI{Cf@$0K3bGn; ztMGv;ODc*)q&Ch_)}K0!?N-><)M_W?Uv7CH<|S99|~q9iQt9M+_qFAhDhcnoSD14^L)5#B?W(%l;)N|F_$ zE*#My>;VzLPVR&&gUy%!81nWA3KEDN;-t_!Hy&jLC{GC0quoS5eMGn7novQ;A+#L& z;sULJbkZNIf_LH6J~_*Hqr&ue%RP;|)^oz(UaHIPgXJ+lSK!5JBiC18x%zH?&HCF{9WX zB1xG@^0dWb8}S9616ucz#IYt7K!M=-{ql6;9>&3W?!+cd0=em%EOUMZo!eDv92m1> zxeu%y)l*iqxOoS~&R*vD8bsDXdY?|V2iwWcWmDSx^(pseUtx|Bc{pft`*LxF1JB3& zjt{+NlRZJ8yRQaCWKXdZrK?0-)mnsn4k;A$9ZRIg4CkAjUau$#%&rU2 zWX92BdD<q~`{&95KXVV5~e;@a8U#9km~mc}r6u z4x`p%2pKfIVAzB8q$vYE>$>YFNC;U3l>b~|7e&uYlg}cLoacrpSU9%|Hkuw5ZfXq9 zL@yxVZXKqb7&`C7^Y9LXBzqc>Ie{wjOE@6M#>EI-F z*0s5AKlwm8669P!c%f#WhNYLN4J3k;KF`F!le|!`vzW-lO&`tjkNVGT z7DN`wG#gl24TVb{rFu)3YM=&PbBq7`DwOB6nZZVAK1yn9IF*enkXrCZ-Zk*-g$N7Q z&j)4kvbw@PITy?Iy}LmUTM^O;iD>i8AA2PuRSlT z&5XJ#>PkG2AX+LVUg3i#(Ce4Ddyl>Kn6|XgS}E=p&Pb)w+rvZRKVy)(KQbO?`U8jK zVNaXfOgf_q=jP&0*;CihI_d%J+p@bKw2@9;gUEj=*`Jwt3dBeuz$zA6J*WATFKCU; z0atJukuBlg?h$0t6Jg&CVu9-7`r8RNAk|Y zc}tXxYZD#xIU0(lSqQ$Bn?O&#YMy}8A#Cu&62_(1nBnS#q1Rtuc@~NxbdX|={|VH+ zO+LYQ?bT16s+-&2p31RH4F~ll%MFjPI7{ZY?ZxBoW&{V6{28``1fk$nuZaxTYGW+U zSzt{LtEmF4VUKs0JaGhzahpztx7|~*7vbUyw4M*2T%SG%L!E(+V@CdnW1pMuUKDsq z+5kgLt1Hz3PtZ%OnhM`;tL~WxJNfDKEuN=JURc~HUBUxzguA^YNC?vW1dBsm7uyf; z?S)>btL`obZ7=SgL1IOw!-=G~SCA#hsG-WSo-*XBg^w)>m-~vhSy;t^Zi)t!T;3$0+<)>{uiLhXOX-DhP|kbY9DKI8Owyuj3Y?nWgXz_QU8l` z9?^?D=<;jpf6#)l%Kq)^TZ8e@Xj(wC%>_h4Qfx05Kzn(Fgcu}({0BPvH_4tJXd@a( z(Xcrb$)5ZlLOS)<5K$ZZL&110nE*7d^7wVJ@>^DjuD#GZyauem%PR!rnC(u*JMR zo-^fg$9Z+GHq5lQB}sWOARs`fTA|Of-dK2P?b#tUS;0>T1N>JZ3 zdYR&Ox37?9=piKahS&4Bz~70}y70d@rvB5$w)gHpd2HN_1@6DFZ|ydY18OAG9N!}C zh_Y-fRUhx7+EZuz@zN#p+_WqjPip^YV9xoF4QF%%&@w2dBS{2X5g?>Yr684VEe534 zUA!SVBTjG`(kcLQPk?MsJCo1sMlZh(o`9#STjA){b{~c{3rRRSv9s< zS!OyaQ6Kd|5O5l4w#+g;76!KYq0IE(Wu^R=H#)e$D3s z8LX*58}-`fWT4+&aQM7Tx%11N1(#u+nXJ(bkZSRnh*pMTL5OlrhO-g}&9Q92`T{cX zOF@F#nQr##h%Um1#~UOv;6R`x_4vk6?`ixTNjUA!f^Yw9E`7ojx*G)OP4<7M*d(ZP zh0AtarHSW)l3GR#5_FEN10Lfq&!-=uu>vhVfnnNN-vYMQ*=9^-l}tgwxnd=()iEqs zGlPCu|NB#&1PoXD$~gbZ2g>)?y(gk~IzXTdRXop3+R2lX=5};WZE11+Hq}ghkSWBr3F=|p%RPfH-Wj#!<$aqlX-&{teJf?*hU64e1WX^X{8nH zB`GqH)p*gVL&prbe{!=uILM89K`8R53W)$X5GR`U6N3W^my4CkIRHex!k#?1HM~7t zb6pEPXv+_ZKrhwCYjuP-TkdUJWc6(bv}g6kQyuo4k6W{;Bk@x4LqJ z(nK*@E$7^H*Ldod=q{*qg1ZovvuPjKthsN4eBq#YKmAg)(}9uD>ldFAv#4Q zf=V~I`u!@M%(lhEDqZF(6K%|fwgdD0bcQW%RO)HQrZQL<_dJEFzt=7bCX&K$IdSlv zCsn!>)|8M>W;-3=TYm<;uI!vuivL!MLsCt_N!u6%2>qSJkpPw^p0{NH2nZkn7(h6H zCH_A(s391G8`tCBE}U=McU+<5j2M6#g^-{7pG2fjpZ`ob>R#}1be{--bOaHrUvb&a zVf3SFyOlm49h!~=0j#V$un*1dz{@C2t?dHoY33$&1RP+YW?T&rS>c!qgk`VyC6$b# z>_pR(S*0iZyJH?KkGj4)5MFrI<<&)>y!3%4v2&r`^}-=*Hs^mBkewc)M1ASr-d!;2 zw5L;wz)x;;`0V#w-TD^4izk6WBDh#(oPA=jqTn=`T)AEcDt{-A#y&bm0!0kuq)+Bu z4Zu*)B$%$f`@_X+A#1%-rWD#pelwhrjx% zg?)VPoO1k7D9?-q{>xod0yb)|*?_Ub7ikyae_?m6)p(q=`uUIx08UT^Q^#jzpjD`+ z4jVt^V>S38m8H6m-&=oED^0gxvafS5<0CDOlNp8EhV0<|Ys zOF$H`yEkgbb~LPJ7#V1EaO?I>;AW;n8=*Tft({U~HC*iGsQ^a-Z1th`cGj!BiZgF) zEp8+NaS&vTrwZJ0>nRr#B^Ge5E>-nBROu zQBfPfYfB)8%cVJs?Dp<5)AX?=ANPZ%%^3ww$#AP3KG*-tf#>ac#>fPhU1aRa&pVwg zwgnvp7i;2+jNHIzbT+E2Y6Ge1%N=iSGad4|?(?^jKV;hNc&wWLFc%_`qr)cu`AChu zb$YeByT3F+>TiO{zfGv1*t@P1HQmzZ{!YS$clbvCH3-_Ec5vE+*QsbBBrf*ZRG<>3_1|eI!S~bq zL`8a&U@)>^0Y;<5QH#Fck)8L|GK}gsVNuom>&NjkY$U@#UN`4~xh$Ev>eQS&;K{>J zT)82=c%S_y6EMart>7-Qc-%4Iy1i0Khl7 zKCO9?<+ge2(5l-z@A*7Sk#;?oL;LrQm6-WY?7xb%)1^sK(7WpL1-q_)^?V2T+yc~! zoxB2XAD{K?tI&KeaQAjbYMRnm_1xeg*AE~ZH3#`OGmf~0{>a+182~#MezK?$PVybK z9D22QCe0*#%Lu3kGu5bX&ZhaKoC*J&k41#9vHP|tLE!((&#PdN^WQ$}rH>p7d&AD3 M)jN}?NxuJo0plD5H~;_u literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_stack_and_queue/deque.assets/linkedlist_deque_step4_pop_last.png b/ru/docs/chapter_stack_and_queue/deque.assets/linkedlist_deque_step4_pop_last.png new file mode 100644 index 0000000000000000000000000000000000000000..3fbe296d18d4b94a90149613c730032149df5393 GIT binary patch literal 11709 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%0Ak=PG_Lh22;6=fXu8xnrofh^V;E&lvce zfeH+uNB|*_=S+0YROkHvC~#rUdm{nyc^883pLz1R)&Fh#;ee>7CfEud3ylX~)kxE& z{B`ou9j~(SZF?a_txCy#Kcd_po%eiv@N(g0C<8H-B0IwHVx@%xF%kawjzP|C|1e|W z|JfFo|E;xgCEsqYZounRZ;HD4+ziK?ey`vp-ndsm4{nIWA;K4o3Q0TV%_QotrmqO# zbX1|Rp4aM(b6RD}za+Y7qR2K_x@i8pZ1Ibrk8xnue6^~kU0D;>lEw9`t}dN*6Hcz_ zzM{F`RX zrq%UGGfT-6UkJ zEz*Vl-BWy4olUImJ(p5N9Dj(HVfuq#$XIoP-qEg+w4>0XdR1N=FE92x|LY6?U~3b@ zNb8z;Ch>^@U%vy=JdJ^9iw7kuQQs6YMnpO&rwf%XYCw~!DPK%x+6e8xJ9ru_%Oafoufb*F7>?M^NGy2>!*DR(> z1>c~d!Whl&uT@^b4+DDqrj=}V#)zmwiH!WpAHHy&;mupW317+8g{$r1W|p%Ntl$$* zru?~MYvZ|?8!#y)-}Taa4a4`xX~_po#(&b{uiE`R`L*%gnlArWmHSJaBAFQNzOnn& zYKF%!rNa6vj(w57ro+PYt;eRbl<%~qF}AErGe?8$FGc5aY%98NDv}KLG+Wg%FcCrq zM=FxPl|Bb2vOxZqf4TF98O6QB4cssZ>(@U}>Ep-T{gf9_(c|<{^tq$*>dV3-tK^LS zEGX-fR>@zNVI$uB8Rkm8>XO2la+BrHHnWB|$}5nu6r=j)ZK$XD3(_*&@0LcRHdSC1 zr5{eKJI&I}pFdf2_i7a+x)z@}rLFeE;Ohe}LDx~6dHUDDy{>KyxbI{$I22JEkt&$G z6Z;q=S~cL6Y+*I5&D^o0-O?l>V-X+_tS9v{=%C4FPJ~Ss9`&|Lpq$+dWKr`@B$|Qc zZfINSjHp_@W~&-Dl*`zihxHaMWk18lUN%40j}0_@fv4WPc(H8UVf|KjR2zL0ZwrT) zsvOZqpgl5naN&-B(}j>^Y+qV;uMQoydyD))jXXS;JN(PF*TFlra>7M@BZ|E2(Uf1@ zf8uUtXiu*2;bfkW41Sm2KQr*oH8u->k@Km|_32FHv3_3a-csB3teKNrO1wq(mcv`$ z6u+vyZ7up}px@qGRUCF}hhrW$Zq(i8{VJ#Gu+8D{`K7JdAa=sO{Hwx&p0X(j_oMq) zY;}Jg^;@114;bLyb?hMsOz+B~|NF}4!*NW>DEB3xKE&~SA2tBm8V2gGRI!o&3s&ND AKL7v# literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_stack_and_queue/deque.assets/linkedlist_deque_step5_pop_first.png b/ru/docs/chapter_stack_and_queue/deque.assets/linkedlist_deque_step5_pop_first.png new file mode 100644 index 0000000000000000000000000000000000000000..6ba9b5fdf54e99f98ac7e904467752db47036451 GIT binary patch literal 10198 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
        wqTplapCt?hM`NO) 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 zдвусторонняя очередь (double-ended queue)
        обеспечивает более высокую гибкость и позволяет выполнять добавление и удаление элементов как с головы, так и с хвоста. + +![Операции двусторонней очереди](deque.assets/deque_operations.png) + +## Основные операции с двусторонней очередью + +Распространенные операции двусторонней очереди приведены в таблице ниже. Конкретные названия методов зависят от используемого языка программирования. + +

        Таблица   Эффективность операций двусторонней очереди

        + +| Имя метода | Описание | Временная сложность | +| ------------ | -------------------------------- | ------------------- | +| `push_first()` | Добавить элемент в голову очереди | $O(1)$ | +| `push_last()` | Добавить элемент в хвост очереди | $O(1)$ | +| `pop_first()` | Удалить элемент из головы очереди | $O(1)$ | +| `pop_last()` | Удалить элемент из хвоста очереди | $O(1)$ | +| `peek_first()` | Просмотреть элемент в голове очереди | $O(1)$ | +| `peek_last()` | Просмотреть элемент в хвосте очереди | $O(1)$ | + +Точно так же мы можем напрямую использовать уже реализованные в языках программирования классы двусторонней очереди: + +=== "Python" + + ```python title="deque.py" + from collections import deque + + # Инициализация двусторонней очереди + deq: deque[int] = deque() + + # Поместить элементы в очередь + deq.append(2) # Добавить в хвост + deq.append(5) + deq.append(4) + deq.appendleft(3) # Добавить в голову + deq.appendleft(1) + + # Просмотреть элементы + front: int = deq[0] # Элемент в голове + rear: int = deq[-1] # Элемент в хвосте + + # Извлечь элементы из очереди + pop_front: int = deq.popleft() # Извлечь элемент из головы + pop_rear: int = deq.pop() # Извлечь элемент из хвоста + + # Получить длину двусторонней очереди + size: int = len(deq) + + # Проверить, пуста ли двусторонняя очередь + is_empty: bool = len(deq) == 0 + ``` + +=== "C++" + + ```cpp title="deque.cpp" + /* Инициализация двусторонней очереди */ + deque deque; + + /* Поместить элементы в очередь */ + deque.push_back(2); // Добавить в хвост + deque.push_back(5); + deque.push_back(4); + deque.push_front(3); // Добавить в голову + deque.push_front(1); + + /* Просмотреть элементы */ + int front = deque.front(); // Элемент в голове + int back = deque.back(); // Элемент в хвосте + + /* Извлечь элементы из очереди */ + deque.pop_front(); // Извлечь элемент из головы + deque.pop_back(); // Извлечь элемент из хвоста + + /* Получить длину двусторонней очереди */ + int size = deque.size(); + + /* Проверить, пуста ли двусторонняя очередь */ + bool empty = deque.empty(); + ``` + +=== "Java" + + ```java title="deque.java" + /* Инициализация двусторонней очереди */ + Deque deque = new LinkedList<>(); + + /* Поместить элементы в очередь */ + deque.offerLast(2); // Добавить в хвост + deque.offerLast(5); + deque.offerLast(4); + deque.offerFirst(3); // Добавить в голову + deque.offerFirst(1); + + /* Просмотреть элементы */ + int peekFirst = deque.peekFirst(); // Элемент в голове + int peekLast = deque.peekLast(); // Элемент в хвосте + + /* Извлечь элементы из очереди */ + int popFirst = deque.pollFirst(); // Извлечь элемент из головы + int popLast = deque.pollLast(); // Извлечь элемент из хвоста + + /* Получить длину двусторонней очереди */ + int size = deque.size(); + + /* Проверить, пуста ли двусторонняя очередь */ + boolean isEmpty = deque.isEmpty(); + ``` + +=== "C#" + + ```csharp title="deque.cs" + /* Инициализация двусторонней очереди */ + // В C# двустороннюю очередь обычно моделируют через связный список LinkedList + LinkedList deque = new(); + + /* Поместить элементы в очередь */ + deque.AddLast(2); // Добавить в хвост + deque.AddLast(5); + deque.AddLast(4); + deque.AddFirst(3); // Добавить в голову + deque.AddFirst(1); + + /* Просмотреть элементы */ + int peekFirst = deque.First.Value; // Элемент в голове + int peekLast = deque.Last.Value; // Элемент в хвосте + + /* Извлечь элементы из очереди */ + deque.RemoveFirst(); // Извлечь элемент из головы + deque.RemoveLast(); // Извлечь элемент из хвоста + + /* Получить длину двусторонней очереди */ + int size = deque.Count; + + /* Проверить, пуста ли двусторонняя очередь */ + bool isEmpty = deque.Count == 0; + ``` + +=== "Go" + + ```go title="deque_test.go" + /* Инициализация двусторонней очереди */ + // В Go list обычно используется как двусторонняя очередь + deque := list.New() + + /* Поместить элементы в очередь */ + deque.PushBack(2) // Добавить в хвост + deque.PushBack(5) + deque.PushBack(4) + deque.PushFront(3) // Добавить в голову + deque.PushFront(1) + + /* Просмотреть элементы */ + front := deque.Front() // Элемент в голове + rear := deque.Back() // Элемент в хвосте + + /* Извлечь элементы из очереди */ + deque.Remove(front) // Извлечь элемент из головы + deque.Remove(rear) // Извлечь элемент из хвоста + + /* Получить длину двусторонней очереди */ + size := deque.Len() + + /* Проверить, пуста ли двусторонняя очередь */ + isEmpty := deque.Len() == 0 + ``` + +=== "Swift" + + ```swift title="deque.swift" + /* Инициализация двусторонней очереди */ + // В Swift нет встроенного класса двусторонней очереди, поэтому можно использовать Array как двустороннюю очередь + var deque: [Int] = [] + + /* Поместить элементы в очередь */ + deque.append(2) // Добавить в хвост + deque.append(5) + deque.append(4) + deque.insert(3, at: 0) // Добавить в голову + deque.insert(1, at: 0) + + /* Просмотреть элементы */ + let peekFirst = deque.first! // Элемент в голове + let peekLast = deque.last! // Элемент в хвосте + + /* Извлечь элементы из очереди */ + // При моделировании через Array сложность popFirst равна O(n) + let popFirst = deque.removeFirst() // Извлечь элемент из головы + let popLast = deque.removeLast() // Извлечь элемент из хвоста + + /* Получить длину двусторонней очереди */ + let size = deque.count + + /* Проверить, пуста ли двусторонняя очередь */ + let isEmpty = deque.isEmpty + ``` + +=== "JS" + + ```javascript title="deque.js" + /* Инициализация двусторонней очереди */ + // В JavaScript нет встроенной двусторонней очереди, поэтому можно использовать Array как двустороннюю очередь + const deque = []; + + /* Поместить элементы в очередь */ + deque.push(2); + deque.push(5); + deque.push(4); + // Обрати внимание: поскольку это массив, метод unshift() имеет сложность O(n) + deque.unshift(3); + deque.unshift(1); + + /* Просмотреть элементы */ + const peekFirst = deque[0]; + const peekLast = deque[deque.length - 1]; + + /* Извлечь элементы из очереди */ + // Обрати внимание: поскольку это массив, метод shift() имеет сложность O(n) + const popFront = deque.shift(); + const popBack = deque.pop(); + + /* Получить длину двусторонней очереди */ + const size = deque.length; + + /* Проверить, пуста ли двусторонняя очередь */ + const isEmpty = size === 0; + ``` + +=== "TS" + + ```typescript title="deque.ts" + /* Инициализация двусторонней очереди */ + // В TypeScript нет встроенной двусторонней очереди, поэтому можно использовать Array как двустороннюю очередь + const deque: number[] = []; + + /* Поместить элементы в очередь */ + deque.push(2); + deque.push(5); + deque.push(4); + // Обрати внимание: поскольку это массив, метод unshift() имеет сложность O(n) + deque.unshift(3); + deque.unshift(1); + + /* Просмотреть элементы */ + const peekFirst: number = deque[0]; + const peekLast: number = deque[deque.length - 1]; + + /* Извлечь элементы из очереди */ + // Обрати внимание: поскольку это массив, метод shift() имеет сложность O(n) + const popFront: number = deque.shift() as number; + const popBack: number = deque.pop() as number; + + /* Получить длину двусторонней очереди */ + const size: number = deque.length; + + /* Проверить, пуста ли двусторонняя очередь */ + const isEmpty: boolean = size === 0; + ``` + +=== "Dart" + + ```dart title="deque.dart" + /* Инициализация двусторонней очереди */ + // В Dart Queue определена как двусторонняя очередь + Queue deque = Queue(); + + /* Поместить элементы в очередь */ + deque.addLast(2); // Добавить в хвост + deque.addLast(5); + deque.addLast(4); + deque.addFirst(3); // Добавить в голову + deque.addFirst(1); + + /* Просмотреть элементы */ + int peekFirst = deque.first; // Элемент в голове + int peekLast = deque.last; // Элемент в хвосте + + /* Извлечь элементы из очереди */ + int popFirst = deque.removeFirst(); // Извлечь элемент из головы + int popLast = deque.removeLast(); // Извлечь элемент из хвоста + + /* Получить длину двусторонней очереди */ + int size = deque.length; + + /* Проверить, пуста ли двусторонняя очередь */ + bool isEmpty = deque.isEmpty; + ``` + +=== "Rust" + + ```rust title="deque.rs" + /* Инициализация двусторонней очереди */ + let mut deque: VecDeque = VecDeque::new(); + + /* Поместить элементы в очередь */ + deque.push_back(2); // Добавить в хвост + deque.push_back(5); + deque.push_back(4); + deque.push_front(3); // Добавить в голову + deque.push_front(1); + + /* Просмотреть элементы */ + if let Some(front) = deque.front() { // Элемент в голове + } + if let Some(rear) = deque.back() { // Элемент в хвосте + } + + /* Извлечь элементы из очереди */ + if let Some(pop_front) = deque.pop_front() { // Извлечь элемент из головы + } + if let Some(pop_rear) = deque.pop_back() { // Извлечь элемент из хвоста + } + + /* Получить длину двусторонней очереди */ + let size = deque.len(); + + /* Проверить, пуста ли двусторонняя очередь */ + let is_empty = deque.is_empty(); + ``` + +=== "C" + + ```c title="deque.c" + // В C нет встроенной двусторонней очереди + ``` + +=== "Kotlin" + + ```kotlin title="deque.kt" + /* Инициализация двусторонней очереди */ + val deque = LinkedList() + + /* Поместить элементы в очередь */ + deque.offerLast(2) // Добавить в хвост + deque.offerLast(5) + deque.offerLast(4) + deque.offerFirst(3) // Добавить в голову + deque.offerFirst(1) + + /* Просмотреть элементы */ + val peekFirst = deque.peekFirst() // Элемент в голове + val peekLast = deque.peekLast() // Элемент в хвосте + + /* Извлечь элементы из очереди */ + val popFirst = deque.pollFirst() // Извлечь элемент из головы + val popLast = deque.pollLast() // Извлечь элемент из хвоста + + /* Получить длину двусторонней очереди */ + val size = deque.size + + /* Проверить, пуста ли двусторонняя очередь */ + val isEmpty = deque.isEmpty() + ``` + +=== "Ruby" + + ```ruby title="deque.rb" + # Инициализация двусторонней очереди + # В Ruby нет встроенной двусторонней очереди, поэтому можно использовать Array как двустороннюю очередь + deque = [] + + # Поместить элементы в очередь + deque << 2 + deque << 5 + deque << 4 + # Обрати внимание: поскольку это массив, метод Array#unshift имеет сложность O(n) + deque.unshift(3) + deque.unshift(1) + + # Просмотреть элементы + peek_first = deque.first + peek_last = deque.last + + # Извлечь элементы из очереди + # Обрати внимание: поскольку это массив, метод Array#shift имеет сложность O(n) + pop_front = deque.shift + pop_back = deque.pop + + # Получить длину двусторонней очереди + size = deque.length + + # Проверить, пуста ли двусторонняя очередь + is_empty = size.zero? + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=from%20collections%20import%20deque%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D1%8E%D1%8E%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20deq%20%3D%20deque%28%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20deq.append%282%29%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20deq.append%285%29%0A%20%20%20%20deq.append%284%29%0A%20%20%20%20deq.appendleft%283%29%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%20%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D1%83%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20deq.appendleft%281%29%0A%20%20%20%20print%28%22%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D1%8F%D1%8F%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20deque%20%3D%22%2C%20deq%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%20%D0%BA%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%83%0A%20%20%20%20front%20%3D%20deq%5B0%5D%20%20%23%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20print%28%22%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20front%20%3D%22%2C%20front%29%0A%20%20%20%20rear%20%3D%20deq%5B-1%5D%20%20%23%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20print%28%22%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20rear%20%3D%22%2C%20rear%29%0A%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20pop_front%20%3D%20deq.popleft%28%29%20%20%23%20%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%B0%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20print%28%22%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%2C%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B8%D0%B7%20%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D1%8B%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%2C%20pop_front%20%3D%22%2C%20pop_front%29%0A%20%20%20%20print%28%22deque%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B8%D0%B7%20%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D1%8B%20%3D%22%2C%20deq%29%0A%20%20%20%20pop_rear%20%3D%20deq.pop%28%29%20%20%23%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20print%28%22%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%2C%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B8%D0%B7%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%B0%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%2C%20pop_rear%20%3D%22%2C%20pop_rear%29%0A%20%20%20%20print%28%22deque%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B8%D0%B7%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%B0%20%3D%22%2C%20deq%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%83%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B5%D0%B9%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20size%20%3D%20len%28deq%29%0A%20%20%20%20print%28%22%D0%94%D0%BB%D0%B8%D0%BD%D0%B0%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B5%D0%B9%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20size%20%3D%22%2C%20size%29%0A%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C%2C%20%D0%BF%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D1%8F%D1%8F%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20is_empty%20%3D%20len%28deq%29%20%3D%3D%200%0A%20%20%20%20print%28%22%D0%9F%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D1%8F%D1%8F%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20%3D%22%2C%20is_empty%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +## Реализация двусторонней очереди * + +Реализация двусторонней очереди похожа на реализацию обычной очереди: в качестве базовой структуры данных можно выбрать связный список или массив. + +### Реализация на основе двусвязного списка + +Вспомним предыдущий раздел: там мы использовали обычный односвязный список для реализации очереди, потому что он позволяет удобно удалять головной узел (это соответствует операции dequeue) и добавлять новый узел после хвостового узла (это соответствует операции enqueue). + +Для двусторонней очереди и голова, и хвост допускают операции добавления и удаления элементов. Иначе говоря, двусторонняя очередь требует реализации еще одного симметричного направления операций. Поэтому в качестве базовой структуры данных двусторонней очереди мы используем "двусвязный список". + +Как показано на рисунках ниже, мы рассматриваем головной и хвостовой узлы двусвязного списка как голову и хвост двусторонней очереди и одновременно реализуем функции добавления и удаления узлов с обеих сторон. + +=== "LinkedListDeque" + ![Операции enqueue и dequeue для двусторонней очереди на связном списке](deque.assets/linkedlist_deque_step1.png) + +=== "push_last()" + ![linkedlist_deque_push_last](deque.assets/linkedlist_deque_step2_push_last.png) + +=== "push_first()" + ![linkedlist_deque_push_first](deque.assets/linkedlist_deque_step3_push_first.png) + +=== "pop_last()" + ![linkedlist_deque_pop_last](deque.assets/linkedlist_deque_step4_pop_last.png) + +=== "pop_first()" + ![linkedlist_deque_pop_first](deque.assets/linkedlist_deque_step5_pop_first.png) + +Код реализации приведен ниже: + +```src +[file]{linkedlist_deque}-[class]{linked_list_deque}-[func]{} +``` + +### Реализация на основе массива + +Как показано на рисунках ниже, аналогично реализации очереди на массиве мы также можем использовать кольцевой массив для реализации двусторонней очереди. + +=== "ArrayDeque" + ![Операции enqueue и dequeue для двусторонней очереди на массиве](deque.assets/array_deque_step1.png) + +=== "push_last()" + ![array_deque_push_last](deque.assets/array_deque_step2_push_last.png) + +=== "push_first()" + ![array_deque_push_first](deque.assets/array_deque_step3_push_first.png) + +=== "pop_last()" + ![array_deque_pop_last](deque.assets/array_deque_step4_pop_last.png) + +=== "pop_first()" + ![array_deque_pop_first](deque.assets/array_deque_step5_pop_first.png) + +На основе реализации обычной очереди нужно лишь добавить методы "enqueue в голову" и "dequeue из хвоста": + +```src +[file]{array_deque}-[class]{array_deque}-[func]{} +``` + +## Применение двусторонней очереди + +Двусторонняя очередь сочетает в себе логику стека и очереди, **поэтому она может покрыть все сценарии применения обеих структур и при этом предоставляет более высокую степень свободы**. + +Мы знаем, что функция "undo" в программном обеспечении обычно реализуется с помощью стека: система `push`-ит каждое изменение в стек, а затем использует `pop` для отмены. Однако, учитывая ограниченность системных ресурсов, программы обычно ограничивают число шагов отмены (например, разрешают хранить только $50$ шагов). Когда длина стека превышает $50$, программе нужно удалить элемент с дна стека (то есть с головы очереди). **Но стек не может реализовать такую операцию, и в этом случае его приходится заменять двусторонней очередью**. Обрати внимание: основная логика "undo" по-прежнему следует стековому правилу LIFO, просто двусторонняя очередь позволяет более гибко реализовать некоторые дополнительные механизмы. diff --git a/ru/docs/chapter_stack_and_queue/index.md b/ru/docs/chapter_stack_and_queue/index.md new file mode 100644 index 000000000..1c21ae434 --- /dev/null +++ b/ru/docs/chapter_stack_and_queue/index.md @@ -0,0 +1,9 @@ +# Стек и очередь + +![Стек и очередь](../assets/covers/chapter_stack_and_queue.jpg) + +!!! abstract + + Стек похож на стопку кошек, а очередь - на очередь из кошек. + + Эти две структуры соответственно представляют отношения "последним пришел - первым вышел" и "первым пришел - первым вышел". diff --git a/ru/docs/chapter_stack_and_queue/queue.assets/array_queue_step1.png b/ru/docs/chapter_stack_and_queue/queue.assets/array_queue_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..93f87a3ce2e4abd0b817f758330f13d530b9b40c GIT binary patch literal 18835 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_stack_and_queue/queue.assets/linkedlist_queue_step1.png b/ru/docs/chapter_stack_and_queue/queue.assets/linkedlist_queue_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..4d5f20928eb1aaa2498506ff8885e1493e171b5d GIT binary patch literal 12350 zcmdVBc{o+y7dU**x%YC-*GwtbOv23&60SLsWFB*+Oqu7|F$)RIk33?l7sRGZ3xmL*)q=U*06##gV zLUUyMum1&oT_cUt)6>Y-i2eP21qFo%4;~yH9TAB{4|n(PYu_3_HBL-Un3$Lp6coI8 z@gfl@z61bRKwDkKC}3v&^T>U^<#WBidK0uJ7$gGdQPo0Uue90T)ae|a3GnOcadu>8 z?AyMCQY=b@ zH~;);Y;0_*GHWM?2|n>M7CpH1b7mahBkH=mqcJrIo)&g%L5$l+Bg4i9Z3|o<`6A+< zRBunNtGN7alL>`YRFc?97M3SI+%Czui}4S>>s9X^JwX~kj5gq)@u;7XmVnV^jEsNZ}LYXiQ=C%~$prtus8vxd!V#VJ7rfkhlg0K`*Ijain!^ zUq{1QLr4`AmI!DDrMB;}x6;_g|7rlLTDh!?ptTGBOs};rj54xY%@B58Lz+3H$ObZK zRR~!apAvUDw?jkASc$tI`uEk}F%SZr%YoY|^N*_;@jkA8maJQD+DZktDp@^!IF@?? zmngUH2l6H-uSoO+s#V_YK8&L$csMTuGq10qYJOtydDV~-b6WWt^KocLs^g0CTfjNd z*(!Wee#hoqba_6~))x*rBN)E1l8DCuwZ?WrjWSy3SZTx9Yx!~_1^x3WpHNsHPV zmx4HIVM8QFq7p7x-lmhUO7xye{W|_-r^&xfym#RWX)-8b%0tr2a#dMy=jbLS?&@QC zY|vP=SsBed?eiYr?aRx2OX*P=oPD=6RI7_Y^5zY$$gSEh2iwq384q zf*NRm^d+8eP{7M4~ECV@A*?j2n>)MPjy3H zfMs6MhYz`Qfp()`ikzGaraAJ)>jncS^1jIBJb&@Butvz9($l2*Si!=Z?$9e+>%+_w zJt@?>DbQ%&ILbZrA?vhwFc%O6&?RBEpyM4zm*qR)_!Z4WY#=dkMkzhbY41;%R_W9&neL%%p?`!*}H*>?_p)3 zG=DKOPc{x1+pktU69SJq&g_RvXi=`kzLsV6>#`q+KcR*k6?Zo6V?f=NYA;QeNnhq(AS>NY81Jq>7l)gaBQY?_>QfC7uZ^t=sZUMog(Od^M+RPOQ=8AeK=kE@)D|j&V6zFRSh&R!LzQcI7v!rW%CoR`U-^O5`1By z4zXru->qGQ`&NAK{0)x7)Mjc1(RFK}PP&bRgA=>X>P%d(rU|p@9JSsmyD0Q-9jnxk zzv>rwX@NVqO3D2E-omH=?q~CN2@RULHed~Z?$2>NH&NSj@Z4gFIjaw~Ezs>tjI;ky z-$`%wsQfFhz^_R#T=Z3JXv-00S?~}8mGlVx^VDbgsQN&m9tMKo9N*V3R8I3W^qbMy zwcSi}RB7DEP#+JWyV?)cp|O02;M=7{#8@yR@z4Y?bWil2qb+RWMB=7XW3EfV6EdDA zCD~?amI7LpLcHN36~T+y8v(^U+kE=;K9KLq#JGiuv2}0?()zaLGG-cam>SCPLA80+$*!c6V%kRlanK&u>f?v;yii=j}3X3LG(Vpvoq4++}V^{a+Fq8s}s)3Ohgij0*NxmT@28qGKSQr42 zAo9V#P&aE;XbggNgIG@z@l%#-p zPk*uz6&mZ3J%HNRM|HnbUZ0&C;pvc?6}xjKzp*%kPH$=ZaJjmtqz*i)x({@oSp_Uc ze4$m9KWB-5tq}p?C5VdiKLEA|R3KMIe@K{bY&M3dqW#@Gng@>B**sztA(v9U?F2~f zTE8q6nQDsmz* z=!@lpasGByynu)pMNASa3Jd`FQ>wqC)w;~94drXRH1>(%I2Lf zkQvTS324A`^pe~_GwyBU<&Hlrc)FujH60SioD8rXc5b+}O#)0hOeVfj#?f!E!6)aG zMhgHo%{wQ@wo6~H>6!wxD_iQ}&_SvB)@F*_l?ZDHSJ*96ECJGbfQRe`YIlOD3#U^6 zidJ}zsz{beMArnHYfb}6b6mb5TWZbNdT zDZtWDM7w+85pH#~JB=f@3r(1Gu(eXDXC0##;h^Ay(?GeZbD7rXd7uMLM1=*fkM?J2 zf|Zv|k{a;kE}+8;2(!~Nz?lhvUl$7q8cD@s)auXT*?f|CVe5JoMKtlwT_96ZRk)DC z0t279O}(0N{2w*oq4t0pFT;m~Nua(C2Q@SmQ+K#6W&px5M=#VKivM=aFkV|7K)&a0Tihnlbkn7spJ@@ME$mp?tlVy01YQHwlE}7={;NGR>=@$k>`kxN=Ffna zD1BPsb0XtQg{!vGqAR)@cP$wosT+3=TQNf7}T9q-I@ai|1bvF)ZMTJnM`=t2%^ zj_rYgTPTcs;t$=z-aDzzEWBtq8Ax~rFEd8~cfyM3r%&C!yM6cT0qZZoPjvh376YApp#Q^zXY|@cp^zMO(l~iWfv577F)p;Q@tvukT@m z&>{~|q!_Fa#+oS0OvHjo)OZak>J>;6ML^OR=tP3?tJ8mIh-G7NylU#erfL<+y!xP!r3K9O(1{xXMZ3QiA1=@7 zY`<#{=<)yQJ{zH^w33f`c{qjBR`vU1-xw_MBTYCgKJW**?B5z=E)d@O6{JM?zRVfvmWXdC~q>w4ywMEbhEZ;8E3_p5s%7bLwI6zMqJ zE-vab5V!~|;9S#o24^eWu|c(e+ybcvvSqHjaCKij+pGRqUS8+ghu_jJER4kFbpeD2 zrPKDMvx3iIUFy=`U&hyIYf3tTM!+rJ7qR`Xdixs6K`%SvC=Mw^n-ppNS?WEY%j>Fi zSv{!=Diez3Oj6E^-k~KvhdQLF>O<$o2zOqy@}fcH$4^5U!#plweyJ!SHp(%o){KZ4~#Ef{*n`wz;i#}yyqRQgN{Sun(^+E0I;#lMjWlRuQE zH6{LZ;X{fU5QXP6&UO9k^@ z2|e2I_R8xz_%>G{Xe)5J!n)HO$eZYj(yr& zWG$#pSZNOw&afgc>=k~GiX8!D7UbbvOFMO zh@5zq{?wHjzyFB5RmK2ke9i4{WDtWa<^L0eb);Y*_OBQF#E%~o{MZzx6`3!yk~WI; z^If5qg3y!|(2l5Yyj}q_tu(cro4TDrTNxP$d%hF0y?mX}zIu+s1=-IimJQ@6#TasA zP)JUCy7yAxQh-)hEZCtTO3jDX^#_vP=*1KG>Q`rZ>}h*R;$VfAm54TOEQF@-J{4C~ z8;UUAw21TunZeQl+9Yxvt8O7?_>wVzpD1u?+mpXc2YCNKkEjJ^oEMm#whA1dpG|Q` zZi*^P&d9?OL$GKlRZznp>t2+_rClh-tQ#hwjq8m;aKl7?2v4v{O~xq ztPDPqiwHkR`|v74dU+^9aq*j$wts6YIpn)_vzu0Yr8z}b{b_FVm-3wg{re#|Rwb&O zWiOjPEAJKc(aT!t%?NX#No}1yscWokf2FHzD?vLQSh3C?pqY6(1tec`_fFT|&}k)j zrnOzMv85j5&mK0GGxA6p9SbrBMHPk>Jb}^=dD~8V%`&KOy<5T8PX%OjT1`AqT@$e1 zwYRvIzd&q$e5O3pMa&EOD}&mse&Y8ZCaxc$#)8TcOf`BHh| zx*3oj__JP=UmFXPW9XyOmf7uOL*sjH@wYk4EkC{IklC0{<}$?x#r*0E`EywP4`&pt~-Ed#pk^^5iO8gmY=w@?dTct4G5zVYpIz~_=8*u%7?TO4q1 z{{BmgewCa|fV7qjj!hQ|xoDh#zCf#dFY2Sp3E6Wf?lr_LJ$k@I3{NFe+aYCDWSH_Kd!LA!eGc&FnnmUY| z*N<|qQqecuItE#$ciW$l0^@+f6yP^^y&X)s!*V4wzg`+-4+h00*=Z0-pE2GCYxz zMN`W)y?EiN!**wV_QzzMWiq7q@&d^Wyx=aEfkv@7^zx^vg73iRa9uU^wL9FP0Z84a zFn;NO{Asq>17Ee=1XZMekg&}^5cXFQ$SKtRc_PmVZCs1QJrCfX?jlQ%;U^1L{ax_; zo9JTrw~Ge&J%WvUD_=vr58Jbh_?=@1Qnw%%>fYpjq11K5)GAFkGngfmVu;JsM1Dv5 z6!FCnx#z&?8UEXz)V{>!c9&`>dAm?ey^yu2vsAe7>MYMAH4(BVr68ipN7c)v{ZmC? zAw5&33n0f{2)~yc_|PWv<2ou&B)*`UeB8<*5eW2n67vz)nyJrnN2CpoY(#F{s` z;ezT}-a_7OL(vy6c&n&eKZF4#O29dbv%vj(V{;bGRWlOvb3NM|gWrN!>ZySfBGQ|! zAWO_l++7>Z&@-LmT}Vyn8vy-peoM%_AUb#>Z7Td=(32TY^0`jmUGw5?T+K7sf|*zx z*%bNiM_9FHmolqV5Bpoth@H>q4X}78dKtj0CUY$?Ovv$mi|9G1Vta*~eWYwj8#!pP z@iRlC+~Vu{`#AG`c)o>RnS%R}E!A0PW3jgWajE84x0y%#>5V#zktSy8v?a{8KX0Ak zP`Mk#fW4Hgq;v8zTfyO%@^N1N=$Vv+#$biXY5lk8+I;j(RyT;TN&Imco@XW6<}y1e zb1))SXrcu-d?g;Nxd^i0=L#xjfj=gI|6TtYai9;8Sl2oscwk_#3GCDX8)%q8fu1xy zu&&*F|Hhpx)x8g0*p?sv==YaT;6&S7*PH-wT@vnKB_30e4srhy-sgxFOK`3LSQ8o0 zWUqJV#>L_6uDFd%=m27anewSrNl~6rAB2IO8eqc^c*a0KQ^d|JqYf52ptjI%2FbY@ zS~P|JD332?PJJ&sMB4TA0Y2bk8`R=1B{1zY`l!O56;=QDe)PPu+3nR!fZ9Z@zyjmE(1(>M-))E+4r-iE86jrvPIX8r(6%;i> z^M7x6DpJR+o1F~oMdCX&%AY;u`{R7Ujz<(tc$xXqurMsM!=O1$8ClOh5wAKS!;b>j zBUZovRz9COkQq^kg%uk(W7pz zm>pq`1d4n?eC@HWHX3WO47w|1bK#nac6@Za=9=e9X zBQa!7f04vbnZhMjs$^^hpo^qe5=g zA$@nUrT=AnAi>N{+KMg;*fRnd$!Q)F5YC))_MeR8QD*MZ09K;BLTJKGU5D8y-Ps&< zJq$75Ea?VqgPcNC9u{tYap7!K_=P?yXzFZm`X}>!1G{1#_~r|9idb>-{G_T8utL1H z4{&mh7Ie8h!U1G!=<*`;UEVzeE{hFMAq|)W;Ns#qMto^#^VH>kwG~8AZ9)_-4XWUQ zZ=Zduk}V8|T*`dGNQ_w1mSK-`xay?QF=7}ip54Ual%(^6(QkoDMD4| zFLsRcE6SoP)W0ImYk&Ueg4F;0YGbeco-QjpBg~7@1YS>9K2k9WYg7O18kjvI3^G&(Jt9$7P@>2PZLz~gpr_2Q*LRhSmM|U(y#Bt zcj%4%1{NOq1|^s_r#?-dimF~R_HL{LjtELqXY=b`{)D`QFvY3KX1=pWV14J@ zR$lp(7$SK}X+F9UqOE7hSFxxP)X9o}hr0NsJ$TYYPz^`Dn)<{PJ>5$_HnA0Yx(GGR zP+YeoWf&AH&%GML@#G{lc zu~+PVKweYMX^J_7cNJj4yW{gzfbORohp&z)xyP>OQnzrYvt9?XM2;VM9HvtrWY0ef zbbPEM9iEUHAa;5V$hIov7PT=R!C^&a^ZVtH9_;0R?e3F3VXsdugm0(#>7|Lntg{!r zhShGhGRTM=*LddJTQ-kUoH-;Lh1>Z4bUwHf_TP6Px`_d}iudj;6S@jaU@v!E+s+7M zD&C<1aQ!Lg3|k2d@JDqtK>=7AJTr7Qm?9O~x^lV?oMhe(jLIKp0mAc3%fq{Q}Ry|eOep3p->@lZrIM)%GhLz;AVnH~i6oO!x56WJ#H8g!iFugN1 zp)8WRyQ?99CaW_PKRtO3kjV)T_Y)AcY^wv2ujJ;d;E!rX_5mz|o#p!ssuI7Js95m= z>rJ#HI9iCK3N}h=xk49`GrC%1xw0uP_v+&s;{TJ7QDMM`d^cd_J^36ofKK{A!6d=ls@1^2>x@lxjS|hz3Kow{jz!G z$ScQ-cxY|IYW@7A!%+KyO5gvxA+I=52c#wUIw{eY`mf4CEwbHNkM`(EZF6nIQU1sE znu%!Ay!sgZOb$AV)C^?k$u30wl}CVcxni*zJf$FVO9aS2mI!v(o>hPJe!(I=xn0kT z)HfvQM1xAzG@>ZxC~+LUqlw`k$N?G^M9uX^8-n&Q51Vok!SxVF`a=C&-w^djW=<2; zug7@iS{BBhWKFCFkAg+*f!$thmD}u7hB%+ruL4K;@l&6yho9|kRR>kiezrRb5$Rr( z4Ol`&!6ygK<=WUXxQ*G|pw8K%z0n-w;c!Q5VE+<|mJ>Y%&gIiVevfU=%{J4&r@O#I zig?&H`?-jn!5M}rWhlN1e#g}3e!T0hgH$4*@#p{##=hpO6-(j}20G7TbMCVh`cys^ zh=wU+{Z6y@2mUZ@)vKZd3LEhs+G6}pH+TUu$6-jj#ios+=J})W7Pd3c`IZP5+l7-C zF_g3nx^eJloJT~MLlYHSTkwt<=P;faB@lKhTxuh4V%@@UiY3T8n(#14b0EMryzVf_ z{=png2BWhPk>^grm-ff4b7Nubwfw>Lp-CSIiUbg;Deud57ZpWcUR!0rV355{w#%8g zO$DX`mo{U|CR(uT#7wcf=!oK0@Cd_B^Jl3UYf~5|3R&1a+`YTElQz0C(FuVO%0YpV z8rGo9;Z>~b^Y*A^itk0wZsbS6Sm7e4B|*~KHq&WZ)gz|UV7pr7;=RucPh^&y>c1}Y zV9^O**|T%uMGF5ngB|IzvwnF$9y25!wYKvZN5fc-^T{unQtKFgvtGWO7ck1Qb+>F! zu`ck8Bm=o;Y`^!gou}5+n)&-P#g~-2?}WUgYX8K@=9Cn4#)a^MPlpG))jxalX|C%yr@_9c>qu#M_e& zZ*Zm3ESuSBuK$wOkA{KQ@(m)OU5JrU7lOrGcFZNouV6Unj9DxQ^0E~Lt1}wh5C*5G z0*|R|9&EeEU3c=6k~+?PUr`=0=D8zdqu;EYl z<+HQ-N9{4LnIL&>hME=>sRO)n%gfd9q^v2w24Bp_?NWX;dT+?jX29z9tohVl-91%& z{VBTUXYHwU6ihm;&5VTs2tuPl5Q)TK{y|vmKM0Ti2f;9a$9r&~bp2RxRG><>u8*|t z!IO6?kTr{b9E{ZkAJ9Xix6$agc}Ty@HO2V=uoaR1Q?AE3K>z>nTQ-Ku$v`e7hMI9q zy4Gb`sXcFmbS*+Z-jjDso+Lv|gbw1o)2xF@1VNMU3(v9Ek^x5M%&6T2DU+$jn zFN3Q(`3M;WrGa-jwU`eW^~JkuMy2aAl8xLG{nMR4*Tog2pJu>|pVR(FiKSauf5ue? zZt;=Me4qavG3J@$UhL(X5rj2^x6qznI6a;KlqnZA!nE}Kk(xT?1M(|hl; zBeycM6I~Y~x0-M!xN=cZ%lda!c-_o|mhs>u-~TAjuwrfvyKikPUiE%0fOWNDLnSbM zG^bo&$P-Km{G?pg{7(Lqa)iK1alo9ax=tBrZ^!@K`HmKTSvP(ukH*A7)o8kAI6CQL zfLL?C6i>G~*A4PKZ8g)0H0wVoxWyY4u1fW5S%dFhlbV*^q1)-gp4|Pb>C>-pOeufL z?wXhtu=GVPo51auCXi6SuKyQbb#HlACvnQ|1xxq%cSRKmPvh8b{#T7*q(Z-C#RW#%hko@=hX089e$9%+d~B19LL#4`vvrkRE#t#V zkXG!_(i@#9vb=9#*5F%rXK74{maY&lsIo$q&8+QS$kG$Uhh3E*8M1g*;I38?5U38V z{SM)JAe*mCUps(W<1y;Ot|PgmX$LYL0?U&UeJ%6Qhp#(4HEIxS<=>1Y$-Fb+R`17& zT+a6nd8iqt$?v2%57}i>Rs2{RpVja+(5w0T*>F(=ocv@RKZhi5hATW~ol2#{(S41? z9l?F0jy%cdZ=`QG{nh$QR*?n%1ylRCIXBlZ?WXGSvJ2VG%Uh-VmrLbdeN|5W^tq5%-3yfgZYye$(v~Mp%NHe4f5u>Qttno z0Xna=7`XhOOrAH_`0U1M$aS%<6^=+{JOO{Z)CnBKof zYxG3xCr@L`k8Un3iHAj>S$i3sEqaBnKU$RFmM=Zjn%lUcJk$y2x}U6@Rc zel-cqy#-;gXx;WGZiOzUPC5nk8@bVnX^J zuzZcF9;>v733CxBl()J2xX5~94ykM2e8w-X%H9NB@x(asomg9;5@G0OuWlPhqf0eM zA?&Ou7{_zqVON?^samSvKO3lXXhdLZWd8Of7k=#ZhP3lMBL-&4_2V`69+fg4XgGLj z|DO8sYdmUB;0Q}vz|`NlHOKlh(ptDxBmUiB>r;Pb{YK^&cS>&8C8n8DbMUA&KKAPI zD!prZKj&Nv9OO0W>xe$+vYXv)HGWl7WW0kma~B{O;)AsXu#GnoU71p+C!<(#%eBco zB%V@(S7L2u5*DcR_tVdMuj3U&Gmr9+K5?Y@cUE9Em0%p{nqqaSqnbNf&0|ARlR##i z{>LWRKXnF+iSZ2Kzzr6~rACSeC7;K)dfXDeRu~mPEu!9INNXM+kR;yl;o0xoO#3&U z-uQ9K-f(GgDRgV8{bG&6;Wf%kwL<>t4pe<^>_o;`7yk{LZ@Z!BU+oN%0^v_Q^Y8Ah z>`A_Oxzx^?{G4-53p(&j@`Cu`aGOf0zVbn=iecH4QQ(T=Px<4s>ieQ69UiMkR-B?g z_wVg>B~Mx!*!j{){UPlgE|h~I3BNjgzE_e?d0Z#i27)yC_RAj1rEhx4NL8NPjS>+} zFPRj5WvTmT>d!BQ(L`0f4A&^DF@M|7e0rWxwyBX_)FV%)51q}4X+#$#!=xJxBkyLk l4kppVVokvR&n0RNR5h&K#j~NvKLP-NwuYYib5%m*{{#MKo}d5# literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_stack_and_queue/queue.assets/linkedlist_queue_step2_push.png b/ru/docs/chapter_stack_and_queue/queue.assets/linkedlist_queue_step2_push.png new file mode 100644 index 0000000000000000000000000000000000000000..f91e459dad248d4d73f824d58d65522afeb78805 GIT binary patch literal 12938 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 MXy~gqsM^Q;FN3duF#rGn literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_stack_and_queue/queue.assets/linkedlist_queue_step3_pop.png b/ru/docs/chapter_stack_and_queue/queue.assets/linkedlist_queue_step3_pop.png new file mode 100644 index 0000000000000000000000000000000000000000..cd55a4f8e935369cac5460d256efcac1b1ea3744 GIT binary patch literal 10429 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_stack_and_queue/queue.assets/queue_operations.png b/ru/docs/chapter_stack_and_queue/queue.assets/queue_operations.png new file mode 100644 index 0000000000000000000000000000000000000000..d944b67ba135ae31e292061a954f3a0cc3696a7e GIT binary patch literal 14772 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Очередь (queue)
        - это линейная структура данных, подчиняющаяся правилу "первым пришел - первым вышел". Как видно из названия, очередь моделирует обычную ситуацию ожидания: новые люди непрерывно присоединяются к хвосту очереди, а стоящие в начале по одному уходят. + +Как показано на рисунке ниже, начало очереди называется "головой очереди", а конец - "хвостом очереди"; операцию добавления элемента в хвост называют "enqueue", а операцию удаления элемента из головы - "dequeue". + +![Правило FIFO для очереди](queue.assets/queue_operations.png) + +## Основные операции с очередью + +Распространенные операции с очередью показаны в таблице ниже. Следует учитывать, что названия методов в разных языках могут различаться. Здесь мы используем те же названия, что и для стека. + +

        Таблица   Эффективность операций с очередью

        + +| Имя метода | Описание | Временная сложность | +| ---------- | ----------------------------------------- | ------------------- | +| `push()` | Поместить элемент в очередь, то есть добавить его в хвост | $O(1)$ | +| `pop()` | Извлечь элемент из головы очереди | $O(1)$ | +| `peek()` | Просмотреть элемент в голове очереди | $O(1)$ | + +Мы можем напрямую использовать готовые классы очереди, предоставляемые языками программирования: + +=== "Python" + + ```python title="queue.py" + from collections import deque + + # Инициализация очереди + # В Python обычно используют двустороннюю очередь deque как обычную очередь + # Хотя queue.Queue() является "чистой" очередью, она не слишком удобна, поэтому ее не рекомендуют + que: deque[int] = deque() + + # Поместить элементы в очередь + que.append(1) + que.append(3) + que.append(2) + que.append(5) + que.append(4) + + # Просмотреть элемент в голове очереди + front: int = que[0] + + # Извлечь элемент из очереди + pop: int = que.popleft() + + # Получить длину очереди + size: int = len(que) + + # Проверить, пуста ли очередь + is_empty: bool = len(que) == 0 + ``` + +=== "C++" + + ```cpp title="queue.cpp" + /* Инициализация очереди */ + queue queue; + + /* Поместить элементы в очередь */ + queue.push(1); + queue.push(3); + queue.push(2); + queue.push(5); + queue.push(4); + + /* Просмотреть элемент в голове очереди */ + int front = queue.front(); + + /* Извлечь элемент из очереди */ + queue.pop(); + + /* Получить длину очереди */ + int size = queue.size(); + + /* Проверить, пуста ли очередь */ + bool empty = queue.empty(); + ``` + +=== "Java" + + ```java title="queue.java" + /* Инициализация очереди */ + Queue queue = new LinkedList<>(); + + /* Поместить элементы в очередь */ + queue.offer(1); + queue.offer(3); + queue.offer(2); + queue.offer(5); + queue.offer(4); + + /* Просмотреть элемент в голове очереди */ + int peek = queue.peek(); + + /* Извлечь элемент из очереди */ + int pop = queue.poll(); + + /* Получить длину очереди */ + int size = queue.size(); + + /* Проверить, пуста ли очередь */ + boolean isEmpty = queue.isEmpty(); + ``` + +=== "C#" + + ```csharp title="queue.cs" + /* Инициализация очереди */ + Queue queue = new(); + + /* Поместить элементы в очередь */ + queue.Enqueue(1); + queue.Enqueue(3); + queue.Enqueue(2); + queue.Enqueue(5); + queue.Enqueue(4); + + /* Просмотреть элемент в голове очереди */ + int peek = queue.Peek(); + + /* Извлечь элемент из очереди */ + int pop = queue.Dequeue(); + + /* Получить длину очереди */ + int size = queue.Count; + + /* Проверить, пуста ли очередь */ + bool isEmpty = queue.Count == 0; + ``` + +=== "Go" + + ```go title="queue_test.go" + /* Инициализация очереди */ + // В Go очередь обычно реализуют через list + queue := list.New() + + /* Поместить элементы в очередь */ + queue.PushBack(1) + queue.PushBack(3) + queue.PushBack(2) + queue.PushBack(5) + queue.PushBack(4) + + /* Просмотреть элемент в голове очереди */ + peek := queue.Front() + + /* Извлечь элемент из очереди */ + pop := queue.Front() + queue.Remove(pop) + + /* Получить длину очереди */ + size := queue.Len() + + /* Проверить, пуста ли очередь */ + isEmpty := queue.Len() == 0 + ``` + +=== "Swift" + + ```swift title="queue.swift" + /* Инициализация очереди */ + // В Swift нет встроенного класса очереди, поэтому можно использовать Array как очередь + var queue: [Int] = [] + + /* Поместить элементы в очередь */ + queue.append(1) + queue.append(3) + queue.append(2) + queue.append(5) + queue.append(4) + + /* Просмотреть элемент в голове очереди */ + let peek = queue.first! + + /* Извлечь элемент из очереди */ + // Поскольку в основе лежит массив, removeFirst имеет сложность O(n) + let pool = queue.removeFirst() + + /* Получить длину очереди */ + let size = queue.count + + /* Проверить, пуста ли очередь */ + let isEmpty = queue.isEmpty + ``` + +=== "JS" + + ```javascript title="queue.js" + /* Инициализация очереди */ + // В JavaScript нет встроенной очереди, поэтому можно использовать Array как очередь + const queue = []; + + /* Поместить элементы в очередь */ + queue.push(1); + queue.push(3); + queue.push(2); + queue.push(5); + queue.push(4); + + /* Просмотреть элемент в голове очереди */ + const peek = queue[0]; + + /* Извлечь элемент из очереди */ + // В основе лежит массив, поэтому shift() имеет сложность O(n) + const pop = queue.shift(); + + /* Получить длину очереди */ + const size = queue.length; + + /* Проверить, пуста ли очередь */ + const empty = queue.length === 0; + ``` + +=== "TS" + + ```typescript title="queue.ts" + /* Инициализация очереди */ + // В TypeScript нет встроенной очереди, поэтому можно использовать Array как очередь + const queue: number[] = []; + + /* Поместить элементы в очередь */ + queue.push(1); + queue.push(3); + queue.push(2); + queue.push(5); + queue.push(4); + + /* Просмотреть элемент в голове очереди */ + const peek = queue[0]; + + /* Извлечь элемент из очереди */ + // В основе лежит массив, поэтому shift() имеет сложность O(n) + const pop = queue.shift(); + + /* Получить длину очереди */ + const size = queue.length; + + /* Проверить, пуста ли очередь */ + const empty = queue.length === 0; + ``` + +=== "Dart" + + ```dart title="queue.dart" + /* Инициализация очереди */ + // В Dart класс Queue является двусторонней очередью и может использоваться как обычная очередь + Queue queue = Queue(); + + /* Поместить элементы в очередь */ + queue.add(1); + queue.add(3); + queue.add(2); + queue.add(5); + queue.add(4); + + /* Просмотреть элемент в голове очереди */ + int peek = queue.first; + + /* Извлечь элемент из очереди */ + int pop = queue.removeFirst(); + + /* Получить длину очереди */ + int size = queue.length; + + /* Проверить, пуста ли очередь */ + bool isEmpty = queue.isEmpty; + ``` + +=== "Rust" + + ```rust title="queue.rs" + /* Инициализация двусторонней очереди */ + // В Rust двусторонняя очередь может использоваться как обычная очередь + let mut deque: VecDeque = VecDeque::new(); + + /* Поместить элементы в очередь */ + deque.push_back(1); + deque.push_back(3); + deque.push_back(2); + deque.push_back(5); + deque.push_back(4); + + /* Просмотреть элемент в голове очереди */ + if let Some(front) = deque.front() { + } + + /* Извлечь элемент из очереди */ + if let Some(pop) = deque.pop_front() { + } + + /* Получить длину очереди */ + let size = deque.len(); + + /* Проверить, пуста ли очередь */ + let is_empty = deque.is_empty(); + ``` + +=== "C" + + ```c title="queue.c" + // В C нет встроенной очереди + ``` + +=== "Kotlin" + + ```kotlin title="queue.kt" + /* Инициализация очереди */ + val queue = LinkedList() + + /* Поместить элементы в очередь */ + queue.offer(1) + queue.offer(3) + queue.offer(2) + queue.offer(5) + queue.offer(4) + + /* Просмотреть элемент в голове очереди */ + val peek = queue.peek() + + /* Извлечь элемент из очереди */ + val pop = queue.poll() + + /* Получить длину очереди */ + val size = queue.size + + /* Проверить, пуста ли очередь */ + val isEmpty = queue.isEmpty() + ``` + +=== "Ruby" + + ```ruby title="queue.rb" + # Инициализация очереди + # Встроенная очередь в Ruby (Thread::Queue) не имеет методов peek и traverse, поэтому можно использовать Array как очередь + queue = [] + + # Поместить элементы в очередь + queue.push(1) + queue.push(3) + queue.push(2) + queue.push(5) + queue.push(4) + + # Просмотреть элемент очереди + peek = queue.first + + # Извлечь элемент из очереди + # Обрати внимание: поскольку это массив, метод Array#shift имеет сложность O(n) + pop = queue.shift + + # Получить длину очереди + size = queue.length + + # Проверить, пуста ли очередь + is_empty = queue.empty? + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=from%20collections%20import%20deque%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20%23%20%D0%92%20Python%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D1%8E%D1%8E%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20deque%20%D0%BE%D0%B1%D1%8B%D1%87%D0%BD%D0%BE%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D1%8E%D1%82%20%D0%BA%D0%B0%D0%BA%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20%23%20%D0%A5%D0%BE%D1%82%D1%8F%20queue.Queue%28%29%20%D1%8F%D0%B2%D0%BB%D1%8F%D0%B5%D1%82%D1%81%D1%8F%20%D0%BD%D0%B0%D1%81%D1%82%D0%BE%D1%8F%D1%89%D0%B8%D0%BC%20%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%BC%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%2C%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%D1%81%D1%8F%20%D0%B8%D0%BC%20%D0%BD%D0%B5%20%D1%81%D0%BB%D0%B8%D1%88%D0%BA%D0%BE%D0%BC%20%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%BE%0A%20%20%20%20que%20%3D%20deque%28%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20que.append%281%29%0A%20%20%20%20que.append%283%29%0A%20%20%20%20que.append%282%29%0A%20%20%20%20que.append%285%29%0A%20%20%20%20que.append%284%29%0A%20%20%20%20print%28%22%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20que%20%3D%22%2C%20que%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20front%20%3D%20que%5B0%5D%0A%20%20%20%20print%28%22%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20front%20%3D%22%2C%20front%29%0A%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20pop%20%3D%20que.popleft%28%29%0A%20%20%20%20print%28%22%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B8%D0%B7%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20pop%20%3D%22%2C%20pop%29%0A%20%20%20%20print%28%22que%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%3D%22%2C%20que%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%83%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20size%20%3D%20len%28que%29%0A%20%20%20%20print%28%22%D0%94%D0%BB%D0%B8%D0%BD%D0%B0%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20size%20%3D%22%2C%20size%29%0A%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C%2C%20%D0%BF%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20is_empty%20%3D%20len%28que%29%20%3D%3D%200%0A%20%20%20%20print%28%22%D0%9F%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20%3D%22%2C%20is_empty%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +## Реализация очереди + +Чтобы реализовать очередь, нам нужна такая структура данных, которая позволяет добавлять элементы с одного конца и удалять их с другого; и связный список, и массив этим требованиям удовлетворяют. + +### Реализация на основе связного списка + +Как показано на рисунке ниже, мы можем рассматривать "головной узел" и "хвостовой узел" связного списка как "голову очереди" и "хвост очереди" соответственно, договорившись, что добавлять узлы можно только в хвост, а удалять - только из головы. + +=== "LinkedListQueue" + ![Операции enqueue и dequeue в реализации очереди на связном списке](queue.assets/linkedlist_queue_step1.png) + +=== "push()" + ![linkedlist_queue_push](queue.assets/linkedlist_queue_step2_push.png) + +=== "pop()" + ![linkedlist_queue_pop](queue.assets/linkedlist_queue_step3_pop.png) + +Ниже приведен код реализации очереди на связном списке: + +```src +[file]{linkedlist_queue}-[class]{linked_list_queue}-[func]{} +``` + +### Реализация на основе массива + +Удаление первого элемента из массива имеет временную сложность $O(n)$ , из-за чего операция dequeue оказывается неэффективной. Однако этого можно избежать с помощью следующего приема. + +Мы можем использовать переменную `front` , указывающую на индекс элемента в голове очереди, и поддерживать переменную `size` , которая хранит длину очереди. Определим `rear = front + size` ; эта формула дает позицию `rear`, указывающую на ячейку сразу после хвоста очереди. + +Исходя из этого, **эффективный диапазон элементов массива равен `[front, rear - 1]`**, а различные операции реализуются, как показано на рисунке ниже. + +- Операция enqueue: записать входной элемент по индексу `rear` и увеличить `size` на 1. +- Операция dequeue: просто увеличить `front` на 1 и уменьшить `size` на 1. + +Можно увидеть, что и enqueue, и dequeue требуют всего одной операции, а значит обе имеют временную сложность $O(1)$ . + +=== "ArrayQueue" + ![Операции enqueue и dequeue в реализации очереди на массиве](queue.assets/array_queue_step1.png) + +=== "push()" + ![array_queue_push](queue.assets/array_queue_step2_push.png) + +=== "pop()" + ![array_queue_pop](queue.assets/array_queue_step3_pop.png) + +Ты можешь заметить еще одну проблему: при непрерывных операциях enqueue и dequeue значения `front` и `rear` оба движутся вправо, и **когда они доходят до конца массива, дальше сдвигаться уже нельзя**. Чтобы решить эту проблему, можно рассматривать массив как "кольцевой массив", у которого начало и конец соединены. + +Для кольцевого массива нужно сделать так, чтобы `front` или `rear`, перешагнув конец массива, сразу возвращались к его началу и продолжали движение. Такую периодичность удобно реализовать с помощью операции взятия остатка, как показано в коде ниже: + +```src +[file]{array_queue}-[class]{array_queue}-[func]{} +``` + +Даже такая реализация очереди остается ограниченной: ее длина неизменяема. Однако это несложно исправить, заменив массив на динамический массив и тем самым введя механизм расширения. Заинтересованные читатели могут попробовать реализовать это самостоятельно. + +Выводы сравнения двух реализаций в целом такие же, как и для стека, поэтому здесь мы не будем повторяться. + +## Типичные применения очереди + +- **Заказы на Taobao**. После оформления заказа покупателем заказ попадает в очередь, а затем система обрабатывает заказы по порядку. Во время крупных распродаж, таких как Double 11, за короткое время возникает огромный поток заказов, и высокая конкурентная нагрузка становится ключевой инженерной проблемой. +- **Различные отложенные задачи**. Любой сценарий, где нужно реализовать принцип "кто раньше пришел, тот раньше обслуживается", например очередь заданий принтера или очередь блюд на кухне ресторана, хорошо моделируется очередью, которая эффективно поддерживает нужный порядок обработки. diff --git a/ru/docs/chapter_stack_and_queue/stack.assets/array_stack_step1.png b/ru/docs/chapter_stack_and_queue/stack.assets/array_stack_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..54a271519d2e0d0b33f07e87b09c27f53168c3d0 GIT binary patch literal 12093 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 D{R|{_ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_stack_and_queue/stack.assets/array_stack_step3_pop.png b/ru/docs/chapter_stack_and_queue/stack.assets/array_stack_step3_pop.png new file mode 100644 index 0000000000000000000000000000000000000000..910783899fc59456093fb391f22ec7071473b98e GIT binary patch literal 10236 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_stack_and_queue/stack.assets/linkedlist_stack_step1.png b/ru/docs/chapter_stack_and_queue/stack.assets/linkedlist_stack_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..e3de6b84624eaa251f98a739ba44b17a9713f1e8 GIT binary patch literal 12293 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
        o)xGNC7FQ#oW4_rp0jy1z# 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

        k_8Aje;fYiGgOQ7Sldm2y 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_stack_and_queue/stack.assets/stack_operations.png b/ru/docs/chapter_stack_and_queue/stack.assets/stack_operations.png new file mode 100644 index 0000000000000000000000000000000000000000..8dfb8d72e8d88d1e09cfcaad048aebdc6881bad3 GIT binary patch literal 14014 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Стек (stack) - это линейная структура данных, подчиняющаяся логике "последним пришел - первым вышел". + +Стек можно сравнить со стопкой тарелок на столе. Если разрешено перемещать только одну тарелку за раз, то, чтобы достать тарелку снизу, сначала придется по одной убрать все тарелки сверху. Если заменить тарелки различными элементами (например целыми числами, символами, объектами и т.д.), получится структура данных "стек". + +Как показано на рисунке ниже, верхнюю часть стопки элементов мы называем "вершиной стека", а нижнюю - "основанием стека". Операция добавления элемента на вершину называется "push", а операция удаления верхнего элемента - "pop". + +![Правило LIFO для стека](stack.assets/stack_operations.png) + +## Основные операции со стеком + +Основные операции со стеком показаны в таблице ниже. Конкретные имена методов зависят от используемого языка программирования. Здесь в качестве примера используются распространенные названия `push()` , `pop()` и `peek()` . + +

        Таблица   Эффективность операций со стеком

        + +| Метод | Описание | Временная сложность | +| -------- | --------------------------------- | ------------------- | +| `push()` | Поместить элемент в стек (на вершину) | $O(1)$ | +| `pop()` | Извлечь верхний элемент стека | $O(1)$ | +| `peek()` | Просмотреть верхний элемент | $O(1)$ | + +Обычно мы можем просто использовать встроенный стек, предоставляемый языком программирования. Однако в некоторых языках специальный класс стека может отсутствовать. В таком случае можно использовать "массив" или "связный список" этого языка как стек и в логике программы игнорировать операции, не относящиеся к стеку. + +=== "Python" + + ```python title="stack.py" + # Инициализация стека + # В Python нет встроенного класса стека, поэтому можно использовать list как стек + stack: list[int] = [] + + # Поместить элементы в стек + stack.append(1) + stack.append(3) + stack.append(2) + stack.append(5) + stack.append(4) + + # Просмотреть верхний элемент + peek: int = stack[-1] + + # Извлечь элемент + pop: int = stack.pop() + + # Получить длину стека + size: int = len(stack) + + # Проверить, пуст ли стек + is_empty: bool = len(stack) == 0 + ``` + +=== "C++" + + ```cpp title="stack.cpp" + /* Инициализация стека */ + stack stack; + + /* Поместить элементы в стек */ + stack.push(1); + stack.push(3); + stack.push(2); + stack.push(5); + stack.push(4); + + /* Просмотреть верхний элемент */ + int top = stack.top(); + + /* Извлечь элемент */ + stack.pop(); // Без возвращаемого значения + + /* Получить длину стека */ + int size = stack.size(); + + /* Проверить, пуст ли стек */ + bool empty = stack.empty(); + ``` + +=== "Java" + + ```java title="stack.java" + /* Инициализация стека */ + Stack stack = new Stack<>(); + + /* Поместить элементы в стек */ + stack.push(1); + stack.push(3); + stack.push(2); + stack.push(5); + stack.push(4); + + /* Просмотреть верхний элемент */ + int peek = stack.peek(); + + /* Извлечь элемент */ + int pop = stack.pop(); + + /* Получить длину стека */ + int size = stack.size(); + + /* Проверить, пуст ли стек */ + boolean isEmpty = stack.isEmpty(); + ``` + +=== "C#" + + ```csharp title="stack.cs" + /* Инициализация стека */ + Stack stack = new(); + + /* Поместить элементы в стек */ + stack.Push(1); + stack.Push(3); + stack.Push(2); + stack.Push(5); + stack.Push(4); + + /* Просмотреть верхний элемент */ + int peek = stack.Peek(); + + /* Извлечь элемент */ + int pop = stack.Pop(); + + /* Получить длину стека */ + int size = stack.Count; + + /* Проверить, пуст ли стек */ + bool isEmpty = stack.Count == 0; + ``` + +=== "Go" + + ```go title="stack_test.go" + /* Инициализация стека */ + // В Go рекомендуется использовать Slice как стек + var stack []int + + /* Поместить элементы в стек */ + stack = append(stack, 1) + stack = append(stack, 3) + stack = append(stack, 2) + stack = append(stack, 5) + stack = append(stack, 4) + + /* Просмотреть верхний элемент */ + peek := stack[len(stack)-1] + + /* Извлечь элемент */ + pop := stack[len(stack)-1] + stack = stack[:len(stack)-1] + + /* Получить длину стека */ + size := len(stack) + + /* Проверить, пуст ли стек */ + isEmpty := len(stack) == 0 + ``` + +=== "Swift" + + ```swift title="stack.swift" + /* Инициализация стека */ + // В Swift нет встроенного класса стека, поэтому можно использовать Array как стек + var stack: [Int] = [] + + /* Поместить элементы в стек */ + stack.append(1) + stack.append(3) + stack.append(2) + stack.append(5) + stack.append(4) + + /* Просмотреть верхний элемент */ + let peek = stack.last! + + /* Извлечь элемент */ + let pop = stack.removeLast() + + /* Получить длину стека */ + let size = stack.count + + /* Проверить, пуст ли стек */ + let isEmpty = stack.isEmpty + ``` + +=== "JS" + + ```javascript title="stack.js" + /* Инициализация стека */ + // В JavaScript нет встроенного класса стека, поэтому можно использовать Array как стек + const stack = []; + + /* Поместить элементы в стек */ + stack.push(1); + stack.push(3); + stack.push(2); + stack.push(5); + stack.push(4); + + /* Просмотреть верхний элемент */ + const peek = stack[stack.length-1]; + + /* Извлечь элемент */ + const pop = stack.pop(); + + /* Получить длину стека */ + const size = stack.length; + + /* Проверить, пуст ли стек */ + const is_empty = stack.length === 0; + ``` + +=== "TS" + + ```typescript title="stack.ts" + /* Инициализация стека */ + // В TypeScript нет встроенного класса стека, поэтому можно использовать Array как стек + const stack: number[] = []; + + /* Поместить элементы в стек */ + stack.push(1); + stack.push(3); + stack.push(2); + stack.push(5); + stack.push(4); + + /* Просмотреть верхний элемент */ + const peek = stack[stack.length - 1]; + + /* Извлечь элемент */ + const pop = stack.pop(); + + /* Получить длину стека */ + const size = stack.length; + + /* Проверить, пуст ли стек */ + const is_empty = stack.length === 0; + ``` + +=== "Dart" + + ```dart title="stack.dart" + /* Инициализация стека */ + // В Dart нет встроенного класса стека, поэтому можно использовать List как стек + List stack = []; + + /* Поместить элементы в стек */ + stack.add(1); + stack.add(3); + stack.add(2); + stack.add(5); + stack.add(4); + + /* Просмотреть верхний элемент */ + int peek = stack.last; + + /* Извлечь элемент */ + int pop = stack.removeLast(); + + /* Получить длину стека */ + int size = stack.length; + + /* Проверить, пуст ли стек */ + bool isEmpty = stack.isEmpty; + ``` + +=== "Rust" + + ```rust title="stack.rs" + /* Инициализация стека */ + // Используем Vec как стек + let mut stack: Vec = Vec::new(); + + /* Поместить элементы в стек */ + stack.push(1); + stack.push(3); + stack.push(2); + stack.push(5); + stack.push(4); + + /* Просмотреть верхний элемент */ + let top = stack.last().unwrap(); + + /* Извлечь элемент */ + let pop = stack.pop().unwrap(); + + /* Получить длину стека */ + let size = stack.len(); + + /* Проверить, пуст ли стек */ + let is_empty = stack.is_empty(); + ``` + +=== "C" + + ```c title="stack.c" + // В C нет встроенного стека + ``` + +=== "Kotlin" + + ```kotlin title="stack.kt" + /* Инициализация стека */ + val stack = Stack() + + /* Поместить элементы в стек */ + stack.push(1) + stack.push(3) + stack.push(2) + stack.push(5) + stack.push(4) + + /* Просмотреть верхний элемент */ + val peek = stack.peek() + + /* Извлечь элемент */ + val pop = stack.pop() + + /* Получить длину стека */ + val size = stack.size + + /* Проверить, пуст ли стек */ + val isEmpty = stack.isEmpty() + ``` + +=== "Ruby" + + ```ruby title="stack.rb" + # Инициализация стека + # В Ruby нет встроенного класса стека, поэтому можно использовать Array как стек + stack = [] + + # Поместить элементы в стек + stack << 1 + stack << 3 + stack << 2 + stack << 5 + stack << 4 + + # Просмотреть верхний элемент + peek = stack.last + + # Извлечь элемент + pop = stack.pop + + # Получить длину стека + size = stack.length + + # Проверить, пуст ли стек + is_empty = stack.empty? + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D1%82%D0%B5%D0%BA%0A%20%20%20%20%23%20%D0%92%20Python%20%D0%BD%D0%B5%D1%82%20%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%2C%20%D0%BF%D0%BE%D1%8D%D1%82%D0%BE%D0%BC%D1%83%20list%20%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BA%D0%B0%D0%BA%20%D1%81%D1%82%D0%B5%D0%BA%0A%20%20%20%20stack%20%3D%20%5B%5D%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D1%81%D1%82%D0%B5%D0%BA%0A%20%20%20%20stack.append%281%29%0A%20%20%20%20stack.append%283%29%0A%20%20%20%20stack.append%282%29%0A%20%20%20%20stack.append%285%29%0A%20%20%20%20stack.append%284%29%0A%20%20%20%20print%28%22%D1%81%D1%82%D0%B5%D0%BA%20stack%20%3D%22%2C%20stack%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%0A%20%20%20%20peek%20%3D%20stack%5B-1%5D%0A%20%20%20%20print%28%22%D0%92%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%20peek%20%3D%22%2C%20peek%29%0A%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%0A%20%20%20%20pop%20%3D%20stack.pop%28%29%0A%20%20%20%20print%28%22%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B8%D0%B7%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20pop%20%3D%22%2C%20pop%29%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20stack%20%3D%22%2C%20stack%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%83%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%0A%20%20%20%20size%20%3D%20len%28stack%29%0A%20%20%20%20print%28%22%D0%94%D0%BB%D0%B8%D0%BD%D0%B0%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%20size%20%3D%22%2C%20size%29%0A%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C%2C%20%D0%BF%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0%0A%20%20%20%20is_empty%20%3D%20len%28stack%29%20%3D%3D%200%0A%20%20%20%20print%28%22%D0%9F%D1%83%D1%81%D1%82%20%D0%BB%D0%B8%20%D1%81%D1%82%D0%B5%D0%BA%20%3D%22%2C%20is_empty%29&cumulative=false&curInstr=2&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +## Реализация стека + +Чтобы глубже понять механизм работы стека, попробуем самостоятельно реализовать класс стека. + +Стек подчиняется принципу LIFO, поэтому мы можем добавлять и удалять элементы только на вершине. Однако и массив, и связный список позволяют добавлять и удалять элементы в произвольном месте. **Следовательно, стек можно рассматривать как ограниченный массив или связный список**. Иными словами, мы можем "скрыть" часть нерелевантных операций массива или списка, так чтобы внешняя логика соответствовала свойствам стека. + +### Реализация на основе связного списка + +Если реализовывать стек на основе связного списка, то головной узел списка можно рассматривать как вершину стека, а хвостовой - как основание. + +Как показано на рисунке ниже, для операции push достаточно вставить элемент в голову связного списка. Такой способ вставки называется "вставкой в голову". Для операции pop достаточно удалить головной узел из списка. + +=== "LinkedListStack" + ![Операции push и pop в реализации стека на связном списке](stack.assets/linkedlist_stack_step1.png) + +=== "push()" + ![linkedlist_stack_push](stack.assets/linkedlist_stack_step2_push.png) + +=== "pop()" + ![linkedlist_stack_pop](stack.assets/linkedlist_stack_step3_pop.png) + +Ниже приведен пример кода реализации стека на основе связного списка: + +```src +[file]{linkedlist_stack}-[class]{linked_list_stack}-[func]{} +``` + +### Реализация на основе массива + +Если реализовывать стек на основе массива, то хвост массива можно рассматривать как вершину стека. Как показано на рисунке ниже, операции push и pop соответствуют добавлению элемента в конец массива и удалению элемента из конца, обе имеют временную сложность $O(1)$ . + +=== "ArrayStack" + ![Операции push и pop в реализации стека на массиве](stack.assets/array_stack_step1.png) + +=== "push()" + ![array_stack_push](stack.assets/array_stack_step2_push.png) + +=== "pop()" + ![array_stack_pop](stack.assets/array_stack_step3_pop.png) + +Поскольку количество элементов, помещаемых в стек, может непрерывно расти, мы можем использовать динамический массив и тем самым не заниматься расширением массива вручную. Ниже приведен пример кода: + +```src +[file]{array_stack}-[class]{array_stack}-[func]{} +``` + +## Сравнение двух реализаций + +**Поддерживаемые операции** + +Обе реализации поддерживают все операции, определенные для стека. Реализация на массиве дополнительно позволяет выполнять произвольный доступ, но это уже выходит за рамки определения стека и обычно не используется. + +**Временная эффективность** + +В реализации на массиве и push, и pop выполняются в заранее выделенной непрерывной памяти, которая хорошо использует локальность кэша, поэтому такие операции обычно эффективнее. Однако если при push емкость массива оказывается превышена, включается механизм расширения, и временная сложность конкретно этой операции push становится $O(n)$ . + +В реализации на связном списке расширение выполняется очень гибко, и проблемы падения эффективности из-за расширения массива здесь нет. Но сама операция push требует инициализации объекта-узла и изменения указателей, поэтому в среднем она немного менее эффективна. Впрочем, если помещаемые в стек элементы уже сами являются объектами-узлами, шаг инициализации можно пропустить и тем самым повысить эффективность. + +Итак, когда элементами, помещаемыми и извлекаемыми из стека, являются базовые типы данных, например `int` или `double` , можно сделать следующие выводы. + +- Стек на основе массива теряет в эффективности в моменты расширения, но поскольку расширение происходит редко, его средняя эффективность выше. +- Стек на основе связного списка может обеспечивать более стабильную производительность. + +**Пространственная эффективность** + +При инициализации списка система выделяет "начальную емкость", которая может превышать реальную потребность. Кроме того, механизм расширения обычно увеличивает емкость по некоторому коэффициенту (например в 2 раза), и расширенная емкость тоже может оказаться больше фактически необходимой. Поэтому **реализация стека на основе массива может приводить к некоторым потерям памяти**. + +Однако, поскольку узлы связного списка должны дополнительно хранить указатели, **узлы списка сами по себе занимают больше пространства**. + +В итоге нельзя просто сказать, какая из реализаций более экономна по памяти; это нужно анализировать в контексте конкретной задачи. + +## Типичные применения стека + +- **Кнопки "назад" и "вперед" в браузере, undo и redo в программах**. Каждый раз, когда мы открываем новую страницу, браузер помещает предыдущую страницу в стек, чтобы по операции "назад" можно было вернуться к ней. Операция "назад" по сути является pop. Если нужно одновременно поддерживать и "назад", и "вперед", то обычно используются два стека. +- **Управление памятью программы**. Каждый раз при вызове функции система помещает на вершину стека стековый кадр, в котором хранится контекст функции. В рекурсивной функции на этапе углубления рекурсии непрерывно выполняются push-операции, а на этапе возврата - pop-операции. diff --git a/ru/docs/chapter_stack_and_queue/summary.md b/ru/docs/chapter_stack_and_queue/summary.md new file mode 100644 index 000000000..6c9267786 --- /dev/null +++ b/ru/docs/chapter_stack_and_queue/summary.md @@ -0,0 +1,31 @@ +# Краткие итоги + +### Основные моменты + +- Стек - это структура данных, следующая правилу "последним пришел - первым вышел", и его можно реализовать с помощью массива или связного списка. +- С точки зрения временной эффективности реализация стека на массиве обычно работает быстрее в среднем, но во время расширения емкости временная сложность отдельной операции push может ухудшаться до $O(n)$ . Напротив, реализация стека на связном списке дает более стабильные характеристики. +- С точки зрения использования памяти реализация стека на массиве может приводить к некоторой потере пространства. Однако следует учитывать, что узлы связного списка занимают больше памяти, чем элементы массива. +- Очередь - это структура данных, следующая правилу "первым пришел - первым вышел", и ее также можно реализовать с помощью массива или связного списка. Сравнение временной и пространственной эффективности для очереди в целом приводит к тем же выводам, что и для стека. +- Двусторонняя очередь - это очередь с более высокой степенью свободы, которая позволяет добавлять и удалять элементы с обеих сторон. + +### Q & A + +**Q**: Реализованы ли кнопки "вперед" и "назад" в браузере с помощью двусвязного списка? + +По сути, функция переходов "вперед/назад" в браузере отражает логику "стека". Когда пользователь открывает новую страницу, она помещается на вершину стека; когда пользователь нажимает кнопку "назад", эта страница снимается с вершины стека. Двусторонняя очередь позволяет удобно реализовать некоторые дополнительные операции, об этом уже упоминалось в разделе "Двусторонняя очередь". + +**Q**: Нужно ли освобождать память узла после извлечения его из стека? + +Если извлеченный узел еще понадобится, память освобождать не нужно. Если он больше не нужен, то в языках `Java` и `Python` есть автоматический сборщик мусора, поэтому ручное освобождение памяти не требуется; в `C` и `C++` память нужно освобождать вручную. + +**Q**: Двусторонняя очередь выглядит как два соединенных стека. Для чего она нужна? + +Двусторонняя очередь похожа на комбинацию стека и очереди или на два соединенных стека. Она выражает логику "стек + очередь", поэтому может покрыть все применения стека и очереди и при этом остается более гибкой. + +**Q**: Как именно реализуются отмена (undo) и повтор (redo)? + +Используются два стека: стек `A` для отмены и стек `B` для повтора. + +1. Каждый раз, когда пользователь выполняет действие, это действие помещается в стек `A` , а стек `B` очищается. +2. Когда пользователь выполняет "undo", последнее действие извлекается из стека `A` и помещается в стек `B` . +3. Когда пользователь выполняет "redo", последнее действие извлекается из стека `B` и помещается обратно в стек `A` . diff --git a/ru/docs/chapter_tree/array_representation_of_tree.assets/array_representation_binary_tree.png b/ru/docs/chapter_tree/array_representation_of_tree.assets/array_representation_binary_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..f1387c98fdac1d0932a900d57fa397d6c5086646 GIT binary patch literal 22965 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 b*GYjClJ!L@r-JMO_4!BNSg%Y6`S3pgZ%!*6 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/array_representation_of_tree.assets/array_representation_complete_binary_tree.png b/ru/docs/chapter_tree/array_representation_of_tree.assets/array_representation_complete_binary_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..c88639fe271579f158acc7ca8ed69317f8b1d206 GIT binary patch literal 16397 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 PKM|G~TeEr-eA52_ShzfP literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/array_representation_of_tree.assets/array_representation_without_empty.png b/ru/docs/chapter_tree/array_representation_of_tree.assets/array_representation_without_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..93f94c910b69916e22448b681472b83f58a40e60 GIT binary patch literal 14353 zcmb8VWpETv^e()+*=*e1owyss-91Ezv2k}H&O%&?yAk&Ui0cLd#N9o_mAK2h{QmcT zxb=Rxb+>A&`}A|{(9$cQdz42*5V4O`o;r#$fZ7qtJ%j+Zl~$Jq0KR;}crgEG &MTK@U@`D5FM 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

        Таблица   Условия выбора для четырех случаев вращений

        + +| Баланс-фактор разбалансированного узла | Баланс-фактор дочернего узла | Какое вращение использовать | +| -------------------------------------- | ---------------------------- | --------------------------- | +| $> 1$ (левостороннее дерево) | $\geq 0$ | Правое вращение | +| $> 1$ (левостороннее дерево) | $<0$ | Сначала левое, затем правое | +| $< -1$ (правостороннее дерево) | $\leq 0$ | Левое вращение | +| $< -1$ (правостороннее дерево) | $>0$ | Сначала правое, затем левое | + +Для удобства мы инкапсулируем операцию вращения в отдельную функцию. **С помощью этой функции можно выполнить корректное вращение для любой ситуации разбаланса и снова привести узел в сбалансированное состояние**. Код приведен ниже: + +```src +[file]{avl_tree}-[class]{avl_tree}-[func]{rotate} +``` + +## Распространенные операции AVL-дерева + +### Вставка узла + +Операция вставки узла в AVL-дерево по основному процессу похожа на вставку в двоичное дерево поиска. Единственная разница состоит в том, что после вставки в AVL-дерево на пути от вставленного узла к корню может появиться цепочка разбалансированных узлов. Поэтому **начиная от этого узла, мы должны выполнять вращения снизу вверх, чтобы вернуть в баланс все разбалансированные узлы**. Код приведен ниже: + +```src +[file]{avl_tree}-[class]{avl_tree}-[func]{insert_helper} +``` + +### Удаление узла + +Аналогично, на основе метода удаления узла из двоичного дерева поиска нужно добавить вращения снизу вверх, чтобы восстановить баланс всех разбалансированных узлов. Код приведен ниже: + +```src +[file]{avl_tree}-[class]{avl_tree}-[func]{remove_helper} +``` + +### Поиск узла + +Операция поиска узла в AVL-дереве совпадает с поиском в двоичном дереве поиска, поэтому здесь она повторно не рассматривается. + +## Типичные применения AVL-дерева + +- Организация и хранение больших массивов данных, особенно в сценариях с частым поиском и относительно редкими вставками и удалениями. +- Использование при построении индексных систем в базах данных. +- Красно-черное дерево тоже является распространенным видом сбалансированного двоичного дерева поиска. По сравнению с AVL-деревом условия баланса у красно-черного дерева мягче, поэтому при вставке и удалении требуется меньше вращений, а средняя эффективность операций добавления и удаления выше. diff --git a/ru/docs/chapter_tree/binary_search_tree.assets/binary_search_tree.png b/ru/docs/chapter_tree/binary_search_tree.assets/binary_search_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..7eb767d5bdc87e913db0a15dfc47f3ead859ab13 GIT binary patch literal 8147 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 XXe(q*>~9hR|Jf+Ysmazzn}_}nuvBdR literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_search_tree.assets/bst_inorder_traversal.png b/ru/docs/chapter_tree/binary_search_tree.assets/bst_inorder_traversal.png new file mode 100644 index 0000000000000000000000000000000000000000..49e5144e7d40104f858af4ea280ec4613477d2b6 GIT binary patch literal 23534 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_search_tree.assets/bst_insert.png b/ru/docs/chapter_tree/binary_search_tree.assets/bst_insert.png new file mode 100644 index 0000000000000000000000000000000000000000..26f6b8bbf043028920cf666ae8cf02c409af9e38 GIT binary patch literal 20592 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 Z6sgXZCyS@qC5``vYO3qpC{eWu`yX}ko4No1 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_search_tree.assets/bst_remove_case3_step1.png b/ru/docs/chapter_tree/binary_search_tree.assets/bst_remove_case3_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..b7fa9143f4d540f7f241775075598d58225e0d75 GIT binary patch literal 12574 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 JM+N)%zW`yJ1jhgX literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_search_tree.assets/bst_remove_case3_step2.png b/ru/docs/chapter_tree/binary_search_tree.assets/bst_remove_case3_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..efd772865256d20a612c9906f13070ca1c6eed3f GIT binary patch literal 20383 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_search_tree.assets/bst_remove_case3_step3.png b/ru/docs/chapter_tree/binary_search_tree.assets/bst_remove_case3_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae00b2acfbb08be611e5a2eb64163c0421d6ad1 GIT binary patch literal 21270 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 Q+u2TC&AS?9YN%)b1NC0|Qvd(} literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_search_tree.assets/bst_remove_case3_step4.png b/ru/docs/chapter_tree/binary_search_tree.assets/bst_remove_case3_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..189acb6c98b484c6e70dadff67f07ff8668713e7 GIT binary patch literal 23392 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

        I%$)z5`sf+~f#XTk*8Vh*Pf+~B}fs~l8KFW^9 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 au4@SAxIAkdbaV1=h=Po&bkQ@o@Bab56y=Bj literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_search_tree.assets/bst_search_step2.png b/ru/docs/chapter_tree/binary_search_tree.assets/bst_search_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..0d0aee43c8b60dbdaa6d7dabf31ca8a6f812093c GIT binary patch literal 12471 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 DCtvHa literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_search_tree.assets/bst_search_step3.png b/ru/docs/chapter_tree/binary_search_tree.assets/bst_search_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..2fa5f6228616b738cc3e17782b71bc543d4234ca GIT binary patch literal 13232 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 IBJ$<`2l6RxM*si- literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_search_tree.md b/ru/docs/chapter_tree/binary_search_tree.md new file mode 100644 index 000000000..31f1d0ef7 --- /dev/null +++ b/ru/docs/chapter_tree/binary_search_tree.md @@ -0,0 +1,129 @@ +# Двоичное дерево поиска + +Как показано на рисунке ниже, двоичное дерево поиска (binary search tree) удовлетворяет следующим условиям. + +1. Для корневого узла все значения в левом поддереве меньше значения корневого узла, а все значения в правом поддереве больше значения корневого узла. +2. Левое и правое поддеревья любого узла также являются двоичными деревьями поиска, то есть тоже удовлетворяют условию `1.` . + +![Двоичное дерево поиска](binary_search_tree.assets/binary_search_tree.png) + +## Операции с двоичным деревом поиска + +Мы инкапсулируем двоичное дерево поиска в класс `BinarySearchTree` и объявляем переменную-член `root` , которая указывает на корневой узел дерева. + +### Поиск узла + +Для заданного целевого значения узла `num` можно выполнить поиск, опираясь на свойства двоичного дерева поиска. Как показано на рисунках ниже, мы объявляем узел `cur` , стартуем от корня дерева `root` и циклически сравниваем значения `cur.val` и `num` . + +- Если `cur.val < num` , это означает, что целевой узел находится в правом поддереве `cur` , поэтому выполняем `cur = cur.right` . +- Если `cur.val > num` , это означает, что целевой узел находится в левом поддереве `cur` , поэтому выполняем `cur = cur.left` . +- Если `cur.val = num` , это означает, что целевой узел найден, и мы выходим из цикла, возвращая этот узел. + +=== "<1>" + ![Пример поиска узла в двоичном дереве поиска](binary_search_tree.assets/bst_search_step1.png) + +=== "<2>" + ![bst_search_step2](binary_search_tree.assets/bst_search_step2.png) + +=== "<3>" + ![bst_search_step3](binary_search_tree.assets/bst_search_step3.png) + +=== "<4>" + ![bst_search_step4](binary_search_tree.assets/bst_search_step4.png) + +Операция поиска в двоичном дереве поиска работает по тому же принципу, что и бинарный поиск: на каждом шаге она отбрасывает половину вариантов. Число итераций не превосходит высоты двоичного дерева, а когда дерево сбалансировано, требуется $O(\log n)$ времени. Пример кода приведен ниже: + +```src +[file]{binary_search_tree}-[class]{binary_search_tree}-[func]{search} +``` + +### Вставка узла + +Пусть дан элемент `num` , который нужно вставить. Чтобы сохранить свойство двоичного дерева поиска "левое поддерево < корень < правое поддерево", процесс вставки выглядит следующим образом. + +1. **Найти позицию для вставки**: как и в операции поиска, начиная от корня, мы циклически спускаемся вниз в зависимости от соотношения между текущим значением узла и `num` , пока не выйдем за листовой узел (то есть не дойдем до `None` ). +2. **Вставить узел в найденную позицию**: инициализировать узел `num` и поставить его на место этого `None` . + +![Вставка узла в двоичное дерево поиска](binary_search_tree.assets/bst_insert.png) + +В реализации кода нужно обратить внимание на следующие два момента. + +- Двоичное дерево поиска не допускает дублирующихся узлов, иначе его определение будет нарушено. Поэтому если вставляемый узел уже существует в дереве, вставка не выполняется и функция сразу возвращается. +- Чтобы реализовать вставку, нам нужно использовать узел `pre` для сохранения узла предыдущей итерации цикла. Тогда, когда обход дойдет до `None` , мы сможем получить его родителя и завершить вставку. + +```src +[file]{binary_search_tree}-[class]{binary_search_tree}-[func]{insert} +``` + +Как и поиск узла, вставка узла требует $O(\log n)$ времени. + +### Удаление узла + +Сначала нужно найти в двоичном дереве целевой узел, а затем удалить его. Как и при вставке, после удаления необходимо сохранить свойство двоичного дерева поиска: "левое поддерево < корень < правое поддерево". Поэтому в зависимости от числа дочерних узлов у удаляемого узла, то есть для случаев со степенью 0, 1 и 2, выполняются разные операции удаления. + +Как показано на рисунке ниже, когда степень удаляемого узла равна $0$ , это значит, что узел является листом и может быть удален напрямую. + +![Удаление узла в двоичном дереве поиска (степень 0)](binary_search_tree.assets/bst_remove_case1.png) + +Как показано на рисунке ниже, когда степень удаляемого узла равна $1$ , достаточно заменить удаляемый узел его дочерним узлом. + +![Удаление узла в двоичном дереве поиска (степень 1)](binary_search_tree.assets/bst_remove_case2.png) + +Когда степень удаляемого узла равна $2$ , мы уже не можем удалить его напрямую и должны использовать для замены другой узел. Чтобы сохранить свойство двоичного дерева поиска "левое поддерево $<$ корень $<$ правое поддерево", **этим узлом может быть минимальный узел правого поддерева или максимальный узел левого поддерева**. + +Предположим, мы выбираем минимальный узел правого поддерева, то есть следующий узел в симметричном обходе. Тогда процесс удаления выглядит так. + +1. Найти следующий узел в "последовательности симметричного обхода" для удаляемого узла и обозначить его как `tmp` . +2. Значением `tmp` перезаписать значение удаляемого узла, а затем рекурсивно удалить узел `tmp` из дерева. + +=== "<1>" + ![Удаление узла в двоичном дереве поиска (степень 2)](binary_search_tree.assets/bst_remove_case3_step1.png) + +=== "<2>" + ![bst_remove_case3_step2](binary_search_tree.assets/bst_remove_case3_step2.png) + +=== "<3>" + ![bst_remove_case3_step3](binary_search_tree.assets/bst_remove_case3_step3.png) + +=== "<4>" + ![bst_remove_case3_step4](binary_search_tree.assets/bst_remove_case3_step4.png) + +Операция удаления узла также требует $O(\log n)$ времени, где поиск удаляемого узла стоит $O(\log n)$ , а получение следующего узла симметричного обхода также требует $O(\log n)$ . Пример кода приведен ниже: + +```src +[file]{binary_search_tree}-[class]{binary_search_tree}-[func]{remove} +``` + +### Упорядоченность симметричного обхода + +Как показано на рисунке ниже, симметричный обход двоичного дерева следует порядку "лево $\rightarrow$ корень $\rightarrow$ право", а двоичное дерево поиска удовлетворяет соотношению "левый дочерний узел $<$ корень $<$ правый дочерний узел". + +Это означает, что при симметричном обходе двоичного дерева поиска мы всегда сначала будем посещать следующий минимальный узел, и отсюда получается важное свойство: **последовательность симметричного обхода двоичного дерева поиска является возрастающей**. + +Используя это свойство возрастающей последовательности симметричного обхода, мы можем получить отсортированные данные из двоичного дерева поиска всего за $O(n)$ времени, без дополнительной сортировки, что очень эффективно. + +![Последовательность симметричного обхода двоичного дерева поиска](binary_search_tree.assets/bst_inorder_traversal.png) + +## Эффективность двоичного дерева поиска + +Для заданного набора данных можно рассмотреть хранение либо в массиве, либо в двоичном дереве поиска. Из таблицы ниже видно, что временная сложность операций двоичного дерева поиска имеет логарифмический порядок, поэтому его производительность стабильна и высока. Только в сценариях с очень частыми вставками и редкими поисками и удалениями массив может быть эффективнее, чем двоичное дерево поиска. + +

        Таблица   Сравнение эффективности массива и дерева поиска

        + +| | Неупорядоченный массив | Двоичное дерево поиска | +| -------- | ---------------------- | ---------------------- | +| Поиск элемента | $O(n)$ | $O(\log n)$ | +| Вставка элемента | $O(1)$ | $O(\log n)$ | +| Удаление элемента | $O(n)$ | $O(\log n)$ | + +В идеальном случае двоичное дерево поиска является "сбалансированным", и тогда любой узел можно найти за $\log n$ итераций. + +Однако если в двоичное дерево поиска непрерывно вставлять и удалять узлы, оно может выродиться в связный список, как показано на рисунке ниже. Тогда временная сложность различных операций тоже вырождается до $O(n)$ . + +![Деградация двоичного дерева поиска](binary_search_tree.assets/bst_degradation.png) + +## Типичные применения двоичного дерева поиска + +- Используется как многоуровневый индекс в системах, обеспечивая эффективный поиск, вставку и удаление. +- Служит базовой структурой данных для некоторых поисковых алгоритмов. +- Применяется для хранения потока данных в отсортированном состоянии. diff --git a/ru/docs/chapter_tree/binary_tree.assets/balanced_binary_tree.png b/ru/docs/chapter_tree/binary_tree.assets/balanced_binary_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..4b74f1c441f0a642f3aa45d4f4c3d3760e182f10 GIT binary patch literal 13045 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 K&nx9%Z~hnD3W^N? literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_tree.assets/binary_tree_add_remove.png b/ru/docs/chapter_tree/binary_tree.assets/binary_tree_add_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..b38ca26802eae908f7af03731dd76460de5a1506 GIT binary patch literal 16328 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 A)c^nh literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_tree.assets/binary_tree_best_worst_cases.png b/ru/docs/chapter_tree/binary_tree.assets/binary_tree_best_worst_cases.png new file mode 100644 index 0000000000000000000000000000000000000000..d49d6d7f83b894d0872ec2a08b3b3509ab1e276c GIT binary patch literal 14844 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 z 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 A-v9sr literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_tree.assets/binary_tree_definition.png b/ru/docs/chapter_tree/binary_tree.assets/binary_tree_definition.png new file mode 100644 index 0000000000000000000000000000000000000000..507db3dc31ad6ec587ea83b483402f093b171437 GIT binary patch literal 19479 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 R_t`K2fv2mV%Q~loCIA91ZJ7W7 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_tree.assets/binary_tree_terminology.png b/ru/docs/chapter_tree/binary_tree.assets/binary_tree_terminology.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e5fd63ebc1877a9b2fae891b08e2a9d9604c51 GIT binary patch literal 16527 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_tree.assets/full_binary_tree.png b/ru/docs/chapter_tree/binary_tree.assets/full_binary_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..26bb60c87276fdf7d1c55c2bd3cb0d3dd5a6bc63 GIT binary patch literal 7678 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⪻Tv6A4*)6X;hZo*b$T|D=&( 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 DHafe) literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_tree.md b/ru/docs/chapter_tree/binary_tree.md new file mode 100644 index 000000000..1dafa53a7 --- /dev/null +++ b/ru/docs/chapter_tree/binary_tree.md @@ -0,0 +1,674 @@ +# Двоичное дерево + +Двоичное дерево (binary tree) - это нелинейная структура данных, представляющая отношения порождения между "предками" и "потомками" и отражающая логику "разделения надвое". Подобно связному списку, базовой единицей двоичного дерева является узел; каждый узел содержит значение, ссылку на левого дочернего узла и ссылку на правого дочернего узла. + +=== "Python" + + ```python title="" + class TreeNode: + """Класс узла двоичного дерева""" + def __init__(self, val: int): + self.val: int = val # Значение узла + self.left: TreeNode | None = None # Ссылка на левого дочернего узла + self.right: TreeNode | None = None # Ссылка на правого дочернего узла + ``` + +=== "C++" + + ```cpp title="" + /* Структура узла двоичного дерева */ + struct TreeNode { + int val; // Значение узла + TreeNode *left; // Указатель на левого дочернего узла + TreeNode *right; // Указатель на правого дочернего узла + TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} + }; + ``` + +=== "Java" + + ```java title="" + /* Класс узла двоичного дерева */ + class TreeNode { + int val; // Значение узла + TreeNode left; // Ссылка на левого дочернего узла + TreeNode right; // Ссылка на правого дочернего узла + TreeNode(int x) { val = x; } + } + ``` + +=== "C#" + + ```csharp title="" + /* Класс узла двоичного дерева */ + class TreeNode(int? x) { + public int? val = x; // Значение узла + public TreeNode? left; // Ссылка на левого дочернего узла + public TreeNode? right; // Ссылка на правого дочернего узла + } + ``` + +=== "Go" + + ```go title="" + /* Структура узла двоичного дерева */ + type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode + } + /* Конструктор */ + func NewTreeNode(v int) *TreeNode { + return &TreeNode{ + Left: nil, // Указатель на левого дочернего узла + Right: nil, // Указатель на правого дочернего узла + Val: v, // Значение узла + } + } + ``` + +=== "Swift" + + ```swift title="" + /* Класс узла двоичного дерева */ + class TreeNode { + var val: Int // Значение узла + var left: TreeNode? // Ссылка на левого дочернего узла + var right: TreeNode? // Ссылка на правого дочернего узла + + init(x: Int) { + val = x + } + } + ``` + +=== "JS" + + ```javascript title="" + /* Класс узла двоичного дерева */ + class TreeNode { + val; // Значение узла + left; // Указатель на левого дочернего узла + right; // Указатель на правого дочернего узла + constructor(val, left, right) { + this.val = val === undefined ? 0 : val; + this.left = left === undefined ? null : left; + this.right = right === undefined ? null : right; + } + } + ``` + +=== "TS" + + ```typescript title="" + /* Класс узла двоичного дерева */ + class TreeNode { + val: number; + left: TreeNode | null; + right: TreeNode | null; + + constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { + this.val = val === undefined ? 0 : val; // Значение узла + this.left = left === undefined ? null : left; // Ссылка на левого дочернего узла + this.right = right === undefined ? null : right; // Ссылка на правого дочернего узла + } + } + ``` + +=== "Dart" + + ```dart title="" + /* Класс узла двоичного дерева */ + class TreeNode { + int val; // Значение узла + TreeNode? left; // Ссылка на левого дочернего узла + TreeNode? right; // Ссылка на правого дочернего узла + TreeNode(this.val, [this.left, this.right]); + } + ``` + +=== "Rust" + + ```rust title="" + use std::rc::Rc; + use std::cell::RefCell; + + /* Структура узла двоичного дерева */ + struct TreeNode { + val: i32, // Значение узла + left: Option>>, // Ссылка на левого дочернего узла + right: Option>>, // Ссылка на правого дочернего узла + } + + impl TreeNode { + /* Конструктор */ + fn new(val: i32) -> Rc> { + Rc::new(RefCell::new(Self { + val, + left: None, + right: None + })) + } + } + ``` + +=== "C" + + ```c title="" + /* Структура узла двоичного дерева */ + typedef struct TreeNode { + int val; // Значение узла + int height; // Высота узла + struct TreeNode *left; // Указатель на левого дочернего узла + struct TreeNode *right; // Указатель на правого дочернего узла + } TreeNode; + + /* Конструктор */ + TreeNode *newTreeNode(int val) { + TreeNode *node; + + node = (TreeNode *)malloc(sizeof(TreeNode)); + node->val = val; + node->height = 0; + node->left = NULL; + node->right = NULL; + return node; + } + ``` + +=== "Kotlin" + + ```kotlin title="" + /* Класс узла двоичного дерева */ + class TreeNode(val _val: Int) { // Значение узла + val left: TreeNode? = null // Ссылка на левого дочернего узла + val right: TreeNode? = null // Ссылка на правого дочернего узла + } + ``` + +=== "Ruby" + + ```ruby title="" + ### Класс узла двоичного дерева ### + class TreeNode + attr_accessor :val # Значение узла + attr_accessor :left # Ссылка на левого дочернего узла + attr_accessor :right # Ссылка на правого дочернего узла + + def initialize(val) + @val = val + end + end + ``` + +Каждый узел имеет две ссылки (указателя), которые соответственно указывают на левого дочернего узла (left-child node) и правого дочернего узла (right-child node); данный узел называется родительским узлом (parent node) для этих двух дочерних узлов. Если задан некоторый узел двоичного дерева, то дерево, образованное его левым дочерним узлом и всеми узлами ниже него, называется левым поддеревом (left subtree) этого узла; аналогично определяется правое поддерево (right subtree). + +**В двоичном дереве, кроме листовых узлов, все остальные узлы содержат дочерние узлы и непустые поддеревья**. Как показано на рисунке ниже, если рассматривать "узел 2" как родительский, то его левым и правым дочерними узлами будут "узел 4" и "узел 5"; левое поддерево - это "узел 4 и дерево ниже него", а правое поддерево - это "узел 5 и дерево ниже него". + +![Родительский узел, дочерние узлы и поддеревья](binary_tree.assets/binary_tree_definition.png) + +## Распространенные термины двоичного дерева + +Распространенные термины двоичного дерева показаны на рисунке ниже. + +- Корневой узел (root node): узел, расположенный на верхнем уровне двоичного дерева и не имеющий родительского узла. +- Листовой узел (leaf node): узел без дочерних узлов; оба его указателя направлены на `None` . +- Ребро (edge): отрезок, соединяющий два узла, то есть ссылка (указатель) между узлами. +- Уровень (level) узла: увеличивается сверху вниз; уровень корневого узла равен 1 . +- Степень (degree) узла: число дочерних узлов данного узла. В двоичном дереве возможны степени 0, 1, 2 . +- Высота (height) двоичного дерева: число ребер от корневого узла до самого удаленного листового узла. +- Глубина (depth) узла: число ребер от корневого узла до данного узла. +- Высота (height) узла: число ребер от самого удаленного листового узла до данного узла. + +![Распространенные термины двоичного дерева](binary_tree.assets/binary_tree_terminology.png) + +!!! tip + + Обрати внимание: обычно под "высотой" и "глубиной" понимают "число пройденных ребер", но в некоторых задачах или учебниках их могут определять как "число пройденных узлов". В таком случае и высоту, и глубину нужно увеличить на 1 . + +## Базовые операции двоичного дерева + +### Инициализация двоичного дерева + +Как и в связном списке, сначала инициализируются узлы, а затем между ними строятся ссылки (указатели). + +=== "Python" + + ```python title="binary_tree.py" + # Инициализация двоичного дерева + # Инициализация узлов + n1 = TreeNode(val=1) + n2 = TreeNode(val=2) + n3 = TreeNode(val=3) + n4 = TreeNode(val=4) + n5 = TreeNode(val=5) + # Построение ссылок (указателей) между узлами + n1.left = n2 + n1.right = n3 + n2.left = n4 + n2.right = n5 + ``` + +=== "C++" + + ```cpp title="binary_tree.cpp" + /* Инициализация двоичного дерева */ + // Инициализация узлов + TreeNode* n1 = new TreeNode(1); + TreeNode* n2 = new TreeNode(2); + TreeNode* n3 = new TreeNode(3); + TreeNode* n4 = new TreeNode(4); + TreeNode* n5 = new TreeNode(5); + // Построение ссылок (указателей) между узлами + n1->left = n2; + n1->right = n3; + n2->left = n4; + n2->right = n5; + ``` + +=== "Java" + + ```java title="binary_tree.java" + // Инициализация узлов + TreeNode n1 = new TreeNode(1); + TreeNode n2 = new TreeNode(2); + TreeNode n3 = new TreeNode(3); + TreeNode n4 = new TreeNode(4); + TreeNode n5 = new TreeNode(5); + // Построение ссылок (указателей) между узлами + n1.left = n2; + n1.right = n3; + n2.left = n4; + n2.right = n5; + ``` + +=== "C#" + + ```csharp title="binary_tree.cs" + /* Инициализация двоичного дерева */ + // Инициализация узлов + TreeNode n1 = new(1); + TreeNode n2 = new(2); + TreeNode n3 = new(3); + TreeNode n4 = new(4); + TreeNode n5 = new(5); + // Построение ссылок (указателей) между узлами + n1.left = n2; + n1.right = n3; + n2.left = n4; + n2.right = n5; + ``` + +=== "Go" + + ```go title="binary_tree.go" + /* Инициализация двоичного дерева */ + // Инициализация узлов + n1 := NewTreeNode(1) + n2 := NewTreeNode(2) + n3 := NewTreeNode(3) + n4 := NewTreeNode(4) + n5 := NewTreeNode(5) + // Построение ссылок (указателей) между узлами + n1.Left = n2 + n1.Right = n3 + n2.Left = n4 + n2.Right = n5 + ``` + +=== "Swift" + + ```swift title="binary_tree.swift" + // Инициализация узлов + let n1 = TreeNode(x: 1) + let n2 = TreeNode(x: 2) + let n3 = TreeNode(x: 3) + let n4 = TreeNode(x: 4) + let n5 = TreeNode(x: 5) + // Построение ссылок (указателей) между узлами + n1.left = n2 + n1.right = n3 + n2.left = n4 + n2.right = n5 + ``` + +=== "JS" + + ```javascript title="binary_tree.js" + /* Инициализация двоичного дерева */ + // Инициализация узлов + let n1 = new TreeNode(1), + n2 = new TreeNode(2), + n3 = new TreeNode(3), + n4 = new TreeNode(4), + n5 = new TreeNode(5); + // Построение ссылок (указателей) между узлами + n1.left = n2; + n1.right = n3; + n2.left = n4; + n2.right = n5; + ``` + +=== "TS" + + ```typescript title="binary_tree.ts" + /* Инициализация двоичного дерева */ + // Инициализация узлов + let n1 = new TreeNode(1), + n2 = new TreeNode(2), + n3 = new TreeNode(3), + n4 = new TreeNode(4), + n5 = new TreeNode(5); + // Построение ссылок (указателей) между узлами + n1.left = n2; + n1.right = n3; + n2.left = n4; + n2.right = n5; + ``` + +=== "Dart" + + ```dart title="binary_tree.dart" + /* Инициализация двоичного дерева */ + // Инициализация узлов + TreeNode n1 = new TreeNode(1); + TreeNode n2 = new TreeNode(2); + TreeNode n3 = new TreeNode(3); + TreeNode n4 = new TreeNode(4); + TreeNode n5 = new TreeNode(5); + // Построение ссылок (указателей) между узлами + n1.left = n2; + n1.right = n3; + n2.left = n4; + n2.right = n5; + ``` + +=== "Rust" + + ```rust title="binary_tree.rs" + // Инициализация узлов + let n1 = TreeNode::new(1); + let n2 = TreeNode::new(2); + let n3 = TreeNode::new(3); + let n4 = TreeNode::new(4); + let n5 = TreeNode::new(5); + // Построение ссылок (указателей) между узлами + n1.borrow_mut().left = Some(n2.clone()); + n1.borrow_mut().right = Some(n3); + n2.borrow_mut().left = Some(n4); + n2.borrow_mut().right = Some(n5); + ``` + +=== "C" + + ```c title="binary_tree.c" + /* Инициализация двоичного дерева */ + // Инициализация узлов + TreeNode *n1 = newTreeNode(1); + TreeNode *n2 = newTreeNode(2); + TreeNode *n3 = newTreeNode(3); + TreeNode *n4 = newTreeNode(4); + TreeNode *n5 = newTreeNode(5); + // Построение ссылок (указателей) между узлами + n1->left = n2; + n1->right = n3; + n2->left = n4; + n2->right = n5; + ``` + +=== "Kotlin" + + ```kotlin title="binary_tree.kt" + // Инициализация узлов + val n1 = TreeNode(1) + val n2 = TreeNode(2) + val n3 = TreeNode(3) + val n4 = TreeNode(4) + val n5 = TreeNode(5) + // Построение ссылок (указателей) между узлами + n1.left = n2 + n1.right = n3 + n2.left = n4 + n2.right = n5 + ``` + +=== "Ruby" + + ```ruby title="binary_tree.rb" + # Инициализация двоичного дерева + # Инициализация узлов + n1 = TreeNode.new(1) + n2 = TreeNode.new(2) + n3 = TreeNode.new(3) + n4 = TreeNode.new(4) + n5 = TreeNode.new(5) + # Построение ссылок (указателей) между узлами + n1.left = n2 + n1.right = n3 + n2.left = n4 + n2.right = n5 + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20n1%20%3D%20TreeNode%28val%3D1%29%0A%20%20%20%20n2%20%3D%20TreeNode%28val%3D2%29%0A%20%20%20%20n3%20%3D%20TreeNode%28val%3D3%29%0A%20%20%20%20n4%20%3D%20TreeNode%28val%3D4%29%0A%20%20%20%20n5%20%3D%20TreeNode%28val%3D5%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%83%D0%B7%D0%BB%D0%B0%D0%BC%D0%B8%20%28%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D0%B8%29%0A%20%20%20%20n1.left%20%3D%20n2%0A%20%20%20%20n1.right%20%3D%20n3%0A%20%20%20%20n2.left%20%3D%20n4%0A%20%20%20%20n2.right%20%3D%20n5&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +### Вставка и удаление узлов + +Как и в связном списке, вставка и удаление узлов в двоичном дереве могут выполняться через изменение указателей. На рисунке ниже приведен пример. + +![Вставка и удаление узлов в двоичном дереве](binary_tree.assets/binary_tree_add_remove.png) + +=== "Python" + + ```python title="binary_tree.py" + # Вставка и удаление узлов + p = TreeNode(0) + # Вставить узел P между n1 -> n2 + n1.left = p + p.left = n2 + # Удалить узел P + n1.left = n2 + ``` + +=== "C++" + + ```cpp title="binary_tree.cpp" + /* Вставка и удаление узлов */ + TreeNode* P = new TreeNode(0); + // Вставить узел P между n1 -> n2 + n1->left = P; + P->left = n2; + // Удалить узел P + n1->left = n2; + // Освободить память + delete P; + ``` + +=== "Java" + + ```java title="binary_tree.java" + TreeNode P = new TreeNode(0); + // Вставить узел P между n1 -> n2 + n1.left = P; + P.left = n2; + // Удалить узел P + n1.left = n2; + ``` + +=== "C#" + + ```csharp title="binary_tree.cs" + /* Вставка и удаление узлов */ + TreeNode P = new(0); + // Вставить узел P между n1 -> n2 + n1.left = P; + P.left = n2; + // Удалить узел P + n1.left = n2; + ``` + +=== "Go" + + ```go title="binary_tree.go" + /* Вставка и удаление узлов */ + // Вставить узел P между n1 -> n2 + p := NewTreeNode(0) + n1.Left = p + p.Left = n2 + // Удалить узел P + n1.Left = n2 + ``` + +=== "Swift" + + ```swift title="binary_tree.swift" + let P = TreeNode(x: 0) + // Вставить узел P между n1 -> n2 + n1.left = P + P.left = n2 + // Удалить узел P + n1.left = n2 + ``` + +=== "JS" + + ```javascript title="binary_tree.js" + /* Вставка и удаление узлов */ + let P = new TreeNode(0); + // Вставить узел P между n1 -> n2 + n1.left = P; + P.left = n2; + // Удалить узел P + n1.left = n2; + ``` + +=== "TS" + + ```typescript title="binary_tree.ts" + /* Вставка и удаление узлов */ + const P = new TreeNode(0); + // Вставить узел P между n1 -> n2 + n1.left = P; + P.left = n2; + // Удалить узел P + n1.left = n2; + ``` + +=== "Dart" + + ```dart title="binary_tree.dart" + /* Вставка и удаление узлов */ + TreeNode P = new TreeNode(0); + // Вставить узел P между n1 -> n2 + n1.left = P; + P.left = n2; + // Удалить узел P + n1.left = n2; + ``` + +=== "Rust" + + ```rust title="binary_tree.rs" + let p = TreeNode::new(0); + // Вставить узел P между n1 -> n2 + n1.borrow_mut().left = Some(p.clone()); + p.borrow_mut().left = Some(n2.clone()); + // Удалить узел p + n1.borrow_mut().left = Some(n2); + ``` + +=== "C" + + ```c title="binary_tree.c" + /* Вставка и удаление узлов */ + TreeNode *P = newTreeNode(0); + // Вставить узел P между n1 -> n2 + n1->left = P; + P->left = n2; + // Удалить узел P + n1->left = n2; + // Освободить память + free(P); + ``` + +=== "Kotlin" + + ```kotlin title="binary_tree.kt" + val P = TreeNode(0) + // Вставить узел P между n1 -> n2 + n1.left = P + P.left = n2 + // Удалить узел P + n1.left = n2 + ``` + +=== "Ruby" + + ```ruby title="binary_tree.rb" + # Вставка и удаление узлов + _p = TreeNode.new(0) + # Вставить узел _p между n1 -> n2 + n1.left = _p + _p.left = n2 + # Удалить узел + n1.left = n2 + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20n1%20%3D%20TreeNode%28val%3D1%29%0A%20%20%20%20n2%20%3D%20TreeNode%28val%3D2%29%0A%20%20%20%20n3%20%3D%20TreeNode%28val%3D3%29%0A%20%20%20%20n4%20%3D%20TreeNode%28val%3D4%29%0A%20%20%20%20n5%20%3D%20TreeNode%28val%3D5%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%83%D0%B7%D0%BB%D0%B0%D0%BC%D0%B8%20%28%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D0%B8%29%0A%20%20%20%20n1.left%20%3D%20n2%0A%20%20%20%20n1.right%20%3D%20n3%0A%20%20%20%20n2.left%20%3D%20n4%0A%20%20%20%20n2.right%20%3D%20n5%0A%0A%20%20%20%20%23%20%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%20%D0%B8%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%BE%D0%B2%0A%20%20%20%20p%20%3D%20TreeNode%280%29%0A%20%20%20%20%23%20%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%83%D0%B7%D0%B5%D0%BB%20P%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20n1%20-%3E%20n2%0A%20%20%20%20n1.left%20%3D%20p%0A%20%20%20%20p.left%20%3D%20n2%0A%20%20%20%20%23%20%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D1%83%D0%B7%D0%B5%D0%BB%20P%0A%20%20%20%20n1.left%20%3D%20n2&cumulative=false&curInstr=37&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false + +!!! tip + + Обрати внимание: вставка узла может изменить исходную логическую структуру двоичного дерева, а удаление узла обычно означает удаление этого узла вместе со всеми его поддеревьями. Поэтому в двоичном дереве операции вставки и удаления обычно являются частью более крупного набора операций, который и реализует осмысленное действие. + +## Распространенные типы двоичных деревьев + +### Идеальное двоичное дерево + +Как показано на рисунке ниже, идеальное двоичное дерево (perfect binary tree) полностью заполнено на всех уровнях. В идеальном двоичном дереве степень листовых узлов равна $0$ , а у всех остальных узлов степень равна $2$ ; если высота дерева равна $h$ , то общее число узлов равно $2^{h+1} - 1$ , что образует стандартную экспоненциальную зависимость и отражает часто встречающееся в природе явление клеточного деления. + +!!! tip + + Обрати внимание: в китайскоязычном сообществе идеальное двоичное дерево часто называют полностью заполненным двоичным деревом. + +![Идеальное двоичное дерево](binary_tree.assets/perfect_binary_tree.png) + +### Полное двоичное дерево + +Как показано на рисунке ниже, полное двоичное дерево (complete binary tree) допускает неполное заполнение только на самом нижнем уровне, причем узлы этого уровня должны непрерывно заполняться слева направо. Обрати внимание: идеальное двоичное дерево тоже является полным двоичным деревом. + +![Полное двоичное дерево](binary_tree.assets/complete_binary_tree.png) + +### Строгое двоичное дерево + +Как показано на рисунке ниже, строгое двоичное дерево (full binary tree) имеет у всех нелистовых узлов ровно двух дочерних узлов. + +![Строгое двоичное дерево](binary_tree.assets/full_binary_tree.png) + +### Сбалансированное двоичное дерево + +Как показано на рисунке ниже, в сбалансированном двоичном дереве (balanced binary tree) для любого узла абсолютное значение разности высот левого и правого поддеревьев не превышает 1 . + +![Сбалансированное двоичное дерево](binary_tree.assets/balanced_binary_tree.png) + +## Вырождение двоичного дерева + +На рисунке ниже показаны идеальная структура двоичного дерева и вырожденная структура. Когда каждый уровень двоичного дерева полностью заполнен узлами, мы получаем "идеальное двоичное дерево"; когда же все узлы смещаются к одной стороне, двоичное дерево вырождается в "связный список". + +- Идеальное двоичное дерево соответствует лучшему случаю и позволяет полностью раскрыть преимущества двоичного дерева с точки зрения "разделяй и властвуй". +- Связный список представляет противоположную крайность: все операции становятся линейными, а временная сложность деградирует до $O(n)$ . + +![Лучший и худший случаи структуры двоичного дерева](binary_tree.assets/binary_tree_best_worst_cases.png) + +Как показано в таблице ниже, в лучшем и худшем случаях число листовых узлов, общее число узлов, высота и другие характеристики двоичного дерева достигают максимума или минимума. + +

        Таблица   Лучший и худший случаи структуры двоичного дерева

        + +| | Идеальное двоичное дерево | Связный список | +| --------------------------- | ------------------------- | -------------- | +| Число узлов на уровне $i$ | $2^{i-1}$ | $1$ | +| Число листьев у дерева высоты $h$ | $2^h$ | $1$ | +| Общее число узлов у дерева высоты $h$ | $2^{h+1} - 1$ | $h + 1$ | +| Высота дерева с $n$ узлами | $\log_2 (n+1) - 1$ | $n - 1$ | diff --git a/ru/docs/chapter_tree/binary_tree_traversal.assets/binary_tree_bfs.png b/ru/docs/chapter_tree/binary_tree_traversal.assets/binary_tree_bfs.png new file mode 100644 index 0000000000000000000000000000000000000000..eff233bc8723e34604513caa10d81d4c1a2086a4 GIT binary patch literal 12214 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 NlAQX>Qd!H;{{dK)hW-Em literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_tree_traversal.assets/binary_tree_dfs.png b/ru/docs/chapter_tree/binary_tree_traversal.assets/binary_tree_dfs.png new file mode 100644 index 0000000000000000000000000000000000000000..6ae37dc3217327b1f61116768a8240b7a752a3e2 GIT binary patch literal 46457 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
        ?C`EGd1e(Bk7%VJ1M?!S$DxgdZ-Go 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step11.png b/ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step11.png new file mode 100644 index 0000000000000000000000000000000000000000..9f2799a3ee30f8eb2a90de7f8eb22fa2dcd2bce2 GIT binary patch literal 23416 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

        tJ!8E=9=^i~_)HXB_Z`YuG;A)RcU zpP#?O0!Kn+qHwWf?0$c6gUir(dxjzH6A3O;pe@$<8bIpZxInLYoiM=M$APR{#xP9bc! zHy0NSj*8V5rW^wL`duwVxS*5B;|x&q#!0iIQ5U$wp3}o%?W6RfF&f;@HaPQ?UMtApI~6%6Fw#y&?}^o3i4SQf=C<|Yqiwu3(`0}wrC!f%2 z9%bqf6JXhsSX7G*bZJ9r=Ld3prea@>El>yg|6GO+ zcG7RiJ058`IwJebr#Pi&jSe0+##Me4&mI){_YoTq*_B&}=?#XcFx$2(N!%RelvFv-?frpgGzb*C; z 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step2.png b/ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..34ce7e7b37365158db3cf82985cae70a0c796735 GIT binary patch literal 13743 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step4.png b/ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..f45987fc4438692f530b67d38719da76ddbf6d15 GIT binary patch literal 16107 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%0A`TRgn}Gw}+V+7RDUCQ-+X?ip7}`=+ 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 HN@xNAo8%a% literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step6.png b/ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..1a65ea9bd61b8517f156abb537f1fbe6018d6ee3 GIT binary patch literal 18110 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

        ^eG|amCQKx<_<(rpT2>zF?yG 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 CWK<&n literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step8.png b/ru/docs/chapter_tree/binary_tree_traversal.assets/preorder_step8.png new file mode 100644 index 0000000000000000000000000000000000000000..46a30526bdd0899ba27ca04e73d9e6797f564ac5 GIT binary patch literal 20515 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 z%0D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 UGynbu^KT+EQ>#m5#x76)17d{c3jhEB literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/binary_tree_traversal.md b/ru/docs/chapter_tree/binary_tree_traversal.md new file mode 100644 index 000000000..692a73f8c --- /dev/null +++ b/ru/docs/chapter_tree/binary_tree_traversal.md @@ -0,0 +1,89 @@ +# Обход двоичного дерева + +С точки зрения физической структуры дерево представляет собой разновидность структуры данных на основе связей, поэтому его обход выполняется через последовательный доступ к узлам по указателям. Однако дерево является нелинейной структурой данных, а значит, его обход сложнее, чем обход связного списка, и для него требуется использовать поисковые алгоритмы. + +К распространенным способам обхода двоичного дерева относятся обход по уровням, прямой обход, симметричный обход и обратный обход. + +## Обход по уровням + +Как показано на рисунке ниже, обход по уровням (level-order traversal) проходит двоичное дерево сверху вниз по уровням и на каждом уровне посещает узлы слева направо. + +По своей сути обход по уровням относится к обходу в ширину (breadth-first traversal), также называемому поиском в ширину (breadth-first search, BFS); он отражает идею "расширяться слой за слоем наружу". + +![Обход двоичного дерева по уровням](binary_tree_traversal.assets/binary_tree_bfs.png) + +### Код реализации + +Обход в ширину обычно реализуется с помощью "очереди". Очередь подчиняется правилу "первым пришел - первым вышел", а обход в ширину подчиняется правилу "продвигаться по уровням", поэтому стоящая за ними идея согласована. Код реализации приведен ниже: + +```src +[file]{binary_tree_bfs}-[class]{}-[func]{level_order} +``` + +### Анализ сложности + +- **Временная сложность равна $O(n)$** : все узлы посещаются по одному разу, поэтому требуется $O(n)$ времени, где $n$ - число узлов. +- **Пространственная сложность равна $O(n)$** : в худшем случае, то есть для полной двоичной деревообразной структуры, до достижения самого нижнего уровня в очереди одновременно может находиться до $(n + 1) / 2$ узлов, что требует $O(n)$ памяти. + +## Прямой, симметричный и обратный обходы + +Соответственно, прямой, симметричный и обратный обходы относятся к обходу в глубину (depth-first traversal), также называемому поиском в глубину (depth-first search, DFS); он отражает идею "сначала идти до конца, затем откатываться и продолжать". + +На рисунке ниже показан принцип работы обхода двоичного дерева в глубину. **Обход в глубину похож на то, как будто мы обходим всю двоичную структуру по внешнему контуру** , и у каждого узла встречаем три позиции, соответствующие прямому, симметричному и обратному обходам. + +![Прямой, симметричный и обратный обходы двоичного дерева поиска](binary_tree_traversal.assets/binary_tree_dfs.png) + +### Код реализации + +Поиск в глубину обычно реализуется через рекурсию: + +```src +[file]{binary_tree_dfs}-[class]{}-[func]{post_order} +``` + +!!! tip + + Поиск в глубину можно реализовать и итеративно; заинтересованные читатели могут изучить это самостоятельно. + +На рисунках ниже показан рекурсивный процесс прямого обхода двоичного дерева. Его можно разделить на две противоположные части: "вход в рекурсию" и "возврат". + +1. "Вход в рекурсию" означает запуск нового вызова функции; в этом процессе программа переходит к следующему узлу. +2. "Возврат" означает завершение вызова функции и возврат назад, то есть текущий узел уже полностью обработан. + +=== "<1>" + ![Рекурсивный процесс прямого обхода](binary_tree_traversal.assets/preorder_step1.png) + +=== "<2>" + ![preorder_step2](binary_tree_traversal.assets/preorder_step2.png) + +=== "<3>" + ![preorder_step3](binary_tree_traversal.assets/preorder_step3.png) + +=== "<4>" + ![preorder_step4](binary_tree_traversal.assets/preorder_step4.png) + +=== "<5>" + ![preorder_step5](binary_tree_traversal.assets/preorder_step5.png) + +=== "<6>" + ![preorder_step6](binary_tree_traversal.assets/preorder_step6.png) + +=== "<7>" + ![preorder_step7](binary_tree_traversal.assets/preorder_step7.png) + +=== "<8>" + ![preorder_step8](binary_tree_traversal.assets/preorder_step8.png) + +=== "<9>" + ![preorder_step9](binary_tree_traversal.assets/preorder_step9.png) + +=== "<10>" + ![preorder_step10](binary_tree_traversal.assets/preorder_step10.png) + +=== "<11>" + ![preorder_step11](binary_tree_traversal.assets/preorder_step11.png) + +### Анализ сложности + +- **Временная сложность равна $O(n)$** : все узлы посещаются по одному разу, поэтому требуется $O(n)$ времени. +- **Пространственная сложность равна $O(n)$** : в худшем случае, когда дерево вырождается в связный список, глубина рекурсии достигает $n$ , и система тратит $O(n)$ памяти на стек вызовов. diff --git a/ru/docs/chapter_tree/index.md b/ru/docs/chapter_tree/index.md new file mode 100644 index 000000000..3ee570bac --- /dev/null +++ b/ru/docs/chapter_tree/index.md @@ -0,0 +1,9 @@ +# Деревья + +![Деревья](../assets/covers/chapter_tree.jpg) + +!!! abstract + + Высокое дерево полно жизни: мощные корни, густая крона и раскидистые ветви. + + Оно наглядно показывает нам форму данных, построенную на принципе "разделяй и властвуй". diff --git a/ru/docs/chapter_tree/summary.md b/ru/docs/chapter_tree/summary.md new file mode 100644 index 000000000..03b37baea --- /dev/null +++ b/ru/docs/chapter_tree/summary.md @@ -0,0 +1,54 @@ +# Краткие итоги + +### Основные моменты + +- Двоичное дерево - это нелинейная структура данных, отражающая логику "разделения надвое". Каждый узел двоичного дерева содержит значение и два указателя, которые соответственно ведут к левому и правому дочерним узлам. +- Для любого узла двоичного дерева дерево, образованное его левым (правым) дочерним узлом и всеми нижележащими узлами, называется левым (правым) поддеревом этого узла. +- К связанным с двоичным деревом терминам относятся корневой узел, листовой узел, уровень, степень, ребро, высота, глубина и так далее. +- Инициализация двоичного дерева, вставка узлов и удаление узлов похожи по способу реализации на операции со связным списком. +- К распространенным видам двоичного дерева относятся идеальное двоичное дерево, полное двоичное дерево, строгое двоичное дерево и сбалансированное двоичное дерево. Идеальное двоичное дерево - наиболее желательное состояние, а связный список - худший случай после вырождения. +- Двоичное дерево можно представить массивом: значения узлов и пустые позиции располагаются в порядке обхода по уровням, а связи между родителем и детьми реализуются через отображение индексов. +- Обход двоичного дерева по уровням является методом поиска в ширину; он отражает идею "расширяться слой за слоем наружу" и обычно реализуется через очередь. +- Прямой, симметричный и обратный обходы относятся к поиску в глубину; они отражают идею "сначала дойти до конца, затем откатиться и продолжить" и обычно реализуются рекурсивно. +- Двоичное дерево поиска - это эффективная структура данных для поиска элементов; его поиск, вставка и удаление имеют временную сложность $O(\log n)$ . Когда двоичное дерево поиска вырождается в связный список, все эти сложности деградируют до $O(n)$ . +- AVL-дерево, также называемое сбалансированным двоичным деревом поиска, с помощью вращений гарантирует, что после постоянных вставок и удалений узлов дерево остается сбалансированным. +- Вращения AVL-дерева включают правое вращение, левое вращение, сначала правое затем левое и сначала левое затем правое. После вставки или удаления узла AVL-дерево выполняет вращения снизу вверх, чтобы снова восстановить баланс. + +### Q & A + +**Q**: Для двоичного дерева, состоящего из одного узла, высота дерева и глубина корня обе равны $0$ ? + +Да, потому что высота и глубина обычно определяются как "число пройденных ребер". + +**Q**: Вставка и удаление в двоичном дереве обычно выполняются в составе набора операций. Что именно означает этот "набор операций"? Можно ли понимать это как освобождение ресурсов у дочерних узлов ресурса? + +Возьмем в качестве примера двоичное дерево поиска: операция удаления узла делится на три случая, и каждый из этих случаев требует нескольких последовательных шагов работы с узлами. + +**Q**: Почему у DFS для двоичного дерева есть три порядка: прямой, симметричный и обратный? Для чего они нужны? + +Подобно прямому и обратному обходу массива, прямой, симметричный и обратный обходы - это три способа обхода двоичного дерева, с помощью которых можно получить результаты в определенном порядке. Например, в двоичном дереве поиска, где соблюдается отношение `значение левого дочернего узла < значение корня < значение правого дочернего узла` , если обходить дерево с приоритетом "лево $\rightarrow$ корень $\rightarrow$ право", то получится упорядоченная последовательность узлов. + +**Q**: Правое вращение работает с отношениями между `node` , `child` и `grand_child` . А связь между `node` и его исходным родителем разве не нужно поддерживать? После правого вращения она ведь не оборвется? + +На это нужно смотреть с точки зрения рекурсии. В правое вращение `right_rotate(root)` передается корень поддерева, а затем через `return child` возвращается корень этого поддерева уже после вращения. Соединение между новым корнем поддерева и его родителем восстанавливается после возврата функции и не входит в обязанности самой операции правого вращения. + +**Q**: В C++ функции делятся на `private` и `public` . Какая логика стоит за этим? Почему `height()` и `updateHeight()` помещают в разные области видимости? + +Главный критерий - область использования метода. Если метод нужен только внутри класса, его следует проектировать как `private` . Например, самостоятельный вызов `updateHeight()` пользователем не имеет смысла: это лишь один из шагов внутри вставки или удаления. А `height()` используется для чтения высоты узла, подобно `vector.size()` , поэтому его разумно делать `public` . + +**Q**: Как построить двоичное дерево поиска из набора входных данных? Важен ли выбор корневого узла? + +Да, важен. Способ построения дерева уже показан в методе `build_tree()` в коде двоичного дерева поиска. Что касается выбора корня, обычно входные данные сортируют, берут средний элемент как корень, а затем рекурсивно строят левое и правое поддеревья. Это позволяет в наибольшей степени сохранить баланс дерева. + +**Q**: Нужно ли в Java всегда использовать `equals()` для сравнения строк? + +В Java для базовых типов `==` используется, чтобы сравнивать, равны ли значения двух переменных. Для ссылочных типов логика у этих двух способов уже разная. + +- `==` : сравнивает, ссылаются ли две переменные на один и тот же объект, то есть совпадает ли их адрес в памяти. +- `equals()`: сравнивает, равны ли значения двух объектов. + +Поэтому если нужно сравнить значения, то следует использовать `equals()` . Но строки, инициализированные как `String a = "hi"; String b = "hi";` , хранятся в строковом пуле констант и указывают на один и тот же объект, поэтому в таком случае `a == b` тоже может дать истинный результат при сравнении содержимого. + +**Q**: До достижения самого нижнего уровня при обходе в ширину число узлов в очереди равно $2^h$ ? + +Да. Например, для полного двоичного дерева высоты $h = 2$ общее число узлов равно $n = 7$ , а число узлов на нижнем уровне равно $4 = 2^h = (n + 1) / 2$ . diff --git a/ru/docs/index.assets/animation.gif b/ru/docs/index.assets/animation.gif new file mode 100644 index 0000000000000000000000000000000000000000..641e677efb21a9fd1199cd9beeea9e600e76a577 GIT binary patch literal 119276 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≠O5by=E4v#<{^rC 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

        d|m7lcS`#U1l()QYzxC(s7HZ;p;fi+ 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�FxCDz_5F;l^?ve#T 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 z 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%0Ah=Cy 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%0DjFc5 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

        |mSd!VHizT2?dHUAO`$r0tu{L;| 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 YkAe9XJd0LZ+|%-qb*{LIiC&C)#0)LhNh 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%0Dsxp6koa!3gVX1J6KTaKYA> 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

        |hirnnZX*fyCqXRg>!4Xx|Ib!BfH{~S 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%0Dr?*SlM3=$5SCJ!14Qs-u_o@O3X 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 z�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

        r}%AsJ80iYbdd>n%e8Ra3SEnQMmA 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 NpE!yq-BpAD06P}zW32!H literal 0 HcmV?d00001 diff --git a/ru/docs/index.html b/ru/docs/index.html new file mode 100644 index 000000000..229242b84 --- /dev/null +++ b/ru/docs/index.html @@ -0,0 +1,357 @@ + +

        + + +
        +
        +
        +
        + + +
        + +
        +

        + Учебник по структурам данных и алгоритмам с анимированными схемами и кодом, готовым к запуску в один клик +

        + + + + + Начать чтение + + + + + + + Репозиторий кода + +
        + +
        + + + +
        +
        +
        + + +
        +
        + +

        500 анимированных схем, код на 14 языках программирования и 3000 ответов сообщества помогут вам быстро войти в мир структур данных и алгоритмов.

        +
        +
        + + +
        +
        +

        Рекомендации

        +
        +
        +

        «Понятная вводная книга по структурам данных и алгоритмам, которая ведет читателя через практическое обучение шаг за шагом. Очень рекомендую всем начинающим.»

        +

        —— Junhui Deng, профессор факультета компьютерных наук Университета Цинхуа

        +
        +
        +

        «Если бы у меня была “Hello Algo”, когда я изучал структуры данных и алгоритмы, учиться было бы в десять раз проще!»

        +

        —— Mu Li, Senior Principal Scientist, Amazon

        +
        +
        +
        +
        + + +
        +
        +
        +
        +
        +
        + + + +

        Анимированные схемы

        +
        +

        Материал изложен ясно и последовательно, поэтому вход в тему получается плавным.

        +

        "A picture is worth a thousand words."
        «Одна схема стоит тысячи слов»

        +
        +
        + Animation example +
        + +
        + Running code example +
        +
        +
        + + + +

        Запуск в один клик

        +
        +

        Код на более чем десяти языках можно запускать и визуализировать прямо в книге.

        +

        "Talk is cheap. Show me the code."
        «Меньше слов, больше кода»

        +
        +
        +
        + +
        +
        +
        +
        + + + +

        Учимся вместе

        +
        +

        Добро пожаловать к обсуждениям и вопросам: продвигаться вместе проще.

        +

        "Learning by teaching."
        «Обучая других, учишься сам»

        +
        +
        + Comments example +
        + +
        +
        + + +
        + +
        + + +
        +
        + +
        +

        Автор

        + +
        + + +
        +

        Переводчики

        +

        Русская печатная версия была переведена И. А. Шевкун, а русская онлайн-версия была вычитана Yuyan Huang. Благодарим их за вклад!

        +
        +
        + Translator: shevkun +
        И. А. Шевкун +
        +
        + Translator: yuyanhuang +
        Yuyan Huang +
        +
        +
        + + +
        +

        Переводчики кода

        +

        Многоязычные версии кода в этой книге были подготовлены при участии следующих переводчиков. Благодарим их за время и вклад!

        + +
        + + +
        +

        Участники проекта

        +

        Книга постоянно совершенствуется благодаря совместным усилиям более чем 200 участников сообщества. Спасибо им за время и вклад!

        + + Contributors + +
        +
        +
        diff --git a/ru/docs/index.md b/ru/docs/index.md new file mode 100644 index 000000000..c016e3195 --- /dev/null +++ b/ru/docs/index.md @@ -0,0 +1,5 @@ +# Hello Algo + +Учебник по структурам данных и алгоритмам с анимированными иллюстрациями и готовым к запуску кодом. + +[Начать чтение](chapter_hello_algo/) diff --git a/ru/mkdocs.yml b/ru/mkdocs.yml new file mode 100644 index 000000000..99c4b1e85 --- /dev/null +++ b/ru/mkdocs.yml @@ -0,0 +1,179 @@ +# Config inheritance +INHERIT: ../mkdocs.yml + +# Project information +site_name: Hello Algo +site_url: https://www.hello-algo.com/ru/ +site_description: "Учебник по структурам данных и алгоритмам с анимированными иллюстрациями и готовым к запуску кодом" +docs_dir: ../build/ru/docs +site_dir: ../site/ru +# Repository +edit_uri: tree/main/ru/docs +version: 1.3.0 + +# Configuration +theme: + custom_dir: ../build/overrides + language: ru + font: + text: Noto Sans + palette: + - scheme: default + primary: white + accent: teal + toggle: + icon: material/theme-light-dark + name: Темная тема + - scheme: slate + primary: black + accent: teal + toggle: + icon: material/theme-light-dark + name: Светлая тема + +extra: + status: + new: Недавно добавлено + +# Page tree +nav: + - Перед началом: + - chapter_hello_algo/index.md + - Глава 0. Предисловие: + # [icon: material/book-open-outline] + - chapter_preface/index.md + - 0.1 Об этой книге: chapter_preface/about_the_book.md + - 0.2 Как пользоваться этой книгой: chapter_preface/suggestions.md + - 0.3 Резюме: chapter_preface/summary.md + - Глава 1. Знакомство с алгоритмами: + # [icon: material/calculator-variant-outline] + - chapter_introduction/index.md + - 1.1 Алгоритмы повсюду: chapter_introduction/algorithms_are_everywhere.md + - 1.2 Что такое структуры данных и алгоритмы: chapter_introduction/what_is_dsa.md + - 1.3 Резюме: chapter_introduction/summary.md + - Глава 2. Анализ сложности: + # [icon: material/timer-sand] + - chapter_computational_complexity/index.md + - 2.1 Оценка эффективности алгоритмов: chapter_computational_complexity/performance_evaluation.md + - 2.2 Итерация и рекурсия: chapter_computational_complexity/iteration_and_recursion.md + - 2.3 Временная сложность: chapter_computational_complexity/time_complexity.md + - 2.4 Пространственная сложность: chapter_computational_complexity/space_complexity.md + - 2.5 Резюме: chapter_computational_complexity/summary.md + - Глава 3. Структуры данных: + # [icon: material/shape-outline] + - chapter_data_structure/index.md + - 3.1 Классификация структур данных: chapter_data_structure/classification_of_data_structure.md + - 3.2 Базовые типы данных: chapter_data_structure/basic_data_types.md + - 3.3 Кодирование чисел *: chapter_data_structure/number_encoding.md + - 3.4 Кодирование символов *: chapter_data_structure/character_encoding.md + - 3.5 Резюме: chapter_data_structure/summary.md + - Глава 4. Массив и связный список: + # [icon: material/view-list-outline] + - chapter_array_and_linkedlist/index.md + - 4.1 Массив: chapter_array_and_linkedlist/array.md + - 4.2 Связный список: chapter_array_and_linkedlist/linked_list.md + - 4.3 Список: chapter_array_and_linkedlist/list.md + - 4.4 Память и кеш *: chapter_array_and_linkedlist/ram_and_cache.md + - 4.5 Резюме: chapter_array_and_linkedlist/summary.md + - Глава 5. Стек и очередь: + # [icon: material/stack-overflow] + - chapter_stack_and_queue/index.md + - 5.1 Стек: chapter_stack_and_queue/stack.md + - 5.2 Очередь: chapter_stack_and_queue/queue.md + - 5.3 Двусторонняя очередь: chapter_stack_and_queue/deque.md + - 5.4 Резюме: chapter_stack_and_queue/summary.md + - Глава 6. Хеширование: + # [icon: material/table-search] + - chapter_hashing/index.md + - 6.1 Хеш-таблица: chapter_hashing/hash_map.md + - 6.2 Хеш-коллизии: chapter_hashing/hash_collision.md + - 6.3 Хеш-алгоритмы: chapter_hashing/hash_algorithm.md + - 6.4 Резюме: chapter_hashing/summary.md + - Глава 7. Дерево: + # [icon: material/graph-outline] + - chapter_tree/index.md + - 7.1 Двоичное дерево: chapter_tree/binary_tree.md + - 7.2 Обход двоичного дерева: chapter_tree/binary_tree_traversal.md + - 7.3 Представление дерева массивом: chapter_tree/array_representation_of_tree.md + - 7.4 Двоичное дерево поиска: chapter_tree/binary_search_tree.md + - 7.5 AVL-дерево *: chapter_tree/avl_tree.md + - 7.6 Резюме: chapter_tree/summary.md + - Глава 8. Куча: + # [icon: material/family-tree] + - chapter_heap/index.md + - 8.1 Куча: chapter_heap/heap.md + - 8.2 Построение кучи: chapter_heap/build_heap.md + - 8.3 Задача Top-K: chapter_heap/top_k.md + - 8.4 Резюме: chapter_heap/summary.md + - Глава 9. Граф: + # [icon: material/graphql] + - chapter_graph/index.md + - 9.1 Граф: chapter_graph/graph.md + - 9.2 Базовые операции над графами: chapter_graph/graph_operations.md + - 9.3 Обход графа: chapter_graph/graph_traversal.md + - 9.4 Резюме: chapter_graph/summary.md + - Глава 10. Поиск: + # [icon: material/text-search] + - chapter_searching/index.md + - 10.1 Двоичный поиск: chapter_searching/binary_search.md + - 10.2 Точка вставки двоичного поиска: chapter_searching/binary_search_insertion.md + - 10.3 Граничные случаи двоичного поиска: chapter_searching/binary_search_edge.md + - 10.4 Стратегия оптимизации через хеширование: chapter_searching/replace_linear_by_hashing.md + - "10.5 Алгоритмы поиска: новый взгляд": chapter_searching/searching_algorithm_revisited.md + - 10.6 Резюме: chapter_searching/summary.md + - Глава 11. Сортировка: + # [icon: material/sort-ascending] + - chapter_sorting/index.md + - 11.1 Алгоритмы сортировки: chapter_sorting/sorting_algorithm.md + - 11.2 Сортировка выбором: chapter_sorting/selection_sort.md + - 11.3 Пузырьковая сортировка: chapter_sorting/bubble_sort.md + - 11.4 Сортировка вставкой: chapter_sorting/insertion_sort.md + - 11.5 Быстрая сортировка: chapter_sorting/quick_sort.md + - 11.6 Сортировка слиянием: chapter_sorting/merge_sort.md + - 11.7 Пирамидальная сортировка: chapter_sorting/heap_sort.md + - 11.8 Блочная сортировка: chapter_sorting/bucket_sort.md + - 11.9 Сортировка подсчетом: chapter_sorting/counting_sort.md + - 11.10 Поразрядная сортировка: chapter_sorting/radix_sort.md + - 11.11 Резюме: chapter_sorting/summary.md + - Глава 12. Разделяй и властвуй: + # [icon: material/set-split] + - chapter_divide_and_conquer/index.md + - 12.1 Алгоритмы разделяй и властвуй: chapter_divide_and_conquer/divide_and_conquer.md + - 12.2 Стратегия поиска разделяй и властвуй: chapter_divide_and_conquer/binary_search_recur.md + - 12.3 Задача построения двоичного дерева: chapter_divide_and_conquer/build_binary_tree_problem.md + - 12.4 Задача о Ханойской башне: chapter_divide_and_conquer/hanota_problem.md + - 12.5 Резюме: chapter_divide_and_conquer/summary.md + - Глава 13. Поиск с возвратом: + # [icon: material/map-marker-path] + - chapter_backtracking/index.md + - 13.1 Алгоритм поиска с возвратом: chapter_backtracking/backtracking_algorithm.md + - 13.2 Задача о перестановках: chapter_backtracking/permutations_problem.md + - 13.3 Задача о сумме подмножеств: chapter_backtracking/subset_sum_problem.md + - 13.4 Задача о $n$ ферзях: chapter_backtracking/n_queens_problem.md + - 13.5 Резюме: chapter_backtracking/summary.md + - Глава 14. Динамическое программирование: + # [icon: material/table-pivot] + - chapter_dynamic_programming/index.md + - 14.1 Введение в динамическое программирование: chapter_dynamic_programming/intro_to_dynamic_programming.md + - 14.2 Свойства задач динамического программирования: chapter_dynamic_programming/dp_problem_features.md + - 14.3 Подход к решению задач динамического программирования: chapter_dynamic_programming/dp_solution_pipeline.md + - 14.4 Задача о рюкзаке 0-1: chapter_dynamic_programming/knapsack_problem.md + - 14.5 Задача о неограниченном рюкзаке: chapter_dynamic_programming/unbounded_knapsack_problem.md + - 14.6 Задача о расстоянии редактирования: chapter_dynamic_programming/edit_distance_problem.md + - 14.7 Резюме: chapter_dynamic_programming/summary.md + - Глава 15. Жадность: + # [icon: material/head-heart-outline] + - chapter_greedy/index.md + - 15.1 Жадный алгоритм: chapter_greedy/greedy_algorithm.md + - 15.2 Задача о дробном рюкзаке: chapter_greedy/fractional_knapsack_problem.md + - 15.3 Задача о максимальной вместимости: chapter_greedy/max_capacity_problem.md + - 15.4 Задача о максимальном произведении разбиения: chapter_greedy/max_product_cutting_problem.md + - 15.5 Резюме: chapter_greedy/summary.md + - Глава 16. Приложение: + # [icon: material/help-circle-outline] + - chapter_appendix/index.md + - 16.1 Установка среды программирования: chapter_appendix/installation.md + - 16.2 Присоединяйтесь к созданию книги: chapter_appendix/contribution.md + - 16.3 Глоссарий: chapter_appendix/terminology.md + - Список литературы: + - chapter_reference/index.md diff --git a/zh-hant/README.md b/zh-hant/README.md index bfccef360..502da89f2 100644 --- a/zh-hant/README.md +++ b/zh-hant/README.md @@ -45,6 +45,8 @@ English日本語 + | + Русский

        ## 關於本書

        (&*ePWb+4a5YQ z(FX>awN8q?Fdk-CiPEju13)GtL6HWC6$h>0p`=#YJCOqKpoLAEh9?q6VGh24Fb4r< zH;GNcJ#JP~INk}%L6Q_qIMHZDXHzI{-)poXryFB!6$oRk@+n}#QhfmK_l>EjFZ-Wn zSLPd<+(X?1J4jsxQ5aBUoZh8z3-}4_~!WKiFZ_NH2xQ}H&D^fW+}-h9ZZ>4SBqSn zn7ki}>y}OD+vh9Sf1<Tahzzn&0KG@5&K8)aA67C%FiJ-*@lIk@LMjQuJOrJB2Lpg; zO3PhE7O~F`r#1w@_CpUbY6E1e(O~GMZO>2PPiKnmqaz2_8M_5^1u8NQAc@w>+VFAE zHcb)XM+VPB&lK|}M%vRscfJq0b-^0Uq03I-DOXc|e4fk&tmKhQ*n2MG{E>^~5@KW#wRsy&T4W${nW;9@hIM%*Byz>*r&6Temw$3nSEI>eo+ zfJ%2{;74e7NnQ)$f{yozS=CNpfeB_h!q<&iKZ-qHthuv6lf-nDx-|5T_Ft`K>ffi% z+x+F+IE}BwTPcEm) z`L*7kllmwBys1~Q?B?Mt5HZoAFBG)}owdtJRVwHXpHOhlUwb7HkL_|2?`$5E_@|tW zf@+)Xf*VGX9wr;pHa}6&^KL!?|6{iA$7)0SO_on2RzdCw?sgz=VVpu6S1Arv_6@D~v`r{}b2 z#i>q9mPc{=UqkUD)dzZ9BH+otF(7d9f^*+z?O}|E%m00p09%F{?e)k@TG%}M9UV#D zNgU(d;OwbQAQ>AD;c6Tm8G>6B*Bnv%ECh+q+F*yMppUs2eQ!10%HTpafs=oH6Hs>} zjcruQa1&I8_fCwK7(un6CmCKv^!hlV)-AQYyQo4TqEvtF@KN|L83=$s;pY5`My)XS z7c-UI_(1tpYbpc(ezapaf9MfutygJF5tM()mpp)fG_OyYZ^T<{n~#ijln>}!wP76< zr3uQ4-^WE!z|Y%|`t3Y>Vq<{q!ZH^-<})?=+JD0H>#Kr6ITq$t7#|-cbvT`|GLcg% z%!I76VKeGWQ%Qt88n8z^fe&+e%$PeOu!Iv#;A!z#b#_aEE>{f@$c$A@_K;c!uhr)HjoIQujwv6+V`%dt9&61<>$F z*ud{{cGSXM^^VO0*ep+{rJrZqP_V(^YdoGoY0%f$9C{$u=OMn{6bFtj)`^dUYM}(b z!Upv}qqa<$(wAbp=xJeNa)-m#KImmW&<>c%m&_=2N4LoH8oY~|;OYkg-Xi_TT?D!y u&6)1!AX@``@GB($Q2*~L{$E<>ja tree = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15}; + ``` + +=== "Java" + + ```java title="" + /* Представление двоичного дерева массивом */ + // Используя обертку Integer для int, можно применять null для обозначения пустых позиций + Integer[] tree = { 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 }; + ``` + +=== "C#" + + ```csharp title="" + /* Представление двоичного дерева массивом */ + // Используя nullable-тип int? , можно применять null для обозначения пустых позиций + int?[] tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15]; + ``` + +=== "Go" + + ```go title="" + /* Представление двоичного дерева массивом */ + // Используем срез типа any, чтобы можно было применять nil для обозначения пустых позиций + tree := []any{1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15} + ``` + +=== "Swift" + + ```swift title="" + /* Представление двоичного дерева массивом */ + // Используя nullable-тип Int? , можно применять nil для обозначения пустых позиций + let tree: [Int?] = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15] + ``` + +=== "JS" + + ```javascript title="" + /* Представление двоичного дерева массивом */ + // Используем null для обозначения пустых позиций + let tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15]; + ``` + +=== "TS" + + ```typescript title="" + /* Представление двоичного дерева массивом */ + // Используем null для обозначения пустых позиций + let tree: (number | null)[] = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15]; + ``` + +=== "Dart" + + ```dart title="" + /* Представление двоичного дерева массивом */ + // Используя nullable-тип int? , можно применять null для обозначения пустых позиций + List tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15]; + ``` + +=== "Rust" + + ```rust title="" + /* Представление двоичного дерева массивом */ + // Используем None для обозначения пустых позиций + let tree = [Some(1), Some(2), Some(3), Some(4), None, Some(6), Some(7), Some(8), Some(9), None, None, Some(12), None, None, Some(15)]; + ``` + +=== "C" + + ```c title="" + /* Представление двоичного дерева массивом */ + // Используем максимальное значение int для обозначения пустых позиций, поэтому узлы не должны принимать значение INT_MAX + int tree[] = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15}; + ``` + +=== "Kotlin" + + ```kotlin title="" + /* Представление двоичного дерева массивом */ + // Используем null для обозначения пустых позиций + val tree = arrayOf( 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 ) + ``` + +=== "Ruby" + + ```ruby title="" + ### Представление двоичного дерева массивом ### + # Используем nil для обозначения пустых позиций + tree = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15] + ``` + +![Представление произвольного двоичного дерева массивом](array_representation_of_tree.assets/array_representation_with_empty.png) + +Стоит отметить, что **полное двоичное дерево очень удобно представлять массивом** . Если вспомнить определение полного двоичного дерева, то `None` появляются только на самом нижнем уровне и справа, **а значит, все `None` обязательно находятся в конце последовательности обхода по уровням**. + +Это означает, что при представлении полного двоичного дерева массивом можно не хранить все `None` , что очень удобно. На рисунке ниже приведен пример. + +![Представление полного двоичного дерева массивом](array_representation_of_tree.assets/array_representation_complete_binary_tree.png) + +Ниже приведен код реализации двоичного дерева, представленного массивом. Он включает следующие операции. + +- Для заданного узла получить его значение, левого дочернего узла, правого дочернего узла и родительский узел. +- Получить последовательности прямого, симметричного, обратного обходов и обхода по уровням. + +```src +[file]{array_binary_tree}-[class]{array_binary_tree}-[func]{} +``` + +## Преимущества и ограничения + +Представление двоичного дерева массивом имеет в основном следующие преимущества. + +- Массив хранится в непрерывной области памяти, хорошо работает с кешем и обеспечивает высокую скорость доступа и обхода. +- Не нужно хранить указатели, поэтому память расходуется экономнее. +- Разрешается произвольный доступ к узлам. + +Однако у представления массивом есть и некоторые ограничения. + +- Для хранения массива требуется непрерывная область памяти, поэтому такой способ не подходит для деревьев с очень большим объемом данных. +- Добавление и удаление узлов приходится реализовывать через вставку и удаление элементов массива, а это не слишком эффективно. +- Когда в двоичном дереве имеется большое число `None` , доля действительно полезных данных в массиве оказывается низкой, и эффективность использования пространства падает. diff --git a/ru/docs/chapter_tree/avl_tree.assets/avltree_degradation_from_inserting_node.png b/ru/docs/chapter_tree/avl_tree.assets/avltree_degradation_from_inserting_node.png new file mode 100644 index 0000000000000000000000000000000000000000..93b0617f0922c833723c557fdd503419b8482ec5 GIT binary patch literal 16405 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 Fe*mOxU%LPR literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/avl_tree.assets/avltree_left_right_rotate.png b/ru/docs/chapter_tree/avl_tree.assets/avltree_left_right_rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..00528037db73ebf4555af54fb1714cec2d04e9b3 GIT binary patch literal 16854 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 Lx@?8CMd<$lC&Vas literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/avl_tree.assets/avltree_left_rotate.png b/ru/docs/chapter_tree/avl_tree.assets/avltree_left_rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..0c2ae54dbfb2105210400a4ca99a9238ada3f0c6 GIT binary patch literal 17570 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/avl_tree.assets/avltree_left_rotate_with_grandchild.png b/ru/docs/chapter_tree/avl_tree.assets/avltree_left_rotate_with_grandchild.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0b2795c2398b0ee3a4ff67a24046070a3e6a07 GIT binary patch literal 21032 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/avl_tree.assets/avltree_right_left_rotate.png b/ru/docs/chapter_tree/avl_tree.assets/avltree_right_left_rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..78c77404c293ebcabf036e8183dbad297791dcf4 GIT binary patch literal 17695 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 Vyyp6!-L?{>($m$?Wt~$(69BA@Rc-(P literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/avl_tree.assets/avltree_right_rotate_step1.png b/ru/docs/chapter_tree/avl_tree.assets/avltree_right_rotate_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..981a8b3da6d25d75961e5e7fa882859d10b1c396 GIT binary patch literal 7613 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 W7VvpK=627&xu^AwPvq&6Zv7AK9?#4G literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/avl_tree.assets/avltree_right_rotate_step3.png b/ru/docs/chapter_tree/avl_tree.assets/avltree_right_rotate_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..15028da527d931658e7ab4a52b0462f343aa9b9a GIT binary patch literal 13886 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 Ix`Ye=KdHOlZ2$lO literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/avl_tree.assets/avltree_right_rotate_step4.png b/ru/docs/chapter_tree/avl_tree.assets/avltree_right_rotate_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..1072ade092ab973215f44d7f36107eecfbdda9b1 GIT binary patch literal 16288 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/avl_tree.assets/avltree_right_rotate_with_grandchild.png b/ru/docs/chapter_tree/avl_tree.assets/avltree_right_rotate_with_grandchild.png new file mode 100644 index 0000000000000000000000000000000000000000..9a022a93e4e34bcb1233fb2017c797684d46bec1 GIT binary patch literal 21374 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/avl_tree.assets/avltree_rotation_cases.png b/ru/docs/chapter_tree/avl_tree.assets/avltree_rotation_cases.png new file mode 100644 index 0000000000000000000000000000000000000000..4474707cfdec9ead1a191947e899f6c43fe949d9 GIT binary patch literal 19027 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 AWdHyG literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_tree/avl_tree.md b/ru/docs/chapter_tree/avl_tree.md new file mode 100644 index 000000000..c39664f8e --- /dev/null +++ b/ru/docs/chapter_tree/avl_tree.md @@ -0,0 +1,358 @@ +# AVL-дерево * + +В разделе "Двоичное дерево поиска" мы упоминали, что после многократных операций вставки и удаления узлов двоичное дерево поиска может выродиться в связный список. В таком случае временная сложность всех операций ухудшается с $O(\log n)$ до $O(n)$ . + +Как показано на рисунке ниже, после двух операций удаления узлов это двоичное дерево поиска вырождается в связный список. + +![Деградация AVL-дерева после удаления узлов](avl_tree.assets/avltree_degradation_from_removing_node.png) + +Другой пример: если в идеальное двоичное дерево, показанное на рисунке ниже, вставить два узла, то дерево сильно наклонится влево, а временная сложность поиска тоже ухудшится. + +![Деградация AVL-дерева после вставки узлов](avl_tree.assets/avltree_degradation_from_inserting_node.png) + +В 1962 году Г. М. Adelson-Velsky и Е. М. Landis в статье "An algorithm for the organization of information" предложили AVL-дерево. В статье подробно описан набор операций, гарантирующий, что при непрерывном добавлении и удалении узлов AVL-дерево не вырождается, благодаря чему временная сложность различных операций сохраняется на уровне $O(\log n)$ . Иначе говоря, в сценариях, где часто выполняются вставка, удаление, поиск и изменение, AVL-дерево всегда поддерживает эффективную работу с данными и потому имеет высокую практическую ценность. + +## Распространенные термины AVL-дерева + +AVL-дерево одновременно является и двоичным деревом поиска, и сбалансированным двоичным деревом, то есть одновременно удовлетворяет всем свойствам обеих этих структур. Поэтому AVL-дерево является разновидностью сбалансированного двоичного дерева поиска (balanced binary search tree). + +### Высота узла + +Поскольку операции AVL-дерева требуют получать высоту узла, нам нужно добавить в класс узла переменную `height` : + +=== "Python" + + ```python title="" + class TreeNode: + """Класс узла AVL-дерева""" + def __init__(self, val: int): + self.val: int = val # Значение узла + self.height: int = 0 # Высота узла + self.left: TreeNode | None = None # Ссылка на левого дочернего узла + self.right: TreeNode | None = None # Ссылка на правого дочернего узла + ``` + +=== "C++" + + ```cpp title="" + /* Класс узла AVL-дерева */ + struct TreeNode { + int val{}; // Значение узла + int height = 0; // Высота узла + TreeNode *left{}; // Левый дочерний узел + TreeNode *right{}; // Правый дочерний узел + TreeNode() = default; + explicit TreeNode(int x) : val(x){} + }; + ``` + +=== "Java" + + ```java title="" + /* Класс узла AVL-дерева */ + class TreeNode { + public int val; // Значение узла + public int height; // Высота узла + public TreeNode left; // Левый дочерний узел + public TreeNode right; // Правый дочерний узел + public TreeNode(int x) { val = x; } + } + ``` + +=== "C#" + + ```csharp title="" + /* Класс узла AVL-дерева */ + class TreeNode(int? x) { + public int? val = x; // Значение узла + public int height; // Высота узла + public TreeNode? left; // Ссылка на левого дочернего узла + public TreeNode? right; // Ссылка на правого дочернего узла + } + ``` + +=== "Go" + + ```go title="" + /* Структура узла AVL-дерева */ + type TreeNode struct { + Val int // Значение узла + Height int // Высота узла + Left *TreeNode // Ссылка на левого дочернего узла + Right *TreeNode // Ссылка на правого дочернего узла + } + ``` + +=== "Swift" + + ```swift title="" + /* Класс узла AVL-дерева */ + class TreeNode { + var val: Int // Значение узла + var height: Int // Высота узла + var left: TreeNode? // Левый дочерний узел + var right: TreeNode? // Правый дочерний узел + + init(x: Int) { + val = x + height = 0 + } + } + ``` + +=== "JS" + + ```javascript title="" + /* Класс узла AVL-дерева */ + class TreeNode { + val; // Значение узла + height; // Высота узла + left; // Указатель на левого дочернего узла + right; // Указатель на правого дочернего узла + constructor(val, left, right, height) { + this.val = val === undefined ? 0 : val; + this.height = height === undefined ? 0 : height; + this.left = left === undefined ? null : left; + this.right = right === undefined ? null : right; + } + } + ``` + +=== "TS" + + ```typescript title="" + /* Класс узла AVL-дерева */ + class TreeNode { + val: number; // Значение узла + height: number; // Высота узла + left: TreeNode | null; // Указатель на левого дочернего узла + right: TreeNode | null; // Указатель на правого дочернего узла + constructor(val?: number, height?: number, left?: TreeNode | null, right?: TreeNode | null) { + this.val = val === undefined ? 0 : val; + this.height = height === undefined ? 0 : height; + this.left = left === undefined ? null : left; + this.right = right === undefined ? null : right; + } + } + ``` + +=== "Dart" + + ```dart title="" + /* Класс узла AVL-дерева */ + class TreeNode { + int val; // Значение узла + int height; // Высота узла + TreeNode? left; // Левый дочерний узел + TreeNode? right; // Правый дочерний узел + TreeNode(this.val, [this.height = 0, this.left, this.right]); + } + ``` + +=== "Rust" + + ```rust title="" + use std::rc::Rc; + use std::cell::RefCell; + + /* Структура узла AVL-дерева */ + struct TreeNode { + val: i32, // Значение узла + height: i32, // Высота узла + left: Option>>, // Левый дочерний узел + right: Option>>, // Правый дочерний узел + } + + impl TreeNode { + /* Конструктор */ + fn new(val: i32) -> Rc> { + Rc::new(RefCell::new(Self { + val, + height: 0, + left: None, + right: None + })) + } + } + ``` + +=== "C" + + ```c title="" + /* Структура узла AVL-дерева */ + typedef struct TreeNode { + int val; + int height; + struct TreeNode *left; + struct TreeNode *right; + } TreeNode; + + /* Конструктор */ + TreeNode *newTreeNode(int val) { + TreeNode *node; + + node = (TreeNode *)malloc(sizeof(TreeNode)); + node->val = val; + node->height = 0; + node->left = NULL; + node->right = NULL; + return node; + } + ``` + +=== "Kotlin" + + ```kotlin title="" + /* Класс узла AVL-дерева */ + class TreeNode(val _val: Int) { // Значение узла + val height: Int = 0 // Высота узла + val left: TreeNode? = null // Левый дочерний узел + val right: TreeNode? = null // Правый дочерний узел + } + ``` + +=== "Ruby" + + ```ruby title="" + ### Класс узла AVL-дерева ### + class TreeNode + attr_accessor :val # Значение узла + attr_accessor :height # Высота узла + attr_accessor :left # Ссылка на левого дочернего узла + attr_accessor :right # Ссылка на правого дочернего узла + + def initialize(val) + @val = val + @height = 0 + end + end + ``` + +"Высота узла" означает расстояние от этого узла до самого удаленного листового узла, то есть число пройденных "ребер". Особенно важно помнить, что высота листового узла равна $0$ , а высота пустого узла равна $-1$ . Мы создадим две вспомогательные функции: одну для получения высоты узла, другую для ее обновления: + +```src +[file]{avl_tree}-[class]{avl_tree}-[func]{update_height} +``` + +### Баланс-фактор узла + +Баланс-фактор (balance factor) узла определяется как высота левого поддерева минус высота правого поддерева; при этом баланс-фактор пустого узла считается равным $0$ . Мы также инкапсулируем получение баланс-фактора в отдельную функцию, чтобы потом было удобнее ее использовать: + +```src +[file]{avl_tree}-[class]{avl_tree}-[func]{balance_factor} +``` + +!!! tip + + Пусть баланс-фактор равен $f$ ; тогда для любого узла AVL-дерева выполняется $-1 \le f \le 1$ . + +## Вращения AVL-дерева + +Особенность AVL-дерева заключается в операции "вращения", которая позволяет заново сбалансировать разбалансированный узел, не нарушая последовательность симметричного обхода двоичного дерева. Иначе говоря, **операция вращения одновременно сохраняет свойство "двоичного дерева поиска" и возвращает дерево в состояние "сбалансированного двоичного дерева"**. + +Узлы, для которых абсолютное значение баланс-фактора больше $1$ , мы называем "разбалансированными узлами". В зависимости от вида разбаланса вращения делятся на четыре типа: правое вращение, левое вращение, сначала левое затем правое, и сначала правое затем левое. Ниже разберем их подробно. + +### Правое вращение + +Как показано на рисунках ниже, под узлом указан его баланс-фактор. Если двигаться снизу вверх, то первым разбалансированным узлом в двоичном дереве будет "узел 3". Рассмотрим поддерево с этим узлом в качестве корня, обозначим данный узел как `node` , его левого дочернего узла как `child` и выполним "правое вращение". После завершения правого вращения поддерево снова станет сбалансированным и при этом сохранит свойство двоичного дерева поиска. + +=== "<1>" + ![Шаги правого вращения](avl_tree.assets/avltree_right_rotate_step1.png) + +=== "<2>" + ![avltree_right_rotate_step2](avl_tree.assets/avltree_right_rotate_step2.png) + +=== "<3>" + ![avltree_right_rotate_step3](avl_tree.assets/avltree_right_rotate_step3.png) + +=== "<4>" + ![avltree_right_rotate_step4](avl_tree.assets/avltree_right_rotate_step4.png) + +Как показано на рисунке ниже, когда у узла `child` есть правый дочерний узел, который мы обозначим как `grand_child` , в правое вращение нужно добавить еще один шаг: сделать `grand_child` левым дочерним узлом `node` . + +![Правое вращение при наличии grand_child](avl_tree.assets/avltree_right_rotate_with_grandchild.png) + +"Поворот вправо" - это лишь образное описание; в реальности он реализуется через изменение указателей узлов. Код приведен ниже: + +```src +[file]{avl_tree}-[class]{avl_tree}-[func]{right_rotate} +``` + +### Левое вращение + +Соответственно, если рассмотреть "зеркальную" версию приведенного выше разбалансированного двоичного дерева, то понадобится выполнить "левое вращение", показанное на рисунке ниже. + +![Левое вращение](avl_tree.assets/avltree_left_rotate.png) + +По той же причине, когда у узла `child` есть левый дочерний узел, который обозначим как `grand_child` , в левое вращение также требуется добавить шаг: сделать `grand_child` правым дочерним узлом `node` . + +![Левое вращение при наличии grand_child](avl_tree.assets/avltree_left_rotate_with_grandchild.png) + +Можно заметить, что **операции правого и левого вращения логически зеркально симметричны, и два вида разбаланса, которые они исправляют, тоже симметричны**. Поэтому, опираясь на эту симметрию, достаточно заменить в коде правого вращения все `left` на `right` , а все `right` на `left` , чтобы получить реализацию левого вращения: + +```src +[file]{avl_tree}-[class]{avl_tree}-[func]{left_rotate} +``` + +### Сначала левое, затем правое вращение + +Для разбалансированного узла 3 на рисунке ниже ни одно лишь левое вращение, ни одно лишь правое вращение не способны вернуть поддерево в баланс. В этом случае нужно сначала выполнить "левое вращение" для `child` , а затем выполнить "правое вращение" для `node` . + +![Сначала левое, затем правое вращение](avl_tree.assets/avltree_left_right_rotate.png) + +### Сначала правое, затем левое вращение + +Как показано на рисунке ниже, для зеркальной ситуации предыдущего разбалансированного двоичного дерева нужно сначала выполнить "правое вращение" для `child` , а затем "левое вращение" для `node` . + +![Сначала правое, затем левое вращение](avl_tree.assets/avltree_right_left_rotate.png) + +### Выбор вращения + +Четыре вида разбаланса, показанные на рисунке ниже, по одному соответствуют рассмотренным выше случаям; для них соответственно требуются правое вращение, сначала левое затем правое, сначала правое затем левое и левое вращение. + +![Четыре случая вращений AVL-дерева](avl_tree.assets/avltree_rotation_cases.png) + +Как показано в таблице ниже, мы определяем, какому из этих четырех случаев соответствует разбалансированный узел, по знаку баланс-фактора самого разбалансированного узла и по знаку баланс-фактора дочернего узла на более высокой стороне. + +

      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%0AZAmSTx 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/counting_sort.assets/counting_sort_step2.png b/ru/docs/chapter_sorting/counting_sort.assets/counting_sort_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..31ba8cbd3a74a1117a7b8718afbe4e05c7541d0e GIT binary patch literal 14592 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/counting_sort.assets/counting_sort_step4.png b/ru/docs/chapter_sorting/counting_sort.assets/counting_sort_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..f24bf64bb62d1d3cffe87897b56a38a0d4fb00e9 GIT binary patch literal 16803 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 Bk*oj! literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/counting_sort.assets/counting_sort_step7.png b/ru/docs/chapter_sorting/counting_sort.assets/counting_sort_step7.png new file mode 100644 index 0000000000000000000000000000000000000000..7f2febf232423650c5514e4b1af7ad285df5e1e9 GIT binary patch literal 14085 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/counting_sort.md b/ru/docs/chapter_sorting/counting_sort.md new file mode 100644 index 000000000..4d3a46106 --- /dev/null +++ b/ru/docs/chapter_sorting/counting_sort.md @@ -0,0 +1,84 @@ +# Сортировка подсчетом + +Сортировка подсчетом (counting sort) реализует сортировку за счет подсчета количества элементов и обычно используется для массивов целых чисел. + +## Простая реализация + +Сначала рассмотрим простой пример. Дан массив `nums` длины $n$ , элементы которого являются "неотрицательными целыми числами". Общий процесс сортировки подсчетом показан на рисунке ниже. + +1. Пройти по массиву, найти в нем максимальное число, обозначить его как $m$ , а затем создать вспомогательный массив `counter` длины $m + 1$ . +2. **С помощью `counter` подсчитать, сколько раз каждое число встречается в `nums`**; при этом `counter[num]` хранит число вхождений значения `num` . Делается это просто: достаточно пройти по `nums` (пусть текущее число равно `num` ) и на каждом шаге увеличить `counter[num]` на $1$ . +3. **Поскольку индексы массива `counter` изначально упорядочены, можно считать, что все числа уже отсортированы**. Далее остается пройти по `counter` и в соответствии с числом вхождений записать значения обратно в `nums` в порядке возрастания. + +![Процесс сортировки подсчетом](counting_sort.assets/counting_sort_overview.png) + +Код приведен ниже: + +```src +[file]{counting_sort}-[class]{}-[func]{counting_sort_naive} +``` + +!!! note "Связь между сортировкой подсчетом и блочной сортировкой" + + Если посмотреть на сортировку подсчетом с точки зрения блочной сортировки, то каждый индекс массива `counter` можно рассматривать как отдельный блок, а процесс подсчета - как распределение элементов по соответствующим блокам. По сути, сортировка подсчетом является частным случаем блочной сортировки для целочисленных данных. + +## Полная реализация + +Внимательный читатель мог заметить, что **если входные данные представлены объектами, то описанный выше шаг `3.` перестает работать**. Например, если входными данными являются объекты товаров и мы хотим отсортировать их по цене (полю класса), то описанный алгоритм сможет выдать только отсортированный ряд цен, но не исходные объекты в нужном порядке. + +Как же получить корректный порядок исходных данных? Сначала вычислим "префиксную сумму" массива `counter` . Как следует из названия, префиксная сумма в индексе `i` , обозначаемая как `prefix[i]` , равна сумме первых `i` элементов массива: + +$$ +\text{prefix}[i] = \sum_{j=0}^i \text{counter[j]} +$$ + +**Префиксная сумма имеет четкий смысл: `prefix[num] - 1` обозначает индекс последнего вхождения элемента `num` в результирующем массиве `res`**. Это очень важная информация, потому что она указывает, в какую позицию результирующего массива должен попасть каждый элемент. Далее мы проходим исходный массив `nums` в обратном порядке и на каждой итерации для очередного элемента `num` выполняем два действия. + +1. Записать `num` в массив `res` по индексу `prefix[num] - 1` . +2. Уменьшить префиксную сумму `prefix[num]` на $1$ , чтобы получить индекс следующего размещения элемента `num` . + +После завершения прохода массив `res` будет содержать отсортированный результат; остается только переписать `res` обратно в `nums` . Полный процесс сортировки подсчетом показан на рисунке ниже. + +=== "<1>" + ![Шаги сортировки подсчетом](counting_sort.assets/counting_sort_step1.png) + +=== "<2>" + ![counting_sort_step2](counting_sort.assets/counting_sort_step2.png) + +=== "<3>" + ![counting_sort_step3](counting_sort.assets/counting_sort_step3.png) + +=== "<4>" + ![counting_sort_step4](counting_sort.assets/counting_sort_step4.png) + +=== "<5>" + ![counting_sort_step5](counting_sort.assets/counting_sort_step5.png) + +=== "<6>" + ![counting_sort_step6](counting_sort.assets/counting_sort_step6.png) + +=== "<7>" + ![counting_sort_step7](counting_sort.assets/counting_sort_step7.png) + +=== "<8>" + ![counting_sort_step8](counting_sort.assets/counting_sort_step8.png) + +Код реализации сортировки подсчетом приведен ниже: + +```src +[file]{counting_sort}-[class]{}-[func]{counting_sort} +``` + +## Характеристики алгоритма + +- **Временная сложность равна $O(n + m)$, алгоритм не является адаптивным** : необходимо пройти по `nums` и по `counter` , а оба этих прохода занимают линейное время. Обычно выполняется $n \gg m$ , поэтому временная сложность стремится к $O(n)$ . +- **Пространственная сложность равна $O(n + m)$, сортировка не выполняется на месте**: используются массивы `res` и `counter` длины $n$ и $m$ соответственно. +- **Стабильная сортировка**: порядок заполнения `res` идет "справа налево", поэтому обратный проход по `nums` позволяет сохранить относительный порядок равных элементов и тем самым реализовать стабильную сортировку. Вообще говоря, прямой проход по `nums` тоже даст правильный результат сортировки, но он будет нестабильным. + +## Ограничения + +На этом этапе сортировка подсчетом может показаться очень изящной: она позволяет эффективно сортировать данные, опираясь только на подсчет числа вхождений. Однако условия ее применения довольно строгие. + +**Сортировка подсчетом применима только к неотрицательным целым числам**. Чтобы использовать ее для других типов данных, нужно убедиться, что эти данные можно преобразовать в неотрицательные целые числа и что при преобразовании относительный порядок элементов не изменится. Например, для массива целых чисел с отрицательными значениями можно сначала прибавить ко всем числам константу, превратив их в положительные, затем выполнить сортировку и после этого преобразовать значения обратно. + +**Сортировка подсчетом подходит для случаев, когда объем данных велик, но диапазон значений невелик**. Например, в приведенном выше примере $m$ не должно быть слишком большим, иначе будет занято слишком много памяти. А когда $n \ll m$ , сортировка подсчетом использует $O(m)$ времени и может оказаться медленнее, чем алгоритмы сортировки с $O(n \log n)$ . diff --git a/ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step1.png b/ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..a8b8c143215c177ea689e9e6a7e7043bc2686723 GIT binary patch literal 13394 zcmb`tWl$VJ*ET%6EU>t{2ZFmh3&Gvp5?q5j$>JUeZUF)W2p%j1T_m^%C&1$FfnZ5K z?z_Gp&r@H0Rqu~?s;2t%Rp*>Or>FbsGc^;Zt*L~ANr?#n0FH{XyeInpS>nh0swG-3_PaTMZtcENAd`ZT7eEA=HUTt-K zg@6D4g|~(6?Cjj$-p0knArJ^jNy(m{J+rg3JEz+vW5wCo*;Q3lM!AL#4i1lh9wE(Q zp8jg+6T_i+ueRb>69}DqeOxlHUu{!YlK$Do>#k7 zLbsN?S>DCdWJDnvC2Ehy(e16V=JOxC@e_rwAFCL0qI62VMBdi86A`Ath-(O#dd=3{ zpAg@*?mbgKU?rAsIqVbYGZPZ=+q<>+miKopVdl1VOQ zA-oWXqHI!8ZMCj9UzANyi?c~vnJI(8`w4_eyqIio{v|WO0OQvpmOO#}Cl_pJQ5^>( z@(tQMbP^a_8m2dI{C=2%lQnQeYZk_8jUgI@u?C@9neu$T5`_Uih@*^rVBmQWKJir4HW&CnR$HDd^(*w33Ah-V zbc0l|PI^usuYK8>Pm%qc9#cDW7@_p*GSQJ(5FIZ>&U#GmQb(Uo@_a$Clo&?*0yjYM z)BP+nW5lzu$Y3>Vi_+gRc8=PSW*cVLT@bWk8Vbt-8&~9-Pr!kg(3UX&-IZ;y^rKV+ z%J1DinFFg7%ZY8CYhPX>Mf6&?gU>D1ZI)*j-f@ORLJWgJ&Tq0d!ff6_->$dNMwCLi2)ahv#rlW1^yOJ7|6LRniCTI6po;ojj^t|W-y>287mlS8+V9c8y-KAsWw}EI%gp`Bg zqDj~HFltUQ(sv#$!ZUBd)g+Aq)I&Y-InxDqo1PlrYVzifJ1|_~#E_&vvy=-=)~@Jn z1h)0w)I%>_ZAu*zkHITf`=Sdso-xz|zW&vk;pI24ByHB#`TF#N`7(dloHDOtuG{1D zDWXc8C((`hD@p#b3^trtfOX;hqmOMHWz}@Dhln^m8d;&gd z7CenId($)VQ*8Xn8#tJX^$7?dJv(^HrLQr-XoVTwi~OVW_;PhwBQ{&K+1I6zh90LU z7q)xO*Sfk-0`XC>zyFgj{OUr>a~DC+R!=c9%SBsj&y<~Y6f&YRY2$+XY)kTodyV~4 zyW3|Sj~~u8qRAd|x{qytl#0`JjS{WY|1+ns^k{UGq_H$@AG>|Eo*(%Rcfvi2I@a21 z9lKA>D$n~o$>Gf>@GS@>F*Fm-4%f_$`myncH{?BNAT1a*BbE2DtArx^3jbI{=P=vc z?~8ukfnxAGhJiH6PjZ)28mb+1RcE15PkojVH5tOZcU^Zzedo#8d)tYR}wQT&V?anSD^hk}D}veBw4 zyMk~Cp)X8!Ce79?Kh`kg5-#fBnJrnOpsBg@zhkT-V3LrEoxQT@`}*NLI4I*Tn`fkD z9i(KeV1HSDk8E&V(P(|WtMygPPLGgb+Xh)SLls^QCaPuL zNH?JOk#t7cWY|h=7H;ND>%>?%Qm1^m{r$y#!4t57r`l?YYU<|WA)kRZ_~QGFVH*9G zEJl{^%M%)pbO&UsATRtn{u4#RF_xI(6;YzjIH8^#{0VA6XFUR;W zf-1tnS_<9lxXDvL3*OuTwB-5S6hA3p%QsHo!Jk`eO4_bYSo*w)Gf05l6q|tKI|3kn znU0@=*v@E-A-!0VIc7z=R2IsO^JBp%%~17Qf~kmXgENY&1{jBwoc+6hOH>@S6AvDO z!6`xCv5`OQ`=;ENV`JD$CDt$ei`ffCeHb9;YPBY#)l-C?BR}I?rb}}Z#%!HEC-N`T z2;F!!JnU`ytKo)V$BB!u+vv(KpO?^xVBqYWuyM@&tk8DQFN2Oy0r*A08SmBF!{H>+ znbh{)?OQ@btE(Xbfpv_g&3z;1c-)tGjmuJudc8Nif3N+|rSck0=6BqCO0MwSXJ^?Y zQ>p;R61URpPHHbeOMc<@o0dILSX(yFVJ!@oWw|JA2HXh{j6B}>#jhcJ>_tK2z0z7` z5;ElJOwrU{g^l8ph|8t)wUXE2LKW&vA&cXsu>H_|bo+|o$a(9<6 z=dUPeXd&n%xi&Wvd&mo533|!c#!sZ+{ncRn!L4o~saQT#vGcFi^?emP9M8!8)7{SMLKmdb^&^>>y=pi-;? z&T+pRXDI<%Au5m{k0`eMH=;a^Sn_tTbkHwljUK)G2pp33yCg>m_>a!)&%0a8c>R1d z9cj}^TWz;GAQldI#!t+}7SEb^hnuA@+;O|@8P0}n$Q;Y(A=mAz-EE**qPm$AX?MRL z0g`QR%zat)5pl1$r<*jq!(Hb&J0iY~U=zNShE9-eb@my)1$Yz})+W(Bt}5>zT~^LNL=wa8p%u6_pN4;Q?)RI6lAcT@3YH z$ming$gV#i5I$X284_=uqjI;CP+$6)-BBjNBsCSD zV>k`Pd3O_DK%1sjt(d*sA*<2gxAXF2lw45Z^nti`-JW0Cr@~hV{iZ^*IEgU znrVM$#Ag#HbQtJRjDIZXc!*K77ztMtppPa5j-QilzAxI$CB~C8k5zg%j$YIAg>v_K z*&&Bp>pN11se>a&f{%kuLsNTDJI{z<%qy|7X>8>p2oO9N74W=5M`NZ1wcrDc>)C6Y z$i*wFQY#UC@u?=1<8XADM3chD#}_xjnaXTOvuDV&H3@e8V)k~p58k1{a|;A1jU!I~ z5N~3H#x2$FCbZ3;t5utqH#|Ehy_2R$9ii@2Dwy_bj^ZrFM~2jnQc6Q2O8+!3J3KWo z@KA+AyCYpDd&qtFb5M|V#b zk6r{keQBw%%)h5=gwZvopa1UH&9IAJoZ54QugUVl~-HD7T^?$e0ud5!T9jauoOC8iBGk@&43YYbJ)24VE%WdZ4nqpAm zc@h<w(KyY8-jWVSAs?$4R8!t-%%-wzHV*+x|d#+-r_ zG&s18(#+KCdg&xtaBcTkX6VIs%$4Vn&Z^4GU%EI`F=o0wO4BZ7KhCm$6VO zR~uox#a3qvQlYvEr+v-T*>2FFf(?B#PRgE5+H7m-YN;0Z+mvCVBJ}fRFz6+bZvXh1 z_yMMS?{8e^ApCo0yndz{`RiWlG`+s>SI2X2z`+B9o3H7Wn1-WV3nQM4G~Q6AZ_1&48n1x&?#MFj)V>Wv2L-w;{)li)-IdcE zrkq5hQR;NfDlDyMbW_Chq4q6b6)-Dp#gF5tk{#6i(qhBJ|M-Gf5?X-+U-@w&or#p& zu5m$)8jnyu=_iW6}oK4$*;iNLP3eJ_fh^@GAsEA6!@zn>MmFWgRkVu-g<)CxHn>_eb2a64a*! z=7XqFdc`*{6p+-PTQSb8@W6m-4`UJ5x02on06zE$^+whRL0q;Q%>?jr{>KT-Kcng! z0|p?;d>N+1OLnO~UIu*y*x$S>P$~sugO#XNiP!AA7`XdgfRx%d@_Q?lXd~b*0b>Aw0N^ARk|yCWv8@ppimMy`tM?jC3rJBX%3Hywnce)M~D4$ zphfBa{1R~4&d$t(?H5+#1+nH2vP{d~e}DSj+@ufP50|7p?soBy zKvDXd1$;P>EM8av3C_MitCywNiWB_F>Y_elbFcFOe;!B)F)c24iM?i{fX9;NHgUVQ zzFTV6t+-$S_9r6}RknYT1f>X5;EVKN!;FYJ0&JKQ;&R#(^K^B0e?rjeg{|76s9eph z!5>Cv>z08xo#ChNe^4}~EDbMd@CKzS8YO#U$MgPe_sUrxEaCa|!vI&98=eyhW6N16)wa_vw+h6DwqbV)It2DCBF6 ziUIMb_>|Fo2r~fKH`3<5&Lg*9=Hoaj1r#aReVpfjVB#>f6yFQYc~V!rQC*84vxLBj z2X(~z&IKUFx*fJQ-ST&cuZxtzL%qZT&~8vTS&m{|A?{&BX$W)V0r(0ZTE_)hUqyZ$ zZ9N(U)X&m1Uvj`%_NW%hfe9kyz_fH1X4p)qdYuAb+Yg5GKloX+4QSgk_2`O{jYWrAa=15bk)oO)E~BldblWfNBP%i4TsUD#O)Wtv00z}3r5oU9m%D;jqRR={e@P`LDaVv(iDmE4DDBA+-9?mYQ9Agne(vLa@moQ4g#)BP)C*^I=UI!kA zAKWJ3Sf8-M`$5Sf7QCqM%$F8jz>YMHE@4=Po3d?w3^A(i%A0`b#cU3UXD4x#Jb^;^ zS)vsuP*?Iz@Y4(>dj9a*Vh^whX8V4OW{@2ZKgrPtc{)er~0 zLWmZD6P9z&?s4n|{c7ucdMT{2h{_}ic&C+YLxzNw?#P`wb79^ua~+07|<(E&`r@%|b*>0#mt zsNgvCWq>vc@cAUWF3bW@$)ta1;E(~Z6c*aO(67mT7T^k3@-nR!2M!d6f;Puot2>^~ z85;O{#r?s{m|2??kOOL0L0>H(`4#}eB?XWU&%PV=`yYnVr@m6S_LMnC&r1*H@Y7)e zIe#JA1mfrDE50Hkeg&gFs@Fd{%?VL=3zM5#^Wd5MtaN`(Jo*gu_P$veaetZl=50yE zsgdY@gwpd>w3*wsDl_(Y$m7ymm`{~XUuxU>reCr@%6eoBNzjzeT-x{R%kG7E1F3@F zbokda@IVdj8kbfyi{zN!3DUs4q{p(W;HS}`4o(?sc`bM0S6DBZ@%smd-}gWJaEFf@ zyRU*?>H?!5`V8)2Yilvk&`p@4V4a4u?r4>wX~z;zdmgnK+Tk*Mlh@qdK_iB~oq!h? z#GKLCe$MsCwst1KRQU`_pUec5!-}G1z8?(BqEi^f9b)8wxDcuESj({2wEg!EBqB88 z6Gn_dCYA^oM?Dj=7S~EDc9URG`Jg6*nEeu5Nn!~j(WQ^2jKmaf=8AV=RB-~mFCD;v zTRvfsM=hD$B1yMO4;VuaPHZ><8lNPl(nYLGm8S}*AAE&EczzP$vAJ2w@*zKi7~Y;3 zE(GtL1rG)us4Nhf3h}TMrI29*Q6nhH&f-RP$)viXPlccqSaIVahMT@ycJ4YpriKJ3 zHlPWyCIpw8L*4$G+!~d58I!4i;xRy64T4y}8f@V*O`O!oIaDSPFDZ@%LMQoVx+;O0 zx+n`31@>~r*$#n~JfbWo2h(4GxByY35!G#mpGDgp&6DXV;d!n~2=uQD;`0Dz20ELB zxZ`jkwpclPu?hwVWg;+5Lqj5@#6xs^hj_THNP5F4Pv zW?r0r{-cQ@O9^?-M6K9#pojvMToi644!{e^b7zM zO@Xs#*F7%Mt!f~69^mX-IvOrlIsh|Gk+4=)Tttfmm$nx)m-!MwC!UAI1jvH`C3z4v z0qPV<(Odpf6nIgYlG`AWUws&g&p1vI2g4;8wgL7)&>1t_|fd+_n(3o>#~ZcS$K;gZm}WpBg{j}#jGJ$r=S znqLg0=D*M`OW9X|_m#nr{c94rIuMxzb6ABeoLoPK_+%m~`GIJP52K?oo)|wwaE?Ji zfQGQC0LAd_0UwY^{8=LJWN%Qv5X`NfOZygu{JEiw(?9Sk_gU;I7yb0cwY-15F(L2$ z%tK2Z{@G3D;~H4JV~+auF#1cA6?cLt?y7)al;_jw2Nxo6oy|?#c01cP{R$~`*RK{! zXs^p5FW=1{I<8T;e7`33cv&fg^{d{H8d@)6RvF0>cft~i&AY8L3AU!dOctv#!5FNQqQ-XBRl)iCWza4Wq4 z5kb*U$#b)_%N9Ienp^%zd)=qN^_{)kMwwc=G&-#Sa<2Jjbqz9EaQPCr2jtfFXuAuV})GP^NW_p*T9|@3|H>k7%B!>Gq`S{QX*Xe^c&! zpEY}P!-PRHi=n&380B63jX3r_t%sGwk#UEA2BwLP{kIr{GAWik96axAsgswbvSgt9 zDCeI3Q1<#t;n*CJaA3Jfu?;MphH+~d<*9+`1XC7Jb?)b)` zcdjKrnfOsoM++OqQHKJG4`5<2=O;=f4q}I8>O{+2a>91$rY-F<%+!g7JjWRwN)@OI zgdr8d4~lqauPS88&}}dJ;}(A!o4V7J5g@yGf)BhrSZ7AdN!;IZNL+EkPMao2LUKyw zGDwqK*ZHx|C%r@`!9Jn$oPY(j$6h-V*RsK72s_PZ^VIEHtIcnX>g{%>)*{}yo%Z^l zNAr)qe@1|-y;<1gy!7L)jEqsqoV0qCCq$D!qODR-y}USXs5t%7w7HyFiYhHWxlWQv zhQ&^Eva|N^o0NmoEyO?nxribOK~YAh@F)uub%=pbk@znuATD0?MIg5-^mAb#3DVcQ zG+1OrpI?DpDEI=RHYq95n#g*niUw}taVa3jOnGQDR^vp7LZEHpMK0m05$=i*<7vqh zM_I^_%(&&K`CqT1Itim(a3YZcYQ>+d;V7Vo0=Gh!ZPvNj_ZzRp!yjY#Ov@y@F1qBY z0e@k`ZGh(P$?{Pd;GJIR?h9M!2m`|SE_6lE$EIHo1dx97P2>FtTszJSdLgzfzg!2$ zv2!)DChf?VSsPZ)<)ZY0!mQs0HRho-tcZE@*PNQn>9Qh3w#(K#ka7VGnmy^1zX)aR zN-_VocYg8bgw-St8o-|!;|5c*EQFziBY+ht|2ZE-w&lbXzt@F38!`Q;axG?NL`VJ7 z5y7-tp(;_34li+$!Y@gdtVi<}m9M?v5Vc&kUXZLcoP$H8UDUdh6;(b|vNe4dAN?Rs*BJS-StVe5 zD3Pe)8DFXnSvRuI?8zWJQ0JO>9(BdyxTU67sjiO6$uLeXiATbkNpGu5^h~V3PpkR zHNnW~$tzKNfgWBik9xF#SWk2ouJb0)GS%e7h5vm!c>sPhf)qs^|I@>*8g4I%^EN>& zMOtZKqC~8zwHlhJ=B!p$YLqF8?e#o{DWWwZ7PZA5u2M|3$BgJd5saph=dAw@oFsBq zI3FK3M@%-F90l9h-wlq4-`l89Wv0Ysh?F16YT3|^JoAttU~mQiqQd|D3vlCFPn=IJ zHAcDCIMOuuF-y{>R+ph_Z>q1u_nhJ{q{KbUO%=(m6V|K}XnKh?7hau_Q@0mz7*dsh z=3@49p_w1cKv?L+>4~}$L%dLJ{=;0)E-cxUBufTw^Vf|V3aZq5Fr+(N2lhWj!*zCx zz5_`boE*t^3W8^iwy)aw&m*~GEeSyJ(k9xR;wFz-na$8mCH(SSAtk|cUR9@2%qiihZNKBdi{->*-gh=F zooA+_=H#H*Pki%qRC+F!w%*yQ0pODA7z2k)FYbi1Ox>%vUKN=Sld{h$%{lXDGVPrHQ|5p)C@3b?BZWd-!xt+)y_QD!cF6l!fRrf z%qeA|}=q_)BUE;db7l~t2isP=;hsxd*}Q`rK6YL+PQR8=s*B$V!)NRf~z5oIul)VbO8 z^9Gz9=6<`{@9w#gH(TL_pOk<(~zR@l3@m06GMl0-5Npk+$KaFlRA{T*j- z$)RI?*P!HxL-RXsTC94@**uCQ35JA$`J7-Ym-nGpB_W?)fV@H!oQc{PdebEs-eR6b zB0#cOEz;OSme&i>z=>IU7S@2xMuh&1{j2Iv=p81XXi9W5BnBjW??QIT6V%?zEUwMW zj3?~0H?d0P!6NzK*zQz9AzjI$=qf3eA~xQZ1k1P|bv9mXl$f7a^D=6SR0 zR^oZH(PTqd=u(I@p^z@IPxHm*3V6NPV)|3n!3GB*~Tepi|DGM0Y86EhRyuPmJxt8w^t05sO zBd8A8xPdw|Xeyv9q9mQwx@Nw#tU|<|u}7V9YY{o5yZUoFtTl z{h^!nPA=O(gcdAiG&T4$nWeg%+&?hHH#g=k#qE|jym90FUorf*1KM$yp8sgPFfG2p zLV0A(?^sxGvt8pl_(piw+Im0d$o${!4?Z|4rq~A>n_^N^)@??Z`-a3y8N>Uh<$LGm!~hk(_xAd9kn~@=j5Xwc>n$|4|)2QX$236=#|MbThNeBqsN3m zvk9XALDFNQ6S^E0Flcq_yCN?nm_D_M$Vx_%|^p&Gx+ZdNuL=i3{m>pwc!UW$GG-fzM_$=--VIJ zZG6_8nF-EWFW(ho;krVa7Oq-8Y(X8_K~_sQFCGeeTay1q&QM`FV)j`fZ0s$GKsNIc z)gN=trum)EK9eh-%+e4o14O&o|iCeLL7 z8Ov~_Elz-&g1m!3L^@FNMZTi=kU3~Jl`Tjk9v+uuTfD)v-Dupg-HvVZKC2C?9CocC z@iY;?yXRyP)(Qw;k~>KPZ470dX-g}9Dowe3?L8Lyq{}9Pls4pL8P(L{^HAto7 zb&DeG0(VmOZxURpa>e!!@qVRFeYE-dJkuIi7s~~*|}A2hRvwtS_{-M5Ir5AH-+Fl z531B2V*q+MHhRU{Yr;`ck?*bmJ*}lG&*O+0;1o2 z!@k_&i>T>l#{#4AfpcZ5NVG#HVvdp=dVWW>R&_GAZFl23+C{yOffrGO*2`+=$(yV~ zPob?7U`1A@+JE-wqr8S)ab}lv$jlI=Zm|sWpJva7{Q85(kl(f{$Bs1k|5zYR5#wBg zWdkx$=ndI_wh$!pzk3J@ecD8~GFY+eDVR3~u*Y|f^>tv%`vI$2N}GLD^I1}d<2F%f z005c2&hh+sLLsoMPT|J9wljX#(kj};!gRdd*hT^C-j95(+Ph#EZGkX%cxz-X_)Zv8 z=+P}*=ieQRz@E$xlD|1W9fiudxZA2WMTxq&1hy-T%Xx-)G3EUSYmSv~V9G#j(2I5S!Oa{^lBuDE5OJ6? z&apKwSQ7X->|gn2KD229v;{r{{x?McV7Vu<06nD)fWc20gCG!m{QpQ#)9@t0{=b~U zt6qW&{Lkwqk?yVWVg5+sThT~T465!AotN7e$JJ$a0J+NV zNOv?vFnpoU`u6+NvjIEtVZ7hBV@%! znyPn389&WZ4k8K9{dJ|uVs_a77^kpNUVe_G&G3i~nvNrdJbn$aB3H=CeWxw!^hPvB zXn~Q2&CL>HU%x7);QfIo+dtjf^6kieY!Y~!*VL^g#w`lo&~9*5A3yC!i&vmz57V1^ zpFpPkNZP*=tCjE)uO;f8aA9_EWnb!EP~}y|tVAPRvl;VrSie_8TZsdox0N8}6^@WF zMz&Y9-LFJBEUb!&>J)q}rg9B29*YAVj6zbodxalh=`uc~Pbp&OPrSV8PK>wc$v0YG z1iM=-#HUJO5Y=EVP(;?N_fxWyXr4mC(>Bs=ocu@6@>z_i#M#u-STjc<=Q(IDN6kmQ zF3=|y{61}}#FBURkTW1v8gS~e4SkuyHIm&TIvBH=0EQve`gYC5Y&9Z+RR;Zv3d9w8FrIy%o&;GOuq2!a%|g=j=~nO+Rc12ME5SrS1iVOssnWom zKnKzesfc)?`(|l` z)3`R<*&s(XQ|or)=~wZ(~;E+GNk2~#_i80E9X-EL6NCxR5@PxSw@ z<|}PrB0VN~+kdE_BuU=2wL8@x+Gpxt1ko>3jK zCZ^&yz9z}F`h`BGZB|3op_0$@@#2Ky>6|OV%4DAi)g?{o=1(myW<*B*{-p3<8*-u`PDd`bT_J{rZDQpCd^m$Re))zkV zW3Q_TJR;6szve%hnl{Y=dTwnm*Ok;}wr|lV`W__SI=dZwJ-7|&#$8On^_frl^+oO3 zGmvaExW$Y`@Tip)we$;e<2P$O76Dz|7(Gaq1l+PhN5?7uI?tc>{vr~t466?UNzKhJ z-Pp;(nCOj@;e$a$wh}=`%PmwiKJ6#96j-mYp_QZ_W_8z{3*cP%(ZQ#ziR4#dZA1!W z$}sKE@b+nj-_K|w2B*8~ekl%#{M&nPi7qKMAWmOliqOvP3=Oe_|=R}^Rv5GrS=+Bxxql@2@`g537=LUtclh&`gcYgSA zyQ^?l6TL*>lysq_VvPfqRyn)4efllsNu&I9LUV!&R3(y&_0=p10|Ft@J<2QD!pK_1 z?DCKxdI5#b)6?59*nR9|rC%}4gVVf+AvB1mrtg#rO%ZG&TG($@LFHMcPL`GvqcM%T zpo@9xJl;*U-Mub?lmvn*4rwiznabAkC-NVmg!PR52puoo`9qprtc6tF53;a&V&S^) z{t+J8(=q&D%)-V*j^EOt7oX!Bj(jMeEnw`&M%xN~eszU9lgzc@sm5LagVj^>tM`f~ zbaox8ZRw3M>45?bnTz)3H%(k#7ZcS_e3lh$8oT9Xl5jy$GWGQ9VW2n0WEpQA?3Dk` zzPrOD&;P#iZz#ADp?WN+VWJclrwPl$9v4^;9tfH}cHd`(LJPulo!IrbiKMFv1wcOn z!Kv^LeC?!8IanEl<%||%XqF2C8QuC6|Hz19L-2$3Yz$g)dB?eU!CVGO^H@?xD8e$b z*e?XfX)MCOYKQk+K}RvwBVha-d|-Q@e6z3bJRTu;W{Dlpn@OQ+;*$ znhd6ytbO>4izOdfz?i>~9NDpB@AUmnI?M~EM>KpH)`C5JlTq(8H4YXXG_}q7G>q$K zlRGTtWU9Lqf4k9Vc3ejDc>fI&`WqGcYk*m?j6LD9amh3;>@SYE4da)UJGJhpSVKfo sLf4}D<-hHPp=px;L1+K};yL9l7E#yznsXA%-G8)H6g1^)<*dX1A4|9jbpQYW literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step10.png b/ru/docs/chapter_sorting/heap_sort.assets/heap_sort_step10.png new file mode 100644 index 0000000000000000000000000000000000000000..8db11fe5f40ac3282ab5d8c42bede4ed17706b0f GIT binary patch literal 13146 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

      _GW}7k)*s@IQeuWi9ZC7Dc0r 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 z z@`@brx%0n;PkVpUeSo9s{0iFvR;uI5z)xudI_+~d)zJ)4C@q8=+GSdco~4;l>B(ex zq6$~HMP-R&j?aOvWtnc=AHr5gkR08a+M&HDf?0pET=PpY@Y ze}CU}A0RUfvO^%9Qmj|1Yax6*UGu$Uq}FN^?(6D=&?sZ8~`H$4FZjH&OsUe!V)Q{sW&Ph zy0CcDurT<1NVyzRepARzPmX81Vu=Jbyf`0%YbOr(j1X>DO4%&$; zxnGEDCSDjMGiqIUh#RKdV_s#U!e>HGn<1ygw(Si`c3{bH`kNsuPn@s1$_%HaSIp12 zbHn0q2mb&-=&=FlI>CW}mVt(X?qMgPv~yvZET+|cvRpRwOT=R8r-e=Vdb+p}a;0sB zmny_^+jfSWC#7MU-Vt)^crEWG4RR}F?rA0DY@dakioHzrtn4|`&HMuZp_8P5HV1SF zoEc~z^V!}9iEJs(io&egnj4lbL_RNyN?DEdkc*x~(IQbBilsK+4k`Ne-4fJ5EF0Il zd0@91FVoww2F@7l+`~>>Da5>zEOx>h z#Ig%Uab6@3uB2PKR853cz7E}zg{(pcS2PZd+r@SWx)a2vOS_spu7xC3yR@hIUY3R= z2U(vy`G;jVyHw5_igKi7G|Ovee#Yn^8RmY{Lb6OA3r{3Q@|ZPf%qGbo^STzY*t@W* z3bhcDO!K{5JFsPo7xuC$^MhA}tm~4)P&TCNmS5g+M&CGRe=+?70HL!G&?3-6&`{8W z(3Qn=hGgSe8B0=uOv(-3bpUN;5Vn~~tdLKWVHPH}tnfrbXSI{xY)`WW#!7TA>AGY< z8&5se&8$Ke2X?GY>AE^(Qyr5$WK-=|aU|$#>5qI9U*;z5R^#N(lKc4w076F~AVHv| zpnKX!oOLsPWmt~$Lsrl#el1yQf^jp@ZOuS7=U%fgz8Yy}S*_cdw9Ze%LRP!BBh`l+7Q|E0imFXjOqQ9k!mhFmp4g)E%+qR{7_G^c zc9U&}%$vlvLarUQ%CdT)SbY?$wx`Ck@?{L?h(BlU;2!`89R-1jfe^Hz9ryzPp#u@n zLeT!Xvpk*dcD`kCb?XYx%Ql*}u}Yg2$y2tbB@s3aSqh&V`?j>ZLelr}hGFa5)`o?+ zW~u5Q3AtqWy&>By;8I9;5U4HyAap7OUfLaEsbKB*ie=HiH{v(%=K}`3?7<%Z2pusG zgrH3b-Y)f}U3Y2cC1NCSUxLdjJ3c07*qoM6N<$ Efc@O`S zzpJLEZE9v(PP%6zRg^wsppv2j0DvJYBdG=e2>+pQAY{1zrtsefdH?`^QBly4`j7no z1vE6Y|Bnt6>xch15D0|z1CNM^$bTd!_s9P@tgLL*4D9cy7}>amRCNp~=~yW!Df##X z7#SJ)KS|SbKu9U*X_z?P(=hW32nq`e)3I>6pxIIBq66&(bDJU`S?*tl9rWUD@TLJPe52wk?h?&LNe;T%RR_v z6-fn64o)ujpg1)HBaLV+aXED(D?43NEA2c@JmUBKqB5VPl&xL-*x1-BoBI?sbUi~8 zi)%aN1C?sp{F5#oT~<}Etf5;>T+-a$OGU@b!8^?68`RnVdwut)qi=+(U)cH6nWXe*1q~zb z(AdJ7){K(cUme4rm33|H?2hk_v&$RuDw~31)0MPLlJhG4A`;ENx~CS_*m;C-dGW`_ z#Mx`WVm&Iljw+u{++sK%inMI`)%K9jVCFZDS-B>$& zu!`zn;u70CID{o+nAth0rXDkMa?2?waLC$nE4#@mt4Aj1u}hk26}~D&Eh;7aW8juz z7F7EjFrcEQDi=Dz#3%3K=IRIak4nvv^lbal*siUkvw5^BY?;yA+5Az{zk9HoUq9mN z^-9)V$-vN1-9xu`Vp-560pd_Dq9VWeZ)s{}I>gShu%yV-+bbk2RNVDfQfhKmZnl4P z#*gZXPc{VtU&Tbi#F^bce2@_sni@tyL{t^z%de_;krt|LsC#{V{m3u;=5NxI>0jt$ zSs&%{l8$tTG|dMng)?fQJk>8B=D;UT^1jGozSCq^RNG+mds5} zNgY7OBA_J`m*;2Y(lZZr^|etyh&eqyJvxb=RKpQc0zftwvXWvNo=eBwf&a?}X#UF& zq95S@q5px^A9N405K~HD|F^U?xoST-Q7LQ!e}!RA4)?En<&JJk1OEpfHF$YnMGpCo zny(eZIsZ_D)R@$hGq-MkeI3zjv)HKn+dm_yID^r=g1vZ}dEscnlSS(JwNscc%XS5CB*+GD55?0r`jP0MNNvRTE7UCFMQaA9O6mQy{cI_j+xXvh;$c<;NR!m#<&7BDg6gER& zgxfn|9YHnROqo3VJiX~vUV0=HD)<<|G4j}1i6y^N$Qy;TbRdG&r0Pz`m}gizZqXYhds9yL7g3bGmBJgT{hCqnW+?wr_7dkb)_D& zG`!u(<2iRH$lfK5WM}+0`^P!sH+JWHS^FSQ=4^;S+S=N4gT3!V*WT%M9hvCyvY2fT z1b@K!GRUFIWPdEB^?UOXM%@9(8|A~aga;S;OIkaMl^Qlur*WSRy<_4~lyGSTwOWcs z=Ufe(?yf8H0kxYBS!A=dEvF9 zi@5VxiSlZR&jS177RfP4$)m(#>{rLr_pGqIWSm#&W@bFvFbnL5b3|k-d=R$>j4Dr- z`Z+$FBxb+tX58wvK61r`e#4Q{S=oH{OVZy9aM2frZLAjfCxu-#A$9mS^;gpL2pJ5< zFyFhD&gYEpc@Z;KekkvH>sh+AB)326u3UcnwS9zLk%#)9B!V95~RxD*Ri7iJH6(8MI+V z2YE1*j*!s5p{^a`yA?9wqxNTpk}~GnT`@exLG9&XN^mPj)hJH3#MAVoaan_a;2|AQ zzux7Y;i}PJ9Jr}vi_bY1O+918vV2aFrz%|u-#*MO|HJWDtN1qwl>!xXStLO&2()7@ z6Lja$wBGvW{Za#TW#(1V3eV1e5O8-cg*UgFDYXJ4X#d>m zwpUV}5x-5*k}8O^zx)te4EkbZ2dmcG$a-|_qJbTZt8WN-IzB(4-;1!lc%b<52&&hg zFIaJ(k|W^-d2I^j=J9`Ga|;h;8g;Q{OJ|Rok?7nZlqV}g5szjkY(B>orNVA*=PCSF z%pi_NE7vQz5P0B&9NsyN9N#T-S`Z7w@Zmj;YW(jA3UrX;7QFXn6L2gD&Fj^mZs%ou zXong!I0cBAv>6fz>81Dr)4sRz_j@>+-??e$zOnGi=7`>3F2^Bzut z(#Z*FCBW$Y;NN%J_`jV>qU}W{yi)b4hei$X7uDc(11;k%(MT56(j2JX$=9{^MdfhF zSs>1#7dsHKqAmXQ=#hrj3oFgT^Irt7s44yuuU(#D$*_vADTK`P2AdlLo|`) z5ye!t*@X-w`_<^Fue}!JUpy4M!7TSO=*CGx4pH!{XL0Y{}=b< znAAUn)N~^&27!2t4q7CEGD& zA^i5NOQvnURHpn(H;Z&}akEetF&Jf__*vtF1_pFv*ib~SB190OO*TotTc_i*;`<+b zSrY|%h(#)l4u*(V#~1k@H&zKu^Z`u7I58;OzY9g4oSI^Dw-p~9qP!iX^?*=Uo53fE z@L?a+(5<=92})SEH_E-q+1N*pjV@{Evbh4|!`Xxc9VArzB0NWEPLUX~ho60h8Rf7~ zocLdsZ!4R*NUg;|Y9kgb@pDUf4XRcQSr)t$ql|ACN?+gQe2#g9Kk6RmM^#|m7nmL( z`-Qb(;2r~HA_A0;@~PZqqXN)bYoxVe2AC&YO-0=t0|med216c|AJ_$|Mk*e=;FKvq z4rk~awFjZ|lkXEC05KY9Wgr}i*95#E8q5jSv&kuWl2gZ?qhSLw{I-UVFc)+kE zA8Xn$32JE8_A?*mhQBG$@9u{N#Lo*6`X`&_tluQd;oQ0GcwQ zpbz1&5e8Up#8S->3a}BT#Bb*H$?k79&>0Tw(nBa9Z|KDagph*>y6AXz+b4MIp5^&yv6wiSPZ`jeiG>XQMjn z!uU`sw109_9IP`e)PejL+I$Fqn(||AL=-tvN6L%;R_bPT{}s$H^H~fVpII%3Hpy@W ztXscGw?S$h4&`@KbEPXu!X(F^=??F1GO3)k_49Wh+`C`@*mWJ&wmI@a@zvw42wgm# z;Xw<~1y6+I)1r0+GwGUA^_(b8u=RbvQ!n9^jtKfX?D{9OlBoYv&Tl}t4sj#y8}td_ zaa-TW@S~`BTH22zgr(z?@92ivglV;i0SVs*1s>5ATpETqy+Q8k9K9$@8_j=X3*REC z*PbRbgRlKcE;_;ca5gm4%0%4;asHXl#OHdjv8uF**tIA9CcnU;!*Z`gu-m^xN-|dZ z(I(*e6!Uxp6!A^U-Fk=e0Z8q{Ncwa3XC$t#mrb{R%_N!-Qqn$(3Hfy}^}g&|QV^fz z`6&W)n7IDHw`0YAS%Yn-SScBd%B@vwoBBI8p{0{|37X-So7=C&@%s(*6$E^1hk$CY}6a%mL~5S?^u_s16y*@X(tpg1Ly$(_EIeH z`F#K-wF?;eh9Nmi(N_$T5q9E+&%SV_WV79EKskzK{_N#JF-0nB(85Y-}+g**g zfOtIaQujM?8Jk$_a^aR8UxA%oF}4hLBoRV&l<%@U-i4i+D;lA4M+1C=9vL-3B;O~z zM7{^!Rmo$%oBlT41HSE4hPT;C?+b0^?H*Ywb$JrZb;$ysmNnde>+ct7ao_Wse0gZjD^S@R9nHgiuV^MvFlN*l~y zzFgO#83+sginv^Q3_A*gmpl^V_!}XDY(Goh+?j}#IZU2jilMoTpvhMyO*3h2cV8_Kyyu~m+6D&PVzI%LhTIpPXdq7h7hxZk~xhVOA|Yt zC9Hw}44S9DLrmD4-c`w{PTw22blNQPxJ>B#h^|7P{iWyM_&2Bk0|n9s!rgU$@8>Ty z$rchqfua=9^ILGiiBmayRHtuvD z#fbx99I45Gf`)&qZBtWmn25V;f#2Y-AuYn5e18v~PC{hahYp6y+F%ZuUmVuEG|lP+ zUoYD|Z}u-AvMie5UxzTA&|nlIND%^iPGoAG4N$kvt!(k@Fozg5$MMh1@G#$&c5J<$ zYrfdE3SE9|q2FvD)KcXiPE1~Yhw3pG9$- z*Pd{svxTn+Pktjzx^vLlzlh>4<9LW?8gx7a0>olfl=g#)njjSuO^i3(>N0`N_c4WU z-@y>StK9K+qS&s$p)Zh5=r$aEz-{{Us{QtI8_dV`r3sO;A4Obtz{{80317-MB`GhA zX~5!)40QiPqN@w8n3mocUur!SNA5M`g)_Z3pa5<~rRNG>N)^Au>g-e%JFJ@{b`QIs z9YGA6X0gs{9ONCzYDD$N>6pr()%#-5`&{4g`WKIvGi4BCx^#&- zhgWoqEs)+ckTh|L@7a$y7(fpA+iyt}Y#W*g02ly1%geibTrh_LIMx;|LA3Wj)8p0SnCCeuQ!|qJS8;8$=w%Sbs7N8{JFWK8gR-7fy>7j02?S! zQU42s3k7b?ZT_ctZZ__3l!f?@1Nuhw5IZ=WWWAq7A-^xLgVl)CArqV>M;x&qmOqBU z9FZ7VsqT(U7R`CF6%sff6zp}w=z0G0{C7YP#nIesI|+uq_d;i$JdG%rL92ptx5$#Jc+=t? zcSJjYg3uX8DC0>p*(#R&X=AKdXa|PjR$Uk3g~^kVCOS;9K;$4@rBp=x3M`0g9V_1A zL77mXHIL-R0erL-sOS4JNk!{n2Pe`2(>}ZM zqh9_BtbP9!4V;cGO!grYo7>H;<(Q6+n9os_cc}&#J0BqXorr3IyIG5`MUAvEPl=-h z-57&%ftlNH8Bq`&irycNTvf8y138rCG)9t03Z~^W6Mh{Y(S{haILK&jeRz(i0ZWJO zP3}z|T~#7&0&SG-mqe5UEAcZul&)C?Egczsa8n0#4iGKW0@pVJuwuMganXH;gqE0X zxero;ZM;5(!wIFChKsWEVZKCc*PC;tkG-#%t*y)6a@<&D1{qqX_A5Bq=yg8nKH%-! zRCCTP%lTOrZRZHa;Mn_U)H`Fba%+{ z?isKDH0a>*_ww(2`u4?T>!JG3Q)hS`QGNr&_WUp(RDCnbf6(rkNPlu2=ib&)_bO<#;UM(L;{eGX<&sEI!t(ldg%L}qxHI25x0 zN`;I-v@&CuAxX$WuQt+JI{Kbo#QV5*zO=04W`7_m^PA%FT=CwTU@)b4xVwE@R`rG5 zUs#q`AM(}a-EMf$&VIVCiS|a`3w`ZRQU#P=8z?eIozt@rAhixavfU!^NnS&`r>4uk zFgT7M)}Q%bJUo?^J=LEf5H{ch8;c=$vH@Pr3D%Mwt#=NtAFgj!KWHzrm5zJh=KN_& zvvrsrVS&TOzVLoV;pLvfc+O9?2u=e{SiYSB@QL_oc*yi%WNS>yX96g+13MNDIguq_ zL`XnHBQsOlgUeoo50T?y9K)Wb# z3b=cJbLZG^;>QT<8{)eSi0*Qa;--Ode^aqqozIisTaQ&BfcKwH!e&=0nX^Yf7 zAHjw^9P)cMk%(O|%YPSlXz&|B&Adhjw#X2nIUPr-&~qZ19+@j$+-Mvtl7m~vM+cX% zGB)HNDlP(AElY}hQLvB}G>5sUiOY;6hr}Str^kIs{AVN}Xajpg513MLY1yv*e7X7^ zL_ZxQ`Hy<0_r^XHBJGo+`d>q$Nqy@@C0H;N5x zh`|pw3^n;8I_RAsJ=EwO$qENj5x3j7_;*4|7Bn=A;WRgyie^P(B`z1i@ofg%z0RGB z_;8a5bzIlWfA|hV{jyL1aAnAI;YJ1)hO*~5!tTmzivXDp5mXb3M%R%k@Y(DG#kHN| z^@uI93Ee^Q5nRM=4cbpQN^kQD$q30|m%u;*=>Ewg7eT=sMrea9P*`?^ElDFz#fM6{ zP#UC+IfnH5;_h}o@*%wIB;aQA4z0`f4Eg+!1;RbWVbTbX=v-}z??dKWl`vgHR`igd ziYj>$(T5yKjLon?X7AeTeMhYLQ;HvM%$c9Axo^YlR7+}a_v(9gQh|e^(p&OY^k1JB zs25Uk@PqS@F<kUX7fi{-1wf zrmP@ZNve77MlsT_3FMLo0nl*R!$IFAc@F=rc#^M{6taysFQV#JGi*&ME3C^W0 zotAKBL8d9_c1tQZ6qQHnj`2;w(0ir% zsDUsjr(XFY3=C19MTe_;WF(=L2gG7SpL`aqzDuXVh7In6_d4j#rx`wfmVWqx>iH|+ zu@hvnfbz2l4ZWwqmt+VRa)oQ+M{a@+OB84i=RnQ3j{7iW#PbSSi)$K>MC!^sszxkiWRD;3+t_J%# z{B}%eB5PEqPM=lo_KOKiLwk0WmlGJ8+yS@Si(n5^LGhYEg+NDnz5ogpq1B+`6w5Fo z8sVIVZcU&g@EmCz9r&{TcE0_*aex2dh%_D-r=;vR8)`g#J3oamkfP%fzW~+)2IZ}~ z?k4%6_+Ougq)_|d?2Pf=exK0J|1STsRXq3N{fW8Ua&ciH*;+^WW48Avso*-_b4j)Q z`Wow;@P?)2lAEVyYjE>c)!88TPAO%&FxoQngGZY6H}d!2wEDvJ$;`|&FL?i5l06l6 zjCKJNBv~2ol&#$8vmAt1xTUV~T7gKKh%cxr-zcwBVQK@P<+?wcjk#geYmW64{-ky> z?%%zk`KiTJvc#z7lvv3a!on5m>Uey!!vb*O^QIwqdI3zt@^gt)|Ae#(yNya;S7KTc z6e|E%<_v=2f62AAv(IyYoO}loydB_!R6gyFqM)6ep_3^MLQfqVySqvHsf6h-#Q#ay z`(mqqa`NF=t`cd(?gv2d*#bKpuZkJgun2FIG{6G0eNkpl6wUO^hdcRt6x|*=QS`)G zuOzINO0m|}cJDMVN{+GLd3kt?-bL%0)V+hNL$u{1*YL2>{bIOhhzC>iX8Cy}PyXai zotr+t^S8I-(GU(IuttBnFgj{)zyIj|$5|h|mT#a7F5538A#vT*L9nh|*!hm0fm~qV zTsqUBRUJVDY$-^C@nCBOD~1-3k}8x91FD_)=G5tiP%o^-;1aW_I@2DlC}QHoQf!eH zzT5Hh8nDcog;Xmdl;b2q0l_@e(J3(tq|%0Ih6nnK9|;=yHa!TbYI!4pZXeN0tWx9N zg_sRFVEzF;U;DnX{VSSK&J*!*NQREbV#O(seXmYIIJwb)q9Y?w9oa!$G3wWk3ONC^ z-H$M&K50NfnE9y%L|Nu^-9517H&_MN^6xU(y)=GA@MIEj-WyOVl6fJKN?8D47>3cJ zTDU@FR~dy33rHLz538{rJ4PqD^lKm1Us{p!t6LCTe_I0S{~o7K*`Rz(z4S7zN1G8A zZAoy%2=S&YC%h^n3OEr2bXhk@&z}mgOg=%6nV~>&29SBQr7%`%`5f31VPB)>@})8v z16NBs0`wXO&}vsvQ>A+?+Cd{$Na|gSE5D+$XRjcX&T+vZ20b|KM|xF*Lg-@dem8P7 z!B601)wQ)PLYhJ%*R*v7OebcXNudhsGyF7xn51fH;0`3 zw^tlu1ShPyIr!Yw(+`0uk2Kxy9haJMM4qSH*Oop4U#B~&`wy2+!&a=L#;m*^-BEml zx%lmUWwc4G_c~Kle$9U)0Ol-QE3q`}qETfB*dae18J?mEzuG z*Mdkqh>tYXJPC%F9POGlFQ2IS!{S|1 zRIH=P{>S#*MYhjE56j?ltlP1gMjJ+S7}0BVHg0XZ0P$2QP01#Nec05JgGv`iNsn z8Gl10N>sFH{#K21OA{0#0JACO2HvOCXQu|7GzWWEen%qx6GFUrrG@$+TY_m_@h{}6 zLw(4yB~ds_QBp+O=stn0L?&yqL&x<5Nn@o^Xn}9B1Z}B3D6Iv!+?RB5kA4gBpg2SU}9vn@x$agt6`LQacEH$Dm|^z~t6Dk_EPJ z%UpP3k`mPh&nR7=B7U?tJ|G_mP*3QI-G@gRlULp0^nUK= zS}w+>LkHQ@$4ZPh)9yVv7+Ki$qFHS*+QIfr`1d?l-4g2R8bCe{ullRD9mk&U1 ztE>1nx8Lo*Qy3cw_-K`hQD0w}J95IG_eAK!HR;X4x%_@-c2a1GyEU%>Y=>>b(?wVP zo?c(v+iMr^qIw?z2|)53&R%;fy|)V_NVx85`B#NdYF>jt-!q(M)@Wudq)i1Qprl@G zIii|F2yH1GCIbhjXSFSupN8$CP0;Wd>sB~aHS+1j49rt9W)dcG%D)+4#mMUFSn1XYFHAL1W?5 zlMxHnFG8LgSC`>JoPJWk3NR1fG`Xy`1*-biS;M7Z%kNaMuwjl~U`Y<-ON0fnjJMAJ z3WWN``Z04_%iJb3NgnUY^79XVAVnxNX?0y{DcO_@8F{YYn4H|ywhbXFfC99z37{OW zP2wrRV2#->28i+3e?*cPF>2VFGhIaKzz0sa-+H+K8P+Ab{vVD_Z|KElSKtyxqsP2| zOG}}d*gI^KlU&je6HovJHXA<2`-Prg>pGMne^??voFS`hQS55#hc>$`;C)P&4ntM> z|aJzB95BOKK zba<2UX(0m66zu+uM`Tu%f#wUz^Vpr|g_x_r@B<0$4H(kLf-&DVM~Gbp3P)FC%ZqvS z>b=467r9tEKu`n95Q`6bl+-xo2Su1UdyhW&+~~0_5^QAYo%DR^3^=vNuO+Z5)YAdm4NXkcVEc$>GL0<1oa$n%*t#t&9Xfk=#@EExpbkZ65jaerZy zeHA}|(KIT!lfeKXMDt7YmSO zjRhkTcVn0z!T}VX^u~dO!bKst!p&4HIl{s4b;m#;D+00w6NFM81lBbQ z{6A{(KNK~-e{HdmK2Flvw=0~cg^?jJUs^R8^kKN0+LM#Hp!+*@r%Hp`@*}bq8?BaI zK}jcD1d-{7Cy`sUYZuXRr5Vx_TaP?HKlgc2d!8h>-M<+b#$y(RBK!Go)tERNVo2oI zU9(hR;r;yJ*Cs(pC=$8b#G6()@_BwR=HvR|8y?6%X?@iDet1E&BKQpRQB)Ed&=3db ze4kv>=eYA$11D2>$)5LbnQS0cYMu8S1iyH>`jhvdX=>NF#PR3n=ez5l_q52ADYW0u zk-QT>Y~TLe#${3PtZi#6;b8#G|B3Y<$3ziZnS=E=T8YcW&Bg zi$9wtEJB74`0Vw@s@c+niM;aTO&2~QHtH(tLz*tq%j(O_k%!|T1+K{l8w+pe8itw18rwh0Xdko5o7cXD<7GWmoM?<+$)%*QF85H*ecqJyQM{6hHpz~@V};E`(3 z`spQ6_DXRQElaUAINVs1^H3HwE2g%|Q4P^}85KInp0ub6wbz&RK&XRZravRnK$wLB zq1vT=gmMMVJtk-ZcOK_9d_w;6XoGaApFu(&RH?f(Hw@5|JsBI8jw#sp-_tp;CugbF z9WOQLUk`D0e{7ShQ+eb!eOcyWFKOW(;aiFiw0 zlVk{!bN~UN6hdcEK+S$hkb&C431-vR#TvquoQeNhHb-a!O7EFmI6q%U)J!3q8iGvg zpNlf#ySN6$+&*lhcoKHH_MFNuc{LCd64Q+Bn$I|B$aTDq7wT7CA!Hr%C_98RNZ}?M8ufrEN!~>F-V2vRII05{wtJ(j&gPLhQPe# zU+A71N??r}#{3C?-+57|=yu~7pQ|ikK(LAoBIZjL^aHEjTKJZij=n7`)GAuuL#~`|CUwt*K)*-ZUls3&tI(b?LL&lknQ=1Mi#9_De z@)caGU*!*n(MHTE{ynO=>s&Rn379a*jm46b)NrWKe|~A+)zq%87^e>-Mlr%} zCom$1>je-?o@cY4nW|~z9`RC)w+`fio*KezoP!2|B{ZN!7&ZDEkv;1`zGEg(gYe-w ztlVnlhuBRozE^pZ5ESVel!OWXiJ+vUlOe}HNsyq07gweHn)UH>?ZI6b1DB5j`5&UY z=-a=%S&o({DR$l8Y~y@jMtr^oKc1XXAZfcEnrVO}_TUsIByvLtAfi`kINtoDV-AJk z0eoN>Lh{*7neO1~^zMy?wIlK%XuovC+1YQLy6o)OisYlS0k)Bi3FM0hn0R}*vYzT;KoS5;G4j}}(HH8Hh z{rv?syK0u*aVpiefBIYqK+9Yk*++)^eapa3vYeW-6rGM9t=A9M z@Hsc;1IvWXLs|||W`P@peDAK6C84};w6+~MiE(G}7BOY*Hq6x^WInxb?;(1-+WzKY z7Ui04?5*5{EiDiO#ib(0DwqijEK&>rPn{(C{b*; zu2KFB=ZLM{z#5(qARSIQ(CUAyBNxH1Ukk|rT5cf8-X93Gw9TNBaFxun}! zd&Mntvnxaj;`|z#An4%s61X#SsNm~qLi^)L8$6;pFt8FC8@9#{9K&xsC~`f}dFM2^ zb$}o_1-b{5ufGgU4+1&eYugyRcVW#0Ol(at`kOM^%XES>%W3exPl5M0VTefiCD;$} z&^-v`Hz=Z`)~0TkGwEp{KV<)Q8vN&pHvI}|IF zFP2G*yJQwT)AUPLNh4xWZrZ!y6?jjLm~_or&!)`f)BeoP-J==cgTOCkRFe>Z$Sms%6@tJ^pKF za4v}lF0svy^ zgKA)%_4ioWMxHI?!(rNDHxR`Z?e<>jx<=P`Y_)MW)}oP7w7fP`uSe5C>}@Kvzyt6u zRt7vffPAtcpNw^F>bjwgZ`ktgE0THH?ZQ5nnID^wrE^O^K7^MS70&j(;x9fE+(|)M zeKVElbK>M*7lG{Ak-Hy6SB*rX^L?d=C3{!L*9ScXheUhhIF>c*0!9oM#k++*;xN?- zSJFP0M585bJYla~V}6p}G+XXGxu~XUpD#uo=a z@8hb$>U%ctO{L=g9@J%sO<y4k;!aYI9Jou!6TfMhnCh*0y>nPeNN^b_5L=r3B?vlg zBgn03_(u~HX8RY>KS9<7wKK;Un|;qSUN#C(ReEnp=8PV?R+=y{tT+bHRVnKZs`Qk8{vrUiTFmZOxJ z-X)V*Yusf(BW-q$SsxhPEw>xk!KWo|Bc@j zIptS09yYE-jlLmOIAhjGz-$7&)gn)PU%Yhl`cp-0sMr8_SBRq!^q;$i)<%^*`45K% z@oHC8ls4+2tO(qjYt;#TO{jNQj1WN>vzg7vGTdj*Yi9+lW$>z3=a%K1DoE4dkC*LJ zS%CqGGawqR4aArm>ePaMSO=2%a+tsREvwcTI1j947oFqX3g#;M?v6hf#7OMXh^ah- zdfcv;6aF`iNorj3BP#rF8i$i$z)fq1edgulxloQFGe}O`{-flt`CGRBc>w*aW@Lws4m%bnC?V#* zb}O#q!$bFIlta_ll|8^Q8ZE{F16fDl3jk4wdzq?2HUcJCK#5u=IOU8y*%#PAGaq{I zdZ*FxH#3Zb{|iKqPW6W7c5KuXYjQl!(qx=lZOBe`V^pNoyjHa@*C1r}roczZTO@`B~O@qZ^2$M`WrT9mR z(uClj0Z2fvMVa+hH6qNo-jOIveS->4GP)RFU4w=UXt($(j3DNO%c6!-CcJ4ofnVXF zJ4=Vcob+3S*!gTdl@@#N;w9(1K%AzKrXRb+V8l zL-k&AI5WZ<-B_$1qj`W2O(3J z=nUw!(3%J@ya>)#1LMWJ%uJd4tVDRC^2$qpDy}+ zfdoKC7p`*3>9LX0cAd;{gKBzQ!FQ}d@WhW?X(*_k{<8Dtn`;)LJLn~uWkJVg0_2>{ z(f_$~9K0dRVDViq7$lfAYM*v>hIMAOF2y57A0+ROJoH^Q5gV zhkl91k__sThF+cFC_pM9{;zDOJgWx8Z_V-R_zb-xr7WWA(eMxqJ)!OW%J7f;R;I;2 zfXC-{@Gzz6LL;%Elh3~SOpjsstJ$Y=&OZ%>$%neMyeZlMdUz32btYy27iU@EIQMr#>e671D z?{xKOny&IiZ@vM()~Wzl?c=ykXD((3DbG*y`lP!x18?>+5J-@#k)2~W%=0ICN_$YRS$aNF)CV-bKDx}PlvGqJxC9)nx zTv6e?f&@WQ(~0a6^i$(xz!)&{=CHrFy}1vS7Pme7Jz56Kfj1Mfp;za0HX|1rSbYsp zFrpVhFWE9b<&mBT^|`M36vT`!YxRhFabDe&7Q2OY#vdxW@dN6**;++OV`w%EI|?Fh zI!LddsUcZV6v}wy4e3OmIWGqS=x~$fH}{Z+i3(n$B1WEyL)yA8f^+Za7}dV3ct=fq zEcZ5Twza|I8zE+U$$i+JH8NMSt}9VoW#zRd`R{ig-L^4%u)(=vaYMUt1H-j!HX_Be z42RFIFiXM9yA78GQ(e1NrROc4-@E8kzE`s0c&FO62{6#{M*--R9Ybnw~_Az9{VoWxeWwP9~=zZ%piXweN)(u;-Oa zw0N6Hkin&v2-lUM?hIYf`P7t^5xzs^-Pn)03VxHL3;G(hug8)ZBpA3ih0uQ+8>j#pt`!b)-g{Xn>9jW zmb*m+$Ln`O87P0Vd?U%|3W)YP$J5&-Lh7D%GI|`cIzoLfcwne}ccDIYHJl_`>b7Y` zH9s2%*fnSUeQSa*NA z@xAVsMH!rTj1$To`nUM+j|OB2$$D1oQZvr^8!DI&*|Sibsen?47iBIGt9RaQCr?ew^}mFm~dCtN8#{+YVapg5H})+v{m2sf|TxDBMc6P#A%pX@z>k`BpD z;av^hgQ|s$QOH`2slOw+)Y>8mjuspMtL(9BP1p#5Tb}oRO_IugUxtb>Dm_+|C`#bV zDK9d=T9WHYO@4MiZCNs-_cy@DBMs;c&9c6hw>nCazol4QJ`vHUYlA(T*@{kiZi%ZIL0;-81>cCah}3tndG)@ zw4*~@`+}LYgDK=BiI*AU*Q)pJZv9uATQ`X`-dgBapCkf7sb>{B@OiCn$*+JDp(gY^ zw^j&y2JqNTini2-N@cNX0oDCR59{p2jisn2Fm8-KNgX9rv9hhy%V(ij{PPJ%F*_C& z_n0TM>ZQw`3w<_qiGWR+JQezOfqbrvSAr>p!${Yqy@C92QoDr}AgJ@T+^>-~4d_~B z+!^E=e%}KE`3JKMuG4-`EaZP(xr8_`CT`SU`OCLJf*juJWF;`~SL~tZZLFyxxU1{h zydimHKw$G_3O#iEa#9;*g5Ykdcjb;E0P}pDa6;5w3XU2{Vl!0Sh+_RE>RMAPsMxdj z3>Bf@@#J6D`Cd2<#J;<1??oC7K^u0Nqpb9g|na0K-W{# zt8#qaVvBilL;)qx>k~;p#Y)ARgrKV-8FJFsGgs+NR*Q`$q+AdhkMDqERA<4x?h%6D zJ08M^bJbQ)hBNk-8hL)A;|~Hq5B-LN-xpZ!f&ul;ZosP^6U1Z)pE5p`{J#N)pHhQD z^ooc~gi|i#k?z;up*a!d^j`V=_$dKo!;ld?FPcx<{R5I8eVdWe`)+>km9((1!$y`B zzpS^X*g62Ewd>b0D$t|fr^_i7m82%#v&cfQ8%+c!|D`|#YXBTIiP?$t-;7oO1UBdi zK`1LX5t_MxKueYXwnfF3`LF(N^IsXB4dK3bt>uMYt>5_>%hah5kGT48pcOs2-B|C! z-w1)sG0N151X=PhN`wqGS~d1k15`zr5u@{TdJO&3MpUG(`Bvq{P#+RSM|)N2X=baP z**b65{l=yiqr+nLNsZ1!7aCz@BD4{7Gy>5{towv=&g=!;g=%6Gp)vJ2OLgEme&q+1~H( z`MwuzIU^BR2%R43U5W}M!RhttAtfPY$t5KX<-b%DgiM|0PhF&h_Wv5@KaPuoZZl;z zPre1oNP~z}X-J$alJf9WiP#{V5{XP4)B-GS0l!J$+0Tc#h!OrD0Ej?$zrf)bl%Byx z;Nr_e9xe|6MgVX~GMXYUVILql&1-=VQlI}&UEcoSHQ;Z`i$MTT80xr0^%L%mPZMR*~R>D?AV+O_PSDX@~)**KkKC7M8ilC*u?03;?utV_=7G@#mv5 zgYH)zlJf8XRCw~z^#Nl3UHkI0H(z+~#i!r-;?rl|dEyS!_kec$eS){2a$`8r=%=!9 z+Cq-j6en0G1RPV{4}egV;6(xuoR319bYE!_3(f{W06^ym9`Yx;4`;;l0}vd%1J1)g zNxOe}pz#9W<8^?foxk?!o8Q0q-V5(N`_8MkzIy>i^RR2YNOB_+unjj{cQcXsNM?7G z$0IzM6itpCKvWzLZr@@A3a$wO$5ZzKAe7uY20zG+ze5ai;2{ABct`;V2VwX?0D*q) zfbCRwQ4u99gxa4`hk)`~00@|92>}e$bch`RhoL7AOB2930SFI|?p>#b1s`M!A=mwY zw04shtNo6P1NGnx#tDFrw-1oCvY#H_`tG}{^S7|@higkAai#~r@>d?)Ffg-UZC&+z zl^w+|+uBzjj{+bDTia#QSiNNUqB0b>gS!M~}1)S3*&INFURXIVS+G-#hyC8XU%-6qR`ya;NhTMHtYxrRhK< z5{XKRX-Lrxqenm%j1d4I(@K!O0lfD6cWvGJ<>1F#-@W-!TBD}O4gedq@SM$NYo8JL z1C75>u6eG8Yh?^T($=}x7mY6vq{X&e`w&x%Xq~iEkex60M1s!$c^8B(3)#JzB5E=<54jhIH9gJ|90czlndAcQ>Nb#I!(AK-%k$fM1L zxDi>|iL|X17g$G-^OW1UKnlMg#Kgs~)<=(u0f0a8rav^p585!a;V<}ik+zYnidw^) z@yA7}CHX84Fl35`2pL_289?FVOvJCi<6j8McGBnb>Efn87A@t% zqS*a~Firq`tPYTL%3mCG0QmdO8^8T_`_}Jo-MOPUjsX~SEQL#U8pDo_gpC>7004<; zvl5J2hymvZ0^uN{$qoPsVX2~!CEZ2Rv=of%R@<=wWIOO(ajz`Ir(4z!JHdoLOOQ0T z;G!x{k|v0*3zZ!c3pkEC2|yr6jl@m_0^VHEVHbeDEe>kAB|a~hc^+tjW>Qd48Br2d zg&z$-UUF}Wyo&?sLcGNoF6hSqO!)vplFGuU01<*h6u`8~@cCF#gnUR9TxKj?%EJyu z+6}(6F9Ei5`Q=QxDg<)@rJNN9+oOS84l^K zQWm4Qpiv2zj44BW)B-UD9%ETqD~p(S@mM1kO?%^PJS?>(j}ZVLuLHCS*V+L5<>05^ zTKePGQ+Mv58A}&{_1(-@&3X}AxNxpktNEg~V*uKOY_nFY@68-LJ7UR;(HODate0Z71f+%H|+#~ zhag4@7hjb@2Y`hZ0Q~{vtNL;kS7W{4-vg#kOvJL@OdgH`AQatUz_TR@ z^4dZWC*_vB7=SAo*P3tLUsbXz)<$;5vo1DbzN)a1^R98bUSB2}idAF&C9dBN)j}b& zn3V$gwX7IYky34l18$6o=CPvMXaG_W=@i5=L$IGv1v~^)NLNjkGEH3!MPaEV4?I~9 zl}dRjuWRX^36zHcI0)fU00i*v(GkWU7JeUS2fKE?k`?4jF@Hf@@@Bjq*A<_Cb;;|? zvc*`etneGTOx35r;~^oXSYG=uq8O&fivhTl$aNht0|o#%9NJ}efEJf>?aLRwyZY4k z-`~9P)4}bZZ{K<(|))U~|4k8jJDvRNjRmaSt zRdL&aJG{B#Y$tM369A5*P5=B(@~D<P&SVV55`75B{b}iKnW-pb`rQ~vz2mOvX zVcDNdC`j1NB1sh7xxiqX4~DbVaf{QFgZKw&pA0Ap8tK}Bkdy&nK!v>jR+j)4Pw zWB}xl^yv%Vz52`d-yi(^^Ud2o-TwWZ^qo9!?*g#dAm^=_=Jss4wte;LEbbGubpbdV zXnMu@c|Dm!w8M(!q^XKJdv&f+`=ABDxs7JQH8;CmPv))Ox@T^V^EJC8DkOAt0JstW z=^c?71IDlAS_;>2{MjZ1P$o&azhb3zhO- zI2-5Ud*xi*wVrai*LleCC2!QRybcEdh@$4I-w>4+0EJXCtPJ+Y0p7Eots2||r@VyQzrlzV)7<{n#!mMf{|T)7b|R=kXL$vfZxQN$2XW?xa-0IX*; zG&n#r3_!H{?M~~L(4}^OqW0-8x4u986wdb(E4S z@|xBb0E-U3u+|13fTICOf%u}r!@$A{g1oVl#{e{PX{&X&fC0z}z6!IxzLm&kl(0Wy z#==}7HI<4{)=)a_4O!h7fW4kLF_2ZES`RBN0E%1wFpK)bo*e>W{ylgiGytrw05F(P zl_7+A74UgeZUHcDmdx(0ZWFi*z>r>&M)d*m+Tu=v9nl2t60qz42Kk3AY`|#`*2PMU zl70KyS_T8q#f3A>%(5?}srg_|bS63gWI6yWrWnar>;TZ~&g_Y!`T(J_va^c#%iRa4 zXkQ%uesK8x*I(cK`SwpYe*XD63_#a00OK|bfdOcZ<@~u^&g(CdJpgXhiUfvOwz=f= z;#>7AgyTxGmdyFH3UFNt$eF;g1gkOF5GH;x#BCx`JCxk_JKz3?PA?Db7&<7;QGc$ z077=>k3I;ln5a|q{fS^YuU88gaK`AQh zAuuojJFT0luH|(tYJ^6P0`vK>03S3B2KE6+^~G(}QgVmyo^TZgg zB1qNQZesBeg)MuDN|k@(9!3hZFDFK+&L`{3)Z z4{qPU`t8QoPneRmKMke>z-eFIutMJIaN7G0utAfw)z>r#nZe?1E44z2a_!aH0G$1} z_OXqaPbZU-l=K6_Vk_1@Bu>(v;oV-Vz$DCib7-qKzD^71wag(6?aMIp%UCN zV22VPXVy0X=SlHQ(U=MD3vw~eG48B;*Kp~LRs1iTf?82>Rn`FL&-)Ff_E)hLLy<5t zx3}L;CA6Um--~y&17tAFL^z0okPKRHB~zp1kOF`vK`||W9%`_nW+^XeAx(;gM$ZF; zoq$I>z=Naq0LaljelV?^D&QjKndP!%malAYfRu;lja?b=fpRv*aC&2JYgZVU2Z-WV ziaL^zp3w4JrV`xJM$Q8S0ABJ@;3*)z{^h~fH*bG^_#++%#{Bz2RfXvx04~q&)i!45 zZA%;GaT8c?=0fvxOZA*W&;*TNINk2mdEVCyxBCE>nz^tQ6_UxQGuBMa&a<&*yf+LC z+EcCVBG+adr)msCvXo?Uv=dEPk)4KWslz|#WFFvn>I48GTp68f$My)SHoFAatS@T@`jK}wJ*4-3? z69E-PX)gj1HKbsPXI}||1(Csa#(;;w3EG5cTTXzlJ-U@3*Z({^x_fZ%*Q2}g--;OG za^L`ui-KzvN@rR$htC1Ux2~R;pDlLE11XZEAWc;M?<+wpGh+0$FAffF{)GDgZ`{EA z)AclN0S^IiK3%VWy!COj79y%Oyb`2VC8o;F*xIhYw%c2{VcV{G*S3Ahb`yA?m~J$i z{^q(5j{!-I;RiCisI|Zhbw&UJR#){_8~9&a3(ViUdjPKUhj;HX zV5o@y7i)nZl>@{qqVA-h|Kig_+y?&X#*OFR|5DeLX>u5VHX`6_)|x)UX0O%~*a22a zg5OKlYPnq}-OY-&?$v9}jZPDIpPsc;8s!9o0XS<(d7HI*RU!HLdQ8FnKBmqoan<55Rpa}dFIoS>7zbn!{xF4Vl|2e17 zBij#&`5VV~pS}-Hqi+u+x1%c1$_I=u>epO#nD}`Fwj+4+sDRKSb zCi?;Yr*&dS=yOy{MzoWUZ%1h6-`EkF`bRrLTmNG3ep;Id!Z?mAzJ=bV;gKxa$g-Iv zMk1jL4YE|&OX5vMsP*6<5bUWZPnBNu(3AAkL*GEbi&tMmL+|w%u+}`dW@t;lj@2&6Vrle|+2fw7wWulqds4mhZn! zzbf~}n^hBuYKK!b6;FgNF!M7(yu{0MCWs!-1R3iLbD0UEi#-$MwkQi5ppqbZSzY-0 z<@4U$YNKsz)tdKc?a6C@mYE=Sk}!@tmvdq&oMI{*Q{nQN3oI%KyU$iuqKeTm9Q9hS zS0l!(b#RPvSyA)U9NheznhV?=G%}M0%^9NhsoBH^70uX>DXn+8mHT5P4XMg}~ zHvJO#Dh&{Ty|@buz*(FD0&o@$5P-92fB>9D0|ekK8Xy2?(EtHBiv|e5Su{WZ&Y}SV za25>^fU{_T0Gw5@=K;!rf<8PO=PKep_+#Octj)eXi^UC4f=bJ{Zj-H4E~3J&**D+( z!l`ci#M=I@X+HaQB3sV@MMZHIl1`hQR3cItCI;X9rW`LErVAUC4E*0~?{17t+t_8_ zPGV~Vltwbp8SsX2z)mU+=_U76 zDKQ!J4F_P{9fy?eYx5iHFkE-$v#}#;BER12iBb|qp*RzbQm^+`?=G#!y?WhX16>VKh-6ajv0XS@xHULLw1>kJ_;$9%Cw)SqZrzVlGW!u5G_;E)+czEaO za%TCFb3(fF4(9)MD-9sH$Un^hT*+Ao%Ez@O}#OKU1g6vsbE zx70$~0&>>Ysrx&j2`(T`IXNl@SX zxZ|WqFb~Z~cz3avRMAPSl)>UCJSv#&hAlZf63M?0fY|<%3J{4A2@{ZMbpEV(Euc35 z5D@9e8X%x0CH_WCgJs+T%L^5Wcs3hPKiP!5A4YsT0GVavLP%c+2)!AA40<{uJsbA^ zSpW{+ssJII&nsm+2H-Gjj`;vIktQ+cBOu^>RsfL0%pOnU9I;9UtnRc`078rh$Q<1z zz~2eL|Dpm!Vo7#45Q@lh#>@QS5^T7b*8`CBE9wye&0{rGB z#eo{crtMSUAx1$+fp-$V1%LvF1okP45cBj7pJZ%E$l-V$0KJG6yo)I<((}>bTO@Sg zgf4`=w*m0tVt#oV8w_ydDc{cDr~vKJp}!xr0_vOTceSC`Hj~_VI@At%XKxy#z_Chq zwa~P`QYWc_dAmSRx(bx+*3AM~c?Bp$WNAAtpv`1McA-C7fpoAgyc&RjXqGw(vd0wL z@r1$w7_Dw>ls76Qel4DZe=5X{{xz`Voz!-Kb!9ta4{neimMK%e>jPp4l6KrYtn zcQAx! z!H0|M>x;)?@A{{+@7Es_aB%+h)y10>Ab=BvD-SCaRnXLOsx{nk9uIr5gW-X*H^cxu zRA_Om?YoGTGAPKBWz+zPZICEg0I~84(B?8<~DcVVhN2r%mAc-#k&Ie-dL0i~N=^lV2 z)CZD;&)-QaZif)sbN2)U;JabB`QwIuBb7+m^-T9EAe?)v^sN3{0Vs3=>S0&w+tBJ2&*XOC)L zMo-Ah^Pssc2O#F(?CJsoaQ2vhm$S3W*;ltXjt%?xdOp7m+iMjdX;jA^Y1+d89QK@^ zhBiTJ)8w%R18ddk0)XFEhti7G00G?2aU9idcCCXhfA!f?v8*%wzAqU&_bf>E-u_qcgGfw zaNV&W#7e!Wz`O{6$QNt|a6+875Lb(=ZL3;5!T@A!`+NpfR?0v^=D^l&C7h(hQ3I~L0>lf{UGYhh=-);6 zA+|cL)s%6qHZ2)8r_Gv@;%XCqtkhc51L3}~BVa?`KkowD_qzs~X3|Q9x+~0)f_gkx zWy#W3aulJYpGz4-LXK~5nOJ!Xz^VowQpad~<^z%O0n*vAtL zzT4B;$=9>1U#@3oA5U-Z?mE9+Utj-xyG#KBqO0Tsfq<6qd^6nh*pb>5wJ}A)zRFjJ zE+;ve1JGqBR>^=x&e@|#HPJ^4~M>hLffkq>Tlao2GZ18Y0>vEf&4hMJ!z>E_>J!a3Tdl2XDslir$xJMFr z9?ep~g`7mm$B!I#^JbFVje3Zj(2S6^N#aTzjzf+V#M;u+RVWp3J0k=g8;EG>= z?mF^S1Knz402&T!v{epB=tTfLY#Q1@ueVmWp+hB|nC|kOKp)|R-dfwh)DJNLg?8Ry zEvYe_P$+im%>xHoq5uc$vmYLG-_`8qZhmq$m@B;Vug@?IXXii6Zt<&E=d`q|5`n2{pDYhIh)yVk0XR$&D`kMl_!CJQ z3td+sv7P-tC_vF2cQqP~M{AC)=572@jbRV_oNxbdtR8R}fa5O5mhV?RiZ`3hdI~## z3c&q9N0eMXa33eV$`PqMAX6lPIcyVm0RYxYJSo$LumPGjebP1o0EBeO4A-_%TF%Df zBbTMLo$|tG3v^G(*%ygDQH_HbfI~NFsfX~CfY~?%Yw38>?Q?`pfGT1IC}%2GNW9zc z18|3znlRHB#o)(eR zeV)xKxjoe-aEEmaK*m;UvkL$k`}xVFKTUD^x6bR? zlf@SIv%VF+ncbY>&G4t$)n{B8ygdE-9+;m$&SsY%21^tmRsM0$2}o;R!=-_sst)sB zXGGERQ?=rZDbr9WpxK=UMsYp$TBz4jUd%S+kKk0JEfNYpWua zd|uf~QrQBegyL3-U#Z3Vw*e5jLTw&lk$2G1qPzju5|EBAx234Wc^*G$o&m6)*~=tf zqyX815)1~Fs)zx|V*qZcF^-))2VlMVC81Ceg{56!jIYbDK3~lFcXD!mzXkqbwtg|d zjo~=}uV=S90M~T@et&&+eeT>`t2$#jjO#-`s{ZNZ=g=m6ZI_>tGc$)c&0L^(N5bU2Si_PtBMxdE^3=~SKb;R=&;_5v(a~t~KHNeSzIjzdZH@Vc9uA z&~NXAc=#m%kA@<(m=;P~{!xdDZJU58Qz~qYY`n}uQz=FjabB05^KZwqNtl(Bn||wRJ+1!=0GX$S zkgk>wXg$OhR9yMjpKS~}oc2*Ng!=#~>>^*N$J4bVL%+*6YN4RgLoWazSD9|`h|dn= zDOJt4)FRi`0=0a74#4~o%QPpJqac!+Dqdv_^O|#jSOflqPd$IX;NL?zaCSO7`-EF0 zvl;GEF`M9-(^0N+=|Qv;l1@mXGd1&AtgDx4CY#&RhdRT4(ji6A=e zZ$v66(m}-{gBmHCdHF$TI2mu`4UYh5YDnO2iVP@c1i-@Jxmk)?7^~T91}38gK$I5E z(CRf|&k6vYwwVAlG;-`B(Q^X2EIR)dE{yH_>BXGziYAlTFd&Orv;YbN5NCS-m#x3D zcYdpF!%!H15WAcUfei&K2@w^A1JQ-YXl~*#cCio`X+r4&4eiw!+tqgCtHB;&kCdd( zk!RRZ;<#GoG;GLg?C1ynb1ZX=iTM0kktI_Ae?zj{*AD}UTul2nuLLJh4ae*$?2V?# z2NOB_iZZ#rpV7Gnm+ALNp`qMYvgnPe^a{{0?bFORkN9~MLb&M&z1A@wLI7>K^+E-p3v^W25!zJ1 z51-%sIQR4L@^ZT$hMT-$(0>@+y;b^x^&7j$mH-m#9`A%~HZc<(A=aVHPLMslNU2No zK@-yfnxI%G6G({!3Qj4SQpzkL#1Oq zxD|8DU^{~CteB~NI;oo%vw*rfKnP;ROCfRwutI>0IogB8XHZIFB8pp()m^fH_F2pW z&ruqt0KWXJaQYFgx{0z+9J|lVDg=N`RAdX4TmWnn3rcK{cB1m$>+o~Fuq1(IH)uC4 z@SoJy0eT*IXPnumcGF|k9DtTUThNbRPGaIBFmeZvbK5-DYcPYOD6@W9y>B3b7OnKIn>=PO^>u)bO0$&!aQqt{csy!^;1TY*y^mTuK*ulk&bKvv zBY@+By^LJA2XZ+G7ZZsj1oA+{Qt&}EgkNxC5&uxMq5ghzLNzTUF~-4$PA!Ox(ucl} zy@|b^CEC??``P{Ns$D)+k2^2tAMnHXa;H5~wjW4lK0Qd983Gj

      yp*FtJJNsqZf|4bq1Sd#oyn;n&+YtnlIy`8 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 Qfc(3lrGK{Y4F2B#0LQB@uK)l5 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/top_k.assets/top_k_heap_step6.png b/ru/docs/chapter_heap/top_k.assets/top_k_heap_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..7854af17db681c480c99232050d74b94c83601ff GIT binary patch literal 20275 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/top_k.assets/top_k_heap_step8.png b/ru/docs/chapter_heap/top_k.assets/top_k_heap_step8.png new file mode 100644 index 0000000000000000000000000000000000000000..0b1132f14c3a330ff9e90d207077f2c47e524201 GIT binary patch literal 18384 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 Y7d)+AoV=*Y0$~3XWK00z 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/top_k.assets/top_k_traversal.png b/ru/docs/chapter_heap/top_k.assets/top_k_traversal.png new file mode 100644 index 0000000000000000000000000000000000000000..5554654f37d3d0064032ea97e78b29e8e47ded1a GIT binary patch literal 15173 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 {hbGpxb3qoJD6 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 JvKK~y{|os@Kk@(o literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_heap/top_k.md b/ru/docs/chapter_heap/top_k.md new file mode 100644 index 000000000..33e4fc19d --- /dev/null +++ b/ru/docs/chapter_heap/top_k.md @@ -0,0 +1,73 @@ +# Задача Top-k + +!!! question + + Дан неупорядоченный массив `nums` длины $n$ . Требуется вернуть наибольшие $k$ элементов массива. + +Для этой задачи мы сначала покажем два относительно прямолинейных способа решения, а затем более эффективный способ на основе кучи. + +## Метод 1: выбор через обход + +Как показано на рисунке ниже, можно выполнить $k$ проходов по массиву и на каждом проходе извлекать соответственно $1$-й, $2$-й, $\dots$ , $k$-й по величине элемент; временная сложность такого подхода равна $O(nk)$ . + +Этот метод подходит только для случая $k \ll n$ , потому что когда $k$ приближается к $n$ , его временная сложность стремится к $O(n^2)$ , а это уже очень затратно. + +![Поиск наибольших k элементов через обход](top_k.assets/top_k_traversal.png) + +!!! tip + + Когда $k = n$ , мы получаем полную упорядоченную последовательность, и в этот момент задача становится эквивалентной алгоритму "сортировка выбором". + +## Метод 2: сортировка + +Как показано на рисунке ниже, можно сначала отсортировать массив `nums` , а затем вернуть его крайние правые $k$ элементов; временная сложность такого метода равна $O(n \log n)$ . + +Очевидно, что этот способ "делает слишком много", потому что нам нужно только найти наибольшие $k$ элементов, а сортировать остальные элементы совсем не обязательно. + +![Поиск наибольших k элементов через сортировку](top_k.assets/top_k_sorting.png) + +## Метод 3: куча + +Задачу Top-k можно решить гораздо эффективнее с помощью кучи, как показано на рисунках ниже. + +1. Инициализировать минимальную кучу, у которой вершина содержит наименьший элемент. +2. Сначала по очереди поместить в кучу первые $k$ элементов массива. +3. Начиная с элемента номер $k + 1$ , если текущий элемент больше элемента на вершине кучи, то извлечь вершину кучи и поместить в кучу текущий элемент. +4. После завершения обхода в куче будут храниться как раз наибольшие $k$ элементов. + +=== "<1>" + ![Поиск наибольших k элементов с помощью кучи](top_k.assets/top_k_heap_step1.png) + +=== "<2>" + ![top_k_heap_step2](top_k.assets/top_k_heap_step2.png) + +=== "<3>" + ![top_k_heap_step3](top_k.assets/top_k_heap_step3.png) + +=== "<4>" + ![top_k_heap_step4](top_k.assets/top_k_heap_step4.png) + +=== "<5>" + ![top_k_heap_step5](top_k.assets/top_k_heap_step5.png) + +=== "<6>" + ![top_k_heap_step6](top_k.assets/top_k_heap_step6.png) + +=== "<7>" + ![top_k_heap_step7](top_k.assets/top_k_heap_step7.png) + +=== "<8>" + ![top_k_heap_step8](top_k.assets/top_k_heap_step8.png) + +=== "<9>" + ![top_k_heap_step9](top_k.assets/top_k_heap_step9.png) + +Пример кода приведен ниже: + +```src +[file]{top_k}-[class]{}-[func]{top_k_heap} +``` + +Всего выполняется $n$ операций добавления и извлечения из кучи, а максимальная длина кучи равна $k$ , поэтому временная сложность равна $O(n \log k)$ . Этот метод очень эффективен: когда $k$ мало, временная сложность стремится к $O(n)$ ; когда $k$ велико, она все равно не превышает $O(n \log n)$ . + +Кроме того, этот метод подходит и для сценариев с динамическим потоком данных. При непрерывном поступлении новых данных мы можем продолжать поддерживать содержимое кучи, тем самым динамически обновляя наибольшие $k$ элементов. diff --git a/ru/docs/chapter_hello_algo/index.md b/ru/docs/chapter_hello_algo/index.md new file mode 100644 index 000000000..a2d34022d --- /dev/null +++ b/ru/docs/chapter_hello_algo/index.md @@ -0,0 +1,30 @@ +--- +comments: true +icon: material/rocket-launch-outline +--- + +# Перед началом + +Несколько лет назад я публиковал на LeetCode разборы серии задач "Sword for Offer" и получил поддержку и ободрение от многих читателей. Во время общения с ними чаще всего мне задавали один и тот же вопрос: "как начать изучать алгоритмы". Постепенно этот вопрос начал меня по-настоящему занимать. + +Слепо бросаться в решение задач кажется самым популярным способом: он прост, прямолинеен и действительно работает. Но решение задач похоже на игру в "Сапера": люди с сильными навыками самообучения способны обезвредить мины одну за другой, а тем, у кого не хватает базы, легко набить себе шишки и шаг за шагом отступить под давлением неудач. Полностью проходить учебники тоже принято часто, но для тех, кто готовится к поиску работы, диплом, резюме, письменные тесты и собеседования уже отнимают большую часть сил, и потому толстые книги нередко превращаются в тяжелое испытание. + +Если ты тоже сталкиваешься с такими трудностями, то можно сказать, что эта книга сама "нашла" тебя. Она стала моим ответом на этот вопрос: пусть не идеальным, но как минимум честной и активной попыткой. Эта книга сама по себе не гарантирует оффер, но поможет тебе увидеть "карту знаний" по структурам данных и алгоритмам, понять форму, размер и расположение разных "мин" и освоить разные "способы разминирования". Освоив это, ты сможешь увереннее решать задачи и читать технические материалы, шаг за шагом выстраивая целостную систему знаний. + +Я глубоко согласен со словами профессора Фейнмана: "Knowledge isn't free. You have to pay attention." В этом смысле книга не совсем "бесплатна". Чтобы не подвести то драгоценное "внимание", которое ты ей уделишь, я постараюсь вложить в ее создание максимум собственного "внимания". + +Я хорошо понимаю ограниченность собственных знаний. Хотя материал этой книги уже довольно долго шлифовался, в нем наверняка все еще осталось немало ошибок, поэтому я искренне прошу преподавателей и читателей указывать на неточности и недоработки. + +![Hello Algo](../assets/covers/chapter_hello_algo.jpg){ class="cover-image" } + +

    2. EZ1U3gl>CtUiKfOy)?+B1BG51CdxtQ_bj<~p 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/binary_search_recur.md b/ru/docs/chapter_divide_and_conquer/binary_search_recur.md new file mode 100644 index 000000000..6d33a6b2e --- /dev/null +++ b/ru/docs/chapter_divide_and_conquer/binary_search_recur.md @@ -0,0 +1,45 @@ +# Поисковая стратегия divide and conquer + +Мы уже знаем, что алгоритмы поиска делятся на две большие категории. + +- **Полный перебор**: реализуется через обход структуры данных, временная сложность равна $O(n)$ . +- **Адаптивный поиск**: использует особую организацию данных или априорную информацию, временная сложность может достигать $O(\log n)$ и даже $O(1)$ . + +На практике **алгоритмы поиска с временной сложностью $O(\log n)$ обычно реализуются на основе стратегии divide and conquer**, например двоичный поиск и деревья. + +- На каждом шаге двоичный поиск раскладывает задачу (поиск целевого элемента в массиве) на более мелкую задачу (поиск целевого элемента в одной половине массива), и этот процесс продолжается, пока массив не станет пустым или пока не будет найден целевой элемент. +- Деревья являются типичными представителями идей divide and conquer; в таких структурах данных, как двоичное дерево поиска, AVL-дерево и куча, временная сложность различных операций равна $O(\log n)$ . + +Стратегия divide and conquer для двоичного поиска выглядит следующим образом. + +- **Задача раскладывается на части**: двоичный поиск рекурсивно разбивает исходную задачу (поиск в массиве) на подзадачу (поиск в одной половине массива), и это достигается сравнением среднего элемента с целевым значением. +- **Подзадачи независимы**: в двоичном поиске на каждом шаге обрабатывается только одна подзадача, и она не зависит от других подзадач. +- **Решения подзадач не нужно объединять**: двоичный поиск нацелен на поиск конкретного элемента, поэтому объединять решения подзадач не требуется. Как только подзадача решена, одновременно считается решенной и исходная задача. + +По сути divide and conquer повышает эффективность поиска потому, что при полном переборе за один шаг удается исключить только один вариант, **тогда как при поиске на основе divide and conquer за один шаг можно исключить половину вариантов**. + +### Реализация двоичного поиска на основе divide and conquer + +В предыдущих главах двоичный поиск реализовывался через итерацию. Теперь реализуем его с помощью divide and conquer, то есть через рекурсию. + +!!! question + + Дан отсортированный массив `nums` длины $n$ , в котором все элементы уникальны. Найдите элемент `target` . + +С точки зрения divide and conquer обозначим подзадачу, соответствующую интервалу поиска $[i, j]$ , через $f(i, j)$ . + +Начиная с исходной задачи $f(0, n-1)$ , выполняем двоичный поиск по следующим шагам. + +1. Вычислить середину $m$ интервала поиска $[i, j]$ и с ее помощью исключить половину интервала. +2. Рекурсивно решить подзадачу вдвое меньшего размера; это может быть либо $f(i, m-1)$ , либо $f(m+1, j)$ . +3. Повторять шаг `1.` и шаг `2.` , пока не будет найден `target` или пока интервал не станет пустым. + +На рисунке ниже показан процесс применения divide and conquer для поиска элемента $6$ в массиве. + +![Процесс двоичного поиска в стиле divide and conquer](binary_search_recur.assets/binary_search_recur.png) + +В реализации кода мы объявляем рекурсивную функцию `dfs()` для решения задачи $f(i, j)$ : + +```src +[file]{binary_search_recur}-[class]{}-[func]{binary_search} +``` diff --git a/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/build_tree_division_pointers.png b/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/build_tree_division_pointers.png new file mode 100644 index 0000000000000000000000000000000000000000..6a400e85d71c93f5a35959fac8f25373a9328025 GIT binary patch literal 12399 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/build_tree_example.png b/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/build_tree_example.png new file mode 100644 index 0000000000000000000000000000000000000000..7aa03bae6ec7d5a719522841af1d117fec3b137e GIT binary patch literal 10452 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 Y1c7XP=(xzV>8+)H-lvZ9z9eV=3t`Xgg#Z8m literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_overall.png b/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_overall.png new file mode 100644 index 0000000000000000000000000000000000000000..aafafca5dbab1bf559ccbb5b63e8178a3d257e2f GIT binary patch literal 20484 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 T`IiX&S0kw_Ybli~;Di4M_P$$Z literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step3.png b/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step3.png new file mode 100644 index 0000000000000000000000000000000000000000..85e27074d5985c0ad1ddf0623d9b19c85075662d GIT binary patch literal 8739 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step5.png b/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step5.png new file mode 100644 index 0000000000000000000000000000000000000000..768ff4dd966743243d5542b0d58b73af454e4ea0 GIT binary patch literal 9616 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 LOSMP^8~DEfrr|vW literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step6.png b/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step6.png new file mode 100644 index 0000000000000000000000000000000000000000..02b797ca6530c4297640894edd8198900ae17637 GIT binary patch literal 10886 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step9.png b/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step9.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b127917c67f7223169410a60016b09207b19c9 GIT binary patch literal 12565 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.md b/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.md new file mode 100644 index 000000000..b09a7f320 --- /dev/null +++ b/ru/docs/chapter_divide_and_conquer/build_binary_tree_problem.md @@ -0,0 +1,99 @@ +# Задача построения двоичного дерева + +!!! question + + Даны прямой обход `preorder` и симметричный обход `inorder` некоторого двоичного дерева. Постройте по ним двоичное дерево и верните его корневой узел. Предполагается, что в дереве нет узлов с одинаковыми значениями (как показано на рисунке ниже). + +![Пример данных для построения двоичного дерева](build_binary_tree_problem.assets/build_tree_example.png) + +### Проверка, является ли это задачей divide and conquer + +Исходная задача - построить двоичное дерево по `preorder` и `inorder` - является типичной задачей divide and conquer. + +- **Задача раскладывается на части**: если смотреть с точки зрения divide and conquer, исходную задачу можно разбить на две подзадачи: построение левого поддерева и построение правого поддерева, плюс одно действие: инициализация корневого узла. Для каждого поддерева (подзадачи) можно использовать тот же способ разбиения, пока не будет достигнута наименьшая подзадача (пустое поддерево). +- **Подзадачи независимы**: левое и правое поддеревья независимы друг от друга и не пересекаются. При построении левого поддерева нам нужно смотреть только на ту часть прямого и симметричного обходов, которая соответствует левому поддереву. Для правого поддерева рассуждение аналогично. +- **Решения подзадач можно объединить**: когда левое и правое поддеревья (решения подзадач) уже построены, их можно присоединить к корневому узлу и тем самым получить решение исходной задачи. + +### Как разделить поддеревья + +Из анализа выше видно, что эта задача действительно решается через divide and conquer, **но как именно, имея прямой обход `preorder` и симметричный обход `inorder`, разделить левое и правое поддеревья**? + +По определению и `preorder` , и `inorder` можно разбить на три части. + +- Прямой обход: `[ корневой узел | левое поддерево | правое поддерево ]` , например для дерева на рисунке выше это `[ 3 | 9 | 2 1 7 ]` . +- Симметричный обход: `[ левое поддерево | корневой узел | правое поддерево ]` , например для дерева на рисунке выше это `[ 9 | 3 | 1 2 7 ]` . + +На примере данных с рисунка можно получить результат разбиения по следующим шагам. + +1. Первый элемент прямого обхода, равный 3, является значением корневого узла. +2. Найти индекс корневого узла 3 в `inorder` ; используя этот индекс, можно разбить `inorder` на `[ 9 | 3 | 1 2 7 ]` . +3. По результату разбиения `inorder` нетрудно определить, что число узлов в левом и правом поддеревьях равно 1 и 3 соответственно, а значит, `preorder` можно разбить как `[ 3 | 9 | 2 1 7 ]` . + +![Разбиение поддеревьев в прямом и симметричном обходах](build_binary_tree_problem.assets/build_tree_preorder_inorder_division.png) + +### Описание интервалов поддеревьев через переменные + +Согласно описанному выше способу разбиения, **мы уже получили интервалы индексов корневого узла, левого и правого поддеревьев в `preorder` и `inorder`**. Чтобы описывать эти интервалы, нам понадобится несколько указателей-переменных. + +- Обозначим индекс корневого узла текущего дерева в `preorder` через $i$ . +- Обозначим индекс корневого узла текущего дерева в `inorder` через $m$ . +- Обозначим интервал индексов текущего дерева в `inorder` через $[l, r]$ . + +Как показано в таблице ниже, этих переменных достаточно для описания индекса корневого узла в `preorder` и интервалов поддеревьев в `inorder` . + +

      CxbNpMi)_l?!By?M#u%RY-T7-n$*xa8|E2ON;h zUZtb|xZT}J&Rb^CjKu`QRv*6#Euz{JMg)hLCxUL1pUFJMA{A8!K;?9B2S;+}D93f= zc=c`L7b*^CS(D{cfW1q#>{r^8Gk49;Xh($*Y9mD;dJ38HK;zd;A4PubvGle*4+><) z13^*OK;p^yuaD=1NTOOD(d&di=d=cUZd!NwOpG9CH5_pM+$7?Ln+BZMT}xg2g)OvG ze{F(r+>J7!x&FWa0cTeb^Qq-a#}}> z-DGCWhhc_`XK@A?9m%P+5KsBV_;e`+n_>jJHKgU55D+2>uvZ@)iKdN=cXf)QV+R3m zOOe5O-r?K^%J4ipHbGUp=M2$6K&%KPLBW0P&j4|!+rsQ~PC>8|5E{aU@H3fd+oH$d zyTO7KAIO$K34No1UyXD(&1z~i>nu@}BcOPm`gAj?%UkHVNF@!jN)`yUM0GWwUsz!N z-+KY{aqc%k5@RobgEvpS%Xu%#Fb@U5_5AODolJ@jg1CRO2Ye}BFEnct_}cH2CQ(FQ zWp>iZtA@^_TlT;vM-MH{R?u*2s&uqrm9Bb)N}j8U0^+Ju+(276U;DjYb*r?r{Br)r z5x2`f6kZ0ytl`6c6UJ!vBo-QgH*!_tW=usxb2(oa_Lh#SvkFS~sc6!Oa%XAIipc)x zRbN}=g}ke~u$A)OzMe4T_ux3GxT?brc^ioCDVG7>*rYTWbF;$>q@wdeXUW+DwDk&e zd?UxcbfDC8!^tr6pdVZTfT`;1@&gYKE5%0#H7B0w0N5AjY4k$5rt4L;E5B%(OdPsbo3Kj8lbI>e=UXMJOHoqmtPbRM*iwI0byL+d;%%U4` z$iFwpvo>%xFjNdLh^WLDUikB!@43v9wa<){N^lb3KO)MAT7x!vq^`T0V^3_zNzSlP z+&BlVAJ;VgJh;Fy@(A$#=w5W>_K)TvFNGY}f*FAf=$lv|{M*1Ar;-g~MCjuQ?QvEI z>};*hpl1MI2I~KxG2|cC6a4k+{K4P-u1i#Eycyn`a6H-H@Sm4(35=xT!PGk7x{Ukb SKZ|VwK*FA`elF{r5}E)GJ7L8D literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step7.png b/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step7.png new file mode 100644 index 0000000000000000000000000000000000000000..53f2804332695e382288a38fd17ee58dff34bea1 GIT binary patch literal 17859 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step8.png b/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step8.png new file mode 100644 index 0000000000000000000000000000000000000000..57e54b229fe74507d90496a2e5c1e24c0d9184a5 GIT binary patch literal 18823 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step9.png b/ru/docs/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step9.png new file mode 100644 index 0000000000000000000000000000000000000000..a07fe95470cf4a648d0d1a295f2d39f029347e1d GIT binary patch literal 18741 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⩔TQP!xSvhGeLGlugN1aG@Y^44U8!-!`sixi40_iTG41VH~>~ww&F5^ht(SRV0sBYOXe!l=l9A&0OnO z(g_;=0p6`N$JAC#Y#P%>p}dl%Q8v@$1v6W9LPWDk@h+sOiTt$8PHr-jp=PbFGb%@u zL{suErmH1Nc?-h~loTCBFvbfS)3UpNz<%AY@B5zTJm)>{InVp$c{<#&w6?MOgbd;L z=|%@uH8+AEKzoIBON^j97^aiuQF^aP5ni|uII1(8Mft?Fk7LFa^nY} zGDEF%(>6yX|6oDGe0$9(E%P@{C7t}7wb_Avp?2CHyHDv#E)XXts@hLzbqDT7yX#EX zx3Q2NkG`#$o~B#r&iM55;IS<~Zh<>Ti;FlH6;d;hLUvY3S>l`WI+3t#+B3qMV8F6U ziE9umj(Z!cJ@zs^ kfhl*S8%|3Zlaa}f>_#+3AMKXGC{C3n>r3<&e1NlG8e*onU zbjir+s*eIl)~_kUZKv*_eK2BW)s*#lxY`GNJ=D{9s`%JWH6UsNR(9&Ow7g#VqW}mb z-Pk?b9t5(_Gc%XV3P1ZvI5G}-ii#=B0@j~XfMaSk4=TbmPE}&I-0G#1m_@nh| zaEYiXEtXRDI&BDQj7|s2`M#5MDWyiRKtNX@4Kd<35DQ#O@Lzgmkyc4YTve6?8K8|w zegnV-RYJE9W}vI;ibz`GgMsK}WdMn%Cl5aPDE_Qy4N`g3REMAn=U*Rl2vAxKKAk9F zuElmbMn6=#XpH(VA?d>0Bl~ucoh=BzWoza+{B1#9f2M*sW1&I+!&Wgeh2P&73UvrC zjMZ4ZYB~;pvZ(R0TN;kBKpL-#k@_Lr9){bP%skq#;|trmrr&G^MxFF@9%^*W(I9LA z@#j;?fjZ&4awiPdOp6i2Qd@FZ(W*~*v3m9pkkh9tb|b46Ch+=P)-x2}a+$C2vrJFC zNM~A7LGBuiy+;{-NbChjy?Vz-;P+FWD<8gc$`G83F||Nv0dH?B(y{f_W|?w@2-FZ< zYa8TdAU6=o#tnEZ*sd-a!4$%?rIo%Cq91CcM$-z>6=$@EKff1yatSs}U0g<_Ovyj5 zvks{8jv4=FaSI6!Q9`I<&bCk)v+A;n>rQC$+nRqvG6A{2z}OWhmPuG?|7xsyWwZG2L0LWFeT32qMGhGagqwG2%r? zdiUh!`)gL4o9%gP2NhTppR^wp9I_AOroh-nvwqnfW!-w4>l2p(^_LRTB_u{3io&Xyhz}-$9j7mPCeJ`+*64%$6+# z?J&&~WRG+uM4gz6Pd5RnFPHLeQV97H9r2C5pn`G6K=6UTbPyolt=(A9t2Olsfw3pf z5`~9@ORhYA;RVFKGhNQOO=`D4*&gnf5mQlTzBp#eBn?msHAGe>0pD*PT-+Wl39*a( zE5V%gp)9ja2XANZ+R~3BCxyBVMf1w3LGB-s%w|I_=?6i}2q^+vOS_&|+d2NvvKGAR zvII4V1)$b;SnA(w`ll%KjHvBEg858Z(8_WO?|a{t!F>_DI?j!Tf>}6dvyd4^@N$~O zXH>l4&0mCP@0$OFU-9161!#F)D)Ujye>$R#bMSv3dZcAaE+Hay3?#YtoO!xiTpG*bOvJNH z-b2~9eiHb*GHyROD6f zc$u#yF4ab`&Ev)g1;LQCb*WP*EK zLxc=7tjsD^Iq_B*Xh5jAcN>*^vZZ=fh@*;1_vk`>NH7WP-t zNIBUFVKgzlXz-@C*bbPzv3O;V4NXSvjnd?C5GrT%oYo23o>h{w5q!xaN;|7UCskxb oPАлгоритм поиска с возвратом (backtracking algorithm) - это метод решения задач путем полного перебора. Его основная идея состоит в том, чтобы, начиная с некоторого исходного состояния, грубо перебрать все возможные решения, записывать корректные решения и продолжать поиск до тех пор, пока решение не будет найдено или пока не будут исчерпаны все возможные варианты. + +Обычно алгоритмы поиска с возвратом используют "поиск в глубину" для обхода пространства решений. В главе "Бинарные деревья" мы уже упоминали, что прямой, симметричный и обратный обходы относятся к поиску в глубину. Теперь мы на основе прямого обхода построим задачу backtracking и постепенно разберем принцип работы этого алгоритма. + +!!! question "Пример 1" + + Дано двоичное дерево. Найдите и запишите все узлы со значением $7$ ; верните список этих узлов. + +Для этой задачи мы выполняем прямой обход дерева и проверяем, равно ли значение текущего узла $7$ ; если да, то добавляем значение этого узла в список результатов `res` . Соответствующий процесс показан на рисунке ниже и в коде: + +```src +[file]{preorder_traversal_i_compact}-[class]{}-[func]{pre_order} +``` + +![Поиск узлов при прямом обходе](backtracking_algorithm.assets/preorder_find_nodes.png) + +## Попытка и откат + +**Алгоритм называется backtracking, потому что при поиске в пространстве решений он использует стратегию "попытка" и "откат"**. Когда в процессе поиска алгоритм приходит в состояние, из которого нельзя двигаться дальше или нельзя получить удовлетворяющее условиям решение, он отменяет предыдущий выбор, возвращается к более раннему состоянию и пробует другие возможные варианты. + +Для примера 1 посещение каждого узла представляет собой "попытку", а прохождение листового узла или возврат к родителю через `return` означает "откат". + +Важно понимать, что **откат не сводится только к возврату из функции**. Чтобы показать это, слегка расширим пример 1. + +!!! question "Пример 2" + + Найдите в двоичном дереве все узлы со значением $7$ и **верните пути от корня до этих узлов**. + +Взяв за основу код примера 1, добавим список `path` для записи пути посещенных узлов. Когда встречается узел со значением $7$ , мы копируем `path` и добавляем его в список результатов `res` . После завершения обхода именно `res` будет содержать все решения. Код приведен ниже: + +```src +[file]{preorder_traversal_ii_compact}-[class]{}-[func]{pre_order} +``` + +В каждой "попытке" мы добавляем текущий узел в `path` , чтобы записать путь; а перед "откатом" нам нужно удалить этот узел из `path` , **чтобы восстановить состояние, существовавшее до текущей попытки**. + +Если посмотреть на процесс, изображенный на рисунке ниже, **то попытку и откат можно понимать как "движение вперед" и "отмену"**: это два взаимно противоположных действия. + +=== "<1>" + ![Попытка и откат](backtracking_algorithm.assets/preorder_find_paths_step1.png) + +=== "<2>" + ![preorder_find_paths_step2](backtracking_algorithm.assets/preorder_find_paths_step2.png) + +=== "<3>" + ![preorder_find_paths_step3](backtracking_algorithm.assets/preorder_find_paths_step3.png) + +=== "<4>" + ![preorder_find_paths_step4](backtracking_algorithm.assets/preorder_find_paths_step4.png) + +=== "<5>" + ![preorder_find_paths_step5](backtracking_algorithm.assets/preorder_find_paths_step5.png) + +=== "<6>" + ![preorder_find_paths_step6](backtracking_algorithm.assets/preorder_find_paths_step6.png) + +=== "<7>" + ![preorder_find_paths_step7](backtracking_algorithm.assets/preorder_find_paths_step7.png) + +=== "<8>" + ![preorder_find_paths_step8](backtracking_algorithm.assets/preorder_find_paths_step8.png) + +=== "<9>" + ![preorder_find_paths_step9](backtracking_algorithm.assets/preorder_find_paths_step9.png) + +=== "<10>" + ![preorder_find_paths_step10](backtracking_algorithm.assets/preorder_find_paths_step10.png) + +=== "<11>" + ![preorder_find_paths_step11](backtracking_algorithm.assets/preorder_find_paths_step11.png) + +## Обрезка + +Сложные задачи backtracking обычно содержат одно или несколько ограничений, **которые часто можно использовать для "обрезки"**. + +!!! question "Пример 3" + + Найдите в двоичном дереве все узлы со значением $7$ , верните пути от корня до этих узлов, **причем путь не должен содержать узлы со значением $3$**. + +Чтобы выполнить это ограничение, **нам нужно добавить операцию обрезки**: во время поиска, если встречается узел со значением $3$ , мы сразу возвращаемся и не продолжаем дальнейший поиск. Код выглядит так: + +```src +[file]{preorder_traversal_iii_compact}-[class]{}-[func]{pre_order} +``` + +Термин "обрезка" очень нагляден. Как показано на рисунке ниже, во время поиска **мы "срезаем" ветви поиска, не удовлетворяющие ограничениям** , тем самым избегая множества бессмысленных попыток и повышая эффективность поиска. + +![Обрезка по условиям задачи](backtracking_algorithm.assets/preorder_find_constrained_paths.png) + +## Каркас кода + +Теперь попробуем извлечь общий каркас из действий "попытка", "откат" и "обрезка", чтобы сделать код более универсальным. + +В следующем каркасе кода `state` обозначает текущее состояние задачи, а `choices` - список выборов, доступных в текущем состоянии: + +=== "Python" + + ```python title="" + def backtrack(state: State, choices: list[choice], res: list[state]): + """Каркас алгоритма поиска с возвратом""" + # Проверка, является ли текущее состояние решением + if is_solution(state): + # Запись решения + record_solution(state, res) + # Дальше не продолжаем поиск + return + # Перебор всех возможных выборов + for choice in choices: + # Обрезка: проверка допустимости выбора + if is_valid(state, choice): + # Попытка: сделать выбор и обновить состояние + make_choice(state, choice) + backtrack(state, choices, res) + # Откат: отменить выбор и восстановить предыдущее состояние + undo_choice(state, choice) + ``` + +=== "C++" + + ```cpp title="" + /* Каркас алгоритма поиска с возвратом */ + void backtrack(State *state, vector &choices, vector &res) { + // Проверка, является ли текущее состояние решением + if (isSolution(state)) { + // Запись решения + recordSolution(state, res); + // Дальше не продолжаем поиск + return; + } + // Перебор всех возможных выборов + for (Choice choice : choices) { + // Обрезка: проверка допустимости выбора + if (isValid(state, choice)) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state, choice); + backtrack(state, choices, res); + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state, choice); + } + } + } + ``` + +=== "Java" + + ```java title="" + /* Каркас алгоритма поиска с возвратом */ + void backtrack(State state, List choices, List res) { + // Проверка, является ли текущее состояние решением + if (isSolution(state)) { + // Запись решения + recordSolution(state, res); + // Дальше не продолжаем поиск + return; + } + // Перебор всех возможных выборов + for (Choice choice : choices) { + // Обрезка: проверка допустимости выбора + if (isValid(state, choice)) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state, choice); + backtrack(state, choices, res); + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state, choice); + } + } + } + ``` + +=== "C#" + + ```csharp title="" + /* Каркас алгоритма поиска с возвратом */ + void Backtrack(State state, List choices, List res) { + // Проверка, является ли текущее состояние решением + if (IsSolution(state)) { + // Запись решения + RecordSolution(state, res); + // Дальше не продолжаем поиск + return; + } + // Перебор всех возможных выборов + foreach (Choice choice in choices) { + // Обрезка: проверка допустимости выбора + if (IsValid(state, choice)) { + // Попытка: сделать выбор и обновить состояние + MakeChoice(state, choice); + Backtrack(state, choices, res); + // Откат: отменить выбор и восстановить предыдущее состояние + UndoChoice(state, choice); + } + } + } + ``` + +=== "Go" + + ```go title="" + /* Каркас алгоритма поиска с возвратом */ + func backtrack(state *State, choices []Choice, res *[]State) { + // Проверка, является ли текущее состояние решением + if isSolution(state) { + // Запись решения + recordSolution(state, res) + // Дальше не продолжаем поиск + return + } + // Перебор всех возможных выборов + for _, choice := range choices { + // Обрезка: проверка допустимости выбора + if isValid(state, choice) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state, choice) + backtrack(state, choices, res) + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state, choice) + } + } + } + ``` + +=== "Swift" + + ```swift title="" + /* Каркас алгоритма поиска с возвратом */ + func backtrack(state: inout State, choices: [Choice], res: inout [State]) { + // Проверка, является ли текущее состояние решением + if isSolution(state: state) { + // Запись решения + recordSolution(state: state, res: &res) + // Дальше не продолжаем поиск + return + } + // Перебор всех возможных выборов + for choice in choices { + // Обрезка: проверка допустимости выбора + if isValid(state: state, choice: choice) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state: &state, choice: choice) + backtrack(state: &state, choices: choices, res: &res) + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state: &state, choice: choice) + } + } + } + ``` + +=== "JS" + + ```javascript title="" + /* Каркас алгоритма поиска с возвратом */ + function backtrack(state, choices, res) { + // Проверка, является ли текущее состояние решением + if (isSolution(state)) { + // Запись решения + recordSolution(state, res); + // Дальше не продолжаем поиск + return; + } + // Перебор всех возможных выборов + for (let choice of choices) { + // Обрезка: проверка допустимости выбора + if (isValid(state, choice)) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state, choice); + backtrack(state, choices, res); + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state, choice); + } + } + } + ``` + +=== "TS" + + ```typescript title="" + /* Каркас алгоритма поиска с возвратом */ + function backtrack(state: State, choices: Choice[], res: State[]): void { + // Проверка, является ли текущее состояние решением + if (isSolution(state)) { + // Запись решения + recordSolution(state, res); + // Дальше не продолжаем поиск + return; + } + // Перебор всех возможных выборов + for (let choice of choices) { + // Обрезка: проверка допустимости выбора + if (isValid(state, choice)) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state, choice); + backtrack(state, choices, res); + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state, choice); + } + } + } + ``` + +=== "Dart" + + ```dart title="" + /* Каркас алгоритма поиска с возвратом */ + void backtrack(State state, List, List res) { + // Проверка, является ли текущее состояние решением + if (isSolution(state)) { + // Запись решения + recordSolution(state, res); + // Дальше не продолжаем поиск + return; + } + // Перебор всех возможных выборов + for (Choice choice in choices) { + // Обрезка: проверка допустимости выбора + if (isValid(state, choice)) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state, choice); + backtrack(state, choices, res); + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state, choice); + } + } + } + ``` + +=== "Rust" + + ```rust title="" + /* Каркас алгоритма поиска с возвратом */ + fn backtrack(state: &mut State, choices: &Vec, res: &mut Vec) { + // Проверка, является ли текущее состояние решением + if is_solution(state) { + // Запись решения + record_solution(state, res); + // Дальше не продолжаем поиск + return; + } + // Перебор всех возможных выборов + for choice in choices { + // Обрезка: проверка допустимости выбора + if is_valid(state, choice) { + // Попытка: сделать выбор и обновить состояние + make_choice(state, choice); + backtrack(state, choices, res); + // Откат: отменить выбор и восстановить предыдущее состояние + undo_choice(state, choice); + } + } + } + ``` + +=== "C" + + ```c title="" + /* Каркас алгоритма поиска с возвратом */ + void backtrack(State *state, Choice *choices, int numChoices, State *res, int numRes) { + // Проверка, является ли текущее состояние решением + if (isSolution(state)) { + // Запись решения + recordSolution(state, res, numRes); + // Дальше не продолжаем поиск + return; + } + // Перебор всех возможных выборов + for (int i = 0; i < numChoices; i++) { + // Обрезка: проверка допустимости выбора + if (isValid(state, &choices[i])) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state, &choices[i]); + backtrack(state, choices, numChoices, res, numRes); + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state, &choices[i]); + } + } + } + ``` + +=== "Kotlin" + + ```kotlin title="" + /* Каркас алгоритма поиска с возвратом */ + fun backtrack(state: State?, choices: List, res: List?) { + // Проверка, является ли текущее состояние решением + if (isSolution(state)) { + // Запись решения + recordSolution(state, res) + // Дальше не продолжаем поиск + return + } + // Перебор всех возможных выборов + for (choice in choices) { + // Обрезка: проверка допустимости выбора + if (isValid(state, choice)) { + // Попытка: сделать выбор и обновить состояние + makeChoice(state, choice) + backtrack(state, choices, res) + // Откат: отменить выбор и восстановить предыдущее состояние + undoChoice(state, choice) + } + } + } + ``` + +=== "Ruby" + + ```ruby title="" + ### Каркас алгоритма поиска с возвратом ### + def backtrack(state, choices, res) + # Проверка, является ли текущее состояние решением + if is_solution?(state) + # Запись решения + record_solution(state, res) + return + end + + # Перебор всех возможных выборов + for choice in choices + # Обрезка: проверка допустимости выбора + if is_valid?(state, choice) + # Попытка: сделать выбор и обновить состояние + make_choice(state, choice) + backtrack(state, choices, res) + # Откат: отменить выбор и восстановить предыдущее состояние + undo_choice(state, choice) + end + end + end + ``` + +Теперь, опираясь на этот каркас, решим пример 3. Состояние `state` здесь - это путь обхода узлов, выбор `choices` - левый и правый потомки текущего узла, а результат `res` - список путей: + +```src +[file]{preorder_traversal_iii_template}-[class]{}-[func]{backtrack} +``` + +Согласно условию задачи, после нахождения узла со значением $7$ мы должны продолжать поиск, **поэтому оператор `return` после записи решения нужно удалить**. На рисунке ниже сравниваются процессы поиска в случаях, когда `return` сохраняется и когда он удаляется. + +![Сравнение поиска при сохранении и удалении return](backtracking_algorithm.assets/backtrack_remove_return_or_not.png) + +По сравнению с реализацией на основе прямого обхода, версия на основе общего каркаса backtracking выглядит более громоздкой, но при этом обладает лучшей универсальностью. На практике **многие задачи backtracking можно решать в рамках этого каркаса**. Для этого нужно лишь определить `state` и `choices` под конкретную задачу и реализовать соответствующие методы каркаса. + +## Часто используемые термины + +Чтобы яснее анализировать алгоритмические задачи, подытожим значения часто используемых терминов backtracking и сопоставим их с примером 3, как показано в таблице ниже. + +

      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 JFPG3>>_|n)DM9p z{F>mydsu3eh%0Xt4GR#Cd;ks2muv04yL-lJtezA2*3voAVP^payJkMqCKVAQ>8U)FFDn+c zU9^w%fwP3U?Nqtd?+P@#6Z$`0|MkDQdF!>jvB<{hg=`nf3BvDA6W9O3Gn+Zl(xjW2 z&3>bOfoY-?Uw-KU{ha)aYADqzYIayRB49*0y>$!SpmPY9c+|;E+$|kdw;~2xy90c> zD81>e@cVH9zT5(<)WkP@2Bw+`4OYNf*YwEpTLjUd5V9jJn%zgIVD9gVzIVUmeYq4USqg1UU=Y=}#96PV?y4I1wQ>li+ zh3o`ZwyVtArqR*M2jX!u=E@|{XBXN&ng1@2QAP9VQJ>DOA6F*juj!M@9Y5g7J|w;3 zrZ^l1VJNbTRB)EceEWUi-Ib-LY}cxCYV|m4VVik%ez4hjIKxu^RJa&+vE=iW{bgEL zwUArB@~gXMLfqlf<{(i0-E!5zIP1{RoB5@LmeS2(qS&tB7VgFH_*Sk$+Gq2w(A&dS zX-P-CBwbtf=Q^4mE(x{!@iy^egJ2ilf#7(HaY`1xY2ZL|GI@sCxTy=#!+!8)jUbOG zyFfj7=8Yd--g~AcFuxRX=6+nBX#AOYwWMK6;{n&G=_r7$A+E?5EU}Je z)YKLY51${~af2e_h2r(Ie^_4x%SWESJT@L(1J)aQyz{i;=0+vJhA-T@QR%-FF`dB^ YlpQuWy6QPX`uXW`Yx_Same{y|0`&tmGXMYp literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/permutations_problem.assets/permutations_ii_pruning_summary.png b/ru/docs/chapter_backtracking/permutations_problem.assets/permutations_ii_pruning_summary.png new file mode 100644 index 0000000000000000000000000000000000000000..ef33b049f5dfb811bd31fe14c89a1b2474a8deba GIT binary patch literal 18382 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/permutations_problem.md b/ru/docs/chapter_backtracking/permutations_problem.md new file mode 100644 index 000000000..b12e39ee5 --- /dev/null +++ b/ru/docs/chapter_backtracking/permutations_problem.md @@ -0,0 +1,95 @@ +# Задача о перестановках + +Задача о перестановках является типичным применением алгоритма поиска с возвратом. Ее определение состоит в том, чтобы для данного множества элементов (например, массива или строки) найти все возможные перестановки этих элементов. + +В таблице ниже приведено несколько примеров входных массивов и соответствующих им перестановок. + +

      Таблица   Примеры перестановок

      + +| Входной массив | Все перестановки | +| :------------- | :----------------------------------------------------------------- | +| $[1]$ | $[1]$ | +| $[1, 2]$ | $[1, 2], [2, 1]$ | +| $[1, 2, 3]$ | $[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]$ | + +## Случай без равных элементов + +!!! question + + Дан массив целых чисел, в котором нет повторяющихся элементов. Верните все возможные перестановки. + +С точки зрения backtracking **процесс построения перестановок можно представить как результат последовательности выборов**. Пусть входной массив равен $[1, 2, 3]$ ; если мы сначала выберем $1$ , затем $3$ , а потом $2$ , то получим перестановку $[1, 3, 2]$ . Откат означает отмену одного из выборов с последующей попыткой других вариантов. + +С точки зрения кода backtracking множество кандидатов `choices` состоит из всех элементов входного массива, а состояние `state` - из элементов, уже выбранных к текущему моменту. Обратите внимание, что каждый элемент разрешено выбирать только один раз, **поэтому все элементы в `state` должны быть уникальны**. + +Как показано на рисунке ниже, процесс поиска можно развернуть в дерево рекурсии, где каждый узел представляет текущее состояние `state` . Начиная от корня, после трех раундов выбора мы попадаем в листья, и каждый лист соответствует одной перестановке. + +![Дерево рекурсии для перестановок](permutations_problem.assets/permutations_i.png) + +### Обрезка повторного выбора + +Чтобы гарантировать, что каждый элемент выбирается только один раз, введем булев массив `selected` , где `selected[i]` обозначает, был ли уже выбран `choices[i]` , и на его основе выполним следующую обрезку. + +- После того как сделан выбор `choice[i]` , мы присваиваем `selected[i]` значение $\text{True}$ , тем самым отмечая, что этот элемент уже выбран. +- При обходе списка вариантов `choices` пропускаем все уже выбранные элементы, то есть выполняем обрезку. + +Как показано на рисунке ниже, если в первом раунде мы выберем 1 , во втором - 3 , а в третьем - 2 , то во втором раунде нужно отсечь ветвь элемента 1 , а в третьем - ветви элементов 1 и 3 . + +![Пример обрезки в задаче о перестановках](permutations_problem.assets/permutations_i_pruning.png) + +Из рисунка видно, что такая обрезка уменьшает размер пространства поиска с $O(n^n)$ до $O(n!)$ . + +### Реализация кода + +После прояснения всей логики можно просто "заполнить пропуски" в шаблоне backtracking. Чтобы сократить общий объем кода, мы не будем отдельно реализовывать каждую функцию из каркаса, а раскроем их прямо внутри `backtrack()` : + +```src +[file]{permutations_i}-[class]{}-[func]{permutations_i} +``` + +## Учет равных элементов + +!!! question + + Дан массив целых чисел, **который может содержать повторяющиеся элементы**. Верните все неповторяющиеся перестановки. + +Пусть входной массив равен $[1, 1, 2]$ . Чтобы различать два одинаковых элемента $1$ , будем обозначать второй из них как $\hat{1}$ . + +Как показано на рисунке ниже, описанный выше метод создаст результат, половина которого окажется дублирующейся. + +![Повторяющиеся перестановки](permutations_problem.assets/permutations_ii.png) + +Как же убрать повторяющиеся перестановки? Самый прямолинейный способ - воспользоваться хеш-множеством и удалить дубликаты уже после генерации результата. Но это не слишком изящно, **потому что ветви поиска, порождающие дубликаты, вообще не нужно посещать: их следует распознавать заранее и отсекать**, что дополнительно повышает эффективность алгоритма. + +### Обрезка равных элементов + +Посмотрите на рисунок ниже: в первом раунде выбрать $1$ или выбрать $\hat{1}$ - это одно и то же, а значит, все перестановки, полученные из этих двух выборов, будут дублироваться. Поэтому ветвь $\hat{1}$ нужно отсечь. + +Точно так же, если в первом раунде выбрать $2$ , то во втором раунде выборы $1$ и $\hat{1}$ снова создадут дублирующиеся ветви, поэтому и в этом случае ветвь $\hat{1}$ нужно отсечь. + +По своей сути **наша цель заключается в том, чтобы на каждом раунде выбора каждый из нескольких равных элементов выбирался только один раз**. + +![Обрезка повторяющихся перестановок](permutations_problem.assets/permutations_ii_pruning.png) + +### Реализация кода + +На основе решения из предыдущей задачи можно на каждом раунде выбора заводить хеш-множество `duplicated` , которое будет записывать элементы, уже встречавшиеся в этом раунде, и отсекать повторы: + +```src +[file]{permutations_ii}-[class]{}-[func]{permutations_ii} +``` + +Если предположить, что все элементы попарно различны, то из $n$ элементов можно получить $n!$ перестановок; при записи результата требуется копировать список длины $n$ , что занимает $O(n)$ времени. **Следовательно, временная сложность равна $O(n!n)$** . + +Максимальная глубина рекурсии равна $n$ , что требует $O(n)$ стековой памяти. Массив `selected` занимает $O(n)$ пространства. Одновременно может существовать до $n$ хеш-множеств `duplicated` , что дает $O(n^2)$ памяти. **Следовательно, пространственная сложность равна $O(n^2)$** . + +### Сравнение двух видов обрезки + +Обратите внимание: хотя и `selected` , и `duplicated` используются для обрезки, их цели различаются. + +- **Обрезка повторного выбора**: во всем процессе поиска существует только один `selected` . Он записывает, какие элементы уже входят в текущее состояние, и нужен для того, чтобы один и тот же элемент не появлялся в `state` дважды. +- **Обрезка равных элементов**: каждый раунд выбора (каждый вызов `backtrack`) содержит собственный `duplicated` . Он записывает, какие элементы уже выбирались в текущем раунде (`for` цикле), и нужен для того, чтобы равные элементы выбирались только один раз. + +На рисунке ниже показана область действия двух условий обрезки. Помните, что каждый узел дерева соответствует одному выбору, а путь от корня до листа образует одну перестановку. + +![Область действия двух условий обрезки](permutations_problem.assets/permutations_ii_pruning_summary.png) diff --git a/ru/docs/chapter_backtracking/subset_sum_problem.assets/subset_sum_i.png b/ru/docs/chapter_backtracking/subset_sum_problem.assets/subset_sum_i.png new file mode 100644 index 0000000000000000000000000000000000000000..40aa8e178ff03662d66e90f692646509f581a62e GIT binary patch literal 33270 zcmbq)byQSewD6r_fFXpT1e6$%ZiB7?N$KuV>28o3N=mnO<62>g?<+EG%qoZIzOe(nwX` z*x4K!9!^h7KRG-7K3e7DAz!LVdHcK8zT*G0a%B zZ}NQG*B<&8X}}TK3|N%x&m1+?Cb5)5`M1>~DKsCbkkZhY5Vn2_<{uF@KT~+iGPwK7 z2^atPUu{Z>)qey)Kr}47!>MYR<^2~-EEqomKm|gyxhVZi`@b0^f73Qy6>_J%5D?qI zcHe8{e^S zoo@tyoWZKJsIDfIr;#N2!W*1UEFB?xPI6Vh7hlp*vrRdSMI!Q;4WBu!zG?u0?uvK4 z@<-g=tx1Zdo=yAl_Hn*cVq$+$ILpOzFknZILVo+25vnRL^*hzuah5OPISp0}i6U1h zfM&JE<+PxTWW#^^Cnn8*wS-IWyes|)cd|TTvG3BG>3?kDoh2F$xX#h=y!j;l__0n7I$0)1;9vD00gv%`!1)Q8WgD%vqOfcy zZTsekvLPs!9r|WT$twsH<#U+9_`|Om5bm;^L_0Gtr{g{N3dlNJOFh>!LMp(DRDE89 z&VD%$N+G3?wq#GlA0&$0#Q!itU3Q3u9E@&wR09nxf}1}xRaA?yNxr-Uuj>5LVCUln z89YNBj^%$7rr;cIXbqz?Lyu0IJ`*(UL1F zb*E0A8rP`M(y(9P_(oYfPchHwIHg_|aVw1z)0{wROCTZTC@Ha%;JA_7M)>_h8{Wx%X#G?BR85*ZYqhGvEq!SO&Jir!`&Bh?5u*+DMhf<5JI3Ira>F94-dT z$1VO1_Eyygk99lbgf3F$x+M>*3Q zQ@IKrNq(To-Y~FwAHHuqtSa&L)vyFB!JpB{k1H1B|9qf}Jna(N{`1#}6wPjaTN!xmrpr%P9?B?xx7X#=xj$Wt58 zgcbxT0GaK7y!gwT3hMA4;W`r7@45WxLAdVN|3$mTmTJDs?`$x{f$|M;8JxrEDwh|%yAFyq%*t^$JLw}oa4L??u zk8YqmXqgiYwKMCKG9-%d0grAL)?^>nqd!Hdp-hv z3aF`T6Lux|c}~d$YsR2MiIVD3n1*kwfWP)JC}wb?KBy>ujZP(8{Bg4ok_^i}F^V-{ zrXOs$_~Ip6zPWHMqU!GezhISNz+woTRW5={JRq8aMo?B;l)hCO`Wb8~J2mLP*> z@*T=GvusHsWi?#eS~b_`_pT+Jr@!$NXKo$^CLOXgH5UMVlDURu>!)5IE3LKxV&hA3 zaQ?<^BS)RjWcb_Zs5f7iJqp%~W)1%MHoI-j37j=W8jhSCA3LWOmXu~3x-`hAv0x`N zuDN>Vwh;DA%)VM7x~(vRMsmS~o}H39ew~Ioe8D^AtmG>V*QHyQdza-#Cs^uhq-Q{1 zd-_|;YEBW^G*C{E&8>ty`c5}K3mq2JBlnd8z3BWzrB-4^6Fc4gs_4onemBPS{Vhs_ZrScs6C^v9wijU zIqoZcV~UrwMIM|ZgMBCO5-{+~cAY%r3Pdgs=AjO4`uoC^PYP)@GKs1>GLLKj7_9-1 zC`{lUnSgS#D?9c^5Mg%uO_JW;x3Z|)WiXq~`qv*0~=Oiqe*2zC!nfI8fuU?GO-$ei+l;fABVK}UFFB2I^ z#OW9ZZ!PgENfyVXN{GN;#~%AXWGTV>R)tI29Uu~zyvj+PwKIAO+TOUsqb8muN|~es zMFKNCA6mbpxqY8kI!FRHdn8lf2cR6&;fQqTJ{6#88f|sTkXMY;2R39sL;dGv?2Rt0ft8 z2pRcz1?aGK8pi}e|0VagGXQl}~sei{`x zh=LigBb>6+-wwgD(+4JI_B4x=FTq0H6=zOh;;Y|lwUb^Fho+zriR7n$Ptm8UpA#6D z67Z5PN|0^FpMVFq=r&pfg1|pAo}o@601bu%RY(e+T38px_$%4ymM4x`Z7cz=ju+?Z zz!af%t#4mKF2@ZOk#2+FTjPb&aT42wv1JR^T$i}=L(3`g3osEin!5X$jc4gmjUOOZLGbINGkg0j7 zlSe0WC1oX7+&0eX>)|2nn8ND5aikB#jMg{!(4E%~s>NZVU&`34od zN}I=sAw%d~IeL0Ln$Rm8~3;a?80p-QpnWT^OehJAdGfwc zZ}|%s*KqDJrYyqGKkj+G7vV6Q4wWQwBD>OL0%XEEm${ zC0dkj%4KLU6Gb(+2T*)=a=oPXGM`ENIuv4}+FT1Ic5&r;CvW5spF)1?cW>`rhn_&& z7=Y9sT|ba@%uV~MH>$vsyQ<%#Q44m9`jYUTW_Jd@6!W^r~bG<N!ttB@V6O!9=aZ$rjS|3q#o_1R|6D_Fl^|Q7&g7C+&AQ&8S zp_$xiLj-)eZR>mF99S?d64ci|7q zZ9;%I>NU9cRLuVcIF|(0FNc(Vci)5a>-NdD65cZZ)9VAFTA<+(m~Jm~=M6xI7aJeY zIiP5bF7XK0i~-fJjdW_1HDg0~p8U{8hWsXirzQfgeW3j#jy#eueaqJ-%4mU?*@k;1 z-+(o;^)YSaw#7S8VII!#$0zm9=*>>)rkR%)7~EVb-+{)? z8c3RDPJ{8jv@Bxl3A&m8 zXNB0Kzf?}~`>rGQ&3IH{NEh>=w@hEmi@R44@n!za11ThqmeBJ)89WSJID%_M6JVOBawgeOk%eltYOK(WB7nB4_l^{{?Nne;;agkMn0xmUv z5P?PyrAZdwehbf?lQNHvM%A+qLl*7zM5lJZFa5MW9VBFY7q z1mOaeP0*fRm#VZ zeC-baf~TavE0y7o@-`c>gLO#;O#0COXPo54momW9Ac6qzPUZ+LG#qNQda*m|f5!na;>2t+OpNEwsP1rFYJy z+M8nkd@*ON$hFnV>X1EfFjbAHn{6rxnga zepQw*^5NE#Nhzczs`>lU_gfP=td)Q5{ZJFF?cJPCyXjNa1a4B|0bxYc6GP6cD9mOmv$mw{o)UAxJDKo=0 z?J~RfJYUIpEU84YZ5tHwf{wh^=pL35R=2{84|aF)-MVV+bysDhQ}Q-yt%9=>ElPT_ zP-H50KGu>>)T=oj^9^%fDhdYrAe)m{{xm4r?SqCsH=+M%gGgKI(pk~N4lK(X^W~Ab zRF4yxUAwh>jeU!*zNw{miI+5Qds?-%&lye$U#Y3ze`G*u&yQRo$S_;rNm~b=AVcDd zN9X~X>LC@dKU)MZbth24Ye!lizQwP(orEWlsgJ&O4z?Dc`zrG2XQK6M#-ml@Ih5v3 z1wP17%^10Xo|5;-C@fyBAobu0I?fOJMj-r5tfnc%5$Ou*%_J+QHAO=BI=6GWtToSQ z5FuU4a1R!c;Whuwl}`cg+|8N#)|rf*L@9wZDG$EJ?j$FAkwBr2Eg9}Kz%J+4f~DL# z@kyKv8?uL9Jbiu>grT6C_W>+avLDx%5GhSxX~GC?Ajoc{9jW0Z16RMiJ!M7=J_M95 zvOxK!S^AmX8|0&hdU)pP;O3R7JJWwBKE?uiOk!`#AQNzEy!*z_2U}UrpF)ZF;<`rP z#ie_Tl94+ino$8uIk5|i@y=DbU)FWl_jlT{3ogl(e2g`Dy0I)uR_uDhsO?{H;&f~M z&T!oN!^d3`WIJgKn>`ON9l-mrxIB> z{l~KHBDQ==O5Bx1-{C*vh9`FHq5tx3N{GXB4R`+HuBwn@WqELW3ei5h&9|}bDKLRz zyL>0>%`74GuEJlk;coU$NjT_V5?W>U67%>Tbke?Aq+|GDntMpSv85h4nG|G)Txm}^ z+p=eRV4QvM=CV<}AKsQ%@~nOW912`~GWS!yee^HpPLcqQ9iz^U+bGdb#-6|BA*jDO z9ozOY|Hv3+mirW=#f+qTUZeGb$?v`^`E_7FB$E$`crqv26E4Sna;_g_7J{d|)epKH zN?kYa>Z##F`gkNKFjqh(Vc_xBpFjF0#cv~N5ILv^2KI>M1r{z7HnF?! z8h$I#;iUpFuQEJ^%YXYIu}_SZv{xf1@y>y}e=z^g-(!L zc!!>gDsG=bRDmx_8^|f`X{$KFbhVh_=#;9JcVQxoq z9ImH%8@w+`jd>RH;#h~L{6djHGo$o75EagC*++_tBWn)Sf*3Vv3Bnolu$DpAt&XNI zoo?{m>vA1FdoAt^@?8vuAaB9?kA!zU#lbEVP#E$W%YW+7sG4BW>OzP5;Wm5lV?Lby zf>Rgj5aCA(hAgr#3PWSQJB*s$Tch*+%0dHyxny}veEZyH_J)4x>-dm=tv6tL0nIyQeTfAY!4mX2^~>jaH%oQQ2w9qM9I6 ztf*5ZnKManMBV&{iuHhTbTYNvIi94E#B2RtdkMyK1BlF~>l9W|-D~CEK#eyAl(w^M zi2a}2NyK$(Fk{XCk?Qf))s#kZhtu4JLkh|>x)`JB^>%^$x@9QmFF zd_(d=u_zV@oM}4b0J*7QE1U6Eoz#8+pAgG2CQT5&IHKKRDv;><<1t?-B=LkR+5=q+ z)Hw52DSO{=ya$_l5jDXqp$c^stvnf2?bTv|lyakG6gG}YD_ z#PLpRpRg)EEWTc49zPzZ@`D3gD@OWVvC(uE5Zx6aUqnO~FK1dX%H-d-ks*dOw!`8& znOKOO*7gupkwjJr53)DD`MK9BhOD|U_&}v`mwP#60AWfmwwg(7mV+uk5>(%~=IB2w z8_a`T_?-;~^C}vIx0j1G=Ctz=;1`I;Dh*lWGsPa=`_0!p>PJ4ujgQAPtI(+V-9Mc4 zb&A@{zU?Ml@;s|B3yQJ}Z<>=2eD3H@ioOpZ*EfoZt~-Q4NZ2=MjBJ{>2z_m}c}E2Z zIYde6=PubaF*1m`c)S*TIXR1Cn_Ih-#q^>7Z&6Y2i?Xi$m!qe? zA^?i$!1W2*;fWgHO=%a>=7v=%(j@8!L0)#I*}?Lwjf`Fu{y?nKBHSp~DI-S&UOg{t zWU7en_XZl}oX(fORZNa+0i_(F@8i$2*k-7j+WveWx_#a-^?rOvGrG^&ycRel{A8%M zxV~Y9oSeHeY|<(!$GdpOd^n!w2-l7rlo!YJ50yZQx#m&rz9`;F*+5e^0J^V9-vNpk zLD%Os=*BPgXM;cBAy>lF7PM|Lf!3DhjJ=9vmGOhfm$z!nhn~vG!1v>w9qX-DZ&6^u z=tGOwagH+pqa_7#pg9PG)z2l6(P_^R#|uJod2f8*V+N;fAe;BHG5G%6-ZiHUz@#J* zE-)xTb{S|LZR&!4Fy0x!!}*ZK$c?g7%}Q7U5TqbO4n?XiZq!cay`}5n$S=+!6GMHYpWC=VGEcQ?MH5abfZc> zuK6{3BJ-fbgJ@r04K+Hh+EFcDERPHljS1a<{}ApD8a~-u-`it1xvJ&_wlm}d`CFQ2 zQZtk5Mu`98Jedf0rOrCV5x9YJRTJjlj2hf&dvYT*PgsTTLUDjD(wT-}x4Mt}oj&?Q z_PckpH~0jLLXfdJ%dc0a5Cj|s2FNQYORfggUY_SdfnlGMi-gD!-?XvTa~tNOUj*5g za&Bb@@3xD_x;*p3_cq$*#N(U(Y88bS0W*VNhpwk#r~M}!JQ6;2$8TNupAeN>!C?Vk z<8B(Iw8Oo>$tCzl_ZIYda+sN;qB+;aXJ^i1m6^Q$%9SlbK5(HEJ)1*>SAD!KpXIfRV&@tvY}{YeU+^lK?x8?4oC_UH1HE{L`QX9;q-Z|zOtaZ{ z$QT{c)&UxZD}(-HhQ3JRkEP2F0r`yq|IA3bSW%AWK{iD5NX)0%>}Td{f8(9#~4`olmDkF|Nm87Z!D&r zn&$svP}KiT<$q^pebI-tq!j)W#6^&wg8xs6F74Rbu*>pz9(EYII85h;g!pflc2c3_ zwy*h^@9IMs{QgD#&hzuM{oKvq*6kD~Bxw@_6HBb3i4y%)eLcYr=I&wO5`$MbonVK` zuPCWWQus+#VP?}!WB*dg{+lb_hO}U^WCy}lh7Q{>;d9UEDpaz4$lw@37A`l_`91*x zcPURXWU=u4Ap{n!wM`-uxL9?yJ^y(>bk)8q8>!4LraMz zc@QxDqCR_CB@LxUAW+%ss3(2c5l8HLucE=%`JQYuJ2p#oE+}MTwN;1a3kxYl(o|J) z+*lr!;kpKWINO(|jc08BcoXAY(HCRYc4a1E=2*H|Z2nP9yt`k5Dv#%aVh9tdw83(4 z@gZ04jGZ0bx*+;WND`vUud?YQ`>OIG;q8iHJE8Wn-g0m5Yb+Qf=xy@$=gRa1_xF?a z^lbk0&*TcZ5t1{6n@sF_`jfu$S53QaKLhA1f9fnh@`u$y1Z2$K5v6(d?d#U$PSu*o zP7#tj{FL;=h6Lr>{wb+Dc}Hg=8v7uTOfCppFqceLE<3N;{)0SucEMbzE|`*WM$dA(R)k%84F0Gn2nDXeii0!m1!|?~zmB&fY z_w39^hUk{l(DRl5eHK8@?B>f+^J$#13nNpbbW`$Pja^!_&F8<&Z%!!};`-`1Wb_E1 zT$i=LU>XRf_CjIbTGqOAob$qa?Ee{{sLgLGcLP*TL~MPwWA%@Un~~4Ws5SZ8v#sM3 zqUyGy6X(RB%Q%vB0m`1CuPe01a!Ii;7h1@B5oY)_Wfj5H^q1YT;^FpI`}6t^=lYHg zoNtQd((O{Q7BQJqau-zfR1~fJHS2P>&a#fObJFT4bofyq9P?vtoYT;r;}bO!&s5T~ zWHchH=}daN)YtS!xeT^pM`*@L8itT!0Ks%LKTmyD;Hrv-oCjGn1AsJ^gIymz04J_% z4)8NsU?sAqNc@LNxhMFVOP0f^Xhw`1iEozD{kHVkkB zpj7DjHzR`&P0y4ujQ2l>Je+DFm3Lc&>!cUmRH7lkZB-iv5R!{@P?D2CDz6@48+N>I z$?U%>FhHXizqK9%t{ZYClS~V4Rr4^Qltp!YBB!<>l(pZ1IYP@uz)_a{9L-Z2Ri48i>HhATPUU90NOAmqC~3J$F!U z+abcHb=I9stn^Cy_?qX*0gihIaZo_qv1jILaMe>GHnniB`u&%gO!`74UJcE|t$G;0 z+`8#+D-1-0KO&aVyDZH8)eb|4@__9P#Z^K+3N2ye;FpW`hNP4RbKU~ar;?LjM@`2fd=_^;)OB|p;4wU{1&Gxa9cj7A5UL~DH zSp8oa1OV+!o&W0MF7~3vpWa07@mmCa4DkAS5$~tqa6`A3%G^5F5IGq=TGDO5+)NIb ze|9m|el0OO=qT|9zGEHG=Mk zvbRCYJ};kBPi8`UCx7k?pr}|5A05A5sC>WOQ%b*k(9vP^kcK>w0ptgVTJ#LhX>(HQ z-*D`s2#Zwbt5->B5lkYUB(3F*@e^+%o7|;JH-}7B=w8YZo61#xlbEfNxEFU1c&k?Y zEUi}9hgFt2GB81s=Cq$+5UTeUGgt`iQ!e7bKX>R%ykr&^`Sa7Af<~1dkZ&ftUl#`h zPL1CGP*yKds7w*Xgtz40D*&o>5}}@t#-bq3CoD`)?lc%8WO;z$3<9mV%KZLI2Ea_{S*uyhM0~sFz3?6f*wTJ0jo^u+iU;MSBs4fL)&k0E z%va%WHTR9ca1y!R77Z`J9?8~Vy+)^Uu0CwH@aAVO+qU4btovu zLiK5l@-KWhcfAu%nW?IA0`a8HGN4+Ps}N0GrTE31z#m)$;R@W8d~l&XDyEW-z(lT{ znd@B}7cQ=3j+vueeDHobp3%uhRq4-%on(7uH@FYVmNfI)goK0#UsB0MS$Mk0RmafYv}#Y|E-!?H zv_bK6GUOUo*!Q>hn}xl9w>1nAU?&}N^(Re&@7w2#hxawg#tulEuD^xf$yQzb&VA;> zuJZ?X$>?in;MtwFQMi6m)AgGvvNrmv?#sC-ifKXvlJSxAmUQqtNs4N(vZUjG{YzXQ z*rSj)SuNj}RMaQ@h6%k7>w>%7+IJ=54 zg}q9%<+FRLy&tZ4)r1R1q06<0&YTZD(1w4Z?iPLJWlQHQT0NWm`9ujbqn<`GiM3~u z-+UJuc{VA<^UPd3BuP-uY$OZae+UWa7t_&Uh0u|M;DT?7Bg{%7U7wTd@ArKT#MMCj zBGxIUdrbm+p^cv8);@r=aGTz|EL&P@?aue3z%9HEA<-$MvxDKO`0TPBlC%DJ=(k{8 zxm|QJG8x>6^fO1tV&%Nb_*q{|UF5`qTw83gKw)3)RLt!OO1%)}J)%3A9@_3AE{ z;_2!PG*_GnY-JhQ8NGIET78L4IBG0x0V<@|xmGB{Vq0`DyHCn;OFt4ds4v!3PnjwL>cA!QA0FX@94 zgS6SPxiuw-gPD{EFu$`=^iGSy~i>*bq7g0W#EzIkiHnG)L8RGl zIuNHo)wZpqp$(hahv*T01U-W*Ovin-dEBW_INeHg1>t69yOSh^?VXY%EUzLL-#7!? zI*7N;W9G6R=<9MkHd=@`#dJG~1Gy=3gcmu6pww(LL7Yu_0B#2QjWioRB0{&EhV%Q+ay32_2IH6r282jTen*R&$3IU(S)5CR-}f8C7$ych7rR z;$@N&#z`0^{Y^Fp7N?H`CP9_TzbRRb0XC@hKGt)+o#U!9La#u4NK$3;_?43$wFeoPck{C#J1zaRKwSQlZ1%tR&Md=?3 zL8IO)@S)G&iVf4{>w#O5yG76CrhU_8zi(saAh_e`z4v3TSyB6f%{!DD{lMO?3R(T8*l zRIV_}rR=2_s5^0(stBy?9Zm*C_NxL%0FR}JB6{}MWTX(Pa3=)t4!6yfaq2p4cGWl~ z0pyz#@lXm0!LdQ9exdb~OxGa-D*4z9DiUk3EWtR#!tEw&DoyDxK19et!{*v!5+E(` zkCZ-tH=|g-_@abw%(j|_L39?z;;B;^uqlse+(Q$KCWM%7d9MOZhmZi2P@sW|zZhz&<_woJe43%`e~ba!JXAhDzz9Wgup{ZAFCXYL|S}^rhGqg zfQLx(Ojm8iKv|?IFFWyaIm||~eRcuWE6%lS*j|<{DiJaoa)X%4>+u*ZCZ4cmmc5nY zhg&{ErQqkW&G!ta`^}0dydIjl#Q-WM+x>~fu$Q)0k+6EalXr3;vXA~2e(1~r`OD{^ z{|rGR`;%P-E*T>+HtJK1$&^d^YY>WZmu|;4bqAd8S*H)4Jwl3|GO1G7u%=9cvMC6$ zxMe*+*qn z#Tf8E4p)0s#UNC#notajdHo*v@OeH}ofp?D^r~-$HQzS{m~{* zzZi&>;|3}K7CB7Ok$tC=k9k3xbQpk53Avoo^e~#xw`sb+ie31QllA!G4o~~_B99!t ze?JYf)cEs6I~G?b3_Laj%wiQv&Ksr`-SAF$it>9rt6LZw%mEwUipdwCeGlYHq)W#} zHQ`)A{ng?r7V~NhEjnoSdrvu(Mgjm(EDPGW`a1Lu`!wVX#O^`0r zn>x$y*HHg=WeL{BW;JQu!)V?v*MeJ3CS>5l$j8zvmAM- zT8N?*PR(#6IZ*kPo>>D(cap_cfig>j9*lzjY5dbGe8|;6>(EE5PwG~%&}&RaF+M7A zmbLZy4^bLm!OV_fr%DQ-I0M#TW}6@$jQd4URq+pjSgx;ZnRuvHiA7gcJZ0-sL)2#) z2c@2N3S$rVfc7wc)JYLdA^(3FL1$Bl-d|`%DZ*4u-X6;ZS)5@L_W12#p7aE%lYthY zj_06O0HX%f6%B;X*>D3v%uUQ5VK2U(t0!%%_L#;#>q};`(61Gz z9}-2e5Ih7(&Crq2o@`ZG8#DBI5JFtU3Lo}*(Vbk7OyjYY@%Xrb4*I(9d}*%!4BFRU z&s(sY+pfc>7aOtDc}h{NHLsOFPCK^T(`OHXV>F&-i#^TRX+aWwLDjMBCC)$*-#`M* zTAU_x#_$>Audsr1x)38_)nS!-?uSST!S+!anE43LF|=W&`c>GQ0s=ZkP(l3GN*_Gp zyhWmo1*zcXno_A1duXdlJj^+%)0k6aYz~d?VgE4pi}5a;c{X<&z4ZIP;F{DRxRL$V z=?4XWbN?SR#z%dTep^u)=KiB}uygN|1uO)s#MYiE>IQz8`cQC4K_2UG)0NDNJmC;Gs?X4vU{0&nFL{Ded^D3 z45E361Paa)MSn8GmWhWy7I!|IF*SrVgt5cfT6H`L=@PCpD5&QNJ`>2iR>zUpn!{xO z&S_Wa`x3ZMU#nY=kY4)A6C%Phz?F3-&V09|Ix9F^V0j)myY6~U`U!4D)Q`*l*Pb_A zZ#hJaPfqTpL6W?g`$*nBSkUApq1(g3Gs@r>VRv1-@xwF(~g&wZY?Yy|l$hCQ z|Mp&VKlM4C!qw+xP-FD^>|AZy7eYQ0Jae;~T=k#VR3Y3dVQ}4qJaiVL^dVHJ#qwPZ4~xumz9eY`Troql*ZWp;>c!ju}dbI(;~Bn9&rc zYpgpfn;l~*ucTr`QZa35=1BMqhAE5s!bAHp1TF23v_?NpR$(cT{&l=_qD{Futq|F3HAHPT)*i*BI&i;dwOWQ5#fZ{d?5K7T_4ynKjX+|mMZv< zOPYT|ZN+3<;2k%)_ZEXLYKCqqaR1Rg2K{P@V?>yal0N2p=pfp(=Bsxwdn4- zdDQz~#Gx!7*qri#a`h9=wD6u-Sd{zYDORG%)F=`Zq6eFQZX?~Jz)zQ<#OA3?Oxb|9 zMZiUWt^ZUbW$>B#)T|zY7!^bbe}*m4*H~{H>560}x%DwmTWUABZiSLDcK-&~t5UDB zD*jYrwzT2VmoxDqfxvK$pHql@A4nJtq`O#W<7rX`L+0l9+yh>xKBp&$*h9kjP>EOY zU%G)N&#G(coamR8=yd_COu2;gP-gBpUt-ixF%C93`s0|(sB>MjYgw?*X?#r!ou7dez_5M=hF+uFD_1()_(F-#@%&MEZ|$mILiTkd8yfUdU@?%9-|& z+T?uICZnqu#=~(k4P?Vzz+UP4Hp&YX!3-~{mBv|oBk3n|>@cinJu@>Jy^o~(h8C!q zzxqxwCN9ehF)X|nLVOV&T=cc#>n)M0am7Nk&~T5ly8eLT%t!%F<(W^o^YI7A>LJ(s*?3n`QF1DBwKGkrPaM$ZZ7?_-R4)f(&kM&h5dr6 zO*m|Om-rzlem@lV0BoN}4xjL#iNMu^TTI=%WQ9x6UKoO>q?cMSZqahXX`Po6`J#Qk zGX*#d0b%whCoV#5>53agjCeM`I!ai>I^YB-^zb{8lD@{r;@PI%G#ug9$f9ZGu{nXy zj**_bY_`~nR-}?xQM$6umHz0(Rvz^dM!)}#VEiq?0&BO~xEFn+ZuVMoH6e>G5K!-k zwuCr*%k?Y!()vwDk6Y4?t}%nweNc8QKWPwUv_@MIA_Fi>m53&3`u2qRQ|I#e%X9Cb zwASf6d#>Kcd(dnPlqLRtGUTM*W}yAVVdz~hdGscrvyvzUB(q#4H~2`#o8ZlYNCr+t z5k+}L?Xg0-N!x+yFP&*!FfmK?ZGQa8+bu9HNl+(T?El_zaF1~*NcDpv0MhE<@Upcn zc{AxP10l-v(_O2j?Sh6Uk(8IQV<}3&C$Rf74z0DlI#{Mswewj_v?HNoT{kV%`288H zdQ1xrD&sAfEdvkdwY|8LPpdr4jH~sPxJ#NN3~TX)4{Ur|DpX>zTI;%~bK4sev|!Mp zh{;JTnSPKw^xXsWISLk#+pFFc`X z-C%ozEk~Gqa zg;^hCrZhm(zhR(8WG3+FGZgy1V9n<->hgE zm)o&GR+wGAk0yu}c4_&O59)cW$k1L=3?G~|5o%mHEZ3-zu354bj#7VLGL}7x-Z9_p#21{e;8%x!k+Rt`1idH_n-&Yoqw>jig_&o=Bm1enU&ShiY1G0CfEQdb~35uwCFSsZnah&S!(%0_H+wdxIdt&dEk=xqc}BTIq)Khn_2)ZsuZHxi)8X)Cn5_alE(` zOH|ODvvq!Ib@!=XFy?{W2ez31IfN)jSvo|ingfpICXxJbWV?F)w7`qUFMVw@O;%kZBEJICKf8g~dA%8J{Fq{k1V~Uh4Zt;^@zeOZH>Np9%=TNi%X7h4p@~uA$R)h zDK=yu@$JG0Ax5j^=Q?_Kq_r}k=8MSHpLs!zJ4+u~Et#hGUQ{D*{n_Cw<|#RSZ`hGI zB)3L$5-?WIZ_B5Gl#9y=#Ypzq2oh?+}Lkcu0AfZxD&P|dOf#2Tv%07%Iy|sSl z@HoA~)o>UJZ$YCoXkI4pd2Uku@C;!Obx)4|L-sLQqpt)Um(aM~uQxEOwg-o{T zPs}&Hmqbg5u$cS=Wajd`lSNIB%hi<&0S%5B$$KH=FLakytgwCbT8+>yOXJ_vKN~-% z67ud|Xy2np!08h|`|F&wDkZ-?UVGJaH?$YAVHAp?}*)-jI`@nMLTq!X$esQe2v%zr(Lc&JMp@gPD5= zJB7a4mPNP1b$`uDBS{)1a6l#N8tV2)hq^!~{w3FuyV|mx_aKBMU98HH3x4zGNSrG| zdO5B!%J30pL3QHQhtlIg=#Tm_nq_8dwbsu+T3S_UHwu69JH7ddI-+3TE!qR^EhJ$= zUQprEDClWFeewNmrZe|?bcR$~DRvjuyTRQTPdXRn zy6wg7tH>EjCtkCf%sXJ2Q%T*vo*vzuTZxc`8pC8Hth z_||^q!d7-DrsrK2b5hf9WN-B|?@*@kEZk|MxH!<$#>0|4ikK(BJ=k z7C?czA>6P+vBEABdfyTqB!RaxAx9$};naPW$9T{b^IbK8kaT|Jv&wd^9l1ve&Osx) z^Y9LL^iRn@vMR&}2M5c}u{VX%xx0r%v3q602V}cbDyD{xtwG@wYprH8xziaXou%UY+uoq502euQB}(f_}3cz3X97 zzOuA@|F5#Qj*I$v{=oMNj!x;8k`NFDBo7q?2?0r|LqJhlx{nYMK|&e{rAtae@(^hW z>E;9}>2CPl`}6%he*gdYZ`s%G&dkot&h2aF`HCGDA|*KwsbTv~1wwx9sHoH^7{641 zv^Bf)Ikt3tqLEd>;i0wQIgjeuys^fE^XQuU9BhzbwrH}ouoRdbZ;rkqhkd(uhYxF= z#B9jzk1vbjH+0B*G?_+MRk2?NCMfW^M!zB7SNk88r#x{jm#p#@sc{gp>F`Obz|U-8 zO`qbTYM~CHBhOj1-FuuTTT{NCZBaw>wmlFhk<1tnjElr;=-Kpb^6MNJH z78Bu4)7{OX7$W~!&ipK~%L1{x8JNH6N6^|=Tb#BQYNqVSQ&($>Wd%ygpit^Att%fM zj#QuGPCrNKv!B$`-TGt>huKk68WU~&SFfO7h(a?R9!hlQOP5g^%)0FLnQom}Uu8x4 z_)kFnvd*7eh;ebi4`{mhvs{fO1mnsG8 zpkjJ=s^doo{^UE{){`&29OG-oj(B&c61)jNd+*)ZKC?dSKg4TN3G;MngZ^zhB^1Dq z<(f%Q*K!b)9)9K1*rH>rZ!o&|Vc%5FXx12>HnM%tklLDA&%KlJmC)VLol6GiekItH zKtI@S`w;bAgHlcuZe)DxsX3DVfPhE)<55pTE0gc;Q{yncMtp6ZSST1ZaQ*tN_g}gR3XJ5O*fHr%wBjrFFbkK-HF;IToCw&Q`DeGQ zyWp##J3HnJtnZ+L@F4}MqI>x!E!tKfT9_>sHv7^M+Yim`mGSlm(n9qs8jycq4H1fX zj@Z~@7)fGh@3o}>tA-{vKQ}n#C7!z22f0Ix#HQ-k}RYYuw9=c=Zs#?}NI zBeCMeC9}`tQuGe{j8RO22!gt zK?fe)bT|Xk0I$2VP?ASGzf?(B{`pBH!Oq{^MSZ7G4n=*#Qtlsz4U=3OMu0bt=_en+ z@t_MPoec9%9&+tH2j%{FSaD%41$q6$xPeufpLzMQrd>EC+-5jKWldM2*uO^nC0 zbr>9Q=2QKC*!XQ0t~%uy^6kZ9*FDGYkWj+s^>S<3$xStKkK|_FVer=ALRLsv$7pN=$Eftv(Lc2rFT?}HhT73$!|Fsdacmu0%cxJt&}G5 z_I7Z)O{L{*Nko_u8uV)in^rQLAVLM^Y z90K^Q6Q=v^z*|sJ{Pd-8%l4tY8i(CNd#e0e%&|lF(uFl8k?evFB^-skg~#Jii^&(< z`py|C>sn8F;TGlNJ|O^|t*0e|PzIeQheXZ{<%?8jyELw{Zk<%Rt_Pm+tcuIyU6zZ< zdm=@bTU{6Lf17%VG&10f71>S{H@$YoBC?G2YC|gUtNJ4aYFO$WT6z)9ea;}jP zX4#~3{4t6i?lpc&;#iShV+^emsLzkWP?5&b(q>S5$$9U5@W60(a-|oMyc$Vb7gC_s zc~~`5fz1EGzVX5C?&t)Q?YEnarvJHFrL+_HQHZQ!Gxy6TxMDQp!|~kY+$`Nts(WD{ zcweE?-Rt*ue_l_KO>;pu8kNT7ns~{O2Y%=#*Siw@lF=|Npc0w`~D{9e(YJuu&wHElPnXO+(wW84`tFz4hwF6emx<&C!x zX&_SVC&-l}8c(#3fS{20ScL{B1@iW>zCK|GgW(eKcb1kNx zi8Q>4a4doN`2SWg$2&`9T31I~Tc;QPtGDf`MQ^NGwYN&~x>3~e$lcpXLl1Sy1o-)C zrq+vZnr*BV)0za2F%6|25y!?G+_D{*P!v^5^R{Vm)t z&wZ9)-S#F04DV2dMn46YNdW7Qb$O}2AKB)M$vytzXznI@el^hjz@9;03c($5`P}=8 zX;i|VU=Vt2YO_V-71 zIocYoUqdiEo(QXf|D-*a;D<-YP%UZP{A)=%cyXzfP(b!|vQs8t^fY~^E~WQ!X@&DOI-1rT=41j2FaGXdpWBuXIWB&`lax=19{aZ}0P@1%dy~Pa#<80M)(G z+w^DAw{8x)d|M{2yt)4o-Gk2&HbN>xx3h)N76J+?0v2vx&t4+1J*~%;lTQK_cVt4K zZ@Vvj*G5jP-QWIa73}1g*EE@pVzT`ThIfhPQ^|J|z7!YwHaGYq^(t&fm=o?&&22Yd zjW(x|x_P|v?`&#h^k(``e%@4McF<`dFB)#4qn*#)K|1!@cjI#Uf12yvkdK$_l2O@r zxR!ot%pW)Q7LU5LRoY{{Z-ccst8QjD^Z3Dl@$)I?$0v72>m~F=Z^E|CXjs-420wam zD!q>CHpB84!E)$@h)aInkP)k7lm9LC}3?t z4+8y|xU3`b9tYkP9Ny+(Qjw>^93?1L8~F|lg_|)JMJy#6@!m^X(G_QU!%5WK+`M>- zILbEAniHlpLa45LnebPP6KI-4cS3`EYkRov$-7#1R^hex$H^rl(&;hx}wWt5`!> zfyKB68hB>Be3c5R&(?5;qo}*Ghn*M(oshC+(n$MLUF*+@N}SS3hDGx}h6Nq)BTCOI z-|c?te!`oLvVZ=t24U9x_rCvbxL%HoyEaaPDKT#&9Y@#`bAnhE-V=jxa8|EC@e`|r z)F_ND)r`CGqL(Bn(y}LP7~lVI#F1hkkGnoYh7~CV zR3G3@VaWVby^T~}e}i8#G3#$9#T<81eD0X>plSMl13Z|3YIct8x`oOUOSCbEz?}VF zzJrmYqJ1WcRzA$#Zfg3&6JvNGm*D}&{T7n;V!nxLpnKqh;RBPtHjXBWv&xKEzfPab;*Are=Q5pFuJV1&7_ z$0BDkj-dZNEv(ov0OKe~Lc&$p4Xu9`Mn zO~dN^kS-)rvfckYINn=aI&pMK1_+HYSd0YVNEA=wVN(oE9C84 z>rU{ZOfIm8bOt_FxNW{yAT%~Ineq+Acar-{a-;08kK5mywUdsYC=8(-?_50uKJ*7m z=a;#voT={h(T1|@a#V<*Nl@dt%;P0$-z^uC#Nn%MBhq+&{yk31Xy0yNsZ;T zjCTq?4ec;W29qelY8?Hv^DYh>8dtTXQbo824(VxLG-QD`{NYchaC{J}4b=6O@q$ zGz8Hf#shBpXjehd?tkm$xdmiAG$#!q^(WI}^4Y(at#Z}B8`z*Qbn8JKH;5%ssoO=~ zmFcj2J<~t&{BxUxS2eLb1vZjdgXyhD*$x{8rhz6=qAZ9DwVqIB-mif9X;+UBx(eCg zQO3ftIbD6GT69@s%XKl9_A~rZ({oVluU>W%jFX9DTCUBv#2U=wV;TpU8+?v(Vw0mR zJn(h(sUAe8hPol`)vd8!4``5f1fV51oPS;&f5`@xHvg?bJf+#lJ7PfbH$Qg2JpmpX z(4tuBwU)i1wxaU%M;Dj#3g6%ihQU*r#n)j8~ zR4(g>b$=4@eu~bX;e>wSnbCi;el&ObTfEdlZ32e!wVAq$rqnF4dik`Js4#{R4BPWr z*t{>V7Nvy9^h@CN5xMA)`>bCWIK92k()vfU2oqP?=kf8`Mtbjil7WdrZK4n2v;Kp` z{wD>MRiif|@@il>#c_Ey;`fmNZ4?3HxSx!NFr%(`wCIOXqE^*#uYPLq+EpOC&mMNd z4XkZZ34JwwkHNIny)M$>#rdP%Bv5PhM)M0QX)JkeI&<)IFY;`|3eCtx8K82 zu}62R28Qb!i%I4%(j)q-loBi+?;XCeo zQmNjWd3`cD;wWo!R~YaIoA*eQL(3}KALOSV62 z0!b}bMBf_OuP)DOh&;C<|5mYYA~D?KO7TQ_#RQoP4kV})a;)tBGcYD_^QVbQya^Cp z{za2XeG@Gd7GLI>1H)GeNJ!9#_Hcu=;ZV+Roi>z#(;V}3b@X7gu9;@x*Y(fL1RPrt+%Mh) zirdeLffK<_Y;zJ&xrMwxz^^#ZvHvVTd}0;+oR?*%;$gk*4#74wcIt^`aM)H3=d(yv z&+uZuxzCiR+hr+)fpv9Z_*$@(ER#+qHs-7)rvXEiCT(@TIJlYnm1Rd3N_0-6uKFk4W}i`wfT)+)@~o+LCpG&TF?tt}Re zA`GSfu%8LY5LvKd>|5^Cc_UGNum4r2P+(7=^7uc_I~qc#m1S&|pmEDD>1 zoQ^c&a}$h4)WL4cXRqolI!yWBj4s%DL0c0XrSq_8vT=oZ_4IxT6#j!^CL5IBP+>w#UM-b0i-*UPRogF&;$A5NUz+VR zQ6CJz{$1`r!f#Sxd=a$1R}@@GQ`KwRVifCdjYH5I8cS(+P$$Kw{?oK7jye5#qu{z9 zSy|e7!Awj0W!|mBDh+VE=8hjzC)B_I;`v>#<~AFPPA}k)^n7#9TfKD+la4muwKxP< zg-o2&CIZc zBm`}G^@HFaQ2X9&5Iu{7q}#&_yzk?Jm_5HqW_;4s2#Nb$ZNC|*B@D-uqvuj*79bM9 zjz|TV)WHMvtK&CKJjCHB^l)EwZ80qF?*f-eBgg~{ahq=cK$}wZQ!`#XRu={3KkzZ= z?yV@HHN1_94HMC671TCH5*iw=hcM4;TBdMDbV5mjf3$l4;A!oFzg5#+ApdcKT;0F-%wXGeMn-lHiLtI9lo+5oH5jmg^gAj5PH;K3xd+-V44p;s zVPf_m*#O_9$xF!r?pKU`y}n+HI3*jvF&kd}AswHVCYk_SgwDWdo8dlwS$ePTfMLE? zKYGcOX&bWb6F9rGyKmDq&~jFZC1D{$4bnp>JCAlaNg#8l?tt$psXD-yRP->)b4 z*i&^|UPw&jixKHZnWz1d%J9&+zoi^)EcrnAVH(lB(`TUR)#(b1WBC3R{=B8jR9M&I z9^8VX$(lTNfhrsY#lfJWcjp7J%~>zj-(WWwMu8kYr~xX#R}@sM1x8*aS{G?DMx5WX z7UhO=K(?JB$CDCr_V3}T_fSzlbXnulCWo*{7Db+odW@?NPrIR>d z9Xs$@U4aWiIaXub7?#1mi%+F8?mn-<6$%`(hsT-jkgwvIXtfnZ%ICkk-?HI9FFPm# zLzi9qhYtxq?)ZbRIC}hf+@Xw%SMOZS*C;*}XR*HHo?fm9Sxpeok!DDHz;w}YTLDp| zH|VpcKC+@!ZI{-RcW`><(G3l#YNEqLTn4IA6nIuW%`rcLo+Tza-V>QyojX-)yX>Ex zILs|{wO|OOKto;A9u+pa45K9;vGN zBi2o_#(>`{_2ZA@<;|N+>y?K~Zf_j?sCp%q*|6^Q_T{v@;$%rJ0k}j0)STPGl;VdM z+qw|7!&_v%Rr2xlHHdtx8$}z{zjK_L?CFlN%|?L|`-E7hTVrmH{agH3iyD$|@(?PQ z3oa)mByL9;H8TknG#v7d02>iz;^F3k>6mz&;7uHb=u}Ya(PwKoK-9!u&n)zH(-hLB zeLzGClBiafd9ghp=?Q{c?U0^GOM-WJ;-nXuZ;N&_?Ww9B_ z+&k5P8)dX;T*>`K-Dc(kCPB#sBT=Pa)N(8@3ed{?k`Q-j9Genq@is9gorMe4XjM$S zI4St(4xKFrz%W`INkR&58Ms4#72Uf?^nk|IsG(_Y6;KTnUtfR`f?sd3ZbRvuCCS@@ zotBZ`?BsQbgz8rt*}^$B!~xijGWzZ?OoO{+{q;5H`vg{fqiZ#Y>Nh5FUNu;sEaK-+ zs-I#ycqnftKtOK$sy%d=%E`D!y3OyK-r46KBl#hEAUGpg;!}Vi8Az};9UEuA21Lag zH8ARF9v?l~3)p#f9vqKTY-^IBk|6H_BcP@@F^PiPJ$Ag>^ge6)qKH!f=C&QvMkRWH<} z#c>APV}GpfK_ggLFJG4m(Ty_`08!z_GmcM>1}Z+O7zuH}o-e5@=)%+lCp)xh;bI-l zK_Yfz421x7mBBfnk0ClAR8eC5QgD-G~H?2RdUl=hEsH<1G zL~rLl&D}oGg2F&md{tJ(=I&8l1XP0SI z6~m1@Ys(mT|D8l@toJfrbS5 zxUghu8rAD#3LwgQJq1ueM2V=Q;4AOhzK8zkvKzW#r~{3Ns*KDrs9~eSK){fqjG_ zt={M+Qap5KW*TW2hEGaYJZljFM45kf@}kHw0k@h2Ki$7$FQxl(P(A|+2bgz^Q}E6- z;Sb-1d9Squ$G7`fAoB49xL9C&qx(9Zko;m-HI_B_XH>yHKsKWoeBbvkzXfLjANTP%;o9mY2(bm+xg^w*0YT4cv(Mue%~R~ z)jM!Er%-&QHy5YK=rp?9s!J( zXf=`62$omW`&2$L;TrimJnj)DW?u^i14}K~R8GG(MNDwfvJE?-t1aaNJc#%(_siS< zd{{zwK3C?7LlhByb1Ix??5t>TmeAq2Z^Sxi9yky!2iM0mav02ELr^49S;Gs}8nh4H zF$_=Xb-lwU|KDo0b!X(PERe0biWDu3l2=j)Jd3|* zEudT|TVoKzNn5+oipK-FxU`JaJ2ID!1U(h}bU3!~fB!OMNLf1w2wA9*E7q4k9Zox0 zCpXD3?HC$l*|tE~I;2S-O^1})qULv+4Lk6@*xmiYHg=R(KsYK^c((XbZd)zplI;#| z`O5wsSlv>CeIZT1p%Z=f0q!AP=4r)QlY+u@21JduWL(*G1{nOqfx_gM#|tZb{9i~~ z6t@@U5%R;GyIVCs3vtcO(GZa<2k2#e0>t^MH95EWV0Ay_TW27J?hl1GKZ2Vsq1Mh~ z5af{Q^#@e4GT$z(c6MU=0QkRe1khjnqQ#wVQXU7R!1)Jc81T$OD#JfzU9C7t5Y@^z zZKvKShwd6Yhx8*Do+17UFv6wOu1t#qZ4j6KurJU{nNK3Ynb0Okg5vXK1-(oE!3>Ga z;|+okz==X`uU_yq?an=6poHSvSUzQv%|)hrB-Bv&f7qUau*~#-^*<&fFrcLs>bjo` zCa`Tm`@%t>rG_3`bN*ufGrng58j+CV;nB%e-fYrz_)x@eO!(&U$Klu^PK<0@; zz3a2Yn1xzj{j2@6oVxU-K=&VxS?vzPBI7$GUty3S>6MpJJ3>7ivj^%1E^wi#YN55d%x8%Yb`f)L2iv8=B7Ri1F8%%fL+WP!O>Tw1%;tInH9GYaVX5|~?w z$)+D5dOI4G=&!QHjt7!Drp=tV!nIWw_b?qZA`A<%I+(a=Mx`mz(|h*xqs(aI=uRT) z%53Tq>j!IJk-LQFCAu%K&3nOZoZS4gWIb=7QcLJr5lP$QX{=@RtLJY(yr^W*lV@1L z4jKOdX*&*-6YKZUxqT@+Xm6gOJ2liK?w_H1yFe3dCX)vxuEjR5^xwIMq271Ta&hYm zJE*z_#5RBqXS-Y#3}E`xK4bJBeW^1CXZ!NH6uqaN5G+&eDU=)xLfB{;v`xap^rsj- z?RYZd@Q9Io>SG;DVY{^=8^TaK)7F)#m|uR0kEG4}_$24lSI(|{F%ju>bXdJ}|Lo^u zJRb9PY)uh#zm!Oe)odAOfWj=i@4eOc?M#Q`7n9(56mUZG+ z1TGo4mF<0i?*C$7WqCYh$&|Kp?BxB@#j|HOc?oQ^QnyP%l%?7HIkA$D;!~qrb6SZ8 z6q>}~$gj@jNIUmeu7BTv#Y*Bbi5>f$96-Me9UipZCo)AbLte@J^N?!%c31dQhCb$$ z{}jRS?=We<68M>sF1bag9e$R!+NvAI+gBL%c*PHTLLR4~fqR?pj&CByO|GGRG%zJp zxIcp|(A$TT*;^OTY`w@a*GgHcOzBEvL~;9AL?S*yyxvq|^9^spWbz_GhSlDiXsW-p zH)Wn;cp=^|c$|D!=JtzJGYtVG_ACvjCz;@M^d`O|a~dPa6p!sE60SpWnp-QlU~ zv5-j42h1oy?`kB+^Nk|D4#*dnCOE&hLw9`qtvQO-!2p3hkQPiX8C!#6b^V3NWr>0_ z=Vcmcxmn*`RaIPddledJxpySaH3u~NiqQFO)%+M~cvbgR&j^Z3d!v|O5*`PR<0~fS zbgV3ck6}=Ml0Xk~l(Adi%MBAgB`A*73peH}yp)0IK78pT7)TZyAfnQ8Apvnp4-g)R zVi=!9V`OX%Krz)zU9E}mDVrMwZaD0n(lKG zEQ=^kSWVoAiF$a~qPu9e(_}wM7tsL6IE>30#_aMKLrP327_!blcEGPL&;%}C?iq7?Q7A=^zo&T*L3i)6$svIqp2ffPc5%zv(V-dR2l zf#N*^SaU)91iUsa#-BTiT#yne?ty^4I09I?`FMVVk2G139Vy>=d2B!ednE&A{$np~ zGE=4cvFGkwl=ZiKl32qEleMq#8G}7#+e8hDS%E2nM{Nm~^$|G1kW7=UyM`cC;THM%A`htEJEqmyyM{MSP z$@u~LLfPwlQ6t^J_m9MPI9Bj^W*$z#3<>BSB3=T!}bBB$Hg3lR2Dtu(o5rNR{fUw_Z6WiXZ_**tqGv9bFX|0bbGqP6rS zt87aSyfznlvaM0vKyr3}#iEY?uaUj+?W=?5xD9zOT(fNIeAJFooEb5ywk1|rxvd|z zt#iVkG>Y)`!qDG@%iJRQOkw_-H-YaVo^Ow?06EI5=YT)F{B{62#*Fy;*K=)Pmd__y zpXXN!r3fd9DN$#f-b%f8pM3wY_Cf+wenIjM^Ixl2hNrvebx||^xVBk!F!*Sa0b^KB z9xPR4Bit`wq08gdj3xBTPf`12a>M$Kh*lxLK>Y9hA#Et{!oLNq1|CQ4njr?!CrI$; z1LdjxZXwGLt{>rWtT7?3^esW=s&Al+q+bl4pmf;Y2tBN<&UfWQHS|h8F5l+_=f5!0 z+$b{T2-Tu9Ro3~1b8|#JP^)1*xuTT1IoMLAlG_?ih0*uaD)%-Ic<9jn}CdEDZl^Ui1Z5x~s$uc){#3 zQ>K8)c547JW+vk5!WM+sbG)Vhn{i;?cqynPBoO8E0Cy+@T-l__%5z&CNx%Bg%s}ec)*(_6Up!KCB!x%RZxNl_x;(}y4QK%V)>B^7dipZ1rP~Fmw{7kKC*R-GR+fStwy$@FsxBh* zKc<-|H?qA#Rc)AgT{;i=PYW=P9QjrMajvf?#e`)%y^cMXB(M2GQcGw^MeVl2MfCwx zwn*1=3jDC4qJm6n$@QrWac$l^$Yd*e0@|}^->4Kuy`~R*aj`{8%aMKQbuFprG+U2| zih*ApipD!@P-bKJ0W#HMdCN~DZ^ME)<0Wd()!U&p5q4bb4-pRi!uVd7R(a(SQEfF*bP#5M{wTL09 z4UPj82@y^cwDuH@r24zQzu&AEHJYt`B0sXx1PoEs`{xjF0(TyqnguALnA9i0KNm`a z7oj6DhC0U#24GzTY_^6SwlTK7H-K=#{o|#83jJ2y%pHcvEs%PD`uoq6|Bt}))gMfm zrAN<3w5~)TP9D*<+b^yWE80fA0MoyvahLd<8C}YgcI3yFIMlNCPvyQ5kd>r$9qi?Q zVGP=Dti2z%^SN$!q~dX%vxYnjYY~Usb|bllHoa53R#LdzEr{xhlR{*Ec0*ZzgyPka z5X6qIg*m8j-jTv-Vx4cy(_$3aV%K{J8&zDS*O?&E+OQ@X2t%XI^NRdCm#z>D6tNn< z*E<%>aaClqkh-}2-o--GvP~=9J@G5V9hSvyq~$nPd64B+g;oynZ##Q9 z(~kG(SZDtIMleSAp>_$WQakWATP-tkKU(+c1 zLa=dV7lT&GR}Wt7ZNHtQ_4)IU6|SRb!KzPRitjZVNNVnn6b?Y2KfF>Gixmg@#|{UK z;Ov1-XUHM^r>xyqZ}{#X(Ur$Li69Ah8iU~&DD5)-e!P4Ffq!?NLMidw(kVOnFQi>W zIzz}IQr`3vp^c&BnbF(?u}4_V55$HIWgrSAwh5o`bL8u+?Hi4G?}qaVyvh1EjXo** zo)?B%pTsSWkikIIaKdFJ%Q9|+{Q2)U;(k?xx$PV(!CS*=a)cbHDwj4s@Uz6JjEX$q zK(ck@6M|jV4nZ}VoyI|g@gTzLZTb0V#NCNp9Xkwr#SR@XmSp(;JFKaTi9-U{U_s{O z`JW}Okpd%F3A3bT^Ixf?N4C8FAeq&FI{=F|4d<55KWra!&loUHEb5zW_Bp>{bBme|JOyV!7;SN zI|GzbIj2j`hDAao@`ho(kHPi=m!^wy-{6WbV(neB^Io42A4_+;kMzHz!xt#_M+s(5 zED5PBZ>tK$-+Kk>6y_{*{_p7F1(LxXOncz>dodG1?)QiCz#s`R&(Fw9fGa$5)dT4L zFUehBMu~u$d0J`2o<7CX#0|vB3TjyIxi>te_i93BZb{jhA;Qt=c?D&v!X3^s(kGLe z9xfky-k)8XZwgHi+~?3pb-f?vDqa#CGuUMx;Ah3SRu4H2RJt4Yz9_T79c}ccZknsv zo1;+0jcYwG7XP;8lNg|{>MNfdsbW|oYm%E0Frv!?`RsrA2bI_{@3od)HQr?VWqn3( z*e&M;KYN6D=e6~=;jfDC^F%05{S8pb#ot|l4Qg}KxY+5EJXy7Tsvt$Ju)xVR5OtUJ z-DB_x0XiteHUe{&UfaDYn-{H?>wo8>`R$Lcm?gH{e=5DrRS*E*?+H!E}%{hOVw?0!S-TgP)AbKS$>MIi&T~{?`?{M zi)cJ2++g+w=wQxz-xs>V3~}P}3&c0_3NqVQ{+q%y`N^@ToIsH8eA%iI%xN_nE5Q17 zTxBe0uN#Z+=YTi~98Nt#O;cQ~^{{soLl}bK59)~8n&;0iAO2teVCWS3^5n?;LUem8 z1xS4(BPcUaZem{)jb?-VxBjQMf0S3uo440Id!jlBG7|-$yh?i5F^zvzfCvM}CL2!C zACGN~As|j67-o&;FX1<^LMdpfR~e7%4%}(c-kjLMmk`lofDuBrAEkUc!?sO;bCdr` zks5P+giS}h$m|*ZpI=% zlpNGd9SjW(=_gRefa-~odF zlg@Wo*{Er_ukb2XAXJa2!EAV@Tz-)v>O}CMSAw)j{h9g;KiM3w39_$poV7A>r+@S4 zFmL&6fz@94LLAo=oe2MzimLAODH3A^$3BLNQp84PSk}B&Kz2*r zd#y-OIc@$-@U@3fY-ZROsOFc)+K@?qyBwlc=T2QishkO-uVIEKsql*DFOVK_P937) z&l@E+Xj!t+kz=LkCvqU3WiJ=iRxZCF5aJw0BMdArYK4P~q!pAn(-rw7q;!}a5q=x; z@d-D`SbxaNNmfHMUmx`P$xa@JmI{q-jT6|NGCtJF4m*NOKZea^P-}jfS>a9`|eNA%yW+?$(kONBO8OJImi4@oTwh~M-ZLY z*@IgBTn6In5aPB}c@y)`8Z{5XKjDaC9klU)%A$k*t146vkmb?41JG@J zbr9;>>jphj^Hfr=drHyDQ}_$PuZgUnuqVDW+wINrs4eH_s`V)4*~ypKY9bc`rl%To ze&CfKxv&BkqS;V!pkwyOQ)fvCE1sgXy(m*FF&}OyIdCeFF=3jG%jXEveDCTZG_sXI zI}vsYz=FMh|4yC z)2aheh<-xSqI660&N{hIUj@rKZK}Mx})zZA?yrtuGuy{ICfxv-ZjG zkZbc~z}RnQX-qNJa_48HJ=4ojCnEim{g*dC%sUifOBC?F?O2rB31FV@+_XgN zw1yPgD}txCm~mjLz+yn4^zN>cq^A{ohD&I>h&!ayeq`*+x)Ukt>ruPi1``f)%b{1H z<0=6Rzgw3Af^V|uFq;mH4sSeRSbcLzC3Lgs2)U&D=eZ~5)OD6NOLxQTA?UToAe;0! z2EtFH@`N$LvAkN4TFb){LkRF7hIt-MU5}!O{7`K<8XOjS1=wsq&-%W`d>9^=`A$a+XS!PVs zq)@EK<)zw2Jjm<%) zH|MYK-Nt|2FGUZ2))2M4wItf+hi+IXYf%6lyD z427L-IsVy_p!{kE2a0K!M~PdiI-kJY`=FW5NUem;!K&s4vJEE^jATtSvE%rX>T zy5%+J+YFab^tsn+_EY}HkvoW(A87KP+A=u1m=YbCJt`Wx^z;0>%>V3Q>m86{we7oy zrje(5`t1%ud$J2ElQPfIV=2eks==VlMsnv)`N8{Q`;Fgq$e07@MyH${c4W)Q?|EGG zbx8C&F|e}0$4O^`z;|lHJ*b??YF4{s!LO#(_C8>7#i!|*LNFB1;n-9<#i!+xI!NX6 z8m6i9d&JQZ`0%FT1!&qjED~$)njs$pCmf7tAH)GpO=G(*XhbCKv7YGsw9OBZFzp&d z=ImNUtmVJQ6Aro;ZY)F?t4T9+BFu}FxS#o|V0!}&j`F~<1Rod`c~EL=g>_qg(hCoC zxDD(3-(XEE!s-_60;`YQU4BRu%L{;I7by)X#qT>0geT?$9QOdiZxs2=L8?DKBI@@} zr!zV5y;N1*ZaY8o+An|oDCq6UL!Rg0^?iPa4Uo2Xxz3$h>#nJs(#{$HuT7vqWUHRufr_YroQZ?L6N5EpPt$o4>~ zC8|%RjH@(F*8LL|2pBFEQRr%VCL(gMl9!^|(#1p*^mlG!49qb{Fjm;JNPk`bbPbcb z`Q#^S$6ZKtM8vvSA$I9k^AdXK7Si*KMa7Z*o6Ljx*cNjlJ9vCW@yL{e6tv{%VzRX_h%;LwVg~h~Zuw$|`V&)eERRZTem8b zVOoE?yDcJeMxL91^iQOmg^vOE_3Np(L4lYwBjbeSxQp_C|M1bR7Xxyq3Mge|ckw-Z zSY>6!4Y>j1y?&-CBR!i=w1+hom-?(bEbJ=rYnq#b2vyNhetX>%XTk8k4+obU5x(IU zTFHf0KELk6vGB+F()xR18+*nDbsg}{?cei8?jr-NtOD*sCIj|Q&ng#ZT}V)+QPnR> zDX_~CFO%fiugJYR=2qz=@!T0lz6oBN;JRpTlv#;n326~!X&Et0D68GQx>}s%9*WKN zS^qDA+KoHq!JosfpH@rykZQyB=PYiL_H+7}JAIw$hRy|Eb1mbWDIXxu|efz?;~+JE^qRgfRWA;7V)ee z`%l3S5w#TpkLT7p#asG7u~*Jdp6jVxegW=MX7;h43Vtf|KB{^ev6Vou{c*Z-{nc|} z+fu_EI)nNeiBXq&b+J1!hE4K<*yNV#-LI$Ah>Y5QY?xN7KK0sozc%^n?oESElSUkx zP)e*!Sa_Y<oNcre_?fdS zR*=2sUEzb4(P`l+it9mz#k-nTo7XbeM&dnXVJ1|(Q`EJe)~4lvWsrQI&UO{NiI>6P zEJ zNZf|S@d4^afZVNz-znI}+5^Wzmm9LHzaRc6ezM?PZ_9qb(jWlEH4kaLvTvX##nB7I tiUe)HCdAA!1_mFkK=5?@|M|NNRMh|ulLYF{|_d8c!B@` literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/subset_sum_problem.assets/subset_sum_i_naive.png b/ru/docs/chapter_backtracking/subset_sum_problem.assets/subset_sum_i_naive.png new file mode 100644 index 0000000000000000000000000000000000000000..506312390b4aea2be7ab897680c55572750cbe73 GIT binary patch literal 27646 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/subset_sum_problem.assets/subset_sum_i_pruning.png b/ru/docs/chapter_backtracking/subset_sum_problem.assets/subset_sum_i_pruning.png new file mode 100644 index 0000000000000000000000000000000000000000..d7bf81894b553999f47f45e3f12f8e1de4397287 GIT binary patch literal 23893 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

      !Nn3H{pmyOq%+n~ljGu&1bcyq z0^Qi*V+)tCa+e6^;f*yHXu`pNNa*k139pyjtiX!xH`+3{6|gf zf4^oudlCa3V%O4ojbFG*fLy{)QNTxPLzG4Sy3$eoLfGM;L=cvra3Hs}5bYOjzQ14` zA|d<+*^1}lgClO!2+22{e__H>Yosu_jag^Yo&BFD%kn96ku_g&2ORK`Pp&&zwE4o_ zIX!qLCNFSdK4*oEIYS&B9D;a9X4gl+U)oY|x~WZ9Ootx(6Q)61BOrRp+EFqq%$!Ie zZ;VcdB$CfkMC=LpQG66NaV2!8xZmJFv`;kKV`Iq$BHc-Ck0I8BB{=DiZ;n>PY75dU zyyamG6E{?;gMbZUA*V0jpAY7IthuJxMU*YZ*_PD`XBjp+n=sm-rn9@ z9I8H6{3ZT!Tbo7wx|E1h^tXmI>sj0T`3b21gHlktmx2n*Gb(^)~iZK(P#o}kd*!+J>QUbCGFzB>PJhTddu za^CZj2uskt5hFFrQ7h_LtYV!indS+yx%3Y{eR@{!&UrFsNE7kLqgDXNCxv;Pj@Dxi zQ5$TWc)$NBE^`gP0SAO^;)^j5KvMqLx)gV@U$2PxwomgPf6^Rnb~cnV)p+s#snYHj zA?D`~=2E)gL%w8PV%jObN{>*EeBt+psCT10|8k%LVTj#cVwQz~^EpP9((kiR@#FT< z#?BMpP+o#O{IEFVH%TTS_i)?ceuXH8K(+DixTP4q zU~3So$s!3ocfkM!SKnrGnhtX8vq>661wP|PgC%@&kxDuYzHkH|lgamiaQ>~VJQDqK>oo>@{S;So>GD6J18eW@qlSJRz z9u3NUyfU|8E$*Wp;&5WyHZf~NS2o!Y6N>jHSEzsHdEqECw}4O0Eo1tB{|nIj0J>{^ zJXm+vI2ZqGiArwe9aRlQjNDUKwxuMm^IKY7O6mgsE0SB@_(ZG21HP@lM*pv`w~UMW ziTZ|TgYNF`kWN8ZKtMu7K%`SZrKNiTMFb?2ZWWM}?pive6p(JEyCv`Se_hXu=f!>R ztNqMx>deeJbLPxB-&s5~6YSIRCY?xPj#9vairC%6U>n*|jEk<_@fV;Z_Luomj*D0Fj2c^$wcXq8>+Y?PHuLS@QW|>&Jg4D=Qn#l ziXp3-AAU3SlnBL&--P>e%q%*ey*fadDS_(#kM%Q9AkEy z$DHft$##a(bQJV#SQD6-^AW>)mEXVUkd7|J^4X=9G6^&${)>8G23PxL&F604G68>Vr z1&a^?wdc*A7>3sGw+lhjaszn@O12mlc7joh4^W1Ds5uNgCz=~vpG+th<)7cS>qmX^ ziQ=EAM+;Cf3%4B6%j3!i!+Z7RzOHk4p}3kO5VtThtrurlSwUcX_stRytBb^ClBbcl zfa99;{+95%^ct*)IY#CA?%#Ln;sEDi-f3HUF)}-Tb%N0^-q}F`5%#lxh3{m;a9{;svo zW#aRhlFwEa;h#^XNO;8dY6~A_{OMV62@fbdcQ3dduGRRq@n-5y5aawa5#{=Xc&54Y zkNU2~hk^AL=$g*Tb>B=Z3LW)T{%YJsn#_cM78YcnKpe&>GJOp&Kx|l2!<37AYsYTw z(i3w1EaQnxmZVSa&;I-Y$v}bVXwA!sPuv%3dAE(gqNiCemY@cX$q~@WolQSptS3^5y$;pu9#PS{ zo6ng(ewF5?HNg0JJ7c`ceT)F*Wnb^Zk_nU#7{B1s<% zCuor%SyWKE42@k{IDMj4qX`8PE511{SLV$)$H|lKi+IWdZFMK}GRny^xPom+u>MS4 z(^>lW8qc4p9m0=D!PSM4xowZo!*Gq*qz?1vhvs(W)Mi*u>i86?N$K)u8y^pA;moYL zbMIL@ydlI1iiO6D*0hRQIo_nFMOaa=liwLjdA0tFi9b%GLbLSs_vNWAvZ}(u6JOIO zFCy&DC;|H_oM0PQl9fG;8HNxx-D*ibpD>Q5EHd8sb?GF*0d9zQV zEPp4f+nhA(6;jO+H-k)Qe07f#&iMef_O7|{mW}-H+lt!Ys{Gp9NIEstB=d+cgb$cD zv?R!d!TklfT~90QY2Q?|n#d)|_nnZ=@xi;JlkB-~9yd6RQWmphM*Y2BID$GJe&)13 z4$5bVNSX>8aqtneFkg*DvOZaIZg6^9xE>Bqf4c0mR5}+GXXuV1dr#Zm%CY@uztTY$ z%D0lP+!hh=o8&egD<@dBEpDENS5u9#zRUb?!x55@SUfza-0Zed1|=|90(Y;pdWcBf z6TTfIqJY3!ymNoc9vW>Q#MHUJBs70=!>s$(>dQ@PRa?;uujee;gmH6C@rtvabGhsU zlGysEg1E+nB^?g3fW3*Ye#AvE4eSbU`(n^Y?hJ3-KL1_R7 zKwX+Gm`4M*BdkF7gS;HWlktn^$M;8h2l$zTux@yW)`4j$eo#3Gp(RA|!IC)|Jht4< zD(#IBScWLaQQ$;D_EGF9+@Vg9_8DbaQ4=vG>a(_(UdF1SYXK3)IY3<{t6Jksk4sbYw6KMzRFNVBGv@ z-+IyO9rDX_BWO(P^sOZ>vH1NIPp^ljAm1VTFqjx7^8l*9)lDf>0I{fk>Tn;lU;*=J z`C{;87OGv3%K8(72O?xZ#HJpO%D-tYbHhm9CY*1P48WZU+xI)6CSKQ)mSg~c57*ARt^ z{gM%oR>){x`!}Pl$COFm7ATP0MTrDctS5dpf;Z8tf6+)S>&lmSgwm?@Ly%MzL@$If zk7U0E+lm&l;YX=31g(o7-Nd`l#d;DWF}hEqVx89( z(~w?!r-KKHx$%Dhg`6;}|3Jw%v5zb|5O77lt4#)`-M z{u+K(H1wAtMwN2Bb%PEBNMVpe!fC&)Iw6U`qzRs;s+MVUX-IJ)FU26aMY4D-A?OzX zvs@aG5#h*<- zT`A4e#|g~iAd@N_Unou)gNlpGNSG``K{Km8R4A(%Q-m6c?-iu*h5^QPhb-8cz(Rx0 zUD*5R;N-%S-S){`w6c1~EJ*_%(#90`-7duY;$|5x8E0iH>iV(GOV31mJNU+KX+u#0I*s32BWT9HMA>llT zv2}h6|5n=HoFK4@Fq$&-TT@{@hsAf30R(}CD#`EJPA?49iWHW?bTO3=CrA-IXG;e6 z-w#7mr&@{PliS*21n*tiKN`7YuIp=c%>Veq57gyDlIify#`nO(0|UR7uZPY6)JtLz zI|M5{#0`yWxZ&7gXCBbR{TNh3DD+dhZRKezY;0YIv9u6%x4;{o5D3bS z-v)V;ec{Atqj@n5D_nWkrERfw!t&YZ>2DHUXJyHSvBn;Q%vtVdike z?r@r*#B=a?6dOA>(s;9V5x=BH@eaSEg$;C$@^J&6|=1@K9`t(c;-Rsvj5dp5c;M(XhXl0{S(^#S1UB|$oBaox#>NwYZLHl z_=*Wi{0BRDP~?Gx6Q!@hC99=E=cxpo@Tw#Yg7gze8TisG2@Zc2c`>e-$LnJLl19ZH z%b3Pr2MejOz;A|MquLS=qz2k;(vyBPhM(MY1!nNiVp0706!BS7gv5pEPN+508ru2i zzKG7Np~c|4$6no5%d3Ld$Z1J#zfH&pk^SCjW^kI%$3Kf)+?bEnU_-Op~>?>s5@UN1&g?H;`6FNkV>odp+m-`vwWCErwBeQaxW0e^w zdxfqV1RMupBjVj)`H=ISU7E(9VuFxtPhU*$wYy=b-YZ+eK>(S)G#Km~1mmUvk^&I! z28jV9xi}y6cTeBx5d(NFHsT2L!r;1#k~-c^8Y`Rd3F8#X5MnSPjBO2CK8~j4?qNd0 z6`S84hC4m4cy-fsYqw{TM%R@fw5>*b_lEh|9X5z~a%4t-j_uj)Z3~-6WEx40^$J{e zvq0F)5b?4{*2g#??r7p<7Ql18q#pZvm^w42JD>jsCKl(`mG!QEFP-NFWJ+R$o~F1+ zVI9%tzNO)NYg>QACtAz}s7V47C7RBB6pQLDy9H-&jDUd9Rj@g?^So_h(2nG_M$gbSC*!Bxn>gyUhMg& z2yvNd1hRp%8te|+;_RQs>I@ll$S55j{ZJAkIZR}{%7yrj>5V5~Of)R%Z3f2@mu~cF zMqDl5C1>han48UKuZ+O1W4HR(A|i4SWKkZwcZQm{lM2%7I9K`fOJ_{*vOM_`j*_Vx|C%$R55|Ta&>U+B2cYNad>sKN4&pKV+RTf$;e!*pRDJWxa zB0@zy;lbNhW4*H^c28zGM^jmdmhwqNlG;+kYi%Qv=p?30jM|FYW=!PUT-)2f^v|7% zNRim6bxTs0(IO%Uuu5^9wJD}|m~w1R)fd(Rc~y(tUB?PlSf8qda{BS(#UQE%Y4Hre z$5N##P>i2{Nf$~h95)ux-&WR=jUUn1#RGqLSz(z`%^)JKCRA^ zVGn_K2U)>!Mgtr|#;t|wSv-}amNbcBjvN}fIE~a8`ESrJUc1EyB||Wm@{8fGDDSj6 zO_JUgSau@v$LyGWq_9=MzycB7hc7>kn>{_V?~jII4Llc(lrveyEBML1+#lOdTG)$V z(4Tw9j~$4FMlCjDKF8)>5n`q9pse<0Ys8!cWzzQkMMprE|IEBw1~qS6i*oV|2eShZ z#MYeRlw)auo@4XOnV4_%tw*_NkMauFM+9#GG325{DqD@?&ZljJYA!hoCqB3{vKYJQ zC%Pc)FmaBMAcRb2inoj#0)e`V4m^Z&?acQa%&G+e_#(af-bfWuM!0oObB z(%0oIhtWM#;_1)wL??s7Oz`TDO727z(Oj+iUPvxUP()r!IbTmq;b);Gd_taJ^)KAj z2BQ9ALL#q!vJZsm;l@1|68-eP`ke@-O|&IT0e^ct1YLD+`&l7#uVvd3(H`(?9RI09 z%cp`Ziy(A2$8jIjwvUD?r(B<1-i!jp6Nhv}tv(?Z8^mb^Jv zJY%=8fLKH;A#(BO?_o>?SzdV5n>x&=I&VxqVt4lA&xoVk>x5L9t?V}+OrI%8z_YEX zJ6N~r!HI_N9BuY+;K6BnBKH%97&`q2(z7SBP7s4y0U{ihXF zjr?N#5V-uf7*<6z%{k2Ia2glEzxyhJUC;XW)_r%nlD^psF^aOF!*Z59fTdR^< zz*0WHQ(QDM&s#{&ZDXx`Et12h`O1CVMqAf#(mO0KL6h8nQgzC^PQ;bOO$UA!|Ardo z;?G9~lIAamkA`R7>pPPfwl!MkX2n8omzBO8dpgS$9XmK*_1J_G{IrlV-|>?1WQVBS z8TySNwf!Vk@ZFGZ?>+wZhceaNv4Q-NG@C-czw6o(jD+fLq;c7z)u^#bbxpGEj5oEs zL$LiahuevN%kuVctbGrA?{z#jQ?G$^6AO@Z#kvr~$t<<)^>>6<38H;$`<_lRLoH5Povm=Eh=w&$5;U@(g&L#1b6&P8_HGf<+2Z;BG zZF;Fzo2aN?bQ5qyD_LIcCBFs-tvyDzR^10J97d$MmD#ONS{v5tpSLx&EAfC{C3q_i z{yQXYU9+e7?)RFfM!W*U?`mYOePw;Y%?>!`5t`pEqsnZix7Ynec_j>=tp&5_`=O1~ z2c_&{#^50+Qv5rugBseCs`V6V`7 zl1!QygzU27x|#a3=e*1m7y00s6ChkcmF6YS>&@{=Lbi77qTX$-{*hsWZP~%I=Y*ZC zR1ydAP?1z7LLdM)sx~bHi&f_GWNV_QXD=vdi|wX5D77>BF{}G9?3;#iq}cSP(t6bU zXEQy?zmShlqrgCXy4K&KvbT%=pvhaI6ul=d6q?6#8^%+pmC;qPWal!q7({Y{NiU>Q zVe$r%ZUe`n>!s9puM;xpesO{utjt94zjlr9=!i%&N~&rGKc@9#YF*m9y^C>v*?JqO z2`!`Wy9n-vr#@Bgqk?IFN1eUFgj(DEP)-m5%v@yyR4Ji>rSka(SO`TFA4Sfy8dZh+ z{qZS|{_j4M4^zC5&L?3m zfv;oXCFN(Oh8UXifk92>Cj04jhI5^UfAh%&Uc%a<)Gbrgb$gl_`&&y+gOgII*8y`+ zh#3s=!-3FbasKxztTGs@0fkVAHV!AAnbtG5lz1O1>C4&_x*JrJ%j~bCxHVcecOvp> zgyf0HtWiM8XwQ)W~t`CBJ5TMP_OAjN4wTXY~ zC+u?u%-Y`XY}$7p#;JcmgKD`p(F37Rq$=f8ZhbnVl&usFv?d9EtG3DuOG%)DZ$S?4 zLyCc|hf5zQbK(xAPF^)3w}bem5R&`g(-?C3AS~ny9U>1&tqzj^U#-Ff}s7yXgAiXjlchsrnWn z-xgB1BMCu=zaGAU33UYywSNL_3VDMP3Hv%JF~@I}Cug2~!^qwtn5zl@mBSY`7%H4rf zyIX1|M|*6aKLNk3!AqLDocu*07&r23D2wo*anWm9XZ5GJp!!@Zj zhPNs*g!>?-R_Q1fZ4GVO%dK(BWbqKNZ-mHeIOV@x`7;*EDdr?G&eoa(JBNHwzqM?q zwE64yBa)q|CwQo+dQJMml}eR6SvVq*%7(&oPBY|1Bj81m~B#YL{`b7gL74| zNwQYbN4}P6fY&{&=Dgs}iwnU2mBM0b>!%5r{2UCWKXVznk5iIy392Grzb|t5x*u3$ znS|A=wxq6P!VRuPw|4}fzgUYulvxG5roXM@$QC7O*qygXRjIEhMRIPjUD1OfPS8kNX-_I3`uXPo_cw_8 zaZ6+y`MW6mirtWRG<`03gA`z7OWyg+SfA)`+>UiEys3(-_gCE`4ByTZVJl7dCk?VJ=rVx-AUR&%AJ)|0h%Athyt;n>%4Ng}Yx zb=_^OqU+n%UA6Yee1#BFjNyjilwYhBjZ-eJr3ugOXmRql|GFO~&D;oO&H^9ZL^43{ z=}jSBoAMPNE{0eaN;oK~mgKa3cyn=i65lrN{6n};@E`6nu8|j}+wC)a9Imf7VIrSd z5A3{;0JCN=Hs-6T0nFu9F!7o`vjaU5J5Djyia-8y%wkRTeWB&ox zinRNmx?)J)S)X6Uknl{2JmuchW4CK$-!>j1ir#`*wY<3|CCOC7)?5n2c<--vAYx!x zBw+Dfw+}L@878;7@K;iztdV~-n5ET6o*ZIu)dvhrpd)ku5sjj<>wC(;FsY~kw2P0z zH|ZCj8kB54hqx@cu6D6<)l%*y9lYSrH*E1U!l@|Jk~j9>v(ba@e`I?KZ{0Cf(3?GsKLIY+Cqmj?ViT7XVXZ{Wygrq7E^G{uFbC;M-%Jp?Y;+kY; z$r+e){-+I^{b^`FEV@BL&I-s1;oNj#-c~V9X%xdzL9f8B*8C$z=!zUVaOG2jukw1@ zAIogkssRAKMSQV;Own%M$8Yhr4#OShE*rlLijxuyJY0(z!Oh+yLd4oxQdP!0iunA` z87?3O*r^{OCVFr7>oJ-DbHZEH7dT{8B9q2ePq5AVqo!UFEFqHXOqp=#5p@q z^D0|LfPEnN+)NsU>!+4z8ixA)l80X0gq+@fD=8?F*Z@B;{=sK^ajf&Bvoj?pus`90 z4ykMYtP^q+zk-Y25U66k)UYIeUA~va z2V=Hn*>~ETl_prd`&|7i9%3CA3;NJF$#iLGu_y5SX6XByHmNFWrp9y8TDND%&{!-~ z3psMTxoQA@*Bb2qO&|rx22vz?(pKy%(MGc}OD4AfbTp(-U_LI}`6q@qK0}I@3GYU_ z%)c;g;MOg}QTo_XZ(;iz{|d%J;e%YaUX6sCHrB@<05hwBi zi5ky!b3Ffk$npv8lhRK5Q328G$nN6Y($rr0|1Y3(mF$hFZMsIfwMY4oG=Ot)V+k2@x-gAAH5ryHvs-x^woXy zuY;y+6`%4_BVxmPHa`!8d2&f45u~hncCh;^Jrn18x6z_1IDefPfp%YgDDg>yA`gW$ zJ6zlug5Y9#XTu=Lf_G>Je|gS7CYd%~B>)H5K+L_ANLX@@6e5U%gxrK4PWU)*{MmX* zE>*tlzhl1r)&PDrZX`nm#|7Km@0g}dOB8?ga~vcDl+H_6yH`SBQWX|(>Kry$U7YO7 z3&Sa~3L`*{Ax_gUw39hZpB;qRWCku;*4StUV<*PR;N>yr72U~1w7BmjTuulT_HEUb zn5prZA9TFurGb31mx)@Is!}R~ct3b&^8fh)WOoHdtZ+9y4|E?mf+_C25ONxUAxs^G zzuNFo7X9@@IV3=C5zZx=63~!smwNGh^E(@V!2Rv&NAGv;Rz0>K-VwgNxo_tx=<)tn zOkXD?-#Nua!Vl`inE+m6Q|I)cBfR#%N8i7Qq4LawBKbL^@8_i5KYdD<@K*LLgc)J? z?GXdgoBLo$zKr3|(9b7wSu8Fst}cm=d15e3Oa$VQC{o2iu*>U6*8qWuum!ENo6U6u zsH@AxhPLq$)j6T)zX}=C(QcIPcgW11rHz|ZPw{hls-si4zb<97dG~Z=@I9-$P&nU8EJUo3xm{L>GZhzPHcpW>;qmlPEd|&~R;>-M zofP;ONI?Hx1`VO{_4I+`_=B7;%B>SwlhHl`oIkV~#)9R~zd|-#xKqT2EW3wSRymdi zn^G`xnnZWF&Wy+Gi!CmNNP&(KOY9~smfHHc7tMLpJ1FsuCBg`sdx3r`Zck@|uhE81 zZf}Lb*CBFvKF%LABPK+Tv5YXZ)|lW}!~J!VpmRRqrpuZOA%d25@tb5*FJWtw;83ej z)rbITX=h@u?pOQ8c}&5QTc$9Fk`!_58Z=htZCJ(b-4T5Ob(u;*%O<{4Eq1d?!FqAH zz9g~Kl1mYwk}3}(k;2G6__C1Zp*?Ct-}Bvran*Hu+fysPw2N}=Bp7i)h`YKWwV0Up z!2%cmL8$L$w$ogRLi2~9M$_%b<+*$}@dWTBi*ydC`M5R%dyqi~54blDB$y|k0)AgB z!?TwH7Dv%bLkCwDFxI7aCI$Qa(0dEum+dY-SqQscpVW*oQAO}RIkY)f;$?Mo@6bDjw(i{E+Xh ze6z^XK_k5yBR=v?O`AEnbq>N$TLtO0x-J z&|yQH-;*0d(q_T#Sv&M}EVF%4q=Z! zgY%qAJ-96qG$cy0(sZ$JkCM5p#EKI_lbr(7eiLNu1n_jllwbMKYCB3l=*dmb;}=+c zbo}>Ql+3k_o?~`O9^Ab|ub^F&V?Q6Vp`9m�rV9;q8bP}MjA&3qhN&ZhiA=uEY7 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%0DP_60D>l7isNF_&NNxt5R z64Q4KeJMHDGnQA8;PD0dPb}ghc7PWngToM^UjMD}{pS1k9-8QUvrO@}C)zh5Dbsn$ zyS0kl_WPn&pMQp}j)BsvY-m3vzu+A*RdpS=k&769Pba}+Uxd)H|Hs<)zLMGGtEuRb z&Zkz^D-e+)hw5pPQ#hG*lsc_qwnx6kFG8Xv&-(*$^6gXgd26^SFm!QBWSFVwjVjA- zN>e3!WqdkjueUQfBuC?tFq-CEp`*di*2M19Xm+} z|FmM&7AL62_r#b{uryJE(-utE@s*zfNtS(uU)+d`m=%UQ7tLQzXg0v^ZrBSfY0|sXME{_wTG~jXGph&5_ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/subset_sum_problem.assets/subset_sum_ii_repeat.png b/ru/docs/chapter_backtracking/subset_sum_problem.assets/subset_sum_ii_repeat.png new file mode 100644 index 0000000000000000000000000000000000000000..0136aad90acac4b15670b94b048307b0ccdba416 GIT binary patch literal 14110 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 P$Etcu>t@jnY{>rsiUF4C literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_backtracking/subset_sum_problem.md b/ru/docs/chapter_backtracking/subset_sum_problem.md new file mode 100644 index 000000000..5cffdc38c --- /dev/null +++ b/ru/docs/chapter_backtracking/subset_sum_problem.md @@ -0,0 +1,95 @@ +# Задача о сумме подмножеств + +## Случай без повторяющихся элементов + +!!! question + + Дан массив положительных целых чисел `nums` и целое положительное значение `target` . Найдите все возможные комбинации, сумма элементов которых равна `target` . Во входном массиве нет повторяющихся элементов, и каждый элемент можно выбирать неограниченное число раз. Верните эти комбинации в виде списка; в результате не должно быть повторяющихся комбинаций. + +Например, для входного множества $\{3, 4, 5\}$ и целевого значения $9$ решениями будут $\{3, 3, 3\}$ и $\{4, 5\}$ . При этом нужно обратить внимание на два обстоятельства. + +- Элементы входного множества можно выбирать повторно неограниченное число раз. +- Подмножество не различает порядок элементов, поэтому $\{4, 5\}$ и $\{5, 4\}$ считаются одним и тем же подмножеством. + +### Отталкиваемся от решения задачи о перестановках + +Как и в задаче о перестановках, можно представлять построение подмножеств как результат последовательности выборов и во время выбора динамически обновлять "сумму элементов"; когда эта сумма становится равной `target` , соответствующее подмножество записывается в список результатов. + +Однако в отличие от задачи о перестановках **в этой задаче элементы множества можно выбирать неограниченное число раз**, поэтому нам не нужен булев список `selected` для записи того, был ли выбран элемент. Можно слегка изменить код для перестановок и получить первоначальную версию решения: + +```src +[file]{subset_sum_i_naive}-[class]{}-[func]{subset_sum_i_naive} +``` + +Если подать на этот код массив $[3, 4, 5]$ и целевое значение $9$ , то на выходе мы получим $[3, 3, 3], [4, 5], [5, 4]$ . **Хотя все подмножества с суммой $9$ успешно найдены, среди них все же присутствуют дубликаты: $[4, 5]$ и $[5, 4]$** . + +Причина в том, что процесс поиска различает порядок выбора, тогда как для подмножеств порядок не важен. Как показано на рисунке ниже, сначала выбрать $4$ , а затем $5$ , и сначала выбрать $5$ , а затем $4$ - это разные ветви поиска, но им соответствует одно и то же подмножество. + +![Поиск подмножеств и обрезка по выходу за границу](subset_sum_problem.assets/subset_sum_i_naive.png) + +Чтобы убрать повторяющиеся подмножества, **одна из прямых идей - удалить дубликаты уже из итогового списка результатов**. Но это решение малоэффективно по двум причинам. + +- Когда массив содержит много элементов, а особенно когда `target` велик, процесс поиска порождает огромное число повторяющихся подмножеств. +- Сравнение подмножеств (то есть массивов) само по себе довольно затратно: сначала приходится сортировать массивы, а затем поэлементно сравнивать их. + +### Обрезка повторяющихся подмножеств + +**Поэтому стоит выполнять устранение дубликатов прямо во время поиска, с помощью обрезки**. Посмотрите на рисунок ниже: повторяющиеся подмножества возникают тогда, когда элементы массива выбираются в разном порядке, например так. + +1. Если в первом и втором раундах выбрать соответственно $3$ и $4$ , то будут сгенерированы все подмножества, содержащие эти два элемента, и их можно обозначить как $[3, 4, \dots]$ . +2. После этого, если в первом раунде выбрать $4$ , **то во втором раунде нужно пропустить $3$** , потому что подмножества $[4, 3, \dots]$ полностью дублируют подмножества, уже построенные на шаге `1.` . + +Во время поиска выборы на каждом уровне пробуются по одному слева направо, поэтому чем правее ветвь, тем больше ветвей оказывается отсечено. + +1. В первых двух раундах выбираются $3$ и $5$ , что дает подмножества $[3, 5, \dots]$ . +2. В первых двух раундах выбираются $4$ и $5$ , что дает подмножества $[4, 5, \dots]$ . +3. Если же в первом раунде выбрать $5$ , **то во втором раунде нужно пропустить $3$ и $4$** , потому что подмножества $[5, 3, \dots]$ и $[5, 4, \dots]$ полностью дублируют случаи, описанные в шагах `1.` и `2.` . + +![Повторяющиеся подмножества из-за разного порядка выбора](subset_sum_problem.assets/subset_sum_i_pruning.png) + +В общем виде, если входной массив имеет вид $[x_1, x_2, \dots, x_n]$ , а последовательность выборов в ходе поиска равна $[x_{i_1}, x_{i_2}, \dots, x_{i_m}]$ , то она должна удовлетворять условию $i_1 \leq i_2 \leq \dots \leq i_m$ ; **все последовательности выборов, не удовлетворяющие этому условию, приводят к дубликатам и должны отсекаться**. + +### Реализация кода + +Чтобы реализовать такую обрезку, инициализируем переменную `start` , которая будет указывать начальную точку обхода. **После выбора элемента $x_i$ следующий раунд начинается с индекса $i$**. Благодаря этому последовательность выборов всегда удовлетворяет условию $i_1 \leq i_2 \leq \dots \leq i_m$ , а значит, каждое подмножество создается только один раз. + +Помимо этого, мы внесем в код еще два улучшения. + +- Перед началом поиска отсортируем массив `nums` . Тогда при обходе всех вариантов **можно сразу прервать цикл, как только сумма подмножества превысит `target`** , потому что все последующие элементы будут еще больше и их сумма тоже превысит `target` . +- Откажемся от отдельной переменной суммы `total` и **будем учитывать сумму через вычитание из `target`** ; когда `target` станет равным $0$ , решение фиксируется. + +```src +[file]{subset_sum_i}-[class]{}-[func]{subset_sum_i} +``` + +На рисунке ниже показан полный процесс backtracking для массива $[3, 4, 5]$ и целевого значения $9$ . + +![Процесс backtracking для задачи о сумме подмножеств I](subset_sum_problem.assets/subset_sum_i.png) + +## Учет повторяющихся элементов + +!!! question + + Дан массив положительных целых чисел `nums` и целое положительное значение `target` . Найдите все возможные комбинации, сумма элементов которых равна `target` . **Во входном массиве могут присутствовать повторяющиеся элементы, и каждый элемент разрешено выбирать только один раз**. Верните эти комбинации в виде списка; в результате не должно быть повторяющихся комбинаций. + +По сравнению с предыдущей задачей **во входном массиве теперь могут присутствовать повторяющиеся элементы**, и это создает новую проблему. Например, если дан массив $[4, \hat{4}, 5]$ и целевое значение $9$ , то существующий код вернет результат $[4, 5], [\hat{4}, 5]$ , то есть с повторяющимся подмножеством. + +**Причина появления дублей в том, что равные элементы выбираются несколько раз в одном и том же раунде**. На рисунке ниже в первом раунде существует три варианта выбора, и два из них равны $4$ ; из-за этого появляются две дублирующиеся ветви поиска и, соответственно, повторяющиеся подмножества. Точно так же два элемента $4$ во втором раунде тоже порождают дубликаты. + +![Повторяющиеся подмножества из-за равных элементов](subset_sum_problem.assets/subset_sum_ii_repeat.png) + +### Обрезка равных элементов + +Чтобы решить эту проблему, **нужно ограничить выбор равных элементов так, чтобы в каждом раунде каждый из них выбирался только один раз**. Реализуется это довольно изящно: поскольку массив отсортирован, равные элементы стоят рядом. Значит, если в текущем раунде текущий элемент равен соседнему слева, то этот вариант уже был рассмотрен, и текущий элемент нужно пропустить. + +Одновременно **по условию этой задачи каждый элемент массива можно выбрать только один раз**. К счастью, это ограничение тоже можно реализовать через переменную `start` : после выбора элемента $x_i$ следующий раунд начинается с индекса $i + 1$ . Так мы одновременно убираем повторяющиеся подмножества и исключаем повторный выбор одного и того же элемента. + +### Реализация кода + +```src +[file]{subset_sum_ii}-[class]{}-[func]{subset_sum_ii} +``` + +На рисунке ниже показан процесс backtracking для массива $[4, 4, 5]$ и целевого значения $9$ . В нем используются четыре вида обрезки. Попробуйте сопоставить рисунок с комментариями в коде, чтобы понять полный процесс поиска и то, как работает каждый тип обрезки. + +![Процесс backtracking для задачи о сумме подмножеств II](subset_sum_problem.assets/subset_sum_ii.png) diff --git a/ru/docs/chapter_backtracking/summary.md b/ru/docs/chapter_backtracking/summary.md new file mode 100644 index 000000000..d2e13c84c --- /dev/null +++ b/ru/docs/chapter_backtracking/summary.md @@ -0,0 +1,23 @@ +# Резюме + +### Ключевые выводы + +- Алгоритм поиска с возвратом по своей сути является методом полного перебора: он ищет решения путем обхода пространства решений в глубину. Во время поиска он фиксирует решения, удовлетворяющие условиям, пока не найдет все такие решения или пока обход не завершится. +- Процесс backtracking состоит из двух частей: попытки и отката. Он с помощью поиска в глубину пробует разные варианты выбора; когда встречается состояние, не удовлетворяющее ограничениям, алгоритм отменяет предыдущий выбор, возвращается к прошлому состоянию и продолжает пробовать другие варианты. Попытка и откат являются двумя противоположными по направлению действиями. +- Задачи backtracking обычно содержат несколько ограничений, которые можно использовать для обрезки. Обрезка позволяет заранее завершать ненужные ветви поиска и тем самым значительно повышать эффективность. +- Алгоритм backtracking в первую очередь применяется для решения поисковых задач и задач с ограничениями. Задачи комбинаторной оптимизации тоже можно решать с его помощью, но для них часто существуют более эффективные или более подходящие методы. +- Задача о перестановках нацелена на поиск всех возможных перестановок элементов данного множества. Мы используем массив для записи того, был ли выбран каждый элемент, и отсекаем ветви, где один и тот же элемент выбирается повторно, чтобы гарантировать однократный выбор каждого элемента. +- В задаче о перестановках, если во множестве присутствуют повторяющиеся элементы, в итоговом результате возникнут повторяющиеся перестановки. Поэтому нужно ограничить выбор равных элементов так, чтобы в каждом раунде каждый из них выбирался только один раз; обычно это реализуется с помощью хеш-множества. +- Цель задачи о сумме подмножеств - найти все подмножества данного множества, сумма которых равна целевому значению. В множестве порядок элементов не важен, однако процесс поиска порождает результаты во всех возможных порядках, из-за чего появляются повторяющиеся подмножества. Поэтому перед запуском backtracking мы сортируем данные и вводим переменную, указывающую начальную точку обхода в каждом раунде, чтобы отсечь ветви, создающие дубликаты. +- В задаче о сумме подмножеств равные элементы массива также порождают повторяющиеся множества. При наличии предварительной сортировки их можно отсекать, проверяя равенство соседних элементов, и тем самым гарантировать, что в каждом раунде равные элементы будут выбираться только один раз. +- Задача о $n$ ферзях состоит в поиске способов разместить $n$ ферзей на доске размера $n \times n$ так, чтобы никакие два ферзя не атаковали друг друга. Ограничения этой задачи включают строки, столбцы, главные диагонали и побочные диагонали. Чтобы выполнить ограничение по строкам, используется построчная стратегия размещения, гарантирующая по одному ферзю в каждой строке. +- Обработка ограничений по столбцам и диагоналям устроена похожим образом. Для ограничения по столбцам используется массив, фиксирующий наличие ферзя в каждом столбце. Для диагоналей используются два массива, записывающие наличие ферзей на главных и побочных диагоналях. Основная сложность здесь состоит в том, чтобы найти закономерность индексов строк и столбцов клеток, лежащих на одной и той же главной или побочной диагонали. + +### Q & A + +**Q**: Как понять связь между поиском с возвратом и рекурсией? + +В целом backtracking - это скорее "алгоритмическая стратегия", а рекурсия больше похожа на "инструмент". + +- Алгоритмы поиска с возвратом обычно реализуются на основе рекурсии. Однако backtracking - это лишь один из вариантов применения рекурсии, а именно ее использование в поисковых задачах. +- Структура рекурсии отражает парадигму разбиения на подзадачи и часто применяется для решения задач divide and conquer, backtracking, динамического программирования (мемоизированной рекурсии) и других подобных задач. diff --git a/ru/docs/chapter_computational_complexity/index.md b/ru/docs/chapter_computational_complexity/index.md new file mode 100644 index 000000000..b4f1cd83c --- /dev/null +++ b/ru/docs/chapter_computational_complexity/index.md @@ -0,0 +1,9 @@ +# Анализ сложности + +![Анализ сложности](../assets/covers/chapter_complexity_analysis.jpg) + +!!! abstract + + Анализ сложности подобен пространственно-временному проводнику в огромной вселенной алгоритмов. + + Он ведет нас вглубь двух измерений - времени и пространства, помогая искать более изящные решения. diff --git a/ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/iteration.png b/ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/iteration.png new file mode 100644 index 0000000000000000000000000000000000000000..8d0f7980622f9e99b772104ebdc6f35d76281f1c GIT binary patch literal 6283 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 E0gTkO#{d8T literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/nested_iteration.png b/ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/nested_iteration.png new file mode 100644 index 0000000000000000000000000000000000000000..963586dbf0d679cec6ad56cc39ebc1fbd2d437cf GIT binary patch literal 8215 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/recursion_sum.png b/ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/recursion_sum.png new file mode 100644 index 0000000000000000000000000000000000000000..277d53304bfdf020d5a248e8d1eb053393cca919 GIT binary patch literal 14702 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 CWNbG8 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/recursion_sum_depth.png b/ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/recursion_sum_depth.png new file mode 100644 index 0000000000000000000000000000000000000000..f94ce8357208312d7704abaaa973e2fae97ebf40 GIT binary patch literal 15183 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/recursion_tree.png b/ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/recursion_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..acb42dae0dd6e3f0a2a15a9535d5d371dcaf9a82 GIT binary patch literal 11562 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�q4=cX(Sngne2w17)Mx_V3L~?tO@95h z`TnDmgMHRH<3mwa5ltsIa5Q|HQKrei$h|sM)a<*71DG2uNJ`wYlwTp}`U3g9Apjh~ z980F$hE=J&x*=2?eZ!9ItC>Wu|873Bt6P6ZlfX%eyU^#U%=(>2Jqe{9Mw=W{ce92H z(_)17R6i$|0IN#RRr2B^`H992T<{^UkNJAX(X`;IGOHh!DYLOsqfi544yJ1vDHU!= zCb%g}xM|TGdJ&oh*1apRm(o-rSiI9x)e#gFS*t z9VIgtU7Hk8nrRmC;+s_1$&C~&ZG(47vh)4bcvsqn0olDpgx0W1&Ep6Q-@!|WaW0}t%FbzQsu%i7vyvB!9m2CXN1@=(Sx86`HPt6lPXgNCxHi_qO6dEFG(7b!4ZtvW4l)1 z_Y;Fwsb7GGmR&y&MVZ5{e}(RObdrD0dOxU|j&a6jzSs4>Km}B8@MOGDG?jTYJHSJ*%*xO5Xb4it3YUY`xgtb|{fK0B*fy5CjmqUS-Rt*KP=5EWup$4?K z4y7OO`ab>c4EmuCcq8g#yF2*mD0<>kz_&9o7vun+*xvWxGIN%XA04oR=nw6_#+T}w zV3LL}PvJ&_0vpj9dBWF^yLN%fNf!7~+inHE~27W`4F56BczzShC>S{$XRZ zTu5DAYMm#NI%EuydM7M3gHD#^0_^}tidN^ z#C&sBnhC@lV;4r%9AcvexmNX=!45KJyp00+qjf1sF@MA{WovVT9?0=wwA3xvN;#FL zXYd53i))|=h{wCE$mRZ=+j{V;&xxvH23yb$UH294_=a6Yf4G4+%mdm9{k=~b!D;YB zo*vwM(J_}=5|k{#C_bz0W~0<;UV!2p(&GG%#lX~WV>8Mb*En-e-c9SiyvLL9?#~`? z1^b^P4USjlp{;}10C?Gg#L?KK0K4e9k`sBc(HUmu=1~Fsq0E~yN2~$3j{k7o26ceW z_ZtANh!k5TYd%_>COFih%iCaek0?GGI^oxuT&EmJ@@pP~E19aNR|LUf#LiIjQM5a= z*m@MKq3Cu|eh;(s0dKjbs3PKO9ypJ=bPKU2r32{bQM8KgW}fYOuCbn_jv_cmCtI`Vog1p4%x zYOk;q6C;QK4_Oey8$}3PsVfU{cu$)K{P3fe+=V_&SL5lKPvCiN)$E9HzhYlA63pD} zoPldjl-g7P9!Ye@zuc)1iWf=!6xetIHsY7Nu%USN)9A z=p5jBi^~r1a+calgutOgtGDU11!X*RmGZvui0V*Ps+Gh3%QA6zCx5T#KThc2f~YFo z%fmtlZ3EIKZ!|scA^LZZ(g+=gIqx6rO~;|4 z|5@+?^4aMuGT#jv4Z6$Vi~MtN5?07o><}ft{EQ3FKcS4I4&{f3!%(5ki159D4toif;-|{ht-jcKrEm z|BcNhLai9kk`(w4LUWj=;8eewY+p>?x+o1l=c-N@-(#wOBiHDbR=Fy! z6tK3t{GZHRXXUW*K8~3RTAWNdd;M>mSXoD^C6#+qy?Rz;pa0?ePXS6uUmM+0(eu z_9(!=>Ip06Z}vk^ulY@t*nU`kvK94hrEPclG0I}ICDkG7!{5#H{5fy>Xy%!ieeZ<% zV;%ly=ec2+M4H9)x=DKKUw^6Bnt8nKhJE*L#7?l@@>o0a3YuZ*P}%ef+H|(ax(u=H z#~--%8oTxv&4DKb%z~zr$6EWcbl|{|B<$=-;hG*TEHN+ev9$+;PUgfAWVcg0 zgpp-Wceki6SHXU~Y1Kb)_N;?=zb|EDbV|9>`$-cg`TZ>Fzi|{=dQrbU*PZt>;}?5k z@-f$J>v5?uKiATh?q3%dA_Se6KRN}z{gpqKP3IFJDSy$fZ6^fQnqHP;KSNAiQbPN^ zMFk-KC!?jm#Hx}F3+`{l3`OibTo&0TEiq4@{M~l1)hE=a;2t?2^77;g@o)uJj@vs~ z*C|yDJ(Mvn(qY|rWARtzXr^mY?j|VjIF=plb5`?*2|xOk|I20lR(jamR?Vor9x0pY z-47kOJl+VlR}^xv|0-%g`PbXe>w7Iat9B!%v^U;NkQ{lwKky5kDD>`IY`f|FAU#36 z>C^Pm#V1L?@eKotJNz#Shj@2~$egOUXWi1*jHNuMXg62lSfyXjepITWfT*5w9jZ0~ z91o<$bk@4qS!NShf1v8jwv$&bEVua~dZ`2kZeSbqj? z1Ya)S=9|U8IK?}=8{nNYHDLSy@&3PV>;FiRy8UgvE&W*rVf)Wy7;C7!j{;wK#pm_5 z0psk^Ug_Zg!uonR%cmcHJPgW+~xSks*+;v5sjaCr!)L2gVBHCT7T2 zCsuTfgmC9mB?-fC9wSIwKqT@$@klwO1g{*nN+1KaBmxZq&Q!9WXUuZ)!Xpp1+cn#n zcfSmDvP4(mVt;Hm%`S_BeqNu4*D2ICaKk5gI-2eap literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/tail_recursion_sum.png b/ru/docs/chapter_computational_complexity/iteration_and_recursion.assets/tail_recursion_sum.png new file mode 100644 index 0000000000000000000000000000000000000000..09a325aed87b33b97f8d4bf635ad8d12447c001c GIT binary patch literal 17867 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 HoD!M<494t^ literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_computational_complexity/iteration_and_recursion.md b/ru/docs/chapter_computational_complexity/iteration_and_recursion.md new file mode 100644 index 000000000..f52ed039c --- /dev/null +++ b/ru/docs/chapter_computational_complexity/iteration_and_recursion.md @@ -0,0 +1,194 @@ +# Итерация и рекурсия + +В алгоритмах очень часто приходится многократно выполнять одну и ту же задачу, и это тесно связано с анализом сложности. Поэтому, прежде чем переходить к временной и пространственной сложности, давай сначала разберемся, как в программах организуется повторяющееся выполнение задач, то есть с двумя базовыми управляющими структурами: итерацией и рекурсией. + +## Итерация + +Итерация (iteration) - это управляющая структура, предназначенная для многократного выполнения некоторой задачи. При итерации программа повторно выполняет определенный фрагмент кода при соблюдении некоторого условия, пока это условие не перестанет выполняться. + +### Цикл for + +Цикл `for` - одна из самых распространенных форм итерации, **она хорошо подходит в тех случаях, когда число повторений известно заранее**. + +Следующая функция реализует вычисление суммы $1 + 2 + \dots + n$ на основе цикла `for` , а результат сохраняется в переменной `res` . Обрати внимание, что в Python `range(a, b)` соответствует "лево-замкнутому, право-открытому" интервалу, то есть перебираются значения $a, a + 1, \dots, b-1$ : + +```src +[file]{iteration}-[class]{}-[func]{for_loop} +``` + +На рисунке ниже показана блок-схема этой функции суммирования. + +![Блок-схема функции суммирования](iteration_and_recursion.assets/iteration.png) + +Число операций в этой функции суммирования пропорционально размеру входных данных $n$ , то есть между ними существует "линейная зависимость". На самом деле **временная сложность как раз и описывает такую "линейную зависимость"**. Соответствующий материал будет подробно разобран в следующем разделе. + +### Цикл while + +Подобно циклу `for` , цикл `while` тоже является способом реализации итерации. В цикле `while` программа в каждом раунде сначала проверяет условие: если условие истинно, выполнение продолжается, иначе цикл завершается. + +Ниже мы используем цикл `while` для реализации суммы $1 + 2 + \dots + n$ : + +```src +[file]{iteration}-[class]{}-[func]{while_loop} +``` + +**Цикл `while` обладает большей свободой, чем цикл `for` **. В цикле `while` мы можем свободно задавать шаги инициализации и обновления условной переменной. + +Например, в следующем коде условная переменная $i$ обновляется два раза за один проход, и такой случай уже не слишком удобно выражать через цикл `for` : + +```src +[file]{iteration}-[class]{}-[func]{while_loop_ii} +``` + +В целом **код с `for` обычно компактнее, а `while` более гибок**; обе конструкции позволяют реализовывать итерационные структуры. Выбор между ними должен определяться требованиями конкретной задачи. + +### Вложенные циклы + +Мы можем вкладывать одну циклическую структуру в другую; ниже показан пример на основе цикла `for` : + +```src +[file]{iteration}-[class]{}-[func]{nested_for_loop} +``` + +На рисунке ниже показана блок-схема такого вложенного цикла. + +![Блок-схема вложенного цикла](iteration_and_recursion.assets/nested_iteration.png) + +В этом случае число операций функции пропорционально $n^2$ , то есть время работы алгоритма и размер входных данных $n$ находятся в "квадратичной зависимости". + +Мы можем продолжать добавлять вложенные циклы, и каждое новое вложение будет означать очередное "повышение размерности", увеличивая временную сложность до "кубической зависимости", "зависимости четвертой степени" и так далее. + +## Рекурсия + + Рекурсия (recursion) - это алгоритмическая стратегия, в которой функция решает задачу, вызывая саму себя. В основном она включает две фазы. + +1. **Спуск**: программа все глубже вызывает саму себя, обычно передавая меньшие или более упрощенные параметры, пока не достигнет "условия завершения". +2. **Подъем**: после срабатывания "условия завершения" программа начинает возвращаться от самой глубокой рекурсивной функции вверх, собирая результаты с каждого уровня. + +С точки зрения реализации рекурсивный код в основном состоит из трех элементов. + +1. **Условие завершения**: определяет момент перехода от "спуска" к "подъему". +2. **Рекурсивный вызов**: соответствует "спуску", когда функция вызывает саму себя, обычно с меньшими или более упрощенными параметрами. +3. **Возврат результата**: соответствует "подъему", когда результат текущего уровня рекурсии передается предыдущему. + +Посмотри на следующий код: нам достаточно вызвать функцию `recur(n)` , чтобы вычислить $1 + 2 + \dots + n$ : + +```src +[file]{recursion}-[class]{}-[func]{recur} +``` + +На рисунке ниже показан рекурсивный процесс этой функции. + +![Рекурсивный процесс функции суммирования](iteration_and_recursion.assets/recursion_sum.png) + +Хотя с вычислительной точки зрения итерация и рекурсия могут давать один и тот же результат, **они представляют собой две совершенно разные парадигмы мышления и решения задач**. + +- **Итерация**: решает задачу "снизу вверх". Мы начинаем с самых базовых шагов, а затем многократно повторяем или накапливаем их, пока задача не будет завершена. +- **Рекурсия**: решает задачу "сверху вниз". Исходная задача разбивается на более мелкие подзадачи той же формы. Затем эти подзадачи продолжают разбиваться еще дальше, пока не будет достигнут базовый случай (для которого решение уже известно). + +Возьмем в качестве примера указанную выше функцию суммирования и обозначим задачу как $f(n) = 1 + 2 + \dots + n$ . + +- **Итерация**: в цикле моделируется процесс суммирования от $1$ до $n$ , и на каждом шаге выполняется операция сложения, в результате чего получается $f(n)$ . +- **Рекурсия**: задача раскладывается на подзадачу $f(n) = n + f(n-1)$ , а затем продолжает раскладываться (рекурсивно) до базового случая $f(1) = 1$ . + +### Стек вызовов + +Каждый раз, когда рекурсивная функция вызывает сама себя, система выделяет память для нового экземпляра функции, чтобы хранить локальные переменные, адрес возврата и другую информацию. Это приводит к двум последствиям. + +- Контекстные данные функции хранятся в области памяти, называемой "пространством кадра стека", и освобождаются только после возврата функции. Поэтому **рекурсия обычно требует больше памяти, чем итерация**. +- Вызов рекурсивной функции создает дополнительный накладной расход. **Поэтому рекурсия обычно уступает циклам по временной эффективности**. + +Как показано на рисунке ниже, до срабатывания условия завершения одновременно существует $n$ еще не завершившихся рекурсивных вызовов, а **глубина рекурсии равна $n$** . + +![Глубина рекурсивного вызова](iteration_and_recursion.assets/recursion_sum_depth.png) + +На практике разрешенная языком программирования глубина рекурсии обычно ограничена, и слишком глубокая рекурсия может привести к ошибке переполнения стека. + +### Хвостовая рекурсия + +Интересно, что **если функция выполняет рекурсивный вызов в самом последнем действии перед возвратом** , то компилятор или интерпретатор может оптимизировать такую функцию так, чтобы по использованию памяти она была сопоставима с итерацией. Такой случай называется хвостовой рекурсией (tail recursion). + +- **Обычная рекурсия**: когда функция возвращается на предыдущий уровень, ей все еще нужно продолжать выполнять код, поэтому системе приходится сохранять контекст вызова предыдущего уровня. +- **Хвостовая рекурсия**: рекурсивный вызов - это последняя операция перед возвратом, а значит, после возвращения на предыдущий уровень не требуется выполнять дополнительных действий, и системе не нужно сохранять контекст предыдущей функции. + +На примере вычисления $1 + 2 + \dots + n$ можно сделать переменную результата `res` параметром функции и тем самым реализовать хвостовую рекурсию: + +```src +[file]{recursion}-[class]{}-[func]{tail_recur} +``` + +Процесс выполнения хвостовой рекурсии показан на рисунке ниже. Если сравнить обычную рекурсию и хвостовую рекурсию, то видно, что точка выполнения операции суммирования у них различается. + +- **Обычная рекурсия**: операция суммирования выполняется в процессе "подъема", то есть после возврата с каждого уровня еще нужно выполнить очередное сложение. +- **Хвостовая рекурсия**: операция суммирования выполняется в процессе "спуска", а сам "подъем" сводится лишь к последовательному возврату. + +![Процесс хвостовой рекурсии](iteration_and_recursion.assets/tail_recursion_sum.png) + +!!! tip + + Обрати внимание: многие компиляторы и интерпретаторы не поддерживают оптимизацию хвостовой рекурсии. Например, Python по умолчанию такую оптимизацию не выполняет, поэтому даже функция в хвостово-рекурсивной форме все равно может привести к переполнению стека. + +### Дерево рекурсии + +При решении алгоритмических задач, связанных с "разделяй и властвуй", рекурсия часто дает более интуитивный способ рассуждения и более читаемый код, чем итерация. Возьмем в качестве примера "последовательность Фибоначчи". + +!!! question + + Дана последовательность Фибоначчи $0, 1, 1, 2, 3, 5, 8, 13, \dots$ ; найди $n$-й элемент этой последовательности. + +Обозначим $n$-й элемент последовательности Фибоначчи как $f(n)$ . Тогда нетрудно получить два вывода. + +- Первые два числа последовательности равны $f(1) = 0$ и $f(2) = 1$ . +- Каждое последующее число равно сумме двух предыдущих, то есть $f(n) = f(n - 1) + f(n - 2)$ . + +Следуя рекуррентному соотношению и используя первые два числа как условия завершения, мы можем написать рекурсивный код. Вызов `fib(n)` даст нам $n$-й элемент последовательности Фибоначчи: + +```src +[file]{recursion}-[class]{}-[func]{fib} +``` + +Если посмотреть на приведенный код, внутри функции выполняются два рекурсивных вызова, **а это означает, что один вызов рождает две ветви вызова**. Как показано на рисунке ниже, при таком продолжении рекурсивных вызовов в итоге получается дерево рекурсии (recursion tree) глубиной $n$ . + +![Дерево рекурсии последовательности Фибоначчи](iteration_and_recursion.assets/recursion_tree.png) + +По своей сути рекурсия воплощает парадигму "разбиения задачи на более мелкие подзадачи", и именно поэтому стратегия разделяй-и-властвуй столь важна. + +- С точки зрения алгоритмов многие важнейшие стратегии, такие как поиск, сортировка, бэктрекинг, разделяй-и-властвуй и динамическое программирование, прямо или косвенно используют такой образ мышления. +- С точки зрения структур данных рекурсия естественным образом подходит для решения задач, связанных со связными списками, деревьями и графами, потому что они хорошо поддаются анализу через идеи разделения задачи. + +## Сравнение двух подходов + +Обобщая все сказанное выше, можно представить различия между итерацией и рекурсией с точки зрения реализации, производительности и применимости в следующей таблице. + +

      Таблица   Сравнение характеристик итерации и рекурсии

      + +| | Итерация | Рекурсия | +| -------- | -------------------------------------- | ------------------------------------------------------------ | +| Реализация | Циклическая структура | Функция вызывает сама себя | +| Временная эффективность | Обычно выше, так как нет накладных расходов на вызовы функций | Каждый вызов функции создает накладные расходы | +| Использование памяти | Обычно требуется фиксированный объем памяти | Накопление вызовов функции может занимать много места в кадрах стека | +| Подходящие задачи | Хорошо подходит для простых циклических задач, код интуитивен и легко читается | Хорошо подходит для разложения на подзадачи, например для деревьев, графов, разделяй-и-властвуй, бэктрекинга и т. д.; код при этом получается компактным и ясным | + +!!! tip + + Если тебе сложно понять дальнейшее содержание, можешь вернуться к нему после чтения главы о "стеке". + +Какова же внутренняя связь между итерацией и рекурсией? Если снова взять рекурсивную функцию выше, операция суммирования выполняется в фазе "подъема" рекурсии. Это означает, что функция, вызванная первой, на самом деле завершает сложение последней, **и такой механизм очень похож на принцип стека "последним пришел - первым ушел"**. + +На самом деле такие термины рекурсии, как "стек вызовов" и "пространство кадра стека", уже прямо намекают на тесную связь между рекурсией и стеком. + +1. **Спуск**: когда вызывается функция, система выделяет для нее новый кадр стека в "стеке вызовов", чтобы хранить локальные переменные, параметры, адрес возврата и другие данные. +2. **Подъем**: когда функция завершает выполнение и возвращается, соответствующий кадр стека удаляется из "стека вызовов", а среда выполнения предыдущей функции восстанавливается. + +Поэтому **мы можем использовать явный стек для имитации поведения стека вызовов** и тем самым преобразовать рекурсию в итеративную форму: + +```src +[file]{recursion}-[class]{}-[func]{for_loop_recur} +``` + +Если посмотреть на приведенный выше код, видно, что после преобразования рекурсии в итерацию код становится сложнее. Хотя во многих случаях итерация и рекурсия действительно могут быть преобразованы друг в друга, это не всегда стоит делать по двум причинам. + +- Преобразованный код может стать труднее для понимания и менее читаемым. +- Для некоторых сложных задач имитация поведения системного стека вызовов может оказаться очень трудной. + +Итак, **выбор между итерацией и рекурсией зависит от природы конкретной задачи**. В практическом программировании крайне важно взвешивать плюсы и минусы обоих подходов и выбирать подходящий метод с учетом контекста. diff --git a/ru/docs/chapter_computational_complexity/performance_evaluation.md b/ru/docs/chapter_computational_complexity/performance_evaluation.md new file mode 100644 index 000000000..39740e00e --- /dev/null +++ b/ru/docs/chapter_computational_complexity/performance_evaluation.md @@ -0,0 +1,49 @@ +# Оценка эффективности алгоритмов + +При проектировании алгоритмов мы последовательно стремимся к двум уровням целей. + +1. **Найти решение задачи**: алгоритм должен надежно получать правильный ответ в заданном диапазоне входных данных. +2. **Найти оптимальное решение**: для одной и той же задачи может существовать несколько решений, и нам хочется выбрать максимально эффективный алгоритм. + +Иными словами, если задача в принципе решается, эффективность алгоритма становится главным критерием оценки его качества. Она включает два следующих измерения. + +- **Временная эффективность**: сколько времени работает алгоритм. +- **Пространственная эффективность**: сколько памяти занимает алгоритм. + +Короче говоря, **наша цель - проектировать структуры данных и алгоритмы, которые "и быстры, и экономны по памяти"**. Эффективная оценка алгоритмов крайне важна, потому что только так можно сравнивать разные алгоритмы и направлять процесс их проектирования и оптимизации. + +Методы оценки эффективности в основном делятся на два типа: практическое тестирование и теоретическая оценка. + +## Практическое тестирование + +Предположим, у нас есть алгоритм `A` и алгоритм `B`, оба решают одну и ту же задачу, и нам нужно сравнить их эффективность. Самый прямой способ - взять компьютер, запустить оба алгоритма и зафиксировать время работы и объем используемой памяти. Такой способ оценки отражает реальную ситуацию, но имеет и серьезные ограничения. + +С одной стороны, **трудно исключить влияние факторов тестовой среды**. Аппаратная конфигурация влияет на производительность алгоритма. Например, если алгоритм имеет высокий уровень параллелизма, он лучше подходит для многоядерных CPU; если алгоритм интенсивно работает с памятью, он покажет себя лучше на быстрой памяти. Иными словами, результаты тестирования одного и того же алгоритма на разных машинах могут различаться. Это означает, что пришлось бы тестировать на самых разных машинах и усреднять результаты, а на практике это нереалистично. + +С другой стороны, **полное тестирование требует больших ресурсов**. По мере изменения объема входных данных алгоритм может вести себя по-разному. Например, при небольшом объеме входных данных время работы алгоритма `A` может быть меньше, чем у алгоритма `B`; но при большом объеме результаты могут оказаться прямо противоположными. Поэтому для убедительных выводов пришлось бы тестировать входные данные множества разных масштабов, а это требует значительных вычислительных ресурсов. + +## Теоретическая оценка + +Поскольку практическое тестирование имеет серьезные ограничения, можно попытаться оценить эффективность алгоритма только с помощью вычислений. Такой метод называется асимптотическим анализом сложности (asymptotic complexity analysis), или сокращенно анализом сложности. + +Анализ сложности показывает зависимость между временем и пространственными ресурсами, требуемыми алгоритму, и масштабом входных данных. **Он описывает тенденцию роста времени и памяти, необходимых алгоритму, по мере увеличения размера входных данных**. Это определение звучит немного тяжеловесно, поэтому полезно разложить его на три ключевые идеи. + +- "Временные и пространственные ресурсы" соответствуют временной сложности (time complexity) и пространственной сложности (space complexity) соответственно. +- "По мере увеличения размера входных данных" означает, что сложность отражает связь между эффективностью алгоритма и масштабом входа. +- "Тенденция роста времени и пространства" означает, что анализ сложности интересуется не конкретными значениями времени или памяти, а тем, насколько быстро они растут. + +**Анализ сложности устраняет недостатки практического тестирования**, что проявляется в следующих аспектах. + +- Для него не нужно реально запускать код, а значит, он экологичнее и экономит ресурсы. +- Он не зависит от тестовой среды, поэтому результаты анализа применимы ко всем платформам выполнения. +- Он позволяет увидеть эффективность алгоритма при разных объемах данных, особенно на больших данных. + +!!! tip + + Если понятие сложности пока все еще кажется тебе запутанным, не переживай: мы подробно разберем его в следующих разделах. + +Анализ сложности дает нам "линейку" для оценки эффективности алгоритмов, позволяя измерять, сколько времени и памяти требуется для выполнения конкретного алгоритма, и сравнивать эффективность разных алгоритмов между собой. + +Сложность - это математическое понятие, поэтому для начинающих оно может показаться довольно абстрактным и сравнительно трудным. С этой точки зрения анализ сложности, возможно, не лучший самый первый материал для знакомства. Однако, когда мы обсуждаем особенности конкретной структуры данных или алгоритма, почти невозможно не затронуть скорость его работы и использование памяти. + +В итоге рекомендуется еще до глубокого погружения в структуры данных и алгоритмы **сформировать хотя бы первичное понимание анализа сложности, чтобы уметь выполнять анализ сложности простых алгоритмов**. diff --git a/ru/docs/chapter_computational_complexity/space_complexity.assets/space_complexity_common_types.png b/ru/docs/chapter_computational_complexity/space_complexity.assets/space_complexity_common_types.png new file mode 100644 index 0000000000000000000000000000000000000000..ccd2d6aecc4de29d5ab35a1362be96b2ff62259f GIT binary patch literal 15409 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 tj)Yl6`K;Y#Ypc z@Q1^U8;|e@5+@ZSR{$tmFJ6!je3VT1Mu@A9vJxonWnRW#z@92q*mI8fLWSlI>D08j~$%oH))19bsW*4BR&m) zS5wuH^wME%K&A8dKgQ~L?xUQZdHj*rZbh45-+SB|&yqOVQkL5_i>i4pZI|l`_Lo=L zQ!|nSHagaP16i;Kd>G!g+8XGpCRFG>4_VRymv>bbmQSG%>NMOfa@FkPLsf;Utm~1> zq4T=O%RP;Lt@*KphYh4cH>Swg9-!yj9CjS|Z-{j0k=6|WJGIU~^L|p->stKOUe|f+ zikW`R2KvW{&r&jy@X#pmgztY&Mi z{GwIajfdc}q3Uqc0~`3EBIxyve}5tgPV_)!m-m3c*}CQ5gn?5PK4?%=9?+#3XVF8~ z;rXv~hfAujSbh2A!+s+r@5~vkkO#W{##S@RQ(*R+g)w@dH)pAf!BTehSF!$(oi%?) z0_M6f#-{B_kli}9(u>kA(dOU_5do>y+U>?k8vf|2%Fz()x?$^9li1$ez->} zRPrpUX8&*avP)#NF}Bgz3~{q)Wo1#!FI5liFCcUv#hWAC@tDO@<)=(*UgP+J5!M(^ zd};KWQ5@ zfCrnH#-Q`C;wbs7FcQ>{AKSLG5m(n&^UUkmrX}0*9ZM54J@8U&OLRRXNP& z46RWXyzq6OVRwj@pa{P)yD_MEG57!Lahk22I??KAGGx(^JsWHW!8yh;$+7*mXev-# zBP7P0x6(ylqef$_t7qaep$G&Tim1NjzobBlVJ}?wsc0;+CM*EWJ-vFBzQ(Vg;X;)jt5o1?0lf6 z(jNfKA@_QjK{AnLgWbKVQ2FtSfSQ`KV~>61jLqHW-Cyxoqu4$*4QKGP85}fuCQ5T33C|vrdm=%`==#K7S9+*7X6o$6bz54$pBZTkWq3 z*P=yZ*2s^7C#30}ZdFiXH1ZGIe>oOoJ^sj7HTzfC9hTx#_e*)An)*>NHObf-Pv-+R zsw#zHJ8Q|_4yR|YT8)2i@;cqMP5k5~92%qcjX{?o+njqTpe2KZs zL@xW@P-o2#j`fD!B_Woz#QC!ZQX{;EPsz@^n|^UC&!VIAifc!!FtH@p&dnP+RWQmp z&(FoTk$u+|E&Pts>&yQLQJE0lL#3$3HuKl}85vT}2s2sD%V}8`p1Lp|x=V>`gv#1M zJsJs83Lp*wBp4mx<8@ZO9N3%}%VLIrpPeJ;0fO$%w4TDeui9WRXDlIyG z!Qy#vPl&7&$un96JdIi#1Vgn+4(-UH+stsw>U^NSgH!~hsOniwZgb!@m^)Y)*`Q60l30EHv9 zknWhCu0L|6-dGcc#3BBo+kuQNf^k!Dr0FokLIRdc)aZ|EXmsd^cPyDbe{F6NSbdou zEvpLJ9buMkQsWf3=eoOMJ!7`_8mx{N4+p6%KHdPA(C4PaSAk>Nj~+*bH>dN!&zlat z*#Q|&fY-dLqV*fVPOaFIVuYbnFr=xe+MKg2#LGZQB|497a)H#TkO+<>#ynjK&2dyX z+v(vXHvN0Nf?8m@RmbsmiletTju*g@vbRaRjA+I)#~)l2+E;_*D_%29 z2H!|fUXid!dI|zUiVHuN%mr!%EhmTWI6)DtJdl=ad#Mlj_Z<>}=5kh=mcwCgu z7nd*=IzVoxvm?_swY6KKgb$k>AHaQy!G*AWSbfiYpmn>~=rs9q@J)Qr*#~^jA$6aN zfVx!zx8mey1TEUBBWubA7R4xeIlxNVt`MGdi|KTFnJyU5WaX~O220WoT*x9}!H_=q z$sHJSTzA>il!)~WB;cqtjqx&ivq`n-_}#CKr_7{^UDo*i;;n}C-IHnZ2gIZ(uh+k{ z*bmu!7e|w?li$97Th;U}+3C53?+=2k*PXX4mG+N*4H`?!b&aH`ro++1SEDZ@{%$F zh9)k$a@Lu!O?xqLw{D4^{q{eHU(=_?ki-Od2fVlcV?O^M^J^?;lSGOhcK}kUBRZf@ zF~*7kKhWl`tm&>VJxq#~09<;vGpO%N-U3quFJA_b{Ac)&9fAME<9S?hBQQMmp2%@S zPg68<82UDx6x3EVV*B7^Gw62M8Aa^=j7W<)R`F(%>)&QV7Z|cWbD4 z@6uT#(Kj*}484Rty?XqHJQ#rh=~wfHMsGJcE5?MOz)Q+^_N-l)%xq87a_R+XxH|~;vZ3sraYU4w^kzrLMpcP5H!y_0r98+ zdyo73F*|v0f{i6uLksQvJKZ&M9@8MfE0j+X@)7&2S)a`M>n)A1mWS{ z=KH#-MsRL3yHE4!ir@O?;fWPY}-ZiO=U@zN?`@ht+U2l1>BPhD08PG-kLOhyOcY4u(jcT5-#tz zq&$gP>1&d1kp(Yj)~!B7(`k&yFS0E_P_(X8(T>yot#(hPKiZtSE->N|t7uatIjb2S zC<UB)`aFkhQnN&Z<#d*!IXOG1)HVAu%CZr60%^h1ES4tY`A}dWMnZzzgiA zQnwo}>;wNBPm#lLZ-7uG6?XMWkaF+}^N7+Mw+NH^>p>c|TsKYw@L<=)nKiiAp zo@h5Q3s)ZA^MRw6p3w*aQy~c3X#J>Z!?Gsv5!90~v07z*eKml6ohaMGvrKohj1-&gST4waCg=8am>6$OHL!wVs zJkW^XwhmiXd9)${2HufIBcwG_6!RMPvQ@%4MR53sItw~MqHy4h8Bd){#S*Q$Wary2 zo(Tsp0yWNeMXm}#(Lji0=XzI@-nlq<86ehP7Fl5lYp;j=i3$`0w*dlV9~f8rx#RGx z0kjQUs5vpFC2{d^=s^V?xSig{rx@oQ?oFUYJ`}F6Rt*qm`LF2YWZBUFH0x5Jt+p>r zLzrgq&E(;v^AtG*q^l%KTI|Mokfa8aoDWm)cw7Rvo4jisZoM?V+4}Ko!-ax4QfFyt zHcuHDE(BKpswbFTGi!C?lre#X0i;(ywVYr_GkRrvt78CSZL-z%D)QE+^Pz={h~2K^ z^~AZ1GoL&!u6!n|ccj23=! zmn_z*xnM+y3Z#Fxj{NBL`bO6ep$U27e4^tBn-qXU>X$~9sDcBD+9HLBsWPVBSGY|!MHV2b zf49VU8A4x}I|{@@r`8wVaQ>5})_j(pWXk6zEvL$XHLdl-bffZp5V7{3K`3s{3t^}7o-Kq|`;Rw84TdHNJ zMu1w7_eH{AVdZUC1}-ICD3s%y`sX|UX-G$U&wNoW_&-KFUmQa;6mTVCt0ru<`^#U{aV!-r|C8qEd481c3nu2?t=BVX1}u+ zB?$lANTYMkx>!7U)=!^iM4&|;vv&-;2nmv07^PMEl3n6kp0-ekt9!zGVN?b=^v=I}AhD`xGMsl})FLzN;pyIM_j!!r_p z#qtnb{?#&{kx0E0WskRhr*n(7dLtgkvDQ_K6mNl& zmD#h-h_?EJKWj#KkG=)=k^SF}AEych^1mNTOWWty^3QiD*?uUjr6!7>bCA=O6xqfizr&n!IPef>2m+WTJonW2E zEAK_11t>S5Sy2u+<}X*K>9Crt{!4ug2|@!i01ZP%l^Ne(j_#L#P0hyQ=)=9O3&v{k zOnJm70*1Z>jk?=!-Uyw&&k`yzm<;{rsen)8obqi9W%G}d-qVM8m*>aUQ|TDs zHxZeq3`}1tUy`_Xjd4NmT29vgox6*<-eg{KL;}*yL?X$IRysnD=Ixz_ISF^3=yP9( zrns5B@u(?rDAw1Y06!g-f)nGZ{ay<{>~b|J;_}{E(63VT&QLaY-RpNf(HJTyllasM z(T>JV<>=l2ZTqoep(2_`?CjI<6m3RpTzrwaIr+l8P7hNFrb++9N%~n=vB5P;bk)vq z1nuIE(^0MI>C=V=aUX?ic^}Qv^&Q_Cbx0nIl-?V!Kl<|ul2*AS(jL{wwTfO!<;Kj< z9YMg#*wMbgu->f$wqXh=nkLnZ9+92=b}%J2?tK-GoH@vQr+`L;UUn{MdT@%l07aEQgSzs=Lk;%lY#ai;1BAfbElJ0c!yxy|sQLUjJia zjImyeLV!+RjC8|Ek=D=>L8;CjA1GMI0jF{?@hYQS1OFetzihizI^Y9VW!8S^N)jO% zGc{gx;J`^eQNE2CrJQw8d$Pp*5Tw;6_brYobp6KUG!GQGO-afj^~`$rFQ2)++Vko*(l2EN+Goy+|~c0u0?1boU`%-lv+N+J>s6A*QLYzJh-H>P4o(n$TK* zDz;NMWPjgO(Ot9G&cH6QI1U2z1!_iMIXBYz-<^hEei)yBUHWEa%<<5}!Y`>)=8(gZ zFI%O4j6rL9njagF1Y3yh1dSi(?6;Ew&1Ak)djcI~_)7)@ z0ctOyod_7dSRM@Oy`#VeD{u&|m^z5ro~mG$m9uE3b6K~~hk+F6jg}68+4d+n^Ctzw z0D|2DONUiB8QRP7eS!gyUa58{Y;9iX8!R?9DR^?jp0uA_XeEA6qe3Bzuxak=nAFZ z2IQH<)xzGWhx=T8S%K60NoSq6I(rKjyPBROZ_6_r)1$LyC;hWFC^0iGWPBm`NOL=ijD*GG;M? z(?(EmJ}JgFPa*-Q8(C$JLEnH29X31Sq)6_>=7vLngU`NrjH2>i6|4y|)G@ zJNIEB65M72Cx8b3o58p|hOHRF8vZ(8U{6SDMLg%L>o;7AgN(?k+H)_h`Z40e5=P4t z#gl2*d@9eNDbE%jjPeNa*=Pto9d;PUbj10cN(9qyZ&y6KY4{zt50u9u*Pb*)k6Cus zj*ZrzI}=uKRLWD;k%Zg7n7Fj>9+-Chy+be$9)2)9p*`Vgka9N|8*6BgtanYAYLIK$ zs=OpU-msX%h+Xf?;Z}68;QKnz(iGh@OxD!0k(+$ldRoi(2tHNjCle2AqBHzg7j%(96UbMlC&#ZUaX5GN&(_Ydx-hT}Rubzf} zl8sO;yLX+d1RUwrcwGHdoCjp4r{B>zBIc#UKEo0ss~ zm32l!LDriWNf0WXzhP_FqJG#(l+`@_Hi}VRl%c-Piz-u%2~Ud_K~$}&e4(=SvDb8v zuH=>a=&kl_H5PnNkXQX=<4K1`sX)j35|l@M)M~=C!c3y*ge&=EwcC#iPVYciqn%q- zP048r1J4PU#eT80w=&5uB#2IwlTRkNEnnCKEqtn{tisJ`Evkr6kbRcY`1^iYAUt(; zkFSc$Ts?8!n{cDUtw{);SmXI&loTru#dQRpA0Q&M_FPut18)BGyZcdm!mR%Az#ESz!KD8EvPXO&(Z=== z)<0?8lTZt?ee&0XQly(|GT^X-AtIeGo?|kZqlM@}OAe>{0lPWFOvUnxDRNhOL91Hc z5QFn=tpD3}0rO@z(irB}s??(io9!OY^9jaN`Er#+2fuo^<#jG~DauLSjc>Z>M_63t zqpI4-tsO?4dW-8DlRwQ(?xi@`;jQFNZ!*bvoxBgBXJf%%;=v!T6h8_KDl+17@5(?V z{(0gY_<60s{9e4nqxwfC8ssU^xf*}tZNElsoJZDa*9V(Xw~U#rdqeFq8dvH$eKq8> z@cx*_NHTy#VT1Li_eS8UQ~Y#zoMskmu~bK}B$x6x{0V391oai*=1NYG(L z{3Uce--s%p829_xj!vIH-!!yrfP>ecQl9We}3FKT56_~qk zafo=ArmTOZ&NhqlnyA`0J_^`c!NauWR?fM`rLrb^gTK*;`yyF&{id92>+dRuI^&y0 zVmxb2>POU4jCM_y+r)gCN04Eh>$-?(r?v-C ztsU<_GrRZmg=%;7TtlZ(CigreJU@vk+jASnucP8`Wa*;kbkQBNns;+1hfXn6={{`rZ`-SKBI_A!Ld9gnFV|HCzQo}8Wr34o>yx${Q>?wsy3xC15 zPA&T+R3`K!s^%ZqB&g}55GTU|P_8l5VKPVZs@S^oA4nZEnH=)cpj7yd#!#Ed5=mL* ze>xuNpd;jvm-W4=Ij7w0>)TRdin{0s1!wX6$&xyKBYM=bz39}toaoinpoB7upT9u$ zg$HxT0*N%OeD6R{?;rO5`0KxlJfI{ZMQEb|DFOw7@}K~mI1NB(k!UFF|FZGF`%n#S zVHbCtnMQcjfWpLQeB@JC%qC8~C)QpsXgok;UXYglCEY9pLH0J%8~ycCpZe~U zvpOsUeSn7U?w=*)*9Oiy6`aI;o)kQX)26u&PX|y(byz=}G>_`&I$;X;g^)U3{nR2N zO7twc)Nzuzz|5VQa>I!(dvMWoz1Qkr*4pS7;QuoH|DC=6PrUwf{J(qup9*F;*jP;nC$3L7WTtGZ zqA=)KIr7s-W5`JDo5U#hBnFz+E$EP&!ChlJ8b42qsxRLe2>UZZ^kDJUXAorI_AGzH z_-kNF0nTyFZWDJk-%J}nG=CIld%3BHbA!1K8hNr1?O`*%qW^;w;iXt6*jPDx43%}; zu;mIlGu_O``_St^jPV7u9EsKNB47!-K*u9}8w58IvN0pP%!hkldeFnrgE^kVamgCoM7! z(EWS;FX}`)hW%myOzzT*1bC|LY~ica$Wpy55~L-BytD{c4hSo2aW_H~fjG~51T3Aq3MJM3v+?}!s$r_y~dBd6*x{Qp?a&sPfkSZOti#w2SG3dJULw9wntQkDpq z;{V5Izv}K(swN#Q`S#f!j_p`(ZYi7+l1vk_bcSKuB!UDXHi;CuZzGXTPjH_JP$;CE z&NrMQf|&T#RilWy^b z|G?Irb_O_5A_A5j@LOB?0c@8RMpXqT%>+k{O!vmlG~DK;i34j*A`eN?*_pMKw65^q zLsvj34h~*_=R2CoH}7rIB5=xn^xI}6=a>h)KmL2=XoGRoApV|(l9;;-Ks|d3>Jy_O z{o7x~Q{mXiX`Y8ghOrrvDDO8n0}IHXL%=e@0kabXoRR`De^Rt<$XyPB;5hHT#AAxjmAOz5>Oq2HDfzpCK%4t;Y|y%Fv)=d1k!C6S zWgsP=ZJ%iWx6WDJ4lD|xn4mhx)YgQS*+HW2-}!^_5+gZ z-*Hox@bRToeE(U))BlqmbyKiB1Os z5N)rf1yB9iSv?;XNIwkWU3%0@Lm83OoTi~K@0j&Ky+j0j$@P1FRq)P|?VOU3feSIT zy^JrbHL*alq|~Xgz;R645o^bKHA-K1=kfSVX+(I?@g;D^3!lUl3?NHE(f@u(-qVxQud_ zllaeZ=Qb&qSj9cM1+vI(!YH6PV3WhFm zLErSG_|V5p=Zc>VOzUbXf?p6p2Y>u&XZdUkR=a=9k&?fyXIoGTd_nZ<RI?r^E% zNrLZNf>rJ}%30OVr)x7OjVNO#WleL8-4{7bh$M?k7gm5j!H(EH-4)OUcBi-9(d_wm zG6J==GWpY!f99;X%X$F(l#@bvijnP$ep3PqR1V$1Xa-VA7%6onE3 z2xbG)k9%CMwEsLg33h2juV%f;jeEL^8CQ+fw%@e`0ctCf>?YGi5F!T!aUL$g%%!}lrt zdcRMEN&gWe*lyD@RpaN4l8reCxW*mAPxBtQPln!Jv$&aMc*9e|Qeots zfu!w>v&mc&v&h(ksMm0>KDGrd%?2A7Ie?=3e{#O@8-wY8gy1?i(*J5$8$Ow?Vy3{$ zy#FV7mZb?pRU9oAe1ijobPB;~8qp~|;3;9EK;rMlDTTYC<)8}hK8YrtyR4Q#wVMb~ ziU5hfZKo;v&J(>5@(ME{(L9(KOa_o{=*TIR1yfkz#l|OV-|l!SsEwe20VRMPVYW<1 zs^c9((2Fi;@(|>|(;OGH6p7~|J0V|;EH|k@=p+m)AbsgGpCH__6Z-Iw3@B|tVgwWv6yhb8GuERIj?;a1 zvxfDiKA+4sMliK35#66vVK^lKpD94*$-GOG%+lWJ7>1Q~W^zDH&oNZH5}|NVvVB7@ z?e<(37e~{}#3@nn+TEpd%H@yCdzt$*_=o^G!Q#MQp1ZMN_B7|inJiTq1a0)P7`$dx zh!&iQ_V-ndzJUs0{4mzlQ$cam#B$4S_uI~qslK^)UBhJ7HT={k$8>2Sj5e~y18v`j zrKNWH%Ykx4^rW4;V&mYQ9dR#NAJ)fWOY+7W_?_Xy8{=Reqpo^Jv}5LZuFYtrvk&eH zZq$TN*|1J5E8lJY2kEa3hA4lJu`37Jg1c*jwQ?s-_zyAS(0)n@LC;jTShJ^V1L!tf zW~31!y>42I#?6SBL+x8fK0@tp?b6srq;Yp^p$9rd`b<4?rRBvM7(d-q?u$>`msqep zekj-RtqWwf$8+kx_!aQwG1IM&EReDJFd}+@d8cu|m`UDl(IA#r_G)V|LQjkU)5d=M zZrmWu@TRfp?%J6|tVmgA;i_f<3pP!2;`|<6aBdZ(TIvk{w=cg>f%4CSJRXC}GXBrf z8n=@=J4c#iuO9HEBS5G=L1~AXPsRFTBQ@Ilr3T;+^Lj7^#pY53PuG<)Pd+C~P`<{t zc^_c2nwIT|(tN`2R}C%?0Yka57ni}N&DNk0!@+M|k|_HDA8F~`JJS2gcm=kzmwHO} zhJ2sQ>AwdS*u^1E4C#w({uJn=DiJWrrZ2h-R5b;gnSR@lqBB>$0%gD-lgQT@%5~Z8 zO~>cM>hK>q_fFiy<@KC(6M|QxcP5-a#q8-A+YBSY#{tc>uw`kS=sAY1H@k{C=wvF^tdX1D!oaARcvZ zkWPP)kxOJj#A*M{-a}r4oY91+aHE+b3 zc9{^BY8<)TRs{_GiP3{TypFBg<5-d2_u6{%J6!M9hB7r=V3@cb)At~E=B3o>XC3iU z3yE8|Kz7i^jIdBO0C8K0MQ-lPN@`o3e-TMD{7|PmFS}ZgYlhgfPmZ@8EoMP{6~8C? zpjv)mYY5`yT40%3g%0SA>xtsoSO{iUcRYrfCDz2Sq8$`mm`2+NdLJJe(>DN&0^q#6ENPDUR>)zC?Hy1|?EKO2W_l%oQ(KjmB&H+o>5gIf zDjoVK=F-kHTvmn2mBq6ZN`-)zE1zaW?4PrMmZWd|PO(s(pOCv?yUa;OlScf{FhpN1 z7LA31LsD}QgkJdQjmGz?2x}pHX-C9FImL}^KS_bHRgDTM@Zwl8GFY*^A<(Ki5b0~Kmajm>e(nvK12YpsAwF;4kx zwbd@%3iXcv9S(4_7JFKw+-Ux#I@88=XNA@EQ4zh-ETd!GGzpMqkdg zFY+16nRFGetvRK(;B_@IA_yF3pZa`*~LzacN2tOUQ9Pj6z*gRsqiI zjX;Xafl2k}p?E~vZ}^k3OW1yr(g!+JNtZ0|S@d~`!HaJNE^EdPdondU;RA6v zrh+t!z<7Eaoah&vBwrrMGn>jEOL(43LRi%l)8B_VR}5y&73Fy3OY}hvAW`PhwjpW| z%2?p~C(=YKsDn3ZfWgn>vCtUK_5C*t4eW5#to3kR2JZd*+eXgRnLS)mkDq&N#CYZA zntK16sXeG2Aw)|Aa?gO+KmSh%AN2if+0=X%Z>WPppVAMJu>MVL7Hl~3jAon@;~Ljx zLpmI%ADmDF?8}=o=q;VC%ghX%%j=oCy&Hu!D2^YQp!vfHV8m53GLX0);_c@VbDyt7 zs+w)e&|tr|5A}9{ojU_Mk}{DIFT*P+?w6~F?*tE3!oNQuMuTZ0-WIQ(m^_myH|?*< z7JeBGD#eZ_!xsH^;T0rfRuE`tDn0hRr}1|j#eE2*nTS+-pH`C0WQG75N=1t;wl_b# z&uNI+x%T3OF{;JVyahd!w7Q?#K}L+gCRZC{R}aq9xS^bI!ovzAiUS2;#B5sFCK;3# zhHMT4n&=8ql;kKva{M_lf*1nXWJ5rqNE8wV!vvy;i8qCjFmhrPI1I^p;^M5->Pf^j zrFoX;#d(LCd^4M*w7i_=VbO-W8AJ43OzA?mE4-1XsOi$`ul;zdq4fl@FlZuw-(tw zu_92R`j@+Uxkw<7QdiTyu)KHP7fK4NX2nfBCZkJu-9B1^VEZY%JnaK9e!F^&Pk_-; z0OhD>XrI4gR^KiTCC{TzI@YZ@8euU#rS%~YOUu0c@S|MKd@3~@dR+H`p~}cM9pm>^ zOZ(PxhU>?C-X+GI!F!ZRWI{EaMhekaHR#fQ#*MbF*bYRo96#*LoQaWFdimLASh$gx z2hl%uR`XE(uIsaGstlW_-AX5UZ)hp=D@40pBcST*x>Ghh&-S1tBX)eKRJto)PW%cC z8GY6KuVR#+LmQMsHY0x1dq2xmCpvsLxXa5rx|CzIJwn!Ba|iN*1I2x;Job8-15+Xj zydQ`6jt5GEfY(DP1Wj{#LuTf5Ipo4vPGoCT-9rkWhcK$LK zTtFhBS0|RJ#8G%EPPa|iY`kQw!!IlP`D3z$Zi^?;#a?-aauxAc5@T{%7Lwbk`akjxVaZ)~qHSdyhO~^34T0Ex%Cv zo0HFo{p?+Kbaf`ZQX#};W^Rl`0k3qzcndR1!Q-xjPQ`>Oii$X+B(EQ}8jeTa+hX4Qo literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_computational_complexity/space_complexity.assets/space_complexity_recursive_linear.png b/ru/docs/chapter_computational_complexity/space_complexity.assets/space_complexity_recursive_linear.png new file mode 100644 index 0000000000000000000000000000000000000000..756214bcdb07c0fce3d2fafabcbb0eef1ef40368 GIT binary patch literal 14278 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_computational_complexity/space_complexity.assets/space_types.png b/ru/docs/chapter_computational_complexity/space_complexity.assets/space_types.png new file mode 100644 index 0000000000000000000000000000000000000000..92b3a5c1210bff7c43aa54bf83e4ccec4e85d65e GIT binary patch literal 11359 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Пространственная сложность (space complexity) используется для оценки того, как меняется объем памяти, занимаемой алгоритмом, по мере роста объема данных. Это понятие очень похоже на временную сложность, только вместо "времени выполнения" мы рассматриваем "объем используемой памяти". + +## Пространство, связанное с алгоритмом + +Память, которую использует алгоритм во время работы, в основном включает несколько следующих частей. + +- **Входное пространство**: используется для хранения входных данных алгоритма. +- **Временное пространство**: используется для хранения переменных, объектов, контекста функций и других данных, возникающих во время выполнения алгоритма. +- **Выходное пространство**: используется для хранения выходных данных алгоритма. + +В общем случае при анализе пространственной сложности в расчет включают "временное пространство" и "выходное пространство". + +Временное пространство можно дополнительно разделить на три части. + +- **Временные данные**: используются для хранения различных констант, переменных, объектов и т.д., возникающих во время выполнения алгоритма. +- **Пространство кадров стека**: используется для хранения контекстных данных вызываемых функций. Система при каждом вызове функции создает на вершине стека новый кадр; после возврата функции пространство этого кадра освобождается. +- **Пространство инструкций**: используется для хранения скомпилированных инструкций программы и в реальном подсчете обычно не учитывается. + +При анализе пространственной сложности программы **мы обычно учитываем три части: временные данные, пространство кадров стека и выходные данные**, как показано на рисунке ниже. + +![Пространство, используемое алгоритмом](space_complexity.assets/space_types.png) + +Соответствующий код выглядит следующим образом: + +=== "Python" + + ```python title="" + class Node: + """Класс""" + def __init__(self, x: int): + self.val: int = x # Значение узла + self.next: Node | None = None # Ссылка на следующий узел + + def function() -> int: + """Функция""" + # Выполнить некоторые операции... + return 0 + + def algorithm(n) -> int: # Входные данные + A = 0 # Временные данные (константа, обычно обозначается заглавной буквой) + b = 0 # Временные данные (переменная) + node = Node(0) # Временные данные (объект) + c = function() # Пространство кадра стека (вызов функции) + return A + b + c # Выходные данные + ``` + +=== "C++" + + ```cpp title="" + /* Структура */ + struct Node { + int val; + Node *next; + Node(int x) : val(x), next(nullptr) {} + }; + + /* Функция */ + int func() { + // Выполнить некоторые операции... + return 0; + } + + int algorithm(int n) { // Входные данные + const int a = 0; // Временные данные (константа) + int b = 0; // Временные данные (переменная) + Node* node = new Node(0); // Временные данные (объект) + int c = func(); // Пространство кадра стека (вызов функции) + return a + b + c; // Выходные данные + } + ``` + +=== "Java" + + ```java title="" + /* Класс */ + class Node { + int val; + Node next; + Node(int x) { val = x; } + } + + /* Функция */ + int function() { + // Выполнить некоторые операции... + return 0; + } + + int algorithm(int n) { // Входные данные + final int a = 0; // Временные данные (константа) + int b = 0; // Временные данные (переменная) + Node node = new Node(0); // Временные данные (объект) + int c = function(); // Пространство кадра стека (вызов функции) + return a + b + c; // Выходные данные + } + ``` + +=== "C#" + + ```csharp title="" + /* Класс */ + class Node(int x) { + int val = x; + Node next; + } + + /* Функция */ + int Function() { + // Выполнить некоторые операции... + return 0; + } + + int Algorithm(int n) { // Входные данные + const int a = 0; // Временные данные (константа) + int b = 0; // Временные данные (переменная) + Node node = new(0); // Временные данные (объект) + int c = Function(); // Пространство кадра стека (вызов функции) + return a + b + c; // Выходные данные + } + ``` + +=== "Go" + + ```go title="" + /* Структура */ + type node struct { + val int + next *node + } + + /* Создать структуру node */ + func newNode(val int) *node { + return &node{val: val} + } + + /* Функция */ + func function() int { + // Выполнить некоторые операции... + return 0 + } + + func algorithm(n int) int { // Входные данные + const a = 0 // Временные данные (константа) + b := 0 // Временные данные (переменная) + newNode(0) // Временные данные (объект) + c := function() // Пространство кадра стека (вызов функции) + return a + b + c // Выходные данные + } + ``` + +=== "Swift" + + ```swift title="" + /* Класс */ + class Node { + var val: Int + var next: Node? + + init(x: Int) { + val = x + } + } + + /* Функция */ + func function() -> Int { + // Выполнить некоторые операции... + return 0 + } + + func algorithm(n: Int) -> Int { // Входные данные + let a = 0 // Временные данные (константа) + var b = 0 // Временные данные (переменная) + let node = Node(x: 0) // Временные данные (объект) + let c = function() // Пространство кадра стека (вызов функции) + return a + b + c // Выходные данные + } + ``` + +=== "JS" + + ```javascript title="" + /* Класс */ + class Node { + val; + next; + constructor(val) { + this.val = val === undefined ? 0 : val; // Значение узла + this.next = null; // Ссылка на следующий узел + } + } + + /* Функция */ + function constFunc() { + // Выполнить некоторые операции + return 0; + } + + function algorithm(n) { // Входные данные + const a = 0; // Временные данные (константа) + let b = 0; // Временные данные (переменная) + const node = new Node(0); // Временные данные (объект) + const c = constFunc(); // Пространство кадра стека (вызов функции) + return a + b + c; // Выходные данные + } + ``` + +=== "TS" + + ```typescript title="" + /* Класс */ + class Node { + val: number; + next: Node | null; + constructor(val?: number) { + this.val = val === undefined ? 0 : val; // Значение узла + this.next = null; // Ссылка на следующий узел + } + } + + /* Функция */ + function constFunc(): number { + // Выполнить некоторые операции + return 0; + } + + function algorithm(n: number): number { // Входные данные + const a = 0; // Временные данные (константа) + let b = 0; // Временные данные (переменная) + const node = new Node(0); // Временные данные (объект) + const c = constFunc(); // Пространство кадра стека (вызов функции) + return a + b + c; // Выходные данные + } + ``` + +=== "Dart" + + ```dart title="" + /* Класс */ + class Node { + int val; + Node next; + Node(this.val, [this.next]); + } + + /* Функция */ + int function() { + // Выполнить некоторые операции... + return 0; + } + + int algorithm(int n) { // Входные данные + const int a = 0; // Временные данные (константа) + int b = 0; // Временные данные (переменная) + Node node = Node(0); // Временные данные (объект) + int c = function(); // Пространство кадра стека (вызов функции) + return a + b + c; // Выходные данные + } + ``` + +=== "Rust" + + ```rust title="" + use std::rc::Rc; + use std::cell::RefCell; + + /* Структура */ + struct Node { + val: i32, + next: Option>>, + } + + /* Создать структуру Node */ + impl Node { + fn new(val: i32) -> Self { + Self { val: val, next: None } + } + } + + /* Функция */ + fn function() -> i32 { + // Выполнить некоторые операции... + return 0; + } + + fn algorithm(n: i32) -> i32 { // Входные данные + const a: i32 = 0; // Временные данные (константа) + let mut b = 0; // Временные данные (переменная) + let node = Node::new(0); // Временные данные (объект) + let c = function(); // Пространство кадра стека (вызов функции) + return a + b + c; // Выходные данные + } + ``` + +=== "C" + + ```c title="" + /* Функция */ + int func() { + // Выполнить некоторые операции... + return 0; + } + + int algorithm(int n) { // Входные данные + const int a = 0; // Временные данные (константа) + int b = 0; // Временные данные (переменная) + int c = func(); // Пространство кадра стека (вызов функции) + return a + b + c; // Выходные данные + } + ``` + +=== "Kotlin" + + ```kotlin title="" + /* Класс */ + class Node(var _val: Int) { + var next: Node? = null + } + + /* Функция */ + fun function(): Int { + // Выполнить некоторые операции... + return 0 + } + + fun algorithm(n: Int): Int { // Входные данные + val a = 0 // Временные данные (константа) + var b = 0 // Временные данные (переменная) + val node = Node(0) // Временные данные (объект) + val c = function() // Пространство кадра стека (вызов функции) + return a + b + c // Выходные данные + } + ``` + +=== "Ruby" + + ```ruby title="" + ### Класс ### + class Node + attr_accessor :val # Значение узла + attr_accessor :next # Ссылка на следующий узел + + def initialize(x) + @val = x + end + end + + ### Функция ### + def function + # Выполнить некоторые операции... + 0 + end + + ### Алгоритм ### + def algorithm(n) # Входные данные + a = 0 # Временные данные (константа) + b = 0 # Временные данные (переменная) + node = Node.new(0) # Временные данные (объект) + c = function # Пространство кадра стека (вызов функции) + a + b + c # Выходные данные + end + ``` + +## Метод вывода + +Метод вывода пространственной сложности в целом аналогичен временному анализу: меняется только объект подсчета, с "количества операций" на "размер используемого пространства". + +В отличие от временной сложности, **обычно мы рассматриваем только худшую пространственную сложность**. Это связано с тем, что память является жестким ограничением: нам нужно гарантировать, что для любых входных данных у программы будет достаточно памяти. + +Рассмотрим следующий код. Слово "худшая" в "худшей пространственной сложности" имеет два значения. + +1. **Ориентир на худшие входные данные**: когда $n < 10$ , пространственная сложность равна $O(1)$ ; но когда $n > 10$ , инициализированный массив `nums` занимает $O(n)$ пространства, поэтому худшая пространственная сложность равна $O(n)$ . +2. **Ориентир на пиковое потребление памяти во время выполнения алгоритма**: например, до выполнения последней строки программа занимает $O(1)$ пространства; при инициализации массива `nums` она занимает $O(n)$ пространства, поэтому худшая пространственная сложность равна $O(n)$ . + +=== "Python" + + ```python title="" + def algorithm(n: int): + a = 0 # O(1) + b = [0] * 10000 # O(1) + if n > 10: + nums = [0] * n # O(n) + ``` + +=== "C++" + + ```cpp title="" + void algorithm(int n) { + int a = 0; // O(1) + vector b(10000); // O(1) + if (n > 10) + vector nums(n); // O(n) + } + ``` + +=== "Java" + + ```java title="" + void algorithm(int n) { + int a = 0; // O(1) + int[] b = new int[10000]; // O(1) + if (n > 10) + int[] nums = new int[n]; // O(n) + } + ``` + +=== "C#" + + ```csharp title="" + void Algorithm(int n) { + int a = 0; // O(1) + int[] b = new int[10000]; // O(1) + if (n > 10) { + int[] nums = new int[n]; // O(n) + } + } + ``` + +=== "Go" + + ```go title="" + func algorithm(n int) { + a := 0 // O(1) + b := make([]int, 10000) // O(1) + var nums []int + if n > 10 { + nums := make([]int, n) // O(n) + } + fmt.Println(a, b, nums) + } + ``` + +=== "Swift" + + ```swift title="" + func algorithm(n: Int) { + let a = 0 // O(1) + let b = Array(repeating: 0, count: 10000) // O(1) + if n > 10 { + let nums = Array(repeating: 0, count: n) // O(n) + } + } + ``` + +=== "JS" + + ```javascript title="" + function algorithm(n) { + const a = 0; // O(1) + const b = new Array(10000); // O(1) + if (n > 10) { + const nums = new Array(n); // O(n) + } + } + ``` + +=== "TS" + + ```typescript title="" + function algorithm(n: number): void { + const a = 0; // O(1) + const b = new Array(10000); // O(1) + if (n > 10) { + const nums = new Array(n); // O(n) + } + } + ``` + +=== "Dart" + + ```dart title="" + void algorithm(int n) { + int a = 0; // O(1) + List b = List.filled(10000, 0); // O(1) + if (n > 10) { + List nums = List.filled(n, 0); // O(n) + } + } + ``` + +=== "Rust" + + ```rust title="" + fn algorithm(n: i32) { + let a = 0; // O(1) + let b = [0; 10000]; // O(1) + if n > 10 { + let nums = vec![0; n as usize]; // O(n) + } + } + ``` + +=== "C" + + ```c title="" + void algorithm(int n) { + int a = 0; // O(1) + int b[10000]; // O(1) + if (n > 10) + int nums[n] = {0}; // O(n) + } + ``` + +=== "Kotlin" + + ```kotlin title="" + fun algorithm(n: Int) { + val a = 0 // O(1) + val b = IntArray(10000) // O(1) + if (n > 10) { + val nums = IntArray(n) // O(n) + } + } + ``` + +=== "Ruby" + + ```ruby title="" + def algorithm(n) + a = 0 # O(1) + b = Array.new(10000) # O(1) + nums = Array.new(n) if n > 10 # O(n) + end + ``` + +**В рекурсивных функциях необходимо учитывать пространство кадров стека**. Рассмотрим следующий код: + +=== "Python" + + ```python title="" + def function() -> int: + # Выполнить некоторые операции + return 0 + + def loop(n: int): + """Пространственная сложность цикла равна O(1)""" + for _ in range(n): + function() + + def recur(n: int): + """Пространственная сложность рекурсии равна O(n)""" + if n == 1: + return + return recur(n - 1) + ``` + +=== "C++" + + ```cpp title="" + int func() { + // Выполнить некоторые операции + return 0; + } + /* Пространственная сложность цикла равна O(1) */ + void loop(int n) { + for (int i = 0; i < n; i++) { + func(); + } + } + /* Пространственная сложность рекурсии равна O(n) */ + void recur(int n) { + if (n == 1) return; + recur(n - 1); + } + ``` + +=== "Java" + + ```java title="" + int function() { + // Выполнить некоторые операции + return 0; + } + /* Пространственная сложность цикла равна O(1) */ + void loop(int n) { + for (int i = 0; i < n; i++) { + function(); + } + } + /* Пространственная сложность рекурсии равна O(n) */ + void recur(int n) { + if (n == 1) return; + recur(n - 1); + } + ``` + +=== "C#" + + ```csharp title="" + int Function() { + // Выполнить некоторые операции + return 0; + } + /* Пространственная сложность цикла равна O(1) */ + void Loop(int n) { + for (int i = 0; i < n; i++) { + Function(); + } + } + /* Пространственная сложность рекурсии равна O(n) */ + int Recur(int n) { + if (n == 1) return 1; + return Recur(n - 1); + } + ``` + +=== "Go" + + ```go title="" + func function() int { + // Выполнить некоторые операции + return 0 + } + + /* Пространственная сложность цикла равна O(1) */ + func loop(n int) { + for i := 0; i < n; i++ { + function() + } + } + + /* Пространственная сложность рекурсии равна O(n) */ + func recur(n int) { + if n == 1 { + return + } + recur(n - 1) + } + ``` + +=== "Swift" + + ```swift title="" + @discardableResult + func function() -> Int { + // Выполнить некоторые операции + return 0 + } + + /* Пространственная сложность цикла равна O(1) */ + func loop(n: Int) { + for _ in 0 ..< n { + function() + } + } + + /* Пространственная сложность рекурсии равна O(n) */ + func recur(n: Int) { + if n == 1 { + return + } + recur(n: n - 1) + } + ``` + +=== "JS" + + ```javascript title="" + function constFunc() { + // Выполнить некоторые операции + return 0; + } + /* Пространственная сложность цикла равна O(1) */ + function loop(n) { + for (let i = 0; i < n; i++) { + constFunc(); + } + } + /* Пространственная сложность рекурсии равна O(n) */ + function recur(n) { + if (n === 1) return; + return recur(n - 1); + } + ``` + +=== "TS" + + ```typescript title="" + function constFunc(): number { + // Выполнить некоторые операции + return 0; + } + /* Пространственная сложность цикла равна O(1) */ + function loop(n: number): void { + for (let i = 0; i < n; i++) { + constFunc(); + } + } + /* Пространственная сложность рекурсии равна O(n) */ + function recur(n: number): void { + if (n === 1) return; + return recur(n - 1); + } + ``` + +=== "Dart" + + ```dart title="" + int function() { + // Выполнить некоторые операции + return 0; + } + /* Пространственная сложность цикла равна O(1) */ + void loop(int n) { + for (int i = 0; i < n; i++) { + function(); + } + } + /* Пространственная сложность рекурсии равна O(n) */ + void recur(int n) { + if (n == 1) return; + recur(n - 1); + } + ``` + +=== "Rust" + + ```rust title="" + fn function() -> i32 { + // Выполнить некоторые операции + return 0; + } + /* Пространственная сложность цикла равна O(1) */ + fn loop(n: i32) { + for i in 0..n { + function(); + } + } + /* Пространственная сложность рекурсии равна O(n) */ + fn recur(n: i32) { + if n == 1 { + return; + } + recur(n - 1); + } + ``` + +=== "C" + + ```c title="" + int func() { + // Выполнить некоторые операции + return 0; + } + /* Пространственная сложность цикла равна O(1) */ + void loop(int n) { + for (int i = 0; i < n; i++) { + func(); + } + } + /* Пространственная сложность рекурсии равна O(n) */ + void recur(int n) { + if (n == 1) return; + recur(n - 1); + } + ``` + +=== "Kotlin" + + ```kotlin title="" + fun function(): Int { + // Выполнить некоторые операции + return 0 + } + /* Пространственная сложность цикла равна O(1) */ + fun loop(n: Int) { + for (i in 0..Функция (function) может выполняться независимо, и все ее параметры передаются явно. Метод (method) связан с объектом, неявно получает объект, который его вызывает, и может работать с данными, содержащимися в экземпляре класса. + +Ниже это проиллюстрировано на примере нескольких распространенных языков программирования. + +- C - процедурный язык программирования без объектно-ориентированной модели, поэтому в нем есть только функции. Однако мы можем имитировать объектно-ориентированное программирование через структуры (`struct`), и функции, связанные со структурами, эквивалентны методам в других языках. +- Java и C# - объектно-ориентированные языки программирования, в которых блоки кода (методы) обычно являются частью класса. Статические методы по поведению похожи на функции, потому что они привязаны к классу и не могут обращаться к конкретным переменным экземпляра. +- C++ и Python поддерживают как процедурное программирование (функции), так и объектно-ориентированное программирование (методы). + +**Q**: Отражает ли диаграмма "распространенных типов пространственной сложности" абсолютный размер занятой памяти? + +Нет, эта диаграмма показывает пространственную сложность, а значит отражает именно тенденцию роста, а не абсолютный объем занятого пространства. + +Если взять $n = 8$ , можно заметить, что значения на кривых не совпадают напрямую с соответствующими функциями. Это связано с тем, что каждая кривая содержит константный член, который сжимает диапазон значений до визуально удобного масштаба. + +На практике, поскольку мы обычно не знаем, какова "константная" сложность каждого метода, только по сложности мы, как правило, не можем выбрать оптимальное решение для случая $n = 8$ . Но для $n = 8^5$ выбор уже очевиден: в этой области доминирует именно тенденция роста. + +**Q**: Бывают ли случаи, когда в реальных сценариях алгоритм специально проектируют так, чтобы жертвовать временем ради пространства или пространством ради времени? + +На практике в большинстве случаев выбирают обмен пространства на время. Например, для индексов в базах данных обычно строят B+ деревья или хеш-индексы, расходуя значительный объем памяти ради эффективных запросов уровня $O(\log n)$ или даже $O(1)$. + +В сценариях, где память особенно дорога, наоборот, могут жертвовать временем ради пространства. Например, в embedded-разработке память устройства очень ограничена, поэтому инженеры могут отказаться от хеш-таблиц и выбрать последовательный поиск по массиву, экономя память ценой более медленного поиска. diff --git a/ru/docs/chapter_computational_complexity/time_complexity.assets/asymptotic_upper_bound.png b/ru/docs/chapter_computational_complexity/time_complexity.assets/asymptotic_upper_bound.png new file mode 100644 index 0000000000000000000000000000000000000000..ea6127c3da7807657e3e53ec0e19f292e44f151b GIT binary patch literal 15236 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_computational_complexity/time_complexity.assets/time_complexity_common_types.png b/ru/docs/chapter_computational_complexity/time_complexity.assets/time_complexity_common_types.png new file mode 100644 index 0000000000000000000000000000000000000000..c7c4a9fc17ed698a216c59c991bd8dfcdb140819 GIT binary patch literal 15452 zcmdUWbySpJ6yTc~y1N@iKm-&JkWT4t5k?RYkwztlK~Pdc6a*y%=|;L{6r@X#knWJ~ zp?C1N=j>m5_U!(*bB6DI-0!_x@4kEQyYHKDJ)QfcL`*~g08(`|Wdi_kvA58E0vNWz zWZrs=Z3x}e%sl}hYq|P^e7H%*j0HkG4el#~;$D_j>_0dT3fc+)l*JIAJ-QnIOi#;5 z1IH zA0Hnhk;tRk@|BgP){fTWFF~FSn}s72AKt%DPyf_A&|6qgfaw0Y6B}PyS((^U=~(b} z^O4BxE8i6xb1bJEKwVkE$a`#k@}X|B#(`_I2y)`)BBM7qtM^vDF{w$wFJ-DZ&he{ZsxL=rTqQYrXx z+VQSE;RE;~{i|bZ>g(s#FEr|XmvoSjQ0~J;>iS8+z!lBCjl&D=!##nHd`{#WIAlTS zeO_^MQ?yl8H2;7zFY2+gU(N6Gd)hb1zt%po?kumpW2M&og>1akN$B^u^T$l2xrYq_ zojd}SE!4QbI@`6^V9x)+db6R11#Qds;Pg?@2Uek>NhQ+B=4ZW%tL&bC0?qF=$A5^D zq*n!$Xup?;nudvb7PObQz@Jr-)njg%7LdK@W*6Tv83illGy}&{5UtFURbq6piAvJ& zAJ|QFdC&MGn)zR#LGD8Aw=-7(4|3L9Xd{rhe%`^l@mkkAKCIxo^iYYyvj~B%e{wVM9g%tz_+!VXwlw^V@E=7 z2DXPoTCF=GJ<_xeD6H3^h1v0CP&u)g;-DI@#gq}i6z6*>4w{vRf~YJ zf`Yk)vF`L9hb{^syXMD}L&Z-}JZ$8(H0W%bjfi44j~9O}{se?>+BPh{kWf53d5He2 z2}r*~+pR4iOYTi1&bC$YGS%g%QlYz_R;wP#);$cUgTt&I-FRn{ z)}Qm6b3~=*?-GmK%NK55iF*pGdF$|fq0HKmk>19=lJ3E?AZ1&5#(pBz#PQd^J+WS!;f~ID?al9J0o(BDB*7N{Uh$5+4b))gFgHAMf zQ(gIJAYof{&==1fUI9T_uC*6uI<%L0p(N&eb5@Y zhuu0t!u5?%l1~>=@B34Qs3%F_B2AlJ%-n7Vi@e)jID*yUcTcR2En@$w0%sTz$IYE{ zLX1DIcNm1^XQK>SxDX6BX&6`4NMmUdgE_=ck2-@nR6HWFrf&ZF zEEF=aq%VDUJhf#YWzB$oj9@wT|VF8=(4-aiUDnnF4_{aq9}`6u|{ z#=zj8U{mNv=j!;EK8$GuG6-qfy}tR*?`pn?&fw5gJYko|pEe_=!2+gziOYp}o+I#t6kKg5;P zHuo}bAPa4vh`A&V=O+>VqBD!fLzOxS%cdo~t%;kxkt(S%y@JJT6Jvgp}Ri6b>1^dMd*w>q8vtN`l7vh!&i)Hr1_#f7-Bl3bAzix4a_nK!olA z=2y6}xPPFQ-v3}-Ww{RE>DiH2e&H3h+lHfe@C0y8j(-o9$kQDj-TH?y$q!nE zTayYIC04|VO@cikc9Z!J?sEmt_=mHbS-$T_G9Dbe_U|m?JR^29{;!J&vI>ldft%^z z&iobF?mzHr>#*ZO2I?;bQP&yA9Mu^c?wP_2$rGU`L@f1 zzwtEIY<`vu&h@Ud8iK;&DP@2gd$do!yidAk*HP3l#sf&F<&$W1g2x`4OBl zB8#_WPEF#s+Sw(0ZBv=#J1@oc$0st5)uC0kD{&{Ee2wiq_f_Qq1qhM-BeaQwp39Y9 z3Pyde24+h>#R=V;cMP6fqg!qLaGyg`y!F|O;<@jcIS~Ya04TB-rWha(^qu^p1gb%M zp6d1NzkV-{R;adl#ymWAqt*W|ZqWlA@P&L>mJe+y&)XG!6kOE?VW2hF-V9BtEZoXx zUv543A=3LE7u}>K{2$5ymQwjxqA>|`0!}WpjWwdzLJq$Km2s>wn< z+xR1&m9C)uuFG{)0Y;zW4#$X9+w4`#KD7*%P%+?Lm; z%yje=nDF3nDBW_%c=|~Dm&?5ox{sY(kBR#Zar=!_S4nZ`zI zq1crmfe%iF!{K=E~9Q!jcYyNi7ww`p4&HRho9~R`Ci`^1!wv%g;+pz z=2w0p`WPRW6WZn>TLoXtUt&3;-u_iFEBI3+q z`DJ(m>{|OcL=dAb^&k(%SXYdjaTq{79aImX1zT&8i~h{@zT22wQA*^Cd_h;LFoph&7tvW3{KpaLW+s z@5DH`m5`T%GpUdK3E^PWmgEvY55z;xbtdidf=L#5Q4<0N;=kS}!xDVuG>h~MLair0 zk8>Qf*fa`qiidSaNI!@H+U$`@yTYJyPt16w7Wbl-5DllR`E+Xak4?#$wA%9&R>AFl z*JJ$~5Rq^$TzSX0#u=`beURueiBEiMl4#%Sf~>};Upf?eBRIsl(CI3%Jn9gv-Jjq9 zI^xq)%zIjXfeDnJ?KPpQv!yVq7Xmqq8!PqHhfD z0)(G1Yo%3S_ZkGR6Fx!xdoMJ`v?QfxRlcp3$I@rkakQCp@8`nqi>N%mpnbtU<6cDG zZ&lcDR=^H}=c=wm+|+)@Q}iBSIUwS`fs6TiZoJL1;Y@EhLU_Y)6J2HnOP5lyas+?5 zONMpEIvt*Uc78pM$3a*@TdYB+$V>tVa6QpHxV#%%gZh+W0RlGRid7O_{aXF*M&lui zdMT3Nvu+tA*J}B8v23#Fq;1&((@>ffE?UH9#jcJ{=xZ+Y%>TnO+ec_(w^hx2>A-7v5JaB$BdpiD8bxMk8sof^gWu=d8k7q- zaKK-hnaIPD@V3@_D}61$UL2*k;zqaN15OEe5_F>Z!h(S0%ur@vn(8D=?Zd5SuVLVe z9uTNF@7WDp$jLYesCkXJWj}AEz~m?O&j(zvxHV;-pVKV94DO#`w`T)zn`#vp5^yYp zQbUmksfYBw{ZNq=QpaSns1WDrQ3q~t^{@wWdF1+M+7$wKvT5Q}$JoKJ78n}{Hiyok z=L683!45N8assIRkQl3sNrUnD{jT%O%W8V(3)n+b;zVEg&6 z-3Jth;yB=eDq07{@>S`|ME%wzQPAuclxWf2g!aAyc{LM2a0SPC3EZ~ZW3Tl7zb+vc7a#c z2tqCj&wI+5$RtQWJtA!0t2AT~4&>WEog3e`zGW3gcnq0AGhZ^Xgp&is@9VA!eb!hQ z6y6#BZ^22NGIs>H0XP7yXEGmC0yy|Ru5>eaq55n6^~c!zAcFu36csjHMg2H=aIPF& zS{X_|ga!@=+0MZ%SX;&|L&cpdYViVKNTUGcd1KGt{?<3cJRrnFzd;eI69-`N?N4pH zUd(Yz%#?x(Yv`-1VaEiQ0(0j8$q59VNta=Sp_DG!)YT$t2_<00oaZE4~9{zf?2I zr!E7RncckexPV-N+Hx+j*Te7NAt7SUxt&fa~9T0Vd31?J?T z@6`8iH$Xin9{4h1>}o1EgS-?3nyoi0Uwpo{Q_z()Ctnh9@kV3EQhNZ)V%MSgcrill z3*k~9v~-#r88EPZ@YQ*sQ>bKz283u~UJ|>xq1hqmAohsqULBM&kK^ zs?fy(;PA>hdBh^D^NNrZ-Pu6(c$-k3v62rMa2a}sTc@G$P@axDVnq` z7#vbPYjjke44y17ns)kQ`)k#mOGYK23z6)x)&b;KTn=oZ94u~d@Zxizv(Qx3dtaP% zlJRSRv65gK^U*T=>2hNTR8oF@^{EPZte_DNt~3CGJg)MNR!t@oleOS zh{VP zbb@EW<4Z9wY9wFWFKZRP%;AP>UD@KduScnK+1?+2);NAdhK}C-=te<3s_|Gah7>5G$S<2FA%lY_N4g6I;0cQQYmyyg znowTn{Ud7RfS1PZK_nYWLDK4A2$C+6ofx6=TfBYcttkH(b%BYq=3qh-aQiz5B}R*Ru_A+OV~_71DdcjdMxmd9 zI$I-CJv=tT-OsG_0sF^pvzMl2ldJackIHy3I^16Ityo-?H>5D4(frKFMLLjk&U8}}{el~R zRA*HIxAS+ZZUTrh^+a+(9|y+$CDg|WszA_QG`cc}5z8w+c95H z&UXWZ$cTtlD&)1>&z^CMLkoXn6TmNoV1~T{g(AM38o~KyAEbiQ2CE64uzvpWj_*EK z&xZONm(b>c39H|hsTip~TWMKu59*Kw!*9p}pk)Yaden-phQ*2!A-lC-gg9`DL(D2a zq^#Hu`Y=yDWuFn{IRTo#@Xb0&d7tsRtgmzEDkseK<~8vDk$W;=A+mIk<-+B~g*Ld$ zY!U`Iu~h-$j7BHsc0BNb?1e^5sAuS&(M;)5H-y*BO%F($n>Te;RB_HcifPFd0(XPP z;9SnHY;E7fGlOUAF6iE|joYwvk-Hl>jK4MZKIJ<5_TCZfSaiP*$a|N`>ffg}!b&yH#1z-& zf~vAS?w9vMOuAU$uGhCmKju#6vo?L3{4vZR6u!?@??_r!+DjwTy>C`$K1Q6IH(&aM zKb7BvP4W&Uho99qDiF54bu>H8Tpjcbvd!P|@@N*%&8^xcX zzrz(={8Dnar2s}!NHync!^3-NG93|5~_8Tr1bjC_oX%qhWzPamBL2;_0Ty^2P@ftaJ-V2Vv>|J-!a zJ;LwI;OhzbHIGP^X;#QZ-&C!jc>YcOQQ_j2Z6!$~H-Tpk%payNS;^}-aKfZUsmvc5 ziiF#i#^?E0n!GHix56R3O6AHL&!nE!l7A~8&CUk8{2>K0`W}A`k;%@BBS)D)5_}s+ zKt9?zU^`ZxeR5xXkqPi2W=nv)A=o^;&M*!7HQ!csy4D=WkslqYYYZ1q#Rrs{3)7zs zTHj;>l|*Z0wVhBih??=V$YLej{D`Ab60K$>?^R;`jr0vb5&(+bK3x1~T7tY`k74Qh zxV7zfn+yXfTb{g-T}@Q0qlM2IbBki5FP9bn<=y9KZeS+EEu0pxiUT+1(+_iEdtCtQ zFUfSnM(8l_yffx4Bw_7mL2C0mBo^qxD0kL#80b6g&Na(%`1M~`E zb{8t`&)e=y7U5b;<*XOf;z<;?ce+1X?}st$S#kNbRn(<9%$HuN=(f^DPv0!5)C?8k z6U6P&`V$WRe+b%9F|T)B+aaFQPAxxwdRbJY#bHKHDX|+T%J_+`whStlBgq-OGolm8 z&UZ4mREU(igpIHnh_YAhbef7SNgYe+s-NVUV9RV;i_5T0{+E|YDg;-_j*auN!%K9C zFOD3glzEikjk$tH!sJ&2pYdOkZ8)n{A@2S_gIwGgVRn3`BagtcQy*-s# zp;D7t#Xo7pMcy~Z?GShkUxs{4?IHLboKhcAzO90T1CIDEO&G1w5byf~eT?A6uReS* z^%r)Yb=kAulxdHX@&qfjP+VXq#6j&u5*HnvktRKIEpeJWteRh<@>ZLUy1k-ESERMf6q?9=%|!Jv=`e5B#yg4DFW$zH(IT zSVNdcR=vPumTLHiZJREt5Z6n)TJcckBwU`Hs0vvAn+$*mCgUJ4|3lof}h5h^5B69njd%6ogBED5iXtf4ZSjKeluOgkbg2!|Wz9H0@Tj}pDJOK4Ox ziy{M?(s=QKwmLNmz?V!O70M~W0A>WSG`_Oqq|bu}84Gt9c4^IQ^=q8mdT5ISS>XVE zk8bv2-3;b_hSYJj&Hy=-;%cEst2*qu7F`Y710=mg^4LAzS@Y)0o-4@dmDT~yMb%y- z1$J43Ft=M{9jIHg_>imO5P?I+hqLkSBSq{z;P`Rt=v3bm)uoGN3HuE6Q=cVupo#*7 zaIW?qTocXKvxp9!9>FU_P~gQHIDRG6RZy7ax=1aA$dw=5RQiW$u4u=(dHQfW7_3J< zew!A6J%&YwNn*xDS4Za3OrfP!BCiaXwCdoGV4Rm&K<;nDKk7rja9i zLLH7e%ho+M_GjL6687ix{Sv+St{R>RgSo9J?_-aMxvU(@E8#EsFJwn=2Dm;1h{k;> zp633)p+u;AT)WGn{z4|wuSrncY)oD1g?WtOAFJ~Ukp~r9G*_bxD0aR1&+J^0(@==n zOsL+;gO=sxtrqbVK`2MuvpF+ORhTf-Pm~7#(n+yC>@78+#Et>h`<+Sc*ISx}qn0DD zDC($MaU-nr0QvjHUo;?FlK2f}hsQ;Ad87W%ZaYBZ`}{U=J#sR^TY^B5e#kV5+3cMo zZ{jmD*eziypBGEFAaG3xPYXs{hd`Z7-SJ)~^4eI$?hT%^;A`O_#gR1NfD{wo>GTd6 zhJVnwu*fQ}6S8hdRZ4{nOs(?E9q(K#G90EjAd`+?>8S{#hj8Z(_qnqbM#s zrh9F6y5(qE56LGokpmtS>b+l>yP2`1Fx0GUHe+dS!UcF`=ZEkvuJLcm550Y-ag%B% zOocQ7skwj3FH7*3$epD{LIP%D7fj3&n6h zs$uxd7J2G$%9Wo+8=t)+((9CN9Z-7i1G)XwKl_3&l0*IZa?3ktVO;E8qX)S124xoS zy=@Pe#6ahfeSfL|bmkUG4DTy|^iw-&qzn{k*zj#%(?=TZDzBig>5qjIf~BDw5zdlX z>h(mHqeIGvb$T7*{OnN+4!cP{Dx>Kz=SC|7Th)I3@!bztePoDA*9WLC6P~<})$~^9jv%RGC9Aso(QJ7qx05v=fANEs zt?;{Nou@SEP`C?jI@;lyLEM~Ro`#CR48y znY*oN#S`~_Hn`xLL6v_CL0{j%t>qPZXs=gZM2s|o#SZ5^f$Ft49G*Iw&**^8anD*l zQs3Vzp0}|jfyg~OApK@`9uLd!RP&Z%6QT;8*1M{0Gj)FK-?T{KrVVMu1AA0(4TuRX zWyYVobjU(HbZ&`tX~PGXBzsn%rS&?O>h*UDF#i+K*uk&L8nUNW?(Me5XWF4wnNLrv zI0%4VN9cTp-Q@xUwupBX=W6GeFN!sF%(O7`3tEy6V&w*Z}1|Pege%mk# z^~KfiOOFV90XqNS#d)*E9V~F-)-;gv5H#P6z#4X%y4=BQM$9Mq#XK4i&QoZT5BY#I{-gS)b)@8oMym-$mAMrAC<=D9rc*;M8;{1Z2s19DjLRM|N| zjnK3dZD4$Eb-MRy@9q9PLNrk*i)^?LRfuSPhBm;92Ok-3=m@+qLOmTTFVc55AQ9PA z*a$$9;@14ouOYdTuzH*MwOsL`>Lb_aVb5+bLJPNG3p7lsRqkrCOqsIt0B~yLJ2`4# zmWo?-zViFay!5?_Tx0xngREV)x!)y~C+M61`J)6OUz^wz! z``p+N#}9d$YJDZ%8rc^YIbWA=eO148lYz9!G?|8-oVP)&^-)Umwy$&n_VpO~#F_i2 z^kx>@;&gs%hJB>433h?r!LZg~5iRlP+pS`}Esn8A)yFDMB+5Pgcrb9XscPj2Stvc^K6mbJ z^5yhwmfGLOLuVNa2fl$FOzs653PTou@4M5R6#Jl;!IRL>_-uKbYbK1m&W1RlwMY$3 zS(9<@*iPeg8-h;xUh-j|TWpgsbM4xpv@lu+mo5{Vp1mnt(>Qs%FeO!ne{oFl5cpeu z6KDZGpn{!wKUw>Gh1ni$Qz zJblos0uSRN02q^LDZO61b>9G4>)RWQXQv{dA@qwV%3qKU8!ek)h_swXnSM9NFJvdK zlPpgMV$u$XkV&#cFRv^FV>2yv?|U_TYA6zShW^4c06No?ZZ+Hv#m30gb$k1Zd%-P}E(eUUY?QDfw1 z-L?}-#-IzyjpT?C?$*PB0Ben=FM_gx+xQS{1y_Yx>jkZ|FheLVD1P!%szbag;J7RJ zhY)625)`PetcR&S0d9u70SJp$3(~o*w%{Ls>F>e)ap4p!TjmK5*(I=bUzc#%Q?mlW zbpJr_5V>nWrV72x{Du=C$Ky&I3Wo@`*6=Uj$VS|mq5vEQEZZZ>Y0p3J6>sBT_!M4c z3vSN)q}}E0s{wLN0g^^LZ*kI5pgXxo2&-_37FnqiZ|*%ux6gaME$rl2NgkDcBKWp z8GXn$n-v5tM=mdQYVpG*<*T*QnNNhAD0*E9n*ju}Age6eF8@f4Y^b_lC&GuCXR?wn{< zaN+C-+jT#;skP{1*yU${4T;|h&Tfdxm6(%(I#M)Z_*5pLSC$RY`%&&L{r38$&y zUdMgGfb^O_!Zeuv>Z9E=EegcDJWRtbNdzceKD&0-IxfqC5KNNW#%{@Mgi7hbdb6u^ z(nHRzjsC5Q%K+OO>z4q0c?h=MFxmEv*U#AMMzb=eJFa7y!WPP8fdoK>w+5QD`#sbQ z_$~)1#&AKR1gdS*%~RsQ_ylqZiWr@GASKZ5 z*B9Cr_e0^tcy)^$gFTgC#(|HVuv+Qudx{-6?~sd200L(+WYxiGs)y&=V&mO&%R7NX zo8<4WFnfZE6>*u#dY-e1EbE6Cuq&7$sOUlnb@|ordlu@w*=5HLCr8qqXBSQTXk#j? zPZ0hAwXKBl7a3<*V&f2wB*fZMW6E_Q>&@D))C1O73Fv_H$*s{TKZL;9R5Tg=MFk@E z0((%A0MxRl^Ht=8R!n;k9Ou|_y*4OSLjAH|{xIt>bk34xopSNxN-1*vkpmE z9@?{tS;0TW2XpV7agn$7#2coz2vtzM?@Q+QgU_)$3-nu1`W6M_+vq zLjVB*?j3gln(;&?b7e%^KPAW7?y?kv3qq`j(0GBceLszA9Z9f^7i(4m>5poIi?s0O?XS=%_2KMfoA}*&*$-Zf6X?$35bjDF)sk6i4 z2&*4`u#?8dtTc<;){6L?EhNj2BRP2p_Fm*2K>j8ahA}hY?YiP%N8H_(Iy-h5N3{vP zkbIFN<^OqG*z^bNgzwZi{MKoaBRnDfX6y0DS=JNYHqUd%zr!l0xL`#R4A~^&1;+IG zov!b>q*&XY3!K#YQ9|u5h;UQA1Hf*LkCeVrZ^P|^h9`qoO}@sA6kvi16tKFy2_z4- zmRmg#TiY;09kEw0%kT^FFcG&yMfkcHZHp2k2(>O%)P+sN$nlcDy(_#u4>J?++{kF< zcG5GeSCW#$2Qv8ZZ_Py(C;r~+-j}a-oWA#Eq^*r`=K2^ie9O{&RVEzxTRqR?5s%z0 zuLm2mHOIF7j=iV$y}tBTDAy^`cOVLOnmD?akF^pWFgmqxdndQrI{I)BocfC)SeKXE ze3u(u*laAni`4}m*kE;0 za!8f^eR$j>%Zz9ez}&p2QdJSe;EDOWouIBaW^bOeQRDg!RGY4*uW^rTM57RH!V)n^XrK9!2*3IbwYzm*H#jn#$Z@c2d66yuNegpD?H*@Js=*?fW2WnzQ_CkmQDd&6~W80RNcUqv<^!0ATsg9t7w`%8`O zfGA{Nb4Yc|6z@^ghUadCfOZgVz0G&pQCYEu-9rI4=T)s20!)DDTwKfb5wiy}z$+;` z!|LJW1H3_Zq#54)b>P&~jbMps8{9rq6=`1U%k=Gv+z}D3f7Ivo*)7#GQLSeO$LA$0 z+v5ab4~EPfIGvgup7f+~cK zj(>yv2aVCg5My_zt^1G6>l(BL&mYu28T@8=XPsqzpz3p4(Km`+vg;e>@Mo|07?C}5 zav}o`xu(HeD}q~3=X$vN+_u^#iFYZCKiz$mtzpV$3tv)U(mbO3*oba$NmxssaTpU~ zG!bcWb!}!Vg>#2}W91-I+NML^_uO8cKE+qi3EJ{5)OUd2|C;hz#x15-er?4-_JTM1 zkTGYekGiOq0WpmK4Po~*Ie1URNS}OEr1Rx% zo}bDI54zc;2*5o;bjj(o`{|MEZ>bA|9LDqg{iZqu%^qm{CFMj(*=)47Z2nZAk zcqhNNw*>#xSh~< zq44xIlO(}d_A4ik%(qJdaYTk1;}y@6A1?$m+l|mz?zV&}f8f=6=cSPIb$HI;Zi600 z_YiJ<7%nBjkJYu-49y>S)>_Y{m}^aRzs0Rh2(`2;^wa&+Q0oWnLh9b}u8b6wc|+fUB<7yS9jo zp}X#&@A1X|)o$>e2=n)%@fg}!FT4R?<_~xnEHGbTD!Q)|~D-yRhCA4tG zF0Gy9jcjzbxdxm59R&Fz2X>Qb&|qkJjM$zC#rkT=s{W zGUhr}As+nnr&qN|oYRpgeeLGCVl)emv#~N*itBF<>*mmT9J~Mg)!irqM;nQrVY`9O z((B|g9n=~&&b*3{8SNy#2&W=0^no!2wcxnT6b=}lq~aP`b-d$Ibo!bNJ0p@{Z9QSk z!s2zTs5xi6vMRHx9iHmvAcFV;(Hn_g-{~U>ibC>{Su_>QAmW(s6F*e(5w8$xjvJyD z_IYy9Ya!W%UYYFGX8>1jm^M#%tqk*yM}$g56)*g;5UYGZm&-LrPyD1p@DKf)uP%m@ zwxZg3WI)n1)*6D0k8?T@WvnrXM-X`r0Gv(|j;CWAMUYi_}*rkz6$vfB~K)C0H3v})m4-GzB`0J90WrYQ#H!PO4 zWGgPvciK=E8}z9(t5FnYIX0__FrR$7J?Cfrx+bpM`SBTlEgo-o-FI3bL0$Vo*E6pE zZh=#RD%q<;5_!seJ0_#DSUCN4&0S01)N7p`52;UR?Ufx`SR}aLo#!v#DE@jqy0*ge zk8_hFGt#tp+1I|w^z!Fp`0{_sHLga5v*2vdBcnRyTn_W~vD5M=lr#6-Y6)V-NX-R0 zJd^D6ujL4-U9$`s7I6Fe%Oju=_W7-4Bgq?z+WhhBalz@6FuiPPdJBc3401agF@tw5 zb4<4tQ3`vuWQB{>b1gI&jme64#!i28BZEAkY!+)^kn!w{2)P$m;G3ab{P%_W0>_gr zu)yeenaJ4Acten`EKYI_btjw7u{)6Bd`W!F!Je?p$ZRP<(eC}%DD(IA-7fnC%1;kD zQ)(Dc5Drd{=ei;7e~yTsB4gQsfaZxW_on}z{M{bGeMaiP!u&aKp$Zk=MH2}d!=LJN z_{Ni+f$ElxA694I4svslIvH41j~f*?F(5WUi4wo@!E#(sUBz=BA+oAJN|Jej@6>*AdtkZyL&&6u@rkUk>T}l_vX>t38+BM z&}aMFki^=LisrITu&?LyO@Hp2*YBq|hcra}Ia%~77_yZmug8bWIGacRIdy&u`uIoI zY^Qvqsvju;mZ?qxbpMwd~a*fslgRb>4e`A5Qu5oU!Y3b@Lr# zGDpc5%(W9IlFOib4>cDj6pHZUMki_q#q9kt1WV(QQEN9@N5lqNJ;RD1-jhme6`myM z2GNp5TgH)ScS&cb8tX$us48-~(!Va$p9JkgWcjVI$VJ-X`-ipO4PhrXB^`IiF^zUl zpi}!HI;Lr`PR{qp7FbzXj@OTD@`Xx*oF;*X%S|%uiHK!Yq{9K@CWhA!^xhUPzCIq% z(NWG$LAK?JKO^ceA0W3oJT*;-F8|E84_I8B_3JjY{7|0U=)unOx`zYfP`8J)R`2qE z4ptb4S65O+p-9mF=AKTIt7Qi|K&LB-tN<haCN9Hx zgxa(u&P*-kjAV?n%E9ofr-bNny4!=Rf=NoVM{!QbBl;20{36KJn-w|hMe25ZEd{zg zL9qSV(Qk9E&J^j68Z7SaBN%BX3hh2S=iknQTABt8mJ2sb26&U8y(TxGhmUJ$O5^^c z;9Tw}#8-JkeAo%OVbUtkuPo)>4_x>jpiZZ@uPuF*qH}hDCU5lYd zX)KnhJgL>8=i*Ne9fAfM<>aIfAHL_@( z5_;TAU693AW(6FPM?nwh4op65uD}4L8L1&^S;ZJKA1d%Lp zdA$2{*AB=D0@Lr+kh2EB;z#Jc=X?d2UwqekvN;YAmLU7&!fXnHy&*ej#M}cA0_^b~ z4hIt8{39n1p#K|M|94f!fV{Ae73YKP%b5P`4ow@-fs*PBPn`D2t@|Hdy1$dbv7Fx3@}SNO)ka|CjL1 zJ)6}X`ivp!8QloZHZy~$yx)5HWrMq$1|n|am8DOA4T<}HZX`huOl4y-Y;Nv_dV*{Q zi-9an7o`ujHCbZ!LJ`?t5XpvG<^US_TX<-O_`o=_!7QhyjPBL#Hn;q~1eyXnt6bVK zX6))Ld2Nwgr}=5QShFP*JUjP2OzADndc<;K2BpBzebKp>!>9G!WBl$~g~%K4RR2_% zaL7xTu)xFYQsV@r$j0j+ryA-;g+w1YCQd#r8|JUSqb+uk{c%oM*WQr4UIrXV zZgzq7a7Hr2nR)4#glI?J>qS}cRoWSkR}~4tjdh~9cung0d%y3X3{r4%?zt8z&?hF} z%EqeKOCU>VW2q`5?&$6B5%uUuj^@}-ibSx{A^y|CF`>(ng{-Unyr{Z6lEX0Rgewf| z@Ea^ecza4Ll}c~5TMhHx+_P}DrrNZ#tgp5+Gm){8cG<7DvYNu9Ui!H}m;dF1U*(Ty z%s%&`24Wm4esWST)` zw!|9jSPE}b7j)chl+lfcAhd9@uU-6~47F+c5?Di~;f>XwysrAHtLP{fE5cv>4`-g8 AZvX%Q literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_computational_complexity/time_complexity.assets/time_complexity_constant_linear_quadratic.png b/ru/docs/chapter_computational_complexity/time_complexity.assets/time_complexity_constant_linear_quadratic.png new file mode 100644 index 0000000000000000000000000000000000000000..984204495473795ed067e461619f06f259dc68cf GIT binary patch literal 12308 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_computational_complexity/time_complexity.assets/time_complexity_factorial.png b/ru/docs/chapter_computational_complexity/time_complexity.assets/time_complexity_factorial.png new file mode 100644 index 0000000000000000000000000000000000000000..735834afba80930ea00338643adbd215204905db GIT binary patch literal 18067 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 #%T!x+82VSURp>~;O5@8b4XCcGEdfRba*v+ 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 literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_computational_complexity/time_complexity.assets/time_complexity_logarithmic_linear.png b/ru/docs/chapter_computational_complexity/time_complexity.assets/time_complexity_logarithmic_linear.png new file mode 100644 index 0000000000000000000000000000000000000000..3a91544bd35fb65649924faa3ed861ebdb579907 GIT binary patch literal 17209 zcmcJ$c{o(z|37@6nPKckma-2ml(h(1N0t`ZvR2k8vZd^0IhIgSq$IMWBD<_*9SO-= z5?M#GZ)1tEKWFs${I2hHJTjpV7sr*AmAOM(Gcq#2cYQZaG`Uw1)-p;?Y+Jnj zaXKO*qPDiy*4B27vXagtXqxQ!N3|NrG@hv}E;Gm;!2F5C5&J^Nxt^-s@aE4?e_!wgUQ2ugo9^y4=eA-#KGa zG+>R5RI@Dsm01ebp0tWaaXgFPdId;UD9_(X`_l~OJ;Wxq-d+7_X89<{B$nm!$^Av& zYuOjCqyvY|ufq(q&48>6O&=n@lOEM>9IUOFL-&2%X}I9q*bvR7y2~5><60|CfLRS| zk9AMMuB7Eh>(h=t0b?c=KE*+XVXte9cR$`Ld$yAuuOzD&?<-D(`USzhk zpp$<1)~3+$S@rR6pBBrf0;6tm(j=^zysg<-isZ{j0rMk-V*R2dj4pXvmjQ0dc2VxUbE78hk57vHVqg$1Gj5< z>%q2Fec_GlJ*)-yK#Mttae*|O@dU?_h^2?P^t;U3Vi@yP&cM{@nTCyzgq)|sXbk)o zwUYH?Kk8}og;OW4XxeF`#O+*tClV=a?h(c5=l)t5GJ8ZLvTD9sfA3(Kj&BG7WM(LX zq5djVwtnnWETYAK!YbmySzOw=uNVGCorbSjk4fG5Yajpt^J9ctLPX;O$9-Br>8;(; zbMVjgPMYWT@V4TC;!HXe7-qMzFu&R|Ra!tpsXs-`?-;Oq)vW6QpMyWS{>IB{;Q%EC zY)eXJ6-|4d6d_!hvOOME(C(IR94zl)Li+kw91GE&Dbt`8mAl62D`OmdE#>mpW(Hw=3qG$)ptMk~UbsB#@Mlbs_)YWeUtZ~i z`&thGD5vY}QFmGW+>i^rUL|hPM=ur=<(298nVv{03b0`54f@s^hp*?eX^F!FvJCV9 zPp~%1Td4wXZ~e0Ry1d2Coez!=F$p~^Jzgo6LgUR!J_6m5n3krvGD43wzdpdf%6Z@= z4ai2nYsAe;{5ENhj^_}ChYhtaxJb!3;oY_bgt7pd*!BIy87!c~Avl2oRrf)(Z3_Y| z|KkUKPAHr6Exy?Q)pUz=2f$v^w^A}L7X=J|=0*S|=rQNjMZ0o#6bB;0w8_U_la>z9 z#V{ckr^w0AVhz00lOIM}z*?dmz@cL~8p6;4*7^mlzJ))0^0)QA7P-Y49XvB9Hr+^L5mah0cQ-yQ4a>C>Mn%tNs zjK=3a)oH7KTlTY2^bGg{Mxm(_m5nc!PY{P8AaIrVGeI`h?9188#X|angH_4RW;GaS zJn8f%lQbWz%Y{2VUtKVKXsR<~YQ-H4Jolo)&#u{ia}y`X>`Uta{Q-u8w?tlMvaR3< zFd*ZP`2-gHkU_~_PMTMWWQv>3jGslvp|4F81`z2Ls^k|=K_b+x{VC9#P!yvoP*z?*-&E^WR807NfYP zR)e(|_PMQ&Wp0~0q=Q{4H=kf}c%aPSaEd)%ZWHCIIMQRfb1Pak$Vf|RK|3y5k+KK=KiZ6F`WF%XDOS17v}QwBchnZz;TFLl~n$M?`Kz zQ9v<5kgEazT^}8g9mOnI$VX^c`qZ%+u7&BFbiMO1Vys=WHp=-?WlAlBBgA^!yOWNM zae*nWsSK+M)vm>l)p*vr{3uoGFep3*Js7f>xUSsn<1Lunk-S#%rr;dPWx74kYqxAO zQ+1QDwHO5;n`_*pUsKhe*q#i<`Z4Pfn0_{NOe48B8x$CEb{XvZL8Aa@rVer zB6nIcAFA?~dij%#=V`qel2k91&>ZWdH{-Nob{;IR4xE`uXGCH&(+)P@!n(uLRfDUe z{c~lK7+>#O6EztRSJjG`Xn~a`{Iy%*_vuNEf(mswd%s?2aL)V zjvWE0FrT-dU>J;Wzpt#7#=o{9z+}(WxTc^cHHv`YtpW)8Wc2FMuHw#Vm?;Fg@VK?H zw$Oq3@NMs^IwrHr%||hX%l8N!xy1g9zhZOSl&|uyhNE~C21B=&&f6y7;D2OyPO(40 zNmI=s(vALZl9{vTV> zHh)pZ)s#kAuV|1;fU9#=MH-2>hk|6d)0DOUT%$dp90^9+Fz=51kw1%rR71gIqd2%J zD|YcD)V{B^TmvRwNAb<}F#DUFQR6Zl#3=*>O0a6etQ@2pcihPFOk~+)NSNR&1!-@e zbh`Rg|1kYeI`TTk_rbIN!8TNtB6d&wffe~1wFFCR6FkcQCGgqaN=@XR4t&kPXBD3x zsty-kgnp_ASzloLX~q-@1Qjqt{I0vb{o~$HpYsf81|!Ls$*$V*_-@H%hCSW;pGzDK zk;c;9JVNj)-g$y@#(X#eN#4+>rCT^m@G334RSdC_`a^+j0LoL<=wZqo=Zt&;Oc!$n zP@%2l0h|_cTsCci z)Z{&hIS??O>>Uc6y~AiRbOpkM+QUxfILccvxGu!(5Q3z656(tm>I*lS5!x7ybJDwq zrjij`VKdA-V+G{|yW@!8L96ZBN{0O46Q@DUq07PxySY01h!5Z`Oz>Dzb*7iZpoe7F zx?*tH)*0Z*`cd9xhSsL}OZ(g?vPJ*Hk(P`qoQC~Gz%uLIOf&&}IZ9BXvH3OsbQ(&V z9#lF2Py{`wPXye1a+=AS9tGHd=B^={ubhJg2!lvOgeJg21nLL{(*a=&l>qq$k)5jG zoe@O6JVQfDQ&Fc9INrP{=%X%Q`Kff4ZmCSnqQ%36b7DUbE^!7dgZn>RJO2L97K#ui zC;n|iv`hP$vwGT3!8&f#o>f;0;H8pCQAA1loEb4ai+*^eSpWRkpFR63va!2<@%vt0 zrrO^xl4gv4#nq%Sh26m+<~}b{7(axkns^%E_|HRBlfMDB|Jtiz69(|<(El+#oQT-3 ziAIQo_IQ|r5g#IH|FJ`aumh-rAQH!nc)g+~`m6f4@9r+^79WaG^5AMo&HUbIA6Oeo znP1!XF%M*c@R#Y~m!Z!ZT=@`jB-?-A|B2h4E^wBr3?lICh44EyWFUsB4+YB-FyNc) z;HCSeoUG<7OyCdhpl@;$#;d+uDNJ1jmBre#1i`ocA1i4<;(!%@u!hm$V zbYODElR=|hN&pZvDLCY_*6lj%^~pcuTLfHA~j9dO0u= z;d)Fv{f-d*@IC=!hmYOpTUqh#RO^O#(=4BxL`XfA^Sc;+-9~&c=i#|mmc+w!!~2-Y zwt5R$gQ33{##?o$D+Yo19?(Kg7XKS2A#lY1d*0BKzsJLF(zAZL6Kv6i_8D(GLnYIu zNCy4D5+gQ?W&$3cZg~Fn!Kc5O_mmw`vK9iQRmF2!o7J0e^F!lb6OOxMWSt98`?+d z5Z%~~#{%}3Mbs2^y=cL=z7eAgKMadgbY@A8H%NR4+s2y7=pU5rzBkfyLO`^iK`D^_ z662>X0To=&%*onBR^G$N{?LG8(dJua6)4r!BT&;-U&2|e*InalnZpXU{qVERu4@Dn z_E$cW>YjN|krKO2c~c!qVIdmfLsBkP{Cx-?J<#HZzvHdHzw$3pmcXy2Mc;}P+~!7H zb$otrEE8+ZFQCJMFy5g|pQHsi)|zgR%7=j+=g9XTW^R80cmXCi7|G#-{-65e2M_{B z*wK1q`GpFI#M<$YBK@Qd)8i047#?wcfu;kCHg?R?=Lf4^6tp5z&M>6*%t8d^16?2@ zP$xdfV|>q{)-VS#dW1BG*&rz^^!||;LcFi7Zj3e-PtQ&xYS8L*AihpLb}#GkZO zCLF#TPP|lINZDW^UbKs712JU85Oa0TlFQhN@Ti;e>Kl+~k^PTCZm>@k@nyz@SdtX9 zs^`A4!(TcCy$i~2i2yh@Rps80d?}~0s`-zSQ(q*_P|`H8<7G-%%=O{>owI5}Z#e*Y zM&QDGn+_1Q)cz~ba!bd^byw#klJ%cNE=(sLJ3$9($Low4S4rwk6>>^n+pgRk$lx#c zxLW|B2(pL$(+~S~U{FLUU+Magxx1a!`4T533MgbbAAKKP2MGRhlalgHOxyBw0+w~Z z;Dbf8?LcdK2o_LIaHw0A*P6c6lfmv`{rXvu+1<=h=Ia5=0K)Td*BrZ>J$GX^T`vs- zKlGFC32D14ZEM-@p*Kv)xM+T0kK04r||TgU5}NI~#&K3Ig&dqjPcs>qZfmAUJKE4N9% z4O8!3%u!Rvx1PU!KCru|E&o+bO>=$+%D0Z&%n+c2iO?cL&nGlCK*_v@w(`ZJce3vyB0 zj~!%wubIY)utAsV!>W8~Pa197T>*zvymNLNv*Vl($m_d@Wrz1nRt7Du-Y#3JZ#w1% z57G|{*M^N>rgG>4QYz)|8~w=J6PG`gPfER-+LLVrCQ}OCLb{V{PNXH@ea=?%LZG#r z>R}=+F&qAqJk_G+GN4PjenwH0)*uc6qOL9=WG4dh~Oomw8x6 zC00P37+McWR}RbUMhFx_k1Qh3Q{tDAr?o`6z{9SU&BGlNHY7Fa-v)pVNpQe-PSpAP z>BBm2=K7B!TQVx_ph48YbrBsGpZ&iES1N#LINAWGip+e=fZj1yR~fn<)7JX}6iX1%V`zx$#$P{>yxaj<CTO0 zr4i@k==ib*{VLaU+7zy3n+h6V1fwe4e019iWp%E2hj#FR3e4Jj34%1J#WwUT-$Jmf!G@GEm(R3O}wlD9r#f{6yjDpW{py6 z)a5%cI6QA666GqP@+TYjZHG@+kbz!M01)@VV~m?eZ-wb($GUQLGrKDQubXIDpOaDT z8AF#kIbXJj&mnR7JoakUt$D8S;cw%fxIg0$mXJ+VAYpc0|c<^?33dEGr<10WW%D z2`$N^!cz>ij4Z!P!k0liN7jDp3(4bH271dK;kD1(^eM}rxYCxipe~W0qBwEse2f56 z{bRTf#Aoi}T|qoHZo~JB2CAkpHZzta{T^_$V4>mB&9x;SQmRJWA$K!I)=F{B^CzVZ zZYj(9X|l5JFgAQ*1s?qy!u@~4?4Fk~OUo}fFMoAFS3OH>ndO_zeaU7%#8nn?xTDB% z_#BHOn|l;>dyW(}pQA});@w)m#Q4$v9~NygABxovCCugv_yHm zpcYDe7@&9V(n4TMYU=RBzF0M%;F$-JbO_hw-CiYj2`yXv0~Q^fL-aWEZmriB)GosopuV(IO^OLCL0gS`){&F)HRHyT7`(>N!AAWwscwc7C z<^K{5?J7M+`ERkbXM)ew#*@{brC0eUoU27T?V+i2t?g% zXUujT&R;aNIwNQj3KOCj(B3WmLutCqbo3xHF2w&Vvz8n#f8OBL+XE10_}<8{kL`Ci zx0cMROs@5m0SWLcGcQ|p$2yG(VRZw=H%3)ie=07FF@cx48;}Nf8q?Xs@bHe@QXZE( z8Vs@4ux8S_ZZ59SUV~5c-ee`6WGJ}g`vMyOh=rHqlxXpa9}H+kL(|6A$GBndxbL;K zWz&+6vtPD<{1G*}@hsnPxvYc7XVs-e5{tMgiU!gN0lbIV!T$aq)}YXfwQ>suyWBzl zchV1d4;Z+1V}6R-pHFrAVIdo=v|L%LkNmNx`V;~Qav)m9GUdlOt@^PD<;{M`z{}FB zh8Ad&UoioqG33}jeX_8UXVioS)@uOFi=+9bGDXBqfz78z^D8D<3-%B| z!KtlaLY3h43;Sh&;kR28aG5)i5mqi~XNp9S0G%M_F%>RGqsrZ+eLHkX0~KzcM5=QB zn5Ab}(<=MXs3k#i-g*~Q%e;Rb5c5v!jiM3Td~tv?3%XOIKpwSkp4m;|)P}W1gqX{h^Wz2_OI74u_)$b=?a> z@vciI@;b`U*1Z#sv7iw{YMXx6mPE8LHjFyDmfh!fX{_07aOyDuF$WQ10_J~wc-mlR zYQkzIdJmtScGgOrh6dop(?+=jk3%#DF)=9Mo+)Qq^3vh)i#z0ssE6PDPN~yeT4Lbf z0C1tr5r)`+&zeH70K-K?Bx28kv{r@UhO?@W8-Q@2H2ba#(LZx393={XtyG_R-I4hU z1LSolepYMKqW^Hq0~A9Vo*B7DmLe1da9}_NG{i7pWTD3ja%h?nX(moT-~$+7geHv` z@M*_Q{YEpSi^Z4{gV8XsxeQvpNX$#_2QD(JilzaghR|mU8ljGB0baeF*jV=+49%hp zVGyUv2M9p=BU9&{!V3yPAt96CDc2uFX@Ui9f-hMeLfY}C7`1=jsOy4DQ*M4v>+Bqw zSbR{RBL;+NwX6CHSx?7j#;Lt6AaH3MV~_)m984V(_mEKCUOnFHboa}Xw$$%t2E79} z&z94>aFVH3ccIc^B0{ZF@W=~98*>QZ4lP8UY5u z0eI2;H_586&4Rbbuf>O;x-i}-d)tTi!uA4rqFCIPMOCIbXvNUbahP-Un|itX19gi6 zl5jC@SBPdHk4VCBI=WBVH|N-FT?ulF4GF0WB!&L4Ua$In58e|o9+8z{Nxl}&J)rxy zytH)n>S%L)H(oF~`K*8;e%x8~nCSRlAsw1kkC{|@QFrb%S?l#WWwCR}T0_K$#gXtO zm!Gmx8P+^;v17D&PiWGJ^h7+JAs#4;#n^4gPX1BSAq1oGK9j}#;nZvbq#yEjvs|ha zKL2{pk0sj*T7Pyj%Q+HuM4E3LGe?ng(-f@rtb?6V%cnZJz?(GWkv|apbmsl%2wAxg zDP>;*;Dw{447&$$Sey62#+K8bUi8CPfc*VaK&6~GSKopb_(>6MXZ|vfvi$X4p^6bE z(YoMhr_qI?m)fj-m+N@oh5=0c=tO1)f$RG)X4M}4XV&bymcOQA=&t+qHryb6$I_^=anwd&h!%& zmL7Vx42@S9ZdWi+qGjY1BxpjdGB4U6JxX1j);4Vk6#p4E5lR}q235VJ_#+m-aLgva zIzC{~1K_-SygZyrG}Hi6Bh<41{YlT=$?EFkwIa=Aa#p^4GPU@z92psLkC(XT^i|WDox18fKIytGAm3;vw04b`5&J_utk%s zUMB$c3Lb?FvbG#_$Ie4Af<=a$;=DxUSjCp@MjHnPAiy;V3Iq4S*$cmFYx3`M^1(_( z>kAmFqymNnD}jO3rwh-RL3T4&$MT}nptG-X77?`i*p)zEK6W^389%NHR+rlustcNP^H>-N&lbLLn1I`J#X51P->~}|;4JHMP^y`* zl6@Yea65lOA2P5Wd_I@|bd)tOq zAy!Hpbnk$7bWo>Xe$}m~(Kz{Pd2eLFJ!uvg>CzEP^HLSe+`Lxuv}N5^Aw`gF16n=a zz>5}U3LVv5Du>+^ZvNRz0~Fmq@*mql{<^2U6}vOz0$Z|zaPTxccUs>;z{v*s60fM9 zFtqKz`+CnBoF;*ehIgj#>*Xoaxi+h6nz$d0nne8-X#CVgqGSGM;Y9n8SR{=g$7fTV zHUZE~Kl5_!U=H!eqm4H)Y3YCvSb1f`a3Y!?3AvFv9)dW26oA4g6$U1tjZVAOFroJ* zrpD(pqpE0RKK?1Z#_5vp{MwfJGVypnv4#|ko~Zs5cX1U$k_y94E(^KiY{`3qU=Qysi>6Fhe4Jex(Ii7itss;6A-54$Bt_kR z3`%{-&#FH4ViwKt`xu=FNtb5&9`Z~8X;0P0cUwvp5f12!hWu}-c&`=YE`>mDHdDNL zc7)mr=|u2+z!^zy|DzP&;U2LWzta?oE=@ox4p>Ws_(1P^O1p>lgi#F0etbQ57OG8I zx&60tLsSoD<1N@QhOjCDkYA80m(=scrf*++ea54LLOD)TZB}<490jz;sGVTTjVy6R zC}8lp>dgMqwLANq#rn;L*nvn*PIhIGpQt`;?? zOM8PiXZw7LiyaIc2m8Ag%l*r9XOv{D?Ii2_B0`*@ryLluJq@?X5*edvX4Ha7*NaS|FCaUXqakE)|D$_~HHSck6vl`ApP&S9!8n&KX5X%f)N5 z0oWN_wn26cT|UmJLr>Ha*y_38{!L;jFU8fHW*@ zDGE$SRk96|@6TK1-srOiB;$Zoxqvm#iQbuB3MGKXOTtmiw-#}n6);oWKxdg&rgcis zIt|!g^1C%?YWlFx+WNV&9p#62Eq9u~pgT=kFAk9{{g!)s_SkvgH~&8> zt+T=Pz-he?`K4y2L+T9MdTzrqB2T#t?Hb2FU)xKxM2&1_Ehr*O(}|Z8Yv(C!hqs{z$A^047w9)mAjr(`)iimm7o3@HkGf4u`Ex=qWW8%aERBUoUBLYH z?l#I2y0DU9Q{K8OY4!diDdB--G`$at$AsDrWz2e(i4ezLVax4P;Dkct>_{$jC;E8t zO85dCvL^*(E^y^xffy)r0E%BrxlX6}NzFfV`h_+Bb@x}lzM0(k*HyK<4(S8$@@a^E z10N3IV>uq|?*4Qr!QXG7-B+v-kl}RI?n*{W`l-vf#lvGYTJ(l*c(JdEewUhe&TfX^ zxjliyV~}^?s_bdAv+3g}h@F3!Zl=7<`Mo=iV!G)QRGnr&oZo$K;TDHb@rulDI?$3L zR*BcD&Cks0eVwnD4HiP)qq>&@OO*UU!uDBM(UY;_eVhd>B*Gq$^mC@IS7cnEjHKYF zeXPsp;5fI9m8mdc9=ka6OduBhdPGlaH}bK4pqG`vuS~u{TJd zM=`O{yc>;a2?KFOMai>j8InT8jBKg=$7_c_M1k^M44wOVxY>qmLF*`Y4IV#7>&wci zb}d4oBnriG5L)FD$Jd_wSpKjti@N~iwoQ*Cy#Wtjf$kzEa%KSh z>+eCu%`#;)-(N@@a?0D5ZDeN(@mHx1_VUpvxSwgG8)E4F#Ykp25SLC4B1u8=mh zIxEa`_B1-wiZkngfIWPAYDBc~jx>Y#%>XGYRR;0OUjg^!yh`4^;HFuE|QXE-x&NXqvuYZg^WLVfSQ38kv z_fptrwcJ&puUB3Me7Amc`~{Rf8xr&9d`v9(JGcG}KlDyfOw7;3TJ5V$t`LGrtPF+L+@02&{rc~D>B;l?vfa1Qxbu1v;Ra34cU^V7JS7UZE!3X; zW_tHY^@TC~x@dzjUc*p3#fF1o?XwWxu~9ygXF1A@qLb8c=Y;em=a*d8vtHdOu`o!8 zGgZ9wF(u*S%bPqLTQ*JCeQbBF@#2?OS{6+-K;1pMd@*8A*o*nscZ=_a^j2)Hmli5A zye}D=zj8|mIWQwkd>(-_D{!M8R${|r1u-~0F#;t^7Zb{gqT6`~b{hkNPf_qxN&<^2 zaykon%TJxcA#dwRp#X)61pg1y$lX0*)O@6}A=H{MpFa*cArcAp)Dkds$T1}9^qx%Q z&my<-NDQ>}eD)feJ(J`xb(kgsAS?!^G_D z=~wnxt%41KY)PtKPE^TGtPbrJJCtKXsUB>(UKFdZ#My+hc!s*@MYVe8N_U>a+b&fT znOCjPsuf5WF9<>Ziubl2`jY&0ZY)SPd2QxW(DY5&$V`D^7R(9_VpCAi)U72S+ z%*+b$Nl)b_bcV|sOa76H(e$#!6=!r^j1#$6pW(Rjq$i0f$uf$j_mQ$v@*p$DJkJqr zw5L0tog_Lnoznb@e4VB@)8|CX-*8m!R`0ou!*Mr83}EIx-zdi*(?Ij`ultG(%ik6e@g4^|O$AX*$ji0YRCi-^P9JLS30@u2F7bm87%>Jz^=@O>*O+8Nw#=Lj!E>yub zs-ST3uu9nNIXvB-IUinwBx(CA6PFX6QD-Kuaoen!_xb2vgPk#7@O0FOS7Su0E3yy2 zChA^Tdijk&r9AN7<;h&?ACT% zQLU4&DtgQODRhF32T4d$N&ws;c`t5?;wpC|gS!>&lD9s-0Um1WeUR91)ArV#nklUN zZB8&;bYM3hFsa!o&G6!nbfsK4KqGl1ktmb%s^|cUYLyD+!|hYK8&i2oiRtkH<(A79 zInJiGT6?L+x{u^2+`96F-u2-2vzxWQ)wndN$>vK7NuF!$d!yl=TsfXpFMgjD$!@YQ zBzY;Zqb;y(Mp<9tA^AJ4^uJYF@G5U`+25O6TQnz+`Qmz`w`FV1$qTKELE3-EP z1}kXy1h_H(>bCG3L#l{cb#8MtAGfl2_sV#yu6gr!rrSTJySr@-`h$C5K>FGFT+QpB zTN4udHC--cDC;BC8xFd+nw6#gMP6jJ5?>yX4tCv90ZdH2q8GkVXS z0n=OeE{<@8UwjvM+#~OY*3ZAx07nA(#_9*h#(bu&9zG-2>Xonata<-uLfg#pnUZag z4=eJi!OOArlzYPc;>? z9|3N<5EkFG`Hy1qJkIaKE)K7bC%%@vr}P1hSc)*}!42R3sbOVLQ}&g>AS*^kmWHm= zDiebyxY9ms@w-q#UD5?3IHIP&1*4p-}Y%r1=kBInowrl^cWTaMUV8 z4x-X3fBDbFdzAR2Y4DE>DXmvXVb@_HOpq}gvCjGruP?(i|G#yL|64ctU&Fi8MDssrUHQ4iEm?1`pgx?1FAr#NU#qA+&DA&XS#>9_ykA$Puej~*>Hp48 z$A=$l-460&fWlQ`i?sIwWGzIH!P$s>_OOQo_2p)9dum9+5QAM*3#t;E9&>)mgRXPo z{=a5reTb;~EAe~E)2Y;NqlHKPEGDEPGJly4ztN=;9V^z{>x3x(k0AM`XZfp^>L~B( zFySa2rYgM()B&Hj@K@zXqCZY#5P273Q`dElQ}f~(Mjbo~zGP`;e)9m*+Z zQT9BF0epnP-8`EPeIyh)bo)J>>py_3!)+r;7`=J~EqjU9G2R}ozvv)Cn36d9&)Vl} z5Q_|vZ2$Wz%d4k6Yfw9bdp4^yzv(0EL@WBM8)nFkABR(NfbUIZqE{~^=rlXUMWHr7 z`WK^K^3crdJhRn{YCl2X9(+e7#1pqSL4Z&4x&BwI6Ugaa^7SSqH!V3<>8DQJ2^S*f zYkym5SC`O4?XAbo9ohp0tcI@}>@R%R*`JSj!A2sVk9lLvok@6zCy0D06#w+(zdpn< z8R#=~T9-P19(4}ZS|q^N=P%o^i=6MbC@^g%7f5Kl(U7E;aO5x>DN!r8(bXVX-2B+z zxCU(7O2`S;D`gkglHq;-iuMAm#!y_ytW+6DD$-9~dp<2I*`Du61qKK9w5q}QGFac@ z_$m%V z*0Pm0n>WAzYdRB;;!>-m0;j|GP`>+wqWO=pE@&h zUnyZAgpqA4wYu2QjU()nWBQ99%sA}arrHcDeR23uH(|wJX0T7QYkPXkT`CPl3`KQ% zmYjZR79VrOmxjfie3At@_6CU>`3-5FFi{}Zl`8`nfm4F=23&$K-tbv?eyBBgANWo|G>w9^5^1BaV=(L4`_W)BkRQBR908yaB9?q@ z{v3KE`x&S>U;Z??`AU}YhInImQ$ZXGMO0J5IW<3>!oK!4$Qb){xX8?_5dtqwm{q%D zvhIm)UY%M}`D-d5e|t;uHCzW#<|r{`th|*OB`!*$qh5FmV!M(-&q@>;e2^8*oPJ?# zQv01Y;rUCHP1e&VHTH7m2H&gj8IP?qX<3+v^!|~nfrg{?%yv;Fc_o9wsns4vbl7x; zY#Qvf5JW=B?}a**ZV_XeLQm=Op1vlTe3wS{f@-EBpQ?90J6D0;h(<})0U6a+DTx;7 z(>+-mvx|MJ&(B_RO)%5RvKKaKSpL4^&ZZz*aQ+S2zl8tkPr`jPpeTc`9b8)W5N8)~ zxn0$|@bjo|(*=bW85|djX>xdW8=@)!_tPv2OYK zjaVe{iVwT@p^SNL#twjO?Z0h7r=`%dg0)!C7sFR$%#(D)Q;S!yh`(Yr;^N=yXF}Rg z9gm^u;(Y!$?RneTjej=Dk41uHX+z{=FsQqRuJz$sta4^rU4w{tP$ z4YY#S#5}jF&i2h!)kEY8X`tq5a9HHpAv*o%894i7H6&}=TTz+GmwmG_DQKJDLu*R> zC(*Oj3azPOI=Ggh@8Rx;-8VQuKTDs6;rj`FR)3@lBn!|NoVBab#3ISy)D|!{FGKvc zb*@aCzE%cZ(!+Erz;!1K4HPVLW<{j)n|n_rG#n@9*0emd9#u|-=54uKWw=RS=n`}7 z%o-CR?~6~^uw{38yctgQvB_4)P)%ZSCbdtiyvGnW4_wq~`_VN&ogZby$!z3R-F_Xe zG^g9PqMaNP`0QrPo#ymd|Iv8i>S4|qKBtblvwMn9Fn_;PCC^&8I%lUjGgXJ{3?Ut}%ma0w1x zZBqYRqu7+Bc9JDAaD!SbPif-QuW;0QR(6fs7$(lGtE-mA_1i{|zUI+SXgo7jc%bR@ z0i_}~S}Zr-RPw{`q^ z1d$Z#fyjdq!p*Tt4$KTT5V+xwKnWX~yxnv){$jhtQj4$n5h@}{dxIq#PlUtW-3Dk& z?jaKa(1BYp8u_IEhh>D*`>99-Vmccj7OPm~cq$cw>e%=vXIB?!|6yB`2i|Qr3c*AK zZAiW>4}x})anvc#Qa9JfwNYq3e-`+Xp@n2a9!|>mmsV`@gZ{kE9LPX0E@;CM{7_rF zYjtL*V_Rgoe|>xBH3FJyDCx>;8*(hf+2IDT`4bNZhesmmnzwt1Art6iH4Q1 zs+>34{B!VVgVQT#-ht}#r%DE^%z}bvcN`-Xdhdt&Fu7m}Be5rGiPoua9{_e6&~+@exGD=T0W^+^#tE+V_hX}89GgbOVRnSha8FAAuN^6V3GEg(LS8XoQ5k1e;trVSlJD+@sSY>>gm7s~@FPh{$NKP-;mKZJ5J zxtOD@-TF*RrJ^7wmG?LU7c@Z^;uH1ENx7m@Y+$Q+Cv;DB;e%ia5%mn8Ag_J)ubIf^ z7^b?~tj++%+ewqpVo$2_g?Se~3VsI6T^NbcCx{v*b(u!8fMdD-dk5{!$;OD#7#7nL z?!CO}0^;;PGJV11X~UP+u{=t`7Nhm*?pSB;UM0}5^j3~%E1+yK>$yg`;t>IV5@KK} z(=0!{F0=p248M$l$Yt!-rvA!cL3lo+6{pc^aA+EfsSI-BJ%V@GSwntKNRW+Q)g3ob z=R~{8LR4aUzyvSlb$V5oM;_TEs+(hHxO-25bHE2pI4){k!z`#k$3kGsj%0196~uAy zf^MZydBYLvg5)~b41=mTfFdA`-4122MXbFE(nKHh6YiPk-uYeEq{`3HaLN=rlN`d2 zmKNH5$N>)?;G-WncIRMYlR6&<8`}M?QK1=lkeVt81qowpY8lwdUe_?$3twK@uc}!@ z>l(!Jzz~Z@FDjTXaLls9>-<{{3`CEc5~jDrB<+q>RF_9NaxWV4tuTH5V^eBWxak~h z=mKUXnra8NHP(bH-Y110vtpS|bHE?L<|Lz#{{R@E+-X_Nyt;O~QtO+K;4k$if-#G! z5)Hrwd|3Q@XCd>dS@=xlk&UbkSrqyr<>)M__$RcjSxo&U2Mg!VQqorZFEbCvPqr4Fq%`jFx=d` zZRtDf<>)^-$5DvL$yGXP_Y=mb zBCv;y5r~ZJoQ^K|a9^saDUjcv84Ocp-*fZVS7{e=@}K=tR}}0EDD#M+jyhQlSo41D zooMA&Tgus@5sBlREOMSU%;F;lxv)1=L-bD(fP2MS;QXtS`WeDumNKux1XZn3(x4If zD0VV!->A>4S?^B=zg^+D`q4X9!MsJ?u*wcEjJ=scWo^=h#{Ad=a%Ye|EACF^vRpu} zxsuzUt|Wr81-D?9oQ)J$F&%n766qmdTKztQ?C#Ok;^2p9K71JNG@VeGmD%@>kL(8r zeoEf{K=@yd1iQ z{Hu+pF;G20NRIO7I!$-a@JTf4f;~TAFluxvFPHL*OT7CxynRdZF{_-^p*g0``Kxa% z#|Ab_S0xPjuMM9&v8*x^h(Ar2C!SPyjrP2so19F2@wC_sN?P8g$l|Nah#W0-XK(&~sLjbD?@n?ZNJ?^tT*C@?J}xn@L)RZa1{VtH5*-5VaRs*Zu_UUdNJ4xTY# zdCvUx@+b_h?8OqLPYb6)A2$PQD|pmblfizqsPG z8JgI{F@KeQc4oko)^RA`RJZ)Rjip)BQzG3fJn%dSpIZ`z^^Wl%mB@ghjmZVJW-%r%jCJn zoG~riZuxVhr%smf>XK8)hgzm1KJ4{wG9HJ1m}E~qZ#|S}ZIBn!oK16r^9F=JEm~NT z68QGl5^rcg>F(0P;Y;`W-`fe^O)=ky!1dYXxjwj7=T%4d>fqNll*cXX>B%&jlPelX x4(%n<|BH`}VF5lQwE&>o*zM!yqK>FPHaMAUSOYDGf}7N)pHVd%w5VegC|yl{tI%?DCm2=j@p?d!85@YO^w(WdZ=O z>fE|v0st+Qg#KWlpfmzxbJndtkN&0F*-m zKp8Xugh3EMV1j4><3RrhW~ilGMm}nf&_>(~nD#wrbN$>$3ngzCjhUtXDo*Zjri@$L z+X#%<87?B4e7uT^yzx)chpWxU4nm*`W*ugfbJxJ3#ei^AQ96y3JzFzOvt(hf8F(ef z{AwPb63GoMK`{39|J1%6qVyM{x?y($0@8=|>7#3sFS-F?dkEN2vL z_FWYOQR@sl&#zC)2;L7GeiSbwz~?$1TX4scM1O8WXzH{sXg_?v`r3Yi)w#DpB{Xs% zKO)lmsd%dFf*f}lF{t|yF`{jFCdr6j+z79zve7x3#?$0B6EmpYyPmwROat``zjMZL zup6*wiq#M=NV(oMoh~Ta>-YTdq21qWg5EK+{bKXs>#6dh;k>c+2Bq5>)p=;H(% z)T?z`^YRP7$pu|e*I!a0w7^2tBL4KRk);eTOU%;lS)laxgw~%Jg!;z5PG}|m+L68v zd~h5>&Qq39zYFO}#2~gdR-5@R(Z6A+4&Sd>WhWWyF#vtU=b^GqJ~ zt|TPNFkr=t3ZR9r0xrJzR+Qg&n776IT! znw9-ZOmzo#j<$o6JetQ(bXCu`2x!jT{GL6xHlwFK77>=CZpVM<$6d!a!bh@9v%NTc zAqI?ZFw|X=Rz!^smHNN>D=OPUpp2&CRsL3NQGnRsJTGKb3N#M<+4Tn!6r0jU&e)Qq zgV>h(cjwxXyFyXvLFG|Q*qVfdg6+2t-H!rNa?isETMz9<66({`mnP<`9QsS%w+%ON zq61G|hE|LvrVg98Pw+$I@;%q04&Vx0l&d;%m&zM&57v%_{hYLS!^y$x)bXEVVy(|Zk4i^r3$%MB zgi;Dh@_}91W}VY%NS*3HSjDax?T#79pV;_a3bJzILoaSuf9sv}KAomk1mecBI)ta% z_#Efw=MR8>F(_ezJO<-gb)zG<)fMP>?gO>wY%=+j zfA!Z=6QTe2PoJvgn^k;+$^1P-@!PT30WnbA0U3V5I$&=C{sIaY3@$NgI&te-U9LH( z>7MZESr!B9X`h#8K*D-Rq(5`#M-Tf=`A0!-+nQ3!$FEvm9qm;{xrts{*rAD7MmHc1CB?l*4fmsc;&-HGskW&_}u@qG+#M}EDpMNe0s19I^Dc({HSO;OV^vdaq zw&g!KRw&u`70)UC!tln^PD{n-WvUnsAH%cCsr;yo zt2tZnsg9dFirM+5%L+NH*oIPqsP|GzR}{8`G*zXtud-pNE~nOeKrAO~66e5+D3w&S zTJio^JSH;NI@h!-av8%GmmHUfd{TEX^QnBIH5S|eYe#BIA&Oaj!oZoWuJ0UnSpl_2 z>6e1FbG$s-2Ky>Y?dQnuMZ_=f+Le+YsuDl5aiV?iX_}cdK>X>af@Q(bI|yc ziZK={l@&K3;h?#WBAT$ZJJsq%4FAKfNG@9+3cXcHpQv|MprxhDZyQC0naO~a&M_o4 zB~j|67ayyo2QDkX1S`bPsSP}yDx`wtK>st1Vll&wJi_vo^5C5=YvmP%zcWIQELFeE zdU#$6HVlD!x`??eBmDB$dN2@1CPvwZvtJy_E0_Kv- zq0K=>Lrre>mP7EN@v=lCH~1C&Eu(_9;uQ>PS2YIs7zQO;He5vyZG2kl?Ebiz>ue6j z;hpmufQ-Kh zvv|XOt+Ti&XMS}MW@RoNQ`}yz1=xdZnkUMpdbW;D#O+xxilE=v3&a*rSwua4N3lSp zug3paeyBY2CKs%u(h(7MXOatEgs>O0I9pZ+$J)|KwU``*xhR$TxW?UG`#AYi(I>oV zz$cKqJ>*R8MZCfbTuWzLU^MX2#Y^7k4h4;6*|CZR*yL5B=+zpZXu{}zP46CcF6a0-4d=VDne9xYJz6ra3XGu1ci)e6d75{ zGwWI{zAla{$NkW{o0g~r3ZCbvF(gCl!bnpwAZd&nqjV~Ke8{S==HNC+FZwq<38U5r zpV)Qf%dsV~rZWo|Zu!617BdPkHV7$fPriZ9m`j}5%+tvQfl zs~_rIbpl4jY{MijA#~+_Q#IQ&VQmw_|xGN#_^Q>@kYp;8@$bppB|pN`@+y9Cm~>A|*Jm ziDwR*wu?IgvUZEKz*u8@a}W_iq>vzZW=G^nY*ATJxR4{FuUPHbmxt0dD)0MD`9%L`;I8S7^2_d zeYBy-#z1h8uwULd!ZZ5qwhcjFN{C?nkDRupF%9~YEQD!luWE%I_%<&)jMMKZi(*^n zLg@YWjddB~OCvGk&B9o{=~=sd1BoY>L~dqydgD(Vz6D=XiKuH)L$6?Cgu*k0X| zJLh{>E=QZv%iZgM&DlL9bw~!qk=NMa4c0g2V0Fg>WA7GHp1SU7H-30;h>D$#i^UpzYWV33}yeWZ4YYQzZLX8eU{RfrFs{=^@j^axvclF#b+rufRKel6KW1D1o{wx$XCmmz(|_xqkbTE3mG_NZrG z^%)iDAfwbLWk_p<;4;n21Xf%8X_{f>4p$oi!`;(ZUW2iow-|p;4MKqk)|t0#jFG&T zdG0=@s!5ube6_t=Xk6Z9sBk$eZmZoa3k4^f#)>H4$4zeDUTU)X8Y5*LB1BPd)`a}N z)YV{fP}{z$V1VvW>5KPF%h)HvtiHCb?#{NK#I|HxQ*N|!PIf@PQ$9D$-Rxyt&3|gpOGx`$My2YU-rvD$cCfv&fFSLKZQv_}X8vbv)@S&$haN zj+i7UaAK*l%^U?)cg#T_u{pW59wiB@cm*9^X7bu>{oR$A+ai`^&7px>At-G1oj|s7 z5u_jfSc$P!g$R%!Eah}kY>@^k^B*senWlyl*yobO)OS8T0c*>Ip|*0d8DAWiBWF~7 zlPpAFG6P5wVZ&u_tMCnexvo84$rwI3zc!}^o^QXuXs~6;2(2~w?2fKYr5f6E3u4Gc z*es~+jdB<5xX0iq;IJ2QR0!jUf#({bC+03VDYl2Z4buB5GTD`6fVg+qxQLm}I~mS7 z?2yaTT(jGjKcSC5CyR19s<2n6UblU?__BnZN=r$e%AI#xPm8(=nO)uZGM%X7$AXu( zpdgQ)Gyl6nt%Ah&-lx|5*rr{iQ|a_dU+^d8w7jL*h6OvoLtDW8t2Iafn$G9B~?i?Og7q3Y*HeA;y zT(S)7oNPGzT?MTbt`&O|Nbjs_P9S3@SP!tG1ktDWHK^dC!5uOUj+aEijh@vw*mKv*G`FUcPK(A~^smX2|Q2V zenYgZN2vNmIu8Gd>Ljo$huA%TU$4kIy8_=|i#nndlq0qlhRUNH_Thx6Bj**w3){BJ z3oN{;?dA>orpDyM^3gvJ(8GpbEUrqEqvQhvvSI~ODn1592M%=?JB|KaQ7211?r+<@ z#*RNQ+@GVk)sL?3q;SINTd)6V11}}S4BRgLRFMYGDS{?+s9_DzG14ig%!m!g0 z?3|;~{{u2Q_r-W9tENtjX8ZBdm7-n&w2G1V7m2fvOqR`u0w2@k?G=*h6Mdc-S?-ms zV(-m$^+t)aMmE=1R$8harLT!KzgkKwE?XN?_2fXGM6D<%{N0!m%#RkypO(^2G}N+8 zf|qK}abGHO!YlclmASVO`tDp}f7{;L?&UAY^o?k5orU@_{^anXb>sJNy|Ph%AEf)A zp7%Y@DTA4rp^pCY5*&y;)9G~a_4+5AFMAW*1i4^>k0yCf2lUUGgN#a+s=4~&423f! zj2fNeY}d_gBl?9qPpUEOi|L0AgQMlKu!HA;7k?b|lZAnU_hAt5VXYl_<@Aihk_jt2 zG0yo#Y@btBjNXwY)?Yt8Shsb5S`+NaohYz>`n>0+`_cYqbt6P0hPtCPG2I=l9cU}B zS#a;Y?yt1iy$$KqzZZH;ofN!tp%qOw)P>$UQRQAm)|pdXgtHK2O{TKf#b*(W8Yx10 z9hRCles^%sY!_$Q2Gw5Cwxr7oInSFV>4~u#rC1iI3xv%OKXe~$q@3$EAO9LNeA23Q zJYgf>&O=|~Of7D}Iih-GA7|~Di*N3m_*2=`m1p2V^nWM^D&6!YCxL@&BZ;GHWNbkWgY2?0LL!2$QRO)F`KjTMX+j zZ}4$qKNIpn50sI@ti&F3(Glk0q_?%%JsnKO>K15Xh!}P?9(*cSu6NL`k+`iGVF5AJ z?wrXPlQRo1p5Z2}^_s+r+AS(t1H_aP>R#2yR<$!Ud;%Q+V-7)aqg!X|lrJyjI>%5s zda_yYFAT5o`VSJi4P606lSc3Z2!rw2?@ z0)GuRKb4Shs&p41BJO3STNC;d_-uk1HI&(d8!VmCVO*c~%xOP#gL_uS-r5Gx>GKd| zA-!U&VbMyJhyAxI0&tq|0q9e2_jL zLJtu7sH~nU%kp6V_i#2|^nQwWpI!-tkl-50>o-cpL;2(xfsw6a&yocf_tnhlwyp7y ztV>k71xGKifrL{F#;gm}Iv{wMR!k3st5Ce682BcTb3&ef6|9fY#Z->nw{Fe!0>LLKp}ojKgAi zdqzS@0On`Y8}ZXX1VHS#Aq>>r8&nzz9!~>#ym08o87&C>N8sXracJ*cq&<|)@nktK zNX?kMW@Z5-c8zIvtQKd~zseIu#8)QP%2VRuj9!t>25r4~vu5w9%-}2jYeJ0~L>u?k z*159Xb5lS26wehuFw79HF)x+6)quQvL{Zkp@jSEtS*rW+=vRQyMD^`Qe-bwREv;dD z86hl9k_Bdy`a}06N0ksSJ_0!$?Z}np#pflX^>+PH9O#R&H|m!f@9udEt2yH;g)wtp zJLl$ZX=EAkzU%9Jd!AePBk;Nd42JT42W(wz4s+iOmDS}#+Z#+MwHZ4XwK(0}DqZte z5M`b;+!PVPOg;Eq|NGKgE-fA0ZssTEtmNUxSMM7NB3gf z!gLe{XG{lh^zEH>!=;Qgch+o*O5HUaDjQRibYK18?8yrlqfyX3({D!KgV%lE)QE_%m7og$;mz2`Su(3L4U6>~qbSzYyIlK&p! zuqbVW;j5qt@vk!-a$!33D@8Vv+1GQ#5b6ikftQ}7^Nr5-m#3teSg3H0<(p1)_13wE z4^a0Jd)t5ir7PgPrkd>~D88JrEK>Eh<#&Mgqw@x9Z?qtaRA4j}Tu1HSoZ}F|yqyN9 zn&^-;nu_w%@zg2e7gy@+q}{h~5~O_hOp)<}{wszNZX--tzh-zsqO&7}5!S&M5kYtN zy2AL8>h5O;yXn8ahqyI7y`~5kdO!dC{+HGQO=e4iob>0fwPv5zc05SR*B(xaU&4fN zAQ#jsn3#2Kc2k90xD8uG&cAn^EX=UwO4zqh}2ni zn(N$>DF20D>(*}!UTU%|-?OI=nPkSgjzKg^4GUX53)D3?3^BOh0;^3=*qDi37niDS-OT@)Fv%*=#hEbz6%i52f18sd<5o zcT279-jAN6LUwz?9J8E%%HaMOzFA!1spf4UABxNCaydM5)>hC^e4;F?Qy{ujeb40c zN0vg=a1a}G++ln)zP_n3H94UVK^iU3G2)B!hT9Nbaza?35n9X>cg7}T0H1clr`@Sw+r6gEmmvbMohFwFqd9(v)k0;3 zsCi<+=7$r+G^?p*U?*wo^QaWzS-B|)hWy`;RWk8?30jCt4jmK3T0S1CE)QIUoF059 zU|XE7dVlL{x2-AVCP0vYT}@NOX|%0z(#13H1tX}34yumN0vz~;DbW*D7|8PTsUpIZ zEzp!`dp)0fN}ROSZ8jYP?5Hz)<_-$71yB12CIP$lBr%lUZQ zzR#X7A5`xPSLRN6ro(GOgI1jJRD{eY$VdSTX6#0Q!hIEq;*k}YwFI06JC~NcRHbS( zv}^dxrG@Kvo%nhF_1+keJFrq-su0q222DH|<5ODd`fM9T=Xi)!!k)GBR3Cb|w^i39 zm9tFiQ#}!sCF0dlmsA##8FCi31NBu|p4mSvuH6=G+cz<4b!VUYRC|B)=Y*~A_jNZj z0*Qen+6n$Sen1|gBQ)4l{+F*d>YXuWN#W}s-UM_(H)hX!zPs2L2SX--EX)xfp%Y53 z@tG`TBb!0$(q?OeKewDz6ppp9BXs9p{EoX@i(&e-vMT88$4434mKujbsRfA`CN|_uB;0u=0>n#h1)ZXX0o3fuOcVe3TGux&ScrR528FKZIlNBH$G`S%eYy0iSZ&;1{3+x{y(#VRU($TO zZA3u9*L>hcV?#c4^Som$D?U{XDJvGR?Mb8d{=M^jcf0V{{%>V9oLk&U@4QMxPZ4WI z)+%p!Pdf0$3lc%I-S;>7{zb)?p&UD>^b9guV9#xK2B2QPHm!W<()cBwimyws$zeCk z=I@?@-mlXW-Z&6Xcsv@pvi2#xqQ?ymuT5jnAoQijm1}<~-u|K-*t&rjUcMku?Sc$K zlb6pyPz`3I<0tLMSybKy3*EAqf*6e$)6dcWi>HoEzfVKmi&_78|5@3wsE(H5jk4>G G5B>*v@mFyG literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_computational_complexity/time_complexity.md b/ru/docs/chapter_computational_complexity/time_complexity.md new file mode 100644 index 000000000..880c0e6d5 --- /dev/null +++ b/ru/docs/chapter_computational_complexity/time_complexity.md @@ -0,0 +1,1151 @@ +# Временная сложность + +Время выполнения может наглядно и точно отражать эффективность алгоритма. Если мы хотим точно оценить время работы некоторого фрагмента кода, как это сделать? + +1. **Определить платформу выполнения**, включая конфигурацию оборудования, язык программирования, системную среду и т.д., поскольку все эти факторы влияют на эффективность выполнения кода. +2. **Оценить время выполнения различных вычислительных операций**, например операция сложения `+` требует 1 нс , операция умножения `*` требует 10 нс , операция вывода `print()` требует 5 нс и т.д. +3. **Подсчитать все вычислительные операции в коде** и суммировать время выполнения всех операций, чтобы получить общее время работы. + +Например, в следующем коде размер входных данных равен $n$ : + +=== "Python" + + ```python title="" + # На некоторой платформе выполнения + def algorithm(n: int): + a = 2 # 1 нс + a = a + 1 # 1 нс + a = a * 2 # 10 нс + # Цикл выполняется n раз + for _ in range(n): # 1 нс + print(0) # 5 нс + ``` + +=== "C++" + + ```cpp title="" + // На некоторой платформе выполнения + void algorithm(int n) { + int a = 2; // 1 нс + a = a + 1; // 1 нс + a = a * 2; // 10 нс + // Цикл выполняется n раз + for (int i = 0; i < n; i++) { // 1 нс + cout << 0 << endl; // 5 нс + } + } + ``` + +=== "Java" + + ```java title="" + // На некоторой платформе выполнения + void algorithm(int n) { + int a = 2; // 1 нс + a = a + 1; // 1 нс + a = a * 2; // 10 нс + // Цикл выполняется n раз + for (int i = 0; i < n; i++) { // 1 нс + System.out.println(0); // 5 нс + } + } + ``` + +=== "C#" + + ```csharp title="" + // На некоторой платформе выполнения + void Algorithm(int n) { + int a = 2; // 1 нс + a = a + 1; // 1 нс + a = a * 2; // 10 нс + // Цикл выполняется n раз + for (int i = 0; i < n; i++) { // 1 нс + Console.WriteLine(0); // 5 нс + } + } + ``` + +=== "Go" + + ```go title="" + // На некоторой платформе выполнения + func algorithm(n int) { + a := 2 // 1 нс + a = a + 1 // 1 нс + a = a * 2 // 10 нс + // Цикл выполняется n раз + for i := 0; i < n; i++ { // 1 нс + fmt.Println(a) // 5 нс + } + } + ``` + +=== "Swift" + + ```swift title="" + // На некоторой платформе выполнения + func algorithm(n: Int) { + var a = 2 // 1 нс + a = a + 1 // 1 нс + a = a * 2 // 10 нс + // Цикл выполняется n раз + for _ in 0 ..< n { // 1 нс + print(0) // 5 нс + } + } + ``` + +=== "JS" + + ```javascript title="" + // На некоторой платформе выполнения + function algorithm(n) { + var a = 2; // 1 нс + a = a + 1; // 1 нс + a = a * 2; // 10 нс + // Цикл выполняется n раз + for(let i = 0; i < n; i++) { // 1 нс + console.log(0); // 5 нс + } + } + ``` + +=== "TS" + + ```typescript title="" + // На некоторой платформе выполнения + function algorithm(n: number): void { + var a: number = 2; // 1 нс + a = a + 1; // 1 нс + a = a * 2; // 10 нс + // Цикл выполняется n раз + for(let i = 0; i < n; i++) { // 1 нс + console.log(0); // 5 нс + } + } + ``` + +=== "Dart" + + ```dart title="" + // На некоторой платформе выполнения + void algorithm(int n) { + int a = 2; // 1 нс + a = a + 1; // 1 нс + a = a * 2; // 10 нс + // Цикл выполняется n раз + for (int i = 0; i < n; i++) { // 1 нс + print(0); // 5 нс + } + } + ``` + +=== "Rust" + + ```rust title="" + // На некоторой платформе выполнения + fn algorithm(n: i32) { + let mut a = 2; // 1 нс + a = a + 1; // 1 нс + a = a * 2; // 10 нс + // Цикл выполняется n раз + for _ in 0..n { // 1 нс + println!("{}", 0); // 5 нс + } + } + ``` + +=== "C" + + ```c title="" + // На некоторой платформе выполнения + void algorithm(int n) { + int a = 2; // 1 нс + a = a + 1; // 1 нс + a = a * 2; // 10 нс + // Цикл выполняется n раз + for (int i = 0; i < n; i++) { // 1 нс + printf("%d", 0); // 5 нс + } + } + ``` + +=== "Kotlin" + + ```kotlin title="" + // На некоторой платформе выполнения + fun algorithm(n: Int) { + var a = 2 // 1 нс + a = a + 1 // 1 нс + a = a * 2 // 10 нс + // Цикл выполняется n раз + for (i in 0.. 1$ он медленнее алгоритма `A` , а при $n > 1000000$ медленнее алгоритма `C` . На самом деле, если размер входных данных $n$ достаточно велик, алгоритм с "постоянной" сложностью обязательно лучше алгоритма с "линейной" сложностью. В этом и состоит смысл тенденции роста времени. +- **Метод вывода временной сложности проще**. Очевидно, что платформа выполнения и тип вычислительных операций не влияют на тенденцию роста времени работы алгоритма. Поэтому в анализе временной сложности мы можем считать время выполнения всех вычислительных операций одинаковым "единичным временем" и тем самым упростить "подсчет времени выполнения операций" до "подсчета количества операций", что существенно снижает сложность оценки. +- **У временной сложности есть и определенные ограничения**. Например, хотя временная сложность алгоритмов `A` и `C` одинакова, их реальное время выполнения сильно различается. Точно так же, хотя временная сложность `B` выше, чем у `C` , при малых $n$ алгоритм `B` явно лучше `C` . В таких случаях нам часто трудно судить об эффективности алгоритма, опираясь только на временную сложность. Тем не менее, несмотря на эти ограничения, анализ сложности все равно остается самым эффективным и самым распространенным способом оценки алгоритмов. + +## Асимптотическая верхняя граница функции + +Для функции с входным размером $n$ : + +=== "Python" + + ```python title="" + def algorithm(n: int): + a = 1 # +1 + a = a + 1 # +1 + a = a * 2 # +1 + # Цикл выполняется n раз + for i in range(n): # +1 + print(0) # +1 + ``` + +=== "C++" + + ```cpp title="" + void algorithm(int n) { + int a = 1; // +1 + a = a + 1; // +1 + a = a * 2; // +1 + // Цикл выполняется n раз + for (int i = 0; i < n; i++) { // +1 (каждый раз выполняется i ++) + cout << 0 << endl; // +1 + } + } + ``` + +=== "Java" + + ```java title="" + void algorithm(int n) { + int a = 1; // +1 + a = a + 1; // +1 + a = a * 2; // +1 + // Цикл выполняется n раз + for (int i = 0; i < n; i++) { // +1 (каждый раз выполняется i ++) + System.out.println(0); // +1 + } + } + ``` + +=== "C#" + + ```csharp title="" + void Algorithm(int n) { + int a = 1; // +1 + a = a + 1; // +1 + a = a * 2; // +1 + // Цикл выполняется n раз + for (int i = 0; i < n; i++) { // +1 (каждый раз выполняется i ++) + Console.WriteLine(0); // +1 + } + } + ``` + +=== "Go" + + ```go title="" + func algorithm(n int) { + a := 1 // +1 + a = a + 1 // +1 + a = a * 2 // +1 + // Цикл выполняется n раз + for i := 0; i < n; i++ { // +1 + fmt.Println(a) // +1 + } + } + ``` + +=== "Swift" + + ```swift title="" + func algorithm(n: Int) { + var a = 1 // +1 + a = a + 1 // +1 + a = a * 2 // +1 + // Цикл выполняется n раз + for _ in 0 ..< n { // +1 + print(0) // +1 + } + } + ``` + +=== "JS" + + ```javascript title="" + function algorithm(n) { + var a = 1; // +1 + a += 1; // +1 + a *= 2; // +1 + // Цикл выполняется n раз + for(let i = 0; i < n; i++){ // +1 (каждый раз выполняется i ++) + console.log(0); // +1 + } + } + ``` + +=== "TS" + + ```typescript title="" + function algorithm(n: number): void{ + var a: number = 1; // +1 + a += 1; // +1 + a *= 2; // +1 + // Цикл выполняется n раз + for(let i = 0; i < n; i++){ // +1 (каждый раз выполняется i ++) + console.log(0); // +1 + } + } + ``` + +=== "Dart" + + ```dart title="" + void algorithm(int n) { + int a = 1; // +1 + a = a + 1; // +1 + a = a * 2; // +1 + // Цикл выполняется n раз + for (int i = 0; i < n; i++) { // +1 (каждый раз выполняется i ++) + print(0); // +1 + } + } + ``` + +=== "Rust" + + ```rust title="" + fn algorithm(n: i32) { + let mut a = 1; // +1 + a = a + 1; // +1 + a = a * 2; // +1 + + // Цикл выполняется n раз + for _ in 0..n { // +1 (каждый раз выполняется i ++) + println!("{}", 0); // +1 + } + } + ``` + +=== "C" + + ```c title="" + void algorithm(int n) { + int a = 1; // +1 + a = a + 1; // +1 + a = a * 2; // +1 + // Цикл выполняется n раз + for (int i = 0; i < n; i++) { // +1 (каждый раз выполняется i ++) + printf("%d", 0); // +1 + } + } + ``` + +=== "Kotlin" + + ```kotlin title="" + fun algorithm(n: Int) { + var a = 1 // +1 + a = a + 1 // +1 + a = a * 2 // +1 + // Цикл выполняется n раз + for (i in 0..нотацией Big $O$ (big-$O$ notation) и обозначает асимптотическую верхнюю границу (asymptotic upper bound) функции $T(n)$ . + +По сути анализ временной сложности - это вычисление асимптотической верхней границы "количества операций $T(n)$", и у него есть строгое математическое определение. + +!!! note "Асимптотическая верхняя граница функции" + + Если существуют положительное действительное число $c$ и действительное число $n_0$ , такие что для всех $n > n_0$ выполняется $T(n) \leq c \cdot f(n)$ , то можно считать, что $f(n)$ задает асимптотическую верхнюю границу для $T(n)$ ; это записывается как $T(n) = O(f(n))$ . + +Как показано на рисунке ниже, вычислить асимптотическую верхнюю границу - значит найти такую функцию $f(n)$ , что при стремлении $n$ к бесконечности функции $T(n)$ и $f(n)$ имеют один и тот же порядок роста и отличаются только постоянным коэффициентом $c$. + +![Асимптотическая верхняя граница функции](time_complexity.assets/asymptotic_upper_bound.png) + +## Метод вывода + +Математическое определение асимптотической верхней границы выглядит довольно формально, и если ты понял его не до конца, переживать не стоит. Сначала можно освоить сам метод вывода, а в процессе дальнейшей практики постепенно почувствовать его математический смысл. + +Согласно определению, после того как мы определили $f(n)$ , мы можем получить временную сложность $O(f(n))$ . Но как определить саму асимптотическую верхнюю границу $f(n)$ ? В целом процесс состоит из двух шагов: сначала подсчитать количество операций, затем определить асимптотическую верхнюю границу. + +### Шаг 1: подсчет количества операций + +Для кода это можно делать построчно сверху вниз. Однако, поскольку в выражении $c \cdot f(n)$ выше постоянный коэффициент $c$ может быть сколь угодно большим, **различные коэффициенты и постоянные члены в числе операций $T(n)$ можно игнорировать**. Исходя из этого принципа, можно сформулировать следующие упрощающие приемы подсчета. + +1. **Игнорировать константы в $T(n)$**. Они не зависят от $n$ , а значит не влияют на временную сложность. +2. **Опускать все коэффициенты**. Например, циклы на $2n$ раз или $5n + 1$ раз можно упростить до $n$ раз, потому что коэффициент перед $n$ не влияет на временную сложность. +3. **При вложенных циклах использовать умножение**. Общее число операций равно произведению числа операций внешнего и внутреннего циклов; при этом для каждого уровня цикла по-прежнему можно применять приемы из пунктов `1.` и `2.` . + +Для заданной функции мы можем использовать перечисленные выше приемы и подсчитать число операций: + +=== "Python" + + ```python title="" + def algorithm(n: int): + a = 1 # +0 (прием 1) + a = a + n # +0 (прием 1) + # +n (прием 2) + for i in range(5 * n + 1): + print(0) + # +n*n (прием 3) + for i in range(2 * n): + for j in range(n + 1): + print(0) + ``` + +=== "C++" + + ```cpp title="" + void algorithm(int n) { + int a = 1; // +0 (прием 1) + a = a + n; // +0 (прием 1) + // +n (прием 2) + for (int i = 0; i < 5 * n + 1; i++) { + cout << 0 << endl; + } + // +n*n (прием 3) + for (int i = 0; i < 2 * n; i++) { + for (int j = 0; j < n + 1; j++) { + cout << 0 << endl; + } + } + } + ``` + +=== "Java" + + ```java title="" + void algorithm(int n) { + int a = 1; // +0 (прием 1) + a = a + n; // +0 (прием 1) + // +n (прием 2) + for (int i = 0; i < 5 * n + 1; i++) { + System.out.println(0); + } + // +n*n (прием 3) + for (int i = 0; i < 2 * n; i++) { + for (int j = 0; j < n + 1; j++) { + System.out.println(0); + } + } + } + ``` + +=== "C#" + + ```csharp title="" + void Algorithm(int n) { + int a = 1; // +0 (прием 1) + a = a + n; // +0 (прием 1) + // +n (прием 2) + for (int i = 0; i < 5 * n + 1; i++) { + Console.WriteLine(0); + } + // +n*n (прием 3) + for (int i = 0; i < 2 * n; i++) { + for (int j = 0; j < n + 1; j++) { + Console.WriteLine(0); + } + } + } + ``` + +=== "Go" + + ```go title="" + func algorithm(n int) { + a := 1 // +0 (прием 1) + a = a + n // +0 (прием 1) + // +n (прием 2) + for i := 0; i < 5 * n + 1; i++ { + fmt.Println(0) + } + // +n*n (прием 3) + for i := 0; i < 2 * n; i++ { + for j := 0; j < n + 1; j++ { + fmt.Println(0) + } + } + } + ``` + +=== "Swift" + + ```swift title="" + func algorithm(n: Int) { + var a = 1 // +0 (прием 1) + a = a + n // +0 (прием 1) + // +n (прием 2) + for _ in 0 ..< (5 * n + 1) { + print(0) + } + // +n*n (прием 3) + for _ in 0 ..< (2 * n) { + for _ in 0 ..< (n + 1) { + print(0) + } + } + } + ``` + +=== "JS" + + ```javascript title="" + function algorithm(n) { + let a = 1; // +0 (прием 1) + a = a + n; // +0 (прием 1) + // +n (прием 2) + for (let i = 0; i < 5 * n + 1; i++) { + console.log(0); + } + // +n*n (прием 3) + for (let i = 0; i < 2 * n; i++) { + for (let j = 0; j < n + 1; j++) { + console.log(0); + } + } + } + ``` + +=== "TS" + + ```typescript title="" + function algorithm(n: number): void { + let a = 1; // +0 (прием 1) + a = a + n; // +0 (прием 1) + // +n (прием 2) + for (let i = 0; i < 5 * n + 1; i++) { + console.log(0); + } + // +n*n (прием 3) + for (let i = 0; i < 2 * n; i++) { + for (let j = 0; j < n + 1; j++) { + console.log(0); + } + } + } + ``` + +=== "Dart" + + ```dart title="" + void algorithm(int n) { + int a = 1; // +0 (прием 1) + a = a + n; // +0 (прием 1) + // +n (прием 2) + for (int i = 0; i < 5 * n + 1; i++) { + print(0); + } + // +n*n (прием 3) + for (int i = 0; i < 2 * n; i++) { + for (int j = 0; j < n + 1; j++) { + print(0); + } + } + } + ``` + +=== "Rust" + + ```rust title="" + fn algorithm(n: i32) { + let mut a = 1; // +0 (прием 1) + a = a + n; // +0 (прием 1) + + // +n (прием 2) + for i in 0..(5 * n + 1) { + println!("{}", 0); + } + + // +n*n (прием 3) + for i in 0..(2 * n) { + for j in 0..(n + 1) { + println!("{}", 0); + } + } + } + ``` + +=== "C" + + ```c title="" + void algorithm(int n) { + int a = 1; // +0 (прием 1) + a = a + n; // +0 (прием 1) + // +n (прием 2) + for (int i = 0; i < 5 * n + 1; i++) { + printf("%d", 0); + } + // +n*n (прием 3) + for (int i = 0; i < 2 * n; i++) { + for (int j = 0; j < n + 1; j++) { + printf("%d", 0); + } + } + } + ``` + +=== "Kotlin" + + ```kotlin title="" + fun algorithm(n: Int) { + var a = 1 // +0 (прием 1) + a = a + n // +0 (прием 1) + // +n (прием 2) + for (i in 0..<5 * n + 1) { + println(0) + } + // +n*n (прием 3) + for (i in 0..<2 * n) { + for (j in 0.. Таблица   Временная сложность, соответствующая разному количеству операций

      + +| Число операций $T(n)$ | Временная сложность $O(f(n))$ | +| ---------------------- | -------------------- | +| $100000$ | $O(1)$ | +| $3n + 2$ | $O(n)$ | +| $2n^2 + 3n + 2$ | $O(n^2)$ | +| $n^3 + 10000n^2$ | $O(n^3)$ | +| $2^n + 10000n^{10000}$ | $O(2^n)$ | + +## Распространенные типы + +Пусть размер входных данных равен $n$ ; распространенные типы временной сложности показаны на рисунке ниже (в порядке от меньшей к большей). + +$$ +\begin{aligned} +O(1) < O(\log n) < O(n) < O(n \log n) < O(n^2) < O(2^n) < O(n!) \newline +\text{Постоянная} < \text{Логарифмическая} < \text{Линейная} < \text{Линейно-логарифмическая} < \text{Квадратичная} < \text{Экспоненциальная} < \text{Факториальная} +\end{aligned} +$$ + +![Распространенные типы временной сложности](time_complexity.assets/time_complexity_common_types.png) + +### Постоянная сложность $O(1)$ + +Число операций при постоянной сложности не зависит от размера входных данных $n$ , то есть не изменяется вместе с изменением $n$ . + +В следующей функции, хотя число операций `size` может быть большим, оно не зависит от размера входных данных $n$ , поэтому временная сложность по-прежнему равна $O(1)$ : + +```src +[file]{time_complexity}-[class]{}-[func]{constant} +``` + +### Линейная сложность $O(n)$ + +Число операций при линейной сложности растет линейно относительно размера входных данных $n$ . Линейная сложность обычно встречается в одноуровневых циклах: + +```src +[file]{time_complexity}-[class]{}-[func]{linear} +``` + +Операции обхода массива и обхода связного списка имеют временную сложность $O(n)$ , где $n$ - длина массива или списка: + +```src +[file]{time_complexity}-[class]{}-[func]{array_traversal} +``` + +Стоит отметить, что **размер входных данных $n$ нужно определять конкретно в зависимости от типа входа**. Например, в первом примере переменная $n$ сама является размером входных данных; во втором примере размером данных служит длина массива $n$ . + +### Квадратичная сложность $O(n^2)$ + +Число операций при квадратичной сложности растет квадратично относительно размера входных данных $n$ . Квадратичная сложность обычно встречается во вложенных циклах: временная сложность внешнего и внутреннего циклов равна $O(n)$ , поэтому общая временная сложность составляет $O(n^2)$ : + +```src +[file]{time_complexity}-[class]{}-[func]{quadratic} +``` + +На рисунке ниже сравниваются три временные сложности: постоянная, линейная и квадратичная. + +![Постоянная, линейная и квадратичная временная сложность](time_complexity.assets/time_complexity_constant_linear_quadratic.png) + +Возьмем в качестве примера пузырьковую сортировку: внешний цикл выполняется $n - 1$ раз, внутренний цикл выполняется $n-1$ , $n-2$ , $\dots$ , $2$ , $1$ раз, в среднем это $n / 2$ раз, поэтому временная сложность равна $O((n - 1) n / 2) = O(n^2)$ : + +```src +[file]{time_complexity}-[class]{}-[func]{bubble_sort} +``` + +### Экспоненциальная сложность $O(2^n)$ + +Типичный пример экспоненциального роста в биологии - "деление клеток": в начальном состоянии есть 1 клетка, после одного деления их становится 2, после двух делений - 4 и так далее; после $n$ раундов деления клеток становится $2^n$ . + +На рисунке ниже и в следующем коде моделируется процесс деления клеток; временная сложность равна $O(2^n)$ . Обрати внимание, что входное значение $n$ обозначает число раундов деления, а возвращаемое значение `count` обозначает общее число делений. + +```src +[file]{time_complexity}-[class]{}-[func]{exponential} +``` + +![Экспоненциальная временная сложность](time_complexity.assets/time_complexity_exponential.png) + +В реальных алгоритмах экспоненциальная сложность также часто встречается в рекурсивных функциях. Например, в следующем коде процесс рекурсивно делится надвое и останавливается после $n$ разбиений: + +```src +[file]{time_complexity}-[class]{}-[func]{exp_recur} +``` + +Экспоненциальный рост происходит очень быстро и часто встречается в переборных методах (грубая сила, backtracking и т.д.). Для задач большого масштаба экспоненциальная сложность неприемлема, и обычно приходится применять динамическое программирование, жадные алгоритмы и другие подходы. + +### Логарифмическая сложность $O(\log n)$ + +В противоположность экспоненциальной, логарифмическая сложность описывает ситуацию "каждый раунд уменьшение вдвое". Пусть размер входных данных равен $n$ ; так как на каждом шаге размер уменьшается вдвое, число итераций равно $\log_2 n$ , то есть является обратной функцией к $2^n$ . + +На рисунке ниже и в следующем коде моделируется процесс "каждый раунд уменьшение вдвое"; временная сложность равна $O(\log_2 n)$ и кратко записывается как $O(\log n)$ : + +```src +[file]{time_complexity}-[class]{}-[func]{logarithmic} +``` + +![Логарифмическая временная сложность](time_complexity.assets/time_complexity_logarithmic.png) + +Подобно экспоненциальной сложности, логарифмическая также часто встречается в рекурсивных функциях. Следующий код формирует рекурсивное дерево высотой $\log_2 n$ : + +```src +[file]{time_complexity}-[class]{}-[func]{log_recur} +``` + +Логарифмическая сложность часто встречается в алгоритмах, основанных на стратегии "разделяй и властвуй", и отражает идеи "разделить одно на много" и "упростить сложное". Она растет медленно и является идеальной временной сложностью, уступающей только постоянной. + +!!! tip "Каково основание у $O(\log n)$ ?" + + Точнее говоря, "разделение на $m$ частей" соответствует временной сложности $O(\log_m n)$ . А по формуле перехода к другому основанию логарифма мы получаем равные по сложности выражения с разными основаниями: + + $$ + O(\log_m n) = O(\log_k n / \log_k m) = O(\log_k n) + $$ + + Иными словами, основание $m$ можно менять без влияния на сложность. Поэтому мы обычно опускаем основание $m$ и напрямую записываем логарифмическую сложность как $O(\log n)$ . + +### Линейно-логарифмическая сложность $O(n \log n)$ + +Линейно-логарифмическая сложность часто встречается во вложенных циклах, когда временная сложность двух уровней соответственно равна $O(\log n)$ и $O(n)$ . Соответствующий код выглядит следующим образом: + +```src +[file]{time_complexity}-[class]{}-[func]{linear_log_recur} +``` + +На рисунке ниже показано, как возникает линейно-логарифмическая сложность. Общее число операций на каждом уровне бинарного дерева равно $n$ , а дерево имеет $\log_2 n + 1$ уровней, поэтому временная сложность равна $O(n \log n)$ . + +![Линейно-логарифмическая временная сложность](time_complexity.assets/time_complexity_logarithmic_linear.png) + +Временная сложность основных алгоритмов сортировки обычно равна $O(n \log n)$ , например у быстрой сортировки, сортировки слиянием, пирамидальной сортировки и т.д. + +### Факториальная сложность $O(n!)$ + +Факториальная сложность соответствует математической задаче "все перестановки". Если даны $n$ попарно различных элементов, то число всех возможных перестановок равно: + +$$ +n! = n \times (n - 1) \times (n - 2) \times \dots \times 2 \times 1 +$$ + +Факториал обычно реализуют через рекурсию. Как показано на рисунке ниже и в следующем коде, на первом уровне происходит ветвление на $n$ подзадач, на втором - на $n - 1$ и так далее, пока на $n$ -м уровне ветвление не прекращается: + +```src +[file]{time_complexity}-[class]{}-[func]{factorial_recur} +``` + +![Факториальная временная сложность](time_complexity.assets/time_complexity_factorial.png) + +Обрати внимание: поскольку при $n \geq 4$ всегда выполняется $n! > 2^n$ , факториальная сложность растет еще быстрее, чем экспоненциальная, и при больших $n$ также неприемлема. + +## Худшая, лучшая и средняя временная сложность + +**Временная эффективность алгоритма часто не фиксирована, а зависит от распределения входных данных**. Предположим, на вход подается массив `nums` длины $n$ , состоящий из чисел от $1$ до $n$ , каждое из которых встречается ровно один раз; при этом порядок элементов случайно перемешан. Задача состоит в том, чтобы вернуть индекс элемента $1$ . Тогда можно сделать следующие выводы. + +- Когда `nums = [?, ?, ..., 1]` , то есть когда последний элемент равен $1$ , нужно полностью пройти по массиву, **что дает худшую временную сложность $O(n)$** . +- Когда `nums = [1, ?, ?, ...]` , то есть когда первый элемент равен $1$ , независимо от длины массива продолжать обход не нужно, **что дает лучшую временную сложность $\Omega(1)$** . + +"Худшая временная сложность" соответствует асимптотической верхней границе функции и обозначается нотацией Big $O$ . Соответственно, "лучшая временная сложность" соответствует асимптотической нижней границе функции и обозначается символом $\Omega$ : + +```src +[file]{worst_best_time_complexity}-[class]{}-[func]{find_one} +``` + +Стоит отметить, что на практике мы редко используем лучшую временную сложность, поскольку обычно она достигается лишь с очень малой вероятностью и может вводить в заблуждение. **Худшая временная сложность гораздо практичнее, потому что задает безопасную оценку эффективности** и позволяет уверенно использовать алгоритм. + +Из приведенного выше примера видно, что худшая и лучшая временные сложности возникают только при "особых распределениях данных"; вероятность таких случаев может быть низкой, и они не всегда реально отражают эффективность алгоритма. Напротив, **средняя временная сложность способна показать эффективность алгоритма на случайных входных данных** и обозначается символом $\Theta$ . + +Для некоторых алгоритмов мы можем относительно просто вывести средний случай при случайном распределении данных. Например, в приведенном выше примере входной массив перемешан, а значит вероятность появления элемента $1$ на любом индексе одинакова; следовательно, среднее число итераций алгоритма равно половине длины массива, то есть $n / 2$ , а средняя временная сложность равна $\Theta(n / 2) = \Theta(n)$ . + +Но для более сложных алгоритмов вычислить среднюю временную сложность часто непросто, потому что трудно проанализировать полное математическое ожидание на заданном распределении данных. В таких случаях мы обычно используем худшую временную сложность как критерий оценки эффективности алгоритма. + +!!! question "Почему символ $\Theta$ встречается так редко?" + + Возможно, потому что символ $O$ звучит слишком привычно, и мы часто используем его для обозначения средней временной сложности. Но строго говоря, это некорректно. В этой книге и в других материалах, если встретится выражение вроде "средняя временная сложность $O(n)$", просто понимай его как $\Theta(n)$ . diff --git a/ru/docs/chapter_data_structure/basic_data_types.md b/ru/docs/chapter_data_structure/basic_data_types.md new file mode 100644 index 000000000..ce6d58679 --- /dev/null +++ b/ru/docs/chapter_data_structure/basic_data_types.md @@ -0,0 +1,175 @@ +# Базовые типы данных + +Когда мы говорим о данных в компьютере, нам приходят на ум текст, изображения, видео, звук, 3D-модели и многие другие формы. Хотя эти данные организованы по-разному, все они состоят из различных базовых типов данных. + +**Базовые типы данных - это типы, с которыми CPU может работать напрямую**; в алгоритмах они используются непосредственно и в основном включают следующее. + +- Целочисленные типы `byte` , `short` , `int` , `long` . +- Типы с плавающей точкой `float` , `double` , используемые для представления дробных чисел. +- Символьный тип `char` , используемый для представления букв, знаков препинания и даже эмодзи в разных языках. +- Логический тип `bool` , используемый для представления суждений "да" и "нет". + +**Базовые типы данных хранятся в компьютере в двоичной форме**. Один двоичный разряд равен $1$ биту. В подавляющем большинстве современных операционных систем $1$ байт (byte) состоит из $8$ битов (bit). + +Диапазон значений базовых типов данных зависит от объема занимаемого ими пространства. Ниже в качестве примера используется Java. + +- Целочисленный тип `byte` занимает $1$ байт = $8$ бит и может представлять $2^{8}$ чисел. +- Целочисленный тип `int` занимает $4$ байта = $32$ бита и может представлять $2^{32}$ чисел. + +В таблице ниже перечислены объем памяти, диапазон значений и значения по умолчанию для различных базовых типов данных в Java. Заучивать эту таблицу наизусть не нужно; достаточно иметь общее представление и при необходимости обращаться к ней. + +

      Таблица   Объем памяти и диапазоны значений базовых типов данных

      + +| Тип | Обозначение | Объем памяти | Минимальное значение | Максимальное значение | Значение по умолчанию | +| -------- | ----------- | ------------ | ------------------------- | ----------------------- | --------------------- | +| Целые | `byte` | 1 байт | $-2^7$ ($-128$) | $2^7 - 1$ ($127$) | $0$ | +| | `short` | 2 байта | $-2^{15}$ | $2^{15} - 1$ | $0$ | +| | `int` | 4 байта | $-2^{31}$ | $2^{31} - 1$ | $0$ | +| | `long` | 8 байт | $-2^{63}$ | $2^{63} - 1$ | $0$ | +| Вещественные | `float` | 4 байта | $1.175 \times 10^{-38}$ | $3.403 \times 10^{38}$ | $0.0\text{f}$ | +| | `double` | 8 байт | $2.225 \times 10^{-308}$ | $1.798 \times 10^{308}$ | $0.0$ | +| Символы | `char` | 2 байта | $0$ | $2^{16} - 1$ | $0$ | +| Логические | `bool` | 1 байт | $\text{false}$ | $\text{true}$ | $\text{false}$ | + +Обрати внимание: приведенная выше таблица относится именно к базовым типам данных Java. В каждом языке программирования определения типов свои, поэтому объем памяти, диапазон значений и значения по умолчанию могут различаться. + +- В Python целочисленный тип `int` может иметь произвольный размер, ограниченный только доступной памятью; тип `float` использует двойную точность 64 бита; типа `char` нет, а одиночный символ на деле является строкой `str` длины 1. +- В C и C++ размер базовых типов данных явно не зафиксирован и зависит от реализации и платформы. Таблица выше соответствует модели данных LP64 [data model](https://en.cppreference.com/w/cpp/language/types#Properties), применяемой в 64-битных Unix-системах, включая Linux и macOS. +- Размер символа `char` в C и C++ составляет 1 байт, а в большинстве других языков программирования зависит от конкретного способа кодирования символов; подробнее это рассматривается в разделе "Кодирование символов". +- Хотя для представления логического значения достаточно 1 бита ( $0$ или $1$ ), в памяти оно обычно хранится как 1 байт. Это связано с тем, что современные CPU обычно используют 1 байт как минимальную адресуемую единицу памяти. + +Какова же связь между базовыми типами данных и структурами данных? Мы знаем, что структуры данных - это способы организации и хранения данных в компьютере. Подлежащее в этой фразе - "структура", а не "данные". + +Если мы хотим представить "ряд чисел", то естественно подумаем об использовании массива. Это связано с тем, что линейная структура массива может выразить отношения соседства и порядка между числами, а вот то, что именно хранится внутри - целые `int` , вещественные `float` или символы `char` , - к "структуре данных" отношения не имеет. + +Иными словами, **базовые типы данных задают "тип содержимого" данных, а структуры данных задают "способ организации" данных**. Например, в следующем коде мы используем одну и ту же структуру данных (массив) для хранения и представления различных базовых типов данных, включая `int` , `float` , `char` , `bool` и т.д. + +=== "Python" + + ```python title="" + # Инициализируем массивы с использованием разных базовых типов данных + numbers: list[int] = [0] * 5 + decimals: list[float] = [0.0] * 5 + # В Python символы на деле являются строками длины 1 + characters: list[str] = ['0'] * 5 + bools: list[bool] = [False] * 5 + # Списки Python могут свободно хранить разные базовые типы данных и ссылки на объекты + data = [0, 0.0, 'a', False, ListNode(0)] + ``` + +=== "C++" + + ```cpp title="" + // Инициализируем массивы с использованием разных базовых типов данных + int numbers[5]; + float decimals[5]; + char characters[5]; + bool bools[5]; + ``` + +=== "Java" + + ```java title="" + // Инициализируем массивы с использованием разных базовых типов данных + int[] numbers = new int[5]; + float[] decimals = new float[5]; + char[] characters = new char[5]; + boolean[] bools = new boolean[5]; + ``` + +=== "C#" + + ```csharp title="" + // Инициализируем массивы с использованием разных базовых типов данных + int[] numbers = new int[5]; + float[] decimals = new float[5]; + char[] characters = new char[5]; + bool[] bools = new bool[5]; + ``` + +=== "Go" + + ```go title="" + // Инициализируем массивы с использованием разных базовых типов данных + var numbers = [5]int{} + var decimals = [5]float64{} + var characters = [5]byte{} + var bools = [5]bool{} + ``` + +=== "Swift" + + ```swift title="" + // Инициализируем массивы с использованием разных базовых типов данных + let numbers = Array(repeating: 0, count: 5) + let decimals = Array(repeating: 0.0, count: 5) + let characters: [Character] = Array(repeating: "a", count: 5) + let bools = Array(repeating: false, count: 5) + ``` + +=== "JS" + + ```javascript title="" + // Массивы JavaScript могут свободно хранить разные базовые типы данных и объекты + const array = [0, 0.0, 'a', false]; + ``` + +=== "TS" + + ```typescript title="" + // Инициализируем массивы с использованием разных базовых типов данных + const numbers: number[] = []; + const characters: string[] = []; + const bools: boolean[] = []; + ``` + +=== "Dart" + + ```dart title="" + // Инициализируем массивы с использованием разных базовых типов данных + List numbers = List.filled(5, 0); + List decimals = List.filled(5, 0.0); + List characters = List.filled(5, 'a'); + List bools = List.filled(5, false); + ``` + +=== "Rust" + + ```rust title="" + // Инициализируем массивы с использованием разных базовых типов данных + let numbers: Vec = vec![0; 5]; + let decimals: Vec = vec![0.0; 5]; + let characters: Vec = vec!['0'; 5]; + let bools: Vec = vec![false; 5]; + ``` + +=== "C" + + ```c title="" + // Инициализируем массивы с использованием разных базовых типов данных + int numbers[10]; + float decimals[10]; + char characters[10]; + bool bools[10]; + ``` + +=== "Kotlin" + + ```kotlin title="" + // Инициализируем массивы с использованием разных базовых типов данных + val numbers = IntArray(5) + val decinals = FloatArray(5) + val characters = CharArray(5) + val bools = BooleanArray(5) + ``` + +=== "Ruby" + + ```ruby title="" + # Списки Ruby могут свободно хранить разные базовые типы данных и ссылки на объекты + data = [0, 0.0, 'a', false, ListNode(0)] + ``` + +??? pythontutor "Визуализация выполнения" + + https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%20%20%20%20%22%22%22%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%D1%83%D0%B7%D0%B5%D0%BB%D0%BA%D0%BB%D0%B0%D1%81%D1%81%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20%D1%81%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D1%85%20%D1%82%D0%B8%D0%BF%D0%BE%D0%B2%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%0A%20%20%20%20numbers%20%3D%20%5B0%5D%20%2A%205%0A%20%20%20%20decimals%20%3D%20%5B0.0%5D%20%2A%205%0A%20%20%20%20%23%20%D0%92%20Python%20%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D1%8B%20%D0%BD%D0%B0%20%D1%81%D0%B0%D0%BC%D0%BE%D0%BC%20%D0%B4%D0%B5%D0%BB%D0%B5%20%D1%8F%D0%B2%D0%BB%D1%8F%D1%8E%D1%82%D1%81%D1%8F%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0%D0%BC%D0%B8%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B%201%0A%20%20%20%20characters%20%3D%20%5B%270%27%5D%20%2A%205%0A%20%20%20%20bools%20%3D%20%5BFalse%5D%20%2A%205%0A%20%20%20%20%23%20%D0%A1%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B2%20Python%20%D0%BC%D0%BE%D0%B3%D1%83%D1%82%20%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%BE%20%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C%20%D1%80%D0%B0%D0%B7%D0%BB%D0%B8%D1%87%D0%BD%D1%8B%D0%B5%20%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5%20%D1%82%D0%B8%D0%BF%D1%8B%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B8%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BD%D0%B0%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%0A%20%20%20%20data%20%3D%20%5B0%2C%200.0%2C%20%27a%27%2C%20False%2C%20ListNode%280%29%5D&cumulative=false&curInstr=12&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false diff --git a/ru/docs/chapter_data_structure/character_encoding.assets/ascii_table.png b/ru/docs/chapter_data_structure/character_encoding.assets/ascii_table.png new file mode 100644 index 0000000000000000000000000000000000000000..a1c48679a4ff0f35e71bc6c5f9f968bad095ba31 GIT binary patch literal 61253 zcmZ^~1z1#F*FL@{=te+t0O=BtkWOio?(UY57vd+-Gz?f z!?2svX9AAc4S|ok**ySA`!4?=IeerH*dHPH^wpF=?FYuM*e`Gw#oLMiG^7)q+g+Y7 zud8jSa(H<7=g*(Hxw)@jzwYhrNlQzA`SRuT^wh({!^FfyO-(H*D5$ZqadUI?!-o%L zWo5a!x!v8}2?+_GKYuexL>V4#WJT-*c3UYeh?4l$?=jr3Br z2{zMo3h+ISmtZyk$MPx2a^Lla?>aJ11Gv3S=a*@%he=+z}m>& zJqD)?S6G+u)1a%Lbw4y5#%FW^7AL9*&9|h8<3Z|9#Q^PP{127(KIHkR7sRX^i5jK1 zT)bjMH@^yVsZXrkJjTamVauESC`|$XK1J>-Z8deoVpm#c`G*?NSu+S;B!I#Thn>Ea z8=i0%lEocu$65*br**@R2#gj;!cq|@L!DWOKQV|B(2RWkHj_vy(a@yOl)4+ggqVYI zm?4fY zXrt((k%gl}{Oh!@3?E!s;ft0_>koWZ;T%NpZNxG*n0x%oa@S3o#x}$ry(W3?(P@Ni z+2$-RxUqZtx-MdiZUyOfqee^%!)Nb}B2|RbZFZ&VJ{AwGSs-)^OgdUG8znlEs z+B53mGYXpM`)zT#ewl4=ekR9l6&?GKT$Q{iY<^QZV6wHs$tVj@pQdh&5}xDY$_n>* ziL=ov<}1hGv6SdC4PP(5vwl)f-^R63nos_x6QlB;=S`K+3mTm6w^&DP;90InNR;Qd zA>K^8?sED^4BYN6pne?EhUO4)ggTy$&P4>u%>v-F~vzd zP0ii&629_q;R*_h{st0*%DIoyl-Wc(yB8m5`rda>gDxpHmxu;M+)8Ejj$d=ret{Y+FMb>9QCGLQ_VUkqep14!MF zHW+wbcQAy0(k~u+tEsa|+`XLN(M0wn4-3fAF^7nl76@t#nZ>Z@Eb+=adxr!}s=rVJ zPbaqJ3Ii1j2r$(9ye2UlTd4a6kS+0_!*k@pIK|073x1!zbdP&@$Dkd;EE>(Kc=yC} zSau=H zLfgke9o&m+tsJqcC+`j}KCHxI`@;Lc6%=dG_9$B;U2u9$2>c42on-Rq)zS)Lj2~En z+abNb^5EjHiZD}u3p^2ZcXF+FJ7L95^oomrcLlQL(4HDY9En>j&Di^c2vRHa)%!K` zt6~aEV!wN3-(6sl6bt-J`bDo}qe3Li7qTyh*7Mr?_fPZuqf=+uG??wh!OGIb>C?G= zg@Nz)2XWly$3hM>$aa~I%xtercYc>a4^#=J+qMN$t+(p*Rp75bJ>F8&;*h-%k(I-^ z3B8{%dwnFDS3!MYX$1eV$@{@j4oj`45HL^DiHRgbr|ZRKetb-D$+qW|U}|Do3UWYX ze7de9`|^@MZFVvdi3Kv~&w3n}j1069%P%V?IAtFoBCG#0Zq@*nP!YCd=s+?rQe!TN z&)qohu3I@L?CD(C6HFoK#?HH10ag!>r!_YO$EKf{FH{o5Ml|)j{Nyk9=QG7O?GSd^ z>94|2+afQW&`IHk!(_GJCXaAYDgkpGQxAI$jJ{bp{9X#7;@Z;Vkfj7y{b#SGA$gb#O zLcNqDUEFwS)T)1s^RB%M{Y}!Lp4({Tp{eXu?|?uS;GH89sy;(2yFBw_DQ%3+r^m$N z$dtUpCopsBx)Hw+g#?hw8`J@KE9uzlBYC;?Z3cQ?{TpV^y6 zz30xP0HU{+iC*?fM>{{rwjotG7iY&c9$PhV8zHpt)lrVAqHg9h)!;>l#DBr9Dd1^9 zpoCJ?AocFFdI#IgtDV;AS~dA$GvBynlXPWg^*|q&ulU2{gVAOaOvtW1^Ami9?n9+4 z8Aen%M8nYznU%9>ZJ{|JmU=^#qX(#uTnDl45u_-NaijO>5$+D-+|SWo&zD=@=o5;> zTVx3^E6${Py5(?_08u1n0XRiLb*^0jFb#gWo{o(q-XzMkNxX_2K zK07ZrGeu_P98R^6SH;CV-}I?LbnkWZ>~+CiMrf*z(XVnI9n>wQeSC(W6Eg;b%!*a5 znEl)TysXQ7Asn5n&H^LDTh>Jp_U9=SPDNWh{ik<0R99hz2~>#gJ&z6I=KcQ0yo(Gi@)xf6;~HHYuZ+!zFK1ldMlmr(c4EjtPq;x0awRCju(_FQ~; zaaq_^K$Bt>Ns4O0wCd9h&3g3{j+$1DS=xDC*8xX#L9op}<6IIfVwiCh2&F$i^0171 z$TPF;i?^)xa_tDe;DF;)CwEX8mi783y{+ z{q9dYFrVR1^ir06bp!r=?ho_yyLbTmJE7`LOG)CLj%m?h+8lhiZMPMBW^+DT-Ch(3 zKX&~c7YRqjJJBvgeM?o;xyFdPOX97*p1WNoxHS?mNIR1Gvw8@de8lqpZ8WG{lj~cN zz1(l|JNS;Q(<6G)FF`OCTOPZ1mDD)__$2<$kHa5|{wD_+-QDlNmf!nj5k-*TF6$~# zEQ$9mhc8+BLXg3gZrQ@T6!;2}1F@8 zZeRho`NULScA@P;3|7kD6GnYr|G{QqE2Dp>P6)%J+1_J(u%nGLyGAnb_6%1^#(6PF zS;F-mha3T_w&m4tUcHR44n%Kk`*G(CR* zQ16v}KJ@qu>ZMk4D5ZDVdEX12eQTI+%aO}*c{sSMMO?qN7q*y`(>igL(aZ@GBKX{t zw;_ZmOxm63d~BXS`J+SQ0!2vJcbBN-h3I~!@_~Tl@X`d%3gdO%bL(h3BWG3OhPO24(vhW(_hT;F&E~-HF{AfB~ zEv94V^U}ODNdt!A4^x%l5Mtj(FT5MUJ?FrTs<=3J-3d)U={7mr9=}V1^dHhISxB!c zkn-?v9LSW_Z5)6A!92I8k2c?ai>W)Aav(x&jq($-9K~@&bvdS=Flez4{f~V8caH#- z398q?mWoc`r0(H2sExzVoVLLiMCCsm{s>si&R>59k)W}28}OJzw;9r%{Zx5j{Z&;K zhFaIMcCWB!3{xI@5hj?&Tbon;iKEsYQsMaaG#v2jjrp7nA>Mrow@)vIkj-t6dx7d( zJLY_2YA3IHGH;2O_jp3*&U;5`uYvug~Dh15S2caUiJP?uy+raiR( zVbuM;syj%T%~**d%=9t$N_ODp`Vc9zv&k7HXnWY6jlLZlQwOioylZ4`9BstMQKck3 z(#}GUDpgeD8PtK1YqG$JT%`W76f+R}F^M3?Um#dGXIiYZivcXxg?|3M=jo~mWY zrhSyPB2=ggp(Iui3^{y8KWyk`w(RjGmXeWBA*ym0e}k=`u<(o>g!1cE`LoU5;Cri| z*8RL*0xZwU+u@pSSyT6YnNnoOMe%jNcuYAzLUi7s-*|&mgiivZ5Xb=Zl%2@Fr<3wo z7uF9n20fW$BS&eA<>dx}`rh{J47^fS<*AJCC$HYhKgR#xMkGrnLv7fuijm>k;{d&MJ^uAI959v&jp*Ty(TEENU{mhv$I1bIiVpmpv zec>6;Bv;U@_gdj;RU+uG2-FF2_`MH(4G z6!FcX&eX5@EZ-(CSmv7tUR*{xjO0K)?}QyZ*NYyL-vzy865juKPybKEm)F4mDOadF zH!06$ph;0uJ*9c1B7j%cD;d|;T2thp@j zM2=b>Ykmbo@1}teA*GwN&(yTmq~(D@;)koZxz=rro3431j-`L#7b))*CwJc@$;%WFqQ~ zyE0Rl*3huTDK^#qwTK2-4bH4k;(E|{q#Ir4*eSj36>*%DPdK$wIMNg_%g)bME{lHy zNQ^#w{jWKT+e=T;Gl|gRlCrWVX#WvA>ODq4@?4dl1e7RxLKHqqsC?%D)WHE3GZd;m zt0bt66kVqsEr^64ek6wqjzWRHah#xET~77lwIBa@N9vUza+aQDm>g&2VT9zbp52Ds zC6^QI!7 zDpjQffkN84F8Ayg7UkQC%d|5zC__3v8dDO+Rv#KbWr}@5^1904(ftbsfRn58L)rs{ z;~XcH&gJM}h~NI)(Wx+i<1&$)m=>>M6Y19sZz+V3Le>a#VtTSC5(UduS-U1I2A@uYP-LvZ=!ALs*}X%>tq-zl z0z!z`yJ|5+L<(PPamf674Ce0vO?!HhhW090(bFb6mO=;v#Zi#BVzKXgp#=<4_*eio zTym;Sl-1_gjAC6OdJIR8Bwp*TfrQnizQkq{^Bf!UO00NzARbV=!yq((U&HYm@8ngV zyb^PaSy=yjKrAtK!a+8rYmBosve0I|&!t?>V=vp^ii7aW@6xzgxp|)L{xRJ8Vlv@{ zs#p$|p2Cv_mCYK@&(w#ukEyqcmlZ+SaTD+899#RszzK4q4Q+H>B76NHT{qNlDmWCY zuAlG3>)H;{U5_9@tvGPC{Z=0$M-ZbU`>|4IGm6{G&~xiC$otz)$)E?H%DDcI3crO3 z-M_}6SIVB0eJk_A47-#3Ga-#VIe2yp`;k7Lb=?PQ`~Pgqe;82f`d_|~qpVe3p2r_f z%nU{F&e9lHo-p9I-~}1N!rWTQf#L7T(fS(Rxxp?Ndi?7hr+W63Yhg~xL+)7RlyR>N zKYq|mKboo%d)V4Zf^zsaGQJlvq;qo6v9J}`EDOa8zi5KhOtF{2Az|JA{4I5y)B-ka2owoJ{VP0FfZFoJh*WZ7 z>%e52(aX_UHdpivi{+%@51?zNBK*Bfn&CTEu=?Z?_zHH80R{LVgsv!uK1nbS_g?+M z2LuS!eqNfVY_302%1?Dyv=l!HW}EJ0B(#)hG>qcV499(vx(KZfrUiWbJGnx=RIIls zcKP_ac@@3n5-QQmeBb!$p00Zo0+w$QAMQeIm&WdF`C2R07ppUQk$uJ*q%(&#$irpN z)K;p+6!wl2|o@GwOnH+gR>;8)T+ZlN6H6HlK!jhc~^Mbn_y@?C8hnx z-A=bR)YbRAoTGd}c1C4&w9HpiBeOcwghpduCs9SuME-nARW;ow8LVe@7rLZ$CQjm8 zSzhBY!1Qq3=?1%1c3m~RYPj3ky^yeM<@IFeA+LF-swij~GK*RF!2@S=(sN?pR==%; zzT7_H35_K_rC6i!V>Ai^V~%`Wln<`Xji|VM^G%J!Ry*EX4bnER38L|d@Rr%1H5n@B z@9fOZikTu^ym9fLs_$tNDP(k``2(-SI%Hj+^LtOo=*GRK%2VE@PnjXUO#<*DpZ?5f zjgyNTUkwJ$!USLTdtwwh3l+wS_oVNrC3D>&JyZ zL88f*!A-sUq+V?h#ccoJ{u5~N-Q3=f!IutH1XQY2_aiA#hq@2E15-6rT`J>m%*^jU;wCOJWLcw=$iMHgU_lV>ej46eOrm-eAl+ttWL=r?`z3^ z-9^wsW0dWmdJp7Nz*f6E8?l79ICXV|@!aZc`yOz=v0gIQi>)4&H9pO*n6>q#>7C?3 ze5Sr#Il-qp=r01hEHNC;1&ueD8NxmxW=^qXzM@;^6B|lw#Uh`}hQw;nxY>)6k>dbH za5FZ@w3W5Gv5Ux(JE;;0(PeaV^|Gk}dhCv@Wy-cGR_%MW{pXARqzdJUUyKHr@zJd} z-SwP5*SKBVJMiG(+gxt7m9q)`*!hbVRpY9j?&M1Z7?{>mTcyugDi)guh)_FNhYi%h z$m#Uh35ZfN0)Dm2)?(6G0A)C=Dq-6L?7|v#Mr(!tVsqn{6lrxyk96B3masu`5ift> z$r8=W1~I+Xd-E_>t)jaSM0on&m&|<_keAh6wk=$f>v$8-&!&n(7s{}p$0_5 zjkMs-4Jkgc?EKC&Hjj!+e5RI0%@O#5-2k8+$YJxc*17XlY)kvwz!Ec{iw)4zeO93u zvK0;HMcShNa!5T_{(bJ_NL{(FH*rpfb06gR&Q#i(f3bGA2`5B1^c3|`zrjHzO*@Y> z8}F#}JvYH}*9k!=oD^9S2@N9yE*>RQk-J4ZPaUMFP&uW3tkIo+njTlH8^#Rlr$}Cr zFAL?in7-4wIG8|t&FuCP4hB_HSQu~>axfHkV?l%-C0I9}Kc~wX!F2OwBg-edxoFe% zGY28#q@%|;8)agqdQoBIZ%T^vDLEx$uf;4U5(BCm%u>@<)({g}u##LBQ24T)S3+cy zyluxA?7Eroxo*o;j#%_LkZN&Ov9|q!?IX;WJAVZe3zffEJM%cL1EP?xEh@|o6@q|Nc&&^M1Y^O*JENf`a6OfEq@=sUo2!jSHJMmH9##k#?El|%?xtdF~ z&!z4{Z<@D%Pwk?fO*xVv(ASf;z|?%cunc`{ZYs%ZR71^J`AJUuqa=Z>i~;dzKq%2+DHC7C(tRf?IBmUK#&O;Atm`AV`o;6zJ?bcop(<68K5x6#aYw+;Q*u8fY=qJ5Gv z=+E7u;TgP-!&O^NI#%yQw9`Dc=LI8n{oC$};cj&pJaULT9=>12S@k2W1-A8xHe>
      )T5|F-R);J~n~)3>xLc_k3#JZo;ueI2X-k%aKC= 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%0D7G8@G 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
      mt=GFYh&5#^(_~n^@8r*d>WA8bT5F+ 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

      f@0WM#8r0_h`{z|;hb)5b|LzWE~Q=r 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 Dk-@w& literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_data_structure/character_encoding.assets/utf-8_hello_algo.png b/ru/docs/chapter_data_structure/character_encoding.assets/utf-8_hello_algo.png new file mode 100644 index 0000000000000000000000000000000000000000..13428adc14ea539c0eccf495dfa11036173eff7b GIT binary patch literal 18130 zcmce;1ymeO*e=*J4DJrWHMnbV2<`-j;4VRfLna9Xceen+-6iM%f#3uPuEE_k5ZKB0 z?SKEhd-vbnd-t53bNX~ub=NCTz4g4+)qN&hLroqN?HL*X0GNsjFSP&w5ncrUfFQt6 zVy|G<@Dr-5f`JDBV14_0fRb6U$l#424=s6VplXbK4_<-TN~uZ#Ky57ggZbb7TpB9c zvQJM>hlhuvqM{KI5w5PTu%6zDsj1apzcMp3tE#GWb#-rUZz)1XMH3?ovkcs7zhU>Q z!T^98P<$z+?Xz&0x$1&HPx!qWwJC7~0jox`u}nJ#Q}Gk=hLOxtJ9N-%@i@|r%lcOy zV?)_cS%P2*9%7{x-rRB%XFR)MV|y^O1#>$_FxBvvN8G@$ z`ECv2GuRDXWo-6RxA0BC_G6tM3f%7he}68tC)$VRx4c1ac!fTTK1&aDZL_)iuvKPF zX4JEiFRON&y3Vihhoj_*eMY@B73C*`OUR{`unNab_V>WC>L~IFg7*DPhUvFdPM@HW+VAiYm&!id(CBt~pib1% z77EJ1ZetHi(0yFrR4Jr?6((|h^X52o1r}th_=o6nK5>fHK7JG|?iMh2WLWE81McVW zmx%m&0E^B3{=5o0sI3jz)NcC0Vk?y%!(7OxbZ@Sk!&dgVA@2ACm8YCGh0a4ZX^*cE zNw3ju$cXPirCWskB9Ib2@=`CTYsym|_11&OHlKbCx6}FsWJHr?%$t8VmZ#Ena7SNq zyQt+`to|Jf*=9chv{uT^Hnp@a;|c9 z_m%DZJkbG?fajbV9V&ZLS<3g|W5Eb*YY=~+;5yf1}zD|QvcMqQn1!Pk+EKKQidv+(@YG6L$!OFC(~ zT)MRn_G+k<g=#@$^%WA(7rjCiLZ)XhL$bMAPE7y#YQ?`5 z+;0Fohe62c>ic<}Mu}^ruDBP*+blYfeQ?IgUf1+lzb?b_ZQj!c%fY_9K>pT@`#U6c zobfDUl`zh96!Q({z?(CF>tN0`y?ydiN#ktvjBA9e9${p*$x-tYLC$0-ZcW}KOx`Wf zV`aW;Pc`hf$_HI!hBcY1>TxfWGz|%+$|riO+b-4hLOd>T)t&r@+#H%yWUKAPwl&Sj zs>#h<2wxT6AAL_0CNI2>lYr-%6w9BBJjd?X(jEmam$wVoqoLX0h%THC?tF72ik^4EbiQ5D>T}ZT9oIn4hCj6h_1lWPaQkTR;FE80LSYW6toZ5_fj`|oG z?Uv&Ok`qd8I4TLsCns<}J%)fUkd>y8=K-^+1h|nuVp^;(O6@>ZjlmYUC;|qOY~XIj zV<|512UQ{*I%+5s0D}P#2m*nhQBVK~#3c)Qaen(vga;ecy^WHV&x-HQgb6}cTDN_2 zyMLSN$EEhCs%YKCcC2Nqr0lzV&XZz@)kVe;G75>>d2b@K#J8Zg%X@RH#uAITUVrY2 z4>BEk9B_;|0%Z$+-^-R?sb6irloR{>JY$_p+Nx}1y^n54GqPliTmCYHirS1x?$uE5 z5%rj&ftkl=C1%H?xHVVH*RNt5bDxp4UbGEu@lWf$jBsWzVod0Io~)TLxmwI7k`mvb z7ZyoWx=E}^G&MA2DXg>yfO<)jXEWH+i4*Evm8wu`MKAIaM$m~juePLJUa9J1ei+^g zu{%4MndLNm+J4B2k{d}HP<6L>Tbs5msdoM~Gs{PnP3=s*?u8`Gm19#jD*2+PL?wLN z{JMtTi@+0S7`cyxb#_^Md@YY3g(DT8wm&kZqw)&7*44In$nL%Y2fIj!+bAj_o2$Cy zmxLT^&)TN@O|brpTm%S4u`uhmhYBo_b5R*0eLT0* zZNIkT)IPouBMzStT(6xg<1tJl*bn!kEY8p*WVwT^`ob$FpMQeDpXx^}=fC#8FkVBw z8U8@RUJ_zDimpic2jk6;<)3s7Nbk4Kr7s~%+lSIwQA7SAntXji*qhcYsLyTHSQscL z%WCQ#Jae#ILZHptLFcXD^8upNP){Lmjc+No-%v6IIm=BHPTSk%XZ$n#f@i2}j2{Vc zd+fvnO&U69NcpkCl&vDzUx}tnMWjBE%qvDF?vR>=7rpgig=n`|K^a!2x8JUnUVTWi zpsyByF>s!;WhL<}PW|t8RfnZOa~fVCMoqCNYgVKkt8_XM>70u&3sxdP0@9)WR=m}{ z4^GBGRgfrl;v}e=8ED5grCv;R5&Y@rKbFMf)lB=XFq?7I%UFAUj`61Nl9TtydMKU| zUn%qfy*gEfh%#fJ&Ge#QAZLaYE5SU@EAW1xy4_Lu=BFRoFA#AR{Dr4FEDhQw0^uta z?;%aUl&zribyO`4Zz)2O|U;(vdIDmQ` zaP&EzBJ5CaSFJ*!o<=26OwQjI(AT(m%GJ*KSes6!K;TXl7@5U)8j9^LbMF339D^Fm zc2qYR<3RGsiW|OZ@Tcj2eG&O|=G~p1Z|PQf6Pj_+s6D(fR%6!1P5vvi+Dt zhWAB)ZF-OLN-mo>EJA-_xLWTm6#8qVJT}1gtv;&|)mUG4Y=ARoiMrI!;=fTV?f4H0 zOlRI#*1-v5c1gMkGh%8tC3Y$Yn|+fFEmjNbQjGllfoq5;Bx4IIN4W60*CLu|^%dhT zojYe%YGmgqa`M=|OmD}WAB8RToorGVE66!J-aNiAr4|#5sv+?yLgnr6F?92xxxe%A zr(UIv6GfDDjLwdc!8!KPDMP4ChbsS8+%rgO`Rhi7Gt`rhR~fx`O7qUY0`A$In-c}y z9k90p?ww|^ak#P~wLYKqzG9Zxh%-*{ZKH@P$||jNEW^Yqhhwpz_cHSN>*Z(n1KGfs zSL6KF_La~y>532NY5a+K@IasQ8%G<(y_+pg+Yz+L5AUBoepP@=GZc7;?clwQULWYW zJxELctVp$M2D2$7XCi|nMjlPh@gCsYn=s< z+ZfL|VJtaVNQjOQYWMVsTpvp_@*PdFF|D$Z&TE~i<*BG2#$K6soigI{eiU2NHL&GBdY^a3AJRD{ zJh%Bt(aIaml26u?g#35GjBRzH2>mSVj+;w~2+ul%`zgOEf!3&fDfkf;Gqa+#v46Hd z6XyC`Y*^JR<1Zra%0-&q#Za&{`x3UUl)SCv>iC6>ftrBkk8;{ z(&+0Ob5}$FVCjah?v4}Q{vXg(*m%opR5<3E^5g)uye!Z z@!R=_rP!AuCux(Kz$q2&B)SZE&Vb&5?HO5h0{Oh*Hi*zCcNCX=D86z~s~$l<(zL>< zJdi*AeUp`O5ud3R{#4GCIp3eEU1DqbQq+O+f{fYTgtvPrfY1aXP&ZHWyeM+Kt`X6a z%%V3?E0wprkGLyEKri68?-y!=vO?ljN4Z|KL{dBDerqKUd9-zvJZI;WEU)N(h%e^KPhEohbNW@KWQQvv z(^rJ!Fge`Va=i>X-(Tn_OaUq2(`fW{y6ojyn+)PrKCihxT=40OHYRFvcVkvlqT+=z z?%KvTu4VTGt&wMR0J0-2%P<~y(a6{t;AW-&w zr$Qx6sMi@jAP1i&>uy_kuw4O_Rc8GMH+O?qnPTt5CEO2oo-4~V5@RzBe}IggMT zmEYmP@LUpxGZ!KPGU=g%S{`UkkvT$$^8d=fhvmni{kkB4mfk~?T9El)06|PH-6~aB zzI1+(o1?_ecokZ&c@$)i9X+-#)~^3(+nr?Ui5hV7}^2=1we zF@uR;H*}D-9Q~~v!B*@~2sJcRcO1_|O3Fh$5U&OVe=z2J7$|lh)T&%r{|@^39~R_n z4WkS*17cp`UYyT(N1ynPQm6HnH9@CIztM!m$f3xMGjyQTCUDm_T8n7VtfO|cX8tp$ zb7~!j&g{j$ScDSZ8qIGTL(idzsAh5CI4^_L4i{BHQyW47iYOeY%aIZg`T$9)Hk<}q znuz#;998FWVUpGtW=?l>oJe z^xDwg&bZdWyT;FATMt!S&7W+jHgq7buw|eJSJq{k75xSQbEfX)}G&4r18M3>7u_j61A>+Jz4*5&NkiS$6CtNry z1JeJWivK-j|D|m^0+1-fQ}Y#o^V<|8^f?O;4CIM|c1>QN`EM`HIS#I_EEq-4@12Mr zbMpVLBf@lc&6pT}r&pLQ^8WXp=jE^k4lBRjrc$5!yBpI5O`8iZOcQTl{9&u(7wGbZ z14^`ja7Gbji5rc($={+)SGBfdRBeP+6AtE+>v5?tjYpJNTo6OXG|#;AwbCfzo#9Eo z2Ila{Ayb=gJrbQOiZH(@lp&}%U#^GQ!}kwchc04#TYlvtGM_}I119mS~RC7k6hTCXb{axWV1v6cVj!g;_{ ze>VWEnY|?ne-_!lNq_mV6~>+m#%>V)AS2ApYvACurX zgJE)&Vu>t`zzgM9q@-C^9)Ezc$rZvo@TpfCXbrl3^bCN#2dYke-7bI3q#gatQ37Uf z%ODyC?{j|LXTw<>5ze`}5+AGEcGNBrN|gNdHql^Q0rCIY_dJ8MG@^pWYpD*1yKr{9 zp4MHn_?`?f!ugNz8n!o{Yh-_gK$3i2H9!i*{{vt-tW<#ja*Q?c=y5W~Q$&_X8I)?| z7@^>ojDVA-Evt?LVD;+#)Qy-imXbugc<}DO*20+=CN;Xq4?q!IdQp-DwxcVj15nMv z1qZiOon<>!@nBY^!ibUBfSwqk0y(5F=i%yNkJs`q$llH7kBQ5gUhw$^%PDOYO&2KOsGh*Z>6QbLOxBmQ=QB7VexF z9j4^&F@v*pgTGoI&AHCvj;{4}4pV`1n7pLH~2n3VW*aMyhr;_9cJ!O8%Ms4i1AC z`OXiS&s*yy#6}WU%C`jG{`Q<|Nv-_C+EwOx%!qwOKbP@p*e89alm&X&`ckXR6!TK^ z7}eaF{*d_%Y-@aaKo`5x!nj|_ypfySl{NawupHl+BNL?Xz_=;crEar58ubU^KXyED zZ~zn(YH9!nM^X}?{<|dtKZ8L3S_|;eNL>wbuUWxm?DA_CoIW)W&U&`~vuB*D^yjv-XTN!}fAC=^Kj4`zYkW0IG`O(({Qa{O`^o{sfCg+iGu(5LPlPtRUav;!wYv+4 z{5@l9<$P6@ih7AC_*l-gWw_NJXe}4nIs8vu(}yXe&IBVwzb~~JHx0M-PaD%@m&w%K zO2zD#b>-4Jp245H9-WfY=#r*rWQ1powd=XRvohB7iw>i0wZ0l9%{r+Wwa0DQ@8;1H zo690x9jR5VT6h~#?j>8wLLU|TvG{rSIAF z)Q9)e4i>+8|90lC`7KBj-L=1TyDN zl_-F8aKO65(O>l)=yU5uo%gySoY!b2T8l>X$}pq%vM}*J`Fj9-P3W3T^lefmbU&c} z{3Tk8)Pa^Hp_b=+tW1yEp9(Ot2PGHmPP@^pBSMYBre=jCsMP5aty#``ejot4M^o6! zYGA?8aqAyN1BH9_E$D?3g!5Jr)UZyY=&xaCtxz_gU73J-e_j)z;-5~LfbI#Yju24h zOkpwtoo3R>LcKyKNiz`OAs{mjI*$2nUqQ?%EIcAdfQba(s(a!R)IVrRx{?s@LPOM5vJAs z&$zl#oeF9u#|EUT2$hwDdN5xN%+5-QBgU)41C^ijvt=+aE>ToKq?jhlPWbAeK4|Jwgp0Tq_7(GF6}r_{hpvkfbvUZA9!~U-Z|Z%Zzhnl1{3osb*Tnb#h9UoZS^rXG z_fyv8eOK`PTdjB3TRAz&z2Ssv><`y;GwHmjpeK>z1&1n%ENtxk^F?*68Ihh%y_4&r zXBA?unazJzywb@NGYb9$;*}VL92yEew<=?B6oND0jUG!D{`wMTDE>Y<1+|$(dr`)R zf{*aMgR|*>_70GR$@XfV>+sqfNyT3viyiR@zo3tx+AJt|;c?<_5bqsbF2&y`dKMYw z+}u*J`->;F@8GYTcRZeLr8anFYg$`kt>5+Y+vOrP=e~TDWBBY)b8QyYrMdalr_D14 zYjAyIZBOx(cX6}q%PV7@&2x$-VRo<{A-ji8``Cmz0Yr2)pgh1s64b0Tf;+Sqmq+f% zQ8u5pL5Qz!`Pn+eeYtcS0r6WKX`Lj~WWs2|fRtZB ztu^H_d&4eeny+8Thic-SezM!^Ldqs?|EB+TF!&5Fk9Pvfdqg3s>tc2QZ8+P@Mih0V8ADqbIDZKCcX zj&~%k*;jngv+0{K9feTZgR0NddEaf-BcQd=>NYaqe=B_(85W(q3HFgib|dl%-?k`y z=8yd?>(Gdrde+#{gzqwUQ4oAGag(<4XH>W`%8h6 zM%cGw5KgSrf0%C#GYApP5qZ!xD7Aw)#ljv|7>YH0XR{Sf;QDc<5Xw@p3#Jg*u_%p) zHc_5(8uHqPs>0O$5!p_Wu^`6VdSh8T0g|B7tVG?AJeIK*0~+dyD*gNYI9j*U z{3^xPDy0MGAP>_=gmLQkSVS~=(2ta$y|`%3G>t;p6v9ZHvfCK_;9w~fecRD&{W9Di z3kbp$kB40B(mjh@V&!IM65~3B(YO3-$LSs)O%MeBOSW`6l2RuBBVbC#2vP^9pndLR znY_uBdkqtN9OuOk@Pm;}h^VXtOh`o}mnt9|WVpX*IrnwlFk$Jmq4V!=}Pk80ZQAm0B`^7*p^?9kWcUk|+ziin{zjkwO z9h|H$OW8GYZ2HU>RQxkBZuldrk9L&=f%{(EmxHRf;d~L3Mk{c6%7gQ{W$E_*(!$4+ z^RE?#=@`*aX69U~>RoX-@5!4;y5SD^K5m$OkD$k@ry!+7UrzXPY2dqGsE*_j`^5~{r`u*PPA6tVSFdD|Mi`u-Q-sMhc&bPnx{v#hXAUiq7A zjfwdtZC6q$#X=p;z4z|Bi5Q{I>U4h6`wT-N*U zJGzIpFAdM)#870abb`qcbG5@O>JW;#5aOD;WWo-Ff%}g$16WQbfHxJ}0IRDDIY4Kt z9!x5vF+l6R>=TDaS<6_aLytY)iY8V&04#M54B&%=$7H@Ue@Q2ovJVsG@gJy!Q4Ujg z`^P~LL%${7dXaJ}I!30;-38evvk!P`mA%x>3rqv0eY>?brj-ziw5gMF)J7J#prPLY z3*jKcO6C(2)1HEJwUa1uHwldm?=m12qP{*eav;8e>zkJP;B!6P42qZXUAtCvyS|^r zbtgsjN+2~+Q%AQ(_Js_~)msHRO-!QSBcj7ASfCBugA*1Dc4Tv)zeH*+EmXm}@uGYOWx&H71=bn_IWDB&g3d1rU~<6cJZ<$Hr)RcX(Q4glC zlvfqU{ft0l#o`m4MbtZm>KZR}EH8KIn2c9t|A z%qzgi@cVVXcDL!ie(4=YeFRp6A~5V@g*?Ci-K?O;umj;4tgMXNpRXYy)y=erLAw%z z`RcFu3&#@&Mv^Om8A2he`=Vt`Ox?p7$F1J4h4uB}loMI$@w& zev{uw8-?t`b&K`x17(f&Agk21$TOeT)JBQWY1K{vk=zZo zSHNn$pU6H0XCvVq^2p6$8Cvd0892->{TTY(>?g9>Yl^uMz$7mM9X_Ajfa+e?P9mri zd|(9c77n3ff4tCgt%(khPgPg3?0V)?%7CE?5O9)3Ba(}niZ2cv?89u3PDQ6zEx{yW z{^XLZp$?#d*?(-Gz|yw@dU#9no7Dg+QgPsyhc<;|x(;HE)hmETdF-B!P&W`Y=I=Ci z14aikfb)NFbOcd%V9J0RP=4_SUI7Xc^z;614+KkzM9w{G-8|(~lD~h^e_oRElK3bV z;oz(VHLZiQV9DM)(DLOm!VIdJNFZypk^Oj+ zO*v4qf_w?mzdlAls#HZYv%$W!=Bek(uwN55BY++bnvg_5G%6Hf`;4aO0Dg?+(;%r- z{k>w3@>`I8Ki&Q5&7@y6OpsRtQBts+3LY^c?`u0S2WISb4KwjzW2}0cSUy`y7=Ysl zWt#_v45SB}7DVtL<}|3pbjL(jT@^In`xAqx1LZL}6%Pb%VKr5{pdX|A$Z;KodbIiE zavliDGewY7!Om6WU=m;^O^nC}`G@^f3`C>qFU?h>LIqLZJy~;V=6$b1hv}llIjS0% z)#kq>fxgj|fbMeHKZ%KT>Ys)xl_PN>K`STfzxTWgD<+l&GtItiY*nsj1d3AjID2bM z5B!m)5vhfx*5p55y@>O0B?Oi$(4dNSpoPQKu{y89MnzKuN(3R|Cw{Z&c}tq);?PAq zpbt(AJifiaCr826FGTxPr+N|m+=S+sqZt|7zZ9Gg7*ioN_x5H_>>L8nx1%P_ucv6? zY6UhX`ADHeivSs*pqiJ6;% zq@j#Z0{S@#IM@S?|F*KT|Jx3~Pzb;BzkKOW4roq{yA1Tx5F2QFRDI%F6eZ&_uS`|w_mvESUxVqJk8h>kp2I81!=_%N+p=wpZo+MD4EP z4f=etqG^lUBi&}9N98XAJzkTQmk;bgl&!iZC1T)G!MRvn%A#_^WujLDC-E2GUbs3~ zH%yj!QD3d!_qF6N#f8R+aXFp6;8*VhxRQ}uR3u1u`XsLPJr}AF(maWbd}U+5g@}*u zH{sxY)-~XOjJ56=JKD`mmpGn1Z~93kaVkCOmL=aPM_qit#jc&mWU0%>`;*1!w7ZpZ z9uyE65P)YXO4@+*!WB#%x*qNR@$-jRRYAZET{JV4kB0-Gvmw`4Ob-|b&BgvOBKo1& zt_c+%XZetH8pefyjAlSTh3e=tGcBrY^4bdM>>N;{4?ledIt_}(MPW}eC@c^#EGyUV zWBEW*aXNsN)q^3q@Tm5q%nJrRlp=}X9l{JCD*^$w?p8yeP=uVWo4`i+9}g{f4e+3< z7NEJ8%BQN+|PUAL23mRL$$WcF!{P5APuxin| zUE8^)J%pU?7F3{v^JH9&13VlUPg zv0O%e?HJnSLpXI3Y-EkjJ%?CGyV5zSh-OAsL^$$ZF}HtpAEcvTo7*4)befI(+qEEe4vtjv?`h&gW9Omvt{AW1i>TzK(ge@P}* z#M?0%DyCfYvhNbFQkde+mEkE~8X6SciwxN{oTvj!e;O<5NWSz#xJJG9@RH;EuiinA zrg51$Px2VR;FUWO64xY7_)E81mH^t7K>U#oRKD>3Yq#!g zLpm_>aAhn5blP5dX>+Wil2k(CjFyS=0F%&P?Z~+epKP5ykv+4l(abJU2mo%5kVCkV z#xO9>2G25x@E<7w<5fjqu0(qj$ze8KjvRPuO9tG_7ikIL2`vCnf(O5xx8zQc2qKps z1O%*BEP=jGJL00QW%F7gYgalTZ>tC`P8tJ2X@j01mG2_KKN7Ynx>HY$s2!iPVA1rz zT|)ekb&0?P$BAqO1P|?9+!8>XhXu6xk3S5V;1a`WtdZ`WlCQv$^B?gkMX#>qGqvu` zQjsZQQIdq>=I#{+4YlqixFj(|?8xdnW_?3=pd$T~EGxLdRL}>35%0g~yan!@({go= zVEXEYe9lC`jULF+~{Fk3!a-=0q~*1Y%f$VdP|7&#+m%uL)WNKk%7f`A6)slr1Hu z@yRZtGrxDU&P6O);En^o*R4`f3qX;?=}7k(<1n`{y&yhjqg*3S07$op;* zwXz5VUNnm+a|~|9KBl;sO)X8g3-Y>%ci!08FuU}q(xLkw)GT2_x9l5!o*Zm%^25|? zDdk%7tabEg0hp!_K21Q`&#yWk8?TYp8dEvdgRXgI-#}hKpF~Cj?=Pvkb;QEAfzF`c zH;%={&)@3&p|}PATFfG&2kNn@owQkST`Aech3DMIXzx~q=*7h$Lq;m7jb*0M*eb|iJnu^eO+ z$)-n=P~l$4?zS(?yoTCWOYnJ`qR45YA0Yp78kYeVvbK5}%Iy7n>917CspIBJjv-w) z-49SeHt1(X8S4bOq-S37$j9I1zeTwA*RVYhAZrAEofrjO{upmCjvC%5hx?Yl9bE&l9?gDk8Xpf73MS@`@FJS#}BOef5DMTd! zn>9P>V}znsKl-QP-2L;xjkPkp-0eIu z%TsC$Krh?OOK_mtD3ahfG>}3F5cLe&I~o*+UP((V_xe_C6QxTE>}o}K8+2%IM;N+r zpZ!^6LaG;HMj&dIct?qK5{A`q6Y@_RE=N8)AR0cSf&Iay`t4emsMV*{!>{;`FIUY# zLhTxHh#O`q9o27fP%P0|KJ+_~EqhDztt$3vaFG9#J;}1^=ZXBswKjCxlg2xK6k7u$ z<}^*-Z=lPfnWN#ZJG^@$8YWZgz)4dx6G{NBaa1-7zFRE4O8ORPy!#ay+aowzPY&4} zTh2qG@lCTv(ubZ(>Db7yIk0&#{;du|kg04+msTbAS+#~(iwsAc5^d@Mg9;zxnhHW@2}ZY65zc zAM-TF+F%=2ll1_i+|r-yqiyAKD=uStMq(2C$1>vEHMaq0Qup_`CV|FD_ZPHo_g1cH zou6MGpRm!LNmZ#PPh)1Vy1%m}314&`j)R-$-Bh>?HxI_t+NFHu$Z06iti-|Peq8P4 zvzIlb8|j=Lx(UwTdUQxVZ+_%kP02fXE<5}u`)0xjIlg7E2_sN~`NfuW%t}w{+K%oZ zqFn!@pmuN^M=ytc$)k&FvFsd1_WZTUcYsmc1Z{m= z?!~EJ*1xRK0*g$Ozv3=Px;>lr~Mfl4=SO4q$$yM-fA@OboVEg`fk zXc`|{w9E`;Rb14sl}1RjQ&Hma*uC85r%Q^G1X$}KW=4Qu`i;jAKbu-g7$nE&Z2z^T zFTK+^1ICe#0xuh59+MR%=@2T5FkMlo0@kPm+067ut-2RT%y0qjEoWU!}>uhB5tP zqA||SV^rXdKhh^hvW~|YW{FIMNnbw97o18{#3hghpP^7T`ce2(`j@#Dkik zq}=(WSZ|Y3NWPg83N!lD-e1zQs#>pf_}nBAq*V6NuRuCjXB2)f}C0 z;ymSy0$Z}(zQR>9#4pG)%Q1evU2KB13PnWQMz84%RMMyJ2n^RH8Yf~=pMF}#9d?Yu zlCE!na(YIZs3`$o34IQ?#5fLs-<67h!`J1gu#`xVnnUz%k3yAaiC-VYNY(E6$8K7a zpAZqa4BFAP-rx~!xE2&lkcKN#TJk7D;zHMkqS&=KwA!_W>d6>uRtQ2`?9{#F zKxq~RY~@7Q2xdLMYK>#`k>gff<=LuVkJf1_*6R0}apI3;djN%mbI6?IPy7GEqpXNQ z9+{PW^|e)p%VJ}D@w}C1SdYyB5;v-3GN8KlZNps~!Bw;J!-S3kFl_%7VW7oaNnk1( zh`1VRv98f6^56q~@dICnv^d1hz5>+hDK8p$F`)fTz4Zp%7ML)4Q@O8nDYG$?6)&Fe z4T*3#NiS0TW$%z=CJN-^Vv6812Qp7$icp-)Et<7+oTcPPitdER4~<*0;iB=k`2M@;1)Yh6v@tM zA}q!f`He92WrZ?lA((?h@lMDKSH((s`#Q z`N+XLJ`z;BAYrK1*xc76c5@6|=)PF4xo)-<3btKd|A%peIx<-rjsy6JwL_CxjY2J$!rrcFHW(-gyC z6-tk;**JuiW^Q-F#ce2_auM|~D2rfmRNA;R_ z6pN|y2Q9K^${u|IC2WXX!qrqhQO903uykF2vgp!Py>+XxSfh>Q$Wc(U8n7TP@=TVu;zUPR)g|qk@A2-Xl<OfbVquHDQ>Ol3^qkgmT5f*#= z&t%?ra(s)(Y!`tr?)I^QXj3T6y zPS$>bLpQ`7YMfUACo3h;3`;Ky&?C7%~v;-St^+W)V`2 z%f{vY*1kEUie|gr)@>`lJd~G+M2Pv593Y#@_}3MP5hP>+movGcG=h%GpEe69vnbv7 z%@1THA5)ePJWnp#IR{e<3iO)@SkG?o=~G6j{1gKp9;xqwE;60)Rc<~A8c4=w=&u~d zbTk_A-l(LO&kpc7WH{6re8pQuS=Oa`pc-lH`2u~D`sUA2&P9h=P{d}SpS{4&O(c4= zGrE51puGGuMAPI;q@qn_Ll^`5TJ+Ur*yzo&&o~0&LkgNKcrxhH;K$8}y{bA~SJ-?o z^!hFAg=u?P@R{p}H$RGQBHP!edfD$C%2qh)-xel|UQF13cd-bRL5O$=I{J=c_**#9 z6S2emJ4c@Xo5B!GzB-1jrS+z~T$Ut}#rKniUw03Ryr}OgpgCd)ASR$IfKY??Vs6rwI&{v?7eapqql7UMmirpx>paAbHdlZxzr@43nA7lj3A7lMM;! z0^9*5_fT8OZO!cf?FCLTI@7Cn8c&_OH#vn~3dD7RXmw^izR{W7F46oq1g8p6O(7JDZRM)Q(nloGufa3s%tGZEGZ7v4Nc z{_?da+kowLV5G)RpzoFvrHsez)$;aT&hn*uCFMTwUW^)EL{(O z6a;Kf9@#c4!eZ}LCr)Hwd0=-~tm4fCjiilF&9l%8rwesrUo7?~XzIDw8**y;XsB0J z+!#jP4X2NVR>B&cJE>g4q|R|4w;ZJYBiUA@E%;w?aJ_WV!%3@T8&u)7wo(zmpHb551^}^talOzaqRd zFTDS3ptQJGL4k#10opL8iD5tAL~wbvaBmArgix7VlZbu6$REA=8CohM+Csfk{%9Ls zhEI6v(#dfre3z@0h~1I#;#=djsZ}Q8X1*Fv?1(uEzV0Q5Sfszq_*%0};!AFiL6o^i z5^$$BjD9)vBbo1*)lD7hj&DF}2E}iiJ8pH6pUR_4LujLm*Q3<*qlAVtt87Y+Plho1 z?&3J}hQN3m&kHL-4ir_gW0Q;z(1V^NW8zvx>A*nAL~#R2@qPM>0rF2j%w+|2?FBxl zxeWy~hFfeW;GU`nqWC0f)_k5na!Zz}3-BKdzSuS2x8UCkKPYTy8e8Dj)BIVCvxDa5 zgsUoRm@xC$2vz(ro{K?u@a%`))CVfeae0y*IMm{6ghNdn^_^z(ZL(3R$Mk8HS) z6uJd5$CTr*w92id6JNS@cHq`vgJPL-Q9*cTQv-}y#pknC`v_;YngVV03&)#tYYoMs7YuLihYJYUR2rq5*_sH=FCR#B9E?M|fe$3|1Lx-8!cq~`&y z>L+H|r&1S)AS7H4B(8v zs`&I2*bCW_P}1mczeT$wm~Rf&eu?Y{03`gs{|nGo*7w>law_a6>}OQ=bB~-tFvXAoKZ8CZU0DwHWI+(H`Aj1eVBpV9Px}MSG!wt? zDyX){EUEX>0!g1jX@_>Mcx08B^Jx~^x|ssKFIVN(fJtNS z4wbhij|DSgR)gF~w@bi9g3^kK1G7|!?52}oEl2C$(0HmFp9B$mR&sFuy%ybXDBs(( zPuzVNbhTZ&{C6PZIJGG>^K?)A0O8|+XCV787iOS~K*@V4x69bY-u!su*E>r zHR;O<2p^5)hh7zxjrtC?VqZ;kg`B>QNE>_6?fWG>t}#NMQtmybIXo`KQ)VlYQmH`} zbaOOm%Pp0xT?pb&hGxj&r0jqcm`JYMA~9iTnkD@Qz2=Cq1*q%r=~e(j&OnX$KqBRd zf@6y86jUUa$5?Y_Ud*U^e{rM!llmoR;gRQz8jD#L>o;%)y4}p%63 z{bA@|R%~TWGGhM0CX?9v1{p1_3#;U#tWfA6mMUJ~2m{fn^E1d33P@fwW;!`Fn)(G~ zU@1dC@*YYa+>;ZT`7n#>&aOz3pi2dJq}7o_;(|Tc^QjeejQ)0xRL%h#Ie@sR6#a`_ zx0XOLT`tF0hP9@jf;?#8?UUf$C!+|Dw8J0t9*jqDJvGu`@lYroWJwLtS3(V&=jMZO z){e2>qmo{zXH~V%s8$uqqk@4*3iR_B;bg7s@asFr^m&P!js!?fz$aWi8gff3Gq zsEgy_oHpXP8nfW9ZoGty)IXGVMMs*bp685 zR$p>wFVo~{OJe!lyWT_^_+S2+StNOlL=KsZGam)U8$JA40gvIP(Rvtd%RZlT+y2Pa zJcn7eLH=HkCfB26zsKD~a)%xMc}_I63a^GwALee2Zi}Y!<@-)?wRa=b+;x~)*4z*w zCEqWW*jMTmyB=5^^}{FpY2wKyKfyWX>4OROEKM$=E!V2Eng4Cq9+rmx?cCCEFz&^U z#4VGrG_)r!nH`(2f59|iLwNbKS99C$E!cNkgLQ7fKDk!Aa~cx;zZSkXyW^I=dUNP? zJJUJ4guhNnFXX)uIV1bX+D}ZJE7tT>wO{xBTvIXk_S;`IhxZCRYH9kIu`^Nq&5uCk ztd>Ig4ewaiW@xWuTzqd&eAd<|;NIc`Ow&#VlrLY?`}R%2RtZOk0-i;Ft3|gR+9f~h zTQGOU=Bd{jR1#*g^xTpayU@vW)k~d8&%vP}$7-#gM62%pdjXHRo}cU!GuY&QuuynS zOL1?*+j)n53w|!kYr5|w%+q%~amB5K{g*qog)DyUvQO+nZk5;8XX2~+BVNk3$=Y&o zwn)7{_w!I^l&@)2Sn~wSt7_+4r$&GNdRKs{=`qI(`A-rmyZok23|4tiv*64u{+eCK zHU)5FVdQ I&MBb@09dLBr~m)} literal 0 HcmV?d00001 diff --git a/ru/docs/chapter_data_structure/character_encoding.md b/ru/docs/chapter_data_structure/character_encoding.md new file mode 100644 index 000000000..ad3fc5a9f --- /dev/null +++ b/ru/docs/chapter_data_structure/character_encoding.md @@ -0,0 +1,87 @@ +# Кодирование символов * + +В компьютере все данные хранятся в двоичной форме, и символ `char` не является исключением. Чтобы представлять символы, нам нужно определить "набор символов", задающий взаимно-однозначное соответствие между каждым символом и двоичным числом. Имея такой набор, компьютер может преобразовывать двоичные числа в символы простым поиском по таблице. + +## Набор символов ASCII + +Код ASCII - это самый ранний набор символов; его полное название - American Standard Code for Information Interchange (американский стандартный код обмена информацией). Он использует 7 двоичных битов (нижние 7 битов одного байта) для представления одного символа и способен представлять не более 128 различных символов. Как показано на рисунке ниже, ASCII включает заглавные и строчные английские буквы, цифры 0 ~ 9, некоторые знаки препинания и некоторые управляющие символы (например перевод строки и табуляцию). + +![Таблица ASCII](character_encoding.assets/ascii_table.png) + +Однако **код ASCII может представлять только английский язык**. С глобализацией компьютерных технологий появился набор символов EASCII, способный покрывать больше языков. Он расширяет 7-битную основу ASCII до 8 битов и может представлять 256 различных символов. + +Во всем мире постепенно появились разные наборы EASCII, подходящие для разных регионов. Первые 128 символов в этих наборах одинаковы и соответствуют ASCII, а последние 128 символов определяются по-разному, чтобы удовлетворять потребностям разных языков. + +## Набор символов GBK + +Позже люди обнаружили, что **кода EASCII все равно недостаточно для количества символов во многих языках**. Например, китайских иероглифов существует почти сто тысяч, а в повседневном использовании нужны тысячи. В 1980 году Государственное управление стандартов Китая выпустило набор символов GB2312, включающий 6763 иероглифа, что в основном удовлетворило потребности компьютерной обработки китайского текста. + +Однако GB2312 не умеет работать с некоторыми редкими иероглифами и традиционными формами письма. Набор символов GBK - это расширение GB2312, содержащее в общей сложности 21886 иероглифов. В схеме кодирования GBK символы ASCII представляются одним байтом, а китайские иероглифы - двумя байтами. + +## Набор символов Unicode + +С бурным развитием компьютерной техники наборы символов и стандарты кодирования начали стремительно множиться, и это породило множество проблем. С одной стороны, такие наборы обычно определяли символы только для конкретных языков и не могли нормально работать в многоязычной среде. С другой стороны, для одного и того же языка существовало несколько стандартов кодирования; если две машины использовали разные стандарты, при обмене информацией возникали кракозябры. + +Исследователи той эпохи задумались: **если создать достаточно полный набор символов, который включит все языки и знаки мира, разве это не решит проблемы межъязыковой среды и искаженного текста**? Под влиянием этой идеи и появился большой и всеобъемлющий набор символов Unicode. + +Unicode по-китайски называется "единый код" и теоретически способен вместить более миллиона символов. Его цель - собрать символы со всего мира в единый набор символов, предоставить универсальный стандарт для обработки и отображения текстов на разных языках и уменьшить количество проблем с искажением текста, вызванных различиями стандартов кодирования. + +С момента публикации в 1991 году Unicode непрерывно расширялся, добавляя новые языки и символы. По состоянию на сентябрь 2022 года Unicode уже включал 149186 символов, в том числе буквы разных языков, знаки, а также эмодзи. В огромном наборе символов Unicode часто используемые символы занимают 2 байта, а некоторые редкие символы - 3 байта и даже 4 байта. + +Unicode - это универсальный набор символов, который по сути просто присваивает каждому символу номер (так называемую "кодовую точку"), **но не определяет, как именно хранить эти кодовые точки в компьютере**. Тут неизбежно возникает вопрос: если в одном тексте одновременно встречаются кодовые точки Unicode разной длины, как система должна разбирать символы? Например, если дан код длиной 2 байта, как понять, является ли это одним 2-байтовым символом или двумя 1-байтовыми? + +Для этой проблемы **прямолинейное решение состоит в том, чтобы хранить все символы в кодировке одинаковой длины**. Как показано на рисунке ниже, каждый символ в "Hello" занимает 1 байт, а каждый символ в "алгоритм" занимает 2 байта. Мы можем дополнить старшие биты нулями и закодировать все символы в "Hello алгоритм" в виде 2-байтовых единиц. Тогда система сможет считывать по одному символу каждые 2 байта и восстановить эту фразу. + +![Пример кодирования Unicode](character_encoding.assets/unicode_hello_algo.png) + +Однако ASCII уже показал нам, что для кодирования английского текста достаточно 1 байта. Если использовать описанную выше схему, английский текст будет занимать вдвое больше памяти, чем при ASCII, а это очень неэффективно. Поэтому нам нужен более эффективный способ кодирования Unicode. + +## Кодировка UTF-8 + +Сегодня UTF-8 стала самым широко используемым способом кодирования Unicode в мире. **Это кодировка переменной длины**, использующая от 1 до 4 байт на символ в зависимости от его сложности. Символам ASCII нужен только 1 байт, латинским и греческим буквам - 2 байта, часто используемым китайским символам - 3 байта, а некоторым редким символам - 4 байта. + +Правила кодирования UTF-8 не слишком сложны и делятся на два случая. + +- Для символов длиной 1 байт старший бит устанавливается в $0$ , а оставшиеся 7 битов содержат кодовую точку Unicode. Стоит отметить, что символы ASCII занимают первые 128 кодовых точек в наборе Unicode. Иными словами, **кодировка UTF-8 обратно совместима с ASCII**. Это означает, что мы можем использовать UTF-8 для разбора очень старых ASCII-текстов. +- Для символов длиной $n$ байт (где $n > 1$) старшие $n$ битов первого байта устанавливаются в $1$ , а $(n + 1)$-й бит устанавливается в $0$ ; начиная со второго байта, старшие 2 бита каждого байта устанавливаются в $10$ ; все остальные биты используются для заполнения кодовой точки Unicode соответствующего символа. + +На рисунке ниже показана UTF-8-кодировка для строки "Hello алгоритм". Можно заметить, что поскольку старшие $n$ битов установлены в $1$ , система может определить длину символа как $n$ , подсчитав число ведущих единиц. + +Но почему старшие 2 бита всех остальных байтов устанавливаются в $10$ ? На самом деле это $10$ играет роль контрольного маркера. Если система начнет разбирать текст с неверного байта, префикс $10$ поможет быстро обнаружить аномалию. + +Причина выбора $10$ в качестве контрольного маркера в том, что по правилам UTF-8 символ не может иметь старшие два бита, равные $10$ . Это можно доказать от противного: если предположить, что у некоторого символа старшие два бита равны $10$ , то длина такого символа должна быть 1 байт, то есть это ASCII. Но у ASCII старший бит обязан быть $0$ , что противоречит предположению. + +![Пример кодировки UTF-8](character_encoding.assets/utf-8_hello_algo.png) + +Помимо UTF-8, распространены еще два следующих способа кодирования. + +- **Кодировка UTF-16**: использует 2 или 4 байта для представления символа. Все символы ASCII и часто используемые неанглийские символы представляются 2 байтами; небольшая часть символов требует 4 байта. Для 2-байтовых символов кодировка UTF-16 совпадает с кодовой точкой Unicode. +- **Кодировка UTF-32**: каждый символ занимает 4 байта. Это означает, что UTF-32 требует больше места, чем UTF-8 и UTF-16, особенно в текстах с большой долей ASCII-символов. + +С точки зрения занимаемого места UTF-8 очень эффективна для английских символов, потому что им нужен всего 1 байт; а для некоторых неанглийских символов (например китайских) UTF-16 может быть эффективнее, потому что ей требуется только 2 байта, тогда как UTF-8 может потребовать 3 байта. + +С точки зрения совместимости у UTF-8 наилучшая универсальность, и многие инструменты и библиотеки в первую очередь поддерживают именно UTF-8. + +## Кодирование символов в языках программирования + +Для большинства языков программирования прошлого строки во время выполнения программы использовали фиксированные по длине кодировки, такие как UTF-16 или UTF-32. При кодировке фиксированной длины строку можно обрабатывать как массив, и такой подход дает следующие преимущества. + +- **Произвольный доступ**: к строкам в UTF-16 легко осуществлять произвольный доступ. UTF-8 же является кодировкой переменной длины, поэтому, чтобы найти $i$ -й символ, нужно пройти от начала строки до этого символа, а это требует $O(n)$ времени. +- **Подсчет длины строки**: аналогично произвольному доступу, вычисление длины строки в UTF-16 - это операция $O(1)$ . А вот вычисление длины строки в UTF-8 требует обхода всей строки. +- **Строковые операции**: многие операции со строками (разделение, конкатенация, вставка, удаление и т.д.) над строками в UTF-16 реализуются проще. При работе с UTF-8 обычно требуются дополнительные вычисления, чтобы не породить некорректную UTF-8-последовательность. + +Вообще говоря, проектирование схем кодирования символов в языках программирования - очень интересная тема, в которой учитывается множество факторов. + +- Тип `String` в Java использует кодировку UTF-16, и каждый символ занимает 2 байта. Это связано с тем, что на раннем этапе проектирования Java считалось, что 16 битов достаточно для представления всех возможных символов. Но это оказалось неверным предположением. Позднее Unicode вышел за пределы 16 битов, поэтому символы в Java теперь могут представляться парой 16-битных значений (так называемой "суррогатной парой"). +- Строки в JavaScript и TypeScript используют UTF-16 по причинам, похожим на Java. Когда Netscape впервые выпустила JavaScript в 1995 году, Unicode еще находился на ранней стадии развития, и 16-битного кодирования тогда было достаточно для представления всех символов Unicode. +- C# использует UTF-16 главным образом потому, что платформа .NET была разработана Microsoft, а многие технологии Microsoft (включая Windows) широко используют именно UTF-16. + +Из-за недооценки общего числа символов перечисленным выше языкам пришлось использовать "суррогатные пары" для представления Unicode-символов длиной больше 16 бит. Это вынужденный компромисс. С одной стороны, в строках с суррогатными парами один символ может занимать 2 байта или 4 байта, из-за чего теряется преимущество кодировки фиксированной длины. С другой стороны, обработка суррогатных пар требует дополнительного кода, что повышает сложность разработки и отладки. + +По этим причинам некоторые языки программирования предложили иные схемы кодирования. + +- `str` в Python использует Unicode и гибкое строковое представление, где длина хранимого символа зависит от наибольшей кодовой точки Unicode в строке. Если все символы строки принадлежат ASCII, каждый символ занимает 1 байт; если есть символы за пределами ASCII, но все они лежат в базовой многоязычной плоскости (BMP), каждый символ занимает 2 байта; если встречаются символы за пределами BMP, каждый символ занимает 4 байта. +- Тип `string` в Go внутри использует кодировку UTF-8. Язык Go также предоставляет тип `rune`, предназначенный для представления одной кодовой точки Unicode. +- Типы `str` и `String` в Rust внутри используют UTF-8. В Rust также есть тип `char`, представляющий одну кодовую точку Unicode. + +Следует помнить, что выше обсуждался способ хранения строк внутри языков программирования, **а это не то же самое, что хранение строк в файлах или передача их по сети**. При файловом хранении и сетевой передаче мы обычно кодируем строки в формате UTF-8, чтобы получить наилучшую совместимость и эффективность по занимаемому месту. diff --git a/ru/docs/chapter_data_structure/classification_logic_structure.png b/ru/docs/chapter_data_structure/classification_logic_structure.png new file mode 100644 index 0000000000000000000000000000000000000000..a615396f6195d7e5faa7603fa157322811cdff17 GIT binary patch literal 20736 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

      `ox`z<+s$5 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

    @~i~blaK~H|w|xZzPF8rk!-rRKap{DE8O{ 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 G`TqxG%w?tk literal 0 HcmV?d00001 diff --git a/ru/docs/assets/covers/chapter_heap.jpg b/ru/docs/assets/covers/chapter_heap.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d56e0abc2b1e860e28eb158f2f15b72d085a88d GIT binary patch literal 113059 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∓^vTvACo^qS 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 ZAn8`3g?2-=y(rq=l|E?AK13I1|Jju_^=$wE literal 0 HcmV?d00001 diff --git a/ru/docs/assets/covers/chapter_hello_algo.jpg b/ru/docs/assets/covers/chapter_hello_algo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2444c95516d901f560e0dd87150cdd0b7106df1d GIT binary patch literal 147884 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ℑ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 literal 0 HcmV?d00001 diff --git a/ru/docs/assets/covers/chapter_searching.jpg b/ru/docs/assets/covers/chapter_searching.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9bc3d79fe43c72f50bf60f5cb9c869729bc2064b GIT binary patch literal 220204 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 z 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≷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�qH3xPH>C-)GzlvS|0I_9X?=lb8wARiS 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%0Ac;90!#@| zbH^2}4wD70>w>r?LbI{zqqjU@Vz;#hXtdj@AUjT?Xdn^Ht5%uPJz3 zeC%7Q`_iWgREv{(Acjz3!8wKlVZu>8xzDL5j$CDUwd zJqZ=)x`b;XC4eA+bKj5+ZCeWn*&{l20qYlXA6I0XZ4 zU%W}r8ST=%(&!H;5It+X*Jq9$MmLqVhKWZ^=boRfW%YFlD{Hv@vyx{qa4xn;XCGXi zbL(A|v**HgWOn}m;@DLkFGf1`lTIcvMzR?81(soA1bKN`?&uA3g_-EnE~9aJ@b)WI7(kHBbv??97>cEJi=Wy zVYQPCSnVhBu9M-}+xFxi^vwSNI^DU^qq;^4rAq<{Uw>|u4~6tQjTYwU%IfjTskDx{ z1m_~V9d#;FPji{lahhn?m|>WEn&59n-D*+l$^9$PX64)JYm2_JxR+Iu;x)=H&ByT1 zO2ZE%o4KuJbc#`DWZ_3rzlU023~ig#XD8`bB1ehkR|Rsb*S{zHXfgbRDC4d>^Xc@i zo^4KhXklsayWYB|U4)V90Ts~+43Vp6EI2>Puq@;j+KM}z1C?X!fBN;kv&)sE94m4? zs_SkjY$IjjnMX!OIQ$Je!G|*6FRW?&+LjZU2P z{N5eY-Ok1Kv0|q!k&j%8y0enED-g2U;tJuU5|6rDIOO&}T9!>F?j?W#AIj=SanC{c*FT{E z`aZ0uri2hIRs$vdU}e~x4yHuuzf}Xe3-*-8*syD z$r$`=33H`;8m?CNGZRT%<;FdQS(&VK*u2ZPSeLeXpP=f03g)i-PknNHy*UI3e~qxu z{sZ;;)-BbRTh6$4mD_^MNja@!hi~|dhgC0u9f{PguHy}+L$WsMEZk&zst$iY%DJsi zOVs3VK6wqu9Z2o;Uf+c>!v1YI2vhfnazZz6p{|0~<5AWd$+3t<$IRsCACGV6R+OpB z-L-_}8LxYDo6~32qm^xR_J5f0gl-x78uS;N`zAP=_@tN8;3R3nu6W7EZ&Tm3P?GCT z@XQXjjFaAxhmnp#XV)40hvQtb%QV`Ya$GTXG9$ASl22Ubw31WRqcqylGJEYp>hj&4 zn1^CajmOP{g&x3m0*HhE0BE^p+{uF)8%Iu_m9rMF+En~k{3{lFE4xFM`PbHNiFw*O`kv?UHI=0+U*AisN}4de@Z16ai*=QEdC?4wHTjn+ zNH&1Z-!BA?ndJWf-!;&|qFC93_Bhri{`N9|5_$b=AH?v>7Kd`oL0m8XgefNPV6qoW z(2d2E7Z($d85M%YF@Q%+&6D|Jx8TyW+g9@U({z9}; z^)vJH^y^7U2P-iARm@gP*EdOBOU9dyMt-%)c%FEPuwrnc;1(y00p736;v0D+DW*jw z+h?i_C*sHYR=QY?O~H(DTxq+twDD!_#pH_;CAtmFamm}j_p9bTdi#rslFBpuF#OMt z_m5BW#d3D{8WxYO-y7yKc|}$uC+{4v19lB0GpYXByt>Nh_Khg*H2(m*kMIZPKc!(@ zT3z0Fg(B82GO^n>t*& zf3dHkP-6=!m)(?Z+0T4dwPkip6_Lt#nEwEy#s^G)g<9~onPEPe_KS#CS9ur`!#oZE z9+e-6?5@mFk16;EIa9|1v^+k|Z=@-V0r%L0*Euw&FWn@cQlh>4vd!+5r(4_ku|SIZ zh6o*r>GZA|?)DTrZIBij1morZ0PELhuidfHqF^v)Wf&gnO>t0ZH#Y-u8&;hQTbgVq zd)g*Furq2_;khj;XWNm*di?gr-c3(YC*_jMYWjkkv;8Z}qFZ#Mrw5r}=|(m2#aAITf)x-VYCIG2gQ^i14q^f=1#FIH`19M^6?> zVH&@igScZmnDuOqgX>iF35#fV@*WJAk*{3+)z4a+w>ve}4Wy%V&Q2^eiWjnfO5M|* z#6p7lH*J8B>M{o7lfdS=xT9%gSmXQ5a6YxWB2Q+BC1Nr&fzJc-u8OHYbjq9RbQ0R7 z%lX!lBPrT(oE{E;KWgN)#@(%5pZaP?<;7`R%-1(o@NN6jpvn4=^VYF7NAoo+sXb+L z`kIOmYFd?6Nv#i0)c*i;@ctwmW++Gf^g*vZvS^YhgD@X>oSvB@{43EsS^kgVIBov` z+J!$Mn&RwRPiqLoqBfCLvKVCNCl!?!`?mYGRF}W`(KrG}I9xxRNMIXu}yiAc(8a6MOyr>b>m07EF{<2;`e=Vz^yq(i;frSf0H#s?hZW}9lyXn3T&yV4A29vU zPhsg^qo!L-{u;NoWh*C?2G-z$8$9QwXNlGkDvpw78YeYnQnjMeO7k;;?6q`TT3fF7 zzytW4@%rFbpUTd@V-`4B&JYvytI^m@d2A^6{{ZV!Pp@f~{{Skvl#bDikI#Wwa`=Yw zU{=xSJGop^g2i_&WK~<*Iw5u{x%u?g{V+Gsv&-1Pt_f&+R_?ccA zPhE;~Kkt>|u;%eBF%K_KgZ>341M(l^T@b@b?2M&ZE!o_|;|p7@QY|hEc>#Gmw`mAm zeE`q&t6Kft#k45a_yp%9^#Eh1y?K6%b0q#Ex4M@Bo^@liU}T!~e-gY=TcgfOry!6C z=kThnNkXJzku>Jz7TY;}HJtdO)tIp?q~(bxl{w_r?v<`t+3E3GVWgEyf};Z;J78p* z=QP{6Zahb1_Uge#SLVRa2cWKM_7E?wIO!ww#*%PtUvrAPws_2>;~Us<^)=euPY8}R zl$8$(Hu2My1D{Ie^#lU)?R)u+$Kzca^J{4SwyF97T~&2axr8)q%e&Jhcv-DjO1n+~ z>;C}Pt$!AR^4hr03S%SaE1Y>61G?0dWdk_i`{ue$ZsJjEWiJJ#i!4a)R1=R%hs>oP znC`h*(0C!g;!!3KONaje&{nkn0O2mvV!W2Z`C20rlq|z?9Cyg%ej>4a3d8$0;Xk`^ z{M3Jia~kUH*6zownf$;t%^GS|rx_YbZZzW2>(Ltv*!=5e45#>`Ac`8y{{R6E`Wo?D zHl8bmYe^axBn`?){#Dvqc$-wU{oV9pXacj(uyC)U^Fk@0$MrO}G&fs-+J@x7VmOZr{Z^Ez|jP zvs*dsFu?x+zJ^6_2$o31u`qN!8BRg`MR6rMPVF5n#%k9%qpWIHgJ!X0Sx5Y|i;?+s z{Y6{0ywLRlw%TBfN8KlB{ErpVv_w`t=7*-<XIIQR-FB&r+m<%6YI5lN-om)@mOS|5Kq*HP~KmPz#A=O^nE3DWQ&sicH zm;6WPTE^{JJDJPPSd0*@o}7>AQ}|JK>i5b208G#RhAJ7aJU=9UY*$#@&dzrqz>NO1 z{{RTj_KjxhP`h`-kU!u{R@3%UZ4q_Oi^<>pl7B;0WCZBbulH{O{J{SJ8o8aj$Dx1b zX_KZjyQTjCrqQ?lf-4xkO=Yo_jmpiQeoy69uV7L@BiEa+?z%*qDVV8FL?{(lPS zgsiS(DBnWohnG5Ls;B;WC;rV%f11)@I)3l}070odJO2P4I-vE1fA(scBo~%$u;CfD zgShd+;{etZcAGVd_fZzLkF>;38H*f#HKn4Acv|sCtiSpKRZVFLb(0({WE0yt^{d)8 z(c!Dn{?woP0@OGAwd#j!Nt~K0`6%Ot+`x~^{3^xz<}h%0#~}Mut8G2OiU=dz?m$&R z&N=7&O?774+d?TN*jt<8phpPhRGx(T{{WnN*6v!PC9&sf=!64;eLGi6q-w_5#?laX z^sX}GvQF!a5X2EyEaU=3EzS*9N_UQ@MJ?=iI_{NeacTXnXp0uy84wN|+z!Xr*0ABo zyi@2?{{TU*-DHMK9f-dv7{^j`*0|l9FP%^D$Oq&NbJLq@%yns~OF{+6v>+bHNk5Hf zh2N-LD)svVoP8r&sIbd%X0h9@=WvLs21y{EpVqYHme$t(SAc_dv1F0TL=|y?{pLQs z2fb<3#q4I=q3qnwvUl@4v+@HIt}<`apKitIXd;*phP1sG&^6`ZLiTAN2CuC2#5O50NjL-XCa~R7b>;-C=atK||JQ4%GZO$@~Ric%I5rqDg;sbZ3w{ z1qs3ooE|wRk6+4~mEDQ6TAeCt)&dx!wO729Mxd-CARG>@_ebYZ`Fic&{PD0u{n6%0 z`J4gzQe1e0N78N5-B>%KC@CL6anPQX$6t8X@@%c35fAoxKbii3QSuruYkGZ_pQ&l` z-%9f5`B$1>UR+$eOEVJN4(ZYPZCPkfNXAP6zncFEh4sc_og26ITGL&YPWmH*@)#aIi>b*6M00 zS<{v4T~3du!KvQ0tedtZWzNC@&Oq)D6>r3P9-pV_KWMdCJkK##bDWGE4eFp@BST6k@Ez516>95=h&l3bPRT@;xgF zU#X%uw9ht6*q3o2WZ;v7fJo!(U9gjLo#9&;>Nu`%!q#!$YQhl2mzI#l*T$_PX-wmqNaWB43Z?VZOWv7JddHjSeQ z^4R5X{8z1LS1AE>yGC8uk#?}b#xl6i;tgK2@urJ@c3;{USoJD5uRh}k^sZCHw)0(T zi5Oui5)F<+;mgb3R>06h2Jhr|c zzqE2s;3sN$e{hQCEw@O0UB`=_l|?p)Rp|GpdDEJ+^{RKAF$yS{l@ILE-xtE;Ht| zvO8z4ef{~ZAy1LTGdaykHjYv$B!$HB96B6>?_2XF)$*gNnHWU7j{}y;thnqaYj&T2 zpl9%_mlNDuOS;|J3dJ6Fo(~=CqD@KryO_l|txat<-gVThy!hEfZlIDl;<*_!CCmQ+ zwCD9T+-cW0Pxf}WlW<|Y@CP6h*b3t;SIxhL5AjN$s|t!u-cA1iTa{65W7NJNotizo zfArt^A+J5tt(~H0VSxQUn6FpyMv*?T_GqKQjwu=B=LGSAipm-^(Ez0g#c@LtqfJF_ zbUF@Ga%TbkjWFYP=|}cF-`@Qz(gvF@KI#0Z{>_*Br}C%u)<3Hw|I^58?Pm1thzJz+ zjAQjVHEs_N-dr8?2XpG@{A<1oXKJLPs)5`N2h{Ye3*Q)Mwq&W8I}hQD=Rc<(t$g}( zmXJrR`B%iqVDPg40LyZqdva@H(?rwkvLZ~D>N_96SDxPdLb#JFr`v)4)TclA>f`y> zD|xSLnu3vYa{CDTsq!ulvg1FEZyY5@@jDpH5e2e6zUNlbG_kVcXkf?i`?Y{hqAj#S|AYv)ElBMv&Awd=kFeCS1gxp4mgs0NDIXw!!>VNSD@taIA$ zjdh4`=drX20>dLF>~3R&jPu9oPZ#rCcw}l-7Hs z>(-#Nic_?K(<2>mRoIS5?i>FALau_w)(5qY;!&0akI3;^)t@T4RN;4HoYTjVtXrS% z%%A!ddRL3o8w{R-zs9`cQL|A;9AZWP0MLbdWcF!%OimQwlZWJ2E+$r-CT~SvGKu6m zAb;(fM@1!7@JQ$dQ`Hw5mD2wJ(@8({D)dhf&vl`!X>22JF&VN!`F7xA85!$dZFM6} zbtKL~c?&aRfs#i`-jtl5J0fW%WM0*|x3h8H-yf5I_37Fn{{V@tsr4j(U)H z`w0+j1r8Uk1_v3gZbGHG7{)PXm$_jxpVo}l8vPnW}b~3-UV;mUZFeh zSiU1%YnMLdPyRTytKeqAzfbm~Kl&9=@han6pWGq;0LKM$$4pHB0ItQ$T1d&YAL$Y2 z`{Vi7L=!B38t3iCCqw?w{&mwR0Jq~>ReF<6Xc3?cK7;wyew#j(aRAc^VA{GGj;EKBgNq4);A|+B6Czi`}_U%=4elISMq(}b%LKOQ&&9vkG znn(WtvsTmHkpoz0R_qCwmt)S*M;3&zS3){(aRpi2)swE*`2zTy4tRad$qyzuRX z-doEE{{Y@z5BO9bAJOhKtyV{KzBh${JvrQ`2Dj~Xy&m;~M=(hb@JaGF>%sgDYk6T# zam^<>kxmlWT(FboMj^AdhcZt11e4DlPfDeICA^kq(%5q>h`Wfu&U5wcie#_n-A;;r zWst9~260vItxwoyRmm9)qv&~}D$QIZ^w6Ottk&DsVf-TmbU4O;Du&>5v~|k>J^uj7 ztI|C2xP~?*2vLUTgP#3r0HB3&gOYml!Nqi^)tI%=uX7BG6SRxfc>E4(rKa--UhH_| zu05&tOv^K-PSOe5PaF}7od!1!rziRU0QIX|+e1C|4-br5>SO+xkNujYu~628$&H)G z8SD5{d_VrDQXllpf9%xz2--_lC<`6H00vKPfOV*w_oebG8zFTa$!rmvvJx;c&qG^& z8?=(|NVl|ayZ8XlhYpkJu+*Y7g5JKF}q04 zPnmGp$~>8Dwt-70(ZOhyPfs%V1bM&g(eA;7367WeLe~Cz8_>2SjR&~wPmoL6UpF!AtDoa_G zCf&wssl(l~CNq569=B+=@gfLZGJgYg{e6DC)-=}6+O*lm)L`z+aHa)h@lZ3wimEwQi~ zL-*Wgr~4><2PeH}#}m(~TtxyFc8Qf$Mo$A60=kVmNwaqnUpskx74ot52~ z;p$`?8_V zRxy?Y9OEaaKr2=oG?c9Oa($)8AQ6O9?4Q)+*1myn5^9>HC_Yt?3?4=|H?3^k={EA6 z(fp0=N}_v2xJh+6@=kMHM~WQ%wiO2%L7aE_k6P|8Ev{@MX{EzNyq5H@G}bQ7<>F38 z20#PYRM3M`yDFrUj)q!GBgo3#d>wLoJcy*B4WwUSJ%WmC&`%A5_raqG{vE6n`aKa2zVS4AqE>gdX( zId>u{PE}<&1d4c;GuI-fK#liEHLGnIlUv+f+aEUGS4RT@m53l7yo$deF5%pg#Eg^4 zJohz7A?aGSeoxzAHzWwW)ZR}`yM}Z4Rx)OYS;F}{vFrS+)-;_y!q(a*g;&inuJgw1 zkSes6J`cP?7HCm0dP%ph)Yf~q?@l=RvH4=TDn4anSZ{Nvn#vi5Bv9X4#gj$Dk0{_~ zsmFbD26j2X9Xg8CO<95iB8JNa&riqntT|fP+T?NQus|}rvFc4Vtb*0}^-Eb7EEzG^ zJpTYHvK|?J;{%S}{{Sk@rdnq=uP2k?8^!f1KRFh>rrmIby+N;7@p0MVi-G;=BOmzq zKhnIdK3FsU$*)Hb{6Cq=KaBK?opCe`Cr>g#=Luo}fOe1-ROE1T){+kwcxvneaI#ym z?nX!ExvqQ0d02G#Ke=za^ilmQlQxlgUo4@BUKhSkJ?MoBa)NRRRFam5vcfd$@trp6 zIltM+&*j(jrpsk2aOimS>0T_B>QXn!R%SepVt>NBuLs}iZ>bw8t{PY)h`Cogx)3-g zk&OD*HE@b4$}H9xi8hpx9;<((X%iA7N4f5(0Ack#znx)f_b+p%X?HV$x<;AE9XVyd zu2SMdHO!KelJYUn)YnI;{{YB8NQ<|W&H1pd=+RK+@BaV*=XG4}Xf%5?HkZ3D?0b`% z=5Jf~@+j^Uen3}J%14IV*-k(2s^upet|lJ%{*@8;90mLHriW`m-A3%xmR49;>hl zigYQuaps6htkmBtJyCpdp%nzA;N$y){{V`of5LH~{{VJ>``~}^RptWMAROY4vU`d? zr$@0~-mi22)bp#kZm+FH#pKdT+t?lKPBH1&RY_4+L<%qn{*|F3?XsB%Rhm!fRVNr| zzaRYsR~lzSMr#a9Ao|q!{nUT%f9%wbKhh=qf2BMASx59g&b4o1EJWPf52y97Qt$(3 zNu50>&*p->w123_*ZJ3_d_8>GT`#1ne>MLA>sK}}_)OA=#*HhzBTkc0n(A0p+CAHY_$s?Hl3RHq4Uc=S46p(>UzvVoN)zEBV2 zTN0PkbbeVKywaef1_M0uM{!!dFi54fSI&I0KVB=8g$wv{P^0c#ZvOzsR=ou;X%#7V zIGlMT;=36#O43LrW0SZa*1hru%-Qu7^Wpo4^RIIkA_!9BYd^}kR2e5Cv&Jum#bLUb zUN;&0G5-K!QTnZUl;7(?^NY*~vtUN)j+BA=F1(U1?lvo@g9N7(b3N{VOuhWR_D~ZV4oq+8FHwkA9V}DwHGgGrLk{tLPz;1h};! zl(88f*0PGa4ZDugaz|o)aa(Z2_S$JnfKirQ`tU#%Bv$@(auI?Q6ZqnqpDM68-I{(2 z`EPGi)e!!*XI(mT>aPXU800F1KW;}te-8Ce!RH#S()z*={yZtZDTp?%N$(P$=UmMv zhsiRj=#>GMK4f?FQI8wi5o#Aas27eX)`WDo-0UdT0~KaKG7c2&;yhI0DO*r zO0#XL>6c_AGY!Y0x5`h`IM3l+&QspULX0-K#97+SXLoS-0}CWa2eIT+Y=&)T{{VeI z_GfaVTA=c9jGcNio6gZ}`a zRPtF*6lDMn^A;HQ6#^+Qw1N&X&-=Lklqn~$0C+)%zS@0EJs9FC@Nx4m@--Hw?+h_C ze=jYPI`Ds;Nu-0eWgPOK){|5Dtl@w5m><%*{{ZFT%>Dy%3!?VW?`&_3F$0YH)rZ2T z7{^XK)-|&Rw6-90jE~5g)oxT0E1pqTF7C%YeHzP?B8uuf7c|XnaU71!vB;rA5<-o= z26|Q{`h1xuCpgEYYxpyW?+5#7{EcZ<-isoY{h?m>d^c0bnO1rD#{`aQSg$5k3deuS zN!{&^^_i(_cQ9&K5L_bMLmaFWFvBSJVf|=>QPQq(u}W><1Z|tAKkW~vdY4L8PQ@v! z?q6$&%)xeHusRWrn}_LD;31*P4Ce=*_zf(uymG9JIO7aC2MLeoQ9w`Gi0SgFrE4Ou zsJd03oUeEZBr_o&m032^p?7t_By-!6X`UOon9g+Z6FN9D2aotq`&sOLeQU3~yRgz@ z4|yQp)F9;k0RI3p#VPaivZhAx@)3lh$tK?4!=+Fu2D}~^k~M>xy@1DLSmoNlf5bFTM{U8q-{Lry(>+R z%+h3xa?GvxoD=-(%uwBH-DQ%Sfo+9NQ=GQXGq09v+G z@)#bS4Q^TKI&4-^MI2xtP}%ND9<>zOBIh>lRQeu8dGn<2bZZ)mW4$6>Nu?! zbxVl&d^q>(`PQ+nx|zByY;;5tFgT`>#Zrq?x08p;AAX;mUJS0gkb~*owo*@HHk#bd zp2FI2OD@uTipQ5sxPb16?p)U8)$OH<1A8h)Na0W3Z=#M*;421F7rUpq=EIOtKFuHRMKlB=#-X{W=Qo zZL}yOm+d!fZf*}(esT02t0H?P)wN><9yBxT4y z@FT(eYqCvR#gw$HW5*|O{-V6|MmYOMPdQKJS~qXD+D0GUKgze1+Lery6|Q1y`uv)- z<{0vjMt)WGKBwRLS0_I%pI`8zHp{h0(X;JwfE47Ca4W7V%+B{kLZFlNJXA5a?+P#+ zk^%a9)~%d&S2qnD_X>(R&tgw(oC?1F9FzwZT8qw0awa8U9J>8YeZVAXL zdB?SR1hz9mc1ndv>}yLvzrTG-D4KV4WRohyk)4F}HD6A7q&DJ5XWufZ3`yf~80WQd z!jq+Sb9qfp+8FNv9jdvCx_=QOT5C^hYy!r1e7$kFbBe@y5genhLPkfmbiz%=KISq> zHj2vAr`==x>huy#BLL)M=}bcd{nj6k6?z!9oYI`Tpo%Sp4aPH?^ef97_+?`8G5OiD zyo_hsxJz^rO&T%4XHlM*$*)({^}B5;cgZAEf_X)7B>Ll!N99~|P1?rEq;Vo=jTvP8 zzZ$SEz_&&?{{UDABf)*ByNrWPYNXKZoru;aN24hRp5+5b90{ z>OQp>x5SI|GA-v;fj~UDtrUiFAEJ$_;^c?H_r0@BS5u9o6(R7Jhl$bKLY5 zDhgL=mCV-Y=)6%WZwSMalO)Of*#7`Z^X4DBDm#EbJ}bBJBY(vyr>W}lss8}ST>k)C z<6#RV(V;(i(0}8?x~S<7yux1-I$sx-+WnWPEN=zRP7zhG5-Jx^VJ_H_7&aBsN7h+yfDTj-ESUpag1mDYiv(5vWDbP zwysA|*4FP2*_lU{KpRIv>0W6JCVS~Z^M@xrd)HNctVsG1x`X#`EBRb=j=9153gqli z5Ll8sa7g}D&xeGg88*$T$x2BhTJGEI))zCJlF{t^$g5ryjuzHpC>wePVtU;E`$e@e?EF~+~%l%LABhLDOfdbU|C6p@aUo5!Ui zk-YWmP2=9C=7;~);GgD-;D6IcKbnJ7=l=kfU+)jp3b&JqhpVvv0LLnvyu%y%d1v}p z3f$>?6`2W{&N#+DN^XC0pYS15Phod7rLEMsJ%?(U^qoozaPmZOGEOS?HUWf4QvX_be)MxZ+^TE;a{o`HV!^Xt7i~h`K^=gb?@T64_jUJIKa4Bh~ zI0KSNz#ols_kJ$WEHbGln&Y%Xcm6%o^{y|+jU#I586>ZgryaAC&MSrcyg0>kP{G1c zQCfv}p+V$RBnN2r zuJ}=>9g)i_vwO2(>X-Kr2q&4H2pI>GdG+gEMu37{GGsjd{{W}_1#5_h?hmK+uGhnt z5L;>YliZTA#^}U>lgJ~1?_Btp`;A2!P?x`X1=fM*Df>6d#2!0Wp<9L)@Mow+&)04% zf}h36pod~pnl|#0ip?An$m!@h3 ztcJY2w2i#+=b#^WaKq|48ntPt+Fgu9{Nt58AIiD?n@Z-&Yhv@nkJNMPRh|-@o}RRl zY8KIws&}yLKgOuZc`V>_h4d8E7&#$sxXAmY_53T3)T4!BV;KcYgZdoS{{WFB zxQ;QBy$`4PBDJHifCJ_zeaAQ>IL~U{6%{>9Wd}VD9>ke6>y%iNf4u?y z2&+CP<5W_A=aT;bGgW*&@_2)9OvK|KfUPeQLnNA%W-*`KkLGE&`}_G3Z{7UNOJSDD z=m-X^%^3NZ5AOc}AxjOUh`XNy9Ml&VkZvgv+{YLLo`S9F^d)GuDTt6vhXb5emahu= z3Wa#d#zj_3dCMe)2m=|bx{(b6;j@F!w_2qyc>`YSF>UpoS4;pwF=+n)xhKrOhIt=> zuFp>KL|0bgd)OWo$zAL7CP!a!`q!P@@`KpdL8B6M#021Z%sBiy)z_s58?;3#l1|q> zCJC*sbx< zf#LeWoocs9BUW7;+Ox@Sr{@D9dCm`|VqI9=%chlB+k9`FW1M4}>8*TErOrZJ?zMkO zM<4gl85qw8 zrF5}r(L^^D2i>{<0P6~h<59JQVF{JJ6Q}+4)AG$ks<}szBBM3+Uf529azlPzAZ@qHZ>^L9dYrR*DQq<*iq}j^YOQ^*s zk*Bkge}P8ef8acd^eampmWFM3LvNAKlzCz3M<5^fb5h3y*75l|bV4#lKmcdzeKG3Q zmhr>pdDkp%hvu`mtx@5Ze@ho_;MAtw~y~m_y7-5Pk*jW zVo7^prZY=x{+V^0ndJvyC%UQSzNVvxP`kL)L{ktWgh&!KU9pTQ*Advkkre{pvsNh4cr+)qKCfOG@cRY;1F8C;%&rvs-H?+gC`uDt&M zuV(&rQW&<(Ve}y`qGj>nMUhQp4m)@!IXN| za=Vj_hmNPPsyABQ%(A2qBS|dG5d$6x>Bm9%*3=#tmgEQ4=Q4lODELA3_57!Il@pI4Q1$5GAw&CR(zUDC=9WNh>W&&~SR9dD@L+uVz&XOU$G zJHs6QdFS!2_r-cL+#k1x*mi}%`?(*=yzId`IEO<}w$vFAT%_dz#~=?Y=Mvcbk2XD z@~-+FY=MiE&-+Wq>0END9$@xv+8f6$!65mLF~~esJwV*q!tq^z3#rFUpMEQMQSmGm>R{8r zcN`ZzKM!B!TrJJSw^B5-F=lS0(aCpqQkO#xA@em8TeZgu!FG(C`h6SUt z^w>x0D|^}95|#922rUPg$u>^Fax=jqtO%#DmS3_;@svNna1R;ebTu?!G?Op)w|*Ro zbFuR-T=Vl0{{W7PZcgPWt0K%ED8GSrUdEHB0Fm;yKHP)(R{f>khp9S7s?fsfBVa7Y|- zd)8`Me2XN^5eNr9wR2Vo`t8>KN1rF?O;p%jRJW!^dI9)XY;2;EIi9j@lO&6@#b&r( z?9~*_A$ZmP@ME7&wAGR0Eev1~-1^jRcDk`Wv(MJ4AvSGj&_DK&An=jM-iI4V{Q<6zI=sCq?UFr8WZ0F`urLx^Kfq{<4HOm*v^EZC+EE?~KEl~}?j_n&gM%Ux7 zEB+N{{t_J$`zfhgyk&STw|F0l^ZHhE3(ICu;7B$edJsCED?0L69%JU@FeK-`agW4% zQ;Lk9tL_uJS{fcPXyMT`$f7w-*n64w0b@Fhpjamxi9yYGV|Bv z#xcPisy5LI3}Ya770Q`z?5v<|HH>ce4se`q00D#B^Q{?tPpIkId{bNmncavX#^00- z^r+_S`EjDS!BNOQwWVn(wo8dZZ*MRt1CP4B{j0vEX79>#!kxD=^+>+QqTAaO zpY(<#`rse&tea6I#1GtV-F+KXm($DPi&jJ7>K;u4) zGfvcDQ)MUv_z&`|%`;ikE%a+wxw(xo3W5s^@G;Y`YRJ@lZ>5E3ZDW#fK^wm4{dxT> z%Z&<-S|h#Hf{v`ly72w1T4Ucr?ifer6*wTAWYnGjY+v0ctU&%v{{Yvmkn3^b*JU}) zyMO2=x&HtHwl#T2_pRIXWv-zdWx zQ5-@)yAa3zJaTI;%t&=e0pGmHxyk3ReD$u{cy_(%JDjtso{1XCqF-JR`i#VZ{3C!r zrF0gWHLbAu6c2v&4EoeDJI8MmNXf=qss?oE?eBn(Qf-0t~SQG~P++<22&Xr5AL`ol;_a-kf8M z^%<%Q4b8lbE{@V6USG@32h?;wm0!ureFy%7Qh0r`*B~75hxyUW;};|ryGXs^{{RqQ z-rp{pei8Qu#DHyVsLvy(YTeYeR$;> zW;sv}d*oJCBOY|p=u}&?S1QMIaep5BrYu1qukibDIILY`QIZE+J1_N}S%*0GAJ(L} zmEu%}H}cw96?i=S#{~OVLu_}f-w@eejs!2uO!fmx=U9_>9WKyfO za5-=DlU7}=ZQpD_&oK1pKBuDo88rl#7nipmXJ*<8?s@l86%T{`c=Dc5Pi1w zEn{{UEhYnpYhC&+CYdV9wm zzfiIHq&>PGL9UC#=3Bc<*;H)YzhPgcC=DQyl z+qJ#)O5>9dKK)Nx<_ zzX$WJNVQ8zhS?6x_HLh@a@3i{RBK5Yx=~}ba~pWGOo}izfTV5d)sJtbceUf~Bd3XB zc+L!aNcJHc{A;{}Ta;ivY(rH z+z+-rPeERgE?dm<<^$&Yti2Dh^sf_FWMLxkROEd{dewyH`qiV5^^7p}!5QP|Yo8ZJ zFIyX7<+?U^R&J-LT^0KJ71m-B5ERp5i_G5Jv5Y7f&Pn8bI2B-7J4R=mg+=SZ zI3Gd%YG`J$QRPH%WdjW_d>$~Pjy=s6>{?ptXQ5PC82r1K?azMrrn?pslfm47^buCC zteP#amXby|&r|f{fGV7UipmJuOCCM&1vJyu4W_hYa*d^jy8i$w($a=?9WVX&{U~aBVGW1cCk9xX^G>x(ZC)|(e zR-@9VPu@En{-gf@tx-DGR&2P_*7h#NVW`+f>1I+`a^(r?KXU?sW@uf_H)a?tfklZfSa)cUSiI&X|*aRP`JKoF28uDNB{zTl5xV~@xRqF^d=I6l>_ETOe0vkS?PC?NN2b)~t9ZSEf0QUj(l>Bz|Dvb>gsG?|vN zT*uLg`tw&|xSB(;z`^fM^1P zYZVP|25Q^tU-1^HsA<=>R`xOk4Q>l70Ln->83*Z9(3*G{{R|a z7X|*_g%_eg2j<4Ink0(0f;O}VUR%!+r2u_l_<-BwjjTuHEU3`ZAEPs&Pduzar?;k0NFUlAB9|P z87{~j++TAchM6>B=Zniy<##4WBdNgp*2H(SX#N&!s|UmVuMxg8k)K2A1yXxyZG>># zD91=gl3< z%>%S-Se?j9o=>Q)+fNv4_LyHk&QaP>8};k@*EQQd)o#MV<4~MIZavBD2dS>9#uoS1 zhB0!zqIXO23jY9T&7>VYTl{H%;bC9@0MDc!oBsffK)x2W3Ii7>9Gv6&Q@`OBwEqBa z^Zx+rR}JvJj;>1m&;Qr)L)6k{tf~%46(F|`Hvxcn9`z1Lb}B9j_o)D>+Qq=ikbSDC zV!Sm8r?529U`;L+1F&A3a&h@rS>T4-t_A+|E0EwBGCgak@Oy3X3(u=!2!GTd_7y4V_B0104tW)-~RxeSCk?rDh#Mjud_aib@qE z?a+MCit{5wl@;mwH_zc5dL+aD03J2vF}VjFtJSr{D!O;&vB0TO+EM#9CIJ5jGIK_~Uoo8Tz+B zkgjU)#oE=$A|_jP^o(==0DT;qd{K!l)E?k|pbEyivv?Tfah@w$ROu(Sq)u~dbGf&c zORoosCSvXh%Q49$N$dF6IAW0`j1hq6k9yzHhW`KvOuyZc$LglDrXZVc#64pNX-Rpq zs#7n7cs_nuF%-V?kXy^%3U?7r*|$wsNfO~ zYX(?^SMp9d5~`ob;Qp1n_Hy5Ok6iF78EjdGLCO7Vo-?tth0a+4$3YZ{DG zEuGpW$Ym{&^0ys*kLg*_9kWV)pUl<5p>+tr8NgxsX0@H3jTx;rG{^Q$>*6Us&nu6) zCmG1V;P8I~NvG)-dUVr?u*)JY)>G(D1a%x5#k<=Yz5svRkGwKC{{RYZnfCyQ+W{{TNLR_?U9x^A5m)@81zZFj0#MRf<4 zc9JgFL%B#G=bpVQTUjM;1A(8E9CzTF&TaEX>!DG$wm94P1Xs52w18$)xb!5qLH-q? zelz0eiR~m@eidI?mSWbdJgvx@;muI`!!dvv$nK_Ob7!o<-45w^{#4FJ(^~-r_RhBA4Q$ z&VOg6rQB`_EhvyMJvc+sx9nY!773RsF@}tE&#L$Oj%u>7)MkvT6cF$8HxM?fE(31q zkMoMWvdlpK$3`oSrsak+>JT5h^&>u&a=S~Ig=GEG-Nd$bMTOjkJ-GQ-8_s%U^gw-0 z2hX}qtF|~;oyif%Z}*??6I}KB2<+Y_1Z0ADbtfaK@A%YKuPwdSV`8A>upJIa>O1$T zQCz<0@2;lY)`1{oiFqr42lN%aq-io+TSnJld5e+{&7TAz1c9EZ&Z&Y_==!v7U$M1eni)vF#Xz}LPdIS#HdVn7LLqY zC_pD2o7?MNYZOw<9b*NyDRKv3I-2$<{{RgfGuA{xmVha1Qb^ASHK(MoTi|_7Q46@@ zt=q#acQKW~-oPs!fcw7KBXv~0NLSqJDy{x;)MBTK+s+}IIp-bt1E1$mqLyH*)bJ}( zH(jNW{n4>~@znlxR95m7pF^3~qF?N*uQQ+BwmzU_ezoFLs9BjuO#c8rYuG$pc(G~n zM5mS*IQQfHYsfA?*SF#PtJT7MEu6TG(G_}Uh8SxN%<2|$+1^QSGLf~&9)uIdJ$S8qF?g}!@N9?<9z(T<(?587 zexkaM5b9U<(#9-RSr7v1$Q)Wjl4JuiU}HZh_8;R>OMfG~ zDQt`$-!RWnnsu>;`{iaRRCE-SIaZ@`yB`JB%yFpRS$x6Qo`WYIl`MLljm$^wh)^lc zK*;|99MpGlLvE`aOj$-r&r!u;?IH;khX)7nAl0ZwdWSTlq3KcRRpo_$J)^8cQQE`UgpOw_~>Nr1@ zar+s{DW`Lx)QW9bBm}( z#PHk*+!ZHd_S6&tna2<)zZC9Pu=smYnjP0lFE)sF3E^WNcy{ymDWhb*J}&6D)a zKTss<*K9e&@*l~KJ~UB0Nu08<2lKAiq)uhIaei+SsP(#xf8)ZB5PaI@(hdihgCFn_ zR&8Pp;uzd@`&j)ASJlaVa`2D&?~luh%}d_-4Xr+AI1)y48x{Ihl)area2S3@q%r20 zW2MZV;cFTenwmvCa)@9V{k-JX=t2R#H*%>~$rm*rS zD8peKbH*rFvec98l3a*eckvDn(3}eCT{O_orGnlClH7qHMs!smjE)EBYbx(dxxBx7 zh2>PLoDds;Is7Z8n?s#(A_b8^$Sc>6^V*<*n}0G%db9LA9>ev;5v^;uvYaoYFvg>- zX*o$H^J52Y$wuIR6V5*xx8hlZo*&b8qQoY4mtyoBcF)$d$6vy;bzq8A=W=N+ zBDarrNekGT>2!wjJRNy3@8=)TEphsc_ExuFWw%mM1{t%Qx3+7mR`R?6@6gDt{{W9k zSWYg{zgCS@mEF1{%R=-X)$1M)vW+x#m=Bs)V#nxk2kBm68swAcE7$xgF`--k0KmWW zBUg`??(OC*8uzYk{hd81`#O46u}j5xw`Zt-|IqRY0bHpVIje=hG2@};pDWt(9fA6D zS-xNlFizDxXVS1r=9?N!$7w#t`Bq~nBDQU;FYm@I;dwGTfyX}mE1|RSMdX+_(=0># zsq-Jtr}M0xXjAx^qNO?Pk3GRt#dO{ha6Cb2{__vb7+0fN_)kT((tfMU$j|5(w)c5Ad}SBM55NL$u-cgc=1aZjsRGLoa2hh z+{?vvD*(m-;SiMy)$3jkZ0M2!+E*W%gI+|Z3@g?= z6u{|oC#3%X%~r9;e-7rjZ;rm+a2qYRp7dvF{3BY=PbtPQylQW%!=zK(_p!e%9TMB>1EM$Ma1rqkT_ni`EqNW zyYaL`~gb4nIoe?ncuT zjoHWRT?UDNb*yOj4|GA0yT&ju04gvz_cdlMDi%;KN12Rq+ajZ#)00!&ZanEY>{AiQ z(rrcEf_hcR^v5$paO@PsLjXA>ioHGEm5AGOBBAVqmi&h`jXt$?aHc&zKPILZ7M zr}M1So7+OI6~3nDm1$}W@3t|?F2oPi))n81?4l+uIySnK*P;){sr)}W?9dpFuUpxdW{{TF;fHD67p?j)Fc+Op@MR8wDJk|KjU2UFUsDaAN>mz6{rKm&>vS{)iGLBge4bsu`ryITArLy z91M)-p{jFOM&lp@iso;Qqi26K_7as++ln4koO*wSUA6H%K#27i%q`P;^1tFgTHy9l zwc>UAMSC(i^m2us6NYSL9-Mkr86#!Bgb{*Ef&Tz}8tx;O3z)=_GRUW+DafcLw2nd3 zr!+>hT1Xu<_Bbp4SmTY*pXFBc)14~ay9Ho>5=CiV=(5N`h>Qi>gXvT(;*#3ME#(_o zS%y8ckzE|>P)Qi_wJWlWKu6*$G7sL8Kjv$y)|iWkz{fGU>U$CC^{!X|HJv@XmyiDd zLKV>XfUvr@*fY3Dr|HENHI#h`j+Zg6wEN9LAp0z3f;c3e02%c)dsDTMJW*|SaplbF z7uV(Mn%B3~R7AdNU;v{l&tGq?SJYl9bsaWHm@xBL93Dqb)e)&H+4+{@t#agl@)XCc z2mb&<6-wFJF|?78I`lnzR+pFM>S|9`fsg(?D;^oQ+$1V@4oCCip=yd|#CK_xSpfw1 z9E#7G1;$xh5dGF{bv}wapU`)!0yWyR$V$i1V}j?=f2peG>y=;u2XYk$x4%+o zic3&#`V{9gMX6ZZM}>85c-u(w^)Js1oZig|kn#qb5O`^LznAviH*Xf_o)h4pGmQOksA-KruF`V@6TXHmU zuK7q+^)<_CI*d+nXt>8a&j;`y<5NvHu~KPnJ5IEk#e`FVmUke7kUZ8;=IkUg{gD+5Z?8rNH%U4!iYSzbCF*vPKB zniW+-r~nRvt`+4N@|4nNirm1~w-VbwSlyTMII7NAa<$NSnjb4#pB*1-kHtoRT-QE& zV!ik~#WTv1vuLn~p&jdP3^XS-ff@M)Z(5(+f$D22+Z)i_`VU367MffU5_7OKXOol7 zUpee6GRsu7k~KnhFaTk?es!t{BO{SqQE9CKr+r4^s$AJy-7X|ipI-HLo0?5rE_q|w zx_E}>3x0gH&%YrD^{bKz;O0!PziPYon|n_Z>K9i|BZ?@2Wm_WJ z9U_qYkf{Ca-siHY?oR{U(v>b|TB&3w_P{cEHqDnD799qEnXNCkIgCYaGC=Bjes!6m zSS*_4`c3jE@?$s=o)y<_Kt1?wN$*{Jx+c+x8zZnhR8)hGh`3ZwbISZs%z`)>{%85y zJaRY~{cC`f=2kxDyU!fO54jBI@r!a z>}KF#WaR!lQ*ESZ!DYsH>rzI4b2;@UqJTHek5T-p-%@)PS-E4IB zHOeSo#5O-AHCFySSb{KeGWte>h{~zsS*={FnP^$_d^$#Ob0%Ehd=N$R~m`U`XVO_Bvp9j+DeAwxT*r; zW$FWdmDoe6S*47SuyDm(1C9wG_Z7=|Unu%jQA8|$0_{VEM(R*v6JX>D6FKgzz@@Awbaxw&TMk~$NLh1thm-ASTci+v{QLR9?9 zc|q;Z2CpZHyy4~R7ON=6cgAqT-v|6fa$_7jdY|Q24-8NH9DX(F%9L73tDK5%_e|=N z4J%Sonr!R1oyHkHR>&Uxe_GG+vwx;qMg7}<{g{vGS;-2`s%&5n%^3X!TJd}Nn$j<1 zfPTA=^{nZ_)m5KD=PSYbn06PD+0Ss!3G*V7HOH%PKMIn@C$m+#nmx;$ka*}l_|I`s zX?Ei8RgMN3T<&4)22FSW0AXELe<=R|$Gi>u&-SFp3G@T6#8dkZf8)jvLGGH};j!|Iy|wybm)S_tJ$Q-A+&E)A`q3XW_jf z&jlb3!}y=(Kd&F9Y+Fwa%I=8$LFy{tO8L5#>dWG1wF*?@vLRUT0)c=#RDwE~Ek6~{ zV{4HGrvXpJM>NpeCz){Si|WS|(i4|))ywMM64Ny{Gem+3&+#bvPt<==&1p%kz(3>N z8c+6*%D=BC@~nyVYl)j-ZJ?tt3BbtxPv=|HjN06+9+w%wfD%P>#IB$^2WI{+e3VMDA{A#y??JlfuFD$Om#`|M9K7f&t>N&3J z_=r`Y+T7)*MpWu6mt*kaOU>!d9hfTm6Wsn)(1f$Gi!M?W9oU5*t#Q|$Bh)6;Ce!Ug zz_FKI_{*KS_26geT!v=2Ww^YNrFI16i6nk?io?!&)RCvQj5LBhCVvvyE>glaxo=VO zr{;M-fULQ0b-h3lB)?~j{{Rd;AN%XC>sj_!X&QklWNGt@g>%sM zKaF}Adi?SCw>axk<$7#){tClswl|kTwe$9BF z?Vy{;is# zpD&2*PyIBH{42WE3}0n?RUxE&a5=^ZB%ey*r3E$XM(kvdAA?tYDY-@8vB@}cwPUWl zT;0e$$MUS%tAcNM96KhoqQ)B02?Z7hwI9AqATmB^iuyH`2YihDQntX-mP5_X;s z)O7soTHnQH0wdL8AawI1AI*Qm@};?+!pI*qnVou~bNTikjd9wRt#Nv$IHOo&JYaIi z>QD5px^&%NiD+RtsBF(%w7j&xi_Wu^WlrT!PpIlY8YZ=daft`x-nw*56^r8G5XgklTu23 z4Y^ZI#OKM`2mSg#`0%Qz0_xUof4s-_s}sj0G3=BOK#%hc%~goAYF0pcupg~!9hsZl z*wZyDol@;y;Z!n5BIR;21Fukil`=tV5jus(%K~H!b#~7{D>uW@7|ge`9kD2Q{n?qg z3+i~QlFs*#Np$02@|j^z`Q`z^{C!O+q@||89aW1FU0mEs(#U{@04k~bi|7ICp5~&F zQP}LrAm;>N`|(iN+^jbRW?lqYE!6e&>5gk`h%Of+47HTBcQlU2E>~`^YESpNesuK& zO$qclANR?vDQ${sR;~yma{->eboHq1^!vN1Vm9fxDfznqG3#3?T_ZQ8?q^)FmU3h) z*nD;9D*cXuaj0^uwmS0Vp1Aa>r_(KNGFfon-d+u8(M`oNRGG?8q+G?!L`Xj)S&XGl)&vpQ z@N2!rLp8KF3$|4a^{iz@bTy4v)bJk}Cf!0AKfMk=B7erX^InP0Gte!04)I*dw+{^O7FtvI!N7loyf#6?C*vB%}>T!m%o zVn#(+`;*0QO02JDWjbotMPxS`?}%i3bslt$xEAFh3IHvG_n2T~wrkTg-6qpaL*-@W zfAy0;F6Z3(dJdK5J{!9>T9k6SWH6LAJu*2J>bBRGwUkrBRzw(Ek7`X`vxD zb@8B%)fO?1G5F%FUpa<9lkXlE+uoquM0r7y7dY%V>S=DbJ7v3dK7zO{d0m}-G&ASs zD1rKte;S)lEM<3NljRK;eZh1jxLuZoeGmB5aoKrl(*FRl$Ky}A zP?qd~U}x%kR-nV$F&$NQpQxyEX=rGYZ&JsK*M6;Lzx2(2^eU$DnL;7M1{uQ)`;+a| zRe6krlN5J{?Vg0io&0Dm2#v5fx!cN;#1^83!^0)tMw0?Jo`n;gb| zQdsZ^Jw{>M9k98rW}8aSLNT zj(9&>wz`g~rm`iZrPQ{;9KSO3>`x$P-keiUNB4=nH7iY>jH3lXKzsH|*zxb)wO{wo z>M5gF(yo*yv1Zog$UbCTg246cdi`nMIwaiMBXz_70O&%9x9wwf+$C;DXV~O?otGJi zlpuk*P7l{L)9F4V))MMFX(baz#{|kUMh19cgZbvLUE^D+Bp`whZj~;W-|0SK$t0bH zS5)uU#X*o#K}zZ2D=3oE4MRwG4c*-^GzddTcT05*BnO}tn8EFTZTqd+fPzwqwwg`_TmC0j{RaF+NC_yF1~J(J&U zDb?mbd~tjfq~~yGrN3pwLs;aXskih^n&|bhU}1=hHO~zQPlkXh(T`QZrVun+P&oy9 zlKMv8ZqM~u!1t!Gyau!SL>Y1U)?Ph~rQQTLO8B{m)=BP3;N&r3%i?KeXtvR|HLje_ z--Iejz$akbtg_m^x~p)B&{d(Dh3WSVS*90cr!LgcF;W}_MEOBK#bevV1sKL^YaejA z;p#8+=WXyHWAhm&{!cp16Op=Y3RuKGa3&YFM2vg%XUp&KY40k^ONh=b zmUV2(p(u9tBUEl)8Aedd^G6^!I<2>d%2%Srfi1xgUwU3^6(XpE5K2}d98n_G<7`H; zYT4RXFp}NHT3uTSD;*ehd!9MgxE&!Enc<vlbasP%xJ*C%(Us@R#m?J;eELfY^~=vf2LD4K zAHo(9`dSKa-CYvZRj2XOPXlpmfL-VvVjoB!U5ct9DwU5)m&q1ieGUrgr{)UL>*PgIUK8P&8FDE>k{s(_c&M?iF5s~Vr<*?xP2ITir6MN&hvdGlj^k;X z0+A`Afbi^$O2|fF2V4Sw1C!FrciTs-RU*lkd}DsuM)IGTpJtd&eTLI))mzt69`Shi zeMCw;(tcMprhTK%*`?l&&urjG_btmsx&_4LbhEH=hPDMW5M0F{B85A=a@y&U>!n=k zzS_R^va&Xs7hMWIWkn?F>4e)BoUBGVlEwU^a3S!s0MUHZ$?K|%K*X%ZXSw>9|!C@-DAUep@oNX^^5}%9-k6^ z{nbuC?N}BIK}`8>_A{tkKvb?IfQ=Sz zBo|wK=sFliOhm@~Xw>q7QB-#_fhq6f;%58HG3>`%x0`1e@8!U~Fyh3kcgMJb=!2Sa zJB7GJo`W%nE-IOidGKz!$krpz8ng1_+Z9>cE+733jk^!8rgSPbQfi<3rlVTeX5sn= zA3jQ(#&R<6dH%?6h$Oj0Y-!a-of^}1>xhrtRaD;qmxf5ksW8hyhW#|l+z~eFcs-Fc z{@glq)j-d$i}Fq@(aP3Bgosh6m+kmef4;)1wC3TNSq_>LT%rx^r|D;0_v9!6U&h;P4p3`^A&w8&S9$e(P` z^Js7H({mL4T4P@opHkVg;`nPiQ%%9OPi5(M@x-Cbl<=H-B-wd(SAUc!mzYXGAG!A2 zU%2)=<;_(N;^klHmWagRYH=kJp*;U8WWQrRwf$}PHW$_{J2WfPKk}ccYt6l^ie}K5MyGcC zryXHUmJ+~ zZHLlMipLQ$A=5$G<|qBGuxif?wR&-WmgiM9x5T2Y4Gmo@PQEpSEA; zDDwD*uE@TgrAW2{cSGF+l1c`F*f$Cg^!pqEJcfvSL$t6+!{M0bF z!mhL4MW$NVtJ@#wm^GNy@<#ma>m=jFG1~(Lx=q1HXs~QS$g9>RKJJR zf_X{Fb&r@_EUNIOR)NRV6vpq;ABpeS`|bJR#U_ga7y$0cNa@ol67vmV#Bw}GSU9u& zw1)}M5D%8|Yk!KZ8fbqJD!vo@?0y>%l-yQ9ULvyYv%S?s`Mj*Qw(&i$iSa&IqjjoA zEo#Y{HspgiF=~>Xw{TycdfjZb^%f#7e^SL)yEq-nDse+F_CEd}5+(qS5Bc8+Z?;6Q z!=lf5;ED~m!5vT^&aY$r>cwV}b0$q_NRypOlgQZB-q$pZXsq3)JO^i}v((*&SG__{ z5E_F4*f6HqA;lW7#bg29GT!g?_3M6qlKJRv<*)CLIJ1M@A`F14LlfOUJ;?gR^baY; zvb?&~lrF2X7Q7b(<1F0U-F)vQ3zI&?o0FX}wm)v@)j%@l=R_Xm%#_%O)tK{iS^lW_ zP!xz4r(MT?^M{b|_}cKRWwzEidKA&LgK6|tKcF2Szo=L#(JFWXj~o`swiFv9v?U%Z zr!(2??=!oyHX;=e{Bo8GThTdenXxb`iZQw7X=*oLgAW77ofpqXc3Z+vWJWT!lj*hw zyxVsa(N?jcnNftzv*TYs+J}1++=kt{1t?=6r{sO+;k5@ z=OuGtYaS)ib8R=-INBNwn^ze|!Y}hVpwY@5c`B3$CNN#gX6;Iuu5oS8vu}RjyEA#F z@#t*M=3Ge7s5tVN&y43A$sg@@ij{5{u5}yJsuM^#uc}ModyN@}Kkde71PDCi4>SgI zI26UYHb`Yc0(;ZkI`*mcg2%Vg5rkt_B(6n&Y#WnUYBUHPpiRM40!QP!Y4YQYvR4$^ zK+A?7JC9>O)#4FU2Vb>*m(nU3pAbQT-f#onRtk2CZ<s%VvH5~C7E^OWv$tk5Ai zyv3KZ2fC2!-;%k2m`kaMp+#EzOQ~E|+p`}Exj1T7LM4PPa<@&C*e#w{-vd6PZ2~gJE?m#SH<+I^dt$am#BPXSXWQywMRUP zCQh%%gKRk={6!`ixGGo0(5G8UrmBHml@}=L`PDivlYi$~lq-Kl)BAk0^$!WeajZ`A zxdxHrmjeM`XJF+uA$juUK*Pxciv9E%|Rk@|CDfSnDXGHX9rh zN#Y!@IC9=`5JaR;v)T=w96Q~V%tKCOSecTplhi`eXwj7^utNo`e8Z@Ojyr{m8{H$uF|sullYarA>ao zpz`$F4cvI7T4DiqYp6Nd#oqflkVO0|Gl9tsJB@Ak%!m-ubPms`JopP}OBwWl-VSb} z$C<4;X%>Jv@+y4!Pibrfh_wD)7Pll+;rB`=#kIn*DPQ4l8E@jBT3$nG*{#>rcXUQ| zB7Fhvw}#raKIHYLqRt(hSAKIGb6=zWt3guaLk=^UV-Y4!GFKIzu4sR;PML|HAT5@% z>Zhud44NtWQ9o4#nDw>Khz`!5ll;oGU$PQmY%i~&ZjHBfK0kXmQK=n4I`~oAdD)l@p|}Dl%&2?gF2x@kbJ}x7veWlSN71}5M%;(`sAVgqp?&Yh z^l*N>&^OGT75E>%@$$|Y73uk9-eza5Y3N}}kkPMpnq~?|(VM;@w>>U*rNdam2ta|x zj(X69^;`&k?4cVOd(7H?&DMnt+xQAGjyw3GARE_EaNmr(i81fOlKmVCDC-u)=w@{z zbkYjkmXErPxlvlwo2MC^Z&uvCiY`bnz>syC8v}2~1}6#8D}Ur%?^d0`W&bwzvOZM` zJd|b!tKTi;mNa=4P6|?0HMT6O{fV|f&T2rtK`GE$4VDjbyW&e+iru#!y6~$B7JL!2 zn72-iO3LRme~lyNSdUYX=d9ML>vJ$aNR$~bQKn^iq196%waCN6LDrb}({&Disd3a+ z#j6<9Z+D>cIlrLLiX``q8?Cc5EZ#R|(eW}0%s;L5zBjh`+Y77ykxrXxZI#>n($bn_ z8org*>L1^f*SQR=sQT{Fu160>RYrAF>vrhB_KKdi_YPEQ>b+c2qBbkKRVmh-L3U2+ z-yQqd!-Tw>y z{nKV#W3t@K5`Sfkgav;)#nYQ*N2wPir_tZhnz9*2IaOdL!3`X5yCSYFQL zP>@U|ZHPaVt-j2usSVH-byyuDOd=-1C1eQE-_NftQ8mVg*ieOMey!tl&q|jjv`nd^ z&KB^MJHg&W1+hJvr9@V~g}H-96z-?*ST(GYrEYnCW-9(y8xR5VY`oOcWIB+?X6CDS z#Lh21`AljhA9Y+no*sS0HHcF_MQ{|#aNR##hZDKH)j%~4`TP$lB%i^kT7iD$!G7rX zi}kNB)}heu{*&eO)YVM#7PDb8umR~}>C4UxEm_YbLrYFz!Vo)ZE3 zEGhuB5OdlhZ_v8p1fn02U0y_1M_T7gz-MngK=j5IJX-;?RnK77)(UiVx3Ruw)Cr%Q zV`bQ!{cg@PU2DLlHDvGQZ04Ovga`E`#}vt=_gP;=yR+)cfCpw){^r0QP4tPQcTxn{T^W8}Fl~(ie%BD?Ou|H@&t*SKTTxQ##93 z+G>x5Q3r0S!kiYjj~_Ve^p6zHryXFt9SswvA;gSJo>30VBt4Us`&Pv?4SN(MyL?GE zj?X1p2=*uTDcHv(n2+tylHy?|+ot80tI2(a?3 zjsE4=C3^af7X>FqKL@{f?*9OAdz3&XhW9_D3i`|B{1=#;7`%a#eHg#?#M?QR=^SHSRy@O)X-vjTYiBWQl$@V(SE;`|4ER6 zCX8zSmiHpn|4c5`VsdvF-mUGohC3=~lO84w*=gKY(OyXD?{n3aMOnfRN|;`JQQ=x(H{OW1XT;BBEwxxZ7gfZ4W$%Z-D$%$zFj+1g?d^4-Qh+V`l6kJn} zM^Bfj_KVCHW9tE;5Rt~at3c!n>SNUOq}$V~23^l6T$QXcQy(cCBRnXdue3$5IO238 zK6BBzc@OIfN@X6RnhidLu-wm_{5YLmhPf#Eq#$Z4uwy8h6H&e%E_7PyWLd zvk^h9>NWYOJKQe8C?!s=&RD!(&Y4PM&Z(6f#V>PjT;0^k!+ay{vyOe7&Q=AKH-0~- z2I{Gzr>(Cg6kkczh!$RfdIfoQSZk}*mz+n~>Xc!r5qOgFaG;GsA5XUw>$yIDYl&76 z5n`i-hmZ$#^j5Rg|2iV?wyM3unbxQ(AkTVJMpA1yi=0#^Wf;D@y>7?5!OVX?| zsbA7r4wB1vwcf|M{O1l1OYMjoUAaLIBkU9s!Se(HBz+Ryx@y^$4((`^k!4?bUGmL% zX=(|~QQI+H@!WO1s?)I%^xt`SSZ%i-o62wMaZ#mIzqR-2s`g#{_ zJE?R_w9nQ*Y?~i~JDcx}-ce}#`k2$)P-5kIfs##aGUiX8dpvP)M_iwthY2r*Y#aQ=HK!9$fHW=ncUs=}e zbJACSKbI5IzK+FJc&5*Hld{+cKc@0ZzsU-+{Syhe225qf264}B};!Q9L1(13m z4Q+MR5kn3~BtWGKLAfd8{fE?h8@pqpR6unfJ(#r#lm6A4ryI0P>6X_gJYu+ZA0RVz zSvAzscTO|B76lYZ!rjXwlCsiW`V?8mMB~bD2@Y%lQ3{)uwX?Cm2)?(mbuZlU1#>iZ zeSNkWnX}&zAK8oGc$1!=@!k*IyvFtq$@j$?^XHu0o__xniz1-0B)+ETD};ZqFlgE_ z2;-r7xO68}s}W$GKB*fXLyRdr?E~kDb`N7w4za!m0E}$;?jr_46gE}BSGrue? zeLF2Oj$qpOV_9As4teI6fMw?A@!8}EagK2H8(-yLw;t_XcTuQ>Wmxx!Kk*Qd%&4Ir%CTl{V#wo3;p zecw`8NWGB9xO>c%bG;I=pvQ`hleXpPqnvGK*+#U+TaF-m=l0 zD-Km4xdhbiq{Gxw`VYyvSlAvXnasAH&HK{Rbzh(X&Ky_d4e{^(>b$H=SW&pZRi=K0 z3W@S(GcT3^Ahxhrj!}!t0kjdXs>-P>`cU)?r%! zdgRSeq>37~=(5H;b&F=sPI<$BgsaI_+@%#|3QKBgp!2POO2!3rR9fv{f84U%DK|q1^d|XZoMJnbELyo z{#m177&jq9V`O68P}8vCGwoQNUZS4$!nSBYg~Ku+S=Zmuq<*CT=rX7LCXH0al7Gk& z75^5?^F_jHydor*Zrd)l^(wRAq7*_DD+PG(5s5R}uWBb=@yxgIIuq1h+8V`4 zco48KKo#Z)m5x7&?shjxq8B)7GofwWfJgtt!dxYsdcK>Dkf}vEr;i%_-J93j4t7#|_5&Ki45qBZD-Ol(zR z3vp%Iq8d0gHSZ7dOOt5pB7l3%f-aDN4@VH5Zb^Q1LKu2OlE$Ii17gI?K5Ry926; zS={a2usvmKV|9W%0oF0a>Qkw*t_^0-IQ33!hJ#) z8SFGV?SdwCVSDadBjUZ=A!o$ol+|}8E82fZ(~__S@L+E79D`W(*u41sb2K|+N2c5P zDRsPb12zf@T?FXvwS{|@oVGXJ<}Q99hA?{J7@3cY`o>@5TpeSC*EfVOy<0CeO)%3- zXY@#*C3k@$ekFgEOq!w>s{a6yK?Ore{J;(P>*JM%XD-{)S{9GfmvQ;sZ*vVaZ3lV{ z8`g?H_$<0zAUuy1rQQHOVKFoRs`pj5>bqeFY=OoZ@!|-80sD=>qxg))bim9w{=vDJ z)pRM!zXe@)99&u5IgsS!*F^NfhjnG@FXHGgbz7FormWMehOb3F7w8JFu5>d;xg=a$ zIGpVGY24tAbIs9vp!M#gH8cL0?(B;BY)m#fPm5Inw+rja+M08UH~TzyOvT^5j0#T( z%J;uu7E+zR-kL@g-)djOSXEXkCWKzROQPy#zSP*WvMNTslt8B-(=~3FjD&_lf|elz zz+qUFo3<=RTF2#jD{Qp0O@-T;UWL5RhvU?v63av#vV3^?#vT2+LPV%9=WiDa5Hal_ zSR?PPATvQYxx}^%YL;3Cs)sGGV0@tun!YJXTlk**t{#{`VIw_auj$p~8m)HMe&o%C zkQ~?X>d^UXbUPLiVKyPvPIT~_6AVy$ly7(tRq>ziL@Psqv^~n_yO5KC2Pdrngy2au zywms`_))WQwV8f+0%n5(66y^h0~Ip~$VY*%N;>lO59*U9jVf_ARU%#_V7=ulZ}0uD zAMs%Cxr?@%+*gbZ8(a(KV$k*BG(5R+jN*(dvF{Y6U5`FIrSV*4KWImveG@OSwo2wa zbv}S><4K_elY3_G6&0!3e#2)u_r^ib^dO9PF(y;-#a=+CEJvsKQzZxfVl^f9x3sF5 znQB)6hSfi-5AC`JJz@YWhSjLkN9GSFuNVEgD5y~unh=yz6rEivvESJUzj6l&*Nh^O zds1W+{!GwkBZ#-^18>~x)_8faT!tczty})kTf5+`rwAu{p)aef^s??p`LfK75U(F2 zBwsukd+G-ZYmFD3&^vh$LxQOptSlAS-Eg}|eGbyB>7l$7nHlt%(`l|1(6y7TOC)u% zJXqf}>@3{}Y3`ek!fj;7O=9p-*lcE1ayHw&qFu@gUr-X1@f1vk$iFyrUVy*=f5oAyv4C$kO`d_riic+K;QwReV3M za6v~(pUdLzY4Oa6wPnN(!>#pR4U=4H+o8CMe<-b45(1#L-8xZPbq7RLm z|K2T>vK7dyOXMY7!Ye4;iudO(^xv`LI^=vP?NoZ&yR8GmJzp;Yq1YoY^Q8aV{R+lp zajN`7lHa;1+tRWBCe~#CX#9MkqNJxNs<2`n;ZYgRX4mF2kAFiB)|#1_wy%lwmV6Ei z8w{~?pQA_(DzWPlYfS}gT86I7LoHf*GZ)otuc7})bPnsL~lQOBJV;$Rbx7N&(15K`9`RnL9=^6f%U}po5 zcZNB=g|mJproPH>yh8K0l$dP0(v>4Ua^|mlSx&n9wIWR#uLKS=dNaNTMuzIM{f!4S ztYEGE$El=f(QhS}hf#t@3X(ZblD28sP;cNQxQ99k>}G%SV9YhX;fQo8IKmqi+pI7= z8utcdR6b-=c8n(VafX5J#1gZ$>3_1#PKS-s5|5oYZ8Eh&rp?=m;Iu~btyUBnEiLb$ zh0^N*VaM@`lYeT(8^2hFMHD+dWWKh9FtX3)3g>4G#&+64aiQ9OPmVP2YH`fOpI<4+ zUO`T4nhtVkP5f6`URJe1dTYL=+)|drzv8-~3e+N(Kpt}ycB0>`#cj1ba(M9w}bNAdhp z!2V6v*WveBx7rW1aE>sk(RtNcx2t*cJm|=Qt1V$!py(9=&0lc;oTl9od8w?zIW0=V zx@)nbMR&|qrntLa`qON;YwULoh^q+fDE?Pn_FMyL~WBE2TN!INx*JM(;rO)Om){a?zLK|`JG&?@IPEaaKK#{BA-F~66qy8xu5!+8CU zya`W=+C24yQQp}LA7~53cn_exlBu>U`6ha68C-YyEY#5VWd&t?@4cVkTlVs&4+Eh?&@@-BPe6g9u)6cwA5zcP{`$Y^*jSRe2s$wjoA)}pqqVbz zll^IZ z;A_ehusy$1R?{r+zhTK9!U2eujoR)86%pDJpg43Jw>yCmPcxnoNapD3wvj4Y{gJ#H zmpKq)ZQ@9GTmVf6DQR;q&J1&Fwz;>yz<5o213sCakRo1LlL)iFtK7f>00XvPkL}%u zoSJHr;NqIP$||>SOg+0tcs_3|3EVl${vkb4!f_}h zRk|v_B50{Vz(7#>-o5SOOS(C{gACS4yY_yGgak)(?i#{T_uNdCUAN&5;6jWf_Xa^l zU+N?YGqMYk|7gM)2lBp}B7#XK|znt9&gEp?wUc#%_gZm6u?=r!j%X)@g1MyaA-cF7f^v zPC~odFp3JM>nfyb;ghe=)K%sS)oD%{Fyo=Q_@laXSN=Bvp55m3b_lK~->*jMRYHM` zL?H$-`k*Q}0VLR`uF9-^J#k6>GH{tkjAZ_&PDvhY+~Dwr)Y3;0&%V+1R-K~thFlJw zt;Z0-e2lYk2{&B)JhC#CoDwuK#5L@}UFI)oRxPO8nZV6GCfa!|fFs>IB|ktjhT``? zHv8A-$RhMv^7vCjO)_Q^>N#6GSadRJOCiW~v9qDy0TX;8aevucChF#BMJU`qpGCWE z5+DDl&QMr=_Q9@rO^V7|j>}=S%j%N&KO=V^>2(u>OzYqa%qxzAvC`i@8iXsBb+Ni@ zA_Ro7qJmTX9pp|g^u9Cai_3k8w7PwuTdpNROsrKTdO=G_A0@bye4Xxq>2sHnu2S?} zfiW<*AUR;iOp@8wA*3sH@QOmSPOi0CJ-ai5|4xOn#W#i?DE|317d6v)bS_3wMinT6 zLK5%SEALUZ*fVnyQ-ZctxLcp$`rX@3egjuMS_gJ>l!Xbin3xEw@~77x5~#V>H;>I( ziCl6Yn|9`y>D&Am`tjuAOu5@$cxcllL$`!kY`ndcpRqJu;VUawWr4-qC zT9~WA8z~aok!QCgyEjZyiXPjzgP9Uqd(9e4H4Oqe!jF)#pd@fjvQWe2Qf#!+qq@MR z*$R9aB$9Kfq*JYark@R0KmA1slb)>fmx_IEHs+?h+pJ2?v$4D^g^VibE+9l2i}eLG^T1G+I2uU9k521Js)aV%M`{D{Q7oI-EC`ERoQFltJ5 z{?-p8Nw<`9+v+oRIpjk6FQ_<28jq7h3|G|B8p$Y89qORjNIQpC%Ep*W{?4}GSHH7V z!ekoAXctFf4jnvh$dCTKw;FL}O_*vl7dCe@iDAHe`up3V3#4ZiRpm{x^nlC!MIMtp z5E3PpwHq4n;tq~9)9-S)d`QDoMB4n5!F{!otPI_*g!@Ko2Y->#QBvtaWB;`6GV^yI5FNDQzvd-0N zws=ch(U+|(8)Zr6lg)At6eN#xT{hH%QzhJRQvV5IqR!&MtMi>P#luVoWmM2myOk~8 zENtlILD5GC_`XPTNz3WaF2od;22E$5^j#1pGe=t)df;2Cu`3RJ8Kl*|V~IyA-h@?!UhM^hb41UhuGqR+=rT>HXrp*^aIWQ?csa^o6!mc4zH=9ky#< z2iVz#rrfS3jVq))&-g=z4Q`?gKJ7M+jsyCU#z#e~kB3a(?B0Cj#&YtT`@4=cAd=e_ zN>Ab>0>IKo#nIx`@nN`-Y%Ro zK*}@>3CeIDd-ENQKa=ff;E(DI4IJ~7q$AoK^G!Ya)LhexYD`qExZ zRqSKzi$dFCzQ&At% zwwIzU*_X~YZ;b(eiq^~&rHiV+DP4zy)5)1Go<_9vc7~67b~CLmg(fwt*7A}+#+y%p zG*b>7$DWlzw8tYa^qgl3Q+WR|P+1wI4dvoblcM5&Ew!1j zdnAoX8KK7BzsPNDNbgH@j(KR+j{*fVQ4XGM~s1+21l;hfmIy_Ia^p z1H|YAo&5Ic5@`E2-DonQ^GW0;d;?5>4nqiRu>gZJcJ6NBihJBf)rVwUWpS?hfxU5T z^i8YbN44}Q6dr1v#>6x?GDQMyn*86YXWIQ{M@HBfvxE^F8W6(Zw%(&|Qe2I-@F;;~W+;z~KDb zar1mM!o;xJi_kVlyj_2cTFdivd@}7DBDzeTD}nhIkmJp2JU4uF^}2gL@{gigSWDB+ zaQS+5?6itant2O86ONuE)E1j8his(x3bF7;JpSEm93d69r8~7$yOa3z8tDd=>`M1j zpla2Rudk33 zlFL0{@I|KnnJc8mTk^qEM|_pl=V7P+@fsAor%9)hS#B)v-uK-#xiK;-)vr7cGc$Z9 zdP0I@aP>Y~u|a|a`jRN};q5&uGYUU;_~YykPaV$n6)U_;pDUJa1WhX3spxB%*re@H zStoU@UpuNnEQ02;EKD`Wn{e1%X$fMdwXEQ_q47CmsHu&ik2+&7eKMwVxxZkySNNEj zn-DDy`8=^rrPjv4<>?>Ni|2UMs1#>Q-(blEI${Jtn0}o5qUkX6sbx3E+#Dx`FS6T& zawmFRRm;0?i9Oq4kf3_3{ba=BWj~bK9Wme!{QXQ{ zS6fk4W#(m(NFlF#am8{cVAW9+f9S_Hbb8G<^aTrHe>L-(g$caGZuZTDcihO+$=^*ljC%PrYXC$Rkz5rxQt}qubXX zNs@Am{KLNfM&aHDdW9x8+n;H7fIevzB#Ph&USn6I<)~nyJ@o{1bmm^&azWtEWe}om zLtRsE7&J9NB=jZm^^%JHr~YWF z^rHR;bpVK_GZUEL=34$AA7~^V9YD*$5H&_eiU2V7ZJSE~>s7}VaoPRC^u(dl00(L2 zivg$Q?a<4-G3b83V0n2-Qxx$3bY~#j0aYgV32UIXxvjM}!m^(-*eDt>T(nCdupK&(@2hR~&fTeb%-$2(Ijg?No0u!B(Q{X4>db zwd|tc-q4*qs(1W-&XLCg=#{?oeCijBd44Ryp#@|VK5Bw{k62gXCn86RX`_wMlcjMS zAwD(g?$Kb)3$>ngW=%7qXg~@_>LU<5S-;sm8825N-Od@N6(ylD=ar7d=pF2ZU8wo= zP4Ifg@oPW7CoGbW;Ka7`?tNsx`fS0}$!9LfzeR5Ruk~`bYQFo`ZD$J57o9im=>oE* zAODbmnCNPeIu){a;@!t7#7GEYWTM>Er<1RYsSKumfL&p+MMe8U3|=gdm%p&PFY~Uy zZPR+-wACZPG3ys1k#1ylF)8<0W8AKckZCaOt-AL z2#G94qM`WdS9eoe0|oef@89YS@yC(cC22Ly&IJB!&}r)a*0l4AsHbkPZLWR`^^XEF zl&G#OM9cS$uPrWgtjgli!M-Ggw?CsN#Gr1HlZRJCy&5u9WY;LvPP(VD2IqP&d736+ zlKtwU9Xz0MbpogGJ>sF!qRi(8@Z_I_mIsb)UCI4;-ZWjoHH8HRgA``MUs-wzgnNqG z%euq0w_$n`L`YsYW4~|89{Kt(>2%Xe&9`GBKCIuMtX4O3*;=C|01lus?3)FNQ`!B7iX|2!PZ^E5*IAeg40<2lFWw$Y+IsSdQO(Y{iAb4g=G zdNqfi9cB5|`B_}>0fr65JB>>XL%!zv4hHu(Yk+1|>n@dSLIQ0UH9i>S&qXGV=kd4a zdQ}~|Zz<_$?V~ta1J>o$bo6iWtM`_p65Hw$TDDD(jj9bdv|WN#lP!7;!6jIGF1Kr? zD_k$^RKRw?{x^gEBA$l{nK<(8kUDa4?TPeGiz(~{BdnO|hSWQvxP&@Z(z&cn;;;Xn zoO-OF?a7t*JLsEnNKEGDWH0eauElZ{HZN}cv@^U!Y(SIMqB>)d)1H07;9=wS^k15J z)l~}8nh*)y*tToXYKY7=SkYcAn zd5#04ELM^S)!NPSM1^T;jWNDX^f!AgI<`!`E)VgRH+ta5=_h(AogwFsbeBA+PS4`i ziH=&Th0`swvIg*Co|Nl1A<-#TOYP4jY359Sre1#0{OT&S!+6YGi*z}PZ!aCuRwIED zG4`|7Q3Hna<)=qAk?Oru4ydU-^If?SrueVBca{!=@!1^%eS#z7(*<%(fg+1i^{x;^ zaGt~R0N2O>fBM~*8iu{LnnlJuled^im(66(JcP}K)h!D|y_NQ=E}p*3?yf|?Y>lW; zJ;}Di^76&aTSs9ty+|Mxtyap=?TR33VnL`mKrJ~^t4^n19z+)b3n>7hc|&)$cR*N7 zQTdOhpgn~ahu8tqjIM|Xf1Coi+QrnCe4tnL!gInLeReNMrE(Pe;LhugqiL(}GsD&m z6D;NryDELp7jxby)g^QKJmV9gM-zlJthaiz0~kmHVjkei-(PCWUze__AOzEaM8uwn z5F|1zRniy38#0CsUM7*T>Q}w4Bo?OTZVFx!JmVjfZk5jDF9=iq&F#W}@Vvt3nDQ8z zu5x~X6_vSlgN(Rvy(4GN(==#=gtr!}mFLuEmb{-M|2p@#A4L%us6CD0EW%SXD#>|P zj&90X*%UMO=-b*)5(efSqJAn8IOB$FY6v(9dDvM zcJkKr8`=iPjsBxKnO=F;D?m~eNPWb%>?boM>R#Tm&VuDZ<3VSZ zJp2LMI;;7D>{8@pC#CgzMz%jPWSbK9m=ZK(} zsYV}Z7QYX0o9$_=j2j=EPSu<+YjBP2r*R_7447MOivIZHk+JF@QXTR07RQ*L#T=u_ z=k!vn5P1{s0b=gQ)YZAMjE!&)?`->FB~H z{HB+@*hoD}b(@_EchQ$xRkR=rS+{R5^s!>}fGmxH1}`2l@d6+m;HrCmdvVlC0}3xG z#f#ooh&#kIM}sl;k&A$5^z>xH1BYk?Pc<83wJ)>DZrw&r6pQa`?I<#AtHIv?P0s zA~REr?Xgx@8e_H`%)nmzyzwe>r7>@{JZ(X1hH*aOQ&-O=`2=zI>Lclwg=^h?egDVO zS;sZ`zHc8y1(gs4=|*aRgmg?qx}+PG?heTzrR1cgL1NVC(TLPWcXxL;1NM3D@9X#c z&p&L}z5Be5^Elo|zU|eEtMu(B5kt3xic+1$g7|ZQ0H#ye{r%yZz88WzE8(!0+(7CL z#31!EPUPVZoiMrBDg|$aE-YN>tnGV{+!`XGnd!{WMz^*u*6~^_igFW!h1#SK0`}cH zH_yH~Y1PPe;=nlV@Dk7CVqJAFHkP-(59!h87A5S7{Fx4e-fLB@*A72$T#F6XYQ3=k zd=W7esB@RMx4imkSBU&IhBChI65nZHB?ORp1=DFmb$t;{vhh^HlwcVHL0nNGM<4cl z$fBe7i{vyx`-qQcHo`kPPwB7wVc?-|X zhgDp=={$O6oo21je^|QI$=t4GzTpz^SlB%UpTrm)igd)qVNOe~U+=n857XpMerFyl zGw@%c3H9Zpzqu`OUQiy$uI-iJgSf&XmR9KG5g^B3-$RIh#{v<^n8Zs*``Z zU6BWUcv>f2wx^18C>mE|zZB>e*b?lRwY&EEt#T}V&;3ATx92EmFW$oAUk~nB9=Rxq zo`_zcdW$9Q!j218ic4XBngGrb~apr_+!vqmJcn+K$e4gIx&bABs8+I{^fWT1z|EUbEuf>=$LL zfG^_g?+>`u>dd49LYB`$cXulLlfI@^a(oa8f?F_sUWMJ65BH=V9JgVVhk_q4Mc z&BwSs?la~@%DGta}_#Ofn?-eLz2^U026uQ{L4bu@g>T#3E3(J8TgxgnA! zBTHsRlBPhDMiB=zB|Wu`fz~K8-1TzifQ!*u3QrX|D@?(e)(Zkkq3bYkT+W%I(|px! zT9TRVa0 z<#IHk@;IS5EZ(B{8NwP9L{5|3 z#RI|w%l#}5KJYi?`N(-%-0#XSn!hL1e#E1#X>gB>Tw`>$8AnYPDiYnb$EdDAZf+Za z^?n zbVLw-3-RzR8S^~fqiOF2jgWa@uS-=5!LA!Ch;j`Wpk|A9|L8C$lQiZqT6O9_+E+Ih z9cZ<}dwK#Wt6(lY`zMnHTe2-d)eoCHoqMo2QyIrs%6?neNl+{GaWX6Pi8)N8lnycn`6u3fqk+V!6U%V}{M97I&nY=g$UM5lK}VctY?6|ses_0zPnh4u zlWe=cYK$nRlVO2^+)N_S8{>~w)=veemEsG_V(pS>mhx@(Y5#ds;vhU;Z&9W(K6j=L zj_YA&Vmwgb7i<&)>{l*JZW$qcKQpau zk?ApQp5|(o6s^o&C!a9c2)M^aa3YzN7OLvP74&;@V-MUfic2-;s>Z`E_=7V%@@y~4 zp$9^33qa;(>>+&mF1r{w)}8x!^D{O7jSMDx`Q%vMYHupsb4C{4E<#PZw)ep3OLJTg z+pf`;d--;C*-pHgI|Bt^!bs6Eq$YTMu22# zp@?0=loOJ_0&kbheH1R3Ni2xR<1#b8XJRs3+#6DkKak ziTfE@RqH)pY5**WvwG1PdI9bQic$sda{S9@>3{w4ueCk{%!sHhH(m5M3Oqzv)8mvE z+0B=5pNe-e%$u3l3gGWjR{vpP-=uXlp3)U~{yunV#CHAn920=MdOP8+lioB+fXwjl zP01bS_K5PPD(H}lb;CVf~ zM)F2BP%@e(3zz@{Sp1E+?aw>{W?TODI3TCck1jAHI775wx!!#0&o~ zepvG@AAL_Gvgwp8Ghg;y5w@go53f|SZ#J?iK=kkEYWfF1WFtC6%hXLHIv-xND<|x# za?VcfIG_Ug+cwk$w5W+3Z*i0gr%^ZGUWMS}iTly`>V{HDTz`<^F(Z_w+(#i^Rgl{n zyB56pmU;p~C5AizfuZWD;JF23CFpaKoH}*sAyDABVl6_G_cI%tx5@)Z<5Sj4J(^Pc zqjY4-IfX7-Xo_ELcKGYR{VW86l<~bn3e>J+qD4L5HXqe?C_uCl9gI8K1fXd{Dn8q* zm^ZjPW3Tr`1$RCaN@S1t>2Q*t zW>+LX_yxu`6J?uCuQ($swwtPRy!vK73vK;AzRU(!bamX$=F1M^e+tgDS5HnK4cKzu zN?TavzL;`2lV6=GlY$oK@O&{7+w@uAood?m30p}SdH)|)N46bSLv+^Dy%EG1YYKsI&)>{_HS6(rHXoTAz zvDeos+%MzJ>GTQa^@?d-vxgdf=RWdbF*Arj>TkrWYuejry4}o@q(T3A3#AoJI#{Qg zpG~sNkY;3H5vn^(K9j#!ar}unhu(XY-ne6=>+OMR#kQPM%~PKjzDf{n!Su-JIl1Ec z$FtfDHW5KTD8(y%>7?n9Ig=4WYQC27)k;lEJ)?Yb{FMtL$IDZBtrI-?Q3vNwm|et! z+SjKM9&#xyX;y^3;%T~VX9O|f-+I<7SOD(5iOnqjw*a|sB=wjdIv%cMOW9XCu3P15 zOQG(+0=jLwNt4kWiYfTj8L^qhx@4c#1@sRg%xtRSRt@T&7(_MVhuz)V!eQ)i$!d@V z6|(v|#`Zup&C8D0)_3Y@cz0Hnw{0lf!2h3q%Px(?2RJjK4^x;Qtv(oAcSE^6Ik&>p zJr*rKW7Vu0ANw%#Ew((*djgNEGLn%z zgBi`pSZs8SAW4sQj2a*NW=v;gs0Rx4L__br6VPk5&C}ZXYk9ApJOR~|oTPUFjv zdda;`8uGf}Vjm(<;cV(@;pW%-Ri*Kd9{w&=^-YI7YKghBlsE89FzyG7RTY%W>ye8e z@Z%ESLgnx9W6J>_W0jFtEfclZ3)Dg(i5iRkE!qmV_5n~w7}@F)+@-naNDN~FQVr~@ zBYFq@E5PednE(Acux%_e!y(Ksb=0u7J>R{W*N6wQBncK%EDvD}A908(26q8V7CVda zVgF7@FUhY*gdvhr2&#%6sUNpf$@@$J&nALe#Yp%xS&?_JY_&_knELVpyslAgv7xI9 zO0IibG8syioI--?jOn~AJz0=>``jgf$guB|Wnt95Nnz9I3S^`k|-gv!51hy}f#4#ziy^&&t(T4PuxOz;9_ zgNgB=_f&X|wuE>nbHmE6F*6F6p^ZbSkckICB)VweetIU{(?hbE-ye!|*B6xCm#&;;OuS;qgL1n49qHGusp7*wq`5!V<;a z^ac@G7U`k{>O8_6kKGH@`%*DK+MrtF?^#5qlAISJ3pcw7nkpX(r$pX-rjPOJ zu04p=Bb}U`zu{c7eOJ8XZB5)8w%{H_E<(2b{zNLc`S``wTY^R9V-RGS!x(EF`tH|Ade3cQl`F5ujzo-@y$?=G=UiEG>L{BAWTk>STxj6q)`q4lEO#@UPTe5{(!)vxr zMN56D8&8h%m;u^urE$jk=AoVl!Xqm!&;qGkGOd*u%kb;A8V&g+RohK*3k_7|aOa@B zEA5D!KY2(LM#syGEJPMuq1OuoN~_&A)l@d4ebN*fb8fzTemj5phKcnqVx+CDh%O5u zmAg_%nV^~=dEY38A;1Xk{BwmWskobJA+@)*R4xMH>M2Qi?Z+N>{kXF}uh<;2e(d;a zSQaho3+*c!;JQw#PtbuDHp4lzEcz(bKluz#wbXZeiK&M6(*EKQ_aDl+&-HVi$=)=% z@i#2Fee)`^j&j`i)LM4cMAO9Za$u)qq$|*Jh;U7uE-AI5IJ+x>=!l8v-UAY&zVi6t za3T93=N<@FJYQ}aEwsNqcA*}0IGw=a1tsUNtJTIIIFoTEuFVd~JH4kY)j+XRkHlqM zT)~;K)$ov<>2jx4Lta-X4Zzs)M#@~x2#@ZX-tRIm;P|@D&`bY(>+QOn5yltJNB`ew zWtvF~r^yUKZ^EPRol)L_i-4;#6nzWFlQH{6n0hR@h3s@5Uv#uR+JG02@QD zNwhxJ3?+@WFJ>!=4Gf*8)w%1bpUu?9JdG5Z|ECp>}l-sar>Lv&!1A=x6moMCQ(*3*v;TSApBs0Y zsJjCgQ zyfyJ>6#gHVyp!Xbt%lu|ZEnllNr{iTaTCWC_gaOsRpHaZ?jG~>i^I*3aQp0r0A~Y= zwv>Yt`df2yN;De7npYS6LNOjMfjSZ3r;RTq4srqc1wQ1B%u5lv)|ja{LJ? zT{=x;4rW2WNuNS1AVWnZPZ(mm=zFF{HLgD7nDbQtF)0S^QKmvZ?d=ZEFjhfe#cx-H&i;z zWC{FBF?d;H;rZCCd106JuQEGu%<%1fn0f!2KEWmeo<=F#_4jkyGH0~szdZ+YaEm8SD`sA#u8`&4#UjY;o@EgtDBsFVik{t2KsB)L+h^|Sj$ zEat~qvYS9Z;qG3*(`C+~X08B(4f4zn6i(kRr0S)qL{crf?Zd5VA_3_J5k2^~U6kMn zFvo+VA!1|Wa>vh+k~|p@&hV)*`_v3Mkp+Hr=@6NCHN7L2^eRYa-ox_~$hgLRsca5^ zUpXE%h43^MbYHEq(g?3GTFCnz1qiv;-?WwTnE%>Gy0y&98|(Z@pqg_`f6B_&*lV_U z<~J=~Wa~^tbN|o7`ShYZ{>7bbrLcqfY{P@S8py!Os6WOVjV3CFQ6+?s=20^Dl4X(O z=a(|O$UmmKRQ3Z6>Z$1$QX3~N&HTGnQ5)gd377YQZ=@7Tc>MhXUXV^^s|&a!>0(!$dg zM#Z58gK`|R`A=I5tANpzdy4_{8WY}RuWC4S{34rs_@w?quzf4JHbyRbQ&nIb55?fF z7`xTrCuw*z{+!wu;@OsaXd+u!VeK6@oVuo^Ex`tCet$bU{&ekt`mbN3kzO@#;jgX13&9Zj=>S-~{04$bE_QkU3H^BwI zp>ZscI{z4^MFVnVc?^jX(Yk7qgQT&h@$qXzN8OeGzN584V)X>=WeWy>l6rY%<+*|> z=CnrT>s8OU3x)6xmPm%sBLKq}Wx82tSmBG(x3&VO&Z@PCRNo4d@JCU7g8= zlu)@43z?%LOfCEJ7pM6&jb8lnB{ijJ{H*P?bepny|Bk1UqStWJWKj{V;oNGA*Eu%dOXqEcbd_}9CI$;PNF$8bYPnPF*8XUhYD8-cx>Qxbiuu}_={Gnt57a@V zVczD@VySGUgW3SP7Y}3>y|J3dKWLGz!QkgzE#o}3y}}B3k2mN_AXM9}`Lj*7-OTBT zb8aV47ZE8lqQT+rgy5mJ_1=Dd4Gp>800N;(Ortmsd)ie5 z$C3NN*9OCE$4t86`gw1BtdQy|+E~s3z^ljO{CKX;-0PhGl?&TB+Hb;JV0V*nlAB{y zk3#est&McLs@x=V9DHEAHYLu4di=(ilWi{!`qFheuHwo}AQjOyW-Z&20Xv<|=U{%2 zt>uO~okZ8-zXgGda?DPr_cOjqPo$gZR?986w>IsdgR*d9v-xVzN^FjXAy`xZb{#*kt56brCUf(7fR+xjXUllb1GL4h<1nHw=@3SmxBdbSnK-K1om*uqts5{VkkcOx9+Pq^jrmm420-YtfRpoB=hJyIOPt=a?q9dFSo{JhG-`i$tLP3FQW zI}6lLuGXxd)aUZPn28!omx6h!5b<0`Xn|v@m|*zxlpxW;qLfiL^>3n-aklTKY+Tg~ z3RbC6EiuV##jMRn+w&_kz^6g;8+f96F-aZ8w<&wB-8axB3P7cTgKBAmU zsP`*lSh(VgYa?3zRs#27B61#maca35jh5K$ySER^eb9p{%<#jxvD?kC_H!KBXCfP` zZOBXj1X>6K8V+;r)9-BqH0wRUW#b2s|Hjs9K^3erUtN)kv)P~3Q3x+h3di+xwy#vN zhuvn&Hmt|y^Q#6vR#GA8$Xu?vm;EW$6Hbk^ZXxrMU~E&aJgSN`wgO5KkbuF_xJC>d z4xiJX`I?E*K@}YZ$hx2#V>w8sgce3lkahVjZJEh3Jl*n9eDY_}Lf?k9#;Oq@`DCA? z@p$^J&t}-ez}Jq)uB`REddrZaJNd&<>uxmRHxY&ms^~4Dp5kx{Cwl0*35t=ahZa0% zOahuj#4sX^ep>0_kp((LZ;J?S@HA}r>QxMv!Qq2pK`QC_QP-g-&6Q%_g6&b!73Asz z2b~SG#pF3-hdJ*loTT8!>aooFM~5bI*gv7Y(3@#jNWfRv6X7A@Ds1hujqS<<$^FEe z?}VrtAR3@bel~CXTg}-nqiJE8*hwx7-!s z>5%?@Z=@i)J}v^gu_w9F+`^@#F3^<9q2Jdzt`$t1%nRBaqIRc=moL69zGsKhMfg3A z)JfKROqX+OmfLVgr+sB!bCnXH5k{9}!(jG8fHULeH$dOECViy*mYdW$W;RwVgAnmF zQK9aOn&MaVcdc31E5@Dbw;Keute1MM95(%08G9Q4VKqLeYC?YkuNau?{h(p?iy}Go zYj81aW_Mc8g8kT!i7i?$0Rq3zC+U};b{#`GUnim|U8pujQ$$9?(0$nWRGOTAcy zwOX!=D8Eky|AVt*CyZ}WP>>aMGs$p;GQE8R!0?I%d&S_*?{}g}Oi$G$r4|(4SS|p6 zcc?ehjc;X;YA(As;DWnmpO(wj3D*Q zUY$i3NlLZF81tSvFSF|WNonxV`^z5YPM1KO8G$qKHT3c6|3*w5T6u-Gtk+GG*8E}~ z(j66&&4EdYR9sv(eCPOwG;VtINxo0cZhtAkGKw)e`Eb>OS0YQ^ZW2d)bwHAqIfzGr zzQAseBUANs0ST6vgj5f54<^j#LU=Zs&8vg?)e#x^0#=U4Wbk<_D0vsVZ{jS#Zi4m?rgiqCQ zSqM`HRsX2bz5agMs0P8okj3Pcz76M@L_S}@51F|~=swF2ieMD^vQ0l#qCKt|dGrSK zZg!~>EKJ|2lZCa1bB^SUNv?NvWlQq#FQ)u(eyzwhUB7NPrXMdIy3Uq;28z{i_08l| zJaF^A>X=eb1a>oj5u-b415-kyolM73wBjLI!1^HOb1ZU+!7aCU&nWF*gHEKkECqHf z?!FFZiZ1hP>7K6+d=s(fT<w6@F!+ftV(+aV5SYAs zcAZxX5nA@QlzTG#x6MI#H< zYRVu*;dQK}ZtPiXW1I2h`p0(ETihW)%6=hWlvzfIYi`;Y9cwRktWwvE>l=-ZMF?># zoX>12itGe%`cIZVJo0lhe4FWes{hB}tGERv#xp(a>Ydh+%~pz_si>xOk|3|(>#7_y zM{RA;WbNe9A#daPOUMg|j0tyLskP7ljkM67>1SzP&uBri8hOI10%MUF+Tw;UA{$wk z-G+eip+VEX3$qXCxt_0mGYhsJI|BC3h6Vc0sX8r{-tIr!>YA#wwq9YR<7k~{FO?s= zmCs@^HTEwPb@Ld~Cjx{QO|#rT;}UgiV`sf}l`MftaWti#z82;|+2h~Q=Qnz={djpt zSTD1=J3&OY?(q$Nc1I&M0d~Q7@`|OYRtwRU@7vwsbse&Pa#n)He9h~k%{4Y)@EG5& zX|8b)0|>CX28r!#=9MSFv!Ppp9Ncl$q*2N~nix%Jp@NHc1woG@)852==j4|IP20X+3u@@7^wRy|&J)e4DFJk*yJK zwsA0<0f$E`lJlU(niOCkN57=GScuPXUUP|1N(JeXC;d7Tmg%?yG8ah>vT+4-VH?K@ zP-JbXRUGL>W0D6?VVp&C&+sDcj}dKio4XJi-G%+FFrAG{lu|fI7XPo=ig`5pZcK*^ zL0x#9Ye-=cCqqZ-qF7q@$*6T`44c}maht7eU9(ZgL*`l@oT8M{Q}@f#Mc9qko#*)3Dl!xc|!(c(}TPK-& zl+ z%4d~UBL7e?V#^=}@{VRTeb*#7VK~%H*>JCf8KeHU8G75tJFeqQHTm^fj0`a^njgkQ zu(FNOp5;k~dq~3MdQqds-b5qd7uP?JwuHPsyek><8@7jRvZp2H((|L|*J^j(0ST)k zgwqmJH1ScdGV`jOmQxHTbz(B>ow)tc#7741=;<`?3guJL`CQ&h zkI&OU!grS3b@;2%3Sc0I2xPxHok?ar8~zP>UhgEs*N|}{iq1YCE6umkYB>25&+(-D zp%tJXm7bHIZZ%Q04vbfg(8^85<;it^S@nywsvxbl^%ANg81VUr2C{)!@qMea<>r(N z%B~X@+XWt8RQF&m-(Uv@>@D`5^$AbC#5O@2qijLe$ey!nMIJo{ZI;k*<>cVQi(@SXZx_$%maas~)@Z*u*MpoA3 z=(oSFfYV+hW;L5G<_w4tl^SJP@ za{P9HC}4;1NQGH|-9o*MF@?FUj5FA~&;h`;S8_mwgnGG)A=L@A7yS&r~Pwiy<<}y?vGj zr4y}F?kty)KC^;oeU<|~tn1_h@NqwuckfG+MCrvYD+146IUzr3pGY5pI-SX0UwQm= zlx7a23nJk&S}ARcDE8p*8vEoe8_+(IEjf_wr3IOHCC^mO9<#j;X|Fp|QTtSLy#@(dmH48aPD9|6EyB z$ewE6HWB1!#nA6lmiv}ZGCZi}wD!_D(k`4ZM!437%x4AcS4}B6K5s|8CkOBqfb55vW{MXI1vbSL55Cs(0{E7H1qEaMwG_Mdig3-dJf=Lg)s0|ClRc-wf3%2oMGN{^U6O1@rfm`Lf`y)@ zFZqU2uVn?jy(pHae@h&Kxz@S~^lZ1I3Wt}`PFMQ}z1Bzdh0sMksM@RJitY=0})llL^s(3kU15|GRWjH zno4qj+-232O;;*RdiSzaz-9^x;emPFe8BAs)G^7yPq@)(`DonO5}|F8)G|N;hc&+8 zo~U}FUQe;-=TUyNX7eWk*5Vn?^MftnFndR|+~+dBX9`Wj^gb^YuY)LO9XRh2(-PcH zh-ZQ00nAE^H6sDI(gsQrbHg9TH*ZwMmtTdd*X&dte7@c3ynTBKPIA8*Z(c4~yrXQq zjdDlT7lLw3MBmRx=6b`@J*2x_&K8GZrRAU=V&o3cmk zv2pt^1V^g{4EEx3dTq(EyhRKx3zNS8-H!K}5f4x`wqwccadF&n)3c40hh3J3cN%7O zr*XJ*NnZu2bKt8HHp6fo54%ZOR^E}^Svjq z#3zs>;Hr*Hxe-2oGd&JdIklumOI9B?oR-t)6QXK;%-T;AU|QBC1*{Q?uOxL$Sl^%WT1q}Ym+qKOH(Xkn{d?yP+7qWQDz8Izy`H9s zJth`CzGu4!Q%$N0P)g@H#2(KjX1K|U)1pLo<@kmTn_s>wVt!if>|t+ImGQMz)`5!C zSl)f8+(Qx0-|mgQpd0uAvpn8R@MG5;~{-;oy zPfs%oYux{rn=1lr=edAYY?r$NUV(K+Vck@Z4}QKz!A?3N+9M)`$hUhZ6YNL#;}?hT zG>3heu}oO@brcZP2@Kfxl2jVa@k?~LRWM0BS!N$rn&MYC7nRLRoLod?T1m1B+|`O3 z(S@WEooO7K{Fc=~$YHHu&*+h_+|21UPFUV%Gx08MZ$Sp8osHD1h>vuW@ir(tpSGNL z$ITjang6u1ro}yhYGKGG?R_^4-F`E44#}^yeTLYb?HAK+&ME$`;p=59{*ysA@q3fa zo*BP;%hCN|R5zF75#}^_<237%0cuv_$sC#SlR4=21~hS+F|Cy%^MQA2;6j#*j z+ZCCydjSn(7_zHF!w$&go~1$b2kwAhWf&7;B2=w_ymtI0g8d0nt-fmrf1zq=hsDC_ zej%97`uq{N0g?>*V3g|U=xE9eT@3nnhId_*c~PZNR}Z3?sgn7J1B3Xs;dRHrYLxH0 z4T9IGC)k{(k*+fj1oEU#j@%kg75KO3;|!G4rXW+{k&>T2hHX*Mik8-^lJefhXP6(w zZro|HBojz6Hg9=tU{7T4fcUYl$7{#$=Y0t~cMXb`m;9)NojskTxCV4>hJP1dCwhJg zkYxprq8zLK!(z>E;=qq&=o=u?IgkWaa1}VTV}U@cT#uYEv?(wTVO%>ARvu z5OPVD_Vr7Su(9r77fHuWqPh4_=G=vUCw7mps`xKCnorwzRh3n-^Ju!&^xf<%(#S=I z#&_)Iatb%5Hu6(hK#2F{=bc|k`V90}Qu%JNF@jwckKi9-Hht2e=+5uE2>0w^vSGmi zgiuJ0c)#CIrw~pHDIeXvfNpC$Lw{jDGS}KGrkdQQj{q7saOZA+I!u=Zib6Pcdmtr* zc$g)9Zhx#}M9SI7$vr$dI6wl)eDB!f>dkOB5KprQ8>OmqFgg>%=45-v)sR&1_XdV+ zC&X~K{hKU?#FvIT%*>VD9&&$NYZeBPLpvVZn_i|wgCPr+$rW>U(=N(24`#J+ir#iC z{LAB;DgWiY-pgT3_!C~CUgH0-nk8ax-$-dsrV88cc>T{SbXFm5Fzuq%X}+sx_$s=B zsb&4anEKaBlt9RGg5eU)gy1s@8COP+8KbSua6FteWWkfZjnp#E=6p~5j7cM-cZkpr znN8W6zG)3izeW z0!`E+e^zt>JlU@(6b}^dzY8in%(WJNF$K}}ZU1jLTC|tVcUwABX`^J66UTY5^D$HW zm5Mv~3!B!51;VKFhuMbyAbZR11W24~py@HK?)6r7Ndxr;9@npo6f}O5P%7ev#6mci zPmM!gkV*UsgHD8%naC$l0LAU{TZ(Y?*Vz}%-+&L1=#m+&!)^WazUv}7t{l4_OVKNMNIrMhztz!n}jx8%xhpC*IbI_Vz%x<}%PJZgBn1;=! zzZy#D(|=e1j_w;kxO0?2eypmJqXi(Na7lm4%a37@;5VQ5A8eyuccY(QF!LC?%D;-) znq4q$t_Xe6<2Gi*qj;nrxk4zL&aw9yX!l(L{Bn&aP2J<0K;xHjL0na13|X7kdIo)y zdWD3Z5ba!gO1e-<1;~e>X8e2ffDao3&iMV-?_hgPi+Zo`s88Y;S^^K^E^}$hojl6R z>#{{{lBz!eR}Mr4#3h>`z9w6_oiC@a%btS0AS(cbAH2#u*$T|&e*wDi^LhRvll&D= zSU_f5gT4CV)yKJj;r}MKE)JQ_F3Bc*Y=6zCw~2~e?wVM_ejGSn)r1JZK0M&Aj%63^ z8wRFyZ)Ah-&rOXnv~4tcM38myyRvQ=dz}pOxRvqVm#Fi+g5U$fQTOL1O|jOwb?(x# zE!x5F_>F$J2<C^DL*^-eWCC5R$c7#ju_EYgOFZ|fRb|aC4j++z7+iHMEUY# z5YGq}Gg^1Fql2o|Ai9bqd5-+zMO6JMGkgOsaI4n*djs-peMHv{U`N~hZAe~c0t=qt zYMoP!j&N0&PyhLw#$P33*~=_C=NCv;)E|*g7cYEXpjpAS%x0m@_^sSLda^dpGUCq` zs|X;lpmk&Z!y3%BMU7GfegRwx9sr>H}o`4 z^l1{{XqRoKP#wz18=Y$v)|P8LX|2*|SbGheKX0XpsV3v}wL0-UY! zi=N`{X1D$U53(aDeUsu!!vi|$;;~n*e(^#JRQ;rUxhuJpHGAv(fCHWsD#VzIHiIs^ zuW463i=4NZ&Om=m-mx*}C+^5vGyUTPmg|4<1G)lxkjTb|=Sx$HJa1YbcRLd&eqYX> zYFd6_XA3D+s(Sy6^WXEZJ(u-kbDUOpGm};Jd}nz@)>$Fg+Mra|Z|?6+zgtv=fvxu;Qm$h5e_3txusW9-94{mIx ztczJrf#KkVc#$G9a}=;rcP9(YLe)Ok_CBn4nWO7hQLXNJ!sNb5O(rIN7F^#{zLICS z;L>NBV%q)Uu6f02Jc_wIK$FpPDp;R3O07ldr3bZX+24Aka>o0nyS$t_`NRJHpNk0D zw~s|HM4#hojp*wB`K%UBu_`K2u3mkKo^rgXR=PR_k$h~0yaYW_Pd7>zJ=?K2u~Wul znspB%TpuS`1kk9Zpm)h^K3rXj@jfhP0@?p`#N&bj;=q~uv09smlIT^F2ryI$K}+`2 zS)()dg#5>F+b>B>ax6XhbTjR^X*;U$tTffj`|pZo zdZ!0@rBpifEo)7opuehu21S+|zD&253$#8G<((O!{CIo4a)V-nqVLhVDTL4@? z&HJ=U+*U6NVkP64@jB{t@$=(dQG(lZbx~5ux9#7ci>~+3TzF+wWP+AqoI!85$bmVb z2-$?qbXrmaapE~QAbc*q{}0O=+;eKQL~~N+HZNaf@^wzSQLh@h2LaUhiXSVc7S!_f zS{Ty(H7)-*Ju*(+>-?cdCXCM5De8~^K0B)#W~M<0ek)sMT^p@yVEhj&vb9cJ|0}dV z>`_HMqylceWc#|_{)a}k>1EHJ(v*;*>2@;83lZ4*uiu`}mO-fM@>*{M2ZNC)4XVrLHBDkm9cOt zaXXNj$k|G$m(Z@&v`#mf8MbAe!o|rg$+oqD9*g2aeJ^gm#%e^6(!<@Ul0&QSr&fsU zlAF_5zm!EVImyJSMXw9u*Toxd{F38rMU09X;7a|eaUGYD<=I?4uVPJ%)_Sdg#+k}c zWQYvz4E$D-f_flP{}co5D;yRi=u2hzhSJpp^QloO^2U!Obo!RsULC(G-iyYx`_nKdj2-^bmVqwntTt%1-x-dZj6ziWN@ppcVj9(ENvnQ1j|*N zEf^Yc4?*R?jS2?g4XFES`o3D`nn?CgC2_X^)yIq)WIb=RzZ!euEIFS3Gix=eMoE zZ6wR8xDb1>+%D;QtWoicW&kK;ejjGS_2prK&6zVF>VNvFrCmP38Hs)S!x`4r%Ay1` z*LlmJb;OT4dmn?EJlXErrs}^+e;4T`K^n<;vtcidi zo0X-60ZjJY$q9^kWOA7&p^q-{7R~SD_o~x}8aU;Q45I@Uw5=?6t~I z1ZtP9*EAX(S@a3bD-hX#g?5)5hbsubpxE808gd_6)rF0R4VER?4zZHR5kK{HWVl58 zUKdFSzUVG`=Tw(IXXr|70?F?J zw{}AFyzlL@s=fE7t*5-`%Y;7i>HN()xcw2)Sdy3qj3swVdr!&LNe*j2 z7L#Q4#BBcGzxHjk_EmDYbjprzw$=_9?%?x0hesd_t0ePdEuM6%%DktWYxMu(@+Xfy z9|KsT*9(~O^4xr7@bTlgtfvsL(w4hh;GXb?hUqz6Kh)y>S1DOx^G$y|6%=;7To7GlE-r9a+_IL91@{Vv5TC{ z6a_hd9WN}*y!(y%SZ$l%GJaY7aiEPKdt+A%A8QR+vWARxI zh(uoMkrjVqWgSSfNGG~KPe{5a(zw}bBD2%FNlFcYY0|%F;)m6EH~Rh9%%%^*!P0gF zsstv}SJa`1kKmGakirV>DK@Gf!1u;}+$IT{Lk6G?d>l4__BiqyZAt*P9 zcQMTQ=Dqs5zVHbGK9hF*g5p!rVzuw~$h2qVdW*&T%7_3<%=;+{TT%6-OQEtvbI*|o zi_jqNif!dBnTONcX_~lA?CoD1OM26n74mzdN3M6)GyhGVCDvx?UUJR!UKST1UITE{ zgpll_K~G<&xNk=+o-@IkvtK8^#NwJFe62=3{uF9$59MLM$CtmLkMTL{@|%i<8Rivi z=6?VBXVLB%WqS;-DDy4hWxXI0`X`>^wk9?=5SW9W0Q*n(lD)LF#Ha^498{lcw%MZk z$QKtZtZ)1nVgRnvVXWT54s;zYAEKps>D=akvYag^&g;!;ZKc~6jHhtY!4 z>mKitu;sYk>Z!DSqxT&QpIYkclW+c#8qVE@6jjnhIWq+a0dj>P;P z2rvW`)=3b~Ol^GDC&GjlR{KlvPxn6T>tf7m{a?FQRNQ?MK70D7zVnmI($kNnb*s~( z8}!A+)DJ4Cd2kMREYr8y^V#&6t^9c*m~Q|)0|ZnFY)2_Qxx_H{z5whekLa|-=l0L= z^?QuH5r?&_E6>K~6rLA!SoowN28M~s)^6PE0ehv_RnZ9vs5+bI1TUFHlk&IWL(4A> zveCBC0jkU5uRj-j1{xD=jPD+)UskY;s0r>1?6N<&oBW3rakNzz%bsf%{C+d?^41mU zhm+-M{H>u;C(F)8%`GPi#vU_EPTGQ%p5bk;2@!HZqlS+Mgrqj8lA zk%O@NeB^BHsQLH*2be);zD>pJgT_cF3I}|i^tW2ppQWQiX^Es<1`Egp^xWM408?2D zb3Uevb9DSP(GKxXO<8{LTM@=#(@}B;1dKjW+vQ&W08_`-xf>{N zH5tX_!DnuFGoO58`~a;iDJMSv09xG4N~;$1prA4T+ zYpyUPs$-EuD{w*RMRR@_kIT8fPexzRkzJ&5;EKl({{VQ|y&rF9l{u*G=6B@W;2l0PGg>$IN}G+POet`P8Sbq{6wjX1adQ3SDH<=+WzrIaa%a3*nz<0`c$}-ndZ0N9G)DsKQQ#~ zTs_u3TEC zCjIIT$M1dyx{GVeYsB3HXVp(p_*a`ep_gcDx%;a((H! z>^VQBa@IZ~WyE*GaQ^t~_>T3{#Vk`sB!Pn|=tXLzp2kisZYa+=IW*q6_B8FhlatLf zjQdc=iqqRgINIX5i;WA)b1XcMO6&8Vr8J6%64N}wXl@{okTJ*dsUwm0=1vLiUH!$R zGlRWrmcGzga?l))N{8lJGItJwnCwkdluvHkO5+~1)w)x}gK49Y?ut?@lUWyE>znYc zJc2SSF6jRF{uQkch>E)vUBUo*O_SQJPJh*p_Q&!yQt<7Bk5h{8iq#yi zW>tZPSqK;-BRX@=39b^1{-+87azG0)bzR*b>wiR|pN2$vZxRwjv> z!U&s<(>SX3cT!s_kG!XnztmRjw-Gh8a-kTJhy}YI`K)H-q-zxy5~Me?Ktwk~c*hRC ze-T>GBe))i>0IfA%OM4h@T7yr4nL)AXtPAtzCb@XC5SypJ;h~OE0>vWX--=5 zuz2OR4=e{5`HG%Yl4jQSeZ)TT(`HsJj3G4vhD{*{LR z0P*8!2lr$@n^UE#QevsSkzO?lU&eCloB>+>EDr8?f|rsQMyh5#J}K27>&=0!aV6S))kMw`IQ1LI>+o z$p-stJoNI*A90aMF#XBr-}Rw2q8+y_$Ee-ub~evyK;I;xmAO_K?mxn{V7$^bGE+Zf zxNgnLF~$ZDPX5);-;8OtIp-!rkH)g&hc^wqc^TXf(}7FbMoRs4{KK86W3{}rp3x-^ zxEmV;bm)pdl~2ZcBK}HgZ7;7Z5;!yG#^-OA{kYE!>Fju`@HUyOL{6UmTbJ`5 zGr`;jI(|K?n^>#8jkIpX{T_6daFU_(7bGzp9y#Z+_N}{%NG=8>P*1Nz`PVZG$zgJj za<8=sCucm7j-ADH@La=mo8VyHqqzEt6)THIo#&XhX#~*&%^(&V3 zoqpzX$U@BvN$Dy6vHa~xg9%y zoYka@Yc%ox@eTm~@E+c^ng&2U_Ycs2jajgH7g4o|ScQGX!015r{HvZ((X@0%R&_j!QQtv~Fg1Nu*<)(>bT;x>M?R1Z1peGVhL==m)v3 zs&S1dxig-mok=L8XTnE1w38muG5tsMuG3EO8qEs5;1QP3%)fV!QPfr*ousCbEYgWL zt3*^}V2pEFc5Vf{K=#S~0j?^%wHuN;W6cDUJz6^2@Ddle(R0eJ{jz_-_7IRNC0tPUl8ennfgY$0CM87#`x1XJv_=A-RA% zN2#o=X>$i#ytje_ZqcmIAmJEfeMqlAeG#oLZD-sL>ChD&7biSc?ej@*GQ8hBtV2G1 zyHsm2ywok1A1cbEFIg-fVH{kScIw-Zl`~Brg2$H(&sJR8yv*B{W>7rnb!h z+W&(?d-x`E}IIyzv|<@>nmJ-`{>0@Ls3!{HndSm8xp83!CO( zzOUCF!=M#uB+#^PmfU@|&A6vtbZROGnQ~6Y-hc8z7+lEhNVONGDtr_YZB|jo^&~f3nGpOueEIWJzX?Q z$YfHilCU84A0Vu&PBNqJy_t04)lEuLUe41=3gI@Ke7$k?u6I&}q>F!2IsX6}*B|l! z03h`s)!|^%uGJaM3Tm57e6DGjJ{Dc~^T*xooPMIG@Qznrflmj@bw7d{($Ms4n+;{z z)cI`_Z9jyINR4Q~`lYI_8eJ*>wUhi+o8qWE1 z-zT8==BJKLHrhLZWIV~O&=Sr#Cp$p@031~-xh8KCO&NAE$8^P0Culpm6(krXN@8>BcG;CA}fE#1baswqhu?6&8RDG$!y?>F=ueQK4wFz;W% z2j^W>dRPa1&G-t}L`c*mU??2`;8r%RuUKgTmSg5j27ILIKi)kT@#osO+^136DCkj) z727PqXKQBCO%MscmtuJ9p8Nq^&aL9X81gi6y@}dpBjp+X=ddE7>e1M}6SKsu=PX7^JxT9UgH+&e z+^^EC16WCF&112xVX9r}&%WKbJyi0i>OZY|7MZSD>Oe=IE^qEPfA>#+=U!3`NE;lE zwJF#fQ$4SxMYjOt^W4`7rg)xvd_#YkW9;9?Kgapkac^^PcMzJ{!=dg!ksYeoTx%>YB58K@3;u~Aqx3;+* zO8NoY>r(C+3Qs1b#H7z7zR~V&7={@GxUBV_SiV>JhwEO^EHTP9xXp5!kA~xv7q|II z{HW&XA^IG2a-^Sh^XcBE%~QItxwVjoQZRTl$Zp;}$spa+29t&LiE4e#4AZHQ$sD-a zdG0+ba7kt!^^-;1L7KB|b#rF^WxJI<{SVYtZ1rRGr{oXF8aCJt%FADZd?ncOpV#z& zCU#-lgO5>N4~aDhuBH1ewgRsV!@2(e3g%;tV^SBtHQ7o!UG8(#mbO9}k{P2eG8mEi zb*lQKLdu2`4p`?ON=u$*fP1(8gHrvD3xVcBcARu?TxPm#lTtF(rxPMD(Xf$tBD4^} zc09R0SM)vpl^l_nxPCF#vm}#w+MPe0X>M&uzb=LO?Bsyw1gIFPn195&1^)o1&;2TU zJE@fdT@CB&+<%Q+xU}C$=iyM1fmB%vMz!O6bxFH)bAO7BCq(!0YNss!~ZTlI#E%>Id+k^*;5Xc@sUc zRXpxfliLQe$wiBHNQ=4tDG&HmQ?pmZkwlmV0J&+@1=_h|!` z033sX*kY{D!sK^Sf0Zd;oNM7T?Cyz$lH_lWARBP|%l<#ktKB>;WhsraT1~^TBk4_n zfU>&DxGP423Sd;V>w||AyT%L;p z{{ULbw@HM4Y-n5_!>wl*XqMI4xiajE+CT2VDuy>Cj7C*L^&ETE>-j>M-GAqTV108) zR4$t~I(&=#jbj&Nn>2d1K3G;!WC+Seq@StAD-tMWXOiW<>p29T{XoTTESOt(4@N=B z?8Bv1ZX$+0G?}prCzFA2e>;9KU&eY zJFjBL_X+&7RBS)wA8_97{{WyG(P*8#jNay^o#LsZQ3k5Me0?{MzCOK=^RAsOEcFQf z+oa9VV=8c0(0Y%?ytGxTDX#6O6InTp$5K5#`yZjHtA|hCi?bCv?P&Eq6YaX35({~- z;P6WfHZkfrH6Mfkiq7g|*~k7mwH=>`Ai7ZotbjK`ARK-px8Yk**}|C1pLFKEUZ)R3N5jTsy;g~c zU94OVgbtbfO?3Afo|@OMVRi&=gkn$OJqXF_G4I7@cxO+ZOx{PrsS17h1pY#|Mwb+K zlixlXNn4LaP%r@etA@Qudq>Q6QH;3~Ms3EH@CB9w=10KJtQdya zka`3BvHdCfY|CM!Pj*m9Jk`p#MjR<0tyx92)DwM!;DCR2+z?1TzaOPOUQ49375TM$ zkZ>cA_Yr~r0FKk_)SoEe;5%gY`B&HRrp+9Y$1reLjC1r+T_%MdG{6{SGqK0xii(rv zg~tfqRx=^Gn$a3q*!+-&$6|5bx(h9G8--Q5#B6xaW5s7`_HoB!b9EmXj|F>i(-q30 zV2}a8B>r4~g+yZ-k-1WngR#|1WVh1GG{pVvElfjB1BP0>3})M;!R3~z3c3ePEpdtTEEY%PyWm(zxUQZ z#*q%^BmKYWn!9s-rAdD^rP%VEHs3R|V;IYJ$Gs%BFK-|z^Q&dU4uA#4UF?!-#9LdV zIzDgU_apfOPquH}#!pF|F zY-F5crEwC?EbB8d5og~k`6iV(!8?zT~k+UI+0%f5SD!Ufy47h-SQ$k>!_I*Mw57j-S-z)All}XDtyfs;6|dJpw-v*xg?p zH%>ld`Eoy+N5~2(I0J&*kEL-MW$oqXh-_!Pl*ry-;PhOB&~z0xh!uQE7QwU_<1Y=DI1;lh%K6jOs;c5o{c#><7|R&)~wnt6QG(*<)J-R(V{hX2}RKoa4Xa zUL2n!!1oLfLJK*c8mp)K=nMWM`L9@aKr5)X(V&d(ke12LJ7dNq1#Q`j;12^71%}+hWy__a{r&!Q;KgfEYVOaM%^^8{{!qtTL1UCcjuF;dY z{{TT;HQU_Y+33EqWx|ki)3@PO0g(?Ci;9-1nyEFptQwpes3pKWKL_-yK-Myg zTbd_wz%_2t_U6i8I@QWId~`oi-m}4{gHloGx_63g?lBek5kL3G+&|%6K?>{Y4qltle#xw!`8H! zK_hVKOp+qx4Zv_anvjg~Oq77TPgdYk9nu`P1Fi@4pkx;oklZfW05!&HJ{v2UExY!v z>v$*I*R?4X7VK5e7n<5@ciP~i4rvnU)rXnSxUW~d(=G0htEjFUQSkK8WuP0E)4fuc zNeV_Nr}Q*9bwg6_X?d@VW|MjKs6$fj ztgL8QGBX^pC$(x>Yd3ayP<+V$0J`7M_N+|NngH~RJzmcD3a4YA;cmZ&t!WzaaKv=2 z%PoHD*aVyRs69{2KOga`OotxFaO|k1*nj}ZCb%7I#0GuV)@Kp)E#1HR)gHI68{jRi z!ASbHdXwq&u1-RGcdg-1t1^_j4J5J6E+_yBb#x;$I_Dp1hdzz`so4G4AMFp%V5>sd zT+6vg-4}27hAO@p07n=h`hUPb`qig0*j&9z`j4AE#CGfR5}Cm6dH(w2jDYKjt~X_;+#`&G^IXm2N>H?*Do7HOo!wg z^m#7b}nB>I2#{VSw~DBz4m5Wp1@d~)W1y^t6 zE0)&X*7o64kP4t|cNpngpW0VelUpQ2GBvDh$lVF&oc1-tQW9}iXH7Y!Cv;t(OAjcK z&jA7f+lfH6kO2A9)W^{vw-yV7C_S3E(&J4#afLaw?LH zl9|xpq^}ba8zh@f6BCD0*gn9Tq+m%eB7w8FWAywhawRe8jI1$+fBgv7UI5i2{{XIS z`hi+PZu0q&D61mDiYR0G6b-A4_s7<}>N)3#6pe@t!5xlk(68k%+DPNBFh3qEiM7+_ zxs_u<%eDqUHQZb?L2ds!}I5kxuaPhdSwZ>@^Ln-}purn*~QG8;%lF$|yL zZsgNsw)U=in4V{4v9u_1txjQ~#dP*($?&z=9mKz=0<)%v6{9Ea{3k!Ye^&yf%bS&X zpyjpM=jqVn{PRxojM50lPN(Tf5H0erB=P#z+FJ-C=kFe-yQe-=nlZXM&klu6HI;ig zAE2wwwUuWpT4*;DrwoEdQ|LhAvuwOiZ#9#(>ja)PCmjR&W8c(QnCQxF&OOfcRxwI1 zvCsH|_s_ojI-I0Gt9SnZ3OqIuwN{ZiQ4?c7fUGoEx|`=eGq)$}$*zyX@vJwKFz6z0 z=U%MRg*OCnLAg}s4L@1Ew2n2G_wly@Pu?F!^!7E=X2V*wDu*l8lyJ&NO#c9!R~>3T zOI_os{QxGcSVeSJHn0bLX}s;nAhFJUN3~&AoL{`OX0V%DJyEZyK$bd8cD-{T&%QFm z{(`Zz%{obB7qS8Y$zI=$Z#}i{t2!Il{D_brmpq*HKaM{tv?p6xT{h)2j1Jfxs~>9A zd1Cc76)uT6M#yGul}JC;UbH~#<<<3EAP6tYJZ)GY9G z@{^AJIIOK}A?zYk_aSD-<^C0%5|c@nH)V8R)HSO+jV^d{W0a@Lj5?h5BZ|QzA7=U= zH_`yhUm zH-;ns0Evq~q(}82Rcn=WhT&KhW@S(hTH5f`8!lvS!Bu};{{Tw5jVf%IFMSx7_U&_Z zaQMoZp9FRwpPW zs!gV#_7rT>k}liodQI$}RG5Z!%Hg;^hYirvrP2&re3r;nAOqK^$MUZ|e7^Y(GRO5} zTGo1=p{IYVeeqx&jmrKV$Kg>dJ6h9YRg?IUc4!>TUOS`WT|MAGqh8)U9*u(Um!on&DrztZ&qrU#*IZzu z6p}gIn|EiSc#VAhGRHhCaz|s7QZrfleuHsv0SmED@i%{<>T9Kv=F-Pl`lS|oNJ z{{VPMKQ+y73UP~Xsf?#5=ny` z>(nn31S&fDv&WBpqXYG;Pq_^i^ppPp6&eCQZ*LJqi8qF0^D*29PJnY>eK5P#ZcO)b7dY?R z*babJ_l6-Bn!8559tQmgHJii25Peyqt0_r#F)pl`FQ-Gm61W}DU(%|xM;=x&xb)9& z&-x1N_1zrIC%uixAeS+px_y5h{MR6{jt{kV(yFH$oV6*qyE7_fAnrX*O?yVZLqTTe zppbs3YsfEG5rg&qRqYqHuYY4~s6fF+B>HT}^{g>+vx9zSloM)69NZwdRrP_u9;9No zw3{hy;a8vKZMfUqXV$IT*<0B|=E%SZ$IT;u^aQQC)QCMxUvK>dJnEnnY_JwHgk>LH_`b zn$?*IU_i+-kO${k`ba<9Q35}TLHZipbQ{#3(-Hd9sO>M2Fkb1EAR-Bg{o5!TRkvC@~-QsvKxO<&s83utxKw+icoB&;avjg zSU>iZepMmlHC3k=?A7wNAj@9_&kMM;n%%ZarAK}cGrkjMI6@$ zsQ6}h344E;f4X|sk*m@~xb;Q~Os~^}=xR`Egpj&6))*p$os{ivYMc|*0+(|~G~jBw zNUk!bq|Ic}X_Kq6kjh9SkVjEnZkghlp~O0f^Ar2y?+>r9^R6@+T+-MYPjlIzxVF5E zPi*TV`i|bm(xhc1{{XY;UOjDhac3x+*~&Ml@AVz)wbT4p448{iU5)+q<$n>>Ra}P_ zj--vv&j55Dw5JP}=}t$EWD>-|)ba>96w;?8o_#Uen2><(86zChGJ-H@>B91TXygnp zKU$WGFtrU5+VOZ8Z(88>4Ho9mo;N7(Ub1Q#VMzuYW~DbBhoju_RhCFj4F3kEcDk2`A)his^0(<+E#{qbXx}=O$3t3PGT(637PnI7vtzntJ7pR7tBT=6ct)LT@$-rD^9eJ+Q?HjX}*Oie`-D4Y^;8tw+ zGE9YI`B!N^=a4GSqiWDdPD=(H6W7xe%WF2cIX^0Lx%KC_%=vEaLJZ@sE339$w(;kWm-^M#NhFY| zUAEaeuN5KKy+%)^Ftz~;+r3b_yYdvOV7@cYVg7noG-BJ(-c2Mup_N;FCk%Ubtr%|r z1#SUCJN7l3VLO{ht`A^;lGe?~8k&#p+D1R|!Cg}LW9j}!Jbor&E4)O?r)!L`BZ3dD zcKS}V^Tz}ipEJy@h69h6`@`v6M&FYP2P2>@Id`ZY@CSu`&MuzOh-?j9hgtlWFL5 z_jc0H4$C%NH#j{H(2kXc`fdDg_NLk-P(V@B9Xi%^js4B7)yI_Cj5{{N_jzN})9|j& z&i>l_F)750)f=zj>MN2_oh=rq-AXgnoP5^zleR88e{^)IVSvEO%65=I$m`y^%Zowx zlztVBbb>vkjQrow(F)w!3RLZ>X3tSsncFR*R_H#~{}wZc3YmQ=UoB z;MK1c%S0QiC@sg)vBfHswY*BFQS}*d9tq7Rs(il+?f&x*{S2S!R;Jk?${f{wZA*B5 z7}u*he^W}E_v3!zsqniTUY-iKoIi(wn%-F!UYs98R3n5!fftqa{{R|$3@L7y83b2k z+LO7@4|N;YKfCa?(e+mSNEPMHoDTRE=@*XQ@P<1`a?YbC>maTg(lqNQewnRsua**i zW_8u%ku9Qakv)k&rETd_7$Ca27|KJuXQp{IPAhEO#~O8P{{Sl0I(5aSn|Bia@t!qR z+tlN)AB`%Li_!JB=3F4wsC~TJX0XcWMYYEyA^W6}jyr!^*3mTEojl050C1|Ifyg){ zpXXeSuALv28eVq}M{3`*yt}l-Nc-a*75T@|^{gu;X9ztFXKF+G4EopX0% z=VC|kpXXQY^-(3A-lHUV5jh({>JS0f)};?)tR`)r<{i2)`ika^B?jAC8_G&cL!X_b zjf=#^Sx{h(2;!fw5Oup~k3k5};z_GFc5_6{xp-^6+@K z)TQ!gJxitYENU0B*j(E*WR=|^Dh@IUU+}FsyiXBzLlZKPa!A1#{S9;4#!bzlH{KBC zzNDQ004jJL%%9YswIs#?1;e-}TM zd5iCg=*?orHXMSdA6n@2?-msz9Zf&rYCo9&01D=w7D-+jn?|yFNXUl9<_qYeoeGm6 zJpFxYPZPQR)J0ya5|7NadIB}I+(LK?$h|=v^ZgBZzldLUy&xQg*gqu(wxLnZrR26o zRbZhF3L7`Fs`~!`E}yMfNk|)5a66Acd(*9x7?A$}2+!sJ0M|6&m|d^vx%^Kx(As(# zCDebHY&$Yt5ZD+)Agju>6UyHkT~_00Xk4a4dbLpHqtD zjlaA@k4zC=Z;n&<*5v;Hb;smEt}0MgL~n8Y>(G2`qjj@?wIKZkX+0{#=0tu892A5X z3_GAdl|-X9!`R}Syf>D6XCF!;AGvYp)zDyiEcutg7VZ7f8UFys$gXzG{{W-{d*?rj z8t5(0nc!jm&Ijcvu6oFSq(z_NE1$Y?WB>3nBc8t5*%>UPC7%Yvca-Y=26oLfEqnnY#-pb&VmBi?ehbf(1HF zR?5yvTTP43mD_Vj-*gr|yW{Ek)l2Bquae^+T@jC5fmL=0;&JEz{G_SnPjb_?#MbwB zHyYi9_YxOjG8}YKmLq}CQ_AhSxsTG|pXXGqn{D;1o|4D^0HK=Ioi^&1sz*tVKO$(J zn|2&aFzLHKQZOpby|}j2p}AwWFp>vjz)_Aeezj(MsG)Bu0hV9xFK?;nDT}4uU*Yuz z`3E8;;YZih{cDX${iCU+_Dc79q?e_wbk!`ZFwzm*+x$&M4vM8fmzwFKvx*ejfG8DK zS>$qK)8q4>rsKj7$G_qE(o^Xj5IFUb=bj?5YY7rQsUR$;zZ?->vjqNLk85$XxoD%n z9;HWm^Pdptnv`(=0BT)H=Mlr;U?A;}YV<1+yFjq_hA;gFwyz~BaCfLatB?e;*qB32~!9FDcl*hTh#65Aml`I0jnb_6#S z>`=oTN)|N=J*%4$EmK{MsYge1A5YQXu~l~YW zS{nv?32%+=svYA48+tlJ6pv$7;jP5xGh7&_f~|m4eC3NqwudFOJctKK)^5hzpJC4%v?_QOvcyFSt0_9S4Z)$qu}WpU(&nPgJ2e(8(z4XAH22?X<#W|fDt@B7 zjX%W}mq15(`-we&g#JCh8uM(@=7BVs?O>~}LC9g8ia?=87QC-c)^Bvvh+A}h(YYV} zZ^FCXH(s&SaUOiBf4JTLhrI;a#@5Q@FK;;daWQ zfvd+9%v7{mX91~rY>dfk&$V&#Lp7_B%8}PK?QFRitb6?`3$*!^XV<+7qmKInihCYl zmrC48@}JVIZmXC26xQUj46o~0U%rI#)6mw5Mq0$1xb9h${NIIDn6g>VA`+~x83b@a z!KpmYF!aF#1X4<**<69xq5U&mQPC@yJzHpsTbI4DN1v8SHsp8XuhysY9W5XVNCY-< z*Qu(If-DcOoIg=k7-rhr{s;W&w6 z7{EW>{{RD85ZrA(RQV&OdylOtUvxP3V|3W#iZ`9`tY2U)!RgYSBFSqpp3%IyILDH*P%k`iM?- zoIc>XdPt{ZYSE#09I?;%R;;#-Bq&#~JbKlb)(eF5?AvscQk|CO){JB1RM{Zf0pK2e>neC>P4c?`02e2%bx}38qJ~R$!w#VEN7R2> ztu#)G$VLeV@vDVKotZL))yN?t&M4voJrw8SFTNET9$De6U#ds{XrFDP?4pOvmAv`0Q%=O zUeOtnA1rRcE%*XOYZYkfWi4f)buZr9dwIYunD)Akq!V2Y&Z%o^$b&BKR0SMkcXOVV zkPY!#&=$9o(JwFZGK$sum~et)!0N;S zT@|rJzls6NVY%!At}*>%AN3`i7a$93Ac4djm5(!ht>zdWouI9AUY>XJ(;X&Lo2-%bW0PC!a zfPA;XA9cU2XzSpJEF<&>^i>shPEolJ;bvOTX**_5^l5k-y2i(^Uf+#Jb8j`W<$xLF zcT@QGsZup>l#Kk#`2`hHad~YK7T9}sP+1uC&!?y1R~uhKUfP;Exhvr)hfU@%N7R=7 zmCD&7yd`?)wRL_a9$$y;q5lA;k&np@aVfLP=Yj$0!L6|B^!{v$uG1!t_FG%CEx8+4 zsHtlRHkRk%19?khI`08x_v0LxchqBQ{XoRQwMkaApoDbmBGAAfRc zS8e;JacXnnTZxbSwV0pHz^pbbf-R)07tZ0q81z4lZ^aac!ZAe{C8Th0I{p0r07}G? z%6Vjp1q5x6a~yOAqMViGe(cgo>2Ai}mEt>=O_%BBpg0l_y~lDo8rw^2JKMvn+DarW zy9gYC_;m*zjdMcTVgVFjDB`nXSz(Y(1GG#4`IO-L))J)|w&9_osN-cVO+8s78t6%m z)d-^}rz1bsuf2>#a5`5#ER)^beWvNRxe7CYI0O7D^|j;Mjimg)-9F>jwOr}GRcEm< zn!CCox`Ci14poK^sH~fkvOZU!01tCrRm;OBp7%<63=#g<^{#enQ*80)uMN-UYf3V{ z`;%5ZwmJ_EMJ>LnvE+sFnVfbf7$1?WEnT zbw17i05M$NNB`2~zqEA;@9i3M<-}x1RZamL_VRj~i~bS&yNl`CLFJ=J7-J$Xq^d;~i0ertav|E|>M54z5;RAngO8}L&W9=JT4> znV0*%Z|K0*4WAb=4@Y193b*_@iF_${8+J1f{C72(ZK!VmSwN$2BooiBIt-JF;fr^g zOR3W(@U~I78vy5!#2>-PtJkP}{5SB-NB#6ORIdRLE3n#KnXr3hv;AvBP(SHY5Bh44 z{{W6+w0#Ics4zv6bIB6M;Cqz^`HIVNd2tle{lErFf$DdDooib0cK|w#@$u_{{{Ysj zXcE>k(=c4+i9Y>mIqlO@)NXSzF&;+alCvoP0LOv;rn@_hF6v!o?m#xi@)8fIBOF&9 zDxxcxPGd=ssUrkuCm)6@)bHwhDhj7W_xLSAjj-=JJAdcQ!z#il7oSfr22cbn&zK0yt^C|>-Vd>hs4Wic=kGg%xc6egQy?v z4&&T&TrG-`tZBsY^W*X?D&Dx5zm)o%gXvgJDM=^W^)`!YE%~0ljU1@5#KDnWm$8M)`Kk2JfT33i}baq^iG6%tUv(S;rUqkKC{c)(NDPG)bMJ!YIthRqg$KWUbl6oHr4s!Jy7)gJq>y-j-zR*Mdn(zNc+loVf7W` zz}1U;nXRQ0K;<2J5lBrQ%z66Mdv^Swa(mY^rTCs3j6{khw4Uc`t`U+6wwg=tmQaWzOCmx=(#sriLR|N4c=#qr$2ao4}ZqHyF2?!`25RB1LLUZN7Pr1=B9>u zZR8U`#T|MP)`3{|gG}kiQ(T6d;;7sRbs@C>0MA7nej~TxU3xl7f>@Y3o`f8ONCd?p z6#6kz$|_3&NH9ig&HP6s5KZJ+;K}@F)BgakT?V=06^nJHfy;Df9leM6*8+0vSn^G6 zN|wCL%B4*?QC`|Tgy*T|v|&xr&JRB_{{ZMFpa3b{dRB$3M8Pbboxxvl7az{Hs`Mt3 z)S}QLK*#|KTt6MS#X{{Ia9bG<8E_bM1Rnm?rruh%#$XRz8iMZB%>t@pC|r@>2Lm+` zpYsot6L4qI^biG z>Urr(Qfa2QDJ>d%7_kSoXO#&JA3{3t0X)}973?=7?AMqNk^$`4^z=1GYdGYFON$fc zD~9=f@s2;js>p$-D#L=(56l|QR-Wa?@igu%6+TpQG`us;DSNO=x{;7^gL9xDsSG{rD?BsbDNP%+^YKRIQ;8f zzR#xHmpl%D4y5)2)}&}*)79^8Pa}bkPQZJb=A@oW$^O$n0DaZ$qx|(XOW)U^H_7Tw z^GNJ&XZ!3vQQ1eJsqNEa+xeV4lPSlr=Bq|f{{W=V!h?igTC}0s_SekD^DAfY91p^+ z?9Ai6#~8$qbPsu3`PIAs0Nv_$E=J;2P!ChIew531jyIM^8;eN6SMlpWCEUv?%Q58E zP1;(TbScJo6CQGNpIp`5I1_w_2ZeL`Qblhj44{0u&JT0yJu20cBWgQ=z!9{(`>qXY{MKClTY`oZgxWD^gp6 ze289FB>dSYuleGwX}Z1S5r&yd!o=Voya(6(Yd2HLvxOI{e_HDy(j=L!t>R!-c!P$= z0Ar#0R(y_8T3oJVrMUSm?KOLMdo}_>2tB#Saog)vd`K{DNE|A;`g9c7G+E5;EO!Fc zqMc#R2@XlYU&gw7*jzz0vPZrM#uyG;t_}x60Oa?q{f$Vtw63)uw2QiD54UWbcHR0S z)OTFl@!TN&E2+59Lt8cNqwXycVHp_Vz`^I9f~j3-cM8_95 zdfu_qQp)e;A<{@#s{xFRd)60}q?+@6&c--TI{TX?Rbd$e7~70z&@BnIi8dRKarZ6tAWrF)K)$#3E9Kg(i_Fxee` z>l&IJQzy&0OoH2YDE9-A`1Yx#h#f_*D_wCfA0+fSBs`$TJ&jCC0q>-4HrszKU1p*oO~ytHSRx&i<`g#MK0UU~lj zXnsQ#*tdno&pvB~hB63Tf=^+{9lh(F)U^AH8>h6J8<)7~cODPoD`f7ujGETOcL;vR zWo!QcJzOy#kN*H(tIUS?S1@PgUOxfWx~Oz#y1a_!Sr!|6P^-DWiSe8$@5eQjYof_6 zv2zu@#BQN{-#uFjs(Hyg;QERo2IF=8TqPxY8@eFisiFt1@EgXPtIbIK6O!uULE$%iotMG>< z58eY9tZGHaMrj76v4J~ccN>3*{{T9RfBQA1C7jJ8Fda!XAJ}H9=R)OY|I^~H8~p;& zzu9sB0FTwJeqx%<#Bq(%7TwQ42ps#G&$=vhn^q*}GJiVL*H`{0GvkgUZ^vk_J}Xu8 z{LZO88HkqcA>Se1$2eotj@5P{w6=H$2OgYrO_7Xe<^KSC@x@nnX?SivZr;^zQg#+t z)#YK-9la|ic$o^yKDD)N7}<_`pXW@vg$xck;D0J{m7Rpu)y|{A{{X$wZz2Blj6XE4 zUrKNiN6Fzseulcw0U$P4N_u&t{{TR)OG+OrFJmA0)=7KS7ol%xm$fol-6n2BXCI$h zwWyKy=>b2$t^WXyilM17k_g$mD}Oq-sxSOZACvbJ{{TQ*aa$7J<(4le*}@R7BPxa? zIQdD=DOxoV$j!?SmjTrYD)uLn_kip4rv(M9f9t3I$Z7Jf75=~bFs!>8qYCqjdC&bd zQ~v;tS3#|5H+Oo2-^GVl+s1xjg&ch=4*fv3xc>mIqyGRvuSrw|S3lifTbW3wFS(#R?*8K3P|NgKu20u9Ixa2syihD+yVXO{{Ya9 zSY;Vcss2@)+^&XY{ejeN&8RzfFv-Sv2RsUh!5y!MZ!IEi=@Uqx{{X;&Jw44**RO72 zzl%Q+^-CJ@t(u!QRu2a;SRm+wdKeDJ6#GbMK=1QCe_)Gaz1H~vi|_=m8YVT zZl_cI!T$iER&~w2HVY|0-JB9}({LlST~Ip zInA8+H6WYgLyc z2E1Gh9l(%BAlG~0jZX6U<+i$Q;vfpK``r4T^jMaxbr>ozqcs-Yj9l_fTfnAm1+k} zsII^OMKFO==8C^_#V>Tbn?@o<9(*hnGh;@Z)HXr*DEk*D~Y%I^`}e&R#N%zjh!J--^m*E~pO-Djt^Bk1lrx3Kp9 ze@f)pK^Um^iqa5UnN8b42{b6cr)?DAqPH;^K_ddEwYiSU30_ckeWPK=@Payl_3A1m zP-HpmDm#@2O}Hno+JOBjG@gvOwzWpB?WvkEaRwXZ?aoK2tce-YJ82_gqzQ0GZbt-n z9-^P7-Ax9lmP&IJhXqe#>OBo!*5X+1U`6Oer}AJ(J@JgHpu2m029fj9ON%X9NQM*+K$@9S3m-B!Y0_KdG$f6!CY z?GOI|pqeAe)89YdQThs+2-ob2gQ2={{{W6tRRY*Zqc{?%{{Y8LC%?={sdO`Lnf~hk z03%v=Zwt)uHbbf5vD4b9-JllHk?56r<~3WJhaEx3=SlPgW<<#h8>KlLSx3K7TNerq zwXy#Ir*1yD2D3zK_IB@-BDLl~ZEckF`#AnWrf*bSR_07{O=x76Bej(SbI{>4gX>zq zX|%m`3_QDlra%WOz^^?20F6+%jaSXVKkCo^fl=6?8k_`ow?Fy`s&P_W-ATJmBNQmu z0rVt(RelDZ!Og{+Y#@Bfc~&0ct1Mu`4o@J}_d(>ydHcWNTFbE!G<-ps8Zn+0J>YiS z#}$d?f_$UU_4*3vHKYb~AN0+ConpwiSx6_QKMKm1!jYv-+Z!qgErr8>8!Dje7eCDP zt2YveZlav<6`iy60-*$rJ_YoU56IPfpk}(mlZ-Y8rYlIs?_V+-vipk`tjwlU&@O9w z(%a2ZET44p2d!m83J6#X^aJqXy0lOeXy_}C5i4wT(pTJqUAV_;=cPHC zX6%A3l%C(xx~olY7&I0|U@qd_9DRQ45J{|b!&Y8 z0C=CtO?3LaWBW!|1cMw=l_21QgIyIW$xoGkTA0F`<-0lvbr^=ZB=TV(Wie;A(T%^a z^QrATO{ZPF!g3>c-1#he5W@iHw;gj_q!Km8mS&Uh?Kva4>6*es3moh^l>_js;Z{vM z_cWC#-5rOB^mw%xt?oR-zBV~ba8&#LRW;4TEv?(#ZvEVTSSJUKy=$AW)UK^=V6#KI zDHMFI&OhDmKb3Z~+QYT7J6ANS%9W|~H;pLD@*}d>ZFXEj^DIBVW=Cbpvgg00Nj|M* zZ+{$j7X-ACviXE?GB`LL2dAxZmr$fZ(K-zNwU-oPO+<$zh2VV@arswTo!2*Gna0|8 zI_PGwveRMPF_En941so?(hQD$xXGxV=R?!A88wKmyy;teMF>(3`FQz>>@!t7wH+%i z;=r>3{W>+egl5lo;^3Tu(Yzav9+^zbARLE>E-Pc@-8&&eRu>qAu%aAB{eNQBfp>!Q&e1n zEv@}nSO2M@vFY>IZ{It+x_f&2M#sh{CVx&%&;0tmyt2BszOlKre{gtod~*8l?EE$^ z++F#vuy8;BALF9J#f48m03;y3jSCOo^EPlQ0zwX9B5DOVv6;*L2O>cvAjSB+nvOf1 zqKLmV=B__TX}QFHJ>0(y?LU$IzY8q*|5s%H8`%GiYZjmcxbvSzdFKu#EhQx-Eh{aq zv2wHCHtt8<|7nl@yGj11$=^2E|F#?4N$~EHkx^4ovr$p8X^4VFHU2-hn|a*elDL@x zkOA>QMZe;n0DqpFI9C+1}VQxSIbOdCtx6!Dh89!H7ReVMB7U5~A zX~+`_+IAG$(@9WoId`YAU+l(r|9XCus3`!jP6Z`xnbNpEo`2r^*qbEEPp09hRNrTB zg~}*kSd8EX&@z{yNu`bEE#=~~&5yf-;!b}U!}TmhlyO&}sXudFa8DNw4Fe&@;y+2f zCF#CJNRAIAQ^8YK&o&;?C56 zb3d)Y2*q?2=f_w-dB8#H*;{Cv6q{r^K8|Q+i8q$_&G3wC?Zsm44uxtt4v-764`sLP z`AkCNDdN5q#kD_S%tk-@+EenQ_F@ct%mFwCorU%xiq{{MCmEW>jz+%cBLp23BJIM} z)!#e>JOtJ0;vIdG#y<;7 z9YYbK@OX4euqX<4@haWX@-ZukSs1df`shK9n+=olYlm9%Yw@RbHY4Y;O8T%)jn{7C z<@wLZDU{}@HdI|S2Jgv5VW18lvN&SaYF7?CdfNSgqp@|iH-N*HfW2kpx?f1LC*)@2 z|IX37DH3!UQ8xgany7y6(OK2pE$`A~F*-Whs zK@b_COa|ZhcMu$kPhC}neVcL*Q=Zf4me9!BwEdHzl&0PnJ2P*WGAV2nzVdz#CY-WN zyqGvFPCajnm`)pqL*Wm8Ktb)i`DlQlp@N1yE%l!*Db`786Z6DWc^Im@WKS1?_+g5t zjZyZd=Q8~$+zzlz+~Ff(Upmf(M#55FB}HHVab5fqqqD)6s6IAuC~086n5FajqS?Fn z7+?6<8i)TOX(tYyW%B2Tf;y285M1!i-IxteAb4#bVyc={* zs!64X7)6!yn^wo4e-D zDBzBp`YUt`C4{*92@uo(nH~IbjvPO~pzv{UNjCy4k*mpu$~*`DqBNt+y)K>`HRY;J zCs`(y(m$f10qNq8jv@oOmUM;nESL1Q@S{lO@zHhhVD^mVKRKUUXKw%%h^bK~=7&EA zaPt`j8Jo;GNu=a=JOEC#gI};o+8v#aJn+qn;F$NtJ=nvTZp@`mBx!HHl%!b zfR{fgJ=zDqdof5MMSJQchB542{v6xORfRC|Umu7U%I+r~QrjyYK;~ceCF(SeDMy1| zU0P%~^#rt?>uFZDc~Kn~jWwiI>V!jD0>GLITZ_q1=o7-;JK^pG<2J5SMAiRWtsKf-BY(HCk(uUU_ zBiPXH^t)FZ!#X8La>od?mht@>r?o+Sxd~g%xcebjD{@hg_zn9|qlTuG>C2wxD3NR> z3PoA4-R^RVsHe4@!s!@RXaA*-T73agRjFt-1rm)eVs|8aPXCg@obG6=ac03x^^*p{B;S`1K&U1A5ZKRn{nlY{TAQ)j(04E=k$7h<{Qbi zKu-WG@dh}{u+{2S@${+Q&ddD2kYrThyRWy)F{-E$ZDeZ((`S78C(g!gy~sZqg%+U0 zEs!ZvmdPd~mMYC@=VU>bgTnXpA9WBTT+Svwblr3R<@2~tF0xZF@MZlSw$N|}rfXo& z$8@)QuNl7sJ8U)qVt#;8avzk^oM2ob+1Kt9k$T~ zHXm(HTR!_XwD@{y`D(enbiy_|F5mNY<_&-Y(G@;!iiZpe(u5D$9SIYH;4t&iz-OWG z1TXxAa_oV{A@O2B^Ujl;u0#T^sFE*=%r^k9^PImlFL20oi!&h7bb0um7WA6aAU7JH zDgDdFMZrZErY1K=EP~*WEb;XI&$$adYS=-Or!;qp8mqyhb*?de4OTwy+IP6+*ML35 zbHEFTy#bKA3k6F`lE~y3CNFvdLs4icQy0TO0;NK&K~EG{awUvm|U^< z5er1dfKgc;69clm&|84LurmGfEm2FPiOFDeH~PgV-HgWgX8jA*vd8Gs;`B@+;+Je5|W8S?)9=#UM7S zcCo@+_<;#lX~};IqWG2()yw}^P5jkc{*n7Io9m5EL%(>5Lw=G~Saz~vP$34 z*KTt^Joq`%Rp%gIB*aTHpJ4C3(^a_Sh-Eo9&+h z9*N)QtXd$@AKCI9J7sqE!VI0i2X7$4^uu)j1j~yaG$_Tx*)kJCSSP#+9Z$n#J5?NY z7NWwIi+$?FcxbIfmNVo0&u*kUvxEo{76 zN3bsVSq#0uvJacC9r@xCvDBWj9TT6O5j|(nkOJ<>vE~|O^IAqN8uHFSCRG9gZvgu| z^}4o}%4(T!s}hQ9I@Mmg36|%>_BRxmMNWxl%1w;8J6!ArM3`Mg;IaCUv2nekvFaHu z6B@;@DxOptwQPGC&KK0t70&6*jG`7d0LY!|0LE6bddSV_e*q04jo4^8Mm<-PmzZUL zaa$L0J3x4g@b$1{Rrd!9_*f;GVn&6>v&6&+%+j>Gegi`9t zMQ>~6<-??^1r%8RG+zP;j-36TD97c9mdSYRsA^8icTl3nfY(D1Lmpsg zB}^y?(k1M<0eD(*p2i1LMnLu``S7d*;va-uL?j;j>ujPc5Chi^!#t;HIbZV&gCcS1h$gX0 zm>Mk(G%1G4`+loEPyMrg_lTKd^n>F;YU%~r<@hNnNG~>zogT-rIBt0Y@L>c^gv~{` z$l|YmV#E{kx(NDP21BV=Q{;~ua$=8Wp|(#1Khr0sa+3KG z=VD*yj&g>1geR0%WXqXlB<%OTi4CfDCDzQY>(?V3h&{Dniv3xAsU<(~JW>+jhO~11 zOiH8;9)}gA{8HW4AZ)TaWZr#=M5aGL9z5Ffz>Qa}6Gr)GgV*KGEv6pD0{12VF8S`m zBhuYg1DlROU7i77zF*lp^o@L6{aQ>76TKc5a}3pf{w<~>ph6!g%eRC#n)t%Z)gV68 zaicYGQwvy~r=R)DezXMIBXt9Kb;&2`NO?+M<0xg8c=hATZlK+HE`G`#6!`J7hWyD5 z;CR!cE5~t!PXy0Myp)#Mht zj%o=GXMss?*#(wfWJI1kn(r!9Z@cn|OPoU9y+4N5^n5xZ?7VW|EQ=)#c7@91w2c1D zrSi78s0*bVEncvbj~m6M6h{3lSPV(o2i1KlEpX04@xUWQ(I_8yF{QWwK~H}m{hvSZ z2_tGnj*Ik*wBBJk`A>CxtYG0xTqhX8;3o-eNe7~ua|%6Jqcs|m@*f2>>0HK|qI(Oa zYW7P`+VTvS;BU*IiTETyVQ}$-IztB=e%XPsI6gh#X^il-S6Ql%D_7Lpa?zu1!@$nR z$!j8)ZSMECcMXf(%_qWpob&bQb)6~PU}X$Z3EG!`g*(^`8Fa%h6Q1{+g~>2x*cJu- z972Q!njOjVg@-3n+J-YcrB>x+O$PEsB|DMq8cN3RJX>|JO67T7g*_EF6sMd63N5sH zN%fqMWQV*$RIi|09i6M6aGd>e2}1_Lj+YyE5u0Br#5=#HK7;}EC_wfMR7s}zD$>I) zIcEQS5Kg;!7)N;C4S;0+C`Yz+Tt#B_&UW3=@GsR%PMPA%%WuzKXht8B9S+++jqtkx zsH6P4hnm@L#{QcLB_R+a__$Po%tck7Trbq=Ju|ZpqvNxLKWj!_yIij3;R%sbwA*JB zK9oYaaCIC;@#f#E4T0iyuXl3lg(oGwjmYPlF6KYR*gvT$io6@}k=jYJca7EMBZS*; z%jB_2^F)HTV1_vD7DGdVXy(zS@yP^x zPS@syT)}NZ1g^p(<9d}C=7Ki}h3@)?woy|!R@Tnvg2v_e#tFhuP<{{&Nmf@x+ME5LqhhJJFpO2#%#nHe3nLj=sgE7nt_wMA! z^$>ZykyYD<>v6$3rOkp4s&b1;*D=z_Cae##&1}k6mv3AzlBr>y=H4maqi@0)y5QIR zY~F$AZW`h5u~%U4W}5!FNKn1Z($zTjYy40Ad}NI}9Uq~^h^_&P{mCN2cIr#m$2ULn z^QU37Y;RotA+?u(iU-(Yx|=Y&KVE!Q@!$p6WQ_1q_}IPk0pir8M2;V}Xk$f}mEhL2 zl@RzH+;W_4>UW36l)re+{7ZN7Kjbr;bV@%1G=__ZR&+2t>TUly+No!;Xzbt8bzL^1 zVa~~qg6+yaB0lL?*geCK({Zy#=n>N;OFyqGA3XvZx!)MF?Nc=xhTfHlvSW_fJQ1PS z7O>51R7Q}q&)zP|gU|uyvN(xp2Gxu9U5v*otPyi9J@_+3Avb|bOg-hLfecQ5-la87 z+ORp%L%t0^aAK3-y`YdXqr|Ma>jx!j%~vmy*XtT-=hZzd zqT6T;zsN(T0vRiX2jR)7fh10a%Ngl{3r3#li&xKqX4^mORV9a(cbP)SfZ5srta6_FJ8$(f zvxpZ`tRdMs(Yg^8f5?PknD9p;bPUE9A?>9D1^1fNHtS-DA;W*mxELNrCB0A~0X8nj zNnh)AtD(frNtml-WmcAa5lX(43>M6fmY%q&trcIq%yRUW`ZXh@YE08*dysmuc~%Y_E-DhHnpBraB1wo&dkdjCb z!#6c?SyN$tAZ=C@f+{4YO})unkoJTM>qPmQ)mmn^a6T*^f&TeZJK+tT%p?Edps4k# zw>Ft5s8n-VMA;KU(7*f?Z(4f2=9+eW2A;n~%poBip!RrL3#K}=lc2-oApm57vtcqV zW#;kV^hqxtyIM@ork&kJQ zKv!}VuifKZqKST;WSi8B8cMlx#Tx)pZ|nElPa=}1EBZHpFA6+oXiX|q77ULIuUA|$ zwe~f5S@>7=G;>uI>p0*-t)QV%tti48x)q(tDqBjez!emzqwZcB$uFSQipOC@-*en4 z66hEDAF1Xmnpm9=Q1?pJ zKDaQHAR(VMG!UX5Q{3>YKj4kpm9P>%qDzfY=~6joC?#G6fWhKuCWs`15S94&RL=>b za4ptlzGLz^F%c1)FqeJ6><`3ci8!`Z2ZsXG7{y|!d@@>H`*Mv`Pmxtkg`ZfJxmS)M z;DBfpc0S6`P+eEVnJYhD=ai$SRp6Tik3)x#6$ zJ%fT~Wwk7%kDy(W6VbvBx@BKaWw#2x{2?ZlA@zl=2@ZI>byw4nV9}2><&weN(qd>L zdtK4?ylMsQyW84#(S~9DFfU8^L6uxleAb6O<}rBz=VZGFcY9aHB?`*K416BYM1QEl zFBgExZfOEU#z(*Z4Q?zmugIHLC0Q-G4jD~vu>t5gk+P*NUGcS4f8D=&HJs%!tes8E z@3Q9fHO*wdFE1R>UD(GD!}CW0|15x0&Fmt9>-O=DA{Arj`y zH@NYhN|9YmELS%wL0yj5t-VZ?aG#?(Maug1)3{Le#KHTpkFoQ7NXic2SPf{A+hjH_ z&MoH~M%sdM_?snpp?k;i5csIIcXE<UQ}h%(yA{7<^h!6(p=;H zPHT)y)Og#r!K<*v=#Fl#nD-D(7j+L2o*sphF4*qyXjU)G(lO$Bp>`Af(XeLD{!xiF z#ai_cjQN1v?;n;R=aEtLTqxiTOV3fsNjg{GW#M1HSpTe#s%e<|2&!4rm80vw#jjr@ zZvcLz3RK-s_}*5zUzX6M-%R{BQ^VDHZUtBQ;OzECLJB>@pc!7go?WK*O2NgPTj0)# z)xo1K-v$wBfaN)985AHW_z?76mSx#=KcQTP(itjr;A-dWGg*{au<**@o}*QRD@WWP zDSBq#1GT~#!y1eq@$4tGSj6O#+R5(XXU;#%F_7$6te+C0@ke%VLcn;SFj1C7l~a!4_d)=-D2hMe}WZ6mL5)=pWMh%+XXw zclazbKpl%{4)G%_Ajl-;B?yV{piyMrZ*f4#>%S*pbd=7TTkYjp_@MY-qO$!;j$ji1 z)tbk((z!mk*+Zg`>Rg#(O$}?o&j~W^b5`h)JLanGcj4E0Lgy)MEvr@%DkzNOfw*E> zDu@&rwLi#yt5^|}-fD8>(76s(H}pr>**{#bPogCTtha>sa{4o(G86plePVNOi5)xk z*G1J{(D^uxHOEC;SpbI;ff^K~7sZ=j6bKYa*^sk1VjgLCzZ8nS2&Cw4+twXXGk z!;O}w;ew}IKKoh5toO$M=P6vacS}zHJVVpgsF>_G*F{Zqe%UAjEib4;eFLB>k?-v^ z2H>GJZE=cap{`!Milu`)Fu@PY8C@v#a^R=}c&8!!F=8%3#+P&m`6*OIa@;j-ijY0@ zMaa)>-M%$D{Fp34P6l@R;qr9EiqV= z_RrextqOOXX8poMS~1AM5a|}|rW9t@D&4-pw~tMHVgwwUDJP6k2uLlerx7_!+&;>C%gcJVF%_64ttd(*6T{*d@461+q}}CM4?+=*9g-i< zDmH5m917F>+K1DJef#b*i!MZF3U`4wUkX+i1IAUv$=uqzy!T#INZYx4BMsxKwc0p( zScXBrn3TU*FjL|ImgBd;3Uz?S-pj*(qh=nL-A`F^J>QGQKpyC^z7WdK{chRQ752_!yGf{0hs%|Mt>~59 z+BoMON=m$o?~Z4&T;%q?y#YS^mGZ1D*)2yUwLf)XY5hC{BF=ze$g)0Yvaq)}PZ9cr zIX-ysRDKxv#qQ$d`%a6cRch=DNKY9ZA}b6ar+T;l5xE}4$b?B{6z1?$PEo~`WYrKB@nz)^K4f1B&dAt_zHT#oeofTU#E~zDbS<`UJbO8CKy)vD1GkHk*(Mj;* zhw@!niR^$YeM9tgL6Vz=OBaMx9hVjIVmi8PiHXGkN%d~Jt&WPje`dtOzsNo70-0I_ z>1`0vV2b8uX9mBlJ{^bnh)6lOiulC%@k^wHRo&h^}NA9U0=T}aNHK$4rCE?JseMaRTn)V0;`wbkALYEEN6 z{#k5bUYFiJE}v1qQrR7GX0}eqjsgX%$nV${l_xR0NHN6NA!F0RHGvl1m-DecMM+tYn;BCfS>C_8BArh3|pmJQm4Z& z8?jp~q+fIBl^#TpPjFeDlOOdNni{sm%Fxy5~sc9(QCw1Kw05X#u zszJ%_nZQk-b4rwjM_Ih`d}|}%NB&A8>O{5#Lt|yuJ3j~4fZ>wk2CMI#ZJ)~n)Zgh% zw%jqgPS5#Ca}RcoOVg2*`iNXC80ulE}izgm=u1vlf!A)9JsW{gn9bLTLn))_XUk3%d*f--AIHdp~EAi>;n; zLU@-m%!SX2WL1G%_Tb(}YpKiw&sN6EzLN#C$X_;sHz^U{zs&vH(O&F`S z2xE(jmrdqorhc!Eu3G9-2fKcIs&~p{Y4UxkO77oD3H+o>9v(k;?t@f{{lEfR|9kxg zHMz2=K@H_Omm6u~TIQ+V&A@^`9e2NV8EY`ilpGF;vH_5%?Oty2CsWjA8_BBLmux<; zs?l_Ss-?Y#%rg+jNJD;QxIe8{CX7owh-tan`^z?(45u_#VG4uY9R|Au`;Z+EiyIH@ zMBzvZ*OCV@!+Mqd#-hc&_fPqN4o$C)o&BQ2+zx?DW)-V24E&Dr8* zUBn2UcF`C%{8m!}A@n07pI2~E4GF1-v2+mU5hZt9D9_okO?{nHTy$K_5&a~(eYA`2 zu26Hwnva@K41^;L_^R15sj_uepT7}mQ0TjY=A*&Aw}KxF6dw)9re}3UJTj_2F3b=| zqoSE%pe2zbh~}6@0_=mkgWfU&YuE=3qd@&;z`Y&iBh*~L(o>w|h&2%S@|@)c(0o5< zz~X$&6g@5A$$B}OnCXkO_cDJDq;n3$S9OK$5c1?EG~ENi_1JMN5wB0r#(9|8V=Vy( zjob}P#Zf-h*Y4Y4^Ddk|&1{od=AzytHvq?gEO~7;xxx$+rCUliMwx$$q_ja$UF*t$}8xz}0c}gBKTCvbO z3i&>PPmB?(^F5rn=`Z4ijgQHmUymU*x)aF4piQI9h+DpY> zbWP%&?@tCEa+##U4^|WKX7Y9N;GD0MsUSDX=G$LSI*a3ai#Y(0_>S>RrvX`_lzQ(0Y@~Us+NvgCR1)% z*dWcQQtZ9)!rM%!NOb$X z?vf$<-p3#3em()~LzS|huuaj)1>lA zypYsyEQnX6Kh9_3JnRLL&!ofX<2`9f8y zD0If7&spkJe7E4Mm70(ga3-h0ZM6q#mhE)|csjNcM@SERx^jNa5{(jUmGii0;XSEH z>C*H+x*N)1>cx}CnucAsOqh=&b7_L=NwYh!MI4s_?YLmxR-7z86o#k?ioB?1_;|yE zpcdyw#cv{W)24KY4ioPm1 zy3q%1b({M*t@CrD06SV_b-qgv(3D7YaMXiL7 za%FHg1y?vw_YjsR1Xh4Z5=R`$5|N7Wm%k>EQQOnAN*A9 zJ;;P7=pC`P+84YHNoLLWe;!_kVd9RhF=ZlCCC0EH4L~-L*s8YCW)q2X{{ELOMx4x1 zA{UJ7f&x~7@5nsyUAAMl_{%;83pmNsgrC(Ie|(iUp(QH!dsM@%Xvp+ro;Ivltj9RJL1hO6C+eEWd zNiD%!_6$>*7zN)nkZ%W$mVOsmo~anGjl=QS2a&Y>pUrj$HKRYPJ-ptKy7U6g1|)MO zj+lp@ISyZFU6%1Qy)qZRE$b@%z5zUIgX4sfev4yq6DeoEPGipdlH=nd%hl)3n_9)_ z-i$n#6yW&8>e78ZWV&i~S@F9{O^rJ37O~e49(bS(6#T!rxU_yT#4LI@a<&N(*m&&onRWl*k%Q z5HYHvYRh?L=s!w+ zfkY_4ez({N@rR%cq!7<44U;f3^KhY}jw_ur>s?HnVWrxT{j*J$Kxd@ zi~(8VBO-^|oPjz%7JtKPt*RcBaq{wKgBdKSN)qJo4^a&)S)wzgP4TIBw}Nu!*f!@PSN!(ezm-ZfG!fwD(xG9VGuJ1p{m^F_+Vc~*}`YenvgmFHBKk5As6+w zw|*1{xtWx{0qaneEGQ`am924s02%1bQOI%Ynf_m zd3Vj3;gE#vq{nm=*i{JF3T zkXY3uZ#nJqopb~trX;yd+pHDkPELl$fHaiY?*udAL;l;P7FSE!0qTLe|FI}4+?tbb zO;-5mHxf8@P$}78oO^v#9>5Oi!s<`|t8aLzyL&4(X_Dex21v?Plm|&*f)5^|j*#QN zbl37h%!;Sj)XVAxiAZ6R9DlkHS`ozclv;YNxE zKNnn&P*RV|T?$rZJ}PS>(5nmne_Xf{H`;{wb}grRQFQ~z z%_x!~Z7{n5u(ACmz5$GA>9g<>;cx=32iwZ*rjIa|67Z>{U^5K#9Zvu~(v&YfAy~P7 zBVcQVpEOFEM}fm50FKV!n9f;@*>(59gIw&cv>n}~L4T`z9MsYex10a0(f0k~p2uj{VBo2&ehbbqs^AmMMV z-qw=fB^{p>cXN2FTT+dfr?ZkP9>ycscnRN}xlFbYH_Im2j`Q>o!UibsO)xp!jr_qeCR;;u*BGg;ZOWOUiy$sKpVAur`y+jUNHx?v#XBV~igQ>a+Bue2dWf$0EC# z|MW;&3?tmbP{4cNc6-~ZwS}&A# zp=YCdIYIBpmJW5uPz7--E63#~(KLThjmIo_CB}UC)|^BO~AD+xh5-_^ggj5H9}WcsY34b?Y<9t5=h)BE(E z4j#Kl-Ii8Tc(E8N1B?uhy|6eN^S$GwtUyd$Pvi4@>g>ScqWf(8rL}#mJ;X8qXSlkL zR_CpVk;h;;gzy)<%q6m#VQiA-ZnKjGx#klmV@?)zucnEny5`sr^Texq;L}+XhwFYO zsk!fM5I$y$So>7}5Y!fY8w$AJj;$12uTRfyQi*|Xl?y?2!|ldr-Ut(dvDTz5iE8q{ z;|Sd$jz0o^vC_V@z5!@2=18)9%v|5>;?Kqa?hk`98pmpcs6Tk}UzdygVO?PkFnp(< z{LpbV+TZG-8bs0Ma;rM;PAF&%(Kzf9uT^?$5(rdlXTY(F!eH9Qbaq7`tV4kZm@QqF zk)0)x>~kVo`-EFWcg0myed~lJs}c^Xn=v#eZT9?XR8^>S%ryaS_WQn-GmjR=QH~Ip z3=Ix3&1s_&p&)?%cJtYvzcK1vxrFjw^eq1MDrkX*yOBuf1McMqulwSfp5ps1e*rV{ zR#(0ly8$e3P@EVCEEi#`6i`PufPa@!J}dsF6VMIbEf!)p6lYDxdAIOK(T-BO|Di83 zXax<}U5O}Km&PSZg-fV1Z#X}!bp8%tY~G{!ao&Tt@3<*Ri7LbuH3GIX1I_{EohXZX z6`guJP5(EiXi?ntqBSk=F+vt~{p$tD1P@oiOUDG3{wnEE_NKx&(MnF^iT!LlfVOiI z8f_apE`gOAsg=x=l2SFf()S|s$gR~z6i}mi%P5bx zQNzM{=dnE#;@bxI)1C#q3A)^trlUgc=}j0jGfxB!T5;J?-H-TE|JHA2i04&US(tJ( zqZ)}mJVD3IxG`;k=LIb)UO-ccnp{XGNpgcUXd0Nb=S0B8+Ful(CWx~?B8@;qd|6wuyg(H)g zCYSDAV8%>+(!kQUR--0aSs#Oks*4sn7OWX8{fa*hd|2Nhf-cH4$}GIN6pQ0CX&?jo zO_bg3(x?^2RTtD+MC9kUwVZRReKL$$%C9??#?3q_?}1qo%u4TnTDlBdp;$$xO9T>& z)0+&Ape?NWXEAPr93B?KhH1RK zcQ(gIt&s7Ekw5Yzm-a*k*6Wz(?Q9VH%2D#P^5^Am-?5X4jJ?bz_OWOJ|)fqN6W@5y$7K$p@dcz zUlW@fqfhODlSTet^Pbk*M@_Aod?!UOt;Xikn7(a$>^4~nb4%RTzxPM;6F38hA_K6T zJ%5^q`E;KnR8NC0OL;DC0HG=a{e78i_8zz`Pd08S-yVWLcPUzYFUDUwgj_5imOIH3 zvOUhdER{{*pUJtkSGjR=O9qRGhzNH|WFM$;KkX8%GqpToO|Iz?x#c*w)5l@SwQg^uNbkBK~y3ZI=ru~=Z3zzTx zo#^0NB-$!}84elEqj4HeiI+7G7_m9mS5O1eCg2hd@QN}NFUyFUS`TkCMhl54Z0DQi zNz}p=;dVFRJYTHIQ{C82+LVS9&rkVA5pvH8XUOLs{pejWJ?wOaNy5su+WqUzkN&iz zo%bvbjQ2@0dTyMAmt1+s}Q^f68i0 zZt*w;K^;2sUJe)bmv_zIj6{+=k~=g(5v6xgME8=FbCoI9wG zL0LUXio<#LgF#pn?;Irz0>@R;z8lp@wZ6aFzufvF8CYP@1Fn@^1;)TRKMcx|b~;vJAU(3!xV} z-Dmo4Jtjv!!aa9VGX!(GD3+Eu0E|KgQ&){n=XoV#;sWp_AJi9?P{3xGkR z<%)WitjGPF`LfX@g%;x$8~o~{c43;1QE%u=QDbRRU3!!6oDzl2y6EUDWwPJvX+>&a zC%y?26X!DjZlXY_|P;;2)$$)*Zxn-`MNKZ*+3 zT6_=*%u8g*6(q|yyr~u7-k|t&^JgInFgd3$Nk4w2N-~2f@gw4)+id*^3NTXPSDPmhad{$RTnq^`En( zr>>rfYJ;cf+qvW7l!(p(ceOyt;r;Af>wE4+uqpatC&5FHEkc9j+E+h1Mw{29_Vopt zVDw|QvUU_e@tuNx`tHmT;uJ}?mH>5lpk&V10&^X1EHy*BwfOUYhUu};(gRli*%NJ-b$xg86RCAFS3(9c2TanVvihm zBrC)emU7`L**IT0ZnpA`&p0n<0BRiG@49f3u?ed{7#+IZhZf4akIN)#d*v{o+N^<5 zKCaU>Y)$|DJs9g({eBHTr`rCnJdYOV>4&tC#Y9#Fe4Mhj)I3K0-y3|z(!W1){So#= z?G(57gAZeR>#j5hxv8s2iQx?7D^hRd-swjUJzB+8ny%{+m5UTdDUb!y03qC*RIJBs zG37Gk!&$j(ahK+Y+hjs`dsFZ$?|&YoIAuxw%T9G=pJnuZtsz}jqHV?H%Kq7pdxGq^ z4Q)ywj-;g+1sZ=nKBw@xWb4i01=3e?Ri#27S1jVbZMZ@(8hE9yc$gy9G0?d@jp?C7 zG46(}foVv!>6c8e{Yq`GUwPAA6iOZyc7?TH8~3c&5EXqkNfn_u`FM7yA8MRzX#Fl% z;DFbdT#Xa0`O3T=M5&Li?jR;${SKFpbY@Fr4J)EC1oqOH=cT;IF*S}16i!q6zBuQ= z)`iV!@voPS{B82SAV65ZY9&&KNF$}4XZ0AO-fO#K_j$xmud%J})9>d*dw*iITvIbT z2dAeQgjF|Wa&W2{Ic?bEh`S;(@#2`R20EmI4enE6B5WfxB$dEci!| zh)VD%l|Z|?dd#~Z6OfNPnC4e%-cm53_f(XUA-Ats?H1}ZrfNq>ljsq^RJd>Xe4N_O z(j-Ow$zlvLAfCptaZ3J5Y7pO=@tg;YP*bw~~mfit%fx0IaHdrTqsTD*! zSxj=9qn!f{TR$Ksof$n)OMMo;AyOQ+e%$FU9DM+eS*tN{gRa%aD6k%xng)6o|KT9v$$0EC^Ua&s z!)M%UZkk7GS7(ldwVvKU+Eh5E4lTb79B^1~s4yV*?twf$EN%(?nneHfxM-y`&|9|5 z-hD1B4kJ!KA07WGN}pEjjEyH|g2wmAu0*9f5>+hPh+x%zLSENOWEbTuygk_oi(6HqqhbzoIkMivsMW4hYJY z#jCl*s&)j#mY#}wkI}vWy)BgmxfeHAe;O|fQMo6Bo?LnMzeXsWc!~yqZ66A0Cx)V? zIzCnRNJ)3Fh9xiKvwve4q7c8w6l*>|@y(vD)))jE7|tpYDv-;b@HPBV^y3lr_y!;e#d$2l7c{zef-ydW%l<8RdiM zUG&Z<5k&MBy_e`+FnUB7b#$Vah#-1zqePG1i5hM4Kfb@U?sY%#WGsxc=Dg3|*M42s zcJE0QPKVQy-}hm%VO!8U7=^fn8-RI9Dvi&!q<<6zeFpli>5X9SS=oCQhM~}WOk;ur z4EH|O24`0#4EjdAArc$e33{oVvRx01kGpcgsu=?EhV>MdDVi#hgNWkkQeqY*62hTs z1K*9T9|ST|ja)@iKwk;fp`CM^FIlick#=56rT4ruU2+g++uq!Shu6Vm4FunhH=5iy z1p6?cFI@|M35Sl$5vmRyX0fnmwPWLnFu+tR7|^GmG%~*OR(#F^=Y5}1ROx?V=3rmT z71Pz#wSm=9%<06{sdILtPT-63qWhXd5}6`FhF$U@G{gnR)iL>cB@~ zDx#iwh90e_m9hvXsXdhYGBsl1PA>gk@ue0}wr0ESE0}HG60@!JG-W70`y?Vl8#TTc zx2rkG4Ccp5l#N#0m912^-Mn$;5A++gGd7XvsR&Qsm06DjvyU{3RP+wNq1Re}N0>u! zO6fj3{b7>tXuo91fYw1TCo?4nhKef8*825}D)%9TY4>z))vG}b``t9u5aR67XUU!}^i%`Gs!psL#va2zi$o30ohCP`uby^fePXYQ_$qtvS6q8Mg8x4yBY z3*2v{v#zU+uQ@~}leW;x(oa8QcczVz1 zp~w-8#Chn74Dolh%}x?ik#uPAZY3-|!Ya!ANG5u-oWMQMz69soS>g(TH_R@Aqrp{? zq=eP}B7du&)~mQ4JJe=Rr?qR~uD=8!?B+AjwKy9QZC=H=EpHAFOGeWd5g9ju{>EY9 z5goIChPnN%OxyisnGxTsggcn@T^GcZb8o=RI)}$o${_d= zb%Jy+nDn~PEyc(~Q;6G0+8x>*-6J18C)gPra6c$z-|462Fwc1ECWl>Xq*r=0vM zYHic(Zq}Do*;<4-NkPrc%fk;0KYpF@iucW+C19PX8k*`6&{5!5C_#^N;syb&3omZ% zdpuobsJ%QRSUi(-fR;egp`9!Qa=9~-arO`7Pb7Vk^7>YvdctlcfYUlwP5Lv741o&! zd$ijrO9fm=z?b(QMHd$Ks6|OnIPr*A@_+~rptHe5RAhZHm|8;f?X@s9iMK)nE(UJy z>*lZpltQDG-IpDh`2g-x=s}WLxbA3Gv=fgFAlA%aca+4NDvkO6Z**1~GuB091qW3a z`P>JwPj+08>I1Vh;2rY;2c#JslMnF1+^Kg=(~+RqVp^8+YX|Nj2`ncy3pEW5VZaet z9e9BG4`czA=9T_g9zv*VkbhIf{_Z#}7#V)Q$E%e(yIBp6hASEkXKnyZc=0nM2|9&l5Agnv)M?(c)DNfK z!gs8MGyXvl`fj=k=Zh)~*UE19u=7%g_WVBl*Dp3qu}g+%K}<62cF!>JSn{Cbb)|_j zX;pbqa@PKlT2<*-q1^I6_qEzDcF38nfTKDMyY|140y$7?=xrG9T$3{c?7w+8au)7hJdtl07nm3#EJw-Hh3XWAmj$3;>-3^wQRlj2T zxE~yG&D2onn!+P`rP-JfjS;A%Ivb{>qSJ4=N?C1GQW(9o%Y7UNTlEX^W&xG_+N?H~XyQo9dxdvl|3G+kZ#k7)_a*{peGrFPOL1weLz7F+3vy*+q8P8?e}@%Z zj`&I!(CW72lBc(Up%?X$(<9|XBeog5g?o*LQ@H)g)v5r00nQmfECkcY*pL^+OrTAa0MD4(;)yOHO&BYE(lUaBlmym%*fl&wDEzBy} z1F}$ip8+*KQMyPrz{jPwvCxo6pyh5I3zMiqJ##Ki}-6zCA6<=*Qa^63tA_DE&w}^(DnYL6d)(GmtoO zBf!}?oe4b`5J%8dpR;>-?}C^81i90aNSBa!zXYm(iO_-5RY>MZ6E$Q;RZnyRW@D+E z$e>VCJ>?6<^d38YE!99|45;~I8Z0IF`||h&IVVG%Tm!?ZvgkjMwbrHdP(6!?i9fRc zwL3f}YvmXWz}<6+UQZGZKrv{+$h#a#H|?4S96AgYJMA0tXb9U%`Ic6UT=nJ{Yc zPpPb#o4HW?AM#RBRTl9E->8;z0mAAfOC*MMtp4T`U#f#pz{WqnNegzk=ZUJ{No$QOKVA(e_?#OMLm!6!oN9Slz<{NV$l!|WPwIVF zd0OZpH(6TaD~dD{Z00b?>O6wtoeQh?^ZBPijt`QM9L^>0T146YZB+Fh>;0FJ_l>Tg z+l%A(LUF1jO`Xfv6ge7I=@Tc5%1(}$cVgM}LC!5>lKgf~++CcX$=%0Oxq???qqok3 zRZ9#iGr5=E>>6Y3`bv*QVON8HX6Y4@OUm|dsdBLX&vgB261YsbVB}DGToNx|zd&XW zAYg=0JSv`CMm29bondFW{c+~dqOyGgX-Hhv()~z1K?;XUe_>Do0+x?Yme$boF8(IN zv3swmk%$+Gn4}N2b4i3bvuFOY9W{q)hMU?O1Q9hmFCmF^z96Fz8OuPBo4siOwq6F zroS1R!N`@>jhQiae%AD|fxzv8c1j?wTG|&4t3>v1sLbJ;Slp6ZSzORP069=@qs>*> zFM$=fIape;7&k5I1m$g;UU#8sDk@@0xakffM(xE_XpgZGCDWl@7zSLI>x0ZJXbqP~ zuZeQ!5U&a)HqNTh@!ZXkYqtiZ;-$OBafV5;%#`N44vT}d$yQC2o|K405o$qmDwns7 zHbg|&MFuXiapy%dVmo6u>}Qf|c0G7YpGP6d#yZ%QUK@UBKe4d5K#{?bA>=(7u%JA_#5y2P(yAL94swS21-vTfd9 z&(vXxN`dDcW2?~h<$W2XHPatym79PH^va*xUog#O%sRk>VJ_)Nytig(O;|RajZKHHgpjJ&$6dBG{1?*C0jo>&C z>$1FF{d~YG^{Wh)j5wO^A3KAEcpH1#fgP@XmYLV04(W>ye~?IAAhPSJVKzuS)reVC zDsq@biPx3#IR}8=_ z7RVzCDvk4OsVeu8n=rn~sJsI`Z8<1a%t~nwfeL6nIoI{8?qrIHIkY=IaO>b7XpVfy zw_B^J4r!S&fkrnHWP_#AxwdgI+fvig@t&O`@w+p=j_HA@m@EH0jv)9) z;boQhe+2KTBU{=UqdgUx!js2EMCg1gKk7E^vt1+yXI3Qd`=@87tjw+}PsU>E$I$-+ zY5goveP`9^(xCq>!q{Zcxw;N}zSL`X{un|n+li=<$JIi(IPmW3>}Ay1pVcq(KAdI$ z_T6cwy{NeUi-Y!40 zv|$Zq$?22GDY{)R?x+`<@=HGAZDZi7h#H`8DHq@rboDWM24(#Dxf!G#Pq4FhQCemn z)B2&!d6T}X?R@8U#@wKK?3@gkUwB;7>KhU9As-C^fbR?2$V&*&FS!MD%kUmm0E()T z6Ye(weTyCFU8r<}lBOgj-sNlKEtmYFzL-7xw|LH$&gE`5x^_gDtcJu${ewKb9}X8u zE)1}DbAq|AkvADFC&c4x{-{Q-_qEj7)EN~>(p4p*pV?VlE1h=b^+e@3?0Mw26sL-l zE9%L#VQAu+#D}d%Cb?G$(@*l_D!lrimZymyT?K%2KYaZ_Sx%w#@Pyf73S3foH{>B}F^_Dbe4=C3R3IoEPKcjTi8A&=V2) znB!8rbzDW0xmcbJE!%F>BKEZ|Xr>?V-a;?5y*L$YUOke&c??H3rROD6BSZWTRYV8>*lcSE6+7%f!pinagb)}UB6(>~Pu2}v#xf#`# zD;!rb&dHtB0G#D-27m_av28@h6)i~Q0Bxsa#DVw}IY!y+0LdzTI^+NY&Sq)QXaZf%a6h(j7NGrSuyOmVX2dQ~U%rv|12SJzqJM{r2Yd-o4~i z?y`{tZO+6v!S!A$%WEgr32WuijdGe6$@G?lQzu6yJzU)f5SqWA>^K_uKCV`a786O!r%M9 zzn=7$_&MLyM_G0p`S7P0HnCcdw3kiVm$nTkDRIliAc-Nm{=2Hv&~`qUgPRCBot?7T zWVl+p-AV)YBN7+z0{d%n)VSO@eZvr^Wtve2SY7@U+dTZDw6x$S*@lE?K}vSZqeth= z4()OHX~dVMYGej9sxl#p z4WoYy2Mv}DwVx3cw%aeycRj%(A!k)2i$6B+HcRBix7NMp(=N&e2>fpgBGcpqa|RcT zD8=Fyv}y$LnQ$$G`iy_GfB7f&VM+{6yx@jB07|sj)khSSQHv7mFDv6uB*{o?89nI+ z1~))yjxg!652ouKJK^@oY4^i0@FL6lRx@4Svh!*)My$&wl(! zFJI`3WhyPJB>-kzO4m-R#0KgGvs+DjR0hNLxh{3tGZ*T(7I&>KMaK z-sgMG)RGV~2%3|~^B35!-Z6jgC6EmHE)xcrIE^Mp;y)BdjOUNKX`3ixr9Pvp_Cvp{ zULQQ-BJ~#$(@1ZY==bnaH9^1&n5H0LS1v`!%HBbF*w1;{8W|xqFI7gQE+@YvA6iCyER5V z;6zd>^>?-V#br4{C;h#I`J9|1OY|u#rBvfwZMWw@X_*lP?bi{>a)|vBFq+jxvjg%k zo(rVuhSlz=t_fuzh-%B^A>Ui?#~^;mCY2R&$rd)d5Ep*3UB$rG(yUEyj0gLGar0l? zgBUV_8-H=#zzn+0H#0(6a(%AAFGXmzJ(q0aZtRnuf%VMTaP@O}Xhl&~GYp45%Qe4$ zfDFcsP5c8Dt89z>17+yYqMRml4UArhw+~Hp3wGaVgS{{4fDf7VkA6#3!^ha@Q}E66 z{eTBdy%wbHXNk;^sQ-@HsczxLW#zVCpH!rG#JpCsus>#ROZ_mK?MVls4}o$lfPLvW zij~t!Pe@~len-oxs7z&|ll0Wn!Z)YICN%9OcWcnh3fT(7aGZCDmEz$lk{~*jE3%lB z<&hehw$F)V`oo_Knj+?nh)TJ4^Gv|zqhg#&eD1BEcZOCkZYsmM4vePM~oo{!?#iCwY` zyZt~H744K(tA;mtQh{6^Q&e*n4q2G%*Yzj0FdxeM$M2|@>41*pZo_} zm4nTZYwH$x(0*jxFJc%fZj+@Oi4$`kxTRO%$&*tREdszD|I6j8*T_q$o1(Bw88Dnd|TrzFtVMeXYe?78Soo_uZW|BySZ4Pson(b^xzA4a# zYO}s8#G7L^Tri^PGns7Lea*+o!wcHklGtF_5u{99bkmMaUP24M5F{D+It|oNGC_^u z3T#@9N+7h0LUJN+O@`zH-6xb*9;)56FVgyKaJ`?PId^8kFuclqgoHLXs=;6rOQ=%( zaY9_KLk&-Q%V+d}uS3C_kSBT5xb(<3yvV88-@x$)1w4c{vM{7oFr;p;#W|S|HL)3F zQPWCxk-Q;ZXi!W#3oml@dXGZhBR@GpT5=ncw`N&d1(L13SelvCP%*(PkgOf6A zY$PhVCBuAm=Jg`-`qsdZEN#xIpo|lzE#@c@Q_a@lI@M40RVhu*xPlHcD{ckHx!BO0 z%H~0Gyr!aAx0~$UuPa*)0;^P%Kkq-#FD3K8(}77T`vWJ{Q|>j!VNIu-iX~<26~cE) zz|H$+J8epz)m+#OIH#=s2XsE3@z3~7P2^m-i=1M17Qg!+i853HIRPLeKyx5#0O@GO z_u!n%GTZk}!@e{Hw%eDY^Fm*3Zm{R&;jpA5^bA1Qb9SA5iXP)-#UzGXvFylc`~RUv z7PuT`OmQkj#PY%~T|pUJQe9ot!>&<=kz<4Re_}L;kiIylByM&A%574pNvxSo z;vty?zhX=O=(vc4+h62UC=(6|C?ZO7%Ez?ij z=Zj8tdxsL(#28XdSnhL65qDFo8SyCx@f$`SO6Sp)zx_ffLJ3;q-AM|(oxs4^>Hh=@ zg?G10f09djM&Q1D=jzbiP$!%gWHY!y3#4KgO{sa_U<9b;4b@_xjpvVf+&+MXm~-3Z zHU$!3ziB=DL^k#e5vqZb@2h9>Lmjib8}QdQ{ziWwG>111RXE+4SZkQPDPWD0O{n^- zA6Gi@=bMxQ4(EUPMmPm4Xlv7$Kdzrh;au)%8W>PLtv0GQY0k^bIE)))UH)Qa9h_XH z+!$frv@dZ7I~8Pm*;PLErkkD739zFCBvU6)poUA{ewZC^Y{z2AuR5ac?@7A(T09oY z1Uhne{dM@1FKc~KtA)FX$Vw`XKNwPPTjr2u5`B0kVRfo^-CtW)h9k1@--%Fy^2*^w z*E+Ysh|^3ZEx}=~&u#b(lHKSuedj(8MN@!@U$ zQpkUmak*w+@2|3cd$Kfc-F^O63C~{jW1qi&?lz=emU}e>KwHu^-?^4~{(;UQQ_sdR zmI5#4gO|+j>oxUG72Rp1!vS7f>-)EXpo87mpswGBbA;}c0Y8G%ZQcVTq$HzZD<6fe zG~Myj+RN>Rksrh{Tg>)Sp&iwn!tXMs)YOFQ;(MvipOoFgs`N-TkN<)A+2%M^SDCX; zbXkgA0Y(N<^?B^Afx(_ygDq!QxeNet|5QmHl~Z6dBv4vmh$%zEO4bg;rxT^so42~q zlN~sKK7E?h+h<37EMi&`XY|4L{qe!s>%3%UfgE%-KKl=b;Dd~EPMI)Y4_56FcqdZMGI&V!|j zA(d%N2ab#_Dz7myQsrPFJk5J`u{pigoO1dyj5$>5zG@->ScHLTD3rX&n5#dulNK6u z7tnmIbf8y#!rBI*#7GcPo{N0fJ+~5B-M#2;{ITW!Ywdg)(8dOx=Nh2G>UWD@UKtg| zIvTik7%4NtkFBFHmyRZab$7v6v-KS}h)7jauBRjGzT`&FhtCkv-nOVZ&RO9%(2Yh(&l|9*3p)|ma{ihpz2{ePNEYyXs9RV+}?%nTH)GZV&8A^k~Z;Ct6 zU)V)i;Qtwr+Nb|)zPeCz$x&t2od9k>JRmhtHZ<@|bqC3u#DTFP%b!O1A}-QZgV;+B0LV*` zqpM%rLk>XudO8OlTXRq-Zz;#@z3B}9}hl z=}WQ@bsX+7F!Qn`#qIfXWPnw>$owEt-iwfe3E;zj8GQ(pmbZn*)4|03gFCKM&Z z34(siywIV^U0x#&!x@)6l^r$tsGi=Ex}}S>T?~hr%q%)_`y`xm`R<5}{~op3SMcK2 zP2~@9EgS{1i}5twB}E<}L!Hr>gNq&SNjn!4u}_Q(6{dga&`oHUNMae)QiM7xyEIhx zc;dNAzp@W7g#A+9Su-nLbkFB6hPvfyO64ZVx|I*Nu&^Z2y!i69d8*OnUbrxU2``rbXYbCguWeGwhKf&LAw=HhzK zus{J^+eVN7-o=k~^#xbY<~3X0*B88+!(muD@D{<+b#?L$n$&I6jgH@1^d{Ys!8y=4 zTUZJ6#7r-r);V}#wF=6Wke95vI~JT{)Yx`bSNGq>N)}$(b=2>DF_eCpjU!J|w!rEHT{41)E}^wHrr7v)Y@2c|4gtUEc_7#wE#{AofATgr+) zoHxd=J^@JpY|7G zqE1eLnf)zw^KU%{h3VD5LJ#fBnqD4MmRkhYmdVk!R~<|IHQ2BXI!TS{T#!>D4a%=|2ld3Cp#mb3cB1KApgBwNE)!KG0940^eM$*uOd5q&dMXMs|H67anyvf zTo%L`nUU#D7@NFhSbAY51`i2TS<^f8ypz66xGGaREg^ers>}&Zw?9b65JE;}*9}>r;z|H~I3W2TMdf z-ynO6eY@Bc38tc^pP)CRo8u{D6p_{(ubND&GLq7~tb>vYZ#QhNRfsTk;IfE#m|+Og zvZjk}UC(Q456G*9#N=zWQeV*TAnzuFx*Hp<=APG9vh{0WGD-)+R+AEsb|o=wrl8tM z!mdR?)%-}nVgQlt7{UJ^yPHdix5l@Cvw0gZ&5?&g%VB}GJpRten$;-LZgxTW4Vn!^ z|Ia|5yHr%t0D0WQbbNe}XPS<>teT1fFKuAyWB6-a1J{<2&4pR1Q;|oKWYFi01AQ>N zD@93@GD}MWk4Zl%FTt8s>9L!(jtr?uCD?V(d0V-gC|(hVE)mjOGER0H>?cfEP79E* zGt|u%>*6iLp6vFw!eo*m6$(=Fd;^p4a^?H7v>q}*S=awW14KViUE~3WZJxrHFZSGT zEI&m-C=)j%6NHxU%QimURnnXZq>OWIsaG17;=bI4@U+`|A_G0SOcX8P%HuSKFd(@| z&_~-l!%dt-J-N?4Fb(`5Tdv0#@KJ#*FGQAE;sQ9u5iP!moXs$4FjcJHpi|*AdzHc~ z(ElPP?D}asaB=9Oz@U;ud>)mOE*I9W7reYU!$erOz|uMae^P0F2YZ@L(IL?|yV3q-E@ z#(_&VNb%Gd?h#ifW&kalpB1>RJ)m|zr+nhSK^vrRJN}6h3w@!YOcGz3Jltn#nWc$g zTUGNJ!&p^cq@rPpRuyp<6}q%P0x~?CUl&o-%S{%N#rgU7ivn+`B)+GC*zi(t;k(jw zttKG8h~k^a+k`=;$o>zT3<%b?_R2+7tOY*|kDE(!o)L%L<(AWxPu?F6n6Lb>7!zMh z9W1nbCEcSgAZ##|=g;O;3hTm5&*;rXIlrV zZNndQlO)9r(!{=ZcSc>_OP_26mb!7}+^e zyCF3%jqs$PCJ6U>Qn%WmOS>h9N7xnh9z2|Eg0Lr_?pnxCU{#8*=MYzc$V#@7vtJ3v ztjt)hj7V zk@u1B)oNt?#`XqS1qS*2);PcTV=B8ac1l2UV~1e>f#xqu_GO=#Ti&IPtTj|RS5SB< z!dNZ$#%zz{AILmZI=SlsoUqf|Gs%y_fYN2|L-+)2e?VkpcL5MWO#z)G&WHmIY&VLY z8ah4|f(t=<1D!*W1`Nt8{ZdQF4G?@7e25he39jxxNsj?rn}$3=hDX{e7ql~lQt5=Z zEt@Sauf?CAQAt-RE;O#-8Xtvf*?nU8%6?g>J&|dD9{OXg>f7y*+pU*$y1;nxVsN>^ zH@ADOGxjYcN~E&b#(QbA_EI9tNy>D68;DOv@*MXK8e@wwC6r5}>6Nk&H2g%Rt9X;& z!9?inBgY+FSZ=eBFim2{T;1UMK7XE<%)ryL{YOb0T@tH@6eU}0lAJSQ>59ChX;^Jr zqghz)uM(eP;P@W~^Ikcrq7U^>X1TTzm!Pf1hiz1N+{m87muHAtfosyYsUzn{h*5q*ue$Fo$078#7}_ifXW((+ffB27jl&Mz_P6@58|wi z;aCl5Eb}WCPcew*vEa*uReJgOk#?qgb7HNZ8cXF@yg+fRLk{$;>Exw&}cll{0AD9 z&K6UxVBZ#f@KCX~xt^l5U=NzovlL}+3V;sY4PzIb&2AMzD)wX90z2oP1^)(~l zmxR1M%Dec1@MB7$05f)BgkRFxZ);Dcf8y!{MN5K?)cvedqbw9X!gXf;16BY6Vs_@^ z1`@vKtT$CJf{%~2=9q7?Dh$?d4iQ?%{4Mvsf=~oL@Wjvs030wSAd2wFNO;7(@)*^^ z(4o?I{xYmtsl-loC}~Fw!W$vOO99q7UDoSqPuI|dGVX*Zsl$N~cx~3nNR}ufAyF(Y zG-m=O$@V`+MDr5EbXN%WPw3g`Gnv745MwIr4CBRgHEVoMvnMk8SjDd{7<6y-=D_wA zeK_w%a-E+grz>JLe?`t1e@qJYa)uiz8a`2^41WNg!VCP&OmeMVouHjCeog6WJ7tCb z)_^eQYU7=|&aa~VmIM7wka|ZYkuE$RkeJ!s<;I@&E7#821uWfoRL;H%i#-{zZ_yOg ze>#oUOPD1eLYH~t5f5|JkAT_j`~%IX(3<<*|48RH7rjtY5b?59DFJUM#Unq`c-qd@hyD`>Q~_s^c?S}`AA6owmI7b8q%yFk0FsCqvyE)ypx%JmxmZh|+7Aww51EZ! z{~wsn$^Aju&*POHsTr=9V#C{sKXRuUN_4uGaowN>wqucG7whmie}eZD_qM2uJ|RyicG7U?TM>JqbWgw--1jB*(Tj-1pjt4B}DvgMZHa^?%TrvrlSi+A||n(_~% zN5I?+hxV*tTBwxt|L%<@c`uCP*s;VQ5xrYjvSIYB+-PsWV&eCi3gt_cbLF6%NOMtz z!vsr;W}6XVpW9atg+|{}RIrDP%BZA{0|*_qPEL-!IKw?We>sN`#7Sc6+4@m_kEo|t zkw{fBEJc*LfAN1L&uldC&K7_CO(ftA2$KZX7n!A_a|N)Bi)#%jP1oML>6aqRmyArN z9dwz#f7zt9q%;*HkiNYDEr3B>GIUyG+Xjjp-59jQG6eXE;I7cpdIgFn&iICEUoxXe z6wwd#>J%hIPE_)X-`#m0p=y9*?t5G?g26uG;lK_y?fwtMtk;YSjIQ;hY~DSm2<~+Z zUgIae?Ip@QKU4u(=hNdAOrd0V)7TBmUp-@pkLB?}=8)ANlrG28(qx z02%$`qvQVn2p?HSyetqne$7=3>BQ!1)M{_RCgcU;o7Z6OE0mR`Q^16KPTWqVWtqmOb(Fhcq^a`+|F|4c{ zZT6!NeiI|dh#GN<-*)PdR9Mv?C9-4Y$GpoA_S?#}n>_1JwPfMjpA{V4Y5cE}=@b09 znOcmKw1u`P`vSZKV-+}nRB$yX#h!w+DP5vQfh09tmJ~dk=kDi7&r*ALt*4=}s{ERm zWaX+!N;*@agxEf5!D;cAmvm)ml_Q65$5b|fEEnn~qxP{}N;UliLq3ZwbiRQ;9MQD^ zgEuTGT0wRN5h+i9KCaVKc-tB`#ld*?Hp>P&l_*rLHH7tHqY7G-Y1rm;H^3e~BL^$b zJ!LDK`3P7JI7Y8k7J{O~byTS06l1@YL4t9`!in{>k91N3wDr@TbjF`a?(r)z6=$uh z%uvYXa(n+*GblY93VfJZSuLp;ZBNMsmy4QozxdU*fP8mOK)^mHI*-@R{~bFcD>rFd zgK}^-U@i_uOa6u>YQWI<6W0%Wb?NgNs$g2Hpn~$LUS~~c!p`lIwgijTWZmN( zPSoCJP}C=#3(hH65V-AAi4o4Ykp&t2XHgWGhlS{;FyA10iKc^`OC2fKXw5z1HEkVy zWA6mIy}mDqTb}$AdmQ&^K<%-;5Qe&$e4O$#ft+`)G_r?SU)xDOerd&@4pWDPEkD(A zQSGp|b!L43xt^(SxFx&NmpzGa#q#1w%KOdOpi%RjkLOtC1D4B53aFrqc64NNl_L<5 zz~{{8AuO*iBAbkaf2W@TMgqUgma_vV{P8?O$G~l36u&cVF&M`GAl~umMlIG{oQxaU z<6dKTNrN3Bn;Xb~AgH~14xXhYT9}f1!1V7|L*7SSpzKRZ>DekJN7^U}t8=*4c`;{N z>ae&0;A%`eSmP(G5{QR} zC#Da1h4lGV=;KCuOlKvLhzMj7EW#ZOy-&J*iuGfj7j#0(FIknB=nU`Og22k!{9~h_j-17&T+;>9QwY{ zLjP&K`c#KBJJmm-*TMbgRS4G&cOs?IN?*Y*;Irmr>~p|Ld<&axV9e;!Yi#0O_MRot zs;vvMP7FYnRxXQN3Jm;W88-!QeWWFTr?XPv8ZRrcMr`now5eQQ(x8+6*xQbL3%FFLwvItn6*VTJiWB(ZjwEHE=~IXSWT z&E_h}ul!(#^e3+aJ6vBO0FJ=0Rt0tM5Nu+T_U>o!?3>P@FLO77&jZ5-@>@ciXHx|c zSEB+Ccf^28CB6TARQ$+D>HbFg0a)U9ufcgkuwr9l4|%ilJgM=!4a*^-IjDskUx#TE zYE!-FK)Uck*+5FueV{U!A79T0;JqIVH?Q(A9;?(=hgn>zuN1GPf7T}DJ*bRHqZvFc z+04D*^v%C!4nR4f$UmuM8N5~U){>kVom}={Rt{be!~|9~00xc*5U`UM@R&4s=V2g< zSO_#;P1!~kqyPGe#Dpv2qOqKUN-_~=-yceBypQ{-E=I*>ueOKYNzF9=^iNrwL;#!kB(Z13vu82waS3?*mnQh^P;1sQKF3or0)UK zMg@>qcGpuO+S8YPqQ~Hd$Cq^hp@RcdF}L~>(SLs>v-9x#ta%?_r=sJ)QF1N#-s>Nz z6E>Sfw)+@q1*kC3KKZ1WQpU%9+)}Jf2&Z~Bk?UWkz@xmUf=-5ZuV4L%m%F@iw0ww? zY_&B#)HHL4_KCQG$o5wyC+5Bb<|E#^<}{^|UyQVb2zIkr=8h{^I(`ujLq>~*$l$Tz zKM=$U?L$=f&}&=9o07l4+P{rlqYvY_6>eM1P3pKR>~zBPtK;)f1sBPSS1nmLm%9fUfS!;5nI7J>I<4NK7!Ss?9s@Cz9@8}7Ck@FI8->Q!waTG1+}e>Q!@MEW(Uy`vHQIN&ap^=Gxa_XUVh-OLq2 zw>SxfJ_!xc3yR7m;YhCI>te>Dyg%<%qg5rV{MaQjaFD#WP#M+N1B+Rz9*wx)5S2!i zH_|ofd>@IT!h*Fg1rj*;67>%ylwf5@D)PD#lG_N#4jyECBrRRjmAiH>10(>?61wWa9$I8rhCXa}qpq$sD~H@JRHbf;>yo6wPZa}SHhTC41~%*EG$etv0*i6f-L1Aa)B`q|UwFT*AY0~_HF@4cTH>%oM|ap@Haf@$Z(pXOMU zPY$|A!j>65Z?`ME^G$zNb2%qD)44010oh+|S&9z{M+jeZn1fL3Ua#27qE38h0E_b% z|3qx&)9tEI%06S!%4&NH%HL4}fNdIPuCs6O547MfIMc+x_^f2cj{(m2x=9HcKl8Ch7$+nkaxaq2RI*#p;K?mx`v z2o)LRPy&^FNWCzU4X-x8@aaOr?t2KMl4kT&62a)>CgMp2Zbljfv6TO9_j~N&Niu-@ z^6}pM|9=&gSj20i+uPd#d#QmaI5dS9j9#T99m@rss+wX*4Mr5beTWKYg!UVljHqDM zLpohntXJ%ZP^5gWK-FK*cYO&&Q;tK4;A(54pT$bfafNJ+8dZrIJ`PIbnZd)~Z9`Fa zgqxzJh?yltC(qK}O7<|>5g6+H^8P8Nb*1lC*{}AWdydB6kq8$6BeDx(i?)D%Vud z$1z=r?h2Kqz8`VAiM0wPMu0!k^MAGs;3@+<2n$6){yNG};=ltiW{h|W_8KYy(8A-s z^NJ=BKl&xWO|JK7{w*!n+w@MDmESKS{tLB~v#StJuJqv{J#L~4UN%p@rLKM|E0xyM zOXCV8ke3z>^lRFyv4097I6U*{lS;$(OCG{LKMPNi92Mh$+fxY8*7i5A2S8)+j7>Mm zH#TIX+)VI3#o^n|ZA*TbkR6js`+FRJ z4S!p`!L=k%8D!a3#;{CzfV@LePzSCQkJSDHRYbZU`r+mUUsfnSub*CT&Z01L{i(hY zkez&XiTmRpXe|FnBu!bm?Gu~|qOEPnsQ%{K7!&2ae{)r&iHi5g4i%~{t#9cG+ zrhmdsyS*n7s-!K$8b*AEb_kB8{k+hPE_%^<=rKn&wLjoez?@)#M_DUXu2eE{T@g$C z<_(>G+-Brvc)tWpv)zGQ>8x`(%{kAD!SvG4e56IUc{yNbF;TL7;Qul8mH|<9Z`kk9 zN`rvJ&>bS3Ln&QDH%fPdARt}RozmS%gNQUk=Md7}A>DYk&;NbTIUj}(`^&J|o3-wB z-`DlK>|%#HkumX_$#L!oy#zR5lziNoe_q1!%GN^a&yD!F1BH^W?`H;j<@?;X)pQP~BtsY??M9646skXfUmFt>jM1ZWhe zn>h2%jn(_Fs0a+~Rtp&c$kxJe`uKEo?yrcU=8T2uov>C$nmUIX$OO$-!r-hGT|tD} z!ABdC?ese06b%7#C+$wn{M8a0W$Lq0Hk;vyoIc*|E4^YfUER|@Bl#AZj4m1F>_Mq-ZM*kM=21g#wk znbS#0BLhlqf2KSC3S#*S&H&tk)Wgfpp#eIlEoUiY9YXU5DK}197j_zIgmo4kMX%VDFj!tdMhKZ&6)O9!Z}GL#nT+RXEa&ew7;$ zQN}m(>MdcYvaj*ItFF>rD&dxOs^tURA3LzXR*-nR2!u0MqNM|8qRY`6o|uDY^Wjxb zCs+^CHVn?Aq9NVG$tLd4w2XDh;WTSz7KN6{w^fi1++~DE#j3l~%6K7VM1!aG?!hH* zO4a*_rL%O(Kk?Amlall5kG#hcADGT9&$xQyAv((wm$Y%dq4_0!!hOl>aaYoNe&eNO zKa;-gG!BX_iGB7Fu?c7WXK?$k6f2j{jQH97!Dta!Kd&GH_x!gzrK)ndJd(0NZ1l+; zpd-0;{KHFTPG%Zd=+3LbCv>5P$?v5_BBsZJ_zr8tJzxngSE}#OPx{fk^GVq+nH7uX zn9zdt(8&KAogKhckYT*+tdMgpQg&Cerel1Vkk$VSBKJEh8R{!>Wlw3Ml;!H3BXtX0 zf1S{>ND~W`LFoO3h*Ln$3Nk=V&i8+nA^89OME!r4>bUO&(^SWbXp<`GI1bDpPhyt9 z-b7Uhpi8&BX4@ALib9 zCs8%Gv?UHTOUFMESTyJ>H`WQxI3UIYLo?%^0pF67s`t)it4oY=Bt~J+p6~eHZpJ`2 zY$4JWP_5UpGd?D=6J3RpY?}}wG`FfN*Xcb@T^dNjm<#m7?nN0>adOiu`%uuDs+8n; z`5AnIMmZU2^tYH$z;aFvRDQZ)ik+SML1U!p`Y-5WRvFg=pyWQk@9-&II)H*xC0~JU z@sB}3N|}&HIYDD%j6N{V6bDkwm=H&9nzcElkk4PszP2;ERPpRAhpUSBbwMW8V9q?w za_F2d8Texjz!4GtgzhI~7tN5(sm8Zb3Eb6F%eyVq7$5?|fyJ_pMtd5fHVG3ynTrxWiU#M1_6X&8_`%F~jRe#ij z4YP({+hZ)XE$*6v{k@_tV!Lw-^D`zCft0X2_ub6h%Ulds3w<5)lk})3QD9QeC5B#> zydVL-=CxVnlA`Y@UFy)>y|c(uur3NzNP`U$A>jilCpi7V40NgrkP1u|-KBN$10|)V z72@rPb>b21PVVk_c;=_V1S>@8rUBK&LGWqiXB6hyvlJ&jH)<$7iDB!QvW&qWmd`PV31hnF z9K`pzF%esN zWQ>H8kj?lw&~6ct{2xmP+&V(Li}UP4%e*p-a_YhL&*O?gbC#+G zuDi%>WXCwxJ& zWEn{#2@0c=7snZ)!ev@#j->QC*2|6k+KW`~+BNCUDWOl!$XfEXt#0U6-4ri+i`d>(bGlt~ipUnj+ic1=k&03aLKOvadm}DL4 zH^x$*nFT^|m+^iFKFhOaSG)#1l-J(%e?f1|EFWJEJh3!-$7^XpJcXNtQt4cn8`SB3 zu;Z&X?U`N2``&CGKJL>6#DD3do_-j9@?j~G1J}J<+%PFwNN&Sqs-Up{xq2v*w7Md3 zo>PAPD8^zJCmXrrv-Ny_E=CFMkNg@6RFjBsm!a?dW)ATC{*I)dzjXFGMkX{ge}B;3 zZu!!>`TdBc7bSmCxg?_aCutjQ_bH<&d@PcTh^sZ7@NNmncNqJ@>Avvgz%)t_rVg}j z2E@%hC{%>oOnwYJ{>epISsr#n{U%xQX0okhn0%==nVuo4Np^F|m*B}(@ipIQnSS+P zV!8@8iQiAOnkvmedXM*rJCa>r0>&o-GWHQ-MkDBLbB zQ^T=@ee`G8p1Vqwtl_j@N@k#dy{~kmNg$o!O!`c%?-QNEcQ!k*MJY#k)N>=_!iJdd z0`28e$6y)GyI*J0>spf6GN<}}tN%Ln1*3rLZZ|k+pXx7Y!}?3$in;wp;^zuqi*G9= zey3}|MXL)ppaaB4C#H)AsD5Pz-t1_s9?SilSr^R~(o4LG`wJ3hmU_f^t{y{pzTSDZ zmu?RnZp|>bhfgjpjX#(3``u_{v^`aQ?l_QC^_vrz@NHqpOL%@Z4tJn4-f!7F-jxA)-zY-wK@DzkhDv!4qx=CG#W)b%ijZ!~fj>DeL z)1E(}uNW48DT7pAe?@+h5d-AokyI_w7koGLX*ZAzW~*XZRaqVE;yi2rhXS6??0jq0 z&)|&8vC*4ogZk;Wj!A=vCe$}Ye#vMvu>@X$N=KU3y6qu4wbM1c_`V}KG*A0v!5=Fq zSY;d{OMK2hy$t&kRY~=bUG-R=d{X531yQ-n^kW-7R%wS6!E3W-{O5)KRWq$-N-O6a zj*xDg8)X+imI}6MMFPd62LhI@U64CPGC9G~dt)hjdJcdp3>*dlzwh7a^LxEod%}kJ zkvV)jGsS++n{QJUT62O@`PmVbPB4OClK^}L;#i02tRWmljoMMWl!P8S;cb^9`X%X3 zp(r=O^4{GlzT_}x>whPp5~EFl&0_0@Rsom|5cZG&1UxGNl;TM#rhaUhseqRXIW`3T zzm4Pfp)rgJs^~`bU~F;9^o_WFOzfXipLi-?_+%+N!>T?cEFVd#$s!HOIp6SiZSl|&kbX6Zv5B%k#g*2Y@^2o16SE1<04S8m$odyTMsjfA%Wbx2DR)G zPeYl=yHsXQ1rz9PmOf>}+X|*2*>&`~pQb4O5c62EWU1rQV;{`c%82&}q5Kyl(2S}W zVv1aM;;X8p=Gy7w&5VyJ8(g}D1NO_PaCMk+mD-Y_zI7RoO6qxWeE16L9YQA+g;UO0 zol)z>jW4WdyOL5@v?D0&u>t3jVn`MLT_aHtqvUd5lU#eO5<4gchR{t6#V1wmK^ zql#9=6vr2u&LkLoNQoQ>a_Ln*F5KPe#}a4Am>!8?{J6r<-;XooNh=m+6Dg`!P2d38 zT8r{BZ4?q9HE2<*7=AU6@cfxvi7UWZXO4dS0;dcn$Wu3Nc8yX8lYZI!lYyYct47aW_DFwae>ptzbxc^|9y1p=%vs9@kSu zhL$31eohD|Inxs41{uqE5_aZtS28}aiNok#&1KYHmcLlkA^nB3t*aT+%v*T*ea*E` zcz&8Q#`-X*t5PY5PV?&@8ND!Ta>2aMf`upkpq%jt0;S%`_SxW$0^sao9>Y5izzv)*toWOv`vYekLj)-kzx-iVXhimBNt^o04 zg|rCin6!O@us;Hsv*wp&1~W7)jO>Eus|rp7o!{TRJ?Asm{6+s0gGhqP% zM-68;!W9G_`?+*JK%1gaqjta|YCwlU0EQUO-$p8nm^c!Bt7&Mn&vT5rVRvK=#B2or z1vPew`H$*d3z2BN&U5O32t$_{`bXZ#KAktGFT|NGoVfhe76N$k1g>=_aFl+ol z6CT-0hPd`p{P|`DfPRMYjx3|-mn?9+96(zMwpNVc4$^bVZ?L4PS3gCcY<6&3LT|7d zo*3TdIPd3N(mLW-{6nl^Wa$k)ch%t(ltY5S`DBW1Cy&{W5i4)D>C@hlsU!Oma=Gs@ zRa~*^ST|oUIwmFK8;hgu?A~cz@=Zsd$-eADwyegvsGObsb8x^XGYC^#3H(u^uvh&i zdVkHne}#*cpP|u;UYUE6d;C!+*T%Woqd6+4hV~A9$JVtsm1b8bsb)FW?)@`}!_Q!r zoVPZq8J(#pH=YSNKK^U*5htliA)+(CL@Fyz$Mq;i+ACEYo>#{lU5G@m$k3Hh*HoxI zux`-7Ks6^9EX~js5vWMH*L)hfE5if&<+}xs;dhyuHFf($KbMzC79ZlU#ZK#CTgs{a3o!0=e16tguWWD9mJbzHJo||S986a2Gku9G)9Df{ zxkg4#yz24g9+gPHPm7&wtt~|?SuC03#d{$0C7P?r4ZBh#cTffzwq+|01~DTE(l?Um?XbTrpq)* z{|CqhPL13^AUA>f4;2oc1wAG_I!=;eod8fP5}OmMj}q%iRD&QI)|iM4nADBZvNzk) z$esL~^G%!OLOv)lV8x$4z|=F|f?nl2ri_YkM#=$k%C&+w16QsKUTxrz5Lkn|i?<<^ zESTwVMn8~+W(gC(Fs7z?;%ISx_p26$r_5e_SgQJo2K^yXd6kk7d9 zujH3)5rm)Wk%^GGn^&l=DVHggp*1!UxTPs=rga@O_K&@4q0MTD$>cF40*7Q$ae)56tvFI@Kw?$ArrZJX2pr zB6m1N++&k`L0)d9wfMcI@973yB=&>GeXrQc%gykjSl4I12~u5CbZjt}SIT5cm5PvIjCVg1zVn)>@Pw|{b$q1D2|KbM+$3q*yW>Jx*!5Kg=i6h^}m=)TwgnsqRq-k=^(uhm&& z2}o2Y`xebY)=s`2T;DX8NS1~$Pa5MrOlxVA0%%Km1-TSoF7;mSmR45F4Q^#yHQvm> zwQnYePwHndw6RAtV}Rw}F5prxFOmQO*%94fOm(FtQZ1sY?%!lkn=)lBmiOq4WO;qR zGeGeQQJ2Mt#0~_F{gd!?rY}x2jA%8ys3)W9H27R$Ir56;AxOmg5ng$0sA4Q3W=zgh zeTD(1?n@;_?@8E!9zPUqC8;u~gl8#dgTUX{GuJ4NJJwYRSylF>q7kA;1iZenKGPnh zd9#N25ydnh8%=MnKFj_({mmck0)#Oi&r@~QOHv-w2CIHjZR7o^Di##Oat;)2drcu3 z64U1ytHlrRRCp#4pCbe+bNJPzOmJTc5W0(qYLji#@LoAIT=;e#2OuUMD}Y@LTD_YW zNwLP{*2N2}VY$s7Onc{&Cr*7FVE3EdV8%H^IL|3P zzSY3*qhrL!w9Gs54Qtn~z%!7;W$vLqh#nAI^MUbH&F3Yl4NRtt7?oZ!@+?i`HUP$m ze-3$!N?2K1FgyCCGc+LCaS9Z(o2X#cy#c72szZSY(KaE8LjJ&{yE$; z9w6Sk`FK`aTxh18K(hrN3&~8Qs^1~Zd)(j8vb-%TEU(aGaFwGr>5GB#cmf{kyII(& zI2wTFzZfN{73-mSrkcr|rM~z$n>y;1Y97B&8(Y46Ke@G#bLSXap25zF=UH_ulW|2I zy4nDoJ3IBVwtzP7csH=Ay^)$YdcV`onDN|bBw_ui4f4Uw_#C7R8+Ta^wtTeufk7}5 zd#J<)RoCvE(msWZUZRVo7hN=`7Fks7x^2S zwhB!3qb-#nb67t%Wa94Ih{UR-r1RWtIVX*Yp+f8J%CsL3Y#R8d7KY3lG~RjPBPHKE zjPFL2$jLBOLjj1e`?EPbmes43@eU4nIwYhBk~;s1HV_k1ikq5ResZfuXh>u#wUEiGv3iQJF-|=2~|b4 zhhPIDzySWEk#*JNC}nHZxWxMBL7nHc-}q0)l84j9J(jGUs!txcjpE<+W8(U{pGD>$ zGDbkyNeys0mm{Q@q$D-iCLREJ^_RRg7>QtB@uV2Fy@B?rl zd;3~8T0kMG`03_?rcpV$osXbBVRhq>69!ot5)W$e{lV&#-+KMR?Ie|xHQ_AgCd4ex z**`J8ro2$9`TFcC?Tq1Xwk~S2!gb(C+aZty&TJo74Toy81PcHhH9elg8%yb(`L;=b z@w|v%RVO8IBwbB*sNU2X7)W?bIN#2S(OulB62i%*dcOA!#Rp|)acUXk)K0?f`%lx3 z_dBU>?lnvVf?3ucd*fpr4W5&YUyYiivS}t6y&3?y5t>CrR7My)PBy&|cxc@d@f_dP zP9U`3bwr7INepX3yWB_%r_9=6S_(qA>)ef))CrVbOWv~F?#G!HDdkQiBVE_P3puUr6)7@-Xruz%x=BH3_ZkHVw*uoC>ny#)MqE5KvmLCjw^(v6q z)cM{yKxcXoQdgV&b3YTQC3DSGV7KK-NX06jH^VjsWf%fX^JxQL$4)nDCkN3;M}`uk zfp=HZsv}8OFF4omKO^mHuQx_8p}>z5lue^$2X7oD9`~0TBDFZ*6Ih(Mo7yvI^lR^Y zf>7p?yB-MaRIH?v6xpUo(EKR>I*yFckEV#-UjZc5Y*q1ed9 zr)g-WSDx74rSKumkx-_U&y-sq8EwpN)ee4tAZ>X8a39NP; z*};@m+C^oECJ4uO>L~(0o47c&h!;5Hd|bRWy|~3mwbY5pZd`(w=U8**svJl{`B7GI z{Pc!mFtiaije`#7E~{QtXW-LD&#^giurd?kcP}+d`BQe6tUAwZ>cH9=h9_VniRdC? z#ViYpuEKQok1il49pV5k5LDS9T7!vCaJ|KwKx z=L6Wo7;l1Tr9`M-+X*A7JB8e>nQ*A90{$K_qD$0>VFHPJfGSuSqq9CD_ybSZ@zu4R?oDT zh3iA$#55BtY2}k6Q%BO4v^*fTohioR%kK3|h}B>3!NxGPXkXO|;8awia{*np?}aZz z9aBMSOJ*CIJkuzlWC%S$XxhIc)4vbp-`W4I=2Ar!Kaw-G_&-{Py0sdXFK+G+jEUx# zPBfyvA*7CLuq8o4mm3q@h2H=G^rI+~Z@__H9njfwc3u@0=Az+pcNNlY0`AI1B?0$n z1vcCEfun-50^^f6jg>bEcSOVOf0RYS7^-C4QcMKd6pFe7$saJ!{KcxcY?DIF8|q9Z z+E^XT5zf)}M9Pcz9*d+DMdjWAGZ-X_8Q}mjd^rn2#ssAg)0e}`%BCop-UDRejOb{s z5RD&N$<7sqkqR#5i@M>a{)kuiGsCXDqnWm-JdBge0KWeXC z#ICKLl_2AIsx=s!J0Q&gm#$f*VwU$Ngk;8OC7)qpY814@iscW^z2)u56WxVN6p* z0}BHEp7$ymrb}iw%BSs1^3oFSbSZSEkbC#?MT~e-_9?Ux=!Ix9UeX$iKj&&YPl{;@ zUE&-seuj)81X5IH^RllYRJ{B|bl>4!{3pmnquOBdi&YM2FV3q(l10HhF=;gV1^pk-_CSYU_CY zd!7OFakNa2`#EtAR8S{*MNFHv7QeH#z(6hC`W725$Xk<{rw!vM`WxlUXFvj`(dauU zp(Tiv5fV`*_knG*Cb&T0VN#%N8S#Aa4eo{Z;;HHW>Yqv)&e?X4?T6xeUM!;7+t;*q zIV?{77u6DcQQx*{W6!!kI zT=R&Rq+oECZ3T%6Z$O0Q(UOUKuH6-PNeN+uU3=c`u|jWE|MMb0E{y51BiWb*CojMJ zM}}K6kJokZ=FN3X*i*{*RmIurXXCurXd_a~4O_2*79lssxYk>OfBy?$TGLD3T4 z8b@0`u2NjDO+uK`CVl}C-%$3Ei=TW~>)a=W{=Sj6#Gj@iv=adu->3X=+w1hnuTHl=1i4Nsv9p&Jb;h*--m}iaSMv2ew-?g(>Qj( z$vad9{;Rqw7_PTd&0>FgiH+W814?H+RW0P}s^0IL%fzu0JE`^sK7+a&<4b;@O=?rmR*1FNY0TT4a8m`p0vHfKcTscAi&6-&E0l^yH>~jHN76 z^KJ|Cc^JyM7XA2yMqu*>>s2B2#j+orR>73k-CxjY$gr=Gn&YJXoo2!@?54v#CvKQ> zs`mC!3f$iFt+w)h=DLTlOkZbQ)8Br4=GWQdA>%KoI($-2BjKHWt*cxHAh{a__K)s= z_mzr$PC5?tdG~yOdZjdC(_aiJwig2fFp=X%VzU<8dj)6MfIuK7yHN=J&{ZW_rK@0iHji(_@) z%9{704Qy`-7A+v&D2gW<@}w9nOc^xO zG?GPt*~N~7y{8=RF{H}Kw}@PFjR+#a|vsL)@-ypqwg3Q7B8g z3qm5^EHPF7D5UbH=S$%hDix06)&shm5ej=J7_Z;2#LL7;9Bt%xBRJFJQ4Bqk%>Yg9 ztMc0XE_qlHs@N|x1RRw@isxht;!SFydaT7DpUM3o#n4`j3w|2*DO7B11@KjsWP-jC zop@U!2v^ATZYR4~0M){NY(Q|#^GM*j^yEZw9`{RWx$upM+|8&k37_gR-HCpFVrH|% zEqs!ehO7kBLk_9bg zwzQ4ZLw(9p`p9_knguGbj5-h!Vtst2B*ax2nUpz=#ifxRCqKk#mmEtVP-u!WkB!Uz zPCu_=sHg=zYiPZo)cU3PKuC*My>W6e#71o^-t)Ch2qSNaqZ1g}^#VwhT*zKEPPFp} zM`7O2A`n z>;Gb3ljwv?+(G0)Gug>g4a-G9&cSTsJ{TZL^qRD&X#NO#2J%u+Dy-CgTWl=74r)E= z_~__$$sqw4B{{$Rv8v%R*&~)gNY(Oi3nIMHwP3L+4U;qvJ*D z7AHePQYDC#@_xpzSCh(FS;ow0PmkdM4KKZo`%y2DD%3z!w>=;gmlNdUlW|FRl^ zA@cu3%LY?w*SQiI+`t$BknnArRFXicwp2KoiY(arz9lFt(Nq1?HKTjU(OGiVsy`3X z-l+qIg23mCpOvepUslI?eCpocO!3|4KBtu@sT#EcxiLBI$d>!@Pu9MZ_A5)im@@!A zpL{smr{wWW?B;i_5-`7l$o&Nc1%9|wxF7>boI{1+pWNR=SE8dGUV5EsUOg`e` z17%2vaDUg*pem>MZg&>QHvhl(84&Vcd93zNvP}R2rZ@l9_4L3+z@-5!Z$$#f`rv%c z3b{A5?)=W_5^4lUQJi~zIPz71J*8QsLOg!BmE4R3McMh_#lef4@;eKXt&q)qMF7Id zSK~8Gs*TN*j;3Mo3<2QqLkjg z$=Ai-)z!sck)-GQWamyXBRTB+dEXY7Uha+-E$Z^|Y2U%&q-I+yE!6=}rdb?RflpW) zU1i#pd>apQyq38VIj|Fswv2&sF2+qGjTGcwL!VjCEA-g2P%E72`1vtFvI`O|=e_PE zkK}KX*ru)nBBKuXTqE(t@9jeAarf!ZT^Q@;@c)VO#T1w*ThyBxn zQ>mt?aEzAz6&F;Wafy{&c=g5ugwK7zG+f)4`zHNIEk(fe{|=Aj_ld&!9!{Y$YxmU!6RR?K4u@+Jy?8A~iBTBKR0d zfbkcQcDv=7mLbzQMuwId@MOhhSBSSvDz&aoA|iBIdY$gMJN!PC$`T1aHKcgnoP=X= zkqEFux$Zx&Nr1tPAthah& zn9A~j)Z0vamb|vZQ*+| zQ@xxz)U^DyilU}PEX7m#V6*?@0Ouv|XqTJLQDRM%O&5R4D#yTeHA{out+KV6t;t_d z98^a1cbTa|rnyeQG?r3?RndUKmRIbd7Hj;Ng0#_zUZeG} zF7dxrG_iXJL*s7b!EdP4FA&E{U$_ zWQqovv;Y-$PO^4>98rnCWCfcY1^*b%dzgtZY0W!M8SHk6fr_Hz>e%tGbYi`t>-PcE ze~P~A6iLbP;CDJxb&9;$qRa!6HnLjh{62fp99ab$8DECkski79C}=rUR#!$~6f*Bn zeH#BHf~A@N6g<;F6d~_EyV!w7((i4N_7dnxQ2qb>B*bb{|Ga?o%*Y_w!zrLfOKQOU z*D?9mTn4BJ3I61AQuO~8a}|{F?;m|)AH=(#rQPoUGJqzl;iqLOx27q69O{-X@TMT3 zWs6lOy8>5DFk1un`(Ll)-`WW9Px#33 zd6@{Vhw<~|o`}$-vCUgYnnr6PYFhgxSO8Fj5&ZDY@+ddJP+%HK;Go0w2MF1W{;Yb2 zse|^#UAAES#S~pLi^Ic~dowjhed@&uB9dyhl})7>M{eK+x3x!+9d~rq)owO9P@yGL z{T#tLf#c_@?MNTE3Vj}v{5=0-F#g5>*9E#CaIE8x|CxkmBX|(~CpVtJmKjG$Z|yM` z*j)DR1rX43P(;-)ZzgMC3i;#LUnrZwpqdZDWFO=nb~u3Wc^PggO}O)!%V5PVp=L2cY>!jrCz3O(2@ zU%Px_PHEz5LyZC_4+TZVvAD?RFqNTW%bxf)jDREgqKP+lzoy~7L_>~2lOIa&5sa2$ zJPFy&$T-nd8-B?^n0D zZ7m~XgSH!ZEFH6j4})X6OJB8ySMIWFxKEUfz6D-iy=@UQX>Edq3_uRS)Y6X>V`DBz zh{7bWFFqX4iRM_PSI)FcLTF6~D0XJmq-)K9JzCCKSxsV~cq&kaCT`Nog?R{Y7es^k zXLEEL+!$wG=YR7XSfbq3n$o4c_ag1D;9MHuDA~E6eN{4lS`hxg&66xSM)(5x{tuHC zy%xH(+DXn0I)CZf-H|t|ISnxMsy3=P}q^XQdBwpBL1QcB6iwDju_D13q{Y^Y` z5$@ilV@F>K7F(-dc2%^}CKS}!=gXepjrF7GPlmEgQMd@Jzm?5ET>COOz>D6h1^}E! zrdAj*R-|R38_ryzc~*J<fiRxN>{%aM8$+CAix?-$uS^`h(1^C%x_25^*V%3{w5_w?QL;a7b&(`Bg2P*w<(#gx8Z0+LbvZ9c)?t1== zwRrY;5KT~tGTiz$vcGxp+ptPG*+ap1(PW3)`Hu(8M3ETM3HDN2V*Q`XRaTVn?__W& zZz$t$y#QHHQQ-*b3bcMe5Mg{c$AVmpa;&(|AmV&%qkH?9J=N~3lZ>9#j~0E4dTkm8 zqita#axB9L>&h#hpED-hQQJKiKk;JPaT>@T&td()7O=eTS5SiZnm4cz1_B3SV<|hO zycLN;smfL;i@HC;-H%Pc*D+V=C0Fu&!PXhT?fk<^$^$~o2;~2F5p7UY;rs{U0W8k{ z*AJ)&BwJ{v*|Rf}O*#ct02zj7ybQy{IH$y8E8*uQJDy_xMb7i3U(fjl;I$(Dqxuh| z??;aU#jaoP`2C>_FCO&a{K$?=4VB!y5K&SqDz*B^UxB-5P8|7Ee<8NJ_@|t01jt>Z zyJAdK%Fhbiu!x$J0{!!6{5RcuFH-ivO(xeWJ%##mYj=8or6@%}m6lVkJ)LWlc;WZ{ zDa`9<)6{;2W2pi1@P=%Gahns`ZS4f9QcTYqwUw3Sn!>m@BV2D&G1xu4b8HGAaN_}l7 zQi9xmfIcdjS-n1LW0H-S6)0s5W$!gbVf=ejh0>>Y3nHwloYt=`O#Dq`Z^igklj$hE zYCPW5^`=Zl4<~$(Iyk=F-6n6pD@@Rj7G=KNi6;Er86W!c4rdu{nm1dsP@QTk3Q@Fy zeo5(?&Xcj#ge?Adx;dzW7S&yrd&cK@m@K=CmPc zoBk=>+L$nqmu3Y_XG7;cnV7K_Xh^~b4lQ0Tk)$CV-gI==(Os}xFug!VT>2xBJIWf* zF!QldzGwptqhF)t$d=~7k#nftGFw(qMFefC#=x+9il_E@Ew?-0Z0ly+@ne5IvJx%d zNe^9&-z(XDg}e_IRL!GpV59?KO>>@oY$q1cnQ_(S>|#>B=s|1i+?_04a)1}8AZx1Y zdR2O0V{MSl>^~W=j?Qc&FIh$n=9m92NJ1!|S*cy55N@4vAZ6#Y6cJ#i-n9nLb=7UK z$}#CK|D@-`t8LY9J(E5aL~z2{48Ff91ZS%Mrr^GC-m}qFHIyOB=AbbV2X8dcM3B`+ z9Xo5pZ+MJsReN7orBxlbxPdnFMqOu8SuTW`R_-|?uiG4AlgVRgA8j7B<7Hct>_po; z#Lh~Xd(30dyuRBRCA-c+wzM%1q#mvI>}lAtVYCZX3x-cwW1d=v?|w5Geszus%(s<; z**&phTPY~SEtyr0YIg)`p2OED3eV(rqzmZ%DfPzi>ljn%M1(i82xdFZC!J)Jg|w6t z_RI(Eqa!`%+)a&~ytTCVpXEPq{fGeomM0Hrt!}7v0>fl_^{MO96!&jckydA zCh(to0(EUfnbLo;Wq_st7}>*LyLR$X4^fmZl|5o9{OI<(^6y-!xOlrE6x$;vpC_f{ zzu4rXt{`VNy~HKoMpAGWDwdH`&C(dXoYmM4*LJ##W%D+1JmEOiz?Y-3KdaRu@9L`P zaJUd?i#ES`sJe?t#ZRPfniicbhL)u#h|&4eig`XcKe2pmYT@uHlzvtb_EJ^gd?j-E3ae$49qwTIiSNK zZx)yPwU!C{-LAiH(h!j43;>aV!kMY?A1&>F_;q0Z2-;N2j}RwNmCG=CLkQ7o=5{5p zlc@&ybbSifI;MaWEPclBckHg?bnGkus8cI53AJ9dV=}l$$Z)H&lb**5dr)?Pt_cw0 z#?N3He^rMgb>(7&PBD45rE37vU9qeVu#=dO#3xL#vqN08hp8{4&q(Lx1ZvGrt!&f7 z!Vc+?IbIPF@kI zdV)fgYW^n6q*2uyUf}GNtITumb)5tPBeP3FTNU_QUWLR@?u*|*&Yd7H^lCZ;NPKi* zpd2_NdC5LH8p&Z8WuY)?H`ARMEm1Mo9|w)5@p3KW%bx?%=mMyn0t(i71qVgTF1eLM zXCs^LQ$qL98?}Y)=-Wh$7vyM=hclI7eoBWFPpm_QmTJz1PlKYZ`!UJFY+8G~pU`7z zYa<9r@S^^}<}EP}Y^e(qHq=~nx9l!rN`O(ZJZq`kC2?P&U1ohPp#Nsbo-8-V{xWfU z9Od!os$|B=DJK*ZBO)cD0`l0R;DlXN&}9ou(i>At&*S(KUnAyFoMF7<(wwId-G^P3 zUNea?4_%>kY-`7rDl!k5`B!xfl7B9KZ)Q%2y-h2^AwyE(ycjsyKOfbs?GPq{GnLQT z0^EKN=%TBt!rT0U-&{V538v`FGg3s;7c8Nj?eb!fa;S2wMU~7+M)1g0A6LSb4tsB1 zm+M`2*q$xXiPKi#iw{d`$~#KjLYj#*ylT2F1|C2<T5)TD6zBVoKiPUlk zp*SriY(+YCQI;_R8~LV+Gc;}B+Ty86gXjaVKUxv*fT-6rO;@Nk3^kE0B?4hwUN0dq zhk_quowO|=*l*35-xa*c!mXMNTN${Is3XoqIn@eAM;oO=o7kz}Y1$d$pC4Y#X&awP zs2R2mXtOdtXtyboL1MkADREYk-)d=)QY$R_42dv8Uv;g?D=cYgnjtNt8Q|(j7A;#8 z7{v5E)@IF?A2|xHt|s)FRjSz<4I*l1!e7&OJH-L^76l&UMAVxm@_2{5UmJ zR;&zOL`uVIw@5!V z%g4Gj@Sz}d`7dgN$Q3+nniHXFLV-f+2w4I=YW1&8j$GshMRyYZ8_$Q+#&0;&nN?s1 zYmQ#eS>B|DzJGjw^6CT)TKW&!Bb-7Xs)J2OJpLX|nYU-dl0lYEV;F`VR?ZIyrmJo> zo|W3i`J#bBVK*`738n1`M@&!qgos&HIi7;yH%+qf{FzcQRS^*M^Y7^X;*%V~w7AE+ zZJgRtfDD&Gxq!v^_yq?3wPo~dN-&yXx4h;5;D2}*g?C3U@((mUqpT!6r+yC_n~!|T5wef#DW ze%ed>8A#K-N2|%AqW+W4ev>-0;RuoR-n*NPblXD1l>?j-eS7Oy?#fObZ`CuRWQv;a zTg`!|(2)CFF7d=7YyTK_VOOL2F;~zG@+5OrQsY#|sy}bIy!1^$XQYnZogQb1<@fXZYZ&LQ|fxZ{p zkWTE$erMROgcdq+Ai|!Ht%gE5thgz`NK{?)FKob+HIJ4`VH-9(X~gkgbzUD!&FhRv zCMX`MElMk+I*BOBHr?Q07_e|gzrb8`dU?g`@Vil8BSYBDiSa#Ibi2lMfs*l?4}(Nf zq3=jiiIHQHs=NEm30)sV_k7kWo-df5En;gopUnQ$JYtC5zu@&COjnL*+tR67Z5@C3 z3cXmAc7yNL%U!VqU19;r2+2sF=a30#2 zsgn4$T>SD zaDLcyejHUDr58pS+-b@7yBZrkf>I{G2Vm6b|J0AbX$p`+su8O$60)f%3EPKY)vifsL)_Hxs@jMNYMnh`s-)eJp?K&O;C9aAQxdTmkIVF%W&@xQw8nsY3wB z?^49HAT#)Kf{;Y%+>fip*pOD}uRmf%WS6UV+i#z)#k%YF@_Sl=WP}GYv*?0$IE|}y z0zX2R5f@sAh)vNbY@x*Sn$3I6J-0iyNRD^3_fH}HuoS2pp%aujW9jaia*1?arFJl; ziiG=f^(l<^j1s>;v@eYfO>5N2)fyv;n!?k z@?Q~>nQjYlWs+U=uQ6??l~f^-2JPk|ri1k7N^n@RMO+#yWPa8eaSH{G3Ur1FJKB4Rel(J+2vgjyCa);Y>7^J8ZiGp}z> z{UDvwD>8dECUm1gB>K!3IpU0kpcb-tF(z3_$>YQJV=7DZj(4k!K67hH`SRrwuAGC< z^@~ru=`v$QGbya)7Y$PgJx#N?m)y}>R1NVc>I?A{dOBVsqSV+mLLfFp3NcV@Y~rUdb7*i*Kngw;!`La~bOl zgg8wOBF1=mtd*FM2`^jv_DQ;-j3><#r}+e<&~TN^^>AU9 z2xj$L_-oO7S$Xu~0L<^|R)?Qv!sn8+Sn!f{MImp3eeWO+*bH3)ra^}~<4g*pYxvHd zf-^TNzlVq~cs$k=i!~xp*!QZ$zPEUprPJQQu)c-WBU)E92Mdj^z6ut-^lUC}oLRwN z!|lY+$pchPKH~$Yl0Ew|zbgJpOV-;QL@+AxgsD+8!myoHu>BGQWR~;$2tOP<1^6U6 z&^RDfw9qen;q>W*@v=QpFX#PeP%L6SAWcXq$hJJS5qTC}pVG!^bYI=UmuvIhw zZU?iw51t8sK$1KuANS38K@-;Vs>bHo^RkmdasrBjTGF(~mk_}GwmQ0NZs zQSdoZVy%)}q5bG{%!7wYUfF%YGpY05&>VUAN6_Oh%1R%RLWp2ro_@Xj;6^!!ETAjp zW*%FqTjFl;C|d_XVKzYvJrmDo3`|1*+3A>fz@$pEk|Gg-v8qf zVC0gqLh^#4o8J}26mdpEkeywf1m%DTTI+SYHp;VEK=o0eRRUxstS>u??bZPTdYN=b zwh7%2kGDK}ku1SmJDVGqz@myvJ;md$H>b2%T{`eR!)AP>$t!LP;1X;wtuFt+7X8u$ zz#XA-z|@`Qbh##=eb?&2+JHqf*TqRNy<>Yp>akTOt+S1&3$XOXToB|qdiAs78B>&x z1gy)ZYZJ}Zz9U z%-fms$YLpHRlOmATFaWDtU46PJ^%reY%VSkd%#G~b~MP#oYN|ZYZDp8uGZ@Wz^eHR zp5Vw1FLqxJ=*?{75f&PK=F|albJF+eG9W)MUJ26G^hZ18w(whkpuLm|V_|DOccS`f zRhS0MC6VlcxA8VL$pRnu*}k+_Hd(*<=1q6GKb?$N_!y?|{*0`Ji|YKj8%5yl?F>36 z?>uvMQHKhHdVP2*?;N@{MMvlR`XKF*ZjJU>iDTdwA&+38SwZ-mJ$JaPoafJFk6V)u z+Yu1WyoH0X2tcpMUSzkN*z~pFor?8Ey&Z|0K))!ak=uxqnMbikh@d%VH_-WtKch)` z;tQ-!~)x;kL4G-8b(srYfg9O9VC4WP3ojfD9+ILE;Y}kS`QQsgP{F#6L?Z z6zhJf%hg`15Y@@hf7Xi#I+aVT8r;dsOM*2eIP}y={J81jr_}o%`z+0Dm0DVw1uIKu zH*TQv)jYOv;n!y~AlI1E%Q6??V4lxE(Nu)a<@V)5pE=&(;NWsE`66eMk#|uVXfSXS zU}ahopV+!;*OG95Ay3*!vxs5Qi0RtM#0~4vua9blUACmk4#!!~sT7|m+AysFa z=)ws1Q2QCz{iuto&vuI7?=)otfylFc)p! z2!Rc)k+#|+a!g-h6+3C zQ^l?~HD%mfCnf+s>%4HxZ)xFo3ZRvc<^V)@O2~20sf4BE{EQRLp+$pM=bd=zkMS

  • oq;Bv|r^z!(CRo2czbI-Hss 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 k+SEKPdKVGPb96DCY->#9ioy*LSW}6 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