전체 글 496

힙을 이용한 중앙값 구하기

힙을 이용한 중앙값 구하기중앙값 먼저 해보자 이번 게시글에서는머신 러닝, 데이터 분석 응용 프로그램에서 접할 수 있는 문제를 풀어보고자 한다. 어떤 소스로부터 한 번에 하나의 데이터를 연속적으로 받는다고 가정하자.그리고 매번 데이터를 받을 때마다지금까지 받은 데이터의 중앙값을 계산한다고 가정하겠다. 간단한 방법은 매번 데이터를 받을 때마다 모든 데이터를 정렬하고,그 중에서 가운데 원소를 반환하는 것이다.그러나 이러한 작업은 정렬 연산 때문에 O(N log N)의 시간 복잡도를 가진다.들어오는 데이터양이 늘어날수록 이 방식은 매우 많은 리소스를 사용하게 된다.여기서는 힙을 이용해서 최적화하는 방법을 알아보자! 1. 먼저 필요한 헤더 파일을 포함하고두 개의 힙을 사용해서 데이터를 저장할 것이다.하나는 최대힙..

C++ 함수 오버로딩과 C언어의 _Generic

C++ 함수 오버로딩은 C++만의 것이라고 보긴 어렵다. C에서도 함수 오버로딩과 비슷한 기능이 있다. _Generic 키워드를 사용하여 컴파일 시간에 인수의 형식을 기반으로 식을 선택하는 코드를 작성하면 된다. 인수의 형식을 호출할 함수가 선택되는 C++의 오버로딩과 유사하다. 여기서는 인수의 형식을 기반으로 평가할 식이 선택된다. 예를 들어 _Generic(42, int : "integer", char : "character", default : "unknown");은 42의 형식을 평가하고 목록에서 일치하는 형식 int를 검색한다. 이 형식을 찾아 "integer"를 반환한다. generic-selection: ( , ) _Generic assignment-expressionassoc-list as..

복사 생성자

복사 생성자복사 생성자란 무엇일까?Java에는 없는데 C++에는 있는 기능이다.그럼 C에는 있을까? 없다.OOP의 개념이 있어야 생성자가 있다.생성자라는 개념이 있으려면 OOP가 있어야 한다. 그럼 Java는 OOP인데 왜 복사 생성자가 없냐?클론 함수 ( = clone()) 이런 걸 사용해서 쓴다. 그럼 복사 생성자는 어떻게 만들까? 자신과 같은 클래스에 있는 개체를 매개변수로 받는 코드를 짜면 된다. 즉, 매개변수가 다른 개체 그것도나랑 똑같은 클래스에 속한 개체면 복사 생성자이다. // Vector.hclass Vector{public: Vector(const Vector& other);private: int mX; int mY;};// Vector.cppVector::Vector(const Vec..

구조체와 클래스의 차이

구조체와 클래스의 차이 중 가장 먼저 설명할 수 있는 것은기본 접근 권한이 다르다는 것이다. struct 는 기본적으로 public이고,class 는 기본적으로 private이다. 컴퓨터는 struct와 class을 구분할까?-> 어셈블리단에서는 이 둘의 차이가 있을까? 안난다.C에 있던 기능이 다른 언어에 있다면, 고급 엔지니어가 만든 기능이다. 그럼 컴퓨터는 struct를 알까?모른다. 그룹개념도 없다 따로따로 노는 건데 사실은,메모리 어디에 접근한다 일 뿐이지,클래스와 구조체는 거의 차이없이 돈다. 근데 컴파일러는 구분할까?구분한다.컴파일러 에러가 잡아내기 때문에컴파일러는 private와 pubilc의 차이점을 안다. 구조체에 관한 코딩표준(기본) C++에서는 구조체를 클래스처럼 쓸 수 있다.하지만..

3차원 벡터

