분류 전체보기 37

BFS (너비우선탐색, Breadth-First Search) DFS (깊이우선탐색, Depth-First Search)

개요 대표적인 그래프 탐색 알고리즘 너비 우선 탐색 (BFS, Breadth-First Search): 노드들과 같은 레벨에 있는 노드를 먼저 탐색하는 방식. 한 단계씩 내려가면서 같은 단계에 존재하는 노드들을 먼저 순회함. 깊이 우선 탐색 (DFS, Depth-First Search): 노드의 자식들을 먼저 탐색하는 방식. 한 노드 의 자식을 타고 끝까지 순회한 후, 다시 돌아와 다른 노드들의 자식을 타고 내려가며 순회함. 파이썬의 딕셔너리와 리스트 자료구조를 활용해 그래프를 표현 가능함 BFS (너비우선탐색, Breadth-First Search) 구현 방문할 노드(need_visti_queue)들과 방문한 노드(visited_queue)들을 append하는 두 개의 큐를 활용함 graph = dic..

그래프

그래프 실제 세계의 현상이나 사물을 정점(vertex) 또는 노드(node)와 간선(edge)으로 표현하기 위해 사용함 용어 무방향 그래프 정점의 차수: 하나의 노드에 인접한 노드 수 방향 그래프 진입 차수: 외부에서 들어오는 간선 수 진출 차수: 외부로 나가는 간선 수 경로 길이: 경로를 구성하기 위해 사용된 간선 수 단순 경로: 처음 노드와 끝 노드를 제외하고 종복된 노드가 없는 경로 A → B → D (O) A → C → D (O) A → B → A → C → D (X) A → B → D → C → A (O) 사이클: 단순 경로 중에서 시작 노드와 끝 노드가 동일한 경우 A → B → C → A 그래프 종류 무방향 그래프 방향이 없는 그래프 간선을 통해 노드는 양방향으로 갈 수 있다 방향 그래프 간..

헛된 다중컬럼 인덱스와 진짜 다중컬럼 인덱스

개요 이전에 explain 기능을 써보다가 다중컬럼 인덱스를 걸어놓은 테이블에서 full scan을 하는 상황을 발견했다. 이후에 테이블을 수정해서 사용하고 있다. 수정한 것이라고는 다중컬럼 인덱스를 만들 때 순서를 수정한 것이다. where 절에 항상 넣는 location_num을 가장 먼저 넣어 unique index를 생성했다. 원래 테이블 unique index의 Seq_in_index의 1번이 date인데 반해 새로운 테이블 unique index의 Seq_in_index의 1번이 location_num인 것이 차이점이다. ALTER TABLE new_index_table ADD UNIQUE INDEX u_idx(location_num, date, time_diff); 이전의 테이블과 현재 수정..

Database 2022.05.26

ES cluster 구축 과정 기록

0. 개요 ElasticSearch Cluster 구축 메뉴얼이나 방법이라기 보다 어떤 과정으로 구축했고 그 과정에서 어떠한 실수를 했는지, 어떤 점을 더 공부해야 하는지에 더 가까운 개인 기록입니다. node 0: Ubuntu 20.04.4 LTS / elasticsearch 8.2.0 node 1: Centos7 / elasticsearch 8.2.0 node 2: Centos7 / elasticsearch 8.2.0 1. Cluster 설치 1-1. tar.gz 배포판 다운로드 $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.2.0-linux-x86_64.tar.gz $ tar -zxvf elasticsearch..

Database 2022.05.26

Airflow의 parallelism과 dag_concurrency

parallelism This defines the maximum number of task instances that can run concurrently in Airflow regardless of scheduler count and worker count. Generally, this value is reflective of the number of task instances with the running state in the metadata database. scheduler와 worker의 개수와 상관없이 Airflow 내에서 동시에 구동할 수 있는 task 인스턴스의 최대 개수 Configuration Reference — Airflow Documentation airflow.apache.o..

airflow-webserver-monitor.pid is already locked

