题目:
我们希望我们希望通过利用在一个非常大的数组上直接寻址的方式来实现字典。开始时,该数组中可能包含废料,但要对整个数组进行初始化是不实际的,因为该数组的规模太大。请给出在大数组上实现直接寻址字典方案。每个存储的对象占用O(1)的空间;操作search,insert,delete的时间为O(1);对数据结构初始化时间为O(1)。 (提示:可以利用另外一个栈,其大小等于实际存储在字典中的关键字数目,以帮助确定大型数组中某个给定的项是否是有效的)
思路:利用栈,将实际存在的数字压入类似栈的数组中,
#include<iostream>
using namespace std;
//利用类似于栈的数组实现
void Insert(int *Hash,int *Stack,int value)
{
int num=Hash[value];
//如果该值已经存在,则不插入,本算法默认不插入重复的元素
if(num>0&&num<=Stack[0]&&Stack[num]==value)
{
cout<<value<<"have exit!"<<endl;
return ;
}
//Stack[0]记录着Stack中有多少元素
Stack[0]++;
//将value值插入到数组中包含元素的最后一个地方
Stack[Stack[0]]=value;
//Hash数组中记录着value元素在Stack中存放的位置
Hash[value]=Stack[0];
}
int Search(int *Hash,int *Stack,int value)
{
int num=Hash[value];
//按照hash中标注的在Stack中的位置,找到Stack对应的值,且该值必须等于value才证明该值存在
if(num>0&&num<=Stack[0]&&Stack[num]==value)
{
return num;
}
return 0;
}
bool Delete(int *Hash,int *Stack,int value)
{
//如果找到该元素num>0
int num=Search(Hash,Stack,value);
if(num)
{
int val=Stack[Stack[0]];
Stack[num]=val;
Stack[0]--;
Hash[val]=num;
return 1;
}
return 0;
}
int main()
{
int Hash[100000],i;
int Stack[100]={0};
int a[10]={4,5,63,2,3,445,12,464,156,456};
for(i=0;i<10;i++)
{
Insert(Hash,Stack,a[i]);
}
for(i=1;i<=Stack[0];i++)
{
cout<<Stack[i]<<" ";
}
Delete(Hash,Stack,445);
cout<<endl;
for(i=1;i<=Stack[0];i++)
{
cout<<Stack[i]<<" ";
}
cout<<endl;
return 0;
}