问题是这样的:
有2个字符串
$a = '434,535,6466,666,4566,..';
$b = '34,566,788,666,9877,..';
现在要找出它们中相同的数字(比如666)我目前的做法是,先分别explode成数组,然后array_intersect但实际应用中,这两个字符串都非常大,生成的数组经常count上万,测试效率不理想,有没有更好的方案呢?

解决方案 »

  1.   

    首先对两个数组分别排序,然后采用类似归并排序的方法找到重复数据。
    时间复杂度O(nlogn)
      

  2.   

    你这样做更慢我在想能不能不用到数组,我测试过,单就explode成数组的时间就可观
      

  3.   

    1 排序的时间复杂度是O(nlogn)
    而对排序好的数据用归并的手法来找出重复数据,时间复杂度是O(n)
    总的时间复杂度是O(nlogn)2 如果不排序,直接查找,
    数组1中的每个数据在第二个表中查找的时间复杂度是O(n)
    但数组1中的每个数据都要在第二个表中查找,总的时间复杂度是O(n^2)因此,数据量越大,先排序再归并的性能提高越明显。第三种方法:
    只对数组2排序,对数组1中的每个数据在数组2中二分查找
    总的时间复杂度也是O(nlogn),但性能会比第一种要差一些,你可以测试一下。
      

  4.   

    我不清楚你是什么语言,我用javascript的测试结果,
    s.split(',')
    拆分字符串,数十k的数据不会超过1秒钟。但如果你拆为数组后用两个for循环来做,性能肯定是非常差的(要进行10000 × 10000次比较)
    如果先排序后,大约只要做(10000 * log 10000 = 350000次比较) 。在《数据结构与算法》课程中应该讲到过这些。
      

  5.   

    你保证每个,之间的字符串都是数字嘛?如果是的话,做排序是会提高效率的$arr1 = array(8,4,1,5);
    $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]之后,就不用再比较了.
    这两个字符串越大,排序带来的好处就越大,就越可以忽略排序所花费的时间.至于不生成数组,直接用字符串来比较是无法排序的,所以绝对不妥.
      

  6.   

    数据量小时,用array_intersect
    数据量大时,用数据库。不建议用直接编程解决,因为数据量可能达到无法加载到内存
      

  7.   

    windindance说的不到一秒……,其实我测试1W数据是0.03秒左右(迅弛1.6),但这不理想,因为实际应用中可能要同步处理很多这样的查询,而且每次还有其它相关的计算。我是希望控制在0.00X以内我刚刚测试了对ARRAY进行排序,貌似没用
    我想原因有二:1是array_intersect可能不是按照ShadowSniper所说的流程计算,2是即使对ARRAY排序,PHP也不知道这是个“有序”的数组(这点还请高人指点)唠叨说的用数据库我以前也考虑过,但目前的情况是:数据库里有几十万条数据,每条数据都是"234,54545,65656,344,..."这样的长度达100K多的字符串。 经常要用到找出2条数据,计算它们的“共有”的数字
      

  8.   

    >>我刚刚测试了对ARRAY进行排序,貌似没用
    对Array进行排序后,不用array_intersect,而是手工写代码对其进行处理,找出相同的数据。>>数据库里有几十万条数据,每条数据都是"234,54545,65656,344,..."这样的长度达100K多的字符串
    你应该把这些数据拆分为数据库中的多条记录,然后再查询,虽然速度达不到你要求的0.00X以内,但肯定比你现有的方法快的多。
      

  9.   

    手工的话我还要考虑一下,如果FOREACH 1W次……数据都拆份录入的话,自少要几十亿条记录,而且这个查询也不会是简单的构造
      

  10.   

    1 array_intersect 看起来是简单,但是它内部不还是foreach吗?
    手工控制的话可以选择更优化的算法。2 >>至少要几十亿条记录
    如果你建了良好的索引,性能应该还是能够保证的。
      

  11.   

    "但目前的情况是:数据库里有几十万条数据,每条数据都是"234,54545,65656,344,..."这样的长度达100K多的字符串。 经常要用到找出2条数据,计算它们的“共有”的数字"这样的话,你可以直接用sql语句来查找试试啊(数据库支持字符串处理)。
    若串是用逗号隔开,且能保证首尾均被逗号包裹(以免部分匹配)
    在mysql中,可以用INSTR来试试,不过效率怎样我就不知道了!