基于元素的第一个和最后一个值检测和删除数组中元素的最有效方法

lin*_*ndy 6 php arrays comparison

我试着缩短我的问题,但这是我能做的最好的.既然我觉得很难理解我的需要,我会提供一个例子:

说我有以下数组:

$var = array(
    array(1, 2, 3),
    array(1, 3),
    array(1, 2, 4, 3),
    array(1, 3, 4)
);
Run Code Online (Sandbox Code Playgroud)

我想要的是从中删除所有数组$var,其中第一个和最后一个元素与另一个数组相同,$var但元素多于后者.

所以,下面的阵列应删除:(1, 2, 3)而且(1, 2, 4, 3)因为他们都开始1和结束3,并有更多的元素比(1, 3),这也开始,以13.(1, 3, 4)应该保留,因为没有其他数组以其开头1和结尾,4并且元素少于它.

无论是在内存还是时间方面,我都在寻找最有效的方法.$var可能有多达100个数组,每个单独的数组最多可包含10个元素.我想在所有两个元素之间进行某种比较(for(i=0;...) for(j=i+1;...) complexCompareFunction();),但我相信这不是很有效.

Jaz*_*azz 1

总的来说,是的,您太担心效率了(正如您在另一条评论中想知道的那样)。尽管 PHP 不是最快的语言,但我建议构建最简单的解决方案,并且只在最终结果存在明显问题时才担心优化或简化它。

这就是我会做的,从我的头脑中。它基于 ajreal 的答案,但希望会更容易遵循,并捕获该答案错过的一些边缘情况:

// Assume $var is the array specified in your question

function removeRedundantRoutes( $var ){

    // This line sorts $var by the length of each route
    usort( $var, function( $x, $y ){ return count( $x ) - count( $y ); } );

    // Create an empty array to store the result in
    $results = array();

    // Check each member of $var
    foreach( $var as $route ){
        $first = $route[0];
        $last = $route[ count( $route ) - 1 ];
        if( !array_key_exists( "$first-$last", $results ) ){
            // If we have not seen a route with this pair of endpoints already,
            // it must be the shortest such route, so place it in the results array
            $results[ "$first-$last" ] = $route;
        }
    }

    // Strictly speaking this call to array_values is unnecessary, but
    // it would eliminate the unusual indexes from the result array
    return array_values( $results );
}
Run Code Online (Sandbox Code Playgroud)