Quali sono alcuni esempi validi e semplici per le code? [chiuso]


9

Sto insegnando CS2 ( Java and data structures), e ho qualche difficoltà a trovare buoni esempi da usare per insegnare le code. Le due principali applicazioni per cui le utilizzo sono il multithreadedpassaggio di messaggi (ma la programmazione MT non rientra nell'ambito del corso) e BFS-style algorithms(e non tratterò i grafici fino a più avanti nel termine).

Voglio anche evitare esempi inventati. La maggior parte delle cose a cui penso, se davvero volessi risolverli in un modo a thread singolo, userei solo un elenco piuttosto che una coda. Tendo a utilizzare le code solo quando l'elaborazione e il rilevamento sono interlacciati (ad es. Ricerca), o in altri casi speciali come buffer a lunghezza limitata (ad es. Mantenimento degli ultimi N articoli). Nella misura del possibile, sto cercando di insegnare ai miei studenti buoni modi per fare effettivamente le cose in programmi reali, non solo giocattoli per mostrare una caratteristica.

Qualche suggerimento su algoritmi buoni e semplici o applicazioni di code che posso usare come esempi ma che richiedono un minimo di altre conoscenze precedenti?


+1, ma mi asterrei dalla creazione del tag "coda", considerando che contiene solo la tua domanda. Avrei usato 'strutture dati'.
K.Steff,

@ K.Steff, puoi avere entrambi :-) Nota che ogni nuovo tag è associato a una sola domanda all'inizio.
Péter Török,

1
È naturale coprire le code quando si copre BFS. Perché non salvare le code fino ad allora? Non è necessario coprire le code con elenchi collegati e elenchi di array solo perché hanno anche una rappresentazione lineare.
Kevin Cline,

@ PéterTörök Mi rendo conto che tutti i tag iniziano vuoti, ma una ricerca "in coda" produce 313 domande e nessun altro ha creato il tag "in coda". Questo è solo IMO, comunque
K.Steff,

Un tema ricorrente nelle risposte sembra essere la simulazione di code del mondo reale. Finora ho pensato che avrei preferito usare esempi di cose in cui avrei usato una coda per risolvere un problema che si presenta in realtà nella programmazione e che molti esempi del mondo fisico brillano meglio in ambienti concorrenti. Tuttavia, data la ripetizione di questo tema, potrebbe anche essere che io non sia su una linea di pensiero utile. Mantieni i suggerimenti in arrivo! E grazie a tutti per il vostro grande aiuto.
Michael Ekstrand,

Risposte:


14

Quando studiavo le code, il mio professore usava sempre l'esempio di un negozio. Ci sono 1 o più registri aperti in qualsiasi momento e i Clienti entrano in una coda o in un'altra e si spostano attraverso quella coda per acquistare tutti i loro articoli.

In realtà abbiamo dovuto implementare un programma semplice che potesse spostare i clienti attraverso un RegisterQueue, quindi se stai effettivamente cercando un programma puoi dare agli studenti questo esempio semplice e diretto, ma anche qualcosa che ogni studente ha visto nella vita reale e così può aiutarli a capire meglio il concetto.


Come ho detto, questo esempio è sia molto intuitivo che anche quasi troppo spesso usato;)
marktani

1
È possibile aggiungere complessità avendo una coda prioritaria per i clienti con vantaggi (piano Aero).
sixtyfootersdude,

1
IMO, gli esempi più semplici sono quelli che incontriamo nella vita. Un esempio di "linea" è un'ottima rappresentazione di una coda e dovrebbe aiutare i tuoi studenti ad imparare. In effetti, quando penso alle code e al modo in cui sono definite le loro operazioni, penso spesso all'esempio 'line' per aiutarmi a visualizzarlo meglio.
Nicholas,

Questa è anche una grande opportunità per toccare brevemente la teoria delle code: perché una singola riga che serve più registri è migliore di una riga per registro. Lascia che costruiscano una simulazione e ci giochino. The Engineer Guy ha una grande, semplice spiegazione: engineerguy.com/videos/video-lines.htm
jpeacock,

5

Quando ho appreso le code, il mio insegnante me le ha presentate usando una fila di macchine sotto il controllo della polizia. C'era una fila che conteneva le macchine ("coda di attesa") e l'uomo della polizia controllava sempre la macchina successiva in coda e la inviava al suo collega per ulteriori ispezioni o lasciava passare la macchina.

Un esempio molto spesso usato è la coda nel super-mercato ...

Perché non chiedi ai tuoi studenti di dare loro stessi degli esempi?


+1 per esempio del supermercato. Ne hai parlato mentre stavo scrivendo la mia risposta!
Mike Caputo,

3

