python deque

    

 `deque`는 `collections` 모듈에서 제공하는 양방향 큐(double-ended queue)입니다. `list`와 비교했을 때, `deque`가 특정 연산에서 더 효율적으로 동작하는 이유는 내부 구현의 차이에 기인합니다. 


`deque`와 `list`의 주요 차이점과 장점을 다음과 같이 요약할 수 있습니다:


1. **양쪽 끝에서의 연산 속도**:

   - `deque`는 양쪽 끝에서의 요소 추가 및 제거가 `O(1)`의 시간복잡도로 매우 빠릅니다.

   - 반면, `list`는 오른쪽 끝(즉, 리스트의 마지막)에서의 추가 및 제거는 빠르지만(대략적으로 `O(1)`), 왼쪽 끝(즉, 리스트의 시작 부분)에서의 추가 및 제거는 `O(n)`의 시간복잡도를 가지므로 상대적으로 느립니다.


2. **내부 구현**:

   - `list`는 동적 배열로 구현되어 있어, 연속된 메모리 공간에 요소를 저장합니다. 이 때문에 중간에 요소를 추가하거나 제거할 때 비효율적인 경우가 발생할 수 있습니다.

   - `deque`는 연결 리스트 기반으로 구현되어 있어, 양쪽 끝에서의 연산이 빠르게 이루어집니다.


3. **용도**:

   - `deque`는 스택과 큐의 기능을 모두 제공하므로 다양한 알고리즘에서 유용하게 사용될 수 있습니다. 특히 양방향 큐 기능이 필요한 경우에는 `deque`가 필수적입니다.

   - `list`는 일반적인 목적의 배열로 사용됩니다.


4. **메모리**:

   - `deque`는 각 요소마다 추가적인 포인터 정보를 저장하기 때문에, 메모리 사용량이 `list`보다 약간 크게 될 수 있습니다. 그러나 대부분의 경우 이 차이는 크게 중요하지 않습니다.


5. **추가 기능**:

   - `deque`는 `rotate`, `appendleft`, `popleft`와 같은 추가적인 메서드를 제공합니다.


결론적으로, 어떤 데이터 구조를 사용할지는 특정 알고리즘 또는 문제 상황에 따라 결정됩니다. `deque`는 양쪽 끝에서 빠른 연산이 필요한 경우에 특히 유용합니다.


`collections` 모듈의 `deque`는 다양한 메서드를 제공합니다. 여기서는 그 중에서 대표적인 메서드들을 소개하겠습니다:


1. **append(x)**:

   - `x`를 deque의 오른쪽 끝에 추가합니다.

   ```python

   d = deque([1, 2, 3])

   d.append(4)  # deque([1, 2, 3, 4])

   ```


2. **appendleft(x)**:

   - `x`를 deque의 왼쪽 끝에 추가합니다.

   ```python

   d = deque([1, 2, 3])

   d.appendleft(0)  # deque([0, 1, 2, 3])

   ```


3. **pop()**:

   - deque의 오른쪽 끝 요소를 제거하고 반환합니다. deque가 비어있으면 `IndexError`를 발생시킵니다.

   ```python

   d = deque([1, 2, 3])

   d.pop()  # Returns 3, d becomes deque([1, 2])

   ```


4. **popleft()**:

   - deque의 왼쪽 끝 요소를 제거하고 반환합니다. deque가 비어있으면 `IndexError`를 발생시킵니다.

   ```python

   d = deque([1, 2, 3])

   d.popleft()  # Returns 1, d becomes deque([2, 3])

   ```


5. **extend(iterable)**:

   - 주어진 iterable의 요소를 deque의 오른쪽에 추가합니다.

   ```python

   d = deque([1, 2, 3])

   d.extend([4, 5])  # d becomes deque([1, 2, 3, 4, 5])

   ```


6. **extendleft(iterable)**:

   - 주어진 iterable의 요소를 deque의 왼쪽에 추가합니다. 그러나 iterable의 요소는 왼쪽부터 하나씩 추가되는 것이 아니라 오른쪽부터 추가됩니다.

   ```python

   d = deque([1, 2, 3])

   d.extendleft([0, -1])  # d becomes deque([-1, 0, 1, 2, 3])

   ```


7. **rotate(n=1)**:

   - deque의 요소를 `n`만큼 오른쪽으로 회전시킵니다. `n`이 음수인 경우 왼쪽으로 회전시킵니다.

   ```python

   d = deque([1, 2, 3, 4, 5])

   d.rotate(2)  # d becomes deque([4, 5, 1, 2, 3])

   d.rotate(-1)  # d becomes deque([5, 1, 2, 3, 4])

   ```


8. **clear()**:

   - deque의 모든 요소를 제거합니다.

   ```python

   d = deque([1, 2, 3])

   d.clear()  # d becomes deque([])

   ```


9. **count(x)**:

   - deque에서 `x`와 동일한 요소의 개수를 반환합니다.

   ```python

   d = deque([1, 2, 3, 2, 4, 2])

   d.count(2)  # Returns 3

   ```


이외에도 `deque`는 `remove`, `reverse` 등의 다른 메서드들도 제공하지만, 위의 메서드들이 가장 대표적이고 자주 사용되는 기능들입니다.

댓글

이 블로그의 인기 게시물

js 스트링에서 요소 갯수 세기

STUDY

javascript cheatsheet