在很多情况下,我们需要实现一个符号表,里面保存我们用到的所有符号。每个符号有一个关键码key(不同符号的关键码也不同),其余部分可能非常庞大。换句话
说,符号表应该提供以下操作:
Search(T, k):查找关键码k是否在表中
Insert(T, x):把x添加到表中
Delete(T, x):从表中删除元素x
有时也把符号表称为"字典",它最经典的实现方法是哈希表。
哈希表的不同设计方法以及解决冲突的方法,我觉得单单看算法书或者数据结构上的书不是很好理解,但是结合具体的题目实例来看,就相当的具体与好理解,哈希表的思想就类似于我们平时用字典查英语单词,没有一个人会从第一页一页一页的去找,我们会以单词本身的每一个字母作为每次搜索的关键码,如apple这个单词,第一次,我们将厚厚的字典分为26个槽,槽'a',槽'b'....槽'z',我们翻到槽'a'的区域,然后又将该区域分为26个槽以此类推,当然这个思想跟准确对应的一种数据结构是Trie字典树,这也就是为什么说,字典树是一种特殊情况的哈希树的原因所在 !
字典树例子:http://www.cnblogs.com/liushang0419/archive/2011/05/17/2048321.html
POJ 2002 题目报告
http://poj.org/problem?id=2002
/*开散列的方法建立HASH表并查询
该题目的思路较为简单,就是枚举没两个点,即枚举每一条边,查询以改边
构成的正方形的另两个点是否在HASH表中即可
如果以A(x1,y1)和B(x2,y2)为边进行正方形的查询,那么根据平面几何的
知识得之,另条边的两个点分别有两组,分别是:
C(x1+y1-y2,y1+x2-x1),D(x2+y1-y2,y2+x2-x1)
C(x1-y1+y2,y1-x2+x1),D(x2-y1+y2,y2-x2+x1)
*/
#include<iostream>
using namespace std;
const int MAX_LEN = 1001;
const int HASH_LEN = 40001;
struct Point{
int x,y;
};
struct TagPoint{
int index;
TagPoint *next;
TagPoint(){
index = -1;
next = NULL;
}
TagPoint(int indexVal,TagPoint *nextVal){
index = indexVal;
next = nextVal;
}
};
Point pInfo[MAX_LEN];
bool find(TagPoint hash[],int x,int y){
int sum = x+y;
if(sum<0)sum=-sum;
TagPoint *p = &hash[sum];
while(true){
if(p==NULL)
return false;
if(pInfo[p->index].x==x&&pInfo[p->index].y==y)
return true;
else p = p->next;
}
}
int main(){
int pointNum = 0;
while(cin>>pointNum&&pointNum!=0){
TagPoint hash[HASH_LEN];
/****************************************/
//输入点集信息,并且建立好hash表
for(int i=0;i<pointNum;i++){
cin>>pInfo[i].x>>pInfo[i].y;
//以sum为hash值
int sum = pInfo[i].x+pInfo[i].y;
if(sum<0)sum=-sum;
//如果未发生冲突直接在哈希表里面做上标记
if(hash[sum].index==-1)
hash[sum].index = i;
//如果发生冲突,按照开散列的方式
//通过链表的查找,找到链表的末端,
//插入新的hash值
else{
TagPoint *p = &hash[sum];
while(p->next!=NULL)
p = p->next;
//p = new TagPoint(i,NULL);粗心!!!
//理解指针的指向
p->next = new TagPoint(i,NULL);
}
}
/*****************************************/
//利用hash表和相关公式进行查找
int count = 0;
int x1,y1,x2,y2;
for(int i=0;i<pointNum;i++)
for(int j=i+1;j<pointNum;j++){
x1 = pInfo[i].x;
y1 = pInfo[i].y;
x2 = pInfo[j].x;
y2 = pInfo[j].y;
if(find(hash,x1+y1-y2,y1+x2-x1)
&&find(hash,x2+y1-y2,y2+x2-x1))
count++;
if(find(hash,x1-y1+y2,y1-x2+x1)
&&find(hash,x2-y1+y2,y2-x2+x1))
count++;
}
cout<<count/4<<endl;
}
return 0;
}