hash函数

散列表与hash函数

纵饮孤独 提交于 2019-12-09 22:25:40
散列表: hash冲突解决 1)开放定址法 : 存入:冲突的 进行二次处理,加线性,平方等;以线性为例,会逐个向下找,直到找到一个空的位置然后放进去 查找:与存入相似,先hash定位起始的查找位置,然后向下找等于的对象,如果遇到空的说明不存在 删除:因为上面查找遇空则说明不存在,所以不可以直接删除,仅仅可以标记删除 2)链表: 3)再hash:产生冲突时,计算另一个哈希函数地址,到不冲突为止。使用一组散列函数 hash1(key),hash2(key),hash3(key)……我们先用第一个散列函数,如果计算得到的存储位置已经被占用,再用第二个散列函数,依次类推,直到找到空闲的存储位置。 4)公共溢出区:把溢出的放到一起 装载因子=填入表中的元素个数/散列表的长度 假设我们有 10万条URL 访问日志次数表,如何按照访问次数给 URL 排序? 1:保存次数 遍历 10 万条数据,以 URL 为 key,访问次数为 value,存入散列表,同时记录下访问次数的最大值 K,时间复杂度 O(N)。 k不大可以使用桶排序,否则快排 有两个字符串数组,每个数组大约有 10 万条字符串,如何快速找出两个数组中相同的字符串? 一个用来查,一个用来插入 以第一个字符串数组构建散列表,key 为字符串,value 为出现次数。再遍历第二个字符串数组,以字符串为 key 在散列表中查找,如果

Perl常用模块 (Data::Dumper)

旧街凉风 提交于 2019-12-09 20:38:33
为什么使用引用? 在perl4中,hash表中的value字段只能是scalar,而不能是list,这对于有些情况是很不方便的,比如有下面的数据: Chicago, USA Frankfurt, Germany Berlin, Germany Washington, USA Helsinki, Finland New York, USA 我们想要按国家将城市分类,每个国家后面对应城市列表,如果用perl4来做,必须将城市列表组合成字符串才行,如果用perl5就可以用引用来做,有了引用,就可以构造复杂的hash结构,就可以用列表作为hash的值了。 如何定义引用? 1、 定义变量的时候,在变量名前面加个\,就得到了这个变量的一个引用,比如 # 数组的引用 my@array= (1,2,3) ; my$aref=\@array ; #哈希的引用 my%hash= ("name"=>"zdd","age"=>30,"gender"=>"male") ; my$href=\%hash ; #标量的引用 my$scalar=1 ; my$sref=\$scalar 2、匿名引用 方法一不是很常用,最常用的还是匿名引用,方法如下 匿名数组引用-用[]定义 $aref= [ 1,"foo",undef,13 ]; 匿名数组的元素仍然可以是匿名数组,所以我们可以用这种方法构造数组的数组

Flask 教程 第五章:用户登录

不羁岁月 提交于 2019-12-09 16:43:53
本文翻译自 The Flask Mega-Tutorial Part V: User Logins 这是Flask Mega-Tutorial系列的第五部分,我将告诉你如何创建一个用户登录子系统。 你在 第三章 中学会了如何创建用户登录表单,在 第四章 中学会了运用数据库。本章将教你如何结合这两章的主题来创建一个简单的用户登录系统。 本章的GitHub链接为: Browse , Zip , Diff . 密码哈希 在 第四章 中,用户模型设置了一个 password_hash 字段,到目前为止还没有被使用到。 这个字段的目的是保存用户密码的哈希值,并用于验证用户在登录过程中输入的密码。 密码哈希的实现是一个复杂的话题,应该由安全专家来搞定,不过,已经有数个现成的简单易用且功能完备加密库存在了。 其中一个实现密码哈希的包是 Werkzeug ,当安装Flask时,你可能会在pip的输出中看到这个包,因为它是Flask的一个核心依赖项。 所以,Werkzeug已经安装在你的虚拟环境中。 以下Python shell会话演示了如何哈希密码: 1 >>> from werkzeug.security import generate_password_hash 2 >>> hash = generate_password_hash('foobar') 3 >>> hash 4 'pbkdf2

