Queue(큐)
bigO queue java
Queue
- 선형 자료구조이다.
- 먼저 삽입한 data가 먼저 나오는(FIFO, First In First Out)구조로 저장한다.
- 매표소에서 표를 사기위해 줄선 사람들 중, 먼저 줄을 선 사람이 먼저 나가는 상황가 유사하다.
- Queue의 맨 뒤에 Data를 삽입하는 Enqueue, 맨 앞의 Data를 삭제하는 Dequeue라는 작업이 있다.
Java로 구현한 Queue (ArrayList 기반)
- Enqueue와 Dequeue
public class Queue<T> { private ArrayList<T> queue = new ArrayList<T>(); public void enqueue(T item) { queue.add(item); } public T dequeue() { if (queue.isEmpty()) { return null; } return queue.remove(0); } public boolean isEmpty() { return queue.isEmpty(); }
- main 메서드에서 출력
Queue<Integer> q = new Queue<Integer>(); q.enqueue(1); // 1 q.enqueue(2); // 1, 2 q.enqueue(3); // 1, 2, 3 System.out.println(q.dequeue); // 2, 3 System.out.println(q.dequeue); // 3
java.util.Queue
- Java는 기본적으로 java.util 패키지에서 Queue를 제공한다.
- Enqueue에 해당하는 기능으로 add(), offer() 메서드를 제공한다.
- Dequeue에 해당하는 기능으로 poll(), remove() 메서드를 제공한다.
- Queue에서 Data 생성을 위해서는 LinkedList 클래스를 사용해야한다.
Queue<T> queue = new LinkedList<T>();
Queue는 항상 첫 번째 저장된 Data를 삭제하므로, ArrayList와 같은 Array 기반의 자료구조 사용 시 빈 공간을 채우기 위해 Data의 복사가 발생하기 때문에 비효율적이기 때문이다.
Queue의 시간 복잡도
- 탐색
100개의 data가 존재할 때 10번 째 data를 삭제한다고 하면, 100개 중 30번 째까지 찾아갸아 햐기 때문에 시간복잡도는 O(n)이다.
- 삽입 및 삭제
data가 삽입될 때 맨 뒤의 data가 삽입되는 연산만 수행되기 때문에 시간 복잡도는 O(1)이다. 삭제도 마찬가지로 동일한 연산이 수행되므로 시간 복잡도는 O(1)이다.
참고자료
- https://en.wikipedia.org/wiki/Queue_(abstract_data_type)
- https://www.coursera.org/lecture/data-structures/queues-EShpq
- https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Queue.html