【发布时间】:2013-10-26 07:07:11
【问题描述】:
所以我希望编写一个代码来返回键所在的索引,或者如果它不存在,它应该在哪里。我错过了什么? min 为 0,max 为 size - 1,buf 已排序
int binarySearch(string buf[], string key, int min, int max){
int mid;
while (max >= min){
mid = (min + max) / 2;
if (buf[mid] < key)
min = mid + 1;
else if (buf[mid] > key)
max = mid - 1;
else
return mid;
}
return min;
}
【问题讨论】:
-
是的,它不起作用,当字符串不存在时它不会返回正确的索引。
-
如果字符串不存在,则没有“正确”索引。您究竟打算如何传播返回的索引“应该”在哪里与它“在”哪里的信息?通过该索引取消引用并进行比较?那买你...?这个问题的臭味几乎像an XY problem 一样强烈。也就是说,您可以使用
std::lower_bound轻松完成此操作,只需大约 3 行代码(大约)。 -
确实,进行二分搜索同样便宜,如果不存在,则进行线性插入,因为无论如何您都需要移动所有元素以使其进入正确的位置。
-
long idx = (std::lower_bound(buf+min, buf+max+1, key) - buf);应该这样做。 -
好吧,这种二分搜索被另外两种方法使用:查找和插入。 insert 调用 binarysearch 并且索引始终是重复的索引或应插入字符串以保持列表排序的地址。对于查找,您只需检查 buf[index] == 我们正在寻找的字符串。
标签: c++ sorting binary-search-tree