2588번: 곱셈

첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.

www.acmicpc.net

문제

  세 자릿수 곱셈에서 (3), (4), (5), (6) 위치에 들어갈 값을 출력

 

입력

  첫째 줄에는 (1)의 위치에 들어갈 세 자리 자연수, 둘째 줄에 (2)의 위치에 들어갈 세 자리 자연수가 주어진다.

 

출력

  첫째 줄부터 넷째 줄 까지 차례대로 (3), (4), (5), (6)의 값을 출력

 

예제 입력

472
385

예제 출력

2360
3776
1416
181720

 


 

코드

1. 입력값을 문자열로 처리하는 경우

import java.util.*;

public class Main {
	public static void main(String[] args) {
		String num1, num2;
		int sum, pos;
	
		Scanner sc = new Scanner(System.in);
		
		num1 = sc.nextLine();
		num2 = sc.nextLine();
		
		for (int i = 2 ; i >= 0 ; i--) {
			sum = 0;
			pos = 1;
			for (int j = 2 ; j >= 0 ; j--) {
				sum += Character.getNumericValue(num1.charAt(j)) * Character.getNumericValue(num2.charAt(i)) * pos;
				pos *= 10;
			}
			System.out.println(sum);
		}
		System.out.println(Integer.parseInt(num1) * Integer.parseInt(num2));
		sc.close();
	}
}

처음에는 배열을 쓰지 않으면서 각 자리를 사용해야 하므로 문자열로 처리하는 게 좋다고 생각했다.

이중 ``for``문에서 한 단계씩 계산하는 과정은 우리가 일반적으로 수학식을 계산하는 과정과 동일하다.

 

  계산과정

  1. 숫자 2개를 문자열로 받은 다음 ``charAt``으로 한 자리씩 추출한다.
  2. ``getNumericValue()``로 각 위치의 자리를 숫자 변환한 뒤 서로 계산한다.
  3. 2의 결과값에 가중치(pos)를 곱해서 더한다.
    ``pos``는 10진수의 가중치 값을 곱해주는 변수이다(1의 자리, 10의 자리, 100의 자리수이므로)

 

 

 

2. 입력값을 숫자로 처리하는 경우

import java.util.*;

public class Main {
	public static void main(String[] args) {
		int num1, num2, sum;
	
		Scanner sc = new Scanner(System.in);
		
		num1 = sc.nextInt();
		num2 = sc.nextInt();
		
		System.out.println(num1 * (num2 % 10));
		System.out.println(num1 * ((num2 / 10) % 10));
		System.out.println(num1 * (num2 / 100));
		System.out.println(num1 * num2);
		
		sc.close();
	}
}

위의 코드도 문자열로 바꿀 수는 있지만 로직의 차이가 있어서 정리했다.

예를 들어 ``472 * 5``인 경우 1번 코드는 ``((2 * 5) * 1) + ((7 * 5) * 10) + ((4 * 5) * 100) = 2360``이여서 ``for``문에서 3번 연산을 하는 반면에 2번 코드에서는 ``472 * 5 = 2360``으로 연산을 한 번에 끝내기 때문에 훨씬 효율적이다.

 

 

 

'기타 > 백준' 카테고리의 다른 글

[백준][Java, 1000] A + B  (0) 2021.09.14
 

1000번: A+B

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

문제

  두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

 

입력

  첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

 

출력

  첫째 줄에 A+B를 출력한다.

 

예제 입력

1 2

예제 출력

3

 


 

코드

import java.util.*;

public class Main {
	public static void main(String[] args) {
		int a, b;
		
		Scanner sc = new Scanner(System.in);
		
		a = sc.nextInt();
		b = sc.nextInt();
		
		System.out.printf("%d", a + b);
		sc.close();
	}
}

풀이는 간단하다.

 

알게 된 점

println

  • 문자열과 숫자를 처리할 경우 문자열이 나온 이후는 전부 문자열 덧셈(덧붙이기) 처리됨
    ``System.out.println(2 + 1 + "d" + 3 + 4);``  → 3d34
  • 중간에 계산 값을 넣어주려면 괄호로 묶어주면 된다.
    ``System.out.println("결과는 " + (1 + 2) + "입니다.");``  → 결과는 3입니다.

 

