İşlemsel karmaşıklık hakkında bilgisi olmayan bir programcı olmak sorun mu?


30

Üniversitemde bir alıştırma yapıldı. Eve götürdüm ve çözmek için bir algoritma programlamaya çalıştım, sanırım grafiklerle ilgili bir şeydi, bağlı bileşenleri buldum.

Sonra aklıma gelen en önemsiz şeyi yaptım ve sonra öğretim görevlisine gösterdim. Kısa bir gözlemden sonra, çözümümün çalışma zamanı karmaşıklığının yenilmez olduğunu ve daha verimli bir şey gösterdiğini algıladı. Hesaplama karmaşıklığının ne olduğu hakkında bir fikri olmayan bir programcı geleneği var (onlardan biriydim), bu nedenle bir programcının hesaplama karmaşıklığı nedir hakkında bir fikri yoksa, bu bir problem midir?


3
Moderatör notu : Lütfen uzun tartışmalar için yorumlarınız veya özlü cevaplar göndermek için kullanmayın. Bu soruyu tartışmak için sohbet odasını kullanabilirsiniz; önceki yorumlar oraya taşındı.
Gilles 'SO- kötülük yapmayı bırak'

4
Başınız programcı diyor, ama sorunuz öğrenci diyor. Genel olarak 'programcı', 'profesyonel programcı' anlamına gelir - bu yüzden hesaplama karmaşıklığı bilgisi olmadan profesyonel bir programcı olmanın bir sorun olup olmadığını mı soruyorsunuz? Ya da bir programlama öğrencisinin bu bilgiye sahip olmaması uygun mudur? İkisi farklı sorulardır, anlaşsalar bile aynı cevapları vardır.
corsiKa

Yanıtlar:


42

Evet, hesaplama karmaşıklığı hakkında bir şeyler bilmenin ciddi bir programcı için bir zorunluluk olduğunu söyleyebilirim. Büyük veri kümeleriyle uğraşmadığınız sürece, karmaşıklığı bilmemeniz yeterli olacaktır, ancak ciddi sorunları çözen bir program yazmak istiyorsanız, ihtiyacınız olacak.

Özel durumunuzda, bağlı bileşenleri bulma örneğiniz, düğüme kadar grafikler için çalışmış olabilir . Ancak, düğümden oluşan bir grafik denediyseniz , öğretim görevlisinin algoritması muhtemelen 1 saniyede, algoritmanızın (karmaşıklığın ne kadar kötü olduğuna bağlı olarak) 1 saat, 1 gün veya hatta 1 sonsuzluğa sahip olacağına karar vermiştir.100.000100100.000

Algoritmalar kursumuzda öğrencilerin yaptıkları bir miktar yanlış, bunun gibi bir diziyi yinelemektir:

while array not empty
    examine first element of array
    remove first element from array

Bu en güzel kod olmayabilir, ancak karmaşık bir programda böyle bir şey programcının farkında olmadan ortaya çıkabilir. Şimdi, bu programın sorunu ne?

Diyelim ki elementten oluşan bir veri setinde çalıştırdık . Bir sonraki programla karşılaştırıldığında, eski program daha yavaş çalışacaktır .50.000100.00050.000

while array not empty
    examine last element of array
    remove last element from array

Umarım, programınızın kat daha hızlı çalışmasını sağlayacak bilgiye sahip olmanız muhtemelen bir programcı için önemli bir şeydir. İki program arasındaki farkı anlamak, karmaşıklık teorisi hakkında temel bilgiler ve programladığınız dilin detayları hakkında bazı bilgiler gerektirir.50.000

Sözde kod dilimde, "bir öğeyi diziden çıkarmak", tüm öğeleri soldan bir konum kaldırılarak öğenin sağına kaydırır. Bu, son elemanın kaldırılmasını bir işlemi yapar, çünkü bunu yapmak için sadece 1 eleman ile etkileşime girmemiz gerekir. İlk elemanın çıkarılması çünkü ilk elemanın çıkarılması için diğer tüm elemanların da bir pozisyon sola kaydırılması gerekir .0 ( n ) n - 1O(1)O(n)n-1

