基于HashHeap的LFU实现

2023-11-11

普通heap支持的操作和queue, stack一样,就是push, pop,只是pop出的是最小值,具体点就是add, delMin

hashheap支持一般HashMap的功能,同时维护最小值,和LinkedHashMap是对等的,后者是HashMap加上维护先后关系,hashHeap其实叫HeapedHashMap更科学。

LinkedHashMap -> hashmap + 维护先后关系 -> LRU

HeapedHashMap ->  hashmap + 维护最小值  -> LFU


为什么没有叫HeapedHashMap的?因为有了heap,复杂度就被改变了,从O(1)到O(lgn),hash的意义就不在了。而LinkedHashMap 各种操作仍然都是O(1)的,不影响。


进一步分析:HeapedHashMap可以被stl::set取代,因为要处理堆,HeapedHashMap的所有操作都是 O(logN)的,这和stl::set一样,而后者也支持快速得到最小值(*set.begin())


class LFU<K, V> {
	private static class Counter<V> implements Comparable<Counter<V>> {
		V data;
		Integer freq;
		Counter(V data, Integer freq) {
			this.data = data;
			this.freq = freq;
		}
		@Override
		public int compareTo(Counter<V> e) {
			return this.freq - e.freq;
		}
	}
	int maxSize;
	HashHeap<K, Counter<V>> hh = new HashHeap<K, Counter<V>>();
	public LFU(int maxSize) {
		this.maxSize = maxSize;
	}
	public V get(K key) {
		Counter<V> e = hh.get(key);
		if (e == null) return null;
		e.freq++;
		hh.put(key, e);
		return e.data;
	}
	public void put(K key, V value) {
		Counter<V> e = hh.get(key);
		if (e == null) {
			if (hh.size() == maxSize) {
				System.out.println("expire " + hh.delMin());
			}
		}
		hh.put(key, new Counter<V>(value, 1));
	}
}


HeapedHashMap实现

public class HashHeap <K, V extends Comparable<V>>  {
	private static class Entry<K, V extends Comparable<V>> {
		K key;
		V value;
		Entry(K k, V v) {
			key = k;
			value = v;
		}
	}
	private Map<K, Integer> addr = new HashMap<K, Integer>();
	private List<Entry<K, V>> heap = new ArrayList<Entry<K, V>>();
	
	public void put(K key, V value) {
		Integer pos = addr.get(key);
		if (pos == null) {
			heap.add(new Entry<K, V>(key, value));
			addr.put(key, heap.size() - 1);
			siftUp(heap.size() - 1);
		}
		else {
			Entry<K, V> e = heap.get(pos);
			V oldValue = e.value;
			e.value = value;
			if (value.compareTo(oldValue) > 0) siftDown(pos);
			else siftUp(pos);
		}
	}
	public V get(K key) {
		Integer pos = addr.get(key);
		if (pos == null) return null;
		return heap.get(pos).value;
	}
	public void remove(K key) {
		Integer pos = addr.get(key);
		if (pos == null) return;
		heap.set(pos, heap.get(heap.size() - 1));
		addr.put(heap.get(pos).key, pos);
		heap.remove(heap.size() - 1);
		siftDown(pos);
		addr.remove(key);
	}
	public K delMin() {
		if (heap.size() == 0) return null;
		Entry<K, V> e = heap.get(0);
		remove(e.key);
		return e.key;
	}
	public int size() {
		return addr.size();
	}
	private void swap(int i, int j) {
		Entry<K, V> temp = heap.get(i);
		heap.set(i, heap.get(j));
		heap.set(j, temp);
		addr.put(heap.get(i).key, i);
		addr.put(heap.get(j).key, j);
	}
	private void siftUp(int i) {
		while (i > 0 && heap.get(i).value.compareTo(heap.get((i - 1) / 2).value) < 0 ) {
			swap(i, (i - 1) / 2);
			i = (i - 1) / 2;
		}
	}
	private void siftDown(int i) {
		while (2 * i + 1 < heap.size()) {
			int j = 2 * i + 1;
			if (j + 1 < heap.size() && heap.get(j + 1).value.compareTo(heap.get(j).value) < 0) ++j;
			if (heap.get(i).value.compareTo(heap.get(j).value) > 0) {
				swap(i, j);
				i = j;
			}
			else break;
		}
	}
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于HashHeap的LFU实现 的相关文章

随机推荐

  • 因计算机中丢失msvcr120.dll,msvcr120.dll丢失怎样修复 附解决方法

    运程程序时如果提示这个 那么是因为你的电脑里没有vc 运行库导致的 不要从网上一个一个下载msvcr120 dll这样的文件放到系统目录里 因为有很多文件 真正的解决方法是下载并安装微软VC 2013版运行库 就可以修复这个问题 直接百度搜
  • 算法记录题四

    1 什么是集成学习算法 2 集成学习主要有哪几种框架 并简述他们的工作过程 3 Boosting算法有哪两类 他们之间的区别是什么 4 什么是偏差和方差 5 如何从减少方差和偏差的角度解释Boosting和Bagging的康 6 随机森林的
  • 【MySQL】SQL之CASE WHEN用法详解

    目录 一 简单CASE WHEN函数 二 CASE WHEN条件表达式函数 三 常用场景 场景1 不同状态展示为不同的值 场景2 统计不同状态下的值 场景3 配合聚合函数做统计 场景4 CASE WHEN中使用子查询 场景5 经典行转列 结
  • 51 openEuler搭建PostgreSQL数据库服务器-安装、运行和卸载

