java 自动清理内存 java内存空间可以手动释放_java 自动清理内存

新的数学方法和概念,常常比解决数学问题本身更重要。

—— 华罗庚

2019.8.11回顾

题目

关于Java的内存回收机制,正确的是:

A.内存回收线程不能释放内存对象

B.内存回收线程负责释放无用内存

C.Java程序允许用户使用指针来释放无用内存

D.Java程序要求用户必须手工创建一个线程来释放内存

答案与解析

1.相关知识

Java虚拟机的垃圾回收机制会自动回收长时间未使用的对象,程序员不可以手动调用,但是可以建议垃圾回收器回收某个对象。

2.答案解析

A.内存回收线程能释放内存对象

B.正确

C.java中没有指针

D.内存为自动回收,无法手动创建线程释放

答案选:B


ps:本刊原计划做算法练习,而前两期的练习实则JAVA的基础知识习题。本期开始小编打算开始真正的算法题目练习,后面例题会选用比较经典的算法例题,难度适中,但个人觉得非常有趣,小编将与大家一同学习一同探讨。

2019.8.12期问题

马踏棋盘(骑士周游问题)

【问题描述】关于马踏棋盘的基本过程:国际象棋的棋盘为 8*8 的方格棋盘。现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动。要求每个方格只能进入一次,最终使得"马"走遍棋盘的64个方格。

java 自动清理内存 java内存空间可以手动释放_java经典算法_02

(由于棋盘边缘的限制,移动选择可以有2,4,6,8种)


马踏棋盘主要的解决方案有两种: 一种是基于深度优先搜索的方法,另一种是基于贪婪算法的方法。 第一种基于深度优先搜索的方法是比较常用的算法,深度优先搜索算法也是数据结构中的经典算法之一,主要是回溯的算法思想(即当发现已不满足求解条件时,就“回溯”返回,尝试别的路径),可采用递归实现。 贪婪的算法则是一步一步依据当前最优的策略,依靠每一步的局部最优,达到最终目标。 但是他不一定能够得到最优解。 解决方法

【回溯法 】基本思路 上文提到由于棋盘的限制棋子移动的选择个数不一样,为了棋子的移动能满足一个统一的规则,我们给棋盘增加两层。对于外面两层的棋盘,我们标记为“已走”。

坐标规则:建立一个12*12二维数组作为棋盘坐标,数组元素 值由 “0”“1”表示棋格是否被踏过。


java 自动清理内存 java内存空间可以手动释放_java贪心算法几个经典例子_03


初始化:(3—10,3—10)内的元素初始值为“0”,其余为“1”,在(3—10,3—10)内随机取一点作为“马”的初始位置。 移动规则:八种 移动记为(x+2,y+1 ) 、 (x+2,y-1 )、(x-2,y+1)、(x-2,y-1)、(x+1,y+2)、(x+1,y-2)、(x-1,y+2)、(x-1,y-2)。 递归方法:依次进行8个方向的移动,每次移动完后判断移动后的坐标元素值是否为“0”,若是,则继续该递归方法同时把此处坐标值归入“1”,若否,则无需继续递归。

【贪心算法】基本构思 回溯法虽然比较简单,但是需要对每条路径进行尝试,其运行效率不尽人意。贪心算法则是在回溯法的基础上增加多了一个局部最优判断规则

规则如下:每当要移动棋子的时候,若有个格子可移动,则 哪一个格子的下一步少,就选哪一个, 若相同则任选一个格子走。(如下图,左边的格子移动后无路可走,右边的格子移动后有两条路走,则选择左边的路走。)直至走到不可移动的格子后结束递归。

java 自动清理内存 java内存空间可以手动释放_自然语言描述“麦粒棋盘上的麦粒”的算法_04


哪个格子的下一步少,就选哪一个 贪心算法原理

:首先,若存在移动后无路可走的格子A,说明此时棋子所在的格子已经是唯一通往格子A的了,故要使得走过的棋子包括A,必须要走A。而如果按照回溯法的话,走A不行,还要走其他的格子,显然,其他的格子到最后结果也是不行的,这就会浪费时间。同样,若存在下一步还有一个格子可以移动的格子B,若不走B走其他格子使得最后再走B,则最后只能通过一个格子来回到格子B结束递归,就算存在这样的路径,但概率就少得多。所以,选择往下一步可移动格子最少的格子移动,可以先遍历过那些可能现在不走,以后就很越难再走到这的格子。这就是为什么

哪一个格子的下一步少,就选哪一个。

贪心算法优缺点:贪心算法在运行时间上大概只是回溯法的十分之一,但其缺点是不能保证遍历每一条可以成功实现马踏棋盘的路径,可能存在疏漏

好了,本期的算法介绍就介绍到这里,希望有时间的同学也可以在电脑上试一试马踏棋盘的实现, 下期小编会把马踏棋盘的JAVA实现代码贴出来

给大家参考一下 , 当然,你们 也可以把你们的代码(C++,C也行)发给小编

,下一期作为优秀代码贴出来给大家参考,共同学习


java 自动清理内存 java内存空间可以手动释放_java贪心算法几个经典例子_05

。希望大家都能解决马踏棋盘这个经典问题。


java 自动清理内存 java内存空间可以手动释放_java递归算法经典实例_06

6*6马踏棋盘游戏(4399可以找到)


哦,对了,其实小编还没搞懂贪心算法没有遍历所有的路径,那是怎么确保一定可以找到一条符合要求的路径可以最终使得"马"走遍棋盘的64个方格呢?有知道或者有自己想法的同学可以在留言处帮小编解惑啦,谢谢哈。 END

眼过千遍,不如手过一遍,一定一定要把自己的想法写出来(想法无论对错,写出你所想的就是进步),这样才会有收获,你的每一个留言编者都会认真回复,与大家一起解决你的困惑,一起进步,继续努力~~共勉

java 自动清理内存 java内存空间可以手动释放_java贪心算法几个经典例子_07

java 自动清理内存 java内存空间可以手动释放_自然语言描述“麦粒棋盘上的麦粒”的算法_08