问题
不使用任何内建的哈希表库设计一个哈希映射
具体地说,你的设计应该包含以下的功能
put(key, value):向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更新这个值。
get(key):返回给定的键所对应的值,如果映射中不包含这个键,返回-1。
remove(key):如果映射中存在这个键,删除这个数值对。
MyHashMap hashMap = new MyHashMap();
hashMap.put(1, 1);
hashMap.put(2, 2);
hashMap.get(1); // 返回 1
hashMap.get(3); // 返回 -1 (未找到)
hashMap.put(2, 1); // 更新已有的值
hashMap.get(2); // 返回 1
hashMap.remove(2); // 删除键为2的数据
hashMap.get(2); // 返回 -1 (未找到)
注意:
所有的值都在 [1, 1000000]的范围内。
操作的总数目在[1, 10000]范围内。
不要使用内建的哈希库。
Design a HashMap without using any built-in hash table libraries.
To be specific, your design should include these two functions:
put(key, value) : Insert a (key, value) pair into the HashMap. If the value already exists in the HashMap, update the value.
get(key): Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key.
remove(key) : Remove the mapping for the value key if this map contains the mapping for the key.
MyHashMap hashMap = new MyHashMap();
hashMap.put(1, 1);
hashMap.put(2, 2);
hashMap.get(1); // returns 1
hashMap.get(3); // returns -1 (not found)
hashMap.put(2, 1); // update the existing value
hashMap.get(2); // returns 1
hashMap.remove(2); // remove the mapping for 2
hashMap.get(2); // returns -1 (not found)
Note:
All values will be in the range of [1, 1000000].
The number of operations will be in the range of [1, 10000].
Please do not use the built-in HashMap library.
示例
public class Program { public static void Main(string[] args) { var hashMap = new MyHashMap(); hashMap.Put(1, 1); hashMap.Put(2, 2); hashMap.Get(1); hashMap.Get(3); hashMap.Put(2, 1); hashMap.Get(2); hashMap.Remove(2); hashMap.Get(2); Console.ReadKey(); } public class MyHashMap { private int[] buckets; public MyHashMap() { buckets = new int[1000000]; for(var i = 0; i < buckets.Length; i++) { buckets[i] = -1; } } private int GetHashCode(int key) { //用本身值作为散列值 return key; } public void Put(int key, int value) { buckets[GetHashCode(key)] = value; } public int Get(int key) { var res = buckets[GetHashCode(key)]; Console.WriteLine(res); return res; } public void Remove(int key) { buckets[GetHashCode(key)] = -1; } } }
以上给出1种算法实现,以下是这个案例的输出结果:
1 -1 1 -1
分析:
注意该题的测试用例中包含值为0的项目,并不是题目中[1, 1000000]的范围内。所以很无奈的在构造函数中初始化所有值为-1。
显而易见,MyHashMap解法中的Put、Get和Remove三个方法均为 的常量时间复杂度。
本文由 .Net中文网 原创发布,欢迎大家踊跃转载。
转载请注明本文地址:https://www.byteflying.com/archives/4116。