Scanner

  • ``Scanner``로 입력값을 받는 경우 가변 인자처럼 처리된다.
    nextInt()함수만 그런 건지 모르겠는데 입력값이 안 들어오면 프로그램이 안 끝난다(대기함)
    // 테스트 코드
    // 입력값의 개수에 따라 결과가 어떻게 달라지는지 확인하면 된다.
    import java.util.*;
    
    public class Main {
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		
    		System.out.println("결과는" + (sc.nextInt() + sc.nextInt()) + "입니다");
    		sc.nextInt();
    		sc.nextInt();
    		sc.nextInt();
    		sc.nextInt();
    		System.out.println("끝");
    		sc.nextInt();
    		System.out.println("진짜끝");
    		sc.close();
    	}
    }

 

 

 

'기타 > 백준' 카테고리의 다른 글

[백준][Java, 2588] 곱셈  (1) 2021.09.17

 

 

공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

 

그래프(graph)

  • 객체 사이의 연결 관계를 표현할 수 있는 자료구조
  • 정점(vertex)과 간선(edge)들의 유한 집합

 

 

용어 정리

  • 정점 : 여러 가지 특성을 가질 수 있는 객체를 의미
    ex) V(G) : 그래프 G의 정점들의 집합
  • 정점의 차수(degree) : 인접 정점의 개수
    인접 정점(adjacent vertex) : 간선에 의해 직접 연결된 정점
  • 간선 : 링크(link)라고도 한다. 간선의 종류에 따라 무방향 그래프와 방향 그래프로 구분된다.
    ex) E(G) : 그래프 G의 간선들의 집합
    - 브리지(bridge) : 제거하면 정점과의 연결이 끊어지는 간선

  • 단순 경로(simple path) : 반복되는 간선이 없는 경로
  • 사이클(cycle) : 시작 정점과 종료 정점이 동일한 단순 경로

 

 

그래프의 종류

  • 무방향 그래프(undirected graph) : 간선이 양방향으로 갈 수 있는 그래프
     ex) (A, B) : 정점 A와 정점 B를 연결하는 간선.
           (A, B) == (B, A)
    ``무방향 그래프의 모든 정점의 차수합 == 간선 * 2`` (간선이 두 개의 정점에 인접하기 때문)
  • 방향 그래프(directed graph) : 간선에 방향성이 존재하는 그래프. 간선은 한쪽 방향으로만 갈 수 있다.
     ex) <A, B> : 정점 A에서 정점 B로만 갈 수 있는 간선
           <A, B> != <B, A>
    - 진입 차수(in-degree) : 외부에서 오는 간선의 개수
    - 진출 차수(out-degree) : 외부로 향하는 간선의 개수
  • 가중치 그래프(weighted graph), 네트워크(network) : 간선에 비용이나 가중치가 할당된 그래프
  • 부분 그래프(subgraph) : 어떤 그래프의 정점의 일부와 간선의 일부로 이뤄진 그래프. V(S)⊆V(G), E(S)⊆E(G)를 만족시키는 그래프이다.
  • 연결 그래프(connected graph) : 모든 정점 쌍에 대하여 항상 경로가 존재하는 무방향 그래프
       + 트리는 사이클을 가지지 않는 연결 그래프이다.
    - 비연결 그래프(unconnected graph)
  • 완전 그래프(complete graph) : 그래프에 속해있는 모든 정점이 서로 연결되어있는 그래프
    그래프 정점의 수가 n인 경우 하나의 정점은 n - 1개의 다른 정점으로 연결되므로 간선의 수는 $\frac{n * (n - 1)}{2}$이 된다.

 

 

그래프의 연산

객체 : 정점의 집합과 간선의 집합
연산 :
    create_graph() ::= 그래프 생성
    init(g) ::= 그래프 g를 초기화
    insert_vertex(g, v) ::= 그래프 g에 정점 v를 삽입
    insert_edge(g, u, v) ::= 그래프 g에 간선 (u, v)를 삽입
    delete_vertex(g, v) ::= 그래프 g의 정점 v를 삭제
    delete_edge(g, u, v) ::= 그래프 g의 간선 (u, v)를 삭제
    is_empty(g) ::= 그래프 g가 공백 상태인지 검사
    adjacent(v) ::= 정점 v에 인접한 정점들의 리스트 반환
    destroy_graph(g) ::= 그래프 g를 제거

 

 

