随机搜索(random search)是利用随机数求极小点而求得函数近似的最优解的方法。
变量允许的变化区间,不断随机地而不是有倾向性产生随机点,并计算其约束函数和目标函数的值,对满足约束条件的点,逐个比较其目标函数的值,将坏的点抛弃,保留好的点,最后便得到最优解的近似解。这种方法是建立在概率论的基础上,所取随机点越多,则得到最优解的概率也就越大。由于大多数计算机程序库中有随机数发生器,所以应用这种方法是很方便的。但是其计算精度较差、效率较低。随机搜索一般用于粗选或普查。常用的方法有随机跳跃法,随机走步法等。
确定性算法是利用问题的解析性质,产生一确定的有限或无限点序列使其收敛于全局最优解。这类方法依据某一确定性策略搜索局部极小,并试图跳跃已获得的局部极小而达到某个全局最优点,能充分利用问题的解析性质,从而计算效率高。
public class BinarySearch {
public static void main(String[] args) {
int arr[] = {1, 5, 7, 10, 324, 2345};
int arr1[] = {1, 5, 7, 7,7,7,7,10, 324, 2345};
int resultIndex = binarySearch(arr, 0, arr.length - 1, 2345);
System.out.println("该结果的索引为:");
System.out.println(resultIndex);
System.out.println("输出没有的数据:");
System.out.println(binarySearch(arr, 0, arr.length - 1, 23));
System.out.println("输出有相同的数据的下标:");
System.out.println(binarySearch1(arr1,0,arr.length-1,7));
System.out.println("输出没有的数据:");
System.out.println(binarySearch1(arr1,0,arr.length-1,4343));
}
/**
* @param arr 数组
* @param left 左边的索引
* @param right 右边的索引
* @param findval 要查找的值
* @return 如果找到就返回该值的下标
*/
public static int binarySearch(int[] arr, int left, int right, int findval) {
//当left>right时,说明递归整个数组后都没有找要找的值
if (left > right) {
return -1;
}
int mid = (left + right) / 2;
int midValue = arr[mid];
if (findval > midValue) {//向右递归
return binarySearch(arr, mid + 1, right, findval);
} else if (findval < midValue) {//向左递归
return binarySearch(arr, left, mid - 1, findval);
} else {
return mid;
}
}
/**
*@Descriptin 思考优化
*@return java.util.ArrayList<java.lang.Integer>
*@data 2021/12/23
*/
public static ArrayList<Integer> binarySearch1(int[] arr, int left, int right, int findval) {
//当left>right时,说明递归整个数组后都没有找要找的值
if (left > right) {
return new ArrayList<>();
}
int mid = (left + right) / 2;
int midValue = arr[mid];
if (findval > midValue) {//向右递归
return binarySearch1(arr, mid + 1, right, findval);
} else if (findval < midValue) {//向左递归
return binarySearch1(arr, left, mid - 1, findval);
} else {
ArrayList<Integer> list = new ArrayList<>();
int temp = mid - 1;
while (true) {
if (temp < 0 || arr[temp] != findval) {
break;
}
list.add(temp);
temp -= 1;//temp左移
}
list.add(mid);
temp = mid + 1;
while (true) {
if (temp > arr.length - 1 || arr[temp] != findval) {
break;
}
list.add(temp);
temp += 1;//temp右移
}
return list;
}
}
}