Bu eğlenceli birşey! Big O ile iletişim kurmak, kariyerinin başındaki geliştiriciler için ilk yüz eritme geçişlerinden biridir.
Nedenine bakalım.
Ama önce bir pit stop. İlkokuldaki kesinlikle saçma kelime problemlerini hatırlıyor musun?
Sally markete gitti ve 37 karpuz aldı. 20 doları vardı. Her karpuzun maliyeti 0,70 dolardır. Sally eve döndüğünde ne kadar parası vardır?
"Sally eve nasıl dönecek? 37 karpuzla mı?! Kavunlar için yeterli alana sahip bir Uber almak için 6,00 dolar yeterli olmayacak... Sally ne yapıyor?" diye merak mı ettiniz?
Aptal Sally.
Bazı insanlar bunun ağaçlar için ormanı kaybetmek olduğunu söylüyor. Bunun pratik problemleri oluşturmanın son derece tembel bir yolu olduğunu söylüyorum.
Big O Notasyonu'nun amacı , zanaatımızın kalitesi hakkında diğer insanlarla konuşabilmek, kelimenin tam anlamıyla iletişim kurabilmektir . Buradaki özellikle odak noktası, girdi boyutu arttıkça en kötü senaryoda çözümler arasında karşılaştırma yapılabilmesini sağlamaktır.
Soyut olarak potansiyel çözümler ( algoritmalarla aynı şey ) hakkında konuşabilmek istiyoruz. Bu çok önemli bir noktadır: Özette . Elimizdeki veriler hiç umurumuzda değil . Bu fikirlerle oynadığımızda teorik olarak devasa ama sonlu bir veri kümesi varsayıyoruz.
Elimizdeki verileri düşündüğümüzde bu somut bir mantıktır. Big O Notasyonunu düşündüğümüzde soyut mantık yürütüyoruz. Somut mantığa geri dönmek KOLAY. Hayatımızın çoğunu burada geçiriyoruz. Kolaydır, genellikle açıktır ve rahattır.
Şimdi caddeyi geçmeli miyim? Araba var mı? HAYIR? Tamam, çapraz.
Soyut mantık yürütürken bunu yapmayın!
Burada sana bir iyilik yapmamın sakıncası var mı? Yolunuza çıkabilecek bir sürü matematik terimi de var. İşte bazı yaygın Büyük O terimleri için en iyi durumdan en kötüye doğru sırayla bir görsel. Terminolojiye takılıp kalmak yerine düşünmeyi ve öğrenmeyi yapabilmemiz için bunlara ihtiyacımız var.
O(1) - "Sabit Zaman"
Girişin ne kadar büyük olduğu önemli değil, sistem sonucu her zaman aynı sürede döndürür.
O(log n) - "Günlük Zamanı"
Çözüm (veya algoritma) girdiyi yineledikçe, her yineleme daha da hızlanır!
O(n) - "Doğrusal Zaman"
Algoritma yinelenirken, her yineleme bir önceki yinelemeyle aynı süreyi alır.
O(n log n) - burada süslü bir terminoloji yok
Fikirlerin birleştirilebileceğini gösterir (evet). Biz yineledikçe, her yineleme yavaşlar ama oldukça yavaş bir şekilde yavaşlar.
O(n^2) - "n kare"
Her yineleme için yinelemeler oldukça hızlı bir şekilde yavaşlar.
O(n!) - "n faktöriyel"
Her yineleme için yinelemeler süper hızlı bir şekilde yavaşlar.
Amaç "n faktöriyel"den mümkün olduğunca uzak durmaya çalışmak ve Constant'tan çok daha kötüye gitmemeye çalışmak.
Bütün bunları anladıktan sonra şimdi aradaki boşluğu doldurmaya çalışalım.
Büyük O gösterimi, bir algoritmanın (çözümün) performansını veya karmaşıklığını tanımlamak için kullanılır. Giriş boyutu büyüdükçe bir algoritmanın (çözümün) nasıl performans göstereceğine dair üst düzey bir anlayış sağlar.
Örneğin, O(n) karmaşıklığına sahip bir algoritmanın çalışma süresi, girdi boyutuyla doğrusal olarak artacaktır.
Bu zorluk, geliştiricilerin belirli veriler hakkında akıl yürütmeyi algoritmanın kendisi hakkında akıl yürütmeyle karıştırdıklarında ortaya çıkar. "Ama bu veriler gerçek" gibi ifadeler bu kafa karışıklığının sinyali olabilir.
Gerçek veriler hakkında akıl yürütmek başlamanıza yardımcı olsa da çözümü mevcut girdiden ayırmak hayati önem taşır.
Kariyerinin başındaki geliştiriciler, daha büyük ölçekli sorunlarla ilgili deneyim eksikliğinden veya mevcut bir sorunun ayrıntılarına fazla dalmış olmalarından dolayı bu hatayı yapabilirler. Ölçeklenebilir çözümler oluşturmak için somut ayrıntıları soyut karmaşıklıktan ayırmak önemlidir.
Girdi 100 veya 100.000 kat arttığında algoritmaya ne olur? İnanılmaz derecede karmaşık bir çözüm karmaşıklığı, daha büyük bir veri kümesiyle parçalanabilir.
Küçük veri kümeleri için iyi görünen bir algoritma, daha büyük veri kümelerinde önemli ölçüde başarısız olabilir ve bu da performans sorunlarına ve diğer zorluklara yol açabilir.
Sorunlar hakkında soyut düşünme yeteneğini geliştirmek, uygulama ve rehberlik gerektirir. Bazı stratejiler şunları içerir:
Genel olarak soyut düşünme ve özel olarak Büyük O Gösterimi, algoritma tasarımında, diğer bir deyişle bir soruna çözüm bulmada temel becerilerdir.
Geliştiriciler, problem karmaşıklığını algoritma karmaşıklığından ayırmayı öğrenerek, yaygın tuzaklardan kaçınabilir ve tek başına çalışırken problem çözme yeteneklerini geliştirebilir VE bu şekilde nasıl iletişim kuracaklarını öğrenmek için benzer şekilde zaman harcayan diğer kişilerle birlikte çalışma becerilerini önemli ölçüde geliştirebilirler.
Karmaşık problemler çoğu zaman karmaşık çözümler gerektirmez. (Sally'nin muhtemelen başlangıçta 37 karpuza ihtiyacı yoktu… 37 karpuzla ne yapacak?!)