色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

php top k

孫明賢1年前7瀏覽0評論

PHP中的top k問題是指查找一個數組中前k大(或前k小)的數。這個問題是經典的排序問題,有很多不同的解決方案。

一種簡單的解決方案是使用PHP自帶的sort函數對數組進行排序,然后選取前k個數。以下是一個示例代碼:

$nums = [5, 2, 9, 1, 7, 3];
sort($nums);
$top_k = array_slice($nums, -3, 3);
print_r($top_k);

上述代碼會輸出數組中前3個最大的數。

然而,這種方法的時間復雜度為O(nlogn),在大數據集上表現不佳。因此,我們需要更優秀的解決方案。

一種改進的方法是使用PHP中的最大堆(或最小堆)來保存當前k個最大(或最小)的數。以下是一個示例代碼:

class MaxHeap extends SplPriorityQueue
{
public function compare($priority1, $priority2)
{
return $priority1 - $priority2;
}
}
function top_k($nums, $k)
{
$heap = new MaxHeap();
foreach ($nums as $num) {
$heap->insert($num, $num);
if ($heap->count() > $k) {
$heap->extract();
}
}
$result = [];
while ($heap->valid()) {
$result[] = $heap->extract();
}
return $result;
}
$nums = [5, 2, 9, 1, 7, 3];
$top_k = top_k($nums, 3);
print_r($top_k);

上述代碼會輸出數組中前3個最大的數。該方法的時間復雜度為O(nlogk),在大數據集上表現良好。

除了最大堆方法外,還有一種線性復雜度的解決方案是使用快速選擇算法。該算法的原理類似于快速排序,但是只需對需要的部分進行操作。

以下是一個示例代碼:

function partition(&$nums, $left, $right)
{
$pivot = $nums[$right];
$i = $left;
for ($j = $left; $j < $right; $j++) {
if ($nums[$j] >= $pivot) {
list($nums[$i], $nums[$j]) = [$nums[$j], $nums[$i]];
$i++;
}
}
list($nums[$i], $nums[$right]) = [$nums[$right], $nums[$i]];
return $i;
}
function quick_select(&$nums, $left, $right, $k)
{
if ($left == $right) {
return $nums[$left];
}
$pivot_index = partition($nums, $left, $right);
if ($k == $pivot_index) {
return $nums[$k];
} elseif ($k < $pivot_index) {
return quick_select($nums, $left, $pivot_index - 1, $k);
} else {
return quick_select($nums, $pivot_index + 1, $right, $k);
}
}
function top_k($nums, $k)
{
$length = count($nums);
$kth_largest = quick_select($nums, 0, $length - 1, $length - $k);
$result = array_filter($nums, function($num) use ($kth_largest) {
return $num >= $kth_largest;
});
return $result;
}
$nums = [5, 2, 9, 1, 7, 3];
$top_k = top_k($nums, 3);
print_r($top_k);

上述代碼會輸出數組中前3個最大的數。該方法的時間復雜度為O(n),是最優秀的解決方案之一。

總的來說,PHP中的top k問題可以使用多種解決方案來解決,具體的選擇需要根據實際情況進行評估。