ARTS 第2周打卡

    xiaoxiao2023-11-04  153

    Algorithm

    不使用任何内建的哈希表库设计一个哈希映射

    具体地说,你的设计应该包含以下的功能

    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]范围内。 不要使用内建的哈希库。

    import java.util.Arrays; public class MyHashMap { int[][] data; int buckets =1000; int size = 1001; /** Initialize your data structure here. */ public MyHashMap() { data = new int[buckets][]; } private int hash(int val){ return val % buckets; } /** value will always be non-negative. */ public void put(int key, int value) { int hashKey = hash(key); if (data[hashKey] == null) { data[hashKey] = new int[size]; Arrays.fill(data[hashKey],-1); } data[hashKey][key/size] = value; } /** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */ public int get(int key) { int hashKey = hash(key); if (data[hashKey] == null) { return -1; } return data[hashKey][key/size]; } /** Removes the mapping of the specified value key if this map contains a mapping for the key */ public void remove(int key) { int hashKey = hash(key); if (data[hashKey] != null) { data[hashKey][key/size] = -1; } } public static void main(String[] args) { MyHashMap map = new MyHashMap(); for(int i=0;i<100;i++){ map.put(i, i+10); } } } /** * Your MyHashMap object will be instantiated and called as such: * MyHashMap obj = new MyHashMap(); * obj.put(key,value); * int param_2 = obj.get(key); * obj.remove(key); */

    Review ZooKeeper 详解 应用场景 1 并发分布式锁 2 集群管理:容错、负载均衡。 配置文件的集中管理。 集群的入口。

    Tip A 算法时间复杂度分析要点 1. 只关注循环执行次数最多的一段代码 2.加法法则:总复杂度等于量级最大的那段代码的复杂度 3.乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积 B 复杂度分析的4个概念 1.最坏情况时间复杂度:代码在最理想情况下执行的时间复杂度。 2.最好情况时间复杂度:代码在最坏情况下执行的时间复杂度。 3.平均时间复杂度:用代码在所有情况下执行的次数的加权平均值表示。 4.均摊时间复杂度:在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别复杂度。

    二、为什么要引入这4个概念? 1.同一段代码在不同情况下时间复杂度会出现量级差异,为了更全面,更准确的描述代码的时间复杂度,所以引入这4个概念。 2.代码复杂度在不同情况下出现量级差别时才需要区别这四种复杂度。大多数情况下,是不需要区别分析它们的。

    三、如何分析平均、均摊时间复杂度? 1.平均时间复杂度 代码在不同情况下复杂度出现量级差别,则用代码所有可能情况下执行次数的加权平均值表示。 2.均摊时间复杂度 两个条件满足时使用:1)代码在绝大多数情况下是低级别复杂度,只有极少数情况是高级别复杂度;2)低级别和高级别复杂度出现具有时序规律。均摊结果一般都等于低级别复杂度

    Share

    HashMap java内部实现原理 1 HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。 数组:存储区间连续,占用内存严重,寻址容易,插入删除困难; 链表:存储区间离散,占用内存比较宽松,寻址困难,插入删除容易。 2 HashMap的工作原理 :HashMap是基于散列法(又称哈希法hashing)的原理,使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket(桶)位置来储存Entry对象。”HashMap是在bucket中储存键对象和值对象,作为Map.Entry。并不是仅仅只在bucket中存储值。

    最新回复(0)