最简单的哈希表删除元素
来源:互联网 发布:seed for windows 编辑:程序博客网 时间:2024/06/08 12:04
有一个简单的Hash表,采用一位数组直接存放元素,Hash函数是个对表长取模,冲突解决采用线性探测。
这样的Hash表较容易实现,查找和插入方法都按照先哈希再探测的步骤就可以了,但删除表中的元素稍微复杂。
因为表中有冲突的元素存在,这些元素应用了探测方法被放置在其他位置上,若删除表中一个元素可能对这些元素的查找造成影响,可能使查找元素的正常过程中断。这里称由于删除一个元素给哈希表造成一个gap。我们称关键字key的哈希值为key的哈希位置;称使用探测技术重新安排位置的元素为后置元素。
为了避免事情的发生,我们需要fill in gaps直到所有的元素都能被找到。下面是一段简单的代码。
//假设哈希表Hash中存放结构体student的相关信息,使用学号id作为关键字.
//称学号为id的元素为元素id。id==0表示该哈希表项未被占用。
int find(int id);//返回元素id在表中的位置
int hash(int id);//计算元素id的哈希值
void delete(int id){
inti=find(id);
for(;;){
Hash(i).id= 0; //删除元素i,产生一个gap。
intj=i; //j存放gap的位置,下面要从gap后面选出一个后置元素来填充gap。
for(;;){ //这里选择离gap最近的那个
i=(++i)%Hash_Table_Size;
if(Hash(i).id== 0){ //遇到了未用的slot,因从gap到该slot段的后置元素都被处理得当,不会再有新的gap产生
return; //所以方法可以结束了。
}
intr=hash(i); //若当前元素的哈希位置r位于gap和其当前位置i之间,则不选择该元素。
if(j<r&& r<=i) //因为该元素本来就应该在gap之后,是不能用它来填充个gap的,它也不受gap影响。
continue; //三个if语句考虑到了i,j的位置关系,即i,j的大小。三个条件都限制了r要在i和j之间。
if(j>i&& j<r)
continue;
if(j>i&& r<=i)
continue;
break; ///元素的哈希位置在允许的范围之外,即它为受影响的后置元素。则:
}//for
Hash(j)=Hash(i); //选择该元素填充gap。并删除该元素产生一个新gap
}//for
}//delete
这只是一种最为简单的Hash表实现。为避免这样删除的麻烦,可以采用链表法或设置公共溢出区来解决冲突。
有两篇不错的文章:
哈希表的一个实现:http://hi.baidu.com/wihate/blog/item/e0330b7a7a2e9fee2e73b3ae.html
c++实现的一个哈希表类:http://hi.baidu.com/wihate/blog/item/d537ba01070352d5277fb5dc.html
希望以后继续学习哈希表。
- 最简单的哈希表删除元素
- 最简单的Delphi自我删除程序
- Android最简单的滑动删除
- 简单实现遍历vector 删除所有相同的元素
- js删除数组元素、清空数组的简单方法
- js删除数组元素、清空数组的简单方法
- sql删除重复的条目的最简单方法
- Windows下删除.svn文件夹的最简单方法
- 最简单的贪心算法--删除数字问题
- Windows下删除.svn文件的最简单方法
- JavaWeb第三记<最简单的一个查询,删除程序>
- 简单顺序表的插入,删除,指定位置,指定元素的插入删除操作
- vtkIdList 的元素删除
- 集合元素的删除
- 重复元素的删除
- vector元素的删除
- 重复元素的删除
- 数组元素的删除
- Linux的中断编程
- Oracle查询慢的原因
- android 数据库 SQLiteOpenHelper和ContentProvider学习笔记---添加修改删除数据之联系人(二)
- 工作小记
- Windows Mobile Test Framework实现手机软件自动化测试的介绍
- 最简单的哈希表删除元素
- OpenCV支持的图像格式
- 北京的巨大变化
- JQUERY实现拖动层
- jsp执行dts包
- JavaScript中onChange、onselect 、onmouseout等事件
- java并发编程不得不知道的几件事
- 用ultraEdit打造自己的Objective-C IDE for Windows
- 不要做浮躁的学习者和工程师[转]