본문 바로가기

분류 전체보기227

Graph 그래프에서 한 노드를 vertex라고 부름 연결을 connection 또는 edge라고 부름 하나의 vertex는 여러 vertex와 연결될 수 있다. 양방향 연결되어 있다. adjacency Matrix 양방향으로 연결되어 있는 경우에만 대조되는 모습을 보인다. adjacency List 리스트로 표현하면{ "A"= ["B","E"], "B"= ["A","C"], "C"= ["B","D"], "D"= ["C","E"], "E"= ["A","D"] } Big Oadd vertexadjacency Matrix방법으로 표기할 경우하나의 vertex를 추가하려면 원래 있는 vertex의 수 + 1의 제곱만큼의 칸을 만들어야 한다. ⇒ 0(n^2)반면 adjacency list의 방법의 경우 빈 리스트를 추가하.. 2023. 9. 3.
HashTable 인덱스 찾기hash라는 메서드로 노드의 인덱스를 정한다. hash method 특징 one way 키로 주소(인덱스)를 알아낼 수는 있는데 인덱스로 키를 알아내지는 못함 Deterministic 주소고정 how to deal with collision 순서보장 안됨 같은 주소에 여러개 저장 - separate chaining 이미 다른게 저장되어있으면 빈거 찾을때까지 다음으로 - Linear Probing (open addressing) 우리가 할 것은 seperate chaining. big Ohash method = 0(1) set = 0(1) get = 0(1) - seperate chaining 일때. 2023. 8. 27.
Trees binary search tree 트리(Tree)는 계층적인 구조를 나타내는 자료구조이다. linked list 도 tree 의 일부분으로 볼수도 있다. 분기가 나눠지지 않은 트리는 링크드 리스트와 똑같이 생겼을 것이다. tree 에는 2개의 포인터가 있다. left and right 해당 노드의 값보다 작으면 left에 붙이고 크면 right에 붙인다. 결과적으로 부모노드의 오른쪽에 있는 노드들은 부모노드의 값보다 큰 값을 가지고 있는 노드들이 오게되고 왼쪽에는 부모노드보다 작은 노드들이 오게된다. 트리 자료구조의 구성요소 parent child leaf - 더이상 차일드가 없는 노드 tree에는 3가지 상태가 있는데, full tree, perfect tree, complete tree 가 있다. f.. 2023. 8. 17.
stack and queue Stacks선입후출 LIFO 구현 예시는 웹브라우저의 뒤로가기. 뒤로가기를 누르면 우리가 마지막으로 접속했던 페이지가나오고, 마지막 전에 방문한 페이지에 가려면 뒤로가기를 2번 눌러야함. 보통 arraylist를 사용. 마지막에 넣고 빼고 하는것은 나머지 요소들의 인덱스를 조정할 필요가 없기때문에 0(1) 나머지 prepend, push sth back같은것들은 0(n) linked list로도 구현 가능 linked list 로 stack을 구현할거면 맨밑에 노드가 null을 가리키게하는게 좋다. 왜냐면 그렇게 하는게 stack에서 선입선출을 할때 시간복잡도가 떨어지기 때문이다. 맨 위의 노드가 마지막 노드가 되게하면 맨마지막노드의 전 노드를 tail로 지정하기위해 찾아야하는데 인덱스가 따로 없어 반복.. 2023. 8. 11.
Doubly linked list linked list와 다른점 하나. node에 이전 노드를 가리키는 포인터가 추가되었다. 포인트 2개 삽입 및 삭제가 용이. 삽입 또는 삭제 연산을 수행할 때, 해당 노드의 이전 노드와 다음 노드를 적절하게 연결하면 됨. 노드를 삽입하거나 삭제하는 작업이 단일 연결 리스트보다 간단하게 처리가능. 단일 연결 리스트에 비해 메모리 공간이 더 많이 사용됨. 각 노드마다 이전 노드와 다음 노드를 가리키는 두 개의 포인터가 추가로 필요하기 때문이다. append 0(1) public void append(int value){ Node newNode = new Node(value); if(length == 0){ head = newNode; tail = newNode; }else{ //link new node t.. 2023. 8. 4.
토끼와 거북이 알고리즘 Floyd's Tortoise and Hare algorithm linked list 에서 이용할 수 있는 알고리즘으로 2개의 포인터를 사용한다. 하나는 한번에 2칸씩 이동, 하나는 하나씩 이동한다. 이 알고리즘을 통해 linked list에 loop강 없다면 해당 리스트의 중간지점을 찾는다거나 linked list안에 loop가 있는지 찾을 수 있다. 왜냐하면 loop가 있다면 두개의 노드는 언젠가는 만나게 되기 때문이다. 그리고 또 한가지 loop의 시작점을 알 수 있다. 어떻게 하느냐 두개의 노드를 2칸씩(fast pointer) 1칸씩(slow pointer) 이동시키다보면 둘은 만나게 된다. 그 시점부터 slow pointer를 head로 이동시켜 한칸씩 이동시키고 fast는 만나게 되는 지점부터 한칸씩 이동시킨다. 그렇게 서로 다른 지점에서 한칸씩 이동하다.. 2023. 8. 4.
728x90