请教一个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了,要是并发在高一点,应该就直接挂了。 每次请求动态计算我感觉不是太靠谱,所以想请教下,有没有什么最优方案

巴扎黑
巴扎黑

全部回复(4)
黄舟

我不清楚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确实是最快的, 最开始只想着算法去了,忘了考虑问题本身了,不过答案只能给一个人

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

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