2011-06-22 38 views
4

配列内で高速検索を行うにはどうすればよいのか疑問があります(私は特定の事例について話しています)。PHP、in_arrayおよび配列内の高速検索(最後)

私は配列L = [A、B、C](私が始める時)を持っています。プログラムが実行されている間は、Lが大きくなるかもしれませんが(最後までに)、私はL = [A、B、C、D、E]という検索を行います。

実際に私が探している値は、DとEのみになります。今はfind_array(elem、array)を使用していますが、この関数を "微調整"することはできません最後に検索を開始し、インデックスを減らすことです。すべての検索で、関数in_arrayがインデックスを下回るすべての要素を調べる前に、検索している値が見つかることを恐れています。

¿私の問題に適した検索機能がありますか? __ in_array関数はどのように内部的に動作しますか?

おかげで、事前

+0

脇役の場合:新しい値のみを検索することを事前に知っている場合は、これらの新しい値を別々の配列に格納することは可能ではないでしょう。これは小さくなり、検索が迅速になります。 (kenforcesの答えがあなたのオプションではない場合) – Yoshi

+0

私はget_declared_classes()関数を使用しています、特定のクラスがロードされているかどうかを検出する必要があります... – castarco

+0

PHPマニュアルにはfind_array )。だから私はあなたが発見された要素の鍵を欲しいのか、それとも要素が存在するのかを知りたいのか疑問に思っています。 – Leif

答えて

8

に私はin_arrayは、n-1から0から線形検索であることを前提としています。

最も速い検索では、値をキーとして保存し、array_key_existsを使用します。

$a['foo'] = true; 
$a['bar'] = true; 

if (array_key_exists('foo', $a)) ... 

しかし、それはオプションではない場合、あなたは非常に簡単にインデックス配列のための独自のを行うことができます。

function in_array_i($needle, array $a, $i = 0); 
{ 
    $c = count($a); 
    for (;$i < $c; ++$i) 
    if ($a[$i] == $needle) return true; 
    return false; 
} 

それはあなたがスキップするために自分自身を追跡することができ、$iから開始します最初の要素。

または代わりに...

function in_array_i($needle, array $a, $i = 0); 
{ 
    return in_array($needle, $i ? array_slice($a, $i) : $a); 
} 

あなたはベンチマークより高速であるかを確認することができます。あなたのコメントに関して

+0

ベンチマークしてここに書いてください:)。 – castarco

+0

in_arrayがC言語で書かれているので、遅くなると思います... –

+1

['isset()'が高速になります。](http://stackoverflow.com/questions/700227/whats-quicker-and-better-to配列のキーが配列されているかどうかを確認します) –

2

、あなたができる:おそらくはるかに高速任意の値探索、その後になります

$classes = array_flip(get_declared_classes()); 
$check = isset($classes['%someClassName%']); 

+0

それだけではない*おそらく*高速です。しかし、それは 'NULL'値を検索するためには機能せず、重複した値に失敗します。 – hakre

+1

@hakre Yeah :)しかし、 'get_declared_classes()'には 'NULL'も重複も含まれないので、この特定のケースではこれは本当の問題ではないと思います。 – Yoshi

+0

そうだとは思いません:)しかし、おそらく 'class_exists( '%someClassName%')'はもっと速いでしょう。 ;) – hakre

0

in_array関数はどのように内部的に動作しますか?

Internallyin_array()は、アレイの最初から最後までを検索する。だからあなたの場合、これは遅いです。

データの性質に応じて、検索戦略を変更することができます。 重複のない値がしかなく、すべての値が文字列または整数のいずれかである場合NULLではない)、よく使われるのはarray_flip()です。かなり速く動作する配列があり、キーとして値が入力されているかどうかを確認しますisset()を経由して、アレイのハッシュに:これらの前提条件が満たされていない場合

$array = array(... non-duplicate string and integer values ...); 
    $needle = 'find me!'; 
    $lookup = array_flip($array); 
    $found = isset($lookup[$needle]) ? $lookup[$needle] : false; 
    if (false === $found) { 
    echo "Not found!\n"; 
    } else { 
    echo "Found at {$found}!\n"; 
    } 

、あなたはkonforceが提案するものがあることを行うことができます。

実際に多くのデータがあり、最初から最後までのいずれかを見ているだけでなく、最初から最後までのいずれかの検索アルゴリズムを独自に実装することもできますが、及び/又は探索時間を分配するためにランダムな位置から開始する。

さらに、配列に追加中にソートされた要素は、フィッティングアルゴリズムではるかに高速に検索することができます。

関連する問題