728x90
Algorithm & Data Structure/Theory
17

[Python] Bit(비트) 연산, 조작

■ Bool(부울) 연산은 크게 NOT, AND, OR, XOR이 있다. NOT 입력 출력 0 1 1 0 AND 입력1 입력2 출력 0 0 0 0 1 0 1 0 0 1 1 1 OR 입력1 입력2 출력 0 0 0 0 1 1 1 0 1 1 1 1 XOR 입력1 입력2 출력 0 0 0 0 1 1 1 0 1 1 1 0 ■■ 그렇다면 코딩에서의 비트 연산은 어떻게 표현할까? AND = & OR = | XOR = ^ NOT = ~ 간단하게 True와 False로 연산을 표현해보자. True & False = False True | False = True True ^ True = False ~ True = -2 어?! 그런데 ~ True의 출력 값이 not 1의 출력 값과 같은 0이 되어야하는 것이 아닌가? 자, 여..

[Python] Binary Search(이진 검색)

■ 이진 검색은 정렬된 배열에서 값을 찾아내는 검색 알고리즘이다. 여기서 정렬된 배열이라는 부분이 아주 굉장히 중요하다. 또한 시간 복잡도는 logn으로 일정하다. 그렇다면 이진 검색 과정을 알아보자. 위 그림을 보면 이진 검색 과정을 한번에 이해할 수 있을 것이다. ■■ 이진 검색을 코드로 구현하는 방법은 대표적으로 [재귀, 반복, 모듈 사용] 총 3가지가 있다. 어려운 알고리즘은 아니니 코드 구현으로 바로 넘어가보자. Recursion def banarysearch(a:list, target:int): def search(left, right): if left target: return search(left, mid - 1) else: return mid else: return -1 return se..

[Python] Sort(정렬)

정렬은 Selection Sort, Bubble Sort, Quick Sort, Insertion Sort, Shell Sort, Merge Sort ...... 등으로 겁나 많다. 하지만 난 이 중에 딱 3개(Bubble Sort, Merge Sort, Quick Sort)를 짚고 넘어갈 것이다. 버블 정렬 거두절미하고 말하면 버블 정렬은 중요하지 않다. 그냥 넘어가고는 싶지만 간단하게 설명하겠다. def bubblesort(a : list): for i in range(1, len(a)): for j in range(0, len(a) - 1): if a[j] > a[j + 1]: a[j], a[j + 1] = a[j + 1], a[j] 위 코드를 보면 시간복잡도가 n^2이 되는 것을 알 수 있고 굉장..

[Python] Trie(트라이)

■ 트라이는 검색 트리의 일종으로 문자열 탐색을 위한 자료구조로 널리 쓰인다. 초창기에는 '트리'로 발음했으나, 기존의 트리와 구분하기 위해 '트라이'라 부른다. 그리고 이진 트리가 아닌 다진 트리의 형태를 띤다. 위 그림과 같이 트라이가 있을 때 "appear"이라는 단어를 찾는다고 하면 a → p → p → e → a → r 순서로 문자열의 길이만큼만 탐색하면 원하는 결과를 얻을 수 있다. 트라이는 문자열을 위한 트리의 형태이기 때문에 사실상 문자 개수만큼 자식이 있어 상당히 많은 자식 노드를 갖고 있는 트리임을 확인할 수 있다. 위 그림을 봐도 그렇다고 느낄 것이다.... ■■ 트라이에서의 Leaf(리프) 노드 즉, 문자의 끝을 True, 나머지 상위 노드(문자)들은 False인 상태를 나타내며 구..

[Python] Heap(힙)

■ Heap(힙)은 트리 기반의 자료구조이다. 그리고 부모가 항상 자식보다 작은 구조이다. 그렇기때문에 루트가 가장 작은 값을 갖게되며 가장 작은 값을 추출하는 것은 루트를 추출한다는 것이 된다. 여기서 주의해야할 점은 Heap(힙)은 정렬된 구조가 아니다. 즉, 왼쪽 자식과 오른쪽 자식의 관계를 정의하지 않았다. 오직 부모, 자식 간의 관계만 정의하였다. 위 그림을 보면 오른쪽 노드가 왼쪽 노드보다 작은 것 (33, 17)이 있듯이 왼쪽과 오른쪽의 관계는 정의하지 않았다. 그리고 위 그림을 보면 자식이 두 개로 구성되어 있는데 이것을 Binary Heap(이진 힙)이라하며 트리 중 이중 트리가 많이 사용되듯이 힙도 이진 힙이 가장 많이 사용된다. 위 그림처럼 배열로 표현할 경우 대개 계산의 편이를 위해..

[Python] 이진 탐색 트리(BST)와 트리 순회

■ 이진 탐색 트리 (Binary Search Tree) 노드의 왼쪽 서브트리에는 그 노드의 값보다 작은 값들을 지닌 노드들로 이뤄져 있는 반면, 노드의 오른쪽 서브트리에는 그 노드의 값과 같거나 큰 값들을 지닌 노드들로 이루어져 있는 트리 위 그림을 보면 이진 탐색 트리가 어떻게 생겨먹은 것인지 이해할 수 있을 것이다. 대충 어떤 것인지 알았다면 이제 이 그림에서 원하는 값을 찾는 과정을 살펴볼 것이다. ■■ 위 이진 탐색 트리에서 우리는 '7'을 찾아 볼 것이다. 당연하지만 루트인 '15'부터 시작한다. 1. '7'은 '15'보다 작기 때문에 왼쪽 자식 노드로 탐색이 진행된다. 2. '10' 또한 마찬가지로 '7'이 더 작기 때문에 왼쪽 자식 노드로 탐색이 진행된다. 3. 여기서부터 '7'은 '5'보..

[Python] Tree (트리)란?

■ 트리는 하나의 뿌리에서 위로 뻗어나가는 형상처럼 생겨서 '트리(나무)'라는 명칭이 붙었는데, 트리 구조를 표현할 때는 나무의 형상과는 반대 방향으로 표현한다. 트리는 자식도 트리고 또 그 자식도 트리고 또 그.... 흔히 서브트리(Subtree)로 구성된다고 표현한다. 좀 어렵게 표현하자면 재귀로 정의된(Recursively Defined) 자기 참조(Self-Referential) 자료구조하고 할 수 있다. ■■ 자, 이제 트리의 각 명칭을 살펴보자. 우선 트리는 항상 루트(Root)에서 시작된다. 루트는 자식(Child)를 가지며 각 간선(Edge)로 연결되어 있다. 차수(Degee) 자식 노드의 개수 크기(Size) 자신을 포함한 모든 자식 노드의 개수 리프(Leaf) 자식 노드가 없는 노드 서..

728x90