Які хороші, прості приклади для черг? [зачинено]


9

Я викладаю CS2 ( Java and data structures), і у мене виникають труднощі зі створенням хороших прикладів, які слід використовувати під час викладання черг. Дві основні програми, для яких я їх використовую, - це multithreadedпередача повідомлень (але програмування МТ поза курсом) і BFS-style algorithms(і я не буду висвітлювати графіки до наступного терміну).

Я також хочу уникати надуманих прикладів. Більшість речей, про які я думаю, якби я насправді збирався їх вирішити однопоточним способом, я б просто скористався списком, а не чергою. Я схильний використовувати черги лише тоді, коли обробка та виявлення перемежовуються (наприклад, пошук) або в інших особливих випадках, наприклад, буфери з обмеженою довжиною (наприклад, підтримка останніх N елементів). Наскільки це практично, я намагаюся навчити своїх учнів хороших способів насправді робити речі в реальних програмах, а не лише іграшках, щоб показати особливість.

Будь-які пропозиції щодо хороших, простих алгоритмів чи застосувань черг, які я можу використовувати як приклади, але які потребують мінімум інших попередніх знань?


+1, але я б утримався від створення тегу "черга", вважаючи, що він містить лише ваше запитання. Я б використав "структури даних".
K.Steff

@ K.Steff, ви можете мати і те й інше :-) Зауважте, що будь-який новий тег асоціюється лише з одним питанням на початку.
Péter Török

1
Природно покривати черги, коли ви покриваєте BFS. Чому б до цього часу не зберегти черги? Вам не доведеться покривати Черги пов’язаними списками та списками масивів лише тому, що вони також мають лінійне представлення.
Кевін Клайн

@ PéterTörök Я розумію, що всі теги починаються порожніми, але пошук "черги" викликає 313 запитань, і жоден інший не створив тег "черги". Це все-таки IMO, все одно
K.Steff

Повторною темою у відповідях, здається, є моделювання черг у реальному світі. Поки що я думав, що я вважаю за краще використовувати приклади речей, де я використовував би чергу, щоб вирішити проблему, яка насправді виникає в програмуванні, і що багато прикладів фізичного світу найкраще світяться в одночасних умовах. Однак, зважаючи на повторення цієї теми, цілком може бути, що я не на корисному рівні мислення. Продовжуйте пропозиції! І дякую всім за велику допомогу.
Майкл Екстранд

Відповіді:


14

Коли я навчався черг, мій професор завжди використовував приклад магазину. У будь-який момент відкрито 1 або більше регістрів, і Клієнти вводять ту чи іншу чергу, і переходять через цю чергу, щоб придбати всі свої товари.

Нам фактично довелося реалізувати просту програму, яка могла б переміщати клієнтів через RegisterQueue, тому якщо ви насправді шукаєте програму, ви можете надати студентам цей приклад простий і простий, але також те, що кожен студент бачив у реальному житті і так це може допомогти їм зрозуміти концепцію краще.


Як я вже казав, цей приклад є дуже інтуїтивно зрозумілим, а також майже занадто часто використовуваним;)
marktani

1
Ви можете додати складності, встановивши чергу пріоритетів для клієнтів з перевагами (план Aero).
шістдесят футів

1
ІМО, найпростіші приклади - це ті, з якими ми стикаємося в житті. Приклад "рядок" - це чудове представлення черги, який повинен допомогти учням навчатися. Насправді, коли я думаю про черги та про те, як визначаються їхні операції, я часто думаю про приклад «рядка», щоб допомогти мені краще його переглянути.
Миколай

Це також чудова можливість коротко торкнутися теорії черги: чому один рядок, що обслуговує декілька регістрів, краще, ніж рядок на регістр. Нехай вони побудують симуляцію та пограють з нею. Інженер Хлопець має чудове, просте пояснення: engineerguy.com/videos/video-lines.htm
jpeacock

5

Коли я дізнався черги, мій вчитель представив їх мені, використовуючи лінійку для автомобілів під управлінням поліції. Там стояла черга з автомобілями ("черга на очікування"), і чоловік міліції завжди контролював наступну машину в черзі і або відправляв її своєму колезі для подальших перевірок, або дозволяв проїхати машині.

Прикладом, який дуже часто використовується, є черга в суперринку ...

Чому ви не попросите своїх учнів самі навести кілька прикладів?


+1 для прикладу супермаркету Ви згадали про це, поки я писав свою відповідь!
Майк Капуто

3