그래프 구현 방법

  1. 인접 행렬(adjacency matrix) : 2차원 배열을 이용
    - 시간 복잡도
       * 두 정점의 간선 존재 여부 : $O(1)$
          ex) 정점 u와 정점 v를 연결하는 간선 : ``M[u][v]``
       * 정점의 차수 : $O(n)$ 인접 행렬의 행이나 열을 보면 됨
       * 모든 간선의 수 : $O(n^2)$ 인접 행렬 전체를 봐야 하기 때문
    - n개의 정점을 가지는 그래프를 표현하기 위해서는 항상 $n^2$개의 메모리 공간이 필요
    - 간선이 많이 존재하는 밀집 그래프(dense graph)를 표현할 때는 적합하나 간선이 적은 희소 그래프(sparse graph)에는 메모리 낭비가 큼
  2. 인접 리스트(adjacency list) : 연결 리스트를 이용
    - 정점의 개수만큼 포인터 배열이 필요

 

 

그래프 탐색

  1. 깊이 우선 탐색(DFS : depth first search)
    - 구현 방법

       1) 순환 호출 이용
       2) 명시적인 스택을 사용
    - 시간 복잡도 (정점의 수가 n이고 간선의 수가 e인 그래프인 경우)
       * 인접 리스트로 표현되어 있는 경우 : $O(n + e)$
       * 인접 행렬로 표현되어 있는 경우 : $O(n^2)$
  2. 너비 우선 탐색(BFS : breath first search) : 시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문하는 순회 방법
      - 시간 복잡도
        * 인접 리스트로 표현되어 있는 경우 : $O(n + e)$
        * 인접 행렬로 표현되어 있는 경우 : $O(n^2)$ 

 

 

 

 

 


신장 트리(spanning tree)

  • 그래프 내의 모든 정점을 포함하는 트리(그래프의 최소 연결 부분 그래프이다.)
  • 모든 정점들이 연결되어 있어야 한다.
  • 사이클을 포함해서는 안된다.
  • 정점이 n개일 때 (n - 1)개의 간선으로 연결된다.
  • 최소 비용 신장 트리(MST: minimum spanning tree) : 신장 트리 중에서 사용된 간선들의 가중치 합이 최소인 신장 트리

 

 

최소비용 신장 트리를 구하는 알고리즘

  결과는 두 방법 모두 동일하다. 희소 그래프를 대상으로 한 경우에는 Kruskal의 알고리즘, 밀집 그래프의 경우에는 Prim의 알고리즘이 더 효율적이다.

  1. Kruskal (간선 기반 알고리즘) : 탐욕적인 방법을 이용
    • 탐욕적인 방법(greedy method) : 매 순간 가장 좋다고 생각되는 것을 선택함으로써 최종 답에 도달하는 방식
    • 시간 복잡도 : union-find 알고리즘을 쓰면 $|e|log_2|e|$ (간선들을 정렬하는 시간에 좌우되기 때문)
    • union-find 알고리즘
      - 간선의 양끝 정점이 같은 집합에 속해있는지 검사하는 알고리즘(같은 집합이면 간선을 추가할 경우 사이클이 형성됨)
         ex) ``union(x, y)`` : 원소 x와 y가 속해있는 집합을 입력으로 받아 2개의 합집합을 만듦

               ``find(x)`` : 원소 x가 속해있는 집합을 반환
  2. Prim (정점 기반 알고리즘) : 시작 정점부터 신장 트리 집합을 단계적으로 확장해나가는 방법. 간선이 n - 1개가 될 때까지 반복하며, 앞 단계에서 만들어진 신장 트리 집합에 인접한 정점들 중에서 최저 간선으로 연결된 정점을 선택하여 트리를 확장한다.
    • 시간 복잡도 : $O(n^2)$

 

 

최단 경로 알고리즘

   최단 경로(shortest path)  : 네트워크 안의 특정한 정점 두 개를 연결하는 경로 중에서 간선들의 가중치의 합이 최소가 되는 경로

  1. Dijkstra : 하나의 시작 정점으로부터 다른 모든 정점까지의 최단 경로를 구하는 알고리즘. 최단 경로는 경로의 길이 순으로 구해진다.
    • 시간 복잡도 : $O(n^2)$
  2. Floyd : 그래프에 존재하는 모든 정점 사이의 최단 경로를 한 번에 모두 찾아주는 알고리즘
    • 시간 복잡도 : $O(n^3)$

 

 

