Genelde üretim yazılımında Deque'i nerede kullanırdım?


21

Yazılım uygulamalarında Yığınlar, Kuyruklar ve Ağaçlar'ı nerede kullanacağımı çok iyi biliyorum ama daha önce hiç Deque (Çift Uçlu Kuyruk) kullanmamıştım. Genelde onlarla vahşi doğada nerede karşılaşırım? Sıra ile aynı yerlerde mi, ama fazladan kabarıklıkla mı olurdu?



Görünüşe göre bu konuyla ilgili bazı karışıklıklar var. İnternette "deque" çift uçlu bir kuyruktur (wikipedia bağlantılı liste uygulamasından bahseder). Ancak C ++ STL'de "std :: deque", veri blokları dizisi olarak uygulanan dizi benzeri bir yapıdır. Std :: vector öğesine benzer rasgele erişim sunar, ancak yeniden boyutlandırma özelliği std :: list'inkine daha yakındır, çünkü veriler eklendikçe blok ekler ve var olan verileri yeniden tahsis etmez ve taşımaz.
DXM

1
@DXM: Bir STL deque hala çift uçlu bir kuyruktur ve uçlarda daha hızlı işlemler sağlar (uygulamaya bağlı olarak). Ortaya da erişim sağlaması, birincil operasyonunu daha az kuyruk benzeri yapmaz.
gbjbaanb

@gbjbaanb: Tek söylediğim 3 sınıfın ortak arayüzlerine bakarsanız: std :: vector, std :: list (veya std :: queue) ve std :: deque, std :: vector göreceksiniz ve std :: deque aynı ortak arayüze ve aynı kapasiteye sahiptir (std :: deque, daha büyük bellek alanı kullanım pahasına pahasına biraz daha esnektir). std :: list ve std :: queue ise sırasıyla CS karşı-parçaları, bağlantılı-liste ve sıra gibi davranır. CS deque! = Std :: deque
DXM

Bu cevabı shiv.mymail tarafından daha pratik buluyorum - - stackoverflow.com/questions/3880254/…
roottraveller

Yanıtlar:


21

Bir dekonta kullanılmanın bir yolu eşyaları “yaşlandırmak”. Genellikle geri alma veya tarihçe özelliği olarak kullanılır. Deque içine yeni bir eylem eklenir. En eski eşyalar ön tarafta. Deklanşörün büyüklüğündeki bir sınır, öndeki öğeleri, yeni öğeler yerleştirilirken bir noktada çıkarılmasını zorlar (en eski öğeleri yaşlandırır). Daha sonra yapının her iki ucuna erişmek için hızlı bir yol sağlar, çünkü cepheyi kaldırmak ve en eski eylemi O (1) olarak yapmak veya O (1) zamanında geri almak için en eski ve en yeni öğeleri anında bilirsiniz.


Burada deque'lerin kullanıldığını / ihtiyaç duyulduğunu sanmıyorum. Basit (boyutla sınırlı) bir yığın yeterlidir.
Konrad Rudolph

2
@Konrad Basit bir yığında eşyaları nasıl yaşlandırıyorsunuz? (yani, "çok eski" komutları nasıl kaldırırsınız?)
Andres F.

@AndresF. Yığın büyüklüğünden bağımsız mı? Eğer öyleyse, o zaman bu veri yapısını hiç duymadım. Aksi takdirde basit bir biçimde gerçekleştirilebilir sabit boyutta bir yığın var açısından , ya da sadece sabit boyutlu yığın olarak adlandırılan daha basit bir veri yapısını varsayarak bir deque.
Konrad Rudolph

Deques Yani vardır sonuçta yararlı;)), anlamında Şunu (sabit boyutlu yığınının duymuş en eski öğeyi kaldırma vermeyin. Mantıklı, ancak genellikle "yığın" ile kastedilen şey değildir ve aslında daha basit olup olmadığı görülmeye devam eder :)
Andres F.

Bu asıl sorunun yorumunda yayınlandı: en.wikipedia.org/wiki/Double-ended_queue Bu sadece iki taraflı bir sıra. Pratikte yukarıda ana hatlarıyla belirtdiğim şekilde kullandım (bu yüzden gönderdim). Gerçek bir yığında, yapmanız gereken tek işlem push, pop, top ve peek'tir (başkalarını tartışabiliriz, ama bu genellikle böyledir). Yığının altında ne olduğu ve hatta tabana nasıl erişileceği hakkında hiçbir bilginiz olmamalıdır. "Sabit boyutlu bir yığında", doldurduğunuzda eski öğelerin yaşlanması yerine yığın taşması oluşturursunuz.
08

1

Mükemmel soru CS 102 kursumuzu, çift uçlu kuyruk için tek bir başvuruda bulunduğunu hatırlayamıyorum.

Bu güne kadar bildiğim tek uygulama Vikipedi makalesinde belirtilen iş çalma zamanlayıcısı .

Esasen aşağıdaki gibi çalışır:

Normal, tek iş parçacıklı bir yordamsal modelde, her işlev çağrısı, çağrı yığını adı verilen bir etkinleştirme kaydını zorlar . Bir etkinleştirme kaydı, bu aramanın yerel değişkenlerini ve parametrelerini içerir. Yönteme yapılan çağrı tamamlandığında (“geri döner”), son etkinleştirme kaydı çağrı yığından çıkarılır.

Bu özellikle önemlidir, çünkü özyinelemenin uygulanma şekli: özyinelemenin yapısı çağrı yığınının mevcut durumunda temsil edilir.

Özyinelemeli bir algoritmayı paralelleştirirken, çağrı yığınını bir çağrı kuyruğu ile değiştirerek bu özellikten faydalanabiliriz. Hesaplamadaki her iş parçacığı kendi çağrı sırasını alır ve sıralı bir uygulamadaki gibi etkinleştirme kayıtlarını iter ve çıkarır.

Ancak bir iş parçacığı işini bitirdiğinde (= çağrı sırası boş), “yanlış” uçtan kaldırarak bu iş parçasının çağrı kuyruğundan bir aktivasyon kaydını kaldırarak başka bir iş parçacığından iş çalıyor .

Temel olarak, çağrı kuyruğu şimdi iki iş parçacığına hizmet eden iki çağrı yığını gibi davranır.


Bunun için kaynağın var mı? Kulağa ilginç geliyor.
kyjelly90210

1
@ Richard1987 Wikipedia makalesi orijinal makaleye atıfta bulundu. Örneğin GNU c ++ stdlib paralel uzatma iş çalma uygulamasında (ancak kod okunması korkunçtur) veya genelleştirilmiş bölmenin paralel uygulamasında veya sizin tarafınızdan gerçekten fethedildiğinde (ancak ikincisi çok deyimsel bir programlama stili kullanıyor) birkaç uygulama var kütüphaneye özel ve bu nedenle okumak zor)
Konrad Rudolph
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.