SMALL

일반 큐의 문제점

일반적인 큐는 배열로 일직선으로 구현되어짐. 그리고 선입 선출이라 맨앞에 데이터가 빠져나가면 한칸씩 앞으로 당겨야되기때문에 성능적으로 좋지 않음

 

원형 큐

말그대로 큐를 선형이 아닌 원형으로 생각하여 구현 하는 것이다.

  • enqueue() : 원소 뒤에서 삽입
  • dequeue() : 원소 앞에서 삭제
  • isEmpty() : 공간 확인
  • getSize() : 사이즈 반환

lastOp 변수를 사용하여 큐의 공간 전부를 사용할 수 있게 한다. (즉 원형 큐 문제점 해결방안)

쉽게 이야기하면 마지막 연산을 기록해두는 변수이다.

삽입이 마지막이면 push, 삭제가 마지막이면 pop로 설정하여 front == rear 일때 lastOp가 push이면 포화, lastOp가 pop이면 공백

하지만 큐의 삽입 삭제 연산이 느려짐...

LIST

'전공 > 자료구조' 카테고리의 다른 글

Stable Sort, Unstable Sort  (0) 2021.07.13
삽입정렬  (0) 2021.06.07
B-tree, B+tree  (0) 2021.06.05
AVL 트리 vs Red Black 트리  (0) 2021.06.05
정렬 시간복잡도  (0) 2021.06.05
SMALL

스테이블 정렬(안정정렬)은 정렬되지 않은 데이터들중 같은 데이터가 있을 때 정렬하면서 그 순서가 변하지 않는 것을 의미

언스테이블 정렬은 반대로 순서가 변하는 것을 의미

 

Stable Sort

  • 삽입정렬
  • 합병정렬
  • 거품정렬
  • 계수정렬

Unstable Sort

  • 선택정렬
  • 힙정렬
  • 퀵정렬
  • 쉘정렬
LIST

'전공 > 자료구조' 카테고리의 다른 글

원형 큐(Circular queue)  (0) 2021.07.14
삽입정렬  (0) 2021.06.07
B-tree, B+tree  (0) 2021.06.05
AVL 트리 vs Red Black 트리  (0) 2021.06.05
정렬 시간복잡도  (0) 2021.06.05
SMALL
package test;

public class 삽입 {
	
	
	
	private static int arr[] = {4,9,7,1,5};
	public static void main(String[] args) {
		
		for(int i=1; i<5; i++) {
			int val = arr[i];
			for(int j= i-1; j>=0; j--) {
				if(arr[j+1] < arr[j]) {
					arr[j+1] = arr[j];
				} else {
					break;
				}
				arr[j] = val;
			}
			print();
		}
		
	}
	
	
	public static void print() {
		for(int i=0; i<5; i++) {
			System.out.print(arr[i]);
		}
		System.out.println();
	}
}
LIST

'전공 > 자료구조' 카테고리의 다른 글

원형 큐(Circular queue)  (0) 2021.07.14
Stable Sort, Unstable Sort  (0) 2021.07.13
B-tree, B+tree  (0) 2021.06.05
AVL 트리 vs Red Black 트리  (0) 2021.06.05
정렬 시간복잡도  (0) 2021.06.05
SMALL

 B-tree와 각 노드에 데이터가 저장이 되지만 B+tree의 경우엔 인덱스노드와 리프노드가 분리되어서 존재한다. 그리고, 리프노드는 서로 연결되어 있어서 임의접근과 순차접근모드 성능이 우수하다.

공통점

  • 모든 leaf의 depth가 같다
  • 각 node에는 k/2 ~ k 개의 item이 들어있어야 한다.
  • search가 비슷하다.
  • add시 overflow가 발생하면 split 한다
  • delete 시 underflow가 발생하면 redistribution하거나 merge 한다.

차이점

  • B-tree의 각 노드에서는 key 뿐만 아니라 data도 들어갈 수 있다. 여기서 data는 disk block으로의 포인터가 될 수 있다.
  • B+tree는 각 node에서는 key만 들어가야 한다. 그러므로 B+tree에서는 data는 오직 leaf에만 존재한다.
  • B+tree는 B-tree와는 달리 add, delete가 leaf에서만 이루어진다.
  • B+ tree는 leaf node 끼리 linked list로 연결되어 있다.

B+tree의 장점

  • 블럭사이즈(노드사이즈) 를 더 많이 이용할수잇다 ( 키값에 대한 harddisk 엑세스 주소가 없기 때문에 )
  • leaf node 끼리 linked list로 연결되어있어서 시퀀셜한 레인지 탐색에 매우 유리하다 

B + Tree 의 단점

  • B Tree의 경우 best case에는 루트에서 끝날수 있지만, B+ Tree의 경우 무조껀 leaf노드까지 가야한다.



