Python程序员面试算法宝典---解题总结: 第9章 大数据 9.9 如何按照query的频度排序

# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第9章 大数据 9.9 如何按照query的频度排序

题目:
有10个文件,每个文件1GB,每个文件的每一行存放的都是用户的query,每个文件的
query都可能重复。要求按照query的频度排序。

分析:
建立倒排索引,这个专门用于搜索引擎的。
倒排索引的样式大致如下:

哈希值hash1--> <哈希值为hash1的字符串A,[出现的总次数,用户A搜索的次数cA, 用户B搜索的次数cB, ...,]>,
             <哈希值为hash1的字符串B,[出现的总次数,用户A搜索的次数cA, 用户B搜索的次数cB, ...,]>
              ......
哈希值hash2--> <哈希值为hash2的字符串C,[出现的总次数,用户A搜索的次数cA, 用户B搜索的次数cB, ...,]>,
             <哈希值为hash2的字符串D,[出现的总次数,用户A搜索的次数cA, 用户B搜索的次数cB, ...,]>
              ......
生成倒排索引的主要过程如下:
1) 先建立正排索引
2) 通过正排索引建立倒排索引

关键:
1 书上解法
方法1: 如果query重复度较高,建立的字典可以完全加载到内存,则建立字典即可解决。
方法2: 分治,
将 hash(query) % 10划分到10个文件,
如果每个文件还是很大不能一次性加载到内存,就继续用hash函数划分该文件。
然后对每个小文件,统计query出现次数,并对结果排序,将排序结果写入另一个文件中;
这样读取10个小文件的排序结果文件,采用归并排序(或者如果无法加载到内存用
外部排序)来得到频度的排序。

2 没有想到
还是用分治,hash(query) % 10,然后读取每个小文件记录每个query出现次数并排序,
最后再读取所有排序结果的小文件进行排序即可。



参考:
Python程序员面试算法宝典
'''


def process():
    pass


if __name__ == "__main__":
    process()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值