我很难通过下面的递归binarySearch函数找出如何返回数组中项的索引:
uint64_t
要求是使用函数头编写BS函数,而不是修改它。我的函数工作正常,但是,当我通过每个递归级别修改数组时,我丢失了原始索引。我们还需要返回我们正在搜索的项目的索引。我的实现将始终返回1.
是否可以在不创建其他方法的情况下执行此操作并从binarySearch函数中调用它?
答案 0 :(得分:0)
因此,经过几乎整个300个学生班的困惑,老师在讲座中解释了这一点并解释说我们实际上可以创建另一个功能来处理我们需要的任何东西(在这种情况下的位置)。
所以我所做的只是编写一个正常的递归二进制搜索实现,并从教授要求包含的函数中调用它。
public static <AnyType extends Comparable<AnyType>> int binarySearch
(AnyType[] a, AnyType x)
{
return binarySearch(a, x, 0, a.length);
}
public static <AnyType extends Comparable<AnyType>> int binarySearch
(AnyType[] a, AnyType x, int nMin, int nMax)
{
if(nMin < nMax)
{
int nMid = nMin + (nMax - nMin) / 2;
if(x.comapreTo(a[nMid]) == -1)
return binarySearch(a, x, nMin, nMid);
else if(x.compareTo(a[nMid]) == 1)
return binarySearch(a, x, nMid+1, nMin);
else
return nMid;
}
rteurn -(nMin + 1);
}
此外,作为旁注,我认为我原来的问题措辞不够。我不是在寻找问题的解决方案,我或多或少都在寻找确认,认为这个问题是不可能的。
答案 1 :(得分:-1)
通过在每次递归时复制数组进行递归搜索对性能不利。
在递归时传递整个数组,并附加其他范围值,即要处理的开始/结束索引。
这更快,并且还允许您立即知道找到的元素的实际索引,因为索引值不变。
<强>更新强>
如果无法更改方法签名,则需要进行一些更改:
int compare = a[nMid].compareTo(x); if(compare == 0) return 1;
如果索引nMid
处的元素相等,则 是要返回的索引,而不是1
。
else if(compare == 1) return binarySearch(Arrays.copyOfRange(a, 0, a.length/2), x);
compareTo()
会返回一个&#34;正整数&#34;,不一定是1
,因此测试应为compare > 0
。
此外,由于else
具有无条件if
,因此无需return
部分。
else return binarySearch(Arrays.copyOfRange(a, a.length/2, nMax), x);
首先,copyOfRange()
的最后一个参数是独占的,因此它必须是a.length
,而不是nMax
。
由于递归调用是在一个不是从0开始的范围内传递的,因此返回的任何索引值都必须是偏移的,即return binarySearch(...) + a.length/2
。
同样,不需要else
。
另外以上所有内容,如果该值不存在,代码最终会失败,因为copyOfRange()
将创建一个空数组,并且代码不会处理该问题,导致值a[nMid]
的{{1}}抛出0
。需要添加代码来处理它。