收集最低数字算法

时间:2008-12-29 22:39:54

标签: php algorithm

我正在寻找一种算法(或者我认为是PHP代码)来结束一组数字中的10个最低数字。我正在考虑制作一个十项数组,检查当前数字是否低于数组中的一个数字,如果是,则查找数组中的最大数字并将其替换为当前数字。

但是,我计划从数千个中找到最低的10个数字,并且认为可能有更快的方法来实现它。我计划在PHP中实现它,因此任何本机PHP函数都可以使用。

7 个答案:

答案 0 :(得分:10)

对数组进行排序,并使用十个第一个/最后一个条目。

老实说:用一千个条目对数组进行排序所花费的时间比闪烁时间要少。

答案 1 :(得分:6)

您正在寻找的是选择算法。关于该主题的维基百科页面在selecting k smallest or largest elements部分中有几个小节。当列表足够大时,您可以击败天真的“排序整个列表并选择前10个”算法所需的时间。

答案 2 :(得分:3)

天真的方法是对输入进行排序。它可能足够快,所以在做任何更复杂的事情之前,只需尝试并对其进行分析。

可能更快的方法:线性搜索输入,但保持输出数组的排序,以便更容易确定下一个输入是否属于数组。伪代码:

output[0-9] = input[0-9];
sort(output);
for i=10..n-1
  if input[i] < output[9]
    insert(input[i])

其中insert(x)将找到正确的位置(二进制搜索)并进行适当的移位。

但严重的是,首先尝试一下天真的方法。

答案 3 :(得分:1)

你从哪里获得这组数字?

如果你的数字列表已经在一个数组中,你只需要sort(),然后array_slice()来获得前10个。

答案 4 :(得分:1)

对于小型数组而言,我并不重要,但随着它变得越来越大,提高处理速度的一种快速简便的方法是利用数组密钥索引,这对于1个铣削来说。行将使用大约40%的时间。例如:

// sorting array values

$numbers = array();
for($i = 0; $i < 1000000; ++$i)
{
    $numbers[$i] = rand(1, 999999);
}

$start = microtime(true);
sort($numbers);
$res = array_slice($numbers, 0, 10, true);
echo microtime(true) - $start . "\n";
// 2.6612658500671
print_r($res);

unset($numbers, $res, $start);


// sorting array keys

$numbers = array();
for($i = 0; $i < 1000000; ++$i)
{
    $numbers[rand(1, 999999)] = $i;
}

$start = microtime(true);
ksort($numbers);
$res = array_keys(array_slice($numbers, 0, 10, true));
echo microtime(true) - $start . "\n";
// 0.9651210308075
print_r($res);

但是如果数组数据来自数据库,那么最快的可能就是在那里对它进行排序:

SELECT number_column FROM table_with_numbers ORDER BY number_column LIMIT 10

答案 5 :(得分:0)

创建一个有序集(Java中的TreeSet,我不知道PHP),并添加前10个数字。现在迭代其余数字迭代所有数字,添加新数字,然后从集合中删除最大数字。

如果n>&gt;该算法为O(n)。 10。

答案 6 :(得分:0)

我会使用带有10个元素的heap和树根处的最高数字。然后从数字列表的开头开始:

  • 如果堆的元素少于10个:将数字添加到列表中
  • 否则,如果该数字小于堆中的最大数字,请删除堆中的最大数字,然后将当前数字添加到列表中
  • 否则,请忽略它。

您最终会得到堆中最低的10个数字。如果您使用数组作为堆数据结构,那么您可以直接使用该数组。

(或者:您可以切出前10个元素,然后将它们堆叠起来,而不是使用上面的第一步,这会稍快一些)。

然而,正如其他人所说,对于1000个元素,只需对列表进行排序并获取前10个元素。