<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bilgisayar Kavramları &#187; algoritma analizi (teory of algorithms)</title>
	<atom:link href="http://www.bilgisayarkavramlari.com/category/algoritma-analizi-teory-of-algorithms/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bilgisayarkavramlari.com</link>
	<description>www.bilgisayarkavramlari.com</description>
	<lastBuildDate>Sun, 29 Jan 2012 21:38:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Horspool Algoritması</title>
		<link>http://www.bilgisayarkavramlari.com/2012/01/16/horspool-algoritmasi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2012/01/16/horspool-algoritmasi/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 13:14:00 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[veri yapıları]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/?p=6136</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Algoritmanın gayesi, bir metin içerisinde verilen bir dizginin (string) aranmasıdır. Literatürde arama yapılan metin için T (ingilizcedeki Text (metin) kelimesinden gelmektedir) ve aranan kelime için P (ingilizcedeki Pattern (örüntü) kelimesinden gelmektedir) kullanılmaktadır. Klasik bir arama, yukarıdaki temsili resimde gösterilmiştir. Algoritmanın diğer metin arama algoritmalarından en büyük farkı, aranan dizgi (pattern) [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Algoritmanın gayesi, bir metin içerisinde verilen bir <a href="http://www.bilgisayarkavramlari.com/2008/08/02/dizgi-string/">dizginin (string)</a> aranmasıdır. Literatürde arama yapılan metin için T (ingilizcedeki Text (metin) kelimesinden gelmektedir) ve aranan kelime için P (ingilizcedeki Pattern (örüntü) kelimesinden gelmektedir) kullanılmaktadır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011612_1314_HorspoolAlg1.png" alt="" /></p>
<p>Klasik bir arama, yukarıdaki temsili resimde gösterilmiştir.</p>
<p>Algoritmanın diğer metin arama algoritmalarından en büyük farkı, aranan dizgi (pattern) yerine aranılan metin (text) üzerinden işlem yapmasıdır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011612_1314_HorspoolAlg2.png" alt="" /></p>
<p>Yukarıdaki şekilde gösterildiği gibi, üzerinde arama işleminin yapıldığı metinde bulunan herhangi bir x harfi için, aranılan metin üzerindeki (pattern) en solda olan harf bulunmaya çalışılır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011612_1314_HorspoolAlg3.png" alt="" /></p>
<p>arama işlemine başlanan α değerinin ardından gelen harfler eşleştiği sürece, aranan kelimenin (pattern) sonuna kadar eşleştikçe arama işlemi devam eder. Şayet bu aşama uyuşmayan bir harf olursa, zaten aranan kelimenin olmadığı sonucuna varılabilir.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011612_1314_HorspoolAlg4.png" alt="" /></p>
<p>Ardından uyuşma olup olmadığına bakılmaksızın aranan kelimeyi ß değerine denk gelecek şekilde kaydırma işlemi yapılır. Bu kaydırmanın olması için kelimenin (pattern) kalan kısmında ikinci bir değerinin bulunmaması gerekir.</p>
<p><strong>Örnek<br />
</strong></p>
<p>Algoritmanın çalışmasını bir örnek üzerinden göstermeye çalışalım.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011612_1314_HorspoolAlg5.png" alt="" /></p>
<p>Yukarıdaki şekilde görüldüğü üzere, aranan kelime için (P) sağdan sola doğru bir numaralandırma yapılmakta ve bu numaralandırma üzerinden aşağıda gösterilen HpBc dizisi çıkarılır. Bu dizi üzerinden metin üzerinde arama yapılır.</p>
<p>Sırasıyla önce, A harfi aranır. Ardından C ve G harfleri aranır. Dikkat edilirse, kelimede üç kere geçen A harfi, dizide bir kere kullanılmaktadır.</p>
<p>Uyuşma oldukça aranan kelime kaydırılmaktadır.</p>
<p>&nbsp;</p>
<p><strong>Müsvette Kod (Pseudo Code)<br />
</strong></p>
<p>Algoritmanın müsvette kodu aşağıdaki şekilde yazılabilir:</p>
<p>Horspool (P = <em>p<sub>1</sub>p<sub>2</sub>…p<sub>m</sub></em>,T = <em>t<sub>1</sub>t<sub>2</sub>…t<sub>n</sub></em>)</p>
<p>Önişleme Aşaması</p>
<p>For <em>c </em><span style="font-family: Symbol;"><strong>Î</strong></span> ∑ Do <em>d</em>[<em>c</em>]<em> ← m</em></p>
<p>For <em>j </em><span style="font-family: Symbol;"><strong>Î</strong></span> 1…<em>m</em>-1 Do <em>d</em>[<em>p<sub>j</sub></em>]<em> ← m &#8211; j</em></p>
<p>Arama Aşaması</p>
<p><em>pos</em>←0</p>
<p>While <em>pos</em> ≤ <em>n-m</em> Do</p>
<p><em>j </em>←<em>m</em></p>
<p>While <em>j </em>&gt; 0 And t<em><sub>pos+j</sub></em> = <em>p<sub>j</sub></em>     Do <em>j</em> ← <em>j-</em>1</p>
<p>If <em>j</em> = 0 bulundu: <em>pos</em>+1</p>
<p><em>pos</em> ← <em>pos</em> +<em>d</em>[<em>t<sub>pos+m</sub></em>]</p>
<p>End of while</p>
<p>Yukarıdaki algoritmada geçen değerlerin, örnek üzerindeki gösterimlerini adım adım anlatmaya çalışalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011612_1314_HorspoolAlg6.png" alt="" /></p>
<p>Yukarıdaki ilk adımda aranan ilk harf olan C harfi için öncelikle kümede olup olmadığı kontrolü yapılır. Bunun anlamı aranan kelimenin harflerinden birisi olmaması durumunda vakit kaybedilmemesidir.</p>
<p>İkinci adımda ise daha önce çıkardığımız HpBc[a] dizisine göre her harfin değerleri atanır.</p>
<p>Arama işleminin devamı aşağıdaki şekildedir:</p>
<p>&nbsp;</p>
<p>GCATCGC<strong>A</strong>GAGAGTATACAGTACG</p>
<p>GCAGAGA<strong>G</strong></p>
<p><em>     pos </em>← <em>0 </em>+ <em>d[t<sub>0+7</sub>] , pos </em>← <em>0 </em>+ <em>d[</em>A<em>], pos </em>← 1</p>
<p><em><br />
</em>Yukarıda görüldüğü üzere, kelimenin ilk kontrolü için 1. pozisyonda bulunan A değeri aranmıştır. Ardından arama işlemi sonraki harf olan G için aşağıdaki şekilde devam eder:<em><br />
</em></p>
<p>GCATCG<strong>CAG</strong>AGAGTATACAGTACG</p>
<p>GCAGA<strong>GAG</strong></p>
<p><em>pos </em>← 1<em></em> + <em>d[t<sub>1+7</sub>] , pos </em>← 1<em></em> + <em>d[</em>G<em>], pos </em>← 3</p>
<p>G harfi ile C harfinin tutuşmamasından dolayı aranan kelime (P) kaydırılmıştır.</p>
<p>GCATCG<strong>CAGAG</strong>AGTATACAGTACG</p>
<p>GCA<strong>GAGAG</strong></p>
<p><em>pos </em>← 3<em></em> + <em>d[t<sub>3+7</sub>] , pos </em>← <em>3 </em>+ <em>d[</em>G<em>], pos </em>← 5</p>
<p>Benzer şekilde C ve G uyuşmamasından dolayı bir kere daha kaydırıyoruz.</p>
<p>GCATC<strong>GCAGAGAG</strong>TATACAGTACG</p>
<p><strong>GCAGAGAG</strong></p>
<p>While <em>j </em>&gt; 0 And t<em><sub>pos+j</sub></em> = <em>p<sub>j</sub></em> Do <em>j</em> ← <em>j-1</em></p>
<p>If <em>j</em> = 0 <em>pos</em>+1&#8242;de bulundu</p>
<p><em>pos </em>← 5<em></em> + <em>d[t<sub>5+7</sub>] , pos </em>← 5<em></em> + <em>d[</em>G<em>], pos </em>← 7</p>
<p>Görüldüğü üzere aranan kelime ile uyuşma oldu. Algoritmamızın ilgili satırlarını çalıştırıyor ve bulunduğunu rapor ediyoruz.</p>
<p>GCATCGCAGAGAGT<strong>A</strong>TACAGTACG</p>
<p>GCAGAGA<strong>G</strong></p>
<p><em>pos </em>← 7<em></em> + <em>d[t<sub>7+7</sub>] , pos </em>← 7<em></em> + <em>d[</em>A<em>], pos </em>← 8</p>
<p>İkinci kere A harfini arıyoruz.</p>
<p>GCATCGCAGAGAGTA<strong>T</strong>ACAGTACG</p>
<p>GCAGAGA<strong>G</strong></p>
<p><em>pos </em>← 8<em></em> + <em>d[t<sub>8+7</sub>] , pos </em>← 8<em></em> + <em>d[</em>T<em>], pos </em>← 16</p>
<p>Bulunan A harfi G harfi ile uyuşmadığı için atlıyoruz:</p>
<p>GCATCGCAGAGAGTATACAGTAC<strong>G</strong></p>
<p>GCAGAGA<strong>G</strong></p>
<p><em>pos </em>← 16<em></em> + <em>d[t<sub>16+7</sub>] , pos </em>← 16<em></em> + <em>d[</em>G<em>], pos </em>← 18</p>
<p><em>pos &gt; n-m // pos &gt;23-7 </em></p>
<p><em>while döngüsünden çık.</em></p>
<p>Son olarak kelimenin sonuna gelindiği halde aranan yazı bulunmadığı için algoritma sonlanıyor.</p>
<p><strong>Algoritmanın Karmaşıklığı<br />
</strong></p>
<p>Algoritmanın zaman karmaşıklığı aranan kelimenin boyu n ve aranılan kelimenin boyu m olmak üzere O(mn)&#8217;dir denilebilir. Çünkü en kötü durumda her aranılan kelime harfi için üzerinde arama yaptığımız her harfi karşılaştırmamız gerekebilir. Bu da her n harf için m adet karşılaştırmaya eşittir.</p>
<p>&nbsp;</p>

