快速找到多维数组中最大的数组?

时间:2014-02-18 18:02:23

标签: php arrays computer-science

情况:我有一个包含可变数量元素的多维数组。 e.g。

array(N) {
    0 => array(3) { ... },
    1 => array(8) { ... },
    2 => array(1) { ... },
    ...
    M => array(12) { ... },
    ...
    N-1 => array(7) { ... }
}

我想找到这个子数组中的最大元素数(在上面的例子中,它将是12)。一个简单的解决方案是O(N)线性搜索。

<?php
function max_length($2d_array) {
    $max = 0;
    foreach($2d_array as $child) {
        if(count($child) > $max) {
            $max = count($child);
        }
    }
    return $max;
}

然而,我不禁想知道是否有一些聪明的技巧来优化这种查找。所以我的问题是两个部分(虽然任何一个部分的答案都可以解决它):

  • 是否有一种算法比O(N)更快地执行此搜索而不需要特殊要求(预先排序等)?
  • 是否有一个模糊的PHP函数,它将在本机代码而不是我的用户态PHP脚本中执行此搜索?

6 个答案:

答案 0 :(得分:3)

不确定性能,但我认为以下内容应该有效:

$count = array_map('count', $input_arr);
$min = array_keys($count , max($count))[0];
$largest_arr = $input_arr[$min];

甚至:

$counts = array_map('count', $input_arr);
$key = array_flip($counts)[max($counts)];
$largest_arr = $input_arr[$key];

答案 1 :(得分:2)

1)按照元素大小对多维数组进行排序:
选择以O(n logn)最差情况运行的算法,例如堆排序(comparison of sorting algorithms)。

2)选择最后一个元素。
这在O(1)

中运行

因此,如果您自己实现排序算法并假设获取数组长度为O(1)而不是线性(每次询问长度时都不计算),则可以在O(n logn)中执行此操作

我无法评论任何为你做这件事的PHP方法,因为我没有使用它。

答案 2 :(得分:2)

您可以使用:https://www.php.net/manual/ro/function.max.php

$test = array(
           array('G', 'M', 2, 2),
           array(1, 2222, 3)
         );
 $arr = max($test);

//输出->

array(4) {
  [0]=>
  string(1) "G"
  [1]=>
  string(1) "M"
  [2]=>
  int(2)
  [3]=>
  int(2)
}

答案 3 :(得分:1)

只是为了好玩:

array_multisort($result = array_map('count', $array), SORT_DESC);
echo $result[0];

答案 4 :(得分:0)

$max = 0;
foreach($array as $obj)
{
    if($obj->dnum > $max)
    {
        $max = $obj->dnum;
    }
}

$numbers = array();
foreach($array as $obj)
{
    $numbers[] = $obj->dnum;
}
$max = max($numbers);

或......

在该文章中阅读更多内容 - Get the maximum value from an element in a multidimensional array?How to find the largest array from a multi dimensional array

答案 5 :(得分:0)

How about this:

function accmp(&$a, &$b) {  return count($a)<count($b)?-1:1; }
$arraylist=array(array(1,2),array(1,2,3),array(1),array(1,2,3,4,5,6),array(1,2,3,4),array(2,3,4));
echo 'original arraylist:<br>'; print_r($arraylist); echo '<br>';
usort($arraylist,'accmp');
echo 'largest array::<br>'; print_r(end($arraylist)); echo '<br>';
echo 'largest size = '.count(end($arraylist))

Just sort array-element in arraylist in ascending order of count(array-element) and take last element.