Bir Şifreyi Rastgele mi Yoksa Sıra İle mi Denemek Daha Hızlıdır?

Selamlar,

Bu makalede aklıma takılan bir soruya daha doğrusu merak ettiğim bir konuya, hep beraber cevap arayacağız :)

Soru : Diyelim ki 6 haneli bir Şifreyi bulmak gereksin. 2 yöntemimiz olsun.

  1. Klasik 1’den 999999’a kadar tüm şifreler, tek tek denenir.
  2. Yol ise çok farklı. Öncelikle 6 haneli olabilecek tüm sayılar bir diziye toplanır. Daha sonra listeden random 1 sayı çekilir. Şifreye ulaşılamaz ise ilgili sayı listeden çıkarılıp, random yeni bir sayı çekilir. Bu işleme, şifre bulunana kadar devam edilir.

Bilin bakalım hangi işlem daha kısa sürer ?

FindByCount(): Bu method, klasik 6 haneli tüm sayıları iç içe 6 döngü ile gezmekte ve şifre bulunduğunda geri dönmektedir. Örneğin 999999 password’ü için, tüm olasılıklar denenmektedir.

FillArray() : 6 haneli tüm sayılar, bir dizi içerisine 6 döngü ile string olarak atılmıştır. Burada amaç, 6 haneli şifre olabilecek tüm sayıların önceden bulunup bir listede tutulmasıdır.

FindByRandom(): Bu methodda amaç, 6 haneli bir şifrenin tüm olasılıklarının bulunduğu bir diziden rastgele bir sayının çekilmesi, ve doğru değil ise ilgili sayının listeden çıkarılıp aynı işlemin şifre bulunana kadar tekrarlanmasıdır.

Aşağıda örnek amaçlı yapılmış 2 deneme görülmektedir. Açık ara fark ile, sıralı sayım yöntemi yani FindByCount() çok daha hızlı sonuca ulaşmaktadır.

Böylece geldik bir makalenin daha sonuna. Bu makalede, rastgele seçim yöntemi mi yoksa sıralı deneme yöntemi mi daha hızlı Myth’ine bir cevap bulmaya çalıştık. Random deneme biraz şansa bir durum gibi gözükse de, sıralı deneme benim gibi sağlamcı developerlar için açık ara en iyi yöntem :)

Yeni bir makalede görüşmek üzere hepinize hoşçakalın.

Tüm Kod:

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

14 Cevaplar

  1. Tagi dedi ki:

    Çok ilginç yazı olmuş. Ellerinize sağlık :)

  2. Ali dedi ki:

    tek bir denemeden bu sonuca nasıl ulaştınız? yüz adet test yapıp mod yada aritmetik ortalamayı paylaşmak daha sağlıklı olacaktır.

    • borsoft dedi ki:

      Selamlar Ali,
      Siz bir selenium ile autotest yazıp, aynı işlemi 1000 kere farklı şifreler ile denetip makalenin sonuna yorum olarak paylaşırsanız harika olur :) Nerde hareket orda bereket :)

      İyi çalışmalar.

  3. ÇETİN DOĞU dedi ki:

    Random şifre aramaya haksızlık olmuş. List bir siniftan remove etme işlemi ile de zaman kaybedilir olabilir. Hashset ve dictionary ile de denemek lazım. Adil olması için sıralı aramada da tumunu listeye atıp her denediginde remove etmek lazım belkide… İlk aklıma bu geldi ama belki yanlış düşündüm bir an:) güzel çalışma ama fark büyük olduğu için bir sıkıntı var gibi geldi nedense bana.

  4. Hakan dedi ki:

    Burada new Random() satırı da yavaşlamaya sebep olmuş olabilir mi ? Yani Random sayı üretmek maliyetli olduğundan da böyle bir sonuca ulaşmış olabilir mi ?

  5. Çağdaş İlhan dedi ki:

    Varyasyon Listini parçalara bölüp her bir parçayı bir ayrı threadde yesek Randoma yeterli nitroyu vermiş olur muyuz ? Verdiğimiz hız tükettiğimiz kaynağa değer mi ? Babam pasta yapmayı neden öğrenmedi ?

  6. Berkay dedi ki:

    Çok bilgilendiricibir yazı.

  7. Eylul dedi ki:

    Hocam çok muazzam bir anlatım elinize sağlık

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir