대기열에 대한 좋고 간단한 예제는 무엇입니까? [닫은]


9

내가 가르치고 CS2를 ( Java and data structures), 및 대기열을 가르 칠 때 사용하는 좋은 예와 함께 오는 몇 가지 어려움을 겪고 있어요. 내가 사용하는 두 가지 주요 응용 프로그램은 multithreaded메시지 전달 (MT 프로그래밍은 물론 범위를 벗어남)이며 BFS-style algorithms(나중에 그래프를 다루지 않을 것입니다).

또한 고려 된 예를 피하고 싶습니다. 내가 생각하는 대부분의 것, 실제로 단일 스레드 방식으로 해결하려는 경우 대기열 대신 목록을 사용합니다. 처리 및 검색이 인터리브 (예 : 검색)되거나 길이 제한 버퍼 (예 : 마지막 N 항목 유지)와 같은 다른 특수한 경우에만 큐를 사용하는 경향이 있습니다 . 실용적으로, 나는 학생들에게 특징을 보여주는 장난감뿐만 아니라 실제 프로그램에서 실제로 일을하는 좋은 방법을 가르치려고 노력하고 있습니다.

모범으로 사용할 수 있지만 최소한의 다른 사전 지식이 필요한 대기열의 훌륭하고 간단한 알고리즘 또는 응용 프로그램에 대한 제안이 있습니까?


+1이지만 'queue'태그를 만드는 것은 삼가겠습니다. 여기에는 귀하의 질문 만 포함됩니다. '데이터 구조'를 사용했을 것입니다.
K.Steff 2016 년

@ K.Steff, 둘 다 가질 수 있습니다 :-) 새 태그는 처음에 하나의 질문에만 연결됩니다.
Péter Török 2016 년

1
BFS를 커버 할 때 큐를 커버하는 것이 당연합니다. 그때까지 대기열을 저장하지 않는 이유는 무엇입니까? 링크 된 목록 및 배열 목록이있는 대기열도 선형으로 표시되므로 다루지 않아도됩니다.
케빈 클라인

@ PeterTörök 모든 태그가 비어 있기 시작하지만 'queue'검색시 313 개의 질문이 생성되고 'queue'태그를 생성 한 사람은 없습니다. 어쨌든 이것은 단지 IMO입니다
K.Steff

답변에서 되풀이되는 주제는 실제 대기열의 시뮬레이션 인 것 같습니다. 지금까지 나는 프로그래밍에서 실제로 발생하는 문제를 해결하기 위해 대기열을 사용하는 것의 예를 선호하고 많은 실제 세계의 예가 동시 환경에서 가장 잘 빛나고 있다고 생각했습니다. 그러나이 주제가 반복 될 때, 나는 유용한 사고 방식에 있지 않을 수 있습니다. 제안을 계속하십시오! 큰 도움을 주셔서 감사합니다.
Michael Ekstrand

답변:


14

내가 줄을 배우고있을 때, 교수님은 항상 가게의 예를 사용했습니다. 주어진 시간에 하나 이상의 레지스터가 열려 있고 고객은 하나 이상의 대기열에 들어가서 해당 대기열을 통해 이동하여 모든 품목을 구매합니다.

우리는 실제로 RegisterQueue를 통해 고객을 이동할 수있는 간단한 프로그램을 구현해야했기 때문에 실제로 프로그램을 찾고 있다면 학생들에게이 예제를 간단하고 간단하게 제공 할 수있을뿐만 아니라 모든 학생이 실제 생활에서 본 것과 같은 것을 보여줄 수 있습니다. 개념을 더 잘 이해하는 데 도움이 될 수 있습니다.


내가 말했듯이,이 예제는 매우 직관적이며 거의 너무 자주 사용됩니다;)
marktani

1
특전이있는 고객을위한 우선 순위 대기열을 통해 복잡성을 추가 할 수 있습니다 (항공 계획).
sixtyfootersdude