출처: https://wangin9.tistory.com/entry/B-tree-B-tree [잉구블로그]

LIST

'전공 > 자료구조' 카테고리의 다른 글

Stable Sort, Unstable Sort  (0) 2021.07.13
삽입정렬  (0) 2021.06.07
AVL 트리 vs Red Black 트리  (0) 2021.06.05
정렬 시간복잡도  (0) 2021.06.05
선택정렬(SelectionSort), 거품정렬(BubbleSort)  (0) 2020.09.17
SMALL
  • AVL트리는 더욱 엄격한 균형을 이루고 있기 때문에 Red-Black 트리보다 더 빠른 조회를 제공
  • Red-Black 트리는 상대적으로 느슨한 균형으로 인해 회전이 거의 이루어지지 않기 때문에 AVL트리보다 빠르게 삽입 및 제거 작업을 수행
  • AVL트리는 각 노드에 대해 BF를 저장하므로 노드 당 int 저장이 필요
    Red-Black 트리는 노드당 1비트의 정보만 필요합니다. (플래그 반전만 시키면 됨)
  • Red-Black 트리는 맵, C++의 멀티캐스트, Java treeMap 등 대부분의 언어 라이브러리에서 사용, AVL트리는 더 빠른 검색이 필요한 데이터베이스에서 사용

출처 : https://velog.io/@agugu95/%EC%9D%B4%EC%A7%84-%ED%8A%B8%EB%A6%AC%EC%9D%98-%EA%B7%A0%ED%98%95-RED-BALCKAVL

LIST

'전공 > 자료구조' 카테고리의 다른 글

삽입정렬  (0) 2021.06.07
B-tree, B+tree  (0) 2021.06.05
정렬 시간복잡도  (0) 2021.06.05
선택정렬(SelectionSort), 거품정렬(BubbleSort)  (0) 2020.09.17
해싱(Hashing)  (0) 2020.09.14
SMALL

LIST

'전공 > 자료구조' 카테고리의 다른 글

B-tree, B+tree  (0) 2021.06.05
AVL 트리 vs Red Black 트리  (0) 2021.06.05
선택정렬(SelectionSort), 거품정렬(BubbleSort)  (0) 2020.09.17
해싱(Hashing)  (0) 2020.09.14
Kruskal, Prim, Sollin 알고리즘  (0) 2020.09.13
SMALL

선택정렬(SelectionSort)

선택정렬은 배열 순서대로 비교하여 가장 큰/작은 값을 찾아서 바꿔서 정렬해나가는 방식입니다.

선택정렬 예시

선택정렬 코드

거품정렬(BubbleSort)

거품정렬은 배열의 인접한 두 개의 데이터를 비교하여 정렬해 나가는 방식입니다.

거품정렬 예시

거품정렬 코드



선택정렬과 거품정렬 비교

  • 선택정렬과 거품정렬 둘다 최선,최악,평균 시간복잡도는 O(n^2)입니다.
  • 선택정렬보다는 거품정렬이 더 많은 비교를 하기에 정렬 시간이 더 오래걸립니다.
  • 선택정렬은 불안전한 정렬이며, 거품정렬은 안전한 정렬입니다.


LIST

'전공 > 자료구조' 카테고리의 다른 글

AVL 트리 vs Red Black 트리  (0) 2021.06.05
정렬 시간복잡도  (0) 2021.06.05
해싱(Hashing)  (0) 2020.09.14
Kruskal, Prim, Sollin 알고리즘  (0) 2020.09.13
DFS와 BFS  (0) 2020.09.13
SMALL

해싱(Hashing)

  • 해싱은 데이터를 해싱 함수에 의해 주소로 변환해 해당 주소 위치에 데이터를 저장하는 방식입니다.(key-value 방식)
  • 데이터 검색시 빠르게 찾을 수 있는 장점이 있는 반면, 해시 테이블 용량 부족으로 오버플로우가 발생 가능합니다.

용어 정리

  • 해시 함수 : 데이터를 키로 변환하는 함수
  • 홈 주소 : 해시 함수로 변환된 키 값의 주소
  • 해시 테이블 : 해시 함수가 키 값 변환시 참조하는 테이블
  • 버킷 : 하나의 주소를 갖는 구역, 버킷의 크기는 레코드 몇개 들어갈 수 있는가를 의미
  • 슬롯 : 하나의 데이터를 저장할 수 있는 공간, 하나의 버킷안에 여러개의 슬롯을 가짐
  • 충돌 : 다른 데이터가 같은 키를 가지는 충돌 현상
  • 동의어 : 동일한 홈 주소로 인하여 충돌이 일어난 레코드들의 집합
  • 오버플로우 : 하나의 홈 주소의 버킷이 가득 차서 레코드를 저장할 슬롯이 없는 상태

