【问题标题】:Does hash_map automatically sort [C++]?hash_map 是否自动排序 [C++]?
【发布时间】:2010-10-05 15:55:18
【问题描述】:

在下面的代码中,hash_map 会自动排序或按排序顺序插入元素。任何想法为什么它会这样做?请给点建议?? 这不是作业问题,试图解决 glassdoor dot com 上发布的面试问题。

#include <iostream>
#include <vector>
#include <ext/hash_map>
#include <map>
#include <string.h>
#include <sstream>

using namespace __gnu_cxx;
using namespace std;

struct eqstr
{
  bool operator()(int i, int j) const
  {
    return i==j;
  }
};
typedef hash_map<int, int, hash<int>, eqstr> myHash;
int main()
{
    myHash array;
    int inputArr[20] = {1,43,4,5,6,17,12,163,15,16,7,18,19,20,122,124,125,126,128,100};

    for(int i=0;i<20;i++){
        array[inputArr[i]] = inputArr[i]; //save value
    }
    myHash::iterator it = array.begin();
    int data;
    for (; it != array.end(); ++it) {
        data =  it->first;
        cout << ":: " << data;
    }
}

//!Output ::: 1:: 4:: 5:: 6:: 7:: 12:: 15:: 16:: 17:: 18:: 19:: 20:: 43:: 100:: 122:: 124:: 125:: 126:: 128:: 163

【问题讨论】:

  • operator() 没有实现为return i == j; 的任何原因?
  • hash_map 不是标准 C++。 C++0x 等价物是unordered_map。这意味着没有标准的 C++ 要求,完全取决于实现。那么...您使用的是什么平台,hash_map 的实现是什么?
  • ubuntu 10.04,stl 实现。谢谢大卫
  • 嘿 Arun.. 没有任何具体原因。我只是使用了来自 STL::hash_map 实现的相同代码.. 所以不想改变任何东西。
  • 谢谢阿伦..我的错..我没有注意我在那里做什么。

标签: c++ hashmap


【解决方案1】:

哈希图不会自动排序您的数据。事实上,顺序是未指定的,具体取决于您的哈希函数和输入顺序。只是在你的情况下,数字是经过排序的。

您可能想了解hash table,了解此容器如何存储数据。

可以通过将 100 替换为 999999999 来创建一个清晰的反例。结果是

:: 1:: 4:: 5:: 6:: 7:: 12:: 15:: 16:: 17:: 18:: 19:: 20:: 999999999:: 43:: 122:: 124:: 125:: 126:: 128:: 163

(实际原因是hash_map的bucket_count是193,而int的hash函数是恒等函数,所以193以下的数字都会出现排序。)

【讨论】:

  • 谢谢肯尼。正是我试图理解的。 :D
  • 你知道是否有一种方法可以将随机未排序的数字插入哈希中并以复杂度 O(n) 的排序顺序检索它们?
  • @reddy:使用计数排序或基数排序。
【解决方案2】:

哈希映射可能看起来根据几个因素进行排序:

  • 对于您提供的输入范围,哈希函数返回与输入顺序相同的值。
  • 没有哈希冲突。

不能保证结果会被排序,如果结果是这样的,那只是巧合。

【讨论】:

    【解决方案3】:

    想想哈希函数是如何运作的。散列始终是一个函数f:input->output,它将输入集 I 映射到(通常较小的)输出集 O,以便输入集大致均匀分布在输出集上。 p>

    没有要求应该保留订单;事实上,它会被保留是不寻常的,因为(因为输出集更小)会有值 *i,j* 具有相同的哈希值。这称为碰撞

    另一方面,没有理由不应该这样做。事实上,可以证明总会存在至少一个保持顺序的序列。

    但还有另一种可能性:如果所有值都发生冲突,那么它们会存储在某种其他类型的数据结构中,例如列表。可能这些都发生了冲突,而另一个结构强加了秩序。

    三种可能性:hash_map 恰好对该特定序列进行排序,或者 hash_map 实际上被隐含为一个数组,或者值发生冲突并且实现以一种提供排序顺序的方式存储冲突。

    【讨论】:

      猜你喜欢
      • 2011-08-27
      • 1970-01-01
      • 2013-06-23
      • 2011-08-08
      • 2013-11-11
      • 2019-01-28
      • 1970-01-01
      • 2011-01-08
      相关资源
      最近更新 更多