공부 121

마스터 정리(Master Method), Big-Oh, Theta, Omega Notation

시간 복잡도가 점화식으로 정의될 때, 마스터 정리를 이용해서 시간 복잡도를 계산할 수 있다. 마스터 정리와 마스터 정리의 사용 조건에 대해 간단히 정리해보자. 마스터 정리 조건 시간 복잡도 T(n) = aT(n/b) + f(n)으로 정의될 때, f(n)이 다항식(polynomial function)이어야 한다 a >=1 && b >=1 인 양의 실수이어야 한다. 그 말은 즉 문제를 분할 했을 때 더 작은 문제가 되어야 한다는 의미이다. 만약 b가 1보다 작은 양의 실수면 문제를 분할했을 때 더 큰 문제가 되므로 안된다 정규 조건(Regularity Condition)을 의미하는 a*f(n/b)

공부/Algorithm 2021.08.07

AVL Tree

지난번에 작성한 Binary Search Tree에 이어서 자가 균형 트리의 한 종류인 AVL(Adelson-Velsky and Landis) Tree를 작성해보았다. 자가 균형 트리란 편향 트리(skewed tree)가 되지 않도록, 트리의 균형을 스스로 맞추는 트리이다. 당연히 편향 트리가 되면 트리로 탐색을 하는데 비효율적이고 탐색, 삽입의 평균적인 시간 복잡도 logN을 보장하지 못한다. 구현한 부분에 있어서 특징은, 코드에서 볼 수 있듯이, Rebalance함수가 재귀적으로 계속 부모 노드를 타고 올라가면서 호출된다는 점이다. insert함수에서는 새로 삽입된 NewNode를 타고 올라가고, erase에서는 지우는 동작이 끝나고 지운 노드를 대체할 노드(LeftMax or RightMin)의 부..

C/C++ 함수 포인터를 반환하는 함수

Linux에서 제공되는 signal 함수(시그널 등록 함수라고 표현하기도 함)를 보면 특이한 형태를 보인다. 함수 포인터는 알고 있었지만, '함수 포인터를 리턴하는 함수'는 처음 보는 것 같아서 따로 정리하려고 한다. 복잡한 것은 아니고 정해진 syntax가 있기 때문에 규칙만 알면 어렵지 않다. 함수 포인터를 리턴하는 함수를 선언하려면 아래와 같은 규칙을 따르면 된다. 함수포인터반환값자료형 (*함수이름(매개변수자료형 매개변수))(함수포인터매개변수자료형1, 함수포인터매개변수자료형2) { } signal.h에 포함된 signal함수를 보자 void (*signal( int sig, void (*handler) (int))) (int); 그렇다면 위의 함수는 아래와 같은 의미이다. 함수 이름은 signal이..

공부/C || C++ 2021.08.06

이진 탐색 트리(Binary Search Tree), 화살표 연산자 오버로딩(-> operator overloading, arrow operator overloading)

이진 탐색 트리 규칙 : 작으면 왼쪽, 크면 오른쪽 전위 순회(preorder traversal) : root -> left -> right 순서 중위 순회(inorder traversal) : left -> root -> right 순서 후위 순회(postorder traversal) : left -> right -> root 순서 완전 이진 트리(Complete binary tree) : 마지막 레벨 빼고 모두 차있는 경우 포화 이진 트리(perfect binary tree) : 마지막 레벨까지 모두 차있는 경우 편향 트리(skewed binary tree) : 한쪽으로만 자라는 tree. 예를 들어 아래와 같은 tree insert, find는 현재 노드보다 큰지, 작은지에 따라 좌우 케이스로 나눠..

꼬리 재귀(Tail recursion)

재귀 함수가 반복문으로 짠 것 보다는 가독성이 좋지만 느릴 수 있다는 것은 이미 알고 있다. 하지만 이 재귀 함수의 단점을 어느 정도 커버할 수 있는 꼬리 재귀(Tail recursion)란 것이 있는데, 이것에 대해 간단히 정리해보자. 우선 꼬리 재귀란 재귀 함수이긴 하지만 재귀 함수 호출 이후에 연산을 추가적으로 하지 않는 재귀 함수 형태를 의미한다. 예를 들어서 factorial함수를 재귀 함수로 짜보면 int factorial(int Num) { if(Num == 0) return 1; return Num * factorial(Num - 1); } 아마 대부분 factorial함수를 재귀함수로 짤 때 이런식으로 만들 것이다. 하지만 보이다시피 factorial(Num - 1)을 호출하고 retur..

공부/그 외 2021.08.04

WINAPI 시작을 위한 필수 함수들

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) 콘솔 프로그램에서 main처럼 WINAPI에서의 main(진입점)이라고 보면 된다. 여기서 APIENTRY는 __stdcall 함수 호출규약을 의미하는데 #define으로 정의되어 있다. #define CALLBACK __stdcall #define WINAPI __stdcall #define WINAPIV __cdecl #define APIENTRY WINAPI #define APIPRIVATE __stdcall #define PASCAL __stdcall WINAPI, APIENTR..

공부/WINAPI 2021.08.03

WINAPI 시작하기 - 초기 세팅

visual studio 2019에서 새 프로젝트 만들기 > windows 데스크톱 마법사 > 데스크톱 어플리케이션 & 빈 프로젝트로 생성 후 솔루션 하위에 있는 프로젝트 제거 > 프로젝트 파일이 존재하는 경로로 가서 Bin, include 폴더 생성 > 원래 존재하던 프로젝트 파일을 include에 모두 넣어주기 이렇게 하는 이유는 프로그래밍할 때 생기는 코드들은 모두 include에 넣어서 관리하고 결과적으로 만들어지는 실행파일들은 Bin폴더에 따로 보관하기 위해서 이렇게 세팅해준다. 그 후에 솔루션 우클릭 > 추가 > 기존 프로젝트 > 아까 include에 넣어준 프로젝트 열기 그리고 실행파일이 만들어지는 위치를 우리가 아까 만든 Bin폴더 안으로 설정해야 한다(기존에는 솔루션 명의 폴더 안에 De..

공부/WINAPI 2021.08.02