트리 구조 트리 : Node 와 Branch를 이용해서, 사이클을 이루지 않도록 구성한 데이터 구조 주로 이진 트리 형태의 구조로 탐색 알고리즘 구현에서 많이 사용 된다. 트리 용어 Node : 데이터를 저장하는 요소 Root Node : 최상위 노드 (레벨 0) Level : 노드의 깊이 Sibling (Brother Node) : 동일한 부모를 가진 노드 Depth : 트리에서 Node를 가질 수 있는 최대 레벨 이진트리와 이진 탐색 트리 이진 트리 (Binary Tree) : 최대 브랜치가 2인 트리 이진 탐색 트리 : BST (이진 트리에 추가적인 조건이 있는 트리) 왼쪽 노드는 해당 노드보다 작은 값, 오른쪽 노드는 해당 노드보다 큰 값 장점 : 탐색 속도 개선 단점 : 복잡하다. class N..
해시 테이블 키(Key)에 데이터(Value)를 저장하는 데이터 구조 Key를 통해 바로 데이터를 받아올 수 있으므로, 속도가 획기적으로 빨라진다. 파이썬 딕셔너리 타입이 해쉬 테이블의 예 보통 배열로 미리 Hash Table 사이즈 만큼 생성 후에 사용 (공간과 탐색 시간을 맞바꾸는 기법) 블록 체인에서 사용 파이썬에서는 해쉬를 별도로 구현할 이유가 없다. 딕셔너리 자체가 해쉬테이블 용어 Hash : 임의의 값을 고정 길이로 변환 Hash Table : 키 값의 연산에 의해 직접 접근이 가능한 데이터 구조 해싱 함수 : 키에 대해 산술 연산을 이용해 데이터 위치를 찾을 수 있는 함수 해쉬 값 또는 해쉬 주소 : 키를 해싱 함수로 연산해서, 해쉬 값을 알아내고 키에 대한 위치를 일관성있게 찾을 수 있다...
링크드 리스트 연결 리스트라고도 한다. 배열은 순차적으로 연결된 공간에 데이터를 나열하는 데이터 구조 링크드 리스트는 떨어진 곳에 존재하는 데이터를 화살표로 연결해서 관리하는 데이터 구조 본래 C언어에서는 주요한 데이터 구조지만, 파이썬은 리스트 타입이 링크드 리스트의 기능을 모두 지원 배열은 미리 공간을 확보해야하지만, Linked list는 필요할 때마다 노드를 생성할 수 있다. 기본 구조 노드 : 데이터 저장 단위 (데이터 값, 포인터)로 구성 포인터 : 각 노드 안에서, 다음이나 이전의 노드와의 연결 정보를 가지고 있는 공간 class Node: def __init__(self, data, next =None): self.data = data self.next = next 하나의 노드에는 데이터,..
알고리즘 복잡도 시간 복잡도 : 알고리즘 실행 속도 공간 복잡도 : 알고리즘이 사용하는 메모리 사이즈 가장 중요한 시간 복잡도를 이해하고 계산할 수 있어야 한다. 알고리즘 성능 표기법 Big O 표기법 : O(N) 알고리즘 최악의 실행 시간을 표기 아무리 최악의 상황이라도, 이정도의 성능은 보장한다는 의미 Ω (오메가) 표기법: Ω(N) 오메가 표기법은 알고리즘 최상의 실행 시간을 표기 Θ (세타) 표기법: Θ(N) 오메가 표기법은 알고리즘 평균 실행 시간을 표기 시간 복잡도 계산은 반복문이 핵심 요소임을 인지하고, 계산 표기는 최상, 평균, 최악 중 최악 표기법을 중심으로 익히자 O 표기법 빅 오 표기법 O(입력) 입력 n 에 따라 결정되는 시간 복잡도 함수 O(1) < O(logn) < O(n) < ..
자료구조 대량의 데이터를 효율적으로 관리할 수 있는 데이터의 구조를 의미 어떤 데이터 구조를 사용하느냐에 따라, 코드 효율이 달라진다. 대표적인 자료구조 (배열, 스택, 큐, 링크드 리스트, 해쉬 테이블, 힙 등) 알고리즘 어떤 문제를 풀기 위한 절차 / 방법 어떤 문제에 대한 원하는 출력을 얻을 수 있도록 만드는 프로그래밍 어떤 자료구조와 알고리즘을 사용하느냐에 따라 성능이 천지차! 파이썬과 C언어의 배열 예제 #include int main(int args, char* argv[])){ char country[3] = "US"; printf("%c%c\n", country[0], country[1]); printf("%s\n", country); return 0; } country = 'US&..