我正在尝试创建一个实现Map接口的类。所以我正在编写代码来检查调用对象是否为空。但是我有点担心我应该在内部使用哪种数据结构。目前我正在使用哈希表。 提前致谢
答案 0 :(得分:4)
来自Wikipedia,
通常使用关联数组 当查找是最常见的 操作。为此原因, 实现通常是设计的 允许快速查找,费用 插入较慢,较大 存储足迹比其他数据 结构(如协会) 列表)。
高效的陈述:
有两种主要的有效数据 用来代表的结构 关联数组,哈希表和 自平衡二叉搜索树 (例如红黑树或AVL 树)。跳过列表也是一个 替代,虽然相对较新和 没有广泛使用。 B树(和 也可以使用变体) 关联时常用 数组太大而无法完全驻留 在记忆中,例如在一个简单的 数据库。相对优势和 缺点包括:
渐近操作性能:哈希表的平均查找速度更快 与插入时间O(1)相比较 平衡二叉搜索树的Θ(log n),而平衡树更快 最坏情况的查找和插入时间, 与Θ(n)相比,O(log n)。跳跃 列表有O(n)最坏情况和O(log n)平均情况下的操作时间,但是 减少插入和删除 实践中的开销比平衡 二叉树。
订购保存:平衡二叉树和跳过列表保留 订购 - 允许一个人有效 按顺序迭代键或 有效地定位关联 其键最接近给定值。 哈希表不保留排序 因此不能执行这些 有效运作(他们 要求数据在a中排序 单独的步骤)。
范围查询:可以轻松调整平衡二叉树 有效地为a分配单个值 大的有序范围的键,或 计算有序中的键数 范围。 (在数组中有n个元素 并执行操作 连续的m键范围,平衡 二叉树将占用O(log(n)+ m)时间 哈希表需要Θ(n) 因为它需要搜索整个时间 表)。
分配行为:具有开放寻址的哈希表存储所有数据 一块连续的大块内存 很少重新分配, 而树分配执行很多 小的,频繁的分配。作为一个 结果哈希表可能很难 在碎片堆中分配,和 相反,树木可能会导致堆积 碎片。树木也更多 容易受到效率低下的影响 分配器。
紧凑性:哈希表可以为较小的值提供更紧凑的存储空间 类型,尤其是值时 位。
持久性:有平衡二进制的简单持久版本 树木,尤为突出 用函数式语言。
- 醇>
支持新的密钥类型:构建哈希表需要合理的 密钥类型的哈希函数,其中 可能很难写得很好,而 平衡二叉树和跳过列表 只需要总的订购 密钥。
有时简单的实现 一个数据结构或另一个数据结构 可以克服的缺点 更好的设计。例如:
使用不受信任的输入作为键的哈希表可能容易受到攻击 拒绝服务攻击的地方 不受信任的用户提供预期的数据 生成大量的 碰撞。这可以通过以下方式克服 从中随机选择哈希函数 一个普遍的家庭,或通过哈希 带有加密的不可信输入 插入前的哈希函数。
简单的平衡树会浪费指针和分配空间 元数据;这些问题都可以 通过存储多个来缓解 每个节点中的元素并使用 内存池。
答案 1 :(得分:2)
除了表本身之外,您还可以维护一个整数成员变量来跟踪集合的大小,每次放置新映射时递增它,并在每次删除映射时递减。这样,您可以简化size
和isEmpty
接口方法:
public int size() {
return this.size;
}
public boolean isEmpty() {
return this.size == 0;
}
答案 2 :(得分:2)
我尝试了不同的方法,但最终扩展了一些本身非常强大的数据结构,以至于不需要编码技能。所以我决定使用普通的字符串数组(2)从虚拟哈希映射中获取结构,随着空间需求的增加,这将扩展。
以下是完整代码的链接。
http://code.google.com/p/rohan-oopconcept-assignment/source/browse/trunk/src/EmployeeMap.java