哈希表

哈希表

会有一股神秘感。 提交于 2019-11-27 01:25:34
1、哈希表解决什么问题?   假设有一组记录,每条记录都是学生名,成绩的键值对,在一般的线性表中,每条记录的存放是没有规律的。如果要找Andy的成绩,因为不知道Andy这条记录的存放位置,必须遍历集合,逐个比较,找到Andy这条记录,取出成绩。时间复杂度为O(N),效率很低。哈希表就是解决这个问题的。 2、如何解决的?   上面问题的关键是,根据学生名不能确定存放位置,哈希表是这样做的:设计一个映射函数,把学生名映射到存放的地址。这样就行了,给我一个学生名,我只要根据映射函数计算一下,就知道了存放位置,直接去那个地方去数据,时间复杂度为O(1)。同样当插入记录的时候,根据映射函数计算一下,这条记录应该放在哪个位置,把记录放在那个地方就好了。 3、哈希表中存放的是key-value对。使用映射函数,把key映射一个存放地址(注意:这里的地址可认为是Hash地址,不是真实的物理地址)。对于映射函数,需要注意:a、计算要简单,复杂计算会影响效率。b、散列地址分布均匀,不然会频繁地照成冲突。 4、映射函数引入一个问题,那就是不同的key可能会映射到相同的位置,插入元素的时候,就冲突了。解决冲突的办法有:   a、开放定址法:冲突了。就去寻找下一个空的地址。   b、再次哈希:再次映射找到一个空的地址。   c、链地址法:每个地址可以存放一系列元素,冲突了,就在当前元素后面加。   d

mysql索引原理及优化(二)

拜拜、爱过 提交于 2019-11-27 01:05:11
索引原理分析:数据结构 索引是最常见的慢查询优化方式 其是一种优化查询的数据结构,MySql中的索引是用B+树实现,而B+树就是一种数据结构,可以优化查询速度,可以利用索引快速查找数据,优化查询。 可以提高查询速度的数据结构: 哈希表、完全平衡二叉树、B树、B+树等等 。 哈希 :select* from sanguo where name>'周瑜 哈希表的特点是可以快速的精确查询,但是 不支持范围查询 。 完全平衡二叉树 :对于数据量大情况,它相比于哈希或者B树、B+树需要 查找次数更多 。 B树 :比完全平衡二叉树要矮,查询速度更快,所需索引空间更小。 B+树 :B+树比B树要胖,B+树的非叶子节点会冗余一份在叶子节点中,并且也在 叶子节点会用指针相连 。 B树相比完全平衡二叉树查询次数更少,即有更少的磁盘IO次数,性能更优; B+树是B树的升级版 ,其为了提高范围查找的效率。 总结:Mysql选用B+树这种数据结构作为索引, 可以提高查询索引时的磁盘IO效率,并且可以提高范围查询的效率,并且B+树里的元素也是有序的。 索引的最左前缀原则:当建立多个字段联合索引时,如(a,b,c) 查询条件只会走三类索引 即 a 、 ab 、 abc, ac也走,但是只走a索引。 为什么哈希表、完全平衡二叉树、B树、B+树都可以优化查询,为何Mysql独独喜欢B+树? 哈希表有什么特点?

redis常用命令大全

前提是你 提交于 2019-11-27 00:28:15
参考资料 http://doc.redisfans.com/ redis服务相关 redis启动 $ redis-cli # 本地启动链接 $ redis-cli -h host -p port -a password #远程启动 验证密码是否正确 $ AUTH password 打印字符串 $ ECHO message 查看服务是否运行 $ PING 关闭当前连接 $ QUIT 切换指定数据库 $ SELECT index redis key命令 删除给定的一个或多个key,不存在的key会忽略掉 $ DEL key [key ...] # 返回被删除key的数量 检查给定的key是否存在 $ EXISTS key # 存在返回1,否则返回0 设置key的过期时间 $ EXPIRE key time # 设置成功返回1 设置key指定的过期时间 $ EXPIREAT key timestamp # 设置成功返回1,key不存在或者无法设置,返回0 查找所有符合给定模式pattern的key $ KEYS * # 匹配数据库中所有key $ KEYS h?llo # 匹配hello, hallo和hxllo等 $ KEYS h*llo # 匹配hllo,heeeeeello等 $ KEYS h[ae]llo # 匹配hello,hallo,但是不匹配hxllo

