컴공 일기197
게시글 주소: https://dev.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를 선물하세요.
-
이거 개쩌는 공부법인듯 2 1
1주마다 문제집 제끼고 오르비에 인증하기 앉아있는 시간은 같지만 공부량 ㅈㄴ 늘어난게 체감이 됨
-
윤사 코드원 샀음 1 2
윤사 개박살 났으니까 그래도 김종익 플러스 해서 코드원까지 하려고..
-
전화하고싶다 3 0
누구든좋으니까
-
작년에 2 0
2월부터 수능까지 새르비에 항상 있었던 사람이 있음
-
소아과 의사 누구였지 6 0
오르비언 ㅇㅅㅇ
-
한 달 뒤 새르비 상황 1 3
제목:진짜 다 뒤1졌냐? 2분전 조회수 8 작성자 수능 ㅈ된 설의적표현 내용:
-
???
-
수1 자작 0 1
수열 문제입니다. 거의 국밥 유형인 케이스 분류 문제에요. 오류 발견하시면...
-
아빠 안잔다 2 1
채널 돌리지 마라
-
유튜브하나보고 1 1
마저공부해야지
-
머리 안돌아가서 인강듣는데 2 0
인강도 내용이 잘 안들어옵니다.. 이럴땐 걍 자고 내일할까요?
-
저 누군지 모름? 1 1
구름과자임;;
-
죽었다. 0 0
새르비
-
치통에 4 2
잠을못자는중이에요.. 신경치료각이내
-
유빈이 진짜 야함.. 1 1
거꾸로 하면 빈유임.. 개좋네
-
이원준쌤 문학 괜찮나요? 1 0
ㅈㄱㄴ
-
햄버거 먹음 청년 2 1
슈슈버거세트
-
1회는 13,14 잘 넘기면 어찌어찌 40 중후반대까지 갈 수는 있는데 2회 <-...
-
수행평가로 책 소개하기가 있습니다. 식자경을 희망하고 있어요 책 추천해주실수 있나요
-
실모 만들면 출제자가 시간 세팅해서 딱 올려두고 시간 되면 참여자들이 맞춰서 푼...
-
수학 강사 추천 0 0
수리논술 할거라 미적, 확통, 기하 다 할건데 김범준 VS 정병호 (김범준은 기하...
-
쿠팡플레이 F1 해설위원인 윤재수 해설위원이 서울대 화학과 출신인데... 0 0
서울대 화학부 91학번인데, 1지망을 물리학과(현 물리천문학부 물리학전공) 2지망을...
-
오르비 흰바탕이 왼눈으론 뻘겋고 오른눈으론 누럼
-
차엿어요.. 3 1
...
-
3모 예상등급 0 0
33343정도…국어는 기출 풀기 시작한지 얼마 안 됐고 수학은 미적개념 돌리는...
-
기하러분들 0 0
서프 10번 내적으로 푸시려나
-
컨디션 좋은 상태로 독서실 다시 가고싶어
-
남은게돈뿐이구나 1 0
사람도사랑도식어감…
-
당분간 사립니다
-
난너무간지나서개명신청햇어김간지 0 0
역시난비주류야킥킥
-
지금까지 과학문제집 푼거 제외로 추천하는거있나요? 2 1
기출픽 1등급만들기 오투(개념으로씀) 완자(추가) 메가스터디 N제 자이스토리...
-
맞팔구 0 0
ㅇㅇ
-
반 단톡에서 생일인 사람들 축하해 주던데 그들은 헛걸음질을 하게 될것입니다 ㅋ
-
근데 부엉이껀 챙기면 진짜 개추 ㅋㅋ
-
화작에 2사탐 기준으로요 고대가 표점본다고하긴하던데 백분위로 대충 봐주실수있으신가요...
-
예체능 재순데 올해도 수학 유기하고 수능보면 평생 아쉬울것같아서 수학 지금 시작하고...
-
하쿠 1 0
들으샘
-
내가 그러고 있음 개찐따샛기..
-
이거 대략 현 예상 내 등급 1 2
아마 11313? 아니면 11314? 일듯. 아직 영어는 안 풀긴 했지만. 설마...
-
[Zola] 3월 교육청 대비 0 2
Zola임당. 3월 교육청 대비의 의미없음에 대해서는 아래 영상에서 말씀을...
-
사탐런 고민 3 1
현역이고 작수 물지 당일에 모의수능으로 학원가서쳤을때 2/1떴었는데 사탐런하면...
-
사실 저는 어제 생일이였습니다 왜 말하지 않았냐고요? "모두가 날 신경쓰는척 행동하는게 역겨우니까"
-
옯창 리스트 2 3
-
3월 더프 미적 4 1
21 22 30 틀려서 88점이네
-
과학 문제집중에 7 2
가장 어려운거 뭐임요??
-
야 신난다!
-
자꾸 간봐서 그렇긴 한데 3모 기간이 일정이 뭐가 많아서 아무도 안 볼거면 시간...
-
진지한 국어 질문 7 1
현역때 국어 안했고, 올해 3월에 처음 시작했습니다.선택은 화작목표는 6월에 3등급...
-
[이벤트] 2027학년도 Prologue 모의고사 1회 배포 19 12
OMR 링크:...
-
이제 심판의 시간이 다가왔다 5 2
더프 수학 채점해야 함.

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