포스트

Deque

Deque

@TODO


Double Ended Queue

양쪽 끝에서 삽입 삭제가 전부 가능

Restricted Structure
특정 위치에서만 원소를 넣거나 뺄 수 있는 제한된 자료구조 (스택, 큐, 덱)

  • 성질
    • 원소 추가 O(1)
    • 원소 제거 O(1)
    • 제일 앞/뒤 원소 확인 O(1)
    • 제일 앞/뒤가 아닌 나머지 원소들의 확인/변경이 ‘원칙적으로’ 불가능
      • 독특하게도 STL deque에서는 인덱스로 원소에 접근할 수 있음

마찬가지로 연결리스트보다 배열 구현이 더 쉬움

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const int MAX = 1000005;
int dat[2 * MAX + 1];
int head = MAX, tail = MAX;

void push_front(int x)
{
    dat[--head] = x;
}

void push_back(int x)
{
    dat[tail++] = x;
}

void pop_front()
{
    head++;
}

void pop_back()
{
    tail--;
}

int front()
{
    return dat[head];
}

int back()
{
    return dat[tail-1];
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <bits/stdc++.h>
using namespace std;

int main(void)
{
    // STL deque는 deque보다도 vector랑 비슷한데
    // vector가 front에서도 O(1)로 추가 제거가 가능한 느낌

    // insert erase 인덱스접근
    // stl vector에서 제공되는 기능을 stl deque에서도 다 제공

    // 단, vector와 달리 deque는 모든 원소들이 메모리상에 연속하게 배치되어 있지 않음
    // 궁금하다면 c++ deque vs vector

    deque<int> DQ;
    DQ.push_front(10); // 10
    DQ.push_back(50); // 10 50
    DQ.push_front(24); // 24 10 50
    for(auto x: DQ) cout << x << ' ';
    cout << DQ.size() << '\n'; // 3
    if(DQ.empty()) cout << "DQ is empty\n";
    else cout << "DQ is not empty\n"; // DQ is not empty
    DQ.pop_front(); // 10 50
    DQ.pop_back(); // 10
    cout << DQ.back() << '\n'; // 10
    DQ.push_back(72); // 10 72
    cout << DQ.front() << '\n'; // 10
    DQ.push_back(12); // 10 72 12
    DQ[2] = 17; // 10 72 17
    DQ.insert(DQ.begin()+1, 33); // 10 33 72 17
    DQ.insert(DQ.begin()+4, 60); // 10 33 72 17 60
    for(auto x: DQ) cout << x << ' ';
    cout << '\n';
    DQ.erase(DQ.begin()+3); // 10 33 72 60
    cout << DQ[3] << '\n'; // 60
    DQ.clear(); // DQ의 모든 원소 제거
    }

BFS
Flood Fill

둘 다 단골 문제

  • 운영체제 작업 스케줄링 알고리듬
  • 앱의 undo 리스트

_

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.