PHP では、中央値を求めるなど、非常に大きな配列を処理する必要がある場合があります。ただし、非常に大きな配列の場合、従来の並べ替え方法を使用すると、非常に時間とメモリを消費します。では、非常に大きな配列の中央値を見つけるより効率的な方法はあるのでしょうか?この記事では、高速選択アルゴリズムに基づいた効率的な解決方法を紹介します。
クイック選択アルゴリズムは、クイック ソート アルゴリズムに基づいて改良されたアルゴリズムです。その主なアイデアは、順序付けされていない配列内の項目を次の方法で検索することです。急速除算 k 番目に小さい要素。その時間計算量は O(n) であり、従来の並べ替えアルゴリズムの時間計算量 O(n log n) よりも効率的です。
クイック選択アルゴリズムの基本的な手順は次のとおりです:
以下はアルゴリズムの詳細な手順です:
まず、中央値の中央値の位置を決定する必要があります。配列内の要素 $n$ の数が奇数の場合、中央値は $nums[(n-1)/2]$ になります。要素の数 $n$ が偶数の場合、中央値は $( nums[n /2-1] nums[n/2])/2$。function quickSelect($nums, $k) { $n = count($nums); $left = 0; $right = $n - 1; $mid = ($n - 1) / 2; while (true) { $pos = partition($nums, $left, $right); if ($pos == $mid) { if ($n % 2 == 0) { // 偶数个元素 return ($nums[$pos] + $nums[$pos + 1]) / 2; } else { // 奇数个元素 return $nums[$pos]; } } elseif ($pos < $mid) { $left = $pos + 1; } else { $right = $pos - 1; } } } function partition(&$nums, $left, $right) { $pivot = $nums[$left]; $i = $left; $j = $right; while ($i < $j) { while ($i < $j && $nums[$j] >= $pivot) { $j--; } while ($i < $j && $nums[$i] <= $pivot) { $i++; } if ($i < $j) { $temp = $nums[$i]; $nums[$i] = $nums[$j]; $nums[$j] = $temp; } } // 将pivot元素放到正确的位置 $nums[$left] = $nums[$i]; $nums[$i] = $pivot; return $i; } // 测试示例 $nums = array(1, 2, 3, 4, 5, 6, 7, 8, 9); echo quickSelect($nums, 5); // 输出5(因为5在数组中的中间位置)
以上がPHPで非常に大きな配列の中央値を見つける方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。