Jump to page: 1 2
Thread overview
Yapısal bir veri üzerinde arama gerçeklemesi
Apr 23, 2014
Salih Dinçer
Apr 23, 2014
Salih Dinçer
Apr 23, 2014
Salih Dinçer
Apr 24, 2014
Salih Dinçer
Apr 24, 2014
Salih Dinçer
April 23, 2014

Merhaba,

Geçenlerde şurada (http://ddili.org/forum/post/10690) 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...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 23, 2014

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 :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 23, 2014

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 23, 2014

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 (http://ddili.org/forum/forum/16) 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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 23, 2014

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 23, 2014

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 23, 2014

Alıntı (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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 24, 2014

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.

Alıntı (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/comment-page-1#comment-6271

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 24, 2014

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?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 24, 2014

Alıntı (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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

« First   ‹ Prev
1 2