求qq搜索算法解决方法
求qq搜索算法
在qq的查找里面,有一个根据qq号码查找的功能,请问这个算法怎么实现的。qq号是那么庞大,如何在几秒钟就返回结果~
------解决方案--------------------
猜的是多级分类的hash。。。
------解决方案--------------------
建立多级索引,比如1-100w ,100w-200w....
1-100w中再建索引 1-10w ,10w-20w....
判断号码的范围直接去该范围内进行二分查找
这只是我的猜测.......
------解决方案--------------------
在就是按长度分类,
分别作hash
------解决方案--------------------
二分查找只是你把QQ信息排序后再查找,查找的次数和把QQ信息变成二叉树,但在二叉树中QQ信息的查找次数没有AVL性能稳定(lgn),红黑树是改良的平衡二叉树,STL的map就是红黑树实现
struct userinfo
{
};
map<int,userinfo> qqMap;
int为QQ号码,
向一个10亿的记录中插入或查找一个记录次数为,lg(10亿) = lg(1000* 1000*1000)约等于30次
------解决方案--------------------
同意二楼看法,我觉得也不可能存放在同一台服务器上,不然服务器负载太大。
按号段进行数据服务器的存储,然后设几台前台服务器,用户的请求被发送到前台,然后前台服务器去相应的后台服务器检索。
------解决方案--------------------
有几个查询条件,就增加几个服务器做MemChached,键值是要查的条件,其实就是超大Hash表,内存足够了。
只要没模糊查询,有几个查询条件,就是一系列Hash查询。每个复杂度都是最低的。
比如,我这里用Dictionary代表外边的Hash表,里边的Hash代表一个集合:
Dictionary<QQ号,UserInfo> 这个是原始的表
Dictionary<名字,Hash<QQ号>>
Dictionary<国家+省份+语言,Hash<QQ号>>
Dictionary<年龄+性别,Hash<QQ号>>
组合条件存储要让Hash离散的比较均匀,因为要用这些Hash做交叉,
不能把男,和女简单的做两个大Dictionary键,然后里边的Hash超大。
------解决方案--------------------
找到名字是"笨狼"的用户集合Hash<QQ号>是O(1)时间的。集合大小是m1
找到国家+省份+语言的用户集合Hash<QQ号>是O(1)时间的。集合大小是m2
找到年龄+性别的用户集合Hash<QQ号>是O(1)时间的。集合大小是m3
在几个哈希表里寻找共同的,时间复杂度是最小的m
。。。。
那么总体时间是
O( Min m)
所以只要m大小尽量均匀就可以加速搜索。
这需要在实际测试中验证,来决定哪些条件放在一起,这是解决问题的关键。
在qq的查找里面,有一个根据qq号码查找的功能,请问这个算法怎么实现的。qq号是那么庞大,如何在几秒钟就返回结果~
------解决方案--------------------
猜的是多级分类的hash。。。
------解决方案--------------------
建立多级索引,比如1-100w ,100w-200w....
1-100w中再建索引 1-10w ,10w-20w....
判断号码的范围直接去该范围内进行二分查找
这只是我的猜测.......
------解决方案--------------------
在就是按长度分类,
分别作hash
------解决方案--------------------
二分查找只是你把QQ信息排序后再查找,查找的次数和把QQ信息变成二叉树,但在二叉树中QQ信息的查找次数没有AVL性能稳定(lgn),红黑树是改良的平衡二叉树,STL的map就是红黑树实现
struct userinfo
{
};
map<int,userinfo> qqMap;
int为QQ号码,
向一个10亿的记录中插入或查找一个记录次数为,lg(10亿) = lg(1000* 1000*1000)约等于30次
------解决方案--------------------
同意二楼看法,我觉得也不可能存放在同一台服务器上,不然服务器负载太大。
按号段进行数据服务器的存储,然后设几台前台服务器,用户的请求被发送到前台,然后前台服务器去相应的后台服务器检索。
------解决方案--------------------
有几个查询条件,就增加几个服务器做MemChached,键值是要查的条件,其实就是超大Hash表,内存足够了。
只要没模糊查询,有几个查询条件,就是一系列Hash查询。每个复杂度都是最低的。
比如,我这里用Dictionary代表外边的Hash表,里边的Hash代表一个集合:
Dictionary<QQ号,UserInfo> 这个是原始的表
Dictionary<名字,Hash<QQ号>>
Dictionary<国家+省份+语言,Hash<QQ号>>
Dictionary<年龄+性别,Hash<QQ号>>
组合条件存储要让Hash离散的比较均匀,因为要用这些Hash做交叉,
不能把男,和女简单的做两个大Dictionary键,然后里边的Hash超大。
------解决方案--------------------
找到名字是"笨狼"的用户集合Hash<QQ号>是O(1)时间的。集合大小是m1
找到国家+省份+语言的用户集合Hash<QQ号>是O(1)时间的。集合大小是m2
找到年龄+性别的用户集合Hash<QQ号>是O(1)时间的。集合大小是m3
在几个哈希表里寻找共同的,时间复杂度是最小的m
。。。。
那么总体时间是
O( Min m)
所以只要m大小尽量均匀就可以加速搜索。
这需要在实际测试中验证,来决定哪些条件放在一起,这是解决问题的关键。