# -*- 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()