Kuyruklar için bazı iyi ve basit örnekler nelerdir? [kapalı]


9

Ben öğretiyorum CS2 ( Java and data structures) ve sıraları öğretim kullanılacak iyi örneklerle geliyor bazı zorluk yaşıyorum. Bunları kullandığım iki büyük uygulama multithreadedmesaj geçişidir (ancak MT programlama dersin kapsamı dışındadır) ve BFS-style algorithms(ve terimin ilerleyen zamanlarına kadar grafikleri kapsamaz).

Ayrıca örneklerden kaçınmak istiyorum. Düşündüğüm çoğu şey, eğer onları tek iş parçacıklı bir şekilde çözecek olsaydım, sıra yerine sadece bir liste kullanırdım. Ben sadece işleme ve keşif serpiştirilmiş (örneğin arama) veya uzunluk sınırlı tamponlar gibi diğer özel durumlarda (örneğin son N öğeleri korumak) için kuyrukları eğilimindedir . Pratik olarak, öğrencilerime sadece bir özelliği göstermek için oyuncaklar değil, gerçek programlarda bir şeyler yapmanın iyi yollarını öğretmeye çalışıyorum.

Örnek olarak kullanabileceğim, ancak en az diğer ön bilgileri gerektiren iyi, basit algoritmalar veya kuyruk uygulamaları hakkında herhangi bir öneriniz var mı?


+1, ancak yalnızca sizin sorunuzu içerdiğini düşünerek 'kuyruk' etiketini oluşturmaktan kaçınırım. 'Veri yapılarını' kullanırdım.
K.Steff

@ K.Steff, her ikisine de sahip olabilirsiniz :-) Herhangi bir yeni etiketin başında tek bir soru ile ilişkili olduğunu unutmayın.
Péter Török

1
BFS'yi kapattığınızda Kuyrukları kapsamak doğaldır. Neden o zamana kadar Kuyrukları kaydetmiyorsunuz? Aynı zamanda doğrusal bir temsile sahip oldukları için Kuyrukları bağlantılı listeler ve dizi listeleriyle örtmeniz gerekmez.
kevin cline

@ PéterTörök Tüm etiketlerin boş başladığını, ancak 'kuyruk' aramasının 313 soru getirdiğini ve başka hiç kimse 'kuyruk' etiketini oluşturmadığını fark ettim. Bu sadece IMO, zaten
K.Steff

Cevaplarda tekrarlanan bir tema, gerçek dünya kuyruklarının simülasyonları gibi görünüyor. Şimdiye kadar düşündüğüm, programlamada ortaya çıkan bir sorunu çözmek için sıra kullanacağım şeylerin örneklerini kullanmayı tercih ettiğim ve fiziksel dünyadaki örneklerin çoğunun eşzamanlı ortamlarda en iyi şekilde parladığıydı. Ancak, bu temanın tekrarı göz önüne alındığında, yararlı bir düşünme çizgisinde olmamam iyi olabilir. Öneriler gelmeye devam et! Ve büyük yardımlarınız için hepinize teşekkürler.
Michael Ekstrand

Yanıtlar:


14

Kuyrukları öğrenirken profesörüm her zaman bir mağaza örneği kullandı. Herhangi bir zamanda 1 veya daha fazla kayıt açıktır ve Müşteriler bir sırayı girer ve tüm öğelerini satın almak için bu sıraya geçer.

Müşterileri bir RegisterQueue aracılığıyla hareket ettirebilecek basit bir program uygulamak zorunda kaldık, bu yüzden gerçekten bir program arıyorsanız öğrencilere bu örneği basit ve anlaşılır, aynı zamanda her öğrencinin gerçek hayatta gördüğü bir şey verebilirsiniz. kavramı daha iyi anlamalarına yardımcı olabilir.


Dediğim gibi, bu örnek hem çok sezgisel hem de neredeyse çok sık kullanılır;)
marktani

1
Avantajları olan müşteriler için öncelik sırasına (Aero planı) sahip olarak karmaşıklık ekleyebilirsiniz.
sixtyfootersdude

