哈希表

AcWing 841. 字符串哈希

≡放荡痞女 提交于 2019-12-04 02:40:46
//快速判断两次字符串是不是相等 #include<bits/stdc++.h> using namespace std ; typedef unsigned long long ULL; const int N=100010,P=131;//经验值 13331 这两个出错情况最少 int n,m; char str[N]; ULL h[N],p[N];//h表示某一个前缀的哈希值,p是幂 ULL get(int l,int r) { return h[r]-h[l-1]*p[r-l+1];//返回某一段的哈希值 } int main() { cin>>n>>m>>str+1; p[0]=1;//p的0次方为1 for(int i=1; i<=n; i++) { p[i]=p[i-1]*P;//求幂 h[i]=h[i-1]*P+str[i];//求前缀哈希值 } while(m--) { int l1,r1,l2,r2; cin>>l1>>r1>>l2>>r2; if(get(l1,r1)==get(l2,r2)) puts("Yes");// 如果哈希值相等 else puts("No"); } return 0; } 来源: https://www.cnblogs.com/QingyuYYYYY/p/11828729.html

AcWing 840. 模拟散列表

对着背影说爱祢 提交于 2019-12-04 02:39:51
拉链法 #include<cstring> #include<iostream> using namespace std ; const int N=100003; int h[N],e[N],ne[N],idx; void insert(int x) { int k=(x%N+N)%N;//哈希函数 //模拟单链表 e[idx]=x;//先存下来 ne[idx]=h[k];//指向负1 h[k]=idx++;//原来的数字指向idx } bool find(int x) { int k=(x%N+N)%N; for(int i=h[k]; i!=-1; i=ne[i]) { if(e[i]==x) return true; } return false; } int main() { int n; cin>>n; memset(h,-1,sizeof h); while(n--) { char op[2]; int x; cin>>op>>x; if(*op=='I') insert(x); else { if(find(x)) cout<<"Yes"<<endl; else cout<<"No"<<endl; } } return 0; } 开放寻址法 #include <cstring> #include <iostream> using namespace std;

Java 8系列之重新认识HashMap

