哈希表

python—dict使用注意点

廉价感情. 提交于 2020-01-29 19:59:49
在python中,dict和list是两种常见数据类型,dict用于内容空间足够、根据值快速检索的场景,list用于内存空间有限、根据下标快速检索的场景。 使用场景: List:类似于C中的array数组,数据存储在一段连续内存空间中;根据值查询时候,需要从头到尾逐一遍历,复杂度O(N),但根据索引index查询时候,直接做索引index偏移,复杂度O(1)。 Dict:在python底层实现为可变哈希表,本质也可以看做List,区别在于List只存放数值,而Dict存放数值所对应的索引+数值。 原理说明: List:python底层实现为一个长度可变的数组,数组中存放的是每个元素的索引inference,根据索引查询不受List长度和所存放的元素影响。对于频繁的append和insert操作,CPython会额外进行一些技巧,比如频繁append时候会额外分配比实际需要大一些的空间,避免频繁开辟空间。 Dict:可变哈希表,key通过hash函数映射为哈希值,哈希值进一步映射到哈希表大小size的位置index上,value的地址就存放在index所对应的空间上。说明:Dict中的key必须是可哈希(python中不可变数据都是可哈希的,而可变数据则不可哈希),原因是一旦key可变,key发生变化之后,则无法根据变化后的新key值查询到value

Golang基础知识-07-哈希表

我怕爱的太早我们不能终老 提交于 2020-01-29 18:16:42
哈希表 import "fmt" func main ( ) { m := map [ string ] int { } fmt . Println ( m ) // map[] m1 := map [ string ] int { "A" : 1 , "B" : 2 , } fmt . Println ( m1 ) // map[A:1 B:2] m2 := make ( map [ string ] int , 32 ) // 给make一个合理的元素数量参数,可以预申请内存,避免后续频繁扩张,从而提升性能 fmt . Println ( m2 ) // map[] } 来源: CSDN 作者: Landercy 链接: https://blog.csdn.net/Landercy/article/details/104107985

Java--集合框架之Map接口

别等时光非礼了梦想. 提交于 2020-01-29 13:44:26
Java集合框架总图 Map接口和具体实现类 Java集合总体分为两个根接口,Map和Collection,其中Collection是单列集合,Map是双列集合。 Map与List、Set接口不同,它并不继承自Collection,它是由一系列键值对组成的集合,提供了key到value的映射。在Map中一个key对应一个value,所以key的存储不可重复,但value可以。 哈希结构——通过关键码找到值的数据结构 哈希函数——建立关键字和值的映射关系 注:好的哈希函数能使值均匀的分步在哈希结构中 生成哈希函数的两种方式 (1)直接寻址法:f(x)=kx+b(k和b是常数) (2)除留余数法:f(x)=x mod m (m<p)(m小于哈希长度p) 哈希冲突的两种解决方式 (1)链地址法:当发生哈希冲突时,将哈希到对应位置的值连接在该位置的数据后面。 (2)线性探测法 Map接口常用方法 int size ( ) ; //map集合中存储的键值对的个数 boolean isEmpty ( ) ; //判断map集合是否为空 true:空 false:不为空 boolean containsKey ( Object key ) //判断集合中是否存在该键key boolean containsValue ( Object value ) ; ////判断集合中是否存在该值value

常见快速搜索算法图解

喜夏-厌秋 提交于 2020-01-29 11:03:51
搜索 搜索是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的,因为该项目是否存在。搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找 二分查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 二分查找的实现 (非递归实现) def binary_search_2 ( alist , item ) : """二分查找:while版""" n = len ( alist ) first = 0 last = n - 1 while first <= last : mid = ( first + last ) // 2 if alist [ mid ] == item : return True elif item < alist [ mid ] : last = mid - 1 else : first = mid + 1

LeetCode题解001:两数之和

故事扮演 提交于 2020-01-29 08:57:08
两数之和 题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] Java: 方法一:暴力法 暴力法很简单,就是用两遍循环的方式遍历nums class Solution { public int[] twoSum(int[] nums, int target) { for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { if (nums[j] == target - nums[i]) { return new int[] { i, j }; } } } throw new IllegalArgumentException("No two sum solution"); } } 复杂度分析: 时间复杂度:O(n^2) 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n) 的时间。因此时间复杂度为 O(n^2)

哈希表总结

