"알고리즘 디자인 매뉴얼"책에 소비세 3-7는 말한다 :포인터를 신경 쓰지 않고 균형 이진 검색 트리에서 O (1) 시간을 최소 및 최대로 유지하는 방법은 무엇입니까?
가, 삽입, 삭제, 최소, 최대, 후계자 당신이 작업 검색의 각을 지원하는 균형 잡힌 사전 데이터 구조에 액세스 할 수 있습니다 가정 , O (log n) 시간의 전임자. 삽입 및 삭제 작업을 수정하여 O (log n)을 사용하지만 최소 및 최대 소요 O (1) 시간을 유지하는 방법을 설명하십시오. , 힌트없이
을 (힌트. 추상 사전 작업을 사용하는 대신 포인터 등에 대한 일 처리의 관점에서 생각 )이 질문은 매우 쉽게 생각합니다. 난 그냥 분은 항상 최소를 가리키는 포인터를 유지, 나무에 대한
, 다른 포인터 최대 항상 최대를 가리키는 :
여기 내 솔루션입니다.
x를 삽입 할 때 min.key와 x.key, if min.key > x.key, then min = x;
을 비교하고 필요한 경우 max에 대해 이렇게하십시오.
X를 삭제
,if min==x, then min = successor(x); if max==x, then max = predecessor(x);
는하지만 힌트는 내가 포인터 등에 대한 일 처리 수 없다고. 내 솔루션 포인터에 대해 머뭇 거리는가?
추가 점수를 사용할 수없는 경우 최소 및 최대 O (1)은 어떻게받을 수 있습니까?
감사합니다.
내 생각에 당신의 해결책은 당신이'insert'와' 당신이하는 일은'successor' 나'predecessor'에 대한 오래된'insert' /'delete'와 O (logn)의 O (log n)이기 때문에 O (log n) 총 O (log n)에 머문다. 그리고 여러분은 실제로'min'과'max' 값을 유지하기 때문에 여기서 포인터를 만지작 거리지 않습니다. – stryba
@stryba, 나도 그렇게 생각했다. 그러나 명확한 설명이 필요합니다. –
"mucking with pointer"부분에 대해 명확하지 않습니다. 내 생각 엔 이전의 최대/최소 값을 가리 키지 않고 후계자를 사용하는 것이 아닙니다. – stryba