1
IMO, en kolay örnekler hayatta karşılaştığımız örneklerdir. 'Çizgi' örneği, bir kuyruğun harika bir temsilidir ve öğrencilerinizin öğrenmesine yardımcı olmalıdır. Aslında, kuyrukları ve işlemlerinin nasıl tanımlandığını düşündüğümde, onu daha iyi görmeme yardımcı olmak için genellikle 'çizgi' örneğini düşünüyorum.
Nicholas

Bu aynı zamanda kuyruk teorisine kısaca değinmek için harika bir fırsattır: neden birden fazla kayıt sunan tek bir satır, kayıt başına bir satırdan daha iyidir. Bir simülasyon oluşturmasına ve onunla oynamalarına izin verin. Mühendis Guy harika, basit bir açıklama var: engineerguy.com/videos/video-lines.htm
jpeacock

5

Sıraları öğrendiğimde öğretmenim onları polis kontrolündeki arabalar için bir sıra kullanarak tanıttı. Arabaları tutan bir kuyruk vardı ("bekleme kuyruğu") ve polis adamı kuyruktaki bir sonraki arabayı her zaman kontrol edecek ve daha fazla inceleme için meslektaşına gönderecek veya aracın geçmesine izin verecekti.

Çok sık kullanılan bir örnek, süper pazardaki sıra ...

Neden öğrencilerinizden bazı örnekler vermelerini istemiyorsunuz?


Süpermarket örneği için +1. Ben cevabımı yazarken bahsettin!
Mike Caputo

3

Aklıma bir örnek, örneğin McDonalds'taki bir hamburger işleme hattı. Birkaç farklı burger vardır, her biri birkaç farklı işçi tarafından üretilebilir ve her birinin kendi kuyruğu vardır. Oradan, bir süre sonra hazır hamburgerler, FIFO düzeninde, bu tür bir hamburger sipariş eden kasiyerlerden biri tarafından alınır.

Yani birden fazla üretici ve tüketici var ve her kuyruk sınırlandı.


Hızlı fast-food kayıt düzenlemelerinin farklı stillerini işlemci tasarımlarıyla karşılaştırarak sınıf arkadaşlarını üniversitede hatırlıyorum. Bir sıra birden fazla kayıt tarafından işleniyor mu? Her kayıt kendi kuyruğuna mı sahip? Aynı hatta birden fazla işçi - süper skaler işleme. Eğlenceli oldu.

3

Amazon'u örnek olarak kullanmayı düşündüm, devasa sistemlerinde bir yerde ele alınması gereken bir emir sırası olmalı. basit bir sığınak ve sakatlık ile ele alınabilir sistem, bir müşteri her kitap satın aldığında sistemdeki bir siparişi kuyruğa alır ve bir depolama evi kişisi onu almak ve yayınlamak için onu aldatır.

Daha sonra öncelik kuyrukları hakkında konuşmaya başlamak kolay olurdu, kuyruğu atlayabilecek başlıca müşterileri tanıtarak öncelik kuyrukları getirebilirsiniz.

Hangi ders kitabını kullanıyorsunuz?


Carrano - Java ile Veri Yapıları ve Soyutlama .
Michael Ekstrand

2

Kuyruğa mükemmel bir örnek, bir hesaba karşı işlem yapan bir banka olabilir. Genellikle gün sonunda "bekleyen" işlemlerin bir listesini görürsünüz. Muhasebe tamamlandığında bu işlemler hesaba uygulanır. Bununla öncelik sıraları alanına bile girebilirsiniz. Çoğu banka, gece işlemlerini gerçekleştirirken borçlara öncelik verdiğinden, beklemedeki kredileri uygulamadan önce taslak ücretlerle sizi dindirebilirler.

İşlemler, gerçekleştirilen ve sıradan çıkarılan zaman sırasına göre kuyruğa eklenir ve muhasebe süreci tarafından hesaba uygulanır.


2

Bir telekom programcısıydım, bu yüzden akla geliyor:

