본문 바로가기

컴퓨터 과학(CS)

(14)
[자료구조] 세그먼트 트리(Segment Tree) 세그먼트 트리란?배열에서 구간에 대한 정보를 효율적으로 관리(구간합, 최솟값, 최댓값 등)하기 위한 트리 구조의 자료구조이다.  특정 배열의 구간합을 구한다고 해보자인덱스012345678데이터34567891211위와 같은 배열이 있다고 해보자인덱스 2~7까지의 구간합을 구한다고 하면인덱스012345678데이터34567891211인덱스 2 ~ 7까지 구간을 돌며 합을 구하면 될 것이다. 결과로는 47이 나올 것이고, 시간 복잡도는 O(7-2)의 시간이 들게 된다. N개의 데이터의 구간합을 구한다면 O(N)이 될 것이다. 만약 N이 많이 커지고, 구간합을 구하는 횟수가 많아지면 이러한 방식은 매우 비효율적이기 때문에 더욱 빠른 방법이 필요하다. 세그먼트 트리이진 트리의 구조를 지니며 구간의 합을 저장할 수 ..
[자료구조] 트라이(Trie) c++ 트라이(Trie)란?트라이는 문자열 검색을 빠르게 할 수 있도록 트리 형태로 문자열을 저장하는 자료구조이다. 다음은 트라이의 예시이다.만약 apple, abc, apply, baby, basr이란 문자열들을 저장한다면 위와 같은 트리가 완성된다. apple과 apply를 보면 두 문자열의 접두사 "appl"이 동일하고, 트리에서 해당 간선을 두 문자열이 공유한다. 해당 트라이에서 apply를 찾으면 위와 같이 트리의 루트부터 탐색하며 문자열을 찾게된다. 트라이의 탐색 속도선형적인 자료구조로 n개의 최대 길이가 m인 문자열을 저장할 때의 탐색 속도는 O(n×m)이다. 반면 트라이는 탐색, 삽입, 삭제 모두 문자열의 최대 길이(트리의 최대 깊이)만큼 O(m)의 시간이 걸린다. 이는 해시와 같은 속도로 굉장히..
[알고리즘] 위상정렬(Topology Sort) c++ 위상정렬(Topology Sort)이란?위상정렬은 사이클이 없는 방향 그래프(DAG)에서 작업의 순서(조건)가 정해져 있는 경우 전체 작업들의 순서를 정렬하는 알고리즘이다. 방탈출 게임을 예시로 설명하겠다.위 그래프를 보면 1번문 열쇠3을 얻기 위해서는 1번문 열쇠1, 열쇠2가 필요하다. 1번문을 열기 위해서는 1번문 열쇠1, 열쇠2, 열쇠3이 모두 필요하다. 탈출을 하기 위해서는 1번 문을 통과해야 하고, 탈출 열쇠를 얻어야 한다. 탈출 시나리오는 다음과 같다. 1. 시작 2. 열쇠1 또는 열쇠2를 얻는다. 3. 남은 열쇠1 또는 열쇠2를 얻는다. 4. 열쇠1과 열쇠2를 통해 열쇠3을 얻는다. 5. 열쇠1, 열쇠2, 열쇠3을 이용해 1번 문을 통과한다. 6. 탈출 열쇠를 얻는다. 7. 탈출 이렇듯 열쇠..
[알고리즘] LCA(최소 공통 조상) (c++) LCA(Lowest Common Ancestor)란?LCA 알고리즘은 임의의 두 정점(u, v)에서 가장 가까운 공통 조상을 찾는 알고리즘이다.  아래 예시를 보면 쉽게 이해할 수 있을 것이다. 위와 같은 트리가 있을때 14, 16 정점의 LCA는 정점 1이다. 정점 14의 조상 정점들은 순서대로 9, 5, 2, 1이 있다. 정점 16의 조상 정점들은 순서대로 12 7, 3, 1이 있다.정점 14, 16이 함께 공유하는 가장 가까운 조상은 정점 1이 된다. 정점 8, 14의 LCA를 구하면 정점 2가 된다. 정점 8의 조상 정점들은 순서대로 4, 2, 1이 있다. 정점 14의 조상 정점들은 순서대로 9, 5, 2, 1이 있다.정점 8, 14이 함께 공유하는 가장 가까운 조상은 정점 2가 된다. 이번엔 정..
[운영체제] 프로세스와 스레드 운영체제를 공부할 때 반드시 만나게 되는 개념인 '프로세스(Process)'와 '스레드(Thread)'. 이 두 개념은 비슷하여 헤깔리기 쉽지만 큰 차이를 갖고 있다. 프로세스를 하나의 공장으로 생각한다면, 스레드는 일꾼이라 할 수 있다.스레드는 프로세스 안에서 각각 프로세스의 자원을 공유해 가며 작업한다. 프로세스(Process)란?실행 중인 프로그램의 인스턴스를 의미프로그램이 실행될 때 운영체제에 의해 프로세스가 생성되고, 운영체제에게 스케줄링, 종료 등의 관리를 받음. 프로그램 : 디스크에 저장된 정적인 파일 프로세스 : 메모리에서 실행되는 동적 엔터티 스레드(Thread)란?프로세스 내에서 실행되는 흐름 단위하나의 프로세스는 하나 이상의 스레드를 가질 수 있고, 이런 스레드들은 프로세스의 메모리를..
[자료구조] 연결 리스트(c++) 연결리스트(Linked-List)란? 하나의 노드가 다음 노드의 주소를 가리키어 서로 연결되어 있는 자료구조이다. 단방향 연결 리스트, 양방향 연결 리스트, 환형 연결 리스트 등의 구조가 있다. 배열(Array) vs 연결 리스트(Linked List) 비슷한 기능을 가진 배열이 있는데, 연결 리스트를 왜 사용하는 것일까? 배열과 연결 리스트를 비교하며 각각 어떤 특징이 있는 지 알아보자. 배열 연결 리스트 구조 선언 시 연속된 메모리 공간을 할당하고, 순차적으로 요소들이 저장 된다. 각 노드가 값과 다음 노드를 가리키는 포인터로 구성된다. 메모리 상에서 연속된 위치에 저장되지 않고, 동적으로 할당된다. 크기 초기화 할 때 고정된 메모리로 결정된다. 가변적으로 크기 조정이 가능하다. 삽입 및 삭제 중간에..