哈希表

redis缓存Hash操作的在主数据中的应用

和自甴很熟 提交于 2019-11-30 14:37:32
Redis hash是一个string类型的field和value的映射表.一个key可对应多个field,一个field对应一个value 1、如何主数据在redis缓存中实现初始化? 1)加载主数据,建立MasterMain.java package com.taikang.healthcare.master.service; import java.io .IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import

散列表(哈希表)

混江龙づ霸主 提交于 2019-11-30 13:23:45
散列表(哈希表) 散列表是根据键(KEY)来直接访问内存存储位置的一种数据结构,它通过散列函数计算键值对中键(KEY)的散列地址,然后将值存在此地址上,这样就可以直接根据键来取得所对应的值。 散列函数的冲突 对于不同的键(KEY),散列函数得到同一个散列地址,这种现象称为冲突。 如何处理散列冲突 开放定址法 线性探测法:就是一旦冲突了就放到下一个位置就好了,只要存储空间够大总会有位置放的(但是这样会产生堆积,因为他可能会把其他的原来属于别人的位置只是暂时空着的给占了) 二次探测法:冲突了就放在1或者2或者3等等的平方后的位置,而不是像前面那样就是单纯的不停地加1,这样就可以不让关键字对集中在一块地方 伪随机探测法:用一个种子产生一个随机数来作为位移量来避免冲突,然后最后查找这个数在不在的时候也用这个种子生成随机数来找 当散列表存在"堆积"(在函数地址的表中,散列函数的结果不均匀地占据表的单元,形成区块)的情况时,使用开放定址法的效率大大降低,此时不能再使用开放定址法 单链表法:将散列地址值一样的键值对保存在一个链表中。 再散列:在上次散列计算发生冲突时,利用该次冲突的散列函数地址产生新的散列函数地址,直到冲突不再发生。这种方法不易产生"堆积",但增加了计算时间。 公共溢出区:将所有冲突的键值对放在一个数组中。查找时如果在散列表中没有找到就在数组中顺序查找。 散列表的查找效率

LeetCode 706:设计哈希映射 Design HashMap

谁都会走 提交于 2019-11-30 12:31:47
题目: 不使用任何内建的哈希表库设计一个哈希映射 具体地说,你的设计应该包含以下的功能 put(key, value) :向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更新这个值。 get(key) :返回给定的键所对应的值,如果映射中不包含这个键,返回-1。 remove(key) :如果映射中存在这个键,删除这个数值对。 Design a HashMap without using any built-in hash table libraries. To be specific, your design should include these functions: put(key, value) : Insert a (key, value) pair into the HashMap. If the value already exists in the HashMap, update the value. get(key) : Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key. remove(key) : Remove the mapping for the value key if this

LeetCode 705:设计哈希集合 Design HashSet

↘锁芯ラ 提交于 2019-11-30 12:31:40
题目: 不使用任何内建的哈希表库设计一个哈希集合 具体地说,你的设计应该包含以下的功能 add(value) :向哈希集合中插入一个值。 contains(value) :返回哈希集合中是否存在这个值。 remove(value) :将给定值从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。 Design a HashSet without using any built-in hash table libraries. To be specific, your design should include these functions: add(value) : Insert a value into the HashSet. contains(value) : Return whether the value exists in the HashSet or not. remove(value) : Remove a value in the HashSet. If the value does not exist in the HashSet, do nothing. 示例: MyHashSet hashSet = new MyHashSet(); hashSet.add(1); hashSet.add(2); hashSet.contains(1); // 返回

哈希索引和Btree索引的比较

…衆ロ難τιáo~ 提交于 2019-11-30 11:24:08
索引是帮助mysql获取数据的数据结构。最常见的索引是Btree索引和Hash索引。 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引;而Mermory默认的索引是Hash索引。 我们在mysql中常用两种索引算法BTree和Hash,两种算法检索方式不一样,对查询的作用也不一样。 一、BTree BTree索引是最常用的mysql数据库索引算法,因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符,只要它的查询条件是一个不以通配符开头的常量,例如: select * from user where name like ‘jack%’; select * from user where name like ‘jac%k%’; 如果一通配符开头,或者没有使用常量,则不会使用索引,例如: select * from user where name like ‘%jack’; select * from user where name like simply_name; 二、Hash Hash索引只能用于对等比较,例如=,<=>(相当于=)操作符。由于是一次定位数据,不像BTree索引需要从根节点到枝节点,最后才能访问到页节点这样多次IO访问,所以检索效率远高于BTree索引。

Mysql索引笔记

邮差的信 提交于 2019-11-30 10:31:06
索引是帮助mysql高效获得数据的排好序的数据结构(使得查询数据快) Hash索引: 1、因为Hash索引比较的是经过Hash计算的值,所以只能进行等式比较,不能用于范围查询 1、每次都要全表扫描 2、由于哈希值是按照顺序排列的,但是哈希值映射的真正数据在哈希表中就不一定按照顺序排列,所以无法利用Hash索引来加速任何排序操作 3、不能用部分索引键来搜索,因为组合索引在计算哈希值的时候是一起计算的。 4、当哈希值大量重复且数据量非常大时,其检索效率并没有Btree索引高的。 树形索引:二叉树(红黑树(平衡二叉树))缺点:数据量大时,树的高度太高,效率低(树的特点:这边的字节点<根节点<右边子节点) BTree (查询速度快) (mysql索引使用)B+Tree (查询速度更快(非叶子节点之间不存数据,一次I/O可以存更多的索引列),范围查询速度快(叶子节点之间加了指针)) 原文链接:https://blog.csdn.net/u014307117/article/details/47325091 来源: https://www.cnblogs.com/czgxxwz/p/11578948.html

