Professional Documents
Culture Documents
Oncelikli Kuyruklar PDF
Oncelikli Kuyruklar PDF
Öncelikli kuyruklar (priority queues), terim anlamıyla gündelik yaşamda sık karşılaştığımız bir
olguyu belirler. Bazı durumlarda bir işi öteki işlerin hepsinden önce yapmak zorunda kalabiliriz.
Örneğin, bir fatura ödeme veznesinde kuyruğa girenler arasında öncelik sırası önde olanındır. Ancak,
bir kavşakta geçiş önceliği cankurtaranındır. Bir hava meydanına iniş sırası bekleyen uçaklar arasında,
öncelik sırası acil iniş isteyen uçağındır. Bir hastanede muayene önceliği ise durumu en acil olan
hastanındır.
Görüldüğü gibi, bir koleksiyon içinde öncelik sırasını farklı amaçlarla belirleyebiliriz. En basiti,
ilk gelen ilk çıkar dediğimiz FIFO (first in first out) yapısıdır. Ama bu yapı karşılaşılacak bütün
olasılıklara çözüm getiremez. Dolayısıyla, koleksiyonun öğelerini istenen önceliğe göre sıralayan bir
yapıya gereksinim vardır. Biraz genellemeyle, öncelikli kuyruklar yapısına da kuyruk diyeceğiz; ama
burada yüklenen anlamı FIFO yapısından farklı olabilir. Son giren de ilk çıkabilir, ilk giren de ilk
çıkabilir. Duruma göre değişmektedir. Önceliği en yüksek olan kuyruktan ilk çıkar. Soyut bir veri tipi
(ADT – Abstract Data Type) olarak öncelikli kuyruklarda sadece sayılar ya da karakterler değil,
karmaşık yapılar da olabilir. Örnek olarak bir telefon rehberi listesi, soyisim, isim, adres ve telefon
numarası gibi elemanlardan oluşmaktadır ve soyisme göre sıralıdır. Öncelikli kuyruklardaki
elemanların sıralarının elemanların alanlarından birisine göre olması da gerekmez. Elemanın kuyruğa
eklenme zamanı gibi elemanların alanları ile ilgili olmayan dışsal bir değere göre de sıralı olabilirler
Kuyruktaki her nesnenin karşılaştırılabilir bir öncelik değeri (key) vardır. Bazı sistemlerde
küçük değer önceliklidir, bazı sistemlerde de küçük değerler, küçük öncelikli olabilir. İlk nesne
kuyruğun başına konulur ve önceliği belirten bir key değeri atanır. Öncelikli kuyruklarda da diğer
kuyruklarda olduğu gibi ekleme ve silme işlemleri mevcuttur.
1
Öncelikli Kuyruk Algoritması ve Çalışması
Bilindiği üzere normalde sıralar (queue) ilk giren ilk çıkar (FIFO , first in first out) mantığı ile çalışırlar.
Yani bir bilet sırasında olduğu gibi sıraya ilk giren kişi hizmete ilk ulaşan, son giren kişi ise son ulaşan
kişidir.
Öncelik sırasında (rüçhan sırası, priority queue) ise bu sırada bekleyenlerden en öncelikli olan kişinin
ilk erişmesi beklenir. Bu durumu bir örnek üzerinden anlatmak gerekirse sırada bekleyen kişiler ve
öncelikleri aşağıdaki şekilde verilmiş olsun:
Kişi No Öncelik
1 5
2 3
3 1
4 2
5 4
Yukarıdaki tabloda kişi numaraları ve öncelikleri sıralanmıştır. Bu listeye göre sırada bekleyenlerden
ilk çıkması gereken kişi en yüksek önceliğe sahip olan 1 numaralı kişidir. Ardından 4 önceliğine sahip 5
numaralı kişi sıradan çıkar. Sıradan önceliklerine göre çıkanları sıralayacak olursak : 1,5,2,4,3 numaralı
kişilerdir.
Öncelik sırasının işlenmesini aslında sırada bekleyen kişilerin önceliklerine göre sıralanması (Sort) ve
ardından normal bir sıra (queue) gibi veri yapısının işlenmesi olarak düşünebiliriz. Örneğin yukarıdaki
durumda öncelik sırasına göre sırayı yeniden düzenleyecek olursak :
Kişi No Öncelik
1 1
5 2
2 3
4 4
3 5
Sıralamasını elde etmiş oluruz ki bu da zaten beklemekte olan kişilerin çıkış sırasıdır.
2
Öncelik sıralarında aynı önceliğe sahip kişilerin nasıl sıradan çıkacakları da ayrıca bir problem olarak
görülebilir. Bu noktadaki en klasik çözüm geliş sırasında göre öncelik vermektir. Örneğin yukarıdaki
durumda 3 önceliğine sahip bir kişi daha olsaydı:
Kişi No Öncelik
1 5
2 3
3 1
4 2
5 4
6 3
Bu durumda öncelik sıralamasına göre hangi 3 önceliğine sahip olan kişinin (2. Kişi veya 6. Kişi)
belirlerken önce gelenin önce çıkması ilkesi korunabilir. Bu durumda beklemekte olan kişiler aşağıdaki
sırada sıralanabilir:
Kişi No Öncelik
1 1
5 2
2 3
6 3
4 4
3 5
Öncelik sıraları bilgisayar bilimlerinin veri yapısı konusunda kullanılan bir kavram olmasına karşılık
uygulama alanları oldukça geniştir. Örneğin işletim sistemlerinde kullanılan en kısa iş ilk (shortest job
first)işlemci zamanlama (CPU scheduling) algoritması tam bir öncelik sırası örneğidir. Bekleme
sırasındaki (Ready queue) işlemlerin (process) çalıştırılma sırası uzunluklarına göre önceliğe sahiptir.
3
Huffman Algoritması
Huffman kodlaması, girilen veriyi sıkıştırmak amacıyla kullanılan bir sıkıştırma algoritmasıdır. David A.
Huffman tarafından 1952 yılında geliştirilmiştir.
Günlük hayatta bize gösterilen verilerde her karakterin 8 bitlik ASCII karşılığı vardır. Her bir karakter
bellekte 8 bitlik değer ile saklanmaktadır. Ancak bu durum bellek sıkıntısı olan uygulamalar için sıkıntı
yaratmaktadır.
Huffman’ın geliştirdiği algoritmada, veri içerinde kullanılan her bir karakterin belli bir frekansı
(kullanım sıklığı) vardır. Bir karakterin frekansı ne kadar fazla ise bellekte yer aldığı alan o kadar
fazladır. Bu sebepten ötürü Huffman, frekansı büyük olan karakterlerin bellekte 8 bit yerine daha az
bitle saklanması durumunda yerden kazanılabileceğini düşünmüş ve algoritmasını geliştirmiştir.
1. Karakterler kodlanmadan önce veri içerisindeki her karakter tek tek taranır, frekansları
belirlenir.
2. Karakterler frekanslarına göre azalan ya da artan sırada sıralanırlar. (Sıralama için sıralama
algoritmalarından herhangi biri kullanılabilir.
3. Sıralamanıza göre en küçük 2 frekanslı karakter alınarak ikili ağaç oluşturulur. Frekansları
toplamı kök düğüme yazılır.
4. Sonra tekrar sıralama yapılır (ağaçları sıralarken kök düğümdeki değer önemsenir), en küçük
2 birimden tekrar ikili ağaç oluşturulur.
5. Sıralama işlemi sırada sadece ve sadece tek bir ağaç kalana kadar devam eder.
4
Ağaçta dikkat edilmesi noktalardan biri yaprakların hepsinde harf vardır. Harfler arada
dallarda yer almamaktadır.
6. Ağaç oluşturulduktan sonra ağacın kollarına numaralar verilir. Her kök düğümden çıkan sol
dala 1, sağ dala 0 ya da sol dala 0, sağ dala 1 verilir. Kök düğümden yapraklara inerken her dal
üstündeki karakter okunur, böylece karakterin yeni değeri ortaya çıkar.
5
Huffman Algoritması Örnek Kodu
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace Huffman
{
class Node
{
public int frequency;
public string data;
public Node leftChild, rightChild;
class Program
{
static void Main(string[] args)
{
IList<Node> list = new List<Node>();
stack.Push(parentNode);
stack = GetSortedStack(stack.ToList<Node>());
}
GenerateCode(parentNode1, "");
6
DecodeData(parentNode1, parentNode1, 0, "0010011101001111");
//DecodeData(parentNode1, parentNode1, 0, "100");
Console.ReadKey();
}
return stack;
}
public static void DecodeData(Node parentNode, Node currentNode, int pointer, string
input)
{
if (input.Length == pointer)
{
if (currentNode.leftChild == null && currentNode.rightChild == null)
{
Console.WriteLine(currentNode.data);
}
return;
}
else
{
if (currentNode.leftChild == null && currentNode.rightChild == null)
{
Console.WriteLine(currentNode.data);
DecodeData(parentNode, parentNode, pointer, input);
}
else
{
7
if (input.Substring(pointer, 1) == "0")
{
DecodeData(parentNode, currentNode.leftChild, ++pointer, input);
}
else
{
DecodeData(parentNode, currentNode.rightChild, ++pointer, input);
}
}
}
}
}
}