Algoritma Karmaşıklığı (Big-O)

  • Konuyu Başlatan Konuyu Başlatan SYN_T3SL4
  • Başlangıç tarihi Başlangıç tarihi
  • Görüntüleme 553
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

SYN_T3SL4

If you can't handle it you will win nothing !
Katılım
11 Mart 2016
Mesajlar
990
Elmaslar
887
Puan
19.300
Yaş
25
Konum
Aydın / Kuşadası
Minecraft
SYN_T3SL4
images.png

Vakti zamanında birçok konuda, skript vs eklenti kıyaslamalarında her zaman eklenti taraftarı olmuşumdur. Bunun sebebini o zamanlar zaman karmaşıklığına atfetmediğimden eminim :))
Bu konumun asıl amacı hem sizlere yazılım mühendislerinin ele aldığı etkenlerden biri olan "algoritma karmaşıklığı" yani "Complexity" teriminden bahsetmek hem de skript vs eklenti tartışmalarına farklı bir pencere açmak.

Algoritma kıyaslamasında 2 önemli etkene bakılır:

- Zaman karmaşıklığı,
- Bellek alan karmaşıklığı.

Algoritmaların amacı sizi çözüme ulaştırmaktır. Örneğin "x" dünyasındaki bir oyuncunun elindeki eşyanın ismini kontrol ettirmek ve eğer bu eşya özel bir eşya değilse silmek istiyorsanız izlemeniz gereken yollar sırasıyla:

- Fonksiyona verilen oyuncu gerçekten x dünyasında mı?
- Oyuncunun elinde gerçekten bir eşya var mı?
- Oyuncunun elinde ki eşya bir isme sahip mi?
- Oyuncunun elindeki eşyanın ismi sizin isteğinizle aynı mı?

Burada bahsini açmış olduğum fonksiyonlar yazdığınız kodun okunabilirlik ve kullanılabilirliğini arttıran etkenlerdir. Örneğin siz bu kontrolleri farklı bir dünyada daha yaptırmak istiyorsunuz. O zaman bu fonksiyona parametre olarak dünya ve oyuncu göndermeniz yeterli olacaktır. Bu sayede elde etmiş olduğunuz fonksiyon kendisine gönderilen dünya ve oyuncu ile işlem yaparak size sonucu döndürecektir. Bu sayede tekrar tekrar if - else yapısı kullanmadan karmaşıklığı da arttırmadan istediğiniz işlemi gerçekleştirmiş olacaksınız.

Bu algoritma minecraft il alakalı olmak zorunda değil. Örneğin su içmeye gitmek istiyorsunuz o zaman izlemeniz gereken yollar:
- Yerinizden kalkarsınız,
- Boş olan su bardağını alırsınız,
- Mutfağa giden en kısa yolu hesaplarsınız, (Bunu ister istemez yaptığımız işe dönmek ya da oynadığımız oyuna dönmek için yaparız)
- Damacananın boş mu dolu mu olduğunu kontrol ederiz,
- Damacana boş ise yenisiyle değiştiririz,
- Damacana dolu ise suyumuzu doldurur işimize / oynadığımız oyuna geri döneriz.

Aslına bakarsanız hayatımızın her noktasında belirli algoritmalar kurar ve sonuçlarına göre hareket ederiz.

Her yazılım kendi yaşam döngüsü boyunca belirli zaman aralıklarında çalışmalarını yürütür. Bu zaman aralıklarda belki binlerce belki milyarlarca algoritmaları işleme koyar. İşte "Complexity" kavramının özü de bu zamanı belirlemektir. Eğer zaman karmaşıklığı sizin için çok önemliyse yani bir drone yapıyorsanız ve bu drone'un amacı savunma sanayisine yönelikse geliştirdiğiniz yazılımın ne kadar zamanda tepki verdiği de sizin için önemli olmalıdır.

Bir minecraft eklentisinin yaşam döngüsü onEnable metodunun çağrılmasıyla başlar. Ardından komutlar, listenerlar ve kullanılmışsa dosya ve mesajlar tanımlanır. Eklentinin işlevlerini 2 yolla çağırırsınız:

- Eğer eklentide herhangi bir komut ayarlanmamışsa belirli eventler sonucunda kontroller sağlayarak işlevini gerçekleştirir.
Örneğin: Oyuncu ölünce sunucudaki herkese xx adlı oyuncu öldü mesajı gitsin.
Böyle bir eklenti yazacak olsanız tek yapmanız gereken PlayerDeathEvent'ini çağırmak ve gerekli kontrolleri sağladıktan sonra basit bir "for" döngüsüyle mesajları göndermek olur.

- Eğer eklentide amaç bir komutu girdiğinde bir sonuç elde etmekse onCommand metodunun çağrılmasıyla eklentinin yaşam döngüsü devam eder.

Zaman karmaşıklığı bir fonksiyon genellersek bir algoritmanın girdi değeriyle çıktısı arasındaki zaman farkından yola çıkarak kıyas yapar.

Bellek alan karmaşıklığı ise bellekte kapladığı alana göre hareket eder. Nihayetinde iki durumu da analizleyerek bir sonuca ulaşılır. Bu sonuç doğrultusunda da yazılan program / yazılım ya ağır çalışıyordur ya da istenen seviyededir.

Bir programcı her zaman en kötü duruma göre (worst-case) yazılımını şekillendirmelidir.

Umarım dilim döndüğünce kafamdakileri kelimelere dökebilmişimdir. Neticede Algoritma Analiz dersini tek bir konuda baştan sona anlatabilecek değildim. Keyifli kodlamalar dilerim :))
 
Hızlı bitti memnun olmadım :| Ellerine sağlık :D
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

Hala Discord sunucumuza katılmadın mı?

Büyük bir topluluğun parçası ol, etkinliklere katıl ve özel hediyeler kazanma şansı yakala!

Şimdi Katıl
Üst