o notasyonu - wordpress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden...

16
O NOTASYONU Abdullah Gazi Emre DAĞLI 0804.01026

Upload: others

Post on 16-Jan-2020

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: O NOTASYONU - WordPress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından

O NOTASYONU

Abdullah Gazi Emre DAĞLI0804.01026

Page 2: O NOTASYONU - WordPress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından

Program Çalışma Hızı ve Bellek Gereksinimi

Programın çalışma hızı karmaşıklıkla ifade edilir; bu kavram zaman birimiyle ifade edilmeyip doğrudan işlem adedi veya döngü sayısıyla ifade edilir. Çünkü, programın çalışma hızında zaman miktarı programın üzerinde koştuğu donanıma çok bağlıdır; dolayısıyla algoritmaları birbiriyle karşılaştırmak için zaman miktarını kullanmak gerçekçi olmayıp yanılgılara neden olmaktadır. Bunun yerine, ilgili algoritmanın bilgisayar donanımından bağımsız olarak kaç adet işlem veya döngüyle gerçekleştirilebileceği hesaplanır. Algoritma karmaşıklığı iki açıdan ele alınır. Biri zaman karmaşıklığı, diğeri alan (veya bellek) karmaşıklığıdır. Zaman karmaşıklığı (time complexity) algoritmanın sonuca ulaşması için gerekli zaman hakkında bilgi verir. Alan karmaşıklığı (space complexity) ise algoritmanın ihtiyaç duyacağı bellek miktarı hakkında bilgi verir.

Algoritma karmaşıklığı iki şekilde ifade edilebilir. Biri doğrudan parametrelere bağlı olarak tam matematiksel ifadeyle; ikincisiyse, parametrelerin karmaşıklığı nasıl etkilediğini mertebe şeklinde gösterir; Mertebesi göstermek için O (büyük o), gibi birçok asimtotik notasyon kullanılır; genel olarak O notasyonunu kullanmak yaygındır. Örneğin iki matrisin çarpılması için gerekli zaman karmaşıklığı olarak hesaplanmışsa bu algoritma zaman karmaşıklığı ’den daha iyidir.

Bir program iki açıdan belleğe ihtiyaç duyar; biri kodun tutulması diğeri de kodun çalışması için üzerinde işlem yapacağı verilerin tutulması için.

Temel Kavramlar

Bir programın çalışma hızı veya bellek gereksinimi denildiğinde birçok kavram söz konusudur. Bunların hangi anlama geldiği ve ayrıldığı noktaların açıkça bilinmesinde yarar vardır. Örneğin çalışma

Page 3: O NOTASYONU - WordPress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından

hızı denildiğinde, bu soyut bir kavram olup değişik anlamlar çıkarılabilir; yürütme zamanı, çalışma süresi, zaman karmaşıklığı gibi kavramların hepsi çalışma hızı kapsamına girmektedir. Aşağıda bazı kavramların kısaca tanımları verilmiştir:

Page 4: O NOTASYONU - WordPress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından
Page 5: O NOTASYONU - WordPress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından

Programın Çalışma Hızı ve Karmaşıklık

Program çalışma hızı, program kodunun zaman açısından başarımını; karmaşıklık ise, ilgili program kodunun parametre sayısına bağlı olarak çalışma süresinin ve gerekli işlem sayısının artım miktarını gösterir. Çalışma hızını belirlemek için, biri kıyaslama, diğeri algoritma analizi olarak adlandırılan iki yol vardır: Kıyaslama (Benchmarking)Algoritma Analizi (Algorithm Analysis)

Page 6: O NOTASYONU - WordPress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından

Birisi uygulamanın gerçekleştirilmesini, diğeri ise bir bağıntı hesabıgerektirir. Kıyaslamada söz konusu algoritma gerçekleştirilir ve örnek veri için koşturulur. Algoritma analizinde ise, belirli bir veri yapısı için, söz konusu algoritmanın analizi yapılır ve bir zaman bağıntısı bulunur. Analiz, algoritma gerçekleştirimi karmaşıklaştıkça ciddi bir matematiksel birikim gerektirir.

