컴공 일기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를 선물하세요.
-
메가 완전 양도 0 0
20마넌에 양도하무니다 엔수생 환영 ^_^
-
국어만 잘본 7모 성적표 2 1
화2는 만표가 얼마이길래 저따위 등급컷이..+ 물1 1.8만 ㅋㅋㅋㅋㅋㅋ
-
수완 실모 지문 재밌네 0 0
전 주식투자 안해요
-
호프 보고옴 3 1
호불호 갈린다는데 그럭저럭 볼 만한 듯 재밌었음 근데 여배우 대사 도대체 누가 짬..??
-
오르비를 너무 많이 했나,,, 4 3
생기부 활동 마무리하고 공부하고 돌아올게요
-
요즘 조 강 현 이분들 왜이렇게 따뜻해진 것 같지? 1 2
작년 기준으로 좀 달라진듯
-
수학 잘하고싶다 9 0
안정 1만 뜨면 어디든지 갈 수 있을 것 같은데...
-
아 존나웃기네 진짜 ㅋㅋㅋㅋㅋ 8 3
-
앱스키마로 첨부터끝까지 돌리면 도움이 될거같기한데 양이 많아보여서 가능할지...
-
딴얘긴데 24발롱은 사실 0 0
로드리vs비니시우스 구도가 아니라 로드리vs벨링엄에 포디움 비니시우스vs케인 경쟁인 거 같기도 함
-
어디서 메시에 비벼 ㅉ
-
국어 1~2진동 조언좀 0 0
3모 65점(3등급) 5모 98점(1등급) 6모 96점(1등급) 7모...
-
축구 본 후유증이 졸음으로 옴 2 1
피곤하다,,,
-
오늘의 공부목표 1 1
기하 기출 벡터 탐구 기출 22~23 딱 이것만 끝내고 놀아야지
-
진짜 수능 리트 판에서 나처럼 AI 가혹하게 굴리는 사람이 있을까
-
갑자기 기분 좋아짐
-
7덮14번 감각으로 풀기 1 0
A는 음수임을 눈치채고 수1 범위에서 삼각함수의 핵심은 대칭성, 주기성인데...
-
조금만 더 많았으면,,
-
[021119(인문)] 실전 개념은 과연 정말 도움이 되는가? 0 1
지식을 왕창 늘려서 문제를 해결하려 하는 태도는 수능이라는 시험의 취지에 맞지 않을...
-
7덮 수학 풀어왔습니다 11 1
28,30틀 92점 15,21,22에서 힘을 많이 뺐네요 오히려 14가 상당히...
-
아무리생각해도 5 1
작년 겨울방학이 국어 씹고점이었음 수능쳐야되는해에 퇴화중
-
집중안됐던 이유 5 2
약간의 우울함 + 집에 누가 있음 이었슨,,, 역시 난 혼자 살아야 하는 운명인가 봐
-
팔굽혀펴기 30개 했음 7 2
오운완 이제 오공완할거임
-
이 암흑 에너지라는 녀석이 10 3
개인적으로는ㄴ 현대판 에테르같은 느낌이 없잖아 있는 것 같다는 입장이라ㅏ삼칠은...
-
옆에분 오릅이 하시네 11 2
ㅋㅋ 님아 여긴 규동보다 카레가 더 맛있음요
-
또 2시간 반 자버려서,, 그냥 나가서 밤잠 챙기고싶다
-
240628 처음 기출 풀때 0 1
이런게 평소 28이라고? 이생각함 풀면서
-
이해원n제 시즌1 정답률 70~80%정도인데 다음n제 1 0
설맞이시즌2->이해원n제 시즌2 괜찮나요?
-
27리트 0 1
집리트 22점 ㅅㅅ
-
7덮 이후 국어 방향성 1 0
화작런 하고 2주 정도 지난 후에 더프를 봤는데요 7모 땐 화작 네개 틀렸는데...
-
죽도 2 1
못 쓰다임 못 쑤다임 ? 검색해보니 이런 말이 안나오는디
-
난 지금 잘 태어난듯 2 0
24시절까지의 준킬러 메타에선 그냥 죽었을거 같음
-
졸면 깨워주는 Studynight 사이트 정식 출시했어요. 1 2
카메라로 졸음 감지하면 음악과 알림으로 깨워주고, 영상이 폰 안에서만 처리되는...
-
개인적으로 바라는 수능난이도 2 0
언매 26수능 (점수떠나서 버티면서 꾸역꾸역 운영하기엔 ㄱㅊ았음) 기하 공통...
-
이것도 못하면 난 기하를 할 자격이 없어
-
11,12,13,15,20,21,22,28,30 다 문제가 재밌고 표점도 좋았음
-
나도 센츄 달고 싶은데 5 0
직탐이라 시발 기회가 1년에 3번이네
-
중위권들은 준킬러 손도 못대고 상위권들은 28에서 변별 깔끔하게 됨 만표도 높고...
-
김종웅 주제특강<<어떰? 0 0
아직 동사 기출 안돌린 버1러지인디 저거 후딱하고 백건아 하이앤드 아카이븐가 돌릴려는디
-
2021수능 국어가 딱 24 4
쉽지도 엄청 어렵지도 않은데 변별은 깔끔하게 잘되는 그런 수능 굳이 따지자면 어려운...
-
로드리 골든볼이 맞음? 5 2
이새기 유로도 그렇고 피파가 밀어주는거 아님??
-
7모 성적표 받았는데 5 0
싹다마킹실수해서 1등급씩 내려감… 뭐지 귀신 들렸나 나름 마킹 잘 했다고 생각하는데
-
2027 LEET 응시 후기 — 수능 수험생들에게 적용할 만한 이야기 2 6
지난번 글에서 예고했던 대로, 채점 결과와 함께 LEET 응시 과정에서 느낀 것들...
-
교육청이나 평가원 모의고사 중에 젤 얼마 안남은 게 5 1
9모임??
-
교통카드 멋있긴 한데 1 0
빨간색 프린트가 너무 잘 벗겨짐 살짝만 긁혀도 바로 스윽 개선해줘잉
-
하시는 분들 저녁식사는 다들 어떻게 하심? 공부 끝나고 집가서 10시쯤 먹는데 다들 비슷하신가?
-
7모 성적표(99.05) :( 9 1
국어: 뽀록&교육청틱 수학: 말림&실력 부족 영어: GOOD 물1: 저능한 실수는...
-
다방에서 밥이나먹어야긋다 1 0
ㅊㄴ다방

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