알고리즘 기본
기존 깃북에 올려놓은 마크다운 복붙이라 내용이 비어있거나
안맞을 수도 있습니다.
다시 공부하기전에 알고 있는거 그냥 한번씩 정리하자.. 학부생때 생각나게 ㅋㅋ
Core Java 책에 이렇게 표현하기도 한다.
프로그램 = 자료구조 + 알고리즘
너무 단순하다고 볼 수 있지만 틀린 것은 아닌게 정말 심플하게만 바라보면
컴퓨터는 어떤 입력에 따라 출력을 내주는 정말 계산기 같은 기계로 볼 수 있다.
이렇게 들어온 자료를 계산및 가공하기 위해 저장이 필요하며
이때 어떻게 저장할지를 생각하는게 자료 구조이며 이렇게 저장된 자료를
어떻게 처리할 것인가의 고민이 알고리즘이라고 할 수 있다.
1.빅오
1.O(1)
- 스택의 push, pop
- 해쉬 테이블-하나의 키에만 접근 하기에 100만개 아이템이 있더라 하더라도 한번의 접근이기에.
2.O(log n)
- 바이너리 탐색 트리의 접근, 서치, 삽입, 삭제가 예
- 8개의 아이템이 있을때 바이너리 트리의 depth는 3
- 혹은 log 8 = log 2^3 = 3으로 나타낼 수도 있다.
3.O(n)
- 배열 안의 모든 아이템을 출력 한다던지.–> 100만개의 아이템이 있다면 100만번 접근이 필요.
- 트리 순회(traverse tree), 연결 리스트 순회(traverse linked list)
4.O(n log n)
- Quick Sort, Merge Sort(병합정렬), Heap Sort
5.,O(n^2)
- Insertion Sort(삽입정렬), Bubble Sort(거품정렬), Selection Sort(선택정렬)
- 2중 for문의 일반적
Sort(정렬)
1.거품정렬(Bubble Sort)
정렬을 위한 교환 작업이 거품같이 버블 거린다고 해서 거품 정렬
- 시간 복잡도: O(n^2) ..좋지 않다.
- 공간 복잡도:O(1)교환을 위한 공간이 하나 필요하다.
- 비교를 해서 크기 조건에 맞으면 스와핑, 아니면 패스
1 | import unittest |
2.선택정렬(Selection Sort)
정렬을 위한 교환 작업이 거품같이 버블 거린다고 해서 거품 정렬
- 시간복잡도: O(n^2), 최악,최상 전부 n^2로 좋지 않으나, 구현이 쉬워서 많은 사람들이 구현.
- 공간복잡도: O(n) total, O(1) auxiliary
- 처음 포인터가 첫아이템을 가르키고 min값 변수에 집어넣는다.
- 이후 아이템 끝까지 순회하면서 min값 변수와 비교한다. 끝까지 순회하면 가장 작은 min값이 남게된다.
- min값을 가졌던 그 아이템과 첫 아이템을 swap하고 포인터는 그다음을 가르킨다. 이후 반복
1 | import unittest |
3.삽입정렬(InsertionSort)
아주 간단하게 구현이 가능하다. 효율성은 다른 알고리즘에 비해 떨어진다.
- 시간복잡도: O( )
- 공간복잡도: O( )
1 | import unittest |
4.병합정렬(Merge Sort)
아주 간단. 2개의 스텝(바이너리로 쪼갤 때 log n, 각자 비교하는 과정이 n)
- 시간복잡도: O(n log n)
- 공간복잡도: O( n)
1 | def mergeSort(alist): |
5.퀵 정렬(Quick Sort)
- 시간복잡도: O(n log n) , 이미 리스트가 정렬되었을때는 O(n^2)라는 worst 케이스가 생기는 단점.
- 공간복잡도: O(n), 따로 메모리 필요 없기에 아주좋은 공간 복잡도
- 엄청 짧은 코드. 재귀 알고리즘의 대명사.
1 | import unittest |
자료구조
자료구조 다 아는건데.. 곡 인터뷰나 이런거 하면 긴장하면 머리가 멍해서 격 안나니 ㅋㅋ
빠른 레퍼런스를 위해 기억 상기용으로 대충 정리 해놓자.
Queue
- FIFO
- enqueue, dequeue
1 | import unittest |
Stack
- FILO
- Push, Pop
- 오버플로우: 스택 풀일떄 또 push, 예전 해커스랩 오버플로우 익스플로잇 생각해볼것 strcpy()이용한거.
- 언더플로우: 스택 아이템 0 일떄 POP~
1 | import unittest |
Linked List
- Git도 이구조였음을 기억.(지옥에서 온 GIt강좌 설명 상기해보자)
- 1학년 자료구조 중간고사 기억나나? ㅋㅋ(중간삭제, 마지막 삭제 흐름 한번씩 다시 되새겨보자)
1 | """ |
Heap
- 시간복잡도: 구성시(Run-time): 최악의 경우 O(n log n), 그러나 max와 min은 한방에 얻어낼 수 있는 엄청난 장점: O(1)
- 공강복잡도: Heap sort is an in-place 알고리즘(따로 메모리 필요없)
- Min-Heap, Max-Heap이 있다.(ROOT값에 따라서 )
- 부모가 자식보다 크면 힙이다.?(과연?)맥스힙에선 그러하다.
- Heapify, siftdown
- Heapify: 일반적인 트리를 힙 트리로 바꾸는 과정. 열어보면 시프트다운의 연속.
- siftdown: 자식이 더 크면 현 노드와 스왑.
- 상품들 엄청많을때 제일 싼거? 제일 비싼거? –> 최대값을 한방에 구할 수 있는 힙 트리가 제격
- 밑 예제 소스는 array를 사용해서 heap tree 구현..
- 소스 테스트 필요, 최소힙인듯.
1 | #======================================================================= |