CS 기초 · 심화
대용량 데이터를 다루는 시스템에서 배열 중간 삽입/삭제가 빈번할 때, 연속 메모리 배열 대신 어떤 자료구조를 고려할 수 있나요? gap buffer, rope, 또는 unrolled linked list 같은 대안들의 적용 시나리오와 트레이드오프를 설명해주세요.
힌트 · 삽입 위치의 지역성과 캐시 효율, 그리고 각 구조가 어떤 접근 패턴에 유리한지 관점에서 접근하세요.
Gap BufferRopeUnrolled Linked List시간 복잡도메모리 오버헤드
모범답안
대용량 데이터에서 배열 중간 삽입/삭제가 빈번하다면, 연속 메모리 배열의 비효율성을 피하기 위해 몇 가지 자료구조를 고려할 수 있습니다.
Gap Buffer는 텍스트 편집기 등에서 커서 주변의 삽입/삭제가 잦을 때 유리합니다. 배열 중간에 'gap'을 두어 삽입/삭제 시 gap만 이동시키므로, O(1)에 가까운 성능을 보입니다. 하지만 gap이 커지면 이동 비용이 증가하는 단점이 있습니다.
Rope는 매우 긴 문자열을 다룰 때 효과적입니다. 문자열을 트리 구조로 분할하여 관리하므로, 삽입/삭제 시 해당 부분만 재구성하여 O(log N)의 시간 복잡도를 가집니다. 메모리 오버헤드가 있지만, 큰 문자열의 부분적인 수정에 강점을 보입니다.
Unrolled Linked List는 링크드 리스트의 각 노드에 여러 개의 요소를 담는 방식입니다. 삽입/삭제 시 노드 내에서 처리하거나, 필요에 따라 노드를 분할/병합하여 O(sqrt N) 정도의 성능을 기대할 수 있습니다. 캐시 효율성을 높여 순차 접근 성능도 개선됩니다.
각 구조는 삽입/삭제 위치의 지역성, 데이터 크기, 접근 패턴에 따라 장단점이 명확하므로, 시스템의 특성을 고려하여 선택해야 합니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.