优化大字符串数组以检查字符串是否存在查询

时间:2018-05-24 21:46:43

标签: php

我有一个包含字符串值作为数据的大数组。我想优化这个数组,所以我可以执行查询,以尽快检查数组中是否存在某个字符串。因此,我要说我用$arr= [];创建数组,然后添加如下值:

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

现在我想执行很多像if(in_array($random_string, $arr))这样的查询,但它很慢。我想为数组添加一些索引以优化性能。我应该只使用数组的sort()函数吗?

如何使用字符串数据优化数组以检查字符串是否存在查询?

编辑:不,显然这不是&#34的重复;什么是更快:in_array或isset? [关闭]",您可以通过vivek_23的答案看到。

1 个答案:

答案 0 :(得分:1)

  • 我建议您sortingbinary 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/>";
}