Karmaşıklıktaki çok temel bir alıştırma, ilk programın işlem yapacağını ispatlamak , ikinci program ise sadece işlemlerini kullanmaktır. Eğer eklerseniz, bir programın diğerinden çok daha etkili olduğunu göreceksiniz.nn=100.00012n2nn=100.000

Bu sadece oyuncak bir örnek ama zaten iki program arasındaki farkı anlatmak için temel bir karmaşıklık anlayışı gerektiriyor ve aslında bu hataya sahip daha karmaşık bir programda hata ayıklamak / optimize etmek istiyorsanız Böceğin nerede olduğunu. Çünkü bu şekilde bir diziden bir elemanın çıkarılması gibi bir hata koddaki soyutlamalar ile çok iyi gizlenebilir.

İyi bir karmaşıklık anlayışına sahip olmak, bir sorunu çözmek için iki yaklaşımı karşılaştırırken de yardımcı olur. Bağlanan bileşenler sorununu kendi başınıza çözmek için iki farklı yaklaşım bulduğunuzu varsayalım: aralarında karar vermek için, karmaşıklıklarını hızlı bir şekilde tahmin edip daha iyisini seçebilmeniz çok yararlı olacaktır.


10
"So long as you are not dealing with huge data sets you will be fine not knowing complexity"Bu genellikle doğrudur, ancak her zaman böyle değildir. Örneğin, bir O(n!)algoritma nispeten küçük veri kümeleri için bile geçerli olmayacaktır. Kullanabileceğiniz bir O(n!)algoritma kullanıyorsanız O(n^2), programın 10 veri boyutunda çalışması 36,288 kat daha uzun olacaktır . 20 veri büyüklüğünde, 2,4 litrelik işlemlere bakıyorsunuz.
reirab

1
@ Reirab'ın örneğinin cevaba dahil edilmesi gerektiğini düşünüyorum. Daha dramatik ve amacınızı daha kararlı bir şekilde kanıtlıyor. Hesaplamalı karmaşıklığı öğrenmeden önce şahsen böyle algoritmalar tarafından ısırıldım.
Siyuan Ren,

2
Bence oyunda daha büyük bir sorun var. Sadece bilmiyorsanız, bunun gerekmediği görevleri kendiniz seçin. Yani hemen hemen bütün soruların X'in bittiğini bilmem gerektiğini söyleyebilirsin, faydalı olabilir. Öyleyse, ne kadar kritik olursa, bilmesi hâlâ bilmek iyidir, sonunda sizi ısırmaya başlayabilir.
joojaa

"İki program arasındaki farkı anlamak karmaşıklık teorisi hakkında bazı temel bilgiler gerektirir" - bence bu böyle bir örnek için değil. Bunu profilden çıkarabilir, her zaman "öğeyi kaldır" da alındığını gözlemleyebilir, (karmaşıklık teorisini anlamadan) bilirsiniz, son öğeyi kaldırmanın birinciyi kaldırmaktan, değişikliği yapmaktan ve dolayısıyla programı hızlandırmaktan daha hızlı olduğunu bilirsiniz. Karmaşıklık teorisini anlamanın avantajı, bu tür problemleri profillemeden gevşek bir şekilde ölçmenize izin vermesidir, böylece "erken" optimize edebilirsiniz.
Steve Jessop

.. ve genel olarak pratik örneklerin hepsinin ya da neredeyse hepsinin karmaşıklık teorisine atıfta bulunmadan tek tek çözülebileceğinden şüpheleniyorum. Bu durumda, çok fazla veri kopyalamanın, yapmaktan daha yavaş olduğunu bilmek “karmaşıklık teorisi” değildir. Fakat elbette programlamada (ve herhangi bir meslekte) hala yaygın bir şekilde ortaya çıkan iyi bir zihinsel ilke modeline sahip olmak hala yararlıdır, çünkü bu tür problemleri rutin olarak tek tek yerine yerine tek tek analiz edebilir, tartışabilir ve çözebilirsiniz.
Steve Jessop

26

Bu Tom van der Zanden'in cevabının çürütüsüdür , ki bu bir zorunluluktur.

Mesele şu ki, çoğu zaman 50.000 kat daha yavaş alakalı değil (Google’da elbette çalışmadığınız sürece).

