우주먼지
article thumbnail
Hash 충돌 & 양수 변환 & loadFactor
Data Architect/Data Structure 2023. 2. 26. 14:39

💡 해시 충돌 서로 다른 값의 키가 일치하는 경우를 의미한다 충돌이 일어나지 않게 Folding 하는 방법 함수를 구현할때 충돌을 피하고자 할때 어떻게 분포를 더 넓게 할지 생각하기 아래 사진은 전화번호를 받아서 3분할한 합을 키 배열에 저장하는 도중 Folding이 발생한 사진이다 hashCode에서의 충돌문제를 해결한 문자열 표현 문자는 유니코드로 변환하여 숫자로 나타낼 수 있고, 각 문자를 변환 후 그 숫자들을 합하면 된다 하지만 그렇게 했을 경우 단순히 문자의 위치와 관계없이 같은 문자열이 있다면 해시 충돌이 발생한다 문자의 위치에 따라 상수 g를 곱하는 횟수를 다르게 해서 충돌 문제 해결 116 + g(104 + g(105 + g(115))) // 문자열을 기반으로 정수를 계산해주는 hashCo..

article thumbnail
해시 (Hash)
Data Architect/Data Structure 2023. 2. 12. 22:59

💡 Hash 연결 리스트에 비해 검색 & 추가 & 제거 & 수정의 시간복잡도 효율이 좋은 자료구조인 키 & 값 기반의 Hash Hash -> Key & Value Array의 구조로 가정함 Hash의 메서드 시간복잡도를 효율적으로 바꿀 수 있는 메서드들 add() remove(0 lookup() / find() change() 시간복잡도가 최소 O(n)이 걸릴수 밖에 없는 메서드들 all entries all keys all values Hash에선 시간복잡도가 O(1)이지만 연결 리스트에선 O(n)이던 메서드들 size() isEmpty() isFull() loadFactor() Hash 함수 - hashCode() 해시 함수에 중요한것은 데이터의 속성이다 연산이 빨라야 한다 최대한 코드 충돌을 지양해..

article thumbnail
스택 & 큐 (Stack & Queue)
Data Architect/Data Structure 2023. 2. 12. 22:26

💡 스택 & 큐 스택 & 큐 를 배열로 구현했을 때 배열은 순서가 있고 첫 부분을 제거하거나 추가하려면 요소들을 하나씩 뒤로 옮겨야 하며 시간복잡도는 O(n) 임 스택과 큐의 과정이 비효율적이기 때문에 스택과 큐에서는 기본적인 배열을 사용하지 않음 그래서 첫 부분을 제거하거나 추가하는 과정의 시간복잡도가 상수인 연결 리스트를 스택 & 큐에 적용하는게 좋음 배열로 스택 구현 addLast, removeLast -> O(1)의 시간복잡도 addFirst, removeFirst -> 배열의 원소들은 메모리 상에서 순차적으로 저장되기 때문에 맨 앞에서 삽입/삭제 연산이 일어나면 뒤로 한칸씩 미루거나 앞으로 한칸씩 당겨야 하므로 O(n)의 시간복잡도 Last In First Out (LIFO, 후입선출, 나중에 ..

article thumbnail
이중 연결 리스트 & 원형 연결 리스트
Data Architect/Data Structure 2023. 2. 12. 21:41

💡 이중 연결 리스트 & 원형 연결 리스트 이중 연결 리스트(Doubly Linked List) Singly Linked List 관련 포스팅 - https://root-ca.tistory.com/253 전에 만들었던 단순 연결 리스트에 previous 필드를 추가한다 즉, 이중 연결 리스트의 Node 구성은 next & prev & data 3개의 요소가 들어감 원형 연결 리스트(Circular Linked List) tail.next가 null이 아닌 연결 리스트의 노드를 가리키는 연결리스트 단순 연결 리스트의 단점 tail 포인터가 있더라도 removeLast()를 하기 위한 시간복잡도는 O(n)으로 마지막 요소부터 앞으로 넘어갈 방법이 없으므로 비효율적이다. 무조건 처음부터 시작해서 마지막의 2번..

article thumbnail
반복자 (Iterator)
Data Architect/Data Structure 2023. 2. 12. 20:33

💡 Iterator 자바의 컬렉션 프레임워크에서 컬렉션의 요소들을 읽어오는 방법을 표준화 하였는데 그 중 하나가 Iterator 이다. Iterator와 Iterable은 Collection의 상위 인터페이스이다. 상향된 for문을 쓰기위한 인터페이스 구현 Iterator의 구현 메서드 - boolean hasNext() -> 다음 요소가 있다면 true 반환 - E next() -> 포인터 - void remove() - void forEachRemaning(Consumer actions) Iterable의 구현 메서드 - Iterator iterator() - void forEach(Consumer actions) - Spliterator spliterator() Iterator 인터페이스 hasNe..

article thumbnail
단순 연결 리스트 (Singly Linked List)

💡 LinkedList 포인터를 사용하여 여러 개의 노드를 연결하는 자료 구조 자료구조를 사용할때 항상 경계 조건을 생각하기 배열과의 차이점 배열도 순서대로 여러 데이터를 저장할때 사용한다는 공통점이 있지만 크기 조정이 어렵지만, LinkedList는 항상 맞는 크기로 만들어지도록 설계되어 많은양의 데이터나 순차적 데이터를 사용할때 적합함 LinkedList의 기본 구조 연결 리스트의 기본구조에는 노드가 있다 노드에는 두가지 정보가 들어있다 next - 다음 노드를 가리키는 포인터 data - 노드에 넣는 데이터를 가리키는 포인터 노드를 정의하는 법 public class LinkedList { private Node head; private int currentSize; /** currentSize 변..

article thumbnail
시간복잡도 & Big O Notation

💡 시간복잡도 서로 다른 알고리즘의 효율성을 비교할 때 사용 시간복잡도 효율순 : O(1) < O( 𝑙𝑜𝑔𝑛 ) < O(n) < O(n 𝑙𝑜𝑔𝑛 ) < O( 𝑛2 ) < O( 2𝑛 ) < O(n!) Big O 표기법이란? - O (빅 오 복잡도) : 비교 대상인 그래프가 일치 혹은 아래에 있을 때. 비교 대상인 다른 알고리즘과 같거나 더 빠르다. - θ (세타 복잡도) : 비교 대상인 그래프가 일치할 때. 비교 대상인 다른 알고리즘과 같다. - Ω (빅 오메가 복잡도) : 비교 대상인 그래프가 일치 혹은 위에 있을 때. 비교 대상인 다른 알고리즘과 같거나 느리다. - o (리틀 오 복잡도) : 비교 대상인 그래프가 아래에 있을 때. 비교 대상인 다른 알고리즘보다 더 빠르다. - ω (리틀 오메가 복잡도)..

검색 태그