CLRS 제 3 판의 "최악의 선형 시간의 선택"에서는 목록의 중앙값을 찾기위한 "선택"알고리즘 (Blum, Floyd, Pratt, Rivest 및 Tarjan으로 인해 BFPRT 알고리즘이라고도 함)에 대해 설명합니다. 최악의 경우 O (n) 시간. 화이트 보드에서 샘플을 실행하려고하면 약간 혼란 스럽습니다. 나는 "Select"에 대한 호출마다 특정 수의 요소를 제거 할 수 있다는 것을 이해합니다. (30 %는 다시 읽어야하는 반면 70 %는 다시 검사해야 함), 어떤 부분이 혼란 스럽습니까? 즉, 배열이 높이 5와 너비 n/5 인 행렬로 시각화되면 제거 된 요소는 어느 사분면에 놓이게됩니까? 원래 그것이 대각선으로 인접한 두 사분면이라고 생각했지만 지금은 중앙값의 중간 값에 따라 단 하나의 사분면이라고 생각하고 있습니다 (단계 5, 6 및 7 참조) here.중간 값 선택 알고리즘 - 절대 평균값 또는 절대 값 중앙값에 가까운 "중앙값의 중앙값"을 찾습니다.
그래서 위키피디아에 가서 CLRS보다 적은 분석으로 빠른 설명이 있는지 살펴 보았습니다 (분석을 위해 CLRS로 다시 뛰어 오기 전에 알고리즘을 이해하기 위해). 나는 this에 왔는데, 특히 '마침내 중앙값의 중간 값'이 피봇으로 선택되었습니다. " 위키 피 디아에있는 설명의 소리에서 "선택"은 중간 값 인 진정한 중앙값을 찾지 못합니다 - 퀵 소트의 피봇 선택에 충분합니다.
그렇다면 "선택"은 진정한 중간 값의 관점에서 무엇을합니까? 이 모든 것을 생각해내는 구절은 "부분적 계층 구조"입니다. 이해하는 바와 같이 "선택"이 작동하지만,이 논리의 일부분만으로이 부분 계층 구조에 기반한 중앙값이되는 요소를 제거 할 수 있습니까?
BFPRT는 기본적으로 피벗 선택이 향상된 quickselect입니다. quickselect를 사용하면 피벗 * somehow *, 파티션을 선택한 다음 상반부 또는 하반부에서 재귀 적으로 호출 할 수 있습니다. BFPRT는 각 재귀 단계 *에서 median-of-median을 피벗 *으로 사용하여이를 수정합니다. –