别来无恙 提交于 2019-12-04 00:00:38
摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。 简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类的特点做一些说明: (1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。 (2) Hashtable:Hashtable是遗留类,很多映射的常用功能与HashMap类似,不同的是它承自Dictionary类

Java8——重新认识HashMap

拟墨画扇 提交于 2019-12-04 00:00:20
摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。 简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类的特点做一些说明: (1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。 (2) Hashtable:Hashtable是遗留类,很多映射的常用功能与HashMap类似,不同的是它承自Dictionary类

力扣算法——138CopyListWithRandomPointer【M】

邮差的信 提交于 2019-12-03 21:15:27
A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null. Return a deep copy of the list. Example 1: Input: {"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1} Explanation: Node 1's value is 1, both of its next and random pointer points to Node 2. Node 2's value is 2, its next pointer points to null and its random pointer points to itself. Note: You must return the copy of the given head as a reference to the cloned list. Solution:    方法一:      使用哈希表,将链表值与节点地址对应,先复制一条主链

hash命令使用说明

a 夏天 提交于 2019-12-03 20:16:10
1、命令概述 hash命令负责显示与清除命令运行时系统优先查询的哈希表(hash table)。 当执行hash命令不指定参数或标志时,hash命令向标准输出报告路径名列表的内容。此报告含有先前hash命令调用找到的当前shell环境中命令的路径名。而且还包含通过正常命令搜索进程调用并找到的那些命令。 2、命令语法 hash【选项】 【参数】 3、命令选项 -d<指令>:在哈希表中清除某个命令记录记录 -l:显示哈希表中的命令 -p<指令>:将具有完整路径的命令加入到哈希表中 -r:清除哈希表中的所有记录 -t<指令>:显示哈希表中命令的完整路径 4、命令示例 4.1 显示hash表中的命令: 1 [root@lzg ~]# hash 2 hits command 3 4 /usr/bin/tty 4 4 /usr/bin/who 5 2 /usr/bin/w 6 [root@lzg ~]# hash -l 7 builtin hash -p /usr/bin/tty tty 8 builtin hash -p /usr/bin/who who 9 builtin hash -p /usr/bin/w w 4.2 -p 向哈希表中添加命令: 1 [root@lzg ~]# hash -p /usr/sbin/adduser myadduser 2 [root@lzg ~]#

深入理解HashMap

两盒软妹~` 提交于 2019-12-03 19:49:01
深入理解hashMap hashMap简介 hashMap初始化 hash碰撞 hashMap结构图 深入理解hashMap hashMap简介 HashMap是一种以K-V存储的集合对象,结合了数组结构查询快和链表结构插入、删除快的特点;它允许key、value为null 是一种无序并且线程不安全的集合对象。 hashMap初始化 hashMap的实例有两个参数影响其性能:”初始容量”和”加载因子”。容量是哈希表中桶的数量,初始容量知识哈希表在创建时的容量。加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的元素数超出了加载因子与当前容量的乘积时,就要对这个哈希进行rehash,从而哈希表将具有两倍左右的桶数。默认的加载因子为0.75,这是在速度和空间上的折中,加载因子过高减少空间但也增加了查询速度。在设置初始容量时应该考虑元素的总数,以此来减少rehash的次数。当初始容量大于总元素数除以加载因子时就不会发生rehash。 // 默认构造函数。 HashMap() // 指定“容量大小”的构造函数 public HashMap ( int initialCapacity) // 指定“容量大小”和“加载因子”的构造函数 public HashMap ( int initialCapacity, float loadFactor) // 包含“子Map

面试之哈希表leetcode

安稳与你 提交于 2019-12-03 15:25:41
1 案例1 leetcode-----242 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s = "anagram", t = "nagaram" 输出: true python版本 方法1:直接排序 方法二:API map计数 方法三:数组模拟hash 1 ''' 2 方法1 按照字母序排序 如果一样则是 时间复杂度是nlogN 快排 3 4 方法2 数字符串每个字符串字符的个数,也就是使用map来计算{letter:count} 5 a---->3 6 n---->1 7 r---->1 8 时间复杂度O(N) *1 为O(N) 9 ''' 10 11 class Solution(object): 12 def isAnagram(self, s, t): 13 """ 14 :type s: str 15 :type t: str 16 :rtype: bool 17 """ 18 #方法一 19 #return sorted(s)==sorted(t) 20 21 #方法二 22 ''' 23 dic1,dic2={},{} 24 for item in s: 25 dic1[item]=dic1.get(item,0)+1 26 for item in t: 27 dic2[item]=dic2.get(item

java中list和map的底层实现原理

淺唱寂寞╮ 提交于 2019-12-03 14:26:00
Collection(单列集合) 3 List(有序,可重复) 4 ArrayList 5 底层数据结构是数组,查询快,增删慢 6 线程不安全,效率高 7 Vector 8 底层数据结构是数组,查询快,增删慢 9 线程安全,效率低 10 LinkedList 11 底层数据结构是链表,查询慢,增删快 12 线程不安全,效率高 13 Set(无序,唯一) 14 HashSet 15 底层数据结构是哈希表。 16 哈希表依赖两个方法:hashCode()和equals() 17 执行顺序: 18 首先判断hashCode()值是否相同 19 是:继续执行equals(),看其返回值 20 是true:说明元素重复,不添加 21 是false:就直接添加到集合 22 否:就直接添加到集合 23 最终: 24 自动生成hashCode()和equals()即可 25 26 LinkedHashSet 27 底层数据结构由链表和哈希表组成。 28 由链表保证元素有序。 29 由哈希表保证元素唯一。 30 TreeSet 31 底层数据结构是红黑树。(是一种自平衡的二叉树) 32 如何保证元素唯一性呢? 33 根据比较的返回值是否是0来决定 34 如何保证元素的排序呢? 35 两种方式 36 自然排序(元素具备比较性) 37 让元素所属的类实现Comparable接口 38 比较器排序

Java 数据结构

*爱你&永不变心* 提交于 2019-12-03 12:18:58
Java 数据结构 Java工具包提供了强大的数据结构。在Java中的数据结构主要包括以下几种接口和类: 枚举(Enumeration) 位集合(BitSet) 向量(Vector) 栈(Stack) 字典(Dictionary) 哈希表(Hashtable) 属性(Properties) 以上这些类是传统遗留的,在Java2中引入了一种新的框架-集合框架(Collection),我们后面再讨论。 枚举(Enumeration) 枚举(Enumeration)接口虽然它本身不属于数据结构,但它在其他数据结构的范畴里应用很广。 枚举(The Enumeration)接口定义了一种从数据结构中取回连续元素的方式。 例如,枚举定义了一个叫nextElement 的方法,该方法用来得到一个包含多元素的数据结构的下一个元素。 关于枚举接口的更多信息,请参见枚举(Enumeration)。 位集合(BitSet) 位集合类实现了一组可以单独设置和清除的位或标志。 该类在处理一组布尔值的时候非常有用,你只需要给每个值赋值一"位",然后对位进行适当的设置或清除,就可以对布尔值进行操作了。 关于该类的更多信息,请参见位集合(BitSet)。 向量(Vector) 向量(Vector)类和传统数组非常相似,但是Vector的大小能根据需要动态的变化。 和数组一样,Vector对象的元素也能通过索引访问