프로덕션 소프트웨어에서 일반적으로 Deque를 어디에 사용합니까?


21

소프트웨어 응용 프로그램에서 스택, 큐 및 트리를 사용할 위치에 대해 잘 알고 있지만 이전에는 Deque (Double Ended Queue)를 사용한 적이 없습니다. 나는 일반적으로 야생에서 어디에서 그들을 만날 것인가? 대기열과 같은 곳에 있지만 추가적인 어려움이 있습니까?



이 글타래에 약간의 혼동이있는 것 같습니다. 인터넷에서 "deque"는 더블 엔드 큐입니다 (wikipedia는 링크 된 목록 구현을 언급합니다). 그러나 C ++ STL에서 "std :: deque"는 데이터 블록의 배열로 구현 된 배열과 유사한 구조입니다. std :: vector와 유사한 임의 액세스를 제공하지만 데이터를 추가 할 때 블록을 추가하고 기존 데이터를 재 할당 및 이동하지 않기 때문에 크기 조정 기능이 std :: list의 기능과 비슷합니다.
DXM

1
@DXM : STL deque는 여전히 이중 엔드 큐이며 끝에서 더 빠른 작업을 제공합니다 (구현에 따라 다름). 중간에 액세스 할 수 있다고해서 기본 작업이 대기열과 비슷하지는 않습니다.
gbjbaanb

@gbjbaanb : 내가 말하는 것은 std :: vector, std :: list (또는 std :: queue) 및 std :: deque의 3 가지 클래스의 공용 인터페이스를 보면 std :: vector라는 것을 알 수 있습니다. 그리고 std :: deque는 동일한 공용 인터페이스와 동일한 기능을 가지고 있습니다 (std :: deque는 더 큰 메모리 풋 프린트를 희생하여 약간 더 유연합니다). 반면 std :: list 및 std :: queue는 각각 CS 대응 파트, 링크 된 목록 및 큐와 유사하게 동작합니다. CS deque! = std :: deque
DXM

- 나는 shiv.mymail에 의해 더 실용적이 답변 찾기 stackoverflow.com/questions/3880254/...
roottraveller

답변:


21

데크가 사용되는 한 가지 방법은 항목을 "연령"시키는 것입니다. 일반적으로 실행 취소 또는 히스토리 기능으로 사용됩니다. 새로운 조치가 deque에 삽입됩니다. 가장 오래된 품목이 앞에 있습니다. 데크 크기의 제한은 새 항목이 삽입 될 때 (가장 오래된 항목의 노화) 전면의 항목을 강제로 제거합니다. 그런 다음 가장 오래된 항목과 가장 최신 항목을 즉시 인식하여 O (1)에서 가장 오래된 작업을 수행하거나 O (1) 시간에 실행 취소 할 수 있기 때문에 구조의 양쪽 끝에 빠르게 액세스 할 수 있습니다.


나는 여기에서 deques가 사용되거나 필요하다고 생각하지 않습니다. 간단한 (크기 제한적) 스택이면 충분합니다.
Konrad Rudolph

2
@Konrad 간단한 스택으로 아이템을 어떻게 노화합니까? (즉, "너무 오래된"명령을 어떻게 제거합니까?)
Andres F.

@AndresF. 나이는 스택 크기와 무관합니까? 그렇다면이 데이터 구조에 대해 들어 본 적이 없습니다. 그렇지 않으면 단순히 deque 측면에서 구현할 수있는 고정 크기의 스택 이거나 고정 크기 스택이라는 더 간단한 데이터 구조를 가정하여 간단하게 수행 할 수 있습니다 .
Konrad Rudolph

따라서 deques 결국 유용합니다.) 고정 크기 스택에 대해 들어 본 적이 없습니다 (가장 오래된 항목을 제거한다는 의미에서). 의미가 있지만 일반적으로 "스택"이 의미하는 것은 아니며 실제로 더 단순한 지 여부는 여전히 남아 있습니다.)
Andres F.

이것은 원래 질문에 대한 의견에 게시되었습니다 : en.wikipedia.org/wiki/Double-ended_queue 그것은 단지 두 번 끝나는 대기열입니다. 위에서 설명한 방식으로 실제로 사용했습니다 (그래서 게시 한 이유입니다). 진정한 스택에서는 푸시, 팝, 탑 및 엿보기 만해야합니다 (다른 의견도 있지만, 일반적으로 가능합니다). 스택의 맨 아래에있는 내용이나 맨 아래에 액세스하는 방법에 대한 지식이 없어야합니다. "고정 된 크기의 스택"에서는 오래된 항목을 채울 때 노화되지 않고 스택 오버플로를 생성합니다.
jmq

1

훌륭한 질문입니다. CS-102 과정에서 이중 대기열의 단일 응용 프로그램을 언급 한 것을 기억할 수 없습니다.

현재까지 내가 아는 유일한 응용 프로그램은 Wikipedia 기사 에서 언급 한 작업 스탈링 스케줄러 입니다.

기본적으로 다음과 같이 작동합니다.

일반적인 단일 스레드 절차 모델에서 모든 함수 호출은 소위 호출 스택 에서 활성화 레코드 를 푸시합니다 . 활성화 레코드에는 해당 호출의 로컬 변수 및 매개 변수가 포함됩니다. 메소드 호출이 완료되면 ( "반환") 마지막 활성화 레코드가 호출 스택에서 팝됩니다.

이것은 재귀가 구현되는 방식이기 때문에 특히 중요합니다. 재귀의 구조는 호출 스택의 현재 상태로 표시됩니다.

재귀 알고리즘을 병렬화 할 때 호출 스택을 호출 큐로 교체하여이 속성을 활용할 수 있습니다. 계산의 모든 스레드는 자체 호출 큐를 가져오고 순차적 실행과 같이 활성화 레코드를 푸시하고 팝합니다.

그러나 스레드가 작업을 완료하면 (= 호출 큐가 비어 있음) "잘못된"끝에서 제거하여 해당 스레드의 호출 큐에서 활성화 레코드를 제거하여 다른 스레드에서 작업을 훔칩니다 .

기본적으로 콜 대기열은 이제 두 개의 스레드를 제공하는 두 개의 호출 스택 역할을합니다.


이것에 대한 소스가 있습니까? 흥미로운 것 같습니다.
kyjelly90210

1
@ Richard1987 Wikipedia 기사는 원본 논문을 인용합니다. 예를 들어 GNU c ++ stdlib 병렬 확장 작업 스털링 구현 (코드를 읽는 것이 끔찍합니다) 또는 실제로 일반화 된 분할 및 정복병렬 구현과 같은 몇 가지 구현이 있습니다 (그러나 후자는 매우 관용적 인 프로그래밍 스타일을 사용합니다)
Konrad Rudolph
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.