相关疑难解决方法(0)

92
推荐指数
7
解决办法
10万
查看次数

boost :: hash_combine中的幻数

所述boost::hash_combine模板函数采用一个散列(称为参考seed)和对象v.根据文档,它结合seedvby 的哈希

seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
Run Code Online (Sandbox Code Playgroud)

我可以看出这是确定性的.我明白为什么要使用XOR.

我敢打赌,这个加法有助于将相似的值广泛分开,因此探测哈希表不会崩溃,但有人可以解释这个神奇常数是什么吗?

c++ algorithm hash boost magic-numbers

86
推荐指数
2
解决办法
2万
查看次数

如何在C++ 0x中组合哈希值?

C++ 0x添加hash<...>(...).

我找不到一个hash_combine函数,如boost中所示.实现这样的事最简洁的方法是什么?也许,使用C++ 0x xor_combine

c++ hash boost std c++11

78
推荐指数
6
解决办法
3万
查看次数

在C++中创建稀疏数组的最佳方法是什么?

我正在研究一个需要操纵巨大矩阵的项目,特别是用于copula计算的金字塔总和.

简而言之,我需要在矩阵(多维数组)中的零海中跟踪相对较少数量的值(通常值为1,在极少数情况下大于1).

稀疏数组允许用户存储少量值,并假设所有未定义的记录都是预设值.由于实际上不可能将所有值存储在内存中,因此我只需要存储少数非零元素.这可能是数百万条目.

速度是一个重中之重,我还想在运行时动态选择类中的变量数.

我目前正在使用二进制搜索树(b-tree)来存储条目的系统.有谁知道更好的系统?

c++ oop hash maps data-structures

50
推荐指数
5
解决办法
4万
查看次数

向量的良好散列函数

我有一些整数向量,我想在c ++ 11中的unordered_map中高效存储我的问题是:

如何最好地存储这些并优化.find查询?

我想出了以下的哈希:

class uint32_vector_hasher {
public:
  std::size_t operator()(std::vector<uint32_t> const& vec) const {
    std::size_t ret = 0;
    for(auto& i : vec) {
      ret ^= std::hash<uint32_t>()(i);
    }
    return ret;
  }
};
Run Code Online (Sandbox Code Playgroud)

然后将对象存储在unordered_mapI中然而有几个问题

  1. 哈希计算的频率是多少,只有一个,一些随机数或一些?
  2. 是否有意义创建一个包含==和哈希函数的包装器对象来记忆哈希并避免多次计算?

在进行性能分析时,我注意到我的cpu时间相当大,花费在无序地图上进行查找,这不是最佳的:(

c++ hash c++11

21
推荐指数
3
解决办法
2万
查看次数

如何用64位输出创建一个好的hash_combine(灵感来自boost :: hash_combine)

目前Boost具有hash_combine函数,该函数输出32位无符号整数(确切地说,size_t).一些参考:

http://www.boost.org/doc/libs/1_43_0/doc/html/hash/reference.html#boost.hash_combine

http://www.boost.org/doc/libs/1_43_0/doc/html/hash/combine.html

boost :: hash_combine中的幻数

我想探讨如何创建64位版本的hash_combine.

第一件事是获得64位的黄金比例或任何其他无理数.

第二部分是使用轮班.这部分相当棘手,我想询问是否有最佳实践或指导使用转移来获取哈希值?或者像原始代码一样选择班次:

seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); 
Run Code Online (Sandbox Code Playgroud)

是随机的?

另外如何评估输出hash_combine以确保它不会产生比原始哈希函数更多的冲突hash_value

c++ hash boost

8
推荐指数
1
解决办法
4496
查看次数

__uint128_t 的 std::hash

我面临着散列问题__uint128_t。以下是我的代码:

\n
#include <iostream>\n\nint main () {\n    __uint128_t var = 1;\n    std::cout << std::hash<__uint128_t> () (var) << "\\n";\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我收到的错误如下:

\n
test.cpp: In function \xe2\x80\x98int main()\xe2\x80\x99:\ntest.cpp:5:40: error: use of deleted function \xe2\x80\x98std::hash<__int128 unsigned>::hash()\xe2\x80\x99\n    5 |     size_t h = std::hash<__uint128_t> () (var);\n      |                                        ^\n
Run Code Online (Sandbox Code Playgroud)\n

我如何获得 的哈希值__uint128_t?(可能是一个非常基本的问题,但我已经被困在这里一段时间了)。另外,我想知道这个错误的含义。提前致谢。

\n

c++ c++11

2
推荐指数
1
解决办法
1212
查看次数

如果我已经“处理”了一个对象,std::unordered_map 是否适合记录?

我有一个名为 Col 的结构:

struct Col
{
   Object* o1;
   Object* o2;
   Object* o3;

   bool operator==(const Col &other) const
   { 
       return o1 == o1 && o2 == o2 && o3 == o3;
   }
};
Run Code Online (Sandbox Code Playgroud)

我对此定义了一个哈希:

template <>
struct std::hash<Col>
{
  std::size_t operator()(const Col& k) const
  {
    using std::size_t;

    std::hash<void> void_hash;

    std::size_t res = void_hash(k.o1) + void_hash(k.o2) + void_hash(k.o3;

    return res;
  }
};
Run Code Online (Sandbox Code Playgroud)

然后,我有很多包含重复项std::vectorCol对象(根据我对相等的定义),并且我希望仅“处理”每个唯一元素一次。

这就是我所做的:

std::unordered_map<Col, bool> done_list;

for (Col c : col_list)
{
    if (done_list.find(c) == done_list.end())
    { …
Run Code Online (Sandbox Code Playgroud)

c++

1
推荐指数
1
解决办法
121
查看次数

标签 统计

c++ ×7

hash ×6

boost ×3

c++11 ×3

algorithm ×2

c ×1

data-structures ×1

magic-numbers ×1

maps ×1

oop ×1

std ×1