您的位置:首页 > 其它

Binary search with addition and subtraction

2017-02-10 09:46 471 查看
最近在学习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谁快的问题,答者扯到的硬件方面不是很了解

附上链接

也没怎么精简校验,有错误可以联系我,会及时纠正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algs4 二分法