Yaptığınız işlem mikrosaniye sürerse veya N'niz hiçbir zaman belirli bir eşiğin üstüne çıkmıyorsa (bugünlerde yapılan kodlamanın büyük bir kısmı) HİÇBİR önemli olmayacaktır. Bu durumlarda hesaplama karmaşıklığını düşünmek sadece zaman kaybetmenizi sağlar (ve büyük olasılıkla para).

Hesaplamalı karmaşıklık, bir şeyin neden yavaş yavaş ya da ölçeklendirilebileceğini ve bunun nasıl iyileştirilebileceğini anlamaya yarayan bir araçtır, ancak çoğu zaman tam anlamıyla tamamlanmıştır.

Beş yıldan fazla bir süredir profesyonel bir programcı oldum ve hiçbir döngü O (M * N) içinde döngü yaparken hesaplama karmaşıklığı hakkında düşünmeye ihtiyacım olmadı, çünkü her zaman işlem gerçekten hızlı ya da M ve N çok küçük.

Programlama işi yapan herkes için anlaşılması gereken çok daha önemli, genellikle kullanılan ve daha zor şeyler var (diş çekme ve profilleme performans alanında iyi örneklerdir).

Elbette, hesaplama karmaşıklığını anlamadan asla yapamayacağınız bazı şeyler var (örneğin: bir sözlükte anagram bulmak), ancak çoğu zaman buna ihtiyacınız yoktur.


3
Sizin açınızdan genişletmek için, hesaplama karmaşıklığına çok fazla önem vermenin sizi yoldan çıkarabileceği durumlar vardır. Örneğin, "daha iyi" algoritmanın küçük girdiler için daha yavaş olduğu durumlar olabilir. Profil oluşturucu gerçeğin nihai kaynağıdır.
Kevin Krumwiede

2
@Kevin Krumwiede, önemsiz bir veri seti için bir sıralama düzenlemenin önemsiz olduğuna tamamen katılıyorum. Ancak aynı zamanda en azından karmaşıklık anlayışına sahip olmanın hala önemli olduğunu göstermektedir. Anlayış, bir baloncuk türünün diğer bazı daha karmaşık algoritmaların aksine uygun olduğuna karar vermenize neden olacak şeydir.
Kent A.,

4
Ne zaman biliyor veri seti her durumda küçük Eğer bu tür bir şey ile alabilirsiniz. Döngü içinde denilen şeylerde aşırı karmaşıklığa çok dikkat etmelisiniz, ancak - çok uzun zaman önce bir saniyeyi bu şekilde kesmeyeceğim. Ayrıca bir kez O (n ^ 8) problemiyle de karşılaştım (veri doğrulama.) Çok fazla dikkat 12 saate düştü.
Loren Pechtel

7
Bir döngü O (M * N) içinde döngü yaparken hesaplama karmaşıklığı hakkında düşünmeye hiç gerek duymadım, çünkü her zaman işlem gerçekten hızlıdır veya M ve N çok küçüktür. - İronik olarak, verdiğiniz argüman hesaplamalı karmaşıklık hakkında düşündüğünüzü gösteriyor. Yaptığınız şeyle alakalı bir mesele olmadığına ve muhtemelen haklı olarak böyle bir karar verdiğinize karar verdiniz, ancak hala bu sorunun varlığından haberdarsınız ve eğer bir sorun çıkarsa, bu konuda ciddi sonuçlar çıkmadan önce buna tepki verebilirsiniz. Kullanıcı düzeyi.
Wrzlprmft

4
Erken optimizasyon tüm kötülüklerin köküdür, ancak erken karamsarlık en azından çok rahatsız olmuş bir kullanıcının köküdür. Bir yineleme ilişkisini çözmeniz gerekmeyebilir, ancak en azından O (1), O (N) ve O (N ^ 2) arasındaki farkı söyleyemiyorsanız, özellikle iç içe geçmiş döngüler, birileri daha sonra pisliği temizlemek zorunda kalacak. Kaynak: daha sonra temizlemek zorunda kaldığım pislikler. Bir faktör 50.000 sen ettiğini çok büyük daha iyi hala verebileceksin olmadığını bilmek sonra , sizin girişleri büyüdü zaman.
Jeroen Mostert,

