Binary search with addition and subtraction

这篇博客记录了学习Algorithms 4th的过程,讨论了如何在不允许比较操作的情况下,仅使用加减法进行二分查找。在给定一个有序数组和一个整数目标值的情况下,要求程序的运行时间在最坏情况下与log N成正比。文章介绍了这种方法的解决方案,并提到了StackOverflow上关于斐波那契搜索与二分搜索效率的讨论。

最近在学习Algorithms 4th, 做个记录

题目

Binary search with only addition and subtraction. [Mihai Patrascu] Write a program that, given an array of N distinct int values in ascending order, determines whether a given integer is in the array. You may use only additions and subtractions and a constant amount of extra memory. The running time of your program should be proportional to log N in the worst case.
仅用加减实现的二分查找。编写一个程序给定一个含有N个不同int值并按照升序排序的数组,判断是否有给定的整数,只能用加法和减法以及额外的内存,程序运行时间在最坏情况下应该和logN成正比

解决方法

package day1;

import edu.princeton.cs.algs4.*;

import java.util.Arrays;
import java.util.HashSet;

public class Mihai_Patrascu {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] arr = getArr(20000);
        StdOut.println();
        Arrays.sort(arr); // 排序
        for (int i :arr){
            StdOut.print(i+" ");
        }
//      fbnq(10, 5, 2);
        int index = max(arr, 0, arr.length, 10);
        StdOut.println("answer: "+index);
    }
    /**
     * 
     * @param arr 数组
     * @param lo 起始下标
     * @param hi 最终下标
     * @param goal 查找的参数
     * @return
     */
    public static int  max(int[] arr, int lo, int hi, int goal) {
        if (lo > hi) return -1;
        // init 
        if (hi - lo <= 2) {
            if (arr[lo] == goal) return lo;
            if (arr[hi] == goal) return hi;
            else {
                return -1;
            }
        }else {

            int k3 = 0;
            int i = 3;
            while (k3 < hi) {
                i++;
                k3 = fbnq(i, lo,  1) - lo;
                StdOut.print(k3 + " ");
            }
            StdOut.println();

            int k2 = fbnq(i - 1, 0, 1) + lo;
            if (arr[k2] > goal) return max(arr, lo, k2 - 1, goal);
            if (arr[k2] < goal) return max(arr, k2 + 1, hi, goal);
            else return k2;
        }


    }

    // 斐波那契数列
    /**
     * 
     * @param n 下标
     * @param first 第一个数
     * @param second 第二个数
     * @return n小标下的数字
     */
    public static int fbnq(int n,int first, int second) {
        int a = first;
        int b = second;
        if (n < 3) return 1;
        else {
            int i = 3;
            while (i <= n) {
                int temp ;
                temp = a;
                a = b;
                b = temp + a;
                i++;
//              StdOut.print(b+" ");
            }
            return b;
        }
    }

    // 创建不重复的数组
    public static int[] getArr(int arrSize) {
        HashSet< Integer> set = new HashSet<>();
        int[] arr = new int[arrSize];
        for (int i = 0; i<arrSize; i++){
            int a = StdRandom.uniform(arrSize * 2); // 可能会再创建的时候多费一点时间, 但是有利于查找到对应的数字
            int count = set.size();
            set.add(a);
            if (count < set.size()) {
                arr[i] = a;
            }else {
                i--;
            }
        }
        return arr;
    }

}

最后

stakoverflow上有关于斐波那契search和binary search谁快的问题,答者扯到的硬件方面不是很了解
附上链接
也没怎么精简校验,有错误可以联系我,会及时纠正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值