Neden her ikisine de “yığın” deniyor?


170

Çalışma zamanı yığını neden C stili dillerde dinamik bellek ayırma için kullanılıyor ve her ikisi de "yığın" olarak adlandırılan veri yapısı ? Bir ilişki var mı?


4
Bugün veri yapılarını incelerken bunu merak ediyordum.
MitMaro


3
İngilizce sözlüğe gidin ve "Çalıştır" altındaki giriş sayısını sayın. 40+ girişin kaç tanesi bilgisayarlar için geçerlidir? :)
jmucchiello


İlgili bir yazı burada dinamik bellek tahsisi için kullanılan wrt çalışma zamanı yığını.
RBT

Yanıtlar:


77

Donald Knuth diyor ki (Bilgisayar Programlama Sanatı, Üçüncü Baskı, Cilt 1, sayfa 435):

Birkaç yazar, 1975 yılında mevcut hafıza havuzunu "yığın" olarak adlandırmaya başladı.

Hangi yazarları belirtmez ve belirli bir makaleye referans vermez, ancak öncelik sıralarıyla ilgili olarak "yığın" teriminin kullanılmasının kelimenin geleneksel duygusu olduğunu söyler.


11
Havuz yığın daha iyi bir isim olurdu.

7
İlginç. Birisi ona hangi yazarları hatırlayıp hatırlamadığını sormalıdır.
Prof. Falken

27
Wikipedia, bunun erken bir aşamada Lisp'in bellek deposunu uygulamak için bir yığın (veri yapısı) kullandığını iddia ediyor. Nasıl olduğunu söylemiyor. Referansı "Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest (1990): Algoritmalara giriş. MIT Press / McGraw-Hill.".
Steve Jessop

2
Bunun için hiçbir referans var ama benim tahminim başlangıçta açık bellek bloklarına referansları düzenlemek için kullanılan veri yapısı bir min yığın olurdu. Depolamaya çalıştığınız verileri depolamanıza izin veren en küçük bellek bloğunu hızlı bir şekilde bulmanın en azından iyi bir yolu gibi görünüyor Güncelleme: Söylediklerim tam olarak arkadaş blokları gibi geliyor en.wikipedia.org/wiki/Dynamic_memory_allocation # Buddy% 5Fblocks
Will

4
@SteveJessop - Cormen, Leiserson, Rivest, Stein - 3. baskı (2009), Heapsort bölümünün başlangıcında sadece "yığın" terimi başlangıçta heapsort bağlamında üretildi, ancak o zamandan beri " çöp toplanan depolama "gibi Java ve Lisp programlama dilleri sağlar. Öbek veri yapımız çöp toplanan depolama değildir ve bu kitaptaki yığınlara ne zaman başvurursak, çöp toplamanın bir yönü yerine bir veri yapısı anlamına geliriz. ' CLRS - 2. baskı da neredeyse aynı ifadeye sahiptir (Lisp'in Yığın kullandığına dair bir belirti yoktur).
dr jimbob

64

Aynı isme sahipler ama gerçekten benzer değiller (kavramsal olarak bile). Bir bellek yığınına, bir çamaşır sepetine "çamaşır yığını" dediğiniz gibi bir yığın adı verilir. Bu ad, belleğin istendiği zaman tahsis edilebileceği ve dağıtılabileceği biraz dağınık bir yeri belirtmek için kullanılır. Veri yapısı (referans verdiğiniz Wikipedia bağlantısının işaret ettiği gibi) oldukça farklıdır.


8
Evet, sanırım bu onun sorusuna dayandığı nokta: farklılar. Öyleyse neden aynı şey deniyorlar - altta yatan bir ilişki var.
Sean Owen

9
Bu cevabı yorumlama şeklim "hayır, altta yatan bir ilişki yok", bu yüzden soruyu cevaplıyor.
Laurence Gonsalves

