인프런의 영리한 프로그래밍을 위한 알고리즘 강좌를 보고 작성한 문서입니다.

이진검색트리

  • 여러 개의 키(key)를 저장

  • 다음과 같은 연산들을 지원하는 자료구조

    • INSERT - 새로운 키의 삽입

    • SEARCH - 키 탐색

    • DELETE - 키의 삭제

  • 예: 심볼 테이블


다양한 방법들

  • 정렬된 혹은 정렬되지 않은 배열 혹은 연결 리스트를 사용할 경우 INSET, SEARCH, DELETE 중 적어도 하나는 O(n)

  • 이진탐색트리(Binary Search Tree), 레드-블랙 트리, AVL-트리 등의 트리에 기반한 구조들

  • Direct Address Table, 해쉬 테이블 등


검색트리

  • Dynamic set을 트리의 형태로 구현

  • 일반적으로 SEARCH, INSERT, DELETE 연산이 트리의 높이(height)에 비례하는 시간복잡도를 가짐

  • 이진검색트리(Binary Search Tree), 레드-블랙 트리(red-black tree), B-트리 등


이진검색트리(BST)

  • 이진 트리이면서

  • 각 노드에 하나의 키를 저장

  • 각 노드 v에 대해서 그 노드의 왼쪽 부트리(subtree)에 있는 키들은 key[v]보다 작거나 같고, 오른쪽 부트리에 있는 값은 크거나 같다.

BST의 예

bst_example


bst_search

수도코드

Recusive Version

TREE-SEARCH(x,k)
1   if x = NIL or k = key[x]
2     then return x
3   if k < key[x]
4     then return TREE-SEARCH(left[x],k)
5     else return TREE-SEARCH(right[x],k)      

Iterative Version

ITERATIVE-TREE-SEARCH(x,k)
1   while x != NIL and k != key[x]
2     do if k < key[x]
3       then x <- left[x]
4       else x <- right[x]
5   return x

시간복잡도: O(h), 여기서 h는 트리의 높이

오늘 한일

오늘 느낀점

  • aws에 대해 많이 모르는데 해당 워크샵을 통해서 배우는 내용들을 직접적으로 소화를 하고 있진 않다. 그러나 저번과 이번을 통해 IAM 관리 등 부수적인 부분에서 배워 나가고 있고, aws에 대한 막연한 불안감(어려움)들이 많이 해소 되고 있다.

내일 할일

  • 알고리즘 강의 듣기

  • AJAX 공부를 하자

  • 볼링 추가 구현을 하자

인프런의 영리한 프로그래밍을 위한 알고리즘 강좌를 보고 작성한 문서입니다.

트리(Tree)

계층적인 구조를 표현

  • 조직도, 디렉토리와 서브디렉토리 구조, 가계도…

  • 트리는 노드(node)들과 노드들을 연결하는 링크(link)들로 구성됨.

부모-자식 관계

  • 부모: 위에 있는 노드
  • 자식: 아래 있는 노드

형제관계

  • 부모가 같은 노드들(루트노드를 제외한 트리의 모든 노드들은 유일한(하나의) 부모 노드를 가진다.)

리프(leaf) 노드

  • 자식이 없는 노드들

조상-자손 관계

  • 부모-자식의 관계를 확대

부트리(sub tree)

  • 트리의 일부를 잘라서 부분만 봐도 하나의 트리이다(전체의 일부분인 트리)

레벨

  • 루트에서 밑으로 내려간 정도(0 또는 1부터 시작)

높이

  • 서로 다른 레벨의 갯수

트리의 기본적인 성질

  • 노드가 N개인 트리는 항상 N-1개의 링크(link)를 가진다.
  • 트리에서 루트에서 어떤 노드로 가는 경로는 유일하다. 또한 임의의 두 노드간의 결로도 유일하다.(같은 노드를 두번 이상 방문하지 않는다는 조건하에)

이진 트리(binary tree)

  • 이진 트레에서 각 노드는 최대 2개의 자식을 가진다.

  • 각각의 자식 노드는 자신이 부모의 왼쪽 자식인지 오른쪽 자식인지가 지정된다.(자식이 한 명인 경우에도)

    <이진 트리 응용의 예>
    expression_tree


Full and Complete Binary Trees

full_and_complete_tree

linked_structure


이진트리의 순회(traversal)

  • 순회: 이진 트리의 모든 노드를 방문하는 일

  • 중순위(inorder) 순회(왼쪽,루트,오른쪽)
  • 선순위(preorder) 순회(루트,왼쪽,오른쪽)
  • 후순위(postorder) 순회(왼쪽,오른쪽,루트)
  • 레벨오더(level-order) 순회

  • Inorder-순회

    inorder

    inorder_O

  • Preorder & Postorder순회

    pre_post

    방문하는 순서만 바뀐다.

  • Expression Trees

    order_sample

  • Level-Order 순회

    • 레벨 순으로 방문, 동일 레벨에서는 왼쪽에서 오른쪽 순서로

    • 큐(queue)를 이용하여 구현

    level_order

    level_order2

오늘 한일

  • 알고리즘 강의의 트리와 이진트리에 대해 공부했다. (포스팅)

  • 파이썬 웹 프로그래밍 - Django로 웹서비스 개발하기 강의를 들었다. (인프런의 해당 강의)

오늘 느낀점

  • 알고리즘 강의를 40%정도 들었다. 아직도 많이 남긴 했지만 꾸준히 하루 한 강의식 들으니 벌써 절반 가까이 완료를 했다. 거기다 강의 초반에 재귀를 배우면서 활용을 해보고 싶었는데, 어제 볼링을 구현하면서 사용을 해 볼수 있어서 좋았다. 특히나 base case와 recursive case의 개념을 제대로 알고 짜니 좀 더 수월하게 짜게 되었다.

  • 원래는 볼링을 추가적으로 구현 할려고 했지만, 카페에서 한동안 공부를 안했더니 카페에서는 집중이 덜됐다. 그래서 강의를 보는 방식으로 집중해서 공부하기로 마음 먹고 이전에 보던 장고 강의를 마저 들었다.

내일 할일

오늘 한일

  • 코드스쿼드 레벨 테스트 풀고 방문 및 상담

오늘 느낀점

  • 스스로 느끼기에도 볼링 문제가 로또와 체스 사이 수준의 문제라고 생각했는데 쉽게 구현이 안됐다. 문제가 된 부분은 스트라이크/스페어가 있을때 점수 구현자체는 어느정도 수월하게 했지만 출력을 해주는 부분(스트라이크 점수 처리가 될때까지 지연된는 부분)이 어려웠다. 그래서 포비와 얘기하다 조언 받은데로 링키드리스트 형태로 다시 제작을 해보고 있다.

  • 자바의 객체지향이라던지 여러 면에서 예전보단 나아졌다는 걸 느끼지만 아직 부족하다. 더 잘 짜고 싶다.

  • 로직을 짤때가 가장 재밌는거 같다.

내일 할일

  • 코드스쿼드 레벨 테스트였던 볼링 프로그램 다시 제작

  • 알고리즘 강의 듣기