二进制搜索以确定将值放置在何处 我编写C++代码来使用各种技术(数组、二进制树等)来实现哈希图。我在按数组实现时遇到了困难。我需要一种方法来确定在何处放置新哈希,以便在放置数组后对其进行排序。我的想法是使用二进制搜索来确定放置新哈希的索引,然后推送所有其他元素

二进制搜索以确定将值放置在何处 我编写C++代码来使用各种技术(数组、二进制树等)来实现哈希图。我在按数组实现时遇到了困难。我需要一种方法来确定在何处放置新哈希,以便在放置数组后对其进行排序。我的想法是使用二进制搜索来确定放置新哈希的索引,然后推送所有其他元素,c++,arrays,hash,binary-search-tree,C++,Arrays,Hash,Binary Search Tree,我对这个函数有问题。它应该有这样的原型: int WhereToPlaceHash(HashType hash); // uses private atribute ValueType** values int WhereToPlaceHash(int hash) { int imin = 0, imax = YourSizeOfArray; int imid = 0; while (imax >= imin) { imid = (imax + imin

我对这个函数有问题。它应该有这样的原型:

int WhereToPlaceHash(HashType hash); // uses private atribute ValueType** values
int WhereToPlaceHash(int hash) {
    int imin = 0, imax = YourSizeOfArray;
    int imid = 0;

  while (imax >= imin) {
      imid = (imax + imin) / 2;

      if(YourArray[imid] == hash)
        return imid + 1; 
      else if (YourArray[imid] < hash)
        break;
      else         
        imax = imid - 1;
    }

  return imid;
}

我已经尽力编写了这个函数,但是我所有的尝试都导致了无限循环,并且从数组中读取了无效的位置。请提供帮助。

通常哈希用作数组的索引。此外,当使用散列时,您可能会得到一个按散列排序的数组,而不是按键排序的数组(尽管这有点明显)。如果您真的想在排序数组中找到键的位置,可以使用
std::lower_-bound()


返回迭代器
pos
将指向第一个位置,以便
!(键<*pos)

您正在实现一个不同实现类型的

映射包含一个键和值对-您只有一个键-因此它是一个

散列表示不同的内容-它们是无序的,使用散列函数为具有相同散列的所有项目的列表选择一个bucket,称为冲突(一些变体使用其他方案来处理冲突)。这在STL中实现为
std::unordered_set
std::unordered_map

对于已排序的数组实现,请使用保存在已排序数组中的数组,然后执行一次插入操作,该操作必须将所有项移得更大,以保持排序顺序。然后,您的查找将进行二进制搜索

插入将使用二进制搜索查找项目的放置位置,然后移动所有大于该位置的项目

二进制搜索从中间开始,然后重复检查(低+中)/2(如果更低)或(中+高)/2(如果更大),直到找到位置

注意:您必须区分已找到和未找到

int binsearch(int * array, int len, int value, bool * found)
{
    // return lowest position greater or equal to value

    int lowp=0;
    int highp=len-1;
    int midp=(lowp+highp)/2;

    while (lowp <=highp)
    {
        int mid=array[midp];
        if (mid > value)
        {
            highp=midp-1;
        }
        else if (value==mid)
        {
            *found=true;
            return midp; // found at this position
        }
        else
        {
            lowp=midp+1;
        }
        midp=(lowp+highp)/2;
    }
    *found=false;
    if (array[midp] > value)
    {
        return midp;  // only at position 0 for a head insert
    }
    return midp+1; // not found - position to start shift
}

int main(int, char**)
{
    int array[]={2,4,6,8,10,12,14,16,18,20};

    bool found;

    for (int search=1; search < 22; ++search)
    {
        int a=binsearch(array, 10, search, &found);

        std::cout << search << " at " << a << ":" << found << std::endl;
    }

    return 0;
}
int-bin搜索(int*array、int-len、int-value、bool*found)
{
//返回大于或等于值的最低位置
int-lowp=0;
int-highp=len-1;
int midp=(低+高)/2;
while(低值)
{
highp=midp-1;
}
else if(值==中间值)
{
*发现=真;
return midp;//在该位置找到
}
其他的
{
lowp=midp+1;
}
midp=(低p+高p)/2;
}
*发现=错误;
if(数组[midp]>值)
{
返回midp;//仅在头插入的位置0处
}
返回midp+1;//未找到-开始换档的位置
}
int main(int,char**)
{
int数组[]={2,4,6,8,10,12,14,16,18,20};
布尔发现;
for(int search=1;search<22;++search)
{
int a=bin搜索(数组、10、搜索和查找);
std::cout仔细阅读以下内容:

试着这样做:

int WhereToPlaceHash(HashType hash); // uses private atribute ValueType** values
int WhereToPlaceHash(int hash) {
    int imin = 0, imax = YourSizeOfArray;
    int imid = 0;

  while (imax >= imin) {
      imid = (imax + imin) / 2;

      if(YourArray[imid] == hash)
        return imid + 1; 
      else if (YourArray[imid] < hash)
        break;
      else         
        imax = imid - 1;
    }

  return imid;
}
int-WhereToPlaceHash(int-hash){
int imin=0,imax=YourSizeOfArray;
int-imid=0;
而(imax>=imin){
imid=(imax+imin)/2;
if(yourray[imid]==散列)
返回imid+1;
else if(yourray[imid]
我无法理解您的问题,在哈希表中,您不需要“搜索”对于一个值,您只需使用一些散列函数计算索引,然后对数组的大小进行模化,值应该在那里。如果两个值散列到同一个索引,您可以在该索引中放置一个链接列表。我还没有使用任何散列函数。只需简单的索引搜索。问题实际上是如何确定在何处放置新的v排序数组中的值(使用bin搜索)。如果您在编写此函数时尽了最大努力,我们将更容易了解您当前的思路。“使用各种技术实现哈希映射”-根据定义,哈希映射是通过哈希表实现的。映射的抽象数据类型可以通过多种方式实现,但哈希映射是一个哈希表。问题实际上是如何确定在排序数组中放置新值的位置(使用bin search)。很抱歉,特此声明。