1
IMO, 가장 쉬운 예는 우리가 인생에서 만나는 것입니다. '라인'예제는 대기열을 잘 표현한 것으로 학생들이 배우는 데 도움이됩니다. 실제로 대기열과 해당 작업이 어떻게 정의되는지 생각할 때 종종 'line'예제를 생각하여 더 잘 시각화 할 수 있습니다.
Nicholas

또한 큐 이론을 간단히 다룰 수있는 좋은 기회입니다. 여러 레지스터를 제공하는 단일 라인이 레지스터 당 라인보다 나은 이유는 무엇입니까? 학생들이 시뮬레이션을 구축하고 함께 놀게하십시오. 엔지니어 가이는 훌륭하고 간단한 설명을 가지고 있습니다. engineerguy.com/videos/video-lines.htm
jpeacock

5

내가 줄을 배웠을 때 선생님은 경찰 통제에서 자동차 라인업을 사용하여 나에게 소개했습니다. 차를 담는 줄이 있었고 ( "대기열") 경찰은 항상 줄에있는 다음 차를 통제하고 추가 검사를 위해 동료에게 보내거나 차를 통과시킵니다.

매우 자주 사용되는 예는 슈퍼마켓의 대기열입니다 ...

왜 학생들에게 스스로 예제를달라고 요청하지 않습니까?


슈퍼마켓 예의 경우 +1 내가 답을 쓰는 동안 당신은 그것을 언급했습니다!
Mike Caputo

3

제 생각에는 맥도날드와 같은 햄버거 가공 라인이 있습니다. 그들은 여러 종류의 다른 버거이며, 각각 다른 여러 노동자가 생산할 수 있으며 각각 자체 대기열이 있습니다. 거기에서 얼마 후, 준비된 버거는 FIFO 순서대로 그런 종류의 버거를 주문한 계산원 중 한 명이 가져옵니다.

따라서 여러 생산자와 소비자가 있으며 각 대기열이 제한됩니다.


나는 다른 스타일의 패스트 푸드 레지스터 배열을 프로세서 디자인과 비교하여 대학에서 반 친구들을 회상합니다. 하나의 큐가 여러 레지스터에 의해 처리됩니까? 자체 대기열이있는 각 레지스터? 같은 줄에 여러 노동자-슈퍼 스칼라 처리. 재미있었습니다.

3

아마존을 예로 들어 대규모 시스템 어딘가에서 처리해야 할 주문 대기열이 있어야한다고 생각했습니다. 간단한 대기열과 대기열에서 처리 할 수 ​​있습니다. 시스템은 고객이 책을 구입할 때마다 시스템에서 주문을 대기열에 넣은 다음 보관소 담당자가 해당 책을 선택하여 게시하기 위해 대기열에서 대기합니다.

그러면 우선 고객을 소개하여 우선 순위 대기열에 대해 쉽게 이야기 할 수 있습니다.

어떤 교과서를 사용하고 있습니까?


Carrano — Java를 이용한 데이터 구조 및 추상화 .
Michael Ekstrand

2

대기열의 완벽한 예는 은행이 계좌에 대한 거래를 처리하는 것입니다. 일반적으로 하루가 끝나면 "보류중인"거래 목록이 표시됩니다. 회계가 완료되면 해당 거래가 계정에 적용됩니다. 이것으로 우선 순위 대기열 영역에 들어갈 수도 있습니다. 대부분의 은행은 야간 거래를 처리 할 때 차변에 우선 순위를 두므로 보류중인 크레딧을 적용하기 전에 초안을 초과하여 수수료를 지불 할 수 있습니다.

트랜잭션은 실행 및 대기 시간 순서대로 대기열에 삽입되고 계정 프로세스에 의해 계정에 적용됩니다.


2

나는 텔레콤 프로그래머 였기 때문에 이것이 생각났다.

