Forum: Ders Arası RSS
Diziyi eşleme tablosu gibi ilklemek?
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Diziyi eşleme tablosu gibi ilklemek?
void main() {
    int[] a = [ 0:10, 5:50 ];
}
Yukarıdaki kullanımı herhalde bir kere görmüşüm ama şimdi tekrar karşılaşınca yine çok şaşırdım. :)

Ali
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
İstikrarlı...

Sonuçta sıradan bir diziyi, pekala int[size_t] şeklinde ifade edebilirdik ve sıradan bir şekilde kullandığımızda veya bunun ne tür bir değişken olduğunu sorgulamadığımızda anlayamazdık.

Ama bu örnekte önemli bir fark var; o da uzunluğunu öğrendiğimizde, sanırım 6 elemanlı bir dizi olduğunu görecektik. Dolayısıyla 1, 2, 3, 4 numaralı dizinlerde (in indexes) 0 değerinin bulunması gerekiyor.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Buradaki istikrarın biraz dolambaçlı yoldan gelmesi hoşuma gidiyor: :)

  • Diziler elemanlara indeksle eriştirirler.

  • Eşleme tabloları elemanları (associative arrays) anahtar değeriyle eriştirirler.

  • O zaman dizileri de bir eşleme tablosu gibi görebiliriz: Elemanlara size_t değeri ile eriştirir diyebiliriz. (Tabii aynı şey değil: Veri yapısı açısından birisi array, diğeri hash table.)

  • O zaman dizilere de aynı ilkleme söz dizimini verelim.

Ali
agora #4
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Buna benzer bi kullanım Python'da da vardı sanırım. Doğru anladıysam eğer hocam

indeks içinde bir index gibi alıyorduk onları


Anladigim dogru mu buradaki yapilmasi da ayni mi?
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Python'u o kadar bilmiyorum ama doğrudur herhalde. :)

Ali
Avatar
zekeriyadurmus #6
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hocam yüksek değerli bir index yazınca derleme süresi gereksiz yere uzuyor fark ettiniz mi?
Bilgi meraktan gelir...
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Eminim, o diziyi bu yazımı kullanmadan ilklediğinde de aynı derecede yavaştır çünkü programın içine gömülecek olan dizi hazır değerini (array literal) derleme zamanında oluşturması gerekiyor:
    int[] a = [ 0:10, 5000:50 ];
    int[] b = [ 10, 0, /* ... gereken sayıda sıfırı elle yazdığımızı varsayalım ... */, 50 ];

Yani, bu söz dizimi yalnızca kolaylık getiriyor. Ölçmedim ama sanırım a ile b'nin derleme süreleri kabaca eşittir.

Ali
Avatar
zekeriyadurmus #8
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Derleme süreleri gerçekten çok fark ediyor hatta derlenmediği de oldu
Bilgi meraktan gelir...
acehreli (Moderatör) #9
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Hm. Yaptığım deneme benim düşündüğüm gibi olduğunu gösteriyor. Önce şu programı yazdım:
import std.stdio;
 
void foo(int[] a)
{
    writeln(a[0] + a[10000]);
}
 
void main()
{
    int[] a = [ 0:10, 10_000:50 ];
    foo(a);
}

Gerçekten de derleme süresi uzun:

time dmd deneme.d

Kabaca 0.9 saniyede derlendi.

Sonra o diziyi elle yazmış olsam nasıl olurdu diye denemek istedim ve 10001 elemanlı dizi oluşturan bir işlev yazdım ama tabii onu oluştururken zaman kaybedilmesin diye diziyi standart çıkışa yazdırdım:
void dizi_yap()
{
    write("int[] a = [ 10");
 
    foreach (i; 1..10_000) {
        write(", 0");
    }
 
    writeln(", 50 ];");
}
O işlevi kullanarak yazdığım programın çıktısını a_dizisi isimli bir dosyaya aktardım (o programı burada göstermiyorum):

./deneme > a_dizisi

Şimdi de dosyayı okuyarak kullanan bir program yazdım:
import std.stdio;
 
void foo(int[] a)
{
    writeln(a[0] + a[10000]);
}
 
void main()
{
    mixin(import("a_dizisi"));
    foo(a);
}
O import'u kullanabilmek için derleyiciye -J seçeneğinin de verilmesi gerekiyor:

time dmd deneme.d -J.

Derleme süresi yine kabaca 0.9 saniye oldu.

Tabii diziyi import ile derleme zamanında okumak yerine bütün programı elle de yazmış olabiliriz ama ben toplam 30K'lık kaynak kodun okunmasının o kadar etkileyeceğini sanmıyorum.

Sonuçta, evet, yavaş derleniyor ama yavaşlık bu olanaktan kaynaklanmıyor, çok büyük dizi hazır değeri kullanmaktan kaynaklanıyor.

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 11:00:00 (UTC -08:00)