ARTS 第2周打卡

  • 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值