본문 바로가기

알고리즘

힙의 다른 응용: 우선순위 큐 priority queue 최대 우선순위 큐 (maximum priority queue)는 다음의 두 가지 연산을 지원하는 자료구조다. 큐는 먼저 들어간 데이터가 먼저 나오는 선입선출(first in first out) 방식이다.insert(x): 새로운 원소 x 삽입extract_max(): 최대값을 삭제하고 반환 최소 우선순위 큐는insert(x)extract_min() max heap을 이용하여 최대 우선순위 큐를 구현 어떤 값을 insert하려면 우선 complete binary tree는 유지하면서 마지막 리프에다 붙인다. 그러나 max heap property를 만족하지 않을 수도 있다. 그러므로 max heap이 되도록 조정이 필요하다. max-heap-insert(A,key): heap_size = heap_size..
힙 정렬 heap sort 최악의 경우 시간 복잡도 O(nlogn), 추가 배열이 불필요(메모리 사용이 준다), 이진 힙 자료구조 사용 힙의 정의complete binary tree이면서 heap property를 만족해야한다.완전 이진 트리는 리프 노드를 제외한 모든 노드의 자식이 최대 2개인 노드이다.왼쪽부터 차례로 노드를 채우는데 중간에 비어있는 노드가 있으면 안된다.max heap property는 부모 노드가 자식 노드보다 크거나 같은 것이다.min heap property는 부모 노드가 자식 노드보다 작거나 같은 것이다.힙의 높이는 logn이다. n이 8이면 높이는 3이다. 왼쪽부터 채우면서 노드의 자식이 최대 2개이기 때문이다. 힙은 일차원 배열로 표현 가능 : A[1...n]A[1]은 루트 노드A[i]의 부모 = A..
퀵 소트 quick sort 분할 : 배열을 다음과 같은 조건이 만족되도록 두 부분으로 나눈다.elements in lower parts
합병 정렬 merge sort 분할 정복 분할 : 해결하고자 하는 문제를 작은 크기의 동일한 문제들로 분할정복 : 각각의 작은 문제를 순환적으로 해결합병 : 작은 문제의 해를 합하여 원래 문제에 대한 해를 구함 ALGORITHMS 이 단어를 반으로 쪼개고 ALGOR ITHMS devideAGLOR HIMST recursively sort 각각 정렬한 뒤AGHILMORST merge 합병한다. 1,2,2,3,4,5,6,7 2,4,5,7 1,2,3,6 2,5 4,7 1,3 2,6 5 2 4 7 1 3 2 6 mergeSort(A,p,r): if p0 and len(R)>0: #L과 R에 원소가 남아있을 때 if L[0]>R[0]: #R의 값이 작다면 tmp.append(R[0]) #R을 먼저 tmp에 삽입 R.pop(0) #R의 첫번째 ..
기본적인 정렬 알고리즘 simple, slow - Bubble sort, Insertion sort, Selection sortfast - Quick sort, Merge sort, Heap sortO(N) - Radix sort selection sort29 10 14 37 13 중에서 가장 큰 값을 찾는다. 이 값을 맨 마지막 자리와 바꾼다. 맨 마지막 자리를 제외한 나머지 수 중에 가장 큰 수를 맨 뒤에 넣는다. 반복한다.data=[29,10,14,37,13] for i in range(4,0,-1): m = max(data[:i+1]) data[i],data[data.index(m)] = m,data[i] print(data)수행시간:for문은 n-1번 반복, 가장 큰 수를 찾기 위한 비교 횟수 n-1,n-2,n-3,...
멱집합 powerset 멱집합은 집합의 모든 부분집합이다. {a, b}가 있으면 {}, {a}, {b}, {a,b} 가 멱집합이다.원소 a를 하나 빼고 나머지 원소들로 부분집합 A를 만들고 a와 A를 합한 것, a가 없고 A만 있는 것을 찾아내면 된다. 원소가 있는지 없는지에 따라 트리를 만들면 저런 모양이 된다. 리프 노드를 보면 {}, {a}, {b}, {a,b}가 있으므로 멱집합이 완성된다. 왼쪽 가지와 오른쪽 가지를 include[k] = True, include[k] = False로 표현했다. True면 해당 인덱스의 원소가 있는 것이고 False면 해당 원소를 제외하고 부분 집합을 만드는 것이다. 계속 돌리다보면 공집합부터 모든 원소가 있는 집합이 만들어진다. include의 인덱스 i가 True라면 arr에서 해당..
N queens problem 백트래킹 n queens 문제는 체스판의 각 행마다 말을 하나씩 놓는데 이 말들이 같은 열과 같은 대각선상에 놓여있지 않아야 한다.상태공간트리를 만들어 조건이 맞는지 탐색해보는데 중간에 조건에 맞지 않으면 False를 리턴한다. False를 리턴하게 되면 이전 행으로 올라간다고 생각하면 되는데 그래서 Back Tracking이라고 부른다. 처음부터 마지막 행까지 가지 않아도 조건에 맞지 않다면 중간에 다시 올라온다. n=int(input('체스판의 가로 수 입력')) cols = [0 for i in range(n+1)] def promising(level): #유망성 따지기 for i in range(1,level): #첫 행부터 현재 행의 위의 행까지 if cols[level] == cols[i]:return..
Counting Cells In A Blob 각 픽셀은 background pixel(0)이거나 image pixel(1)이다.서로 연결된 image pixel들의 집합을 blob이라고 부른다.8방향으로 연결이 가능하다. 입력 2차원 grid[N][N], 하나의 좌표 x,y출력 blob의 크기, pixel이 blob에 속하지 않으면 0 현재 픽셀의 blob 크기를 세려면 픽셀이 1이어야한다. 그러므로 1이 아니라면 0을 리턴한다.픽셀이 1이면 1을 카운트하고 중복 카운트를 방지하기 위해 2를 대입한다.8방향으로 이웃한 픽셀에 대해 그 픽셀의 좌표를 인자로 갖는 함수를 재귀적으로 호출한다.s=[ [1,0,0,0,0,0,0,1], [0,1,1,0,0,1,0,0], [1,1,0,0,1,0,1,0], [0,0,0,0,0,1,0,0], [0,1,0,1,0,..