스택을 표현한 그림이다. 사실 다른거 다 필요없이 이 한장에 스택의 모든것이 설명된다고 봐도 과언이 아니다.
다음은 스택의 구조를 알아보자.
큐를 표현한 그림이다. 스택과 마찬가지로 이 한장에 모든것이 설명된다.
하나 짚고 넘어가야 할 것이 있다.
이것으로 거의 3시간은 찾은거같은데, 보통 우선순위 큐라고 검색을 하면 많이 나오는것이
'완전이진트리' , '최대/최소 힙'이다.
그래서 처음에 생각했을때는
'완전이진트리는 뭐 이런 구조이고... 완전이진트리로 만든 최대/최소 힙이 우선순위 큐인것인가?'
라는 고민을 했고, 이것때문에 시간이 엄청 오래 끌렸다.
하지만, 우선순위 큐는 추상적인 개념일뿐이고, (우선순위 큐는 "리스트"나 "맵"과 같이 추상적인 개념이다 - 위키) 그러한 개념을 최대/최소 힙이라는 방법을 통해서 구현한 것일 뿐이다.
설명은 정말 금방 끝난다.
이라고 생각하면 된다.
다음은 우선순위 큐의 종류 중 하나인 최소 힙이다.
각각의 원소들은 위로 하나, 아래로 둘의 원소와 이어질 수 있는데,
이때 위의 원소는 부모 노드, 아래의 원소는 자식노드 라고 한다.
정말 간단한 원칙 하나만 정하면 된다.
최소 힙 = 부모 노드의 key는 자식 노드의 key 보다 작으면 된다.
최대 힙 = 부모 노드의 key는 자식 노드의 key 보다 크면 된다.
이해가 되는가? 위 그림에서 상단의 1-(5,2)를 보도록 하자.
부모 노드인 1은 자식 노드인 5,2 보다 작다.
이걸 전체 노드에 정하면 되는 것이다.
그리고 데이터를 추가하고자 한다면, 왼쪽부터 오른쪽 순으로 자식노드를 채우고,
한 줄이 다 찼으면 다음줄부터 채우면 된다.
위의 그림에서는 새로운 7 노드의 왼쪽부터 채우면서, 8 노드의 오른쪽까지 모두 채우고 나면
다음줄을 채우면 된다는 것이다.
여기서 내가 궁금해 했던것은 '그럼 자식 노드들 간에 숫자 차이는 어떻하지?' 라는 것이었다.
하지만 그런건 어차피 별 상관이 없었는데, 트리가 어떻게 정렬이 되어 있던 우리가 원하는
'우선순위 별로 데이터를 처리한다'만 해결되면 되기 때문에
이 기능만 잘 작동한다면 나머지 데이터가 어떻게 정렬되어 있던 아무런 상관이 없다.
그래서 이러한 방법을 통해 우리는 시간복잡도를 n -> logn으로 줄일 수 있게 되었다.