14

Yaklaşık otuz yıldır yazılım geliştiriyorum, hem yüklenici hem de çalışan olarak çalışıyorum ve bu konuda oldukça başarılı oldum. İlk dilim BASIC'ti, ancak hızlı bir şekilde güç kaynağımdaki kutunun hızını almak için kendime makine dilini öğrettim. Profilcilerde yıllar boyu çok zaman harcadım ve hafızayı verimli kullanan kodları hızlıca üretmeyi çok öğrendim.

Söylemeye gerek yok, ben kendi kendime öğrendim. Birkaç yıl önce görüşmeye başlayana kadar O notalarına hiç rastlamadım. Mülakatlar sırasında ÇALIŞMAK profesyonel işimde asla ortaya çıkmaz. Bu yüzden röportajlarda sadece bu soruyu ele almak için temelleri öğrenmek zorunda kaldım.

Notalar okuyamayan caz müzisyeni gibi hissediyorum. Hala iyi oynayabilirim. Hashtag'leri biliyorum (heck, zaten icat edildiklerini öğrenmeden önce hashtable'leri icat ettim) ve diğer önemli veri yapılarını ve hatta okulda öğretmedikleri bazı püf noktalarını bile biliyorum. Fakat bence gerçek şu ki, eğer bu meslekte başarılı olmak istiyorsanız, ya indie olmanız ya da görüşmeler sırasında soracağınız soruların cevaplarını öğrenmeniz gerekir.

Bu arada, en son web geliştiricisi rolü için röportaj yaptım. Bana cevabın hem hesaplama karmaşıklığı hem de logaritma bilgisi gerektirdiği bir soru sordular. Yirmi yıl önce, az çok doğru cevap verebilecek kadar matematiği hatırlamayı başardım, ama biraz sıkıcıydı. Hiçbir ön uç gelişiminde logaritma kullanmak zorunda kalmamıştım.

Sana iyi şanslar!


2
Yani cevabınız "evet"?
Raphael

6
TL; DR: "evet". Bununla birlikte, benim deneyimime göre, işe alındıktan sonra çoğu işteki hesaplama karmaşıklığından bahsetmeyeceksiniz. Evet, veri yapılarınızı ve performanslarını bilin, ancak sadece bir algoritmanın O (n) olduğunu veya iyi bir programcının ne yaptığını bilmek. Hızlı bir şekilde iyi kod yazmaya ve sonra sıcak noktaları daha sonra optimize etmeye odaklanmak daha iyidir. Okunabilirlik ve bakım kolaylığı çoğu kod için performanstan daha önemli.
Scott Schafer

3
Karmaşıklığın kurumsal bir ortamda ortaya çıkabileceğini düşünüyorum, ancak şirketler için ilk gerçek endişe nakliye : eğer işe yararsa, uygulamayı iyileştirmek için uygun bir bütçe bulunana veya bir müşteri fakirlerden şikayet etmeye geri dönene kadar yeterince iyi performansları. Geçici projeler için b2b durumlarda, muhtemelen oldukça nadirdir. B2c'de veya oldukça rekabetçi pazarlarda (raf ürünlerinde) yeni işe alımlar için giriş çubuğunu yükseltmenin doğrudan etkisi ile muhtemelen daha sık ortaya çıkacaktır.
didierc

4
@ didierc "Yeterince iyi" her zaman her şeyi kıran şeydir.
Raphael

1
@didierc 1) Eh, CS katı geçmişe sahip insanlar yok (umarım) ad-hoc problem çözücü "basit" hatalar yapabilirler oysa neyi doğru olduğunu ve ne değildir, iyi bir sezgi var. Çoklayıcı derlemelerden sonra gerçekleşen uygulamanın tam olarak belirgin olduğu şey olduğundan emin olmanın önemsiz olması ve çözülmemiş bir sorun olması. 2) Hayır .
Raphael

9

Soru oldukça öznel, bu yüzden cevabın buna bağlı olduğunu düşünüyorum .

