作者dinos (◤◢██◣◥█████)
看板PHP
标题Re: [请益] 如何不用for回圈去判断「阵列」或「字串ꄠ…
时间Thu Dec 21 18:57:06 2006
※ 引述《dinos (◤◢██◣◥█████)》之铭言:
: ※ 引述《saininniang (sob)》之铭言:
: : 我现在的input pattern 有1600多万组
: : 产生完input pattern还要去各别处理
: : 程式执行完将近要十分钟
: : 太慢了
: : 想问有没有不要用for回圈就能判断「字串」或「阵列」有无值重覆?
: : php有这样的指令吗?
: : 我原本都是用两层for回圈去一一判断
: : 但效率实在太差
: : 会想这样做的原因是可以少处理将近一半的input pattern
: : 应该可以省下很多时间
: : 以字串来说
: : 1223 ==> 不处理
: : 1332 ==> 不处理
: : 1432 ==> 处理
: : 以阵列来说
: : [1,2,2,3] ==>不处理
: : [1,3,3,2] ==>不处理
: : [1,4,3,2] ==>处理
: : 上述的例子其实是简化过後的
: : 不然其实不只4个位元而已
: : 实在是太庞大了@@
:
: if(array_sum(array_count_values($input))!=count($input))continue;//不处理
~~~~~~~~~我这里写错了 应该是 count
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 140.113.158.15
: 推 Kej:不太懂 array_sum(array_count_values($input))这样有什麽用耶 12/21 18:27
: → Kej:为什麽不直接用 count(array_unique($input)) 就好? 12/21 18:28
: 推 Kej:用 if($input!=array_unique($input))continue; 这样更快 12/21 18:36
我刚刚试了一下
source code:
<?php
$a=array();
for($i=0;$i<1000000;$i++)$a[]=rand(1,2000);
$time1 = getmicrotime();
echo intval(count(array_count_values($a))!=count($a));
$time2 = getmicrotime();
echo intval($a!=array_unique($a));
$time3 = getmicrotime();
echo '<br />Time 1: '.($time2-$time1).'<br />';
echo '<br />Time 2: '.($time3-$time2).'<br />';
function getmicrotime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
?>
result:
11
Time 1: 0.072144985198975
Time 2: 28.285458087921
不过 array_unique() 在阵列重覆性不高的状况下的表现会比较佳
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.158.15