繁体   English   中英

用于大型数组的php in_array的替代品,用于避免重复条目

[英]alternatives to php in_array for large arrays for avoiding duplicates entries

我需要从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);
?>

如果我保持in_array测试注释处理时间大约是1秒,那么mt_rand调用和used数组填充相对“便宜”但是当我取消注释in_array测试时会发生坏事! (我只是等待 - 已经超过10分钟 - 脚本终止......)

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

我对任何建议持开放态度。

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

$used = array();
for ($i = 0; $i < 600000; ) { 
    $random = mt_rand();
    if (!isset($used[$random])) {
        $used[$random] = $random;
        $i++;
    }
}
$used = array_values($used);

in_array需要在最坏的情况下搜索整个数组,这意味着线性成本( On ))。 但是使用数组密钥作为密钥,成本是恒定的( O (1)),因为数组访问的成本总是不变的。

你可以做一些像这样的事情

$random = mt_rand();

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

$array = shuffle($array);

这将创建一个首先按顺序排列的数组,但随后它会对数组进行洗牌,因此值将是随机的。 没有碰撞! :d

如果你仍然进行循环,如果你不需要超过600000,为什么你会检查它们,为什么不直接将$ i附加到$ random。 完成。 不够随便?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM