Arama butonu
Bu konudaki kullanıcılar: 1 misafir
51
Cevap
2418
Tıklama
1
Öne Çıkarma
Cevap: C dilinde birbirinden farklı random sayılar atama (3. sayfa)
H
4 yıl
Binbaşı

Hala bu konuda tartışma dönüyor. Sonunda çözümünü yazmışsın, bu çözüm ne zaman yavaş çalışıyor sana açıklayayım

Soruda verilen sayılara N=50, K=20 diyelim. List uzerinde pop işleminin average time complexitysi O(N) dir. Dediğin çözüm O(N*K) olacak. N sayısını artırınca bu çözüm yavaş çalışır. Buna karşılık N=1e6 iken basit bir hashmap kullanırsan milyon kat daha hızlı çalışan bir sonuç elde edebilirsin çünkü N sayısının bir etkisi olmaz. Bu yüzden sana soruya göre çözüm yazılır dedim.


Bu mesaja 2 cevap geldi.

Bu mesajda bahsedilenler: @Stack
S
4 yıl
Yüzbaşı

Ufak bir meselede beni biri şikayet ettiğinde dakikasında ceza veriyorlar. şimdi ise saatler geçti halen çıt yok! Yazıklar olsun böyle foruma!

Mesele sorunun genel ve doğru çözümü. Hızlı ama tartışmalı çözümü değil! şu hashmap örneğini gönder de bir bakalım.


Bu mesaja 1 cevap geldi.
S
4 yıl
Yüzbaşı

quote:

Orijinalden alıntı: hynx

Hala bu konuda tartışma dönüyor. Sonunda çözümünü yazmışsın, bu çözüm ne zaman yavaş çalışıyor sana açıklayayım

Soruda verilen sayılara N=50, K=20 diyelim. List uzerinde pop işleminin average time complexitysi O(N) dir. Dediğin çözüm O(N*K) olacak. N sayısını artırınca bu çözüm yavaş çalışır. Buna karşılık N=1e6 iken basit bir hashmap kullanırsan milyon kat daha hızlı çalışan bir sonuç elde edebilirsin çünkü N sayısının bir etkisi olmaz. Bu yüzden sana soruya göre çözüm yazılır dedim.
hashmap, O() notasyonunda rahatlatıcı gözükse da hashmap hesaplaması, instruction cycle olarak biraz maliyetli bir iş. lose lose, sdbm gibi hash fonksiyonların implementation'larında hep rahatsız edici bir while() loop vardır :)



T
4 yıl
Binbaşı

quote:

Orijinalden alıntı: Stack

Konu ile alakasız olduğun açık. Kardeşim bu sorunun çözümü bu şekilde değil!!! Geyiği bırak işine bak!
Belli bir noktadan sonra iş illaki karışacaktır. Rastgele sayılar sonsuza dek aynısı da gelebilir. Kaldı ki bir tane değerden bahsetmiyoruz, 20 tane farklı sayı belli bir aralıkta üretilecek.
Bu türden çözümler genel olmalı ve tesadüfe bağlı olmamalıdır. Farzedelim ki 20 değil 20 milyon sayı olacak! Yani çakışmalar olmaması ve işlemin bir an önce bitmesi için çok dua etmek gerekiyor.
Daha mantıklı ve pratik bir yolu var bunun. Biraz saksıyı çalıştırmak gerekli sadece.
Birader o kadar boş ve insanlara yukardan bakan yorumlar yapmışsın ki, gülsem mi sinirlensem mi bilemedim. Bu kadar ego iyi değil, özgüven sorunların olduğunu çok belli ediyor dışarıya. Bi psikoloğa görünmeni öneririm. Selam ve dua ile <3



T
4 yıl
Binbaşı

Konunun tamamını okumadım ancak şöyle basit bir algoritma yazılabilir:

0-X aralığındaki sayılardan, rastgele Y uzunlukta bir dizi oluşturmak ve birbirinin aynısı olan iki eleman içermesini istemiyoruz diyelim.

X+1 uzunluğunda bir dizi oluşturup (z diyelim ismine), her olası elemanı bu diziye atarız sırasıyla

z=[]
for i in range(X+1):
z.append(i)

sonra 0-X arasında rastgele sayı üretmek yerine, 0-len(z) arasında rastgele sayı üretiriz ve Z listesinde bu rastgele sayıya denk gelen sayıyı alıp asıl listemize ekleriz.

y_list = []
for i in range(Y):
a = random.randrange(len(z)) // Z listesindeki rastgele bir sayının indisini seçiyoruz
y_list.append(z[a]) // seçtiğimiz elemanı asıl listeye ekliyoruz
z.pop(a) //eklediğimiz elemanı Z listesinden çıkarıyoruz


Bu mesaja 1 cevap geldi.
S
4 yıl
Yüzbaşı

Okuduğunu anlayamayan, okumayan veya okuyup da okumadı ayağına yatan kişilik!
İşte yıllardır senin gibilere laf anlatmaya çalışıyoruz! Yaşım da çıkacak ortaya!
Orta yere atlamadan önce keşke sunulan çözüme bir baksaydın. Zaten aynı şeyi yapıyor