고객 서비스 핫라인. 전화가 걸려 오면 전화를 처리 할 수있는 운영자가 충분하지 않고 대기열에 배치됩니다. 다음 전화가 오면 대기열에도 들어갑니다. 그런 다음 다음 교환 원이 사용 가능 해지면 대기열에 들어간 첫 번째 통화가 사용 가능한 교환 원에게 할당됩니다.


2

명백한 실제 예제는 체크 아웃 라인과 같은 것이지만 컴퓨팅에 뿌리를 둔 예제를 찾고 있기 때문에 작업 일정 대기열을 제안 할 수 있습니까?

몇 명의 학생이 운영 체제 수업을 수강했는지는 잘 모르지만 모든 학생이 작업 관리자 를 사용하여 일정 시점에서 프로세스를 확인한 것이 좋습니다. 예약 대기열의 간단한 예를 소개하고 주어진 크기의 "작업"을 생성 (또는 수락)하고 "시작"할 때 FIFO 순서로 처리하는 프로그램을 작성하기 위해 숙제를 할당 할 수 있습니다.

이해하기는 상당히 쉬운 개념이며, 대기열이 내용을 수용하는 순서대로 내용에서 작동한다는 아이디어를 보여주고 CPU 스케줄링에 대해 (초보적이고 단순하게) 소개합니다. 그냥 내 두 비트.

멀티 스레딩에서 응용 프로그램을 가져올 수는 있지만 학생들이 스레드 프로그램을 작성 한 경험이 없으면 두 가지 좌절감을 줄 수있는 작업을 할당하지 않을 것입니다. 대학 2 학년 때 데이터 구조 (특히 Java, C ++을 수행하지 않고 포인터에 대해 배우지 않은)를 배우는 데 어려움이 있었으므로 컴퓨팅과 직접 관련된 단순하지만 실용적인 예제가 가장 좋습니다.


1

현실 세계:

  • 사람들이 줄을 서면 언제든지 : 식료품 점에서 계산대, 테이블을 기다리는 식당에서 (때때로 비유로 알려주는 신호음에서 일할 수 있음), 영국에서는 종종 회선 대신이 대기열을 호출합니다 (NA에서 일반적 임).
  • 책 시리즈 읽기 ', author.publish => queue.push 및 student.read => queue.pop

비 실제 세계 :

  • 제출하는 것보다 처리 시간이 오래 걸리는 단일 스레드 환경에서 제출 된 데이터 처리 (예 : 온라인 상점의 체크 아웃 조작)
  • 반복 될 수있는 모든 FIFO 콜렉션은 큐를 사용 while(queue.peek)하고 반복자 대신 사용할 수 있습니다 .

1

나는 게임을 예로 사용하고 싶습니다. 파일 IO 또는 다른 어떤 것보다 일반적으로 조금 더 흥미 롭기 때문입니다.

따라서 전략 게임에서 한 유닛에 여러 명령을 연속으로 발행하려면 (예를 들어 저글링을 사용하여 기지의 4 모서리를 정찰 한 다음 기지의 중앙으로 자살하도록하십시오. 대기열이 좋은 선택입니다. .)

또는 초당 30 프레임 만 처리 할 수있는 응용 프로그램이 있지만 프레임간에 4 또는 5 개의 입력을 얻을 수 있습니다. 무기 교체 입력과 발사 입력이 있다면, 그것들이받은 순서대로 처리되도록해야합니다. 칼을 바르고 싶을 때 수류탄을 먹으면 나쁜 시간을 보낼 것입니다. (스키 강사 meme에 넣고 슬라이드에 넣으십시오) :)

요청을 처리하는 서버는 또 다른 좋은 것입니다.

입력을받는 CNC 기계. 기계는 너무 빨리 갈 수 있으므로 입력 대기해야합니다.


1

내가 생각할 수있는 몇 가지 예 :

  • 계산기-접두사와 접미사를 동시에 도입 할 수 있습니다
  • 신발을 묶는 방법. 마지막 작업을 완료 할 때까지 다음 작업을 완료 할 수 없습니다
  • 버퍼-아마도 사용자가 입력했지만 톤 소리를 내지 않은 번호를 저장하는 데 사용되는 전화 버퍼
  • 소화