위상 정렬

  • 위상 정렬(topological sort) : 방향 그래프에 존재하는 각 정점들의 선행 순서를 위배하지 않으면서 모든 정점을 나열하는 것. 하나의 그래프에는 여러 개의 위상 순서가 존재할 수 있다.
  • 위상 순서(topological order) : 위상 정렬 과정에서 선택되는 정점의 순서

 

 

 

 

 

공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

 

우선순위 큐(priority queue)

  • 큐에 우선순위의 개념을 도입한 자료구조
  • 데이터들은 우선순위를 가지고 있고, 우선순위가 높은 데이터가 먼저 나가게 된다.
  • 우선순위에 따라 스택이나 큐처럼 동작하기도 한다.

 

우선순위 큐 연산

객체 : n개의 element형의 우선 순위를 가진 요소들의 모임
연산 :
    create() ::= 우선순위 큐 생성
    init(q) ::= 우선순위 큐 q를 초기화
    is_empty(q) ::= 우선순위 큐 q가 비어있는지 검사
    is_full(q) ::= 우선순위 큐 q가 포화상태인지 검사
    insert(q, x) ::= 우선순위 큐 q에 요소 x를 추가
    delete(q) ::= 우선순위 큐로부터 가장 우선순위가 높은 요소를 삭제하고 해당 요소 반환
    find(q) ::= 우선순위가 가장 높은 요소를 반환

 

 

 

우선순위 큐 구현 방법

  1. 배열을 이용
    - 정렬된 배열을 사용하는 경우
    - 정렬되지 X 배열을 사용하는 경우
  2. 연결 리스트를 이용
    - 정렬된 연결 리스트를 사용하는 경우
    - 정렬되지 않은 연결 리스트를 사용하는 경우
  3. 힙(heap)을 이용

 

 

각 구현 방법에 따른 시간 복잡도

자료 구조 삽입 연산 삭제 연산
정렬된 배열 이용 $O(n)$ $O(1)$
정렬되지 않은 배열 이용 $O(1)$ $O(n)$
우선순위가 높은 요소를 찾아야하기 때문 
정렬된 연결 리스트를 이용 $O(n)$
우선순위가 높은 요소를 찾아야 하기 때문
$O(1)$
정렬되지 않은 연결리스트 이용 $O(1)$ (처음에 삽입하는 경우) $O(n)$
배열과 마찬가지로 우선순위가 높은 요소를 찾아야 하기 때문
힙(heap)을 이용 $O(log_2n)$ $O(log_2n)$

 

 

 

 

 


힙(heap)

  • 완전 이진트리의 일종으로 우선순위 큐를 위하여 만들어진 자료구조이다.
  • 이진 탐색 트리와 달리 중복 값을 허용한다.
  • 부모 노드의 키 값이 자식 노드의 키 값보다 항상 큰 이진트리이다.
  • 일종의 느슨한 정렬 상태를 유지한다. (삭제 연산이 수행될 때 최대값(root)만 찾으면 되므로 전체를 정렬하지 않는다.)
  • 최대값이나 최소값을 빠르게 찾을 때 유리하다.

 

 

힙의 종류

  1. 최대 힙(max heap)
    : 부모 노드의 키 값이 자식 노드의 키 값보다 크거나 같은 완전 이진트리
  2. 최소 힙(min heap)
    : 부모 노드의 키 값이 자식 노드의 키 값보다 작거나 같은 완전 이진트리

 

 

힙 구현 방법

  1. 배열을 이용한 구현
    - 정렬된 배열 이용
    - 정렬되지 X 배열 이용
    - 구현을 쉽게 하기 위해서 인덱스 0은 사용하지 않는다.
    - 연산을 통해 노드의 인덱스를 알 수 있다.
      ##왼쪽 자식의 인덱스 = (부모의 인덱스) * 2##
      ##오른쪽 자식의 인덱스 = (부모의 인덱스) * 2 + 1##
      ##부모의 인덱스 = (자식의 인덱스) / 2##
  2. 연결 리스트 이용

 

 

힙의 시간 복잡도

  • 삽입 연산 : $O(log_2n)$
  • 삭제 연산 : $O(log_2n)$

 

 

