소프트웨어 응용 프로그램에서 스택, 큐 및 트리를 사용할 위치에 대해 잘 알고 있지만 이전에는 Deque (Double Ended Queue)를 사용한 적이 없습니다. 나는 일반적으로 야생에서 어디에서 그들을 만날 것인가? 대기열과 같은 곳에 있지만 추가적인 어려움이 있습니까?
소프트웨어 응용 프로그램에서 스택, 큐 및 트리를 사용할 위치에 대해 잘 알고 있지만 이전에는 Deque (Double Ended Queue)를 사용한 적이 없습니다. 나는 일반적으로 야생에서 어디에서 그들을 만날 것인가? 대기열과 같은 곳에 있지만 추가적인 어려움이 있습니까?
답변:
데크가 사용되는 한 가지 방법은 항목을 "연령"시키는 것입니다. 일반적으로 실행 취소 또는 히스토리 기능으로 사용됩니다. 새로운 조치가 deque에 삽입됩니다. 가장 오래된 품목이 앞에 있습니다. 데크 크기의 제한은 새 항목이 삽입 될 때 (가장 오래된 항목의 노화) 전면의 항목을 강제로 제거합니다. 그런 다음 가장 오래된 항목과 가장 최신 항목을 즉시 인식하여 O (1)에서 가장 오래된 작업을 수행하거나 O (1) 시간에 실행 취소 할 수 있기 때문에 구조의 양쪽 끝에 빠르게 액세스 할 수 있습니다.
훌륭한 질문입니다. CS-102 과정에서 이중 대기열의 단일 응용 프로그램을 언급 한 것을 기억할 수 없습니다.
현재까지 내가 아는 유일한 응용 프로그램은 Wikipedia 기사 에서 언급 한 작업 스탈링 스케줄러 입니다.
기본적으로 다음과 같이 작동합니다.
일반적인 단일 스레드 절차 모델에서 모든 함수 호출은 소위 호출 스택 에서 활성화 레코드 를 푸시합니다 . 활성화 레코드에는 해당 호출의 로컬 변수 및 매개 변수가 포함됩니다. 메소드 호출이 완료되면 ( "반환") 마지막 활성화 레코드가 호출 스택에서 팝됩니다.
이것은 재귀가 구현되는 방식이기 때문에 특히 중요합니다. 재귀의 구조는 호출 스택의 현재 상태로 표시됩니다.
재귀 알고리즘을 병렬화 할 때 호출 스택을 호출 큐로 교체하여이 속성을 활용할 수 있습니다. 계산의 모든 스레드는 자체 호출 큐를 가져오고 순차적 실행과 같이 활성화 레코드를 푸시하고 팝합니다.
그러나 스레드가 작업을 완료하면 (= 호출 큐가 비어 있음) "잘못된"끝에서 제거하여 해당 스레드의 호출 큐에서 활성화 레코드를 제거하여 다른 스레드에서 작업을 훔칩니다 .
기본적으로 콜 대기열은 이제 두 개의 스레드를 제공하는 두 개의 호출 스택 역할을합니다.