Un esempio che mi viene in mente è una linea di trasformazione di hamburger, ad esempio McDonalds. Esistono diversi tipi di hamburger diversi, ognuno può essere prodotto da più lavoratori diversi e ognuno ha una propria coda. Da lì, dopo un po 'gli hamburger pronti vengono presi, in ordine FIFO, da uno dei cassieri che hanno ordinato quel tipo di hamburger.

Quindi ci sono più produttori e consumatori e ogni coda è limitata.


Ricordo i compagni di classe al college confrontando i diversi stili di arrangiamento del fast food con i progetti dei processori. Una coda gestita da più registri? Ogni registro con la propria coda? Più lavoratori sulla stessa linea: elaborazione super scalare. È stato divertente.

3

Ho pensato di usare Amazon come esempio, da qualche parte nel loro enorme sistema ci deve essere una coda di ordini che devono essere gestiti. che potrebbe essere gestito da un semplice accodamento e dequeue. il sistema accodava un ordine nel sistema ogni volta che un cliente acquistava un libro e un addetto allo stoccaggio lo rimuoveva per selezionarlo e pubblicarlo.

Sarebbe quindi facile iniziare a parlare di code prioritarie, introducendo i clienti principali, che potrebbero saltare la coda, è possibile introdurre code prioritarie.

Quale libro di testo stai usando?


Carrano - Strutture di dati e astrazione con Java .
Michael Ekstrand,

2

Un esempio perfetto di una coda sarebbe una banca che elabora le transazioni su un conto. Di solito vedrai un elenco di transazioni "in sospeso" alla fine della giornata. Al termine della contabilità, tali transazioni vengono applicate al conto. In questo modo potresti persino entrare nell'area delle code prioritarie. Sembra che la maggior parte delle banche ponga la priorità sui debiti durante l'elaborazione delle transazioni notturne, in modo che possano darti commissioni eccessive prima di applicare eventuali crediti in sospeso.

Le transazioni vengono inserite nella coda in base all'ordine di tempo eseguito e cancellate e applicate al conto dal processo contabile.


2

Ero un programmatore di telecomunicazioni, quindi questo mi viene in mente:

Una hotline del servizio clienti. Arriva una chiamata, non ci sono abbastanza operatori per gestire la chiamata e viene inserita in una coda. La chiamata successiva arriva e viene anche inserita nella coda. Quindi, quando l'operatore successivo diventa disponibile, la prima chiamata inserita nella coda viene assegnata all'operatore disponibile.


2

Gli ovvi esempi del mondo reale sarebbero cose come le righe di pagamento, e simili, ma poiché stai cercando un esempio radicato rigorosamente nell'informatica, potrei suggerire le code di pianificazione del lavoro ?

Non so quanti dei tuoi studenti abbiano seguito un corso di Sistemi operativi, ma è una buona scommessa che tutti abbiano usato il Task Manager per verificare i loro processi in un punto o nell'altro. È possibile introdurre un esempio semplificato di una coda di pianificazione e assegnare loro alcuni compiti per scrivere un programma che genera (o accetta) un "compito" di una determinata dimensione e li elabora in ordine FIFO quando lo "avviano".

È un concetto abbastanza facile da capire, dimostra l'idea che la coda operi sui suoi contenuti nell'ordine in cui li accetta e offre loro un'introduzione (molto rudimentale e semplificata) alla programmazione della CPU. Solo i miei due bit.

Potresti presentare la loro applicazione nel multithreading, ma a meno che gli studenti non abbiano già avuto esperienza nella scrittura di programmi threaded, non assegnerei loro un lavoro che potrebbe essere frustrante. Ricordo di aver avuto problemi nell'apprendimento delle strutture di dati (specialmente in Java, non avendo fatto C ++ e non aver imparato nulla sui puntatori) nel mio secondo anno di college, quindi un esempio semplice ma pratico direttamente correlato all'elaborazione è probabilmente il migliore.


1

