何时使用 low < high 或 low + 1 < high for 循环不变式

2024-02-18

我读过多篇文章,包括 Jon Bentley 的二分搜索章节。这就是我对正确的二分搜索逻辑的理解,它在我所做的简单测试中有效:

binarysearch (arr, low, high, k)
    1. while (low < high)
        2. mid  = low + (high - low)/2
        3. if (arr[mid] == k)
               return mid
        4. if (arr[mid] < k )
               high = mid -1
        5. else 
               low = mid + 1

现在要查找第一个出现的已排序重复项,您将有机会使用第 3 行 if 条件继续 而不是返回 mid as

binarysearch_get_first_occur_with_duplicates (arr, low, high, k)
    1. while (low < high)
        2. mid  = low + (high - low)/2
        3. if (arr[mid] == k)
               high = mid - 1
               low_so_far = arr[mid]
        4. if (arr[mid] < k )
               high = mid -1
        5. else 
               low = mid + 1
        return low_so_far

类似地,要获得重复元素的最高索引,您可以这样做low = mid + 1并继续如果arr[mid]==k

这个逻辑似乎有效,但在多个地方我看到循环不变式

while (low + 1 < high)

我很困惑,想了解您何时可能想要使用low + 1 < high反而 的low < high.

在我上面描述的逻辑中low + 1 < high如果您使用简单的示例进行测试,条件会导致错误。

有人可以澄清为什么以及何时我们可能想要使用low + 1 < high在 while 循环中而不是low < high?