耗尽温柔 提交于 2020-01-29 07:24:07
哈希算法总结 散列函数 除法散列法 乘法散列法 全域散列法 冲突解决办法 拉链法 开放寻址法 线性探查 二次探查 双重散列 直接寻址法 直接寻址技术 ,顾名思义,为每一个关键字分配一个槽,适用于全域数量较少,并且对内存并不要求的情况下,这种方法可以保证了其每一个操作的时间复杂度都是O(1)。 但是很明显的是,当全域特别大的时候,这意味着我们要创建一个内容特别大的数组,如果关键字较少则会造成空间的浪费,于是我们想出了使用散列表,控制数组的长度,通过使用散列函数( 除法散列法、乘法散列法、全域散列法等 ),找出关键字对应到各自相应的槽,也就是说,如果我们能够平均的分配关键字到相应的槽,避免冲突,则可以实现直接寻址技术一样的效果,同时还大大的减少了内存。 理想情况下,冲突可以完全避免,但是现实中,我们可以通过散列函数尽量的避免冲突,尽可能的使其随机化,同时还是会不可避免的发生冲突,此时我们还可以通过 拉链法或者开放寻址法 来解决冲突。 散列函数 1. 除法散列表 通过取 k 除以 m 的余数,将关键字映射到m个槽中。 2. 乘法散列表 乘法包括两个步骤,先是将关键字 k 乘以一个常数A(0 < A < 1),然后取其小数部分,乘以m后向下取整。 3. 全域散列法 表示随机的选择一种散列函数,将关键字映射到散列函数,然后通过计算返回槽的位置。 解决冲突 1. 拉链法

redis五大类型用法

我的未来我决定 提交于 2020-01-29 03:39:33
Redis五大类型:字符串(String)、哈希/散列/字典(Hash)、列表(List)、集合(Set)、有序集合(sorted set)五种Controller:@Resource RedisTemplate<String, String> redisTemplate;总括:redisTemplate.opsForValue();//操作字符串redisTemplate.opsForHash();//操作hashredisTemplate.opsForList();//操作listredisTemplate.opsForSet();//操作setredisTemplate.opsForZSet();//操作有序setString: 1.redisTemplate.opsForValue().set(key,value)); 2.redisTemplate.opsForValue().get(key)); 3.redisTemplate.opsForValue().get(key, start, end);4.redisTemplate.opsForValue().getAndSet(key, value);5.redisTemplate.opsForValue().getBit(key, offset);//下方注释6.redisTemplate.opsForValue()

作业三

丶灬走出姿态 提交于 2020-01-29 00:52:59
作业地址: GitHub项目地址:https://github.com/pbnbpb/WordCount.git 结对伙伴博客地址: https://www.cnblogs.com/Xl2248570171/p/10636087.html PSP表格: PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 10 15 · Estimate · 估计这个任务需要多少时间 10 15 Development 开发 200 300 · Analysis 需求分析 (包括学习新技术) 30 100 · Design Spec · 生成设计文档 · Design Review · 设计复审 (和同事审核设计文档) · Coding Standard 代码规范 (为目前的开发制定合适的规范) 25 25 Design 具体设计 10 15 Coding 具体编码 180 300 Code Review 代码复审 30 45 Test 测试(自我测试,修改代码,提交修改) 15 25 Reporting 报告 20 30 Test Report 测试报告 10 20 Size Measurement 计算工作量 Postmortem & Process Improvement Plan 事后总结,

数据结构--哈希表

筅森魡賤 提交于 2020-01-28 23:04:11
1.哈希表(散列)-Google 上机题 1)看一个实际需求,Google 公司的一个上机题: 2)有一个公司,当有新的员工来报到时,要求将该员工的信息加入(id,性别,年龄,住址...),当输入该员工的id时,要求查 找到该员工的所有信息。 3)要求:不适用数据库,尽量节省内存,速度越快越好=> 哈希表(散列) 2.哈希表的基本介绍 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值 映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 Google 公司的一个上机题: 有一个公司,当有新的员工来报到时,要求将该员工的信息加入(id,性别,年龄,住址...),当输入该员工的id时,要求查 找到该员工的所有信息。 要求: 1)不使用数据库,速度越快越好=>哈希表(散列) 2)添加时,保证按照id从低到高插入[课后思考:如果id不是从低到高插入,但要求各条链表仍是从低到高,怎么解决?] 3)使用链表来实现哈希表,该链表不带表头[即:链表的第一个结点就存放雇员信息] 4)思路分析并画出示意图 5)代码实现 package com.example.demo.hashtable; import java.util.Scanner; public class

散列

百般思念 提交于 2020-01-28 21:43:03
什么是哈希表? 原文链接:https://blog.csdn.net/yyyljw/article/details/80903391 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 哈希表hashtable(key,value) 就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。(或者:把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。) 数组的特点是:寻址容易,插入和删除困难; 而链表的特点是:寻址困难,插入和删除容易。 那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法——拉链法