Один із прикладів, який мені спадає на думку, - це лінія по обробці гамбургерів, наприклад, у McDonalds. Тут є кілька видів різних гамбургерів, кожен може виробляти декілька різних робітників, і кожен має свою чергу. Звідти через деякий час готові гамбургери за замовленням FIFO беруть один із касирів, які замовили такий вид бургер.

Тож є кілька виробників і споживачів, і кожна черга обмежена.


Я згадую однокласників ще в коледжі, порівнюючи різні стилі домовленостей про реєстрацію фаст-фуду з процесорами дизайну. Одна черга, яку обробляють кілька регістрів? Кожен реєстр із власною чергою? Кілька працівників на одній лінії - супер скалярна обробка. Це було кумедно.

3

Я думав використати Amazon як приклад, десь у їхній масовій системі повинна бути черга замовлень, яку потрібно обробляти. з якими можна було впоратися за допомогою простого анкету та декуе. система посилається на замовлення в системі кожного разу, коли клієнт купує книгу, а особа, що зберігає сховище, видає її, щоб забрати її та опублікувати.

Тоді було б легко почати розмову про черги з пріоритетом, запровадивши головних клієнтів, які можуть стрибати з черги, ви можете ввести черги з пріоритетом.

Який підручник ви використовуєте?


Carrano - Структури даних та абстрагування Java .
Майкл Екстранд

2

Ідеальним прикладом черги може бути банк, який обробляє транзакції проти рахунку. Зазвичай в кінці дня ви побачите список "відкладених" транзакцій. Коли бухгалтерський облік ведеться, ці операції застосовуються до рахунку. Ви навіть можете потрапити в зону пріоритетних черг. Здається, більшість банків надають пріоритет на дебети при обробці нічних транзакцій, щоб вони могли занурити вас із надмірними комісійними платежами, перш ніж застосувати будь-які очікувані кредити.

Операції вставляються в чергу за черговістю часу, що виконується та вилучається, та застосовується до рахунку в бухгалтерському процесі.


2

Раніше я був програмістом телекомунікацій, тому це приходить на думку:

Гаряча лінія служби обслуговування клієнтів. Дзвінок надходить, операторів для обробки дзвінка недостатньо, і він розміщується у черзі. Наступний дзвінок надходить, і він також розміщується у черзі. Потім, коли наступний оператор стає доступним, перший дзвінок, який увійшов до черги, присвоюється доступному оператору.


2

Очевидними прикладами реального світу можуть бути такі речі, як лінії оформлення замовлення, і таке, але оскільки ви шукаєте приклад, корінний строго в обчисленнях, чи можу я запропонувати черги планування роботи ?

Я не знаю, скільки ваших учнів взяли клас Операційні системи, але гарно зробити те, що всі вони використовували диспетчер завдань для перевірки своїх процесів у той чи інший момент. Ви можете ввести спрощений приклад черги планування та призначити їм домашнє завдання, щоб написати програму, яка генерує (або приймає) "завдання" заданого розміру та обробляє їх у порядку FIFO, коли вони "запускають" його.

Це досить легка для розуміння концепція, демонструє ідею, що черга працює над її вмістом у тому порядку, який вона приймає, і дає їм (дуже рудиментарний та спрощений) вступ до планування процесора. Всього два мої шматочки.

Ви можете підняти їх застосування в багатопотоковому читанні, але, якщо б у студентів не було досвіду написання потокових програм, я б не призначав їм роботу, яка може викликати дві неприємності. Я пам’ятаю, у мене були проблеми з навчанням структур даних (особливо в Java, не закінчивши C ++ і не дізнавшись нічого про покажчики) на своєму другому курсі коледжу, тому простий, але практичний приклад, безпосередньо пов’язаний з обчисленнями, мабуть, найкращий.


1

Реальний світ:

  • Будь-який час, коли люди вишикуються: касир у продуктовому магазині, у ресторані, що чекає столу (ви можете працювати в тих буферах, які вони іноді видають за аналогію) тощо. Це корисно, коли ви помічаєте, що у Великобританії вони часто викличте ці черги замість рядків (загальне в NA)
  • Читання книжок серії ', author.publish => queue.push та student.read => queue.pop

Нереальний світ:

  • Обробка будь-яких поданих даних у однопотоковому середовищі, де обробка займає більше часу, ніж подача (наприклад, операції замовлення в інтернет-магазинах, наприклад.)
  • Будь-яка колекція FIFO, яку можна повторити, може використовувати черги та використовувати while(queue.peek)замість ітератора.

1

Мені подобається використовувати ігри як приклад, тому що це, як правило, трохи цікавіше, ніж файл IO або все, що ви можете придумати.