Küçük miktarda verilerle çalışıyorsanız bu kadar önemli değil. Bu durumlarda, örneğin, dilinizin standart kütüphanesinin sunduğu her şeyi kullanmak genellikle iyidir.

Ancak, büyük miktarda veriyle uğraşırken veya başka bir nedenden ötürü programınızın hızlı olması konusunda ısrar ediyorsanız, o zaman hesaplama karmaşıklığını anlamanız gerekir. Yapmazsanız, bir problemin nasıl çözülmesi gerektiğini veya bunu çözmenin ne kadar çabuk mümkün olduğunu nereden biliyorsunuz? Fakat sadece teoriyi anlamak gerçekten iyi bir programcı olmak için yeterli değil. Son derece hızlı kod üretmek için, örneğin makinenizin nasıl çalıştığını (önbellek, bellek düzeni, komut seti) ve derleyicinizin ne yaptığını (derleyiciler ellerinden gelenin en iyisini yapar ama mükemmel değil) anlamanız gerektiğine inanıyorum.

Kısacası, karmaşıklığın anlaşılmasının sizi daha iyi bir programcı yaptığını düşünüyorum.


1
Genelde doğru bir fikriniz olduğunu düşünüyorum ama "öznel" bu konuyu yeterince tanımlamıyor; "ikinci derece" daha iyi bir kelime olacaktır. Ayrıca, bir çok veride çalışmayan çok yavaş programlar da yazılabilir. Geçenlerde matematik konusuna polinom gösterimi / depolanması hakkında bir soru cevapladım. Bu genellikle oldukça küçük miktarda veri içerir, örneğin ~ 1000 terimli polinomlar tipiktir; Yine de uygulamaya bağlı olarak performansta gerçek yüzdelik farkları var (yüzlerce veya binlerce saniye vs. çarpma için birkaç saniye).
Fizz

4

Önemli bir algoritma geliştiren birinin algoritma karmaşıklığını anlamaması kesinlikle bir problemdir. Bir algoritmanın kullanıcıları genellikle iyi performans özelliklerine sahip iyi bir uygulama kalitesine güvenirler. Karmaşıklık, bir algoritmanın performans özelliklerine tek katkıda bulunmamakla birlikte, önemli bir tanesidir. Algoritma karmaşıklığını anlamayan birinin yararlı performans özelliklerine sahip algoritmalar geliştirme olasılığı daha düşüktür.

Bir algoritma kullanıcıları için problem daha azdır, mevcut algoritmaların iyi kalitede olduğunu varsayarsak. Bu, belirgin, iyi tanımlanmış, standart bir kütüphaneye sahip dilleri kullanan geliştiriciler için geçerlidir - sadece ihtiyaçları karşılayan bir algoritmayı nasıl seçeceklerini bilmeleri gerekir. Sorun, onların bir kütüphane içerisinde mevcut olan bir tür (örneğin, sıralama) çoklu algoritmaları olduğu durumlarda ortaya çıkar, çünkü karmaşıklık genellikle seçim için kullanılan kriterlerden biridir. Karmaşıklığı anlamayan bir geliştirici daha sonra eldeki görevleri için etkili bir algoritma seçmenin temelini anlayamaz.

Daha sonra algoritmik olmayan kaygılara odaklanan geliştiriciler var (daha iyi bir açıklama için). Örneğin, sezgisel kullanıcı arayüzleri geliştirmeye odaklanabilirler. Bu tür geliştiricilerin sıklıkla algoritma karmaşıklığı konusunda endişelenmelerine gerek kalmayacak, yine de yüksek kalitede kütüphaneler veya başka bir kodun geliştirilmesine güvenebilecekler.


3

Bu, birlikte çalıştığınız verilere değil, yaptığınız çalışmalara ve geliştirdiğiniz programlara bağlıdır.

Kavramsal karmaşıklığı bilmeyen programcıyı adsız programcı olarak adlandıralım.

