哈希

706. 设计哈希映射

匿名 (未验证) 提交于 2019-12-02 23:38:02
不使用任何内建的哈希表库设计一个哈希映射 具体地说,你的设计应该包含以下的功能 put(key, value) :向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更新这个值。 get(key) :返回给定的键所对应的值,如果映射中不包含这个键,返回-1。 remove(key) :如果映射中存在这个键,删除这个数值对。 示例: 注意: [1, 1000000] 的范围内。 操作的总数目在 [1, 10000] 范围内。 不要使用内建的哈希库。 文章来源: https://blog.csdn.net/umbrellasoft/article/details/90376160

字符串哈希[hash模板]

匿名 (未验证) 提交于 2019-12-02 22:56:40
有这么一类神奇的问题,给你一堆字符串,然后问你有多少本质不同的字符串 ~~ 或许有头铁的同志可以开一个map ~~ 所以有了hash大法 大致思想 我们判断两个字符串相等,无非就是判断他们每一位是不是相等,但是如果让你判断两个数字是不是相等,是不是就简单了许多呢?答案是显然的,hash的大致思想也在这里,把字符串表示成一个数字,然后判断是不是想等,然后于是同学们有疑问了,"怎么转成数字,听着容易,而且不会和数字串判错吗?"为了解决这些问题,我们有了机智的应对方法,转成其他进制下的数字,具体长啥样不需要关心,我们就判个等就好 操作过程 对于一个串s,假如我们把它转成base进制下的数字,怎么转呢?我们先把每个字符强转成他对应的ascll码值,然后他现在是一个十进制的数字,然后执行如下操作 $ hash=(hash \ast base+(ull)s[i])%mod$,体会一下这个过程,每次把每一位乘上一个base,相当于集体左移,给新加入的元素留出位置,然后我们就得到了这个串的hash值,然后加入一个数组里,排个序,判等就好了 一些唠叨话 主流的hash有好几种,我写的有unsigned long long自然溢出,就不需要取模了,还有单模数hash,双模数hash,第二种比第一种难卡 ,看个人喜好吧,然后就是对于取模用的质数,不要用一些主流的素数,比如什么19260817

局部敏感哈希Locality Sensitive Hashing, LSH()

