请教一个PHP的交集算法
巴扎黑
巴扎黑 2017-04-10 18:02:47
[PHP讨论组]

我现在需要在已知的两个数组中找出他们的交集,业务关系是:

  1. 假设有个白名单用户表member_table

  2. 我关注的用户表follow_table

  3. follow_table中的数据可能包含member_table的数据

举个例子:

 //白名单
 $member_table = [5,6,10,11];
 //我关注的用户
 $follow_table = [1,2,3,4,5,6,7,8,9];
 //我需要显示的数据
 $result = [5,6]

这个例子中最简单的方案就是array_intersect, 整个实现就是穷举,大概N^3左右,小数据量还好

而我们实际业务是follow_table可大可小,看用户自己想关注多少了,可能是100,也可能关注1000多个

不过member_info是一直在快速增长的,可能今天是1W,明天到10W,过两个月几百万都有可能的

基本上 member_info到 10W的时候 时间上不说,空间上就直接Allowed memory size of了,要是并发在高一点,应该就直接挂了。 每次请求动态计算我感觉不是太靠谱,所以想请教下,有没有什么最优方案

巴扎黑
巴扎黑

全部回复(5)
高洛峰

这你完全可以交给redis去做!redis里面有
应用场景:

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

Sets 集合的概念就是一堆不重复值的组合。利用Redis提供的Sets数据结构,可以存储一些集合性的数据,比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

实现方式:

set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。

参考:
http://www.cnblogs.com/si812c...

黄舟

我不清楚php有没类似hashmap之类的。反正就是key-value的容器。
follow_table转为key-value的容器一次大数据循环,然后遍历member_table,直接到follow_table判断存在。

天蓬老师

你这是要存数据库还是怎么? 如果是存数据库,应该不会一下子要把所有数据都找出来吧。。。
不然就是推荐你用其他存储系统,redis好像有集合的操作,原生支持,效率应该会比较高

高洛峰

如果用PHP来做,可以考虑几个方案,不过可以肯定要在命令行模式下,
数据量大的时候,不论什么方法,执行时间肯定会长,如果modphp模式肯定会超时。

1采用C扩展的方式

C的速度毋庸置疑,采用C开发PHP模块速度肯定快

2采用数据库或者redis

3采用PHP原生代码,效率最低,采用循环对比的方式

巴扎黑

谢谢各位啊, redis确实是最快的, 最开始只想着算法去了,忘了考虑问题本身了,不过答案只能给一个人

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号