Noobish programcısı şunları yapabilir:

  • büyük veri veritabanları geliştirmek - içeride nasıl çalıştığını bilmek zorunda değil, tek bilmesi gereken veritabanı geliştirmekle ilgili kurallar. Şeyleri bilir: neyin endekslenmesi gerektiği, ... verilerde artıklık sağlamanın daha iyi olduğu, nerede olmadığı ...
  • Oyun yapmak - sadece oyun motorunun nasıl çalıştığını incelemek ve paradigmalarını takip etmek zorundadır, oyunlar ve bilgisayar grafikleri oldukça büyük veri problemleridir. 1920 * 1080 * 32bit = cca tek resim / çerçeve için 7.9 MB düşünün ... @ 60 FPS en az 475 MB / s. Gereksiz bir tam ekran resmin sadece bir kopyasının saniyede yaklaşık 500 MB bellek verimi boşa harcayacağını düşünün. Ancak, bununla ilgilenmesine gerek yok çünkü sadece motor kullanıyor!

Noobish programcısı yapmamalı:

  • Çalıştığı veri boyutuna bakılmaksızın çok sık kullanılan karmaşık programlar geliştirmek, örneğin, küçük veriler geliştirme sırasında yanlış bir çözüm fark edilmesine neden olmaz, çünkü derleme zamanından daha yavaş olacaktır. Basit bir program için sn, noobish programcı perspektifinden pek fazla değildir, peki, bu programı saniyede yirmi kez çalıştıran sunucu sunucusunu düşünün. Bu yükü kaldırabilmek için 10 çekirdek gerekir!
  • gömülü cihazlar için programlar geliştirmek. Gömülü cihazlar küçük verilerle çalışır ancak mümkün olduğu kadar verimli olmaları gerekir, çünkü gereksiz işlemler gereksiz güç tüketimi sağlar

Yani, sadece teknolojiler kullanmak istediğinizde, noobish programcı iyidir. Bu nedenle, yeni çözümler, özel teknolojiler, vb. Geliştirildiğinde, noobish programcıyı işe almamak daha iyidir.

Ancak, eğer şirket yeni teknolojiler geliştirmezse, daha önce yapılmış olanları kullanmaktadır. Yetenekli ve yetenekli bir programcı işe almak yetenek kaybı olacaktır. Aynı şey, yeni teknolojiler üzerinde çalışmak istemiyorsanız ve müşterilerin fikirlerini daha önce yapılmış çerçeveleri kullanarak tasarımlara ve programlara koyma konusunda iyiyseniz, o zaman, asla gerekmeyecek bir şey öğrenmek için zamanınızı boşa harcarsınız. senin hobinse ve mantıklı zorluklardan hoşlanıyorsan.


1
Bu cevap, "beceriksiz programlayıcı" terimini kullanan diğer cevaba benzer şekilde daha nötr bir etiket kullandıysa veya hiç etiket yoksa, bu cevap geliştirilebilirdi.
Moby Disk

1
Kavramsal karmaşıklık derken ne demek istediğinizi anlamadım. Tecrübelerime göre, ağaçlar veya şifreler hakkında yeterince bilgi sahibi olmayan insanlar, büyük bir veritabanını nasıl endeksleyeceğine dair akıllı kararlar alamazlar.
Fizz

3

Buraya bir cevap yazmakta biraz tereddütlüyüm ama kendimi birkaç kişiyle nitpicking yaparken buldum '