힙의 연산

  • 삽입 연산
    (1) 요소를 힙의 가장 마지막 노드로 삽입
    (2) 부모 노드와 비교하여 부모 노드보다 클 경우 값 교환(부모 노드보다 작을 때까지 반복)
  • 삭제 연산
    (1) 루트 노드 삭제
    (2) 빈 루트 자리에 힙의 마지막 노드를 가져옴
    (3) 양쪽 자식 중 큰 값과 교환이 일어남(자식 노드보다 클 때까지 반복)

 

 

힙 정렬(heap sort)

  최대 힙을 이용하면 정렬을 할 수 있다. 데이터를 차례대로 최대 힙에 추가하여 힙을 생성한 뒤, 요소를 하나씩 빼서 뒤쪽부터 저장하면 오름차순이 된다. 이렇게 힙을 사용하는 정렬 알고리즘을 힙 정렬(heap sort)이라고 한다. 전체 자료를 정렬하지 않고 큰 값만 필요한 경우에도 유용하게 사용된다.

    시간 복잡도  : $O(nlog_2n)$ (전체 높이가 $log_2n$인 완전 이진트리이기 때문)

 

 

 

힙 응용

  • LPT 알고리즘(longest processing time first) : 가장 긴 작업을 우선적으로 할당하는 것
  • 허프만 코드(Huffman codes)
    ex) 영문자 빈도수를 이용한 데이터 압축

 

 

 

'기타 > 자료구조' 카테고리의 다른 글

[자료구조] 그래프(graph)  (0) 2021.07.31
[자료구조] 트리, 이진 트리, 이진 탐색 트리  (0) 2021.06.18
[자료구조] 큐(Queue), 덱(Deque)  (0) 2021.02.02
[자료구조] 스택(Stack)  (0) 2021.01.26
순환 알고리즘  (0) 2021.01.25

 

 

공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

 

트리와 관련된 용어

  •  트리(tree)  : 한 개 이상의 노드로 이루어진 유한 집합.
    레벨(level) : 트리의 각 층에 번호를 매긴 것. 루트는 1이되고 한 층 내려갈수록 1씩 증가한다.
    높이(height) : 트리가 가지고 있는 최대 레벨
    forest : 트리들의 집합
  • 노드(node) : 트리의 구성 요소
  • 루트 노드(root node) : 트리에서 가장 높은 곳에 있는 노드
  • 차수(degree)
    노드의 차수 : 노드가 가지고 있는 자식 노드의 개수 (단말 노드의 차수는 0)
    트리의 차수 : 트리가 가지고 있는 노드의 차수 중에서 가장 큰 값
  • 서브 트리 : 트리의 하위 트리구조
  • 간선(edge) : 노드를 연결하는 선
  • 부모 노드(parent node) : 자식 노드가 속해있는 노드
  • 자식 노드(children node) : 부모 노드에 속한 부속 노드
  • 형제 노드(sibling node) : 같은 부모 노드를 가지는 노드
  • 조상 노드(ancestor node) : 루트 노드에서 임의의 노드까지의 경로를 이루고 있는 노드들을 의미
  • 후손 노드(descendent node)
    - 임의의 노드 하위에 연결된 모든 노드들을 의미.
    - 어떤 노드의 서브 트리에 속하는 모든 노드들은 후손 노드이다.
  • 단말 노드(terminal node, leaf node) : 자식 노드가 없는 노드
    비 단말 노드(nonterminal node) : 단말 노드의 반대
  •  결정 트리(decision tree)  : 의사 결정 구조를 표현하는 방법 중 하나

 

 

 

이진트리(binary tree)

  • 루트와 왼쪽 서브 트리, 오른쪽 서브 트리로 구성된 노드들의 유한 집합
  • 이진트리의 서브 트리들은 모두 이진트리여야 한다. (서브 트리는 공집합일 수 있다.)
  • 모든 노드가 2개의 서브 트리를 가지고 있는 트리이다. (서브 트리는 공집합일 수 있다.)
  • 최대 2개까지의 자식 노드가 존재할 수 있다 (== 모든 노드의 차수가 2 이하이다.)
  • 서브 트리 간의 순서가 존재(왼쪽 서브 트리와 오른쪽 서브 트리는 서로 구별된다.)

 

 

이진트리의 성질

  • 부모와 자식 간에는 하나의 간선만 존재
  • 노드가 n개인 이진트리의 간선 개수 : $n-1$(부모 노드는 항상 1개이기 때문)
  • 높이가 h인 이진트리의 노드 개수 : 최소 h개 ~ 최대 $2^h - 1$개
  • 레벨 i에서의 노드 최대 개수 : $2^{i - 1}$
  • 노드가 n개인 이진트리의 높이 : 최소 $log_2(n+1)$ ~ 최대 n

 

 

