二分法
看下百度怎么说的

两个重点:1,有序2.时间复杂度0(log2n): 推算如下假设某个数查找最坏的情况是最后一次才找到, 那么二分法每次都查找的范围为原来的1/2,假设总时间需要x,数据长度是N 那么总共需要:N*(1/2)~x=1=====>>x=logN (次) 对于log2n不知道怎么处理的,对数函数知道吧,比如你找得数是8,以二为底数n,求结果为3,最坏的详情下三次能找到,8在最后一位。对数函数不知道,请自行学习,这里不再哔哔
时间复杂度只关系到最高次所以时间复杂度是:O(n^2)
package com.example.demo.util;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import java.io.Serializable;
@Data
public class BinarySearch implements Serializable {
//查找结果
private int result;
//查找结果所在位置
private int index;
//查询次数
private int count;
//折中常量
private final static int CONSTANT =2;
/**
*
* @param arr 有序数组
* @param tobeQueried 待查询数值
* @param from 查询起始下标0
* @param end 数值尺寸arr.length-1
* @return
*/
public BinarySearch numberOfQuery(int [] arr,int tobeQueried,int from,int end) {
++count;
BinarySearch binarySearch=new BinarySearch();
int length = arr.length;
if(length<=0||from<0||end>=length){
binarySearch.setIndex(-1);
binarySearch.setResult(tobeQueried);
binarySearch.setCount(0);
return binarySearch;
}
int temp = from + end;
int mid = temp / CONSTANT;
if(arr[mid]==tobeQueried){
binarySearch.setIndex(mid);
binarySearch.setResult(arr[mid]);
binarySearch.setCount(count);
return binarySearch;
} else if(arr[mid]>tobeQueried){
end= --mid;
return numberOfQuery(arr,tobeQueried,from,end);
}else if(arr[mid]<tobeQueried){
from= ++mid;
return numberOfQuery(arr,tobeQueried,from,end);
}
return binarySearch;
}
public static void main(String[] args) {
BinarySearch binarySearch=new BinarySearch();
int a[]=new int[1000];
for (int i=0;i<1000;i++){
a[i]=i;
}
BinarySearch binarySearch1 = binarySearch.numberOfQuery(a, 999, 0, 999);
System.out.println(JSON.toJSON(binarySearch1));
}
}
介绍一种更牛逼的写法:
package dubbo.wangbiao.project.ThreadAndSocket.thread.threadcas.threadfork;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.atomic.LongAdder;
public class ThredForkJoin {
public static void main(String[] args) {
ForkJoinPool forkJoinPool=new ForkJoinPool();
List<Integer> nums = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
//累加器
LongAdder longAdder=new LongAdder();
AddTask addTask=new AddTask(nums,longAdder);
//插入
forkJoinPool.invoke(addTask);
forkJoinPool.shutdown();
System.out.println(longAdder);
}
/**
* 二分法
*/
private static class AddTask extends RecursiveAction{
private final List<Integer> nums;
private final LongAdder longAdder;
private AddTask(List<Integer> nums,LongAdder longAdder) {
this.nums = nums;
this.longAdder=longAdder;
}
@Override
protected void compute() {
int size=nums.size();
if(size>1){
int parts=size/2;
List<Integer> leftpart=nums.subList(0,parts);
List<Integer> rightpart=nums.subList(parts,size);
AddTask addTask=new AddTask(leftpart,longAdder);
AddTask addTask0=new AddTask(rightpart,longAdder);
invokeAll(addTask,addTask0);
}else{
if(size==0){
return;
}
Integer integer=nums.get(0);
longAdder.add(Long.valueOf(integer));
}
}
}
}
本文来自博客园,作者:余生请多指教ANT,转载请注明原文链接:https://www.cnblogs.com/wangbiaohistory/p/15852663.html

浙公网安备 33010602011771号