Hesaplamada bir çok şeyin bilgisi / derecesi var (ve bu terim ile kabaca bilgisayar biliminin bilgi teknolojisi ile birleşmesini kastediyorum). Hesaplama karmaşıklığı kesinlikle geniş bir alandır (OptP'in ne olduğunu biliyor musunuz? Abiteboul-Vianu teoreminin ne dediğini biliyor musunuz?) Ve ayrıca çok fazla derinlikli olduğunu itiraf ediyor: CS derecesine sahip çoğu kişi araştırmaya katılan uzman kanıtlarını üretemiyor hesaplamalı karmaşıklıktaki yayınlar.

n2

Dürüst olmak gerekirse, hesaplama karmaşıklığı kavramlarının ne zaman uygulanacağını bilmekle (ve bunları ne zaman güvenli bir şekilde göz ardı edeceğinizi bilmek), C’de performansa duyarlı bir kod ve performansa duyarsız olan bazı uygulamaları (Java dünyasının dışında) ne zaman uygulayacağımı bilmek isterim. Python vb. (Bir kenara, bir Julia konuşmasında “standart uzlaşma” olarak adlandırılmıştır .) Performansı düşünmek zorunda olmadığınızı bilmek, programlama zamanından tasarruf etmenizi sağlar, ki bu da oldukça değerli bir üründür.

Ve bir başka nokta ise, hesaplama karmaşıklığının bilinmesinin otomatik olarak programları optimize etmenize yardımcı olmayacağı; önbellek yerelliği, [bazen] boru hatları ve günümüzde paralel / çok çekirdekli programlama gibi mimariyle ilgili şeyleri anlamanız gerekir; ikincisi hem kendi karmaşıklık teorisine hem de pratik düşüncelere sahiptir; Bir 2013 SOSP kağıdındaki sonuncunun tadı "Her kilitleme planının on beş dakikalık bir şöhreti vardır. Tüm kilitleme planlarında hiçbiri, hedef mimariler veya iş yüklerinde sürekli olarak diğerlerinden daha iyi bir performans sergilememektedir . bu nedenle, kilitleme algoritması donanım platformuna ve beklenen iş yüküne göre seçilmelidir. "


1
Uzun vadede, daha iyi bir algoritma geliştirmek veya bulmak genellikle performansa duyarlı bitler için programlama dilini değiştirmekten daha faydalıdır. Karmaşıklık anlayışı eksikliği ile erken optimizasyon arasında güçlü bir ilişki olduğunu kabul ediyorum - çünkü optimizasyon için genellikle daha az performansa duyarlı bitleri hedef alıyorlar.
Rob,

1
Uygulamada, (yanlışlıkla) Schlemiel Ressamın algoritmaları O (n ^ 2) sıralamadan çok daha sıktır.
Peter Mortensen

-1

Büyük O'yu tanımıyorsan öğrenmelisin. Zor değil ve gerçekten faydalı. Aramaya ve sıralamaya başlayın.

Birçok cevap ve yorumun profil oluşturmayı önerdiğini ve neredeyse her zaman bir profil oluşturma aracı kullandıkları anlamına geldiğini fark ediyorum .

Sorun şu ki, profilleme araçları harita üzerinde her yerde, hızlandırmak için neye ihtiyacınız olduğunu bulmak için ne kadar etkili oldukları açısından. Burada, profilleyicilerin uğradığı yanlış anlamaları listeledik ve açıkladım.

Sonuç olarak, eğer akademik bir egzersizden daha büyüklerse , programlar en iyi otomatik profilleyicinin bile gösteremeyeceği uyku devleri içerebiliyor . Bu gönderide performans sorunlarının profilcilerden nasıl gizlenebileceğine dair birkaç örnek gösterilmektedir.

Ancak bu teknikten saklanamazlar .


"Big-Oh" un faydalı olduğunu iddia ediyorsun, ama sonra farklı bir yaklaşımı savunuyorsun. Ayrıca, "Big-Oh" (matematik) öğreniminin "arama ve sıralama ile" nasıl başlayabildiğini de göremiyorum (algoritma problemleri).
Raphael

@Raphael: Farklı bir yaklaşımı savunmuyorum - ortogonal. Büyük-O algoritmaları anlamak için temel bir bilgidir, oysa oyuncak olmayan yazılımlarda performans problemleri bulmak kod yazıldıktan ve çalıştırmadan sonra yaptığınız bir şeydir. (Bazen akademisyenler bunu bilmezler, bu nedenle gprof öğretmeye devam ederler, iyiden daha fazla zarar verirler.) Böyle yaparak, sorunun bir O (n * n) algoritması kullandığını öğrenebilir veya bulamayabilirsiniz. Bunu tanıyabilir. (Ve big-O, algoritmaların sadece matematiksel olarak tanımlanmış bir özelliğidir, farklı bir konu değil.)
Mike Dunlavey 20:15

“Ve big-O, sadece matematiksel olarak tanımlanmış bir algoritma özelliğidir, farklı bir konu değil.” - bu yanlış ve tehlikeli bir şekilde. "Big-Oh", fonksiyon sınıflarını tanımlar ; kendi başına, algoritmalarla hiçbir ilgisi yok.
Raphael

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.