我有一个包含字符串值作为数据的大数组。我想优化这个数组,所以我可以执行查询,以尽快检查数组中是否存在某个字符串。因此,我要说我用$arr= [];
创建数组,然后添加如下值:
foreach($names as $name)
$arr[]= $name;
现在我想执行很多像if(in_array($random_string, $arr))
这样的查询,但它很慢。我想为数组添加一些索引以优化性能。我应该只使用数组的sort()
函数吗?
如何使用字符串数据优化数组以检查字符串是否存在查询?
编辑:不,显然这不是&#34的重复;什么是更快:in_array或isset? [关闭]",您可以通过vivek_23的答案看到。
答案 0 :(得分: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/>";
}