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 - 10 ( 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.