您的位置:首页 > 理论基础 > 数据结构算法

算法导论 完全散列

2017-03-23 00:42 281 查看
#include<iostream>
#include<ctime>
#include<stdlib.h>
#include<vector>

using namespace std;

//二次散列表

struct Node {//位置信息
int m, n;
Node(int m, int n) {
this->m = m;
this->n = n;
}
};

class HashTable {
public:

int *S;
int m;
void HashTable_Create(int num,int p);//构造函数
~HashTable();//析构函数
int h(int k,int p);
private:
int a, b;

};

void HashTable::HashTable_Create(int num,int p) {
m = num;
S = new int[m];
if (m != 1) {
a = (rand() % (p - 1)) + 1;
b = rand() % p;
}
else {
a = 0;
b = 0;
}
}

HashTable::~HashTable() {
delete[]S;
}

int HashTable::h(int k,int p) {
if (m != 1) {
int locate = ((a*k + b) % p) % m;
return locate;
} else{
return 0;
}
}

bool Prime(int x) {
int y;
for (y = 2; y <= sqrt(x); y++)
if (x%y == 0)
return false;
return true;
}

//寻找最大素数
int MaxPrime(vector<int> &G) {
int length = G.size();
int Max = G[0];//求G中的最大数
for (int i = 1; i < length; i++) {
if (Max < G[i]) {
Max = G[i];
}
}
//求最小素数
if (Prime(Max)) {
return Max;
}
else {
do {
Max++;
} while (Prime(Max)==false);
}
return Max;
}

//输入数据
void Init(vector<int> &G,int n) {
int a;
for (int i = 0; i < n; i++) {
cin >> a;
G.push_back(a);
}
}

//初始化
void InitA(int *A) {
for (int i = 0; i < 100; i++) {
A[i] = 0;
}
}

//插入数据
HashTable *Hash_Insert(vector<int> &G) {
int m = G.size();
int p = MaxPrime(G);
int A[100];//存放每个槽中的数据个数
InitA(A);
int a = (rand() % (p - 1)) + 1;
int b = rand() % p;
int B[100];
//int locate = ((a*k + b) % p) % m;
for (int i = 0; i < m; i++) {
B[i] = ((a*G[i] + b) % p) % m;
A[B[i]]++;
}

HashTable *head = new HashTable[m];
for (int j = 0; j < m; j++) {
if (A[j] != 0) {
head[j].HashTable_Create(A[j],p);
}
}

for (int k = 0; k < m; k++) {
int count=head[B[k]].h(G[k], p);
head[B[k]].S[count] = G[k];
}
return head;
}

Node *Hash_Search(HashTable *head,int k,vector<int> &G) {
int size = G.size();
for (int i = 0; i < size; i++) {
for (int j = 0;j<head[i].m; j++) {
if (head[i].S[j] == k) {
return new Node(i, j);
}
}
}
}

int main() {
srand((unsigned)time(NULL));
Node *node;
int k, n;
vector<int> G;
cin >> n;
Init(G,n);
HashTable *head = Hash_Insert(G);
cin >> k;
node=Hash_Search(head, k, G);
cout << node->m << " "<<node->n<<endl;
system("pause");
return 0;
}












                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息