이진트리의 종류

  1. 포화 이진트리 (full binary tree)
    - 트리의 각 레벨에 노드가 꽉 차있는 이진트리 (== 노드의 개수가 항상 $2^k - 1$개)
    - 노드에 번호를 부여할 때는 (같은 레벨에서) 왼쪽에서 오른쪽으로 붙인다.
  2. 완전 이진트리(complete binary tree)
    : 높이가 k일 때, 레벨 1부터 k -1까지는 노드가 모두 채워져 있고 마지막 레벨에서는 왼쪽부터 오른쪽으로 노드가 순서대로 채워져 있는 이진트리(중간에 비어있으면 안 됨)
    - 포화 이진트리는 항상 완전 이진트리
    - 포화 이진트리와 노드 번호 부여 방식은 같다.
  3. 기타 이진트리

 

 

이진트리 구현

  1. 배열 표현법
    : 노드의 최대 개수인 $2^k -1$개의 공간을 할당한 뒤 노드들을 저장
    - 기억공간 낭비가 심함
  2. 포인터 이용 : 포인터를 이용해서 왼쪽 노드와 오른쪽 노드를 저장한다. 
    typedef struct TreeNode{
        int data;
        struct TreeNode *left;
        struct TreeNode *right;
    } TreeNode;​

 

 

이진트리 순회

       순회(traversal)  : 이진트리에 속한 모든 노드를 한 번씩 방문하는 것

  • 위 순회(preorder traversal) : 루트 노드를 가장 먼저 방문 (루트왼쪽 서브 트리오른쪽 서브 트리)
  • 위 순회(inorder traversal) : 루트 노드를 2번째로 방문 (왼쪽 서브 트리루트오른쪽 서브 트리)
  • 위 순회(postorder traversal) : 루트 노드를 서브 트리 방문 후에 방문 (왼쪽 서브트리오른쪽 서브트리루트)
  • 레벨 순회(level order)
    - 각 노드를 레벨 순으로 방문
    - 같은 레벨일 경우에는 좌, 우로 방문

 

 

트리 응용

  • 디렉터리 용량 계산 : 후위 순회(하위 디렉터리 용량을 알아야 현재 디렉터리 용량을 계산할 수 있음)
  • 수식 트리(expression tree) 처리 : 후위 순회

 

 

 

 

 

이진 탐색 트리(binary search tree)

  : 이진트리 기반의 탐색을 위한 자료 구조

  • 이진 탐색 트리의 정의
    - 모든 원소의 키는 유일한 키를 가진다.
    - 왼쪽 서브 트리 키들은 루트 키보다 작다.
    - 오른쪽 서브 트리의 키들은 루트의 키보다 크다.
    - 왼쪽과 오른쪽 서브 트리도 이진 탐색 트리이다.
  • 탐색과 관련된 용어
    탐색 : 레코드의 집합에서 특정 레코드를 찾아내는 작업
    테이블(table) : 레코드들의 집합
    레코드(record) : 하나 이상의 필드(field)로 구성
    주요 키(primary key) : 레코드를 구별할 수 있는 값 (중복되지 않은 고유한 값)

 

 

이진 탐색 트리의 시간 복잡도

  • 탐색, 삽입 삭제 연산의 시간 복잡도 : (트리의 높이가 h일때) $O(h)$
  • 노드가 n개인 이진 탐색 트리 연산
    평균적인 경우(좌우 서브 트리가 균형을 이루는 경우) 시간복잡도 : $O(log_2n)$
    최악의 경우(한쪽으로 치우치는 경우) : 선형 탐색과 같이 $O(n)$
    → 최악의 경우를 방지하기 위해 트리의 높이를 $log_2n$으로 한정시키는 방식을 사용한다... 

 

 

 

'기타 > 자료구조' 카테고리의 다른 글

[자료구조] 그래프(graph)  (0) 2021.07.31
[자료구조] 우선순위 큐(priority queue), 힙(heap)  (0) 2021.07.17
[자료구조] 큐(Queue), 덱(Deque)  (0) 2021.02.02
[자료구조] 스택(Stack)  (0) 2021.01.26
순환 알고리즘  (0) 2021.01.25

+ Recent posts