본문 바로가기

전체 글

(79)
[DB] 트랜잭션 (Transaction) 트랜잭션이 뭘까? 이게 그렇게 중요한 건가? 궁금증을 해결하기 위해 이 포스팅을 쓰게 됐습니다. 1. 트랜잭션이란?(What is Transaction?) · 데이터베이스의 상태를 변환시키는 하나의 논리적인 작업 단위를 구성하는 연산들의 집합이다. 도대체 트랜잭션이 뭘까요?? 위의 형식적인 정의는 읽을 수록 헷갈리고 무슨 말하는지도 몰라서 간단하게 정리해보겠습니다. 간단하게 말해서 아래의 SQL 질의문으로 DB 에 접근하는 것을 의미합니다. ● SELECT ● DELETE ● UPDATE ● INSERT 너무 간단하지 않나요? 저것만 하면 트랜잭션을 한거라구요? 당연히 아닙니다. 트랜잭션은 하나의 SQL 문이 아니라 많은 SQL 질의문을 묶어 관리자나 개발자가 하나의 단위로 정의한 것입니다. 게시판을 예..
[Algorithm] 단절점을 찾는 알고리즘과 단절선을 찾는 알고리즘이 미세하게 다른 이유 단절점과 단절선의 개념에 대해서는 스킵하겠습니다. 추후에 시간이 되면 올리겠습니다 ~ 본론으로 들어가서 단절점을 찾는 알고리즘과 단절선을 찾는 알고리즘이 왜 미세하게 다른 것일까요? 처음 단절점의 개념을 접하고나서 여러 블로그를 찾아봤었는데 단절선은 단절점 알고리즘에서 약간 변형만 하면 된다고 써놓고 코드만 올려놓은 블로그들이 대다수였습니다;;; 저같은 단절점 초보에게는 너무나도 매정한 설명이었습니다. 결론적으로 말하면 제가 이 포스팅을 하는 이유는 왜 단절선을 찾을 때는 부모 정점로 가는 간선을 제외하고 찾아야 하는가? 였습니다. 단절점을 찾을 때는 시작 정점에서 DST를 만들어 가면서 한 정점에서 부모 정점을 포함하여 뻗어나갈 수 있는 정점의 번호 중 가장 작은 값을 리턴시켜주는 알고리즘을 사용했습니..
[Algorithm] 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm) 플로이드 워셜 알고리즘은 다익스트라 알고리즘과 벨만포드 알고리즘과는 다르게 모든 정점사이의 최단 경로를 한 번에 구하는 알고리즘 입니다. 다익스트라와 벨만포드 알고리즘도 정점의 갯수번 만큼 돌리게 되면 모두 구할 수 있습니다. - 플로이드 워셜 알고리즘 기본적인 아이디어는 A->B로 가는 경로는 A->K->B(K는 경유지) K라는 경유지를 거쳐서 무조건 가게 된다는 생각이다. K는 그래프 상에 존재하는 모든 정점이 될 수 있다. 궁극적으로 A에서 K라는 경유지를 거쳐 B로 갈 수 있는 최단 거리를 구하는 것이다. D[i][j] 를 i에서 출발해 j까지 가는 최단 거리라고 했을 때, 다음 점화식을 만족한다. D[i][j] = min(D[i][j], D[i][k] + D[k][j]) https://www.a..
[Algorithm] 벨만-포드 알고리즘(Bellman-Ford Algorithm) 벨만 포드 알고리즘은 다익스트라 알고리즘과 다르게 음수 가중치가 있는 그래프에서도 모든 정점으로 가는 최단 거리를 찾을 수 있게 해줍니다. 하나의 출발점에서 출발하여 모든 지점으로 가는 최단 거리를 알 수 있습니다. 1. 벨만 포드 알고리즘 기본 아이디어는 그래프를 연결하고 있는 Edge를 기준으로 모든 정점으로 가는 최단 거리를 찾는 것입니다. 다익스트라가 정점 중심으로 최단 경로를 찾았다면 벨만 포드 알고리즘에서는 Edge들을 중심으로 찾습니다. 정점의 갯수를 V라 할 때, 한 정점에서 모든 정점을 방문할 수 있으려면 적어도 V-1번 방문해야 모든 정점을 방문할 수 있습니다. 따라서 모든 Edge들을 V-1번 보면서 각 정점의 최단 거리를 찾습니다. 다만 주의할 점은 만약 처음 D->C로가는 가중치 ..
[Algorithm] 다익스트라 알고리즘 (Dijkstra algorithm) 다익스트라 알고리즘은 최단경로를 탐색하는 알고리즘이며, 2차원 배열을 이용하여 구현시 O(N^2)의 시간복잡도를 가지고 힙(Heap)을 이용하여 구현하면 O(ElogN) 시간안에 탐색할 수 있는 알고리즘입니다. 다익스트라 알고리즘은 한 지점(S)에서 목적지 지점(E)로 이동할 수 있는 최단 경로를 탐색할 수 있으므로 단일 출발, 단일 도착 최단경로 문제에 활용될 수 있습니다. 단, 음수 가중치를 가지는 그래프에서는 사용할 수 없다는게 단점입니다. 왜 그런지는 잠시 뒤에 알아보겠습니다. 1. 다익스트라 알고리즘 시작점 S 에서 출발해 연결되어 있는 간선을 모두 방문한 뒤 해당 노드에 있는 값(경로 값, 초기 값은 무한대)보다 작으면 갱신시켜 줍니다. 그 다음 연결되어 있는 Edge 중에서 현재 가중치와 더..
[Algorithm] 최소 공통 조상 LCA (Lowest Common Ancestor) 최소 공통 조상이란? 최소 공통 조상(LCA)란 두 노드가 트리에서 두 노드를 포함하여 조상을 따라 거슬러 올라갈때 처음 공통으로 만나게 되는 정점이다. 아래 그림에서 5와 8의 LCA 는 바로 1이다. 그럼 어떻게 임의의 두 노드에 대해서 처음으로 같이 만나는 조상을 찾을 수 있을까? 처음으로 생각해 볼 수 있는 방법은 서로 만날 때까지 부모 노드를 따라서 두 노드를 옮겨 보는 것이다. 두 노드의 높이가 다르다면 높이를 맞춰주고 나서 하나씩 올려본다면 트리의 깊이를 H 라했을 때 찾는데 O(H)가 되고 최악의 경우 O(N) 의 시간을 가지게 된다. 더 빠르고 효율적으로 하는 방법은 없을까? DP 배열을 이용해서 O(logN) 시간에 구할 수 있다. 만약 두 노드의 15번째 조상이 서로 다르다면 1,2,..
[Algorithm] 인덱스 트리(Indexed Tree) 구간 합을 구하는 트리의 종류로 인덱스 트리, 세그먼트 트리, 펜윅 트리가 있다. 세그먼트 트리는 인덱스 트리가 포함하고 있는 한 종류이다. 세그먼트 트리로 풀 수 있는 문제는 인덱스 트리로 모두 풀 수 있다. 인덱스 트리란 ? 이진 트리의 한 종류로서 구간 합을 구하는데 쓰이는 자료구조. 예를 들어, 배열 A에 수열이 들어있고 구간 S-E 가 주어졌을때 ① A[S] - A[E] 의 구간합을 구하고 ② 구한 뒤 특정 A[i]번째 원소가 다른 숫자로 바뀐다. ①② 번 작업을 반복하는 일이 있을 때 인덱스 트리를 쓰게 된다. 만약 1,2,3,4 라는 수열이 배열에 들어있다고 하면 수의 갯수를 모두 리프노드에 넣을 수 있을만큼의 배열을 잡아야한다. 아래 그림에서 4,5,6,7 번에 1,2,3,4 가 들어가면 ..
[OS] 페이지 부재(page fault)와 가상기억장치의 원리 1. 가상기억장치의 필요성 가상기억장치가 있는 이유가 뭘까? 잠시 운영체제가 메모리를 어떻게 할당하는지 알아볼 필요가 있다. 운영체제는 여러 프로그램이 동시에 수행되는 시분할(time sharing) 환경에서 한정된 메모리 공간을 여러 프로그램이 조금씩 나누어 사용한다. 이 과정에서 운영체제는 모든 프로그램들에게 똑같은 메모리 크기를 할당하는 것보다는 몇몇 프로그램들에게 집중적으로 메모리를 할당하고 프로그램 수행 후 메모리를 회수하여 다른 프로그램들에게 할당하는 방식을 사용한다. 이유는 ①빠른 프로세스의 수행 ②프로그램마다 최소한 확보해야하는 메모리의 크기가 존재하기 때문이다. 프로그램이 실행되기 전에 그 프로세스의 주소 공간 전체가 메모리에 올라와 있어야 하는 것은 아니다. 따라서, 운영체제는 CPU ..