hash函数

海量数据处理面试题集锦与Bit-map详解

你离开我真会死。 提交于 2019-12-08 17:44:58
十七道海量数据处理面试题与Bit-map详解 作者:小桥流水,redfox66,July。 前言 本博客内曾经整理过有关海量数据处理的10道面试题( 十道海量数据处理面试题与十个方法大总结 ),此次除了重复了之前的10道面试题之后,重新多整理了7道。仅作各位参考,不作它用。 同时, 程序员编程艺术系列 将重新开始创作,第十一章以后的部分题目来源将取自下文中的17道海量数据处理的面试题。因为,我们觉得,下文的每一道面试题都值得重新思考,重新深究与学习。再者,编程艺术系列的前十章也是这么来的。若您有任何问题或建议,欢迎不吝指正。谢谢。 第一部分、十五道海量数据处理面试题 1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 遍历文件a,对每个url求取 ,然后根据所取得的值将url分别存储到1000个小文件(记为 )中。这样每个小文件的大约为300M。 遍历文件b,采取和a相同的方式将url分别存储到1000小文件中(记为 )。这样处理后,所有可能相同的url都在对应的小文件( )中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。

海量数据处理面试题集锦

安稳与你 提交于 2019-12-08 17:44:28
十七道海量数据处理面试题与Bit-map详解 作者:小桥流水,redfox66,July。 前言 本博客内曾经整理过有关海量数据处理的10道面试题( 十道海量数据处理面试题与十个方法大总结 ),此次除了重复了之前的10道面试题之后,重新多整理了7道。仅作各位参考,不作它用。 同时, 程序员编程艺术系列 将重新开始创作,第十一章以后的部分题目来源将取自下文中的17道海量数据处理的面试题。因为,我们觉得,下文的每一道面试题都值得重新思考,重新深究与学习。再者,编程艺术系列的前十章也是这么来的。若您有任何问题或建议,欢迎不吝指正。谢谢。 第一部分、十五道海量数据处理面试题 1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 遍历文件a,对每个url求取 ,然后根据所取得的值将url分别存储到1000个小文件(记为 )中。这样每个小文件的大约为300M。 遍历文件b,采取和a相同的方式将url分别存储到1000小文件中(记为 )。这样处理后,所有可能相同的url都在对应的小文件( )中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。

初探Hash

巧了我就是萌 提交于 2019-12-07 09:52:28
简介 \(Hash\) 是一种链式存储的数据结构,用 \(hd[]\) 记录每一种状态在 \(Hash\) 表中的首位置,用 \(Hash[]\) 记录 \(Hash\) 表。 一般来说, \(Hash\) 的基本数据结构包括: struct node { int num[],next; }hash[]; int cnt,hd[]; 主要函数 计算 \(Hash\) 值的函数 int GetHash(int *num) { int Res=0; for(int i=1;i<=N;++i) Res+=num[i]; return Res%Mod; } 来源: https://www.cnblogs.com/hihocoder/p/12000690.html

常用查找算法及实现

被刻印的时光 ゝ 提交于 2019-12-06 20:46:11
一、顺序查找 线性查找是在一个已知无(或有序)序队列中找出与给定关键字相同的数的具体位置。原理是 让关键字与队列中的数从最后一个开始逐个比较,直到找出与给定关键字相同的数为止,它的缺 点是效率低下。 1、算法原理 1)从表中的最后一个记录开始,逐个进行记录的关键字与给定值进行比较,若某个记录的关 键字与给定值相等,则查找成功,找到所查的记录; 2)反之,若直到第一个记录,其关键字和给定值比较都不相等,则表明表中没有所查的记 录,查找失败。 2、算法分析 顺序查找的平均查找长度(Average Search Length,ASL)为(n+1)/2,当查找 不成功 时,需 要n+1次比较,时间复杂度为O(n); 3、算法实现 /* 顺序查找。 */ #include <iostream> #include <stdio.h> int SequenceSearch( int *array, int n, int key ) { if( array == NULL || n < 0 ) { printf( "invalid input.\n" ); return -1; } int i ; array[ 0 ] = key; for( i = n; array[ i ] != array[ 0 ]; i-- ) { if( array[ i ] == key ) break; } if(