증상 Airflow webserver, scheduler가 작동하지 않음 Error log Traceback (most recent call last): File "/home/keti/.local/lib/python3.6/site-packages/lockfile/pidlockfile.py", line 77, in acquire write_pid_to_pidfile(self.path) File "/home/keti/.local/lib/python3.6/site-packages/lockfile/pidlockfile.py", line 161, in write_pid_to_pidfile pidfile_fd = os.open(pidfile_path, open_flags, open_mode) FileExistsEr..

병합정렬 (Merge sort)

병합정렬 배열을 절반으로 잘라 나눈다. (분리 단계) 잘라서 나눈 배열을 재귀적으로 병합정렬 시킨다. (병합 단계) 예시로 이해 [2, 8, 6, 4] [2, 8], [6, 4] [2], [8] | [6], [4] 앞 두 배열을 정렬하여 합친다. -> [2, 8] 뒤 두 배열을 정렬하여 합친다. -> [4, 6] [2, 8]과 [4, 6]을 합친다. 2 [2] 남은 배열: [8], [4, 6] 8 > 4 -> [2, 4] 남은 배열: [8], [6] 8 > 6 -> [2, 4, 6] 남은 배열: [8] [2, 4, 6, 8] 구현 from turtle import right def split(array): if len(array)

퀵정렬 (Quick sort)

퀵정렬 기준점(pivot이라고 부름)을 정해서 기준점보다 작은 데이터는 왼쪽, 큰 데이터는 오른쪽으로 모으는 함수를 작성한다. 왼쪽 오른쪽으로 나눈 데이터들을 동일한 함수를 호출하여 나누는 작업을 반복한다. 작 작업을 통해 리턴받은 데이터를 결합하면 정렬된 데이터를 얻을 수 있다. 구현 def qsort(array): if len(array) pivot: right.append(array[idx]) else: left.append(array[idx]) return qsort(left) + [pivot] + qsort(right) if __name__ == "__main__": result = qsort([4, 7, 134, 53, 12, 678, 432, 1, 8]) print(result)

동적계획법(Dynamic Programming)과 분할정복 (Divide and Conquer)

정의 동적계획법: 한 번 계산한 결과는 Memoization(메모이제이션) 기법을 통해 다시 계산하지 않는다. 전체 문제를 해결하기 위해 작은 단위의 문제를 해결하고, 해결한 작은 단위의 문제의 답을 통해 전체 문제를 해결한다. 상향식 접근법 (최하위 해답-작은 단위의 문제-을 구하고 단계적으로 올라가서 최상위 문제-전체 문제-를 해결한다.) 분할정복 문제를 나눌 수 없을 때 까지 나누어 잘게 나누어진 문제의 답을 합쳐 전체의 답을 얻는 알고리즘 하향식 접근법 (상위의 답을 구하기 위해 아래로 내려가면서 하위의 답을 구하는 방ㅎ식) 일반적으로 재귀적으로 구현 퀵 정렬, 병합정렬 공통점과 차이점 공통점: 문제를 잘게 쪼갠다. 차이점 동적 계획법은 부분 문제가 중복되지만 분할 정복은 중복되지 않는다. 동적 ..

힙 (Heap)

개요 힙: 데이터에서 최대값과 최소값을 빠르게 찾기 위해 고안된 완전이진트리 완전이진트리(Complete Binary Tree): 노드를 삽입할 때 최하단 왼쪽 노드부터 삽입하는 트리. 사용하는 이유 최대값, 최소값을 빠르게 찾기 위함이다. 데이터를 마구마구 넣다가 중간에 그 순간의 최대값, 최소값을 빠르게 찾기 좋다. 힙의 구조 힙은 두 가지로 분류할 수 있다. 최대값을 찾기 위한 최대 힙(Max Heap)과 최소값을 찾기 위한 최소 힙(Min Heap) 힙은 두 가지 조건을 가긴 자료구조이다. 최대 힙의 경우, 각 노드의 값은 해당 노드의 자식 노드가 가진 값보다 크거나 같다. 최소 힙의 경우 각 노드의 값은 자식 노드가 가진 값보다 작거나 같다. 완전 이진 트리 형태를 가진다. 힙 vs 이진탐색트리..