Kıyaslama (Benchmarking)Kıyaslama, geliştirilen programın önceden belirlenmiş örnek giriş değerleri için çalışma hızını gösteren deneysel sınama sonucudur. Programa, giriş değerleri olarak, her olası durumu içeren örnek giriş verileri uygulanır ve bunlara karşı düşen başarı skoru elde edilir. Bu skor, çoğu zaman, belirli bir maksimum değere göre orantılanmış bir gerçel veya tamsayıdır. Örneğin en yüksek başarının 1.0 olduğu skor değerlendirmesinde başarım sınaması sonucu 0,5 veya %50 çıkarsa yarı başarımlı olarak değerlendirilir.

Algoritma analizi, tasarlanan program veya fonksiyonun belirli bir işleme göre matematiksel ifadesini bulmaya dayanır. Burada temel hesap birimi seçilir ve programın görevini yerine getirebilmesi için bu işlemden kaç adet yapılması gerektiğini bulmaya yarayan bir bağıntı hesaplanır. Eğer bu bağıntı zamanla ilgiliyle çalışma hızını, bellek gereksinimiyle ilgiliyse bellek gereksinimi ortaya koyar. Örneğin, n bağımsız değişken olmak üzere T(n) yürütme zamanını, S(n) ise bellek gereksinimi gösteren bağıntılardır. Eğer bir programın T(n) ve S(n) bağıntıları hesaplanabiliyorsa o programın çeşitli model bilgisayar üzerindeki çalışma hızı ve bellek gereksinimi kestirilebilir.

Yürütme Zamanı (Running Time)

Yürütme zamanı, algoritmanın belirli bir işleme veya eyleme kaç kez gereksinim duyulduğunu gösteren bağıntıdır ve T(n) ile gösterilir. Temel hesap birimi olarak, programlama dilindeki deyimler seçilebildiği gibi döngü sayısı, toplama işlemi sayısı, atama sayısı, dosyaya erişme sayısı gibi işler de temel hesap birimi olarak seçilebilir.

Page 7: O NOTASYONU - WordPress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından

Yürütme zamanı bağıntısı, fiziksel gerçeğe yakın bir sonuç verir; ancak sapmalar da olabilir. Çünkü kabul edilen temel hesap birimi, tüm hesaplar için aynı olmayabilir. Örneğin, bir tamsayı sayacın bir arttırılmasıyla iki gerçel sayının çarpımı maliyeti farklı olabilir; veya iki tamsayıyı karşılaştırmak ile iki katarı karşılaştırma maliyetleri farklı olur!

Karmaşıklık (Complexity)

Karmaşıklık bir algoritmanın çok sayıda parametre karşısında maliyet davranışındaki değişikliği/artmayı gösteren kavramsal bir ifadedir. Genel olarak, az sayıda parametreler için karmaşıklıkla ilgilenilmez; eleman sayısı n'nin sonsuza gitmesi durumunda algoritmanın maliyet hesabının davranışını görmek veya diğer benzer işleri yapan algoritmalarla karşılaştırmak için kullanılır.

Page 8: O NOTASYONU - WordPress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından

Programların karmaşıklığını matemetiksel olarak değişebilir.

Karmaşıklığı ifade edebilmek için asimtotik ifadeler kullanılmaktadır; bu amaçla O(g(n)), (g(n)), (g(n)), o(g(n)) gibi tanımlara başvurulur. Genel olarak büyük O ve q notasyonları daha çok kullanılmaktadır. Örneğin, bir sıralama algoritmasının karmaşıklığı O(n2) ise, bunun

anlamı, n çok büyük değerlere giderken algoritmanın zaman maliyeti karesel olarak artar şeklindedir. Örneğin karmaşıklığı O(nlog2n) olan

