0

0

Java经典算法入门解析

聖光之護

聖光之護

发布时间:2026-01-24 08:11:30

|

217人浏览过

|

来源于php中文网

原创

以下是五种经典算法的简明经验(伪原创版,保持原意与图片位置不变):

1、 汉诺塔谜题

2、 汉诺塔问题由法国数学家爱德华·卢卡斯于1883年首次提出,其灵感据说源自东南亚地区流传的一则古老寓言。尽管名称中带有“河内”,实则指代越南北部的历史名城——即今之河内市(注:非胡志明市,原文此处有误,已按史实校正)。传说在世界初开之时,印度圣城贝拿勒斯的神庙中竖立着三根金刚石柱,柱上套有64片黄金圆盘,按尺寸由小到大自上而下叠放于第一根柱上。神谕规定:僧侣须将全部金盘从起始柱移至目标柱,过程中必须严守规则——任一时刻,大盘不可压于小盘之上。每日仅允许移动一个圆盘。据传,当最后一片金盘落定于第三根柱时,天地将归于寂灭。该问题不仅承载着哲学意味,更因其天然契合递归逻辑,成为计算机科学中讲解分治策略与递归实现的经典范例。

3、 实现思路如下:

4、 设三根柱子分别命名为A(源柱)、B(辅助柱)、C(目标柱),任务是将n个盘子由A完整迁移至C。当n=1时,直接执行A→C;当n=2时,需借助B完成三步:A→B、A→C、B→C。对于n≥3的情形,可将顶部n−1个盘子整体视作子问题,先将其由A经C暂存至B,再将最大盘移至C,最后将B上的n−1个盘子经A移至C。整个过程通过递归不断拆解为更小规模的相同问题。移动n个盘所需的最少步数为2ⁿ−1。以64为例,总步数达2⁶⁴−1 ≈ 1.84×10¹⁹次。若每秒完成一次无间断操作,所需时间约为5845亿年,远超当前宇宙年龄。

立即学习Java免费学习笔记(深入)”;

5、 下方为Java语言实现汉诺塔求解的典型代码结构。

6、 }

7、 将编号为1的圆盘从起始柱移至目标柱,并打印该操作步骤。

8、 输出格式提示:“将第 topN 号盘子从 [from] 移动到 [to]”,并实时显示每一步路径。

9、 }

10、 }

11、 }

12、 运行效果所示

Java经典算法入门解析

13、 斐波那契数列

14、 斐波那契数列是一组以0和1为初始项、后续每一项均为前两项之和所构成的整数序列。其展开形式为:0、1、1、2、3、5、8、13、21、34、55、89、144、233、377、610、987、1597、2584、4181、6765、10946、17711、28657、46368……该数列频繁出现在植物叶序、蜂巢结构、螺旋星系等自然现象中,亦广泛应用于金融建模、图像压缩及算法分析等领域,展现出惊人的普适性与数学美感。

15、 注意:标准定义中,第0项为0,第1项为1。

16、 自第2项起(即索引为2的位置),每一项均等于其前两项数值之和。

17、 下方示例展示了使用Java语言生成指定项斐波那契数的常见编程方式。

18、 }

19、 控制台输出:“第 counter 项斐波那契数为:fibonacci(counter)”。

20、 }

21、 }

22、 }

23、 运行效果所示

Java经典算法入门解析

24、 帕斯卡三角形

25、 帕斯卡三角形中的每个元素对应组合数C(n, r),其中n表示行号(从0开始计),r表示列号(同样从0起算)。因此,该三角形本质上是对二项式系数分布的可视化呈现,深刻反映了排列组合的基本规律与对称特性。

26、 下方为Java语言构建帕斯卡三角形的标准实现方式。

27、 请用户输入希望生成的三角形行数:

28、 }

29、 }

30、 }

31、 }

32、 }

33、 }

34、 }

35、 }

36、 }

37、 运行效果所示

Java经典算法入门解析

38、 三色旗问题

蕉点AI
蕉点AI

AI电商商品图生成平台 | 智能商品素材制作工具

