算法
文章平均质量分 59
taoyong001
喜欢java编程,向java编程专家进军
展开
-
使用Java函数式编程来生成基础数据(数组)
Java函数式编程来生成基础数组 完整代码 import lombok.Getter; import java.util.Random; import java.util.function.BiFunction; import java.util.stream.IntStream; @Getter public class ArrayGenerate { private BiFunction<Integer, Integer, Integer[]> classic_array_gen原创 2022-05-30 15:56:41 · 357 阅读 · 0 评论 -
用Java、Kotlin来学写算法
用Java来学写算法的文章列表为什么要写这个系列文章线性查找法 为什么要写这个系列文章 自己的懒与笨只有自己清楚,所以写这个文章系列主要是来督促自己学习的。另外,Java语言是自己最喜欢的编程语言,Java的函数式编程也非常优秀,所以想把一些算法用Stream方式来编写出来。 本系列文章都是来自线上liuyubobobo老师的课程。跟着高手学习,希望自己也可以成为高手。 线性查找法 ...原创 2022-05-29 17:19:19 · 155 阅读 · 0 评论 -
Java Stream来写算法13——求解斐波那契数列Fibonacci
总目录 概述 斐波那契数列(Fibonacci sequence),又称 黄金分割 数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“ 兔子数列 ”。 数列的前两项分别是0与1,根据前两项内容,以后的数据值都为其前面两项数字之和计算出来的,比如第3项就是0+1=1;第四项1+1=2,第五项1+2=3……以此类推。 Java实现思路 当使用流来生成数列时,这个数列是根本不记得前面生成的数字是什么的,Stream流生成器只会内部保留生成数据的种子原创 2021-08-02 16:42:36 · 259 阅读 · 0 评论 -
Java Stream来写算法12——分解质因数Prime Factors(lambda改写)
总目录 概述 在上一篇文章中,是使用最普遍的for、while语句来实现质因数分解 在当时的想法中,感觉如果求一个数的质因数,需要不断将该数与某个质因数相除,利用商再来求其它质因数,所以觉得,Stream流不适用 但事后再想想,如果不用上面的思路,而考虑先找到一个数的质因数,这个质因数在因数表中有几个先全找到就可以,不需要使用商来求其他质因数 而其他质因数与上面的质因数,可以考虑成是没有关系的数,这样考虑的话,就可以再次使用lambda表达式来查找质因数了 代码 IntConsumer allPrime原创 2021-07-31 13:46:11 · 168 阅读 · 0 评论 -
Java Stream来写算法11——分解质因数
总目录 之前的文章写过如何求解出指定数字的全部约数,这篇文章更进一步,求解出全部的质因数,比如,求36的质因数:2、2、3、3 与元素周期表类似,世间万物都是由周期表中的元素所组成,而所有的数字,也都是这些质因数,逐个累加而成 求解质因数的过程,需要知道原数字与其中某个质因数相除的商,所以不适合用Stream流式方法,所以核心逻辑代码,还是使用的普通的for、while语句来完成的 代码 public class Factor { /* 求解全部因数,不要求每一个因数都是质数 */ In原创 2021-07-30 16:14:18 · 166 阅读 · 0 评论 -
Java Stream来写算法10——毕达哥拉斯Pythagoras——勾股定理数
总目录 分析 求解全部勾股数,需要知道求解两个数,m,nm, nm,n 这两个数要满足如下条件 序号 条件内容 1 m>nm > nm>n 2 mmm与nnn互质(除了1,没有其他公约数) 3 mmm与nnn不能同时为奇数 满足以上条件的mmm与nnn,就可以用以下公式计算出勾股数了 x=m2−n2y=2∗m∗nz=m2+n2 x = m^{2} - n^{2}\\ y = 2 * m * n\\ z = m^{2} + n^{2} x=m2−n2y=2∗原创 2021-07-26 19:07:02 · 440 阅读 · 0 评论 -
Java Stream来写算法09——极简水仙花数写法
总目录 代码 // 判断传入的值是不是自幂数 final IntPredicate isSelfPower = v -> { String str = String.valueOf(v); int len = str.length(); int sum = Arrays.stream(str.split("")) .mapToInt(e -> Double.valueOf(Math.pow(Integer.parseInt(e), len)).in原创 2021-07-21 16:04:37 · 124 阅读 · 0 评论 -
Java Stream来写算法——利用函数式接口写通用的性能测试代码
文章目录前言面对的问题解决方案代码:排序的辅助类代码:数组生成类代码:排序类 前言 写好了一种排序算法,想要测试一下其性能,代码无怪乎:先记录一下开始时间,然后执行算法,再记录一下结束时间,把结束时间与开始想减,就可以得出算法运行时间,通过这个时间值,可以估算一下算法运行效率。 面对的问题 写不同的算法,可能使用不同的类 不同的类中的算法代码,比如排序方法名,也可能各不相同 所以为了能统计不同算法的运行效率,可能需要对不同类,不同的方法,写大量重复代码,尤其是反复写记录开始、结束时间,以及两者相减值的代码原创 2021-07-17 12:59:33 · 120 阅读 · 0 评论 -
Java Stream来写算法08——公约数
总目录 公约数查找方法与求约数的内容大体相同 不同之处在于,如果是求两个数的公约数,需要把不同的数据剔除,保留相同的 这个操作一看就类似于集合的求并集操作,所以使用Set数据结构就是非常自然的做法了 再把制作思路唠叨一遍 首先初始化两个Set实例,用来保存每个数自己的约数 求约数的过程就是,从数字1开始,向这个数的开根号的值,逐个增加,增加过程中,看一下这个数是不是约数,如果是就将这个数加入到集合Set中 由于求约数的范围只到开根号值处,所以还要约数的另一个约数也要增加进来,使用的方法,在求出每一个约数后原创 2021-07-10 14:10:36 · 124 阅读 · 0 评论 -
Java Stream来写算法07——使用一个数据流来查找孪生素数
总目录 在上一篇文章中,使用了两个数据流来对应找出孪生素数,方法感觉有些取巧,所以就在想如何用一个数据流来查找到孪生素数? 因为有把一切皆当作对象的角度,所以在解决这个想法时,自然而然地就会想到:孪生素数,本质上就是一个数据对。把这样的数据对作为一个对象,难道不是理所应当的吗? 数对对象 // 数对对象 @Getter@Setter@ToString@AllArgsConstructor// 为了节约空间,注释写到一行里 class TwinValue { private int firstVa原创 2021-07-08 10:36:50 · 196 阅读 · 0 评论 -
Java Stream来写算法——总目录
本系列文章主旨是通过Java Stream流的超简写法,来写一些只用很少的代码,但以前只能写很多for/while语句才能实现的算法。通过这些写法,来深刻理解Java Stream流的妙处,目前,写了几篇,可以实现很少代码来完成很复杂的运算,但是越写,越觉得不知道的内容的太多。比如,发现当前还是只会使用,Stream流背后深刻的原理还远远没有搞懂。 所以这些文章只是起到鞭策自己深入去学习的作用,生命不息,(被迫)学习不止啊! 目录 第01篇:自幂数(水仙花数) 第02篇:约数 第03篇:线性查找 第04.原创 2021-07-06 12:59:35 · 210 阅读 · 0 评论 -
Java Stream来写算法06——使用两个数据流查找孪生素数
这一系列的文章旨在探讨如何最小化使用循环语句,尽最大可能使用Java Stream来完成有趣的与数学相关的运算。 之前的文章讲解了如何查找到素数,对素数而言,其中还有一个孪生素数的问题非常有趣,美籍中国数学家张益唐在前几年,在其五十多岁“高龄”完成了以往只能由二、三十岁年轻数学家才能完成的孪生素数性质证明,而震惊了世界。 所谓“孪生素数”是指,类似3和5,11和13,17和19这样的,两个同时为素数,这两个数只相差2的数字对 难点 使用Java Stream来处理这个问题的一个难点就是,Java数据流是无原创 2021-07-05 10:27:22 · 289 阅读 · 0 评论 -
Java Stream来写算法05——筛选法找质数(素数)
今天使用的方法不再是上篇文章中的遍历法,遍历法非常清晰,非常容易理解,但架不住效率慢,所以介绍一下埃拉托斯特尼的筛选法,方法的本质是把在某一范围内素数的倍数去除掉,剩下的就是新的素数,比如想找出100以内的素数,只需要先找出10以内的素数,然后用10以内的素数与100以内全部的数进行除法运算,如果发现有一个可以整除,就筛掉这个数,经过这样一番操作,没被筛掉的数就是素数了。 发点小感慨,这个埃拉托斯特尼Eratosthenes,是距今二千多年的希腊大师,最让人大跌眼镜的操作就是率先计算出地球的周长(不可思议的原创 2021-06-28 13:16:24 · 628 阅读 · 0 评论 -
Java Stream来写算法04——遍历找质数(素数)
除了数字111和这个数本身,没有其他约数的数,就是质数。另外规定1不是质数,而2是。 关于这个1不是素数的规定,就是质因数分解时,可以有唯一的一种写法,这也是如下定理规定的 将正整数分解成多个素数乘积的方法只有一种 当然这不是本文章的重点,本篇文章主要是想把在指定范围内的素数全部求解出来,而且使用Stream类,以及不用for、while语句。 private void getPrimeNumber() { int value = 100;// 在100以内查找全部素数 int[] ar原创 2021-06-26 18:43:22 · 536 阅读 · 0 评论 -
Java Stream来写算法03——线性查找
这是一个最简单的查找算法,就是从数组的第一个元素开始,依次遍历去查找每一个元素,如果发现元素内容符合,就返回元素所在的位置,否则就一直查找下去。 使用Java数组这个数据结构代码非常好实现,但是今天要使用Stream类来实现,就需要把数组的生成,查找的过程,以及最终返回查找到的数据在数组的位置(也就是下标)值都用Stream有关方法来实现,这就需要用到一些特殊的方式。 难点:Stream生成的流,是没有位置信息的 流可以想象成挤在一起的无序队伍,把数组元素放入到流中,然后随机挑选一个元素,按照给定的逻辑来处原创 2021-06-24 13:36:31 · 222 阅读 · 0 评论 -
Java Stream来写算法02——约数
求给定数字nnn的约数,算法很简单,需要从111开始一直找到nnn,如果能整除就符合。 分析 但是上面的遍历算法,需要查找数据太多,所以需要优化,减少遍历数据的量,所以就有了如下优化。 因为约数是成对出现的,所以简化查找范围可以减少到从111查找到n\sqrt{n}n,这样遍历范围会大大缩小,但这个范围只会取到一半的约数。 例如要求12的约数,从1开始,到12\sqrt{12}12只取整数为3,计算得到的约数为1、2、3,但与这些约数对应的约数12、6、4取不到,但可以通过12/1、12/2、12/3原创 2021-06-19 11:48:46 · 153 阅读 · 0 评论