1

제조 라인은 대기열로 가득합니다. 충전 기계로 향하는 빈 병 라인을 생각하십시오. 선입 선출은 프로세스를 여러 객체에 순차적으로 적용하는 자연스러운 방법입니다. 대기열은 또한 한 프로세스를 다른 프로세스와 분리하는 데 사용됩니다. 라벨링 기계에 단기적인 문제가있는 경우 충전 기계를 즉시 중지 할 필요가 없습니다.

큐는 소프트웨어에서 거의 같은 방식으로 사용됩니다. 한 프로세스의 출력은 다른 프로세스로의 입력을 위해 대기 할 수 있습니다. 프로세스 간 통신, 스레드 간 통신에 대해 이야기하거나 복잡한 프로세스를 모두 동일한 스레드가 처리 할 수있는 부분으로 나누는 경우에도 마찬가지입니다.

운영 체제에서 대기열은 종종 입력을 순서대로 처리하는 데 사용됩니다. 파일 시스템은 예를 들어 저장 장치에서 블록을 읽고이를 대기열에 추가 할 수 있습니다. 또는 키 누름 및 마우스 이동과 같은 작업을 처리하는 인터럽트는 입력 할 때 "대기열"대신 "uqeeu"를 얻지 않도록 이벤트 대기열에 추가되는 이벤트를 만듭니다.

간단한 학생 배정을 위해, 나는 몇 가지 입력을 받아 들여서 처리하는 작업이 효과가 있다고 생각합니다. 예를 들어, 간단한 접미사 표현식 평가기를 작성하도록 할 수 있습니다. 세 부분으로 구성됩니다.

  • 입력을 읽고 입력 큐에 추가 한 후 더 이상 입력이 없을 때까지 반복하십시오.

  • 대기열에서 물건을 얻다

    • 항목이 숫자이면 인수 스택으로 밀어 넣습니다.
    • 항목이 연산자 인 경우 필요한 인수를 표시하고 평가하십시오.
    • 결과를 출력 큐에 추가
    • 스택이 비워 질 때까지 반복
  • 출력 대기열에서 항목을 읽고 인쇄 한 후 출력 대기열이 비워 질 때까지 반복


1

데이터 구조를 교육 할 때 고객이 대기열에서 대기하고 여러 서비스 창이있는 은행 대기열 시뮬레이션의 응용 프로그램을 사용합니다.

문제는 대기열에서 고객 대기 시간 (최대, 최소, 평균) 및 대기열에서 대기중인 고객 수에 대한 통계를 찾기 위해 프로세스를 시뮬레이션하는 것입니다. 나는 1 분마다 새로운 고객에게 도착하는 미리 정의 된 빈도와 고객의 평균 서비스 시간을 난수 생성기의 값과 함께 서비스 창에 사용합니다.

그 결과 고객 만족을 보장하는 최적의 서비스 창 수와 대기 홀의 최적 의자 수에 대한 권장 사항이 제공됩니다. 학생들에게 매우 흥미로운 응용 프로그램입니다.


1

모든 스케줄링 알고리즘은 거의 항상 큐를 포함합니다.

이는 단순한 선착순 큐부터 단일 소비자에 대한 버퍼 요청까지 다양합니다.

"태스크"에 우선 순위가있을 수 있고 "작업자"에 다른 기능이있는 복잡한 작업 스케줄링 큐

좋은 유스 케이스는 "색상 2 개, 양면 인쇄 1 개, 큰 용지에 인쇄 할 수있는 4 개의 프린터가있는 중앙 인쇄 서버가있는 것입니다. 더 이상 기다리지 않아도된다면 더 적습니다. 늦게 배송 할 경우 벌금이 부과되어 최대한 많은 처리량을 원합니다. "

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.