- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
书上二分查找的递归版本:
int binarySearch(int[] array, int target) throws BSException { return int binarySearch(int[] array, int target) throws BSException {
return binarySearch(array, target, 0, array.length-1);
}
int binarySearch( int[] array, int target, int lower, int upper ) throws BSException {
int center, range;
range = upper - lower;
if( range < 0 ){
throw new BSException("Limits reversed");
} else if( range == 0 && array[lower] != target ){
throw new BSException("Element not in array");
}
if( array[lower] > array[upper] ){
throw new BSException("Array not sorted");
}
center = ((range)/2) + lower;
if( target == array[center] ){
return center;
} else if( target < array[center] ){
return binarySearch( array, target, lower, center - 1 );
}
else {
return binarySearch( array, target, center + 1, upper );
}
}
和迭代版本:
while( true ){
range = upper - lower;
if( range == 0 && array[lower] != target ){
throw new BSException("Element not in array");
}
关于所有其他算法书籍,包括 Donald Knuth 的 TAOCP、算法设计手册、Programming Pearl 等,都有“有效案例”
while (low <= high) {
// ...
}
return -1; // not found
或 low > high
的“未找到”案例:
if (low > high) return -1; // not found
但是Programming Interviews Exposed这本书中的递归和迭代算法使用了low > high
(意思是 range < 0
)作为 BSException("Limits reversed")
和 low == high
检查“未找到”。现在,如果range
实际上小于 0,那么程序会抛出 BSException("Limits reversed")
的异常并且永远无法报告 NotFound。
考虑只有 2 个元素的数组的情况,或者 lower
和 upper
只包含 2 个元素,比如说
lower is 0
upper is 1
center is (1-0)/2 + 0 = 0
现在,假设target
小于 array[center]
, 然后 upper = center - 1
并且是 -1
, 而 lower
保持为 0
.所以我们有 upper < lower
含义 range < 0
但递归算法将其报告为 BSException("Limits reversed")
而不是 NotFound,而迭代没有看到 lower == upper
并进一步了解 upper
作为-1
并使用 array[upper]
并且有奇怪的行为?
最佳答案
二分查找的基本前提是一直计算到lower <= upper
为止。被满足。这意味着 ( upper-lower
) (在您的示例中是 range
)不能为负数。如果它是负数(upper
小于lower
)你停止处理并且return -1
指示Not found
或抛出 exception
(如您的示例所示)。
Limits Reversed 对调用者没有意义。因此,将其更改为抛出异常 Not found
.
if (range < 0 || (range == 0 && array[lower] != target)) {
throw new BSException("Element not in array");
}
但是,可能会出现此递归函数的调用者错误地互换了下层和上层的情况。在那种情况下,它会说 Not found
而不是 Limits reversed
但是,没关系。让调用者调查并找出他的代码中的错误。
关于java - 下面的二分查找代码是正确的还是不正确的? (来自 Programming Interviews Exposed 一书),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57340549/
给定一个匹配词“bad”和单词列表“bird”、“cat”、“mug”、“thug”、“irk”、“kin”、“in”、“mad”、“md”从单词列表中尝试形成匹配词。每次您在给定列表中使用单词时,您
我在面试中被问到一个面试问题,但我没有得到解决方案。 以下是示例段落,我们的程序应该给出数学单词的超链接 “网络协议(protocol)驱动程序 - 完全支持 Java 技术的网络协议(protoco
我是一名 CS 学生,大约一周前我买了破解编码面试。我只是在 Big O 章节,我发现了一种算法,据说可以对数字中的数字求和;乍一看,它看起来很困惑,所以我用 Python 运行了它,但它没有按预期运
这是一个我觉得很有趣的面试问题。 编写一个方法,将指向 Node 结构的指针作为参数,并返回传入数据结构的完整拷贝。 Node 结构包含两个指向其他 Node 结构的指针。例如,方法签名可能如下所示:
这是书中的代码 - “Programming Interviews Exposed”第 2 版 - 第 78 和 79 页- 删除指定字符练习(下续) void Main() { string
来自 Cracking the Coding Interview。问题 2.1:编写代码从未排序的链表中删除重复项。这是他们提供的解决方案: public static void removeDupl
我找到了这个问题的解决方案,但它需要 O(n^2)。有没有可能做得更好? 问题:假设我们想找 D 美元。我们有一个包含 N 个元素的数组 A。面额作为美元值存在于数组中,但我们事先不知道确切的面额。然
我正在尝试解决这个问题:https://www.interviewstreet.com/challenges/dashboard/#problem/4f9a33ec1b8ea 假设 A 是 n 个数字
我尝试使用 Cracking the coding interview 中的代码来运行反向字符串函数。我不知道代码是否错误或者我应该使用另一个 IDE(我为此使用了 Xcode 5.2)。我是 C 编
在 Cracking the coding interview 一书的第 259 页,给出了 C++ 中的模板化单例(我不想发布所有代码以防其版权)。 问题是将单例实现为模板,并假设有一个名为 Loc
书上二分查找的递归版本: int binarySearch(int[] array, int target) throws BSException { return int binarySearch(
我正在阅读“Cracking the Coding Interview”一书,在这里我遇到了一些寻求答案的问题,但我需要帮助来比较我的答案与解决方案。我的算法有效,但我很难理解书中的解决方案。主要是我
我正在尝试解决一个面试问题,这样给定的链表需要围绕一个值“x”进行分区。我尝试了一下,但没有得到想要的结果。 class Node(object): def __init__(self, va
You have a stack of n boxes, with widths wi, heights hi, and depths di. The boxes cannot be rotated
You have two very large trees: T1, with millions of nodes, and T2, with hundreds of nodes. Create an
此问题来自 Cracking the Coding Interview 第 6 版,问题 V1.11。 The following code prints all strings of length
页。 Programming interviews exposed book的29有如下示例代码,用于从链表中删除一个元素: bool deleteElement(IntElement **head,
上页。 Cracking the Coding Interview 的 44,有如下算法: int f(int n) { if (n <= 1) { return 1;
假设有一个整数 vector 。现在我们想要合并,我们选择 2 个相邻元素 v[I] 和 v[I+1](对于每个有效的 I)并执行 v[I] = v[I+1] + v[I]。并删除 v[I+1]。继续
我在求职面试中被问到以下问题。 给定一个大小未知的输入数组,开头全为 1,结尾全为 0。从 0 开始查找数组中的索引。考虑数组中有数百万个 1 和 0。即数组非常大......例如数组内容 11111
我是一名优秀的程序员,十分优秀!