컴공 일기197
게시글 주소: https://orbi.kr/00059098866

순차탐색은 일단, 시간복잡도가 O(N)인 반면... 이진 탐색은 시간복잡도가 O(Log2N)이기 때문에 훨씬 성능이 좋은 알고리즘이라 할 만합니다. 다만 문제는, 배열로 데이터가 주어진 경우에는 인덱스를 통해서 중앙 요소의 데이터를 구할 수 있고 이를 토대로 간단히 구현 가능하지만, 만약 구조가 링크드 리스트라면, "중앙 요소"를 쉽게 찾아낼 수 없게 된다는 것입니다. 그래서, 링크드리스트 속에서도 이 중앙요소를 판별하기 위해 사용하는 자료구조가 있으니, 그것이 바로 이진 탐색 트리(Binary Search Tree)가 되겠습니다. 이 구조에는 중앙요소를 쉽게 판별하기 위해서 정한 규칙이 몇 가지 있는데, 그건 넘어가도록 하겠습니다. 궁금하시면, 찾아보셔요! 간단하게 말하면, 순열처럼 자료의 크기에 따라 위치시켜야 하는 장소가 정해져 있습니다. 그래야, 중앙에 위치하게 되는 데이터가 무엇인지 알아낼 수 있겠지요? 다음 그림이 바로 그 규칙을 토대로 생성한 이진 탐색 트리의 구조입니다.
여하튼 다시 본론으로 돌아가서, 이진 탐색 트리는 링크드리스트에서 중앙요소를 찾아내기에 굉장히 용이한 자료구조라고 보면 됩니다. 이것을 이용하면, 링크드리스트에서도 얼마든지 이진 탐색이라는 고성능의 알고리즘을 사용할 수 있다는 것입니다. 결국 이진 탐색은 중앙 요소를 경계로 하여 빠르게 원소들을 분별하는 것이 핵심이니까요.
다음은 그냥 예제 코드입니다.
헤더파일 : "Binary.h"
#pragma once
#ifndef BINARY_SEARCH_TREE_H
#define BINARY_SEARCH_TREE_H
#include <stdio.h>
#include <stdlib.h>
typedef struct tagBSTNode
{
struct tagBSTNode* Left;
struct tagBSTNode* Right;
int Data;
}BSTNode;
BSTNode* BST_CreateNode(int Newdata);
void BST_DestroyNode(BSTNode* Node);
void BST_DestroyTree(BSTNode* Tree);
BSTNode* BST_SearchNode(BSTNode* Tree, int Target);
BSTNode* BST_SearchMinNode(BSTNode* Tree);
void BST_InsertNode(BSTNode* Tree, BSTNode* Child);
BSTNode* BST_RemoveNode(BSTNode* Tree, BSTNode* Parent, int Target);
void BST_InorderPrintTree(BSTNode* Node);
#endif
BinarySearchTree.c
#include "Binary.h"
BSTNode* BST_CreateNode(int NewData)
{
BSTNode* NewNode = (BSTNode*)malloc(sizeof(BSTNode));
NewNode->Left = NULL;
NewNode->Right = NULL;
NewNode->Data = NewData;
return NewNode;
}
void BST_DestroyNode(BSTNode* Node)
{
free(Node);
}
void BST_DestroyTree(BSTNode* Tree)
{
if (Tree->Right != NULL)
BST_DestroyTree(Tree->Right);
if (Tree->Left != NULL)
BST_DestroyTree(Tree->Left);
Tree->Left = NULL;
Tree->Right = NULL;
BST_DestroyNode(Tree);
}
BSTNode* BST_SearchNode(BSTNode* Tree, int Target)
{
if (Tree == NULL)
return NULL;
if (Tree->Data == Target)
return Tree;
else if (Tree->Data > Target)
return BST_SearchNode(Tree->Left, Target);
else
return BST_SearchNode(Tree->Right, Target);
}
BSTNode* BST_SearchMinNode(BSTNode* Tree)
{
if (Tree == NULL)
return NULL;
if (Tree->Left == NULL)
return Tree;
else
return BST_SearchMinNode(Tree->Left);
}
void BST_InsertNode(BSTNode* Tree, BSTNode* Child)
{
if (Tree->Data < Child->Data)
{
if (Tree->Right == NULL)
Tree->Right = Child;
else
BST_InsertNode(Tree->Right, Child);
}
else if (Tree->Data > Child->Data)
{
if (Tree->Left == NULL)
Tree->Left = Child;
else
BST_InsertNode(Tree->Left, Child);
}
}
BSTNode* BST_RemoveNode(BSTNode* Tree, BSTNode* Parent, int Target)
{
BSTNode* Removed = NULL;
if (Tree == NULL)
return NULL;
if (Tree->Data > Target)
Removed = BST_RemoveNode(Tree->Left, Tree, Target);
else if (Tree->Data < Target)
Removed = BST_RemoveNode(Tree->Right, Tree, Target);
else
{
Removed = Tree;
if (Tree->Left == NULL && Tree->Right == NULL)
{
if (Parent->Left == Tree)
Parent->Left = NULL;
else
Parent->Right = NULL;
}
else
{
if (Tree->Left != NULL && Tree->Right != NULL)
{
BSTNode* MinNode = BST_SearchMinNode(Tree->Right);
MinNode = BST_RemoveNode(Tree, NULL, MinNode->Data);
Tree->Data = MinNode->Data;
}
else
{
/*자식이 하나 있는 경우*/
BSTNode* Temp = NULL;
if (Tree->Left != NULL)
Temp = Tree->Left;
else
Temp = Tree->Right;
if (Parent->Left == Tree)
Parent->Left = Temp;
else
Parent->Right = Temp;
}
}
}
return Removed;
}
void BST_InorderPrintTree(BSTNode* Node)
{
if (Node == NULL)
return;
BST_InorderPrintTree(Node->Left);
printf("%d ", Node->Data);
BST_InorderPrintTree(Node->Right);
}
main.c
#include "Binary.h"
int main(void)
{
BSTNode* Tree = BST_CreateNode(123);
BSTNode* Node = NULL;
//이진 탐색 트리 규율에 맞게 노드 생성
BST_InsertNode(Tree, BST_CreateNode(22));
BST_InsertNode(Tree, BST_CreateNode(9918));
BST_InsertNode(Tree, BST_CreateNode(424));
BST_InsertNode(Tree, BST_CreateNode(17));
BST_InsertNode(Tree, BST_CreateNode(3));
BST_InsertNode(Tree, BST_CreateNode(98));
BST_InsertNode(Tree, BST_CreateNode(34));
BST_InsertNode(Tree, BST_CreateNode(760));
BST_InsertNode(Tree, BST_CreateNode(317));
BST_InsertNode(Tree, BST_CreateNode(1));
BST_InorderPrintTree(Tree);
printf("\n");
printf("Removing 98....\n");
Node = BST_RemoveNode(Tree, NULL, 98);
BST_DestroyNode(Node);
BST_InorderPrintTree(Tree);
printf("\n");
printf("Inserting 111...\n");
BST_InsertNode(Tree, BST_CreateNode(111));
BST_InorderPrintTree(Tree);
printf("\n");
BST_DestroyTree(Tree);
return 0;
}
코드 실행 결과 :
1 3 17 22 34 98 123 317 424 760 9918
Removing 98....
1 3 17 22 34 123 317 424 760 9918
Inserting 111...
1 3 17 22 34 111 123 317 424 760 9918
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
https://downbe.com/He6Y 현재 틱톡에 영상 박제되서 안지워지는중ㅋㅋ
-
수능 때까지 국어 영어 버리기 2 1
-
진짜 문학을 너무못해서 올오카에 기출복습도 다했는데 맨날 3-5개틀려요..저좀 도와주세요
-
N제 풀지 말까요 2 0
지인선 시즌1 푸는데 중부터 상까지 10문제 중 3문제는 아예 모르겠고 3~4문제는...
-
사탐의대 1 0
고조원관제 의대 재학중이고 더 좋은 의대 목표로 반수 시작하려하는데요.. 재수할때...
-
소리쳐부르지만 0 0
대답없는노을만붉게타는데
-
수학 공부 도와주세요 0 0
확통이고 평가원은 1번밖에 안봐서… 작년은 152122 그냥 아예 안 건드렸었고...
-
이감 5-1 4 1
문학 2틀 언매 1틀 ㅁㅌㅊ
-
심심해 6 1
-
영어 고정 2등급 공부법 0 0
말 그대로 고정 2뜨는 현역인데 그냥 자이 4문제씩 푸는게 다임 다들 어케 공부 하시나요 ㅠㅜ
-
벌써 논술 시즌인가 1 0
논술준비하네
-
내일 새벽이 월컵 켤승이네 1 1
메 신
-
맞팔구 4 3
-
크런치슬랑이 개좋아 ㅁㅊ 9 2
-
리트침 청년 만나서 시험지 좀 구경하는데 개재밌음
-
오ㅓ 아티스트 7 1
이번년도엔 기하도 잇구나
-
논술로 대학가면 과외할까 6 3
근데 28에도 기하 미적 남아있나
-
뱃지 줘 2 1
언제 줘
-
롤 3년전 에메랄드 3 1
하지만 지금은 안해서 골드
-
버킷리스트임
-
리트는 내일푸는걸로해야징 0 2
ㅇㅇ 좆망하면 조용히 언급없이 글삭예정
-
맞팔구 4 0
모x가
-
7덮 1 0
국수 100 100 맞고 옴 다들 난이도 체감 어떠셧나요
-
수능은 여러분에게 보상을 주기 위해 있는 시험이 아니에요 22 13
그냥 등급인증마크 찍는 품질분류기일 뿐이지 근데 뉴비들은 이걸 무슨 rpg처럼...
-
정당한 이의를 따져도 댓글이 안보이면 욕을 먹는게 1 4
당연하지.. 무슨 욕이라도 쓰는 댓글이면 지워지는 게 맞는데(근데 아까 해명 영상에...
-
국어ㅈㅂㅈㅂ 0 0
독서 다 맞는데 문학 10개씩 쳐 틀랴요.. 9시 30이전으로 항상 독서 독서론...
-
이감 5-2 기술지문 22 1
13분 쓰고 2개 틀렸네 진짜 하..
-
7덮 라인 봐주실수있나요 6 0
언 89 확 65 영 3 생윤 38 윤사 42 교원대 가능할까요,,, 부산.경북대...
-
번장 문제지가 잘못왔는데 6 5
판매자 분이 너무 귀여우시다 ㅠㅠㅠㅠ 되게 당황해하심 그냥 공짜로 다시...
-
윤성훈 적중예감 프리 1등급컷좀 알려주실분!!!!! 1 0
1~6회차 1컷 인강에서 공개했나요? 몇점인가요?
-
본인학교 한문 선택자 11명임 7 1
한문하고싶엇는데 무서워서못하겟음..
-
언매 0 1
내신 빡셌어서 겨울에 김승리 선택 언어까지만 하고 유기하다 내신 끝나고 언매 다시...
-
현역 잇올 학프 2 0
화작85 미적92 영어87 경제35 사문47 설대힘드려나 남은기간동안 아무과라도..
-
일본은 편의점, 가게, 직장에서 일할 때 폰으로 농땡이 못 피우는 게 10 4
여기선 손님 앞에 있는데도 결제하면서도 대놓고 폰 뚫어져라 쳐 하거나 직장에서 월급...
-
사문 적생모알파 2회 50점 4 1
야호 잘하는 과목이 사문밖에없어서 얘라도 자랑함.. 시간없어서 20번 찍맙한건 비밀
-
수열문제만들엇음 2 1
서바1회 22번에 감명받아서 만들엇슴다 아래는 해설지!
-
“신입보다 AI가 돈 덜 들어”… 무경력 청년, 취업 문 더 좁아진다 [쉬었음 청년 추적기:우리는 쉬지 않았습니다] 2 0
매년 100명 안팎의 신입사원을 채용하던 한 정보통신(IT) 기업은 올해 신입...
-
슬프당 3 3
추리 더 잘 볼 수 있었는데
-
국어만오르면 0 0
갈수있을거같은데.. 국어가진짜하기가싫네
-
수린식 야추 인증) 4 6
야추 3번 뜸 총 4번
-
사관학교 국어 시험 현장에서 본 사람 있으면 질문좀 0 0
국어 오늘 기출 받아서 풀어봤는데 원래 이렇게 시간배분 빡빡해요? 작년 26학년도...
-
어케 밥먹을라구 포크만 들ㄹ면 6 1
바로 손님이 들어오냥뺘아앍
-
인생은 과정의 연속이다 3 0
수능공부도 재밋고 보람차게 하는거야
-
스카에 나일론 바지 입고오는 새기들은 먼생각이지 10 2
진짜 ㅈㄴ 바스락거려 ㅠ 공중부양 해서 나가면 봐줌
-
자 기트남어 만표 역전세계 소설 써봐야겠지?
-
이럴거면 물생을 할걸 독서와 작문 1 확률과 통계 1 미적분2 3 영어2 2 역학과...
-
궁금한거있는데 답좀 15 1
근데 수학 자이스토리. <—- 이거은근 하는사람있던데 도움이됨? 물론 기출푸는건...
-
치명적인게뭔지궁금하면개추 ㅋㅋ 0 5
나도범작가한테도움받았지만 뭔가뭔가싶은게한두개가아니긴해
-
[단독] '제자 성추행' 경기대 신임 총장, 재판 중 용인대 부총장도 재직 4 1
[앵커] 제자를 강제 추행 한 혐의로 수사와 재판을 받던 중에 대학 총장으로 선출된...

하지만 node의 삽입/삭제가 빈번해서 skewed 이슈가 발생하거나 그걸 해결하기 위한 balancing 연산량이 일정량 이상 필요할경우 순차탐색이 나을수도
구현이 간단하기도 할 것이구요...! 아무래도 알고리즘이라는 건 역시 때에 따라 잘 '선택하여 사용'하는 것이 중요한 것 같아요 ㅎㅎ