Тож, коли ви хочете видати кілька команд підряд підрозділу в стратегічній грі (наприклад, мати Зерглінг для того, щоб розвідати 4 кути бази для того, щоб потім самогубство потрапило в центр бази, черга була б хорошим вибором .)

Або, можливо, у вас є програма, яка може обробляти лише 30 кадрів в секунду, але ви можете отримати 4 або 5 входів між кадрами. Якщо у вас є вхід для зміни зброї та вхід для стрілянини, ви хочете переконатися, що з ними поводяться в тому порядку, в якому вони були отримані, інакше ви можете гранатувати, коли хочете ножем. І якщо ви гранатуєте, коли хочете ножем, вам буде погано. (покладіть це на меми інструктора з лижних споруд і киньте його на слайди) :)

Серверні запити для обробки - це ще одна хороша.

Машина з ЧПУ, що приймає вклад. Машина може працювати тільки так швидко, тому їй потрібно встановити чергу введення.


1

Деякі приклади, про які я можу придумати:

  • Калькулятор - може вводити префікс і постфікс одночасно
  • Інструкція зв'язати взуття. Не вдалося виконати наступну операцію, поки ви не зробили останню
  • Буфери - можливо, телефонний буфер, який використовується для зберігання номерів, які користувач ввів, але ще не видав звуковий сигнал
  • Травлення

1

На виробничих лініях повно черг. Придумайте лінію порожніх пляшок, що прямують до машини для заправки. Перш-на-перше - це природний спосіб послідовно застосовувати процес до багатьох об'єктів. Черги також використовуються для від'єднання одного процесу від іншого: автомат для заповнення не повинен зупинятися негайно, якщо є короткочасна проблема з машиною для маркування.

Черги використовуються в програмному забезпеченні приблизно однаковими способами. Вихід одного процесу може бути в черзі для введення в інший процес. Це вірно, незалежно від того, чи говориш ви про міжпроцесовий зв'язок, міжпотокове спілкування або просто розбиває складний процес на частини, які можуть бути оброблені однією ниткою.

В операційних системах часто використовуються черги для обробки входів по порядку. Файлова система може зчитувати блоки із пристрою зберігання даних, наприклад, додавати їх до черги. Або переривання, які керують такими речами, як натискання клавіш і рухи миші, створюють події, які додаються до черги подій, щоб ви не отримували "uqeeu" замість "черги" під час введення.

Для простого завдання студенту, я думаю, що будь-яке завдання, яке приймає деяку кількість входів і потім обробляє їх, спрацювало б. Наприклад, ви можете змусити їх написати простий оцінювач виразів постфікса. Вона мала б три частини:

  • прочитати вхід, додати його до черги введення та повторити, поки не буде більше входів

  • отримати елемент з черги

    • якщо елемент - це число, натисніть його на стек аргументів
    • якщо елемент є оператором, введіть необхідні аргументи та оцініть
    • додайте результат до черги виводу
    • повторюйте, поки стек не порожній
  • прочитайте елемент з черги виводу, роздрукуйте його та повторіть, поки вихідна черга не буде порожньою


1

Викладаючи структури даних, я зазвичай використовую застосування моделювання банківської черги, де клієнти чекають у черзі та існує ряд вікон обслуговування.

Проблема полягає в імітації процесу, щоб дізнатись статистику наступного: час очікування клієнтів у черзі (макс., Хв., Середній) та кількість клієнтів, які чекають у черзі. Я використовую заздалегідь задану частоту приходу нового клієнта кожну хвилину дня та середній час обслуговування клієнта у вікні обслуговування зі значеннями генератора випадкових чисел.

Результатом стануть рекомендації щодо оптимальної кількості вікон обслуговування та оптимальної кількості стільців у залі очікування, які гарантували б задоволення клієнтів. Дуже цікавий додаток для студентів.


1

Будь-який алгоритм планування майже завжди включає чергу.

Це може варіюватися від простої першої черги, що обслуговується першою, до запиту на буфер для одного споживача.

До складної черги планування завдань, де "завдання" можуть мати пріоритети, а "працівники" мають різні можливості.

Хорошим випадком використання може бути "У вас є центральний сервер друку з чотирма принтерами, прикріпленими двома кольорами, один здатний друкувати двосторонній і другий, здатним друкувати на більшому папері. Користувачі можуть доплачувати за поспішну роботу, або, менше, якщо вони не проти чекати довше. Ви можете стягнути штрафи, якщо доставляєте пізно, тому хочете якомога більше пропускної спроможності. "

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.