dataList = new ArrayList<>(500000);
63 | for (int i = 0; i < 500000; i++) {
64 | dataList.add(i);
65 | }
66 |
67 | ForkJoinPool pool = new ForkJoinPool();
68 | Integer result = pool.invoke(new Task(dataList));
69 |
70 | System.out.println("result:" + result);
71 |
72 | }
73 |
74 | }
75 |
--------------------------------------------------------------------------------
/src/main/java/com/waylau/java/demo/HelloWorld.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Welcome to https://waylau.com
3 | */
4 | package com.waylau.java.demo;
5 |
6 | /**
7 | * Hello World.
8 | *
9 | * @since 1.0.0 2020年4月12日
10 | * @author Way Lau
11 | */
12 | public class HelloWorld {
13 |
14 | private String words;
15 |
16 | public HelloWorld(String words) {
17 | this.words = words;
18 | }
19 |
20 | public String getWords() {
21 | return words;
22 | }
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/com/waylau/java/demo/algorithm/BinarySearch.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Welcome to https://waylau.com
3 | */
4 | package com.waylau.java.demo.algorithm;
5 |
6 | /**
7 | * Binary Search.
8 | *
9 | *
10 | * Worst-case performance O(log n)
11 | * Best-case performance O(1)
12 | * Average performance O(log n)
13 | * Worst-case space complexity O(1)
14 | *
15 | *
16 | * @since 1.0.0 2020年11月27日
17 | * @author Way Lau
18 | */
19 |
20 | public class BinarySearch> {
21 |
22 | /**
23 | * 值在数组中的索引
24 | *
25 | * @param value 待查找的值
26 | * @param array 假定数组已排序
27 | *
28 | * @return 值在数组中的索引
29 | */
30 | public static final int find(T value, T[] array) {
31 | return recursiveFind(array, value, 0,
32 | array.length - 1);
33 | }
34 |
35 | // 递归查找元素
36 | @SuppressWarnings("unchecked")
37 | private static int recursiveFind(T[] array, T value,
38 | int start, int end) {
39 | if (start == end) {
40 | T lastValue = array[start]; // start==end
41 |
42 | if (value == lastValue) {
43 | return start; // start==end
44 | }
45 |
46 | return Integer.MAX_VALUE;
47 | }
48 |
49 | final int low = start;
50 | final int high = end + 1; // 索引是从0开始的,所以加一个
51 | final int middle = low + ((high - low) / 2); // 取中间索引
52 | final T middleValue = array[middle];
53 |
54 | // 与中间值进行比较
55 | int compareResult = ((Comparable super T>) value)
56 | .compareTo(middleValue);
57 |
58 | if (compareResult == 0) { // 等于中间值,则查找结束
59 | return middle;
60 | } else if (compareResult > 0) {// 大于中间值,则往右查找
61 | return recursiveFind(array, value, middle + 1,
62 | end);
63 | } else {// 小于中间值,则往左查找
64 | return recursiveFind(array, value, start,
65 | middle - 1);
66 | }
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/src/main/java/com/waylau/java/demo/algorithm/Chromosome.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Welcome to https://waylau.com
3 | */
4 | package com.waylau.java.demo.algorithm;
5 |
6 | import java.util.ArrayList;
7 |
8 | import java.util.List;
9 |
10 | /**
11 | * Chromosome.
12 | *
13 | * @author Way Lau
14 | * @since 2020-11-30
15 | */
16 |
17 | public class Chromosome {
18 | private boolean[] genes;// 基因序列
19 |
20 | private double score;// 对应的函数得分
21 |
22 | public double getScore() {
23 | return score;
24 | }
25 |
26 | public void setScore(double score) {
27 | this.score = score;
28 | }
29 |
30 | /**
31 | * 限制无参构造函数的使用
32 | */
33 | private Chromosome() {
34 | }
35 |
36 | /**
37 | * 随机生成基因序列
38 | *
39 | * @param size 基因序列长度
40 | */
41 | public Chromosome(int size) {
42 | if (size <= 0) {
43 | return;
44 | }
45 |
46 | initGeneSize(size);
47 |
48 | for (int i = 0; i < size; i++) {
49 | genes[i] = Math.random() >= 0.5;
50 | }
51 | }
52 |
53 | /**
54 | * 初始化基因长度
55 | *
56 | * @param size 基因序列长度
57 | */
58 | private void initGeneSize(int size) {
59 | if (size <= 0) {
60 | return;
61 | }
62 |
63 | genes = new boolean[size];
64 | }
65 |
66 | /**
67 | * 将基因转化为对应的数字
68 | *
69 | * @return 基因转化成应的数字
70 | */
71 | public int getNum() {
72 | if (genes == null) {
73 | return 0;
74 | }
75 |
76 | int num = 0;
77 |
78 | for (boolean bool : genes) {
79 | num <<= 1;
80 | if (bool) {
81 | num += 1;
82 | }
83 | }
84 |
85 | return num;
86 | }
87 |
88 | /**
89 | * 基因num个位置发生变异
90 | *
91 | * @param num 突变的位置
92 | */
93 | public void mutation(int num) {
94 | // 允许变异
95 | int size = genes.length;
96 |
97 | for (int i = 0; i < num; i++) {
98 | // 寻找变异位置
99 | int at = ((int) (Math.random() * size)) % size;
100 |
101 | // 变异后的值
102 | boolean bool = !genes[at];
103 | genes[at] = bool;
104 | }
105 | }
106 |
107 | /**
108 | * 克隆染色体
109 | *
110 | * @param c 被克隆染色体
111 | *
112 | * @return 克隆染色体
113 | */
114 | public static Chromosome clone(final Chromosome c) {
115 | if (c == null || c.genes == null) {
116 | return null;
117 | }
118 |
119 | Chromosome clonedChromosome = new Chromosome();
120 | clonedChromosome.initGeneSize(c.genes.length);
121 |
122 | for (int i = 0; i < c.genes.length; i++) {
123 | clonedChromosome.genes[i] = c.genes[i];
124 | }
125 |
126 | return clonedChromosome;
127 | }
128 |
129 | /**
130 | * 遗传产生下一代染色体
131 | *
132 | * @param c1
133 | * @param c2
134 | */
135 | public static List genetic(Chromosome p1,
136 | Chromosome p2) {
137 | if (p1 == null || p2 == null) { // 染色体有一个为空,不产生下一代
138 | return null;
139 | }
140 |
141 | if (p1.genes == null || p2.genes == null) { // 染色体有一个没有基因序列,不产生下一代
142 | return null;
143 | }
144 |
145 | if (p1.genes.length != p2.genes.length) { // 染色体基因序列长度不同,不产生下一代
146 | return null;
147 | }
148 |
149 | Chromosome c1 = clone(p1);
150 | Chromosome c2 = clone(p2);
151 |
152 | // 随机产生交叉互换位置
153 | int size = c1.genes.length;
154 | int a = ((int) (Math.random() * size)) % size;
155 | int b = ((int) (Math.random() * size)) % size;
156 | int min = a > b ? b : a;
157 | int max = a > b ? a : b;
158 |
159 | // 对位置上的基因进行交叉互换
160 | for (int i = min; i <= max; i++) {
161 | boolean t = c1.genes[i];
162 | c1.genes[i] = c2.genes[i];
163 | c2.genes[i] = t;
164 | }
165 |
166 | List list = new ArrayList();
167 |
168 | list.add(c1);
169 | list.add(c2);
170 |
171 | return list;
172 | }
173 | }
--------------------------------------------------------------------------------
/src/main/java/com/waylau/java/demo/algorithm/Fibonacci.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Welcome to https://waylau.com
3 | */
4 | package com.waylau.java.demo.algorithm;
5 |
6 | import java.util.concurrent.RecursiveTask;
7 |
8 | /**
9 | * Fibonacci
10 | *
11 | * @since 1.0.0 2020年11月27日
12 | * @author Way Lau
13 | */
14 | public class Fibonacci extends RecursiveTask {
15 | private static final long serialVersionUID = 1L;
16 |
17 | final int n;
18 |
19 | Fibonacci(int n) {
20 | this.n = n;
21 | }
22 |
23 | protected Integer compute() {
24 | if (n <= 1) {
25 | return n;
26 | }
27 |
28 | Fibonacci f1 = new Fibonacci(n - 1);
29 |
30 | // 创建子任务
31 | f1.fork();
32 | Fibonacci f2 = new Fibonacci(n - 2);
33 |
34 | // 等待子任务结果,并合并结果
35 | return f2.compute() + f1.join();
36 | }
37 |
38 | }
39 |
--------------------------------------------------------------------------------
/src/main/java/com/waylau/java/demo/algorithm/FibonacciDemo.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Welcome to https://waylau.com
3 | */
4 | package com.waylau.java.demo.algorithm;
5 |
6 | import java.util.concurrent.ForkJoinPool;
7 |
8 | /**
9 | * Fibonacci Demo.
10 | *
11 | * @since 1.0.0 2020年11月27日
12 | * @author Way Lau
13 | */
14 | public class FibonacciDemo {
15 |
16 | /**
17 | * @param args
18 | */
19 | public static void main(String[] args) {
20 | // 创建分治任务线程池
21 | ForkJoinPool fjp = new ForkJoinPool(4);
22 |
23 | // 创建分治任务
24 | Fibonacci fib = new Fibonacci(30);
25 |
26 | // 启动分治任务
27 | Integer result = fjp.invoke(fib);
28 |
29 | // 输出结果
30 | System.out.println(result);
31 | }
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/src/main/java/com/waylau/java/demo/algorithm/FibonacciSequenceBasic.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Welcome to https://waylau.com
3 | */
4 | package com.waylau.java.demo.algorithm;
5 |
6 | /**
7 | * Fibonacci Sequence.
8 | *
9 | * @since 1.0.0 2020年11月28日
10 | * @author Way Lau
11 | */
12 | public class FibonacciSequenceBasic {
13 |
14 | public static int fibonacci(int n) {
15 |
16 | if ((n == 1) || (n == 2)) {
17 | return 1;
18 | }
19 |
20 | // 递归
21 | return fibonacci(n - 1) + fibonacci(n - 2);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/com/waylau/java/demo/algorithm/FibonacciSequenceForwardCalculation.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Welcome to https://waylau.com
3 | */
4 | package com.waylau.java.demo.algorithm;
5 |
6 | /**
7 | * Fibonacci Sequence Forward Calculation
8 | *
9 | * @since 1.0.0 2020年11月28日
10 | * @author Way Lau
11 | */
12 | public class FibonacciSequenceForwardCalculation {
13 | public static int fibonacci(int n) {
14 | if ((n == 1) || (n == 2)) {
15 | return 1;
16 | }
17 |
18 | int fn = 0;
19 | int fn1 = 1;
20 | int fn2 = 1;
21 | int k = 3;
22 |
23 | while (k <= n) {
24 | fn = fn1 + fn2;
25 | fn1 = fn2;
26 | fn2 = fn;
27 | k++;
28 | }
29 |
30 | return fn;
31 | }
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/src/main/java/com/waylau/java/demo/algorithm/FibonacciSequenceWithCache.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Welcome to https://waylau.com
3 | */
4 | package com.waylau.java.demo.algorithm;
5 |
6 | /**
7 | * Fibonacci Sequence with cache
8 | *
9 | * @since 1.0.0 2020年11月28日
10 | * @author Way Lau
11 | */
12 | public class FibonacciSequenceWithCache {
13 | private static final int cache[] = new int[100000];
14 |
15 | public static int fibonacci(int n) {
16 | if ((n == 1) || (n == 2)) {
17 | return 1;
18 | } else if (0 != cache[n]) {
19 | return cache[n];
20 | }
21 |
22 | cache[n] = fibonacci(n - 1) + fibonacci(n - 2);
23 |
24 | return cache[n];
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/java/com/waylau/java/demo/algorithm/GeneticAlgorithmMaxValue.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Welcome to https://waylau.com
3 | */
4 | package com.waylau.java.demo.algorithm;
5 |
6 | /**
7 | * GeneticAlgorithmMaxValue.
8 | *
9 | * @since 1.0.0 2020年11月29日
10 | * @author Way Lau
11 | */
12 | public class GeneticAlgorithmMaxValue
13 | extends GeneticAlgorithm {
14 |
15 | private final int num;
16 |
17 | /**
18 | * 构造函数
19 | *
20 | * @param geneSize
21 | */
22 | public GeneticAlgorithmMaxValue(int geneSize) {
23 | super(geneSize);
24 |
25 | num = 1 << geneSize;
26 | }
27 |
28 | @Override
29 | public double changeX(Chromosome chro) {
30 | return ((1.0 * chro.getNum() / num) * 100) + 6;
31 | }
32 |
33 | @Override
34 | public double caculateY(double x) {
35 | return 100 - Math.log(x);
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/main/java/com/waylau/java/demo/algorithm/GraphColoringProblem.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Welcome to https://waylau.com
3 | */
4 | package com.waylau.java.demo.algorithm;
5 |
6 | /**
7 | * Graph Coloring Problem.
8 | *
9 | * @author Way Lau
10 | * @since 2020-11-02
11 | */
12 | public class GraphColoringProblem {
13 | /**
14 | * 图着色:
15 | *
16 | * @param graph 待着色图
17 | * @param n 图的结点数
18 | * @param m 限制需要涂的颜色种数
19 | *
20 | * @return 满足时返回图着色的结果,否则返回空
21 | */
22 | public static int[] graphColor(int[][] graph, int n,
23 | int m) {
24 | if (m <= 0) {
25 | return null;
26 | }
27 |
28 | int[] color = initColor(n);// 初始化数组
29 | int index = 0;
30 |
31 | while (index >= 0) {
32 | color[index] += 1;// 填色
33 |
34 | while (color[index] <= m) {
35 | // 检验当前所涂颜色是否符合
36 | if (check(graph, color, index)) {
37 | break;// 符合
38 | } else {
39 | color[index] += 1;// 考察下一种颜色
40 | }
41 | }
42 |
43 | if (color[index] <= m && index == n - 1) {
44 | return color;
45 | }
46 |
47 | if (color[index] > m) {
48 | color[index--] = 0;// 回溯
49 | } else {
50 | index++;// 填下一个结点
51 | }
52 | }
53 |
54 | return null;
55 | }
56 |
57 | /**
58 | * 检测当前考察结点的颜色是否符合要求:
59 | *
60 | * @param graph 图
61 | * @param color 图的每个结点的颜色组成的数组
62 | * @param index 索引,用于考察当前结点的颜色是否符合
63 | *
64 | * @return 符合或者不符合
65 | */
66 | public static boolean check(int[][] graph, int[] color,
67 | int index) {
68 | for (int i = 0; i < index; i++) {
69 | // 判断当前结点所图的颜色是否与前面重复
70 |
71 | if (graph[index][i] == 1
72 | && color[i] == color[index]) {
73 | return false;
74 | }
75 | }
76 |
77 | return true;
78 | }
79 |
80 | /**
81 | * 初始化颜色数组:
82 | *
83 | * @param n 结点的个数
84 | * @return 初始化后的数组
85 | */
86 |
87 | public static int[] initColor(int n) {
88 | int[] color = new int[n];
89 |
90 | for (int i = 0; i < n; i++) {
91 | color[i] = 0;
92 | }
93 |
94 | return color;
95 | }
96 | }
--------------------------------------------------------------------------------
/src/main/java/com/waylau/java/demo/algorithm/GreedyAlgorithm.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Welcome to https://waylau.com
3 | */
4 | package com.waylau.java.demo.algorithm;
5 |
6 | import java.util.ArrayList;
7 | import java.util.List;
8 |
9 | /**
10 | * Greedy Algorithm.
11 | *
12 | * @since 1.0.0 2020年11月28日
13 | * @author Way Lau
14 | */
15 | public class GreedyAlgorithm {
16 |
17 | public static int maxNumber(int[] customers) {
18 | if (customers.length < 3) {
19 | return 0;
20 | }
21 |
22 | // 把符合条件的点餐员都取出来
23 | List dealers = new ArrayList<>();
24 |
25 | for (int i = 1; i < customers.length - 1; i++) {
26 | if (customers[i - 1] < customers[i]
27 | && customers[i] > customers[i + 1]) {
28 | dealers.add(i);
29 | i++;
30 | }
31 | }
32 |
33 | // 初始化k为最大数
34 | int k = dealers.size();
35 |
36 | // 等于1则直接返回
37 | if (k == 1) {
38 | return k;
39 | }
40 |
41 | // 大于1的时候进循环
42 | while (k >= 1) {
43 | // 记录合规的点餐员数量
44 | int passed = 1;
45 | for (int i = 0; i < dealers.size() - 1; i++) {
46 | if (dealers.get(i + 1)
47 | - dealers.get(i) >= k) {
48 |
49 | // 相邻两个间隔合规
50 | passed++;
51 | } else if (i < dealers.size() - 2
52 | && dealers.get(i + 2)
53 | - dealers.get(i) >= k) {
54 | // 如果相邻两个不合规,跳过一个看是否合规
55 |
56 | passed++;
57 | i++;
58 | }
59 | }
60 |
61 | // 如果合规个数等于k,则返回
62 | if (k == passed) {
63 | break;
64 | }
65 |
66 | // 否则k减小,再来一次
67 | k--;
68 | }
69 |
70 | return k;
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/src/main/java/com/waylau/java/demo/algorithm/MapReduce.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Welcome to https://waylau.com
3 | */
4 | package com.waylau.java.demo.algorithm;
5 |
6 | import java.util.HashMap;
7 | import java.util.Map;
8 | import java.util.concurrent.RecursiveTask;
9 |
10 | /**
11 | * MapReduce
12 | *
13 | * @since 1.0.0 2020年11月27日
14 | * @author Way Lau
15 | */
16 | public class MapReduce
17 | extends RecursiveTask