diff --git a/backtracking/README.md b/backtracking/README.md index d4975dfb5ad7..fb43d75367ee 100644 --- a/backtracking/README.md +++ b/backtracking/README.md @@ -1,8 +1,59 @@ -# Backtracking +# Бэктрекинг (Backtracking) -Backtracking is a way to speed up the search process by removing candidates when they can't be the solution of a problem. +Бэктрекинг — это общий алгоритмический метод для нахождения всех (или некоторых) решений некоторых вычислительных задач, который постепенно строит кандидатов на решения и отказывается от кандидата, как только определяет, что он не может быть достроен до верного решения. -* -* -* -* +## Алгоритмы + +### `all_combinations.py` +Этот скрипт находит все возможные комбинации `k` чисел из диапазона от `1` до `n`. Он использует метод бэктрекинга для создания этих комбинаций. + +### `all_permutations.py` +Этот скрипт генерирует все возможные перестановки для заданной последовательности. Для создания перестановок он использует алгоритм бэктрекинга. + +### `all_subsequences.py` +Этот скрипт генерирует все возможные подпоследовательности для заданной последовательности. Для этого он использует алгоритм бэктрекинга. + +### `coloring.py` +Этот скрипт решает задачу о раскраске графа (задача m-раскраски). Цель состоит в том, чтобы раскрасить данный граф не более чем `m` цветами так, чтобы никакие две смежные вершины не имели одинакового цвета. + +### `combination_sum.py` +Этот скрипт решает задачу "Сумма комбинаций". Для заданного списка различных целых чисел он находит все комбинации этих чисел, которые в сумме дают заданное целевое значение. Каждое число можно использовать более одного раза. + +### `crossword_puzzle_solver.py` +Этот скрипт решает кроссворд с использованием алгоритма бэктрекинга. Он пытается разместить слова из заданного списка в сетке кроссворда, как по вертикали, так и по горизонтали. + +### `generate_parentheses.py` +Этот скрипт генерирует все комбинации правильно сформированных скобок для заданного числа пар `n`. Он использует метод бэктрекинга для создания комбинаций. + +### `hamiltonian_cycle.py` +Этот скрипт находит гамильтонов цикл в графе. Гамильтонов цикл — это путь, который посещает каждый узел ровно один раз и возвращается в начальный узел. Задача нахождения такого цикла является NP-полной. + +### `knight_tour.py` +Этот скрипт решает задачу о ходе коня. Цель состоит в том, чтобы найти последовательность ходов коня на шахматной доске, при которой конь посещает каждую клетку ровно один раз. + +### `match_word_pattern.py` +Этот скрипт определяет, соответствует ли заданный шаблон строке. Он использует бэктрекинг для сопоставления символов в шаблоне с подстроками во входной строке. + +### `minimax.py` +Этот скрипт реализует алгоритм минимакса, который используется в играх для двух игроков (таких как крестики-нолики, шахматы и т.д.), чтобы найти оптимальный ход. Он работает, минимизируя возможные потери в наихудшем сценарии (лучший ход противника). + +### `n_queens.py` +Этот скрипт решает задачу о N ферзях. Задача состоит в том, чтобы расставить N ферзей на шахматной доске N×N так, чтобы никакие два ферзя не угрожали друг другу. Таким образом, решение требует, чтобы никакие два ферзя не находились в одной строке, столбце или диагонали. + +### `n_queens_math.py` +Этот скрипт также решает задачу о N ферзях, но использует более математический подход, основанный на наклоне диагональных линий для проверки атак. Это альтернатива стандартному решению с бэктрекингом. + +### `power_sum.py` +Этот скрипт решает задачу "Сумма степеней". Он находит количество способов, которыми заданное целое число `X` может быть выражено как сумма N-х степеней уникальных натуральных чисел. + +### `rat_in_maze.py` +Этот скрипт решает задачу "Крыса в лабиринте". Цель состоит в том, чтобы найти путь для крысы от начальной клетки до конечной клетки в лабиринте. Лабиринт представлен в виде двумерной матрицы, где `0` — это открытые пути, а `1` — стены. + +### `sudoku.py` +Этот скрипт решает головоломку Судоку. Цель состоит в том, чтобы заполнить сетку 9x9 цифрами так, чтобы каждый столбец, каждая строка и каждая из девяти подсеток 3x3, составляющих сетку, содержали все цифры от 1 до 9. + +### `sum_of_subsets.py` +Этот скрипт решает задачу "Сумма подмножеств". Для заданного набора неотрицательных целых чисел и значения `M` цель состоит в том, чтобы найти все подмножества данного набора, элементы которых в сумме равны `M`. + +### `word_search.py` +Этот скрипт определяет, существует ли слово в сетке символов. Слово может быть составлено из букв последовательно смежных ячеек, где "смежные" ячейки являются соседними по горизонтали или вертикали. Одна и та же ячейка с буквой не может быть использована более одного раза. diff --git a/bit_manipulation/README.md b/bit_manipulation/README.md index 3f5e028beb8e..210edd088053 100644 --- a/bit_manipulation/README.md +++ b/bit_manipulation/README.md @@ -1,11 +1,85 @@ -# Bit manipulation +# Побитовые операции (Bit Manipulation) -Bit manipulation is the act of manipulating bits to detect errors (hamming code), encrypts and decrypts messages (more on that in the 'ciphers' folder) or just do anything at the lowest level of your computer. +Побитовые операции — это действия, выполняемые над битами для обнаружения ошибок (код Хэмминга), шифрования и дешифрования сообщений (подробнее об этом в папке ciphers) или для выполнения любых действий на самом низком уровне вашего компьютера. -* -* -* -* -* -* -* +## Алгоритмы + +### `binary_and_operator.py` +Этот скрипт выполняет побитовую операцию И над двумя целыми числами. + +### `binary_coded_decimal.py` +Этот скрипт преобразует целое число из десятичной системы в его двоично-десятичное (BCD) представление. Каждая цифра числа представляется 4-битным двоичным числом. + +### `binary_count_setbits.py` +Этот скрипт подсчитывает количество установленных битов (единиц) в двоичном представлении заданного целого числа. + +### `binary_count_trailing_zeros.py` +Этот скрипт подсчитывает количество конечных нулей в двоичном представлении заданного целого числа. + +### `binary_or_operator.py` +Этот скрипт выполняет побитовую операцию ИЛИ над двумя целыми числами. + +### `binary_shifts.py` +Этот скрипт предоставляет функции для логического сдвига влево, логического сдвига вправо и арифметического сдвига вправо для целых чисел. + +### `binary_twos_complement.py` +Этот скрипт вычисляет представление отрицательного целого числа в дополнительном коде (two's complement). + +### `binary_xor_operator.py` +Этот скрипт выполняет побитовую операцию ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) над двумя целыми числами. + +### `bitwise_addition_recursive.py` +Этот скрипт вычисляет сумму двух неотрицательных целых чисел с использованием побитовых операторов и рекурсии. + +### `count_1s_brian_kernighan_method.py` +Этот скрипт подсчитывает количество установленных битов (единиц) в целом числе с использованием алгоритма Брайана Кернигана. Этот метод эффективен, так как он выполняет итерации только столько раз, сколько установлено битов. + +### `count_number_of_one_bits.py` +Этот скрипт предоставляет два метода для подсчета количества установленных битов (единиц) в целом числе: один с использованием алгоритма Брайана Кернигана, а другой — с использованием оператора модуля. Он также включает в себя тест производительности для сравнения их эффективности. + +### `excess_3_code.py` +Этот скрипт преобразует целое число из десятичной системы в его код с избытком-3 (Excess-3). Это делается путем добавления 3 к каждой цифре десятичного числа, а затем преобразования каждой цифры в ее 4-битное двоичное представление. + +### `find_previous_power_of_two.py` +Этот скрипт находит наибольшую степень двойки, которая меньше или равна заданному целому числу. + +### `gray_code_sequence.py` +Этот скрипт генерирует n-битную последовательность кода Грея. Код Грея — это такая система счисления, в которой два последовательных значения различаются только в одном бите. + +### `highest_set_bit.py` +Этот скрипт возвращает позицию самого старшего установленного бита (наиболее значимого бита) числа. + +### `index_of_rightmost_set_bit.py` +Этот скрипт возвращает индекс (начиная с нуля) самого правого установленного бита (наименее значимого бита) числа. + +### `is_even.py` +Этот скрипт проверяет, является ли заданное целое число четным, проверяя наименее значимый бит. Если последний бит равен 0, число четное; в противном случае — нечетное. + +### `is_power_of_two.py` +Этот скрипт проверяет, является ли заданное положительное целое число степенью двойки. Число является степенью двойки, если в его двоичном представлении установлен только один бит. Скрипт использует свойство, что для степени двойки `n`, `n & (n - 1)` всегда равно нулю. + +### `largest_pow_of_two_le_num.py` +Этот скрипт находит наибольшую степень двойки, которая меньше или равна заданному числу. Он делает это, многократно сдвигая бит влево, пока значение не превысит заданное число. + +### `missing_number.py` +Этот скрипт находит пропущенное число в списке последовательных целых чисел, используя побитовую операцию XOR. + +### `numbers_different_signs.py` +Этот скрипт проверяет, имеют ли два целых числа противоположные знаки, используя побитовую операцию XOR. Если старший бит результата `num1 ^ num2` равен 1, числа имеют противоположные знаки. + +### `power_of_4.py` +Этот скрипт проверяет, является ли заданное положительное целое число степенью 4. Число является степенью 4, если оно является степенью 2 и его единственный установленный бит находится на нечетной позиции. + +### `reverse_bits.py` +Этот скрипт переворачивает биты 32-битного целого числа. + +### `single_bit_manipulation_operations.py` +Этот скрипт предоставляет функции для управления одним битом в целом числе: +- `set_bit`: Устанавливает бит в заданной позиции в 1. +- `clear_bit`: Сбрасывает бит в заданной позиции в 0. +- `flip_bit`: Инвертирует бит в заданной позиции. +- `is_bit_set`: Проверяет, установлен ли бит в заданной позиции. +- `get_bit`: Получает значение бита в заданной позиции. + +### `swap_all_odd_and_even_bits.py` +Этот скрипт меняет местами все нечетные и четные биты в целом числе. Например, бит 0 меняется с битом 1, бит 2 с битом 3 и так далее. diff --git a/blockchain/README.md b/blockchain/README.md index b5fab7b36eaa..e1cae360abcd 100644 --- a/blockchain/README.md +++ b/blockchain/README.md @@ -43,3 +43,8 @@ So this is all about introduction to blockchain technology. To learn more about * * * + +## Алгоритмы + +### `diophantine_equation.py` +Этот скрипт предоставляет функции для решения линейных диофантовых уравнений вида `ax + by = c`. Он может находить одно или несколько решений. Для нахождения наибольшего общего делителя и начальных решений используется расширенный алгоритм Евклида. diff --git a/boolean_algebra/README.md b/boolean_algebra/README.md index 45969c855f9c..9f5fe36aae05 100644 --- a/boolean_algebra/README.md +++ b/boolean_algebra/README.md @@ -1,7 +1,41 @@ -# Boolean Algebra +# Булева алгебра (Boolean Algebra) -Boolean algebra is used to do arithmetic with bits of values True (1) or False (0). -There are three basic operations: 'and', 'or' and 'not'. +Булева алгебра используется для выполнения арифметических операций с битами значений Истина (1) или Ложь (0). Существует три основные операции: «И», «ИЛИ» и «НЕ». -* -* +## Алгоритмы + +### `and_gate.py` +Этот скрипт реализует логический элемент И. Он возвращает 1 (Истина), если оба входа равны 1, и 0 (Ложь) в противном случае. + +### `imply_gate.py` +Этот скрипт реализует логический элемент ИМПЛИКАЦИЯ. Он возвращает 1 (Истина), если первый вход равен 0, или если первый вход равен 1 и второй вход равен 1. + +### `karnaugh_map_simplification.py` +Этот скрипт предоставляет функцию для упрощения 2-переменной карты Карно. Он принимает матрицу 2x2, представляющую карту Карно, и возвращает упрощенное булево выражение. Обратите внимание, что это очень простая реализация, которая не выполняет группировку членов, что является основной целью карт Карно. + +### `multiplexer.py` +Этот скрипт реализует мультиплексор 2-в-1 (MUX). Мультиплексор — это устройство, которое выбирает один из нескольких аналоговых или цифровых входных сигналов и направляет его на одну линию. Этот скрипт выбирает между двумя входами на основе управляющего сигнала. + +### `nand_gate.py` +Этот скрипт реализует логический элемент НЕ-И (NAND). Он возвращает 0 (Ложь), если оба входа равны 1, и 1 (Истина) в противном случае. Это отрицание элемента И. + +### `nimply_gate.py` +Этот скрипт реализует логический элемент НЕ-ИМПЛИКАЦИЯ (NIMPLY). Это отрицание элемента ИМПЛИКАЦИЯ. Он возвращает 1 (Истина) только если первый вход равен 1, а второй — 0. + +### `nor_gate.py` +Этот скрипт реализует логический элемент НЕ-ИЛИ (NOR). Он возвращает 1 (Истина), если оба входа равны 0, и 0 (Ложь) в противном случае. Это отрицание элемента ИЛИ. + +### `not_gate.py` +Этот скрипт реализует логический элемент НЕ (инвертор). Он инвертирует входной сигнал: если на входе 0, на выходе 1, а если на входе 1, на выходе 0. + +### `or_gate.py` +Этот скрипт реализует логический элемент ИЛИ. Он возвращает 1 (Истина), если хотя бы один из входов равен 1, и 0 (Ложь) в противном случае. + +### `quine_mc_cluskey.py` +Этот скрипт реализует алгоритм Куайна-Мак-Класки, который является методом, используемым для минимизации булевых функций. Он функционально идентичен картам Карно, но табличная форма делает его более эффективным для использования в компьютерных алгоритмах, а также дает детерминированный способ проверки того, что достигнута минимальная форма булевой функции. + +### `xnor_gate.py` +Этот скрипт реализует логический элемент ИСКЛЮЧАЮЩЕЕ НЕ-ИЛИ (XNOR). Он возвращает 1 (Истина), если входы одинаковы, и 0 (Ложь), если они разные. Это отрицание элемента ИСКЛЮЧАЮЩЕЕ ИЛИ. + +### `xor_gate.py` +Этот скрипт реализует логический элемент ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR). Он возвращает 1 (Истина), если входы разные, и 0 (Ложь), если они одинаковые. diff --git a/cellular_automata/README.md b/cellular_automata/README.md index c5681b33906c..4b22a027622e 100644 --- a/cellular_automata/README.md +++ b/cellular_automata/README.md @@ -1,8 +1,23 @@ -# Cellular Automata +# Клеточные автоматы (Cellular Automata) -Cellular automata are a way to simulate the behavior of "life", no matter if it is a robot or cell. -They usually follow simple rules but can lead to the creation of complex forms. -The most popular cellular automaton is Conway's [Game of Life](https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life). +Клеточные автоматы — это способ моделирования поведения "жизни", будь то робот или клетка. Они обычно следуют простым правилам, но могут приводить к созданию сложных форм. Самым популярным клеточным автоматом является "Игра Жизнь" Конвея. -* -* +## Алгоритмы + +### `conways_game_of_life.py` +Этот скрипт представляет собой реализацию "Игры Жизнь" Конвея, классического примера клеточного автомата. Скрипт может вычислять следующее поколение клеток и генерировать GIF-анимацию симуляции. + +### `game_of_life.py` +Этот скрипт — еще одна реализация "Игры Жизнь" Конвея. Он использует `numpy` для операций с массивами и `matplotlib` для создания анимации симуляции в реальном времени в окне графика. + +### `langtons_ant.py` +Этот скрипт реализует "муравья Лэнгтона", еще один тип клеточного автомата. Муравей движется по сетке из черных и белых клеток в соответствии с простым набором правил, что, тем не менее, приводит к сложному эмерджентному поведению. Скрипт использует `matplotlib` для создания анимации движения муравья. + +### `nagel_schrekenberg.py` +Этот скрипт реализует модель Нагеля-Шрекенберга, простую модель для симуляции потока движения на шоссе. Это тип клеточного автомата, где клетки представляют собой участки дороги, и каждая клетка может быть либо пустой, либо занятой транспортным средством с определенной скоростью. Модель обновляет положение транспортных средств на основе набора простых правил. + +### `one_dimensional.py` +Этот скрипт генерирует и визуализирует одномерный элементарный клеточный автомат. Состояние клетки в следующем поколении определяется ее собственным состоянием и состоянием двух ее соседей в текущем поколении, на основе заданного номера правила (от 0 до 255). + +### `wa_tor.py` +Этот скрипт реализует Wa-Tor, симуляцию динамики популяции на тороидальной планете. Он моделирует отношения хищник-жертва между акулами (хищниками) и рыбами (жертвами). Симуляция следует набору правил для движения, размножения и выживания обоих видов. diff --git a/ciphers/README.md b/ciphers/README.md index fa09874f38e5..d90d5d669d6f 100644 --- a/ciphers/README.md +++ b/ciphers/README.md @@ -1,7 +1,143 @@ -# Ciphers +# Шифры (Ciphers) -Ciphers are used to protect data from people that are not allowed to have it. They are everywhere on the internet to protect your connections. +Шифры используются для защиты данных от людей, которым не разрешен доступ к ним. Они повсеместно используются в интернете для защиты ваших соединений. -* -* -* +## Алгоритмы + +### `a1z26.py` +Этот скрипт реализует шифр A1Z26, который представляет собой простой шифр замены, где каждая буква заменяется ее порядковым номером в алфавите (A=1, B=2, C=3 и т.д.). + +### `affine_cipher.py` +Этот скрипт реализует аффинный шифр, тип моноалфавитного шифра замены. Функция шифрования — `(ax + b) mod m`, где `a` и `b` — ключи шифра, а `m` — размер алфавита. + +### `atbash.py` +Этот скрипт реализует шифр Атбаш, простой шифр замены, в котором алфавит переворачивается. Первая буква становится последней, вторая — предпоследней и так далее. + +### `autokey.py` +Этот скрипт реализует шифр с автоключом, который является полиалфавитным шифром замены. Он похож на шифр Виженера, но использует сам открытый текст для расширения ключа. Короткий начальный ключ добавляется к началу открытого текста для создания полного ключа. + +### `baconian_cipher.py` +Этот скрипт реализует шифр Бэкона, метод стеганографии (сокрытия сообщения), разработанный Фрэнсисом Бэконом. Каждая буква открытого текста заменяется последовательностью из пяти символов «A» и «B». + +### `base16.py` +Этот скрипт предоставляет функции для кодирования и декодирования в Base16 (шестнадцатеричный формат). Base16 используется для представления двоичных данных в формате строки ASCII путем преобразования данных в последовательность шестнадцатеричных цифр. + +### `base32.py` +Этот скрипт предоставляет функции для кодирования и декодирования в Base32. Base32 представляет двоичные данные с использованием 32-символьного набора. Он часто используется в средах, где важна нечувствительность к регистру. + +### `base64.py` +Этот скрипт предоставляет функции для кодирования и декодирования в Base64. Base64 — это широко используемый метод кодирования двоичных данных в формат строки ASCII путем преобразования их в 64-ричное представление. + +### `base85.py` +Этот скрипт предоставляет функции для кодирования и декодирования в Base85 (также известного как Ascii85). Base85 — это форма кодирования двоичных данных в текст, которая более эффективна по объему, чем Base64. + +### `beaufort_cipher.py` +Этот скрипт реализует шифр Бофора, который является полиалфавитным шифром замены, похожим на шифр Виженера. Он использует tabula recta (квадратную таблицу алфавитов) для шифрования и дешифрования. Шифр Бофора является реципрокным, что означает, что процессы шифрования и дешифрования идентичны. + +### `bifid.py` +Этот скрипт реализует бифидный шифр, фракционный шифр, который сочетает в себе квадрат Полибия с транспозицией. Сначала он преобразует буквы в их координаты в квадрате, затем записывает эти координаты в ряд и, наконец, преобразует пары координат обратно в буквы. + +### `brute_force_caesar_cipher.py` +Этот скрипт выполняет атаку полным перебором (brute-force) на сообщение, зашифрованное шифром Цезаря. Он расшифровывает сообщение, используя каждый возможный ключ (от 0 до 25), и выводит все возможные варианты открытого текста, позволяя человеку определить правильный. + +### `caesar_cipher.py` +Этот скрипт предоставляет функции для шифрования и дешифрования сообщений с использованием шифра Цезаря, простого шифра замены, в котором каждая буква смещается на определенное количество позиций по алфавиту. Он также включает функцию полного перебора для проверки всех возможных ключей. + +### `cryptomath_module.py` +Этот скрипт предоставляет функцию для нахождения модульного мультипликативного обратного числа. Это распространенная математическая операция, используемая в криптографии, в частности, в таких шифрах, как аффинный шифр и RSA. + +### `decrypt_caesar_with_chi_squared.py` +Этот скрипт предоставляет более продвинутый метод взлома шифра Цезаря. Вместо простого полного перебора с последующей интерпретацией человеком, он использует статистику хи-квадрат для программного определения наиболее вероятного открытого текста. Это достигается путем сравнения частот букв в расшифрованном тексте с известными частотами букв языка (по умолчанию английского). + +### `deterministic_miller_rabin.py` +Этот скрипт реализует детерминированную версию теста на простоту Миллера-Рабина. для чисел в определенном диапазоне (примерно до 3.32e24) он может однозначно определить, является ли число простым. для больших чисел он может дать вероятностный результат. + +### `diffie.py` +Этот скрипт представляет собой базовую реализацию обмена ключами Диффи-Хеллмана. Он включает в себя функцию для нахождения примитивного корня по модулю простого числа, что является необходимым компонентом алгоритма. Основная часть скрипта демонстрирует процесс обмена ключами между двумя сторонами, A и B. + +### `diffie_hellman.py` +Этот скрипт предоставляет более надежную, классо-ориентированную реализацию протокола обмена ключами Диффи-Хеллмана. Он использует предопределенные, стандартизированные простые числа и генераторы из RFC 3526 для различных уровней безопасности (например, 2048-битные, 4096-битные). Он также включает методы для проверки ключей и генерирует общий секрет путем хеширования результата. + +### `elgamal_key_generator.py` +Этот скрипт генерирует открытый и закрытый ключи для системы шифрования Эль-Гамаля. Он включает в себя генерацию большого простого числа, нахождение примитивного корня по модулю этого простого числа, а затем вычисление ключей на основе случайно выбранного закрытого ключа. Сгенерированные ключи сохраняются в текстовые файлы. + +### `enigma_machine2.py` +Этот скрипт представляет собой эмуляцию знаменитой шифровальной машины "Энигма", использовавшейся Германией во Второй мировой войне. Он имитирует ключевые компоненты "Энигмы", включая роторы, рефлектор и коммутационную панель (plugboard). Скрипт позволяет настраивать выбор роторов, их начальные позиции и параметры коммутационной панели. Благодаря рефлектору, процессы шифрования и дешифрования идентичны. + +### `fractionated_morse_cipher.py` +Этот скрипт реализует шифр дробного Морзе. Этот шифр сначала преобразует открытый текст в код Морзе, разделяет код Морзе символом 'x', а затем группирует строку Морзе в триграммы (группы по три). Каждая триграмма затем заменяется буквой из ключевого алфавита. Этот процесс "дробит" исходные буквы, делая шифр более надежным, чем простая замена. + +### `hill_cipher.py` +Этот скрипт реализует шифр Хилла, полиграфический шифр замены, основанный на линейной алгебре. Он использует матрицу в качестве ключа. Открытый текст разбивается на блоки, которые преобразуются в векторы. Каждый вектор затем умножается на ключевую матрицу для получения вектора шифротекста. Расшифровка выполняется путем умножения на обратную матрицу ключа. + +### `mixed_keyword_cypher.py` +Этот скрипт реализует шифр со смешанным ключевым словом. Он создает алфавит для шифра замены, сначала записывая ключевое слово (с удаленными повторяющимися буквами), а затем заполняя оставшуюся часть алфавита остальными буквами. Этот смешанный алфавит затем располагается в виде сетки, и окончательное сопоставление для замены создается путем считывания сетки по столбцам. + +### `mono_alphabetic_ciphers.py` +Этот скрипт предоставляет общую основу для моноалфавитных шифров замены. Он принимает ключ, который представляет собой перемешанную версию алфавита, и использует его для шифрования или дешифрования сообщения. Шифры Цезаря, Атбаш и ключевого слова являются частными случаями моноалфавитных шифров замены. + +### `morse_code.py` +Этот скрипт предоставляет функции для перевода текста в код Морзе и обратно. Он использует словарь для сопоставления символов с их соответствующими сериями точек и тире. + +### `onepad_cipher.py` +Этот скрипт реализует разновидность шифра Вернама (одноразового блокнота). Однако важно отметить, что это не истинный одноразовый блокнот, поскольку он использует генератор псевдослучайных чисел для создания ключа. Настоящий одноразовый блокнот требует предварительно разделенного, действительно случайного ключа той же длины, что и сообщение. Формула шифрования, используемая здесь, также является нестандартной. + +### `permutation_cipher.py` +Этот скрипт реализует перестановочный шифр, который является разновидностью шифра транспозиции. Сообщение делится на блоки фиксированного размера, и символы в каждом блоке переставляются в соответствии с ключом-перестановкой. + +### `playfair_cipher.py` +Этот скрипт реализует шифр Плейфера, ручной симметричный метод шифрования, который был первым шифром, использующим замену пар букв (диграмм). Он шифрует пары букв, а не отдельные буквы, как в простых шифрах замены. Метод использует таблицу 5x5, содержащую ключевое слово или фразу. + +### `polybius.py` +Этот скрипт реализует шифр квадрата Полибия. Это шифр замены, который использует сетку 5x5 (квадрат Полибия) для преобразования букв в пары чисел. Этот скрипт может как кодировать, так и декодировать сообщения. + +### `porta_cipher.py` +Этот скрипт реализует шифр Порты, полиалфавитный шифр замены, использующий ключевое слово. Алфавит делится на две половины, и в зависимости от буквы ключа выполняется определенная взаимная замена. Это реципрокный шифр, что означает, что процессы шифрования и дешифрования идентичны. + +### `rabin_miller.py` +Этот скрипт реализует тест на простоту Рабина-Миллера, вероятностный алгоритм для определения, является ли число простым. Он широко используется в криптографии для генерации больших простых чисел. Скрипт также включает функцию для генерации больших простых чисел заданного размера ключа. + +### `rail_fence_cipher.py` +Этот скрипт реализует шифр "железнодорожной изгороди", разновидность шифра транспозиции. Свое название он получил из-за способа шифрования: буквы открытого текста записываются зигзагом или "изгородью" по нескольким "рельсам" (ключ), а затем считываются ряд за рядом. + +### `rot13.py` +Этот скрипт реализует шифр ROT13, частный случай шифра Цезаря, где сдвиг составляет 13 позиций. Применение ROT13 к тексту, а затем повторное его применение восстанавливает исходный текст, поэтому одна и та же функция может использоваться как для шифрования, так и для дешифрования. + +### `rsa_cipher.py` +Этот скрипт реализует алгоритм RSA (Ривест-Шамир-Адлеман), широко используемую криптосистему с открытым ключом. Он предоставляет функции для шифрования и дешифрования сообщений. Процесс включает в себя преобразование сообщения в блоки целых чисел, выполнение модульного возведения в степень с открытым или закрытым ключом, а затем преобразование блоков обратно в текст. Он также включает функции для чтения ключей из файлов и для шифрования/дешифрования содержимого файлов. + +### `rsa_factorization.py` +Этот скрипт реализует алгоритм для эффективного нахождения простых множителей (`p` и `q`) модуля RSA `N`, если известны открытая экспонента `e` и закрытая экспонента `d`. Это демонстрирует математическую связь между открытым и закрытым ключами и простыми множителями модуля. + +### `rsa_key_generator.py` +Этот скрипт генерирует пары открытого и закрытого ключей для алгоритма RSA. Он следует стандартной процедуре: генерация двух больших простых чисел, вычисление модуля `n` и функции Эйлера `phi(n)`, выбор открытой экспоненты `e`, а затем вычисление закрытой экспоненты `d` как модульного мультипликативного обратного для `e`. Затем ключи сохраняются в файлы. + +### `running_key_cipher.py` +Этот скрипт реализует шифр с бегущим ключом, разновидность полиалфавитного шифра замены. Он похож на шифр Виженера, но вместо короткого, повторяющегося ключевого слова, он использует длинный отрывок текста (например, из книги) в качестве ключа. Ключ имеет ту же длину, что и открытый текст. + +### `shuffled_shift_cipher.py` +Этот скрипт реализует модифицированную версию шифра Цезаря. Он нацелен на большую безопасность за счет использования пароля для перемешивания алфавита, используемого для замены. Ключ сдвига также получается из пароля. Это значительно усложняет атаку полным перебором по сравнению со стандартным шифром Цезаря. + +### `simple_keyword_cypher.py` +Этот скрипт реализует простой шифр с ключевым словом. Ключевое слово используется для создания смешанного алфавита для моноалфавитной замены. Сначала записывается ключевое слово (с удаленными дубликатами), а затем остальные буквы алфавита в их обычном порядке. + +### `simple_substitution_cipher.py` +Этот скрипт реализует простой шифр замены. Он использует ключ, который является перестановкой алфавита. Каждая буква в открытом тексте заменяется буквой, находящейся на той же позиции в ключе. Это общая реализация моноалфавитного шифра замены. + +### `transposition_cipher.py` +Этот скрипт реализует шифр столбцовой транспозиции (разновидность маршрутного шифра). Открытый текст записывается в строки фиксированной длины (ключ), а затем шифротекст считывается столбец за столбцом. + +### `transposition_cipher_encrypt_decrypt_file.py` +Этот скрипт служит утилитой командной строки для скрипта `transposition_cipher.py`. Он позволяет пользователю шифровать или дешифровать целый файл с использованием шифра столбцовой транспозиции. + +### `trifid_cipher.py` +Этот скрипт реализует шифр Триффида, фракционный шифр, похожий на шифр Бифида, но использующий триграммы вместо диграмм. Каждая буква открытого текста преобразуется в триграмму (группу из трех чисел или символов), триграммы перемешиваются, а затем преобразуются обратно в буквы шифротекста. + +### `vernam_cipher.py` +Этот скрипт реализует шифр Вернама, который является потоковым шифром. По сути, он идентичен шифру Виженера. Название "шифр Вернама" иногда используется для обозначения одноразового блокнота, но эта реализация использует повторяющийся ключ, что делает его шифром Виженера, а не истинным одноразовым блокнотом. + +### `vigenere_cipher.py` +Этот скрипт реализует шифр Виженера, метод шифрования буквенного текста с использованием серии взаимосвязанных шифров Цезаря, основанных на буквах ключевого слова. Это форма полиалфавитной замены. + +### `xor_cipher.py` +Этот скрипт реализует шифр XOR, простой аддитивный потоковый шифр. Каждый символ открытого текста подвергается операции XOR с ключом. Та же самая операция используется как для шифрования, так и для дешифрования. Эта реализация использует одно целое число в качестве повторяющегося ключа. diff --git a/compression/README.md b/compression/README.md index bad7ae1a2f76..1eba332ec2b9 100644 --- a/compression/README.md +++ b/compression/README.md @@ -1,10 +1,26 @@ -# Compression +# Сжатие данных (Compression) -Data compression is everywhere, you need it to store data without taking too much space. -Either the compression loses some data (then we talk about lossy compression, such as .jpg) or it does not (and then it is lossless compression, such as .png) +Сжатие данных встречается повсеместно; оно необходимо для хранения данных без занятия слишком большого пространства. Сжатие может быть с потерей данных (тогда мы говорим о сжатии с потерями, например, .jpg) или без потерь (тогда это сжатие без потерь, например, .png). -Lossless compression is mainly used for archive purpose as it allows storing data without losing information about the file archived. On the other hand, lossy compression is used for transfer of file where quality isn't necessarily what is required (i.e: images on Twitter). +## Алгоритмы -* -* -* +### `burrows_wheeler.py` +Этот скрипт реализует преобразование Берроуза-Уиллера (BWT), обратимое преобразование, используемое при сжатии данных. BWT переставляет символы в строке, группируя одинаковые символы вместе, что делает строку более сжимаемой другими алгоритмами, такими как кодирование длин серий. + +### `huffman.py` +Этот скрипт реализует кодирование Хаффмана, популярный алгоритм для сжатия данных без потерь. Он работает, присваивая коды переменной длины входным символам в зависимости от их частот. Более частые символы получают более короткие коды, а менее частые — более длинные. + +### `lempel_ziv.py` +Этот скрипт предоставляет реализацию алгоритма сжатия, подобного Lempel-Ziv-Welch (LZW). LZW — это словарный алгоритм сжатия данных без потерь. Он работает, создавая словарь строк из входных данных и заменяя повторяющиеся вхождения строк кодами, которые указывают на запись в словаре. + +### `lempel_ziv_decompress.py` +Этот скрипт является дополнением к `lempel_ziv.py`. Он реализует алгоритм декомпрессии для данных, сжатых с помощью LZW-подобного алгоритма. Он читает сжатый файл, восстанавливает словарь и использует коды для реконструкции исходных данных. + +### `lz77.py` +Этот скрипт реализует алгоритм сжатия LZ77, еще один словарный метод сжатия данных без потерь. Он работает, используя "скользящее окно" по данным. Когда обнаруживается последовательность символов, которая уже встречалась в окне, она заменяется токеном, состоящим из смещения (насколько далеко назад встретилась последовательность) и длины (насколько длинная последовательность), плюс следующий символ в потоке. + +### `peak_signal_to_noise_ratio.py` +Этот скрипт вычисляет пиковое отношение сигнала к шуму (PSNR) между двумя изображениями. PSNR — это метрика, используемая для измерения качества восстановленного или сжатого изображения по сравнению с оригиналом. Более высокое значение PSNR обычно указывает на более высокое качество восстановления. Этот показатель часто используется для оценки производительности алгоритмов сжатия с потерями. + +### `run_length_encoding.py` +Этот скрипт реализует кодирование длин серий (RLE), простую форму сжатия данных без потерь. Он работает, заменяя последовательные серии одинаковых символов ("серии") одним значением и счетчиком. Например, "AAAABBBCCDAA" будет закодировано как `[('A', 4), ('B', 3), ('C', 2), ('D', 1), ('A', 2)]`. diff --git a/computer_vision/README.md b/computer_vision/README.md index 1657128fd25e..54b4fe5dfcff 100644 --- a/computer_vision/README.md +++ b/computer_vision/README.md @@ -1,11 +1,33 @@ -# Computer Vision +# Компьютерное зрение (Computer Vision) -Computer vision is a field of computer science that works on enabling computers to see, identify and process images in the same way that human does, and provide appropriate output. +Компьютерное зрение — это область компьютерных наук, которая работает над тем, чтобы компьютеры могли "видеть", идентифицировать и обрабатывать изображения так же, как это делает человек, и предоставлять соответствующий результат. -It is like imparting human intelligence and instincts to a computer. -Image processing and computer vision are a little different from each other. Image processing means applying some algorithms for transforming image from one form to the other like smoothing, contrasting, stretching, etc. +Это похоже на наделение компьютера человеческим интеллектом и инстинктами. Обработка изображений и компьютерное зрение немного отличаются друг от друга. Обработка изображений означает применение некоторых алгоритмов для преобразования изображения из одной формы в другую, например, сглаживание, контрастирование, растяжение и т.д. -While computer vision comes from modelling image processing using the techniques of machine learning, computer vision applies machine learning to recognize patterns for interpretation of images (much like the process of visual reasoning of human vision). +В то время как компьютерное зрение происходит от моделирования обработки изображений с использованием методов машинного обучения, компьютерное зрение применяет машинное обучение для распознавания образов для интерпретации изображений (во многом как процесс зрительного мышления человека). -* -* +## Алгоритмы + +### `cnn_classification.py` +Этот скрипт создает и обучает сверточную нейронную сеть (CNN) для классификации изображений. В качестве конкретного примера используется задача обнаружения туберкулеза на рентгеновских снимках легких. Он использует TensorFlow и Keras для определения архитектуры CNN, обучения модели на наборе данных и выполнения предсказаний на новых изображениях. + +### `flip_augmentation.py` +Этот скрипт выполняет аугментацию данных для набора изображений путем их отражения по горизонтали или вертикали. Аугментация данных — это техника, используемая для искусственного увеличения размера обучающего набора данных путем создания измененных копий существующих данных. Этот скрипт также корректирует соответствующие аннотации ограничивающих рамок (bounding box) для задач обнаружения объектов, чтобы они соответствовали отраженным изображениям. + +### `haralick_descriptors.py` +Этот скрипт вычисляет текстурные признаки Харалика, которые используются для количественной оценки текстуры изображения. Процесс включает в себя преобразование изображения в оттенки серого, создание матрицы совместной встречаемости, а затем вычисление различных статистических показателей из этой матрицы (таких как энергия, контраст, корреляция и т.д.). Эти дескрипторы могут использоваться для классификации и анализа текстур. + +### `harris_corner.py` +Этот скрипт реализует детектор углов Харриса, распространенный алгоритм в компьютерном зрении для определения углов на изображении. Углы — это области на изображении с большим изменением интенсивности во всех направлениях. Алгоритм работает, анализируя градиенты изображения в локальной окрестности. + +### `horn_schunck.py` +Этот скрипт реализует метод Хорна-Шанка для оценки оптического потока. Оптический поток — это паттерн видимого движения объектов между двумя последовательными кадрами в видео. Метод Хорна-Шанка предполагает постоянство яркости и плавность поля потока и итеративно уточняет оценку потока. + +### `mean_threshold.py` +Этот скрипт реализует простую технику пороговой обработки изображений. Он вычисляет среднее значение пикселей в полутоновом изображении и использует это среднее значение в качестве порога. Любой пиксель со значением больше среднего устанавливается в белый цвет (255), а любой пиксель со значением меньше или равным среднему — в черный (0). Это преобразует полутоновое изображение в бинарное. + +### `mosaic_augmentation.py` +Этот скрипт выполняет мозаичную аугментацию данных, технику, которая объединяет четыре обучающих изображения в одно в виде мозаики. Это помогает модели научиться распознавать объекты в разных масштабах и контекстах. Скрипт также корректирует аннотации ограничивающих рамок для всех четырех изображений, чтобы они соответствовали новому объединенному изображению. + +### `pooling_functions.py` +Этот скрипт предоставляет реализации двух распространенных функций пулинга (субдискретизации), используемых в сверточных нейронных сетях (CNN): максимальный пулинг (Max Pooling) и средний пулинг (Average Pooling). Слои пулинга используются для уменьшения пространственных размеров (ширины и высоты) входного объема, что помогает сократить количество параметров и вычислений в сети, а также контролировать переобучение. diff --git a/conversions/README.md b/conversions/README.md index ec3d931fd828..f0643e79cb4a 100644 --- a/conversions/README.md +++ b/conversions/README.md @@ -1,6 +1,95 @@ -# Conversion +# Преобразования (Conversions) -Conversion programs convert a type of data, a number from a numerical base or unit into one of another type, base or unit, e.g. binary to decimal, integer to string or foot to meters. +Программы для преобразования конвертируют данные одного типа, числа из одной системы счисления или единицы измерения в другой тип, систему счисления или единицу измерения, например, из двоичной в десятичную, из целого числа в строку или из футов в метры. -* -* +## Алгоритмы + +### `astronomical_length_scale_conversion.py` +Этот скрипт предоставляет функцию для преобразования между различными крупномасштабными метрическими единицами длины, от метров до йоттаметров. + +### `binary_to_decimal.py` +Этот скрипт предоставляет функцию для преобразования строкового представления двоичного числа в его десятичный целочисленный эквивалент. Он может обрабатывать как положительные, так и отрицательные двоичные числа. + +### `binary_to_hexadecimal.py` +Этот скрипт предоставляет функцию для преобразования двоичной строки в ее шестнадцатеричный эквивалент. Он работает, группируя двоичные цифры в наборы по четыре, а затем преобразуя каждую группу в соответствующий шестнадцатеричный символ. + +### `binary_to_octal.py` +Этот скрипт предоставляет функцию для преобразования двоичной строки в ее восьмеричный эквивалент. Он работает, группируя двоичные цифры в наборы по три, а затем преобразуя каждую группу в соответствующую восьмеричную цифру. + +### `convert_number_to_words.py` +Этот скрипт преобразует целое число в его словесное представление на английском языке. Он поддерживает различные системы счисления: короткую шкалу (используемую в большинстве англоязычных стран), длинную шкалу (используемую в некоторых европейских странах) и индийскую систему счисления. + +### `decimal_to_any.py` +Этот скрипт предоставляет функцию для преобразования положительного десятичного целого числа в его строковое представление в любой системе счисления от 2 до 36. для систем счисления больше 10 он использует буквы алфавита в качестве цифр. + +### `decimal_to_binary.py` +Этот скрипт предоставляет две различные функции для преобразования десятичного целого числа в его двоичное строковое представление: одна итеративная и одна рекурсивная. Обе функции могут обрабатывать положительные и отрицательные целые числа. + +### `decimal_to_hexadecimal.py` +Этот скрипт предоставляет функцию для преобразования десятичного целого числа в его шестнадцатеричное строковое представление. Функция может обрабатывать как положительные, так и отрицательные целые числа и возвращает шестнадцатеричную строку с префиксом "0x". + +### `decimal_to_octal.py` +Этот скрипт предоставляет функцию для преобразования положительного десятичного целого числа в его восьмеричное строковое представление. Функция возвращает восьмеричную строку с префиксом "0o". + +### `energy_conversions.py` +Этот скрипт предоставляет функцию для преобразования между различными единицами энергии, такими как джоули, калории, ватт-часы и британские тепловые единицы (BTU). + +### `excel_title_to_column.py` +Этот скрипт предоставляет функцию для преобразования заголовка столбца Excel (например, "A", "B", "AA", "AB") в соответствующий ему номер столбца (1, 2, 27, 28). + +### `hex_to_bin.py` +Этот скрипт предоставляет функцию для преобразования шестнадцатеричной строки в ее двоичный эквивалент. Он обрабатывает как положительные, так и отрицательные шестнадцатеричные числа. + +### `hexadecimal_to_decimal.py` +Этот скрипт предоставляет функцию для преобразования шестнадцатеричной строки в ее десятичный целочисленный эквивалент. Он обрабатывает как положительные, так и отрицательные шестнадцатеричные числа. + +### `ipv4_conversion.py` +Этот скрипт предоставляет функции для преобразования IPv4-адреса между его стандартной точечно-десятичной нотацией (например, "192.168.0.1") и его 32-битным целочисленным представлением. + +### `length_conversion.py` +Этот скрипт предоставляет функцию для преобразования между различными распространенными единицами длины, включая как метрические (метр, километр и т.д.), так и имперские/американские единицы (футы, дюймы, мили и т.д.). + +### `molecular_chemistry.py` +Этот скрипт предоставляет несколько функций для расчетов в молекулярной химии, основанных на законе идеального газа и понятиях молярности и нормальности. Его можно использовать для расчета давления, объема или температуры газа, а также для преобразования между молярностью и нормальностью. + +### `octal_to_binary.py` +Этот скрипт предоставляет функцию для преобразования восьмеричной строки в ее двоичный эквивалент. Он работает, преобразуя каждую восьмеричную цифру в ее 3-битное двоичное представление. + +### `octal_to_decimal.py` +Этот скрипт предоставляет функцию для преобразования восьмеричной строки в ее десятичный целочисленный эквивалент. Он может обрабатывать как положительные, так и отрицательные восьмеричные числа. + +### `octal_to_hexadecimal.py` +Этот скрипт предоставляет функцию для преобразования восьмеричной строки в ее шестнадцатеричный эквивалент. Он делает это, сначала преобразуя восьмеричное число в десятичное целое, а затем преобразуя десятичное целое в шестнадцатеричное. + +### `prefix_conversions.py` +Этот скрипт предоставляет функции для преобразования между различными метрическими (СИ) приставками (такими как кило, мега, гига) и двоичными приставками (такими как киби, меби, гиби, хотя в скрипте для них используются те же названия, что и для СИ). Это полезно для преобразования между единицами хранения данных или другими физическими величинами. + +### `prefix_conversions_string.py` +Этот скрипт похож на `prefix_conversions.py`, но работает в обратном направлении. Он принимает числовое значение и автоматически форматирует его в строку с наиболее подходящей приставкой СИ или двоичной приставкой (например, 10000 становится "10.0 kilo"). + +### `pressure_conversions.py` +Этот скрипт предоставляет функцию для преобразования между различными единицами давления, такими как паскали, бары, атмосферы (атм) и фунты на квадратный дюйм (psi). + +### `rgb_cmyk_conversion.py` +Этот скрипт предоставляет функцию для преобразования цвета из цветовой модели RGB (красный, зеленый, синий) в цветовую модель CMYK (голубой, пурпурный, желтый, ключевой/черный). RGB используется для цифровых дисплеев, в то время как CMYK используется для печати. + +### `rgb_hsv_conversion.py` +Этот скрипт предоставляет функции для преобразования цвета между цветовыми моделями RGB (красный, зеленый, синий) и HSV (тон, насыщенность, значение). HSV часто считается более интуитивно понятной для художников и дизайнеров, поскольку она разделяет цветовые компоненты таким образом, который лучше соответствует человеческому восприятию. + +### `roman_numerals.py` +Этот скрипт предоставляет функции для преобразования между римскими цифрами и современными целыми числами. Он включает в себя `roman_to_int` для преобразования строки с римскими цифрами в целое число и `int_to_roman` для преобразования целого числа в его представление римскими цифрами. + +### `speed_conversions.py` +Этот скрипт предоставляет функцию для преобразования между различными распространенными единицами скорости, такими как километры в час (км/ч), метры в секунду (м/с), мили в час (миль/ч) и узлы. + +### `temperature_conversions.py` +Этот скрипт предоставляет исчерпывающий набор функций для преобразования между различными единицами температуры, включая Цельсий, Фаренгейт, Кельвин, Ранкин и Реомюр. + +### `time_conversions.py` +Этот скрипт предоставляет функцию для преобразования между различными распространенными единицами времени, такими как секунды, минуты, часы, дни, недели, месяцы и годы. + +### `volume_conversions.py` +Этот скрипт предоставляет функцию для преобразования между различными распространенными единицами объема, такими как кубические метры, литры, галлоны и кубические футы. + +### `weight_conversion.py` +Этот скрипт предоставляет функцию для преобразования между различными распространенными единицами веса/массы, такими как килограммы, граммы, фунты, унции и тонны. diff --git a/data_structures/README.md b/data_structures/README.md new file mode 100644 index 000000000000..4c5ea2364a8f --- /dev/null +++ b/data_structures/README.md @@ -0,0 +1,32 @@ +# Структуры данных (Data Structures) + +В этом разделе собраны реализации различных фундаментальных структур данных. Каждая поддиректория посвящена определенному типу структуры данных и содержит реализации соответствующих алгоритмов. + +## Поддиректории + +### [Массивы (Arrays)](arrays/README.md) +Реализации различных алгоритмов, работающих с массивами. + +### [Двоичные деревья (Binary Trees)](binary_tree/README.md) +Реализации различных видов двоичных деревьев (поиска, АВЛ, красно-черные) и связанных с ними алгоритмов. + +### [Система непересекающихся множеств (Disjoint Set)](disjoint_set/README.md) +Реализации структуры данных Disjoint Set Union (Union-Find) с оптимизациями. + +### [Хеширование (Hashing)](hashing/README.md) +Реализации хеш-таблиц, хеш-карт и различных методов разрешения коллизий. + +### [Куча (Heap)](heap/README.md) +Реализации различных видов куч, включая биномиальную, косую и стандартные минимальные/максимальные кучи. + +### [Связный список (Linked List)](linked_list/README.md) +Реализации односвязных, двусвязных и кольцевых связных списков, а также связанных с ними алгоритмов. + +### [Очередь (Queue)](queue/README.md) +Реализации различных видов очередей: стандартной, кольцевой, двусторонней (дек) и приоритетной. + +### [Стек (Stack)](stacks/README.md) +Реализации стека и его применение для решения различных задач, таких как проверка сбалансированности скобок и преобразование арифметических выражений. + +### [Префиксное дерево (Trie)](trie/README.md) +Реализации префиксных и радиксных деревьев для эффективного хранения и поиска строк. diff --git a/data_structures/arrays/README.md b/data_structures/arrays/README.md new file mode 100644 index 000000000000..6e384611e1b9 --- /dev/null +++ b/data_structures/arrays/README.md @@ -0,0 +1,41 @@ +# Массивы (Arrays) + +В этом разделе собраны алгоритмы, связанные с операциями над массивами. + +## Алгоритмы + +### `equilibrium_index_in_array.py` +Этот скрипт находит индекс равновесия в массиве. Индекс равновесия — это такой индекс, что сумма элементов с меньшими индексами равна сумме элементов с большими индексами. + +### `find_triplets_with_0_sum.py` +Этот скрипт предоставляет две функции для решения задачи "3-Sum": нахождение всех уникальных троек в списке целых чисел, которые в сумме дают ноль. Одна функция использует подход "грубой силы" с помощью `itertools.combinations`, а другая — более эффективный подход на основе хеширования. + +### `index_2d_array_in_1d.py` +Этот скрипт предоставляет два способа обращения с 2D-массивом (списком списков) так, как если бы он был 1D-массивом. Он предлагает итератор (`Index2DArrayIterator`) для последовательного перебора всех элементов и функцию (`index_2d_array_in_1d`) для доступа к элементу по одному 1D-индексу. + +### `kth_largest_element.py` +Этот скрипт предоставляет функцию для нахождения k-го по величине элемента в массиве. Он использует стратегию разделения, подобную той, что используется в QuickSort. Этот подход, как правило, более эффективен, чем полная сортировка массива, особенно для больших массивов, когда `k` мало. + +### `median_two_array.py` +Этот скрипт предоставляет функцию для нахождения медианы двух отсортированных массивов. Он делает это, объединяя два массива в один отсортированный массив, а затем находя средний элемент (или среднее двух средних элементов, если общее количество элементов четное). + +### `monotonic_array.py` +Этот скрипт предоставляет функцию для проверки, является ли массив монотонным. Массив является монотонным, если он либо монотонно возрастает, либо монотонно убывает. + +### `pairs_with_given_sum.py` +Этот скрипт предоставляет функцию для подсчета количества пар элементов в массиве, сумма которых равна заданному целевому значению. Он использует `itertools.combinations` для генерации всех возможных пар и проверки их суммы. + +### `permutations.py` +Этот скрипт предоставляет две различные функции для генерации всех перестановок списка чисел: одна использует рекурсивный подход, а другая — алгоритм бэктрекинга. + +### `prefix_sum.py` +Этот скрипт реализует класс `PrefixSum`. Массив префиксных сумм (также известный как массив кумулятивных сумм) — это структура данных, которая позволяет быстро вычислять сумму элементов в любом подмассиве. Эта реализация предоставляет метод для получения суммы в заданном диапазоне за время O(1) и метод для проверки существования подмассива с заданной целевой суммой. + +### `product_sum.py` +Этот скрипт вычисляет "сумму-произведение" для особого типа массива, который может содержать как целые числа, так и другие вложенные массивы. Сумма-произведение вычисляется путем суммирования элементов, где сумма любого вложенного массива умножается на его глубину вложенности. + +### `sparse_table.py` +Этот скрипт реализует разреженную таблицу (Sparse Table), структуру данных, используемую для эффективного ответа на запросы по диапазону в статическом массиве. Эта конкретная реализация предназначена для запросов о минимуме на диапазоне (RMQ), что означает, что она может найти минимальное значение в любом заданном подмассиве за время O(1) после предварительной обработки за O(n log n). + +### `sudoku_solver.py` +Этот скрипт предоставляет сложный решатель Судоку, написанный Питером Норвигом. Он использует методы распространения ограничений и поиска (в частности, поиск в глубину) для решения головоломок Судоку. Он представляет доску в виде сетки квадратов и использует словарь для отслеживания возможных значений для каждого квадрата, исключая возможности по мере решения. diff --git a/data_structures/binary_tree/README.md b/data_structures/binary_tree/README.md index ebe727b6589d..529fd8f7df63 100644 --- a/data_structures/binary_tree/README.md +++ b/data_structures/binary_tree/README.md @@ -1,111 +1,111 @@ -# Binary Tree Traversal +# Двоичное дерево (Binary Tree) -## Overview +## Обход двоичного дерева (Binary Tree Traversal) -The combination of binary trees being data structures and traversal being an algorithm relates to classic problems, either directly or indirectly. +Сочетание двоичных деревьев как структур данных и обхода как алгоритма относится к классическим задачам, прямо или косвенно. -> If you can grasp the traversal of binary trees, the traversal of other complicated trees will be easy for you. +> Если вы сможете понять обход двоичных деревьев, обход других сложных деревьев станет для вас простым. -The following are some common ways to traverse trees. +Ниже приведены некоторые распространенные способы обхода деревьев. -- Depth First Traversals (DFS): In-order, Pre-order, Post-order +- **Обходы в глубину (DFS):** симметричный (in-order), прямой (pre-order), обратный (post-order) +- **Обход в ширину (BFS) или поуровневый обход** -- Level Order Traversal or Breadth First or Traversal (BFS) +И для DFS, и для BFS есть свои применения. -There are applications for both DFS and BFS. +Стек можно использовать для упрощения процесса обхода DFS. Кроме того, поскольку дерево является рекурсивной структурой данных, рекурсия и стек — два ключевых момента для DFS. -Stack can be used to simplify the process of DFS traversal. Besides, since tree is a recursive data structure, recursion and stack are two key points for DFS. +## Алгоритмы и Структуры Данных -Graph for DFS: +### `avl_tree.py` +Этот скрипт предоставляет реализацию АВЛ-дерева, которое является самобалансирующимся двоичным деревом поиска. В АВЛ-дереве высоты двух дочерних поддеревьев любого узла различаются не более чем на единицу. Это гарантирует, что дерево остается сбалансированным, и операции, такие как вставка, удаление и поиск, имеют временную сложность в худшем случае O(log n). -![binary-tree-traversal-dfs](https://tva1.sinaimg.cn/large/007S8ZIlly1ghluhzhynsg30dw0dw3yl.gif) +### `basic_binary_tree.py` +Этот скрипт предоставляет базовую реализацию двоичного дерева. Он включает класс `Node` и класс `BinaryTree` с методами для итерации по дереву (внутренний обход), получения его длины и глубины, а также проверки, является ли оно полным двоичным деревом. -The key point of BFS is how to determine whether the traversal of each level has been completed. The answer is to use a variable as a flag to represent the end of the traversal of current level. +### `binary_search_tree.py` +Этот скрипт предоставляет комплексную реализацию двоичного дерева поиска (BST). BST — это узловая структура данных, в которой левое поддерево узла содержит только узлы со значениями, меньшими значения узла, а правое — только со значениями большими. Эта реализация включает методы для вставки, поиска, удаления, нахождения минимума/максимума и различных обходов дерева. -## Pre-order Traversal +### `binary_search_tree_recursive.py` +Этот скрипт предоставляет еще одну реализацию двоичного дерева поиска (BST), но эта использует рекурсию для своих основных операций, таких как вставка и поиск. -The traversal order of pre-order traversal is `root-left-right`. +### `binary_tree_mirror.py` +Этот скрипт предоставляет функцию для создания зеркального отображения двоичного дерева. Он обходит дерево и меняет местами левого и правого потомков у каждого узла. -Algorithm Pre-order +### `binary_tree_node_sum.py` +Этот скрипт вычисляет сумму значений всех узлов в двоичном дереве. Он делает это, выполняя обход дерева в глубину (DFS) и накапливая значения. -1. Visit the root node and push it into a stack. +### `binary_tree_path_sum.py` +Этот скрипт находит количество путей в двоичном дереве, где сумма значений узлов вдоль пути равна заданному целевому значению. Пути не обязательно должны начинаться с корня или заканчиваться листом, но они должны идти вниз. -2. Pop a node from the stack, and push its right and left child node into the stack respectively. +### `binary_tree_traversals.py` +Этот скрипт предоставляет реализации различных алгоритмов обхода двоичного дерева. Сюда входят стандартные обходы в глубину (прямой, внутренний, обратный), обход в ширину (поуровневый) и более специализированные обходы, такие как обратный внутренний и зигзагообразный. -3. Repeat step 2. +### `diameter_of_binary_tree.py` +Этот скрипт вычисляет диаметр (или ширину) двоичного дерева. Диаметр определяется как количество узлов на самом длинном пути между любыми двумя узлами в дереве. -Conclusion: This problem involves the classic recursive data structure (i.e. a binary tree), and the algorithm above demonstrates how a simplified solution can be reached by using a stack. +### `diff_views_of_binary_tree.py` +Этот скрипт предоставляет функции для получения различных "видов" двоичного дерева: вид слева, вид справа, вид сверху и вид снизу. Каждый вид показывает узлы, которые видны с этой конкретной перспективы. -If you look at the bigger picture, you'll find that the process of traversal is as followed. `Visit the left subtrees respectively from top to bottom, and visit the right subtrees respectively from bottom to top`. If we are to implement it from this perspective, things will be somewhat different. For the `top to bottom` part we can simply use recursion, and for the `bottom to top` part we can turn to stack. +### `distribute_coins.py` +Этот скрипт решает задачу "Распределение монет в двоичном дереве". Цель состоит в том, чтобы найти минимальное количество ходов, необходимое для того, чтобы в каждом узле была ровно одна монета. -## In-order Traversal +### `fenwick_tree.py` +Этот скрипт предоставляет реализацию дерева Фенвика, также известного как двоичное индексированное дерево (BIT). Дерево Фенвика — это структура данных, которая может эффективно обновлять элементы и вычислять префиксные суммы за время O(log n). -The traversal order of in-order traversal is `left-root-right`. +### `flatten_binarytree_to_linkedlist.py` +Этот скрипт предоставляет функцию для "сглаживания" двоичного дерева в структуру, напоминающую связанный список, используя правые указатели узлов и устанавливая левые в `None`. -So the root node is not printed first. Things are getting a bit complicated here. +### `floor_and_ceiling.py` +Этот скрипт предоставляет функцию для нахождения "пола" (наибольшего элемента, меньшего или равного ключу) и "потолка" (наименьшего элемента, большего или равного ключу) для заданного ключа в двоичном дереве поиска. -Algorithm In-order +### `inorder_tree_traversal_2022.py` +Этот скрипт предоставляет реализацию внутреннего обхода (in-order) для двоичного дерева поиска, при котором узлы посещаются в порядке возрастания их значений. -1. Visit the root and push it into a stack. +### `is_sorted.py` +Этот скрипт предоставляет функцию для проверки, является ли двоичное дерево действительным двоичным деревом поиска (BST). -2. If there is a left child node, push it into the stack. Repeat this process until a leaf node reached. +### `is_sum_tree.py` +Этот скрипт предоставляет функцию для проверки, является ли двоичное дерево "деревом сумм", где значение каждого узла, не являющегося листом, равно сумме значений в его поддеревьях. - > At this point the root node and all the left nodes are in the stack. +### `lazy_segment_tree.py` +Этот скрипт реализует дерево отрезков с отложенным распространением (Lazy Propagation) для эффективного выполнения запросов и обновлений на диапазоне. -3. Start popping nodes from the stack. If a node has a right child node, push the child node into the stack. Repeat step 2. +### `lowest_common_ancestor.py` +Этот скрипт находит наименьшего общего предка (LCA) двух узлов в дереве, используя поиск в ширину и технику разреженной таблицы. -It's worth pointing out that the in-order traversal of a binary search tree (BST) is a sorted array, which is helpful for coming up simplified solutions for some problems. +### `maximum_fenwick_tree.py` +Этот скрипт предоставляет реализацию дерева Фенвика, специально разработанного для запросов о максимуме на диапазоне. -## Post-order Traversal +### `merge_two_binary_trees.py` +Этот скрипт предоставляет функцию для слияния двух двоичных деревьев путем суммирования значений пересекающихся узлов. -The traversal order of post-order traversal is `left-right-root`. +### `mirror_binary_tree.py` +Этот скрипт предоставляет функцию для зеркального отображения двоичного дерева путем рекурсивной замены левых и правых потомков. -This one is a bit of a challenge. It deserves the `hard` tag of LeetCode. +### `non_recursive_segment_tree.py` +Этот скрипт предоставляет нерекурсивную реализацию дерева отрезков, которая часто более эффективна на практике. -In this case, the root node is printed not as the first but the last one. A cunning way to do it is to: +### `number_of_possible_binary_trees.py` +Этот скрипт вычисляет количество возможных двоичных деревьев и двоичных деревьев поиска, которые можно сформировать из заданного количества узлов, используя числа Каталана. -Record whether the current node has been visited. If 1) it's a leaf node or 2) both its left and right subtrees have been traversed, then it can be popped from the stack. +### `red_black_tree.py` +Этот скрипт предоставляет реализацию красно-черного дерева, еще одного типа самобалансирующегося двоичного дерева поиска, которое гарантирует логарифмическую сложность операций. -As for `1) it's a leaf node`, you can easily tell whether a node is a leaf if both its left and right are `null`. +### `segment_tree.py` +Этот скрипт предоставляет рекурсивную реализацию дерева отрезков для эффективных запросов по диапазону. -As for `2) both its left and right subtrees have been traversed`, we only need a variable to record whether a node has been visited or not. In the worst case, we need to record the status for every single node and the space complexity is `O(n)`. But if you come to think about it, as we are using a stack and start printing the result from the leaf nodes, it makes sense that we only record the status for the current node popping from the stack, reducing the space complexity to `O(1)`. +### `segment_tree_other.py` +Этот скрипт предоставляет еще одну, более объектно-ориентированную реализацию дерева отрезков. -## Level Order Traversal +### `serialize_deserialize_binary_tree.py` +Этот скрипт предоставляет функции для сериализации двоичного дерева в строку и десериализации строки обратно в двоичное дерево. -The key point of level order traversal is how do we know whether the traversal of each level is done. The answer is that we use a variable as a flag representing the end of the traversal of the current level. +### `symmetric_tree.py` +Этот скрипт предоставляет функцию для проверки, является ли двоичное дерево зеркальным отражением самого себя. -![binary-tree-traversal-bfs](https://tva1.sinaimg.cn/large/007S8ZIlly1ghlui1tpoug30dw0dw3yl.gif) +### `treap.py` +Этот скрипт предоставляет реализацию декартова дерева (Treap), рандомизированного двоичного дерева поиска, которое использует приоритеты для поддержания баланса. -Algorithm Level-order - -1. Visit the root node, put it in a FIFO queue, put in the queue a special flag (we are using `null` here). - -2. Dequeue a node. - -3. If the node equals `null`, it means that all nodes of the current level have been visited. If the queue is empty, we do nothing. Or else we put in another `null`. - -4. If the node is not `null`, meaning the traversal of current level has not finished yet, we enqueue its left subtree and right subtree respectively. - -## Bi-color marking - -We know that there is a tri-color marking in garbage collection algorithm, which works as described below. - -- The white color represents "not visited". - -- The gray color represents "not all child nodes visited". - -- The black color represents "all child nodes visited". - -Enlightened by tri-color marking, a bi-color marking method can be invented to solve all three traversal problems with one solution. - -The core idea is as follow. - -- Use a color to mark whether a node has been visited or not. Nodes yet to be visited are marked as white and visited nodes are marked as gray. - -- If we are visiting a white node, turn it into gray, and push its right child node, itself, and it's left child node into the stack respectively. - -- If we are visiting a gray node, print it. - -Implementation of pre-order and post-order traversal algorithms can be easily done by changing the order of pushing the child nodes into the stack. - -Reference: [LeetCode](https://github.com/azl397985856/leetcode/blob/master/thinkings/binary-tree-traversal.en.md) +### `wavelet_tree.py` +Этот скрипт предоставляет реализацию вейвлет-дерева, компактной структуры данных для эффективных запросов по диапазону, таких как запрос квантиля и ранга. diff --git a/data_structures/disjoint_set/README.md b/data_structures/disjoint_set/README.md new file mode 100644 index 000000000000..0557dde27eca --- /dev/null +++ b/data_structures/disjoint_set/README.md @@ -0,0 +1,11 @@ +# Система непересекающихся множеств (Disjoint Set) + +Система непересекающихся множеств (также известная как Union-Find) — это структура данных, которая хранит набор непересекающихся (неперекрывающихся) подмножеств. Она предоставляет операции для добавления новых множеств, объединения множеств и определения, в каком множестве находится конкретный элемент. + +## Алгоритмы + +### `alternate_disjoint_set.py` +Этот скрипт предоставляет реализацию структуры данных "Система непересекающихся множеств" (Disjoint Set Union, DSU). Он использует две ключевые оптимизации: объединение по рангу и сжатие путей, что делает его операции в среднем почти постоянными по времени. + +### `disjoint_set.py` +Этот скрипт предоставляет еще одну реализацию структуры данных "Система непересекающихся множеств" (DSU). Он использует класс `Node` для представления элементов и реализует основные операции DSU: `make_set`, `union_set` и `find_set`. Эта версия также использует оптимизации объединения по рангу и сжатия путей. diff --git a/data_structures/hashing/README.md b/data_structures/hashing/README.md new file mode 100644 index 000000000000..60864469487a --- /dev/null +++ b/data_structures/hashing/README.md @@ -0,0 +1,26 @@ +# Хеширование (Hashing) + +Хеширование — это процесс преобразования входных данных произвольной длины в выходные данные фиксированной длины. Это делается с помощью математических формул, известных как хеш-функции. + +## Алгоритмы + +### `bloom_filter.py` +Этот скрипт предоставляет реализацию фильтра Блума. Фильтр Блума — это пространственно-эффективная вероятностная структура данных, которая используется для проверки принадлежности элемента к множеству. Возможны ложноположительные срабатывания, но ложноотрицательные — нет. + +### `double_hash.py` +Этот скрипт предоставляет реализацию двойного хеширования, метода разрешения коллизий для хеш-таблиц с открытой адресацией. Когда происходит коллизия, используется вторая хеш-функция для вычисления смещения. + +### `hash_map.py` +Этот скрипт предоставляет реализацию хеш-карты (или словаря) с нуля, используя открытую адресацию с линейным пробированием для разрешения коллизий. Он также динамически изменяет размер для поддержания эффективности. + +### `hash_table.py` +Этот скрипт предоставляет базовую реализацию хеш-таблицы с использованием открытой адресации и линейного пробирования в качестве стратегии разрешения коллизий по умолчанию. Он также включает механизм рехеширования. + +### `hash_table_with_linked_list.py` +Этот скрипт предоставляет реализацию хеш-таблицы, которая использует метод цепочек со связанными списками для разрешения коллизий. Каждый бакет в таблице указывает на связанный список элементов, которые хешируются в этот бакет. + +### `number_theory/prime_numbers.py` +Этот скрипт предоставляет функции, связанные с простыми числами, такие как проверка на простоту и нахождение следующего простого числа. Они часто используются в хешировании. + +### `quadratic_probing.py` +Этот скрипт предоставляет реализацию квадратичного пробирования, метода разрешения коллизий, при котором смещения от исходного хеш-индекса увеличиваются квадратично. diff --git a/data_structures/heap/README.md b/data_structures/heap/README.md new file mode 100644 index 000000000000..041c81c04caf --- /dev/null +++ b/data_structures/heap/README.md @@ -0,0 +1,26 @@ +# Куча (Heap) + +В информатике куча — это специализированная древовидная структура данных, которая удовлетворяет свойству кучи: если P является родительским узлом C, то ключ (значение) P либо больше или равен (в максимальной куче), либо меньше или равен (в минимальной куче) ключу C. + +## Алгоритмы + +### `binomial_heap.py` +Этот скрипт предоставляет реализацию биномиальной кучи. Биномиальная куча — это специфическая реализация структуры данных "куча", которая поддерживает эффективное слияние двух куч. Она представляет собой коллекцию биномиальных деревьев. Эта реализация предоставляет методы для вставки, удаления минимального элемента и слияния двух куч. + +### `heap.py` +Этот скрипт предоставляет обобщенную реализацию максимальной кучи (Max Heap). Максимальная куча — это специализированная древовидная структура данных, которая удовлетворяет свойству кучи: в максимальной куче для любого заданного узла C, если P является родительским узлом C, то значение P больше или равно значению C. Скрипт включает методы для построения кучи из массива, вставки элемента, извлечения максимального элемента и пирамидальной сортировки. + +### `heap_generic.py` +Этот скрипт предоставляет обобщенную реализацию кучи. Он может функционировать как минимальная, так и максимальная куча в зависимости от ключевой функции, предоставленной при инициализации. Он поддерживает вставку, удаление и обновление элементов, что делает его гибкой приоритетной очередью. + +### `max_heap.py` +Этот скрипт предоставляет конкретную реализацию максимальной кучи (Max Heap). Он включает методы `insert` и `pop` для добавления элементов и извлечения максимального элемента соответственно, при этом поддерживая свойство максимальной кучи. + +### `min_heap.py` +Этот скрипт предоставляет реализацию минимальной кучи (Min Heap). Минимальная куча — это специализированная древовидная структура данных, которая удовлетворяет свойству кучи: в минимальной куче для любого заданного узла C, если P является родительским узлом C, то значение P меньше или равно значению C. Эта реализация особенно полезна для приоритетных очередей. + +### `randomized_heap.py` +Этот скрипт предоставляет реализацию рандомизированной объединяемой кучи (Randomized Meldable Heap). Это структура данных приоритетной очереди, основанная на двоичном дереве, похожая на биномиальную кучу, но использующая рандомизацию для поддержания своей структуры. + +### `skew_heap.py` +Этот скрипт предоставляет реализацию косой кучи (Skew Heap). Косая куча — это еще один тип саморегулирующейся структуры данных кучи, реализованной в виде двоичного дерева. Она поддерживает вставку и извлечение минимального элемента за амортизированное время O(log n). diff --git a/data_structures/linked_list/README.md b/data_structures/linked_list/README.md new file mode 100644 index 000000000000..3b2c0196f504 --- /dev/null +++ b/data_structures/linked_list/README.md @@ -0,0 +1,53 @@ +# Связный список (Linked List) + +Связный список — это базовая структура данных, которая представляет собой набор связанных узлов. Каждый узел хранит данные и ссылку (указатель) на следующий узел в последовательности. + +## Алгоритмы + +### `circular_linked_list.py` +Этот скрипт предоставляет реализацию кольцевого связного списка. В кольцевом связном списке последний узел указывает обратно на первый, образуя кольцо. + +### `deque_doubly.py` +Этот скрипт предоставляет реализацию дека (двусторонней очереди) с использованием двусвязного списка в качестве базовой структуры данных, что позволяет добавлять и удалять элементы с обоих концов за время O(1). + +### `doubly_linked_list.py` +Этот скрипт предоставляет реализацию двусвязного списка. В двусвязном списке каждый узел имеет указатель как на следующий, так и на предыдущий узел, что позволяет осуществлять обход в обоих направлениях. + +### `doubly_linked_list_two.py` +Этот скрипт предоставляет еще одну, более подробную реализацию двусвязного списка с методами для вставки, удаления и итерации. + +### `floyds_cycle_detection.py` +Этот скрипт реализует алгоритм Флойда для обнаружения циклов ("черепахи и зайца"), который эффективно определяет наличие цикла в связном списке. + +### `from_sequence.py` +Этот скрипт предоставляет утилитарную функцию для создания односвязного списка из заданной последовательности (например, списка или кортежа). + +### `has_loop.py` +Этот скрипт предоставляет метод для обнаружения цикла в связном списке путем отслеживания посещенных узлов во время итерации. + +### `is_palindrome.py` +Этот скрипт предоставляет три различные функции для проверки, является ли односвязный список палиндромом (читается одинаково как в прямом, так и в обратном направлении). + +### `merge_two_lists.py` +Этот скрипт предоставляет функцию для слияния двух отсортированных связных списков в один отсортированный связный список. + +### `middle_element_of_linked_list.py` +Этот скрипт предоставляет функцию для нахождения среднего элемента связного списка с использованием подхода с двумя указателями (медленным и быстрым). + +### `print_reverse.py` +Этот скрипт предоставляет функцию для печати элементов связного списка в обратном порядке. + +### `reverse_k_group.py` +Этот скрипт предоставляет функцию для разворота связного списка группами заданного размера `k`. + +### `rotate_to_the_right.py` +Этот скрипт предоставляет функцию для ротации связного списка вправо на заданное количество позиций. + +### `singly_linked_list.py` +Этот скрипт предоставляет комплексную реализацию односвязного списка с методами для вставки, удаления, разворота и поддержкой стандартных функций Python. + +### `skip_list.py` +Этот скрипт предоставляет реализацию списка с пропусками (Skip List), вероятностной структуры данных, которая позволяет осуществлять быстрый поиск, вставку и удаление элементов за среднее время O(log n). + +### `swap_nodes.py` +Этот скрипт предоставляет функцию для обмена двух узлов в связном списке на основе их значений данных. diff --git a/data_structures/queue/README.md b/data_structures/queue/README.md new file mode 100644 index 000000000000..d3bfea893378 --- /dev/null +++ b/data_structures/queue/README.md @@ -0,0 +1,29 @@ +# Очередь (Queue) + +В информатике очередь — это коллекция сущностей, которая поддерживается в последовательности и может быть изменена путем добавления сущностей в один конец последовательности и удаления сущностей из другого конца. По определению, очередь работает по принципу "первым пришел — первым ушел" (FIFO). + +## Алгоритмы + +### `circular_queue.py` +Этот скрипт предоставляет реализацию кольцевой очереди (или циклического буфера) с использованием списка Python. Кольцевая очередь — это очередь фиксированного размера, в которой последняя позиция соединена с первой, что позволяет эффективно использовать память. + +### `circular_queue_linked_list.py` +Этот скрипт предоставляет реализацию кольцевой очереди с использованием двусвязного списка, что позволяет очереди иметь фиксированную емкость при сохранении динамической природы связных списков. + +### `double_ended_queue.py` +Этот скрипт предоставляет реализацию дека (двусторонней очереди) с использованием двусвязного списка. Дек поддерживает добавление и удаление элементов с обоих концов за время O(1). + +### `linked_queue.py` +Этот скрипт предоставляет реализацию очереди с использованием односвязного списка, поддерживая эффективные операции добавления и извлечения за время O(1). + +### `priority_queue_using_list.py` +Этот скрипт предоставляет две реализации приоритетной очереди с использованием списков Python: одна с фиксированными уровнями приоритета, а другая, где приоритетом является само значение элемента. + +### `queue_by_list.py` +Этот скрипт предоставляет простую реализацию очереди с использованием списка Python. Операция `put` (добавление) эффективна, но операция `get` (извлечение) занимает время O(n). + +### `queue_by_two_stacks.py` +Этот скрипт предоставляет реализацию очереди с использованием двух стеков для достижения поведения FIFO (первым вошел — первым ушел). + +### `queue_on_pseudo_stack.py` +Этот скрипт предоставляет неэффективную реализацию очереди с использованием одного списка, который рассматривается как "псевдо-стек" с операциями ротации. diff --git a/data_structures/stacks/README.md b/data_structures/stacks/README.md new file mode 100644 index 000000000000..ff01b17fa6af --- /dev/null +++ b/data_structures/stacks/README.md @@ -0,0 +1,41 @@ +# Стек (Stack) + +В информатике стек — это абстрактный тип данных, который служит коллекцией элементов и имеет две основные операции: push() и pop(). Push() добавляет элемент на вершину стека, а pop() удаляет элемент с вершины стека. Порядок, в котором элементы извлекаются из стека, — "последним пришел — первым ушел" (LIFO). + +## Алгоритмы + +### `balanced_parentheses.py` +Этот скрипт предоставляет функцию для проверки, является ли строка скобок (включая круглые, квадратные и фигурные) сбалансированной. Он использует стек для отслеживания открывающих скобок. + +### `dijkstras_two_stack_algorithm.py` +Этот скрипт реализует двухстековый алгоритм Дейкстры для вычисления арифметических выражений. Он использует один стек для операндов и другой — для операторов. + +### `infix_to_postfix_conversion.py` +Этот скрипт предоставляет функцию для преобразования арифметического выражения из инфиксной нотации в постфиксную (обратная польская запись), используя алгоритм сортировочной станции. + +### `infix_to_prefix_conversion.py` +Этот скрипт предоставляет функцию для преобразования арифметического выражения из инфиксной нотации в префиксную (польская запись). + +### `next_greater_element.py` +Этот скрипт решает задачу "Следующий больший элемент", находя для каждого элемента в массиве первый элемент справа от него, который больше него. Он предоставляет как наивные решения, так и эффективное решение с использованием стека. + +### `postfix_evaluation.py` +Этот скрипт предоставляет функцию для вычисления арифметического выражения, записанного в постфиксной нотации (обратная польская запись), с использованием стека. + +### `prefix_evaluation.py` +Этот скрипт предоставляет функцию для вычисления арифметического выражения, записанного в префиксной нотации (польская запись), с использованием стека. + +### `stack.py` +Этот скрипт предоставляет базовую реализацию структуры данных "стек" на основе списка Python с фиксированной емкостью. + +### `stack_using_two_queues.py` +Этот скрипт предоставляет реализацию стека с использованием двух очередей для имитации поведения LIFO. + +### `stack_with_doubly_linked_list.py` +Этот скрипт предоставляет реализацию стека с использованием двусвязного списка, что обеспечивает эффективность операций push и pop за время O(1). + +### `stack_with_singly_linked_list.py` +Этот скрипт предоставляет реализацию стека с использованием односвязного списка, также с эффективными операциями push и pop за время O(1). + +### `stock_span_problem.py` +Этот скрипт решает задачу о промежутке цен на акции, эффективно вычисляя промежутки с использованием стека за время O(n). diff --git a/data_structures/trie/README.md b/data_structures/trie/README.md new file mode 100644 index 000000000000..204538bc6cde --- /dev/null +++ b/data_structures/trie/README.md @@ -0,0 +1,11 @@ +# Префиксное дерево (Trie) + +В информатике префиксное дерево (также известное как trie или цифровое дерево) — это вид поискового дерева, которое используется для хранения набора строк. В отличие от двоичного дерева поиска, ни один узел в дереве не хранит ключ, связанный с этим узлом; вместо этого его позиция в дереве определяет ключ, с которым он связан. + +## Алгоритмы + +### `radix_tree.py` +Этот скрипт предоставляет реализацию радиксного дерева (также известного как сжатое префиксное дерево или дерево Патриции). Радиксное дерево — это пространственно-оптимизированная версия префиксного дерева, в которой узлы, имеющие только одного потомка, сливаются со своим родителем. + +### `trie.py` +Этот скрипт предоставляет реализацию префиксного дерева (Trie). Префиксное дерево — это древовидная структура данных, которая используется для хранения динамического набора строк и особенно эффективна для поиска на основе префиксов. diff --git a/digital_image_processing/README.md b/digital_image_processing/README.md new file mode 100644 index 000000000000..e0defee4b3c4 --- /dev/null +++ b/digital_image_processing/README.md @@ -0,0 +1,68 @@ +# Цифровая обработка изображений (Digital Image Processing) + +Цифровая обработка изображений — это использование цифрового компьютера для обработки цифровых изображений с помощью алгоритмов. + +## Алгоритмы + +### `change_brightness.py` +Этот скрипт предоставляет функцию для изменения яркости изображения. Он принимает объект изображения PIL и уровень яркости (от -255 до 255) и применяет коррекцию яркости к каждому пикселю. + +### `change_contrast.py` +Этот скрипт предоставляет функцию для изменения контрастности изображения. Он принимает объект изображения PIL и уровень контрастности и применяет коррекцию контрастности к каждому пикселю. + +### `convert_to_negative.py` +Этот скрипт предоставляет функцию для преобразования цветного изображения в его негатив. Он делает это, инвертируя цвет каждого пикселя (т.е. вычитая каждый компонент RGB из 255). + +### `index_calculation.py` +Этот скрипт предоставляет класс для вычисления различных вегетационных индексов из мультиспектральных изображений. Вегетационные индексы, такие как NDVI, используются в дистанционном зондировании для анализа здоровья и плотности растительности. + +### `sepia.py` +Этот скрипт предоставляет функцию для применения эффекта сепии к цветному изображению, создавая характерный коричневатый оттенок. + +--- + +### [Дизеринг (Dithering)](dithering/) +Дизеринг — это техника, используемая для создания иллюзии глубины цвета в изображениях с ограниченной цветовой палитрой. +- **`burkes.py`**: Реализует алгоритм дизеринга Берка, который является методом дизеринга с диффузией ошибки. + +--- + +### [Обнаружение краев (Edge Detection)](edge_detection/) +Методы для определения границ объектов на изображении. +- **`canny.py`**: Реализует детектор краев Кэнни, многоэтапный алгоритм для эффективного обнаружения краев. + +--- + +### [Фильтры (Filters)](filters/) +Различные фильтры для обработки изображений. +- **`bilateral_filter.py`**: Реализует билатеральный фильтр, который сглаживает изображения, сохраняя при этом края. +- **`convolve.py`**: Предоставляет функцию для выполнения операции 2D-свертки над изображением с использованием заданного ядра. +- **`gabor_filter.py`**: Реализует фильтр Габора, используемый для анализа текстур. +- **`gaussian_filter.py`**: Реализует фильтр Гаусса для размытия изображений и удаления шума. +- **`laplacian_filter.py`**: Реализует фильтр Лапласа для обнаружения краев путем выделения областей быстрого изменения интенсивности. +- **`local_binary_pattern.py`**: Реализует оператор локальных двоичных шаблонов (LBP), дескриптор текстуры, используемый для классификации. +- **`median_filter.py`**: Реализует медианный фильтр, нелинейный фильтр, используемый для удаления шума. +- **`sobel_filter.py`**: Реализует фильтр Собеля для вычисления градиента интенсивности изображения. + +--- + +### [Эквализация гистограммы (Histogram Equalization)](histogram_equalization/) +Техники для улучшения контрастности изображения. +- **`histogram_stretch.py`**: Реализует растяжение гистограммы (контрастное растяжение) для улучшения контрастности. + +--- + +### [Морфологические операции (Morphological Operations)](morphological_operations/) +Операции, которые обрабатывают изображения на основе форм. +- **`dilation_operation.py`**: Реализует операцию дилатации, которая "утолщает" светлые области изображения. +- **`erosion_operation.py`**: Реализует операцию эрозии, которая "сжимает" светлые области изображения. + +--- + +### [Изменение размера (Resize)](resize/) +- **`resize.py`**: Реализует изменение размера изображения с использованием алгоритма интерполяции по ближайшему соседу. + +--- + +### [Поворот (Rotation)](rotation/) +- **`rotation.py`**: Демонстрирует, как выполнить аффинное преобразование для поворота изображения. diff --git a/divide_and_conquer/README.md b/divide_and_conquer/README.md new file mode 100644 index 000000000000..43a734f3c4b1 --- /dev/null +++ b/divide_and_conquer/README.md @@ -0,0 +1,41 @@ +# Разделяй и властвуй (Divide and Conquer) + +"Разделяй и властвуй" — это парадигма разработки алгоритмов, основанная на многократно разветвленной рекурсии. Алгоритм "разделяй и властвуй" работает, рекурсивно разбивая проблему на две или более подзадачи того же или родственного типа, пока они не станут достаточно простыми, чтобы их можно было решить напрямую. + +## Алгоритмы + +### `closest_pair_of_points.py` +Этот скрипт находит расстояние между ближайшей парой точек в заданном наборе из n точек на 2D-плоскости, используя подход "разделяй и властвуй". + +### `convex_hull.py` +Этот скрипт предоставляет три различных алгоритма для решения задачи о выпуклой оболочке: "грубая сила", "разделяй и властвуй" и алгоритм Мелкмана. + +### `heaps_algorithm.py` +Этот скрипт предоставляет рекурсивную реализацию алгоритма Хипа для генерации всех возможных перестановок списка. + +### `heaps_algorithm_iterative.py` +Этот скрипт предоставляет итеративную реализацию алгоритма Хипа для генерации всех перестановок списка. + +### `inversions.py` +Этот скрипт предоставляет два алгоритма для подсчета количества инверсий в массиве, используя как "грубую силу", так и "разделяй и властвуй". + +### `kth_order_statistic.py` +Этот скрипт предоставляет функцию для нахождения k-го по величине элемента в несортированном списке с использованием алгоритма quickselect. + +### `max_difference_pair.py` +Этот скрипт находит максимальную разницу между двумя элементами `A[j] - A[i]` в массиве, где `j >= i`, используя подход "разделяй и властвуй". + +### `max_subarray.py` +Этот скрипт решает задачу о максимальном подмассиве, находя непрерывный подмассив с наибольшей суммой, с помощью алгоритма "разделяй и властвуй". + +### `mergesort.py` +Этот скрипт предоставляет реализацию алгоритма сортировки слиянием, классического алгоритма сортировки по принципу "разделяй и властвуй". + +### `peak.py` +Этот скрипт предоставляет функцию для нахождения пикового элемента в унимодальном массиве за время O(log n). + +### `power.py` +Этот скрипт предоставляет функцию для вычисления степени числа (`a` в степени `b`) с использованием эффективного подхода "разделяй и властвуй" (возведение в степень путем возведения в квадрат). + +### `strassen_matrix_multiplication.py` +Этот скрипт предоставляет реализацию алгоритма Штрассена для асимптотически быстрого умножения матриц. diff --git a/dynamic_programming/README.md b/dynamic_programming/README.md new file mode 100644 index 000000000000..8fa36211e7d0 --- /dev/null +++ b/dynamic_programming/README.md @@ -0,0 +1,146 @@ +# Динамическое программирование + +Динамическое программирование — это метод решения сложных задач путём их разбиения на более простые подзадачи. + +## Алгоритмы + +* **Abbreviation** + * Определяет, можно ли сократить одну строку, чтобы получить другую. + +* **All Construct** + * Находит все возможные способы, которыми строка может быть сконструирована из заданного списка слов. + +* **Bitmask** + * Использует битовые маски для решения задач, часто связанных с подмножествами или состояниями. + +* **Catalan Numbers** + * Вычисляет числа Каталана, которые встречаются в различных комбинаторных задачах. + +* **Climbing Stairs** + * Находит количество различных способов подняться на лестницу из `n` ступенек, если можно шагать на 1 или 2 ступеньки за раз. + +* **Combination Sum IV** + * Находит количество всех возможных комбинаций, которые в сумме дают заданное число. + +* **Edit Distance** + * Вычисляет минимальное количество операций (вставка, удаление, замена), необходимых для преобразования одной строки в другую. + +* **Factorial** + * Вычисляет факториал числа. + +* **Fast Fibonacci** + * Реализует быстрый алгоритм для вычисления чисел Фибоначчи. + +* **Fibonacci** + * Классическая реализация для вычисления чисел Фибоначчи. + +* **Fizz Buzz** + * Классическая задача Fizz Buzz, решённая с использованием динамического программирования. + +* **Floyd Warshall** + * Алгоритм для нахождения кратчайших путей между всеми парами вершин во взвешенном графе. + +* **Integer Partition** + * Находит количество способов, которыми целое число может быть представлено в виде суммы целых положительных чисел. + +* **Iterating Through Submasks** + * Демонстрирует, как итерировать по всем подмаскам данной битовой маски. + +* **K Means Clustering TensorFlow** + * Реализация кластеризации методом k-средних с использованием TensorFlow. + +* **Knapsack** + * Задача о рюкзаке: определение набора предметов, который максимизирует общую стоимость при ограниченном весе. + +* **Largest Divisible Subset** + * Находит наибольшее подмножество, в котором каждый элемент делится на предыдущий. + +* **Longest Common Subsequence** + * Находит самую длинную общую подпоследовательность двух последовательностей. + +* **Longest Common Substring** + * Находит самую длинную общую подстроку двух строк. + +* **Longest Increasing Subsequence** + * Находит длину самой длинной возрастающей подпоследовательности в массиве. + +* **Longest Increasing Subsequence O(n log n)** + * Более эффективная реализация поиска самой длинной возрастающей подпоследовательности. + +* **Longest Palindromic Subsequence** + * Находит самую длинную палиндромную подпоследовательность в строке. + +* **Matrix Chain Multiplication** + * Определяет оптимальный порядок перемножения матриц для минимизации количества скалярных произведений. + +* **Matrix Chain Order** + * Другая реализация задачи об оптимальном порядке перемножения матриц. + +* **Max Non Adjacent Sum** + * Находит максимальную сумму непоследовательных элементов в массиве. + +* **Max Product Subarray** + * Находит подмассив с наибольшим произведением. + +* **Max Subarray Sum** + * Находит непрерывный подмассив с наибольшей суммой. + +* **Min Distance Up Bottom** + * Реализация задачи о расстоянии редактирования (расстояние Левенштейна) подходом "сверху-вниз". + +* **Minimum Coin Change** + * Находит минимальное количество монет, необходимое для сдачи определённой суммы. + +* **Minimum Cost Path** + * Находит путь с минимальной стоимостью в матрице от верхнего левого угла до нижнего правого. + +* **Minimum Partition** + * Разделяет множество на два подмножества так, чтобы разница их сумм была минимальной. + +* **Minimum Size Subarray Sum** + * Находит самый короткий непрерывный подмассив, сумма которого не меньше заданного значения. + +* **Minimum Squares to Represent a Number** + * Находит минимальное количество квадратов чисел, которые в сумме дают заданное число. + +* **Minimum Steps to One** + * Вычисляет минимальное количество шагов, чтобы свести число к 1 (разрешены операции: -1, /2, /3). + +* **Minimum Tickets Cost** + * Вычисляет минимальную стоимость для путешествий в заданные дни с билетами на 1, 7 и 30 дней. + +* **Optimal Binary Search Tree** + * Строит оптимальное двоичное дерево поиска для минимизации стоимости поиска. + +* **Palindrome Partitioning** + * Находит минимальное количество разрезов, необходимых для разделения строки на палиндромные подстроки. + +* **Regex Match** + * Реализует сопоставление с образцом для регулярных выражений с поддержкой `.` и `*`. + +* **Rod Cutting** + * Задача о разрезании стержня: находит максимальный доход от продажи кусков стержня. + +* **Smith Waterman** + * Алгоритм Смита-Ватермана для локального выравнивания последовательностей. + +* **Subset Generation** + * Генерирует все подмножества заданного множества. + +* **Sum of Subset** + * Определяет, существует ли подмножество с заданной суммой. + +* **Trapped Water** + * Вычисляет, сколько дождевой воды может быть удержано между столбиками разной высоты. + +* **Tribonacci** + * Генерирует последовательность Трибоначчи. + +* **Viterbi** + * Алгоритм Витерби для нахождения наиболее вероятной последовательности скрытых состояний. + +* **Wildcard Matching** + * Реализует сопоставление с образцом с использованием `?` и `*`. + +* **Word Break** + * Определяет, можно ли разбить строку на последовательность слов из словаря. diff --git a/electronics/README.md b/electronics/README.md new file mode 100644 index 000000000000..e32bac93a80c --- /dev/null +++ b/electronics/README.md @@ -0,0 +1,25 @@ +# Алгоритмы и формулы из электроники + +Этот раздел содержит различные алгоритмы и формулы, связанные с электроникой. + +## Описание + +* `apparent_power.py`: Вычисляет полную мощность в однофазной цепи переменного тока. +* `builtin_voltage.py`: Рассчитывает встроенное напряжение p-n перехода диода. +* `capacitor_equivalence.py`: Вычисляет эквивалентную ёмкость для конденсаторов, соединенных параллельно или последовательно. +* `carrier_concentration.py`: Рассчитывает концентрацию носителей заряда (электронов или дырок) в полупроводнике. +* `charging_capacitor.py`: Рассчитывает напряжение на конденсаторе в любой момент времени после начала зарядки. +* `charging_inductor.py`: Рассчитывает ток в индуктивности в любой момент времени после начала зарядки. +* `circular_convolution.py`: Осуществляет круговую (циклическую) свертку двух сигналов. +* `coulombs_law.py`: Применяет закон Кулона для вычисления силы взаимодействия между зарядами. +* `electric_conductivity.py`: Рассчитывает электропроводность материала. +* `electric_power.py`: Рассчитывает электрическую мощность, напряжение или ток. +* `electrical_impedance.py`: Вычисляет электрический импеданс в цепи переменного тока. +* `ic_555_timer.py`: Рассчитывает частоту и/или рабочий цикл для нестабильного таймера 555. +* `ind_reactance.py`: Вычисляет индуктивное реактивное сопротивление. +* `ohms_law.py`: Применяет закон Ома для вычисления напряжения, тока или сопротивления. +* `real_and_reactive_power.py`: Рассчитывает активную и реактивную мощность. +* `resistor_color_code.py`: Вычисляет сопротивление резистора по цветовому коду. +* `resistor_equivalence.py`: Вычисляет эквивалентное сопротивление для резисторов, соединенных параллельно или последовательно. +* `resonant_frequency.py`: Рассчитывает резонансную частоту LC-контура. +* `wheatstone_bridge.py`: Рассчитывает неизвестное сопротивление в мосте Уитстона. diff --git a/file_transfer/README.md b/file_transfer/README.md new file mode 100644 index 000000000000..e8362cc6fca6 --- /dev/null +++ b/file_transfer/README.md @@ -0,0 +1,8 @@ +# Передача файлов + +Этот раздел содержит скрипты для настройки простого сервера и клиента для передачи файлов по сети. + +## Описание + +* `send_file.py`: Этот скрипт настраивает сервер, который прослушивает входящие соединения. При подключении клиента, сервер отправляет ему указанный файл (по умолчанию `mytext.txt`). +* `receive_file.py`: Этот скрипт работает как клиент. Он подключается к серверу, запущенному с помощью `send_file.py`, и получает от него файл. Полученный файл сохраняется под именем `Received_file`. diff --git a/financial/README.md b/financial/README.md new file mode 100644 index 000000000000..5c52c4c96211 --- /dev/null +++ b/financial/README.md @@ -0,0 +1,12 @@ +# Финансовые алгоритмы + +Этот раздел содержит различные алгоритмы и функции для финансовых расчетов. + +## Описание + +* `equated_monthly_installments.py`: Рассчитывает сумму ежемесячного платежа по кредиту (аннуитетный платёж), исходя из основной суммы, процентной ставки и срока кредита. +* `exponential_moving_average.py`: Вычисляет экспоненциальное скользящее среднее (EMA) для анализа временных рядов, например, цен акций. EMA быстрее реагирует на изменения цен, чем простое скользящее среднее. +* `interest.py`: Содержит функции для расчета различных видов процентов: простого, сложного и годовой процентной ставки (APR). +* `present_value.py`: Рассчитывает приведенную (текущую) стоимость будущего потока денежных средств с учетом ставки дисконтирования. +* `price_plus_tax.py`: Вычисляет итоговую стоимость товара или услуги, добавляя к базовой цене налог. +* `simple_moving_average.py`: Вычисляет простое скользящее среднее (SMA), которое используется для сглаживания данных и выявления трендов. diff --git a/fractals/README.md b/fractals/README.md new file mode 100644 index 000000000000..21e5b5dc8470 --- /dev/null +++ b/fractals/README.md @@ -0,0 +1,11 @@ +# Фракталы + +Этот раздел содержит алгоритмы для генерации и визуализации различных фракталов. + +## Описание + +* `julia_sets.py`: Скрипт для рисования множеств Жюлиа, которые являются классом фракталов, изучаемых в комплексной динамике. +* `koch_snowflake.py`: Генерирует и отображает снежинку Коха, одну из самых ранних описанных фрактальных кривых. +* `mandelbrot.py`: Скрипт для генерации и визуализации множества Мандельброта, которое является множеством комплексных чисел, для которых определенная последовательность не уходит в бесконечность. +* `sierpinski_triangle.py`: Рекурсивно генерирует и рисует треугольник Серпинского, самоподобную структуру из равносторонних треугольников. +* `vicsek.py`: Генерирует и рисует фрактал Вичека, также известный как квадрат Вичека, который создается путем рекурсивного деления квадрата. diff --git a/fuzzy_logic/README.md b/fuzzy_logic/README.md new file mode 100644 index 000000000000..7a5af2cf73f7 --- /dev/null +++ b/fuzzy_logic/README.md @@ -0,0 +1,12 @@ +# Нечеткая логика + +Этот раздел содержит алгоритмы, связанные с нечеткой логикой. Нечеткая логика — это форма многозначной логики, в которой истинностные значения переменных могут быть любым действительным числом от 0 до 1. + +## Описание + +* `fuzzy_operations.py`: Реализует класс `FuzzySet` для представления и выполнения операций над треугольными нечеткими множествами. Поддерживаются основные операции: + * **Объединение (Union)**: Находит объединение двух нечетких множеств. + * **Пересечение (Intersection)**: Находит пересечение двух нечетких множеств. + * **Дополнение (Complement)**: Находит дополнение нечеткого множества. + * **Функция принадлежности (Membership)**: Вычисляет степень принадлежности элемента к нечеткому множеству. + Скрипт также включает возможность визуализации этих множеств. diff --git a/genetic_algorithm/README.md b/genetic_algorithm/README.md new file mode 100644 index 000000000000..b6663f3c1a21 --- /dev/null +++ b/genetic_algorithm/README.md @@ -0,0 +1,11 @@ +# Генетический алгоритм + +Этот раздел содержит реализации генетических алгоритмов. Генетический алгоритм — это эвристический алгоритм поиска, используемый для решения задач оптимизации и моделирования, путем случайного подбора, комбинирования и вариации искомых параметров с использованием механизмов, напоминающих биологическую эволюцию. + +## Описание + +* `basic_string.py`: Этот скрипт демонстрирует работу простого генетического алгоритма на примере "эволюции" случайной строки до тех пор, пока она не совпадет с целевой строкой. Он наглядно показывает четыре основных этапа генетического алгоритма: + 1. **Оценка (Evaluation)**: Каждая строка в популяции оценивается на предмет ее "приспособленности" (насколько она близка к целевой строке). + 2. **Отбор (Selection)**: Наиболее "приспособленные" строки отбираются для создания следующего поколения. + 3. **Скрещивание (Crossover)**: Отобранные строки (родители) комбинируются для создания новых строк (потомков). + 4. **Мутация (Mutation)**: В геноме потомков случайным образом вносятся небольшие изменения, чтобы поддерживать генетическое разнообразие. diff --git a/geodesy/README.md b/geodesy/README.md new file mode 100644 index 000000000000..c18e2046c950 --- /dev/null +++ b/geodesy/README.md @@ -0,0 +1,8 @@ +# Геодезия + +Этот раздел содержит алгоритмы для геодезических расчетов, связанных с измерением и представлением Земли. + +## Описание + +* `haversine_distance.py`: Реализует формулу гаверсинусов для вычисления расстояния по дуге большого круга между двумя точками на поверхности сферы. Этот метод полезен для аппроксимации расстояний между географическими координатами. +* `lamberts_ellipsoidal_distance.py`: Реализует формулу Ламберта для вычисления геодезического расстояния между двумя точками на поверхности эллипсоида. Этот метод обеспечивает более высокую точность по сравнению с методами, моделирующими Землю как идеальную сферу, и подходит для расчета больших расстояний. diff --git a/geometry/README.md b/geometry/README.md new file mode 100644 index 000000000000..076917955a35 --- /dev/null +++ b/geometry/README.md @@ -0,0 +1,15 @@ +# Геометрия + +Этот раздел содержит алгоритмы и структуры данных для работы с геометрическими объектами. + +## Описание + +* `geometry.py`: Этот скрипт предоставляет набор классов для представления и работы с различными геометрическими фигурами на двумерной плоскости. Он включает в себя: + * **Базовые классы**: `Angle` (угол) и `Side` (сторона) как строительные блоки для более сложных фигур. + * **Классы фигур**: + * `Ellipse` (эллипс) + * `Circle` (круг), который наследуется от эллипса. + * `Polygon` (многоугольник) как абстрактный класс. + * `Rectangle` (прямоугольник), который наследуется от многоугольника. + * `Square` (квадрат), который наследуется от прямоугольника. + * **Функциональность**: Для фигур реализованы методы вычисления их свойств, таких как площадь, периметр и диаметр. diff --git a/graphics/README.md b/graphics/README.md new file mode 100644 index 000000000000..ba061e7a8384 --- /dev/null +++ b/graphics/README.md @@ -0,0 +1,10 @@ +# Компьютерная графика + +Этот раздел содержит алгоритмы, связанные с компьютерной графикой. + +## Описание + +* `bezier_curve.py`: Реализует класс `BezierCurve` для создания и визуализации кривых Безье. Кривая Безье определяется набором контрольных точек и используется для моделирования гладких кривых в компьютерной графике. +* `vector3_for_2d_rendering.py`: Содержит функции для рендеринга трехмерных объектов на двумерной поверхности. Включает: + * Функцию для преобразования 3D-координат в 2D-координаты (проекция). + * Функцию для вращения 3D-точек вокруг заданных осей (X, Y, Z). diff --git a/graphs/README.md b/graphs/README.md new file mode 100644 index 000000000000..edb4d638609c --- /dev/null +++ b/graphs/README.md @@ -0,0 +1,106 @@ +# Алгоритмы на графах + +Граф — это абстрактная структура данных, предназначенная для реализации математической концепции графов. Он состоит из набора вершин (или узлов) и набора рёбер, которые соединяют пары вершин. + +***Примечание: Этот список может быть неполным из-за проблем с доступом к некоторым файлам в этой директории.*** + +## Алгоритмы + +* **A\* Search (Поиск A\*)** + * Алгоритм поиска, который находит кратчайший путь от начальной до конечной вершины. Он использует эвристическую оценку для определения приоритета узлов. + +* **Ant Colony Optimization (Оптимизация муравьиной колонией)** + * Вероятностный метод для решения вычислительных задач, который можно свести к нахождению оптимальных путей в графах. Используется для решения задачи коммивояжёра. + +* **Articulation Points (Точки сочленения)** + * Находит все точки сочленения (или шарниры) в неориентированном графе. Точка сочленения — это вершина, удаление которой увеличивает количество компонент связности графа. + +* **Basic Graphs (Базовые графы)** + * Содержит набор базовых функций для работы с графами, включая инициализацию, обходы (BFS, DFS), алгоритмы Дейкстры, Прима, Краскала, Флойда-Уоршелла и топологическую сортировку. + +* **Bellman-Ford (Алгоритм Беллмана-Форда)** + * Находит кратчайшие пути от одной вершины до всех остальных во взвешенном ориентированном графе. Может работать с рёбрами отрицательного веса и обнаруживать отрицательные циклы. + +* **Bi-directional Dijkstra (Двунаправленный алгоритм Дейкстры)** + * Оптимизация алгоритма Дейкстры, которая выполняет поиск одновременно от начальной и конечной вершин, что может значительно ускорить нахождение пути. + +* **Bidirectional A\* (Двунаправленный A\*)** + * Комбинация двунаправленного поиска и алгоритма A\*, которая ищет путь от начальной и конечной точек одновременно, используя эвристику для направления поиска. + +* **Bidirectional Breadth-First Search (Двунаправленный поиск в ширину)** + * Оптимизация поиска в ширину, выполняющая поиск одновременно из двух точек для более быстрого нахождения пересечения и пути. + +* **Boruvka's Algorithm (Алгоритм Борувки)** + * Алгоритм для нахождения минимального остовного дерева (MST) в графе. Итеративно добавляет самые дешёвые рёбра к компонентам связности. + +* **Breadth-First Search (Поиск в ширину, BFS)** + * Алгоритм обхода графа, который исследует все вершины на текущем уровне перед переходом на следующий. Используется для нахождения кратчайшего пути в невзвешенных графах. + +* **Check Bipartite (Проверка на двудольность)** + * Определяет, является ли граф двудольным (т.е. можно ли его вершины раскрасить в два цвета так, чтобы ни одно ребро не соединяло одноцветные вершины), используя BFS и DFS. + +* **Check Cycle (Проверка на наличие цикла)** + * Обнаруживает циклы в ориентированном графе с помощью поиска в глубину (DFS). + +* **Connected Components (Компоненты связности)** + * Находит все компоненты связности в неориентированном графе. + +* **Deep Clone Graph (Глубокое копирование графа)** + * Создаёт полную, независимую копию графа. + +* **Depth-First Search (Поиск в глубину, DFS)** + * Алгоритм обхода графа, который уходит "вглубь" графа, насколько это возможно, прежде чем возвращаться. + +* **Dijkstra's Algorithm (Алгоритм Дейкстры)** + * Находит кратчайшие пути от одной вершины до всех остальных во взвешенном графе без рёбер отрицательного веса. В репозитории представлено несколько реализаций. + +* **Dinic's Algorithm (Алгоритм Диница)** + * Эффективный алгоритм для нахождения максимального потока в транспортной сети. + +* **Directed and Undirected Weighted Graph (Ориентированные и неориентированные взвешенные графы)** + * Классы, реализующие базовые операции для ориентированных и неориентированных взвешенных графов. + +* **Edmonds-Karp (Алгоритм Эдмондса-Карпа - реализация Push-Relabel)** + * Файл содержит реализацию алгоритма "поднять-в-начало" (push-relabel) для нахождения максимального потока, а также классы для сетей с несколькими источниками и стоками. + +* **Eulerian Path and Circuit (Эйлеров путь и цикл)** + * Определяет и находит эйлеров путь или цикл в неориентированном графе. + +* **Even Tree (Чётное дерево)** + * Находит максимальное количество рёбер, которые можно удалить из дерева, чтобы все полученные компоненты имели чётное число вершин. + +* **Finding Bridges (Поиск мостов)** + * Находит все мосты в графе (рёбра, удаление которых увеличивает число компонент связности). + +* **Frequent Pattern Graph Miner (Поиск частых паттернов в графах)** + * Реализует алгоритм FP-GraphMiner для поиска частых подграфов в наборе графов. + +* **Gale-Shapley Algorithm (Алгоритм Гейла-Шепли)** + * Решает задачу о стабильном паросочетании (стабильных браках). + +* **Graph Representations (Представления графов)** + * Файлы `graph_adjacency_list.py`, `graph_adjacency_matrix.py`, `graph_list.py` содержат различные реализации структуры данных графа. + +* **Floyd-Warshall (Алгоритм Флойда-Уоршелла)** + * Находит кратчайшие пути между всеми парами вершин. + +* **Greedy Best-First Search (Жадный поиск по первому наилучшему совпадению)** + * Алгоритм поиска пути, который всегда выбирает узел, наиболее близкий к цели согласно эвристике. + +* **Greedy Minimum Vertex Cover (Жадное вершинное покрытие)** + * Аппроксимационный алгоритм для задачи о минимальном вершинном покрытии, выбирающий вершины с наибольшей степенью. + +* **Kahn's Algorithm (Алгоритм Кана)** + * Алгоритм для топологической сортировки вершин в ациклическом ориентированном графе, также используется для нахождения самого длинного пути. + +* **Karger's Algorithm (Алгоритм Каргера)** + * Вероятностный алгоритм для нахождения минимального разреза в графе. + +* **Markov Chain (Цепь Маркова)** + * Моделирует случайное блуждание по графу с заданными вероятностями переходов. + +* **Matching Minimum Vertex Cover (Вершинное покрытие через паросочетание)** + * Аппроксимационный алгоритм для задачи о минимальном вершинном покрытии, использующий максимальное паросочетание. + +* **Minimum Path Sum (Минимальная сумма пути)** + * Находит путь с минимальной суммой в сетке от верхнего левого до нижнего правого угла. diff --git a/greedy_methods/README.md b/greedy_methods/README.md new file mode 100644 index 000000000000..0e1df0170aee --- /dev/null +++ b/greedy_methods/README.md @@ -0,0 +1,26 @@ +# Жадные алгоритмы + +Жадный алгоритм — это алгоритмическая парадигма, которая строит решение по частям, всегда выбирая следующий фрагмент, который предлагает наиболее очевидную и немедленную выгоду. Жадные алгоритмы хорошо подходят для решения задач оптимизации. + +## Алгоритмы + +* **Best Time to Buy and Sell Stock (Лучшее время для покупки и продажи акций)** + * Находит максимальную прибыль, которую можно получить от одной операции покупки и продажи акций, итеративно отслеживая самую низкую цену покупки и максимальную возможную прибыль. + +* **Fractional Knapsack (Задача о дробном рюкзаке)** + * Решает задачу о рюкзаке, где можно брать части предметов. Алгоритм сортирует предметы по соотношению ценности к весу и заполняет рюкзак наиболее "ценными" предметами в первую очередь. В репозитории представлено несколько реализаций. + +* **Gas Station (Задача о заправках)** + * Находит стартовую заправочную станцию на кольцевом маршруте, с которой можно совершить полный круг, учитывая количество бензина на каждой станции и затраты на переезд к следующей. + +* **Minimum Coin Change (Задача о размене монет)** + * Находит минимальное количество монет для сдачи определённой суммы, используя жадный подход (всегда берётся монета наибольшего достоинства). Этот метод оптимален только для канонических систем номиналов. + +* **Minimum Waiting Time (Минимальное время ожидания)** + * Вычисляет минимальное общее время ожидания для выполнения набора запросов. Стратегия заключается в выполнении запросов в порядке возрастания их продолжительности. + +* **Optimal Merge Pattern (Оптимальное слияние файлов)** + * Находит наиболее эффективный способ слияния нескольких отсортированных файлов, на каждом шаге объединяя два самых маленьких файла. + +* **Smallest Range (Наименьший диапазон)** + * Находит наименьший числовой диапазон, который включает хотя бы по одному элементу из каждого из нескольких отсортированных списков. diff --git a/hashes/README.md b/hashes/README.md index 0237260eaa67..4fe72d565b57 100644 --- a/hashes/README.md +++ b/hashes/README.md @@ -1,17 +1,43 @@ -# Hashes -Hashing is the process of mapping any amount of data to a specified size using an algorithm. This is known as a hash value (or, if you're feeling fancy, a hash code, hash sums, or even a hash digest). Hashing is a one-way function, whereas encryption is a two-way function. While it is functionally conceivable to reverse-hash stuff, the required computing power makes it impractical. Hashing is a one-way street. -Unlike encryption, which is intended to protect data in transit, hashing is intended to authenticate that a file or piece of data has not been altered—that it is authentic. In other words, it functions as a checksum. +# Хеш-функции и контрольные суммы -## Common hashing algorithms -### MD5 -This is one of the first algorithms that has gained widespread acceptance. MD5 is hashing algorithm made by Ray Rivest that is known to suffer vulnerabilities. It was created in 1992 as the successor to MD4. Currently MD6 is in the works, but as of 2009 Rivest had removed it from NIST consideration for SHA-3. +Хеш-функция — это любая функция, которую можно использовать для сопоставления данных произвольного размера с данными фиксированного размера. Значения, возвращаемые хеш-функцией, называются хеш-значениями, хеш-кодами, дайджестами или просто хешами. -### SHA -SHA stands for Security Hashing Algorithm and it’s probably best known as the hashing algorithm used in most SSL/TLS cipher suites. A cipher suite is a collection of ciphers and algorithms that are used for SSL/TLS connections. SHA handles the hashing aspects. SHA-1, as we mentioned earlier, is now deprecated. SHA-2 is now mandatory. SHA-2 is sometimes known as SHA-256, though variants with longer bit lengths are also available. +В этом каталоге также содержатся реализации других алгоритмов, связанных с целостностью и преобразованием данных, таких как контрольные суммы, коды с исправлением ошибок и даже симуляторы шифровальных машин. -### SHA256 -SHA 256 is a member of the SHA 2 algorithm family, under which SHA stands for Secure Hash Algorithm. It was a collaborative effort between both the NSA and NIST to implement a successor to the SHA 1 family, which was beginning to lose potency against brute force attacks. It was published in 2001. -The importance of the 256 in the name refers to the final hash digest value, i.e. the hash value will remain 256 bits regardless of the size of the plaintext/cleartext. Other algorithms in the SHA family are similar to SHA 256 in some ways. +## Алгоритмы -### Luhn -The Luhn algorithm, also renowned as the modulus 10 or mod 10 algorithm, is a straightforward checksum formula used to validate a wide range of identification numbers, including credit card numbers, IMEI numbers, and Canadian Social Insurance Numbers. A community of mathematicians developed the LUHN formula in the late 1960s. Companies offering credit cards quickly followed suit. Since the algorithm is in the public interest, anyone can use it. The algorithm is used by most credit cards and many government identification numbers as a simple method of differentiating valid figures from mistyped or otherwise incorrect numbers. It was created to guard against unintentional errors, not malicious attacks. +* **Adler-32** + * Алгоритм контрольной суммы, разработанный как быстрая альтернатива CRC. Он обеспечивает хороший баланс между скоростью и надёжностью. + +* **Chaos Machine (Машина Хаоса)** + * Реализация генератора псевдослучайных чисел, основанного на принципах теории хаоса и логистических отображениях. + +* **djb2** + * Простая и быстрая некриптографическая хеш-функция, известная своим хорошим распределением благодаря использованию "магических" констант. + +* **ELF (Executable and Linkable Format) Hash** + * Простая хеш-функция, часто используемая в компоновщиках и таблицах символов для Unix-подобных систем. + +* **Enigma Machine (Энигма)** + * Упрощённая симуляция знаменитой роторной шифровальной машины "Энигма", используемой во время Второй мировой войны. Это алгоритм симметричного шифрования, а не хеширования. + +* **Fletcher-16** + * Простой алгоритм контрольной суммы, который быстрее, чем CRC, но обеспечивает лучшую проверку ошибок, чем простое суммирование, благодаря использованию двух сумм. + +* **Hamming Code (Код Хэмминга)** + * Линейный код с исправлением ошибок, который может обнаруживать до двух битовых ошибок и исправлять однобитовые ошибки. + +* **Luhn Algorithm (Алгоритм Луна)** + * Простая формула контрольной суммы (mod 10), используемая для проверки различных идентификационных номеров, таких как номера кредитных карт. + +* **MD5 (Message-Digest Algorithm 5)** + * Широко известная криптографическая хеш-функция, которая производит 128-битный хеш. В настоящее время считается криптографически небезопасной и не рекомендуется для использования в целях безопасности. + +* **sdbm (Simple Database Manager) Hash** + * Быстрая некриптографическая хеш-функция, известная хорошим распределением ключей. + +* **SHA-1 (Secure Hash Algorithm 1)** + * Криптографическая хеш-функция, создающая 160-битный хеш. Как и MD5, SHA-1 больше не считается безопасной от атак. + +* **SHA-256 (Secure Hash Algorithm 256-bit)** + * Член семейства SHA-2, создающий 256-битный хеш. Широко используется во многих приложениях безопасности и протоколах, включая TLS, SSL, PGP, SSH, IPsec и биткойн. diff --git a/knapsack/README.md b/knapsack/README.md index f31e5f591412..cf1d0c3d2de1 100644 --- a/knapsack/README.md +++ b/knapsack/README.md @@ -1,32 +1,21 @@ -# A naive recursive implementation of 0-1 Knapsack Problem +# Задача о рюкзаке -This overview is taken from: +Задача о рюкзаке — это классическая задача комбинаторной оптимизации. Учитывая набор предметов, каждый из которых имеет вес и ценность, нужно определить, какие предметы следует включить в коллекцию, чтобы их общий вес не превышал заданного предела, а общая ценность была как можно больше. - https://en.wikipedia.org/wiki/Knapsack_problem +## Алгоритмы ---- +В этом каталоге представлены реализации двух основных вариантов задачи о рюкзаке: -## Overview +### 1. Задача о 0-1 рюкзаке (0-1 Knapsack Problem) -The knapsack problem is a problem in combinatorial optimization: Given a set of items, each with a weight and a value, determine the number of each item to include in a collection so that the total weight is less than or equal to a given limit and the total value is as large as possible. It derives its name from the problem faced by someone who is constrained by a fixed-size knapsack and must fill it with the most valuable items. The problem often arises in resource allocation where the decision makers have to choose from a set of non-divisible projects or tasks under a fixed budget or time constraint, respectively. +В этой версии каждый предмет можно либо взять целиком, либо не брать совсем. Делить предметы нельзя. -The knapsack problem has been studied for more than a century, with early works dating as far back as 1897 The name "knapsack problem" dates back to the early works of mathematician Tobias Dantzig (1884–1956), and refers to the commonplace problem of packing the most valuable or useful items without overloading the luggage. +* **Рекурсивный подход (`knapsack.py`, `recursive_approach_knapsack.py`)** + * Это простые рекурсивные реализации, которые для каждого предмета рассматривают два варианта: включить его в рюкзак или нет. Затем рекурсивно решается подзадача для оставшихся предметов и оставшейся вместимости. Этот подход имеет экспоненциальную временную сложность и неэффективен для больших наборов данных, но хорошо иллюстрирует логику задачи. ---- +### 2. Задача о дробном рюкзаке (Fractional Knapsack Problem) -## Documentation +В этой версии разрешается брать части предметов. -This module uses docstrings to enable the use of Python's in-built `help(...)` function. -For instance, try `help(Vector)`, `help(unit_basis_vector)`, and `help(CLASSNAME.METHODNAME)`. - ---- - -## Usage - -Import the module `knapsack.py` from the **.** directory into your project. - ---- - -## Tests - -`.` contains Python unit tests which can be run with `python3 -m unittest -v`. +* **Жадный подход (`greedy_knapsack.py`)** + * Этот алгоритм решает задачу о дробном рюкзаке. Он вычисляет соотношение ценности к весу для каждого предмета и заполняет рюкзак, начиная с предметов с самым высоким соотношением. Если предмет не помещается целиком, берётся его максимально возможная часть. Этот жадный подход является оптимальным для дробной версии задачи. diff --git a/linear_algebra/README.md b/linear_algebra/README.md index 35b50b5e0f0a..8b6785e3595f 100644 --- a/linear_algebra/README.md +++ b/linear_algebra/README.md @@ -1,75 +1,41 @@ -# Linear algebra library for Python +# Линейная алгебра -This module contains classes and functions for doing linear algebra. +Линейная алгебра — это раздел математики, изучающий векторы, векторные пространства, линейные преобразования и системы линейных уравнений. ---- +## Алгоритмы и модули -## Overview +* **lib.py**: + * Базовая библиотека, реализующая классы `Vector` и `Matrix` и основные операции над ними (сложение, вычитание, умножение, скалярное произведение, определитель и т.д.) с нуля. -### class Vector -- - - This class represents a vector of arbitrary size and related operations. +* **gaussian\_elimination.py**: + * Реализует метод Гаусса для решения систем линейных уравнений путём приведения расширенной матрицы к треугольному виду и последующей обратной подстановки. - **Overview of the methods:** +* **gaussian\_elimination\_pivoting.py**: + * Реализует метод Гаусса с частичным выбором ведущего элемента (пивотингом). Этот метод повышает численную устойчивость алгоритма, меняя строки местами для использования наибольшего возможного диагонального элемента. - - constructor(components) : init the vector - - set(components) : changes the vector components. - - \_\_str\_\_() : toString method - - component(i): gets the i-th component (0-indexed) - - \_\_len\_\_() : gets the size / length of the vector (number of components) - - euclidean_length() : returns the eulidean length of the vector - - operator + : vector addition - - operator - : vector subtraction - - operator * : scalar multiplication and dot product - - copy() : copies this vector and returns it - - change_component(pos,value) : changes the specified component +* **jacobi\_iteration\_method.py**: + * Реализу_eт итерационный метод Якоби для численного решения систем линейных уравнений. Метод эффективен для матриц с доминирующей диагональю. -- function zero_vector(dimension) - - returns a zero vector of 'dimension' -- function unit_basis_vector(dimension, pos) - - returns a unit basis vector with a one at index 'pos' (0-indexed) -- function axpy(scalar, vector1, vector2) - - computes the axpy operation -- function random_vector(N, a, b) - - returns a random vector of size N, with random integer components between 'a' and 'b' inclusive +* **lu\_decomposition.py**: + * Осуществляет LU-разложение матрицы, представляя её в виде произведения нижней (L) и верхней (U) треугольных матриц. Это разложение широко используется для решения систем линейных уравнений. -### class Matrix -- - - This class represents a matrix of arbitrary size and operations on it. +* **conjugate\_gradient.py**: + * Реализует метод сопряжённых градиентов — итерационный алгоритм для решения систем линейных уравнений с симметричной положительно-определённой матрицей. - **Overview of the methods:** +* **polynom\_for\_points.py**: + * Находит коэффициенты полинома, который проходит через заданный набор точек, решая соответствующую систему линейных уравнений. - - \_\_str\_\_() : returns a string representation - - operator * : implements the matrix vector multiplication - implements the matrix-scalar multiplication. - - change_component(x, y, value) : changes the specified component. - - component(x, y) : returns the specified component. - - width() : returns the width of the matrix - - height() : returns the height of the matrix - - determinant() : returns the determinant of the matrix if it is square - - operator + : implements the matrix-addition. - - operator - : implements the matrix-subtraction +* **power\_iteration.py**: + * Реализует степенной метод — итерационный алгоритм для нахождения собственного значения с наибольшей абсолютной величиной (доминантного собственного значения) и соответствующего ему собственного вектора. -- function square_zero_matrix(N) - - returns a square zero-matrix of dimension NxN -- function random_matrix(W, H, a, b) - - returns a random matrix WxH with integer components between 'a' and 'b' inclusive ---- +* **rank\_of\_matrix.py**: + * Вычисляет ранг матрицы (максимальное число линейно независимых строк или столбцов) путём приведения её к ступенчатому виду методом Гаусса. -## Documentation +* **rayleigh\_quotient.py**: + * Вычисляет отношение Рэлея для эрмитовой матрицы и вектора. Это значение часто используется в алгоритмах нахождения собственных значений. -This module uses docstrings to enable the use of Python's in-built `help(...)` function. -For instance, try `help(Vector)`, `help(unit_basis_vector)`, and `help(CLASSNAME.METHODNAME)`. +* **schur\_complement.py**: + * Вычисляет дополнение Шура для блочной матрицы. Дополнение Шура имеет множество применений в теории матриц и численном анализе. ---- - -## Usage - -Import the module `lib.py` from the **src** directory into your project. -Alternatively, you can directly use the Python bytecode file `lib.pyc`. - ---- - -## Tests - -`src/tests.py` contains Python unit tests which can be run with `python3 -m unittest -v`. +* **transformations\_2d.py**: + * Содержит функции для генерации матриц 2D-преобразований: масштабирования, вращения, проекции и отражения. diff --git a/linear_programming/README.md b/linear_programming/README.md new file mode 100644 index 000000000000..8cb321dbcf97 --- /dev/null +++ b/linear_programming/README.md @@ -0,0 +1,8 @@ +# Линейное программирование + +Линейное программирование — это метод для достижения наилучшего результата (например, максимальной прибыли или минимальных затрат) в математической модели, требования которой представлены линейными соотношениями. + +## Алгоритмы + +* **Симплекс-метод (`simplex.py`)** + * Реализация симплекс-алгоритма для решения задач линейного программирования. Код структурирован в классе `Tableau`, который управляет операциями с симплекс-таблицами. Он может решать стандартные задачи максимизации, а также нестандартные задачи (с ограничениями типа `>=`, `=` или с минимизацией целевой функции) с помощью двухфазного симплекс-метода. Для эффективных вычислений используется библиотека `numpy`. diff --git a/machine_learning/README.md b/machine_learning/README.md new file mode 100644 index 000000000000..398056c226e9 --- /dev/null +++ b/machine_learning/README.md @@ -0,0 +1,44 @@ +# Машинное обучение + +Машинное обучение — это область искусственного интеллекта, которая использует статистические методы, чтобы дать компьютерным системам возможность "обучаться" на данных без явного программирования. + +***Примечание: Некоторые файлы в этом каталоге были помечены как `.broken.txt` и были пропущены.*** + +## Алгоритмы и концепции + +### Ассоциативные правила +* **Apriori (`apriori_algorithm.py`)**: Классический алгоритм для поиска частых наборов предметов в транзакционных базах данных. +* **FP-Growth (`frequent_pattern_growth.py`)**: Эффективный алгоритм для поиска частых наборов предметов, который использует древовидную структуру (FP-Tree) для избежания дорогостоящей генерации кандидатов. + +### Классификация +* **Gradient Boosting Classifier (`gradient_boosting_classifier.py`)**: Реализация градиентного бустинга, который последовательно строит ансамбль слабых учеников (деревьев решений) для создания сильного классификатора. +* **k-Nearest Neighbors (k-NN) (`k_nearest_neighbours.py`)**: Простой алгоритм, который классифицирует новую точку данных на основе большинства голосов её `k` ближайших соседей. +* **Linear Discriminant Analysis (LDA) (`linear_discriminant_analysis.py`)**: Статистический метод для классификации, который предполагает, что данные каждого класса имеют гауссово распределение с общей ковариацией. +* **Logistic Regression (`logistic_regression.py`)**: Алгоритм для бинарной классификации, который моделирует вероятность принадлежности к классу с помощью сигмоидной функции и оптимизируется градиентным спуском. +* **Multilayer Perceptron (`multilayer_perceptron_classifier.py`)**: Пример использования многослойного перцептрона из библиотеки `scikit-learn` для задачи классификации. +* **Support Vector Machines (SVM) (`support_vector_machines.py`, `sequential_minimum_optimization.py`)**: Реализации метода опорных векторов. Одна из них использует эффективный алгоритм SMO (Sequential Minimal Optimization) для обучения. SVM находит гиперплоскость, которая наилучшим образом разделяет классы в пространстве признаков. +* **XGBoost Classifier (`xgboost_classifier.py`)**: Пример использования популярной библиотеки XGBoost (Extreme Gradient Boosting) для задачи классификации. + +### Регрессия +* **Decision Tree (`decision_tree.py`)**: Реализация регрессионного дерева решений, которое строит модель в виде дерева, рекурсивно разбивая данные для минимизации среднеквадратичной ошибки. +* **Linear Regression (`linear_regression.py`)**: Реализация линейной регрессии с использованием градиентного спуска для нахождения линии наилучшего соответствия. +* **Locally Weighted Linear Regression (`local_weighted_learning/`)**: Непараметрический метод, который строит локальную линейную модель для каждой точки прогноза, придавая больший вес ближайшим обучающим примерам. +* **Polynomial Regression (`polynomial_regression.py`)**: Моделирует зависимость как полином m-й степени, решая задачу как частный случай множественной линейной регрессии. +* **XGBoost Regressor (`xgboost_regressor.py`)**: Пример использования библиотеки XGBoost для задачи регрессии. + +### Кластеризация +* **K-Means (`k_means_clust.py`)**: Итеративный алгоритм, который разделяет набор данных на `k` кластеров, минимизируя сумму квадратов расстояний от каждой точки до центроида её кластера. +* **Self-Organizing Map (SOM) (`self_organizing_map.py`)**: Тип нейронной сети, обучаемый без учителя для создания низкоразмерной карты входного пространства. + +### Другие концепции +* **A\* Search (`astar.py`)**: Алгоритм поиска, используемый для нахождения пути в графах, который здесь применяется в контексте машинного обучения. +* **Automatic Differentiation (`automatic_differentiation.py`)**: Реализация автоматического дифференцирования в обратном режиме (backpropagation), фундаментального механизма для обучения нейронных сетей. +* **Data Transformations (`data_transformations.py`)**: Функции для нормализации (масштабирование в диапазон [0, 1]) и стандартизации (среднее 0, стандартное отклонение 1) данных. +* **Dimensionality Reduction (`dimensionality_reduction.py`)**: Реализации метода главных компонент (PCA) и линейного дискриминантного анализа (LDA) для уменьшения размерности данных. +* **Gradient Descent (`gradient_descent.py`)**: Базовая реализация алгоритма градиентного спуска для минимизации функции стоимости. +* **Loss Functions (`loss_functions.py`)**: Набор различных функций потерь, используемых для оценки ошибок моделей в задачах классификации и регрессии (например, Cross-Entropy, MSE, MAE, Hinge Loss). +* **Scoring Functions (`scoring_functions.py`)**: Дополнительный набор метрик для оценки моделей (MAE, MSE, RMSE, RMSLE и др.). +* **LSTM (`lstm/`)**: Пример использования нейронной сети с долгой краткосрочной памятью (LSTM) для прогнозирования временных рядов с помощью библиотеки Keras. +* **MFCC (`mfcc.py`)**: Реализация извлечения Мел-частотных кепстральных коэффициентов — ключевых признаков для обработки аудио и речи. +* **Similarity Search (`similarity_search.py`)**: Функции для поиска схожести между векторами с использованием евклидова расстояния и косинусного сходства. +* **Word Frequency Functions (`word_frequency_functions.py`)**: Реализация базовых метрик для анализа текста, таких как TF, IDF и TF-IDF. diff --git a/maths/README.md b/maths/README.md new file mode 100644 index 000000000000..bb8abe706d1a --- /dev/null +++ b/maths/README.md @@ -0,0 +1,59 @@ +# Математические алгоритмы + +Этот каталог содержит широкий спектр математических алгоритмов, от базовой арифметики и теории чисел до численных методов. + +***Примечание: Этот список может быть неполным из-за большого количества файлов в директории.*** + +## Алгоритмы + +### Базовая арифметика и теория чисел +* **Абсолютное значение (`abs.py`)**: Находит абсолютное значение числа, а также минимум/максимум по модулю в списке. +* **Сложение без арифметических операторов (`addition_without_arithmetic.py`)**: Демонстрирует сложение целых чисел с использованием только побитовых операций. +* **Аликвотная сумма (`aliquot_sum.py`)**: Вычисляет сумму собственных делителей числа (всех делителей, кроме самого числа). +* **Бинарное возведение в степень (`binary_exponentiation.py`)**: Эффективный алгоритм для вычисления `a^b` за время O(log b), включая модульную версию. +* **Бинарное умножение (`binary_multiplication.py`)**: Реализует умножение `a * b` за время O(log b) с помощью двоичных методов. +* **Биномиальный коэффициент (`binomial_coefficient.py`)**: Вычисляет C(n, r) с помощью динамического программирования на основе треугольника Паскаля. +* **Биномиальное распределение (`binomial_distribution.py`)**: Вычисляет вероятность `k` успехов в `n` испытаниях для биномиального распределения. +* **Китайская теорема об остатках (`chinese_remainder_theorem.py`)**: Решает систему двух линейных сравнений. +* **Двойной факториал (`double_factorial.py`)**: Вычисляет двойной факториал `n!!`. +* **Проверка на простоту (`prime_check.py`)**: Эффективная функция для проверки, является ли число простым. +* **Простые числа Софи Жермен (`germain_primes.py`)**: Проверяет, является ли число простым числом Софи Жермен или безопасным простым числом. +* **Наибольший общий делитель (НОД)**: + * `greatest_common_divisor.py`: Реализует алгоритм Евклида (рекурсивный и итеративный) для нахождения НОД двух чисел. + * `gcd_of_n_numbers.py`: Находит НОД для произвольного количества чисел через их разложение на простые множители. +* **Факториал (`factorial.py`)**: Итеративная и рекурсивная реализации вычисления факториала. +* **Разложение на множители (`factors.py`)**: Находит все делители положительного целого числа. +* **Малая теорема Ферма (`fermat_little_theorem.py`)**: Демонстрирует применение теоремы для вычисления модульного деления. +* **Последовательность Фибоначчи (`fibonacci.py`)**: Сборник различных методов генерации чисел Фибоначчи (итеративный, рекурсивный, с мемоизацией, формула Бине). +* **Функция Эйлера (`eulers_totient.py`)**: Вычисляет функцию Эйлера (фи-функцию) для всех чисел до `n` с помощью метода решета. +* **Расширенный алгоритм Евклида (`extended_euclidean_algorithm.py`)**: Находит коэффициенты Безу `x` и `y` для уравнения `ax + by = НОД(a, b)`. + +### Численные методы и анализ +* **Длина дуги (`arc_length.py`)**: Вычисляет длину дуги окружности. +* **Площадь под кривой (`area_under_curve.py`)**: Приближенно вычисляет определённый интеграл с помощью правила трапеций. +* **Алгоритм Чудновского (`chudnovsky_algorithm.py`)**: Быстрый алгоритм для вычисления цифр числа π с высокой точностью. +* **Метод Эйлера (`euler_method.py`, `euler_modified.py`)**: Реализации простого и модифицированного методов Эйлера для численного решения обыкновенных дифференциальных уравнений. +* **Быстрый обратный квадратный корень (`fast_inverse_sqrt.py`)**: Реализация знаменитого алгоритма из Quake III для быстрого вычисления `1/√x`. +* **Гамма-функция (`gamma.py`)**: Реализации для вычисления Гамма-функции, обобщения факториала. +* **Автоматическое дифференцирование**: + * `dual_number_automatic_differentiation.py`: Использует дуальные числа для точного вычисления производных. + +### Статистика и геометрия +* **Площадь (`area.py`)**: Набор функций для вычисления площадей различных 2D и 3D фигур. +* **Среднее абсолютное отклонение (`average_absolute_deviation.py`)**: Вычисляет меру статистической дисперсии. +* **Среднее, медиана, мода (`average_mean.py`, `average_median.py`, `average_mode.py`)**: Функции для вычисления основных мер центральной тенденции. +* **Потолок и пол (`ceil.py`, `floor.py`)**: Реализации функций округления вверх и вниз. +* **Расстояние Чебышёва (`chebyshev_distance.py`)**: Вычисляет расстояние Чебышёва ("шахматное" расстояние) между двумя точками. +* **Проверка многоугольника (`check_polygon.py`)**: Определяет, может ли существовать многоугольник с заданными длинами сторон. +* **Свойства додекаэдра (`dodecahedron.py`)**: Функции для вычисления площади поверхности и объёма додекаэдра. +* **Евклидово расстояние (`euclidean_distance.py`)**: Вычисляет евклидово расстояние между двумя векторами. +* **Гауссова функция (`gaussian.py`)**: Вычисляет значение функции Гаусса (плотности нормального распределения). + +### Прочее +* **Распределение байтов (`allocation_number.py`)**: Утилита для разделения общего количества байтов на заданное число непересекающихся диапазонов. +* **Конвертация в нега-двоичную систему (`base_neg2_conversion.py`)**: Преобразует десятичное число в его представление по основанию -2. +* **Последовательность Коллатца (`collatz_sequence.py`)**: Генерирует последовательность Коллатца для заданного числа. +* **Непрерывная дробь (`continued_fraction.py`)**: Вычисляет представление рационального числа в виде непрерывной дроби. +* **Работа с десятичными числами (`decimal_isolate.py`, `decimal_to_fraction.py`)**: Функции для выделения дробной части и преобразования десятичного числа в простую дробь. +* **Энтропия (`entropy.py`)**: Вычисляет энтропию Шеннона для заданного текста. +* **Поиск минимума/максимума (`find_min.py`, `find_max.py`)**: Итеративные и рекурсивные реализации поиска минимального и максимального элементов в списке. diff --git a/matrix/README.md b/matrix/README.md new file mode 100644 index 000000000000..42328003ac20 --- /dev/null +++ b/matrix/README.md @@ -0,0 +1,35 @@ +# Алгоритмы для работы с матрицами + +Матрица в математике — это прямоугольный массив чисел, символов или выражений, расположенных в строках и столбцах. Этот каталог содержит различные алгоритмы для выполнения операций над матрицами и решения задач, связанных с ними. + +## Алгоритмы и реализации + +### Основные операции и классы +* **matrix\_class.py**: Комплексная объектно-ориентированная реализация класса `Matrix`, поддерживающая множество операций: сложение, вычитание, умножение, возведение в степень, нахождение определителя, миноров, кофакторов, обратной и присоединённой матриц. +* **matrix\_operation.py**: Процедурный подход к реализации основных матричных операций, таких как сложение, умножение, транспонирование, нахождение определителя и обратной матрицы. +* **matrix\_multiplication\_recursion.py**: Рекурсивная реализация умножения двух квадратных матриц. +* **inverse\_of\_matrix.py**: Функция для нахождения обратной матрицы для матриц размером 2x2 и 3x3. +* **cramers\_rule\_2x2.py**: Реализует правило Крамера для решения системы двух линейных уравнений с двумя переменными. +* **sherman\_morrison.py**: Реализует формулу Шермана-Моррисона для эффективного вычисления обратной матрицы после её обновления на единичный ранг. + +### Задачи на сетках (Grid) +* **count\_islands\_in\_matrix.py**: Подсчитывает количество "островов" (связных групп из 1) в бинарной матрице с учётом диагональных связей. +* **max\_area\_of\_island.py**: Находит остров с максимальной площадью в бинарной матрице (связность по 4 направлениям). +* **count\_paths.py**: Рекурсивно подсчитывает количество уникальных путей из верхнего левого угла в правый нижний в сетке с препятствиями. +* **largest\_square\_area\_in\_matrix.py**: Находит наибольший квадратный подматрицу, состоящую только из 1, используя несколько подходов, включая динамическое программирование. + +### Поиск и сортировка в матрицах +* **binary\_search\_matrix.py**: Осуществляет поиск элемента в матрице, где каждая строка отсортирована, применяя бинарный поиск к каждой строке. +* **searching\_in\_sorted\_matrix.py**: Эффективный поиск в матрице, отсортированной по строкам и столбцам, за время O(m+n). +* **count\_negative\_numbers\_in\_sorted\_matrix.py**: Несколько методов для подсчёта отрицательных чисел в матрице, отсортированной в убывающем порядке по строкам и столбцам. +* **median\_matrix.py**: Находит медиану всех элементов матрицы путём её выравнивания и сортировки. + +### Визуализация и утилиты +* **pascal\_triangle.py**: Генерирует и выводит треугольник Паскаля заданного размера. +* **rotate\_matrix.py**: Функции для вращения квадратной матрицы на 90, 180 и 270 градусов против часовой стрелки. +* **spiral\_print.py**: Две рекурсивные реализации для обхода и вывода элементов матрицы по спирали. +* **validate\_sudoku\_board.py**: Проверяет, является ли заданная доска 9x9 валидным (но не обязательно решаемым) полем для игры в Судоку. +* **matrix\_equalization.py**: Находит минимальное количество "обновлений" для того, чтобы все элементы в списке стали равны одному значению, с учётом заданного "шага". + +### Специализированные алгоритмы +* **nth\_fibonacci\_using\_matrix\_exponentiation.py**: Вычисляет n-е число Фибоначчи за время O(log n), используя метод возведения в степень матрицы. diff --git a/networking_flow/README.md b/networking_flow/README.md new file mode 100644 index 000000000000..8927f25a8fe9 --- /dev/null +++ b/networking_flow/README.md @@ -0,0 +1,11 @@ +# Сетевые потоки + +Сетевой поток — это направленный граф, где каждое ребро имеет пропускную способность, а каждый узел — поток, удовлетворяющий ограничению, что входящий поток равен исходящему. Эта концепция широко используется для моделирования движения жидкостей, трафика, валюты и т.д. + +## Алгоритмы + +* **Алгоритм Форда-Фалкерсона (`ford_fulkerson.py`)** + * Реализация метода Форда-Фалкерсона для нахождения максимального потока в транспортной сети. Алгоритм итеративно находит увеличивающиеся пути от источника к стоку в остаточной сети и увеличивает поток вдоль этих путей до тех пор, пока такие пути существуют. В данной реализации для поиска пути используется поиск в ширину (BFS), что делает её конкретным вариантом, известным как алгоритм Эдмондса-Карпа. + +* **Минимальный разрез (`minimum_cut.py`)** + * Реализация для нахождения минимального разреза в транспортной сети. Алгоритм основан на теореме о максимальном потоке и минимальном разрезе, которая гласит, что величина максимального потока в сети равна пропускной способности её минимального разреза. Сначала вычисляется максимальный поток с помощью алгоритма Форда-Фалкерсона, а затем на основе остаточного графа определяются рёбра, составляющие минимальный разрез. diff --git a/neural_network/README.md b/neural_network/README.md new file mode 100644 index 000000000000..8547ffefa777 --- /dev/null +++ b/neural_network/README.md @@ -0,0 +1,34 @@ +# Нейронные сети + +Нейронная сеть — это вычислительная модель, вдохновлённая структурой и функциями биологических нейронных сетей. Она состоит из взаимосвязанных узлов (нейронов), которые обрабатывают информацию и передают сигналы друг другу. Нейронные сети являются основой современного глубокого обучения. + +***Примечание: Некоторые файлы в этом каталоге были помечены как `.broken.txt` или `.py_tf` и были пропущены или требуют особого внимания.*** + +## Реализации + +### Основные архитектуры +* **Простая нейронная сеть (`simple_neural_network.py`)**: Минималистичный пример, демонстрирующий концепцию нейронной сети с одним нейроном, который обучается подстраивать один весовой коэффициент. +* **Нейронная сеть с обратным распространением ошибки (`back_propagation_neural_network.py`)**: Реализация с нуля фреймворка для построения и обучения многослойной нейронной сети с использованием алгоритма обратного распространения ошибки. +* **Нейронная сеть с двумя скрытыми слоями (`two_hidden_layers_neural_network.py`)**: Ещё одна реализация с нуля нейронной сети с двумя скрытыми слоями, демонстрирующая прямой проход (feedforward) и обратное распространение ошибки (backpropagation). +* **Свёрточная нейронная сеть (CNN) (`convolution_neural_network.py`)**: Реализация с нуля гибридной CNN, которая включает свёрточный и пулинговый слои для извлечения признаков, за которыми следует полносвязная сеть для классификации. +* **Генеративно-состязательная сеть (GAN) (`gan.py_tf`)**: Реализация с нуля генеративно-состязательной сети на `numpy` для генерации изображений рукописных цифр (MNIST). Включает в себя сети Генератора и Дискриминатора, а также оптимизатор Adam. +* **Сеть с долгой краткосрочной памятью (LSTM) (`lstm/`)**: Пример использования библиотеки Keras для построения LSTM-сети для прогнозирования временных рядов. +* **Многослойный перцептрон (`multilayer_perceptron_classifier.py`)**: Пример использования `MLPClassifier` из библиотеки `scikit-learn` для решения задачи классификации. + +### Функции активации (`activation_functions/`) +Это набор реализаций различных функций активации, которые определяют выходной сигнал нейрона. +* **Binary Step**: Простейшая пороговая функция. +* **ReLU (Rectified Linear Unit)**: Самая популярная функция активации, `f(x) = max(0, x)`. +* **Leaky ReLU**: Вариация ReLU, которая позволяет небольшой градиент для отрицательных входов. +* **ELU (Exponential Linear Unit)**: Альтернатива ReLU, которая может принимать отрицательные значения. +* **SELU (Scaled Exponential Linear Unit)**: Самонормализующаяся версия ELU. +* **Softplus**: Гладкая аппроксимация ReLU. +* **Squareplus**: Ещё одна гладкая аппроксимация ReLU. +* **GELU (Gaussian Error Linear Unit)**: Высокопроизводительная функция, взвешивающая входы по их значению. +* **Swish (SiLU)**: Саморегулируемая функция, `f(x) = x * sigmoid(x)`. +* **Mish**: Гладкая, немонотонная функция активации. +* **Soboleva Modified Hyperbolic Tangent**: Гибкая, параметризованная функция активации. + +### Вспомогательные концепции +* **Автоматическое дифференцирование (`input_data.py`)**: Скрипт, который, по-видимому, используется для загрузки данных (например, MNIST) для других моделей. +* **Входные данные (`input_data.py`)**: Скрипт, который, по-видимому, используется для загрузки данных (например, MNIST) для других моделей. diff --git a/other/README.md b/other/README.md new file mode 100644 index 000000000000..ac499b7290fb --- /dev/null +++ b/other/README.md @@ -0,0 +1,31 @@ +# Разные алгоритмы + +Этот каталог содержит коллекцию разнообразных и интересных алгоритмов, которые не вписываются в другие, более определённые категории. + +## Алгоритмы + +* **Задача о выборе заявок (`activity_selection.py`)**: Классическая задача, решаемая жадным алгоритмом, для выбора максимального количества непересекающихся по времени активностей. +* **Чередующееся объединение списков (`alternative_list_arrange.py`)**: Функция, которая объединяет два списка в один, чередуя их элементы. +* **Алгоритм банкира (`bankers_algorithm.py`)**: Классический алгоритм из области операционных систем для избежания взаимоблокировок (deadlocks) при распределении ресурсов. +* **Алгоритм DPLL (`davis_putnam_logemann_loveland.py`)**: Реализация алгоритма Дэвиса-Патнема-Логемана-Лавленда для решения задачи о выполнимости булевых формул (SAT). +* **Алгоритм Судного дня (`doomsday.py`)**: Алгоритм Джона Конвея для вычисления дня недели для любой заданной даты. +* **Тасование Фишера-Йетса (`fischer_yates_shuffle.py`)**: Реализация алгоритма для генерации случайной перестановки конечной последовательности. (Примечание: реализация в файле является наивной и не гарантирует равномерного распределения). +* **Пасхальный алгоритм Гаусса (`gauss_easter.py`)**: Математическая процедура для вычисления даты Пасхи в григорианском календаре. +* **Алгоритм Грэхема (`graham_scan.py`)**: Метод для нахождения выпуклой оболочки для конечного множества точек на плоскости. +* **Жадный алгоритм (`greedy.py`)**: Обобщённая реализация жадного подхода для решения задач, подобных задаче о рюкзаке. +* **Угадай число (`guess_the_number_search.py`)**: Демонстрация бинарного поиска для угадывания числа в заданном диапазоне. +* **H-индекс (`h_index.py`)**: Вычисляет h-индекс для исследователя на основе списка цитирований его работ. +* **LRU Cache (`least_recently_used.py`, `lru_cache.py`)**: Две реализации кэша, работающего по принципу "наименее давно использовавшийся" (Least Recently Used). При заполнении кэша вытесняется элемент, к которому дольше всего не обращались. +* **LFU Cache (`lfu_cache.py`)**: Реализация кэша, работающего по принципу "наименее часто используемый" (Least Frequently Used). При заполнении вытесняется элемент, к которому обращались реже всего. +* **Линейный конгруэнтный генератор (`linear_congruential_generator.py`)**: Простой и широко известный алгоритм для генерации псевдослучайных чисел. +* **Магический ромб (`magicdiamondpattern.py`)**: Функции для генерации и вывода ромбовидного узора из символов. +* **Алгоритм большинства голосов (`majority_vote_algorithm.py`)**: Реализация алгоритма большинства голосов Бойера-Мура для нахождения элементов, встречающихся более чем `n/k` раз в последовательности. +* **Максимальная сумма подпоследовательности (`maximum_subsequence.py`)**: Находит максимально возможную сумму непустой подпоследовательности чисел. +* **Проверка вложенности скобок (`nested_brackets.py`)**: Классическая задача на использование стека для проверки правильности расстановки скобок в строке. +* **Контейнер чисел (`number_container_system.py`)**: Структура данных для хранения чисел по индексам с эффективным поиском. +* **Генератор паролей (`password.py`)**: Утилиты для генерации случайных паролей и проверки их на надёжность. +* **Квайн (`quine.py`)**: Программа, которая выводит свой собственный исходный код. +* **Алгоритм скоринга (`scoring_algorithm.py`)**: Реализует алгоритм "процентной близости" для ранжирования элементов на основе нескольких атрибутов. +* **S-DES (`sdes.py`)**: Реализация упрощённого стандарта шифрования данных (Simplified Data Encryption Standard), учебной версии блочного шифра DES. +* **Ханойская башня (`tower_of_hanoi.py`)**: Классическое рекурсивное решение головоломки "Ханойская башня". +* **Поиск слов (`word_search.py`)**: Класс для генерации игрового поля "поиск слов". diff --git a/physics/README.md b/physics/README.md new file mode 100644 index 000000000000..b304f90d8348 --- /dev/null +++ b/physics/README.md @@ -0,0 +1,37 @@ +# Физика + +Этот раздел содержит реализации различных физических законов и формул. + +## Описание + +* `altitude_pressure.py`: Вычисляет высоту на основе атмосферного давления, используя барометрическую формулу. +* `archimedes_principle_of_buoyant_force.py`: Рассчитывает выталкивающую силу (силу Архимеда), действующую на тело, полностью или частично погруженное в жидкость. +* `basic_orbital_capture.py`: Рассчитывает радиус и эффективную площадь поперечного сечения для гравитационного захвата объекта, движущегося к целевому телу. +* `casimir_effect.py`: Вычисляет силу Казимира — физическую силу, возникающую из-за квантовых флуктуаций поля. +* `center_of_mass.py`: Рассчитывает координаты центра масс для системы дискретных частиц. +* `centripetal_force.py`: Вычисляет центростремительную силу, необходимую для удержания объекта на криволинейной траектории. +* `coulombs_law.py`: Реализует закон Кулона для расчета силы электростатического взаимодействия между двумя точечными зарядами. +* `doppler_frequency.py`: Рассчитывает изменение частоты волны (эффект Доплера) в зависимости от скоростей источника и наблюдателя. +* `grahams_law.py`: Реализует закон Грэма, который гласит, что скорость эффузии газа обратно пропорциональна квадратному корню из его молярной массы. +* `horizontal_projectile_motion.py`: Решает задачи о движении тела, брошенного под углом к горизонту, вычисляя дальность, высоту и время полета. +* `hubble_parameter.py`: Вычисляет параметр Хаббла, который описывает скорость расширения Вселенной в зависимости от времени (или красного смещения). +* `ideal_gas_law.py`: Применяет закон идеального газа (PV = nRT) для вычисления давления, объема, температуры или количества вещества. +* `in_static_equilibrium.py`: Проверяет, находится ли система сил в статическом равновесии (сумма сил и моментов равна нулю). +* `kinetic_energy.py`: Вычисляет кинетическую энергию объекта (энергию движения) по его массе и скорости. +* `lens_formulae.py`: Содержит функции для расчета фокусного расстояния, расстояния до изображения и расстояния до объекта для тонкой линзы. +* `lorentz_transformation_four_vector.py`: Выполняет преобразования Лоренца для четырех-векторов, описывая переход между инерциальными системами отсчета. +* `malus_law.py`: Применяет закон Малюса для вычисления интенсивности поляризованного света, проходящего через поляризатор. +* `mass_energy_equivalence.py`: Вычисляет эквивалентность массы и энергии, используя знаменитую формулу Эйнштейна E = mc². +* `mirror_formulae.py`: Содержит функции для расчета фокусного расстояния, расстояния до объекта и изображения для сферического зеркала. +* `n_body_simulation.py`: Моделирует гравитационное взаимодействие системы из N тел с использованием метода Эйлера. +* `newtons_law_of_gravitation.py`: Реализует закон всемирного тяготения Ньютона для расчета силы притяжения между двумя массами. +* `newtons_second_law_of_motion.py`: Реализует второй закон Ньютона (F = ma) для вычисления силы, массы или ускорения. +* `photoelectric_effect.py`: Рассчитывает максимальную кинетическую энергию фотоэлектронов, испускаемых при фотоэффекте. +* `potential_energy.py`: Вычисляет гравитационную потенциальную энергию объекта относительно поверхности Земли. +* `rainfall_intensity.py`: Рассчитывает интенсивность дождевых осадков для заданной продолжительности и периода повторяемости. +* `reynolds_number.py`: Вычисляет число Рейнольдса для определения режима течения жидкости (ламинарный или турбулентный). +* `rms_speed_of_molecule.py`: Вычисляет среднеквадратичную скорость молекул в газе. +* `shear_stress.py`: Вычисляет напряжение сдвига, возникающее из-за силы, параллельной поперечному сечению материала. +* `speed_of_sound.py`: Вычисляет скорость звука в жидкости на основе ее плотности и модуля объемной упругости. +* `speeds_of_gas_molecules.py`: Вычисляет среднюю и наиболее вероятную скорости молекул газа на основе распределения Максвелла-Больцмана. +* `terminal_velocity.py`: Вычисляет установившуюся скорость падения объекта в жидкости, когда сила сопротивления уравновешивает силу тяжести. diff --git a/scheduling/README.md b/scheduling/README.md new file mode 100644 index 000000000000..febe11e29dd3 --- /dev/null +++ b/scheduling/README.md @@ -0,0 +1,24 @@ +# Алгоритмы планирования + +Алгоритмы планирования используются в операционных системах для определения, какому процессу будет выделен центральный процессор (CPU) для выполнения. Эффективное планирование критически важно для производительности и отзывчивости системы. + +## Алгоритмы + +* **First-Come, First-Served (FCFS)** + * **`first_come_first_served.py`**: Простейший невытесняющий алгоритм, при котором процессы выполняются в том порядке, в котором они поступают в очередь. + +* **Highest Response Ratio Next (HRRN)** + * **`highest_response_ratio_next.py`**: Невытесняющий алгоритм, который является компромиссом между FCFS и SJF. Он выбирает для выполнения процесс с самым высоким "коэффициентом отклика", который рассчитывается как `(время_ожидания + время_выполнения) / время_выполнения`, что помогает избежать "голодания" длинных процессов. + +* **Job Sequencing with Deadline (Планирование работ с крайним сроком)** + * **`job_sequence_with_deadline.py`**, **`job_sequencing_with_deadline.py`**: Две реализации жадного алгоритма для решения задачи о планировании работ. Цель — выполнить последовательность работ так, чтобы максимизировать общую прибыль, учитывая, что каждая работа имеет крайний срок выполнения и приносит определённую прибыль. + +* **Multi-Level Feedback Queue (MLFQ)** + * **`multi_level_feedback_queue.py`**: Реализация многоуровневой очереди с обратной связью. Это сложный алгоритм, использующий несколько очередей с разными приоритетами. Процессы могут перемещаться между очередями: например, если процесс использует весь свой квант времени, он может быть перемещён в очередь с более низким приоритетом. Эта реализация использует Round Robin для очередей с высоким приоритетом и FCFS для очереди с самым низким. + +* **Shortest Job First (SJF)** + * **`non_preemptive_shortest_job_first.py`**: Реализация невытесняющего алгоритма SJF (также известного как Shortest Job Next, SJN). Когда процессор освобождается, он передаётся процессу с наименьшим временем выполнения. + * **`shortest_job_first.py`**: Реализация вытесняющего алгоритма SJF (также известного как Shortest Remaining Time First, SRTF). Если в очередь поступает процесс, оставшееся время выполнения которого меньше, чем у текущего выполняемого процесса, происходит переключение контекста. + +* **Round Robin (Циклическое планирование)** + * **`round_robin.py`**: Реализация вытесняющего алгоритма, при котором каждому процессу выделяется небольшой квант времени для выполнения. Если процесс не завершается за этот квант, он перемещается в конец очереди. diff --git a/searches/README.md b/searches/README.md new file mode 100644 index 000000000000..85610b1ededd --- /dev/null +++ b/searches/README.md @@ -0,0 +1,20 @@ +# Алгоритмы поиска + +Алгоритм поиска — это алгоритм, который предназначен для нахождения конкретных данных в структуре данных. Поиск может быть последовательным, бинарным, по дереву и т.д. + +## Алгоритмы + +* **Бинарный поиск (`binary_search.py`, `simple_binary_search.py`)**: Эффективный алгоритм для нахождения элемента в *отсортированном* массиве. Он работает, многократно деля пополам ту часть списка, в которой может находиться искомый элемент. Представлены итеративная, рекурсивная и использующая стандартную библиотеку (`bisect`) реализации. +* **Обход двоичного дерева (`binary_tree_traversal.py`)**: Реализации четырёх основных методов обхода двоичного дерева: в глубину (pre-order, in-order, post-order) и в ширину (level-order). +* **Двойной линейный поиск (`double_linear_search.py`, `double_linear_search_recursion.py`)**: Вариация линейного поиска, при которой поиск ведётся одновременно с начала и с конца списка. Представлены итеративная и рекурсивная версии. +* **Поиск Фибоначчи (`fibonacci_search.py`)**: Техника поиска в отсортированном массиве, которая использует числа Фибоначчи для разделения массива. +* **Поиск восхождением к холму (`hill_climbing.py`)**: Локальный эвристический поиск, используемый для нахождения локального оптимума (максимума или минимума) функции. +* **Интерполяционный поиск (`interpolation_search.py`)**: Улучшение бинарного поиска для равномерно распределённых данных. Вместо того чтобы всегда проверять середину, он выбирает позицию для проверки на основе значения искомого элемента. +* **Поиск с прыжками (`jump_search.py`)**: Алгоритм для отсортированных массивов, который "перепрыгивает" через блоки фиксированного размера, а затем выполняет линейный поиск в нужном блоке. +* **Линейный поиск (`linear_search.py`)**: Простейший алгоритм поиска, который последовательно проверяет каждый элемент списка. +* **Медиана медиан (`median_of_medians.py`)**: Детерминированный алгоритм выбора за линейное время, используемый для нахождения k-го наименьшего элемента в несортированном списке. Гарантирует производительность O(n) в худшем случае. +* **Quick Select (`quick_select.py`)**: Алгоритм для нахождения k-го наименьшего элемента в несортированном списке. Имеет среднюю производительность O(n), но O(n^2) в худшем случае. +* **Линейный поиск со сторожем (`sentinel_linear_search.py`)**: Небольшая оптимизация линейного поиска, которая добавляет искомый элемент в конец списка, чтобы избежать проверки индекса на каждой итерации. +* **Имитация отжига (`simulated_annealing.py`)**: Вероятностный метод, который является расширением поиска восхождением к холму. Позволяет избегать локальных оптимумов, иногда принимая "худшие" решения. +* **Поиск с запретами (Tabu Search) (`tabu_search.py`)**: Метаэвристический метод локального поиска, который использует "список запретов" для предотвращения зацикливания и исследования уже посещённых решений. Применён для решения задачи коммивояжёра. +* **Тернарный поиск (`ternary_search.py`)**: Алгоритм "разделяй и властвуй", который делит массив на три части для поиска элемента. diff --git a/sorts/README.md b/sorts/README.md index f24427d582e7..8f05e47d91ea 100644 --- a/sorts/README.md +++ b/sorts/README.md @@ -1,11 +1,42 @@ -# Sorting Algorithms -Sorting is the process of putting data in a specific order. The way to arrange data in a specific order -is specified by the sorting algorithm. The most typical orders are lexical or numerical. The significance -of sorting lies in the fact that, if data is stored in a sorted manner, data searching can be highly optimised. -Another use for sorting is to represent data in a more readable manner. - -This section contains a lot of important algorithms that help us to use sorting algorithms in various scenarios. -## References -* -* -* +# Алгоритмы сортировки + +Алгоритм сортировки — это алгоритм для упорядочивания элементов в списке. Эффективная сортировка важна для оптимизации других алгоритмов (таких как поиск и слияние), которые требуют, чтобы входные данные были в отсортированном виде. + +## Алгоритмы + +### Простые сортировки (O(n²)) +* **Пузырьковая сортировка (`bubble_sort.py`)**: Простой алгоритм, который многократно проходит по списку, сравнивая и меняя местами соседние элементы, если они стоят в неправильном порядке. +* **Шейкерная сортировка (`cocktail_shaker_sort.py`, `double_sort.py`)**: Вариация пузырьковой сортировки, которая проходит по списку в обоих направлениях на каждой итерации. +* **Сортировка вставками (`insertion_sort.py`, `recursive_insertion_sort.py`)**: Алгоритм, который строит отсортированный массив по одному элементу за раз, вставляя каждый следующий элемент на правильную позицию в уже отсортированную часть. +* **Сортировка выбором (`selection_sort.py`, `exchange_sort.py`)**: Алгоритм, который делит список на отсортированную и неотсортированную части и на каждой итерации находит минимальный элемент в неотсортированной части и перемещает его в конец отсортированной. +* **Гномья сортировка (`gnome_sort.py`)**: Простой алгоритм, похожий на сортировку вставками, но перемещающий элемент на свое место с помощью серии обменов. + +### Эффективные сортировки (O(n log n)) +* **Сортировка слиянием (`merge_sort.py`, `iterative_merge_sort.py`, `recursive_mergesort_array.py`)**: Алгоритм "разделяй и властвуй". Он рекурсивно делит список пополам, сортирует каждую половину, а затем сливает их в один отсортированный список. +* **Пирамидальная сортировка (Heapsort) (`heap_sort.py`)**: Преобразует список в двоичную кучу (max-heap) и затем последовательно извлекает максимальный элемент из кучи, помещая его в конец отсортированной части массива. +* **Быстрая сортировка (Quicksort) (`quick_sort.py`, `quick_sort_3_partition.py`, `recursive_quick_sort.py`)**: Алгоритм "разделяй и властвуй", который выбирает "опорный" элемент и перераспределяет другие элементы так, чтобы элементы меньше опорного оказались перед ним, а большие — после. Затем рекурсивно сортирует две части. Представлены реализации с разными схемами разделения (Ломуто, 3-частная). +* **Introsort (`intro_sort.py`)**: Гибридный алгоритм, который начинается с быстрой сортировки, но переключается на пирамидальную при слишком большой глубине рекурсии (для гарантии O(n log n)) и на сортировку вставками для маленьких подмассивов. +* **Timsort (`tim_sort.py`)**: Гибридный алгоритм, основанный на сортировке слиянием и сортировке вставками. Он эффективно работает на реальных данных, находя в них уже отсортированные участки ("раны"). Является стандартным алгоритмом сортировки в Python. +* **Сортировка Шелла (`shell_sort.py`, `shrink_shell_sort.py`)**: Улучшенная версия сортировки вставками, которая позволяет обменивать далеко стоящие элементы, используя определённую последовательность "промежутков" (gaps). + +### Несравнительные сортировки +* **Сортировка подсчётом (`counting_sort.py`)**: Эффективна для сортировки целых чисел в ограниченном диапазоне. Работает путём подсчёта количества вхождений каждого элемента. +* **Голубиная сортировка (`pigeon_sort.py`, `pigeonhole_sort.py`)**: Подходит для сортировки списков, где количество элементов и количество возможных значений примерно равны. +* **Поразрядная сортировка (Radix Sort)**: + * **`radix_sort.py`**: Реализация LSD (по младшему значащему разряду). + * **`msd_radix_sort.py`**: Реализация MSD (по старшему значащему разряду). + +### Другие/Эзотерические сортировки +* **Бинарная сортировка вставками (`binary_insertion_sort.py`)**: Вариант сортировки вставками, который использует бинарный поиск для нахождения места вставки, уменьшая количество сравнений, но не обменов. +* **Битоническая сортировка (`bitonic_sort.py`)**: Параллельный алгоритм сортировки, который строит битонические последовательности и сливает их. +* **Bogo-сортировка (`bogo_sort.py`)**: "Глупая" сортировка, которая генерирует случайные перестановки списка, пока не найдёт отсортированную. Используется в образовательных и юмористических целях. +* **Круговая сортировка (`circle_sort.py`)**: Рекурсивный алгоритм, который сравнивает и меняет местами элементы с противоположных концов массива. +* **Циклическая сортировка (`cycle_sort.py`)**: Оптимальна по количеству записей в массив. Находит циклы элементов, которые нужно повернуть, чтобы каждый элемент встал на своё место. +* **Внешняя сортировка (`external_sort.py`)**: Алгоритм для сортировки данных, которые не помещаются в оперативную память, путём разделения на части, сортировки частей и их последующего слияния. +* **Блинная сортировка (`pancake_sort.py`)**: Сортирует массив, используя только одну операцию — "переворот" префикса массива. +* **"Терпеливая" сортировка (`patience_sort.py`)**: Алгоритм, имитирующий карточный пасьянс. Раскладывает элементы по стопкам по определённому правилу, а затем сливает их. +* **Slowsort (`slowsort.py`)**: Юмористический, крайне неэффективный рекурсивный алгоритм. +* **Stooge Sort (`stooge_sort.py`)**: Ещё один неэффективный рекурсивный алгоритм сортировки. +* **Strand Sort (`strand_sort.py`)**: Рекурсивно извлекает отсортированные "нити" (подпоследовательности) из списка и сливает их в итоговый отсортированный список. +* **Сортировка деревом (`tree_sort.py`)**: Строит двоичное дерево поиска из элементов списка, а затем получает отсортированный список путём обхода дерева "in-order". +* **Естественная сортировка (`natural_sort.py`)**: Сортирует строки так, как ожидает человек, правильно обрабатывая числа внутри строк (например, "file2.txt" идёт перед "file10.txt"). diff --git a/strings/README.md b/strings/README.md new file mode 100644 index 000000000000..19042c4ae7a9 --- /dev/null +++ b/strings/README.md @@ -0,0 +1,53 @@ +# Алгоритмы для работы со строками + +Этот раздел содержит различные алгоритмы для манипуляции и анализа строк. + +## Описание алгоритмов + +* `aho_corasick.py`: Реализация алгоритма Ахо-Корасик для эффективного поиска множества паттернов в тексте. +* `alternative_string_arrange.py`: Алгоритм для альтернативной расстановки символов в строке. +* `anagrams.py`: Проверяет, являются ли две строки анаграммами друг друга. +* `autocomplete_using_trie.py`: Система автодополнения, использующая структуру данных "префиксное дерево" (Trie). +* `barcode_validator.py`: Функция для проверки валидности штрих-кодов. +* `bitap_string_match.py`: Алгоритм Bitap для нечеткого (приблизительного) поиска строки. +* `boyer_moore_search.py`: Алгоритм Бойера-Мура для быстрого поиска подстроки в строке. +* `camel_case_to_snake_case.py`: Конвертирует строку из стиля `CamelCase` в `snake_case`. +* `can_string_be_rearranged_as_palindrome.py`: Проверяет, можно ли переставить символы в строке для образования палиндрома. +* `capitalize.py`: Преобразует первый символ строки в верхний регистр. +* `check_anagrams.py`: Дополнительная функция для проверки анаграмм. +* `count_vowels.py`: Подсчитывает количество гласных букв в строке. +* `credit_card_validator.py`: Проверяет валидность номера кредитной карты с помощью алгоритма Луна. +* `damerau_levenshtein_distance.py`: Вычисляет расстояние Дамерау-Левенштейна между двумя строками. +* `detecting_english_programmatically.py`: Программно определяет, написан ли текст на английском языке. +* `dna.py`: Генерирует комплементарную цепь ДНК. +* `edit_distance.py`: Вычисляет редакционное расстояние (количество операций для преобразования одной строки в другую). +* `frequency_finder.py`: Определяет частоту встречаемости символов в строке. +* `hamming_distance.py`: Вычисляет расстояние Хэмминга между двумя строками одинаковой длины. +* `indian_phone_validator.py`: Проверяет, является ли строка действительным индийским номером телефона. +* `is_contains_unique_chars.py`: Проверяет, содержит ли строка только уникальные символы. +* `is_isogram.py`: Определяет, является ли строка изограммой (не содержит повторяющихся букв). +* `is_pangram.py`: Определяет, является ли строка панграммой (содержит все буквы алфавита). +* `is_polish_national_id.py`: Проверяет валидность польского национального идентификационного номера (PESEL). +* `is_spain_national_id.py`: Проверяет валидность испанского национального идентификационного номера (DNI). +* `is_srilankan_phone_number.py`: Проверяет, является ли строка действительным телефонным номером Шри-Ланки. +* `is_valid_email_address.py`: Проверяет валидность адреса электронной почты. +* `jaro_winkler.py`: Вычисляет расстояние Яро-Винклера для измерения схожести строк. +* `join.py`: Объединяет список строк в одну с использованием заданного разделителя. +* `knuth_morris_pratt.py`: Реализация алгоритма Кнута-Морриса-Пратта для поиска подстроки. +* `levenshtein_distance.py`: Вычисляет расстояние Левенштейна между двумя строками. +* `lower.py`: Преобразует все символы строки в нижний регистр. +* `manacher.py`: Алгоритм Манакера для поиска самой длинной палиндромной подстроки за линейное время. +* `min_cost_string_conversion.py`: Находит последовательность операций с минимальной стоимостью для преобразования одной строки в другую. +* `naive_string_search.py`: Простой (наивный) алгоритм поиска подстроки. +* `ngram.py`: Функция для создания n-грамм из предложения. +* `palindrome.py`: Набор функций для проверки, является ли строка палиндромом. +* `pig_latin.py`: Преобразует строку в "поросячью латынь". +* `prefix_function.py`: Вычисляет префикс-функцию для строки, используемую в алгоритме КМП. +* `rabin_karp.py`: Алгоритм Рабина-Карпа для поиска подстроки с использованием хеширования. +* `remove_duplicate.py`: Удаляет повторяющиеся слова из предложения. +* `reverse_letters.py`: Переворачивает буквы в словах, длина которых превышает заданное значение. +* `reverse_words.py`: Переворачивает порядок слов в строке. +* `snake_case_to_camel_pascal_case.py`: Конвертирует строку из `snake_case` в `CamelCase` или `PascalCase`. +* `split.py`: Разделяет строку на список подстрок по заданному разделителю. +* `string_switch_case.py`: Функции для преобразования строк между различными стилями именования (PascalCase, CamelCase, Snake Case, Kebab Case). +* `strip.py`: Удаляет начальные и конечные символы (по умолчанию пробелы) из строки. diff --git a/web_programming/README.md b/web_programming/README.md new file mode 100644 index 000000000000..90f4fe2e7c2b --- /dev/null +++ b/web_programming/README.md @@ -0,0 +1,40 @@ +# Веб-программирование и скрапинг + +Этот раздел содержит различные скрипты для взаимодействия с веб-сервисами, API и для сбора данных с веб-сайтов (веб-скрапинг). + +## Описание + +* `co2_emission.py`: Получает данные о выбросах CO2 в Великобритании из API CarbonIntensity. +* `covid_stats_via_xpath.py`: Собирает статистику по COVID-19 с сайта worldometers.info, используя XPath для парсинга HTML. +* `crawl_google_results.py`: Выполняет поиск в Google по заданному запросу и открывает первые несколько результатов в браузере. +* `crawl_google_scholar_citation.py`: Извлекает информацию о цитировании научной статьи из Google Scholar. +* `currency_converter.py`: Конвертирует суммы из одной валюты в другую с помощью Amdoren Currency API. +* `current_stock_price.py`: Получает текущую цену акции с Yahoo Finance по ее тикеру. +* `current_weather.py`: Запрашивает текущую погоду для указанного местоположения через API OpenWeatherMap и Weatherstack. +* `daily_horoscope.py`: Получает ежедневный гороскоп для выбранного знака зодиака с сайта horoscope.com. +* `download_images_from_google_query.py`: Выполняет поиск изображений в Google по запросу и загружает их. +* `emails_from_url.py`: Сканирует веб-страницу по URL и извлекает с нее адреса электронной почты. +* `fetch_anime_and_play.py`: Ищет аниме на сайте gogoanime2.org, выводит список серий и предоставляет ссылки для их просмотра и скачивания. +* `fetch_bbc_news.py`: Получает заголовки последних новостей с BBC через NewsAPI. +* `fetch_github_info.py`: Получает информацию о профиле аутентифицированного пользователя GitHub через GitHub API. +* `fetch_jobs.py`: Выполняет скрапинг вакансий с сайта indeed.co.in. +* `fetch_quotes.py`: Получает цитаты (случайную или "цитату дня") из ZenQuotes API. +* `fetch_well_rx_price.py`: Собирает цены на лекарства в аптеках с сайта wellrx.com. +* `get_amazon_product_data.py`: Собирает информацию о товарах (название, цена, рейтинг и т.д.) с сайта Amazon по поисковому запросу. +* `get_imdb_top_250_movies_csv.py`: Получает список 250 лучших фильмов по версии IMDb и сохраняет его в CSV-файл. +* `get_ip_geolocation.py`: Определяет геолокацию по IP-адресу, используя сервис ipinfo.io. +* `get_top_billionaires.py`: Получает список 10 богатейших людей мира в реальном времени из Forbes API. +* `get_top_hn_posts.py`: Получает список лучших постов с сайта Hacker News. +* `get_user_tweets.py`: Загружает все твиты указанного пользователя Twitter с помощью Tweepy и сохраняет их в CSV. +* `giphy.py`: Получает URL-адреса GIF-изображений по поисковому запросу через Giphy API. +* `instagram_crawler.py`: Собирает общедоступную информацию о профиле пользователя Instagram. +* `instagram_pic.py`: Загружает изображение профиля пользователя Instagram по URL. +* `instagram_video.py`: Загружает видео или IGTV из Instagram по URL-адресу поста. +* `nasa_data.py`: Получает данные из API NASA, включая "Астрономическое изображение дня" (APOD). +* `open_google_results.py`: Выполняет поиск в Google и автоматически открывает первую ссылку из результатов. +* `random_anime_character.py`: Получает информацию о случайном аниме-персонаже с сайта mywaifulist.moe. +* `recaptcha_verification.py`: Демонстрирует процесс верификации Google reCAPTCHA на стороне сервера (пример для Django). +* `reddit.py`: Получает данные (посты, заголовки, URL) из указанного сабреддита. +* `search_books_by_isbn.py`: Ищет информацию о книге по ее номеру ISBN в Open Library. +* `slack_message.py`: Отправляет сообщение в указанный канал Slack с помощью входящего веб-хука. +* `world_covid19_stats.py`: Собирает и отображает актуальную мировую статистику по COVID-19 с сайта worldometers.info.