어제 stack
과 queue
에 대해서 간략히 말해봤는데, 오늘은 이것들과 함께 hash
, heaq
에 대해서도 알아봤다!
stack
이란 '겹겹이 쌓다'라는 뜻 그대로 한 방향으로만 in/out이 가능한 자료구조라고 한다.
그림과 같이 5, 2가 입력되고, 5를 바로 꺼낼 수 없다. (3번stack
처럼 막혀있기 때문에) 5를 꺼내기 위해선 반드시 2를 꺼내고 5를 꺼낼 수 있는 구조!
이러한 구조를LIFO(Last In First Out)
이라고 한다.
3번 학생의 경우에는 모든 과목을 듣지 않아도 구조상에는 문제가 없으므로 True이다.
queue
자료형은 긴 파이프 구조에 먼저 들어온것이 먼저 나가는 자료구조이다. 이러한 자료구조를FIFO(First In First Out)
이라고 한다.
python에서는deque
자료형을 많이 쓰는데, 이 자료형은 양쪽으로 in/out이 가능한 구조이기에 알고리즘 문제를 풀때 한쪽 방향으로만 in/out 제한을 벗어나 유연하게 대처하기 좋다.
DFS/BFS
가 있다. 특히 BFS
를 풀때 해당 인덱스가 접근 가능한 node
를 queue
자료형에 다 넣어놓고 하나씩 꺼내서 확인할때 유용하다.index
에서 queue
자료형에 2, 3을 넣어 놓고 2를 꺼내어 확인하고, 3을 꺼내어 마저 확인할 수 있다.
heap
자료형은 위와같이Tree
구조로 되어있다. 대표적으로 최소힙, 최대힙이 있는데, 왼쪽 그림이 최소힙이고 오른쪽 그림이 최대힙이다.
(지금까지 자료구조와 모양이 달라서 어려웠다...😂)
최소힙은 부모node
가 자식node
보다 무조건 작다. Sub Tree
는 왼쪽 오른쪽 두개가 있는데, 왼쪽이 오른쪽보다 작게 되어있다. 그림은 일부러 완전한 heap
으로 그리지 않았는데, 모양과는 상관없다는 것을 전달하고 싶었다.
최소힙과 거의 모든 부분이 비슷하지만, 부모node
가 자식node
보다 무조건 크다는 점이 다르다.
hash
자료구조는 다른 자료구조보다 조금 개념이 어려웠다...key
값을hash
함수로 작동시켜HashCode
를 만든다. (만드는 방법은 함수마다 다를 수 있지만 한 리스트에 접근하고 저장할때는 동일한 함수를 사용해야 한다.)
위의 그림에서는 각 글자에 해당하는 ASCII Code
를 사용하여 HashCode
를 얻어왔는데, 사실 첫번째 sung
외에는 임의의 값을 넣어주어 정확하지 않다...😭
Index
로 접근하기 위해서는 HashCode
를 Index
의 길이로 나머지 연산을 통해 접근 할 수 있다.
hash
는 검색을 활용하여 만들때 유용하다. HashCode
가 정수로 만들어지기 때문에 HashCode
자체가 배열의 Index
로 바로 접근이 가능하기 때문에 빠르다.
다만, 주의할점이 있다!💡
HashCode
를 만드는 방법을 짤 때 한쪽 Index
로만 몰리지 않고 짜서 검색이 빠르다는 장점을 살려줄 수 있도록 한다. 원래는 O(1)의 시간복잡도를 가졌지만, 한쪽으로 몰리는 Collision
(충돌)이 발생하면 O(n)까지 늘어날 수 있다.
hash
알고리즘에 대해서는 확실히 알고 가는것 같다! 블록체인같은 시스템도 hash
알고리즘으로 작동한다니... 신기하다!👍heaq
알고리즘의 최대힙, 최소힙 구현 방법에 대해 배웠다. 비록 내장함수를 이용한 방법이지만, 그런 내장함수가 있다는 것 자체를 알았으니 만족!🙌hash
를 이용한 문제를 아직 안풀어서 아쉽다.. 한번 찾아봐서 찾아서 완전한 내껄로 만들고 싶다! (열정 뿜뿜🔥)Tree
의 종류가 많이 있는데, 이것에 대해서도 조금씩 알아나가고 싶다. (너무 넓은 Tree
의 세상...)자료구조만으로도 두꺼운 책이 많은걸 보니 내가 아는 지식은 새발의 피겠지만, 이렇게 오늘도 한걸음 성장!!😎