Öncelik Kuyruğunun açık cevabının yanı sıra, programlama maceralarımda bir yığın ne zaman yararlı olur?
Yanıtlar:
En büyük (veya en küçük) öğeye hızlı erişime ihtiyacınız olduğunda kullanın, çünkü bu öğe her zaman dizideki veya ağacın kökündeki ilk öğe olacaktır.
Bununla birlikte, dizinin geri kalanı kısmen sıralanmamış olarak tutulur. Bu nedenle, anında erişim yalnızca en büyük (en küçük) öğeye mümkündür. Eklemeler hızlıdır, bu nedenle gelen olaylar veya verilerle başa çıkmanın ve her zaman en eski / en büyük olana erişmenin iyi bir yoludur.
Öncelik kuyrukları, planlayıcılar (en erken öğenin istendiği yerde) vb. İçin kullanışlıdır.
Yığın, bir ana düğümün değerinin, alt düğümlerinden herhangi birinin değerinden daha büyük olduğu bir ağaçtır.
Bir yığını, derinliğe göre doğrusal sırayla depolanan bir ikili ağaç olarak düşünürseniz, önce kök düğüm (sonra o düğümün alt öğeleri, sonra bu düğümlerin alt öğeleri); daha sonra indeks N'deki bir düğümün çocukları 2N + 1 ve 2N + 2'dedir. Bu özellik, indekse göre hızlı erişim sağlar. Yığınlar düğümleri değiştirerek manipüle edildiğinden, bu yerinde sıralama yapılmasına izin verir.
Yığınlar, minimum veya maksimum değerlere hızlı erişim sağlayan yapılardır .
Ama neden bunu istiyorsun? Sadece her girdiyi kontrol edebilir eklenti en küçük ya da en büyük olup olmadığını görmek için. Bu şekilde, sabit zamanda her zaman en küçüğüne veya en büyüğüne sahip olursunuz O(1)
.
Cevap, yığınların en küçük veya en büyüğünü çekmenize ve SONRAKİ en küçük veya en büyüğünü hızlı bir şekilde bilmenize izin vermesidir . Bu yüzden buna Öncelik Kuyruğu deniyor.
Hastaların yaşlarına göre gittiği bir hastaneniz olduğunu varsayalım. Sıraya ne zaman girmiş olursa olsun, en yaşlılar her zaman önce katılır.
En eskisini takip edemezsiniz çünkü onu çıkarırsanız, bir sonrakini bilemezsiniz. Bu hastane sorununu çözmek için maksimum bir yığın uyguluyorsunuz . Bu yığın, tanımı gereği kısmen sıralanmıştır. Bu, hastaları yaşlarına göre sıralayamayacağınız anlamına gelir, ancak en yaşlı olanların her zaman en üstte olduğunu bilirsiniz, böylece bir hastayı sabit bir zamanda çıkarabilir O(1)
ve günlük süresinde yığını yeniden dengeleyebilirsiniz O(log N)
.
Bir dizi tam sayıya sahip olduğunuzu ve median
. Ortanca, sıralı bir dizinin ortasındaki sayıdır.
Misal:
[1, 2, 5, 7, 23, 27, 31]
Yukarıdaki durumda, 7
medyan, çünkü daha küçük sayıları içeren dizi, daha büyük sayıları içeren diziyle [1, 2, 5]
aynı boyuttadır [23, 27, 31]
. Normalde, dizi tek sayıda öğeye sahipse, medyan ortadaki 2 öğenin aritmetik ortalamasıdır, ör (5 + 7)/2
.
Şimdi, medyanı nasıl takip edersiniz? 2 yığın olmasıyla , geçerli medyandan daha küçük sayıları içeren bir min. Yığın ve geçerli medyandan daha büyük sayıları içeren bir maks. Yığın. Şimdi, eğer bu yığınlar her zaman dengelenmişse, 2 yığın aynı sayıda öğeyi içerecek veya biri diğerinden en fazla 1 öğesi olacak.
Diziye yeni bir öğe eklediğinizde, sayı geçerli medyandan daha küçükse, bunu min. Yığına eklersiniz, aksi takdirde, maksimum yığına eklersiniz. Şimdi, yığınlar dengesizse (bir yığın diğerinden 1'den fazla öğeye sahipse), en büyük yığından bir öğe çekip en küçüğüne eklersiniz . Şimdi dengelendiler.
Bir yığının özelliği, veriyi yarı sıralı tutan bir yapı olmasıdır; bu nedenle, tam bir düzeni sürdürmenin maliyeti ile rastgele kaos içinde arama maliyeti arasında iyi bir değiş tokuş. Bu özellik, seçim, sıralama veya sınıflandırma gibi birçok algoritmada kullanılır.
Bir yığının bir başka yararlı özelliği de, bir diziden yerinde yaratılabilmesidir!