Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于大型数组的php in_数组的替代方案,以避免重复条目_Php_Performance_Algorithm_Optimization_Data Structures - Fatal编程技术网

用于大型数组的php in_数组的替代方案,以避免重复条目

用于大型数组的php in_数组的替代方案,以避免重复条目,php,performance,algorithm,optimization,data-structures,Php,Performance,Algorithm,Optimization,Data Structures,我需要生成一个从600k到2000k的大随机数列表,但是 列表不能有重复项 我当前的“实现”如下所示: <?php header('Content-type: text/plain'); $startTime = microtime(true); $used = array(); for ($i=0; $i < 600000; ) { $random = mt_rand(); //if (!in_array($rand

我需要生成一个从600k到2000k的大随机数列表,但是 列表不能有重复项

我当前的“实现”如下所示:

<?php
    header('Content-type: text/plain');
    $startTime = microtime(true);
    $used = array();
    for ($i=0; $i < 600000; ) { 
        $random = mt_rand();
        //if (!in_array($random, $used)) {
        $used[] = $random;
        $i++;
        //}
    }
    $endTime = microtime(true);
    $runningTime = $endTime - $startTime;
    echo 'Running Time: ' . $runningTime;
    //print_r($used);
?>

如果我将
保留在_数组中
测试注释,则处理时间大约为1秒,因此
mt_rand
调用和
used
数组填充相对“便宜”,但当我取消注释时 阵列内测试发生了不好的事情!(我只是在等待-已经超过10分钟了-脚本终止…)

因此,我在重复检测方面或在生成部分寻找替代方案(如何生成随机数而不存在获得重复的风险)


我愿意接受任何建议

对于快速/肮脏的解决方案,使用/检查数组键是否能提高速度

$used = array();
for ($i = 0; $i < 600000; ) { 
    $random = mt_rand();
    if (!isset($used[$random])) {
        $used[$random] = $random;
        $i++;
    }
}
$used = array_values($used);
$used=array();
对于($i=0;$i<600000;){
$random=mt_rand();
如果(!isset($used[$random])){
$used[$random]=$random;
$i++;
}
}
$used=数组_值($used);

如果您以任何方式进行循环,并且如果您不需要超过600000,为什么要检查它们,为什么不将$i附加到$random。完成。不够随意

for ($i = 0; $i < 600000; $i++)
{
    $yourArray[] = mt_rand() . $i; 
}
($i=0;$i<600000;$i++)的

{
$yourArray[]=mt_rand().$i;
}

此外,还有数组函数array_unique,它可以从数组中删除重复值。

在最坏的情况下,数组中需要搜索整个数组,这意味着线性成本(O(n))。但是使用数组键以及键,成本是恒定的(O(1)),因为访问数组的成本总是恒定的。

例如,您可以这样做

$random = mt_rand();

$array = range($random, $random + 600000);

$array = shuffle($array);

这将创建一个数组,该数组首先是有序的,但随后它会洗牌该数组,因此值将是随机的。没有碰撞!:谢谢!运行时间的差异非常大!即使运行循环20000k次。闪电般的快+1.这种方法很好,因为in_数组不仅运行缓慢,而且会消耗内存。在减少了约20个案例的if并从_阵列中删除所有案例后,我在关键资源上节省了1.2mb内存,可为2500万用户服务。