一、二分查找

【引入】一个综艺节目是给定一件价格为未知整数的商品,默认最高价格为1个亿,

你每次猜其价格时主持人会告诉你该价格比实际价格高还是低或者相等,现在让你在尽可能少的次数下猜出其价格,请问你的策略是什么?

【策略】已知上下界1~109,则每次取中间的值,直到猜中为止,时间 复杂度O(logN)相当快

【伪码描述】

int a[maxn];//数组a按照从小到大排序
def find(key){int lo = min;//下界int hi = max;//上界while(lo < hi){int mid = lo + (hi - lo) / 2;if(a[mid] == key) return mid;else if(a[mid] < key){//如果中间值比较小,则在右半边找lo = mid + 1;}else{hi =  mid - 1;//如果中间值比较大,则在左半边找
        }}return -1;//没找到则 返回一个特殊值
}

二、基于有序数组的二叉查找树

package search;import java.util.Random;public class BinarySearchST<Key extends Comparable<Key> , Value> {private Key[] keys; //键private Value[] vals; //值private int N;// 当前使用容量public BinarySearchST(int capacity) {keys = (Key[]) new Comparable[capacity];vals = (Value[]) new Object[capacity];}public int size() {return N;}//根据键来查找对应值public Value get(Key key) {//找出该键在数组中的下标int pos = rank(key);//如果找到的下标在范围内并且确实是这个键,说明找到了if(pos < N && keys[pos].compareTo(key) == 0) {return vals[pos];}else return null;//否则没有找到,返回空
    }//二分法查找键的位置public int rank(Key key) {int lo = 0, hi = N - 1;//二分查找while(lo <= hi) {int mid = lo + (hi - lo) / 2;if(keys[mid].compareTo(key) > 0) {hi = mid - 1;}else if(keys[mid].compareTo(key) < 0 ) {lo = mid + 1;}else {return mid;}}//如果找不到 之前一步lo必定等于hi, 看这个数字是大于还是小于,不论怎样,lo的位置都代表如果这个数存在//它应该处于的位置return lo;}public void put(Key key, Value val) {int pos = rank(key);//先看这个键有木有//如果有只需要修改一下值就行了if(pos < N && keys[pos].compareTo(key) == 0) {vals[pos] = val;}//如果没有就新建一个键值对 插入//插入的位置正好是pos 那么pos之后的数都要后移一位//如果容量已满需要扩容for(int i=N-1; i>=pos; i--) {keys[i + 1] = keys[i];vals[i + 1] = vals[i];}//空出来的位置插入新键值对keys[pos] = key;vals[pos] = val;N++;}public void delete(Key key) {int pos = rank(key);//先看这个键有木有//如果有就删除 并且后移一位if(pos < N && keys[pos].compareTo(key) == 0) {for(int i=pos; i<N-1; i++) {keys[i] = keys[i+1];vals[i] = vals[i+1];}N--;}//如果没有就返回return;}public void show() {for(int i=0; i<N; i++) {System.out.println(keys[i].toString() + " : " + vals[i].toString());}}public static void main(String[] args) {// TODO Auto-generated method stubBinarySearchST<Integer, Integer> bs = new BinarySearchST<Integer , Integer>(20);Random r = new Random();for(int i=0; i<10; i++) {Integer t1 = new Integer(r.nextInt(1000));Integer t2 = new Integer(r.nextInt(1000));bs.put(t1, t2);}bs.show();System.out.println("*********************");bs.put(999, 999);bs.put(555, 555);bs.show();System.out.println("*********************");bs.delete(555);bs.show();}}

View Code

转载于:https://www.cnblogs.com/czsharecode/p/10554345.html