<p class="sayac_bilgi">78 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2012/01/16/horspool-algoritmasi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yeknesan (Invariant , Değişmez)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/07/19/yeknesan-invariant-degismez/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/07/19/yeknesan-invariant-degismez/#comments</comments>
		<pubDate>Tue, 19 Jul 2011 07:53:50 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[bilgisayar felsefesi]]></category>
		<category><![CDATA[Bilgisayar Matematiği]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/07/19/yeknesan-invariant-degismez/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde, bir programın incelenmesi sırasında, herhangi bir kaziyenin (predicate, haber, önerme), çeşitli işlemler uygulanmasına karşılık yeknesan olması halidir. Diğer bir deyişle, program çalışır ve çeşitli işlemlerden geçer, ancak bazı şeyler değişmeden kalıyor ve ne kadar işlem yapılırsa yapılsın değişmiyorsa buna yeknesan (değişmez, invariant) ismi verilir. En basit örneği, bir [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Bilgisayar bilimlerinde, bir programın incelenmesi sırasında, herhangi bir <a href="http://www.bilgisayarkavramlari.com/2009/05/07/haber-predicate/">kaziyenin (predicate, haber, önerme)</a>, çeşitli işlemler uygulanmasına karşılık yeknesan olması halidir.
</p>
<p>Diğer bir deyişle, program çalışır ve çeşitli işlemlerden geçer, ancak bazı şeyler değişmeden kalıyor ve ne kadar işlem yapılırsa yapılsın değişmiyorsa buna yeknesan (değişmez, invariant) ismi verilir.
</p>
<p>En basit örneği, bir <a href="http://www.bilgisayarkavramlari.com/2008/09/08/degisken-variable/">değişkenin (variable)</a> içine değer atanması ama hiç değiştirilememesidir. </p>
<pre>
int a = 10;
// işlemler
printf("%d",a);
</pre>
</p>
<p>Yukarıdkai kodda, a değerini ilgilendiren işlemler yapılmıyorsa, a için yeknesan olmuş denilebilir. Farklı bir örnek de döngülerde görülür:</p>
<pre>
for(int i = 0;i&lt;10;i++){
   printf("%d",i);
}
</pre>
</p>
<p>Yukarıdaki döngüde, i&lt;10 şartında bulunan 10&#8242;dan küçük olma şartı yeknesan olmuştur. Yani döngünün dönmesi sırasında değişmeden kalmaktadır. Hemen bu noktada önemli bir farkı belirtmek gerekir. Yeknesean kavramı, sabit kavramı ile (constant) karıştırılabilmektedir. Örneğin yukarıdaki döngüde bulunan 10 sayısı bir sabittir ve yeknesan değildir. 10&#8242;dan küçük olma durumu ise değişmeden kalan bir yeknesan olarak düşünülmelidir.<br />
Yukarıdaki tip yeknesan örneklerine, özel olarak daire yeknesanı (loop invariant, döngü değişmezi) ismi de verilebilir.
</p>
<p>Bu yaklaşım, ayrıca program analizi veya problem analizi sırasında da kullanılabilir. Örneğin <a href="http://www.bilgisayarkavramlari.com/2011/07/19/mu-bulmacasi-mu-puzzle/">MU Probleminin</a> çözümünde, yeknesan bir değer yakalamaya çalışmak gerekir. Benzer şekilde <a href="http://www.bilgisayarkavramlari.com/2009/09/10/hoare-mantigi-hoare-logic/">Hoare Mantığı (Hoare Logic),</a> programların belirli bölümlerinde, ön ve son koşullar belirleyerek bunların yeknesan olmasını sağlamaktadır.
</p>
<p>Bu yöntem, bilgisayar bilimleri dışında da kullanılır. Örneğin, kanun yapım sürecinde, bütün kanunlarda değişmeyen kötü hasletler vardır. Bu yüzden, hırsızlık veya cinayet gibi suçlar, kanunlar değişmesine karşılık, bütün kanunlarda yerini almaktadır. Bu anlamda, değişen kanun sistemleri için, hırsızlık, yeknesan bir suçtur denilebilir. </p>

<p class="sayac_bilgi">243 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/07/19/yeknesan-invariant-degismez/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MU Bulmacası (MU Puzzle)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/07/19/mu-bulmacasi-mu-puzzle/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/07/19/mu-bulmacasi-mu-puzzle/#comments</comments>
		<pubDate>Tue, 19 Jul 2011 07:33:22 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/07/19/mu-bulmacasi-mu-puzzle/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde de kullanılan ve normal gösterim elde etmeyi hedefleyen, özellikle de sondan normal şekil gösterimi için oynanan bir oyundur. Oyunun aşağıda tanımlı olan kuralları ile MU kelimesinin elde edilip edilemeyeceği sorulur: Oyunda kullanılabilecek harfler M, I ve U&#8217;dur. Bu harfler dışında harf kullanılamaz. Oyuna MI kelimesi ile başlanır. Oyundaki [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Bilgisayar bilimlerinde de kullanılan ve normal gösterim elde etmeyi hedefleyen, özellikle de sondan normal şekil gösterimi için oynanan bir oyundur.
</p>
<p>Oyunun aşağıda tanımlı olan kuralları ile MU kelimesinin elde edilip edilemeyeceği sorulur:
</p>
<ol>
<li>Oyunda kullanılabilecek harfler M, I ve U&#8217;dur. Bu harfler dışında harf kullanılamaz.
</li>
<li>Oyuna MI kelimesi ile başlanır.
</li>
<li>Oyundaki kelimenin sonuna, U harfi eklenebilir. (Örneğin MI kelimesi MIU yapılabilir)
</li>
<li>Oundaki M harfinden sonra gelen harfler ikiye katlanabilir (Örneğin MIU kelimesi, MIUIU şeklinde, M harfinden sonra gelen IU kelimesini iki kere yazarak elde edilmiştir)
</li>
<li>Ardışık olarak tekrar eden I harfleri U harfine dönüşebilir. Örneğin MUIIIU kelimesi MUUU kelimesine dönüştürülebilir.
</li>
<li>Çift U harfi silinebilir. Örneğin MUUU kelimesi, MU kelimesine dönüşebilir.
</li>
</ol>
<p>Sorumuz, başlangıçta bulunan MI kelimesinin, yukarıdaki kurallar kapsamında MU olarak yazılıp yazılamayacağıdır.
</p>
<p>Sorunun cevabı, bu şekilde bir geçişin imkansız olduğudur.
</p>
<p>Bu tip bir problemin çözümünde bir <a href="http://www.bilgisayarkavramlari.com/2011/07/19/yeknesan-invariant-degismez/">&#8220;yeksan&#8221; (invariant, değişmez)</a> aramak gerekir. Yani problemdeki değişen durumlara karşı yeksan olan (değişmeyen) bir kararlı hal yakalanabiliyor mu diye bakılması gerekir.
</p>
<p>Çözümün ispatlanması sırasında I harfi içeren kelimelere bakmamız gerekir. Bu harfin (I) sayısını değiştiren kurallar, yukarıdaki listede, 4. ve 5. Kurallardır. 4. kural, sondaki harfleri iki misline katlamaktadır. Dolayısıyla sonda bulunan I harfi kaç tane ise bunun sayısı iki misline katlanacaktır. 5. kuralda ise I harfleri U harfi ile değişebilmektedir.
</p>
<p>Bu iki kural dışında I harfinin sayısını değiştiren bir kural yoktur.
</p>
<p>Ayrıca, başlangıçta 1 adet I harfi ile başlanmaktadır.
</p>
<p>Şimdi kurallarımızı tekrar gözden geçirdiğimizde, I harflerinin sayısının 2 misline çıkabildiğini veya 3 I harfinin U harfine döndüğünü görürüz. Ayrıca oyunun bitmesi için hiç I harfi bulunmamalıdır.
</p>
<p>Bu şartlarda oyun bitmez çünkü:
</p>
<ul>
<li>Başlangıçtaki I sayısı (ki 1ile başlar) 3&#8242;e tam bölünmez.
</li>
<li>3&#8242;e tam bölünemeyen bir sayının iki misli de üçe bölünmez.
</li>
<li>3&#8242;e bölünemeyen bir sayıdan 3 çıkarmak ta sayıyı 3&#8242;e bölünür hale getirmez.
</li>
</ul>
<p>Dolayısıyla hiç I içermeyen MU kelimesine ulaşılması imkansızdır. </p>

<p class="sayac_bilgi">231 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/07/19/mu-bulmacasi-mu-puzzle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Örtüşen Alt Problem (Overlapping Subproblem)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/07/18/ortusen-alt-problem-overlapping-subproblem/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/07/18/ortusen-alt-problem-overlapping-subproblem/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 08:41:47 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/07/18/ortusen-alt-problem-overlapping-subproblem/</guid>
		<description><![CDATA[Yazan :Şadi Evren ŞEKER Bilgisayar bilimlerinde, özellikle özyineli (recursive) problemlerde, problemin bir kısmının tekrar edilmesi durumudur. Örneğin, klasik bir problem olan fibonacci sayıları örneğinde, örtüşen altproblem bulunmaktadır. Fibonacci serisinin 4. terimini hesaplamak isteyelim ve bunun için aşağıdaki fonksiyonu yazmış olalım: Matematiksel olarak : fib(0) = 1, fib(1) = 1 ve fib(n) = fib(n-1)+fib(n-2) Programlama dillerinde: [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan :Şadi Evren ŞEKER
</p>
<p>Bilgisayar bilimlerinde, özellikle <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">özyineli (recursive)</a> problemlerde, problemin bir kısmının tekrar edilmesi durumudur. Örneğin, klasik bir problem olan <a href="http://www.bilgisayarkavramlari.com/2008/08/05/fibonacci-sayilari-fibonacci-numbers/">fibonacci sayıları</a> örneğinde, örtüşen altproblem bulunmaktadır.
</p>
<p>Fibonacci serisinin 4. terimini hesaplamak isteyelim ve bunun  için aşağıdaki fonksiyonu yazmış olalım:
</p>
<p>Matematiksel olarak : fib(0) = 1, fib(1) = 1 ve fib(n) = fib(n-1)+fib(n-2)
</p>
<p>Programlama dillerinde:</p>
<pre>
fib(int n){
   if(n==0||n==1)
      return 1;
   return fib(n-1)+fib(n-2);
}
</pre></p>
<p>Yukarıdaki bu fonksiyonun çalışması sırasında çağırdığı alt fonksiyonları bir ağaç şeklinde çizecek olursak:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/071811_0841_rtenAltPro1.png" alt=""/>
	</p>
<p>Yukarıdaki ağaçta, görüldüğü üzere, bazı terimler birden fazla kere hesaplanmaktadır. Örneğin fib(2) fonksiyonu, hem fib(4) hesaplanırken, hem de fib(3) hesaplanırken hesaplanmaktadır. Bu anlamda, problemin bir alt grubunun (subproblem) örtüştüğünden (overlap) bahsedebiliriz. Genelde bu tip örtüşmelerde, hız kazandırmak ve problemin sadece bir kere çözülmesini saplamak için <a href="http://www.bilgisayarkavramlari.com/2007/12/03/dinamik-programlama-dynamic-programming/">dinamik programlama (dynamic programming)</a> yöntemi kullanılır. </p>

<p class="sayac_bilgi">192 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/07/18/ortusen-alt-problem-overlapping-subproblem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bin Packing (Kutulama Problemi)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/06/06/bin-packing-kutulama-problemi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/06/06/bin-packing-kutulama-problemi/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 07:50:05 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/06/06/bin-packing-kutulama-problemi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER İyileştirme problemleri açısından klasik bir örnektir (optimisation problems). Problem basitçe bir kutunun içerisine en az boş alan bırakarak, eşyaların en iyi şekilde nasıl yerleştireceği olarak düşünülebilir. Aslında problemi boyutlara göre incelersek aşağıdaki şekilde bir liste yapılabilir: Tek boyutlu kutulama (1D bin packing) :Bu problemde amaç bir çizgi veya hat gibi [...]]]></description>
			<content:encoded><![CDATA[<div>
<p style="margin-bottom: 0cm;">Yazan : Şadi Evren ŞEKER</p>
<p style="margin-bottom: 0cm;">İyileştirme problemleri açısından klasik bir örnektir (optimisation problems). Problem basitçe bir kutunun içerisine en az boş alan bırakarak, eşyaların en iyi şekilde nasıl yerleştireceği olarak düşünülebilir.</p>
<p style="margin-bottom: 0cm;">Aslında problemi boyutlara göre incelersek aşağıdaki şekilde bir liste yapılabilir:</p>
<p style="margin-bottom: 0cm;"><strong>Tek boyutlu kutulama (1D bin packing)</strong> :Bu problemde amaç bir çizgi veya hat gibi görülebilecek yapının içerisine farklı boyutlardaki çizgileri yerleştirmek olarak düşünülebilir.</p>
<p style="margin-bottom: 0cm;">Örneğin zaman çizelgelemesinde, bir kişinin yapacağı işleri, zaman çizgisinin üzerine yerleştirmesi (ve her işin farklı miktarda zaman gerektirdiğini ve kişinin çalışma saatlerinin sınırlı olduğunu düşünürsek en fazla işi en az zamanda (örneğin 8 saatlik mesailer içinde) yapması ) bir problemdir. Buradaki hem kişinin yapacağı işler hem de bu işlerin yerleştirileceği zaman çizgisi tek boyutludur.</p>
<p style="margin-bottom: 0cm;">Daha basit olması açısından örneğin 100m uzunluğundaki bir ipi 7 ve 9m uzunluğundaki parçalara en az fire ile bölmek istiyoruz, en verimli bölme işleminde kaç adet 7 ve kaç adet 9 uzunluğunda ipimiz olur gibi soruları düşünebiliriz. Bu tip sorular tek boyutlu kutulama problemleridir.</p>
<p style="margin-bottom: 0cm;"><strong>İki boyutlu kutulama problemleri (2D bin packing optimization):</strong> Bu grupta bir tablodan ve iki boyuttan bahsedilebilir. Örneğin kot pantolon üreten bir tekstil firmasında farklı boyutlardaki Pantolon kalıplarının en az fire ile 5x5m büyüklüğündeki bir kare kumaştan kesilmesi isteniyor olsun. Bu problem iki boyutlu (x ve y boyutları) bir kutulama problemidir. Benzer bir problem, bir gazetedeki seri ilanların, en az fire ile sayfaya yerleştirilmesi olarak da düşünülebilir.</p>
<p style="margin-bottom: 0cm;"><strong>3 boyutlu kutulama (3D bin packing)</strong> problemin en zor şekli olarak tanımlanır ve 3 boyutlu bir kutunun içerisine konulan her şeklin farklı x,y ve z boyutlarında şekiller olması olarak düşünülebilir. Problemin genel tanımını yaptığımız için belirteyim, örneğin ev taşıma sırasında çıkan eşyaların kutulanması olarak düşünebilirsiniz. Bu durumu daha da karmaşık yapmaktadır çünkü kutular farklı boyut ve şekillerdedir (örneğin silindir bir varil veya küp veya dikdörtgenler prizması gibi kutuların içerisine yerleştirme yapılmakta) ve kutulanan şekillerde farklıdır ve hatta girintilidir (concave , non-convex) (örneğin avize, koltuk, sandalye gibi birbirinin içine girebilen nesneleri düşününüz). 2 ve 3 boyutlu paketleme, paketlenen nesnelerin girintili olup olmamasına göre ikiye ayrılmaktadır. Dış bükey nesnelerin paketlenmesi nispeten daha basit bir problemdir. Ancak nesnelerin iç bükey olması halinde problem biraz daha karmaşıklaşır.</p>
<p style="margin-bottom: 0cm;">Hatta literatürdeki kısıtlı aramalarım sonucunda ulaşabildiğim kadarıyla tam olarak iç bükey nesnelerin paketlenebildiği bir sonuç ne yazık ki bulamadım. Örneğin iki vidanın en verimlim paketlenmesi sırasında vidaların girinti çıkıntılarının üstüste gelmesi gerektiğini tecrübi olarak biliyoruz. N adet vida için bu durum birbirini tekrar eden bir hal alır. Gerçekten farklı boylarda ve adım sıklığında ve çaplarda vidalar verilse bu durumda en verimli paketlemeyi yapabilen bir algoritma henüz görmedim.</p>
<p style="margin-bottom: 0cm;"><strong>Paketlenen nesnelere göre problemin sınıflandırılması:</strong></p>
<p style="margin-bottom: 0cm;">Paketlenen nesne çeşitlerinin sabit olması ve ön tanımlı olması halinde problem homojen olarak tanımlanır. Örneğin tek boyutlu kutulama probleminin tanımı sırasında verilen ve “100m uzunluğundaki bir ipi 7 ve 9m uzunluğundaki parçalara en az fire ile bölmek” şeklinde geçen örnek bu tip homojen (homogenous) bir yapıdadır. Buna karşılık heterojen bir problemde, paketlenecek nesnelerin tipleri ya tamamen birbirlerinden farklıdır ya da aynı tipte çok az tekrar vardır. Yine tek boyutlu problem örneğinde verilen zaman çizgisi üzerinde farklı uzunluklardaki randevuların yerleştirilmesi bu tiptendir.</p>
<p style="margin-bottom: 0cm;">Bu anlamda aşağıdaki problemler, kutulama probleminin birer özel hali olarak düşünülebilir:</p>
<ul>
<li>
<p style="margin-bottom: 0cm;">kamyon yükleme problemi (truck loading),</p>
</li>
<li>
<p style="margin-bottom: 0cm;">konteyner yükleme problemi (Container loading problem, CLP)</p>
</li>
<li>
<p style="margin-bottom: 0cm;">şerit paketleme problemi (Strip Packing problem, SPP)</p>
</li>
</ul>
<p style="margin-bottom: 0cm;">Yukarıda, problemin tanımını yaptıktan sonra çözümlere bir göz atalım:</p>
<p style="margin-bottom: 0cm;"><strong>Homojen tek boyutlu problem çözümü</strong></p>
<p style="margin-bottom: 0cm;">Şayet problem tek boyutlu ise ve homojen nesnelerin paketlenmesi olarak problemin çözülmesi isteniyorsa problem oldukça basit demektir ve basit matematiksel hesaplamalar ile problemi çözebiliriz.</p>
<p style="margin-bottom: 0cm;">Örneğin tek nesne ve tek paket varsa işlem basitçe paketin nesneye bölümü olarak bulunur (zaten burada zor Bir şey de yok):</p>
<p style="margin-bottom: 0cm;">Örneğin 100m uzunluğundaki bir ipten kaç tane 5m uzunluğunda ip kesilebilir:</p>
<p style="margin-bottom: 0cm;">100 / 5 = 20</p>
<p style="margin-bottom: 0cm;">biraz daha zorlaştırıp ip sayısını 2 çeşide veya 3 çeşide çıkarırsak problem  <a href="http://www.bilgisayarkavramlari.com/2008/03/24/belirsiz-cokterimli-tam-np-complete-nondeterministic-polynomial-complete/">np-tam (np-complete)</a> bir hal alır. Örneğin aşağıdaki kodu inceleyelim:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_0__.jpg" border="0" alt="" width="599" height="470" /></p>
<p style="margin-bottom: 0cm;">Kodda görüldüğü üzere bütün ihtimaller denenmektedir. Basitçe herhangi bir k değeri için, k-a ve k-b değerlerini denemekte ve denenen duruma göre a veya b değerini bir arttırmaktadır. Aslında kodumuz basit bir  <a href="http://www.bilgisayarkavramlari.com/2008/05/07/ikili-agac-binary-tree/">ikili ağaç (binary tree)</a> oluşturmaktadır:</p>
<p>Önce 9 veya 7 ile başlanması ihtimalleri:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_1__.gif" alt="" width="275" height="149" /></p>
<p>Sonra bu ihtimallerin de 7 veya 9 azalma ihtimalleri:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_2__.gif" alt="" width="416" height="225" /></p>
<p>Yukarıda gösterildiği gibi her düğümden yine ikişer ihtimal indirerek bir alt seviyeye geçilebilir. Neticede 0 olana kadar yapılan bir aramadır ve 0 sonucuna birden farklı yoldan ulaşılabilir.</p>
<p style="margin-bottom: 0cm;">Kodumuz çalıştırıldığında çözüm olarak aşağıdaki sonuçları üretmektedir:</p>
<p style="margin-bottom: 0cm;">cozum : 7*4 + 9*8</p>
<p style="margin-bottom: 0cm;">cozum : 7*13 + 9*1</p>
<p style="margin-bottom: 0cm;">Gerçekten de problemin iki farklı çözümü bulunmaktadır.</p>
<p style="margin-bottom: 0cm;">Yukarıdaki kod basit bir hesaplama ile, 2&#8242;nin üstlerinin toplamı kadar adım hesaplamaktadır.</p>
<p style="margin-bottom: 0cm;">Bu değer yukarıdaki ağaçtan çıkarılabilir:</p>
<p style="margin-bottom: 0cm;">ilk düğüm için tek ihtimal 2 <sup>0</sup></p>
<p style="margin-bottom: 0cm;">ikinci seviye için iki ihtimal: 2 <sup>1</sup></p>
<p style="margin-bottom: 0cm;">üçüncü seviye için dört ihtimal 2 <sup>2</sup></p>
<p style="margin-bottom: 0cm;">şeklinde gitmektedir ve örneğin problemimiz üçüncü seviyede çözülseydi (sonuç 0 olsaydı) o zaman karmaşıklığımız bu değerlerin toplamı olacaktı ve 2 <sup>0</sup> + 2 <sup>1</sup> + 2 <sup>2</sup> şeklinde hesaplanacaktı.</p>
<p style="margin-bottom: 0cm;">Bu değer, ikili ağaçlardan bilindiği üzere 2 <sup>n</sup>-1 şeklinde hesaplanabilir.</p>
<p style="margin-bottom: 0cm;">Görüldüğü üzere yukarıdaki algoritma O(2 <sup>n</sup>) değerinde bir karmaşıklığa sahiptir ve bu değer bir çok terimli (polynom) değildir yani algoritmanın karmaşıklık sınıfı <a href="http://www.bilgisayarkavramlari.com/2008/03/24/belirsiz-cokterimli-tam-np-complete-nondeterministic-polynomial-complete/">np-tam (NP-Complete)</a> olarak belirtilebilir. Ayrıca yukarıdaki k değeri için bir çözüm bulunmuştur ancak çözüm bulunamasaydı bu değer k terim için denenecekti. Yani 100 için çözüm yoksa bir yaklaşığı olan 99 için ardından iki yaklaşığı 98 için &#8230; Bu işlem hiç çözüm bulunamaması halinde k terim için denenecekti.</p>
<p>Yukarıdaki problem,  <a href="http://www.bilgisayarkavramlari.com/2007/12/03/dinamik-programlama-dynamic-programming/">dinamik programlama (dynamic programming)</a> kullanılarak iyileştirilebilir. Bunun sebebi arama işlemi sırasında bazı sonuçların tekrar etmesidir. Örneğin yukarıdaki ikili ağacı aşağıdaki şekilde çizebiliriz:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_3__.gif" alt="" width="416" height="225" /></p>
<p>Farka dikkat ederseniz, 93 – 9 = 84 ve aynı zamanda 91-7 = 84 olduğu görülür. Bu durumda aslında 84 değeri bir önceki kodda iki farklı durum için aranmaktayken şimdi tek bir durum için aransın istiyoruz. Elbette 84 sadece bir örnektir ve buna bağlı olarak çok sayıda tekrar eden değer bulunmaktadır.</p>
<p style="margin-bottom: 0cm;">Hesaplanan bu değerleri bir  <a href="http://www.bilgisayarkavramlari.com/2007/05/04/array-dizi/">dizi (array)</a> içerisinde tutup tekrar hesaplanmasını engellemek istiyoruz:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_4__.jpg" border="0" alt="" width="643" height="525" />Yukarıdaki yeni kodda, bir dizi içerisinde tek döngü ile sonucu hesaplattık. Buna göre algoritmamız iki elemanlı bir diziyi kullanmakta, dizinin 0. elemanları 7lerin sayısını ve 1. elemanları ile 9ların sayısını saymaktadır.</p>
<p style="margin-bottom: 0cm;">Kodumuz ilk başta 0 için 0 tane 7 ve 0 tane 9 gerektiği gerçeği ile çalışmaya başlıyor. 14-23. satırlar arasındaki döngü basitçe i. terim için i-a ve i-b değerlerine bakıyor. Şayet i. terim için i-a veya i-b değerinde bir çözüm varsa (nereden geldiğini önemsemeksizin) bu çözüme bulduğu koşulu ilave ederek mevcut i değeri için çözümü kaydediyor. Şayet bu iki terim de bulunmuyorsa o zaman bir sonraki i değerine geçiyor.</p>
<p style="margin-bottom: 0cm;">Ekran çıktısı aşağıdaki şekildedir:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307346697_5__.jpg" border="0" alt="" width="280" height="315" /></p>
<p>Son 20 satır görülmekle birlikte daha önceki satılar alıntılanmamıştır. Ayrıca son 20 satırda görüldüğü üzere, tamamına ait bir çözüm bulunmaktadır. Örneğin 88 sayısı için 7*10 + 9*2 = 88 sonucuna ulaşılmıştır. En son satırda ise 100 için 7*13 + 9*1 sonucu görülmektedir.</p>
<p style="margin-bottom: 0cm;">Görüldüğü üzere birden fazla sonuç olsa bile tek bir sonucu görmekteyiz bunun sebebi veri yapısının bir sonuç üretmek üzere tasarlanmış olmasıdır. Elbette daha farklı veri yapıları kullanılarak diğer çözümleri de gösteren sonuçlar elde edilebilir.</p>
<p style="margin-bottom: 0cm;">Yukarıdaki algoritmanın karmaşıklığı ise bir öncekine göre oldukça iyi sayılabilecek O(n) olarak bulunur. Bunun sebebi dizideki her elemanın üzerinden tek bir kere geçiyor olması ve dolayısıyla tek bir döngünün (koddaki 14-21 satırlar arası) çalışıyor olmasıdır.</p>
</div>

<p class="sayac_bilgi">570 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/06/06/bin-packing-kutulama-problemi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Amortized Algorithm Analysis (İtfa Tahlili, amotize algoritma analizi)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/06/06/amortized-algorithm-analysis-itfa-tahlili-amotize-algoritma-analizi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/06/06/amortized-algorithm-analysis-itfa-tahlili-amotize-algoritma-analizi/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 05:12:42 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/06/06/amortized-algorithm-analysis-itfa-tahlili-amotize-algoritma-analizi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde algoritma performansının değerlendirilmesinde kullanılan yöntemlerden birisidir. Kısaca, bir algoritmanın en kötü durumunu araştırırken (worst case analysis) en kötü durumun olma ihtimallerinin de beraberinde incelendiği tahlil yöntemidir. Klasik bir en kötü durum analizi (worst case analysis) yöntemi algoritmanın çalışacağı en kötü durumu ortaya atar ve buradaki performansı ölçer. Örneğin [...]]]></description>
			<content:encoded><![CDATA[<div>
<p style="margin-bottom: 0cm;">Yazan : Şadi Evren ŞEKER</p>
<p style="margin-bottom: 0cm;">Bilgisayar bilimlerinde algoritma performansının değerlendirilmesinde kullanılan yöntemlerden birisidir. Kısaca, bir algoritmanın  <a href="http://www.bilgisayarkavramlari.com/2008/12/22/en-kotu-durum-analizi-worst-case-analysis/">en kötü durumunu araştırırken (worst case analysis)</a> en kötü durumun olma ihtimallerinin de beraberinde incelendiği tahlil yöntemidir.</p>
<p style="margin-bottom: 0cm;">Klasik bir  <a href="http://www.bilgisayarkavramlari.com/2008/12/22/en-kotu-durum-analizi-worst-case-analysis/">en kötü durum analizi (worst case analysis)</a> yöntemi algoritmanın çalışacağı en kötü durumu ortaya atar ve buradaki performansı ölçer. Örneğin  <a href="http://www.bilgisayarkavramlari.com/2008/08/09/kabarcik-siralamasi-baloncuk-siralamasi-bubble-sort/">kabarcık sıralaması (bubble sort)</a> ele alalım. Bu algoritma için en kötü durum sıralanacak olan grubun tersten sıralı olarak verilmesidir (küçükten büyüğe doğru sıralamak istediğimiz bir örneğin, tam ters sıralı olarak büyükten küçüğe sıralı olması durumudur).</p>
<p style="margin-bottom: 0cm;">Ancak itfa tahlil (amortized analysis) yöntemi ile bu en kötü durumun olma ihtimali de göz önünde bulundurulur. Bu durumu daha basit bir örnek üzerinden anlatmaya çalışalım.</p>
<p style="margin-bottom: 0cm;"><strong>Örnek Değişken boyutlu dizi (Dynamic Array)</strong></p>
<p style="margin-bottom: 0cm;">Bir değişken dizi uygulaması sırasında (dynamic array) hafızada dizinin ne kadar yer kaplayacağı önceden bilinemez. Amacımız hafızada eklenen eleman sayısı arttıkça kapladığı yeri artan bir dizi kodlamaktır. Örneğin tek eleman eklenmesi halinde hafızada tek eleman, beş eleman eklenmesi halinde ise hafızada beş elemanlık yer kaplayan bir dizi kodlamak istiyoruz.</p>
<p style="margin-bottom: 0cm;">Bu dizi kodlamasının en klasik uygulaması, dizi için hafızada ayrılan yerin dolması halinde, hafızadaki kaplanan yerin iki misline çıkarılmasıdır. Ayrıca iki misline çıkınca önceki dizide bulunan verilerin, yeni diziye kopyalanması da gerekmektedir. Örneğin hafızada iki elemanlı yer ayırarak başladık, 2 eleman dolduğunda hafızadaki yeri 4 elemana çıkarıyoruz, ve eski dizideki iki elemanı, yeni diziye kopyalıyoruz, 4 eleman dolduğunda 8 elemana çıkarıyoruz ve eski dizideki 4 elemanı yeni diziye kopyalıyoruz v.b.</p>
<p style="margin-bottom: 0cm;">Şimdi eleman ekleme işleminin hafızadaki karmaşıklığına bakalım. En kötü durum analizi bize, analiz sırasında karşılaşılabilecek en kötü durumu hesaplamamız gerektiğini söyler. Buna göre en kötü durum hafızanın dolması ve yeni yer açılmasıdır. Dizimizde n eleman olduğunu kabul edersek dizi dolduğu anda n elemanlık bir yer daha açılacaktır. Bu durumda algoritma karmaşıklığımızın O(n) olduğunu söyleyebiliriz. En kötü durum analizine göre doğru olan bu yaklaşım, itfa tahlilinde (amortize algoritma analizi) geçerli değildir.</p>
<p style="margin-bottom: 0cm;">Algoritmamızın çalışması sırasında n. elemanın eklenmesi için yeni açılan diziye n eleman kopyalanacaktır. Bu kopyalama işleminden sonra dizimize n adet eleman daha alabileceğiz. Dolayısıyla 2n elemanı eklemek için n adet kopyalama işlemine ihtiyaç duyuyoruz. O halde basit bir hesaplama ile 2n elemanın eklenmesi için 2n işlem + n adet kopyalama = 3n işlem yapmaktadır. Karmaşıklık ise basitçe O(3n/2n) = O(3/2) = O(1) olarak bulunur (sabit değerlerin  <a href="http://www.bilgisayarkavramlari.com/2008/12/22/en-kotu-durum-analizi-worst-case-analysis/">big-oh değerinin</a> 1 olduğunu hatırlayınız örneğin O(20) = O(1) )</p>
<p style="margin-bottom: 0cm;">Yukarıdaki işlem sırasında akla gelebilecek bir soru, n adet elemanın eklenmesi işleminin altında da kopyalama işlemleri yapıldığıdır. Örneğin 16 eleman eklenmesi için kaç adım gerektiğini hesaplayalım:</p>
<p style="margin-bottom: 0cm;">2 eleman eklenir</p>
<p style="margin-bottom: 0cm;">2 eleman daha eklemek için 2 kopyalanır 2 eklenir: toplam 4 eklenmiş 2 kopyalanmıştır</p>
<p style="margin-bottom: 0cm;">4 eleman daha eklemek için 4 kopyalanır 4 eklenir: toplam 8 eklenmiş 6 kopyalanmıştır</p>
<p style="margin-bottom: 0cm;">8 eleman daha eklemek için 8 kopyalanır 8 eklenir: toplam 16 eklenmiş 15 kopyalanmıştır</p>
<p style="margin-bottom: 0cm;">Yukarıdaki gidişten anlaşılacağı üzere n ekleme için yaklaşık olarak n kopyalama yapılmaktadır. Yani limit alındığında ve eklenen elemanların sayısı sonsuza götürüldüğünde kopyalanan elemanların sayısı neredeyse eklenen elemanların sayısına eşit çıkacaktır. O halde her yeni eleman eklenmesinin maliyeti 1&#8242;e daha da yaklaşacaktır (n / n = 1 olduğu için)</p>
<p style="margin-bottom: 0cm;"><strong>Örnek : Binom Sırası (Binomial Queue)</strong></p>
<p style="margin-bottom: 0cm;">Farklı bir örnek olarak  <a href="http://www.bilgisayarkavramlari.com/2009/05/18/binom-agaclari-binom-trees-cift-termili-agaclar/">Binom Sırasına bakalım (binomial queue)</a>.</p>
<p style="margin-bottom: 0cm;">Öncelikle sıranın nasıl ilerlediğini hatırlayalım :</p>
<p style="margin-bottom: 0cm;">B0:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307337256_0_DrawObject_.gif" alt="DrawObject" /></p>
<p>B1:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307337256_1_DrawObject_.gif" alt="DrawObject" /></p>
<p>B2:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307337256_2_DrawObject_.gif" alt="DrawObject" /></p>
<p style="margin-bottom: 0cm;">B3:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307337256_3_DrawObject_.gif" alt="DrawObject" /></p>
<p style="margin-bottom: 0cm;">B4:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307337256_4_DrawObject_.gif" alt="DrawObject" /></p>
<p>Yukarıda görüldüğü üzere, her binom sırasında, o ana kadar olan sıraların tamamı içerilmektedir. Örneğin B4&#8242;ün kolları, sırasıyla B0, B1, B2, B3 ağaçlarını barındırmaktadır.</p>
<p style="margin-bottom: 0cm;">Bu durumda i. Terim için aşağıdakine benzer bir hesaplama sayısı gerekmektedir:</p>
<p style="margin-bottom: 0cm;">T(i) = T(i-1) + 2 – C</p>
<p style="margin-bottom: 0cm;">ve T(0) = 0</p>
<p style="margin-bottom: 0cm;">Yukarıdaki  <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">özyineli formülde (recursive function)</a> i. adım için T(i) adet ağaç gerekmektedir. Elbette bu sayı da T(i-1) ile gösterilen ve i. adım öncesinde bulunan ağaç sayısına 2-C eleman eklenerek bulunmaktadır. Bu denklemdeki C ile gösterilen değer, i. adımın maliyetini (bilgisayardaki hesaplama işlem maliyeti, hafıza maliyeti vs. ) göstermektedir.</p>
<p style="margin-bottom: 0cm;">Yukarıdaki işlemi biraz daha ilerletirsek :</p>
<p style="margin-bottom: 0cm;">C + T(i) &#8211; T(i-1) = 2</p>
<p style="margin-bottom: 0cm;">sonucunu bulur ve buradan bütün denklemleri yazıp toplarsak, n adet eleman için işlem maliyetini aşağıdaki şekilde bulabiliriz:</p>
<p style="margin-bottom: 0cm;">C <sub>1</sub> + T(1) &#8211; T(0) = 2</p>
<p style="margin-bottom: 0cm;">C <sub>2</sub> + T(2) &#8211; T(1) = 2</p>
<p style="margin-bottom: 0cm;">C  <sub>3</sub>+ T(3) &#8211; T(2) = 2</p>
<p style="margin-bottom: 0cm;">&#8230;</p>
<p style="margin-bottom: 0cm;">C  <sub>n-1</sub>+ T(n-1) &#8211; T(n-2) = 2</p>
<p style="margin-bottom: 0cm;">C <sub>n</sub> + T(n) &#8211; T(n-1) = 2</p>
<p style="margin-bottom: 0cm;">Yukarıdaki denklemlerin toplamı olarak:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: absmıddle;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1307337256_5__.gif" alt="" hspace="8" width="428" height="43" /></p>
<p style="margin-bottom: 0cm;">Ayrıca ilk denklem olarak T0 = 0 olduğunu biliyoruz çünkü binom ağacının ilk elemanı 0 çocuk sahibidir.</p>
<p style="margin-bottom: 0cm;">Dolayısıyla yukarıda bulduğumuz n eleman için 2n maliyeti bize yine itfa tahlili ile O(2n /n) = O(2) = O(1) sonucunu gösterir. Klasik bir en kötü durum analizi ile, bu hesaplamada, O(n) maliyet çıkaracaktık ancak amortize analiz bize burada bir adım ilerisini göstererek en kötü durumun tahlil edilmesinin aslında tek elemana bakılarak yapılamayacağını ve bütün elemanlar incelendiğinde aslında en kötü durumun o kadar da kötü olmadığını göstermektedir <img src='http://www.bilgisayarkavramlari.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="margin-bottom: 0cm;"><strong>Ortalama durum ile Amortize algoritma analizinin farkı.</strong></p>
<p style="margin-bottom: 0cm;">Bu anlamda  <a href="http://www.bilgisayarkavramlari.com/2010/06/17/karmasiklik-siniflari-complexity-classes/">ortalama durum analizinden (average case analysis)</a> ayrılmaktadır. Yani ortalama durum analizinde bütün ihtimallerden ortalama maliyette bir ihtimal üzerinden analiz yapılır. Bütün ihtimaller hesaplanarak ortalamaları bulunur. Amortisman analiz yönteminde ise hala en kötü durumu analiz etmekteyiz ancak analizi bir adım daha genişleterek en kötü durumun beklenenden daha iyi olduğunu ispatlıyoruz. Yukarıdaki iki örnek için de , yani  <a href="http://www.bilgisayarkavramlari.com/2009/05/18/binom-agaclari-binom-trees-cift-termili-agaclar/">binom yığıtı (binomial heap)</a> veya değişken boyutlu dizi (dynamic array) için de tek elemanın eklenmesi halinde yapılan en kötü durum analizinden daha iyi sonuçlar bulduk ancak bu sonuçlar hala en kötü durumda bulunacak sonuçlardır. Tek farkı en kötü durum analizinde tek bir elemana bakılmaktayken amortize algoritma analizinde olayın geneline baktık.</p>
<p style="margin-bottom: 0cm;"><strong>İtfa Tahlili Yöntemleri:</strong></p>
<p style="margin-bottom: 0cm;">İtfa tahlilinde kullanılan 3 klasik yöntem bulunmaktadır.</p>
<p style="margin-bottom: 0cm;"><em><strong>Münasebet tahlili (aggregate analysis).</strong></em> Bu tahlil yönteminde, n terim için olan maliyet, özyineli bir fonksiyon olarak yazılır, örneğin T(n) olarak isimlendirelim ve bu değer n terime bölünür, örneğin T(n) / n değeri olarak hesaplanır. Yukarıdaki örneklerden  <a href="http://www.bilgisayarkavramlari.com/2009/05/18/binom-agaclari-binom-trees-cift-termili-agaclar/">binom ağacı (binomial tree)</a> bu yöntemle tahlil edilmiştir.</p>
<p style="margin-bottom: 0cm;"><em><strong>Muhasebe tahlili (accounting analysis).</strong></em> Bu yöntemde, her ilave işlemin sisteme getirdiği yük anlık olarak hesaplanır. Örneğin n terimden sonra n+1 terim olduğunda ne kadar yükte değişiklik olacağı anlaşılmaya çalışılır. Sabit uzunlukta çalışma örnekleri alınarak sisteme getirdiği maliyete her elemanın etkisi ölçülür ve buradan n elemanlı bir çalışmaya maliyet genellemesi yapılır. Yukarıdaki örneklerden değişken boyutlu dizi (dynamic array) bu tahlile bir örnektir ve örnekte görüldüğü üzere 2,4,8,16 gibi çalışma uzunlukları alınarak bir genelleme yapılmıştır.</p>
<p style="margin-bottom: 0cm;"><em><strong>Kapasite tahlili (potential analysis).</strong></em> Bu yöntem, muhasebe tahlili ile tamamen aynıdır. Bu tahlil yönteminde de elemanlara bakılmak suretiyle genelleme yapılmaya çalışılır. Muhasebe tahlilinden tek farkı her elemanın sisteme yaptığı etkinin bir ödeme değil bir kapasite azalması olarak görülmesidir. Bu noktayı biraz açmak gerekirse:</p>
<p style="margin-bottom: 0cm;">Muhasebe tahlili ile kapasite tahlili aslında algoritma analizine muhasebe dünyasından girmiş yöntemlerdir. Muhasebede kullanılan ve bir birikim fonksiyonunu tahlil etmek için (debit function) kullanılan iki yaklaşımdan birisi, birikimi bir ödeme olarak görmek ve her adımda ödeme yapılmak suretiyle birikimi arttırmak iken ikincisi birikimi bir kapasite olarak görmek ve her adımda bu kapasiteyi azaltmak olarak görmektir.</p>
<p style="margin-bottom: 0cm;">Aslında ikisi de aynı değeri hesaplamaktadır ancak birincisi her adımda değerleri biriktirmekte, ikincisi ise başta birikimi hesaplayıp her adımda bu birikimi eksiltmektedir.</p>
<p style="margin-bottom: 0cm;">Yukarıdaki örneklerden değişken boyutlu diziyi (dynamic array) hatırlayacak olursak, bu dizideki maliyeti hesaplarken her elemanın sisteme etkisini bulmuştuk. Bazı elemanlar sisteme 1 etkisi yaparken bazı elemanlar n etkisi yapmıştı. Yani 2,4,8 gibi elemanlarda o ana kadar olan eleman kadar etki yapılmıştı. Ancak örneğin 1,3,5,6,7 gibi sayıların sisteme maliyeti 1 idi. Bu yaklaşım, muhasebe yaklaşımı olup, her elemanın sisteme artan miktardaki etkisi biriktirilmektedir.</p>
<p style="margin-bottom: 0cm;">Bu yaklaşımın tersi bir yorumla, ilk başta 2n maliyet getireceğini kabul edip (2n değerinde borç kredi aldığımızı kabul edin) her adımda bu değeri düşürmek (her adımın maliyetini kredimize geri ödeme olarak düşünüyor ve kredi borcumuzu kapatıyoruz) ise kapasite yaklaşımıdır (potential analysis).</p>
</div>

<p class="sayac_bilgi">327 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/06/06/amortized-algorithm-analysis-itfa-tahlili-amotize-algoritma-analizi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Macar Algoritması (Hungarian Algorithm)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/05/21/macar-algoritmasi-hungarian-algorithm/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/05/21/macar-algoritmasi-hungarian-algorithm/#comments</comments>
		<pubDate>Sat, 21 May 2011 20:04:50 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/?p=5688</guid>
		<description><![CDATA[Algoritma analizi konusunda geçen meşhur problemlerden eşleşme problemini çözmek için (matching problem, bazı kaynaklarda atama problemi (assignment problem) olarak da geçmektedir) macar araştırmacıların etkisi ile gelişen algoritmanın ismidir. Algoritmanın ulaşmak istediği amaç, azami eşleşmeye ulaşmaktır. Bu adımda azami eşeleşmeyi tanımlayalım. Eşleşme problemleri (matching) iki grup altında incelenebilir: ikili eşleşme (binary matching) Azami eşleşme (maximum matching) [...]]]></description>
			<content:encoded><![CDATA[<div>
<p style="margin-bottom: 0cm;">Algoritma analizi konusunda geçen meşhur problemlerden eşleşme problemini çözmek için (matching problem, bazı kaynaklarda atama problemi (assignment problem) olarak da geçmektedir) macar araştırmacıların etkisi ile gelişen algoritmanın ismidir.</p>
<p style="margin-bottom: 0cm;">Algoritmanın ulaşmak istediği amaç, azami eşleşmeye ulaşmaktır. Bu adımda azami eşeleşmeyi tanımlayalım.  <a href="http://www.bilgisayarkavramlari.com/2009/05/02/esleme-matching/">Eşleşme problemleri (matching)</a> iki grup altında incelenebilir:</p>
<ul>
<li>
<p style="margin-bottom: 0cm;">ikili eşleşme (binary matching)</p>
</li>
<li>
<p style="margin-bottom: 0cm;">Azami eşleşme (maximum matching)</p>
</li>
</ul>
<p style="margin-bottom: 0cm;">ilk gruptaki problemlerde iki üyenin eşleşmesi yeterlidir. Örneğin evlilik problemi gibi, en fazla kişinin evlendiği eşleşmeler veya bir arz / talep eşleşmesi gibi. Örneğin nehri geçmek isteyen kişilerin sallara atanması gibi en az kişinin açıkta kaldığı en fazla kişinin eşleştiği problemlerdir.</p>
<p style="margin-bottom: 0cm;">İkinci grup olan azami eşeleşme (maximum matching) problemleri ise bu yazının da konusu olan macar algoritması tarafından çözülmesi hedeflenen ve klasik eşleşmenin ötesinde, her eşleşmenin değer sahibi olduğu problemlerdir. Örneğin kişilerin iş bulması ama her işin ve kişinin farklı maaşlar alması halinde azami maaş (maximum maaş) değerine ulaşmak gibi. Yani sadece eşlemek yetmiyor bir de her eşlemeye bir skor verip bu değerin en fazla olmasını istiyoruz. Bu problemin tersten okunuşu ise asgari maliyettir. Yani aynı problemi bir şirket yöneticisi ele aldığında örneğin çalışanlarına en az maliyetle iş yaptırmak isteyecektir.</p>
<p style="margin-bottom: 0cm;">Problem ve macar algoritması (hungarian algorithm) daha iyi anlaşılsın diye bir örnek üzerinden anlatmaya çalışalım. Örneğin elimizde N adet çalışan ve N adet iş olsun ve her kişinin her işe atanması durumunda alacağı maaşları bir  <a href="http://www.bilgisayarkavramlari.com/2009/06/28/masfuf-matris-matrix/">masfufta (matrix)</a> göstermeye çalışalım:</p>
<p style="margin-bottom: 0cm;">&nbsp;</p>
<table style="width: 312px; height: 96px;" cellspacing="0" cellpadding="4">
<colgroup>
<col width="43*"></col>
<col width="43*"></col>
<col width="43*"></col>
<col width="43*"></col>
<col width="85*"></col>
</colgroup>
<tbody>
<tr valign="top">
<td style="border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">&nbsp;</td>
<td style="border: 1px solid #000000; padding: 0.1cm;" colspan="4" width="83%">İşler</td>
</tr>
<tr valign="top">
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" rowspan="4" width="17%">Çalışanlar</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">&nbsp;</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">A</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">B</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm;" width="33%">C</td>
</tr>
<tr valign="top">
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">S</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">5</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">2</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm;" width="33%">3</td>
</tr>
<tr valign="top">
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">Ş</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">6</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">1</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm;" width="33%">4</td>
</tr>
<tr valign="top">
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">T</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">4</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">4</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm;" width="33%">6</td>
</tr>
</tbody>
</table>
<p style="margin-bottom: 0cm;">&nbsp;</p>
<p style="margin-bottom: 0cm;">Yukarıdaki masfufta görüldüğü üzere 4 adet iş ve bu 4 iş için 4 adet çalışan atanmış, her hücrede ise ilgili çalışanın ilgili iş için alacağı ücret gösterilmiştir. Örneğin Ş çalışanının C işini yapması halinde 4 lira alacağını anlıyoruz.</p>
<p style="margin-bottom: 0cm;">Artık problem daha rahat anlaşılabilir. Amacımız yukarıdaki ücret değerlerine göre en düşük maaşlı işe atama olacaktır.</p>
<p style="margin-bottom: 0cm;">Problem masfuf olarak gösterilebileceği gibi bir  <a href="http://www.bilgisayarkavramlari.com/2008/08/01/graf-sekil-graph/">şekil (graph)</a> olarak da tasviri mümkündür:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1306008342_0__.png" border="0" alt="" width="489" height="340" /></p>
<p>Problem daha iyi anlaşılsın diye örnek bir çözümü ele alalım:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1306008342_1__.png" border="0" alt="" width="454" height="328" /></p>
<p>Yukarıdaki eşleşmede A-S , B-T ve C-Ş ataması yapılmıştır. Bunun maliyeti 5+4+4 = 13 olarak hesaplanabilir.</p>
<p style="margin-bottom: 0cm;">Elbette bu çözüm ihtimal havuzundakilerden sadece bir tanesidir. Basit bir olasılık hesabı ile 3&#215;3 boyutundaki bir masfuf için 3! ihtimal olduğu görülebilir. Örneğin A için 3 ihtimal B için kalan 2 ihtimal ve C için tek ihtimal bulunmaktadır. Aynı şekilde nxn boyutundaki bir eşleşme (matching) problemi için de n! ihtimal bulunacaktır.</p>
<p style="margin-bottom: 0cm;">Klasik bir algoritma kodlanması durumunda n! ihtimalin incelenmesi gerekeceğinden problemi np-zor (np-hard) olarak görebiliriz. Ancak macar algoritması bu problemi çok terimli zamana (polinom, polynomial) indirgeyebilmektedir. Bu anlamda problem  <a href="http://www.bilgisayarkavramlari.com/2008/03/24/belirsiz-cokterimli-tam-np-complete-nondeterministic-polynomial-complete/">np-tam (np-complete)</a> olarak görülebilir.</p>
<p style="margin-bottom: 0cm;">Gelelim problemin çözümüne. Problem, yukarıdaki şekilden den görüleceği gibi  <a href="http://www.bilgisayarkavramlari.com/2009/05/01/iki-parcali-graflar-bipartite-graphs/">iki parçalı grafiğin (bipartite graph)</a> doğru oluşturulması ile çözülebilmektedir.</p>
<p style="margin-bottom: 0cm;">Algoritma 3 adımdan oluşmaktadır.</p>
<ol>
<li>
<p style="margin-bottom: 0cm;">adımda 0-ağırlıkta kenarlar oluşturuyoruz (0-weighted edges) bunun için işler kısmında bakarak en düşük değerdeki kenarın ağırlığını diğer kenarlardan çıkarıyoruz ve benzer şekilde kişiler tarafından bakıp en düşük değerdeki kenarın ağırlığını diğer kenarlardan çıkarıyoruz.</p>
<p style="margin-bottom: 0cm;">Bu aşama aslında problemin yapısını değiştirmemektedir. Örnek problemimize bu adımı uygulayarak durumu görelim:</p>
</li>
</ol>
<p style="margin-bottom: 0cm;">&nbsp;</p>
<table style="width: 372px; height: 96px;" cellspacing="0" cellpadding="4">
<colgroup>
<col width="43*"></col>
<col width="43*"></col>
<col width="43*"></col>
<col width="43*"></col>
<col width="85*"></col>
</colgroup>
<tbody>
<tr valign="top">
<td style="border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">&nbsp;</td>
<td style="border: 1px solid #000000; padding: 0.1cm;" colspan="4" width="83%">İşler</td>
</tr>
<tr valign="top">
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" rowspan="4" width="17%">Çalışanlar</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">&nbsp;</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">A</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">B</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm;" width="33%">C</td>
</tr>
<tr valign="top">
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">S</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">5-4</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">2-1</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm;" width="33%">3-3</td>
</tr>
<tr valign="top">
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">Ş</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">6-4</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">1-1</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm;" width="33%">4-3</td>
</tr>
<tr valign="top">
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">T</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">4-4</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">4-1</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm;" width="33%">6-3</td>
</tr>
</tbody>
</table>
<p style="margin-bottom: 0cm;">Yukarıdaki masfufta görüldüğü üzere A için en düşük değer olan 4, B için en düşük değer olan 1 ve C için en düşük değer olan 3 bütün değerlerden çıkarılmış ve aşağıdaki  <a href="http://www.bilgisayarkavramlari.com/2009/06/28/masfuf-matris-matrix/">masfuf</a> elde edilmiştir:</p>
<p style="margin-bottom: 0cm;">&nbsp;</p>
<table style="width: 403px; height: 96px;" cellspacing="0" cellpadding="4">
<colgroup>
<col width="43*"></col>
<col width="43*"></col>
<col width="43*"></col>
<col width="43*"></col>
<col width="85*"></col>
</colgroup>
<tbody>
<tr valign="top">
<td style="border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">&nbsp;</td>
<td style="border: 1px solid #000000; padding: 0.1cm;" colspan="4" width="83%">İşler</td>
</tr>
<tr valign="top">
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" rowspan="4" width="17%">Çalışanlar</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">&nbsp;</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">A</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">B</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm;" width="33%">C</td>
</tr>
<tr valign="top">
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">S</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">1</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">1</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm;" width="33%">0</td>
</tr>
<tr valign="top">
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">Ş</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">2</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">0</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm;" width="33%">1</td>
</tr>
<tr valign="top">
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">T</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">0</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">3</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm;" width="33%">3</td>
</tr>
</tbody>
</table>
<p style="margin-bottom: 0cm;">Şimdi çalışanlar açısından olaya bakıp en düşük değerleri çıkaralım:</p>
<table style="width: 349px; height: 96px;" cellspacing="0" cellpadding="4">
<colgroup>
<col width="43*"></col>
<col width="43*"></col>
<col width="43*"></col>
<col width="43*"></col>
<col width="85*"></col>
</colgroup>
<tbody>
<tr valign="top">
<td style="border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">&nbsp;</td>
<td style="border: 1px solid #000000; padding: 0.1cm;" colspan="4" width="83%">İşler</td>
</tr>
<tr valign="top">
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" rowspan="4" width="17%">Çalışanlar</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">&nbsp;</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">A</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">B</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm;" width="33%">C</td>
</tr>
<tr valign="top">
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">S</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">1</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">1</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm;" width="33%">0</td>
</tr>
<tr valign="top">
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">Ş</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">2</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">0</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm;" width="33%">1</td>
</tr>
<tr valign="top">
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">T</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">0</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm;" width="17%">3</td>
<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm;" width="33%">3</td>
</tr>
</tbody>
</table>
<p style="margin-bottom: 0cm;">Masfufta bir değişiklik olmadı çünkü her çalışan için en düşük değer 0 idi. Ancak bu durum farklı örneklerde değişebilir. Şayet çalışanların ücretlerinde 0&#8242;dan büyük değer bulunursa bu değerlerin en küçüğü satır bazlı olarak bütün satırdan çıkarılacaktır.</p>
<p style="margin-bottom: 0cm;">Daha iyi anlaşılması için yukarıdaki masfufun  <a href="http://www.bilgisayarkavramlari.com/2008/08/01/graf-sekil-graph/">şekil halini</a> aşağıda verelim:</p>
<p><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1306008342_2__.png" border="0" alt="" width="459" height="333" /></p>
<ol>
<li>
<p style="margin-bottom: 0cm;">Yukarıdaki yeni şekilde 0-ağırlığındaki düğümleri kullanarak eşleme yapıyoruz. Bu adımda azami akış (max-flow) veya  <a href="http://www.bilgisayarkavramlari.com/2009/05/02/esleme-matching/%20">dalgalı yol bulma (augmented path</a>) algoritmaları gibi algoritmalardan istifade edebiliriz.</p>
<p style="margin-bottom: 0cm;">Eşleşme sonucu şayet  <a href="http://www.bilgisayarkavramlari.com/2009/05/02/esleme-matching/%20">mükemmel eşleşme ise (perfect matching</a>) problem çözülmüştür. Şayet mükemmel eşleşme sağlanamazsa, sadece 0-ağırlığındaki kenarları kullanarak en düşük toplam değere sahip alt şekli (subgraph) buluyoruz.</p>
</li>
<li>
<p style="margin-bottom: 0cm;">Adımdan, problem çözülene kadar 2. adıma dönüyoruz.</p>
</li>
</ol>
<p style="margin-bottom: 0cm;">Problemimize dönüp 2. adımı uygulayalım. 0-ağırlığına sahip kenarların değerleri aşağıda verilmiştir:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1306008342_3__.png" border="0" alt="" width="466" height="334" /></p>
<p>Yukarıdaki şekilde bulunan en düşük maliyetli atamadır. Bu atama A-T , S-C ve Ş-B şeklindedir ve Orijinal değerleri hatırlanacak olursa, 4+3+1 = 8 olarak hesaplanabilir. İddiamız, bu şekilde daha düşük maliyetli bir atama yapılamayacağıdır.</p></div>

<p class="sayac_bilgi">569 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/05/21/macar-algoritmasi-hungarian-algorithm/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Çemberi bölen doğrular problemi</title>
		<link>http://www.bilgisayarkavramlari.com/2011/05/17/cemberi-bolen-dogrular-problemi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/05/17/cemberi-bolen-dogrular-problemi/#comments</comments>
		<pubDate>Tue, 17 May 2011 15:42:03 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[Bilgisayar Matematiği]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/05/17/cemberi-bolen-dogrular-problemi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, özyineli problemlere bir örnek vermek ve nasıl çözüldüğünü anlatmaktır. Problemimiz oldukça meşhur olan bir çemberin doğrular tarafından bölünmesidir. Kabaca, bir çemberi 20 adet doğrunun en fazla kaç alana ayırabileceğini soralım. Örneğin n=0 için alan sayımız 1&#8242;dir: Bir doğru ile çemberi kestiğimizde iki alan çıkar: ikinci bir doğru [...]]]></description>
			<content:encoded><![CDATA[<div>
<p style="margin-bottom: 0cm;">Yazan : Şadi Evren ŞEKER</p>
<p style="margin-bottom: 0cm;">Bu yazının amacı,  <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">özyineli problemlere</a> bir örnek vermek ve nasıl çözüldüğünü anlatmaktır. Problemimiz oldukça meşhur olan bir çemberin doğrular tarafından bölünmesidir.</p>
<p style="margin-bottom: 0cm;">Kabaca, bir çemberi 20 adet doğrunun en fazla kaç alana ayırabileceğini soralım.</p>
<p style="margin-bottom: 0cm;">Örneğin n=0 için alan sayımız 1&#8242;dir:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1305646968_0_DrawObject_.gif" alt="DrawObject" /></p>
<p>Bir doğru ile çemberi kestiğimizde iki alan çıkar:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1305646968_1_DrawObject_.gif" alt="DrawObject" /></p>
<p>ikinci bir doğru eklendiğinde 3 alan çıkmaktadır:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1305646968_2_DrawObject_.gif" alt="DrawObject" /></p>
<p>3 doğru için 7 alan bulunur:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1305646968_3_DrawObject_.gif" alt="DrawObject" /></p>
<p>4 doğru için 11 alan bulunur:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: left;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1305646968_4_DrawObject_.gif" alt="DrawObject" /></p>
<p>Şimdi yukarıdaki bulunan değerleri liste halinde yazalım:</p>
<p style="margin-bottom: 0cm;">0 1</p>
<p style="margin-bottom: 0cm;">1 2</p>
<p style="margin-bottom: 0cm;">2 3</p>
<p style="margin-bottom: 0cm;">3 7</p>
<p style="margin-bottom: 0cm;">4 11</p>
<p style="margin-bottom: 0cm;">Buradaki sayılardan çıkan bağlantı, her adımda, bir önceki değere adım değerinin eklenmesidir. Örneğin 4. adım, bir önceki adımdaki değer olan 7+4 = 11 şeklinde bulunmuştur.</p>
<p style="margin-bottom: 0cm;">Bu ağlantı aşağıdaki şekilde formülize edilebilir:</p>
<p style="margin-bottom: 0cm;">f(n) = n + f(n-1)</p>
<p style="margin-bottom: 0cm;">Görüldüğü üzere bu denklem  <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">özyineli bir denklemdir (recursive equation).</a></p>
<p style="margin-bottom: 0cm;">Şimdi bu özyineli denklemi çözmeye çalışalım. Bu tip denklemlerin çözümü için iki alternatif bulunur. Aslında ikisi de sonuçta aynı şeyi bulmayı amaçlar.</p>
<ul>
<li>
<p style="margin-bottom: 0cm;">Top Down Approach (Yukarıdan Aşağıya Yaklaşım)</p>
</li>
<li>
<p style="margin-bottom: 0cm;">Bottom Up Approach (Aşağıdan Yukarıya Yaklaşım)</p>
</li>
</ul>
<p style="margin-bottom: 0cm;">Denklemimizi önce Yukarıdan aşağıya yaklaşımla açalım:</p>
<p style="margin-bottom: 0cm;">f(n) = n + f(n-1)</p>
<p style="margin-bottom: 0cm;">f(n-1) = n-1 + f(n-2)</p>
<p style="margin-bottom: 0cm;">f(n-2) = n-2 + f(n-3)</p>
<p style="margin-bottom: 0cm;">&#8230;</p>
<p style="margin-bottom: 0cm;">f(1) = 2</p>
<p style="margin-bottom: 0cm;">f(0) = 1</p>
<p style="margin-bottom: 0cm;">Yukarıdaki ilk üç denklemi birbiri cinsinden yazalım:</p>
<p style="margin-bottom: 0cm;">f(n) = n + n-1 + n-2 + f(n-3)</p>
<p style="margin-bottom: 0cm;">Buna göre denklemin tamamı açıldığında aşağıdaki gibi bir bağlantı görülebilir:</p>
<p style="margin-bottom: 0cm;">f(n) = n + n-1 + n-2 + n-3 &#8230; + f(1)</p>
<p style="margin-bottom: 0cm;">Bu denklemi matematiksel olarak aşağıdaki şekilde gösterebiliriz:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: absmıddle;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1305646968_5__.gif" alt="" hspace="8" width="211" height="43" /></p>
<p style="margin-bottom: 0cm;">Bu denklem de oldukça meşhur olan 1&#8242;den n&#8217;e kadar olan sayıların toplamı şeklinde düşünülebilir:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: absmıddle;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1305646968_6__.gif" alt="" hspace="8" width="137" height="39" /></p>
<p style="margin-bottom: 0cm;">Aynı problemi bu defa aşağıdan yukarıya yaklaşımla çözelim (bottom up approach):</p>
<p style="margin-bottom: 0cm;">f(0)= 1</p>
<p style="margin-bottom: 0cm;">f(1) = 2</p>
<p style="margin-bottom: 0cm;">f(2) = 3</p>
<p style="margin-bottom: 0cm;">f(4) = 7</p>
<p style="margin-bottom: 0cm;">f(5) = 11</p>
<p style="margin-bottom: 0cm;">&#8230;</p>
<p style="margin-bottom: 0cm;">Buradaki denklemleri birbiri cinsinden yazıyoruz:</p>
<p style="margin-bottom: 0cm;">f(0) = 1</p>
<p style="margin-bottom: 0cm;">f(1) = 1 + f(0)</p>
<p style="margin-bottom: 0cm;">f(2) = 2 + f(1)</p>
<p style="margin-bottom: 0cm;">f(3) = 3 + f(2)</p>
<p style="margin-bottom: 0cm;">f(4) = 4 + f(3)</p>
<p style="margin-bottom: 0cm;">f(5) = 5 + f(4)</p>
<p style="margin-bottom: 0cm;">&#8230;</p>
<p style="margin-bottom: 0cm;">şeklinde yazdıktan sonra, son terimi çekelim:</p>
<p style="margin-bottom: 0cm;">f(5) = 5 + 4 + 3 + 2 + 1 + 1</p>
<p style="margin-bottom: 0cm;">Buradan çıkan netice ise bir önceki yöntemde elde ettiğimiz netice ile aynıdır.</p>
<p style="margin-bottom: 0cm;">f(n) = n + n-1 + n-2 &#8230; 5 + 4 + 3 + 2 + 1 + 1</p>
<p style="margin-bottom: 0cm;">dolayısıyla aynı denklemi yazabiliriz:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: absmıddle;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1305646968_7__.gif" alt="" hspace="8" width="211" height="43" /></p>
<p style="margin-bottom: 0cm;">ve sonuç olarak aşağıdaki hesap doğrudur:</p>
<p style="margin-bottom: 0cm;"><img style="text-align: absmıddle;" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/sbres_1305646968_8__.gif" alt="" hspace="8" width="137" height="39" /></p>
<p style="margin-bottom: 0cm;">Yukarıdaki denklemleri elde ettikten sonra, bize ilk başta sorulan acaba 20 adet doğru olsaydı en fazla kaç alana bölünebilirdi sorusuna cevap bulabiliriz:</p>
</div>

<p class="sayac_bilgi">203 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/05/17/cemberi-bolen-dogrular-problemi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Algoritma (Algorithm)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/04/25/algoritma-algorithm/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/04/25/algoritma-algorithm/#comments</comments>
		<pubDate>Mon, 25 Apr 2011 18:23:52 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[bilgisayar felsefesi]]></category>
		<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/04/25/algoritma-algorithm/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bazan biz insanlar için çok kullanılan kelimeler, tanımlanması en güç kelimeler haline dönüşebiliyor. Algoritma da sanırım bilgisayar bilimleri için benzer özellikte olan bir kelime. Sanırım bu kelimeyi tanımlarken &#8220;bir dizi matematiksel adım&#8221; ifadesini kullanmak yerinde olur. Bütün algoritmalar, matematiksel olarak ispatlanabilen ve dizilimi kesinlikle önem taşıyan ve bir metot anlatmasıdır. [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Bazan biz insanlar için çok kullanılan kelimeler, tanımlanması en güç kelimeler haline dönüşebiliyor. Algoritma da sanırım bilgisayar bilimleri için benzer özellikte olan bir kelime.
</p>
<p>Sanırım bu kelimeyi tanımlarken &#8220;bir dizi matematiksel adım&#8221; ifadesini kullanmak yerinde olur.
</p>
<p>Bütün algoritmalar, matematiksel olarak ispatlanabilen ve dizilimi kesinlikle önem taşıyan ve bir metot anlatmasıdır.
</p>
<p>Aslında bir kelimeyi başka bir kelime ile ifade etmek bir hatadır. Şayet iki kelime aynı şeyi anlatıyorsa, o zaman bir tanesi fazla demektir ama genelde algoritma için bu &#8220;metot&#8221; veya &#8220;sistem&#8221; kelimeleri sıkça kullanılıyor. Oysaki algoritma bunlardan farklı olarak bir, matematiksel bir dizilimdir. Evet, bir problemi çözmek için gerek metodu anlatır bu çözümde kullanılan sistemi gösterir ama atlanmaması gereken ispat edilebilirlik, karmaşıklığının ölçülebilirliği aslında bilgisayar bilimlerinin de temelini oluşturur.
</p>
<p>Bu durumu bir örnek üzerinden açıklamaya çalışalım.
</p>
<p>Örneğin sık kullanılan <a href="http://www.bilgisayarkavramlari.com/2008/08/09/siralama-algoritmalari-sorting-algorithms/">sıralama problemini (sorting problem)</a> ele alalım. Elimizde bir dizi karıştırılmış sayı var ve biz bunları küçükten büyüğe doğru sıralamak istiyoruz. Bu durumda birisinin çıkıp ben bunları sıraladım demesi bir algoritma olmaz. Çünkü algoritmanın sistematik olarak probleme yaklaşması gerekir.
</p>
<p>Ben bunları sıralayan bir sistem yaptım demesi de algoritma olmaz. Çünkü sistemin bütün adımlarını belirli olması ve analiz edilebilir olması gerekir.
</p>
<p>Ben bunları sıralayan ve şu adımlardan oluşan bir sistem yaptım demesi de yeterli olmaz çünkü bu algoritmanın her durumda çalışacağının matematiksel olarak ispatlanabilmesi gerekir.
</p>
<p>Ancak bu aşamadan sonra bir algoritmadan bahsediyoruz demektir ve tam da bu aşamadan sonra artık algoritmanın performansından bahsetmeye başlar ve algoritmamızın hafıza ve zaman ihtiyaçlarını ölçebilmeyi isteriz.
</p>
<p>Yukarıdaki bütün bu tanımların yanında, bir algoritma elde ettikten sonra ayrıca bu algoritmanın uygulanabilir oluşu da tartışmaya açıktır. Örneğin geliştirilen algoritma, günümüz bilgisayarları için uygulanabilir olmayabilir. Bu durum algoritmamızı , algoritma olmakta çıkarmaz ancak uygulanamaz bir hale sokar (örneğin şu anda yeni yeni gelişen kuantum hesaplama algoritmaları buna birer örnek olabilir).
</p>
<p>Ayrıca algoritmaların yaklaşımlarına göre sınıflandırılması da mümkündür. Hatta bu sınıflandırmaya uygun olarak algoritma geliştirilme metodolojileri de bulunmaktadır. Örneğin <a href="http://www.bilgisayarkavramlari.com/2007/04/14/nesne-yonelimli-programlama-object-oriented-programming/">nesne yönelimli programlama (object oriented programming)</a> , <a href="http://www.bilgisayarkavramlari.com/2007/12/18/yapisal-programlama-structured-programming/">yapısal programlama (structured programming)</a> veya <a href="http://www.bilgisayarkavramlari.com/2007/12/18/fonksiyonel-programlama-procedural-programming-functional-programming/">fonksiyonel programlama (functional programming)</a> , <a href="http://www.bilgisayarkavramlari.com/2009/11/16/emirli-programlama-imperative-programming/">Emirli programlama (Imperative Programing)</a>, <a href="http://www.bilgisayarkavramlari.com/2007/12/18/otomat-yonelimli-programlama-automata-based-programming/">özdevinirli programlama (automat based programming)</a> gibi.</p>

<p class="sayac_bilgi">566 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/04/25/algoritma-algorithm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Post Karşılık Problemi (Post Correspondence Problem)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/04/23/post-karsilik-problemi-post-correspondence-problem/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/04/23/post-karsilik-problemi-post-correspondence-problem/#comments</comments>
		<pubDate>Sat, 23 Apr 2011 15:16:42 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[Automata (otomatlar, özdevinirler)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/04/23/post-karsilik-problemi-post-correspondence-problem/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Emil Post tarafından 1946 yılında ortaya atılan ve belirsiz karar problemi olarak sınıflandırılabilecek olan (undecidable decision problem) problemin ismidir. Literatürde kısaca PCP olarak da geçmektedir. Bu problem, yine Emil Post tarafından geliştirilen, Post Makinesi (post machine) olarak bilinen ve Turing makinesinin (Turing Machine) bir benzeri olan makinenin geliştirilmesini sağlamıştır. Problem, [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Emil Post tarafından 1946 yılında ortaya atılan ve belirsiz karar problemi olarak sınıflandırılabilecek olan (undecidable decision problem) problemin ismidir. Literatürde kısaca PCP olarak da geçmektedir. Bu problem, yine Emil Post tarafından geliştirilen, <a href="http://www.bilgisayarkavramlari.com/2011/04/25/emil-post-makinesi/">Post Makinesi (post machine)</a> olarak bilinen ve <a href="http://www.bilgisayarkavramlari.com/2009/06/27/turing-makinesi-turing-machine/">Turing makinesinin (Turing Machine)</a> bir benzeri olan makinenin geliştirilmesini sağlamıştır. Problem, <a href="http://www.bilgisayarkavramlari.com/2008/11/12/durma-problemi-halting-problem/">durma problemine göre (halting problem)</a> daha basit bir yapıdadır bu yüzden belirsiz karar problemlerinin ispatlanmasında daha çok tercih edilir.</p>
<p>Problem aşağıdaki şekilde tanımlanabilir.</p>
<p>A bir alfabe olmak üzere, bu alfabeden tanımlı olan n elemanlı iki küme ele alalım:</p>
<p>X = {x<sub>1</sub>,x<sub>2</sub>, … x<sub>n</sub> }</p>
<p>Y = {y<sub>1</sub>,y<sub>2</sub>, … y<sub>n</sub>}</p>
<p>Bu iki küme üzerinden üretilen iki kelimenin eşit olması durumunu arıyoruz.</p>
<p>Örneğin aşağıdaki kümeleri ele alalım:</p>
<p>X = { sad , sek , er, i}</p>
<p>Y = { sa , se, ker , di }</p>
<p>Yukarıdaki örnek kümeler için böyle bir eşitlik bulunabilir:</p>
<p>sad + i + se + ker = sadiseker = sa + di + se + ker</p>
<p>Yukarıdaki eşitliğin sol tarafı X kümesinde, sağ tarafı ise Y kümesinden üretilmiştir.</p>
<p>Bazı problemler çözümsüz, bazı problemler ise birden fazla çözüme sahip olabilir. Örneğin aşağıdaki kümeleri ele alalım:</p>
<p>X= {a,ab,bba}</p>
<p>Y= { baa, aa, bb}</p>
<p>Çözüm aşağıdaki şekilde olabilir:</p>
<p><span style="font-family: Times New Roman; font-size: 12pt;"><em>bba</em> + <em>ab</em> + <em>bba</em> + <em>a</em> = <em>bbaabbbaa</em> = <em>bb</em> + <em>aa</em> + <em>bb</em> + <em>baa</em></span></p>
<p>Ancak bu tek çözüm değildir. Örneğin aşağıdaki de bir çözüm üretebilir:</p>
<p><span style="font-family: Times New Roman; font-size: 12pt;"><em>bba</em> + <em>ab</em> + <em>bba</em> + <em>a</em> + <em>bba</em> + <em>ab</em> + <em>bba</em> + <em>a</em> = <em>bbaabbbaabbaabbbaa</em> = <em>bb</em> + <em>aa</em> + <em>bb</em> + <em>baa + bb</em> + <em>aa</em> + <em>bb</em> + <em>baa</em></span></p>
<p>Yukarıdaki ikinci çözüm, bir önceki çözümün tekrarı niteliğindedir. Yani üretilen eşitlik dizilimi bir önceki çözümün iki kere tekrarlanması ile oluşturulmuştur. Bu işlem istenildiği kadar tekrar edilebilir.</p>
<p>Örneğin yukarıdaki kümelerin ilk elemanları çıkarılarak aşağıdaki kümeler oluşturulsaydı</p>
<p>X= {ab,bba}</p>
<p>Y= { aa, bb}</p>
<p>Bu kümelerden elde edilen bir çözüm bulunamazdı.</p>

<p class="sayac_bilgi">141 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/04/23/post-karsilik-problemi-post-correspondence-problem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

