Çoğu problemi çoğunlukla Top Coder'dan çözüyorum. Birçokları için cevap alacağım, ancak çoğu zaman verimsiz bir çözüm buluyorum.
Gerçek dünyadaki uygulamalarda - soruna bir çözümün etkili olması gerçekten önemli mi? Varsa nasıl geliştirebilirim?
Çoğu problemi çoğunlukla Top Coder'dan çözüyorum. Birçokları için cevap alacağım, ancak çoğu zaman verimsiz bir çözüm buluyorum.
Gerçek dünyadaki uygulamalarda - soruna bir çözümün etkili olması gerçekten önemli mi? Varsa nasıl geliştirebilirim?
Yanıtlar:
En iyi çözüm, (artan önem sırasına göre) verimli, sürdürülebilir ve yapılabilir çözümdür .
^ ^ ^ Bu cevaptan almanız gereken tek şey budur.
Verimlilik önemlidir . Belki de donanım bolluğumuzdan dolayı eskisinden biraz daha az, ancak Performans bir Özelliktir . Bir yarışmada verimlilik açıktır. Etkili kodun nasıl yazılacağını bilmelisiniz. Daha da önemlisi, bir uygulamanın zamanında veya sürekliliğinden ödün vermeden verimli, iyi performans gösteren kod sağlayacak en iyi uygulamaları bilmelisiniz. Burası gerçekten bir platform ve dil ile ilgili derinlik deneyiminin birçok verim getirdiği yerdir.
Daha da önemlisi (vakaların% 95'inde), bitmiş, sürdürülebilir bir çözüme sahip olmak. Bitmiş bir ürün olmadan , çözümün ne kadar verimli veya bakım yapılabilir olduğu önemli değildir . Bir hatayı izlemek ve düzeltmek veya yeni bir özellik eklemek için size olağanüstü bir zaman gerekiyorsa, çözümün ne kadar verimli olduğu önemli değildir. Ancak, ne olursa olsun, verimlilik ve performans kuşkusuz önemlidir.
Mike Cellini ile aynı fikirdeyim, ekleyeceğim tek şey.
Bir şey "yeterince verimli" mi? Örneğin, kullanıcı açısından bakıldığında, 0.00001 saniyede tamamlanan bir işlev ile biri diğerinden çok daha verimli olmasına rağmen 0.1 saniyede tamamlanan bir işlev arasında fazla bir fark yoktur. 10 dakika içinde tamamlanan bir işlev (kullanıcı için) 12 dakika içinde tamamlanan işlevden çok farklı değildir. Her iki durumda da kullanıcı bir fincan kahve alır veya başka bir göreve başlar.
Verimliliği etkili bir algoritma değil, "verimli bir kullanıcı" olarak görmeye geldim.
Genel olarak, bir soruna en önemli çözüm, gerçekte var olan ve sorunlarınız için var oldukları için geçerli olanlardır. Başka bir deyişle, verimsiz kodunuz veya daha hızlı olması gereken etkin kodunuz olduğunu bilinceye kadar erken optimizasyondan kaçının .
Ayrıca, uygulamanız için en iyi çözümün genel durum çözümü olmayabileceğini unutmayın. Vaka ve nokta, birkaç yıl önce bir profesör, sınıfımıza verilen bir türün ilk 10 sayısını basacağımız bir sorun verdi (üzgünüm, hafızam tipe göre beni başarısızlığa uğrattı, ancak daha sıradışı sayılardan biriydi) ) ve sayının verilen tür olduğundan emin olmak için bir test yaptık. Bu bize verilen sorunun kapsamıydı ve bize ertesi gün tam kredi almak en verimli çözüm nedeniyle söylendi. Aşağıdaki ders profesör sonuçları özetledi:
Nihai çözüm profesör tarafından en verimli şekilde değerlendirildi. Sorunun aslında problemi tam olarak anlamak ve sadece dışarı çıkmak ve en verimli çözümü bulmak değil, bir alıştırma olduğu ortaya çıkıyor.
Yukarıdakilerin amacı, etkili bir çözüm bulmak söz konusu olduğunda, sorun çıkmadan ve kod yazmadan veya kodu optimize etmeye çalışmadan önce sorunun ne olduğunu gerçekten anladığınızdan emin olmak için zaman harcamak genellikle daha iyidir. Bir dizi referans değeri sabit bir dizide saklayabiliyorsanız, bunu performans açısından bazı süslü algoritmalar yazmaya çalışmaktan daha iyidir.
Aynı şekilde, çoğu uygulama için, verimsiz kodu (gereksiz yere verimsiz olmadığı zaman!) Görme eğiliminde olan kişilerin geliştiricilerin kendileri olduğunu unutmayın. Sadece tam olarak yapması gereken şeyi yapan temiz kod yazarsanız, oranlar kullanıcıların çoğu zaman programınızla çalışırken performans sorunlarını fark etmeyecekleri ve sadece bahsettikleri parçaları optimize ettiklerinde sen.
Bu yarışmanın yapısına bağlıdır, ancak genellikle, evet: performansı göz göre çoğu zaman olduğu onların belgelerine . Bazen, daha sonraki bağlantıda olduğu gibi, avlamak zorundasınız, ancak alıntı yapmak için:
Temiz, anlaşılır, verimli kod yazın. Özellikle bunun için herhangi bir inceleme satır öğesi olmasa da, yorumcular yine de okumaları ve anlamaları kolay olan kodlara daha iyi tepki vermeleri muhtemeldir. Verimli kod ile, stres ve kıyaslama testinde potansiyel bir performans avantajının yanı sıra yorumculardan olası kudolar (ve birkaç ekstra puan) elde edersiniz.
Bunu geliştirmenin en iyi yolu, zaten yaptığınız verimli kod yazmaktır. Çalışmayı tamamlasanız bile, rekabetten sonra bile verimliliğini artırmak için zaman harcayın ve bu da işe yarayacaktır.
Muhtemelen size iki şey verebilecek algoritmalar üzerine kitaplar gibi teoriye yatırım yapmak istersiniz : belirli bir sorunu çözmek için daha etkili araçlar ve çözmek zorunda olduğunuz sorunun ne olduğunu belirlemek için daha verimli mekanizmalar.
Son olarak, bilgisayar bilimleri kursları giderek daha fazla çevrimiçi olarak sunulmaktadır ve geliştirmeniz gereken arka planı kapsamaktadır.
Bir çözümün ne kadar verimli olması gerektiği bir dizi faktöre bağlıdır. En büyük şey, kullanıcının ne istediğini bilmektir. İşte birkaç örnek.
Kodunuzu nasıl daha verimli hale getirebilirsiniz:
Optimizasyon için bir alan var, ancak yukarıdaki iki ipucunun en azından başlamanız gerekir.
Bir yarışma için hakimlerin kim olduğunu ve ne hakkında olduklarını anlamanız gerekir - eğer büyük kodlayıcılar ve daha fazlası için arıyorsanız, daha verimli kod için kudos alacaksınız.
Kural olarak, gerçek dünyada önemli değil. Yazılım geliştirmenin temel fikirlerinden biri, "Bilmediğiniz şeyi optimize etme ihtiyacı optimize etmeyin", ardından "Yalnızca gerekli olduğu kanıtlandığında optimize edin" dir.
Birçok uygulayıcı, bunun kolayca düzeltilemeyen şişirilmiş, verimsiz bir koda yol açtığını ve bazı kenar durumlarda (çoğu kodlayıcı her gün bütün gün yaptığı gibi bu olacaklar) haklı olduklarını iddia edeceklerdir. Ancak pek çok yazılım geliştirme projesinin sonuçları ölçülmemiştir "Performans: Gerekenden daha hızlı, Maliyet: Kimin umurunda, Teslimat süresi: Bazen bu on yıl", Gerçek dünyada, genellikle "Ucuz istiyorum, dün istiyorum, istiyorum çalışmak ".