Ситуация: У меня многомерный массив с переменным числом элементов. например
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; }
Тем не менее, я не могу не задаться вопросом, есть ли какой-то умный трюк, чтобы оптимизировать этот поиск. Таким образом, мой вопрос – двухпартийный (хотя ответ на любую из частей решал бы его):
Не уверен в производительности, но я думаю, что следующее должно работать:
$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];
$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);
или …
Подробнее в этой статье. Получить максимальное значение из элемента в многомерном массиве? или Как найти самый большой массив из многомерного массива
1) Сортируйте многодисковый массив по размерам элементов:
Выберите алгоритм, который выполняется в O (n logn) в худшем случае, например Heap Sort ( сравнение алгоритмов сортировки ).
2) Выберите последний элемент.
Это выполняется в O (1)
Поэтому, если вы сами реализуете алгоритм сортировки и считаете, что выборка длины массива равна O (1), а не линейной (без подсчета каждый раз, когда вы запрашиваете длину), вы можете сделать это в O (n logn)
Я не могу комментировать какие-либо PHP-методы, которые делают это для вас, так как я не использую его.
Просто для удовольствия:
array_multisort($result = array_map('count', $array), SORT_DESC); echo $result[0];
Как насчет этого:
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))
Просто отсортируйте массив-элемент в arraylist в порядке возрастания count (array-element) и возьмите последний элемент.
Хорошо, @DefuseSec в Twitter сказал следующее:
https://twitter.com/DefuseSec/status/435842054195671040
Я склонен полагать, что это ответ на этот вопрос.