Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
找出单词B中的每个字母是否都出现在单词A中,这是php中最快的func_Php_Sorting_Strpos - Fatal编程技术网

找出单词B中的每个字母是否都出现在单词A中,这是php中最快的func

找出单词B中的每个字母是否都出现在单词A中,这是php中最快的func,php,sorting,strpos,Php,Sorting,Strpos,我有三个函数: _排序、\u strpos、\u数组\u int <?php class timer{ private $_start; private $_end; public function program_begin(){ $this->_start = microtime(true); } public function program_end(){ $this->_end = microtim

我有三个函数: _排序、\u strpos、\u数组\u int

<?php
class timer{
    private $_start;
    private $_end;
    public function program_begin(){
        $this->_start = microtime(true);
    }
    public function program_end(){
        $this->_end = microtime(true);
    }
    public function get_time(){
        $time_use = ($this->_end - $this->_start)*1000;
        echo $time_use."ms\n";
    }
};
$t = new timer();
$test_cnt = $argv[1];
$s_len1 = $s_len2 = $argv[2];
$t->program_begin();
for($j = 0; $j<$test_cnt; $j++){
    for($i = 0; $i < $s_len1; $i++)
        $s1 .= chr(rand()%26+97);

    for($i = 0; $i < $s_len2; $i++)
        $s2 .= chr(rand()%26+97);

    $flag = call_user_func($argv[3],$s1, $s2);
    $s1=$s2="";
}
$t->program_end();
$t->get_time();

function _sort($s1, $s2){
    for($i = 0; $i < strlen($s1); $i++)
        $arr[] = $s1[$i];

    sort($arr);

    for($i = 0; $i < strlen($s2); $i++)
        if(!search_part($arr, $s2[$i]))
            return false;

    return true;

}
function search_part($arr, $key){
    $s = 0; 
    $e = count($arr)-1;
    while($s<=$e){
        $m = (int)(($s+$e)/2);
        if($arr[$m] > $key)
            $e = $m-1;

        if($arr[$m] < $key)
            $s = $m+1;

        if($arr[$m] == $key)
            return true;
    }
    return false;
}

function _strpos($s1, $s2){
    for($i = 0; $i < strlen($s2); $i++)
        if(strpos($s1,$s2[$i]) === false)
            return false;

    return true;
}

function _array($s1, $s2){
    for($i = 0; $i < strlen($s1); $i++)
        $arr[$s1[$i]] = 1;

    for($i = 0; $i < strlen($s2); $i++)
        if(!isset($arr[$s2[$i]]))
            return false;

    return true;
}

function _array_int($s1,$s2){
    for($i = 0; $i < strlen($s1); $i++)
        $arr[ord($s1[$i])] = 1;

    for($i = 0; $i < strlen($s2); $i++)
        if(!isset($arr[ord($s2[$i])]))
            return false;

    return true;
}
我认为时间的复杂性: _sortas func A:仅限 _数组函数B:On _STRPSAS功能C:在^2上 因此,速度似乎是B>A>C 但测试结果是:C>B>A 我无法解释为什么C是最快的

如果您只是简单地使用str\u split来匹配一个字符串是否是另一个字符串的一部分,那么可以像php test.php test\u count word\u lenght test\u func那样对其进行测试。您的代码似乎过于复杂

  $string1 = "ABCD";
  $string2 = "AABCDEF";

  $origin = str_split($string1);
  $other = str_split($string2);

  foreach ($origin as $char) {
      if (in_array($char, $other)) {
          //char found
      } else {
          //char not found
      }
  }

^2上的操作可能比其他操作执行得更快,原因之一是它包含错误

if(!strpos($s1,$s2[$i]))
        return false;
这实际上意味着,如果$s1中没有字符$s2[$i],或者它是$s1中的第一个字符,则返回false.,因为字符串索引从0开始。这可能不是您想要的,例如,当两个字符串都以相同的字符开头时,它会在O1中立即返回false。您可以改为使用ifstrpos$s1、$s2[$i]==false来修复此问题

其次,您用于测试的输入对于您获得的结果至关重要。由于O10*n仍处于开启状态,因此无法保证对于较小的输入,On算法的执行速度会比On²更快,以此类推。当n足够大时,这个保证是渐近结果。此外,与最坏的情况相反,算法的特殊性也会导致特定情况下的不同性能。例如,如果一个字符串明显小于另一个字符串,或者满足其他特殊条件,特别是因为您允许算法尽快快速返回false,那么二次函数通过简单地以交换顺序$s2、$s1传递参数,可能会产生与自身非常不同的性能,不必一直处理两个字符串


最后,您的On算法通常应该在3种算法中表现最好,尤其是随着输入大小的增加,但并不一定能保证它在每次输入时都能表现得更好。

如果按字母顺序对两个数组进行排序,并将字符串与==”进行比较,它会有多快/慢?你也可以使用strstr,我假设你的意思是C是测试中最快的,因为当你说speed to On>ongn>On²对不起,我的意思是C是最快的,我修改了它。这不是他想要的。他想检查每个字母是否都存在,而不是它是否是子字符串。@Arthur好的,现在看一看。我不想找到子字符串,只是想测试单词B中的每个字母是否都出现在单词a中,而不是顺序。这是解决问题的一种方法,我给出三种方法,我想找出哪一个最有效。我的测试和我的猜测不一样,我很困惑。;感谢您耐心地解释并找到我的bug。我在问题中添加了我的测试代码。我将单词lenght从20改为200000,但数组的效果并不比strpos好。