String Permütasyonlarının Big O Karmaşıklığı: Detaylı Bir İnceleme ve Uygulama

Mehmet Akgül
2 min readJul 28, 2023

--

Bu yazıda, bir stringin tüm olası permütasyonlarını oluşturan bir algoritmanın Big O karmaşıklığını inceleyeceğiz. İşte bu algoritmanın Java’da bir uygulaması:

void permutation(String str){
permutation(str,"");
}

void permutation(String str, String prefix){
if(str.length()==0){
System.out.println(prefix);
} else{
for(int i=0;i<str.length();i++){
String rem=str.substring(0,i)+str.substring(i+1);
permutation(rem,prefix+str.charAt(i));
}
}
}

Bu kod, bir stringin tüm olası permütasyonlarını (karakterlerinin tüm olası düzenlemelerini) bulur ve bunları yazdırır. permutation(str,"") çağrısıyla başlar ve bu da permutation(str, prefix) fonksiyonunu çağırır. İlk başta, prefix boştur ve fonksiyon her bir harf için prefixe eklenir ve geri kalan string permutation fonksiyonuna tekrar gönderilir. Bu süreç, string boş olana kadar devam eder.

Uygulama: “perm” Stringinin Permütasyonları

Örneğin “perm” kelimesinin permütasyonlarını bulmak isteyelim. Bu kelimenin 4 karakteri olduğu için 4! = 4 * 3 * 2 * 1 = 24 farklı permütasyonu olacaktır. Yani bu algoritma, “perm”, “ermp”, “rmpe”, “mper”… ve diğer 24 tane olası permütasyonu çıktı olarak verecektir.

Big O Karmaşıklığı

Bu kodun zaman karmaşıklığı O(n!)’dir. Bunun nedeni, her iterasyonda bir karakter çıkarılarak stringin geri kalanının permütasyonlarının oluşturulmasıdır. Bu, faktöriyel zaman karmaşıklığına yol açar çünkü her karakterin stringin her pozisyonuna gelebileceği tüm olası düzenlemeleri oluşturuyoruz.

Big O gösterimi, bir algoritmanın worst-case (en kötü durum) zaman karmaşıklığını ifade eder. O(n!) gösterimi, algoritmanın çalışma süresinin girdi büyüklüğünün faktöriyeli ile orantılı olarak artacağını belirtir. Bu tür algoritmalardan kaçınmalıyız, çünkü girdi boyutu büyüdükçe çok hızlı bir şekilde yavaşlarlar. Faktöriyel fonksiyon, girdi değeri büyüdükçe çok hızlı bir şekilde artar ve bu yüzden bu tür bir algoritma genellikle sadece küçük girdiler için uygundur.

Ancak, tüm olası string permütasyonlarını oluşturmanın doğası gereği, bu tür bir işlem genellikle faktöriyel zaman karmaşıklığına sahip olacaktır, çünkü tüm olası düzenlemeleri oluşturmanız gerekir. Bu yüzden, permütasyonları bulmak için kullanılan bu tür bir algoritma, daha büyük girdilerle çalışması gereken durumlar için optimize edilmesi zor olabilir.

Algoritma karmaşıklığının anlaşılması, etkili ve verimli kod yazmanın önemli bir parçasıdır. Bu örnek, bir algoritmanın karmaşıklığını değerlendirme ve bunun kodunuzun performansı üzerindeki etkisini anlama yeteneğinin, yazılım geliştirmede ne kadar önemli olduğunu göstermektedir.

Umarım bu blog postu, permütasyonların Big O karmaşıklığını daha iyi anlamanızı sağlar! #Algorithms #BigO #Programming #Java

--

--