Bir Müşteri Hizmetleri yardım hattı. Bir çağrı gelir, çağrıyı işlemek için yeterli operatör yoktur ve çağrı bir sıraya yerleştirilir. Bir sonraki çağrı gelir ve sıraya da yerleştirilir. Sonra bir sonraki operatör kullanılabilir hale geldiğinde, kuyruğa giren ilk çağrı mevcut operatöre atanır.


2

Bariz Gerçek Dünya örnekleri, ödeme hatları gibi şeyler olacaktır, ancak kesinlikle bilgi işlemden kaynaklanan bir örnek aradığınızdan, iş planlama kuyrukları önerebilir miyim ?

Kaç öğrencinizin bir İşletim Sistemleri dersi aldığını bilmiyorum, ancak hepsinin süreçlerini bir noktada kontrol etmek için Görev Yöneticisi'ni kullanması iyi bir bahis . Programlama kuyruğunun basitleştirilmiş bir örneğini tanıtabilir ve belirli bir boyutta bir "görev" üreten (veya kabul eden) bir program yazmak ve bunları "başlattıklarında" FIFO düzeninde işleyen bir program yazmak için onlara bazı ödevler atayabilirsiniz.

Anlamak oldukça kolay bir kavramdır, kuyruğun içeriği üzerinde kabul ettiği sırayla çalıştığı fikrini gösterir ve onlara CPU planlamasına (çok temel ve basitleştirilmiş) bir giriş verir. Sadece iki parçam.