< Bu mesaj bu kişi tarafından değiştirildi Stack -- 2 Nisan 2021; 19:0:9 >

H
4 yıl
Binbaşı

#include <cstdio>
#include <cstdlib>
#include <unordered_map>
#include <vector>


int fe(){
    int ayni= 0;
    std::vector<int> a(20);
    std::unordered_map<int, int> b;
    for(int i=0;i<a.size();i++){
        a[i]=rand()%1000000;
        while(b[a[i]]){
            a[i]=rand()%1000000;
            ayni++;
        }
        b[a[i]]=1;

    }
    return ayni;
}




int main(int argc, char **argv){
    int ct = 0;
    srand(time(NULL));
    for(int i=0;i<1000000;i++)
        ct += fe();
    printf("%d\n",ct);
    return 0;
}
Önceki çözümü düz array olarak değil hashmap olacak şekilde değiştirdim sadece, bir de bunu C'ye çevirmesi zor olur. Milyon kat değil bin kat falan hızlı oldu belki hash kullandığım içindir. Python çözümü N=1e9da çalışmıyor galiba memory yetmediği için.

Bu çözümde de N ile K birbirine çok yakın olursa çakışma sayısı fazla olacak, o zaman python daha iyi olur.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @Stack
C
4 yıl
Yüzbaşı

const nums = new Set();
while(nums.size !== 8) {
nums.add(Math.floor(Math.random() * 100) + 1);
}

console.log([...nums]);
Js in gözünü sevem


Bu mesaja 2 cevap geldi.
C
4 yıl
Yüzbaşı

S
4 yıl
Yüzbaşı

quote:

Orijinalden alıntı: hynx

#include <cstdio>
#include <cstdlib>
#include <unordered_map>
#include <vector>


int fe(){
    int ayni= 0;
    std::vector<int> a(20);
    std::unordered_map<int, int> b;
    for(int i=0;i<a.size();i++){
        a[i]=rand()%1000000;
        while(b[a[i]]){
            a[i]=rand()%1000000;
            ayni++;
        }
        b[a[i]]=1;

    }
    return ayni;
}




int main(int argc, char **argv){
    int ct = 0;
    srand(time(NULL));
    for(int i=0;i<1000000;i++)
        ct += fe();
    printf("%d\n",ct);
    return 0;
}
Önceki çözümü düz array olarak değil hashmap olacak şekilde değiştirdim sadece, bir de bunu C'ye çevirmesi zor olur. Milyon kat değil bin kat falan hızlı oldu belki hash kullandığım içindir. Python çözümü N=1e9da çalışmıyor galiba memory yetmediği için.

Bu çözümde de N ile K birbirine çok yakın olursa çakışma sayısı fazla olacak, o zaman python daha iyi olur.
"a" vectorünün boyutu arttırdığında maalesef işler karışıyor. Ki zaten gerçekte böyle durumlardan bahsediyoruz. Yani 20 farklı sayı için değil çok daha fazlası için!
Örneğin yüzbin (100.000) farklı değer için bahsettiğimiz ilk yöntem bende 1.2 saniyede tamamlanırken, bu hash şeklinde tamamlanamadı. 10 bin bile tamamlanamadı!


Bu mesaja 1 cevap geldi.
S
4 yıl
Yüzbaşı

quote:

Orijinalden alıntı: cenkakay08

const nums = new Set();
while(nums.size !== 8) {
nums.add(Math.floor(Math.random() * 100) + 1);
}

console.log([...nums]);
Js in gözünü sevem
Zahmet önceki edip yazılanları bi okumayı deneseydin keşke... Bu yöntem de "brute force" dur.
Ulan bi bitmediniz gitti!



T
4 yıl
Yarbay

Çözüm geçersiz cunku JS'da birbirini tekrar etmeyen (unique) veri tutan "Set" yapısını kullanıyor.



< Bu ileti mini sürüm kullanılarak atıldı >


Bu mesajda bahsedilenler: @cenkakay08
T
4 yıl
Yarbay

linkteki çözüm gereksiz cunku soruda 50 eleman içinden 20 tekrarsız eleman seç deniliyor. linkteki çözüm ise onbinlerce eleman içinden dahi hızlı eleman seçen bir "akıllı" algoritma şovu yapıyor. soru temel bir programcılık sorusu, clever algorithm sorusu değil.





< Bu mesaj bu kişi tarafından değiştirildi Tuğkan-0153 -- 2 Nisan 2021; 23:33:16 >

< Bu ileti mini sürüm kullanılarak atıldı >


Bu mesajda bahsedilenler: @cenkakay08
H
4 yıl
Binbaşı

Benim kodda hızlı çalıştığını göstermek için mainde bir milyon kere çalıştırmıştım, asıl kod fe fonksiyonunda.
Maindeki for loopu kaldırırsan yine çoğu değer için pythondan hızlı çalışıyor ama K N'nin yarısından büyük olmaya başlarsa fazla yavaşlıyor.

