본문 바로가기

Algorithm

(12)
[Algorithm] 다익스트라 알고리즘 다익스트라 알고리즘이란 ? 음의 가중치가 없는 그래프의 한 정점에서 모든 정점까지의 최단거리를 구하는 알고리즘입니다. 도착 정점 뿐만아니라 모든 다른 정점까지 최단 경로로 방문하며, 각 정점까지의 최단 경로를 모두 찾게 됩니다. 매번 최단 경로로 정점을 선택해 탐색을 반복하는 것 입니다. 음의 간선이 존재하지 않기 때문에 다익스트라는 현실세계에 사용하기 매우 적합한 알고리즘 중 하나입니다. 이 알고리즘은 다이나믹 프로그래밍을 활용하였는데, 그 이유는 '최단 거리는 여러 개의 최단 거리로 이루어져 있기 때문'입니다. 하나의 최단거리를 구할 때 그 이전까지 구했던 최단 거리 정보를 그대로 사용한다는 특징이 있습니다. 동작 과정 1. 출발 노드를 설정합니다. 2. 출발 노드를 기준으로 각 노드의 최소 비용을 ..
[Data Structure / JS] 이진 힙(Binary Heaps) / 우선순위 큐(Priority Queue) 힙(Heap)이란 ? 완전 이진트리 기반의 자료구조로, 최대 힙과, 최소 힙 두 종류로 구분됩니다. 최대 힙의 경우에는 루트노드에 가까울 수록 크고, 최소힙은 루트 노드에 가까울 수록 작은 값을 가집니다. 힙에서는 데이터의 중복이 허용되며, 주로 우선순위 큐를 구현하는데 사용됩니다. 나아가 힙 정렬, 다익스트라의 최단 경로 알고리즘에서도 사용됩니다. 힙은 부모자식간의 크기 차이만 비교합니다. 형제 노드 간에의 크기 차이를 고려하지 않습니다. 구현 힙은 일반적으로 각 요소에 효율적으로 접근할 수 있는 배열을 통해 구현됩니다. 인덱스 i에 위치한 노드의 부모는 (i-1)/2에 위치하며, 왼쪽 자식 노드는 2*i + 1, 오른쪽자식 노드는 2*i + 2에 위치하게 됩니다. Heap에서의 삽입 힙에서의 삽입은 ..
[Data Structure / JS] 연결 리스트 연결리스트 ? 연결리스트는 선형 구조로서 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식으로 데이터를 저장하는 자료구조 입니다. 배열이라는 편리한 자료구조가 자바스크립트에서 제공이 되지만 왜 연결리스트가 필요할까 라는 의문이 들 수 있습니다. 배열과 연결리스트의 차이 대해서 알아봅니다. 배열과의 차이점 1. 메모리 차이 배열은 순차적인 데이터, 즉 메모리 영역이 연속적으로 사용됩니다. 연결리스트는 각 데이터가 퍼져있습니다. 즉, 포인터를 사용하여 각 영역을 참조합니다. 2. 요소의 삭제 / 추가 배열은 O(n) 시간이 소요됩니다. 연결리스트의 삭제와 추가는 O(1) 시간이 소요됩니다. 연결 리스트의 특징 연결 리스트는 인덱스가 없습니다. 연결 리스트는 무작위 접근이 불가능합니다. 연결 리..
[Algorithm] 분할 정복(Divide and Conquer) 분할정복은 큰 문제를 작은 부분 문제로 나눈 후 각각을 해결하고, 이를 통해 전체 문제를 해결하는 알고리즘 기법. 이러한 방식은 컴퓨터 과학 분야에서 널리 사용되며, 대표적인 예로는 퀵정렬, 병합정렬, 이진 탐색 등이 있습니다. 이를 해결하기 위해서는 다음과 같은 세 가지 단계가 필요합니다. 1. 분할(Divide) 문제를 작은 문제 부분으로 나눕니다. 일반적으로 이 과정은 재귀적으로 수행됩니다. 2. 정복(Conquer) 작은 부분 문제를 각각 해결합니다. 부분 문제의 크기가 충분히 작지 않으면 재귀적으로 분할합니다. 3. 결합(Combine) 작은 부분 문제의 해답을 결합하여 원래 문제의 해답을 구합니다. 분할정복의 장점과 한계점 분할정복은 문제의 크기가 커지면 일반적으로 더 빠른 알고리즘으로 복잡도..
[Algorithm] 슬라이딩 윈도우(Sliding Window) 슬라이딩 윈도우(Sliding Window) 슬라이딩 윈도우 알고리즘은 투 포인터와 유사하지만, 부분 배열의 길이를 고정해서 탐색하는 방법 투 포인터와 달리 두 개의 포인터 변수를 사용하지 않고, 고정적인 부분 배열의 크기와 한 개의 포인터 변수를 알고 있다면, 부분 배열의 양끝의 연산으로 정확한 값을 도출해낼 수 있다. [1, 10, 3, 2, 23, 10, 12] 라는 배열이 주어졌을 때 예시 배열 안에서 네 개의 연속된 수열의 최댓값을 찾는다고 가정했을 때, ↓ ↓ [1, 10, 3, 2, 23, 10, 12] sum = 1 + 10 + 3 + 2 ↓ ↓ [1, 10, 3, 2, 23, 10, 12] sum = 10 + 3 + 2 + 23 (1을 빼주고, 23을 더해준 값) ↓ ↓ [1, 10, 3..
[Algorithm] 투 포인터(Two Pointer) 투포인터 알고리즘 투포인터는 두 개의 포인터를 기준으로 검색을 하며, 원하는 값을 찾는 알고리즘입니다. 두 개의 점을 시작점과 끝점으로 이용하게 되면, 데이터의 범위를 표현 가능하며, 메모리와 시간 효율성을 높일 수 있습니다. 사용 예제 1. 특정한 합을 가지는 부분 연속 수열 찾기 부분 연속 수열의 시작점(start)과 끝점(end)의 위치를 기록 특정한 부분합을 M이라 가정할 때 알고리즘은 아래와 같다. 시작점(start)과 끝점(end)이 첫 번째 원소의 인덱스(0)를 가리키도록 한다. 현재 부분합이 M과 같다면 카운트한다. 현재 부분합이 M보다 작으면 끝점(end)를 1 증가시킨다. 현재 부분합이 M보다 크거나 같으면 시작점(start)을 1 증가시킨다. 모든 경우를 확인할 때까지 2번부터 4번 ..
[Algorithm] Big-O 관점에서의 배열과 객체 Big-O 관점에서의 배열과 객체 Object 객체는 정렬되어 있지 않은 key : value 형태의 자료형태이다. Insertion, Removal, Access 모두 상수시간 (O(1)) Searching은 선형 (O(N)) Object.keys, Object.values, Object.entries은 선형 시간 O(N) Object.hasOwnProperty는 상수시간 - O(1) Array 객체와 달리 데이터가 정렬이 되어있다. Access 는 상수시간 (O(1)) 배열의 맨 뒤에 데이터를 추가하는 것은 객체와 같이 상수시간이 소요된다. 하지만 맨 앞에 데이터를 추가하는 경우라면, index를 다시 설정해야하기 때문에 선형시간이 소요된다. 아래는 메소드 별 Big-O push - O(1) pop ..
[Algorithm] Big-O-Notation Big-O Notation 빅오 표기법의 필요성 여러가지 코드를 일반적으로 서로 비교하고 성능을 평가하는 방법. 코드의 성능을 얘기할 때 정확한 전문용어를 사용하는 것이 중요하다. 빅오를 이해하게 되면 문제가 어디서 나타나는지 찾기 쉬울 수 있다. // Code1 function addUpTo(n) { let total = 0; for(let i = 1; i

728x90