Bir yığın kullanmak ne zaman isterim?


92

Öncelik Kuyruğunun açık cevabının yanı sıra, programlama maceralarımda bir yığın ne zaman yararlı olur?


8
Burada pek çok iyi cevap var, bu yüzden "bir yığın yeterince büyük olmadığında" diyeceğim.
Don Werve

Yanıtlar:


121

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.


3
Ayrıca, ek dizi ayırmaları gerektirmeyen kullanışlı bir garantili NlogN sıralaması olabileceğini unutmayın
Overflown

38
Röportaj soruları için yığınları bilmek de harika;)
vivekian2

21
@ vivekian2 Burada olmamın tek nedeni röportaj yapmak üzere olmam.
byxor

neden en büyük (veya en küçük) öğeyi izlemek için yardımcı yığınlı bir yığın sınıfı kullanmıyorsunuz? geri alma O (1)
Ridhwaan Shakeel

@RidhwaanShakeel Yığını kullanırsanız, öğeniz her zaman başa yerleştirilecektir, ya öğenin konumunun öğenin en büyük etkinlik gibi bazı özelliklerine göre belirlenmesi gerekiyorsa (etkinliğe katılan kişi sayısına bağlı olarak).
SandeepGodara

49

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.

Gerçek dünya örneği (pek adil değil, yine de):

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).

Daha karmaşık bir örnek:

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, 7medyan, çü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.


6
Daha sofistike örnek harika! Bunu kesinlikle bir ara deneyeceğim. Ancak, örneğinizde küçük bir hata olduğunu düşünüyorum. Ortadaki iki öğenin ortalamasını alarak medyanı almamız gerektiğinden. Geçerli medyandan daha büyük sayıları depolamak için bir min. Yığın ve mevcut medyandan daha küçük sayıları depolamak için bir maks. Yığın kullanmamız gerektiğini varsayıyorum. Bu şekilde ortadaki iki elementi sabit zamanda çıkarabilir ve medyanı hesaplayabilir miyiz? Doğrumuyum?
Calvin Ku

12

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!


3

Ayrıca seçim algoritmaları için de iyidir (minimum veya maksimum değeri bulma)


3

ne zaman geçici bir listeyi sıraladığınızda, yığınları dikkate almalısınız.


0

Sırasıyla en küçük ve en büyük öğelere erişmek istediğinizde bir minHeap veya maxHeap kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.