Stack overflowdaki gibi orada Kya M, Nye N demişler, daha iyi çözümler de var.




Bu mesajda bahsedilenler: @Stack
E
4 yıl
Yüzbaşı

Şöyle bir şey yapsam peki O(N) complexity'sinden kurtulabilir miyim?
import random
sayılar = [*range(50)]




cevap = []
for i in range(20): 
index = random.randint(0, len(sayılar) - 1)
cevap.append(sayılar[index])
sayılar[index], sayılar[len(sayılar) - 1] = sayılar[len(sayılar) - 1], sayılar[index]
sayılar.pop()
indexlerin sayılarla bir bağlantısı olmadığı için sayıları istediğimiz gibi karıştırabiliriz. Gerçi burada swap işleminin time complexity'si ne bilmiyorum.

Bu arada soru çok basit bir soru, bence ilk söylenen yöntemler de gayet çalışırdı niye bu kadar tartışıldı anlamadım.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @hynx
H
4 yıl
Binbaşı

Önceki O(NK) idi bu O(N+K) oluyor " sayılar = range(50)" den dolayı. Şimdi yine N, K dan çok büyük olursa yavaş çalışır yani. Benimki de N ile K yakın olunca çalışmıyor.
Bu arada bence de hiçbir çözümde sorun yok ama sizinki yanlış benimki doğru denince bizimki de farklı inputlarla çalışıyor diye göstermek istedim. Boşa uzattık ama haklısın



G
4 yıl
Yüzbaşı

Basit soruyu nasıl baltalamış ergene bak ya . İyi güldüm kaale alıp cevap vermişsiniz bide.



< Bu ileti Android uygulamasından atıldı >

S
4 yıl
Binbaşı

Birinci sınıf BM öğrencisiyim ve konuyu şöyle okudum:

< Resime gitmek için tıklayın >

----

Hocamız yüksek performanslı algoritma geliştirmenin herkesi harcı olmadığını ve çok nadir bulunduğunu söyledi. Bulanlar da isim alıp markalaşıyormuş. Bizim yapacağımız sıfırdan yüksek performanslı algoritma geliştirmek yerine best practices dedikleri yöntemleri araştırıp mantığını anlayıp uygulamak. Bu problem özelinde şöyle ilerlememiz gerekmez miydi?

[1]: Problemi anla.
[2]: Best practices araştırması yap.
[3]: Probleme uygulama.
[4]: Test et.

Hocamız yanılıyor bu noktada?

Yine derste sürekli algoritma analizi yapıyoruz. Aynı bu tür sorular soruluyor ve ilk biz aklımıza gelen yöntemi söylüyoruz. Hoca hiç eleştiri yapmadan onu yazıyor. Sonra sürekli onun üzerinden iyileştirme yapmaya çalışıyoruz. Stack hocanın sanırım vurgulamak istediği buydu. Performans odaklı olması lazım çözümlerin.





< Bu mesaj bu kişi tarafından değiştirildi scientia -- 3 Nisan 2021; 16:58:18 >

E
4 yıl
Yüzbaşı

quote:

Orijinalden alıntı: SBK

Neyi ispatlamaya çalışıyorsun bilmiyorum ama burada sabit bir maske, xor ve sadece sifirinci bite bakip logic shift ile O(1) de yapılan işlemin gerçekten rastgele(?) Sonuçlar vermeyeceği zaten bariz değil mi?

Systick veya başka bir şekilde randomize edilmiş bir seed ile başlarsak random gozuken ve tekrar etmeyen bir sayı dizisini O(1) de elde edebiliyoruz. Hash table vs gibi bir seyle tekrarlayan sayi var mi diye aramaya gore muhtemelen onlarca kat daha hizli ve herhangi ekstra memory space ihtiyaci da yok.
integer based embedded system'lerde rastgele sayi dizisi uretmek icin neredeyse standart olarak bu tip bit manipulasyonlari kullaniliyor. Ha illa random olmasi cok onemli ise, secure processorlerde TRNG diye dedicated bir hardware unit oluyor. Cunku bunu konvansiyonel olarak yapmak, kullandığın ALU bozuk degilse zaten matematiksel olarak imkansiz.
Ben de hobi olarak retro emulatör geliştirmiştim bir ara. Makinanın ses üreteci çipi noise üretmek için random sayı oluşturması gerekiyordu. Tabi o ilkel cihazlarda şimdiki gibi kompleks trng donanımları olmadığı için basitçe iki biti xor yapıp msb'e kopyalıyordu. Bir kere de sağa iteleyince rastgele bit elde ediliyordu. Eski sistemlerle uğraşmak çok zevkli. Belki de basit oldukları içindir. Modern mimarileri anlamaya ömür yetmez.





< Bu mesaj bu kişi tarafından değiştirildi EmuDev -- 4 Nisan 2021; 17:44:44 >
Bu mesaja 1 cevap geldi.