• 二分法


    看下百度怎么说的

    两个重点: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));
                 }
            }
        }
    
    }
    
  • 相关阅读:
    express中间件
    复习node中加载静态资源--用express+esj
    有关es6的模块化
    es6转码和package.json中的配置
    MySQL必知必会--使用子查询
    MySQL必知必会--分 组 数 据
    MySQL必知必会--汇 总 数 据
    mysql必知必会--使用数据处理函数
    拼凑可导的充分必要条件
    递推数列极限存在证明
  • 原文地址:https://www.cnblogs.com/wangbiaohistory/p/15852663.html
Copyright © 2020-2023  润新知