3차원 벡터의 길이는 피타로가스의 정리를 두 번 적용해서 구할 수 있다.   벡터를 순전히 방향을 나타내는 용도로만 사용하는 경우벡터의 길이는 그닥 중요하지 않다.각 벡터의 성분을 벡터의 크기로 나누면 벡터가 정규화 된다.  내적접곱(dot product)라고도 부르는 내적(inner product)은 스칼라값을 내는 벡터 곱셈의 일종이다.결과가 스칼라라서 스칼라 곱이라고 부르기도 한다.  다른 말로 하면 내적은 대응되는 성분들의 곱의 합이다.내적의 정의만 봐서는 내적의 기하학적 의미가 분명하지 않는데,코사인 법칙을 적용해 보면 다음과 같은 관계를 찾아낼 수 있다.  여기서 θ는 0 따라서 두 벡터의 내적이 두 벡터 사이의 각도의 코사인을벡터 크기로 비례한 것임을 뜻한다. u와 v 둘 다 단위벡터일 때 ..

new와 malloc의 차이

C++ new 및 delete는 연산자이다.C스타일 malloc은 라이브러리에 내장된 함수이다. 할당 연산자인 new의 기본 형식은 다음과 같다.포인터 = new 타입 [(초기값)]; 즉, 차이점은 다음과 같다. 1. malloc/free는 라이브러리가 제공하는 함수인데 비해new/delete는 언어가 제공하는 연산자이다.그래서 별도의 헤더 파일을 포함할 필요없이 언제든지 사용할 수 있다.이 연산자를 쓴다고 해서 프로그램이 커지는 것도 아니다.연산자이기 때문에 사용자 정의 타입에 대해 오버로딩 할 수도 있다. 사용자 정의 타입 오버로당 예시// microsoft 출저class MyClass{public: void * operator new[] (size_t) { return 0; } ..

이산 수학 - 논리와 명제

추론(argument) 란, 주어진 명제가 참인 것을 바탕으로 새로운 명제가 참이 되는 것을 유도해내는 과정이다. 전제(premise)란, 추론 과정에서 주어진 명제들이다. ex) p₁,p₂,p₃ .... pn 명제에는 순서가 그렇게 중요하지 않다. pn-3 ... pn = q 결과 유도도 동일하다. 결론(conclusion)이란, 추론 과정에서 새롭게 유도된 명제이다. 추론은 유효 추론, 허위 추론 두 가지로 나눌 수 있다. 유효 추론 (valid argument) : 전제가 참(T)이고 결론도 참(T)인 추론 허위 추론 (fallacious argument) : 결론이 거짓(F)인 추론 유효 추론 / 허위 추론의 여부는 진리표를 이용하거나 여러 추론 법칙을 이용하여 증명할 수 있다. 이 외에도 추론 ..

Pain Point C++에서 델리게이트같은 함수 만들기

C++에서 델리게이트처럼 이용하려면? 던전 맵에 입장할 때, 카메라와 플레이어가 위에서 아래로 떨어지는 효과를 구현하기 위해, DungeonLevel 클래스는 던전 레벨로 전환하는 순간을 감지해야 한다. 이를 위해 DungeonLevel 클래스의 특정 함수를 외부에서 호출하는 방식으로 전환 시점을 처리할 수 있다. 이러한 구현을 위해 UE5에서 사용했던 델리게이트 방식이 떠올랐다. 이를 적용하기 위해 DelegateManager 클래스를 별도로 만들었다. 구현 방식 DungeonLevel의 EntranceDungeon 멤버 함수를 람다 표현식을 사용하여 DelegateManager에 바인딩했다. 이렇게 함으로써 델리게이트처럼 다른 클래스에서도 DungeonLevel의 함수를 호출할 수 있는 구조를 만들었..

힙은 다음과 같은 시간 복잡도를 만족해야 한다. O(1) : 최대 원소에 즉각적으로 접근할 수 있어야 한다.O(log N) : 원소 삽입에 대한 시간 복잡도O(log N) : 최대 원소 삭제에 대한 시간 복잡도 원소 삽입 또는 삭제에 대하 O(log N)의 시간 복잡도를 만족하기 위해 트리 구조를 사용해야 한다.이 경우 완전 이진 트리를 사용해야 한다.완전 이진 트리는 마지막 레벨의 노드를 제외하고 모두 두 개의 자식 노드가 있고,마지막 레벨에서는 왼쪽 부터 차례대로 노드가 있는 트리이다.  완전 이진 트리는 새로운 원소를 트리의 마지막 레벨에 추가하는 방식으로 구성할 수 있다.만약 마지막 레벨의 모든 노드가 채워져 있다면 새로운 레벨을 하나 더 만들고,맨 왼쪽에 위치에 노드를 추가한다.완전 이진 트리는..