java面试(1)

◇◆丶佛笑我妖孽 提交于 2019-11-30 10:13:56
Java集合详解【面试+工作】 在说集合前我们不得不说一下 数组 数组的作用: 存放一组相同的数据类型(基本或对象)的数据,从而实现对数据的管理 优势: 可以快速的通过下标对数组元素进行访问,效率高 劣势: 容量实现定义好了,不能随着需求变化而扩容 因此出现了更好的集合框架 一、数组和集合的比较 数组不是面向对象的,存在明显的缺陷,集合弥补了数组的缺点,比数组更灵活更实用,而且不同的集合框架类可适用不同场合。如下: 1:数组能存放基本数据类型和对象,而集合类存放的都是对象的引用,而非对象本身! 2:数组容易固定无法动态改变,集合类容量动态改变。 3:数组无法判断其中实际存有多少元素,length只告诉了数组的容量,而集合的size()可以确切知道元素的个数 4:集合有多种实现方式和不同适用场合,不像数组仅采用顺序表方式 5:集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性即可实现各种复杂操作,大大提高了软件的开发效率 二、Java集合 Collection和Map,是集合框架的根接口。 Collection的子接口: Set:接口 ---实现类: HashSet、LinkedHashSet Set的子接口SortedSet接口---实现类:TreeSet List:接口---实现类: LinkedList,Vector,ArrayList List集合

四.python基础数据类型

寵の児 提交于 2019-11-30 08:48:32
一.什么是数据类型? 什么是数据类型?   我们人类可以很容易的分清数字与字符的区别,但是计算机并不能呀,计算机虽然很强大,但从某种角度上看又很傻,除非你明确的告诉它,1是数字,“汉”是文字,否则它是分不清1和‘汉’的区别的,因此,在每个编程语言里都会有一个叫数据类型的东东,其实就是对常用的各种数据类型进行了明确的划分,你想让计算机进行数值运算,你就传数字给它,你想让他处理文字,就传字符串类型给他。Python中常用的数据类型有多种,如下:  整数(int) ,字符串(str),布尔值(bool),列表(list),元组(tuple),字典(dict),集合(set). int。数字:主要用于运算。1 ,2,3... bool。判断真假:True, False. str。简单少量的储存数据,并进行相应的操作。name = 'alex', tuple。只读,不能更改。(1,'alex') list:大量有序数据,[1,'ses',True,[1,2,3],{'name':'jinxin'}] dict:大量数据,且是关联性比较强的数据 {'name':'jinxin','age':18,'name_list':['张三','李四']} 二.基础数据类型。 2.1数字int。 nt,就是咱们常见的数据类型,主要是用于葛总运算,加减乘数等这里就不给你举例说明了。

哈希表(散列表)原理详解

随声附和 提交于 2019-11-30 07:51:18
想要知道什么是哈希表,得先了解哈希函数知道 哈希函数 地址index=H(key) 说白了,hash函数就是根据key计算出应该存储地址的位置,而哈希表是基于哈希函数建立的一种查找表 几种常见的哈希函数(散列函数)构造方法   直接定址法 取关键字或关键字的某个线性函数值为散列地址。 即 H(key) = key 或 H(key) = a*key + b,其中a和b为常数。        除留余数法 取关键字被某个不大于散列表长度 m 的数 p 求余,得到的作为散列地址。 即 H(key) = key % p, p < m。        数字分析法 当关键字的位数大于地址的位数,对关键字的各位分布进行分析,选出分布均匀的任意几位作为散列地址。 仅适用于所有关键字都已知的情况下,根据实际应用确定要选取的部分,尽量避免发生冲突。        平方取中法 先计算出关键字值的平方,然后取平方值中间几位作为散列地址。 随机分布的关键字,得到的散列地址也是随机分布的。        折叠法(叠加法) 将关键字分为位数相同的几部分,然后取这几部分的叠加和(舍去进位)作为散列地址。 用于关键字位数较多,并且关键字中每一位上数字分布大致均匀。          随机数法 选择一个随机函数,把关键字的随机函数值作为它的哈希值。 通常当关键字的长度不等时用这种方法。 构造哈希函数的方法很多

HashTable和HashMap的区别详解

拜拜、爱过 提交于 2019-11-30 07:21:37
一、HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。 HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。 HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。 HashMap存数据的过程是: HashMap内部维护了一个存储数据的Entry数组,HashMap采用链表解决冲突,每一个Entry本质上是一个单向链表。当准备添加一个key-value对时,首先通过hash(key)方法计算hash值,然后通过indexFor(hash,length)求该key-value对的存储位置,计算方法是先用hash&0x7FFFFFFF后,再对length取模,这就保证每一个key-value对都能存入HashMap中,当计算出的位置相同时,由于存入位置是一个链表,则把这个key-value对插入链表头。 HashMap中key和value都允许为null。key为null的键值对永远都放在以table[0]为头结点的链表中。 了解了数据的存储,那么数据的读取也就很容易就明白了。 HashMap的存储结构,如下图所示: 图中