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

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

哈希函数与哈希表

哈希函数

基本概念:

  • 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


目录
相关文章
|
1月前
|
算法
计算机算法设计与分析(1-6章 复习笔记)
计算机算法设计与分析(1-6章 复习笔记)
|
5天前
|
算法 开发者 Python
惊呆了!Python算法设计与分析,分治法、贪心、动态规划...这些你都会了吗?不会?那还不快来学!
【7月更文挑战第10天】探索编程巅峰,算法至关重要。Python以其易读性成为学习算法的首选。分治法,如归并排序,将大问题拆解;贪心算法,如找零问题,每步求局部最优;动态规划,如斐波那契数列,利用子问题解。通过示例代码,理解并掌握这些算法,提升编程技能,面对挑战更加从容。动手实践,体验算法的神奇力量吧!
26 8
|
11天前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
181 1
|
4天前
|
算法 搜索推荐 编译器
算法高手养成记:Python快速排序的深度优化与实战案例分析
【7月更文挑战第11天】快速排序是编程基础,以O(n log n)时间复杂度和原址排序著称。其核心是“分而治之”,通过选择基准元素分割数组并递归排序两部分。优化包括:选择中位数作基准、尾递归优化、小数组用简单排序。以下是一个考虑优化的Python实现片段,展示了随机基准选择。通过实践和优化,能提升算法技能。**
8 3
|
6天前
|
数据采集 搜索推荐 算法
Python基于协同过滤算法进行电子商务网站用户行为分析及服务智能推荐
Python基于协同过滤算法进行电子商务网站用户行为分析及服务智能推荐
|
6天前
|
存储 算法 Python
震撼!Python算法设计与分析,分治法、贪心、动态规划...这些经典算法如何改变你的编程世界!
【7月更文挑战第9天】在Python的算法天地,分治、贪心、动态规划三巨头揭示了解题的智慧。分治如归并排序,将大问题拆解为小部分解决;贪心算法以局部最优求全局,如Prim的最小生成树;动态规划通过存储子问题解避免重复计算,如斐波那契数列。掌握这些,将重塑你的编程思维,点亮技术之路。
14 1
|
7天前
|
算法 索引 Python
Python算法设计与分析大揭秘:分治法、贪心算法、动态规划...掌握它们,让你的编程之路更加顺畅!
【7月更文挑战第8天】探索Python中的三大算法:分治(如快速排序)、贪心(活动选择)和动态规划(0-1背包问题)。分治法将问题分解求解再合并;贪心策略逐步求局部最优;动态规划通过记忆子问题解避免重复计算。掌握这些算法,提升编程效率与解决问题能力。
15 1
|
24天前
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
19 1
|
26天前
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】贝叶斯算法在机器学习中的应用与实例分析
【机器学习】贝叶斯算法在机器学习中的应用与实例分析
72 1
|
6天前
|
机器学习/深度学习 数据采集 算法
Python基于Lasso特征选择、GM算法和SVR回归算法进行财政收入影响因素分析及预测
Python基于Lasso特征选择、GM算法和SVR回归算法进行财政收入影响因素分析及预测