小项目-数据爬取篇:scrapy-redis,手机网页,房天下租房信息,分布式,代理ip

对着背影说爱祢 提交于 2019-12-08 22:39:23
环境: 这回要用分布式:我使用两台电脑,一台win10 系统,用来爬信息,一台ubuntu 16.04用来爬url,数据库redis,MongoDB都用的ubuntu上的,没有两台电脑在一个电脑上开两个爬虫也是一样的。 安装scrapy-redis pip install scrapy-redis scrapy-redis 和 scrapy用法基本相同,就是scrapy-redis跟redis库的粘合性更高一些,直接把url放到redis的key中,给出相应key,爬虫自己获取url进行爬取,url没了会等待这种永动式爬取,而且redis还会进行去重处理,避免数据爬取重复。 先创建个名字叫做zufang_scrapy的爬虫 scrapy startproject zufang_scrapy 在项目中创建zufang genspider: scrapy genspider zufang "https://m.fang.com/zf/bj/" pycharm打开,新建usa.py 和 begin.py 一个用来放user-agent 一个启动爬虫,上一章已经讲过了,结构如下: settings加入: #启用Redis调度存储请求队列 SCHEDULER = "scrapy_redis.scheduler.Scheduler" #确保所有的爬虫通过Redis去重 DUPEFILTER

如何处理海量数据(长文)

冷暖自知 提交于 2019-12-08 19:07:07
在实际的工作环境下,许多人会遇到海量数据这个复杂而艰巨的问题,它的主要难点有以下几个方面: 一、数据量过大,数据中什么情况都可能存在。 如果说有10条数据,那么大不了每条去逐一检查,人为处理,如果有上百条数据,也可以考虑,如果数据上到千万级别,甚至 过亿,那不是手工能解决的了,必须通过工具或者程序进行处理,尤其海量的数据中,什么情况都可能存在,例如,数据中某处格式出了问题,尤其在程序处理时, 前面还能正常处理,突然到了某个地方问题出现了,程序终止了。 二、软硬件要求高,系统资源占用率高。 对海量的数据进行处理,除了好的方法,最重要的就是合理使用工具,合理分配系统资源。一般情况,如果处理的数据过TB级,小型机是要考虑的,普通的机子如果有好的方法可以考虑,不过也必须加大CPU和内存,就象面对着千军万马,光有勇气没有一兵一卒是很难取胜的。 三、要求很高的处理方法和技巧。 这也是本文的写作目的所在,好的处理方法是一位工程师长期工作经验的积累,也是个人的经验的总结。没有通用的处理方法,但有通用的原理和规则。 下面我们来详细介绍一下处理海量数据的经验和技巧: 一、选用优秀的数据库工具 现在的数据库工具厂家比较多,对海量数据的处理对所使用的数据库工具要求比较高,一般使用Oracle或者DB2,微软 公司最近发布的SQL Server 2005性能也不错。另外在BI领域:数据库,数据仓库

大数据处理

有些话、适合烂在心里 提交于 2019-12-08 19:03:47
海量数据处理问题汇总及方法总结 面试题中总是有好多海量数据的处理问题,在这里列出一些常见问题,便于以后查阅: 类型1:hash映射+hash统计+堆排序 1、 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。 可以估计每个文件安的大小为5G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 分而治之/hash映射:遍历文件a,对每个url求取 ,然后根据所取得的值将url分别存储到1000个小文件(记为 )中。这样每个小文件的大约为300M。遍历文件b,采取和a相同的方式将url分别存储到1000小文件中(记为 )。这样处理后,所有可能相同的url都在对应的小文件( )中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。 hash统计:求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。 2、有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序 方案1: hash映射:顺序读取10个文件

