이번 글에서는 더블 엔드 큐(Double-ended Queue) 또는 데크(Deque)에 대해 설명하겠습니다. 먼저 대기열에 대한 간략한 설명을 살펴보겠습니다.
대기열이란 무엇입니까?
큐는 먼저 들어오는 것이 먼저 나가는 데이터 구조이며 FIFO(선입선출) 정책을 따릅니다. 대기열에의 삽입은 다음과 같은 한쪽 끝에서 수행됩니다. 후방 아니면 그 꼬리, 삭제는 다음과 같은 다른 끝에서 수행됩니다. 프런트 엔드 아니면 그 머리 대기열의.
DFS 대 BFS
대기열의 실제 예는 영화관 외부의 티켓 대기열로, 대기열에 먼저 입장한 사람이 먼저 티켓을 받고, 대기열에 마지막으로 입장한 사람이 마지막에 티켓을 받습니다.
Deque(또는 이중 종료 큐)란 무엇입니까?
데크는 Double Ended Queue의 약자입니다. Deque는 삽입과 삭제 작업이 양쪽 끝에서 수행되는 선형 데이터 구조입니다. deque는 큐의 일반화된 버전이라고 말할 수 있습니다.
Deque의 삽입과 삭제는 양쪽 끝에서 수행될 수 있지만 FIFO 규칙을 따르지 않습니다. 데크의 표현은 다음과 같습니다.
데크의 종류
데크에는 두 가지 유형이 있습니다.
- 입력 제한 대기열
- 출력 제한 큐
입력 제한 대기열
입력 제한 큐에서는 삽입 작업은 한쪽 끝에서만 수행할 수 있고 삭제 작업은 양쪽 끝에서 수행할 수 있습니다.
출력 제한 대기열
출력 제한 큐에서는 삭제 작업은 한쪽 끝에서만 수행할 수 있고 삽입 작업은 양쪽 끝에서 수행할 수 있습니다.
deque에서 수행되는 작업
deque에 적용할 수 있는 작업은 다음과 같습니다.
- 전면에 삽입
- 후면에 삽입
- 전면 삭제
- 후면 삭제
위에 나열된 작업과 함께 deque에서 peek 작업을 수행할 수도 있습니다. peek 연산을 통해 데크의 앞부분과 뒷부분 요소를 얻을 수 있습니다. 따라서 위의 작업 외에도 deque에서는 다음 작업도 지원됩니다.
SQL의 다른 테이블에서 열을 선택하는 방법
- 데크에서 앞부분 항목 가져오기
- deque에서 뒤쪽 항목을 가져옵니다.
- 데크가 꽉 찼는지 확인하세요.
- 데크가 비어 있는지 확인합니다.
이제 예제를 통해 deque에서 수행되는 작업을 이해해 보겠습니다.
프런트 엔드에 삽입
이 작업에서는 요소가 대기열의 프런트 엔드에서 삽입됩니다. 작업을 구현하기 전에 먼저 대기열이 꽉 찼는지 확인해야 합니다. 대기열이 가득 차지 않은 경우 아래 조건을 사용하여 프런트 엔드에서 요소를 삽입할 수 있습니다.
- 큐가 비어 있으면 후면과 전면이 모두 0으로 초기화됩니다. 이제 둘 다 첫 번째 요소를 가리킵니다.
- 그렇지 않은 경우 앞부분이 1(앞쪽)보다 작은 경우 앞부분의 위치를 확인합니다.<1), then reinitialize it by front = n - 1 , 즉 배열의 마지막 인덱스입니다.1),>
뒤쪽 끝에 삽입
자바 메소드 오버라이딩
이 작업에서는 요소가 대기열의 뒤쪽 끝에서 삽입됩니다. 작업을 구현하기 전에 먼저 대기열이 꽉 찼는지 다시 확인해야 합니다. 대기열이 가득 차지 않은 경우 아래 조건을 사용하여 요소를 뒤쪽 끝에서 삽입할 수 있습니다.
- 큐가 비어 있으면 후면과 전면이 모두 0으로 초기화됩니다. 이제 둘 다 첫 번째 요소를 가리킵니다.
- 그렇지 않으면 후면을 1씩 증가시킵니다. 후면이 마지막 인덱스(또는 크기 - 1)인 경우 1씩 늘리는 대신 0과 동일하게 만들어야 합니다.
프런트 엔드에서 삭제
이 작업에서는 대기열의 프런트 엔드에서 요소가 삭제됩니다. 작업을 구현하기 전에 먼저 대기열이 비어 있는지 확인해야 합니다.
큐가 비어 있으면(즉, front = -1) 언더플로우 조건이므로 삭제를 수행할 수 없습니다. 대기열이 가득 차지 않은 경우 아래 조건을 사용하여 프런트 엔드에서 요소를 삽입할 수 있습니다.
deque에 요소가 하나만 있는 경우 Rear = -1 및 front = -1을 설정합니다.
그렇지 않고 앞부분이 끝에 있는 경우(앞쪽 = 크기 - 1을 의미) 앞부분 = 0으로 설정합니다.
그렇지 않으면 앞면을 1만큼 증가시킵니다(즉, 앞면 = 앞면 + 1).
뒷부분 삭제
이 작업에서는 대기열의 뒤쪽 끝에서 요소가 삭제됩니다. 작업을 구현하기 전에 먼저 대기열이 비어 있는지 확인해야 합니다.
큐가 비어 있으면(즉, front = -1) 언더플로우 조건이므로 삭제를 수행할 수 없습니다.
자바 대체 문자열
deque에 요소가 하나만 있는 경우 Rear = -1 및 front = -1을 설정합니다.
Rear = 0(뒤가 앞에 있음)이면 Rear = n - 1로 설정합니다.
그렇지 않으면 후면을 1만큼 감소시킵니다(또는 후면 = 후면 -1).
비어 있음을 확인하세요.
이 작업은 deque가 비어 있는지 여부를 확인하기 위해 수행됩니다. front = -1이면 데크가 비어 있음을 의미합니다.
전체 확인
이 작업은 deque가 가득 찼는지 여부를 확인하기 위해 수행됩니다. front = Rear + 1이거나 front = 0이고 Rear = n - 1이면 데크가 꽉 찼음을 의미합니다.
위의 모든 deque 작업의 시간 복잡도는 O(1), 즉 일정합니다.
데크의 응용
- Deque는 두 작업을 모두 지원하므로 스택과 큐로 모두 사용할 수 있습니다.
- Deque를 회문 검사기로 사용할 수 있다는 것은 문자열을 양쪽 끝에서 읽으면 문자열이 동일하다는 것을 의미합니다.
데크 구현
이제 C 프로그래밍 언어에서 deque의 구현을 살펴보겠습니다.
안드로이드에서 숨겨진 물건을 찾는 방법
#include #define size 5 int deque[size]; int f = -1, r = -1; // insert_front function will insert the value from the front void insert_front(int x) { if((f==0 && r==size-1) || (f==r+1)) { printf('Overflow'); } else if((f==-1) && (r==-1)) { f=r=0; deque[f]=x; } else if(f==0) { f=size-1; deque[f]=x; } else { f=f-1; deque[f]=x; } } // insert_rear function will insert the value from the rear void insert_rear(int x) { if((f==0 && r==size-1) || (f==r+1)) { printf('Overflow'); } else if((f==-1) && (r==-1)) { r=0; deque[r]=x; } else if(r==size-1) { r=0; deque[r]=x; } else { r++; deque[r]=x; } } // display function prints all the value of deque. void display() { int i=f; printf(' Elements in a deque are: '); while(i!=r) { printf('%d ',deque[i]); i=(i+1)%size; } printf('%d',deque[r]); } // getfront function retrieves the first value of the deque. void getfront() { if((f==-1) && (r==-1)) { printf('Deque is empty'); } else { printf(' The value of the element at front is: %d', deque[f]); } } // getrear function retrieves the last value of the deque. void getrear() { if((f==-1) && (r==-1)) { printf('Deque is empty'); } else { printf(' The value of the element at rear is %d', deque[r]); } } // delete_front() function deletes the element from the front void delete_front() { if((f==-1) && (r==-1)) { printf('Deque is empty'); } else if(f==r) { printf(' The deleted element is %d', deque[f]); f=-1; r=-1; } else if(f==(size-1)) { printf(' The deleted element is %d', deque[f]); f=0; } else { printf(' The deleted element is %d', deque[f]); f=f+1; } } // delete_rear() function deletes the element from the rear void delete_rear() { if((f==-1) && (r==-1)) { printf('Deque is empty'); } else if(f==r) { printf(' The deleted element is %d', deque[r]); f=-1; r=-1; } else if(r==0) { printf(' The deleted element is %d', deque[r]); r=size-1; } else { printf(' The deleted element is %d', deque[r]); r=r-1; } } int main() { insert_front(20); insert_front(10); insert_rear(30); insert_rear(50); insert_rear(80); display(); // Calling the display function to retrieve the values of deque getfront(); // Retrieve the value at front-end getrear(); // Retrieve the value at rear-end delete_front(); delete_rear(); display(); // calling display function to retrieve values after deletion return 0; }
산출:
이것이 기사의 전부입니다. 이 기사가 귀하에게 도움이 되고 유익한 정보가 되기를 바랍니다.