查找系列合集-二分查找相关推荐

  1. 查找系列合集-散列表

    一.散列表 [问题]之前我们的用红黑树实现了O(logN)的查找算法,那么理论上有没有O(1)的查找算法呢? [分析]除非我们能够单凭键值key就能确定该元素在集合中的位置,直接将其取出 [解决方法] ...

  2. Oracle 每日一题系列合集

    作者 | JiekeXu 来源 | JiekeXu之路(ID: JiekeXu_IT) 转载请联系授权 | (微信ID:xxq1426321293) 大家好,我是 JiekeXu,很高兴又和大家见面了 ...

  3. 【BZOJ2594】水管局长加强版,LCT+并查集+二分查找位置

    Time:2016.05.10 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: LCT维护路径最小值 倒叙处理询问,就相当于往图里面加边. 实时维护最小值,即最小生成树,可以参照魔法 ...

  4. Linux下的查找命令合集(which/whereis/locate/find)

    Linux 下的查找命令有很多,常用的有which.whereis.locate.find.那么这4个命令之间各自有什么特点,又有什么区别,什么时候该用哪个才最合适呢?方便我们在开发和学习中能更加有效 ...

  5. 算法 - 二分查找(非递归实现二分查找)

    package Algorithm.binarysearchnorecursion;public class BinaaySearchNoRecur {public static void main( ...

  6. 剑指Offer - 面试题53 - I. 在排序数组中查找数字 I(二分查找的变形版本)

    1. 题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2示例 2: 输入: nums = [5,7,7,8, ...

  7. java 二分查找 排序_java 冒泡排序 二分查找

    下面这个程序是先定义一个整型数组,然后将其中的元素反序赋值,再用冒泡排序进行排序以后用二分查找来查找其中是否有某个数,返回值为-1时表示这个数可能小于这个数组的最小值或大小这个数组的最大值,-2表示这 ...

  8. python 二分查找算法_Python实现二分查找法

    用Python来实现二分查找 1.问题需求 输入列表[1,4,4,5,7,7,8,9,9,10]和目标整数1,输出其所在的位置为0,即第1次出现在第0个位置.输入列表[1,2,3,3,4,5,10]和 ...

  9. java二分查找范围区间_二分查找(Java实现)

    二分查找:递归实现 public class BinarySearch { /** * @param arr 代查找的数组,需要有序 * @param left 查找区间的左界限 * @param r ...

最新文章

  1. 《OpenCV3编程入门》学习笔记7 图像变换(一)基于OpenCV的边缘检测
  2. 14、HTML <input>标签
  3. 只能输入正整数 以及常用的正则表达式
  4. [3.30校内训练赛]
  5. Linux命令之zip命令
  6. linux 解压 视频插件,linux下压缩解压缩命令
  7. Soul网关源码阅读(八)路由匹配初探
  8. PS中rename-item的一些高级应用
  9. 英特尔 英特尔 显示器音频_英特尔缩小的麻烦
  10. 有关arcmap的学习使用心得
  11. 为什么亚洲四小龙只有韩国出了三星和现代这样的品牌巨擘?
  12. 安装release版本的apk
  13. 原生JS记忆翻牌小游戏
  14. 在保护继承中基类的共有成员_鸡啄米:C++编程入门系列之三十八(继承与派生:派生类对基类成员的访问控制之保护继承与私有继承)...
  15. 如何把网址生成二维码
  16. 图片内容巴特勒 (隐藏文字到图片)
  17. Vue props用法详解
  18. MFC使用CButtonST类实现按钮图片功能
  19. Sparrow: 适用于细粒度tasks低延迟调度的去中心化无状态分布式调度器
  20. mysql表名可以用中文么_[急]MySQL中建表不能使用中文字段吗?解决思路

热门文章

  1. layui的登录ajax,layui如何实现登录功能
  2. html5单击修改背景色,用获取节点的方式实现点击按钮改变标签背景颜色的问题...
  3. java四则出题判分_java 随机出题四则运算
  4. leetcode实践:通过链表存储两数之和
  5. 【小记】输入框前后左右去空格的正则方法
  6. [LeetCode] 679. 24 Game(回溯法)
  7. cocos2d-x 3.10 显示Box2d 调试视图
  8. [HDOJ1897]继续畅通工程
  9. HDU 1542 Atlantis 线段树+离散化+扫描线
  10. javascript查找关键字高亮效果