【算法】【算法杂谈】具有setall功能的hash表

这篇具有很好参考价值的文章主要介绍了【算法】【算法杂谈】具有setall功能的hash表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~

在此感谢左大神让我对算法有了新的感悟认识!

问题介绍

原问题
纳管一个hashmap,增强hashmap的功能,使其具有能够立刻将当前hash表中的所有值都变成统一的值的能力
具体来讲,就是如果当前使用了setall的功能,那么当前的表中再获取所有的key对应的值都是setall所设置的值了。

解决方案

原问题
解法很简单,增加“时间戳”
1、首先如果使用真的时间戳可以做到setall的功能,但是时间戳占用了64位,所以没有必须要使用这么大的内存,所以这里使用了int类型直接存储类似于时间戳的东西
2、首先数据结构类中的变量如代码编写中所示
3、setall功能:首先正常放入hashmap流程不用说,time++后赋值给time变量,并将value赋值给myvalue引用
4、get功能:获取时需要先判断是否存在key,如果存在则取出值后获取到time值判断是否在time之前加入,如果是,则返回myvalue变量即可。

代码编写

java语言版本

原问题:
方法一:

public class SetAllHashMapCp1<K, V> {

    /**
     * 维护一个hash用来存储数据
     */
    private Map<K, MyValue<V>> map;

    /**
     * 模拟时间戳
     * 只要当前存在值进来,就增加1,删除值不会减少
     */
    private Long time;

    /**
     * setall操作值
     */
    private MyValue<V> setAllValue;


    public SetAllHashMapCp1() {
        this.time = 0L;
        this.map = new HashMap<>(16);
    }

    /**
     * put操作
     * 正常put操作,增加一个时间戳就行了
     * @param key
     * @param value
     */
    public void put(K key, V value) {
        this.map.put(key, new MyValue<>(this.time++, value));
    }


    /**
     * get操作
     * 取得时候需要比较一下setall的时间戳
     * 如果在时间戳前面,则返回setall的值
     * 如果在后面则返回原值
     * be careful null value!
     * @param key
     * @return
     */
    public V get(K key) {
        if (!isContainsKey(key)) {
            return null;
        }
        MyValue<V> vMyValue = map.get(key);
        return this.setAllValue == null
                || vMyValue.getTime() > this.setAllValue.getTime() ? vMyValue.getValue() : this.setAllValue.getValue();
    }

    /**
     * Provide a normal getting operation
     * @param key
     * @return
     */
    public V nomalGet(K key) {
        MyValue<V> vMyValue = map.get(key);
        return vMyValue == null ? null : vMyValue.getValue();
    }


    /**
     * 是否存在该key
     * @param key
     * @return
     */
    public boolean isContainsKey(K key) {
        return map.containsKey(key);
    }

    /**
     * setall功能
     * @param value
     */
    public void setAll(V value) {
        this.setAllValue = new MyValue<>(this.time++, value);
    }


    /**
     * 测试用例
     * @param args
     */
    public static void main(String[] args) {
        SetAllHashMapCp1<String, String> mapCp1 = new SetAllHashMapCp1<>();
        mapCp1.put("1", "!!");
        mapCp1.put("2", "@@");
        mapCp1.setAll("9999999");
        mapCp1.put("33", "##");
        mapCp1.put("44", "$$");
    }


    /**
     * 维护一个value和当前value所带的时间戳
     * @param <V>
     */
    private class MyValue<V> {


        private Long time;

        private V value;

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

        public Long getTime() {
            return time;
        }

        public void setTime(Long time) {
            this.time = time;
        }

        public V getValue() {
            return value;
        }

        public void setValue(V value) {
            this.value = value;
        }
    }

}

c语言版本

正在学习中

c++语言版本

正在学习中

思考感悟

少有的几个实用的数据结构题目,这种数据结构我目前还没有用到,但是业务中如果存在类似的需要一次性将某个时间点的值赋值为一样的场景,可以使用这个数据结构啦

写在最后

方案和代码仅提供学习和思考使用,切勿随意滥用!如有错误和不合理的地方,务必批评指正~
如果需要git源码可邮件给2260755767@qq.com
再次感谢左大神对我算法的指点迷津!文章来源地址https://www.toymoban.com/news/detail-433801.html

到了这里,关于【算法】【算法杂谈】具有setall功能的hash表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 获取dll当前路径下所有文件

    在.cpp文件头引用头文件和作用域 获取dll文件所在目录地址和获取文件信息 功能代码:获取指定路径下所有文件地址信息 **************************************************************************************************************

    2024年02月10日
    浏览(35)
  • 【算法】【算法杂谈】旋转数组的二分法查找

    当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识! 原问题 给定一个从小到大有序的数组,该数组存在重复的数,并且该数组可能经过旋转处理,如arr = [1,2,3,4,5,6,7]代表数组未旋

    2024年02月06日
    浏览(47)
  • linux查看当前目录及子目录所有文件

    1.查看当前目录及子目录所有文件: du -ah 执行结果如下: 2.查看当前目录及子目录所有文件,并根据大小排序: du -a | sort -n 执行结果如下:(单位:字节) 整理完毕,完结撒花~

    2024年02月16日
    浏览(27)
  • 【算法】【算法杂谈】折纸问题(完全二叉树解法)

    当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识! 原问题 一张纸从下往上对折之后,出现一条折痕,该折痕凸起向下,所以叫“下折痕”,反之如果摊开之后,凸起向上,则叫

    2024年02月01日
    浏览(29)
  • python获取当前文件下的所有文件名

    运行效果图

    2024年02月12日
    浏览(35)
  • 区块链技术具有哪些功能?

    区块链技术具有以下主要功能: 去中心化 : 区块链中的去中心化是指将控制权和决策权从中心化实体(个人、组织或团体)转让给分布式网络。去中心化区块链网络使用透明度来减少对参与者之间取得信任的需要。这些网络还以削弱网络功能性的方式,阻止参与者彼此施加

    2024年02月13日
    浏览(32)
  • Python获取当前目录下所有文件的六种方法

    这段代码中, os.listdir() 方法返回的是一个列表,因为获取的是文件名,而不是文件路径。如果需要获取文件路径,可以使用 os.path.join() 方法将列表中的文件名拼接成一个完整的路径。 这段代码中, os.getcwd() 返回当前工作目录, glob.glob() 函数用于获取指定目录下所有文件,

    2024年02月12日
    浏览(37)
  • Linux 查看当前路径下所有文件夹大小的方法

    补充: du -sh 查看当前目录总共占的容量,而不单独列出各子项占用的容量 du -ah --max-depth=1 a 表示显示目录下所有的文件和文件夹(不含子目录) h 表示以人类能看懂的方式 max-depth 表示目录的深度 du -lh --max-depth=1 查看当前目录下一级和子目录占用的磁盘容量 整理完毕,完结

    2024年02月16日
    浏览(47)
  • 查询Oracle和MySQL数据库中当前所有连接信息

    查询Oracle当前所有连接信息: 查询MySQL当前所有连接信息: 在这两个查询中,我为每个字段添加了中文别名,以提高查询结果的可读性

    2024年02月12日
    浏览(55)
  • 查询Oracle当前用户下,所有数据表的总条数

    查询Oracle当前用户下,所有数据表的总条数 方法1:存储过程 (文末有方法2,一个SQL也可轻松搞定!) 右键点击 Procedures ,点击 New 点击 OK 把存储过程写进去,然后点击编译运行: 3.2.1 方法一 方法2 点击File -- New -- Test Window 写入刚刚新增的存储过程 方法2:SQL select sum(t.NUM_RO

    2024年02月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包