bir sıralama algoritması O(n2) olana göre daha iyidir; n çok büyük değerlere giderken karmaşıklık doğrusal çarpanlı logaritmik olarak artar. Aslında, bulunabilse, en iyi çözümü veren karmaşıklık O(1)

şeklinde sabit olanıdır; ancak asosiyatif bellek1 veya çok iyi bir çırpı fonksiyonu bulunmadıkça bu durum çoğu zaman sağlanmaz.

Sonsuz asimptotikler

Büyük O gösterimi algoritma başarım çözümlemesinde faydalıdır. Söz gelimi n boyundaki bir problemi çözmek için gereken zaman (adım sayısı) T(n) = 4n² - 2n + 2 olarak bulunabilir.

n büyüdükçe n² terimi o kadar hızlı büyüyecektir ki diğer terimlerin büyüme hızı buna kıyasla ihmal edilebilecek kadar düşük kalacaktır; örneğin n = 500 için 4n² terimi 2n teriminin 1000 katı büyüklüğünde olacaktır ve dolayısıyla bu ikinci terimin değeri tüm ifadenin değerini

Page 9: O NOTASYONU - WordPress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından

belirlemede çoğu amaç bakımından ihmal edilebilir bir etkiye sahip olacaktır.

Buna ek olarak, aynı ifadeyi n³ veya 2n terimleri içeren bir ifade ile kıyaslayacak olursak katsayılar da anlamlarını yitirecektir. T(n) = 1.000.000n² ve U(n) = n³ olsa bile ikinci ifade, n 1.000.000'u geçtikçe birinci ifadeye kıyasla daima daha büyük olacaktır (T(1.000.000) = 1.000.000³ = U(1.000.000)).

O halde Büyük O gösterimi işin özünü sade biçimde sunmaktadır: şu şekilde yazabilir

ve algoritmanın n2 dereceden zaman karmaşıklığına sahip olduğunu söyleyebiliriz.

Sonsuz küçük asimptotikler

Büyük O aynı zamanda bir matematiksel işlev için geliştirilen yaklaşık işlevin hata terimini tarif etmek için de kullanılabilir. Örneğin, : ifadesi hatanın (yani

farkının) mutlak değer bakımından, sıfıra yeterince yakın x değerleri için bir sabit çarpı x3 değerinden daha küçük olduğunu belirtir.Biçimsel tanım

f(x) ve g(x) gerçel sayılar kümesinin bir alt kümesi üzerinde tanımlanmış iki işlev olsun. Bu durumda deriz kif(x), O(g(x))dir; x ∞

yalnız ve yalnızöyle x0 ve M sayıları varsa ki |f(x)| ≤ M |g(x)|; x > x0 için.

Aynı gösterim f işlevinin bir a gerçel sayısı civarındaki davranışını tarif etmek için de kullanılabilir: Deriz kif(x) O(g(x))dir; x a

Page 10: O NOTASYONU - WordPress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından

yalnız ve yalnızöyle δ>0 ve M sayıları varsa ki |f(x)| ≤ M |g(x)|; |x - a| < δ için.

Eğer g(x) a sayısına yeterince yakın x değerleri için sıfırdan farklı ise yukarıdaki iki tanım limit superior kullanılarak birleştirilebilir:f(x) O(g(x))dir;x a

yalnız ve yalnız

iken.

Matematikte hem ∞ hem de a civarındaki asimptotikler kullanılır. bilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından mutlak değer de kullanılmadan yazılabilir.Örnek

Şu çokterimlilere bakalım:

f(x), O(g(x)) ya da O(x4) derecesindedir diyebiliriz. Tanıma göre, tüm x>1 degerleri için ve C bir sabit iken, |f(x)| ≤ C |g(x)| ifadesi geçerlidir.

İspat: x > 1 iken

çünkü x3 < x4, ve devam eder.

Page 11: O NOTASYONU - WordPress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından

Dikkat edilmesi gereken hususlar

