마지막 수업 시간에 할게없다고 하신 교수님은 자료구조가 아닌 알고리즘을 수업 하신 것 같다.그 과정에서 자료구조 심화내용??
여러 개의 자료 중에서 원하는 자료를 찾는 작업
정렬되지 않은 배열을 처음부터 마지막까지 하나씩 검사하는 방법
배열의 중앙에 잇는 값을 조사하여 찾고자 하는 항목이 왼쪽 또는 오른쪽 부분 배열에 있는지를 알아내어 탐색의 범위를 반으로 줄여가며 탐색 진행
int search_binary(int key, int low, int high) {
int middle;
if ( low <= high ) {
middle = (low+high) / 2;
if ( key == list[middle] )
return middle;
else if (key < list[middle])
return search_binary(key, low, middle-1);
else
return search_binary(key, middle+1, high);
}
return -1;
}
int search_binary(int key, int low, int high) {
int middle;
while (low <= high) {
middle = (low+high) / 2;
if (key == list[middle])
return middle;
else if (key > list[middle]
low = middle+1;
else
high = middle-1;
}
return -1;
}
인덱스 테이블을 사용하여 탐색의 효율 증대
주 자료 리스트에서 일정 간격으로 발췌한 자료 저장
탐색키가 존재할 위치를 예측하여 탐색하는 방법: O(log(n))
모든 노드의 왼쪽과 오른쪽 서브트리의 높이 차가 1이하인 이진탐색트리
왼쪽 서브 트리의 높이 - 오른쪽 서브 트리의 높이
- 모든 노드의 균형 인수가 ±1 이하이면 AVL 트리
typedef struct AVLNode {
int key;
struct AVLNode *left;
struct AVLNode *right;
} AVLNode;
int get_height(AVLNode *node) {
// 트리 강의자료 내 있다고 하시네요
}
int get_balance(AVLNode *node) {
if (node == NULL)
return 0;
return get_height(node->left) - get_height(node->right);
}
AVLNode *rotate_right(AVLNode *parent) {
AVLNode *child = parent->left;
parent-left = child->right;
child->right = parent;
return child;
}
AVLNode *rotate_left(AVLNode *parent) {
AVLNode *child = parent->right;
parent->right = child->left;
child->left = parent;
return child;
}
AVLNode *rotate_left_right(AVLNode *parent) {
parent->left = rotate_left(parent->left);
return rotate_right(parent);
}
AVLNode *rotate_right_left(AVLNode *parent) {
parent->right = rotate_right(parent->right);
return rotate_left(parent);
}