bugfix> php > 投稿

データとして文字列値を含む大きな配列があります。この配列を最適化したいので、できるだけ早く特定の文字列が配列に存在するかどうかを確認するクエリを実行できます。だから、 $arr= []; で配列を作成するとしましょうそして、次のような値を追加します。

foreach($names as $name)
    $arr[]= $name;

そして今、私は if(in_array($random_string, $arr)) のような多くのクエリを実行したい 、しかしそれはかなり遅いです。パフォーマンスを最適化するために、配列にインデックスを追加したいと思います。単に sort() を使用する必要がありますか配列の機能?

文字列がクエリに存在するかどうかをチェックするために、文字列データで配列を最適化する方法は?

編集:いいえ、明らかにこれは「より高速なもの:in_arrayまたはisset?[closed]」の複製ではなく、vivek_23による回答ですでに確認できます。

回答 1 件
  • sorting を行うことをお勧めします   binary search と   value かどうかを知る  存在します。時間の複雑さは O(N log N) になります  ソートおよび O(log N) 用  個々の要素を検索します。ここで、 N  配列内の要素の数です。

    関連する配列を作成し、 isset() の助けを借りて確認することもできます。  値が存在するかどうかを確認します。ただし、キーをハッシュすると、PHPがハッシュ構造を内部的に管理することになり、 big string arrays があるため、メモリを少し消費します 。また、 isset($arr['some_key']) を使用して  必ずしも O(1) であるとは限りません  衝突による操作。

    以下は、バイナリ検索アプローチを使用する私のコードです-

    <?php
    function checkIfValueExists($arr,$search_value){
        $low  = 0;
        $high = count($arr) - 1;
        while($low <= $high){
            $mid = $low + intval(($high - $low) / 2);
            $compare_result = strcmp($arr[$mid],$search_value);
            if($compare_result === 0) return true;
            else if($compare_result < 0) $low = $mid + 1;
            else $high = $mid - 1;
        }
        return false;
    }
    
    

    上記の機能をテストするためのドライバーコード-

    <?php 
    $arr = array();
    $str = "abcdefghijklmnopqrstuvwxyz";
    $values_to_check = array();
    for($i=1;$i<=50000;++$i){
        $str_length = rand(1,50);
        $new_str = "";
        while($str_length-- > 0){
            $new_str .= $str[rand(0,25)];
        }
        $arr[]  = $new_str;
        if(rand(0,1) === 1){
            $values_to_check[] = rand(0,1) === 1 ? $new_str . $str[rand(0,25)] : $new_str;
        }
    }
    // sort the array of strings.
    sort($arr);
    // test the functionality
    foreach($values_to_check as $each_value){
        var_dump(checkIfValueExists($arr,$each_value));
        echo "<br/>";
    }
    
    

あなたの答え