问题是这样的:
有2个字符串
$a = '434,535,6466,666,4566,..';
$b = '34,566,788,666,9877,..';
现在要找出它们中相同的数字(比如666)我目前的做法是,先分别explode成数组,然后array_intersect但实际应用中,这两个字符串都非常大,生成的数组经常count上万,测试效率不理想,有没有更好的方案呢?
有2个字符串
$a = '434,535,6466,666,4566,..';
$b = '34,566,788,666,9877,..';
现在要找出它们中相同的数字(比如666)我目前的做法是,先分别explode成数组,然后array_intersect但实际应用中,这两个字符串都非常大,生成的数组经常count上万,测试效率不理想,有没有更好的方案呢?
时间复杂度O(nlogn)
而对排序好的数据用归并的手法来找出重复数据,时间复杂度是O(n)
总的时间复杂度是O(nlogn)2 如果不排序,直接查找,
数组1中的每个数据在第二个表中查找的时间复杂度是O(n)
但数组1中的每个数据都要在第二个表中查找,总的时间复杂度是O(n^2)因此,数据量越大,先排序再归并的性能提高越明显。第三种方法:
只对数组2排序,对数组1中的每个数据在数组2中二分查找
总的时间复杂度也是O(nlogn),但性能会比第一种要差一些,你可以测试一下。
s.split(',')
拆分字符串,数十k的数据不会超过1秒钟。但如果你拆为数组后用两个for循环来做,性能肯定是非常差的(要进行10000 × 10000次比较)
如果先排序后,大约只要做(10000 * log 10000 = 350000次比较) 。在《数据结构与算法》课程中应该讲到过这些。
$arr2 = array(5,10,4,9,7);不排序,$arr1的元素在与$arr2的元素比较时,必须遍历$arr2.排序后:
$arr1 = array(1,4,5,8);
$arr2 = array(4,5,7,9,10);发现$arr2[0] != $arr1[0]之后,就不用再比较了.
这两个字符串越大,排序带来的好处就越大,就越可以忽略排序所花费的时间.至于不生成数组,直接用字符串来比较是无法排序的,所以绝对不妥.
数据量大时,用数据库。不建议用直接编程解决,因为数据量可能达到无法加载到内存
我想原因有二:1是array_intersect可能不是按照ShadowSniper所说的流程计算,2是即使对ARRAY排序,PHP也不知道这是个“有序”的数组(这点还请高人指点)唠叨说的用数据库我以前也考虑过,但目前的情况是:数据库里有几十万条数据,每条数据都是"234,54545,65656,344,..."这样的长度达100K多的字符串。 经常要用到找出2条数据,计算它们的“共有”的数字
对Array进行排序后,不用array_intersect,而是手工写代码对其进行处理,找出相同的数据。>>数据库里有几十万条数据,每条数据都是"234,54545,65656,344,..."这样的长度达100K多的字符串
你应该把这些数据拆分为数据库中的多条记录,然后再查询,虽然速度达不到你要求的0.00X以内,但肯定比你现有的方法快的多。
手工控制的话可以选择更优化的算法。2 >>至少要几十亿条记录
如果你建了良好的索引,性能应该还是能够保证的。
若串是用逗号隔开,且能保证首尾均被逗号包裹(以免部分匹配)
在mysql中,可以用INSTR来试试,不过效率怎样我就不知道了!