如果你的不变量是目标必须位于low <= i <= high,然后你使用while (low < high);如果你的不变量是目标必须位于low <= i < high然后你用while (low + 1 < high)。 [感谢 David Eisenstat 证实了这一点。]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时使用 low < high 或 low + 1 < high for 循环不变式 的相关文章

  • 比 BMH (Boyer–Moore–Horspool) 更快的算法

    您会使用哪种算法来搜索短文本中的短子字符串 简而言之 我的意思是子字符串有 5 10 个字符 字符串有 255 个字符 我正在考虑根据输入数据长度选择算法 哪种算法对于较长的输入更好 Try Turbo BM http www igm un
  • 如何检测图像是否像素化

    之前有人在 SO 上提出过这样的问题 在Python中检测像素化图像 https stackoverflow com questions 12942365 detecting a pixelated image in python还有关于q
  • 测量数组的“无序”程度

    给定一个值数组 我想找到总 分数 其中每个元素的分数是数组中出现在其之前的具有较小值的元素的数量 e g values 4 1 3 2 5 scores 0 0 1 1 4 total score 6 O n 2 算法很简单 但我怀疑可以通
  • 按步长值变化对数组中的数字进行分组

    我有一个像 101 107 106 199 204 205 207 306 310 312 312 314 317 318 380 377 379 382 466 469 471 472 557 559 562 566 569 在这个数组中
  • 整数除法性质

    下面的整数算术性质成立吗 m n l m n l 起初我以为我知道答案 不成立 但现在不确定 它适用于所有数字还是仅适用于某些条件 即n gt l 该问题涉及计算机算术 即q n m q m n 忽略溢出 Case1 assume m kn
  • 将数字 n 拆分为 k 个不同数字的总和

    我有一个数字 n 我必须将它分成 k 个数字 使得所有 k 个数字都是不同的 k 个数字的总和等于 n 并且 k 最大 例如 如果 n 为 9 则答案应为 1 2 6 如果 n 为 15 则答案应为 1 2 3 4 5 这就是我尝试过的 v
  • 比较两棵树的伪代码

    这是我遇到过几次的问题 并且不确信我使用了最有效的逻辑 例如 假设我有两棵树 一棵是文件夹结构 另一棵是该文件夹结构的内存 模型 我希望比较两棵树 并生成一棵树中存在的节点列表 而不是另一棵树中存在的节点列表 反之亦然 是否有公认的算法来处
  • 对列表中的相邻元素进行分组

    假设我想编写一个函数来执行此操作 输入 1 1 3 3 4 2 2 5 6 6 输出 1 1 3 3 4 2 2 5 6 6 它将相同的相邻元素分组 这个方法的名称应该是什么 此操作有标准名称吗 In 1 1 3 3 4 2 2 5 6 6
  • 最低共同祖先算法

    所以我一直在研究实现最低共同祖先算法 我研究了许多不同的算法 主要是 Trajan 解决方案的变体或 RMQ 的变体 我正在使用非二叉树 我的树经常会在查询之间发生变化 因此预处理不一定值得 树的节点数不应超过 50 75 个 我想知道的是
  • java中的Anagram算法

    我想做字谜算法但是 这段代码不起作用 我的错在哪里 例如 des 和 sed 是字谜 但输出不是字谜 同时我必须使用字符串方法 不是数组 public static boolean isAnagram String s1 String s2
  • 将 n 个可变高度图像拟合为 3 个(相似长度)列布局

    我正在寻找类似于的 3 列布局piccsy com http piccsy com 给定许多宽度相同但高度不同的图像 有什么算法可以对它们进行排序以使列长度的差异最小 最好使用 Python 或 JavaScript 非常感谢您提前的帮助
  • 埃拉托斯特尼筛法是生成 1 到 N 素数的最佳算法吗?

    我在一次采访中被问到这个问题 我使用埃拉托色尼筛子概念和数组实现了一种算法 有没有更好的方法来解决这个问题 对于不知道筛子的人 请点击以下链接 http en wikipedia org wiki Sieve of Eratosthenes
  • 为什么使用 no-op 来填补 paxos 事件之间的空白是合法的?

    我正在学习Paxos算法 http research microsoft com en us um people lamport pubs paxos simple pdf http research microsoft com en us
  • 计算总和等于 k ​​的子集数量

    给定一个数组 我们需要找出总和恰好等于给定整数 k 的子集的数量 请针对这个问题提出一个最佳算法 这里不需要实际的子集 只需计数即可 该数组由整数组成 可以是负数也可以是非负数 例子 数组 gt 1 4 1 10 5 绝对值总和 gt 9
  • 如何在大空间尺度上加速A*算法?

    From http ccl northwestern edu netlogo models community Astardemo http ccl northwestern edu netlogo models community Ast
  • 如何从列中创建对称矩阵?

    例如 我想转动以下列 90 175 600 650 655 660 代入矩阵 90 175 600 650 655 660 175 600 650 655 660 655 600 650 655 660 655 650 650 655 66
  • 创建将 n 个用户放入 k 个组的所有可能方法

    给定 n 个用户 u 1 u 2 u n 和 k 个组 g 1 g 2 g k 创建所有组的所有可能组合 基本上 最后每个组合都是一个Map 其中第一个Integer是用户ID 第二个Integer是组ID 例如 u 1 g 1 u 2 g
  • 为什么 n 按位和 -n 总是返回最右边的位(最后一位)

    这是Python代码片段 1 1 1 2 2 2 3 3 1 看来任何n n总是返回最右边 最后 位 我真的不知道为什么 有人可以帮助我理解这一点吗 这是由于负数以二进制表示的方式 称为二进制补码表示 创建某个数字 n 的补码 换句话说 创
  • 找到一个恰好出现了 N/2 次的数字

    这是我的面试问题之一 给定一个包含 N 个元素的数组以及元素出现的位置正好 N 2次 其余 N 2 个元素是unique 您如何找到运行时间更好的元素 请记住 元素未排序 您可以假设 N 是偶数 例如 input array 10 2 3
  • 哪种算法可以有效地找到路径一定距离内的一组点?

    给定一组点s 一组 x y 坐标 和由连接一组点的线段组成的路径l 描述一种有效的算法 可用于从s在指定距离内d路径的l 其实际应用可能是查找沿城市之间的公路旅行路径 10 英里内任意位置的餐馆列表 For example in the f

