算法设计与分析 哈希函数与哈希表

简介: 算法设计与分析 哈希函数与哈希表

哈希函数与哈希表

哈希函数

基本概念:

  • out = f( in )
  • in输入域,默认是无穷的;out输出域,有限的
  • 相同的输入返回相同的输出值(哈希函数中没有随机的成分)
  • 不同的输入可能会产生相同的输出(哈希碰撞,概率非常低)
  • 哈希函数的散列性:哈希函数要维持输出域的均匀性与离散性(近似的输入数据映射到输出域上在整个输出域上是均匀的,离散的,即输出的差别很大)

应用

例:大量数据的统计

若在有1 ~ 2 ^ 32的数据中统计不同数字出现的次数

  • 常规思路:使用hashMap(key,value),key是对应的数字,value是key出现的次数,但若key很多会造成空间的大量使用
  • 优化:将数字先使用哈希函数进行一次映射,再将映射的结果进行模100的操作,将数据分成100份分别去统计,统计完一份就释放空间进行下一次的统计。这样空间就可以缩小100倍

哈希表

基本概念:

  • 数据经过哈希函数得到某个整数型值,将该数据存入对应的哈希表:就是将哈希函数得到的值对哈希表对应的数值取模,经计算后存入对应位置,方便查找
  • 根据哈希哈希函数的散列性,哈希链表的长度应该是均匀增长的image.png
  • 如图是模16的哈希表,若数据量过大,则选择扩容为模32的,重新计算每个节点对应的位置
  • 在哈希表中增,删,查找数据的时间复杂度都是O(1)的,只是常数项很大。若哈希表已有 n 个数据链的最大长度为 k 则扩容的时间复杂度为(logn),以k为底的n次

题目:设计RandomPool结构

image.png

  • 思路:增删操作在HashMap中都可以完成,重要的是实现随机放回的功能
    (1)建立两个HashMap,一个为< key, size >,另一个为 < size,key>,其中size为目前哈希表中的元素个数
    (2)getRandom操作便可以通过随机数产生 0 ~ size - 1范围的数字通过 < size,key>的哈希表获得key
    (3)在delete操作时为了保证 0 ~ size - 1位置上的连续性,要将最后一个位置的元素填充到删除位置,size在减一
    public static class Pool<Key>{
        private HashMap<Key, Integer> keyIndexMap;
        private HashMap<Integer, Key> indexKeyMap;
        private int size;
        public Pool(){
            //初始化
            this.keyIndexMap = new HashMap<>();
            this.indexKeyMap = new HashMap<>();
            this.size = 0;
        }
        public void insert(Key key){
            if (!keyIndexMap.containsKey(key)){
                //建立 key 与 size直接的双射关系
                keyIndexMap.put(key, size);
                indexKeyMap.put(size, key);
                size++;
            }
        }
        public void delete(Key key){
            if (keyIndexMap.containsKey(key)){
                //为了保证 0 ~ size - 1的连续性
                //keyIndexMap中删除 <key, deleteIndex>,加入 <lastKey,deleteIndex>
                //indexKeyMap中删除 <lastIndex, lastKey>,更新 <deleteIndex,lastKey>
                int deleteIndex = keyIndexMap.get(key);
                int lastIndex = --size;
                Key lastKey = indexKeyMap.get(lastIndex);
                keyIndexMap.remove(key);
                indexKeyMap.remove(lastIndex);
                keyIndexMap.put(lastKey, deleteIndex);
                indexKeyMap.put(deleteIndex, lastKey);
            }
        }
        public Key getRandom(){
            if (size == 0){
                return null;
            }
            // 0 ~ size - 1的随机数
            int random = (int)(Math.random() * size);
            return indexKeyMap.get(random);
        }
    }
    public static void main(String[] args) {
        Pool<String> pool = new Pool<>();
        pool.insert("l");
        pool.insert("j");
        pool.insert("k");
        System.out.println(pool.getRandom());
    }
  • 结果演示image.png


目录
相关文章
|
28天前
|
数据采集 机器学习/深度学习 算法
|
23天前
|
人工智能 算法 BI
第一周算法设计与分析 D : 两面包夹芝士
这篇文章介绍了解决算法问题"两面包夹芝士"的方法,通过找出两个数组中的最大最小值,计算这两个值之间的整数个数,包括特判不存在整数的情况。
|
15天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
1天前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
11 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
23天前
|
算法
算法设计与分析作业
这篇文章是关于算法设计与分析的作业,其中包含了两个算法实现:一个是使用分治算法实现的十进制大整数相乘(包括加法、减法和乘法函数),并进行了正确性和健壮性测试;另一个是使用快速排序思想实现的分治查找第K小元素的程序,并分析了其平均和最坏时间复杂度。
算法设计与分析作业
|
1月前
|
算法 Java 测试技术
算法分析(蛮力法与减治算法应用实验报告)
这篇文章是关于算法分析的实验报告,介绍了如何使用蛮力法解决背包问题,并通过伪代码和Java代码实现,同时分析了其时间效率;还介绍了基于减治法思想实现的二叉查找树的插入与查找,同样提供了伪代码、Java源代码实现和时间效率分析,最后展示了测试结果截图。
算法分析(蛮力法与减治算法应用实验报告)
|
19天前
|
编解码 算法 图形学
同一路RTSP|RTMP流如何同时回调YUV和RGB数据实现渲染和算法分析
我们播放RTSP|RTMP流,如果需要同时做渲染和算法分析的话,特别是渲染在上层实现(比如Unity),算法是python这种情况,拉两路流,更耗费带宽和性能,拉一路流,同时回调YUV和RGB数据也可以,但是更灵活的是本文提到的按需转算法期望的RGB数据,然后做算法处理
|
1月前
|
机器学习/深度学习 数据采集 算法
【优秀python算法毕设】基于python时间序列模型分析气温变化趋势的设计与实现
本文介绍了一个基于Python的时间序列模型,用于分析和预测2021-2022年重庆地区的气温变化趋势,通过ARIMA和LSTM模型的应用,揭示了气温的季节性和趋势性变化,并提供了对未来气温变化的预测,有助于气象预报和相关决策制定。
【优秀python算法毕设】基于python时间序列模型分析气温变化趋势的设计与实现
|
23天前
|
人工智能 算法
第一周算法设计与分析:C : 200和整数对之间的情缘
这篇文章介绍了解决算法问题"200和整数对之间的情缘"的方法,通过统计数组中每个数模200的余数,并计算每个同余类中数的组合数来找出所有满足条件的整数对(i, j),使得\( A_i - A_j \)是200的整数倍。
|
23天前
|
人工智能 算法
第一周算法设计与分析 G : 排队援救
这篇文章介绍了解决算法问题"排队援救"的方法,通过使用队列和映射来模拟救援点的排队过程,并确定最终得到救援的人的顺序和编号。