çiftleri girişlerini önlemek için büyük diziler için in_array'in php için alternatifler

4 Cevap php

I need to generate a large list of random numbers from 600k to 2000k, but the list can not have duplicates.

Benim şu anki 'uygulama' bu gibi görünüyor:

<?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);
?>

If I keep the in_array test commented the processing time is around 1 second, so the mt_rand calls and the used array filling are relatively 'cheap' but when I uncomment the in_array test bad things happens! (I'm just waiting -it's been more then 10 minutes- for the script to terminate...)

Yani (Nasıl çiftleri yakalanma riski olmadan rasgele sayılar oluşturmak olabilir) yinelenen algılama tarafında veya üretim kısmen ya alternatifler arıyorum

Ben hiç bir öneriye açığım.

4 Cevap

Hızlı / kirli bir çözüm için, dizi anahtarları tüm hızınızı artırmak kontrol / kullanarak yapar?

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

in_array en kötü durumda tüm dizi arama gerekir, bu durum, doğrusal maliyetleri demektir (O (n)). Ama dizi tuşunu kullanarak - de - tuşu, maliyetleri (O (1)) Dizi erişimi için maliyeti her zaman sabit olduğundan sabittir.

Örneğin bunun yerine böyle bir şey yapabileceğini

$random = mt_rand();

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

$array = shuffle($array);

O ilk sırada olan bir dizi oluşturmak istiyorsunuz, ama o dizi karıştırır, böylece değerler rastgele olacaktır. Çarpışmalar! : D

Eğer zaten döngü yapmak ve birden fazla 600.000 gerek yoksa neden tüm bunları kontrol ederseniz, neden sadece ben rastgele $ için $ eklemeyin. yapılır. yeterince rastgele değil?

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

Ayrıca bir dizi yinelenen değerleri kaldırır dizi işlevi array_unique vardır.