Binary search with addition and subtraction
2017-02-10 09:46
471 查看
最近在学习Algorithms 4th, 做个记录
仅用加减实现的二分查找。编写一个程序给定一个含有N个不同int值并按照升序排序的数组,判断是否有给定的整数,只能用加法和减法以及额外的内存,程序运行时间在最坏情况下应该和logN成正比
附上链接
也没怎么精简校验,有错误可以联系我,会及时纠正
题目
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谁快的问题,答者扯到的硬件方面不是很了解附上链接
也没怎么精简校验,有错误可以联系我,会及时纠正
相关文章推荐
- algorithm 1.4.22 Binary search with only addition and subtraction
- B2B e-commerce search with Solr – product assortment and prices
- LintCode: Convert Sorted Array to Binary Search Tree With Minimal Height
- 算法第四版3-2Binary Search Trees With C++ Implementation
- 592. Fraction Addition and Subtraction
- Fraction Addition and Subtraction
- AlphaGo论文的译文,用深度神经网络和树搜索征服围棋:Mastering the game of Go with deep neural networks and tree search
- Search smarter with Apache Solr, Part 1: Essential features and the Solr schema
- lintcode convert-sorted-array-to-binary-search-tree-with-minimal-height 把排序数组转换为高度最小的二叉搜索树
- Fraction Addition and Subtraction
- Math-592-Fraction Addition and Subtraction
- Binary Serialization and BinaryFormatter with WebServices
- What is the difference between a binary tree, a binary search tree, a B tree and a B+ tree?
- Kmeans based indexing and Asymmetric Distance Computation for ANN search (Binary Local Feature):...
- 592. Fraction Addition and Subtraction
- Mastering the game of Go with deep neural networks and tree search
- Convert Sorted Array to Binary Search Tree With Minimal Height
- 【Data Structures】 3. ArrayList and Binary Search
- F - Addition and Subtraction Easy
- leetcode-592. Fraction Addition and Subtraction