배경 : 차오 쑤 몇 시간 전에 다음과 같은 질문을 게시 : " 이 정렬 네트워크에 감소하지 않는 알고리즘 등 각 요소가 비교되어 정렬 공지의 비교 있습니까 ? 시간을 ." 우리는이 문제에 약간 얽매어있는 것 같습니다. 2009 년 Valentin Polishchuk과 같은 문제에 대해 논의했지만 아무데도 갈 수 없었습니다.
신선한 아이디어를 얻으려면 비슷한 맛을 지니고 있으며 사소한 것이 아닌 가장 간단한 질문을 시도했습니다. 따라서 다음 질문입니다.
질문 : 각각 요소가있는 두 개의 정렬 된 목록이 제공 됩니다. 각 요소가 O ( 1 ) 번만 비교되도록 목록 을 병합 할 수 있습니까 ?
당연히, 출력은 모든 요소 를 포함하는 정렬 된 목록이어야합니다 .
[이것은 사소한 것으로 판명되었습니다. 대답은 "아니오"입니다.]
질문 2 : 두 개의 정렬 된 목록이 제공되며 각각 요소가 있습니다. 소량의 요소 를 버릴 수있는 경우 각 요소가 O ( 1 ) 회만 비교되도록 목록 을 병합 할 수 있습니까 ?
보다 상세하게, 출력은 정렬 된 목록이 포함되어야 요소와,이 "휴지통"은 포함하는 T ( N ) 요소. T ( n ) 값을 얼마나 작게 만들 수 있습니까? T ( n ) = n을 얻는 것은 간단합니다. T ( n ) = n / 100 과 같은 것은 간단한 방법으로 수행 할 수 있어야합니다. 그러나 T ( n ) = o ( n ?
노트:
여기서는 비교 모델을 사용합니다. 결정 론적 알고리즘만으로 최악의 보증에 관심이 있습니다.
참고 것을 모두 리스트는 정확히이 요소를. n 개의 요소가있는 목록과 1 개의 요소가있는 목록이 있다면 그 대답은 분명히 "아니오"입니다. 그러나 두 목록이 모두 길면 "로드 밸런싱"을 수행 할 수 있는 것 같습니다 .
이번에는 모든 종류의 알고리즘이 유효합니다. 알고리즘이 정렬 네트워크를 빌딩 블록으로 사용하는 경우 완벽하게 좋습니다.
시작점으로 여기에 각 요소를 최대 200 회 비교하는 간단한 알고리즘이 있습니다. 표준 병합 알고리즘 만 사용하고 목록 헤드의 카운터는 유지하십시오. 200에 도달하면 요소를 버리십시오. 이제 버린 각 요소에 대해 출력 배열에 200 개의 요소를 성공적으로 배치했습니다. 따라서 을 달성했습니다 .