随机推荐

  • 如何获取不同值节点XML

    我是 XML 新手 所以希望得到您的帮助 我有以下 XML
  • 粘胶参数

    我是 openGL 的初学者 在所有简单的示例中 main 函数都有参数 而 glutinit func 使用这些参数 但我不明白为什么它们是必要的 我在命令参数中什么也没写 程序仍然有效 它们有什么用 你能给个例子吗 glutInit a
  • Django 多表继承和左外连接

    最近 我遇到了 Django 关于模型继承的常见问题 我有一堆不同的模型 我想单独或作为一组显示 读作 查询数据库中的所有内容 或仅查询某个类别 型号 的项目 最终 我选择了多表继承 我的模型看起来像 class Unit models M
  • Matplotlib:多个轮廓变量的轮廓图的多个图例

    我需要在同一页面上绘制多个变量的多个等高线图 我可以使用 MATLAB 来完成此操作 请参阅下面的 MATLAB 代码 我无法让 matplotlib 显示多个图例 任何帮助将非常感激 Python代码 import numpy as np
  • pandas.Series/DataFrame.fillna 限制中的错误?

    我一直在尝试使用填充 DataFrame 和 Seriesfillna与value and limit关键词 这limit不包括时受到尊重value 但只要包括value限制不再受到尊重 这是使用 DataFrame 的示例 import
  • 如何使用 Python 中的 Bing Speech API 转录语音文件?

    如何使用 Python 中的 Bing Speech API 转录语音文件 我的语音文件超过 15 秒 我知道人们可以在 Python 中使用 Bing Speech REST API https gist github com jelli
  • MongoDB 在包含 50.000.000 个以上文档的大型集合上写入性能较差

    我有一个 MongoDB 用于存储产品数据204 639 403项目 这些数据已经按项目所在国家 地区吐出到四个逻辑运行在同一台物理机器上的同一个 MongoDB 进程中的数据库 以下是每个逻辑数据库的文档数量列表 CoUk 56 719
  • Android 服务和内容提供者之间的区别

    我正在开发一个应用程序 并对 Android 中的服务和内容提供商的概念感到困惑 在实践中 它们之间会有什么区别 Content Provider是一个外观 它定义了一种在应用程序之间共享数据的方法 您可以将本地数据库附加到您的应用程序或创
  • 休眠验证器对未来至少 24 小时内的日期的注释

    我知道存在注释 Future 如果我用这个注释来注释字段 Future private Date date 日期必须是当前时刻之后的未来日期 现在我需要验证该日期至少在当前时刻之后 24 小时 我怎样才能做到呢 明天之后 java Targ
  • awk 中打印变量

    在此脚本中 我希望 awk 打印变量 file f order and sum NR 全部在一行中 bin bash for file in pmb mpi tau xhpl mpi tile io fftw do for f in 2 5
  • 是否可以通过 UI 将新字段添加到 bigquery 中 RECORD 类型的现有字段中?

    是否可以向 bigquery 中的 RECORD 类型的现有字段添加新字段 例如 如果我当前的架构是 u fields u mode u NULLABLE u name u test1 u type u STRING u fields u
  • Ruby 中的自定义日志记录最佳实践

    在 Ruby 中管理自定义日志记录的最佳实践是什么 我应该对记录器进行猴子补丁来做我想做的事吗 或者从它延伸出来 还是委托 红宝石的方法是什么 我厌倦了为此而定制的黑客 我想要更干净 更优雅的东西 贝茨有一个截屏视频 http railsc
  • 链接 OpenCV 4.1.0,包含有效,库无效

    将 Ubuntu 从 16 04 更改为 18 04 将 OpenCV 从 3 4 1 更改为 4 1 0 后 我无法编译 任何东西 一步步 我从 github 下载了源代码 设置了这些标志 cmake D CMAKE BUILD TYPE
  • 字符串上的 Python hash() 函数

    CPython2 7中如何计算某个特定字符串的哈希值 例如 这段代码 print hash abcde 1000 即使我重新启动 Python 进程并重试 我做了很多次 也会返回相同的值 所以 看来id 此计算中不使用字符串的 内存地址 对
  • 如何在 Mongoose 模式中设置数组大小限制

    您能否告诉我在创建 Mongoose 模式时是否有任何方法可以设置数组大小的限制 例如 var peopleSchema new Schema name type String required true default true here
  • 将 DefaultIfEmpty 与对象一起使用?

    我在 MSDN 上看到了一个示例 如果没有返回任何内容 它可以让您指定默认值 见下文 List
  • 如何用JavaScript检测屏幕分辨率?

    有没有一种方法适用于所有浏览器 原答案 Yes window screen availHeight window screen availWidth update2017 11 10 From Tsunamis https stackove
  • Jboss一步步设置热部署

    您好 我想问一下如何配置 jboss 服务器以进行实时 热部署 每次当我更改 jsp html js 或 css 文件的某些代码时 我总是需要清理和构建项目 而不是一次又一次地将项目部署到 jboss 这花费了我很多时间 我为此浪费时间 当
  • 将 R 数据框中的列表扩展到数据框中的其他行?

    In a 今天早些时候单独提出问题 https stackoverflow com questions 34206003 how to flatten r data frame that contains lists我问如何将嵌套列表展平为
  • 何时使用 low < high 或 low + 1 < high for 循环不变式

    我读过多篇文章 包括 Jon Bentley 的二分搜索章节 这就是我对正确的二分搜索逻辑的理解 它在我所做的简单测试中有效 binarysearch arr low high k 1 while low lt high 2 mid low