一、二分查找(非递归)
package com.gyh.algorithm;
import com.gyh.search.BinarySearch;
import java.util.ArrayList;
public class BinarySearchNotRecursion {
public static void main(String[] args) {
int[] arr = {-1, 11, 11, 11, 34, 89};
int index = BinarySearchNotRecursion.search(arr, 89);
System.out.println(index);
}
public static int search(int[] nums, int value) {
if (nums == null || nums.length <= 0) {
return -1;
}
int left = 0;
int right = nums.length - 1;
int mid;
while (left <= right) {
mid = (left + right) / 2;
if (value < nums[mid]) {
right = mid - 1;
} else if (value > nums[mid]) {
left = mid + 1;
} else {
return mid;
}
}
return -1;
}
}
二、分治算法
2.1 分治算法介绍
2.2 分治算法应用案例
package com.gyh.algorithm;
public class Hanoi {
public static void main(String[] args) {
hanoiTower(5, 'A', 'B', 'C');
}
public static void hanoiTower(int num, char a, char b, char c) {
if (num == 1) {
System.out.println("第1个盘从" + a + "->" + c);
return;
}
hanoiTower(num - 1, a, c, b);
System.out.println("第" + num + "个盘从" + a + "->" + c);
hanoiTower(num - 1, b, a, c);
}
}
三、动态规划算法
3.1 引出
3.2 基本介绍
3.3 应用实例
package com.gyh.algorithm;
public class KnapsackProblem {
public static void main(String[] args) {
int[] w = {1, 4, 3};
int[] val = {1500, 3000, 2000};
String[] valStr = {"吉他", "音响", "电脑"};
int m = 4;
int n = val.length;
int[][] v = new int[n + 1][m + 1];
String[][] items = new String[n + 1][m + 1];
for (int i = 0; i < v.length; i++) {
v[i][0] = 0;
items[i][0] = "";
}
for (int i = 0; i < v[0].length; i++) {
v[0][i] = 0;
items[0][i] = "";
}
for (int i = 1; i < v.length; i++) {
for (int j = 1; j < v[i].length; j++) {
if (w[i - 1] > j) {
v[i][j] = v[i - 1][j];
items[i][j] = items[i - 1][j];
} else {
if (v[i - 1][j] <= val[i - 1] + v[i - 1][j - w[i - 1]]) {
v[i][j] = val[i - 1] + v[i - 1][j - w[i - 1]];
String con;
items[i][j] = valStr[i - 1] + ((con = items[i - 1][j - w[i - 1]]).equals("") ? con : "+" + con);
} else {
v[i][j] = v[i - 1][j];
items[i][j] = items[i - 1][j];
}
}
}
}
for (int i = 1; i < v.length; i++) {
for (int j = 1; j < v[0].length; j++) {
System.out.print(v[i][j] + "," + items[i][j] + "\t\t");
}
System.out.println();
}
}
}
四、KMP算法
4.1 引出
4.2 暴力匹配法
package com.gyh.algorithm;
public class ViolenceMatch {
public static void main(String[] args) {
String str1 = "硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好";
String str2 = "谷 尚硅谷";
System.out.println(match(str1, str2));
}
public static int match(String origin, String sub) {
char[] org = origin.toCharArray();
char[] su = sub.toCharArray();
int pos = 0;
int j = 0;
while (pos < org.length && j < su.length) {
if (org[pos] == su[j]) {
pos++;
j++;
} else {
pos = pos - j + 1;
j = 0;
}
}
if (j == su.length) {
return pos - j;
}
return -1;
}
}
4.3 KMP算法
package com.gyh.algorithm;
import java.util.Arrays;
public class KMP {
public static void main(String[] args) {
String str1 = "硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好";
String str2 = "谷 1尚硅谷";
System.out.println(Arrays.toString(next(str2)));
System.out.println(match(str1, str2, next(str2)));
}
public static int match(String str1, String str2, int[] next) {
for (int i = 0, j = 0; i < str1.length(); i++) {
while (j > 0 && str1.charAt(i) != str2.charAt(j)) {
j = next[j - 1];
}
if (str1.charAt(i) == str2.charAt(j)) {
j++;
}
if (j == str2.length()) {
return i - j + 1;
}
}
return -1;
}
public static int[] next(String dest) {
int[] next = new int[dest.length()];
next[0] = 0;
for (int i = 1, j = 0; i < dest.length(); i++) {
while (j > 0 && dest.charAt(i) != dest.charAt(j)) {
j = next[j - 1];
}
if (dest.charAt(i) == dest.charAt(j)) {
j++;
}
next[i] = j;
}
return next;
}
}
五、贪心算法
5.1 基本介绍
5.2 应用实例
package com.gyh.algorithm;
import java.util.*;
import java.util.stream.Collectors;
public class GreedyAlgorithm {
public static void main(String[] args) {
Set<String> places = new HashSet<>(Arrays.asList("北京", "上海", "天津", "广州", "深圳", "成都", "杭州", "大连"));
HashMap<String, Set<String>> broadCast = new HashMap<>();
broadCast.put("K1", new HashSet<>(Arrays.asList("北京", "上海", "天津")));
broadCast.put("K2", new HashSet<>(Arrays.asList("广州", "北京", "深圳")));
broadCast.put("K3", new HashSet<>(Arrays.asList("成都", "上海", "杭州")));
broadCast.put("K4", new HashSet<>(Arrays.asList("上海", "天津")));
broadCast.put("K5", new HashSet<>(Arrays.asList("杭州", "大连")));
Set<String> result = new HashSet<>();
HashSet<String> tempSet = new HashSet<>();
String maxBName;
int max;
while (!places.isEmpty()) {
maxBName = null;
max = -1;
for (Map.Entry<String, Set<String>> stringListEntry : broadCast.entrySet()) {
tempSet.clear();
tempSet.addAll(stringListEntry.getValue());
tempSet.retainAll(places);
int count;
if ((count = tempSet.size()) > 0 && (maxBName == null || count > max)) {
maxBName = stringListEntry.getKey();
max = count;
}
}
if (maxBName != null) {
result.add(maxBName);
places.removeAll(broadCast.get(maxBName));
broadCast.remove(maxBName);
}
}
System.out.println(result);
}
}