    文章目录 51 openEuler搭建PostgreSQL数据库服务器 安装 运行和卸载 51 1 安装 51 2 运行 51 2 1 初始化数据库 51 2 2 启动数据库 51 2 3 登录数据库 51 2 4 配置数据库账号密码 51
  • js实现雪花飘落效果

    js实现雪花飘落效果 我们可以先看看效果 点这里 雪花 其实总的代码都不到 100 行 代码很少 因此 css 样式 和 js 代码我都放在一个 HTML 文件里面了 我们先看看主体的 HTML 代码 div div html 的代码就只有
  • 搭建目标检测模型之Domain Adaptive Faster R-CNN for Object Detection in the Wild

    搭建环境 方法1 直接搭建环境 报错及解决方法 准备数据集 官方数据集 训练模型 测试模型 训练结果 有问题 搭建环境 方法1 直接搭建环境 克隆项目Domain Adaptive Faster RCNN PyTorch git clone
  • 华为od机试题8 真题

    华为od机试题 真题 10 输出最多类型的个数 11 树根节点到最小的叶子节点的路径 12 货车最大载货量 13 太阳能板最大面积 14 单词接龙 17 输出连续出现次数第k多的字母的次数 18 喊7 19 删除出现次数最少的字符 以下题目
  • actuator--基础--08--application.yml配置

    actuator 基础 08 application yml配置 management endpoints 暴露 EndPoint 以供访问 有jmx和web两种方式 exclude 的优先级高于 include jmx exposure
  • windows7 64位机上,libjpeg-turbo的安装和使用

    libjpeg turbo是对libjpeg的扩展 支持SIMD指令 如X86架构的MMX SSE SSE2 3DNOW ARM架构的NEON 在对jpeg进行编码和解码的过程中能提高速度 MMX 多媒体扩展的缩写 第六代CPU芯片重要特点
  • 【Modbus】 RTU CRC校验码计算方法

    Modbus是美国Modicon公司 即现在的Schneider Electric公司 于1979年开发的一种通信协议 其目的是采用一根双绞线实现多个设备之间的通信 Modbus 协议采用问答式的通信方式 具有简单 硬件便宜 通用性强 使用
  • 2023_华为OD机试真题_Java_001_AI处理器组合

    AI处理器组合 题目描述 某公司研发了一款高性能AI处理器 每台物理设备具备8颗AI处理器 编号分别为0 1 2 3 4 5 6 7 编号0 3的处理器处于同一个链路中 编号4 7的处理器处于另外一个链路中 不通链路中的处理器不能通信 如下
  • pip 删除安装包_最新版pip用法一览

    pip 是 Python 包管理工具 该工具提供了对Python 包的查找 下载 安装 卸载的功能 熟练使用此工具 也是python的基本功 https pypi org目前最新版本为20 2 2 以下就以此版本来演示其使用 下面演示 是在
  • pytorch学习(六)---搭建简单的神经网络以及sequential的使用

    本篇自学笔记来自于b站 PyTorch深度学习快速入门教程 绝对通俗易懂 小土堆 Up主讲的非常通俗易懂 文章下方有视频连接 如有需要可移步up主讲解视频 如有侵权 实非故意 深表歉意 请与我联系 删除相关内容 本节以CIFAR10的模型结
  • emwin多语言实现的两种方式

    MCU开发中经常会涉及到多语言的制作和支持 本文将介绍两种制作字库的方法 字库的实现主要包含两部分 一是 字库 一是要显示的字符串 将这两个东西准备好 就可以实现了 第一种方法 详细的可以直接参考这篇博客 可 EMWIN 多国语言实现方法
  • 【信号采集】基于FPGA的高速信号采集系统

    1 高速采集系统实现的功能 FPGA内部功能模块组成 2 高速ADC接口的FPGA实现 3 数字下变频 DDC 的FPGA实现 4 三倍抽取功能的FPGA实现 5 Aurora接口的FPGA实现 高速采集系统的功能和组成 1 实现功能 对中
  • 《消息队列高手课》传输协议:应用程序之间对话的语言

    传输协议就是应用程序之间对话的语言 设计传输协议 并没有太多规范和要求 只要是通信双方的应用程序都能正确处理这个协议 并且没有歧义就好了 这节课 我们就来说一下设计高性能传输协议的一些方法和技巧 如何 断句 既然传输协议也是一种语言 那么在
  • CentOS8基础篇5:用户账号与用户组的创建

    一 用户与用户组概念 Linux是一个多用户 多任务的服务器操作系统 多用户多任务指可以在系统上建立多个用户 而多个用户可以在同一时间内登录同一个系统执行各自不同的任务 而互不影响 Linux用户是根据角色定义的 具体分为三种角色 超级用户
  • C++中拒绝编译器自动生成copy构造函数和copy赋值运算符操作(6)---《Effective C++》

    C 是一片荆棘遍布的雷区 等待用于挑战的你去探索 在 Effective C 系列的第5篇中我们已经看到当用户进行赋值或者拷贝操作的时候 即使我们没有定义拷贝构造函数或者拷贝赋值运算符操作 编译器也会自动为其生成copy构造函数和copy赋
  • P50发布,鸿蒙OS用户突破4000万!

    大家期盼已久的华为 P50 系列手机终于来了 7 月 29 日晚间 华为在线上举行 万象新生 为主题的旗舰新品发布会 华为旗舰新机 P50 系列正式全球发布 太难了 迟到 4 个月的 P50 发布 在今年 6 月份华为鸿蒙 2 0 发布会上
  • 基于HashHeap的LFU实现

    普通heap支持的操作和queue stack一样 就是push pop 只是pop出的是最小值 具体点就是add delMin hashheap支持一般HashMap的功能 同时维护最小值 和LinkedHashMap是对等的 后者是Ha