Forum: D Programlama Dili RSS
Yapısal bir veri üzerinde arama gerçeklemesi
Via Associative Array
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Yapısal bir veri üzerinde arama gerçeklemesi
Merhaba,

Geçenlerde şurada değindiğimiz konuda, çağrışımsal dizi (Associative Array) kullanarak bir arama/bulma işlemi örneği nakletmiştim. Gerçi aşağıda paylaşacağım örnek, sayısal veriler üzerine yaptığımız bu denemelerden biraz farklı. Belki hız testi öncekinden (1.'si AA idi) farklı da olabilir, bilemiyorum bence hashTable oluşturulurken geçen zaman da hesaplanmalı!

Bu örnekte, kanımca şunlar önemli:
  • Sadece basit bir yapı (struct IrregularVerbs, kısaca IV) türü kullandım
  • Ve bunun içerisine ek bir yöntem (method) tanımlamadım (sadece string dizisi de gönderebilirdim!)
  • Bu yapı üzerinde bir dizi veriyi ADizi'ye gönderip dizinledim (indexing)
  • Ayrıca ADizi içerisinde bir nevi IV'nin toString'ni tanımladım
  • Belki de bu sayede veri dizisi (IV veri[]) bellekte daha az yer kapladı
import std.stdio;
 
struct IrregularVerbs {
  string Infinitive;
  string SimplePast;
  string Participle;
} alias IrregularVerbs IV;
 
struct ADizi {
  size_t[string] arananSözcük;
  IrregularVerbs[] kaynakVeri;
  
  this(IrregularVerbs[] veri) {
    kaynakVeri = veri;
    foreach(size_t sıra, sözcük; veri) {
      arananSözcük[sözcük.Infinitive] = sıra;
    }
  }
 
  size_t get(string sözcük) {
    return arananSözcük.get(sözcük, -1);
  }
 
  string opIndex(size_t sıra) {
    char verticalTab = 11; // \n...\t
    auto result = "Bulunan sonuç: " ~ verticalTab;
         result ~= kaynakVeri[sıra].Infinitive ~ "\t";
         result ~= kaynakVeri[sıra].SimplePast ~ "\t";
         result ~= kaynakVeri[sıra].Participle ~ "\n";
    return result;
  }
}
 
void main(string[] argv){
  IV veri[];
     veri ~= IV("bear", "bore", "borne");
     veri ~= IV("begin", "began", "begun");
     veri ~= IV("bid", "bade", "bidden");
     veri ~= IV("bite", "bit", "bitten");
     veri ~= IV("blow", "blew", "blown");
     veri ~= IV("break", "broke", "broken");
     veri ~= IV("choose", "chose", "chosen");
     veri ~= IV("come", "came", "come");
     veri ~= IV("do", "did", "done");
     veri ~= IV("draw", "drew", "drawn");
     veri ~= IV("drink", "drank", "drunk");
     veri ~= IV("drive", "drove", "driven");
     veri ~= IV("eat", "ate", "eaten");
     veri ~= IV("fall", "fell", "fallen");
     veri ~= IV("fly", "flew", "flown");
 
  auto test = ADizi(veri);
  auto sözcük = "do";
  auto bulduğuDizin = test.get(sözcük);
 
  if(bulduğuDizin != -1) {
    test[bulduğuDizin].writeln();
  } else {
    sözcük.writeln(" bulunamadı!");
  }
} /* Çıktısı:
Bulunan sonuç: 
               do    did    done
*/
Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Küçük bir not daha (gerçi 2. maddede işaret ettim!):
  string[] toString() const {
    return [ Infinitive, SimplePast, Participle ];
  }
Eğer IV içinde yukarıdaki gibi basit bir toString işlevi tanımlasaydım (sonuna toSring yazmadan çalıştıramadım?); sadece şu satır ile işimizi halledebilirdik:
  writefln("Bulunan sonuç: %(%s, %)",
           veri[test.get("do")].toString);
Tabi aradığımızın kesin orada olması lazım. Bulunamaması olasılığını sorgulamadım :)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
zekeriyadurmus #3
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ı
Yanıtlanan mesaj #1
Güzel hatta ingilizcedeki bu zaman çekimlemesiyle beraber çok daha güzel bir örnek olmuş fakat aklıma takıldı.

Ya bir kelime hem başka bir kelimenin çekimlenmiş hali hem de başlı başına farklı bir kelime ise ne olacak? (Örnek gelmedi aklıma)

