- 리스트
- 정렬
- 탐색
- 재귀 알고리즘
- 알고리즘 복잡도
- 연결리스트
- 양방향 연결리스트
- 스택
Python에서는 서로 다른 타입의 원소가 자리할 수 있음
삽입
L.append(element)
L.insert(n, element)
삭제
L.remove(element)
L.pop(n)
del list[n]
탐색
L.index(element)
sorted() 정렬된 새로운 리스트를 return 받음
sort() 리스트 자체를 정렬함
정렬 순서 반대로
reverse=True 인자 추가
문자열로 이루어진 리스트의 경우 사전 순서로 정렬
key를 이용하여 다른방법(문자열 길이 등)으로 정렬 가능
sorted(L, key = lambda x : len(x))
L.sort(key = lambda x : x['name'], reverse=True)
이진탐색 O(log n)
한 번 비교가 일어날 때마다 리스트 반씩 줄임
divide & conquer
while lower <= upper: middle = (lower + upper) // 2 if L[middle] == x: return middle elif L[middle] < x: lower = middle + 1 else: upper = middle - 1 return -1
하나의 함수에서 자신을 다시 호출하여 작업을 수행하는 것
재귀 호출에서는 종결 조건이 중요
재귀(Recursive) vs 반복(Iterative)
피보나치 Recursive version
def fibonacci(x): if x < 2: return x else: return fibonacci(x-2) + fibonacci(x-1)
def fibonacci(x): f0 = 0 f1 = 1 answer = 0 if x < 2: return x else: for _ in range(x-1): answer = f0 + f1 f0 = f1 f1 = answer return answer
재귀적인 방법이 작성이 간단하고 직관적이나
수행속도는 반복적인 방법이 더 빠르다.
시간 복잡도(Time Complexity)
문제의 크기와 이를 해결하는 데 걸리는 시간 사이의 관계
공간 복잡도(Space Complexity)
문제의 크기와 이를 해결하는 데 필요한 메모리 공간 사이의 관계
Big-O Notation
어떤 함수의 증가 양상을 다른 함수와의 비교로 표현
O(logn), O(n)...
선형 시간 알고리즘 - O(n)
: 선형탐색
로그 시간 알고리즘 - O(logn)
: 이진탐색
이차 시간 알고리즘 - O(n²)
: 삽입정렬
Best Case : O(n)
Worst Case : O(n²)
병합 정렬 - O(nlogn)
정렬 문제에 대해 O(nlogn)보다 낮은 복잡도를 갖는 알고리즘은 존재할 수 없음이 증명되어 있음
연결리스트는 node의 연결로 이루어짐
node는 data, next로 이루어짐
next는 다음 node를 가리킴
특정 원소를 찾기 위해 head부터 tail까지 탐색함 - O(n)
양방향으로 연결, 하나의 node는 prev, next node와 연결
자료를 선형으로 연결하는 구조
한 쪽 끝에서 밀어 넣고 같은 쪽에서 꺼낼 수 있음
후입선출(LIFO - Last-In First-Out)