해시 함수 종류

  • 제산함수
 - 레코드 값을 소수로 나누어 나머지 값을 주소로 지정
 - ex) h(k) = k%7

  • 중간제곱함수
 - 레코드 값을 제곱한 후에 중간 몇자리를 선택하여 주소로 지정
 - ex) k = 1024일 때, 1024*1024 = 1048576인데, 중간의 485가 주소로 지정

  • 접지함수
 - 숫자로 된 키를 같은 크기로 분리 후, 각 부분들 서로 더해서 주소로 지정
 - 이동 접지 : k = 12320324111220일 때, 123+203+241+112+20= 699가 주소로 지정
 - 경계접지 : k = 12320324111220일 때, 123+302+241+211+20= 897이 주소로 지정

  • 숫자분석함수
 - 각 숫자의 분포를 이용해 편향되지 않은 균등된 숫자를 선택해 주소로 지정

오버플로우 처리 방법

  • 선형조사법 : 오버플로우가 발생 시 다음 버킷에 빈 슬롯이 있으면 저장하는 방법
  • 이차조사법 : 선형조사법의 편향을 방지하기 위해 오버플로우 발생시 n^2의 +-씩으로 검사하여 저장하는 방법
  • 재해싱 : 여러 개의 해시함수를 사용하는 방법
  • 임의 조사법











LIST

'전공 > 자료구조' 카테고리의 다른 글

정렬 시간복잡도  (0) 2021.06.05
선택정렬(SelectionSort), 거품정렬(BubbleSort)  (0) 2020.09.17
Kruskal, Prim, Sollin 알고리즘  (0) 2020.09.13
DFS와 BFS  (0) 2020.09.13
트리 순회  (0) 2020.09.13
SMALL

최소비용 신장트리

- 최저의 비용을 갖는 신장트리

- Kruskal, Prim, Sollin 알고리즘이 있습니다.


갈망법(Greedy method)

- 최적의 해를 단계별로 구함
- 단계별로 판단 기준에 따라 최고의 결정을 내림
- 한번 내려진 결정은 롤백 불가하므로, 각 결정이 가능한 해를 도출해낼 수 있는지 확인

신장트리 제한 조건

- 그래프내에 있는 간선만 사용
- n-1개의 간선만을 사용
- 사이클을 생성하는 간선을 사용 금지

Kruskal 알고리즘

사이클을 생성하지 않는 간선들 중에서 가장 작은 가중치를 가지는 간선을 선택하여 만드는 알고리즘입니다.


Prim 알고리즘

최초 선택된 정점에 연결된 간선들 중에서 작은 가중치를 가지는 간선을 선택하여 만드는 알고리즘입니다.

Sollin 알고리즘

각 정점에 대해서, 정점에 연결된 가장 가중치 낮은 간선을 선택하여 단계별로 진행하여 만드는 알고리즘입니다.





LIST

'전공 > 자료구조' 카테고리의 다른 글

선택정렬(SelectionSort), 거품정렬(BubbleSort)  (0) 2020.09.17
해싱(Hashing)  (0) 2020.09.14
DFS와 BFS  (0) 2020.09.13
트리 순회  (0) 2020.09.13
트리(Tree)  (0) 2020.09.13
SMALL

탐색 알고리즘에 DFS와 BFS가 있습니다.


DFS(Depth First Search)

DFS는 깊이우선탐색트리로 불리며, 먼저 들어온 노드를 중심으로 계속 탐색해 나가는 방식입니다.

위의 트리를 탐색하는 순서는 A->B->D->E->C->F->G 순으로 탐색을 합니다.

DFS 구현은 스택을 사용하여 가능하기에, 주로 재귀함수를 사용합니다. 장점은 마지막 방문한 노드의 데이터만 저장하면 되기에 공간이 절약됩니다. 단점은 노드의 깊이가 깊으면 성능이 떨어지고 최단경로가 된다는 보장이 없습니다.


BFS(Breath First Search)

BFS는 넓이우선탐색트리로 불리며, 먼저 들어온 노드가 인접한 노드를 순서대로 탐색해 나가는 방식입니다.
위의 트리를 탐색하는 순서는 A->B->C->D->E->F->G순으로 탐색을 합니다.
BFS 구현은 큐를 사용하여 가능합니다. 장점은 목표노드까지의 최단경로를 보장합니다. 단점은 모든 노드들의 저장할 공간을 요구합니다.


LIST

'전공 > 자료구조' 카테고리의 다른 글

해싱(Hashing)  (0) 2020.09.14
Kruskal, Prim, Sollin 알고리즘  (0) 2020.09.13
트리 순회  (0) 2020.09.13
트리(Tree)  (0) 2020.09.13
선형구조와 비선형구조  (0) 2020.09.13

+ Recent posts