【集合系列】- 深入浅出分析HashMap

坚强是说给别人听的谎言 提交于 2019-12-06 16:27:29
一、摘要 在集合系列的第一章,咱们了解到,Map的实现类有HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、Hashtable、Properties等等。 关于HashMap,一直都是一个非常热门的话题,只要你出去面试,我保证一定少不了它! 本文主要结合JDK1.7和JDK1.8的区别,就HashMap的数据结构和实现功能,进行深入探讨,废话也不多说了,直奔主题! 二、简介 在程序编程的时候,HashMap是一个使用非常频繁的容器类,它允许键值都放入null元素。除该类方法未实现同步外,其余跟Hashtable大致相同,但跟TreeMap不同,该容器不保证元素顺序,根据需要该容器可能会对元素重新哈希,元素的顺序也会被重新打散,因此不同时间迭代同一个HashMap的顺序可能会不同。 HashMap容器,实质还是一个哈希数组结构,但是在元素插入的时候,存在发生hash冲突的可能性; 对于发生Hash冲突的情况,冲突有两种实现方式, 一种开放地址方式(当发生hash冲突时,就继续以此继续寻找,直到找到没有冲突的hash值),另一种是拉链方式(将冲突的元素放入链表) 。 Java HashMap采用的就是第二种方式,拉链法。 在jdk1.7中,HashMap主要是由数组+链表组成,当发生hash冲突的时候

Nginx的负载均衡

喜你入骨 提交于 2019-12-06 14:02:39
算法介绍 ip_hash算法的原理很简单,根据请求所属的客户端IP计算得到一个数值,然后把请求发往该数值对应的后端。 所以同一个客户端的请求,都会发往同一台后端,除非该后端不可用了。ip_hash能够达到保持会话的效果。 ip_hash是基于round robin的,判断后端是否可用的方法是一样的。 第一步,根据客户端IP计算得到一个数值。 hash1 = (hash0 * 113 + addr[0]) % 6271; hash2 = (hash1 * 113 + addr[1]) % 6271; hash3 = (hash2 * 113 + addr[2]) % 6271; hash3就是计算所得的数值,它只和初始数值hash0以及客户端的IP有关。 第二步,根据计算所得数值,找到对应的后端。 w = hash3 % total_weight; while (w >= peer->weight) { w -= peer->weight; peer = peer->next; p++; } total_weight为所有后端权重之和。遍历后端链表时,依次减去每个后端的权重,直到w小于某个后端的权重。 选定的后端在链表中的序号为p。因为total_weight和每个后端的weight都是固定的,所以如果hash3值相同, 则找到的后端相同。 指令的解析函数

simhash简介

自作多情 提交于 2019-12-06 13:56:25
先贴一张网上的图片: 解释一下图片:这里feature可以指一篇文档分词后的某个词,即将文档中的某个词作为一个特征。weight是这个词的权重,这里可以是这个词在这个句子中出现的次数。 这里的hash算法就是传统的hash算法,通过调用一个hash函数实现的。 simhash是为了计算一篇文档之间的相似度存在的,通过simhash算法可以计算出文档的simhash值,通过各个文档计算出的二进制值来计算文档之间的汉明距离,然后根据汉明距离来比较文档之间的相似度。汉明距离是指两个相同长度的字符串相同位置上不同的字符的个数。 simhash算法分为5个步骤:分词、hash、加权、合并、降维,具体过程如下所述: 分词 给定一段语句,进行分词,得到有效的特征向量,然后为每一个特征向量设置1-5等5个级别的权重(如果是给定一个文本,那么特征向量可以是文本中 的词,其权重可以是这个词出现的次数)。例如给定一段语句:“CSDN博客结构之法算法之道的作者July”,分词后为:“CSDN 博客 结构 之 法 算法 之 道 的 作者 July”,然后为每个特征向量赋予权值:CSDN(4) 博客(5) 结构(3) 之(1) 法(2) 算法(3) 之(1) 道(2) 的(1) 作者(5) July(5),其中括号里的数字代表这个单词在整条语句中的重要程度,数字越大代表越重要。 hash