大数据

我只是一个虾纸丫 提交于 2019-12-08 19:03:17
  第一部分、十道海量数据处理面试题   1、海量日志数据,提取出某日访问百度次数最多的那个IP。   此题,在我之前的一篇文章 算法里头有所提到,当时给出的方案是:IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。   再详细介绍下此方案:首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。   2、搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。   假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。   典型的Top K算法,还是在这篇文章里头有所阐述。 文中,给出的最终算法是:第一步、先对这批海量数据预处理,在O(N)的时间内用Hash表完成排序;然后,第二步、借助堆这个数据结构

大数据处理方案

那年仲夏 提交于 2019-12-08 18:58:46
场景一 海量日志数据,提取出某日访问百度次数最多的那个IP 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP。 算法思路:分治法+Hash IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理; 可以考虑采用分治法,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址; 对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址; 可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP; 场景二 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。)

海量数据解决方案~

社会主义新天地 提交于 2019-12-08 18:51:34
题目 问题一:现有海量日志数据,要提取出某日访问百度次数最多的那个IP(可以将题干简化,假设日志中仅包含IP数据,也就是说待处理的文件中包含且仅包含全部的访问IP,但内存空间有限,不能全部加载,假设只有512MB) 解决方案: 这是一道典型的分治思想的题目,这种问题处理起来套路比较固定,对于大部分的数据量比较大的前提的问题而言,分治都是一个可选的解决方案,但不一定是最优的,解决方法基本划分为三步走: 第一:如何有效的划分数据 第二:如何在子集上解决问题 第三:如何合并结果 那么对于本问题就显得比较明显了: 首先解决如何划分,由于IP地地址范围从000.000.000.000~255.255.255.255共有2^32个大约4GB,那么我们可以通过取模的方式进行划分,直接将四段数据相连就得到一个IP对应的数字A,再对A模1024(模数取多少可以自己指定,保证每个小文件能被放到内存就好),这样大文件被划分成小文件了,并且相同的IP一定被划分到相同的文件中。 其次解决每个小文件中TOP1的问题: 这里可以用很多方式进行处理,比如你可以构造自己的HashMap,key为IP,value为当前出现次数,最后找到value最大的Key即为当前文件中出现次数最多的IP。 最后要解决结果合并问题: 这里直接将1024个子文件的统计结果进行比较就好,不用排序,直接选择最大的一个就好。 注意

十道海量数据处理面试题与十个方法大总结

陌路散爱 提交于 2019-12-08 18:50:30
第一部分、十道海量数据处理面试题 1 、海量日志数据,提取出某日访问百度次数最多的那个 IP 。 首先是这一天,并且是访问百度的日志中的 IP 取出来,逐个写入到一个大文件中。注意到 IP 是 32 位的,最多有个 2^32 个 IP 。同样可以采用映射的方法,比如模 1000 ,把整个大文件映射为 1000 个小文件,再找出每个小文中出现频率最大的 IP (可以采用 hash_map 进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这 1000 个最大的 IP 中,找出那个频率最大的 IP ,即为所求。 或者如下阐述(雪域之鹰): 算法思想:分而治之 +Hash 1.IP 地址最多有 2^32=4G 种取值情况,所以不能完全加载到内存中处理; 2. 可以考虑采用 “ 分而治之 ” 的思想,按照 IP 地址的 Hash(IP)%1024 值,把海量 IP 日志分别存储到 1024 个小文件中。这样,每个小文件最多包含 4MB 个 IP 地址; 3. 对于每一个小文件,可以构建一个 IP 为 key ,出现次数为 value 的 Hash map ,同时记录当前出现次数最多的那个 IP 地址; 4. 可以得到 1024 个小文件中的出现次数最多的 IP ,再依据常规的排序算法得到总体上出现次数最多的 IP ; 2