下载

39、 问题背景:

40、 此问题最早由荷兰著名计算机科学家艾兹赫尔·戴克斯特拉(Edsger W. Dijkstra)提出,原称“荷兰国旗问题”(Dutch National Flag Problem),因他本人国籍而得名;后因颜色组合直观易记,中文语境中多称“三色旗问题”。设想一根绳子上随机悬挂红(R)、白(W)、蓝(B)三种颜色的小旗,要求仅通过有限次两两交换操作,将其重排为“蓝—白—红”的严格顺序。整个过程不允许引入额外存储空间(如新数组),所有调整必须在原序列上就地完成。该问题不仅是排序思想的精炼体现,更是理解分区(partitioning)技术与双指针技巧的重要入口。

41、 解决策略

42、 类比于物理绳子上的移动,程序中即表现为单数组内的原地重排。核心在于设立三个指针:low(指向蓝色区域右边界)、mid(当前扫描位置)、high(红色区域左边界)。遍历过程中依据当前元素颜色决定不同动作:遇蓝色则与low处交换并推进low与mid;遇白色则仅推进mid;遇红色则与high交换并收缩high。此方法确保仅需一次遍历、最多n次交换即可完成整理,时间复杂度O(n),空间复杂度O(1),极具教学与工程价值。

43、 下方为Java语言实现三色旗重排的经典编码示例。

44、 }

45、 }

46、 }

47、 }

48、 请输入初始旗帜排列字符串(例如:RWBBWRWR):

49、 输出重排后的最终序列:flags。

50、 }

51、 }

52、 运行效果所示

Java经典算法入门解析

53、 埃拉托斯特尼筛法(质数筛选算法)

54、 算法说明:

55、 质数是指大于1且除了1和自身外不能被其他正整数整除的自然数。尽管判断单个数字是否为质数较为简单,但在大规模范围内高效识别全部质数却极具挑战。埃拉托斯特尼筛法作为一种历史悠久、原理清晰且效率优异的经典算法,通过“标记合数、保留质数”的机制,在O(N log log N)时间内快速筛出1至N区间内所有质数,至今仍被广泛应用于密码学、数论研究及各类编程实践之中。

56、 核心思想:

57、 直接试除法虽可行,但效率低下;优化方向之一是减少冗余检测。埃拉托斯特尼筛法摒弃逐个验证,转而采用“批量剔除”策略:先假定2~N全为质数,然后从最小质数2开始,将其所有倍数(4, 6, 8…)标记为合数;接着取下一个未被标记的数(即3),再筛去其倍数(9, 15, 21…);依此类推,直到处理完所有不超过√N的数为止。剩余未被标记者即为所求质数集合。

58、 关键优化点在于:验证某数N是否为质数时,只需测试2至⌊√N⌋之间的整数能否整除它。这是因为若N存在大于√N的因子p,则必存在对应因子q=N/p

59、 假设我们有一个包含1到N所有整数的列表,初始状态如下:

60、 首轮以2为基底,从4起每隔2个位置标记一次,清除所有偶数(除2本身);

61、 第二轮以3为基底,从9起每隔3个位置标记,剔除剩余的3的倍数(如9、15、21…);

62、 接着用5、7、11等依次进行类似操作,直至基底超过√N为止。最终未被标记的数字即为质数。这一系统化筛选流程,正是埃拉托斯特尼筛法的精髓所在。

63、 对应Java代码实现如下:

64、 初始化布尔数组,标识各数是否为质数(默认true)

65、 }

66、 外层循环上限设为√N,即 i * i

67、 }

68、 内层循环从i²开始,以i为步长,将所有i的倍数设为false

69、 }

70、 }

71、 统计并输出实际执行的筛选次数(含count变量累计值)

72、 }

73、 }

74、 }

75、 }

76、 }

Java经典算法入门解析

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

844

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

743

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

740

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

400

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

447

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

431

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.8万人学习

C# 教程
C# 教程

共94课时 | 7.4万人学习

Java 教程
Java 教程

共578课时 | 50.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号