작성
·
297
1
안녕하세요! 궁금한 점이 생겨 질문드립니다!! 항상 잘 보고 있습니다!
INSERT, UPDATE, DELETE가 자주 발생하면 인덱스 재구성이 일어난다고 하신 부분이 헷갈려서 질문드립니다!
DELETE의 경우 실제로 트리에서 삭제하는 것이 아니라 기존 인덱스를 사용하지 않음 처리만 한다고 알고 있고, UPDATE는 사용하지 않음 처리 + 새로운 인덱스 추가 작업이 이루어지는 것으로 알고 있는데요. 그럼 결국 트리에 새로운 데이터가 추가되면서 트리가 비대해져서 트리 깊이가 깊어져 검색속도가 좀 더 오래걸려서 단점인 것일까요??
또 실제 트리에서 인덱스를 삭제하지 않고, 사용하지 않음 표시만 하는 이유는 뭔지 궁금합니다!!
답변 2
1
Update는 Delete + Insert로 볼 수 있어서 Delete와 Insert에 대해서만 보충 설명드리겠습니다.
1. 인덱스 재구성
일단 Insertion으로 인해 node가 너무 커지면 split을 해야 하고
deletion으로 인해 node가 매우 작아지면 ( n/2 pointers보다 더 적은 수를 가지고 있을 때) node끼리 합치게 됩니다.
게다가 split과 combine을 할 때, 전체 트리의 balance도 유지 되어야 하기 때문에 이 모든 것들을 고려하여 인덱스가 재배치가 되는 것입니다.
즉 insertion과 deletion에는 split,combine, balance유지 등으로 인덱스가 제배치되는 작업들이 동반하기 때문에 단순히 조회만하는 것과는 훨씬 복잡하고 시간이 많이 소요되게 됩니다.
2. 실제 트리에서 인덱스를 삭제하지 않고, 사용하지 않음 표시만 하는 이유
구현방법에 따라서 인덱스를 진짜로 삭제하지 않고 사용하지 않음 표시만 하는 경우가 있습니다. 이는 deletion과정이 덜 복잡하도록 하기 위한 스킬같은 것입니다. 예를 들어 node의 중간에 있는 데이터를 삭제하게 되면 오른쪽에 있는 모든 데이터들을 한칸씩 shift left를 해줘야겠죠. 이런 과정에서 복잡한 작업들이 동반되기 때문에 이를 간소화 하기 위해서 사용하는 방법입니다.
혹시 보충 설명이 필요하다면 언제든 질문주세요 :)
0