Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ BinarySearch返回它所属位置的索引_C++_Sorting_Binary Search Tree - Fatal编程技术网

C++ BinarySearch返回它所属位置的索引

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

因此,我希望编写一个代码来返回键所在的索引,或者如果它不在那里,则返回它应该在哪里。我错过了什么? 最小值为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;
    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,这样看起来也可以。它返回的索引号是它应该在后面的数字,或者这个数字。由于某种原因,它仍然不能正常工作。谢谢你的帮助,我相信你能做到。这只是一个逻辑错误,我无法正确地得到算法。