Mondo reale:

  • Ogni volta che le persone si mettono in fila: cassiere al negozio di alimentari, al ristorante in attesa di un tavolo (puoi lavorare in quei segnali acustici che a volte emettono nell'analogia), ecc. È utile quando noti che nel Regno Unito spesso chiama queste code anziché le linee (comune in NA)
  • Lettura di serie di libri ", author.publish => queue.push e student.read => queue.pop

Mondo non reale:

  • Elaborazione di tutti i dati inviati in un ambiente a thread singolo in cui l'elaborazione richiede più tempo dell'invio (operazioni di checkout per negozi online, ad es.)
  • Qualsiasi raccolta FIFO che può essere ripetuta può utilizzare le code e utilizzare al while(queue.peek)posto di un iteratore.

1

Mi piace usare i giochi come esempio perché in genere è un po 'più eccitante del file IO o di qualsiasi altra cosa tu possa inventare.

Quindi, quando si desidera inviare più comandi di seguito a un'unità in un gioco di strategia (ad es. Avere uno Zergling per scovare 4 angoli di una base in ordine, quindi suicidarsi al centro della base, una coda sarebbe una buona scelta .)

O forse hai un'applicazione in grado di elaborare solo 30 frame al secondo, ma potresti ottenere 4 o 5 input tra i frame. Se si dispone di un input di modifica dell'arma e di un input di tiro, si desidera assicurarsi che vengano gestiti nell'ordine in cui sono stati ricevuti, altrimenti si potrebbe granare quando si desidera tagliare. E se granate quando volete coltellare, vi divertirete. (mettilo sul meme del maestro di sci e gettalo nelle diapositive) :)

Un server che gestisce le richieste è un altro valido.

Una macchina CNC che riceve input. La macchina può solo andare così veloce, quindi deve mettere in coda l'input.


1

Alcuni esempi a cui riesco a pensare:

  • Calcolatrice: consente di introdurre prefisso e postfisso contemporaneamente
  • Istruzioni per allacciare le scarpe. Impossibile completare l'operazione successiva fino a quando non è stata eseguita l'ultima
  • Buffer - Forse un buffer telefonico utilizzato per memorizzare i numeri immessi dall'utente ma che non hanno ancora emesso il tono
  • Digestione

1

Le linee di produzione sono piene di code. Pensa a una linea di bottiglie vuote dirette verso una riempitrice. First-in-first-out è un modo naturale per applicare un processo in sequenza a molti oggetti. Le code vengono anche utilizzate per disaccoppiare un processo da un altro: la riempitrice non deve fermarsi immediatamente se c'è un problema a breve termine con l'etichettatrice.

Le code sono utilizzate nel software in modo analogo. L'output di un processo può essere messo in coda per l'input a un altro processo. Questo è vero sia che si tratti di comunicazione tra processi, comunicazione tra thread o semplicemente di suddividere un processo complicato in parti che potrebbero essere tutte gestite dallo stesso thread.

Nei sistemi operativi, le code vengono spesso utilizzate per elaborare gli input in ordine. Il file system potrebbe leggere blocchi da un dispositivo di archiviazione e aggiungerli ad una coda, ad esempio. O interruzioni che gestiscono cose come la pressione dei tasti e i movimenti del mouse creano eventi che vengono aggiunti a una coda di eventi in modo da non ottenere "uqeeu" invece di "coda" durante la digitazione.

Per un semplice compito da studente, penso che qualsiasi compito che accetti un certo numero di input e poi li elabori funzioni. Ad esempio, potresti farli scrivere un semplice valutatore di espressioni postfix. Avrebbe tre parti:

  • leggi un input, aggiungilo alla coda di input e ripeti fino a quando non ci sono più input

  • ottenere un oggetto dalla coda

    • se l'elemento è un numero, inseriscilo nello stack degli argomenti
    • se l'elemento è un operatore, fai apparire gli argomenti necessari e valuta
    • aggiungi il risultato alla coda di emissione
    • ripetere fino a quando la pila è vuota
  • leggi un elemento dalla coda di emissione, stampalo e ripeti fino a quando la coda di emissione è vuota


1

Nell'insegnamento delle strutture di dati, di solito utilizzo l'applicazione della simulazione della coda bancaria in cui i clienti attendono in coda e ci sono diverse finestre di servizio.

Il problema è simulare il processo al fine di scoprire le statistiche seguenti: tempo di attesa dei clienti nella coda (max, min, media) e numero di clienti che attendono nella coda. Uso una frequenza predefinita di arrivo di un nuovo cliente ogni minuto di un giorno e un tempo medio di servizio di un cliente nella finestra di servizio con i valori del generatore di numeri casuali.

Il risultato saranno raccomandazioni per il numero ottimale di finestre di servizio e il numero ottimale di sedie nella sala d'attesa che garantirebbero la soddisfazione del cliente. Applicazione molto interessante per gli studenti.


1

Qualsiasi algoritmo di pianificazione comporta quasi sempre una coda.

Questo può variare da una semplice prima arrivata, prima servita, alla richiesta di buffer per un singolo consumatore.

A una complessa coda di pianificazione dei lavori in cui "attività" possono avere priorità e "lavoratori" hanno capacità diverse.

Un buon caso d'uso con cui giocare potrebbe essere "Hai un server di stampa centrale con quattro stampanti collegate due in grado di colorare, una in grado di stampare fronte-retro e una in grado di stampare su carta più grande. Gli utenti possono pagare un extra per un lavoro urgente, o, meno, se a loro non dispiace aspettare più a lungo. Puoi incorrere in penalità se effettui consegne in ritardo, quindi desideri il massimo rendimento possibile ".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.