목록전체 글 (119)
이것저것
그래프를 코드로 표현하는 방법은 크게 두가지가 존재한다. 1) 인접행렬 (이차원 배열) 장점 구현이 간단하다 두 노드가 연결되어 있는지 알고싶을 때 O(1) 에 가능하다. 단점 공간을 많이 차지한다. 한 노드와 연결된 모든 노드를 알고 싶으면 O(V) (V : 노드의 개수) 모든 노드의 연결관계를 탐색하려면 O(V^2) 구현방법 int graph[100][100]; //양방향 그래프인 경우 graph[2][3]=1; graph[3][2]=1; 2) 인접리스트 (이차원 벡터) 실제로 연결된 노드들에 대한 정보만 저장한다. 장점 간선의 개수만큼만 메모리 차지 모든 노드의 연결 관계를 O(V) 에 탐색 가능하다. 단점 어떤 두 노드가 연결되어있는지 찾으려면 O(V) 구현방법 vector graph[100]; ..
(Graph도 일종의 자료구조이다.) 자료구조는 삽입, 삭제, 탐색이 가능하다. 그래프에서 삽입,삭제 작업은 그래프 구현을 통해, 탐색 작업은 DFS(+Backtracking),BFS를 통해 구현하다. 그래서 그래프란? 어떤 요소(=노드)들 사이의 연결관계(=간선)를 표현하기 위한 자료구조 노드와 노드를 연결하는 간선으로 이루어져 있다. 트리도 그래프의 일종 지도, 도로, 등 실생활에서의 많은 것을 그래프로 모델링 가능 그래프는 방향 그래프, 무방향(양방향) 그래프 두가지가 존재 연결 요소 (Connected component) 그래프는 모두 연결되어 있지 않을 수도 있다. 각각의 그룹을 연결 요소라고 부른다. 위는 두개의 연결 요소를 지닌 하나의 그래프 그래프 summary 노드와 노드를 연결하는 간선..
Browser Web Server에서 이동하며 쌍방향으로 통신하고 HTML 문서나 파일을 출력하는 GUI 기반의 응용 SW이다. 웹 브라우저는 대표적인 HTTP 사용자 에이전트의 하나이다. 즉, 브라우저는 웹 서버에 원하는 정보를 요청(Requset)를 하고 응답(Response) 받아 사용자에게 보여준다. 어떻게 요청을 보내나? URL 을 통해! (URL : 네트워크 상에서 자원이 어디 있는지를 알려주기 위한 규약) 요청 흐름 1) URL 해석 : URL 을 입력했을 때 브라우저에서 처음 하는 일은 URL 을 해석해 요청을 만드는 일 http://localhost:8080/index.html http - 프로토콜 localhost - Domain 8080 - 포트 번호 index.html - 파일의 위..
소프트파싱 vs 하드파싱 소프트파싱 : SQL을 캐시에서 찾아 곧바로 실행단계로 넘어가는 것 하드파싱 : 캐시에서 찾는데 실패해 최적화 및 로우 소스 생성 단계까지 모두 거치는 것 (캐시에서 찾으면 곧바로 실행 단계로 넘어갈 수 있음) Library Cache : SQL 파싱, 최적화, 로우 소스 생성 과정을 거쳐 생성한 내부 프로시저를 반복 재사용할 수 있도록 캐싱해 두는 메모리 공간 바인드 변수 라이브러리 캐시에서 SQL을 찾기 위해 사용하는 키 값은 'SQL문 그 자체' select * from emp where empno=7000; SELECT * FROM EMP WHERE EMPNO=7000; => 모두 다른 SQ 의미적으로는 같지만, 실행할 때 각각 최적화를 진행하고, 라이브러리 캐시에서 별도..
퀵정렬을 실제 문제푸는데 가장 많이 사용되는 정렬 알고리즘이다. 대부분 언어에서 정렬 라이브러리는 퀵 정렬이다. "기준 데이터를 설정하고 그 기준보다 큰 데이터와 작은 데이터의 위치를 바꾸면 어떨까?" 기준을 설정한 다음 큰 수와 작은 수를 교환한 이후 리스트를 반으로 나누는 방식으로 동작한다. Pivot이라는 개념이 등장 (Pivot = 기준) 기준을 어떻게 설정할 것인가? 가장 대표적인 분할 방식으로 호어 분할 방식이 있다. "리스트에서 첫 번째 데이터를 Pivot으로 정한다" 퀵 정렬의 시간 복잡도는 O(NlogN) (선택 정렬, 삽입 정렬에 비해 빠른 편이다.) (최악의 경우에는 시간 복잡도가 O(N^2) 이다.) - 데이터가 무작위로 입력되는 경우는 퀵 정렬은 빠르게 동작한다. - 데이터가 정렬..
"데이터를 하나씩 확인하며, 각 데이터를 적절한 위치에 삽입한다" 필요할 때만 위치를 바꾸면 된다. = 데이터가 거의 정렬 되어 있다면 비용 감소 삽입 정렬은 데이터가 적절한 위치에 들어가기 이전에, 그 앞까지의 데이터는 이미 정렬되어 있다고 가정한다. 위처럼 정렬이 이루어진 원소는 항상 정렬된 상태를 유지한다. 시간 복잡도 : O(N^2) 다만 배열이 거의 정렬되어 있는 경우, 매우 빠르게 동작 (최선의 경우 - O(N) )
(오름차순으로 정렬하는 경우) 가장 원시적인 방법으로 "매번 가장 작은 것을 선택한다" 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 swap 하고, 그 다음으로 작은 데이터를 선택해 앞에서 두번째 데이터와 swap 하는 과정을 반복 - N-1 만큼 가장 작은 수를 찾아서 맨 앞으로 보내야 한다. - 매번 가장 작은 수를 찾기 위해서 비교 연산이 필요 - 연산횟수 : N + (N-1) + .... + 2 => 근사치 : N(N+1)/2 => O(N^2) (선택 정렬을 이용하는 경우 데이터의 개수가 10,000개 정도 이상이면 정렬 속도 급격하게 느려진다)
1. FK 가 있는 곳을 연관 관계의 주인으로 정합니다. ex) 1:M 관계에서 항상 M쪽에 FK 존재하므로, FK가 있는 M을 연관관계의 주인으로 정한다. (1을 연관 관계의 주인으로 설정해도 괜찮지만 유지보수 측면에서 어렵고, 성능 문제가 발생 가능) 2. @Getter는 가급적 열어두고 @Setter는 꼭 필요한 경우에만 사용합니다. 3. Many To Many 관계의 사용을 지양합니다. Many To Many는 중간 엔티티로 매핑에서 사용 (Many To Many -> One To Many & Many To One으로 풀어내서 사용) 4. 값 타입(@Embeddable)은 변경 불가능하게 설계 @Setter를 제거하고, 생성자에서 값을 모두 초기화해서 변경 불가능한 클래스로 만든다. 5. 모든 연..