<?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; veri yapıları</title>
	<atom:link href="http://www.bilgisayarkavramlari.com/category/veri-yapilari/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">73 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>Yinelemeli Derinlik Araması (Iterative Deepining Search)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/11/08/yinelemeli-derinlik-aramasi-iterative-deepining-search/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/11/08/yinelemeli-derinlik-aramasi-iterative-deepining-search/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 17:12:13 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[yapay zeka (artificial intelligence)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/?p=5983</guid>
		<description><![CDATA[Yazan :Şadi Evren ŞEKER Bilgisayar bilimlerinin çeşitli alanlarında (örneğin yapay zeka, veri yapıları veya şekil kuramı (graph theory) gibi) kullanılan arama algoritmalarından birsidir. &#160; Algoritma, derin öncelikli drama (depth first search) üzerine kurulu olduğu için, literatürde &#8220;iterative deepening depth first search (yinelemeli derinleşen, derin öncelikli arama)&#8221; olarak da geçmektedir. &#160; Algoritma basitçe derinlik değerini bir [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan :Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerinin çeşitli alanlarında (örneğin yapay zeka, veri yapıları veya şekil kuramı (graph theory) gibi) kullanılan arama algoritmalarından birsidir.</p>
<p>&nbsp;</p>
<p>Algoritma, <a href="http://www.bilgisayarkavramlari.com/2008/11/13/derin-oncelikli-arama-depth-first-search/">derin öncelikli drama (depth first search) </a>üzerine kurulu olduğu için, literatürde &#8220;iterative deepening depth first search (yinelemeli derinleşen, derin öncelikli arama)&#8221; olarak da geçmektedir.</p>
<p>&nbsp;</p>
<p>Algoritma basitçe derinlik değerini bir değişkende tutmakta ve bu değeri her adımda arttırmaktadır.<br />
Yineleme yapısı (iteration) basit bir döngü (loop) olarak düşünülebilir ve her adımda derinliğin, bir döngü değişkeni (loop variable) gibi düşünülerek derinleştiği kabul edilebilir.</p>
<p>&nbsp;</p>
<p>Örneğin aşağıdaki şekli (graph) ele alalım:</p>
<p>&nbsp;</p>
<p><img title="cyclictree.png" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/cyclictree.png" alt="Cyclictree" width="361" height="221" border="0" /></p>
<p>Ağaçta görüldüğü üzere iki adet <a href="http://www.bilgisayarkavramlari.com/2008/08/01/basit-dongu-simple-cycle/">döngü (cycle)</a> bulunmaktadır. Iterative Deepening search algoritmasını bu ağaç üzerinde çalıştıracak olursak, algoritma öncelikle derinlik değerini (bundan sonra d değişkeni (variable) ile ifade edilecektir) 0&#8242;dan başlatarak her adımda bir ilerletecektir.</p>
<p>d=0 için arama:<br />
A<br />
d=1 için arama:<br />
A (tekrar A değerine bakar) B C (sanki ağacın en üstteki üç düğümü, şekilde gösterildiği gibi bağlanmış kabul edilebilir, daha alttaki derinliklerde bulunan DEFG düğümlerine hiç bakamaz)<br />
d=2 için arama:<br />
A B D E C F G (Bu aramada sanki sondaki daireler (cycle) bulunmuyormuş gibi kabul edilebilir, çünkü belirtilen derinlik bu dairelere kadar inemez)<br />
d=3 için arama:<br />
A B D B E C F G A<br />
d=4 için arama:<br />
A B D B D E B C F G A B C</p>
<p>Yukarıdaki arma işlemi, derinlik arttıkça devam etmektedir.</p>
<p>&nbsp;</p>
<p>Arama algoritmalarının değerlendirildiği bazı kriterler bulunmaktadır. Buna göre IDDFS (iterative deepening depth first search) algoriması &#8220;tam&#8221; algoritma olarak kabul edilebilir.<br />
<strong>Tamlık teriminin (completeness)</strong> anlamı aşağıdaki şekilde tanımlanabilir:</p>
<p>Bir arama algoritması, bütün düğümleri dolaşarak aranan düğümü bulmayı garanti ediyorsa bu algoritmaya tam arama algoritması ismi verilir.</p>
<p>Örneğin yine yukarıdaki şekil için klasik derin öncelikli arama (depth first search) algoritmasını ele alsaydık, bu algoritmanın tam olmadığını söyleyebilirdik. Bunun sebebi DFS algoritmasının dolaşması sırasında, aşağıdaki döngüye girmesidir:</p>
<p>A B D B D B D ( B D ikilisi sosuza kadar tekrar eder)</p>
<p>Kısacası A B D düğümleri dışındaki düğümlere asla bakmaz. Bu anlamda tam olmadığını söyleyebiliriz.</p>
<p><a href="http://www.bilgisayarkavramlari.com/2008/11/13/sig-oncelikli-arama-breadth-first-search/">BFS (breadth first search , yayılma öncelikli veya sığ öncelikli arama)</a> algoritması ise her zaman için tam kabul edilebilir, sebebi bir sonraki derinlik seviyesine inmeden önce, bulunduğu seviyedeki düğümleri bitirmesi ve bu sayede bütün ağaca bakmayı garanti etmesidir.</p>
<p><strong>Algoritmanın karmaşıklığına</strong> değinecek olursak. Aşağıdaki şekilde bir formül ile karşılaşırız.</p>
<p><img title="iddscompleks.png" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/iddscompleks.png" alt="Iddscompleks" width="454" height="27" border="0" /></p>
<p>Bu formülde görülen terimler şekil kuramında (graph theory) sıkça kullanılan bazı değerlere atıfta bulunur.<br />
d değerinin derinlik olduğunu daha önce belirtmiştik. b ile gösterilen değer ise dallanma katasyısıdır (branching factor).</p>
<p>Kısaca her<a href="http://www.bilgisayarkavramlari.com/2009/06/18/dugum-derecesi-order-of-node/"> düğümün kaç çocuğu olduğu (out order, kaç düğüme gidilebildiği)</a> olarak tutulur. Örneğin tam dolu <a href="http://www.bilgisayarkavramlari.com/2008/05/07/ikili-arama-agaci-binary-search-tree/">ikili arama ağacının (binary search tree)</a> b değeri 2&#8242;dir. Genelde en kötü durum analizinde bütün çocukların dolu olması ihtimali üzerinde durulur. Ayrıca istatistiksel olarak ortalamam çocuk sayısının da alındığı olur. Örneğin şehirlerin tutulduğu bir şekilde, her şehirden gidilebilecek şehir sayısı değişmektedir. Bu durumda b değeri ortalama değer olarak hesaplanabilir.</p>
<p>&nbsp;</p>
<p>Bu açıklama ardından yukarıdaki denkleme tekrar bakarak anlamaya çalışalım.</p>
<p>&nbsp;</p>
<p>IDDFS algoritmasında, en altta bulunan düğümlerin 1 kere (d sabitlendiğinde en altta kalan düğümler hangileri ise) dolaşıldığını, d-1 derinliğindeki düğümlerin ise 2 kere dolaşıldığını ve böylece <a href="http://www.bilgisayarkavramlari.com/2008/05/07/agaclar-tree/">kök düğüme (root)</a> kadar her düğümün, bulunduğu seviyeye göre kaç kere dolaşıldığını hesaplayabileceğimize göre yukarıdaki denklem çıkarılabilir.</p>
<p>&nbsp;</p>
<p>Diğer bir deyişle d=0 için kök 1 kere dolaşılırken d=1 olduğunda kök 2 ve kökün çocukları 1 kere dolaşılmış olur. d=3 olduğunda kök 3 kere ve çocukları 2 ve en alttaki çocuklar ise 1 kere dolaşılmış olur. Görüldüğü üzere derinliğin her artışında kök derinlik kadar altındaki her düğüm ise birer azalarak en nihayetinde<a href="http://www.bilgisayarkavramlari.com/2008/05/07/agaclar-tree/"> yapraklar (leaf)</a> tek bir kere dolaşılmış olmaktadır.</p>
<p>&nbsp;</p>
<p>Sonuç olarak Yukarıdaki formülün ilk terimi kök (d+1)1 (tek düğüm d+1 kere dolaşılmıştır) , ikinci terimi kökün çocukları (db (kökün çocukları (ki sayısı b&#8217;dir) derinlik kadar (ki d ile gösterilir) dolaşılmıştır).</p>
<p>&nbsp;</p>
<p>Yukarıdaki bu formülü daha toplu şekilde aşağıda gösterildiği gibi yazabiliriz:<br />
<img title="iddskompleks2.png" src="http://www.bilgisayarkavramlari.com/wp-content/uploads/iddskompleks2.png" alt="Iddskompleks2" width="132" height="62" border="0" /></p>
<p>&nbsp;</p>
<p>Algoritmanın dolaşma (arama) zamanı karmaşıklığı yukarıda gösterildiği gibidir. Terimler birleştirildiğinde<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>için O(b<sup>d</sup>) gösterimi kullanılabilir.</p>
<p>&nbsp;</p>
<p>Hafıza karmaşıklığı ise O(bd) olarak ifade edilebilir. Bunun sebebi d derinliğindeki bir ağacın her seviyesinde b adet çocuğu bulunması durumunda bd kadar düğüm olacağıdır. Algoritma, çalışması sırasında ilave düğümlere ihtiyaç duymaz ve şeklin kendisi üzerinde dolaşarak sonuca ulaşır.</p>

<p class="sayac_bilgi">387 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/11/08/yinelemeli-derinlik-aramasi-iterative-deepining-search/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Labirentte yol bulma kodu</title>
		<link>http://www.bilgisayarkavramlari.com/2011/11/04/labirentte-yol-bulma-kodu/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/11/04/labirentte-yol-bulma-kodu/#comments</comments>
		<pubDate>Thu, 03 Nov 2011 21:12:29 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[yapay zeka (artificial intelligence)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/11/04/labirentte-yol-bulma-kodu/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, geri izleme algoritmasının (backtracking algorithm) bir uygulaması olarak, basit bir labirentte yol bulma kodunu JAVA dilinde kodlamaktır. Bu uygulamada herhangi bir yapay zeka yönetmi uygulanmayacaktır. Basitçe kör arama (blind search) yapan ve ihtimalleri sırayla deneyen bir robot uygulaması geliştirilecektir. Örneğin labirent bilgisinin bir dosyada bulunduğunu ve bizim [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bu yazının amacı, <a href="http://www.bilgisayarkavramlari.com/2009/11/01/geri-izleme-algoritmasi-backtracking-algorithm/">geri izleme algoritmasının (backtracking algorithm)</a> bir uygulaması olarak, basit bir labirentte yol bulma kodunu JAVA dilinde kodlamaktır. Bu uygulamada herhangi bir yapay zeka yönetmi uygulanmayacaktır. Basitçe kör arama (blind search) yapan ve ihtimalleri sırayla deneyen bir robot uygulaması geliştirilecektir.</p>
<p>Örneğin labirent bilgisinin bir dosyada bulunduğunu ve bizim amacımızın bu dosyayı okuyarak labirentin başlangıcından çıkışına kadar olan yolu bulmak olduğunu düşünelim. Labirent tasarımımızda duvarları 1 ve yolları 0 ile gösterelim. Örneğin aşağıda bir labirent verilmiştir:</p>
<p>1111111<br />
0010011<br />
1000011<br />
1101111<br />
1100000<br />
1111111</p>
<p>Yukarıdaki bu labirentte, sol üst köşeyi başlangıç konumu ve sağ alt köşeyi de bitiş konumu olarak kabul edeceğiz. Buna göre labirentin her zaman için ikinci satırının ilk kolonunda başlıyoruz ve labirentin boyutuna göre son satırın bir üstünde en sağ kolonda bitiriyoruz. Amacımız bu iki nokta arasındaki yollardan bir tanesini çözüm olarak bulmak. Ayrıca dosyadan labirent okuyacağımız için, veri yapısı kullanımını kolaylaştırmak amacıyla, labirentin boyutlarını da dosyanın ilk satırında tutalım. Buna göre bir labirent dosyasının içeriği aşağıdaki şekilde olacaktır:</p>
<p>6 7<br />
1111111<br />
0010011<br />
1000011<br />
1101111<br />
1100000<br />
1111111</p>
<p>Dosyanın ilk satırında, labirentin satır ve sütun boyutları verilmiştir.</p>
<p>Algoritmamız, basitçe labirentin başlangıç konumundan yola çıkacak ve yol alternatiflerini değerlendirecektir. Şayet yol tek yönlü ise hareket etmeye devam edecek ancak bir yol ayrımına geldiğinde bu noktayı bir <a href="http://www.bilgisayarkavramlari.com/2007/05/04/stack-yigin/">yığında (stack)</a> tutarak çıkmaz bir yola girdiğinde en son aklında tuttuğu bu yola geri dönecek ve farklı bir karar verecektir.</p>
<p>Örneğin yukarıdkai problem için çözümü elle yaparak tasarımımıza başlayalım. Başlangıç durumumuz (1,0) olacak (dizide satır sayısının 0&#8242;dan başladığını düşünürsek, ikinci satırın ilk sütunu (1,0) olarak gösterilecektir.</p>
<p>Bitiş durumumuz ise (4,6) olarak belirlenecektir (dizi boyutumuzda azami satır ve sütun değerleri 5,6 olacaktır (boyuttan bir eksik) ve en altın bir üstü satır 4 ve son sütun 6 olacaktır. Dolayısıyla bitiş durumu olarak (4,6) tanımlıyoruz.</p>
<p>(1,0) konumundan, (4,6) konumuna kadar olan çözüm yolunu bulmak için adım adım algoritma tasarımımızı inceleylim.</p>
<p>Algoritmamız kör arama (blind search) olduğu için, çözüme giden en mantıklı yolu bulmak yerine bütün ihtimalleri deniyeceğiz. Bu ihtimalleri belirli bir sıra ile aramamız gerekiyor. Bu srıalama için algoritmamızı aşağıdaki şekilde tasarlayalım:</p>
<p><span style="font-family: Times New Roman; font-size: 12pt;"><em>Geldiğim yeri işaretle</em><br />
</span></p>
<p><span style="font-family: Times New Roman; font-size: 12pt;"><em>if(sola gidilmemişse)</em><br />
</span></p>
<p><span style="font-family: Times New Roman; font-size: 12pt;"><em>sola git;</em><br />
</span></p>
<p><span style="font-family: Times New Roman; font-size: 12pt;"><em>else if(sağa gidilmemişse</em><br />
</span></p>
<p><span style="font-family: Times New Roman; font-size: 12pt;"><em>sağa git;</em><br />
</span></p>
<p><span style="font-family: Times New Roman; font-size: 12pt;"><em>else if(yukarı gidilmemişse)</em><br />
</span></p>
<p><span style="font-family: Times New Roman; font-size: 12pt;"><em>yukarı git;</em><br />
</span></p>
<p><span style="font-family: Times New Roman; font-size: 12pt;"><em>else if (aşağı gidilmemişse)</em><br />
</span></p>
<p><span style="font-family: Times New Roman; font-size: 12pt;"><em>aşağı git;</em><br />
</span></p>
<p>Yukarıdaki bu tasarımda sol -&gt; sağ -&gt; yukarı -&gt; aşağı sırası tamamen rast gele olarak üretilmiştir ve daha farklı sırada da olabilirdi.</p>
<p>(1,0) konumundan başlayarak yukarıdaki algoritmayı icra ettirelim. İşaretleme için 2 değerini kullanacağız. Öncelikle <a href="http://www.bilgisayarkavramlari.com/2007/05/04/stack-yigin/">yığın (stack)</a> değeri boş olarak başlıyoruz (bundan sonra S olarak gösterilecek ve sağdan eklenerek sağdan çıkarma yapılacaktır):</p>
<p>1111111<br />
0010011<br />
1000011<br />
1101111<br />
1100000<br />
1111111</p>
<p>S -&gt; boş</p>
<p>İlk değeri işaretliyoruz:</p>
<p>1111111<br />
2010011<br />
1000011<br />
1101111<br />
1100000<br />
1111111</p>
<p>(1,0) konumunda tek gidilebilecek komşu, (1,1) konumudur (1,0) konumunun komşuları 0,0 2,0 ve 1,1 olduğuan göre bu değerlere bakıyoruz ve bunlardan 0 olan tek değere gidiyoruz:</p>
<p>1111111<br />
2210011<br />
1000011<br />
1101111<br />
1100000<br />
1111111</p>
<p>Benzer şekilde (1,1) konumunun tek 0 olan komşusu (2,1) olan konuma gidiliyor. Benzer şekilde (2,1) konumunun tek komşusu olan (2,2) konumuna gidilerek aşağıdaki durum elde ediliyor:</p>
<p>1111111<br />
2210011<br />
1220011<br />
1101111<br />
1100000<br />
1111111</p>
<p>Yukarıdaki son durumda geldiğimiz konum (2,2) ve birden fazla komşumuzda 0 değer var. Yani (2,2) konumunun komşuları olan (2,3) ve (3,2) değerleri 0 olduğu için bu alternatiflerden birisini takip edeceğiz. İşte bu yol ayrımında yığın (stack) kullanmanın sırası geliyor. Bunun sebebi şu anda vereceğimiz kararın doğru olup olmadığını bilmediğimiz ve basitçe hata yapıyorsak buraya geri dönmek istememiz.</p>
<p>S -&gt; (2,2)</p>
<p>Yukarıdaki şekilde karar noktamızı yığına yerleştirdikten (push) sonra algoritmamızdaki öncelikli yol olan sol tarafı deniyoruz. Sol tarafımızda ((2,2)&#8217;nin solunda (2,1) vardır) 0 olmadığı için gidemiyoruz. Algoritmamızdaki ikinci ihtimal olan sağ tarafa bakıyoruz (sağın koordinatı (2,3)) ve bu değer 0 olduğu için bu yönde gidiyoruz.</p>
<p>1111111<br />
2210011<br />
1222011<br />
1101111<br />
1100000<br />
1111111</p>
<p>Sağa gitme işlemine devam ediyoruz (aşağıya gidemediğimiz için) ayrıca burada bir yol ayrımı bulunduğu için (sağa veya yukarıya gidebiliriz) yığının (stack) içerisine yerleştiriyoruz:</p>
<p>S -&gt; (2,2) , (2,3)</p>
<p>1111111<br />
2210011<br />
1222211<br />
1101111<br />
1100000<br />
1111111</p>
<p>Tek alternatif olan yukarıya devam ediyoruz:</p>
<p>1111111<br />
2210211<br />
1222211<br />
1101111<br />
1100000<br />
1111111</p>
<p>Tek alternatif olan sola devam ediyoruz:</p>
<p>1111111<br />
2212211<br />
1222211<br />
1101111<br />
1100000<br />
1111111</p>
<p>Netice itibariyle alternatifi kalmayan (hiçbir yönde 0 olmayan) bir duvar ile karşılaştık ve bu noktadan sonra çıkma ihtimalimiz kalmadığı için yığındaki en üstte bulunan ve en son karar verdiğimiz noktaya dönüyoruz.</p>
<p>Bu nokta (2,3) koordinatlarındadır ve pop edildikten sonra stack aşağıdaki şekildedir:</p>
<p>S &#8211; &gt; (2,2)</p>
<p>Pop ettiğimiz (2,3) noktasında da gidilecek hiçbir alternatif bulunmuyor. Mecburen yığındaki (stack) bir sonraki noktaya dönüyoruz:</p>
<p>S -&gt; Boş</p>
<p>Döndüğümüz koordinat (2,3) noktası ve buradaki tek alternatif aşağı yönde bulunan 0 değeri:</p>
<p>1111111<br />
2212211<br />
1222211<br />
1121111<br />
1100000<br />
1111111</p>
<p>Bu aşamadan sonra, hiçbir alternatif kalmadan 0 olan yollar izlenerek sonuca ulaşan yol bulunmuş oluyor.</p>
<p><strong>Kodlama<br />
</strong></p>
<p>Yukarıdaki yaklaşımın JAVA dilinde kodlanmış hali yazının sonunda verilmiştir. Bu kodun kısaca açıklamasını bu bölümde anlatacağım. Kodumuzda temel olarak iki sınıf bulunuyor:</p>
<ul>
<li>currentInfo</li>
<li>Maze</li>
</ul>
<p>currentInfo sınıfı, anlık olarak matrisin hangi konumunda bulunduğumuzu tutmaya yarıyor. Çok basit şekilde satır ve sütün koordinatlarımızı barındırıyor. Ayrıca bu değerlere erişmeyi sağlayan <a href="http://www.bilgisayarkavramlari.com/2008/11/24/yapici-constructor/">inşa sınıfları (constructors)</a> ve <a href="http://www.bilgisayarkavramlari.com/2010/10/25/c-dili-ile-kapsulleme-encapsulation/">kapsülleme fonksiyonları (encapsulation)</a> bulunuyor.</p>
<p>Maze sınıfı ise geri kalan herşeyi yapan ana sınıfımız. Bu sınıfta getMaze() isimli fonksiyon, dosyadan labirent bilgilerini okumak için kullanılıyor. solveMaze fonksiyonu da labirentteki sonucu bulmaya yarayan yukarıdaki işlemleri çalıştırıyor.</p>
<p>Yukarıdaki anlatımda geçen ve S harfi ile ifade ettiğimiz <a href="http://www.bilgisayarkavramlari.com/2007/05/04/stack-yigin/">yığın (stack)</a> ise kodumuzda path ismi ile tanımlanmış java.util.Stack sınıfından tanımlanmış bir yığın. Buradaki yığın, karar verirken atılan her adımı tutmakta. Yani yukarıdaki labirent çözümünde geçen ve 2 olarak işaretlerken, birden fazla 0 ihtimali bulunan dönüm noktalarını tutuyor.</p>
<p>Yığının en temel 3 fonksiyonu ise aşağıdaki şekildedir:</p>
<ul>
<li>Pop() yığında bulunan en üstteki değeri alarak bir değişkene döndürür.</li>
<li>Push() yığının en üstüne, parametre olarak aldığı veriyi yerleştirir.</li>
<li>Peek() yığının en üstündeki veriyi alır ancak pop fonksiyonunun aksine bu veriyi silmez. Bu fonksiyon bazı kaynaklarda Top() olarak da geçmektedir ancak java.util.Stack sınıfında peek ismi ile tanımlanmıştır.</li>
</ul>
<p>Kodumuzda kullandığımız iki temel dizi ise aşağıda verilmiştir:</p>
<ul>
<li>mazeData[][] iki boyutlu bu dizi, dosyadan okunan ve hafızada labirent bilgisini tutan dizidir.</li>
<li>Mark[][] diğer iki boyutlu dizimiz ise sonuca giden yolu tutar.</li>
</ul>
<p>İkinci diziye neden ihtiyaç duyduğumuz sorusunu şu şekilde cevaplayalım. Dizimizi dolaşırken, yanlış yollara sapabiliyoruz, geçtiğimiz her yeri basarsak bu sonuçta görmek istediğimiz çözüm yolu olmayacaktır. Ayrıca labirentte dolaşırken, çözüme giden yolu 2 ile işaretliyoruz ama hatalı yolları da 2 ile işaretliyoruz. Dolayısıyla labirenti dolaştıktan sonra 2 ile işaretli yolları basarsak bu yollarda da sonuca gitmeyen değerlerin basılması söz konusu. Çözüm olarak ayrı bir dizide, sonuca giden yoldaki koordinatları ayrıca tutuyoruz.</p>
<p>Koddaki bazı satırları anlatmamız gerekirse:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/110311_2112_Labirenttey1.png" alt="" /></p>
<p>Yukarıdaki kod parçasında, bulunduğumuz konumdan (current) sonraki gidebileceğimiz yönleri sırasıyla deniyoruz. İlk if koşulunda mazeData isimli dizide (yani labirentin verilerinin tutulduğu dizi) bulunan ve mevcut konumun bir sağında yer alan (col + 1 işleminin anlamı bir sonraki kolon demektir) değere gidilmesi ve bu değerin daha önce mark dizisinde işaretlenmemiş olması (gidilmemiş olması ) durumu kontrol edilmektedir. Ardından sırasıyla, sol, aşağı ve yukarı yönler için aynı kontroller yapılmaktadır. Yazıda anlatılan sıradan bu anlamda farklıdır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/110311_2112_Labirenttey2.png" alt="" /></p>
<p>Yukarıdaki kod parçasında ise, bir önceki kod parçasının devamı niteliğinde, şayet 4 yöndede hareket edilemiyorsa, çıkmaz bir yola girilmiş neticesine varılabilir. Bu durumda mevcut durum dolaşıldı anlamında, 2 ile işaretlendikten sonra, yığından (stack) pop fonksiyonu ile dönülecek en son karar anına bakılıyor.</p>
<p>Şayet yığın bir şekilde boş olursa (ki bu durum try/catch blokları arasında <a href="http://www.bilgisayarkavramlari.com/2008/11/22/istisna-yakalama-kabz-i-istisna-exception-handling/">istisna kabz edilerek (exception handling)</a> çözülmüştür) bu durumda labirentin bir çözümü olmadığını söyleyebiliriz çünkü hem bir çıkmaz yol bulduk hem de geriye döneceğimiz hiçbir yol ayrımı bulunmuyor demektir.</p>
<p>Netice itibariyle, 61. Satıra kadar ulaştıysak, bu satırda flag değişkeni true değerinde olup, yukarıdaki 4 iften birisine girerek bir yöne hareket etmiş olabilir. Bu durumda gidilen bu yok, mark dizisinde işaretlerenerek yığına yerleştiriliyor. Ayrıca flag değişkenin false olduğu tek ihtimal olan çıkmaz yol durumunda da if bloğu çalışmıyor.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/110311_2112_Labirenttey3.png" alt="" /></p>
<p>Yukarıda alıntılıanan kod parçası ise bütün işlemler bitip, labirent bir sonuca ulaşacak şekilde dolaşıldıktan sonra, mark dizisi üzerinden dolaşılan yolu ekrana basmaktadır. Döngü, labirent boyutları olan dim1 ve dim2 sınırlarında dönmekte, her adımdaki konum 71. Satırda ekrana basılmakta ve sonraki konum da 4 farklı koşul konrolü ile işaretlenmiş olan yöne doğru değiştirilmektedir.</p>
<p>Kodun çalışması sonucunda, örnek ekran çıktısı aşağıda verilmiştir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/110311_2112_Labirenttey4.png" alt="" /></p>
<p>Görüldüğü üzere labirentteki bütün yolları dolaşarak, sonuca ulaşan yolları ekrana basmıştır(lütfen basma işlemi sırasında, 71. Satırda olduğu üzere önce satır sonra sütun koordinatının basıldığına dikkat ediniz). Bu örnek çalışma, aşağıdaki labirent içindir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/110311_2112_Labirenttey5.png" alt="" /></p>
<p>Ayrıca farklı bir dosya içeriği, projenin bulunduğu dizindeki maze.dat dosyasının içerisine yerleştirilerek çalıştırılabilir.</p>
<p><a href="http://www.bilgisayarkavramlari.com/wp-content/uploads/2011/labirent.rar"><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/110311_2112_Labirenttey6.png" alt="" /><br />
Kodun tamamını netbeans projesi olarak indirmek için tıklayınız.</a></p>

<p class="sayac_bilgi">932 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/11/04/labirentte-yol-bulma-kodu/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Etraflı Arama (Tam Arama, Exhaustive Search)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/05/17/etrafli-arama-tam-arama-exhaustive-search/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/05/17/etrafli-arama-tam-arama-exhaustive-search/#comments</comments>
		<pubDate>Tue, 17 May 2011 12:34:25 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[Veri Güvenliği(Cryptography)]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[yapay zeka (artificial intelligence)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/05/17/etrafli-arama-tam-arama-exhaustive-search/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Literatürde tam arama veya etraflı arama olarak geçmektedir. İngilizcede “exhaustive search” terimi kullanılır. Genel olarak, arama algoritmalarının performansını arttırmak için kullanılan bir yöntemdir. Bir arama algoritmasının tam arama (exhaustive search) olabilmesi için aşağıdaki şartları sağlaması gerekir: Bir değerin bulunmadığını söylemeden önce bütün değerlere bakmış veya bütün ihtimalleri değerlendirmiş olmalıdır. Arama [...]]]></description>
			<content:encoded><![CDATA[<div>
<p style="margin-bottom: 0cm;">Yazan : Şadi Evren ŞEKER</p>
<p style="margin-bottom: 0cm;">Literatürde tam arama veya etraflı arama olarak geçmektedir. İngilizcede “exhaustive search” terimi kullanılır. Genel olarak, arama algoritmalarının performansını arttırmak için kullanılan bir yöntemdir.</p>
<p style="margin-bottom: 0cm;">Bir arama algoritmasının tam arama (exhaustive search) olabilmesi için aşağıdaki şartları sağlaması gerekir:</p>
<ul>
<li>
<p style="margin-bottom: 0cm;">Bir değerin bulunmadığını söylemeden önce bütün değerlere bakmış veya bütün ihtimalleri değerlendirmiş olmalıdır.</p>
</li>
<li>
<p style="margin-bottom: 0cm;"><a href="http://www.bilgisayarkavramlari.com/2009/11/23/arama-algoritmalari-search-algorithms/">Arama uzayında hareket edilirken (Arama işlemi sırasında)</a> sistematik bir yöntem kullanılmalıdır. Diğer bir deyişle arana değerlere tekrar tekrar bakılmamalı, ve her adımdan sonra hangi değere bakılacağı belirlenmelidir.</p>
</li>
</ul>
<p style="margin-bottom: 0cm;">Yukarıdaki şartları sağlayan arama algoritmalarına etraflı arama veya tam arama ismi verilir. Ancak yukarıdaki ikinci maddenin bir istisnası bulunur. Bazı durumlarda arama algoritmasını hızlandırmak için rast gele bir değer ataması (randomness) kullanılabilir. Bu durum bir çelişki olarak görülmemelidir. Algoritmanın içerisinde bir rastgelelik bulunsa bile, aranan değerleri tekrar aramaması ve üretilecek olan rastgeleliğin tam kontrol altında tutulması halinde, arama algoritması etraflı arama olarak sınıflandırılabilir.</p>
<p style="margin-bottom: 0cm;">Etraflı arama algoritmalarını aynı zamanda birer  <a href="http://www.bilgisayarkavramlari.com/2009/11/01/geri-izleme-algoritmasi-backtracking-algorithm/">geri izleme algoritması (back tracking algorithm)</a> olarak isimlendirmek mümkündür. Aslında bütün etraflı arama algoritmaları (Exhaustive search algorithms) birer  <a href="http://www.bilgisayarkavramlari.com/2009/11/01/geri-izleme-algoritmasi-backtracking-algorithm/">geri izleme algoritmasıdır (back tracking algorithm)</a>. Ancak bu cümlenin tersi doğru değildir. Yani bütün geri izleme algoritmalarının etraflı arama algoritması olduğunu söyleyemeyiz. Buradaki fark, etraflı arama algoritmalarının, arama işlemi sırasında aranacak olan değerlerin bir kısmını budamasından kaynaklanır (prunning). Yani bazı değerlerin bakılmasına gerek kalmayacak şekilde arama işlemini hızlandırırlar.</p>
<p style="margin-bottom: 0cm;">Bu anlamda  <a href="http://www.bilgisayarkavramlari.com/2008/11/09/dogrusal-arama-linear-search/">doğrusal arama (linear search)</a>,  <a href="http://www.bilgisayarkavramlari.com/2009/11/24/kaba-kuvvet-metin-arama-algoritmasi-bruteforce-text-search-algorithm/">kaba kuvvet araması (brute force algorithm)</a> gibi temel arama algoritmaları birer etraflı arama kabul edilebilir.</p>
<p>&nbsp;</p>
</div>

<p class="sayac_bilgi">294 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/05/17/etrafli-arama-tam-arama-exhaustive-search/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dosyayı Tersten Basan Kod</title>
		<link>http://www.bilgisayarkavramlari.com/2011/04/26/dosyayi-tersten-basan-kod/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/04/26/dosyayi-tersten-basan-kod/#comments</comments>
		<pubDate>Tue, 26 Apr 2011 09:14:56 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Kod Örnekleri]]></category>
		<category><![CDATA[veri yapıları]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/04/26/dosyayi-tersten-basan-kod/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Gelen bir soru üzerine, C dilinde bir dosyanın içeriğini tersten ekrana basan kodu yazıp sitede yayınlıyorum. Öncelikle algoritmamızı inşa edelim. Ters almak gibi işlemler yapı olarak özyineli (recursive) fonksiyonlara çok uygundur. Genelde stack (yığın) yapısının kullanıldığı özyineli fonksiyonlar bilgiyi tutma ve ters çevirme (son giren ilk çıkar (LIFO) algoritması) için [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Gelen bir soru üzerine, C dilinde bir dosyanın içeriğini tersten ekrana basan kodu yazıp sitede yayınlıyorum.
</p>
<p>Öncelikle algoritmamızı inşa edelim.
</p>
<p>Ters almak gibi işlemler yapı olarak <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">özyineli (recursive) fonksiyonlara</a> çok uygundur. Genelde <a href="http://www.bilgisayarkavramlari.com/2007/05/04/stack-yigin/">stack (yığın)</a> yapısının kullanıldığı <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">özyineli fonksiyonlar</a> bilgiyi tutma ve ters çevirme (son giren ilk çıkar (LIFO) algoritması) için elverişli olurlar. Bu yüzden biz de bir <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">özyineli fonksiyon</a> kullanarak dosyamızdan karakter karakter değerleri okuyacak sonra da bunları ekrana basacağız.
</p>
<p>Kodu aşağıda veriyorum:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/042611_0914_DosyayTerst11.png" alt=""/>
	</p>
<p>Kodumuzdaki main fonksiyonu sadece dosyayı açmakta ve sonra ters fonksiyonunu çağırmaktadır. Dosya ters fonksiyonunda işlendikten sonra (ki bu işleme dosyayı tersten basmak olacak) dosya kapatılmakta ve program sonlandırılmaktadır.
</p>
<p>Gelelim ters fonksiyonuna. Bu fonksiyon, dosya göstericisini (file pointer) parametre olarak alıp, dosya sonu olup olmadığını kontrol ediyor. Feof fonksiyonu, şayet dosyanın sonuna ulaştıysa, return; satırını çalıştıracak ve dolayısıyla fonksiyondan çıkılacak. Aslında bu durum bizim dosyamızın sonu ve dolayısıyla fonksiyonumuzun sonu ve dolayısıyla <a href="http://www.bilgisayarkavramlari.com/2007/05/04/stack-yigin/">özyineleme yığınımızın (recursion stack)</a> sonu olmaktadır.
</p>
<p>Fonksiyonun geri kalanında işlem gayet basit bir şekilde fscanf ile dosyadan okumak ve ardından tekrar ters fonksiyonunu çağırmak ve sonra da okunan karakteri ekrana basmak şekline ilerler.
</p>
<p>Buradaki kritik nokta, ters fonksiyonunu, ekrana karakter basmadan çağırmaktır. Şayet kodun 11. ve 12. satırları yer değiştirecek olsaydı, yani önce ekrana basıp sonra ters fonksiyonunu çağıracak olsaydık, bu durumda dosyanın içeriği olduğu gibi ekrana basılacaktır. Biz bunun yerine o andaki okunan karakteri bekletiyoruz ve sonraki karakteri basması ve ters çevirmesi için yeniden fonksiyona veriyoruz. Bu işlem dosya sonuna kadar gidiyor. Nihayet dosya sonuna erişilince <a href="http://www.bilgisayarkavramlari.com/2007/05/04/stack-yigin/">özyineli yığınımız (recursion stack)</a> toparlanmaya başlıyor ve bu toparlanma sırasında ekrana karakterleri basarak ilerliyor.
</p>
<p>Yukarıdaki kod, Dev-CPP ile test edilmiş ve çalışmaktadır. Örneğin girdi.txt dosyası olarak aşağıdaki içerikte bir dosyayı verirsek:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/042611_0914_DosyayTerst21.png" alt=""/>
	</p>
<p>Programın çıktısı aşağıdaki şekilde olur:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/042611_0914_DosyayTerst31.png" alt=""/>
	</p>
<p>
 </p>

<p class="sayac_bilgi">533 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/04/26/dosyayi-tersten-basan-kod/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Java dilinde vektörler</title>
		<link>http://www.bilgisayarkavramlari.com/2011/03/31/java-dilinde-vektorler/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/03/31/java-dilinde-vektorler/#comments</comments>
		<pubDate>Wed, 30 Mar 2011 22:01:54 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Nesne Yönelimli Programlama]]></category>
		<category><![CDATA[veri yapıları]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/03/31/java-dilinde-vektorler/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, Java dilindeki vektör sınıfının kullanılmasını ve yapısını anlatmaktır. Java dilindeki vektörlerin yapısından bahsederek başlayalım. Klasik veri yapısı olarak dizilerin (array) ve bağlı listelerin (linked list) özelliklerini birleştirmiştir. Bir vektör boyutu belli olmadan tanımlanıp içerisine veri konuldukça hafızada kapladığı yeri arttırmaktadır. Bu anlamda bağlı listelere benzer özellik göstermektedir. [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Bu yazının amacı, Java dilindeki vektör sınıfının kullanılmasını ve yapısını anlatmaktır.
</p>
<p>Java dilindeki vektörlerin yapısından bahsederek başlayalım. Klasik veri yapısı olarak <a href="http://www.bilgisayarkavramlari.com/2007/05/04/array-dizi/">dizilerin (array)</a> ve <a href="http://www.bilgisayarkavramlari.com/2007/05/03/linked-list-linkli-liste-veya-bagli-liste/">bağlı listelerin (linked list)</a> özelliklerini birleştirmiştir.
</p>
<p>Bir vektör boyutu belli olmadan tanımlanıp içerisine veri konuldukça hafızada kapladığı yeri arttırmaktadır. Bu anlamda bağlı listelere benzer özellik göstermektedir. Yani bir vektörün boyutunun önceden tanımlanması gerekmez. Aslında vektörün boyu yoktur ve herhangi bir anda vektör için bir limit belirtilmez.
</p>
<p>Boyutunu belirsiz tutabilmemizin yanında, bir vektörün herhangi bir elemanına doğrudan erişmek (random acces) de mümkündür. Bu sayede vektör yapısı diziler ve bağlı listelerden daha avantajlı bir hal almış olur.
</p>
<p>Vektörler hakkında bilmemiz gereken son özellik ise, vektörlerin tipsiz olduğudur. Yani vektörler içlerinde istenilen tipte veri tutabilir. Bunu, JAVA dilinde bulunan nesne mirası sayesinde yapmaktadırlar. JAVA dilinde, bütün nesneler, Object sınıfından türemiştir. Yani aslında bütün nesneler ile Object sınıfı arasında bir <a href="http://www.bilgisayarkavramlari.com/2007/04/14/inheritance-nesneler-arasi-miras-iliskisi/">miras (inheritance)</a> ilişkisi bulunmaktadır.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/033011_2201_Javadilinde11.png" alt=""/>
	</p>
<p>Dolayısıyla JAVA dilindeki bütün nesneler, Object sınıfına yukarı <a href="http://www.bilgisayarkavramlari.com/2011/03/19/nesne-akisi-casting/">akış yapılarak (upcasting)</a> bu tipte tutulabilir. Aşağıdaki örneklerde bu durumu gösteren kodlar sunulacaktır.
</p>
<p>Gelelim vektörlerin, JAVA dilindeki kullanılışlarına
</p>
<p>Basit bir uygulama ile bu sınıfı tanımaya başlayalım.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/033011_2201_Javadilinde21.png" alt=""/>
	</p>
<p>
 </p>
<p>Öncelikle java dilindeki vektör sınıfı, java.util paketi altında bulunabilir. Dolayısıyla vektörler ile çalışırken kodun başına
</p>
<p>import java.util.Vector;
</p>
<p>yazmak gerekir.  Yukarıdaki kodun 14. satırında da bu import işlemi ile koda başlanmıştır.
</p>
<p>Kodun ana çalışan sınıfı (class) vektorDeneme isimli sınıftır ve bu sınıfın içerisinde bir adet main fonksiyonu bulunur. Bu fonksiyonun içinde victor isimli bir Vector tanımlanmıştır.
</p>
<p>Ayrıca vektörün içerisinde tutulacak veri tipini belirlemek için bir oluşum sınıfı (composition class) tanımı yapılmış ve insan tipinin, boy ve yaş bilgilerinden oluştuğu kodlanmıştır. (kodun 14-23. satırları arası). Bu sınıf içerisinde bir <a href="http://www.bilgisayarkavramlari.com/2008/11/24/yapici-constructor/">inşa fonksiyonu (yapıcı fonksiyon, constructor)</a> tanımlanmış ve iki tam sayı (int) alarak bir insanı tanımlamaya imkan sağlamıştır.
</p>
<p>Kodun 28. satırında, insan tipinde bir ali nesnesi (object) üretilmiş ve bu nesne, 29. satırda, daha önceden tanımladığımız victor ismindeki vektöre yerleştirilmiştir.
</p>
<p>Kodun 30. satırında, victor isimli vektörün boyutunun nasıl alındığı gösterilmiştir. Buna göre bir vektör nesnesinin .size() şeklinde metodu çağrılarak, boyutu alınabilir.
</p>
<p>Ayrıca vektörün herhangi bir sıradaki elemanına erişmek için .elementAt() fonksiyonunu çağırmak ve bu fonksiyona parametre olarak kaçıncı elemana erişilmek istendiğini vermek yeterlidir.
</p>
<p>Ne yazık ki 31. satırdaki çağırma işlemi sonucunda JAVA anlamlı bir şey basamaz. Bunun sebebi, vektörün 0. elemanı olarak konulan nesnenin tipinin belirsiz olması ve şu anda nesne sınıfına (object) çevrilmiş olmasıdır. Vektörün 0. sırasında bulunan bu elemanın üyelerine (members) erişmek için öncelikle insan tipine geri çevrilmesi gerekir. Bunun için tip inkılabı yapıp nesnenin başına parantezler içerisinde (insan) yazılmıştır. Ancak bu çevirim yapıldıktan sonra boy ve yas üyelerine erişilebilmiş ve ekrana basılmıştır.
</p>
<p>Yukarıdaki kodun çıktısı aşağıda verilmiştir:
</p>
<ul>
<li>vektör boyutu: 1
</li>
<li>vektörün 0. elemanı : javaapplication21.insan@190d11
</li>
<li>elemanın insan olarak boyu : 100 yasi : 10
</li>
</ul>
<p>Görüldüğü üzere, çıktının ikinci satırında, JAVA nesneyi ekrana basmıştır.  (aslında ekrana basılan nesnenin dizgiye (string) çevrilmiş ve serilenmiş halidir, daha fazla bilgi için <a href="http://www.bilgisayarkavramlari.com/2009/10/04/nesne-serileme-ve-dizme-object-serialization-marshalling/">nesne serileme (serialization)</a> başlıklı yazıya bakabilirsiniz).
</p>
<p>Vektörlerin, JAVA dilinde bir tip kısıtlaması ile kullanılması da mümkündür.
</p>
<p>Örneğin yukarıdaki kodda bulunan victor isimli vektöre, yeni elemanlar eklenirken herhangi bir kısıt bulunmaz. İkinci elemanı olarak öğrenci, üçüncü elemanı olarak ders tipinde nesneler eklenebilir. Bu nesnelerin hepsi Object tipine çevrilerek yerleştirilir. Ancak biz kısıtlamak istersek bir <a href="http://www.bilgisayarkavramlari.com/2009/04/20/sablonlar-templates/">şablon tanımı (template)</a> yapmamız mümkündür.
</p>
<p>Vector&lt;insan&gt;kisitli = new  Vector&lt;insan&gt;();
</p>
<p>Şeklindeki tanım, sadece insan tipinden nesneler alabilir. Farklı tiplerdeki nesnelerin bu vektöre konulması mümkün değildir. Aynı zamanda tip dönüşümü yapmak da gerekmez. Yani bir önceki kodda bulunan ve vektörün herhangi bir elemanının boyu veya yaşını bastırmak için başına eklediğimiz (insan) ibaresinin bu kodda bulunması artık gerekmez. Çünkü JAVA bu sınıfların tiplerini bilmektedir ve bu tiplere göre erişime izin verir.
</p>
<p>
 </p>
<p>
 </p>

<p class="sayac_bilgi">458 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/03/31/java-dilinde-vektorler/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>2-3-4 Ağaçları (2 3 4 trees)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/01/28/2-3-4-agaclari-2-3-4-trees/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/01/28/2-3-4-agaclari-2-3-4-trees/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 11:32:36 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Dosya Organizasyonu (File Organisation)]]></category>
		<category><![CDATA[veri yapıları]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/01/28/2-3-4-agaclari-2-3-4-trees/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER 2-3-4 ağacı, B-ağaçlarının (B-Trees) özel bir halidir. Bu ağacın özelliği, düğüm boyutunun (node size) 3 ile sınırlı olmasıdır. Ağaç ayrıca sürekli olarak dengeli bir ağaç garantisi verir (balanced tree). 2-3-4 ağaçları, kırmızı siyah ağaçlarının (red-black trees) , eş şekillisi (isomorphic) olarak da düşünülebilir. 2-3-4 ağacının ismi, ağaçtaki düğümlerin değişik durumlarda [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>2-3-4 ağacı, <a href="http://www.bilgisayarkavramlari.com/2008/10/25/b-agaci-b-tree/">B-ağaçlarının (B-Trees)</a> özel bir halidir. Bu ağacın özelliği, düğüm boyutunun (node size) 3 ile sınırlı olmasıdır. Ağaç ayrıca sürekli olarak dengeli bir ağaç garantisi verir (balanced tree). 2-3-4 ağaçları, <a href="http://www.bilgisayarkavramlari.com/2009/12/27/kirmizi-siyah-agaclari-red-black-trees/">kırmızı siyah ağaçlarının (red-black trees)</a> , <a href="http://www.bilgisayarkavramlari.com/2009/06/18/denksekillilik-isomorphism/">eş şekillisi (isomorphic)</a> olarak da düşünülebilir.</p>
<p>2-3-4 ağacının ismi, ağaçtaki düğümlerin değişik durumlarda değişik numaralar almasından kaynaklanmaktadır. Yani bir düğüm 2,3 veya 4 durumunda olabilir. Bu durumlara göre farklı uygulamalar söz konusudur.</p>
<p>2 düğümü: 2 adet çocuk düğümü gösteren <a href="http://www.bilgisayarkavramlari.com/2007/05/03/pointer-gosterici/">gösterici (pointer)</a> ve bir veriden oluşur</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012811_1132_234Aalar1.png" alt="" /></p>
<p>3 düğümü: 3 adet çocuk düğümü gösteren <a href="http://www.bilgisayarkavramlari.com/2007/05/03/pointer-gosterici/">gösterici (pointer)</a> ve iki veriden oluşur</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012811_1132_234Aalar2.png" alt="" /></p>
<p>4 düğümü: 4 adet çocuk düğümü gösteren <a href="http://www.bilgisayarkavramlari.com/2007/05/03/pointer-gosterici/">gösterici (pointer)</a> ve üç veriden oluşur</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012811_1132_234Aalar3.png" alt="" /></p>
<p>Ekleme işlemini bir örnek üzerinden anlamaya çalışalım</p>
<p>50, 27, 97, 52, 19, 11, 111</p>
<p>Bu sırayla verilen değerleri sırasıyla ağaca ekleyelim:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012811_1132_234Aalar4.png" alt="" /></p>
<p>İlk sayı olan 50&#8242;nin eklenmesi sonucunda ağaçta tek bir düğüm ve bu düğümde tek bir veri bulunuyor. Bu tip düğüme 2 düğümü ismi verilmektedir ve iki çocuğu da boştur (null).</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012811_1132_234Aalar5.png" alt="" /></p>
<p>İkinci eklenen değer 27&#8242;dir. Ağacımızda tek düğüm bulunduğundan ve bu düğüm 2 tipinde olduğundan, düğümde yeni değeri alacak yer bulunmaktadır. Bu yere yeni gelen değer yerleştirilir. Elbette düğümlerin içerisinde sıra bulunması gerektiği için, 27 değeri, 50 değerinin soluna yerleştirilmiştir. Bu kural bundan sonraki ekleme işlemlerinde de geçerli olacaktır. Yani düğüm içerisindeki değerler kendi aralarında sıralı olacak ve herhangi bir değerin solundaki çocuklarının değeri, kendi değerinden küçük ve sağındaki değeri kendi değerinden büyük olacaktır.</p>
<p>Ardından gelen ekleme değeri, 97&#8242;dir. Bu değer düğüme eklenince, aşağıdaki gibi bir yapı elde edilir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012811_1132_234Aalar6.png" alt="" /></p>
<p>Yukarıdaki bu yeni yapı, bizim 2-3-4 ağacımızdaki 4 tipindeki yapıdır ve kabul edilebilir bir durumdur. Ancak bir sayı daha eklenince yapı bozulacaktır. Nitekim sıradaki sayımız olan 52&#8242;nin eklendiğini düşünelim:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012811_1132_234Aalar7.png" alt="" /></p>
<p>Şimdiye kadar öğrendiklerimize göre, yukarıdaki gibi bir yapı olması beklenir. Ancak yukarıdaki yapı 2-3-4 ağacı tarafından kabul edilemez (2,3 veya 4 tipinde bir düğüm değildir). Dolayısıyla bu yapının kabul edilir bir şekle indirgenmesi gerekir.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012811_1132_234Aalar8.png" alt="" /></p>
<p>Yukarıdaki yeni şekilde, ağaç 50 ve 27 değerlerini taşıyan iki adet 2 tipinde düğüm ve bir adet 52 ve 97 değerlerini taşıyan 3 tipinde düğüme indirgenmiştir. Bu düğümlerin tamamı 2-3-4 ağacı tarafından kabul edilir düğümlerdir.</p>
<p>Ekleme işlemine 19 sayısı ile devam edelim.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012811_1132_234Aalar9.png" alt="" /></p>
<p>Yukarıdaki şekilde görüldüğü üzere, 19 sayısı, 50&#8242;den küçük olduğu için kökteki bu değerin solundaki düğüme yerleştirilmiştir.</p>
<p>11 sayısı eklendikten sonra, bu sayı da daha önceden olduğu gibi, 50&#8242;nin solundaki düğüme sıralı olarak eklenir.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012811_1132_234Aalar10.png" alt="" /></p>
<p>Benzer şekilde 111 sayısının eklenmesi de kök değerin sağına yapılır:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012811_1132_234Aalar11.png" alt="" /></p>
<p>Son olarak ağacın 3 düğümü olarak taşıyamayacağı bir örneği göstermek için, örneğin 120 sayısını ağaca eklemeye çalışalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012811_1132_234Aalar12.png" alt="" /></p>
<p>Normalde 120 sayısının ekleneceği yer, yukarıdaki şekilde gösterildiği gibi ağacın sağ koludur. Ancak bu durum 2-3-4 ağacı tarafından kabul edilemez çünkü herhangi bir düğüm yapısına uygun değildir.</p>
<p>Çözüm olarak daha önceden 52 sayısının eklendiği örnekte olduğu gibi düğümleri indirgiyoruz.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012811_1132_234Aalar13.png" alt="" /></p>
<p>Bu işlemden sonra kök düğümünü güncelleyerek sonuçta çıkacak olan ağacı elde ediyoruz</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012811_1132_234Aalar14.png" alt="" /></p>
<p>Ağacımız son halinde 2-3-4 ağacı kurallarına uygun düğümlerden oluşmaktadır.</p>

<p class="sayac_bilgi">656 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/01/28/2-3-4-agaclari-2-3-4-trees/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mealy ve Moore Makineleri (Mealy and Moore Machines)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/01/26/mealy-ve-moore-makineleri-mealy-and-moore-machines/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/01/26/mealy-ve-moore-makineleri-mealy-and-moore-machines/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 11:02:02 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Automata (otomatlar, özdevinirler)]]></category>
		<category><![CDATA[Bilgisayar Kavramları]]></category>
		<category><![CDATA[Derleyiciler]]></category>
		<category><![CDATA[Donanım ( Hardware )]]></category>
		<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[yapay zeka (artificial intelligence)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/01/26/mealy-ve-moore-makineleri-mealy-and-moore-machines/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde sıkça kullanılan sonlu durum makinelerinin (finite state machine, FSM veya Finite State Automaton , FSA) gösteriminde kullanılan iki farklı yöntemdir. Genelde literatürde bir FSM&#8217;in gösteriminde en çok moore makinesi kullanılır. Bu iki yöntem (mealy ve moore makinaları) sonuçta bir gösterim farkı olduğu için bütün mealy gösterimlerinin moore ve [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerinde sıkça kullanılan sonlu durum makinelerinin <a href="http://www.bilgisayarkavramlari.com/2007/12/25/sonlu-durum-makinasi-finite-state-machine-finite-state-automaton/">(finite state machine, FSM</a> veya <a href="http://www.bilgisayarkavramlari.com/2008/08/02/sonlu-ototmatlar-finite-automaton/">Finite State Automaton , FSA</a>) gösteriminde kullanılan iki farklı yöntemdir. Genelde literatürde bir FSM&#8217;in gösteriminde en çok moore makinesi kullanılır. Bu iki yöntem (mealy ve moore makinaları) sonuçta bir gösterim farkı olduğu için bütün mealy gösterimlerinin moore ve bütün moore gösterimlerinin mealy gösterimine çevrilmesi mümkündür.</p>
<p>Klasik bir FSM&#8217;de bir giriş bir de çıkış bulunur (input / output). Bu değerlerin nereye yazılacağı aslında iki makine arasındaki farkı belirler.</p>
<p>Moore makinelerinde çıkış değerleri <a href="http://www.bilgisayarkavramlari.com/2008/08/01/dugum-node/">düğümlere (node</a>) yazılırken, giriş değerleri kenarlar (edges) üzerinde gösterilir.</p>
<p>Mealy makinelerinde ise giriş ve çıkış değerleri kenarlar (edges) üzerinde aralarına bir taksim işareti (slash) konularak gösterilir. Örneğin 1/0 gösterimi, girişin 1 ve çıktının 0 olduğunu ifade eder.</p>
<p>Basit bir örnek olarak <a href="http://www.bilgisayarkavramlari.com/2008/03/13/ozel-veya-exclusive-or-farklilik-operatoru/">özel veya (exclusive or, <span style="font-family: Symbol;">Ä</span>)</a> işlemini ele alalım ve her iki makine gösterimi ile de çizmeye çalışalım.</p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 66px;"></col>
<col style="width: 57px;"></col>
<col style="width: 47px;"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border: solid 0.5pt;">Girdi 1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Girdi 2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Çıktı</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
</tr>
</tbody>
</table>
</div>
<p>Klasik bir XOR kapısı, yukarıdaki <a href="http://bilgisayarkavramlari.com/2007/12/08/dogruluk-cizelgesi-truth-table/">doğruluk çizelgesinde (truth table)</a> gösterildiği üzere iki giriş ve bir çıkıştan oluşur. Bizim makinemiz de ilk girdiden sonra ikinci girdiyi aldığında beklenen çıktıyı vermeli. Ayrıca makine sürekli olarak çalışmaya devam edecek. Örneğin 101011 şeklinde bir veri akışı sağlanması durumunda, sonuç olarak 1<span style="font-family: Symbol;">Ä</span>0<span style="font-family: Symbol;">Ä</span>1<span style="font-family: Symbol;">Ä</span>0<span style="font-family: Symbol;">Ä</span>1<span style="font-family: Symbol;">Ä</span>1 değerini hesaplamasını isteriz.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012611_1102_MealyveMoor1.png" alt="" /></p>
<p>Yukarıdaki gösterim bir mealy makinesidir. Makinede görüldüğü üzere 3 farklı durum arasındaki geçişler üzerine iki adet değer yazılmıştır. Bu değerlerden ilki giriş ikincisi ise çıkış değeridir.</p>
<p>Makineyi beraber okumaya çalışalım.</p>
<p>Makinenin boşluktan bir ok ile başlayan durumu, yani örneğimizdeki S0 durumu, başlangıç durumudur. Bu durumdan başlanarak gelen değerlere göre ilgili duruma geçilir.</p>
<p>Örneğimizi hatırlayalım. Giriş olarak 101011 <a href="http://www.bilgisayarkavramlari.com/2008/08/02/dizgi-string/">dizgisini (string)</a> almayı planlamıştık. Bu durumda ilk bitimiz 1 olarak geliyor ve S0 durumunda 1 girişi ile S2 durumuna geçiyoruz. Burada geçiş sırasında kullanılan kenarın üzerindeki değeri okuyalım: 1/0 bunun anlamı 1 geldiğinde geçilecek kenar olması ve çıktının 0 olmasıdır. Yani şu anda çıktımız 0</p>
<p>Ardından gelen değer 0 (yani şimdiye kadar 01 değerleri geldi). En son makinemizdeki durum, S2 durumuydu, şimdi yeni gelen değeri bu durumdaki kollardan takip ediyor ve S1&#8242;e giden 0/1 kenarını izliyoruz. Bu kolu izleme sebebimiz, S2 durumundan gidilen tek 0 girdisi kolu olmasıdır. Bu kol üzerindeki ikinci değer olan 1 ise, çıktının 1 olduğudur. Yani buraya kadar olan girdiyi alacak olsaydık 01 için 1 çıktısı alacaktık.</p>
<p>İşlemlere devam edelim ve durumları yazmaya çalışalım:</p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 56px;"></col>
<col style="width: 57px;"></col>
<col style="width: 41px;"></col>
<col style="width: 56px;"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border: solid 0.5pt;">Gelen Değer</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Durum</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Çıkış</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Yeni Durum</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S1</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S1</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
</tr>
</tbody>
</table>
</div>
<p>Yukarıdaki tablomuzun son halinde, çıkış değeri olarak 0 okunmuştur. Yani örneğimizin neticesi 0 olacaktır.</p>
<p>Aynı örneği moore makinesi olarak tasarlayacak olsaydık:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012611_1102_MealyveMoor2.png" alt="" /></p>
<p>Moore makinesinde, mealy makinesine benzer şekilde boşluktan gelen bir ok, başlangıç durumunu belirtir.</p>
<p>Makinenin, durumlarında, mealy makinesinde olmayan değerler eklenmiştir. Bu değerler, ilgili durumdaki çıktıyı gösterir. Örneğin makinemiz S1 durumundayken çıktı 0 olarak okunabilir.</p>
<p>Şimdi moore makinesinde, aynı örneği çalıştırıp sonucu karşılaştıralım.</p>
<p>Giriş olarak 101011 <a href="http://www.bilgisayarkavramlari.com/2008/08/02/dizgi-string/">dizgisini (string)</a> almayı planlamıştık. Bu durumda ilk bitimiz 1 olarak geliyor ve S0 durumunda 1 girişi ile S2 durumuna geçiyoruz. Bu geçiş sonucunda geldiğimiz S2 durumunda okunan çıktı değeri 0 yani sonuç şimdilik 0.</p>
<p>Ardından gelen 0 değeri ile S3 durumuna geçiyoruz ve çıktımız 1 oluyor. Çünkü S3 durumu 1 çıktısı veren durumdur. Bu şekilde durumları ve durumlar arasındaki geçişleri izlersek, aşağıdaki tabloyu çıkarabiliriz:</p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 56px;"></col>
<col style="width: 57px;"></col>
<col style="width: 41px;"></col>
<col style="width: 56px;"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border: solid 0.5pt;">Gelen Değer</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Durum</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Çıkış</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Yeni Durum</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S3</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S3</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S4</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S4</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S3</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S3</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S4</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S4</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">S2</td>
</tr>
</tbody>
</table>
</div>
<p>Görüldüğü üzere, makinemiz, örnek girdi için S2 durumunda sonlanıyor ve bu durumda çıktımız 0 olarak okunuyor.</p>

<p class="sayac_bilgi">812 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/01/26/mealy-ve-moore-makineleri-mealy-and-moore-machines/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>2-3 Ağacı (2-3 Tree)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/01/25/2-3-agaci-2-3-tree/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/01/25/2-3-agaci-2-3-tree/#comments</comments>
		<pubDate>Tue, 25 Jan 2011 12:13:06 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[veri yapıları]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/01/25/2-3-agaci-2-3-tree/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde kullanılan bir veri yapısıdır (data structures). Özel bir ağaç yapısıdır ve amaç ağacı sürekli olarak dengeli (balanced) tutmaktır. Ağaçtaki düğümlere (nodes) isim olarak 2 veya 3 ismi verilebilir. Her düğüm aldığı isme göre farklı işleme tabi tutulur. Düğümlerin isimlendirilmesi aşağıdaki şekilde yapılır: 2 düğümleri (2 nodes) : 2 [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerinde kullanılan bir veri yapısıdır (data structures). Özel bir <a href="http://bilgisayarkavramlari.com/2008/05/07/agaclar-tree/">ağaç yapısıdır</a> ve amaç ağacı sürekli olarak dengeli (balanced) tutmaktır.</p>
<p>Ağaçtaki <a href="http://www.bilgisayarkavramlari.com/2008/08/01/dugum-node/">düğümlere (nodes)</a> isim olarak 2 veya 3 ismi verilebilir. Her düğüm aldığı isme göre farklı işleme tabi tutulur. Düğümlerin isimlendirilmesi aşağıdaki şekilde yapılır:</p>
<p><strong>2 düğümleri (2 nodes) :</strong> 2 adet çocuğu ve bir veri elemanı bulunan düğüm yapısıdır</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012511_1212_23Aac231.png" alt="" /></p>
<p><strong>3 düğümleri (3 nodes) :</strong> 3 adet çocuğu ve iki veri elemanı bulunan düğüm yapısıdır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012511_1212_23Aac232.png" alt="" /></p>
<p><strong>2-3 Ağacına Ekleme işlemli<br />
</strong></p>
<p>Ağaca eklemeyi bir örnek üzerinden adım adım görelim. Ağacımıza ekleyeceğimiz sayılar aşağıdaki şekilde veriliyor olsun:</p>
<p>50, 27, 97, 52, 19, 11, 111</p>
<p>Bu sırayla verilen değerleri sırasıyla ağaca ekleyelim:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012511_1212_23Aac233.png" alt="" /></p>
<p>İlk sayı olan 50&#8242;nin eklenmesi sonucunda ağaçta tek bir düğüm ve bu düğümde tek bir veri bulunuyor. Bu tip düğüme 2 düğümü ismi verilmektedir ve iki çocuğu da boştur (null).</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012511_1212_23Aac234.png" alt="" /></p>
<p>İkinci eklenen değer 27&#8242;dir. Ağacımızda tek düğüm bulunduğundan ve bu düğüm 2 tipinde olduğundan, düğümde yeni değeri alacak yer bulunmaktadır. Bu yere yeni gelen değer yerleştirilir. Elbette düğümlerin içerisinde sıra bulunması gerektiği için, 27 değeri, 50 değerinin soluna yerleştirilmiştir. Bu kural bundan sonraki ekleme işlemlerinde de geçerli olacaktır. Yani düğüm içerisindeki değerler kendi aralarında sıralı olacak ve herhangi bir değerin solundaki çocuklarının değeri, kendi değerinden küçük ve sağındaki değeri kendi değerinden büyük olacaktır.</p>
<p>Ardından gelen ekleme değeri, 97&#8242;dir. Bu değer düğüme eklenince, aslında aşağıdaki gibi bir yapı elde edilir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012511_1212_23Aac235.png" alt="" /></p>
<p>Ancak ne yazık ki 2-3 ağaçlarında, 3 adet değeri tek bir düğümde bulundurma şansımız yoktur. Bu yüzden yukarıdaki bu hayali yapı bölünerek aşağıdaki şekle geçilir ve 3 adet 2 tipinde düğümümüz olur:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012511_1212_23Aac236.png" alt="" /></p>
<p>Yeni gelen değerimiz 52&#8242;dir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012511_1212_23Aac237.png" alt="" /></p>
<p>Yukarıdaki yeni şekilde, gelen 52 değeri, kök düğüm olan 50&#8242;den başlanarak ağaçta ufak bir dolaşmaya sebep olur. Öncelikle 50&#8242;den küçük olduğu için bu düğümün sağına sonra da 97&#8242;den küçük olduğu için bu düğümün soluna yerleştirilir.</p>
<p>52 değerinin, 50 değerinin sağına yerleştirilmemesinin sebebi, bu durumda ağaçta iki veri ve iki çocuk bulunan aşağıdaki hayali ağacın oluşmasıdır:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012511_1212_23Aac238.png" alt="" /></p>
<p>Yukarıdaki bu hayali ağaç ne yazık ki 2-3 ağaçlarında yer almaz. Tekrar hatırlatacak olursak 2-3 ağaçlarında 2 düğümlerinin 2 çocuk ve bir verisi, 3 düğümlerinin ise 3 çocuk ve 2 verisi bulunur. Yukarıdaki kök düğüm ise 2 veri ve 2 çocuk bulundurmaktadır. Bu durum kabul edilemez.</p>
<p>Yeni eklenen değerimiz 19:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012511_1212_23Aac239.png" alt="" /></p>
<p>Yukarıdaki bu yeni ağaç yapısı, bir önceki adımda açıklandığı gibi, 50&#8242;nin yanına yeni bir veri eklenememesinden dolayı, 50&#8242;nin solundaki düğüme eklenmesi sonucunda elde edilmiştir.</p>
<p>Sıradaki eklenecek olan veri 11&#8242;dir. Eklenmiş halini görmeden önce, hayali olarak ağaçta olması beklenen adımları açıklayalım. Öncelikle verinin eklenmek isteneceği yer, 50 değerindeki kök düğümünün soludur.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012511_1212_23Aac2310.png" alt="" /></p>
<p>Yukarıdaki hayali ağaç, ne yazık ki 2-3 ağaçları tarafından kabul edilemez. Dolayısıyla üç veri içeren bu düğümü tek başına ele aldığımızda (ki aynı durum, örneğimizde 97 eklenirken de yaşanmış ve 3 adet veri yan yana elde edilmesin diye 3 adet 2 tipinde düğüme dönüştürülmüştü) bölünme işlemi gerçekleştirilir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012511_1212_23Aac2311.png" alt="" /></p>
<p>Yukarıdaki bu alt ağacı, bir önceki ağacımız ile birleştirirsek:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012511_1212_23Aac2312.png" alt="" /></p>
<p>Elde ettiğimiz yeni ağaç, yukarıdaki şekilde iki ağacın birleştirilmiş hali olur.</p>
<p>Son olarak ekleyeceğimiz değer 111 olsun.  Bu değer eklendiğinde ağaçta bir zincirleme reaksiyon oluşur ve birden fazla düğümün yukarıya doğru bölünmesi gerekir. Öncelikle 111 değeri 50&#8242;den büyük olduğu için, ağaçta 50&#8242;nin sağındaki <a href="http://www.bilgisayarkavramlari.com/2007/05/03/pointer-gosterici/">gösterici (pointer)</a> tarafından gösterilen düğüme yönlendirilir ve sanki aşağıdaki hayali ağacın oluşmasına sebep olur:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012511_1212_23Aac2313.png" alt="" /></p>
<p>Elbette yukarıdaki bu 3 veriyi yan yana tutan düğümü kabul edemeyeceğimiz için bu düğümü bölüyoruz:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012511_1212_23Aac2314.png" alt="" /></p>
<p>Bu sefer kök düğümdeki 3 veriyi kabul edemeyeceğimizden dolayı, kök düğümü de bölüyoruz:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012511_1212_23Aac2315.png" alt="" /></p>
<p>Sonuçta, yukarıdaki ağaç 2-3 ağacı olarak bütün değerlerin eklendiği ağaçtır. Buradaki son bölünmeden sonra toplam 7 adet 2 tipinde düğüm elde edilmiştir. Ayrıca yukarıdaki ekleme işlemleri boyunca her adıma bakıldığında ağacın dengeli bir ağaç olduğu (bütün yaprak düğümlerinin (leaf nodes) aynı seviyede olduğu ) görülebilir.</p>
<p>Aslında yukarıdaki isimlendirmeler<a href="http://www.bilgisayarkavramlari.com/2008/10/25/b-agaci-b-tree/">, B-Ağacının (B-Tree)</a> özel bir şekli olarak düşünülebilir. Yani, düğüm boyutu 2 olan bir b-ağacında, her düğümde ya iki ya da tek eleman bulunacak ve bulunan eleman sayısının bir fazlası kadar çocuk bulunacaktır.</p>
<p>2-3 Ağaçları, AA ağaçlarının (AA-trees), <a href="http://www.bilgisayarkavramlari.com/2009/06/18/denksekillilik-isomorphism/">eş şekillisi (isometry)</a> olarak düşünülebilir.</p>

<p class="sayac_bilgi">499 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/01/25/2-3-agaci-2-3-tree/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dairesel Bağlı liste ile Önceliğe sahip hasta sırası takibi</title>
		<link>http://www.bilgisayarkavramlari.com/2010/12/30/dairesel-bagli-liste-ile-oncelige-sahip-hasta-sirasi-takibi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/12/30/dairesel-bagli-liste-ile-oncelige-sahip-hasta-sirasi-takibi/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 19:02:15 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[veri yapıları]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/12/30/dairesel-bagli-liste-ile-oncelige-sahip-hasta-sirasi-takibi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Siteye gelen bir soru üzerine bu yazıyı ekliyorum. Öncelik sırası (priority queue), kullanarak gelen hastaları verilen önceliğe göre dairesel bir bağlı listeye (linked list) yerleştiren ve ardından sırayla gelen hastaları listeden alan bir kodu C++ dilinde yazalım. İlk olarak bir hastanın tanımını yapan sınıfı aşağıdaki şekilde kodluyoruz: Bu tanıma göre [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Siteye gelen bir soru üzerine bu yazıyı ekliyorum<a href="http://www.bilgisayarkavramlari.com/2009/10/04/priority-queue-oncelik-sirasi-ruchan-sirasi/">. Öncelik sırası (priority queue),</a> kullanarak gelen hastaları verilen önceliğe göre dairesel bir <a href="http://www.bilgisayarkavramlari.com/2007/05/03/linked-list-linkli-liste-veya-bagli-liste/">bağlı listeye (linked list)</a> yerleştiren ve ardından sırayla gelen hastaları listeden alan bir kodu C++ dilinde yazalım.</p>
<p>İlk olarak bir hastanın tanımını yapan sınıfı aşağıdaki şekilde kodluyoruz:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/123010_1901_DaireselBal1.png" alt="" /></p>
<p>Bu tanıma göre bir hasta, ad, soyad ve sıradaki önceliğini bilmektedir. Bu sınıftan üretilen her hasta için bu bilgilerin girilebileceğini kabul ediyoruz.</p>
<p>Ayrıca yukarıdaki hasta sınıfında, yine sınıf ile aynı isme sahip <a href="http://www.bilgisayarkavramlari.com/2008/11/24/yapici-constructor/">bir inşa fonksiyonu (constructor)</a> bulunmaktadır. Buradaki amaç, <a href="http://www.bilgisayarkavramlari.com/2008/07/15/nesne-object/">nesne (object)</a> oluşturulurken bu aşamada ilk değerlerini atamaktır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/123010_1901_DaireselBal2.png" alt="" /></p>
<p>Hasta sınıfını tanımladıktan sonra, bağlı listenin her bir düğümünü (node) tutacak olan sınıfa geçebiliriz. Yukarıdaki sınıf tanımında siraEleman ismi verilen bu yapıda, bir veri bir de sonraki üyeleri bulunmaktadır. Basitçe, veri göstericisi her düğümde duran anlık veriyi ve sonraki göstericisi ise bağlı listemizin sıradaki elemanını gösterecektir.</p>
<p>Sonuçta üretmeyi planladığımız bağlı listeyi aşağıdaki şekilde çizebiliriz:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/123010_1901_DaireselBal3.png" alt="" /></p>
<p>Yukarıdaki temsili resimde olduğu gibi, her düğüm (yuvarlak olarak tasvir edilmiştir), bir adet veriyi (kutu olarak tasvir edilmiştir) ve yine kendi cinsinden başka bir düğümü göstermektedir.</p>
<p>Sonuçta bağlı liste yapısı dairesel olmaktadır.</p>
<p>Yukarıda kodu verilen, siraEleman sınıfı işte bu resimdeki yuvarlak olarak tasvir edilen düğümleri tutmakta, hasta sınıfı ise kutularla gösterilen değerleri tutmaktadır.</p>
<p>Yukarıdaki temel sınıfları tanımladıktan sonra, ana sınıfımız olan ve <a href="http://www.bilgisayarkavramlari.com/2007/05/03/linked-list-linkli-liste-veya-bagli-liste/">bağlı listenin</a> kodlandığı sira sınıfını kodlamaya geçebiliriz.</p>
<p>Sınıfımızda 3 adet temel fonksiyon bulunacaktır. Bunlar ekleme işlemi yapan ekle fonksiyonu, sıradaki hastayı alan siradaki fonksiyonu ve bağlı listenin durumunu bastıran bastir fonksiyonudur.</p>
<p>Sırasıyla bu fonksiyonların kodlamasını inceleyelim:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/123010_1901_DaireselBal4.png" alt="" /></p>
<p>Yukarıdaki kodda, sıra bilgisini tutarken, sıranın ilk elemanını gösteren bir gösterici tanımlanmıştır. Bu gösterici &#8220;ilk&#8221; ismiyle isimlendirilmiş olup 27. satırda tanımlandıktan sonra, 28. satırda bulunan <a href="http://www.bilgisayarkavramlari.com/2008/11/24/yapici-constructor/">inşa fonksiyonu (constructor)</a> içerisinde ilk değeri atanmıştır. Buna göre ilk göstericisi, ilk başta NULL değer taşımaktadır. Bunu elle özel olarak yazıyor olmamız, kodun geliştirildiği Dev-CPP ortamından kaynaklanmaktadır. Normalde bazı derleyiciler, bir göstericinin içerisine değer konulmadığı zaman NULL değerini atar, ancak Dev-CPP ortamında bu işlemi elle yapmak gerekmektedir.</p>
<p>Sonuçta inşa fonksiyonumuz çalıştıktan sonra elimizde bir ilk isimli <a href="http://www.bilgisayarkavramlari.com/2007/05/03/pointer-gosterici/">gösterici (pointer)</a> ve bu göstericinin gösterdiği bir NULL değeri olacaktır. Bu durum, bizim listemizin boş olduğu durumdur.</p>
<p>Gelelim en kritik fonksiyonumuz olan ve 31. Satırdan itibaren başlayan ekle fonksiyonuna. Bu fonksiyon öncelikle eklenecek olan hastayı gösteren bir gösterici almaktadır. Ardından bu hastayı önceliğine göre, dairesel listemize eklemektedir.</p>
<p>Fonksiyonda görüldüğü üzere 3 ihtimal değerlendirilmiştir. İlk if satırımızda (32. satır) listenin boş olup olmadığı kontrol edilmiştir.</p>
<p>Şayet liste henüz boşken ekleme işlemi yapılmak isteniyorsa, bu durumda tek bir düğüm oluşturup bu düğümün sonraki elemanı olarak gene kendisini işaretliyoruz. (listenin dairesel liste olması gerektiğini hatırlayınız).</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/123010_1901_DaireselBal5.png" alt="" /></p>
<p>Ayrıca listemizin ilk elemanını gösteren ilk göstericisi de bu yeni oluşturulan düğümü göstermektedir.</p>
<p>İkinci kontrolümüz (kodun 36. Satırında) bağlı listeye eklenen ilk elemandan daha önde olması gereken bir eleman olması durumunu incelemektedir.</p>
<p>Bu kontrol oldukça önemlidir ve dikkatsiz bir kodlamada gözden kaçabilir.</p>
<p>Listenin ilk elemanını gösteren ilk isimli gösterici sabit düşünülürse, bu durumda bu göstericinin gösterdiği düğümün değerine göre daha öncelikli birisi gelmesi durumunda hata oluşur. Çözüm olarak kodun 36. Satırında bulunan if kontrolü eklenmiştir.</p>
<p>Kontrolden geçilmesi durumunda yapmamız gereken en önemli eylem, ilk elemanımızı gösteren elemanı bulmaktır. Bunun sebebi dairesel bir listeye ekleme yapılırken, listenin ilk elemanını, listenin son elemanını göstermesi özelliğini bozmamaktır.</p>
<p>Örneğin aşağıdaki şekilde bir <a href="http://www.bilgisayarkavramlari.com/2007/05/03/linked-list-linkli-liste-veya-bagli-liste/">bağlı listemiz</a> bulunsun:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/123010_1901_DaireselBal6.png" alt="" /></p>
<p>Yeni gelen (ve resimde yeşil renkle gösterilen) elemanı, listeye ekleyeceğimizi düşünelim. Ayrıca listenin başına eklemek istediğimizi de düşünelim.</p>
<p>Bu durumda ilk elemanı gösteren ve listenin sonunda olan elemanın sonrasına bu yeni gelen yeşil eleman eklenecektir.</p>
<p>Sonuç olarak ilave bir gösterici ile listede hareket edip ilk göstericisini kaybetmeden listenin sonuna gitmemiz gerekiyor. Kodda bu göstericiye iter adı verilmiştir (iter kelimesi iterator kelimesinin kısaltması olarak liste içerisinde dolaşan bir göstericiye atfen verilmiştir).</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/123010_1901_DaireselBal7.png" alt="" /></p>
<p>Yukarıdaki şekilde, iter göstericisi son elemanı gösterdikten sonra ekleme işlemi yapılabilir. İter göstericisinin sona gitmesini sağlayan, kodun 38. satırındaki while döngüsüdür. Ardından iter-&gt;sonraki = yeni denilerek önce son elemandan yeni elemana bir gösterici atanmaktadır:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/123010_1901_DaireselBal8.png" alt="" /></p>
<p>Ardından yeni-&gt;sonraki = ilk denilerek bu yeni eklenen elemanın sonrasına ilk eleman konulmaktadır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/123010_1901_DaireselBal9.png" alt="" /></p>
<p>Son olarak yeni eklenen bu elemanı listenin başı yapmak için ilk= yeni denilmektedir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/123010_1901_DaireselBal10.png" alt="" /></p>
<p>Artık listemiz, yukarıdaki şekilde de görüldüğü üzere, yeşil elemandan başlayıp, dairesel bir şekilde hafızada tutulmaktadır.</p>
<p>Gelelim ekleme işleminin son koşulu olan ve 45. Satırdan başlayan else bloğuna.</p>
<p>Bu durum, listenin boş  olması ve listenin en başına eklenmesi durumları dışında kalan durumları tutmaktadır.</p>
<p>Listenin sonuna veya aradaki herhangi iki düğüm arasına eklemek için bu blok çalışır.</p>
<p>İşlem oldukça basit bir şekilde, eklenecek olan düğüme kadar önceliklere dikkat ederek ilerleme esasına dayanır. Kodun 48. satırındaki while döngüsü, liste sonu veya öncelik sırasında bizden sonrakileri atlayarak ilerler. Bizden önceliksiz birisi gelince bizi eklemek için durur. Bu kontrol sırasında, tek eleman bulunması ihtimali veya listenin sonuna eklenmesi ihtimaline karşı ilave bir if satırı daha eklenmiştir.</p>
<p>İşlem basitçe yeni bir düğüm oluşturup, ekleme işlemi yapacağımız düğümden sonrasının sonrasını, geçici bir <a href="http://www.bilgisayarkavramlari.com/2007/05/03/pointer-gosterici/">göstericide (pointer)</a> tutmaktadır.</p>
<p>Ekleme işlemi yapılıp eklenecek düğümden sonrasına, yeni düğüm bağlandıktan sonra, işte bu geçici düğüm, yeni düğümümüzün sonrasına bağlanmaktadır.</p>
<p>Sıradaki hastanın alınması işlemi için olan kodlamamız aşağıdaki şekildedir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/123010_1901_DaireselBal11.png" alt="" /></p>
<p>Yukarıdaki kodda, ekleme koduna benzer şekilde 3 ihtimal değerlendirilmiştir. İlk ihtimalde, liste boşken, sıradaki hasta istendiğinde, NULL değer döndürülmektedir.</p>
<p>İkinci ihtimalde, şayet listedeki son hasta da alınırsa, bu durumda liste boş hale getirilmektedir. Koddaki 63. Satırda bulunan free komutu gerekmemekle birlikte, kullanılmaması durumunda hafızada (RAM) tutulmakta olan hasta bilgileri silinmez. Uzun süreli kullanımlarda hafızada bu tip veri kırıntılarının kalması performans kaybına ve nihayetinde programın bozulmasına sebep olur. Bu yüzden hafızada bulunan bütün nesneleri, işimiz bittikten sonra free komutu ile kaldırmamız gerekir.</p>
<p>Free komutunu kullanabilmek için, geçici bir pointer (temp) tanımlanmalıdır. Bu tanımlamayı yapmadan free yaparsak, hasta bilgileri silinir. Dolayısıyla önce hasta bilgileri geçici bir göstericiye atanır, sonra free yapılıp bu geçici göstericinin değeri fonksiyon sonucu olarak döndürülür (return).</p>
<p>Son else koşulu ise, diğer bütün durumları (listenin boş olmaması ve listedeki son hastanın alınmaması durumunu) kapsar.</p>
<p>Basitçe sıradaki eleman ilk göstericisinin gösterdiği elemandır. Bu eleman alınıp, free yapıldıktan sonra döndürülür.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/123010_1901_DaireselBal12.png" alt="" /></p>
<p>Bastır fonksiyonumuz, listenin ilk elemanını gösteren ilk göstericisinden başlayarak listedeki bütün elemanları bir döngüyle dolaşarak bastırır. Burada dolaşma işleminin bitmesinin ardından iter isimli, listeyi dolaşan gösterici, listenin son elemanını bastırmadan çıkar. Çözüm olarak 81. satırdaki gibi ilave bir bastırma işlemine ihtiyaç duyulur.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/123010_1901_DaireselBal13.png" alt="" /></p>
<p>Kodun testi için, yukarıdaki gibi bir main fonksiyonu hazırladım. Basitçe 5 hastayı, karışık şekillerde ekliyor ve arından 3 kişiyi sıradan istiyor. Ekran çıktısı aşağıdaki şekilde başarılı çalışmaktadır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/123010_1901_DaireselBal14.png" alt="" /></p>
<p>Yukarıdaki çıktıda görülen bir takım kontrol satırları (debug) koddaki çalışmayı göstermektedir. Kodun son 3 satırı, istediğimiz sıradaki hastaları vermektdir. En yüksek öneme sahip olan sadi-seker-6 ilk gelmekte sonra 5 ve 4 önemlerine sahip kişiler çıkmaktadır.</p>
<p>Bu son 3 satırdan önceki 5 satır ise, listenin son durumunu göstermektedir. Görüldüğü üzere listedeki 5 kişi önem sırasına göre yerleştirilmiştir.</p>
<p><a href="http://www.bilgisayarkavramlari.com/wp-content/uploads/circhasta.cpp">Kodun tamamına erişmek için tıklayınız.</a></p>

<p class="sayac_bilgi">521 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/12/30/dairesel-bagli-liste-ile-oncelige-sahip-hasta-sirasi-takibi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