匿名 (未验证) 提交于 2019-12-02 22:56:40
LSH最根本的目的是能高效处理海量 高维数据 的 最近邻 问题。在信息检索,数据挖掘以及推荐系统等应用中,我们经常会遇到的一个问题就是海量的高维数据查找最近邻。不同于我们在数据结构教材中对哈希算法的认识,哈希最开始是为了减少冲突方便快速增删改查,在这里LSH恰恰相反,它利用的正是哈希冲突加速检索,并且效果极其明显。 LSH(局部敏感哈希)函数使得2个相似度很高的数据以较高的概率映射成同一个hash值,而2个相似度很低的数据以极低的概率映射成同一个hash值。 定义 3 : 给定一族哈希函数 H H , H H 是一个从欧式空间 S S 到哈希编码空间 U U 的映射。如果以下两个条件都满足,则称此哈希函数满足 ( r 1 , r 2 , p 1 , p 2 ) ( r 1 , r 2 , p 1 , p 2 ) 性。 如果 d ( O 1 , O 2 ) < r 1 d ( O 1 , O 2 ) < r 1 ,那么 P r [ h ( O 1 ) = h ( O 2 ) ] ≥ p 1 P r [ h ( O 1 ) = h ( O 2 ) ] ≥ p 1 如果 d ( O 1 , O 2 ) > r 2 d ( O 1 , O 2 ) > r 2 ,那么 P r [ h ( O 1 ) = h ( O 2 ) ] ≤ p 2 P r [ h ( O 1 ) = h ( O 2

P3370 【模板】字符串哈希

此生再无相见时 提交于 2019-12-02 22:38:48
题目地址 注意点: map直接用[]访问即可. #include<cstdio> #include<iostream> #include<map> #define ul unsigned long long using namespace std; const int MAXN=4000; map<ul,bool> has_; ul base=101; ul hashs[MAXN]; ul tmp[MAXN]; ul getHash(string str){ ul hash_=0; for(int i=1;i<=str.length();i++){ hashs[i]=hashs[i-1]*base+str[i-1]; } hash_=hashs[str.length()]; return hash_; } int main(){ int n; scanf("%d",&n); int cnt=0; for(int i=1;i<=n;i++){ string tmp; cin>>tmp; ul nowHash=getHash(tmp); if(has_[nowHash])continue; has_[nowHash]=1; cnt++; } printf("%d\n",cnt); return 0; }    来源: https://www.cnblogs.com/zbsy-wwx/p

Java之List和Set

匿名 (未验证) 提交于 2019-12-02 21:53:52
初次学习,涉及到List集合,Set集合和数据结构方面的一些知识,有错误还请批评指正 数据存储的常用结构有:栈、队列、数组、链表和红黑树。 ջ 先进后出(FILO). 先进先出(FIFO). 有序的元素序列,以索引访问.查询快,增删慢. 链式结构,查询慢,增删快.通过地址进行连接. 单向链表:结点包括两个内容,一个是存储元素,一个是下一个元素的地址. 双向链表:结点包括3个部分,前一个元素的存储地址,当前结点存储的元素,后一个元素的存储地址 二叉树,查询快.根节点的左边数据小于右边数据. 关于使用java具体实现上面的数据结构以后写,当前只需要了解一下他们的特性就可以. java.util.List 接口继承自Collection 接口,是单列集合的一个重要分支,在List集合中允许出现重复的元素,所有的元素是以一种线 性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和 取出顺序一致。(remove(Object obj)只能移除集合中第一个相同的元素) List集合的特点: 元素存储有序. 可以存储重复元素 有索引,可以通过索引来访问元素 常用的方法有(list的特有方法大都与索引相关): public void add(int index, E element) : 将指定的元素

[Java并发编程实战]什么是锁顺序死锁

匿名 (未验证) 提交于 2019-12-02 21:53:52
精诚所至,金石为开。―――《后汉书・广陵思王荆传》 意思是人的诚心所到,能感动天地,使金石为之开裂。比喻只要专心诚意去做,什么疑难问题都能解决。 两个线程试图通过不同的顺序获取多个相同的锁。如果请求的顺序不相同,那么会出现循环的锁依赖现象,产生死锁。但是如果保证同时请求锁L和锁M的每一个线程,都是按照从 L 到 M 的顺序,那么就不会发生死锁了。 举个例子说明一下,让我们更加直观的了解顺序死锁问题,请看下面代码: public class ThreadDeadLockTest { private final Object left = new Object(); private final Object right = new Object(); public void leftRight () { synchronized (left) { synchronized (right) { doSomething(); } } } public void rightLeft () { synchronized (right) { synchronized (left) { doSomething(); } } } } 如果一个线程调用了 leftRight, 另一个线程调用了 rightLeft,这样的交替运行,那么它们会发生死锁。线程 A 拿到了left锁,而线程 B 拿到了

Java常见面试问题: equals()与hashCode()的使用

匿名 (未验证) 提交于 2019-12-02 21:35:18
Ŀ¼ 默认情况下也就是从超类Object继承而来的equals()方法与‘==’是完全等价的, 比较的都是对象的内存地址. 但我们可以重写equals()方法, 使其按照我们的需求的方式进行比较, 比如String类就重写了equals方法, 它比较的是字符的序列, 而不再是内存地址. *自反性、对称性、传递性等都是 中的概念. 自反性: 对于任何非null的引用值x, x.equals(x)应返回true. 对称性: 对于任何非null的引用值x与y, 当且仅当:y.equals(x)返回true时, x.equals(y)才返回true. 传递性: 对于任何非null的引用值x、y与z, 如果y.equals(x)返回true, y.equals(z)返回true, 那么x.equals(z)也应返回true. 一致性: 对于任何非null的引用值x与y, 假设对象上equals比较中的信息没有被修改, 则多次调用x.equals(y)始终返回true或者始终返回false. 对于任何非空引用值x, x.equal(null)应返回false. 这个问题主是针对映射相关的操作(Map接口). 我们知道Map接口的类会使用到键(Key)对象的哈希码, 当我们调用put()或get()方法对Map容器进行操作时, 都是根据键对象的哈希码来计算存储位置的,

memcached

廉价感情. 提交于 2019-12-02 17:04:36
简介Memcached memcached是高性能的分布式内存缓存服务器。它通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。memcached的API使用32位元的循环冗余校验(CRC-32)计算键值后,将资料分散在不同的机器上。当表格满了以后,接下来新增的资料会以LRU机制替换掉。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon)是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信 Memcached的分布式算法 A.余数哈希:根据服务器台数的余数进行哈希,求得键的哈希值,再处理服务器台数,根据余数选择服务器, 缺点:当添加或者移除服务器时,缓存重组的代价太大, 当添加服务器,要进行重哈希,会导致原来的服务器序号变了,下一次找不到,访问数据,Memcached命中率下降,那么就增加了数据库服务器的负载. B.一致性哈希:一致性哈希是将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间是0~(2^32 -1)(即哈希值是一个32位的无符号整型),这个哈希空间为环。然后让每台机器占一个扇形空间。 举个例子:余数哈希相当于一个萝卜一个坑,刚刚好,这时候在中间新挖一个坑,下一次去拿的时候会按照原有逻辑,会导致最后一个有萝卜的坑没被拿到丢了

从系统性能优化谈对象相等性

◇◆丶佛笑我妖孽 提交于 2019-12-02 16:58:29
公司系统中有一接口访问量大,内部计算逻辑较为复杂。在优化时打算把Request中的参数做为Key,Response做为Value放到进程内缓存中,以降低服务器压力,提高接口响应速度。因为Response中一些数据时效性要求较高,所以缓存设置一个较短的过期时间(比如10s)。 但这里牵涉到一个问题,如何有效的判断两次请求的参数是相等的。C#中自定义类型会从Object类继承Equals和GetHashCode两个方法,可以根据实际需求来重写这两个方法实现对象相等性比较。 Object.Equals(Object) Object 默认实现根据对象在内存中的地址,即引用是否相同来判断对象是否相等。应该说是identity而非equality。与Python中的is、== 操作符类似。这种默认实现通常不能满足需求,自定义实现Equals思路如下: obj为null,返回false,因为Equals是实例方法,this不会为null this和obj引用同一个对象返回true this和obj是不同类型返回false 调用Equals逐字段进行比较 必要时调用基类的Equals方法来比较基类中字段的相等性(通常不调用Object类的Equals) 根据上述思路,实现自定义类型的Equals方法: ValueType 反编译之后,可以看到ValueType中Equals方法的实现