Andrew buna cevap veriyor. İlişki yok. Sadece tesadüf. Bellek bir yığın giysi gibi tahsis edildiğinden, bellek yığını ortak kullanım için daha doğrudur. Ancak veri yapısı daha geniş bir hayal gücü gerektiriyordu. Ve bu çok daha ilginç bir "neden" olur. İsim, düğümlerin anahtarları tarafından düzenlendiği gerçeğinden gelir ve bir üst düğüm anahtarı her zaman alt düğümünden> = olur.
Alexandre Bell

6
Kesinlikle ilgisizler. Ancak "yığın" olarak adlandırılan sorun, "yığının" muadili - "yığın" - aynı zamanda gerçek bir yığın olmasıdır.
dan

1
Neden yığın veri yapısı yığın denir biliyorum: çünkü yığın özelliği tatmin. Peki neden yığın özelliği böyle denir? Benim için hiç mantıklı değil, çünkü "en ağır" gibi bir isim daha iyi olurdu.
Thomas Eding

31

İsim çarpışması talihsiz, ama o kadar gizemli değil. Yığın , yığın, toplama, grup, vb. Anlamına gelen küçük, ortak bir kelimedir. Söz konusu veri yapısı için veri havuzunun adı, tarih havuzunun adından önce gelir (eminim). Aslında, havuz bence ikincisi için çok daha iyi bir seçim olurdu. Yığın , veri yapısına uyan, ancak bellek havuzuna sığmayan dikey bir yapı (yığın gibi) anlamına gelir. Bir bellek havuzu yığınını hiyerarşik olarak düşünmüyoruz, oysa veri yapısının arkasındaki temel fikir en büyük öğeyi yığının (ve alt yığınların) üstünde tutmaktır.

Yığın veri yapısı 60'lı yılların ortalarına kadar uzanır; bellek havuzu, 70'lerin başında yığın. Yığın terimi (bellek havuzu anlamına gelir) en az 1971 gibi erken dönemde Algol tartışmalarında Wijngaarden tarafından kullanılmıştır .

Yığın veri yapısı olarak en erken kullanımı yedi yıl önce
Williams, JWJ 1964'te bulunur. "Algorithm 232 - Heapsort", ACM'nin İletişimi 7 (6): 347-348


1
Evet, ancak bir yığın da bozukluğu ima eder ve bellek yığınları genellikle düzensizdir. Veri yapısı yığını son derece iyi sıralanmıştır. Öyleyse, yığının ortak tanımına dayalı olarak eşit bir uyumsuzluk var.
jmucchiello

Her zaman IMO adını açıklamak için yeterli olan yığının tersi olarak tanıtılır .
reinierpost

1
Bu bir tesadüf değil - ücretsiz liste bir binom yığını aracılığıyla öncelik sırası olarak uygulanabilir.
Heath Hunnicutt

2
@jmucchiello: bir günlük yığını ( resme bakın ) iyi düzenlenmiş ve ağaca benzemektedir. Lisans ders kitaplarımdan birine göre veri yapısının adının kaynağı budur.
gioele

6

Aslında, hafızanın nasıl tahsis edildiğini okumak (bkz. Buddy Blocks ) bana veri yapılarındaki bir yığını hatırlatıyor.


Peter Zhang'ın cevabı hakkındaki yorumum burada da geçerli. İkili arkadaş sistemi bir ikili ağaç olarak temsil edilebilir ve her bir düğümün "anahtarı" altındaki toplam bellek olduğunda (ancak bu değerler örtüktür ve asla değişmez) geçerli bir maksimum yığın olarak görünür . Ne ayırma ne de serbest bırakma algoritması, bu ikili ağaç üzerinde yığın işlemlerini anlayabildiğim kadarıyla kullanmaz.
Eric Dubé

5

IMO bu tamamen birbiriyle alakasız iki şeyin aynı isme sahip olması bir tesadüf / tesadüf. Grafik ve grafik gibi .


İki grafik bir şekilde ilişkili olabilir. Bir fonksiyonun grafiğini aşağıdaki gibi düşünün: Tuple alanı, aralık) bir tepe

