【问题标题】:Tombstones in hash tables哈希表中的墓碑
【发布时间】:2019-08-05 17:40:11
【问题描述】:
我正在为哈希表编写一个类。哈希表是我编写的一个类中的对象数组,称为HashVariable。 HashVariable 只有两个属性,一个名称和一个整数值。我知道如果我从表中删除一个项目,我将不得不用“墓碑”替换它,但我不确定应该使用什么作为墓碑。
我并没有真正尝试过,因为我不确定我能做什么。我可以尝试将一个字符转换为 HashVariable 并将其插入到数组中,但我不能那样转换它。
【问题讨论】:
标签:
java
data-structures
hashmap
tombstone
【解决方案1】:
您可以通过多种方式执行此操作,具体取决于您的表中允许存储的内容。
如果您的表不允许 null 对象,那么您可以使用 null 对象来标记空闲的插槽,然后根据插槽为空的原因让关联的整数采用不同的值(例如,0 表示“从未填充”,1 表示“墓碑”等)
1234563对应于null 是否为键,如果是,则与它关联的值是什么)。然后,您可以使用上述技术标记空表槽。
如果您的表不允许使用负键,那么您可以使用负键来标记空槽(例如,-1 表示“此槽为空”,-2 表示“这是一个墓碑。”)
如果您的表允许任意键和值,那么您可以添加并行的布尔数组(或用作位向量的整数数组,这样更节省空间)来标记哪些插槽是空的以及哪些插槽是墓碑。
1234563你可以有一些基类类型(比如HashSlot)和两个子类(比如Tombstone和Entry),其中Tombstone只是标记一个墓碑槽,Entry实际上存储了键/值对。
这不是一个详尽的选项列表。如您所知,您可以在这里使用很多策略!看看哪些看起来最适合您的特定设置。
希望这会有所帮助!
【解决方案2】:
由于“HashVariable”是您编写的类,您可以使用布尔变量将 HashVariable 标记为墓碑(除了具有名称和值)。有关示例实现,请查看 here。