Yukarıda bahsi geçen "f(x) O(g(x))dir" ifadesi genellikle f(x) = O(g(x)) şeklinde yazılır. Bu, gösterimin bir nebze kötüye kullanılması demektir. Elbette kastettiğimiz iki işlevin birbirine eşit olmaları değildir. O(g(x)) olma hali simetrik değildir:

fakat .

Bu yüzden bazı yazarlar küme gösterimini tercih ederler ve f O(g) yazarlar, bunu yaparken de O(g)yi g işlevinin altında kalan tüm işlevlerin kümesi olarak düşünürler.

Ayrıca, aşağıdaki gibi bir "eşitlik"

"f(x) ile h(x)nin farkı O(g(x))dir" olarak anlaşılmalıdır.

Pek sık rastlanmasa da, Büyük O gösterimi ile kullanılan çok daha hızlı büyüyen işlevler mevcuttur, mesela A(n,n) olarak temsil edilen Ackermann işlevinin tek değerli hâli. Bunun tam tersi çok yavaş büyüyen işlevler da vardır, ör. Ackermann işlevinin ters işlevi olan ve genellikle α(n) ile gösterilen işlev. Her ne kadar bu işlevler sınırsız olsa da pratik amaçlar için sabit çarpanlar olarak kabul edilirler.

Özellikler

Eğer bir f(n) işlevi diğer işlevlerin sonlu toplamı olarak yazılabiliyorsa o zaman bunların içinden en hızlı büyüyeni f(n) işlevinin derecesini belirler. Örneğin

.

Page 12: O NOTASYONU - WordPress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından

Özel olarak eğer bir işlev n terimine bağlı birçokterimli tarafından üstten sınırlandırılabiliyorsa o zaman n değeri sonsuza gittikçe çokterimlinin düşük dereceli terimleri ihmal edilebilir.

O(nc) ve O(cn) çok farklıdır. İkincisi çok çok daha hızlı büyür ve c sabitinin değeri, bu değer 1 sayısından büyük olduğu sürece, bu durumu değiştirmez. n'nin herhangi bir kuvvetinden daha hızlı büyüyen bir işleve yüksek çokterimli (superpolynomial) denir. cn biçimindeki herhangi bir üssel işlevden daha yavaş büyüyen işleve ise altüssel denir. Bir algoritmanın zaman karmaşıklığı hem yüksek çokterimli hem de altüssel olabilir, bu tür algoritmalara örnek olarak bilinen en hızlı çarpanlara ayırma algoritmaları verilebilir.

O(log n) tam olarak O(log(nc)) ile aynıdır. Logaritmalar arasındaki fark sadece sabit değerden kaynaklanan farktır (çünkü log(nc)=c log n) ve bundan ötürü büyük O gösteriminde ihmal edilir. Benzer şekilde farklı tabanlara göre yazılmış logaritmalar da denk kabul edilir.

Çarpma

Toplama

Bir sabit ile çarpma , k≠0

Bir sabit ile toplamag(n) ∈ o(1) olmadığı takdirde ki bu durumda

O(1)dir.

Yürütme Zamanı ve Karmaşıklık Hesabı

Örnek: Aşağıda matris çarpa işlemi yapan bir fonksiyon görülmektedir; A ve B matrisleri giriş C ise sonucun saklandığı matristir. Fonksiyonun n.m boyutlu A matrisiyle n.r boyutlu B

Page 13: O NOTASYONU - WordPress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından

matrisini çarpıp n.r boyutlu C matrisini elde etmesi için gerekli T(n)'ni ve büyük O notasyonundaki karmaşıklığı hesaplayınız. Eğer matrisler n.n boyunda kare matrisler olsaydı T(n) ve O(?) ne olurlardı?

