二分法

看下百度怎么说的

两个重点: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));
             }
        }
    }

}

 

posted @ 2022-01-28 14:28  余生请多指教ANT  阅读(172)  评论(0编辑  收藏  举报