Bu durumda birden fazla dizin döndürmesi mantıklı olmaz mı?

Zekeriya
Bilgi meraktan gelir...
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Sanırım leave(left/left) gibi bir sözcüğü kast ediyorsun çünkü bu fiili Present Tense'de ve S/he/it için çekimlediğimize:

- She leaves in the room.

Olurken, işin içine çoğul bir nesne girince karışıyor:

- The leaves on the tree.

Ama bu konuda henüz ben de doğru düzgün bir veritabanı oluşturmuş değilim. En mantıklı gelen her sözcüğün yalın halde bulunması ve bunların çekimleme kurallarına göre bir bayrakla (true/false) ilişkilendirmesi olabilir. Zaten bu örnek düzensiz fiiler için aklıma gelen olabilecek en basit yapıydı. Çok karmaşık veri yapılarında belki de en iyisi MySQL'dan yardım istemektir.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
zekeriyadurmus #5
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ı
Kelime Matik projesini bir ara incelesem iyi olur. Bu alanda çalışmayı istiyorum doğrusu.

Bu arada bir ara şunları bulmuştum belki ilginizi çeker hocam

http://fiilcek.apphb.com/
http://www.hrzafer.com/category/dogal-dil-isleme

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #6
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ı
Yani, aramayı hızlandırmak için bir eşleme tablosu kullanmışsın çünkü belki de dözcükler asıl depoda belirli bir sırada durmalıdırlar veya bir dosyanın bir yerindedirler. Güzel, daha önce karşılaştığım bir uygulama. :)

Tek öneri: IrregularVerbs bir "irregular verb"ü ifade ettiği için ismi tekil IrregularVerb olmalı.

Ali
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ı
Yanıtlanan mesaj #2
Salih Dinçer:
sonuna toSring yazmadan çalıştıramadım?

Çünkü writefln nesnenin string olarak ifade edileceği bir toString arıyor ama seninki bir string[] döndürdüğü için bulamıyor. string döndüren bulsa kendisin .toString'ini çağıracak.

toString'i açıkça çağırdığın zaman ise writefln'e IrregularVerbs değil, bir string dilimi vermiş oluyorsun ve writefln onu nasıl yazdıracağını biliyor.

Özetle, eğer writefln "string bulamadım, bakalım string[] döndüren bir toString var mı" diye düşünse çalışırdı ama öyle bir değişiklik geleceğini hiç sanmam çünkü bunun sonu yok: "peki acaba giriş aralığı (input range) olarak kullanılabiliyor mu, vs." :)

Ali
Avatar
Salih Dinçer #8
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #5
Haklısın Ali hocam; derleyiciye doğru bir toString() ifadesi vermiyorum. O da haklı olarak kabül etmiyor tabi. Aslında bunu yapabilirdim ama gruplama belirteçlerini özellikle kullanabilmek için böyle yaptım.

zekeriyadurmus:
...ilginizi çeker hocam

http://fiilcek.apphb.com
Evet, Harun Reşit Zafer güzel şeyler yapmış. Yukarıdaki sanırım sadece bunlardan biri. Ama benim, şu aşağıdaki makale dikkatimi çekti ve hemen yorumu yapıştırdım tabi :)

http://www.hrzafer.com/turkce-imla-denetimi-uzerine/commen…
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
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ı
Salih Dinçer:
gruplama belirteçlerini özellikle kullanabilmek için böyle yaptım.

Hatırlatmak için, onu toString'in içinde de yapabilirsin:
struct IrregularVerbs {
// ...
 
    string toString() const {
        import std.string;
        return format("%(%s, %)", [ Infinitive, SimplePast, Participle ]);
    }
}
Bir de, alias'ın yeni söz dizimini ben daha tutarlı buluyorum:
alias IV = IrregularVerbs;
Ali
Avatar
Salih Dinçer #10
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Evet, bunu da düşünmüştüm...

Ancak bu yapının sütun adedince kopyaları alındığı için
belki de bunun, sistem kaynakları açısından
ADizi içinde bulunması daha doğrudur, ne dersiniz?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #11
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ı
Hız düşünüyorsak delegate alan toString var: :)

  http://ddili.org/forum/thread/996

Şurada "delegate parametreli toString" başlığı altında daha kapsamlı geçiyordu:

  http://ddili.org/ders/d/kapamalar.html

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:
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, 13:16:30 (UTC -08:00)