我正在寻找一种算法(或者我认为是PHP代码)来结束一组数字中的10个最低数字。我正在考虑制作一个十项数组,检查当前数字是否低于数组中的一个数字,如果是,则查找数组中的最大数字并将其替换为当前数字。
但是,我计划从数千个中找到最低的10个数字,并且认为可能有更快的方法来实现它。我计划在PHP中实现它,因此任何本机PHP函数都可以使用。
答案 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个元素,然后将它们堆叠起来,而不是使用上面的第一步,这会稍快一些)。
然而,正如其他人所说,对于1000个元素,只需对列表进行排序并获取前10个元素。