菜单

算法

相关源文件

本文概述了 The Algorithms Java 仓库中实现的各种算法类别。它旨在指导读者了解代码库中算法的组织、结构和类型。有关用于实现这些算法的特定数据结构的信息,请参阅数据结构

算法类别概述

该仓库包含各种算法实现,这些算法根据其功能和问题解决方法分为逻辑类别。以下图表显示了主要的算法类别

来源:DIRECTORY.md1-450

回溯算法

回溯算法通过逐步构建解决方案来解决问题,并在确定候选方案无法导出有效解决方案时放弃(“回溯”)该候选方案。

主要实现包括

  • N 皇后问题 - 在 N×N 棋盘上放置 N 个皇后,使任意两个皇后都无法互相攻击
  • 排列生成器 - 生成一组元素的所有可能排列
  • 迷宫求解器 - 使用递归回溯寻找迷宫路径
  • 数独求解器 - 使用约束满足解决数独谜题

来源:DIRECTORY.md10-25

位操作

位操作算法在位级别操作,对数据的二进制表示执行操作。这些算法常用于优化和低级操作。

主要实现

  • 计数置位位 - 计算一个数中设置为 1 的位数
  • 二次幂检查 - 判断一个数是否为 2 的幂
  • 位交换 - 交换特定位置的位
  • 格雷码转换 - 在二进制和格雷码之间进行转换

来源:DIRECTORY.md26-58

密码和加密

此类别包含各种加密算法的实现,用于通过加密和解密来保护数据。

主要实现

  • 凯撒密码 - 一种简单的替换密码,通过固定数量的位置移动字母
  • RSA 算法 - 一种用于安全数据传输的公钥密码系统
  • AES - 高级加密标准,一种电子数据加密规范
  • XOR 密码 - 一种简单的对称加密算法

来源:DIRECTORY.md59-89 src/main/java/com/thealgorithms/ciphers/Caesar.java1-99 src/main/java/com/thealgorithms/ciphers/XORCipher.java1-96

分治法

分治算法通过将问题分解为更小的子问题,解决每个子问题,然后组合解决方案来解决问题。

主要实现

  • 二分幂 - 使用分治法高效计算幂
  • 最近点对 - 查找集合中最近的点对
  • Strassen 矩阵乘法 - 使用递归方法高效地进行矩阵乘法

来源:DIRECTORY.md274-281

动态规划

动态规划算法通过将复杂问题分解为更简单的子问题并存储结果以避免冗余计算来解决问题。

主要实现

  • 斐波那契数列 - 高效计算斐波那契数
  • 背包问题 - 解决带约束的优化问题
  • 最长公共子序列 - 查找两个序列的最长公共子序列
  • 找零问题 - 计算给定金额的找零方式数量

来源:DIRECTORY.md282-297

数学算法

数学算法实现了各种数学计算和操作,从基本算术到复杂的数值方法。

主要实现

  • 素数操作 - 生成、检查和因式分解
  • GCD 和 LCM 计算 - 最大公约数和最小公倍数
  • 快速幂 - 高效计算幂的算法
  • 真因子和 - 计算一个数的真因子之和

来源:src/main/java/com/thealgorithms/maths/AliquotSum.java1-64 src/main/java/com/thealgorithms/maths/PerfectNumber.java1-72

搜索与排序

此类别包含用于在集合中搜索元素以及根据特定标准排序元素的算法。

搜索算法

主要实现

  • 二分查找 - 在排序列表中高效查找项
  • 线性查找 - 顺序检查列表中的每个元素
  • 快速选择 - 在无序列表中查找第 k 小的元素

来源:src/main/java/com/thealgorithms/searches/QuickSelect.java1-126

排序算法

主要实现

  • 快速排序 - 一种分治排序算法,平均性能为 O(n log n)
  • 归并排序 - 一种稳定的分治排序算法,保证性能为 O(n log n)
  • 堆排序 - 一种使用二叉堆数据结构的基于比较的排序算法

来源:src/main/java/com/thealgorithms/sorts/MergeSortRecursive.java1-61

算法复杂度表

下表总结了关键算法的时间和空间复杂度

类别算法时间复杂度(平均)时间复杂度(最坏)空间复杂度
排序归并排序O(n log n)O(n log n)O(n)
排序快速排序O(n log n)O(n²)O(log n)
排序堆排序O(n log n)O(n log n)O(1)
搜索二分搜索O(log n)O(log n)O(1)
搜索线性搜索O(n)O(n)O(1)
搜索快速选择O(n)O(n²)O(log n)
回溯N 皇后O(n!)O(n!)O(n)
加密凯撒密码O(n)O(n)O(1)

来源:src/main/java/com/thealgorithms/searches/QuickSelect.java1-126 src/main/java/com/thealgorithms/ciphers/Caesar.java1-99

算法选择指南

以下流程图有助于根据问题特征选择合适的算法类型

来源:DIRECTORY.md10-297

实现示例:基于堆的数据结构

该仓库包含多个堆实现,演示了重要的算法原理

最小堆和最大堆

MinHeapMaxHeap 类实现了二叉堆数据结构,这些结构维护了堆属性,即每个节点的键值都小于或等于(最小堆)或大于或等于(最大堆)其子节点的键值。

关键操作包括

  • 插入 - 向堆中添加新元素 (O(log n))
  • 提取最小/最大值 - 移除并返回最小/最大元素 (O(log n))
  • 堆化 - 修改后恢复堆属性 (O(log n))

来源:src/main/java/com/thealgorithms/datastructures/heaps/MinHeap.java1-271 src/main/java/com/thealgorithms/datastructures/heaps/MaxHeap.java1-249 src/main/java/com/thealgorithms/datastructures/heaps/HeapElement.java1-173 src/main/java/com/thealgorithms/datastructures/heaps/Heap.java1-44

有关特定算法类型的更多详细信息,请参阅以下维基页面