Çok iş parçacıklı uygulamalarını getirebilirsiniz, ancak öğrenciler dişli programlar yazma konusunda deneyim sahibi olmadıkça, onlara iki sinir bozucu olabilecek iş atamazdım. Üniversitenin ikinci yılında veri yapılarını (özellikle Java'da C ++ yapmamış ve işaretçiler hakkında bir şey öğrenmemiş) öğrenmekte sorun yaşadığımı hatırlıyorum, bu yüzden doğrudan bilgisayarla ilgili basit ama pratik bir örnek muhtemelen en iyisidir.


1

Gerçek dünya:

  • İnsanların sıraya girdiği her zaman: bakkalda kasiyer, bir masa bekleyen restoranda (bazen benzetmeye verdikleri bip seslerinde çalışabilirsiniz), vb. satır yerine bu kuyrukları çağır (NA'da ortak)
  • Kitap dizisi okunuyor ', author.publish => queue.push ve student.read => queue.pop

Gerçek Olmayan Dünya:

  • Gönderilen tüm verilerin, işlemenin gönderimden daha uzun sürdüğü tek iş parçacıklı bir ortamda işlenmesi (örneğin, çevrimiçi mağazalar için ödeme işlemleri)
  • Yinelenebilen herhangi bir FIFO koleksiyonu kuyrukları kullanabilir ve while(queue.peek)yineleyici yerine kullanabilir .

1

Oyunları örnek olarak kullanmayı seviyorum, çünkü genellikle dosya IO'sundan veya başka bir şeyle karşılaşabileceğinizden biraz daha heyecan verici.

Bu nedenle, bir strateji oyununda bir birime birkaç komut vermek istediğinizde (örn. .)

Ya da saniyede yalnızca 30 kareyi işleyebilen bir uygulamanız var, ancak kareler arasında 4 veya 5 giriş alabilirsiniz. Eğer bir silah değiştirme girişiniz ve bir atış girişiniz varsa, bunların alındıkları sırayla ele alındığından emin olmak istersiniz, aksi takdirde bıçaklamak istediğinizde el bombası yapabilirsiniz. Ve bıçaklamak istediğinde el bombası yaparsan, kötü bir zaman geçireceksin. (bunu kayak hocası memesine koyun ve slaytlarınıza atın) :)

Bir sunucu işleme istekleri başka iyi bir istek.

Girdi alan bir CNC makinesi. Makine sadece çok hızlı gidebilir, bu nedenle girişi sıraya alması gerekir.


1

Düşünebileceğim bazı örnekler:

  • Hesap makinesi - öneki ve son düzeltmeyi aynı anda tanıtabilir
  • Ayakkabı bağlamak için talimatlar. Son işlemi gerçekleştirene kadar bir sonraki işlemi tamamlayamıyorum
  • Arabellekler - Belki kullanıcının girdiği ancak ton sesini henüz çıkarmamış numaraları saklamak için kullanılan bir telefon arabelleği
  • sindirim

1

Üretim hatları kuyruklarla doludur. Bir dolum makinesine giden boş şişelerin bir satırını düşünün. İlk giren ilk çıkar, bir işlemi birçok nesneye sırayla uygulamanın doğal bir yoludur. Kuyruklar bir işlemi diğerinden ayırmak için de kullanılır: etiketleme makinesinde kısa süreli bir sorun varsa dolum makinesinin hemen durması gerekmez.

Kuyruklar yazılımda yaklaşık aynı şekilde kullanılır. Bir işlemin çıktısı başka bir işleme giriş için sıraya alınabilir. İşlemler arası iletişimden, iş parçacıkları arası iletişimden ya da karmaşık bir işlemi aynı iş parçacığının işleyebileceği parçalara ayırmaktan bahsediyor olun.

İşletim sistemlerinde, kuyruklar genellikle girdileri sırayla işlemek için kullanılır. Dosya sistemi bir depolama cihazındaki blokları okuyabilir ve örneğin bir kuyruğa ekleyebilir. Veya tuşa basma ve fare hareketleri gibi şeyleri işleyen kesintiler, olay kuyruğuna eklenen olayları oluşturur, böylece yazarken "sıra" yerine "uqeeu" almazsınız.

Basit bir öğrenci ödevi için, bazı girdileri kabul eden ve daha sonra bunları işleyen herhangi bir görev düşünüyorum. Örneğin, basit bir postfix ifade değerlendiricisi yazmalarını sağlayabilirsiniz. Üç bölümden oluşur:

  • bir girişi okuyun, giriş kuyruğuna ekleyin ve başka girdi kalmayana kadar tekrarlayın

  • kuyruktan bir eşya al

    • öğe bir sayı ise, bağımsız değişken yığınına itin
    • öğe bir operatörse, gerekli bağımsız değişkenleri açın ve değerlendirin
    • sonucu çıktı kuyruğuna ekle
    • yığın boşalana kadar tekrarlayın
  • çıktı kuyruğundan bir öğe okuyun, yazdırın ve çıktı kuyruğu boşalana kadar tekrarlayın


1

Veri yapılarını öğretirken, genellikle müşterilerin kuyrukta beklediği ve bir dizi hizmet penceresinin bulunduğu banka kuyruğu simülasyonunun uygulamasını kullanırım.

Sorun, aşağıdakilerin istatistiklerini bulmak için süreci simüle etmektir: kuyrukta bekleyen müşteriler (maks, min, ortalama) ve kuyrukta bekleyen müşteri sayısı. Rastgele sayı üretecinden gelen değerlerle, günün her dakikasında yeni bir müşteriye ulaşma sıklığını ve hizmet penceresinde bir ortalama ortalama hizmet süresini kullanıyorum.

Sonuçta, müşteri memnuniyetini garanti altına alacak optimum servis penceresi sayısı ve bekleme salonunda optimum sayıda sandalye için öneriler olacaktır. Öğrencilere çok ilginç bir uygulama.


1

Herhangi bir zamanlama algoritması neredeyse her zaman bir kuyruk içerir.

Bu, basit bir ilk gelen ilk hizmet kuyruğundan tek bir tüketici için arabellek isteğine kadar değişebilir.

"Görevler" in öncelikleri olabileceği ve "işçilerin" farklı yeteneklere sahip olduğu karmaşık bir iş planlama kuyruğuna.

Etmek için iyi bir kullanım durumu şöyle olabilir: "Biri çift taraflı ve biri daha büyük kağıda yazdırabilen iki renkli yazıcıya sahip dört yazıcıya sahip merkezi bir yazdırma sunucunuz var. Kullanıcılar bir acele işi için fazladan ödeme yapabilir, ya da daha uzun süre beklemenin sakıncası yoksa daha az.

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.