Java:Map中的内部数据结构

时间:2010-07-15 04:31:00

标签: java algorithm data-structures associative-array

我正在尝试创建一个实现Map接口的类。所以我正在编写代码来检查调用对象是否为空。但是我有点担心我应该在内部使用哪种数据结构。目前我正在使用哈希表。      提前致谢

3 个答案:

答案 0 :(得分:4)

来自Wikipedia

  

通常使用关联数组   当查找是最常见的   操作。为此原因,   实现通常是设计的   允许快速查找,费用   插入较慢,较大   存储足迹比其他数据   结构(如协会)   列表)。

     

高效的陈述:
有两种主要的有效数据   用来代表的结构   关联数组,哈希表和   自平衡二叉搜索树   (例如红黑树或AVL   树)。跳过列表也是一个   替代,虽然相对较新和   没有广泛使用。 B树(和   也可以使用变体)   关联时常用   数组太大而无法完全驻留   在记忆中,例如在一个简单的   数据库。相对优势和   缺点包括:

     
      
  1. 渐近操作性能:哈希表的平均查找速度更快   与插入时间O(1)相比较   平衡二叉搜索树的Θ(log   n),而平衡树更快   最坏情况的查找和插入时间,   与Θ(n)相比,O(log n)。跳跃   列表有O(n)最坏情况和O(log   n)平均情况下的操作时间,但是   减少插入和删除   实践中的开销比平衡   二叉树。

  2.   
  3. 订购保存:平衡二叉树和跳过列表保留   订购 - 允许一个人有效   按顺序迭代键或   有效地定位关联   其键最接近给定值。   哈希表不保留排序   因此不能执行这些   有效运作(他们   要求数据在a中排序   单独的步骤)。

  4.   
  5. 范围查询:可以轻松调整平衡二叉树   有效地为a分配单个值   大的有序范围的键,或   计算有序中的键数   范围。 (在数组中有n个元素   并执行操作   连续的m键范围,平衡   二叉树将占用O(log(n)+ m)时间   哈希表需要Θ(n)   因为它需要搜索整个时间   表)。

  6.   
  7. 分配行为:具有开放寻址的哈希表存储所有数据   一块连续的大块内存   很少重新分配,   而树分配执行很多   小的,频繁的分配。作为一个   结果哈希表可能很难   在碎片堆中分配,和   相反,树木可能会导致堆积   碎片。树木也更多   容易受到效率低下的影响   分配器。

  8.   
  9. 紧凑性:哈希表可以为较小的值提供更紧凑的存储空间   类型,尤其是值时   位。

  10.   
  11. 持久性:有平衡二进制的简单持久版本   树木,尤为突出   用函数式语言。

  12.   
  13. 支持新的密钥类型:构建哈希表需要合理的   密钥类型的哈希函数,其中   可能很难写得很好,而   平衡二叉树和跳过列表   只需要总的订购   密钥。

  14.         

    有时简单的实现   一个数据结构或另一个数据结构   可以克服的缺点   更好的设计。例如:

         
        
    • 使用不受信任的输入作为键的哈希表可能容易受到攻击   拒绝服务攻击的地方   不受信任的用户提供预期的数据   生成大量的   碰撞。这可以通过以下方式克服   从中随机选择哈希函数   一个普遍的家庭,或通过哈希   带有加密的不可信输入   插入前的哈希函数。

    •   
    • 简单的平衡树会浪费指针和分配空间   元数据;这些问题都可以   通过存储多个来缓解   每个节点中的元素并使用   内存池。

    •   

答案 1 :(得分:2)

除了表本身之外,您还可以维护一个整数成员变量来跟踪集合的大小,每次放置新映射时递增它,并在每次删除映射时递减。这样,您可以简化sizeisEmpty接口方法:

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