Re: [請益] 如何不用for迴圈去判斷「陣列」或「字串ꄠ…
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
PHP 近期熱門文章
PTT數位生活區 即時熱門文章
4
20
6
17