4.10二分查找

二分查找下

1.通过ip查找ip归属地

数据库存储的是ip区间和归属地按对储存

2.二分查找变形四个问题

二分查找上是最简单的一种情况,没有重复值出现,现在有重复值出现的二分查找,这里关键点还是一样,先找到相等的目标值,再判断是否是我要的第一个或者最后一个等值的目标值

i.查找第一个等于给定值的元素

public int bsearch(int[] a, int n, int value) {

  int low = 0;

  int high = n - 1;

  while (low <= high) {

    int mid =  low + ((high - low) >> 1);

    if (a[mid] > value) {

      high = mid - 1;

    } else if (a[mid] < value) {

      low = mid + 1;

    } else {

      if ((mid == 0) || (a[mid - 1] != value)) return mid;

      else high = mid - 1;

    }

  }

  return -1;

}

注:找到同值,且左边没有等值,或者mid到达左边极端点,则输出,否则前面有同值元素存在则继续更新左区间

ii.查找最后一个等于给定值的元素

public int bsearch(int[] a, int n, int value) {

  int low = 0;

  int high = n - 1;

  while (low <= high) {

    int mid =  low + ((high - low) >> 1);

    if (a[mid] > value) {

      high = mid - 1;

    } else if (a[mid] < value) {

      low = mid + 1;

    } else {

      if ((mid == n - 1) || (a[mid + 1] != value)) return mid;

      else low = mid + 1;

    }

  }

  return -1;

}

注:找到同值,且右边没有等值,或者到达右边极端直接输出,否则后面有等值,更新右区间

iii.查找第一个大于等于给定值的元素

public int bsearch(int[] a, int n, int value) {

  int low = 0;

  int high = n - 1;

  while (low <= high) {

    int mid =  low + ((high - low) >> 1);

    if (a[mid] >= value) {

      if ((mid == 0) || (a[mid - 1] < value)) return mid;

      else high = mid - 1;

    } else {

      low = mid + 1;

    }

  }

  return -1;

}

注:这里要求大于等于,先找到符合条件的数值,然后判断是否是第一个出现的,即左区间

iiii.查找最后一个小于等于给定值的元素

public int bsearch7(int[] a, int n, int value) {

  int low = 0;

  int high = n - 1;

  while (low <= high) {

    int mid =  low + ((high - low) >> 1);

    if (a[mid] > value) {

      high = mid - 1;

    } else {

      if ((mid == n - 1) || (a[mid + 1] > value)) return mid;

      else low = mid + 1;

    }

  }

  return -1;

}

注:这里要求小于等于,先找到符合条件的数值,再判断是不是最后一个出现的,即右区间

3.解决开篇问题ip归属地

IP 地址可以转化为 32 位的整型数。所以,我们可以将起始地址,按照对应的整型值的大小关系,从小到大进行排序。

先通过二分查找,找到最后一个起始 IP 小于等于这个 IP 的 IP 区间,然后,检查这个 IP 是否在这个 IP 区间内,如果在,我们就取出对应的归属地显示;如果不在,就返回未查找到。

4.课后思考题lc33,循环有序数组查找

一个循环有序数组(仅部分区间是有序的,不能要求先排序),比如 4,5,6,1,2,3。针对这种情况,如何实现一个求“值等于给定值”的二分查找算法呢?

解:

i.找到分界下标,拆成两个有序数组

ii.判断目标值所在哪个区间,然后区间上二分查找

总结:

i.二分查找,应用场景是数学中寻找近似值(区间表示),判断答案所在区间(近似值)

ii.关键都是目标值和待检验值三种情况分类讨论:大于,小于,等于,来找到数值满足的元素

iii.再去判断是否满足时间要求:第一个出现,最后一个出现(这里简单写法是先找到符合条件数值,然后因为满足正确条件更少,所以先写符合正确结果的数值,输出如if(n==0||a[n-1]!=a[n]))

iiii.绝大多数二分查找能做的一般都用二叉查找树和散列表实现,虽然二分查找更省空间,但空间廉价时,没必要了,故二分查找专用来找到近似值和区间范围,散列表是精确查找

跳表

1.为什么Redis一定要用跳表来实现有序集合?

2.回顾上篇,开启下文

二分查找底层依赖是数组的随机访问特定,如果数据存储在链表中,只需要对链表稍加改造,就可以支持类似二分的查找算法,这种链表叫跳表

3.跳表

跳表是一种动态数据结构,支持快速的插入删除查找操作,Redis采用跳表来实现有序集合,不使用同样红黑树。借鉴二分查找,近似区间的思想,

给单链表加上多级索引表,每隔两个元素建一个对应的多级索引链表,实现时间复杂度o(logn),空间复杂度o(n),插入删除o(logn)

索引表实现了区间分区功能(近似思想),动态插入,红黑树平衡树都是通过左右旋转保持左右子树大小平衡,跳表插入数据时也选择同时插入到索引层

4.问题解答

插入、删除、查找以及迭代输出有序序列这几个操作,红黑树也可以完成,时间复杂度跟跳表是一样的。但是,按照区间来查找数据(二分查找近似思想)这个操作,红黑树的效率没有跳表高。跳表比红黑树,比起来更简单,好写好懂,更灵活(通过更改索引策略)唯一缺点是没有红黑树成熟,现成的跳表需要自己实现

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • 原文出处:http://www.cnblogs.com/maybe2030/p/4715035.html引文出处:...
    明教de教主阅读 9,156评论 0 7
  • 学习极客时间的数据结构与算法之美的专栏,记录笔记。 1 二分查找应用场景的局限性 (1)二分查找依赖的是顺序表结构...
    疯狂的小强_94ee阅读 352评论 0 0
  • 二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,很多非计算机专业的同学很容易...
    被吹落的风阅读 5,014评论 0 11
  • // 顺序查找 int SequentialSearch(vector & v, int k) { for (in...
    刘帆_d384阅读 550评论 0 0
  • 我们每天使用互联网,你是否想过,它是如何实现的?全世界几十亿台电脑,连接在一起,两两通信。上海的某一块网卡送出信号...
    guanalex阅读 365评论 0 0