PHP-php大数组交集处理
在针对用户信息处理过程中遇到这样一个问题.将基于用户的某项信息分别存于两个大数组(用于用户数据合并).预计量级均在10万级. 数据结构如下:
$area1 = array(
'test1'=>'level1',
'test2'=>'levle2',
'test3'=>'levle3',
'test4'=>'level4'
);
$area2 = array(
'test1'=>'level1',
'test2'=>'level1',
'test5'=>'level1',
'test6'=>'level1'
);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果把两个数组先排序再归并, 时间复杂度应该是O(n*lg(n));
但是我记得php中关联数组其实就是 hash, 按key查找时间复杂度应该是O(1); 那么我们设数组为arr1, arr2; copy arr2到数组arr3; 遍历arr1, 按key去arr3中查找, 重复按你的方法处理,不重复加入arr3中; 返回arr3为结果数组. 时间复杂度应该是O(n).
本人对php仅是入门, 欢迎指正, 共同进步.
php array_key_exists 和 in_array 时间复杂度都是 O(1), 是以空间换取时间的一种做法。
测试代码:
<?php
$area1 = create_data();
$area2 = create_data();
$new_area = array();
foreach($area1 AS $key=>$row)
{
combine_data($key, $row);
}
foreach($area2 AS $key=>$row)
{
combine_data($key, $row);
}
print_r($new_area);
function create_data()
{
$i = 1;
while($i < 100000) {
$arr['test'.$i] = 'level'.$i;
$i ++;
}
return $arr;
}
function combine_data($key, $row)
{
global $new_area;
if(isset($new_area[$key]))
{
$new_area[$key.'1'] = $row;
$new_area[$key.'2'] = $row;
unset($new_area[$key]);
}
else
{
$new_area[$key] = $row;
}
}
10w没有啥压力的!!
我处理过1万、10万的数据集的交并集,基本上1万以内纯数组是没有压力的,超过10万的交并集,是先导入mysql数据库,直接在数据库里用sql语句来diff差异,10万条,基本上能保持在10秒左右,通过索引优化的话,时间应该可以更少,如果这还不能满足,可以考虑用先将数据存为csv,纯文本,然后用GO、C等语言写逻辑处理,处理完的数据再保存成csv文件,输出给php用。