D9-哈希表[Java数据结构和算法]

半腔热情 提交于 2019-11-26 23:51:14
1. 哈希表的介绍和内存布局   1.1哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表   1.2 哈希表图例 2.哈希表实现思路图解   2.1 使用哈希表管理雇员信息的源代码 1 package cn.atguigu.Hashtable; 2 3 import java.util.Scanner; 4 5 public class HashTableDemo { 6 public static void main(String[] args) { 7 //创建哈希表 8 HashTable hashTable=new HashTable(7); 9 //简单菜单 10 String key=""; 11 Scanner scanner=new Scanner(System.in); 12 while(true) { 13 System.out.println("add:添加雇员"); 14 System.out.println("list:显示雇员"); 15 System.out.println("find:查找雇员"); 16 System.out.println("exit:退出系统"); 17 18

leetcode 1. 两数之和(Two Sum)

巧了我就是萌 提交于 2019-11-26 22:39:42
leetcode 1. 两数之和(Two Sum) 1.题目描述 2.解答 1.题目描述 [1] 两数之和 https://leetcode-cn.com/problems/two-sum/description/ algorithms Easy (45.67%) Total Accepted: 323.7K Total Submissions: 708.9K Testcase Example: ‘[2,7,11,15]\n9’ 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 2.解答 暴力法 暴力法很简单。遍历每个元素 x,并查找是否存在一个值与 target - x相等的目标元素。但是python实现的代码运行会超时。 两遍哈希表 为了对运行时间复杂度进行优化,我们需要一种更有效的方法来检查数组中是否存在目标元素。如果存在,我们需要找出它的索引。保持数组中的每个元素与其索引相互对应的最好方法是什么?哈希表。 通过以 空间换取速度 的方式,我们可以将

Redis散列与有序集合

孤街浪徒 提交于 2019-11-26 22:10:38
前面文章我们介绍了列表与集合中的基本命令,本文我们来看看Redis中的散列与有序集合。 本文是Redis系列的第六篇文章,了解前面的文章有助于更好的理解本文: 1. Linux上安装Redis 2. Redis中的五种数据类型简介 3. Redis字符串(STRING)介绍 4. Redis字符串(STRING)中BIT相关命令 5. Redis列表与集合 散列 很多时候,散列就像一个微缩版的redis,在本文中,小伙伴们对看到的许多散列命令都会有似曾相识的感觉。 HSET HSET命令可以用来设置key指定的哈希集中指定字段的值,如下: 127.0.0.1:6379> HSET k1 h1 v1 (integer) 1 HGET HGET命令可以用来返回key指定的哈希集中该字段所关联的值,如下: 127.0.0.1:6379> HGET k1 h1 "v1" HMSET HMSET命令可以批量设置key指定的哈希集中指定字段的值,如下: 127.0.0.1:6379> HMSET k2 h1 v1 h2 v2 h3 v3 OK HMGET HMGET可以批量返回key指定的哈希集中指定字段的值,如下: 127.0.0.1:6379> HMGET k2 h1 h2 h3 1) "v1" 2) "v2" 3) "v3" HDEL HDEL命令可以从key指定的哈希集中移除指定的域

Redis的5大数据类型简介及示例

