Как я могу рассчитать размер unordered_map для идеального начального числа хеш-функции?

Я хочу добиться идеального хеширования с неупорядоченной картой. У меня есть набор известной во время компиляции строки, которая сопоставляется с чем-то. Я хочу создать идеальные хэш-функции для них. Я понял, что если я выберу размер unordered_map в 3 раза больше, чем размер известного набора строк, я смог найти для него идеальную хеш-функцию (т.е. начальное число). Я хочу минимизировать это число. И связанный вопрос, правда ли, что если я использую большую неупорядоченную карту, я получу более быструю?

Я играл с функциями Google CityHash:
http://code.google.com/p/cityhash/

#include <sstream>
#include <iostream>
#include <string>
#include <unordered_map>
#include <city.h>

unsigned seed = 0;
const unsigned numberOfTestData = 100;
const unsigned sizeOfPreallocatedMap = 3 * numberOfTestData; // what is the minimum value of this
const unsigned chanceToFindPerfectHashFnSeed = 10000; // in number of iterations
bool foundPerfectHashSeed = false;

int minCollisionCount = 999;

class CityHash {
public:
uint64 operator()(const std::string& s) const {
//  return CityHash64(s.c_str(), s.size());
return CityHash64WithSeed(s.c_str(), s.size(), seed);
}
};
class StringEqual {
public:
bool operator()(const std::string& left, const std::string& right) const {
return left == right;
}
};
template<typename T>
void mapTester(T& map)
{
for (unsigned i = 0; i < numberOfTestData; ++i) {
std::stringstream ss;
ss << "TestData_" << i;
map[ss.str()] = i;
}

int collisionCount = 0;
unsigned maxBucketSize = 0;
for (size_t i = 0; i < map.bucket_count(); ++i) {
if (map.bucket_size(i) > 1) {
collisionCount++;
if (maxBucketSize <= map.bucket_size(i))
maxBucketSize = map.bucket_size(i);
}
}
if (collisionCount < minCollisionCount) {
minCollisionCount = collisionCount;
std::cout << maxBucketSize << " collision count is " << collisionCount << " with seed " << seed << std::endl;
}
if (maxBucketSize == 0 && collisionCount == 0)
foundPerfectHashSeed = true;
}

int main() {
std::unordered_map<std::string, int> map;
mapTester(map);
for (; seed < chanceToFindPerfectHashFnSeed; ++seed) {
if (foundPerfectHashSeed)
break;
std::unordered_map<std::string, int, CityHash, StringEqual> cityMap(sizeOfPreallocatedMap);
mapTester(cityMap);
}
std::cout << (foundPerfectHashSeed ? "Found!" : "Not found!")  << std::endl;

return 0;
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]