2
@Amit: Sonsuz sayıda köşe noktası anlamına gelen sürekli grafikler için. Bu tamam, ama bu aynı zamanda köşeler arasındaki kenar kavramını anlamsız kılıyor. F (x) = x * 2 fonksiyonunun grafiğinde, (0,0) ve (1,2) arasında bir kenar var mı? Evet ise, (0,0) ve (0,5,1) 'e ne dersiniz? (0,0) ve (0,25,0,5)? Köşeler arasında bir kenar kavramına sahip olmanın bir yolu yoktur, bu yüzden bu gerçekten bir grafik değildir.
MAK

5

Yığın benzeri veri yapısı, kullanılabilir bellek tahsisini bulma algoritması tarafından kullanılır. Aşağıdakiler http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html adresinden alınmıştır .

Ne zaman newçağrılır, bu isteğiniz için boyutuna uyan bir boş bellek bloğu için aramaya başlar. Böyle bir bellek bloğunun bulunduğunu varsayarsak, ayrılmış olarak işaretlenir ve o konuma bir işaretçi döndürülür. Bunu gerçekleştirmek için çeşitli algoritmalar vardır, çünkü nesnenizin boyutundan daha büyük en küçük boş bloğu bulmak için tüm belleği taramak veya belleğin ihtiyaç duyduğu ilk bloğu geri döndürmek arasında bir uzlaşma yapılmalıdır. Bir bellek bloğu alma hızını artırmak için, boş ve ayrılmış bellek alanları, yığın adı verilen ikili ağaçlara benzer bir veri yapısında tutulur.


1
Bu konuda son derece şüpheliyim. Bana yazarın "yığın" ismine dayalı bir bağlantı olduğunu tahmin ettiği gibi geliyor ve muhtemelen yanlış. Herkes onaylayabilir / reddedebilir mi?
Don Hatch

1
İkili Buddy sistemi (Linux'ta kullanılır) üzerine yapılan hafif bir araştırmadan sonra, verileri bölümlere ayırması nedeniyle bir ikili ağaç tarafından temsil edilebilir. Düğümleri toplam bellek açısından gözlemlerseniz bu ikili ağaç geçerli bir maksimum yığın gibi görünür, ancak düğümler maksimum yığında olduğu için bu ikili ağaca eklenmez - düğümler doğrudan en küçük boş bellek yaprağına eklenir> = istenen boyut. 1 2 3
Eric Dubé

1

Konuşma dilleri yığını yığını ve yığın bellek C ++ standardında kullanılmaz. Standart, statik depolama, iş parçacığı depolama, otomatik depolama ve dinamik depolama kullanır.

Standardın Depolama Duraction bölümünde daha fazlası bulunabilir .

Bu nedenle, dil ve standart kütüphane bakış açısından, bir karışıklık yoktur.


1

S. Öbek nedir? A. Öbek, üst üste yerleştirilen bir nesne koleksiyonudur.

Sorunuzun cevabı: Hem bellek yığını hem de ikili yığın, bildiğinizle aynı kavramı kullanır. Veriler, bellekte bir yığın şeklinde programda yazılanla aynı sırada depolanırken, ikili yığın, verileri bir yığın şeklinde düzenli bir şekilde depolamakla aynı kavramı izleyen bir veri yapısıdır (Üstte veri diğerinin). Yorumlar bölümünde ne düşündüğünüzü bana bildirin.


-2

Belki de uygulanan ilk bellek yığını bir yığın yapısı tarafından yönetiliyordu?


8
Bu hipotez hiç de açık görünmüyor - bir yığın (veri yapısı) bir yığını (dinamik bellek bölgesi) korumak için nasıl faydalıdır?
Keith Randall

7
-1. Açıkçası sadece bir tahminde bulunanın yerine kanıtla yetkili bir beyanı tercih ederim.
Rob Kennedy

Hiç alışılmadık bir şekilde. Yığını (boş bellek havuzu) yönetmek için bir yığın (veri yapısı) kullanmak için iyi bir neden yoktur.
Jason
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.