Adventure Time - Jake bogyoi's Dev note
본문 바로가기

전체 글91

복잡도(Big O) 줄이기 | 성능개선하는 방법들(mallloc()의 단점, std::move(), Sanity check, 배열복사, 증감연산자, call-by-value) | 좋은 코드란 무엇일까 좋은 코드란?성능, 안전함, 에러찾기쉬운, 관리쉬운, 중복x시간복잡도와 공간복잡도 고려하기.   Big O 예시)O( 2*(n+1) ) becomes O(n)O( n^3+n^2+1 ) becomes O(n^3)영향 적게 주는건(차수가 낮은 항) 그냥 제외하면 됨. Big O 계산 예시)아래와 같이 함수 호출을 하는 코드가 있다고 가정int f(int n){ if (n f(n)-> f(n-1) +f(n-1)-> f(n-2) + f(n-2) + f(n-2) + f(n-2)-> f(n-3) + f(n-3)+ f(n-3)+ f(n-3)+ f(n-3)+ f(n-3)+ f(n-3)+ f(n-3)-> . . .1, 2, 4, 8, ... 2^n -> 2^(n+1)-1 ->O(2^n) 이 된다. 성능 개선 방법들1. .. 2024. 1. 16.
이진탐색트리(Binary search tree,BST)의 시간복잡도 이진 탐색 트리 : 왼쪽자식은 root보다 항상 값이 적고, 오른쪽은 큰 값이 들어가게 되는 순서를 만족하는 것. 한번 입력이 되게 되면 자리를 바꾸지 않음. 주로 데이터 검색에 사용하며 탐색 속도를 개선할 수 있음. 그러나 맨 첫번째 항목이 어떤 항목이 삽입되느냐에 따라 이진탐색트리는 한쪽으로 쏠리는 불균형 현상이 일어날 수 있음. 지금 현재있는 것과 비교해서 왼쪽으로갈지 오른쪽으로 갈지 정함.(완전이진트리처럼 왼쪽부터 채우지 x) 그래서 최악의 경우 복잡도를 고려해 균형화 작업을 하는 것이 좋다. 균형화 : height difference의 절댓값이 1이하이도록 작업하는 것. 항목 균형화하지 않을 때 균형화할 때 탐색(search) -평균: O(log N) -최대: N/2 =>O(N) -평균: O(l.. 2024. 1. 11.
C++ 상속 멤버함수 상속되지않는 멤버함수 -생성자 -소멸자 :자식 클래스의 소멸자 호출되면 자동으로 부모 클래스의 소멸자가 호출. 명시적 호출이 필요없음. 따라서 자식 클래스의 소멸자는 자식클래스에서 정의된 변수에 대해서만 delete 수행 /* 정의하지않으면 디폴트 버전 생성됨 */ -복제 생성자 //포인터와 동적메모리 생성 기능이 사용되면 별도로 구현해야함 -대입 연산자 상속되는 멤버함수 -그 외 모두 생성자와 소멸자, 대입 연산자는 특정 클래스에 완전히 종속적이며 해당 클래스의 멤버에 대해서만 동작하기 때문에 자식 클래스는 이 함수들을 직접 사용할 필요가 없음. (대신 초기화 리스트에서는 호출 가능) 부모클래스의 클래스이름 :: 해당되는 생성자; 2024. 1. 8.
접근 지정자 protected 와 private의 차이점 private 상속 : 자식클래스는 부모클래스의 private member을 모두 상속받지만, 이를 접근하기 위해선 부모클래스의 public interface멤버 함수를 통해서만 접근이 가능하다. class Student: private Person { ... } -> 부모 클래스의 모든 멤버는 자식 클래스에서 private 멤버로 변경됨 protected 상속 : 자식/자손 일 경우 접근 가능하게 함.(제한적 허용) 구현에서 간편함과 편리함을 위해 자식클래스에만 제한적으로 허용함. 상속관계가 아닌 다른 클래스에서는 private처럼 관리.(직접접근x). 정보 은닉 규칙을 파괴한다는 의견도 있음. class Student: protected Person { ... } -> 부모 클래스의 public 멤버.. 2024. 1. 5.
call-by-pointer(return-by-pointer) vs call-by-reference 함수의 호출과 반환에서 포인터를 이용한 인수 전달 방법에 call-by-pointer(return-by-pointer)을 사용할 수 있다. 함수 호출 시 인수값을 복사하지않고, 인수가 저장된 곳의 주소(정보)를 전달하기 때문에 시간 부담이 적으며 메모리 공간 사용도 효율적임. 호출된 함수에서는 포인터를 사용하여 간접참조로 인수 내용을 직접 변경할 수 있음. call-by-reference(return-by-reference)방식의 경우 변수 이름을 직접 사용할 수 있어 &나 *와 같은 연산자를 별도로 사용하지 않아도 되는 장점이 있다. ( &: 변수나 함수의 주소를 찾아낼 때 사용, *: 포인터가 가리키고 있는 곳의 값을 읽거나 쓸 때 사용) /// call-by-pointer(return by valu.. 2024. 1. 3.
js의 변수 선언 방법(var, let, const)와 var, let의 차이 | 호이스팅|TDZ js에서 변수를 선언하는 방법에는 세가지가 있다. ( const, var, let) const는 변수값을 고정시키고 싶을 때 사용한다.(값을 수정하려고 하면 error가 난다. ) C를 배웠다면 알다시피 C언어에도 const가 있다. 물론 추가적으로 #define이나 enum도 있겠다. C언어에서의 const와 js에서의 const는 의미 면에서는 비슷한 듯하다. 대개 읽기만 하는 값(read-only)이나 절대 변하면 안되는 값을 const로 선언하는 편. 참고로 const는 초기값 없이는 선언이 불가하다. var: 선언 시 메모리에 담아둔다. (함수가 실행되기 전에 메모리에 담아뒀던 변수들을 스코프 범위(scope:변수가 적용되는 범위)의 최상단으로 끌어올린다.) 이런걸 호이스팅(hoisting)이라.. 2024. 1. 3.