余生长醉 提交于 2019-11-26 22:06:24
1、Redis 键(key) Redis 键命令用于管理 redis 的键。 命令 描述 示例 DEL key 用于删除某个key DEL k1 DUMP key 序列化指定key并返回序列化之后的值 DUMP k1 EXISTS key 检测key是否存在 EXISTS k1 PEXPIRE key milliseconds 设置key的过期时间以毫秒计 PEXPIRE k1 30 KEYS pattern 查找所有符合(pattern)的key keys * MOVE key db 将当前key移动到指定db中 MOVE k1 2 PERSIST key 移除key的过期时间 PERSIST k1 PTTL key 以毫秒为单位返回key的剩余过期时间 PTTL k1 TTL key 以秒为单位,返回给定 key 的剩余生存时间 TTL k1 RANDOMKEY 从当前DB随机返回一个key RANDOMKEY RENAME key newkey 修改key名称 RENAME k1 k2 RENAMENX key newkey 当 newkey 不存在时,将 key 改名为 newkey 。 RENAMENX k1 k3 TYPE key 返回key所储存值的类型 type k2 2、Redis 字符串(String) 用于管理 redis 字符串值 命令 描述 示例 SET

Hashtable 的用法

僤鯓⒐⒋嵵緔 提交于 2019-11-26 21:44:14
一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似 key/value 的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对. 二,哈希表的简单操作 在哈希表中添加一个key/value键值对:HashtableObject. Add(key,value) ; 在哈希表中去除某个key/value键值对:HashtableObject. Remove(key) ; 从哈希表中移除所有元素: HashtableObject. Clear() ; 判断哈希表是否包含特定键key: HashtableObject. Contains(key) ; 下面控制台程序将包含以上所有操作: using System; using System.Collections; //使用Hashtable时,必须引入这个命名空间 class hashtable { public static void Main() { Hashtable ht=new Hashtable(); //创建一个Hashtable实例

哈希表 - 集合(set) 和 字典(dict)

主宰稳场 提交于 2019-11-26 21:39:57
集合 简介 set :set对象是由hashable 对象所组成的无序集合,set对象的每一个元素要求可进行哈希运算,set 会对内部元素进行去重,每个元素在同一个set 中只会出现一次,由于set对象可变性,所以set 对象自身不可哈希。 frozenset : frozenset 对象可以看成一个不可变set对象,是一个可哈希对象,可以最为frozenset、set 的元素或 dict 的 key 。 创建set对象 可哈希对象 :在python常见的数据类型中,数值类型,字符串,元组,frozenset,bytes等属于可哈希对象。 # 直接创建 s1 = {1, 2, (1, 4), 'b', 0x23, "\x61"} # 内部元素为可哈希对象 s2 = set() # 空set,不可使用s = { } # set( iter ) # 可迭代对象 s3 = set(range(5)) 集合常用方法 frozenset的创建方法和set相同, 其他 共同的方法如下 len(s) :返回集合 s 中的元素数量(即 s 的基数)。 x in s :检测 x 是否为 s 中的成员。 x not in s :检测 x 是否非 s 中的成员。 set方法 对于可变的set 对象,可以对其进行增加(add),删除(remoe、pop、discard、clear)等操作 #

映射&集合

[亡魂溺海] 提交于 2019-11-26 20:59:17
哈希函数 通过哈希表可以实现 O(1) 复杂度的查找。 哈希函数构造方法: 设计好的哈希函数的两个基本原则,计算简单+分布均匀 1. 直接定址法   用key自身的某个线性函数来定址,f(key) = a*key + b。但需要知道关键字的分布情况。 2. 数字分析法   适合处理关键字位数比较大的情况。抽取关键字的一部分作为哈希地址。 3. 平方取中法   将key平方后取中间若干位数字作为哈希地址。 4. 折叠法   将key分为位数相等的几个部分,将这几部分叠加求和,按哈希表表长取后几位作为哈希地址。 5. 除留余数法   最常用。对哈希表长为m,f(key) = key mod p ,p小于等于m。p的选择非常重要,选的不好可能造成哈希冲突。 处理哈希冲突的方法: key1 != key2 但 f(key1) == f(key2),哈希冲突。 1. 开放定址法:一旦发生冲突,就去找下一个空的哈希地址,只要哈希表足够大,总能找到空的哈希地址。   fi(key) = (f(key)+di) mod p,di = 1, 2, ..., p-1 线性探测法。   直接这样取值di比较盲目,可以通过修改di的取值方式,例如平方运算,来尽量解决堆积问题,二次探测法。   fi(key) = (f(key)+di) mod p,di = 1 2 , -1 2 , 2 2 , -2 2