Örneğin ekin yığınında olduğu gibi bir yığından bahsettiğimizde üstüste istif edilmiş birbiri üzerinde oturan elemanlar geliyor. Bu elemanlar da oraya konuldukları sırayla birbirinin üstünde duruyorlar. Ve sadece en üstteki elemanı alabiliyoruz (tüm bu yığını devirmeden)
Öbekte ise elemanların belirli bir yerleştirme sırası yok. Elemanlara istediğimiz gibi erişip bir elemanı çıkartabiliriz çünkü belirli bir 'enüstte' duran eleman yok.
Şimdi bundan bahsettim çünkü stack için türkçe karşılık 'yığın ya da yığıt' sanırım. Ama ben heap yerine 'yığın' kullanıyordum. Ama yığın da üstüste anlamı verdiği için öbek daha mı uygun olur acaba. (Neyse şimdilik gene yığın kullanarak devam ediyorum)
Aslında böyle bir topluluk 'std.algorithm' sınıfında varmış.
import std.stdio, std.container, std.algorithm, std.range;
void main()
{
int[] a = [ 4, 1, 3, 2, 16, 9, 10, 14, 8, 7 ];
auto h = heapify(a);
assert(h.front == 16);
assert(a == [ 16, 14, 10, 8, 7, 9, 3, 2, 4, 1 ]);
}
Ama dikkat ederseniz burada en büyük elemanları ağacın en üstüne getiriyor. Benim istediğim tam tersi ağacın en küçük elemanları en üste gelsin.
http://opendatastructures.org/versions/edition-0.1d/ods-java/img1156.png
Bu maksatla denemek ve öğrenmek amaçlı şu şekilde bir ikili yığın yazdım. Yorumlarınızı bekliyorum.
import std.algorithm;
struct İkiliYığın
{
int[] dizi;
int büyüklük;
this (int[] dizi)
{
this.dizi = dizi;
this.büyüklük = dizi.length;
}
int soldaki(int i)
{
return 2 * i + 1;
}
int sağdaki(int i)
{
return 2 * i + 2;
}
int üstteki(int i)
{
return (i - 1) / 2;
}
bool ekle(int x)
{
dizi[büyüklük++] = x;
return true;
}
void yukarıKaydır(int i)
{
int ü = üstteki(i);
while (i > 0 && karşılaştır(dizi[i], dizi[ü]) < 0) {
swap(i, ü);
i = ü;
ü = üstteki(i);
}
}
}
int karşılaştır (int x, int y)
{
if (x < y) return -1;
if (y > x) return 1;
return 0;
}
void main()
{
İkiliYığın yığın;
}
Yeterli kadar test edemedim şimdilik ;-) Bir de buradaki 'swap' işlevi düşündüğümüz gibi çalışır mı emin olamadım.
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]