C++ BinarySearch返回它所属位置的索引
因此,我希望编写一个代码来返回键所在的索引,或者如果它不在那里,则返回它应该在哪里。我错过了什么? 最小值为0,最大值为大小-1,buf已排序C++ BinarySearch返回它所属位置的索引,c++,sorting,binary-search-tree,C++,Sorting,Binary Search Tree,因此,我希望编写一个代码来返回键所在的索引,或者如果它不在那里,则返回它应该在哪里。我错过了什么? 最小值为0,最大值为大小-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; e
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;
}
int-binarySearch(字符串buf[],字符串键,int-min,int-max){
int mid;
而(最大值>=最小值){
中间=(最小+最大)/2;
if(buf[mid]<键)
最小值=中间值+1;
否则如果(buf[mid]>键)
max=mid-1;
其他的
中途返回;
}
返回最小值;
}
您搜索了一个字符,并假设buf中的字符已排序
如果要搜索字符串,请使用字符串匹配模式算法。
()
如果要搜索有序数组中的字符或数字,请参见以下内容:
在二进制搜索中,您可以执行值类型搜索,而不是引用类型。如果您想在字符串数组中搜索字符串,您必须编写一个复杂的程序或使用has table这似乎是可行的:
#include <iostream>
#include <cassert>
int binarySearch(int buf[], int key, int min, int max);
int main()
{
int data[] = {1,2,4,6,7,9};
for(int i=0; i<6; i++)
{
int result = binarySearch(data, data[i], 0, 5);
assert(result == i);
}
assert(binarySearch(data, 3, 0, 5) == 1);
assert(binarySearch(data, 5, 0, 5) == 2);
assert(binarySearch(data, 8, 0, 5) == 4);
assert(binarySearch(data, 10, 0, 5) == 5);
return 0;
}
int binarySearch(int buf[], int 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 std::min(min, max);
}
#包括
#包括
int-binarySearch(int-buf[],int-key,int-min,int-max);
int main()
{
int data[]={1,2,4,6,7,9};
对于(int i=0;i=min){
中间=(最小+最大)/2;
if(buf[mid]<键)
最小值=中间值+1;
否则如果(buf[mid]>键)
max=mid-1;
其他的
中途返回;
}
返回标准::最小值(最小值,最大值);
}
我实际上也遇到了同样的问题,所以我编写了这段通用代码(也许你想使用不同于std;)下面的代码将迭代器返回到序列中小于或等于val的最大元素。它使用O(N log N)时间表示N=std::difference(first,last),假设在[第一……最后)
#包括
#包括
#包括
该代码非常通用,它接受std::vectors、std::array和array,或者任何允许随机访问的序列。假设(读取前提条件)是val>=*first,值[first,last]被排序,就像std::binary_搜索所需的那样
请随意提及我使用过的错误或弊端。int binary\u srch\u ret\u index(ll inp[MAXSIZE],ll e,int low,int high){
int binary_srch_ret_index(ll inp[MAXSIZE], ll e, int low, int high) {
if (low > high) {
return -1;
}
int mid = (low + high) / 2;
if (e == inp[mid]) {
return mid;
}
if (e < inp[mid]) {
return binary_srch(inp, e, low, mid - 1);
} else {
return binary_srch(inp, e, mid + 1, high);
}
}
如果(低>高){
返回-1;
}
int mid=(低+高)/2;
如果(e==inp[mid]){
中途返回;
}
if(e
是的,它不起作用,当字符串不存在时,它不会返回正确的索引。如果字符串不存在,则没有“正确”索引。您计划如何准确地传播信息,即返回的索引是“应该”的位置还是“应该”的位置?通过索引取消引用并进行比较?这可以让你…?这个问题的臭味几乎压倒一切。也就是说,你可以用大约3行代码(大致)轻松做到这一点.True进行二进制搜索同样便宜,如果不存在,则进行线性插入,因为无论如何都需要将所有元素移动到正确的位置。long idx=(std::lower_bound(buf+min,buf+max+1,key)-buf);
应该这样做。这个二进制搜索由另外两种方法使用:find和insert。insert调用binarysearch,索引总是重复的索引或插入字符串以保持列表排序的地址。要查找,只需检查buf[index]==我们正在查找的字符串。该函数需要返回比较键应放置的索引,而不仅仅是查找其是否在其中。因此,无法返回-1将修复,请给我几秒钟时间。此外,这些测试至少通过了。添加了一个-3测试,返回-1,这样看起来也可以。它返回的索引号是它应该在后面的数字,或者这个数字。由于某种原因,它仍然不能正常工作。谢谢你的帮助,我相信你能做到。这只是一个逻辑错误,我无法正确地得到算法。