海量数据处理---simhash算法

放肆的年华 提交于 2019-12-06 13:55:31
方法介绍 背景 如果某一天,面试官问你如何设计一个比较两篇文章相似度的算法?可能你会回答几个比较传统点的思路: 一种方案是先将两篇文章分别进行分词,得到一系列特征向量,然后计算特征向量之间的距离(可以计算它们之间的欧氏距离、海明距离或者夹角余弦等等),从而通过距离的大小来判断两篇文章的相似度。 另外一种方案是传统hash,我们考虑为每一个web文档通过hash的方式生成一个指纹(finger print)。 下面,我们来分析下这两种方法。 采取第一种方法,若是只比较两篇文章的相似性还好,但如果是海量数据呢,有着数以百万甚至亿万的网页,要求你计算这些网页的相似度。你还会去计算任意两个网页之间的距离或夹角余弦么?想必你不会了。 而第二种方案中所说的传统加密方式md5,其设计的目的是为了让整个分布尽可能地均匀,但如果输入内容一旦出现哪怕轻微的变化,hash值就会发生很大的变化。 举个例子,我们假设有以下三段文本: the cat sat on the mat the cat sat on a mat we all scream for ice cream 使用传统hash可能会得到如下的结果: irb(main):006:0> p1 = 'the cat sat on the mat' irb(main):007:0> p1.hash => 415542861 irb(main):005

SimHash算法原理

我与影子孤独终老i 提交于 2019-12-06 13:53:00
刚到公司项目中用到了simhash,但没有详细的了解,后来被问到原理,结果就狗带了。。 下面是自己查资料和自己的一些理解,不愧是google出品,比较符合google的风格,简单实用。 先贴一张网上的图片: 解释一下图片:这里feature可以指一篇文档分词后的某个词,即将文档中的某个词作为一个特征。weight是这个词的权重,这里可以是这个词在这个句子中出现的次数。 这里的hash算法就是传统的hash算法,通过调用一个hash函数实现的。 simhash是为了计算一篇文档之间的相似度存在的,通过simhash算法可以计算出文档的simhash值,通过各个文档计算出的二进制值来计算文档之间的汉明距离,然后根据汉明距离来比较文档之间的相似度。汉明距离是指两个相同长度的字符串相同位置上不同的字符的个数。 simhash算法分为5个步骤:分词、hash、加权、合并、降维,具体过程如下所述: 分词 给定一段语句,进行分词,得到有效的特征向量,然后为每一个特征向量设置1-5等5个级别的权重(如果是给定一个文本,那么特征向量可以是文本中 的词,其权重可以是这个词出现的次数)。例如给定一段语句:“CSDN博客结构之法算法之道的作者July”,分词后为:“CSDN 博客 结构 之 法 算法 之 道 的 作者 July”,然后为每个特征向量赋予权值:CSDN(4) 博客(5) 结构(3) 之(1)

利用simhash来进行文本去重复

自作多情 提交于 2019-12-06 13:44:08
原文 http://d3s.mff.cuni.cz/~holub/sw/shash/#a1 传统的hash函数能够将一样的文本生成一样的hash函数,但是,通过simhash方法,能够差不多相同的文档得到的hash函数也比较相近。 Charikar's hash 通过Charikar‘s hash,能够将比较相似度的文档得到比较相近的fingerprint。 该算法的流程如下: * Document is split into tokens (words for example) or super-tokens (word tuples) * Each token is represented by its hash value; a traditional hash function is used * Weights are associated with tokens * A vector V of integers is initialized to 0, length of the vector corresponds to the desired hash size in bits * In a cycle for all token's hash values (h), vector V is updated: o ith element is decreased