Çözüm: Burada üç tane döngü vardır ve sayaç değişkenleri x, y ve z olarak adlandırılmıştır; bağıntılar ise matrisin boyutunu belirleyen n, m ve r'ye bağlı çıkacaktır. Hesaplama yapılırken şöyle bir yol izlenebilir: önce for deyimlerinde yapılan işlem sayısı bulunur ve ardından her for döngüsü içerisinde yapılan işlem sayısı bulunur ve her ikisi toplanır.1. satırda for deyiminde x=0 işlemi 1 kez; x<n işlemi (n+1) kez ve x++ işlemi n kez yapılır. Dolayısıyla, en dışdaki for deyimi içerisinde yapılan işlem sayısı 1+(n+1)+n= 2n+2 kez yapılır.2 .satırdaki for deyiminde ise, işlem sayısı (2r+2)n, 4. satırdaki for deyiminde ise (2m+2)nr çıkarak. Dolayısıyla, yalnızca for deyimleri için yapılan işlem sayısı Tfor(n, m, r)= (2n+2)+(2r+2)n+(2m+2)nr olur. Döngüler içerisindeki işlem sayısı ise, 3. satırdaki işlem sayısı nr kez; benzer şekilde 6. satırda da nr kez yapılır; 5. satırdaki işlem sayısı ise (satırın bütünü 1 işlem kabul edilerek) nmr olur. Tdöngü içi(n, m, r)= nr+nr+nmr olur. Buna göre toplam işlem sayısı T(n, m, r)= Tfor(n, m, r)+ Tdöngü içi(n, m, r) bağıntısı uyarınca,

T(n, m, r)= (2n+2)+(2r+2)n+(2m+2)nr+ nr+nr+nmr = 2n+2+2nr+2n+2mnr+2nr+nr+nr+nmr = 3nmr+6nr+4n+2

Page 14: O NOTASYONU - WordPress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından

olarak bulunur. Yürütme zamanı bağıntısından O(?) karmaşıklığı, kabaca şöyle bulunur; tüm sabit çarpanlar ve düşük dereceli terimler atılır. Dolayısıyla karmaşıklık O(nmr) bulunur.

Eğer matrislerin her yöndeki boyutları n olursa, yürütme zamanı bağıntısındaki m ve r'ler yerine n yerleştirilip sadeleştirme işlemi yapılırsa,

T(n)= 3nnn+6nn+4n+2= 2n3+6n2+4n+2 ve O(n3)

bulunur.

Büyük O notasyonu hesabı

ÖrnekBir algoritmanın yürütme zamanı bağıntısı T(n)= An2+Bn+C şeklinde hesaplanmıştır. Burada A, B ve C sabit sayılar olup n ise eleman sayısını göstermektedir. Bu algoritmanın büyük o notasyonuna göre karmaşıklığı ne olur?

Çözüm: Büyük o notasyonunu bulmak için birçok yol vardır. En kolay görüneni aşağıdaki gibi olabilir. Bağıntımız T(n)= An2+Bn+C şeklindedir. Sağ taraf n2'ye bölünürse,

aşağıdaki gibi bir sonuç elde edilir.

Burada 'a giderken birinci terim sabit, ikinci ve üçüncü terimler sıfıra doğru yaklaşır. Dolayısıyla için A sabiti kalır. Dolayısıyla T(n)= An2+Bn+C bağıntısı için büyük o notasyonundaki karmaşıklık için O(n2) denilebilir. Bu karmaşıklık belirli bir A değeri ve üstü için geçerlidir.

Page 15: O NOTASYONU - WordPress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından

Örneğin ise T(n)= 3n2+7n+5, eşitliği sağ tarafı n2'ye bölünürse,

elde edilir. Burada A değeri 3'tür.

Bazı sıralamalar ve karmaşıklıkları:

Page 16: O NOTASYONU - WordPress.combilgi işlemsel karmaşıklık kuramında ise sadece ∞a giden asimptotikler kullanılır. Ayrıca sadece pozitif değerli işlevler ele alındığından

KAYNAKÇA

1. http://tr.wikipedia.org/wiki/Büyük_O_gösterimi2. http://letscoding.com/2011/11/04/veri-yapilari/