左神算法 设计一个具有setAll功能的哈希表

本文介绍了一种特殊哈希表的设计与实现方法,该哈希表支持put、get、containsKey和setAll四种操作,且每个操作的时间复杂度均为O(1)。通过引入时间戳的概念,确保了setAll操作能够批量更新所有键值对的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目】
  哈希表常见的三个操作是put、get和containsKey,而且这三个操作的时间复杂度为O(1)。现在想加一个setAll功能,就是把所有的记录的value值都设成统一的值。请设计并实现这种有setAll功能的哈希表,并且put、get、containsKey和setAll四个操作的时间复杂度都为O(1)。

【基本思路】
  加入时间戳。
  1、把每一个记录都加上一个时间,标记每条记录是合适建立的
  2、设置一个setAll记录也加上一个时间,标记setAll记录何时建立
  3、查询记录时,如果某条记录的时间早于setAll记录的时间,说明setAll是最新数据,返回setAll记录的值。如果某条记录的时间晚于setAll记录的时间,说明记录的值是最新数据,返回该条记录的值

【点评】哈希表中是K-V键值对,K,V都是对象。自己设计的哈希表MyHashMap肯定有一个成员变量是基本的哈希表HashMap类型的引用。对于传入的类型V,先用自己定义的MyValue对Value包一层,增加成员变量 时间,MyValue<>考虑泛型和V类型一致。

package chapter_9_others;

import java.util.HashMap;

public class Problem_08_SetAllHashMap {

    public static class MyValue<V> {
        private V value;
        private long time;

        public MyValue(V value, long time) {
            this.value = value;
            this.time = time;
        }

        public V getValue() {
            return this.value;
        }

        public long getTime() {
            return this.time;
        }
    }

    public static class MyHashMap<K, V> {
        private HashMap<K, MyValue<V>> baseMap;
        private long time;
        private MyValue<V> setAll;

        public MyHashMap() {
            this.baseMap = new HashMap<K, MyValue<V>>();
            this.time = 0;
            this.setAll = new MyValue<V>(null, -1);
        }

        public boolean containsKey(K key) {
            return this.baseMap.containsKey(key);
        }

        public void put(K key, V value) {
            this.baseMap.put(key, new MyValue<V>(value, this.time++));
        }

        public void setAll(V value) {
            this.setAll = new MyValue<V>(value, this.time++);
        }

        public V get(K key) {
            if (this.containsKey(key)) {
                if (this.baseMap.get(key).getTime() > this.setAll.getTime()) {
                    return this.baseMap.get(key).getValue();
                } else {
                    return this.setAll.getValue();
                }
            } else {
                return null;
            }
        }
    }

    public static void main(String[] args) {
        MyHashMap<String, Integer> test = new MyHashMap<String, Integer>();
        test.put("Tom", 1);
        test.put("James", 2);
        System.out.println(test.containsKey("Tom"));
        System.out.println(test.get("Tom"));
        System.out.println(test.containsKey("James"));
        System.out.println(test.get("James"));
        test.setAll(3);
        test.put("Rose", 4);
        System.out.println(test.get("Tom"));
        System.out.println(test.get("James"));
        System.out.println(test.get("Rose"));
        test.setAll(5);
        System.out.println(test.get("Tom"));
        System.out.println(test.get("James"));
        System.out.println(test.get("Rose"));

    }

}
unordered_set和unordered_map是C++11中新增加的两个关联式容器,它们的区别主要体现在以下几个方面: 1. 底层实现:unordered_set和unordered_map的底层都是哈希表,而set和map的底层是红黑树。哈希表是一种根据键值直接进行访问的数据结构,而红黑树是一种自平衡的二叉搜索树。 2. 排序:unordered_set是不可排序的,而set是有序的。unordered_map是无序的,而map是有序的。这是因为哈希表是根据键值的哈希值进行存储和访问的,没有固定的顺序。 3. 迭代器:unordered_set和unordered_map使用的是单向迭代器,而set和map使用的是双向迭代器。单向迭代器只能从前往后遍历容器中的元素,而双向迭代器可以从前往后和从后往前遍历。 4. 效率:由于底层实现的不同,unordered_set和unordered_map的插入、查找和删除操作的时间复杂度都是O(1),而set和map的时间复杂度是O(logN)。因此,unordered_set和unordered_map相对于set和map来说,在大部分情况下具有更高的效率。 综上所述,unordered_set和unordered_map与set和map在底层实现、排序、迭代器和效率上存在一些区别。选择使用哪个容器取决于具体的需求和性能要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C++ 哈希表及unordered_set + unordered_map容器](https://blog.youkuaiyun.com/qq_60750110/article/details/126746419)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [算法(42)-数组等值切割-前缀累加和-哈希表Map-set版-C++](https://download.youkuaiyun.com/download/weixin_38710566/14039060)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值