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

<channel>
	<title>Bilgisayar Kavramları &#187; algoritma analizi (teory of algorithms)</title>
	<atom:link href="http://www.bilgisayarkavramlari.com/category/algoritma-analizi-teory-of-algorithms/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bilgisayarkavramlari.com</link>
	<description>www.bilgisayarkavramlari.com</description>
	<lastBuildDate>Wed, 18 Aug 2010 21:13:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>NL (Non-deterministic Logarithmic)</title>
		<link>http://www.bilgisayarkavramlari.com/2010/07/03/nl-non-deterministic-logarithmic/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/07/03/nl-non-deterministic-logarithmic/#comments</comments>
		<pubDate>Sat, 03 Jul 2010 13:39:13 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Matematiği]]></category>
		<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/07/03/nl-non-deterministic-logarithmic/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde de sıkça kullanılan ve matematiğin bir parçası olan karmaşıklı teorisi (complexity theory) içerisinde tanımlı olan bir karmaşıklık sınıfıdır (kümesidir, set) Bu kümenin özelliği, bu kümenin üyesi olan, fonksiyon, denklem veya algoritmaların logaritmik zamanda veya logaritmik hafıza ihtiyacı ile çalışıp çalışamayacağının veya çözülüp çözülemeyeceğinin belirlenememesidir. Bu kümenin tanım itibariyle [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerinde de sıkça kullanılan ve matematiğin bir parçası olan karmaşıklı teorisi (complexity theory) içerisinde tanımlı olan bir karmaşıklık<a href="http://www.bilgisayarkavramlari.com/2009/06/24/kume-teorisi-set-theory/"> sınıfıdır (kümesidir, set) </a></p>
<p>Bu kümenin özelliği, bu kümenin üyesi olan, fonksiyon, denklem veya algoritmaların logaritmik zamanda veya logaritmik hafıza ihtiyacı ile çalışıp çalışamayacağının veya çözülüp çözülemeyeceğinin belirlenememesidir.</p>
<p>Bu kümenin tanım itibariyle tersi olan L (logarithmic) kümesinde bulunan problemler, algoritmalar veya fonksiyonlar ise logaritmik zamanda veya alanda çözülebilmektedir.</p>
<p>Bu tanımlarda geçen &#8220;zamanda veya alanda&#8221; ibaresi ile, karmaşıklığın zaman (time complexity) veya alan (memory complexity) olabileceği ifade edilmek istenmiştir. Yani, örneğin, bir algoritmanın zamansal çalışma karmaşıklığı (time complexity) NL sınıfından olurken, hafızadaki ihtiyacı (memory complexity) farklı  bir sınıfta olabilir.</p>
<p>Logaritmik karmaşıklık konusunda bilinmesi gereken bir diğer konu ise RL sınıfıdır. Bu sınıf, tanım itibariyle olasılığa dayalı bir yapı izler. Randomized Logarithmic kelimelerinin baş harflerinden oluşan bu sınıftaki problemler, algoritmalar veya fonksiyonlar ise olasılıksal Turing Makinesi (Probabilistic Turing Machine) tarafından kabul edilirler.</p>
<p>Olasılıksal Turing makinesi, tanım itibariyle, sadece doğru durumları kabul eden ama yanlış durumları belirlerken hata yapabilen makinedir. Yani bir <a href="http://www.bilgisayarkavramlari.com/2009/06/27/turing-makinesi-turing-machine/">Klasik Turing makinesinde (Turing Machine)</a> iki sonuçtan biri çıkar:</p>
<ul>
<li>Kabul (Accept)</li>
<li>Red (Reject)</li>
</ul>
<p>Normal bir Turing makinesi tasarım itibariyle bu iki durumu doğru olarak döndürebilmelidir. Olasılıksal Turing makinesi ilk şart olan kabul durumlarını doğru olarak döndürürken, ikinci ihtimal olan red durumlarında hata yapabilir.</p>
<p>RL sınıfı işte bu tip Turing makinelerinin logaritmik zamanda veya logaritmik alanda çözülebilmesi anlamındadır.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/07/03/nl-non-deterministic-logarithmic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bool Tatmin Problemi</title>
		<link>http://www.bilgisayarkavramlari.com/2010/07/03/bool-tatmin-problemi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/07/03/bool-tatmin-problemi/#comments</comments>
		<pubDate>Sat, 03 Jul 2010 13:36:53 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[3cnfsat]]></category>
		<category><![CDATA[3sat]]></category>
		<category><![CDATA[bool sat]]></category>
		<category><![CDATA[SAT]]></category>
		<category><![CDATA[tatmin]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/07/03/bool-tatmin-problemi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Litartürde, Boolean Satisfiability Problem olarak geçen ve boole cebirindeki denklemlerin doğruluğunun sağlanması olarak özetlenebilecek olan problemdir. Ayrıca çeşitli kaynaklarda bu probleme, problemin İngilizce tanımında geçen Satisfiability kelimesinin kısaltması olan SAT kelimesi olarak da rastlanabilir. Bu problemi, bilgisayar bilimleri açısından ilginç kılan yanı ise, problemin yapısal olarak bir NP-Tam (NP-Complete) sınıfı [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Litartürde, Boolean Satisfiability Problem olarak geçen ve boole cebirindeki denklemlerin doğruluğunun sağlanması olarak özetlenebilecek olan problemdir.  Ayrıca çeşitli kaynaklarda bu probleme, problemin İngilizce tanımında geçen Satisfiability kelimesinin kısaltması olan SAT kelimesi olarak da rastlanabilir.</p>
<p>Bu problemi, bilgisayar bilimleri açısından ilginç kılan yanı ise, problemin yapısal olarak bir <a href="http://www.bilgisayarkavramlari.com/2008/03/24/belirsiz-cokterimli-tam-np-complete-nondeterministic-polynomial-complete/">NP-Tam (NP-Complete) </a>sınıfı problem olmasıdır.</p>
<p>Boole Cebiri, aslında mantıksal bir gösterim ifade etmektedir. Dolayısıyla mantıktaki karşılığı olarak probleme <a href="http://www.bilgisayarkavramlari.com/2007/11/29/onermeler-mantigi-propositional-logic/">önermeler mantığı (propositional logic, kaziye mantığı)</a> tatmin problemi ismi de verilebilir.</p>
<p>Boole cebirinden alışıldığı üzere mantıksal kurgu için tanımlı olan ve bilgisayar bilimlerinde değişken (variable) olarak isimlendirilebilecek belirticiler (literal, lafziler) bulunmaktadır. Bunlar basit birer sembol ile gösterilir.</p>
<p>Örneğin x ile gösterilen bir sembol çoğu zaman gerçek hayattaki bir kaziyeyi (önerme, proposition) ifade etmektedir.</p>
<p>Bu lafzi gösterimlerin (literal, belirticiler) üzerinde tanımlı ve yine boole cebiri içerisinde kabul edilebilecek işlemler (operators) tanımlanabilir. En sık kullanılan bool cebiri işlemleri <a href="http://www.bilgisayarkavramlari.com/2007/11/29/ve-kapisi-and-gate/">ve(and)</a>, <a href="http://www.bilgisayarkavramlari.com/2007/11/29/veya-kapisi-or-gate/">veya (or)</a>, tersi (not) şeklinde sayılabilir. Bu işlemler kullanılarak kurulan bir dizilimin sonucunun yine bir lafzi gösterim (literal) cinsinden elde edilmesi ve ya doğru (true) ya da yanlış (false) olması beklenir.</p>
<p>Bu tanımın üzerine örneğin sadece 3 adet lafzi gösterim (literal)&#8217;in ve (and) bağlacı normal şeklinde (conjunction normal form) olması durumuna 3SAT veya 3CNFSAT  isimleri verilir. Bu problem NP-TAM (NP-Complete) bir problemdir.</p>
<p>Benzer tanım sadece 2 adet lafzi gösterim&#8217;in (literal) ve bağlacı normal şeklinde (conjunction normal form) olması durumuna ise 2SAT veya 2CNFSAT ismi verilir ve bu problem de<a href="http://www.bilgisayarkavramlari.com/2010/07/03/nl-non-deterministic-logarithmic/"> NL-Tam (NL-Complete)</a> bir problemdir.</p>
<p>Boole tatmin probleminin diğer önemli bir yanı da tarihsel olarak, 3SAT problemlerin, ilk NP-Complete problem olmasıdır. Bu konuda çalışan Stephen Cooke 1971 yılında bu problem grubunun NP-Complete olduğunu göstermiştir.</p>
<p>Ayrıca boole tatmin probleminin birinci derece mantık (First order predicate calculus) içerisindeki çözümünün aranması da ayrıca bir problemdir.</p>
<p>Bilindiği üzere birinci derece mantığın, üzerinde tanımlı olduğu lafzi gösterimler (literals) için bir takın etki alanı tanımlamaları (domain) mümkündür. Bu tanımlamalar ile verilen bir boole cebiri, diziliminin çözümlenmesi bir seviye daha karmaşık hale gelmektedir.</p>
<p>Örneğin aşağıdaki problemin çözümünü bu anlamda değerlendirebiliriz:</p>
<p>∃a (Şadi (a) ∧ Mühendis(a)) →  Öyle bazı a’lar vardır ki, bu a’nın ismi Şadi’dir ve bu a mühendistir.</p>
<p>Bu tip birinci derece mantık dizilimlerinin çözüm karmaşıklığı Co-NP problem olarak geçmektedir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/07/03/bool-tatmin-problemi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ve/Veya bağlacı normal şeklleri (Conjunction / Disjunction Normal Form)</title>
		<link>http://www.bilgisayarkavramlari.com/2010/07/02/veveya-baglaci-normal-seklleri-conjunction-disjunction-normal-form/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/07/02/veveya-baglaci-normal-seklleri-conjunction-disjunction-normal-form/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 09:54:46 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Automata (otomatlar, özdevinirler)]]></category>
		<category><![CDATA[Bilgisayar Matematiği]]></category>
		<category><![CDATA[Bilgisayar Standartları]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[cnf]]></category>
		<category><![CDATA[conjunction normal form]]></category>
		<category><![CDATA[disjunction normal form]]></category>
		<category><![CDATA[dnf]]></category>
		<category><![CDATA[ve normal şekli]]></category>
		<category><![CDATA[veya normal şekli]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/07/02/veveya-baglaci-normal-seklleri-conjunction-disjunction-normal-form/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu gösterim, bool cebirinde (boolean algebra) kullanılan ve kaziyeleri (önerme, proposition) ve (and) bağlacı ile bağlamanın özel bir şeklidir. Kısaca CNF (conjuction normal form) olarak ifade edilir. Diğer bir normal şekil olan Chomsky Normal Form (CNF) ile ilgili bilgi arıyorsanız buradan ulaşabilirsiniz. Bu özel şeklin taşıdığı kuralları aşağıdaki şekilde sıralayabiliriz: [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bu gösterim, bool cebirinde (boolean algebra) kullanılan ve kaziyeleri (önerme, proposition) <a href="http://www.bilgisayarkavramlari.com/2007/11/29/ve-kapisi-and-gate/">ve (and)</a> bağlacı ile bağlamanın özel bir şeklidir. Kısaca CNF (conjuction normal form) olarak ifade edilir. <a href="http://www.bilgisayarkavramlari.com/2009/06/22/chomsky-normal-sekili-chomsky-normal-form/">Diğer bir normal şekil olan Chomsky Normal Form  (CNF) ile ilgili bilgi arıyorsanız buradan ulaşabilirsiniz. </a></p>
<p>Bu özel şeklin taşıdığı kuralları aşağıdaki şekilde sıralayabiliriz:</p>
<p>Ters (not) işlemi, sadece önermelerin lafzi gösterimlerin (literal) başında bulunacaktır. Bir <a href="http://www.bilgisayarkavramlari.com/2007/11/29/onermeler-mantigi-propositional-logic/">kaziyenin (önerme, propositon)</a> başında bulunmayacaktır.</p>
<p>Örneğin ¬A şeklindeki tek lafzi gösterim üzerinde olan ters işlemi kabul edilirken ¬(A V B) şekli kabul edilemez.</p>
<p>Ve (and) işlemi,  iki operand almaktadır. Yani a ve b şeklindeki bir işlemde a ve b adında iki lafzi gösterim (literal) bulunmaktadır. Bu işlemin herhangi bir operandı, basit bir lafzi gösterim (literal) veya <a href="http://www.bilgisayarkavramlari.com/2007/11/29/veya-kapisi-or-gate/">disjunction (veya operatörü (or opeartor)</a> ile oluşturulmuş bir) kaziye (önerme, proposition) olmalıdır.</p>
<p>Örneğin  aşağıdaki gösterimler bu kurala uymaktadır:</p>
<p>A Λ B</p>
<p>(A V B ) Λ (C V D)</p>
<p>A Λ (C V D V F)</p>
<p>Ancak aşağıdaki gösterimler bu kurala uymaz</p>
<p>A Λ (B Λ C)</p>
<p>A Λ (B V C Λ D)</p>
<p>(A Λ B) Λ C</p>
<p>Ancak yukarıdaki gösterimler CNF (conjuction normal form) yani ve bağlacı normal şekline çevrilebilir. Bu çevirimler aşağıda gösterilmiştir (yukarıdaki her satır için sırasıyla)</p>
<p>A Λ B Λ C</p>
<p>A Λ ( B V C ) Λ ( B V D)</p>
<p>A Λ B Λ C</p>
<p>Görüldüğü üzere yukarıdaki yeni hallerinde, verilen gösterimler ve bağlacı üzerinde basitleştirilmiştir.</p>
<p>Disjunction Normal Form (DNF, Veya bağlacı normal şekli) ise yukarıdaki ve bağlacı için söylenen her şeyin, veya bağlacı için geçerli olması durumudur.</p>
<p>Kısaca bu şekilde kabul edilemeyecek gösterimleri ve çevrilmiş şekillerini aşağıda verelim:</p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 318px;"></col>
<col style="width: 318px;"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border: solid black 0.5pt;">DNF şeklinde olmayanlar</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid black 0.5pt; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt;">DNF karşılığı</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid black 0.5pt; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt;">(A V B) Λ C</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt;">(A Λ C) V (B Λ C)</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid black 0.5pt; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt;">A Λ (B V C Λ D)</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt;">(A Λ B) V (A Λ (C Λ D))</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid black 0.5pt; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt;">¬(A Λ B)</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt;">¬A V ¬B</td>
</tr>
</tbody>
</table>
</div>
<p>İki gösterimin doğruluğunun tespiti. Yani verilen bir boole cebiri diziliminin gerçekten CNF veya DNF olduğunun sınanması, veya verilen bir denklemin sonucunun doğru (true) veya yanlış (false) olarak bulunabilmesi, bu denklemdeki lafzi terim (literal) sayısına bağlıdır. Örneğin 3CNF bir denklemin, yani sadece 3 terimin conjunction (ve bağlacı ile bağlanmasından) oluşan bir denklemin karmaşıklığı NP-Complete olurken, bu terim sayısı 2&#8242;ye indirildiğinde yani 2CNF bir denklem söz konusu olduğunda, karmaşıklık P zamanda (polinom zamanda) çözülebilmektedir.<br />
Daha detaylı bilgi için ikili tatmin problemleri (boolean satisfaction problem) başlıklı yazıyı okuyabilirsiniz. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/07/02/veveya-baglaci-normal-seklleri-conjunction-disjunction-normal-form/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Karmaşıklık Sınıfları (Complexity Classes)</title>
		<link>http://www.bilgisayarkavramlari.com/2010/06/17/karmasiklik-siniflari-complexity-classes/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/06/17/karmasiklik-siniflari-complexity-classes/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 12:26:10 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[average case]]></category>
		<category><![CDATA[best case]]></category>
		<category><![CDATA[big-o]]></category>
		<category><![CDATA[big-omega]]></category>
		<category><![CDATA[big-theta]]></category>
		<category><![CDATA[complexity class]]></category>
		<category><![CDATA[karmaşıklık sınıfı]]></category>
		<category><![CDATA[lower bound]]></category>
		<category><![CDATA[small-o]]></category>
		<category><![CDATA[small-omega]]></category>
		<category><![CDATA[upper bound]]></category>
		<category><![CDATA[worst case]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/06/17/karmasiklik-siniflari-complexity-classes/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerine matematikten miras kalan karmaşıklık teorisi (complexity theory) konularından birisidir. Aslında problem veya algoritmaların çözüme ulaşmadaki karmaşıklığını ölçmek için kullanılır. Bu tanımın ardında, her problem veya algoritmanın bir fonksiyon gibi düşünülebilmesi, ve matematikteki fonksiyonların karmaşıklığını sınıflandırmak için kullanılan karmaşıklık sınıflarının (complexity classes) , algoritmalar için uygulanması yatmaktadır. Bilgisayar bilimlerinde [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerine matematikten miras kalan karmaşıklık teorisi (complexity theory) konularından birisidir. Aslında problem veya algoritmaların çözüme ulaşmadaki karmaşıklığını ölçmek için kullanılır.</p>
<p>Bu tanımın ardında, her problem veya algoritmanın bir fonksiyon gibi düşünülebilmesi, ve matematikteki fonksiyonların karmaşıklığını sınıflandırmak için kullanılan karmaşıklık sınıflarının (complexity classes) , algoritmalar için uygulanması yatmaktadır.</p>
<p>Bilgisayar bilimlerinde kullanılan karmaşıklık sınıfları 5 tanedir.</p>
<ol>
<li>Küçük-o (small-o)</li>
<li>Büyük-O (big-o, veya big-oh diye de geçer)</li>
<li>Teta (Theta Θ, sadece büyük tetadan bahsedebiliz)</li>
<li>Büyük omega (big-Ω )</li>
<li>Küçük omega(small-ω )</li>
</ol>
<p>Bu beş sınıf, aynı fonksiyon için uygulanan ve bir fonksiyonun farklı özelliklerini anlatan sınıftır.</p>
<p>Bu sınıflar, bir algoritma hakkında bilgi edinmemizi sağlar. Bu bilgileri aşağıdaki şekilde sıralayabiliriz:</p>
<ul>
<li>Bir algoritmanın ölçeği  (Scalability)</li>
<li>Bir algoritmanın zaman ve hafıza ihtiyacı (hızı ve ne kadar yer kaplayacağı) (time and memory efficiency)</li>
</ul>
<p>Bu sonuçlara, algoritmanın kullanıldığı giriş bilgisine göre ulaşılır. Bir algoritmanın işlediği veri miktarına göre ne kadar zaman ve ne kadar yer gerektiğini gösterir.</p>
<p><strong>Örnek<br />
</strong></p>
<p>Örneğin klasik bir arama algoritması olan <a href="http://www.bilgisayarkavramlari.com/2008/11/09/dogrusal-arama-linear-search/">doğrusal arama (linear search)</a> algoritmasını ele alalım. Bu algoritma verilen bir dizide karışık olarak duran sayılardan bir tanesini bulmayı hedefler.</p>
<p>int a[10] = { 3, 7, 2, 5, 6, 1, 8, -12, 11, 45};</p>
<p>Yukarıdaki dizide bulunan bir sayının kaçıncı sırada olduğunu aramak isteyelim. Örneğin 8 kaçıncı sıradaki sayıdır?</p>
<p>Algoritma, ilk elemandan başlayarak son elemana kadar bütün sayılara bakar ve aranan sayıya rastlarsa sonlanır. Bu durumda aranan 8 sayısını bulmak için sırasıyla 3,7,2,5,6 ve 1 sayılarına bakılacak, nihayet 8 sayısı bulununca 7. Sırada bulunduğu sonucu ile algoritma bitecektir.</p>
<p>Algoritmanın yer ihtiyacı ne kadardır?</p>
<p>Bu algoritmanın üzerinde çalıştığı veri büyüklüğü dizinin büyüklüğüdür ve bu değer 10&#8242;dur. Dolayısıyla arama işleminin n sayı içerisinden yapılacağını düşünürsek, n sayıyı hafızada tutmamız gerektiğini görürüz. Demek ki algoritmamızın hafıza karmaşıklığı (memory complexity) n&#8217;dir.</p>
<p>Algoritmanın çalışma hızı nedir?</p>
<p>Arama işleminin n adet sayı üzerinde yapıldığını söylersek, aşağıdaki 3 durumu incelememiz gerekir:</p>
<ol>
<li>En kötü ihtimalle kaç adımda bulunur? (worst case)</li>
<li>En iyi ihtimalle kaç adımda bulunur? (best case)</li>
<li>Ortalama kaç adımda bulunur? (average case)</li>
</ol>
<p>Bu ihtimal analizini doğrusal arama algoritmamıza uyguladığımızda, karşılaşabileceğimiz en kötü durum aranan sayının dizinin en sonunda bulunması veya dizide hiç bulunmamasıdır. Bu durumda dizideki bütün elemanlara bakılması gerekecektir. Dolayısıyla en kötü durumda karmaşıklığımız n sayı için n olacaktır.</p>
<p>En iyi ihtimal ise, ilk bakılan sayının, aranan sayı olmasıdır. Bu durumda tek bir bakma işlemi yeterlidir. Bu durumdaki karmaşıklığımız ise 1 olacaktır.</p>
<p>Ortalama durum ise bu algoritmanın çok sefer çalışması sonucunda istatistiksel olarak ortalama kaç elemana bakılacağıdır. Bu dizide bulunan sayıların hepsinin aranma oranlarının eşit olduğunu kabul edersek, ortalama durum n/2 olur.</p>
<p>İşte yukarıdaki bu durum analizleri, bizim karmaşıklık sınıflarımızı veren analizlerdir.</p>
<p>O – En kötü durum analizi</p>
<p>Θ &#8211; Ortalama durum analizi</p>
<p>Ω- En iyi durum analizi</p>
<p>Aynı zamanda, bir fonksiyon için de o gösterimi üst sınırı (upper bound), gösterimi ise alt sınırı (lower bound) ifade eder.</p>
<p>Örnek olarak aşağıdaki fonksiyonu ele alacak olursak.</p>
<p>f(x) = 3x<sup>5</sup></p>
<p>Bu fonksiyona bir üst sınır çizmek istenirse, örneğin 7x<sup>5</sup> fonksiyonu çizilebilir.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/061710_1226_KarmaklkSn1.png" alt="" /></p>
<p>Mavi fonksiyon 7x<sup>5</sup> ve kırmızı fonksiyon ise f(x) fonksiyonudur.</p>
<p>Yukarıdaki şekilde görüldüğü üzere, x=0 noktasından büyük değerler için yani x&gt;0 için, mavi renkle gösterilen fonksiyon, kırmızı fonksiyonun üst sınırını oluşturmaktadır ve denilebilir ki, kırmızı fonksiyon hiçbir zaman mavi fonksiyonun üzerine geçemez.</p>
<p>Bu durumda mavi fonksiyon, kırmızının üst sınırı (upper bound) olmuş olur. Diğer bir deyişle, mavi fonksiyon, kırmızı fonksiyondan daha kötü bir fonksiyondur ve kırmızı fonksiyon en kötü ihtimalle mavi fonksiyon kadar kötü olabilir.</p>
<p>Bu durumu büyük-o ile gösterirsek:</p>
<p>f(x) ∈ O (x<sup>5</sup>)</p>
<p>şeklinde yazmamız yeterlidir. Bu gösterimin açılımı aşağıda verilmiştir:</p>
<p>f(x) ∈ O(g(x)) , öyle bir c değeri bulunursa ki, x<sub>0</sub>&gt;0 için,  x&gt;x<sub>0</sub> şartıyla, bütün f(x) ≤ c g(x) olsun.</p>
<p>Bu tanım, kısaca, şayet f(x) ∈ O(g(x)) bağlantısı verilirse, herhangi bir x0 noktasından başlanarak sonsuza kadar bütün f(x) ≤ c g(x) koşulunu sağlayan bir c değerinin bulunabileceğini anlatmaktadır.</p>
<p>Yukarıdaki tanımın tam tersi omega için geçerlidir.</p>
<p>f(x) ∈ Ω(g(x)) , öyle bir c değeri bulunursa ki, x<sub>0</sub>&gt;0 için,  x&gt;x<sub>0</sub> şartıyla, bütün f(x) ≥ c g(x) olsun.</p>
<p>Bu tanım, kısaca, şayet f(x) ∈ Ω(g(x)) bağlantısı verilirse, herhangi bir x0 noktasından başlanarak sonsuza kadar bütün f(x) ≥ c g(x) koşulunu sağlayan bir c değerinin bulunabileceğini anlatmaktadır.</p>
<p>Bu iki tanımda dikkat edilecek bir nokta, f(x) ile c*g(x) arasındaki bağlantının eşitliği de kapsamasıdır. Yani örneğin big-omega için, c*g(x) değeri f(x) fonksiyonundan küçük veya eşit olabilir.</p>
<p>Şayet bu tanımdaki eşitliği kaldırırsak, küçük-o ve küçük-ω tanımını elde ederiz. Yani küçük-o için, c*g(x) değerinin f(x) değerinden sürekli olarak büyük olması gerekir.</p>
<p>Theta gösterimi ise ortalama durum, yani eşitlik durumu içindir. Burada aranan şart f(x) ∈ Θ(g(x)) için c<sub>1</sub>*g(x)≥f(x)≥c<sub>2</sub>*g(x)&#8217;dir. Yani g(x) fonksiyonunun f(x) fonksiyonu ile aynı şekilde hareket ettiğini göstereniki sabit sayı, c<sub>1</sub> ve c<sub>2</sub> bulunabiliyorsa f(x) ∈ Θ(g(x)) denilebilir.</p>
<p>Bu durumda yukarıda listelediğimiz 5 sınıf aşağıdaki şekilde ilişkilendirebiliriz:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/061710_1226_KarmaklkSn2.png" alt="" /></p>
<p>Yukarıdaki şekilde anlatılmak istenen, sınıflar arasında, bazı kesişim durumlarının olduğudur. Görüldüğü üzere, en kötü durum (big-o) ile en iyi durum (big-Ω) kesişmesi sadece eşitlik durumunda olur. Bu durum ise teta ile gösterilmektedir. Benzer şekilde küçük-o ve küçük omega hiçbir zaman kesişemez  ve büyük-o ile küçük-o arasında ve büyük omega ile küçük omega arasındaki fark alanında eşitlik durumları bulunur.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/06/17/karmasiklik-siniflari-complexity-classes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bellman Ford Algoritması</title>
		<link>http://www.bilgisayarkavramlari.com/2010/05/26/bellman-ford-algoritmasi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/05/26/bellman-ford-algoritmasi/#comments</comments>
		<pubDate>Wed, 26 May 2010 19:32:54 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[bellman ford]]></category>
		<category><![CDATA[dijkstra]]></category>
		<category><![CDATA[En kısa yol]]></category>
		<category><![CDATA[shortest path]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/05/26/bellman-ford-algoritmasi/</guid>
		<description><![CDATA[UAYRI!: Bu yazıda hatalar bulunmaktadır (Uğur Bey&#8217;e teşekkürler). Bu yazıda anlatılan algoritma verilen örnekteki özel olarak sıralanmış kenarlar için doğru çalışmakta ancak farklı durumlarda hata yapabilmektedir. Bellman-Ford algoritmasının tam ve doğru anlatımı için http://www.bilgisayarkavramlari.com/2010/08/05/bellman-ford-algoritmasi-2/ adresindeki yazıyı okuyabilirsiniz. Yazan : Şadi Evren ŞEKER Bu algoritmanın amacı, bir şekil (graph) üzerindeki, bir kaynaktan (source) bir hedefe(target veya [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ff0000;"><strong>UAYRI!: Bu yazıda hatalar bulunmaktadır (Uğur Bey&#8217;e teşekkürler). Bu yazıda anlatılan algoritma verilen örnekteki özel olarak sıralanmış kenarlar için doğru çalışmakta ancak farklı durumlarda hata yapabilmektedir. Bellman-Ford algoritmasının tam ve doğru anlatımı için <a href="http://www.bilgisayarkavramlari.com/2010/08/05/bellman-ford-algoritmasi-2/">http://www.bilgisayarkavramlari.com/2010/08/05/bellman-ford-algoritmasi-2/</a> adresindeki yazıyı okuyabilirsiniz.</strong></span></p>
<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bu algoritmanın amacı, bir <a href="http://www.bilgisayarkavramlari.com/2008/08/01/graf-sekil-graph/">şekil (graph)</a> üzerindeki, bir kaynaktan (source) bir hedefe(target veya sink) giden en kısa yolu bulmaktır. Algoritma ağırlıklı şekiller (weighted graph) üzerinde çalışır ve bir anlamda <a href="http://www.bilgisayarkavramlari.com/2010/05/13/dijkstra-algoritmasi-2/">Dijkstra algoritmasının</a> iyileştirilmişi olarak düşünülebilir.</p>
<p>Algoritma aslında <a href="http://www.bilgisayarkavramlari.com/2010/05/13/dijkstra-algoritmasi-2/">Dijkstra algoritmasından</a> daha kötü bir performansa sahiptir ancak graftaki ağırlıkların eksi olması durumunda <a href="http://www.bilgisayarkavramlari.com/2010/05/13/dijkstra-algoritmasi-2/">Dijkstra&#8217;nın</a> tersine başarılı çalışır.</p>
<p>Algoritma Dijkstra algoritmasında olduğu gibi en küçük değere sahip olan kenardan gitmek yerine bütün graf üzerindeki kenarları test eder. Bu sayede <a href="http://www.bilgisayarkavramlari.com/2008/03/24/acgozlu-yaklasimi-greedy-approach/">aç gözlü yaklaşımının (greedy approach)</a> handikabına düşmez ve her düğüme sadece bir kere bakarak en kısa yolu bulmuş olur.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord1.png" alt="" /></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/plugins/flash-video-player/default_video_player.gif" /></p>
<p>Algoritmanın çalışmasını yukarıdaki gibi eksi değerlere sahip bir şekil üzerinden anlamaya çalışalım.</p>
<p>Öncelikle düğümlere değer ataması yapılıyor. Başlangıç düğümüne 0, doğrudan erişilen düğümlere erişim değerleri ve erişilemeyen düğümlere <span style="font-family: Symbol;">¥</span> sonsuz değeri atanıyor.  Hedef düğüm olarak da E düğümünü tanımlayalım.</p>
<p>Yukarıdaki örnekte A düğümünden başlayacağımız düşünelim:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord3.png" alt="" /></p>
<p>Şimdi şekilde kenarları sıralayalım:</p>
<p>AB 2</p>
<p>AC 1</p>
<p>BE -2</p>
<p>BF 5</p>
<p>CF 2</p>
<p>CD -1</p>
<p>DF 5</p>
<p>DE 7</p>
<p>Bellman ford algoritması işte bu kenarları teker teker dolaşması itibariyle dijkstradan ayrılır. Sırayla yukarıdaki kenarları (Edges) dolaşır ve graftaki değerleri günceller.</p>
<p>Yukarıda, rastgele sıra ile dizilen bu kenarları sırasıyla dolaşalım ve bu dolaşma sırasında şu işlemi yapalım.</p>
<p>Örneğin AB kenarı , A ve B düğümleri arasında. Bu düğümlerden düşük değere sahip olan düğüm üzerine kenar değeri eklenip yüksek değere sahip olan düğüm üzerine yazılıyor.</p>
<p>Sırayla gidecek olursak:</p>
<p>AB 2, min(A,B) = 0 <span style="font-family: Wingdings;">à</span> 0+ 2 = 2</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord5.png" alt="" /></p>
<p>AC 1, min(A,C) = 0 =&gt; 0+1 = 1</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord7.png" alt="" /></p>
<p>BE 2, min (B,E ) 2, =&gt; 2 + 2  = 4</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord9.png" alt="" /></p>
<p>BF 5, min(B,F) = 2 =&gt; 2+5 = 7</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord11.png" alt="" /></p>
<p>CF 2, min (C,F) = 1 =&gt; 1+2 = 3, bu değer 7&#8242;den küçük olduğu için güncelliyoruz:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord13.png" alt="" /></p>
<p>CD -1, min(C,D) = 1=&gt; 1+(-1) = 0</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord15.png" alt="" /></p>
<p>DF 5, min (D,F) = 0 =&gt; 0+5 = 5 F&#8217;nin değerinden daha büyük o yüzden güncellemiyoruz.</p>
<p>DE 7, min(D,E) = 0 =&gt; 0+7 = 7, yine E&#8217;nin değerinden büyük olduğu için güncellenmiyor.</p>
<p>Sonuçta graf aşağıdaki şekilde bitmiştir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052610_1932_BellmanFord17.png" alt="" /></p>
<p>Bu graftaki bütün düğümlerde, A düğümünden ne kadar maliyetle gidildiği bulunmuştur. Örnek hedef E düğümü ise, ulaşım maliyeti 4&#8242;dür.</p>
<p>Görüldüğü üzere eksi değere sahip düğümler olmasına rağmen herhangi bir problem yaşanmamıştır.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/05/26/bellman-ford-algoritmasi/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Edmonds Karp Algoritması</title>
		<link>http://www.bilgisayarkavramlari.com/2010/05/22/edmonds-karp-algoritmasi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/05/22/edmonds-karp-algoritmasi/#comments</comments>
		<pubDate>Sat, 22 May 2010 08:54:02 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[edmonds karp]]></category>
		<category><![CDATA[graph]]></category>
		<category><![CDATA[maximum flow]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/05/22/edmonds-karp-algoritmasi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu algoritmanın amacı, literatürde azami akış ( maximum flow ) olarak geçen ve düğümler (nodes) arasında akış kapasiteleri belirli bir şekildeki (graph) bir başlangıçtan bir hedefe en fazla akışın sağlandığı problemleri çözmektir. Azami akış (maximum flow) problemini örneğin şehirler arasında bağlı boru hattına veya tedarik zincirine benzetebiliriz. Örneğin aşağıdaki şekli [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bu algoritmanın amacı, literatürde azami akış ( maximum flow ) olarak geçen ve düğümler (nodes) arasında akış kapasiteleri belirli bir <a href="http://www.bilgisayarkavramlari.com/2008/08/01/graf-sekil-graph/">şekildeki (graph)</a> bir başlangıçtan bir hedefe en fazla akışın sağlandığı problemleri çözmektir.</p>
<p>Azami akış (maximum flow) problemini örneğin şehirler arasında bağlı boru hattına veya tedarik zincirine benzetebiliriz. Örneğin aşağıdaki şekli ele alalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0854_EdmondsKarp1.png" alt="" /></p>
<p>Buradaki düğümler, şehirleri ve düğümler arasındaki kenarlar (edges) ise şehirler arasındaki boru hatlarının kapasitesini belirtsin. Amacımız A düğümünden E düğüme azami miktarda akış sağlayabilmek olsun.</p>
<p>Ford-Fulkerson çözüm için yukarıdaki şekilde öncelikle hedef düğüme giden yolu bulur.  Algoritma bu arama işlemi sırasında şayet derin öncelikli arama (depth first search ,DFS) kullanıyorsa ford fulkerson olarak isimlendirilir. Şayet aynı algoritma bu arama işlemi sırasında <a href="http://www.bilgisayarkavramlari.com/2010/05/22/sekillerde-sig-oncelikli-arama/">sığ öncelikli arama (breadth first search, BFS)</a> kullanırsa bu durumda da edmonds karp algoritması olarak isimlendirilir.</p>
<p>Biz yazımızın konusu olan Edmonds Karp algoritmasını anlamak için sığ öncelikli olarak arama işlemini gerçekleştirelim:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0854_EdmondsKarp3.png" alt="" /></p>
<p>BFS (sığ öncelikli arama) sonucunda bulunan yollarımız aşağıda listelenmiş olsun:</p>
<ul>
<li>A-D-E</li>
<li>A-B-E</li>
<li>A-C-D-E</li>
<li>A-C-F-B-E</li>
<li>A-C-F-D-E</li>
<li>A-B-F-D-E</li>
</ul>
<p>İlk bulacağımız yol (path) A-D-E olsun bu durumda algoritma bu yol üzerindeki en küçük kapasiteyi bulmaya çalışır:</p>
<p>min(A-D,D-E) = min(5,7) = 5</p>
<p>bu bulunan sayı aslında bu yol üzerinden akabilecek maksimum değerdir. Dolayısıyla bu yoldan 5 kapasitesinde akış yapılmasına karar verilir ve şekil üzerinde bu durum işaretlenir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0854_EdmondsKarp5.png" alt="" /></p>
<p>Yukarıdaki şekilde buluna kırmızı sayılar, o yoldaki anlık akış miktarlarıdır.</p>
<p>Ardından  derin öncelikli arama işlemi devam eder ve örneğin A-B-E yolunu bulur.</p>
<p>min(A-B, B-E) = min(4,2) = 2</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0854_EdmondsKarp7.png" alt="" /></p>
<p>Bir sonraki yolumuz olan A-C-D-E yolunu hesaplayalım.</p>
<p>min(A-C,C-D,D-E) = min(1,1,2) = 1</p>
<p>Yukarıda dikkat edilecek bir nokta, D-E aralığının şeklin ilk halinde olan 7 olarak alınması yerine 2 olarak alınmasıdır. Bunun sebebi şeklin bu kenarındaki 5 miktarındaki kapasitenin şu anda kullanılıyor olması ve artık geriye 2 miktarında kapasite kalmasıdır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0854_EdmondsKarp9.png" alt="" /></p>
<p>Bu adımsan sonra BFS algoritmamız ile bulduğumuz aşağıdaki yolları atlamamız gerekecektir:</p>
<ul>
<li>A-C-F-B-E</li>
<li>A-C-F-D-E</li>
</ul>
<p>Bunun sebebi bu yollarda bulunan A-C aralığının artık 0 kapasitesinin kalmış olması ve bu yollardan daha fazla akış elde edilememesidir.</p>
<p>Son olarak BFS algoritmamızın bulduğu A-B-F-D-E yolunu hesaplayalım:</p>
<p>min (A-B,B-F,F-D,D-E) = min ( 2,5,5,1) = 1</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/052210_0854_EdmondsKarp11.png" alt="" /></p>
<p>Yukarıdaki şekilde bütün düğümler arasındaki akışlar gösterilmiştir. Gerçekten de graftaki E düğümüne (hedef düğüme) gidebilen yollar maksimum kapasite ile doldurulmuştur.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/05/22/edmonds-karp-algoritmasi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dijkstra Algoritması</title>
		<link>http://www.bilgisayarkavramlari.com/2010/05/13/dijkstra-algoritmasi-2/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/05/13/dijkstra-algoritmasi-2/#comments</comments>
		<pubDate>Thu, 13 May 2010 20:17:01 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[dijkstra]]></category>
		<category><![CDATA[En kısa yol]]></category>
		<category><![CDATA[graph]]></category>
		<category><![CDATA[shortest path]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/05/13/dijkstra-algoritmasi-2/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde kullanılan ve algoritmayı literatüre kazandıran kişinin ismini taşıyan dijkstra algoritması, verilen bir şekilde (graph) en kısa yolu bulmak için kullanılır. Bu algoritmanın çalışmasını örnek bir şekil( graph ) üzerinden göstermeye çalışalım. Bu gösterimin ardından Dijkstra algoritmasının başarısını ve zafiyetlerini tartışabiliriz. Örnek olarak yukarıda bulunan şekli ele alalım. Dijkstra [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerinde kullanılan ve algoritmayı literatüre kazandıran kişinin ismini taşıyan dijkstra algoritması, verilen bir <a href="http://www.bilgisayarkavramlari.com/2008/08/01/graf-sekil-graph/">şekilde (graph)</a> en kısa yolu bulmak için kullanılır.</p>
<p>Bu algoritmanın çalışmasını örnek bir şekil( graph ) üzerinden göstermeye çalışalım. Bu gösterimin ardından Dijkstra algoritmasının başarısını ve zafiyetlerini tartışabiliriz.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg1.png" alt="" /> <img src="http://www.bilgisayarkavramlari.com/wp-content/plugins/flash-video-player/default_video_player.gif" /></p>
<p>Örnek olarak yukarıda bulunan şekli ele alalım. Dijkstra algoritması herhangi bir şekildeki bir düğümden diğer bütün düğümlere giden en kısa yolu hesaplar.</p>
<p>Örneğimizde başlangıç <a href="http://www.bilgisayarkavramlari.com/2008/08/01/dugum-node/">düğümü (node)</a> olarak A düğümünü seçtiğimizi düşünelim ve algoritmanın çalışmasını bu düğümden başlayarak gösterelim.</p>
<p>Algoritma başlangıçta bütün düğümlere henüz erişim olmadığını kabul ederek sonsuz (<span style="font-family: Symbol;">¥</span> ) değeri atar. Yani başlangıç durumunda henüz hiçbir düğüme gidemiyoruz.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg3.png" alt="" /></p>
<p>Ardından başlangıç düğümünün komşusu olan bütün düğümleri dolaşarak bu düğümlere ulaşım mesafesini günceller.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg5.png" alt="" /></p>
<p>Bu güncelleme işleminden sonra güncellenen düğümlerin komşularını günceller ve bütün düğümler güncellenene ve şekil üzerinde yeni bir güncelleme olmayana kadar bu işlem devam eder.</p>
<p>Örneğin yukarıda A düğümünün komşusu olan düğümler (B ve C) güncellendiler. Bir sonraki adımda bu düğümlerin komşuları güncellenecektir. İstediğimiz bir düğüm ile başlayalım. Örneğin önce B sonra C düğümünün komşularını güncelleyelim:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg7.png" alt="" /></p>
<p>Yukarıdaki şekilde, B düğümünün komşusu olan E ve F düğümleri güncellenmiştir. Bu güncelleme işlemi sırasında B düğümünün üzerindeki mevcut maliyet ile E ve F düğümlerine gidişten doğan maliyet toplanmıştır.</p>
<p>Örneğin E düğümü için 2 + 5 = 7 ve F düğümü için 2 + 2 = 4 değerleri bulunmuştur.</p>
<p>Şimdi bir sonraki düğüm olan C düğümünden güncelleme yapalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg9.png" alt="" /></p>
<p>Bu aşamada güncellenen düğümler, C düğümünün komşusu olan D ve F düğümleridir. Bu düğümlerden, F düğümü daha önce güncellenmişti ve değer olarak 7 taşımaktaydı, ancak yeni gelen değer, F  için C üzerinden 1 + 2 = 3 olarak hesaplanmış ve bu değer daha önceden hesaplanan 7 değerinden düşük olduğu için 7&#8242;nin üzerine yazılarak 3 olmuştur.</p>
<p>Algoritmanın çalışmasını sonraki düğümlerin güncellenmesi ile sürdürelim. Bu sefer örneğin D düğümünün komşularını güncelleyelim ( şu anda D, F ve E düğümleri aynı derecede yeni güncellenmiştir bunlardan herhangi birisi ile başlanması Dijkstra algoritmasına uygundur. Ancak <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">recursive (özyineli)</a> bir kodlama yapılıyorsa koda göre elbette yakın olan komşular güncellenecektir)</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg11.png" alt="" /></p>
<p>D düğümünün hiçbir komşusu güncellenmemiştir bunun sebebi hesaplanan değerlerin mevcut değerlerden yüksek olması ve dolayısıyla daha iyi bir sonuç bulunamamasıdır.</p>
<p>F için 2 + 5 = 7 &gt; 3</p>
<p>E için 2 + 7 = 9 &gt; 4</p>
<p>Dolayısıyla bir sonraki düğümü seçerek devam ediyoruz</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg13.png" alt="" /></p>
<p>F düğümünün komşularında da bir değişiklik olmuyor ve son olarak E düğümü deneniyor:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg15.png" alt="" /></p>
<p>Son halimizde de bir değişiklik olmayarak şeklimiz (graph) kararlı bir halde ( daha fazla değişiklik olmadığı için) dolaşılmış ve bitmiş oluyor.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg17.png" alt="" /></p>
<p>Yukarıdaki bu grafta, düğümler üzerinde yazılı olan değerler, A düğümünden başlanarak her düğüme gidilebilen en kısa yol mesafesini vermektedir. Örneğin şekildeki F düğümüne ulaşma maliyeti 3 olarak hesaplanmıştır ve Dijkstra algoritması, A düğümünden F düğümüne daha kısa bir yol bulunamayacağını iddia eder ( eşit farklı yollar bulunabilir ama en kısa yol yine de 3 olur)</p>
<p><strong>Dijkstra algoritmasının zayıf yönü<br />
</strong></p>
<p>Algoritma ne yazık ki eksi (-) değer taşıyan bir kenar bulunması halinde başarılı çalışmaz. Bunun sebebi eksi (-) değerdeki kenarın sürekli olarak mevcut durumdan daha iyi bir sonuç üretmesi ve algoritmanın hiçbir zaman için kararlı hale gelememesidir.</p>
<p>Örneğin aşağıdaki basit şekli ele alalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg19.png" alt="" /></p>
<p>Yukarıdaki bu şekilde B-C kenarı (edge) -2 değerinde verilmiştir. Bu durumda A düğümünden başlayarak en kısa yolları hesaplamak istersek, öncelikli olarak A düğümünden komşusu olan düğümlere güncelleme yapılacaktır:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg21.png" alt="" /></p>
<p>Ardından bu düğümlerin komşuları güncellenecektir. İki düğümde birbirine -2 değerini ekleyerek daha kısa bir yol bulacak ve birbirlerini güncelleyerek daha kısa sonuçlara ulaşacaktır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg23.png" alt="" /></p>
<p>Bu işlem ne yazık ki sonsuza kadar giden bir sürecin başlangıcıdır ve hiçbir zaman daha iyi bir sonuç bulma işlemi bitmez.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/051310_2016_DijkstraAlg25.png" alt="" /></p>
<p>Sürekli olarak mevcut durumdan daha iyi bir durum bulunacak ve daha küçük değerler güncellenecektir. Bu yüzden Dijkstra algoritması, eksi (-) değer taşıyan şekillerde (graph) başarılı çalışmaz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/05/13/dijkstra-algoritmasi-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cardinality (Sayısallık)</title>
		<link>http://www.bilgisayarkavramlari.com/2010/03/31/cardinality-sayisallik/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/03/31/cardinality-sayisallik/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 18:27:42 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Matematiği]]></category>
		<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[bilgisayar felsefesi]]></category>
		<category><![CDATA[cardinality]]></category>
		<category><![CDATA[countability]]></category>
		<category><![CDATA[rasyonel sayılar]]></category>
		<category><![CDATA[reel sayılar]]></category>
		<category><![CDATA[sayılabilirlik]]></category>
		<category><![CDATA[sayılamazlık]]></category>
		<category><![CDATA[sayısallık]]></category>
		<category><![CDATA[tam sayılar]]></category>
		<category><![CDATA[uncountable]]></category>
		<category><![CDATA[uncountablity]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/03/31/cardinality-sayisallik/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER 1. Rasyonel / Tamsayı ilişkisi 2. Sayılabilirlik (Countability) 3. Reel / Tamsayı ilişkisi Şayet aynı isme sayıp ERD (Entity relationship diagram) üzerindeki sayısallık konusu ile ilgili yazıyı arıyorsanız bu bağlantıdan erişebilirsiniz. Algoritma analizi (algorithm analysis) ve hesaplama teorisinde (theory of computation) sıkça kullanılan anlamıyla bir kümenin eleman sayısını belirtir. Ayrıca [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p class="shutter"><a href="#1">1. Rasyonel / Tamsayı ilişkisi</a><br />
<a href="#2">2. Sayılabilirlik (Countability)</a><br />
<a href="#3">3. Reel / Tamsayı ilişkisi</a></p>
<p>Şayet aynı isme sayıp ERD (Entity relationship diagram) üzerindeki sayısallık konusu ile ilgili yazıyı arıyorsanız <a href="http://www.bilgisayarkavramlari.com/2008/11/25/sayisallik-cardinality/">bu bağlantıdan </a>erişebilirsiniz.</p>
<p>Algoritma analizi (algorithm analysis) ve hesaplama teorisinde (theory of computation) sıkça kullanılan anlamıyla bir kümenin eleman sayısını belirtir.</p>
<p>Ayrıca matematik ve bilgisayar bilimleri açısından önemli bir yönü de kümelerin sonsuz olması durumunda kümeler arasındaki ilişkinin gösterilmesinde işe yaramasıdır.</p>
<p>Bu durumu öncelikle sonsuz iki küme tanımlayarak anlamaya çalışalım.</p>
<p>Tam sayılar kümesini ele alalım. Tam sayılar kümesi sonsuz eleman içermektedir. Eksi sonsuzdan 0&#8242;a kadar ve 0&#8242;dan da artı sonsuza kadar giden sayılardan oluşur.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/033110_1827_Cardinality1.png" alt="" /></p>
<p>Dolayısıyla tam sayılar kümesinde, sonsuz eleman olduğunu söylememiz doğrudur.</p>
<p>Benzer şekilde pozitif tamsayılar kümesi sıfırdan artı sonsuza kadar sonsuz sayıda eleman içerir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/033110_1827_Cardinality3.png" alt="" /></p>
<p>Bu iki kümenin de sonsuz olduğunu söylediğimize göre gerçekten bu iki kümenin sonsuzlukları aynı mıdır? Yoksa kümelerden birisi daha büyük diğeri daha küçük sonsuz mudur?</p>
<p>Bu soru ile kardinallik (sayısallık, cardinality) konusuna başlayabiliriz. Bu soruyu cevaplamadan önce iki küme arasında eşit miktarda eleman bulunmasını tanımlamamız gerekir:</p>
<p>Sayısallık açısından iki küme birbirine bağlanmak istenirse, bunun anlamı bu kümeler arasında birebir (one-to-one) ve üzerine (onto) bağlantı bulunması demektir.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/033110_1827_Cardinality5.png" alt="" /></p>
<p>Yukarıdaki örnekte, iki küme arasında bire bir ve örten bir bağlantı gösterilmektedir. Burada birebir olması, birinci kümeden her elemanın ikinci kümeden tek bir elemanı gösteriyor olmasını ve ikinci kümedeki her elemanın da birinci kümede tek elemanı gösteriyor olması demektir. Şayet örneğin &#8220;a&#8221; elemanı hem 1 hem de 2 ile ilişkilendirilmiş olsaydı bu durumda birebir ilişkiden bahsedilemezdi. Örten olma özelliği (onto) ise boşta hiç eleman kalmamış olması yani bütün elemanların bir şekilde diğer kümede ilişkilendirilmiş olması anlamındadır.</p>
<p><a href="http://www.bilgisayarkavramlari.com/2009/06/24/kume-teorisi-set-theory/">Kümeler teorisi (set theory)</a> ile ilgili bu kısa hatırlatmadan sonra konumuz olan sayısallık ilişkisine dönebiliriz.</p>
<p>Şayet kümelerin ikisi de yukarıdaki örnekte olduğu gibi sonlu değil de yazının başında verildiği gibi sonsuz ise bu durumda sayısallık bağlantısını nasıl kurabiliriz?</p>
<p>Sayısallık açısından, tam sayılar kümesi ve pozitif tam sayılar kümesinin eşit olduğunu söyleyebiliriz. Bunu göstermek için yukarıda bahsettiğimiz üzere, iki küme arasındaki ilişkinin örten ve birebir olduklarını göstermemiz gerekir.</p>
<p>Bunu daha iyi modelleyebilmek için sonsuzluk yönünü aynı tarafa çevirip ardından sayıları sıralayalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/033110_1827_Cardinality7.png" alt="" /></p>
<p>Tamsayılar kümesini yukarıdaki şekilde çevirecek olursak kümenin elemanlarını aşağıdaki şekilde yazabiliriz:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/033110_1827_Cardinality9.png" alt="" /></p>
<p>Yukarıdaki resimde solda gösterilen pozitif tam sayılar (Z+) kümesi ile sağda gösterilen tamsayılar kümesi (Z) arasında birebir ve örten bir ilişki kurulmuş olunur. Bunun sebebi iki kümedeki her eleman diğer kümedeki bir elemana mutlaka ilişkilendirilmiş ve bu ilişki birebir olmuştur.</p>
<p>Yukarıdaki bu görsel ilişkiyi matematiksel olarak aşağıdaki şekilde yazmak da mümkündür:</p>
<p>X e Z ve Y e Z+ olmak üzere X  = Y / 2 * ( -1 )  <sup>Y mod 2</sup></p>
<p>Yukarıdaki formülde tam sayı bölmesi yapıldığı kabul edilmiştir. (yani noktadan sonraki değerler göz ardı edilmiştir)</p>
<p>Gerçekten de Y = 1 için X = ½ *1 = 0 sonucu veya Y = 15 için X = 15 / 2 * -1 = -7 sonucu bulunmaktadır.</p>
<p>Bu bağlantının tersini yazmak da mümkündür:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/033110_1827_Cardinality11.png" alt="" /></p>
<p>Örneğin X = 0 için Y = -1 * 0 * 2 + 1  = 1 olarak bulunur veya diğer bir örnek olarak X = -7 için Y = -1 * -7 *2 + 1= 15 olarak bulunur.</p>
<p>Görüldüğü üzere iki yönlüde bütün elemanları diğer kümedeki elemanlara bağlayan bir bağlantı yazılması mümkündür.</p>
<p>Böylelikle yukarıdaki şartımızı sağlamış ve iki küme arasında eşit miktarda eleman bulunduğunu göstermiş oluyoruz.</p>
<p>Bu konuyu anlatırken sorulmuş bir soruyu cevaplamak istiyorum: &#8220;Kümelerin venn diyagramlarında da, denklemlerin her ikisinde de Z kümesi, Z+ kümesine göre daha yavaş ilerliyor. Yani Y için 16 sayısına ulaşıldığında X için henüz 8 sayısına yeni ulaşılmış olunuyor. Bu durumda tam sayılar kümesi, pozitif tam sayılar kümesinden daha büyük değil midir?&#8221;</p>
<p>Bu soru ilk başta mantıklı gibi görülse de cevabı kesin olarak hayırdır. Bunun sebebi kümelerin sonsuz oluşudur. Yani sonsuzun sonu yoktur <span style="font-family:Wingdings">J</span> Bu durumu şöyle açıklayalım, yukarıdaki formülde yazılan X ve Y sayıları arasında neredeyse X=Y/2 veya Y = 2*X gibi bir bağlantı vardır. Bu durumda yukarıdaki soruya temel teşkil eden düşünceyi cevaplamak için sonsuzdaki bir sayıya n diyerek X=n için Y = 2n &#8216;dir sonucuna ulaşmak ve dolayısıyla n sonsuz ise 2n sonsuzdan daha büyük bir sonsuzdur gibi bir hataya düşmek mümkündür. Ancak buradaki hata iki türlü cevaplanabilir,</p>
<ol>
<li>Örnekteki n bir sayı olmak üzere, kümelerdeki son sayının n olduğunu söyleyemeyiz</li>
<li>Sayı kümesindeki n, sonsuzda bir sayı olmak şartıyla 2n&#8217;in sonsuzda olmadığını söyleyemeyiz.</li>
</ol>
<p>Dolayısıyla bu iki kümede de eşit sayıda eleman bulunur denilebilir.</p>
<p><strong><a name="1"></a>Rasyonel sayılar (kesirli sayılar, rational numbers) ile pozitif tam sayılar kümesi arasındaki sayısallık ilişkisi<br />
</strong></p>
<p>Yukarıdaki bu yaklaşım kullanılarak, kesirli sayılar ( rational numbers) kümesinin, tam sayılar kümesi ile aynı miktarda sonsuz eleman içerdiğini de ispatlayabiliriz. İhtiyacımız olan tek şey yukarıdaki örnekte bahsedildiği üzere pozitif tam sayılar kümesi, veya tam sayılar kümesi ile, kesirli sayılar (rasyonel sayılar) arasında bir bağlantı kurabilmek ve bu bağlantıyı modellemektir.</p>
<p>Öncelikle kesirli sayıları, iki boyutlu uzayda modellemekle işe başlayabiliriz. Kesirli sayılar kümesini aşağıdaki tabloda olduğu gibi yazmak mümkündür:</p>
<table style="border-collapse:collapse" border="0">
<colgroup>
<col style="width: 28px;"></col>
<col style="width: 38px;"></col>
<col style="width: 38px;"></col>
<col style="width: 38px;"></col>
<col style="width: 19px;"></col>
<col style="width: 38px;"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt"></td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">3</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">.</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">n</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1/1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1/2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1/3</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">.</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1/n</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2/1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2/2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2/3</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">.</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt"></td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">3</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">3/1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">3/2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">3/3</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">.</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt"></td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">.</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">.</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">.</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">.</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">.</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt"></td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">n</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">.</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">.</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">.</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">.</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">n/n</td>
</tr>
</tbody>
</table>
<p>Yukarıdaki tabloda görüldüğü üzere ilk satır ve ilk sütun birer pozitif tam sayı içermek üzere, tablonun diğer elemanları bu iki sayının (üsttekinin soldakine) bölümüdür. Dolayısıyla aslında problemi aşağıdaki şekilde pozitif tamsayılar olarak modellemiş oluruz:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/033110_1827_Cardinality13.png" alt="" /></p>
<p>Diğer bir deyişle şimdilik elimizde (Z+ x Z+) &lt;-&gt; Q+ şeklinde bir bağlantı bulunmaktadır. Bu bağlantıyı biraz daha ilerleterek Z &lt;-&gt; Q şeklinde çevirmeye çalışalım. Çünkü bu şekilde bir bağlantı bizim bu iki kümedeki eleman sayılarının eşit olduğunu kardinallik açısından ispatlamamız olacaktır.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/033110_1827_Cardinality15.png" alt="" /></p>
<p>Yukarıdaki şekilde gösterilen ok yönlerinde bu sayıları, pozitif tam sayılar kümesi ile ilişkilendirirsek hem bir bağlantı yakalamış hem de birebir ve örten bir ilişki elde etmiş oluruz. Bu durumda sayılarımızı aşağıdaki şekilde ilişkilendireceğiz:</p>
<table style="border-collapse:collapse" border="0">
<colgroup>
<col style="width: 66px;"></col>
<col style="width: 76px;"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">Z+</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">Q+</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1/1</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2/1</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">3</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1/2</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">4</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">3/1</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">5</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1/3</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">6</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">4/1</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">7</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">3/2</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">…</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">…</td>
</tr>
</tbody>
</table>
<p>Yukarıda görüldüğü üzere, tam sayılar kümesindeki bütün sayılar, rasyonel sayılar kümesi ile ilişkilendirilmiştir. Ayrıca dikkat edilmesi gereken bir husus, 2/2 veya 3/3 gibi tam sayı karşılığı 1 olan ve aslında eşit olan sayıların bu ilişkide yer almamasıdır. Bu sayıların ilişkiye yerleştirilmesi durumunda birebir olma özelliği bozulacaktır.</p>
<p>Yukarıdaki gösterim sayesinde, bu iki kümenin, yani rasyonel sayılar kümesi ile tam sayılar kümesi arasında bir ilişki birebir ve örten olarak kurulmuş ve bu sayede bu iki kümenin eleman sayısının eşit olduğu ve dolayısıyla bu iki kümenin sayısallık (kardinallik, cardinality) açısından eşit olduğu söylenebilir.</p>
<p><strong><a name="2"></a>Sayılabilirlik (countability)<br />
</strong></p>
<p>Diğer bir deyişle rasyonel sayılar kümesi sayılabilir bir kümedir (countable set) denilebilir. Aslında sayılabilirliğin (countability) tanımı, bir kümenin pozitif tam sayılar kümesi ile aynı kardinalliğe getirilebilmesidir. Yani herhangi bir kümeyi, yukarıdaki örneklere benzer şekilde pozitif tam sayılar ile birebir ve örten bir şekilde ilişkilendirebiliyorsak bu küme sayılabilir kümedir, aksi halde sayılamaz bir kümedir (uncountable set).</p>
<p>Bu sayılamazlık durumunu ve dolayısıyla kardinallik açısından eşit olmayan iki sonsuz kümeyi aşağıda örneklemeye çalışalım. Bu sefer kullanacağımız örnek gerçek sayılar (real numbers, reel sayılar) ile tam sayılar kümesi (integers) olsun.</p>
<p><strong><a name="3"></a>Tam sayılar ve Reel sayılar arasında sayısallık ilişkisi<br />
</strong></p>
<p>Bu örnekte, tam sayılar kümesi ve reel sayılar kümesi arasında sayısallık açısından eşitlik olmadığını ispatlamaya çalışalım.</p>
<p>Öncelikle ispatımızı, <a href="http://www.bilgisayarkavramlari.com/2008/08/02/burhan-i-mutenakis-proof-by-contradiction-olmayana-ergi/">olmayana ergi (proof by contradiction)</a> olarak modelliyoruz. Yani öncelikle reel sayılar kümesinin sayılabilir olduğunu kabul edip, bu sayı kümesi ile pozitif tam sayılar kümesi arasında bir ilişki kuracağız. Ardından bu ilişkinin kurulamayacağını ispatlamaya çalışacağız.</p>
<p>Öncelikle ilişki gösterimini ve ispatı daha iyi anlayabilmek için bu ispatta <a href="http://www.bilgisayarkavramlari.com/2009/10/08/sayi-tabanlari-number-bases-2/">ikilik tabanda sayılar</a> kullanalım. Yani 2 sayısı ikilik tabanda 10 olarak gösterilir. Dolayısıyla 0.2 sayısı 0.10 olarak gösterilir. Benzer şekilde 0.15438 sayısı 0.11110001001110 olarak gösterilecektir. Aslında bu gösterimin herhangi özel bir önemli olmamakla birlikte ispatı daha görülür kılmak için kullanacağız.</p>
<p>Şimdi doğru çalışan bir ilişkimiz olduğunu kabul edelim ve aşağıdaki şekilde gösterildiği gibi, tam sayılar ile reel sayılar kümesini ilişkilendirelim:</p>
<table style="border-collapse:collapse" border="0">
<colgroup>
<col style="width: 37px;"></col>
<col style="width: 151px;"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">Z+</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">Q+</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">0.110101010100101…</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">0.010101010110101…</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">3</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">0.100100100101110…</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">4</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">0.001010101010001…</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">5</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">0.111110101010000…</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">6</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">0.111000011111111…</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">…</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">…</td>
</tr>
</tbody>
</table>
<p>Yukarıdaki şekilde görüldüğü üzere, Z+ &lt;-&gt; Q+ ilişkisi kurulmuştur. Bu ilişkide herhangi bir matematiksel bağlantı bulunmadığı gibi sonuçta bütün ilişkilerde yukarıdakine benzer bir tablo ortaya çıkacaktır. Okuyucu birazdan yapacağımız ispatı, farklı sayılar veya herhangi bir matematiksel bağlantı için de deneyebilir sonuç değişmez.</p>
<p>Yukarıdaki şekilde tamsayılar ve reel sayılar arasında bir ilişki kurduktan sonra, kantor (Georg Cantor) tarafından ilk kez ispatlanan sayılamazlık durumu, köşegende (diagon) bulunan sayıların ters çevrilmesi ile elde edilir.</p>
<p>Yukarıdaki her sayının kaçıncı satırdaysa, o bitini alarak yeni bir sayı oluşturuyoruz.</p>
<table style="border-collapse:collapse" border="0">
<colgroup>
<col style="width: 37px;"></col>
<col style="width: 151px;"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">Z+</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">Q+</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">0.<strong>1</strong>10101010100101…</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">0.0<strong>1</strong>0101010110101…</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">3</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">0.10<strong>0</strong>100100101110…</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">4</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">0.001<strong>0</strong>10101010001…</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">5</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">0.1111<strong>1</strong>0101010000…</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">6</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">0.11100<strong>0</strong>011111111…</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">…</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">…</td>
</tr>
</tbody>
</table>
<p>Yukarıda, siyah renkle gösterilen bu sayılardan oluşan yeni sayımız: 0.110010… olarak belirlenebilir. Şimdi bu sayıdaki bütün bitlerin tersini alalım : 0.001101… olarak yeni bir sayı bulunacaktır.</p>
<p>Şimdi bu iki kümenin eşit olmadığını gösteren sorumuzu sorabiliriz, bulduğumuz bu yeni sayı, acaba yukarıdaki ilişkide hangi satırda yer almaktadır?</p>
<p>Cevap: Hiçbir satırda.</p>
<p>Bunun sebebi, her satırdan 1 bit alınarak oluşturulan yukarıdaki örnek sayının, tersi alındığında, her satırdan alınan bu bitin tersi alınmış ve dolayısıyla her satıra denk gelen bitin tersinden oluşan yeni bir sayı üretilmiş olmasıdır. Dolayısıyla hiçbir satırda ürettiğimiz bu yeni sayı bulunamaz.</p>
<p>Öyleyse, Z+ kümesi ile Q+ kümesini bağlamak için hangi bağlantı kullanılırsa kullanılsın, nasıl bir sayma yöntemi geliştirilirse geliştirilsin sonuçta yukarıdakine benzer bir durum olacak ve bu ilişkide bulunmayan bir reel sayı üretilerek iki küme arasındaki örten (onto) bağlantısı bozulacak ve reel sayılar kümesinde, tam sayılar kümesi ile ilişkilendirilmemiş bir eleman bulunacaktır.</p>
<p>Bu durumda reel sayılar kümesinin, tam sayılar kümesinden daha büyük olduğunu ve dolayısıyla sayılamaz olduğunu söyleyebiliriz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/03/31/cardinality-sayisallik/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Kırmızı-Siyah Ağaçları (Red  Black Trees)</title>
		<link>http://www.bilgisayarkavramlari.com/2009/12/27/kirmizi-siyah-agaclari-red-black-trees/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/12/27/kirmizi-siyah-agaclari-red-black-trees/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 13:10:21 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[graf teorisi (graph theory, çizge kuramı)]]></category>
		<category><![CDATA[veri yapıları]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2009/12/27/kirmizi-siyah-agaclari-red-black-trees/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Lütfen dikkat: Özellikle 147 adet yazımı kopyalayan ve hiçbir mailime cevap vermeyen is34.net sitesi yöneticisi başta olmak üzere, yazılarımı kopyalayan site yöneticileri. Emek ve vakit harcayarak ürettiğim yazılarımı lütfen kopyalamayınız. Şayet bu tip yazıları üreten insanların emeğini basit bir iki tıklama ile kopyalayarak web yayıncılığı yaptığınızı düşünüyorsanız, ve telif hakları [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p><span style="color:red">Lütfen dikkat: Özellikle 147 adet yazımı kopyalayan ve hiçbir mailime cevap vermeyen is34.net sitesi yöneticisi başta olmak üzere, yazılarımı kopyalayan site yöneticileri. Emek ve vakit harcayarak ürettiğim yazılarımı lütfen kopyalamayınız. Şayet bu tip yazıları üreten insanların emeğini basit bir iki tıklama ile kopyalayarak web yayıncılığı yaptığınızı düşünüyorsanız, ve telif hakları yasasına saygınız yoksa, ve içerik üreten insanları bu işten bezdirmek istiyorsanız yaptığınız hırsızlığa devam ediniz, ancak bundan sonra yazılarımın izinsiz bir şekilde kopyalanması durumunda hukuki işlem başlatacağımı belirtmek isterim.</span></p>
<p>Bilgisayar bilimlerinde, veriyi <a href="http://bilgisayarkavramlari.com/2008/05/07/agaclar-tree/">ağaçta (tree)</a> tutarken, ağacın dengeli (balanced) olmasını sağlayan bir algoritmadır. Algoritma, veriyi tutuş şekli sayesinde, arama, ekleme veya silme gibi temel işlemlerin en kötü durum analizi (worst case analysis) O(logn)&#8217;dir, yani algoritma n elman için bu işlemleri en kötü O(logn) zamanda yapmaktadır.</p>
<p>Kırmızı-siyah ağaçlar (red-black trees) tanım itibariyle ikili arama ağaçlarıdır (binary search tree) ve bu anlamda, herhangi bir <a href="http://www.bilgisayarkavramlari.com/2008/08/01/dugum-node/">düğümün</a> solunda kendisinden küçük ve sağında ise büyük verilerin durması beklenir. Ağaçta ayrıca her düğüm için bir renk özelliği tutulur. Yani bir <a href="http://www.bilgisayarkavramlari.com/2008/08/01/dugum-node/">düğüm</a> kırmızı veya siyah renk özelliği taşıyabilir. Ağaçtaki <a href="http://www.bilgisayarkavramlari.com/2008/08/01/dugum-node/">düğümlerin</a> taşıması gereken bu özellikler aşağıdaki şekilde sıralanabilir:</p>
<ol>
<li>Ağaçtaki her düğüm kırmızı ya da siyahtır</li>
<li>Kök düğüm (root node) her zaman için siyahtır.</li>
<li>Bütün yaprak düğümler (leaf nodes) siyahtır</li>
<li>Herhangi bir kırmızı düğümün bütün çocukları siyahtır.</li>
<li>Herhangi bir düğümden, yaprak düğüme kadar gidilen bütün yollarda eşit sayıda siyah düğüm bulunur.</li>
</ol>
<p>Yukarıdaki bu kurallar ışığında, herhangi bir düğümden, yapraklara kadar olan yolun, gidilebilecek en kısa yolun iki mislinden kısa olduğu garanti edilebilir. Diğer bir deyişle, ağacın aynı seviyedeki düğümleri aynı renktir. Ayrıca ağaçtaki renklendirme kökten başlayarak, siyah – kırmızı – siyah – kırmızı sıralamasıyla değişmektedir.</p>
<p>Örneğin aşağıdaki ağacı ele alalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122709_1309_KrmzSiyahA1.png" alt="" /><span style="color:white"><br />
</span></p>
<p><span style="color:black">Yukarıda görülen örnek ağaçta, kök düğüm siyah, yapraktaki boş düğümler (null) siyah ve bu düğümler dışındaki her düğümün çocukları, kendisinin ters rengindedir. Örneğin kırmızı olan 13 düğümünün çocukları siyah, siyah olan 25 düğümünün çocukları ise kırmızıdır. Bu anlamda kutu ile gösterilen yaprak düğümler göz ardı edilirse, aynı seviyedeki düğümler aynı renkte olmaktadır.<br />
</span></p>
<p><span style="color:black"><strong>Arama işlemi (search)<br />
</strong></span></p>
<p><span style="color:black">Ağaç üzerinde bir değerin aranması, <a href="http://www.bilgisayarkavramlari.com/2008/05/07/ikili-arama-agaci-binary-search-tree/"></a></span>ikili arama ağacında (binary search tree)<span style="color:black"> gibi yapılır. Yani aranan değer önce kök düğümde (root node) aranır, şayet aranan değer daha büyükse sağa, küçükse sola devam edilir. Nihayetinde aranan değer bulunana veya boş (null) değere ulaşılana kadar bu işlem devam eder.<br />
</span></p>
<p><span style="color:black"><strong>Ekleme işlemi (insertion)<br />
</strong></span></p>
<p><span style="color:black">Ağaca bir düğümün nasıl eklendiğini algoritmasal olarak aşağıdaki şekilde açıklayabiliriz:<br />
</span></p>
<p><span style="color:black">Ekleme işlemi normal bir <a href="http://www.bilgisayarkavramlari.com/2008/05/07/ikili-arama-agaci-binary-search-tree/"></a></span>ikili arama ağacına (binary search tree)<span style="color:black"> ekler gibi başlar. Bu işlem sırasında yeni düğümün kırmızı olacağını kabul ederiz.<br />
</span></p>
<p><span style="color:black">Ekleme işlemi sırasında uyulması gereken 3 temel kural vardır:<br />
</span></p>
<ul>
<li><span style="color:black">Kök düğüm (root node) her zaman için siyahtır.<br />
</span></li>
<li><span style="color:black">Herhangi bir düğümden, yapraklara kadar uzanan herhangi bir yolda, eşit sayıda siyah düğüm bulunur.<br />
</span></li>
<li><span style="color:black">Bir kırmızı düğümün, kırmızı çocuğu bulunamaz.<br />
</span></li>
</ul>
<p><span style="color:black">Yukarıdaki istenmeyen durumlardan birisi oluştuğunda, ağaçtaki düğümlerin rengi değiştirilir ya da değiştirilemiyorsa ağaçta dengelemek için <a href="http://www.bilgisayarkavramlari.com/2008/05/15/agaclarda-dengeleme-rotation-balancing/"></a></span>döndürme (rotation)<span style="color:black"> işlemi yapılır.<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122709_1309_KrmzSiyahA3.png" alt="" /><span style="color:black"><br />
</span></p>
<p><span style="color:black">Örneğin, yukarıdaki şekilde gösterildiği üzere 16 sayısını ağaca eklemek isteyelim.<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122709_1309_KrmzSiyahA5.png" alt="" /><span style="color:white"><br />
</span></p>
<p><span style="color:black">16 değeri, 17&#8242;den küçük olduğu için, klasik bir ikili arama ağacında hareket eder gibi , ağacın sol tarafında devam edilecek ve 13 ile karşılaştırılacak.<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122709_1309_KrmzSiyahA7.png" alt="" /><span style="color:white"><br />
</span></p>
<p><span style="color:black">13&#8242;ten büyük olduğu için sağa bakılıyor. Ve 15&#8242;ten de büyük olduğu için 15&#8242;in sağına ekleniyor.<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122709_1309_KrmzSiyahA9.png" alt="" /><span style="color:white"><br />
</span></p>
<p><span style="color:black">Görüldüğü üzere yeni eklenen 16, 15&#8242;ten büyük ve sağındaki boş yere yerleştirilmiştir. Bu yerleştirme sonucunda iki ardışık kırmızı durumu oluşmadığı için sorun yoktur. Yani bir siyah düğüm altına kırmızı düğüm eklenmiştir. Şimdi örnek olarak sırasıyla 30 ve 32 sayılarını ekleyelim.<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122709_1309_KrmzSiyahA11.png" alt="" /><span style="color:black"><br />
</span></p>
<p><span style="color:black">Ağaca yukarıdaki şekilde 30 değeri eklenince, ağacın en sağına yerleşmekte ve istenmeyen bir durum olan iki kırmızı arka arkaya gelmektedir. Çözüm olarak ağaçtaki düğümlerin rengi değiştirilmelidir.<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122709_1309_KrmzSiyahA13.png" alt="" /><span style="color:black"><br />
</span></p>
<p><span style="color:black">Öncelikle, 30&#8242;un hemen üzerinde bulunan 27 düğümü, iki kırmızı düğüm arka arkaya olamayacağı için siyaha çevrilir. Siyaha çevrilen 27 numaralı düğümün büyük babası 23 numaralı düğümdür. Dolayısıyla 27 numaralı düğümün amcası 18 numaralı düğüm olur. 25 numaralı düğümün kırmızıya çevrilmesi, 23 numaralı büyük baba için problem oluşturur çünkü bir kırmızı düğümün çocukları siyah olmalıdır. Aynı zamanda problem 17 numaralı düğümden yaprağa kadar giden yolda da eşit miktarda siyah düğüm bulunmalıdır. Yukarıdaki örnekte 23 numaralı düğümün siyah kalması durumunda, 17 numaralı düğümden gidilebilen sağ yol ile sol yol arasında düğüm sayıları farklı olmaktadır.<br />
</span></p>
<p><span style="color:black">Çözüm olarak 17 numaralı düğüm kırmızı yapılabilir ancak bu durumda da kök düğümün kırmızı olamayacağı kuralı ile ihtilafa düşülür. Dolayısıyla bu adımda çözüm 13 ve 23 numaralı düğümlerin siyah yapılmasıdır.<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122709_1309_KrmzSiyahA15.png" alt="" /><span style="color:black"><br />
</span></p>
<p><span style="color:black">Ağacın çalışma şeklini daha iyi anlayabilmek için ağaca bir de 32 değerinde bir düğüm eklemeyi deneyelim:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122709_1309_KrmzSiyahA17.png" alt="" /><span style="color:black"><br />
</span></p>
<p><span style="color:black">Yukarıdaki örnekte görüldüğü üzere, 32 değeri, bir önceki adımda eklediğimi 30 değerinin sağına gelmektedir. Hemen dikkat edilebilecek bir problem, 30-32 ikilisinin arka arkaya kırmızı olmasıdır. Bu durumda 30 düğümünün siyah yağılması veya 32 düğümünün siyah yapılması problemi çözmez çünkü kökten yapraklara kadar giden yolda eşit sayıda siyah düğüm bulunmalıdır. Bu yola yeni bir siyah düğüm eklenmesi bu dengeyi bozar. Çözüm olarak saat yönünün tersine döndürme işlemi uygulanıp çocukların siyah yapılması gerekir. Bu durumu aşağıdaki şekil üzerinden açıklamaya çalışalım:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122709_1309_KrmzSiyahA19.png" alt="" /><span style="color:black"><br />
</span></p>
<p><span style="color:black">Yukarıdaki 2 problem bulunuyor:<br />
</span></p>
<ol>
<li><span style="color:black">İki kırmızı düğüm arka arkaya<br />
</span></li>
<li><span style="color:black">Yolda tek siyah düğüm bulunmasına izin verilmiş, yapraklara kadar giden ikinci bir siyah düğüm çıkarma hakkımız yok.<br />
</span></li>
</ol>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122709_1309_KrmzSiyahA21.png" alt="" /><span style="color:black"><br />
</span></p>
<p><span style="color:black">Yukarıdaki yeni halinde, kural bozulmaksızın hem tek siyah ile yaprağa ulaşılıyor hem de iki kırmızı ihlalinden kurtulunuyor.<br />
</span></p>
<p><span style="color:black">Benzer bir çözüm aşağıdaki şekilde olabilirdi:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122709_1309_KrmzSiyahA23.png" alt="" /><span style="color:black"><br />
</span></p>
<p><span style="color:black">Ancak yukarıdaki bu yeni halimiz ağacın bütünüyle uyuşmamaktadır. Yani döndürme işleminin yapıldığı ağacın üst düğümü 25 olduğu ve kırmızı olduğu için bu ikinci çözüm yeni bir kırmızı kırmızı komşuluğu doğuracaktır. Dolayısıyla ilk örnekte olduğu gibi problemi çözebiliriz:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122709_1309_KrmzSiyahA25.png" alt="" /><span style="color:black"><br />
</span></p>
<p><span style="color:black">Yukarıdaki yeni halimizde kuralların tamamına uyarak ağaca yeni sayıyı eklemiş bulunuyoruz. Benzer bir durumu oluşturup daha yukarıdan <a href="http://www.bilgisayarkavramlari.com/2008/05/15/agaclarda-dengeleme-rotation-balancing/"></a></span>döndürme (rotation)<span style="color:black"> işleminin nasıl yapıldığını, ağaca 29 sayısını ekleyerek görebiliriz. Bakın 29 sayısı eklenince de yapılan işlem aslında aynıdır sadece daha büyük bir döndürme işlemi gerçekleştirilmiş olacaktır:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122709_1309_KrmzSiyahA27.png" alt="" /><span style="color:black"><br />
</span></p>
<p><span style="color:black">İki kırmızı durumu oluşuyor. Bu noktada artık ikisinden birisinin siyah olması sorunu çözmez çünkü yaprağa kadar olan yolda her halükarda bir fazla siyah düğüm oluşur.<br />
</span></p>
<p><span style="color:black">Çözüm olarak sırasıyla kırmızı-siyah dönüşümü yapıyoruz:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122709_1309_KrmzSiyahA29.png" alt="" /><span style="color:black"><br />
</span></p>
<p><span style="color:black">Görüldüğü üzere köke kadar giden yolda kırmızı-kırmızı durumunu engellemek için düğümler bir kırmızı bir de siyah sırasına dönüştürüldü. Şimdi problem 23 numaralı düğümün sağ ve sol taraflarındaki yol uzunluğunun farklı olması. Yani 23 numaralı düğümün sol tarafındaki problem çözülürse 17 numaralı düğüm için bir problem yok<br />
</span></p>
<p><span style="color:black">Döndürme işlemi gerçekleştiriyoruz:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122709_1309_KrmzSiyahA31.png" alt="" /><span style="color:black"><br />
</span></p>
<p><span style="color:black">Yukarıda görüldüğü üzere 25 numaralı düğüm23 ve 30 numaralı düğümler arasındayken, bu düğümlerin atası durumuna geçmiştir.<br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/12/27/kirmizi-siyah-agaclari-red-black-trees/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Serseri sıralaması (Stooge Sort)</title>
		<link>http://www.bilgisayarkavramlari.com/2009/12/26/serseri-siralamasi-stooge-sort/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/12/26/serseri-siralamasi-stooge-sort/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 14:48:47 +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/2009/12/26/serseri-siralamasi-stooge-sort/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Lütfen dikkat: Özellikle 147 adet yazımı kopyalayan ve hiçbir mailime cevap vermeyen is34.net sitesi yöneticisi başta olmak üzere, yazılarımı kopyalayan site yöneticileri. Emek ve vakit harcayarak ürettiğim yazılarımı lütfen kopyalamayınız. Şayet bu tip yazıları üreten insanların emeğini basit bir iki tıklama ile kopyalayarak web yayıncılığı yaptığınızı düşünüyorsanız, ve telif hakları [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p><span style="color:red">Lütfen dikkat: Özellikle 147 adet yazımı kopyalayan ve hiçbir mailime cevap vermeyen is34.net sitesi yöneticisi başta olmak üzere, yazılarımı kopyalayan site yöneticileri. Emek ve vakit harcayarak ürettiğim yazılarımı lütfen kopyalamayınız. Şayet bu tip yazıları üreten insanların emeğini basit bir iki tıklama ile kopyalayarak web yayıncılığı yaptığınızı düşünüyorsanız, ve telif hakları yasasına saygınız yoksa, ve içerik üreten insanları bu işten bezdirmek istiyorsanız yaptığınız hırsızlığa devam ediniz, ancak bundan sonra yazılarımın izinsiz bir şekilde kopyalanması durumunda hukuki işlem başlatacağımı belirtmek isterim.</span></p>
<p>Bilgisayar bilimlerinde kullanılan ve tek boyutlu bir veri yapısı üzerinde (örneğin<a href="http://www.bilgisayarkavramlari.com/2007/05/04/array-dizi/"> dizi (array)</a> ) sıralama yapmaya yarayan bir algoritmadır. Algoritmanın çalışması <a href="http://www.bilgisayarkavramlari.com/2008/08/09/birlestirme-siralamasi-merge-sort/">birleştirme sıralaması (merge sort)</a> veya <a href="http://www.bilgisayarkavramlari.com/2009/10/31/hizli-siralama-quick-sort/">hızlı sıralama (quick sort)</a> algoritmalarına benzetilebilir. Bunun sebebi algoritmanın, sıralamak istenen sayıları 2/3 oranında iki parçaya bölmesi ve kalan sayıları kendi aralarında sıralamasıdır.</p>
<p><strong>Algoritmanın açıklaması ve kodlanması<br />
</strong></p>
<p>Bu anlamda algoritmanın çalışması aşağıdaki adımlarla izah edilebilir:</p>
<ul>
<li>Dizinin sonundaki sayı, başındaki sayıdan küçükse bu sayıların yerini değiştir (swap)</li>
<li>
<div>Şayet işlem yapılan elaman sayısı 3 veya daha fazlaysa</div>
<ul>
<li>Elemanların ilk 2/3&#8242;ünü serseri sıralamasına ver</li>
<li>Elamanların kalan 1/3&#8242;ünü serseri sıralamasına ver</li>
<li>Elamanların ilk 2/3&#8242;ünü tekrar serseri sıralamasına ver</li>
</ul>
</li>
</ul>
<p>Yukarıdaki algoritmadan görüleceği üzere dizinin serseri sıralaması sırasında (stooge sort) 2/3. Elemandan itibaren iki parçaya bölündüğü düşünülebilir. Algoritmanın kodlaması aşağıdaki şekilde yapılabilir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122609_1448_Serserisral1.png" alt="" /></p>
<p>Yukarıdaki algoritmanın çalışması sonucu aşağıda verilmiştir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122609_1448_Serserisral2.png" alt="" /></p>
<p>Görüldüğü üzere sıralama algoritması kodun 15. Satırında, sıralama işlemi yapılan sayı aralığının 2/3&#8242;üncü elemanını bulmaktadır. Ardından kodun 16. Satırında ilk 2/3 ve kodun 17 satırında kalan 1/3 elemanlar sıralanmakta. En sonunda ise tekrar elemanların ilk 2/3&#8242;ü sıralanmaktadır.</p>
<p><strong>Örnek çalışma<br />
</strong></p>
<p>Yukarıdaki algoritmayı kullanarak örneğin aşağıdaki dizinin sıralanmasını adım adım göstermeye çalışalım.</p>
<p>Dizimiz şu şekilde verilsin:</p>
<p>{15,11,4,6,8,3}</p>
<p>İlk adımda, dizinin ilk ve son değerleri karşılaştırılacak ve son değer, ilk değerden küçük olduğu için yer değiştirilecek:</p>
<p>{3,11,4,6,8,15}</p>
<p>Ardından diziyi 2/3 nispetinde iki parçaya bölecek ve ayrı ayrı sıralamaya çalışacak. K değeri burada 6/3 = 2 , 5-2 = 3 olarak bulunur.</p>
<p>{<span style="background-color:#fbd4b4">{3,11,4,6}</span> {8,15}}</p>
<p>İlk parçadaki ilke eleman olan 3, son eleman olan 6&#8242;dan küçük dolayısıyla sorun yok ve listeyi gene parçalıyoruz.K değeri bu sefer 3/3 = 1 , 3-1 =2  olarak bulunur:</p>
<p>{{<span style="background-color:#fbd4b4">{3,11,4}</span>,{6}} {8,15}}</p>
<p>Yeni parça için bir problem bulunmuyor çünkü 3&lt;4 durumu bulunuyor. Parçalama işlemine devam ediyoruz : 3/3 = 1 , 2-1 = 1 olarak bulunuyor:</p>
<p><span style="background-color:white">{{{{3,11},</span><span style="background-color:#fbd4b4">{4}</span><span style="background-color:white">},{</span>6}} {8,15}}</p>
<p>Yukarıdaki kodda, 3 elemandan düşük sayıya ulaştığımız için, artık bir alt satırda bulunan ve geri kalan 1/3&#8242;lük elemanları sıralayan kısma geçebiliriz. Bu adımda sadece 4&#8242;ten oluşan sayılar sıralanacak ki bu değer de zaten 4&#8242;tür. (kodun 17. Satırı)</p>
<p>Ardından kodun 18. Satırına devam edip ilk 2/3 elemanı sıralıyoruz:</p>
<p><span style="background-color:white">{{{</span><span style="background-color:#fabf8f">{3,11}</span><span style="background-color:white">,{4}},{</span>6}} {8,15}}</p>
<p>Özyineli olarak çalışan kodumuz üç farklı sıralama işlemini bitirip, bu işlemleri çağıran ve özyineli yığınında (recursion stack) bir üst seviyede duran fonksiyonu çalıştırıyor. Bu durumda bir üst parça için geri kalan 1/3 sıralanıyor:</p>
<p style="background: white">{{{{3,11},{4}},<span style="background-color:#fabf8f">{6}</span>} {8,15}}</p>
<p>Sonra kodun ilk 2/3&#8242;ü tekrar sıralanıyor:</p>
<p style="background: white">{{<span style="background-color:#fabf8f">{3,4,11},{6}</span>} {8,15}}</p>
<p style="background: white">Aynı işlem bir üst seviyeye çıkılarak devam ediyor:</p>
<p style="background: white">{{{3,4,11},{6}} <span style="background-color:#fabf8f">{8,15}</span>}</p>
<p style="background: white">{<span style="background-color:#fabf8f">{3,4,6,11}</span>, {8,15}}</p>
<p style="background: white">{3,4,6,8,11,15}</p>
<p style="background: white"><strong>Algoritma performansı.<br />
</strong></p>
<p style="background: white">Algoritma problemi iki parçaya böler. Birinci parça 1/3 ikinci parça ise 2/3 eleman içermektedir ve 2/3 eleman içeren kısım iki kere işlenir. Bu durumda performans için O(<em>n</em><sup>log(3) / log(1.5)</sup>) = O(<em>n</em><sup>2.8</sup>) denilebilir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/12/26/serseri-siralamasi-stooge-sort/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
