Advertisement
Guest User

Untitled

a guest
Dec 24th, 2010
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.68 KB | None | 0 0
  1. // 03.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <vector>
  7. #include <algorithm>
  8. #include <fstream>
  9.  
  10. using std::cout;
  11. using std::cin;
  12. using std::endl;
  13. using std::vector;
  14. using std::ofstream;
  15.  
  16. void ReadInputValues(vector<int> *values)
  17.     {
  18.     int count;
  19.     cin>>count;
  20.     values->resize(count);
  21.     for(int i = 0; i < count; ++i) {
  22.         scanf("%d",&(*values)[i]);
  23.         }
  24.     }
  25.  
  26. void ReadInputQuestions(vector<int> *questions) {
  27.     int count;
  28.     cin>>count;
  29.     questions->resize(count);
  30.     for(int i=0;i<count;++i) {
  31.         scanf("%d", &(*questions)[i]);
  32.         }
  33.     }
  34.  
  35. class FixedSet {
  36. private:
  37.     struct HashFunctionParameters {
  38.      int a;
  39.      int b;
  40.     };
  41.  
  42.     vector<vector<int> > hashTable;
  43.     vector<HashFunctionParameters> secondLevelParameters;
  44.     HashFunctionParameters firstLevelParameters;
  45.  
  46.     void InitializeFirstLevelHashFunction(const vector<int> &values);
  47.     void InitializeSecondLevelHashFunctions();
  48.  
  49.     //((ax+b)mod p)mod n
  50.     static unsigned int UniversalHashFunction( int x, const HashFunctionParameters& parameters,  int primeNumber,  int elementCount);
  51.     static void GetHashFunctionParameters(HashFunctionParameters *parameters,  int primeNumber);
  52. public:
  53.     static const int PRIME_NUMBER = 2147000041;
  54.     static const int OUT_OF_RANGE_VALUE = 1000000001;
  55.     static const int LINEAR_MEMORY_COEFFICIENT = 4;
  56.  
  57.     void Initialize(const vector< int> &values);
  58.     bool Contains( int value) const;
  59.     };
  60.  
  61. unsigned int FixedSet::UniversalHashFunction( int x, const HashFunctionParameters& parameters,  int primeNumber,  int elementCount) {
  62.     long long primeNumberRemainder = (static_cast<long long>(parameters.a) * x + parameters.b) % primeNumber;
  63.     primeNumberRemainder = primeNumberRemainder < 0 ? (primeNumberRemainder + primeNumber) : primeNumberRemainder;
  64.     return primeNumberRemainder % elementCount;
  65.     }
  66.  
  67. void FixedSet::GetHashFunctionParameters(HashFunctionParameters *parameters,  int primeNumber) {
  68.     parameters->a = rand();
  69.     parameters->a <<= 16;
  70.     parameters->a |= rand();
  71.     parameters->a &= ((unsigned int)(-1) >> 1);
  72.     parameters->a %= primeNumber - 1;
  73.     parameters->a += 1;
  74.  
  75.     parameters->b = rand();
  76.     parameters->b <<= 16;
  77.     parameters->b |= rand();
  78.     parameters->b &= ((unsigned int)(-1) >> 1);
  79.     parameters->b %= primeNumber;
  80.     }
  81.  
  82. void FixedSet::InitializeFirstLevelHashFunction(const vector<int> &values) {
  83.     //looking for the first level hash function
  84.     long long sum = 0;
  85.     do {
  86.         for(vector<vector<int> >::iterator iter = hashTable.begin(); iter != hashTable.end(); ++iter) {
  87.             (*iter).resize(0);
  88.             }
  89.         GetHashFunctionParameters(&firstLevelParameters, PRIME_NUMBER);
  90.         for(vector<int>::const_iterator iter = values.begin(); iter!=values.end(); ++iter) {
  91.             size_t index = UniversalHashFunction(*iter, firstLevelParameters, PRIME_NUMBER, values.size());
  92.             hashTable[index].push_back(*iter);
  93.             }
  94.         sum = 0;
  95.         for(vector<vector<int> >::const_iterator iter = hashTable.begin();iter != hashTable.end(); ++iter) {
  96.             sum += static_cast<long long>((*iter).size()) * (*iter).size();
  97.             }
  98.         } while(sum > LINEAR_MEMORY_COEFFICIENT * values.size());
  99.     }
  100.  
  101. void FixedSet::InitializeSecondLevelHashFunctions() {
  102.     //second level hash functions
  103.     vector<HashFunctionParameters>::iterator hashParametersIterator = secondLevelParameters.begin();
  104.     vector<vector<int> >::iterator hashTableIterator = hashTable.begin();
  105.     for(; hashTableIterator != hashTable.end() && hashParametersIterator != secondLevelParameters.end(); ++hashTableIterator, ++hashParametersIterator) {
  106.         vector< int> bucketCopy;
  107.         HashFunctionParameters params;
  108.         bucketCopy.resize((*hashTableIterator).size() * (*hashTableIterator).size());
  109.        
  110.         bool collisionsExist;
  111.         do {
  112.             collisionsExist = false;
  113.             fill(bucketCopy.begin(), bucketCopy.end(), OUT_OF_RANGE_VALUE);
  114.             GetHashFunctionParameters(&params, PRIME_NUMBER);
  115.             for(vector<int>::const_iterator bucketItem = bucketItem = (*hashTableIterator).begin(); bucketItem != (*hashTableIterator).end(); ++bucketItem) {
  116.                 size_t position = UniversalHashFunction(*bucketItem, params, PRIME_NUMBER, bucketCopy.size());
  117.                 if(bucketCopy[position] == OUT_OF_RANGE_VALUE) {
  118.                     bucketCopy[position] = *bucketItem;
  119.                     }
  120.                 else if(bucketCopy[position] != *bucketItem) {
  121.                     collisionsExist = true;
  122.                     break;
  123.                     }
  124.                 }
  125.             } while(collisionsExist);
  126.  
  127.         (*hashParametersIterator) = params;
  128.         (*hashTableIterator) = bucketCopy;
  129.         }
  130.     }
  131.  
  132. void FixedSet::Initialize(const vector< int> &values) {
  133.     hashTable.resize(values.size());
  134.     secondLevelParameters.resize(values.size());
  135.  
  136.     InitializeFirstLevelHashFunction(values);
  137.     InitializeSecondLevelHashFunctions();
  138.     }
  139.  
  140. bool FixedSet::Contains( int value) const {
  141.     size_t firstPos = UniversalHashFunction(value, firstLevelParameters, PRIME_NUMBER, hashTable.size());
  142.     if(hashTable[firstPos].size() == 0)
  143.         return false;
  144.     else
  145.         {
  146.         HashFunctionParameters ps = secondLevelParameters[firstPos];
  147.         size_t secondPos = UniversalHashFunction(value, ps, PRIME_NUMBER, hashTable[firstPos].size());
  148.         return hashTable[firstPos][secondPos] == value;
  149.         }
  150.     }
  151.  
  152. void FindNumbers(const FixedSet &set, const vector<int> &questions, vector<bool> *answers) {
  153.     answers->resize(questions.size());
  154.     vector<int>::const_iterator questionsIterator = questions.begin();
  155.     vector<bool>::iterator answersIterator = answers->begin();
  156.     for(; questionsIterator != questions.end() && answersIterator != answers->end(); ++questionsIterator, ++answersIterator) {
  157.         *answersIterator = set.Contains(*questionsIterator);
  158.         }
  159.     }
  160.  
  161. void PrintAnswers(const vector<bool> &answers) {
  162.     for(vector<bool>::const_iterator iter = answers.begin(); iter != answers.end(); ++iter) {
  163.         *iter ? printf("Yes\n") : printf("No\n");
  164.         }
  165.     }
  166.  
  167. int main()
  168. {
  169.     srand(239);
  170.    
  171.     vector<int> numbers;
  172.     vector<bool> answers;
  173.    
  174.     for(int i=0;i<<100000;++i)
  175.         {
  176.         numbers.push_back(i);
  177.         }
  178.    
  179.     FixedSet set;
  180.     set.Initialize(numbers);
  181.  
  182.     for(int i=0;i<100000;++i)
  183.         {
  184.         if(!set.Contains(i))
  185.             {
  186.             cout<<"error";
  187.             return 0;
  188.             }
  189.         }
  190.  
  191.     return 0;
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement