page61-将二分查找重写为一段面向对象的程序

1 将二分查找重写为一段面向对象的程序 (用于在整数集合中进行查找的一种抽象数据类型)

public class StaticSETofInts 【API】

  StaticSETofInts(int[] a )根据 a[]中的所有值创建一个集合

  boolean contains(int key) key是否存在于集合中。

【数据实现】

import java.util.Arrays;

public class StaticSETofInts {

    private int[] a;
    public StaticSETofInts(int[] keys){

        a = new int[keys.length];
        for (int i = 0; i < keys.length; i++)
            a[i] = keys[i];//保护性复制
        Arrays.sort(a);
    }

    public boolean contains(int key){
        return  rank(key) != -1;
    }

    private int rank(int key){//二分查找

        int low = 0;
        int high = a.length -1;
        while(low <= high){ //要么存在于a[low..high]中, 要么不存在。

            int mid = (low + high) /2;
            if(key < a[mid]) high = mid -1;
            else if(key > a[mid]) low  = mid + 1;
            else return mid;
        }
        return -1;
    }
}

【典型测试用例】

public class Whitelist {

    public static void main(String[] args) {

        int[] w = new In(args[0]).readAllInts();
        StaticSETofInts set = new StaticSETofInts(w);

        while(!StdIn.isEmpty()){
            int key = StdIn.readInt();
            if(!set.contains(key)) System.out.println(key);
        }
    }
}

【打印结果】

时间: 2025-02-01 17:48:04

page61-将二分查找重写为一段面向对象的程序的相关文章

最优雅的二分查找

今天复习以前的代码,突然发现插入排序用的二分查找算法实现得很别扭,于是试试重写一个,没想到相当顺利,几分钟就写好并测试通过了: static int BinarySearch(int[] array, int value, int start, int end) { if(start == end) return start; var middle = (start + end)/2 + 1; if(value >= array[middle]) return BinarySearch(arra

StringBuffer、StringBuilder、冒泡与选择排序、二分查找、基本数据类型包装类_DAY13

1:数组的高级操作(预习) (1)数组:存储同一种数据类型的多个元素的容器. (2)特点:每个元素都有从0开始的编号,方便我们获取.专业名称:索引. (3)数组操作: A:遍历 public static void printArray(int[] arr) { for(int x=0; x<arr.length; x++) { System.out.println(arr[x]); } } B:获取最值 public static int getMax(int[] arr) { int max

递归函数、二分查找、面相对象初识、类空间,对象空间、组合、继承

一.递归函数 一般递归100多次,都没有解决的问题,放弃递归. 默认递归深度:998 修改默认递归次数 import sys sys.setrecursionlimit(100000) #设置十万次 count = 0 def func1(): global count count += 1 print(count) func1() func1() 用递归 解决一个年龄问题. alex 他比佩奇 大两岁.  4   age(3) + 2 佩奇 他比日天 大两岁.  3   age(2) + 2

自学Python3.6-算法 二分查找算法

自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Python3.6-算法 二分查找算法 .... 原文地址:https://www.cnblogs.com/yaoyaojcy/p/10596912.html

二分查找技巧---字节跳动2018校招算法方向(第二批)---用户喜好

[编程题]用户喜好 时间限制:3秒 空间限制:262144K 为了不断优化推荐效果,今日头条每天要存储和处理海量数据.假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用户(标号相连的一批用户)中,有多少用户对这类文章喜好值为k.因为一些特殊的原因,不会出现一个查询的用户区间完全覆盖另一个查询的用户区间(不存在L1<=L2<=R2<=R1). 输入描述: 输入: 第1行为n代表用户的个数 第2行为n个整数,第

二分查找

递归版(在区间[x, y)中找v的位置) 1 //递归版二分查找 2 int bsearch(int * A, int x, int y, int v) 3 { 4 5 if(v<a[x] || v>a[y-1]) return -1; 6 int m = x + (y-x)/2; //此处能不能用int m = (x+y)/2,需要仔细考虑(暂时想不到原因) 7 if(A[m]==v) return m; 8 else if(A[m]>v) return bsearch(A, x, m

二分查找总结

最近刷leetcode和lintcode,做到二分查找的部分,发现其实这种类型的题目很有规律,题目大致的分为以下几类: 1.最基础的二分查找题目,在一个有序的数组当中查找某个数,如果找到,则返回这个数在数组中的下标,如果没有找到就返回-1或者是它将会被按顺序插入的位置.这种题目继续进阶一下就是在有序数组中查找元素的上下限.继续做可以求两个区间的交集. 2.旋转数组问题,就是将一个有序数组进行旋转,然后在数组中查找某个值,其中分为数组中有重复元素和没有重复元素两种情况. 3.在杨氏矩阵中利用二分查

二分查找JAVA实现

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功. 一.概念 二分查

rwkj 1430 二分查找

#include<iostream>using namespace std;int n,k,a[10000]; int binsearch(int low,int high){ int i,len,s;while(low<high) { len=(high+low)/2; for(s=0,i=0;i<n;i++) s+=a[i]/len; if(s>k) low=len+1; else if(s<k) high=len-1; else return len; }}int