`
sillycat
  • 浏览: 2542935 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Interview(7)Map and Hash Table

 
阅读更多
Interview(7)Map and Hash Table

Map - (key, value)
java.util.Map interface

public class MapDLNode implements Map {
    private List list;
    private EqualityTester tester;

    public MapDLNode(){  this(new EqualityTesterDefault()); }
    public MapDLNode(EqualityTester tester){  this(list = new ListDLNode(); tester = tester); }   
    public int getSize() { return list.getSize(); }
    public boolean isEmpty() {  return list.isEmptyy(); }

    public Object get(Object key){
        Iterator p = list.positions();
        while(p.hasNext()){
            Position pos = (Position) p.getNext();
            Entry entry = (EntryDefault) pos.getElem();
            if( tester.isEqualTo(entry.getKey(), key)){
                return entry.getValue();
            }
        }
        return null;
    }

    public Object put(Object key, Object value){
        Iterator p = list.positions();
        while (p.hasNext()){ //loop all the elements
            Position pos = (Position) p.getNext();
            Entry entry = (EntryDefault) pos.getElem();
            if( tester.isEqualTo(entry.getKey(), key)){
                Object oldValue = entry.getValue();
                list.replace(pos, new EntryDefault(key, value));
                return oldValue;
            }
        }
       
        list.insertFirst(new EntryDefault(key, value));
        return null;
    }

    public Object remove(Object key){
        Iterator p = list.positions();
        while (p.hasNext()){
            Position pos = (Position) p.getNext();
            Entry entry = (EntryDefault) pos.getElem();
            if(tester.isEqualTo(entry.getKey, key)){
                Object oldValue = entry.getValue();
                list.remove(pos);
                return oldValue;
            }
        }
        return null;
    }
    public Iterator entries() { return new IteratorElement(list); }
}

get(key), put(key, value), remove(key) - O(n), system will scan all the elements in these methods.

Hash Table
Bucket Array, array[0.. N-1]
Convert the key to 0 - N-1 ——> Hash Function

Hash Code —> hashCode()  —> 32 int

static int hashCode(long l){
    return (int) ((l>>32) + (int)l; )
}

Convert 2^32 = 4G = 0..N-1

|i| mod N = 0 .. N-1

MAD - Multiply Add Divide   | a x i + b| mod N

No matter how we improve the Hash Function or Solution, we still have the conflicts.

Solution to the Conflict - Separate Chaining
All the Value are List similar to below, or empty, or single value

Solution to the Conflict - Collision Pool
Two Bucket, one for normal items, one for conflict items

public class MapHashTable implements Map {

    private Map[] a; // bucket array
    private int n;
    private final double maxLemda = 0.75;
    private int size;
    private EqualityTester t;

    public MapHashTable(){
        this(0, new EqualityTesterDefault());
    }

    public MapHashTable(int n, EqualityTester t){
        t = t;
        n = p(n); //less than n
        a = new Map[n];
        for(int i = 0;i< n;i++){
            a[i] = new MapDLNode(t); //use MapDLNode for in bucket array
        }
        size = 0;
    }

    private int h(Object key) {  return key.hashCode() % N; } //hash code the key and mod N
    private static boolean prime(int n){ ..snip… } //check prime number
    private static int p(int n) { …snip.. } //return the prime number bigger than n
    public int getSize() { return size; }
    public boolean isEmpty(){  return 0 == size; }

    public Object get(Object key){
        return a[h(key)].get(key);
    }
   
    public Object put(Object key, Object value) {
        Object oldValue = A[h(key)].put(key, value);
        if(null == oldValue){
            size++; //new item, update size
            if(size > N * maxLemda){
                rehash();
            }
        }
        return oldValue;
    }

    public Object remove(Object key) {
        Object oldValue = A[h(key)].remove(key);
        if( null != oldValue) { size- -;  }
        return oldValue;
    }

    public Iterator entries(){ //combine all the entries together
        List l = new ListDLNode();
        for(int i = 0;i<N;i++){
            Iterator it = a[i].entries();
            while(it.hasNext()){
                l.insertLast(it.getNext());
            }
        }
        return new InteratorElement(l);
    }

    private void rehash(){
        Iterator it = this.entries();
        N = p(N<<1);
        A = new Map[N]; //double the N
        for(int i = 0;i<N;i++){
            A[i] = new MapDLNode(T);
        }
        while(it.hasNext()) {
            Entry e = (Entry)it.getNext();
            Object k = e.getKey();
            Object v = e.getValue();
            a[h(k)].put(k, v); //re-insert everything
        }
    }
}

Dictionary


References:


分享到:
评论

相关推荐

    c++中hash_table以及std::map应用案例

    代码重点是hash_table,附加std::map与其做对比,实现的是一条sql语句:select c_nationkey, c_mktsegment, count(*), max(c_acctbal) from aaa_customer_1g group by c_nationkey, c_mktsegment order by c_...

    SSD 5 hash table

    Sorting Hash Table Increase Sorting Searching Elementd in hash table BSTree

    hash_map的简单应用

    hash_map

    前端大厂最新面试题-hash-table.docx

    本文档收集了前端大厂最新面试题的 Hash Table 相关知识点,涵盖 Hash Table 的基本概念、 ハッシュ関数、 Collision 解决方法、Hash Table 的实现和应用等方面。 一、Hash Table 基本概念 * Hash Table 是一种...

    hash_map的详解

    这就引出了哈希表(hash table)的概念——一种能够实现近似常数时间复杂度O(1)操作的数据结构。在C++ STL中,`hash_map`正是用来实现这种高效键值对存储的数据结构。 #### 1. 数据结构:hash_map原理 `hash_map`的...

    hash table spell checking

     Search function: This function searches the key specified as the parameter in the hash table. If exist, return true, else return false. Note to use the eq which is a member of HashSet to compare ...

    hash table

    方便地查看文件的MD5/SHA1值 – HashTab给文件属性窗口添加校验值!

    fpga-hash-table-master.zip_Table_fpga hash table_hash_hash fpga_

    "FPGA-based hash table"是指利用FPGA的特性实现的哈希表数据结构。哈希表是一种高效的数据存储和检索结构,它通过将关键字映射到数组的特定位置来快速查找、插入和删除数据。 哈希表的核心是哈希函数,它将输入的...

    c语言hash table的实现

    根据提供的文件信息,我们可以深入分析C语言中哈希表(Hash Table)的实现方式与具体细节。本篇文章将从以下几个方面展开讨论: 1. **哈希表的基本概念** 2. **哈希函数的设计** 3. **哈希表的创建与管理** 4. **...

    a-similar-map-simple-hash-table.rar_Table

    标题中的"a-similar-map-simple-hash-table.rar_Table"指的是一个使用C语言实现的类似于地图的数据结构,这个数据结构是一个简单的哈希表。哈希表是一种高效的数据存储方式,它通过哈希函数将键(key)映射到数组的...

    20151910042-刘鹏-DSA思考题-10 - Graph Traversal and Hash Table1

    7. **哈希表相关概念**: - 映射是一种关联数据结构,将键(key)映射到值(value)。 - 哈希表是一种实现映射的高效结构,通过哈希函数将键转换为哈希码,再用桶数组存储。 - 桶数组是一系列固定大小的数组,...

    u_hash_table.rar_Table For Two

    在IT领域,哈希表(Hash Table)是一种高效的数据结构,用于存储和检索键值对。标题中的"u_hash_table.rar_Table For Two"暗示我们关注的是一个特定的哈希表实现,可能是为处理两个相关对象设计的。描述中的"compare...

    Hash table

    this is a hash table using hash function

    Java中List、ArrayList、Vector及map、HashTable、HashMap分别的区别.

    7. WeakHashMap WeakHashMap是一种特殊的Map实现,它使用弱引用作为键,当键不再被引用时,即使在Map中,也会被垃圾回收器清除,从而释放内存资源。 总结来说,选择哪种容器取决于具体的需求:如果需要有序的元素...

    All hash ids_hash_Table_

    哈希表(Hash Table)是一种数据结构,它通过关联键(Key)与值(Value)实现高效的数据存储和检索。在“所有哈希ids_hash_Table_”这个主题中,我们聚焦于利用哈希表来创建作弊表,这可能是为了在游戏中快速查找...

    Hash_map 实现源码

    哈希映射(Hash Map)是一种常见的数据结构,它提供了键值对(Key-Value Pair)的快速存储和检索功能。在C++中,STL(Standard Template Library)提供了一个名为`std::unordered_map`的容器,它是基于哈希表实现的...

    linux hash_map

    7. **其他操作**:`hash_map`还提供了删除元素、查找元素、更新元素等操作,这些操作通常在`std::unordered_map`(C++11引入的替代`hash_map`的标准容器)中也是一样的。 总的来说,`hash_map`在Linux环境下提供了...

    Hash map 哈希表

    哈希表,也被称为Hash Map,是计算机科学中一种高效的数据结构,用于存储键值对。它通过一种称为哈希函数的过程将键映射到数组的特定位置,从而实现快速的查找、插入和删除操作。在哈希表中,查找时间通常接近常数...

    kernel_list_and_hash_table.tar.gz_Table_linux内核 list

    "kernel_list_and_hash_table.tar.gz"这个压缩包聚焦于Linux内核中的两种关键数据结构:链表和散列表,以及它们如何被用于实现内核功能。下面我们将详细探讨这两种数据结构及其在Linux内核中的应用。 首先,链表是...

    glib hash table

    GLib哈希表还提供了`g_hash_table_remove()`、`g_hash_table_steal()`等方法来删除或移除键值对,以及`g_hash_table_contains()`检查键是否存在。 4. **遍历哈希表** GLib提供迭代器来遍历哈希表的所有键值对,如`...

Global site tag (gtag.js) - Google Analytics