이 작업은 필요한 숫자 목록의 길이 N에서 O (1) 인 알고리즘을 분명히 찾는 것입니다. 따라서 상위 100 개 숫자 또는 10000 개 숫자가 필요한 경우 삽입 시간은 O (1)이어야합니다.
여기서 요점은 목록 삽입에 O (1) 요구 사항이 언급되었지만 질문은 정수 공간에서 검색 시간 순서에 대해 아무 말도하지 않았지만 O (1)로 만들 수 있음이 밝혀졌습니다 게다가. 해결책은 다음과 같습니다.
키의 숫자와 값의 연결된 목록 포인터 쌍으로 해시 테이블을 배열하십시오. 각 포인터 쌍은 연결된 목록 시퀀스의 시작과 끝입니다. 이것은 일반적으로 다음 요소 중 하나 일 것입니다. 링크 된 목록의 모든 요소는 다음으로 높은 숫자를 가진 요소 옆에 있습니다. 따라서 링크 된 목록에는 정렬 된 필수 숫자 순서가 포함됩니다. 가장 낮은 숫자의 레코드를 유지하십시오.
랜덤 스트림에서 새로운 숫자 x를 가져옵니다.
마지막으로 기록 된 가장 낮은 숫자보다 높습니까? 예 => 4 단계, 아니오 => 2 단계
방금 가져온 숫자로 해시 테이블을 누르십시오. 출품작이 있습니까? 예 => 5 단계. 아니오 => 새로운 숫자 x-1을 가져 와서이 단계를 반복하십시오 (이것은 간단한 하향 선형 검색입니다. 여기 나와 함께하시면됩니다. 개선 될 수 있으며 방법을 설명하겠습니다)
해시 테이블에서 가져온 목록 요소를 사용하여 링크 된 목록의 요소 바로 뒤에 새 숫자를 삽입하고 해시를 업데이트하십시오.
기록 된 가장 낮은 숫자 l을 가져 와서 해시 / 목록에서 제거하십시오.
방금 가져온 숫자로 해시 테이블을 누르십시오. 출품작이 있습니까? 예 => 8 단계. 아니오 => 새로운 숫자 l + 1을 취하고이 단계를 반복하십시오 (이것은 간단한 상향 선형 검색입니다).
긍정적 인 숫자로 숫자는 새로운 가장 낮은 숫자가됩니다. 2 단계로 이동
중복 값을 허용하려면 해시는 실제로 중복 된 요소의 링크 된 목록 순서의 시작과 끝을 유지해야합니다. 주어진 키에서 요소를 추가하거나 제거하면 지정된 범위가 증가하거나 감소합니다.
여기에 삽입은 O (1)입니다. 언급 된 검색은 O (숫자 사이의 평균 차이)와 같은 것 같습니다. 평균 차이는 숫자 공간의 크기에 따라 증가하지만 필요한 숫자 목록의 길이에 따라 감소합니다.
따라서 숫자 공간이 큰 경우 (예 : 4 바이트 int 유형, 0에서 2 ^ 32-1까지) N = 100 인 경우 선형 검색 전략은 매우 좋지 않습니다. 이 성능 문제를 해결하기 위해 적절한 키를 만들기 위해 숫자가 더 큰 크기 (예 : 1, 10, 100, 1000)로 반올림되는 병렬 해시 테이블 세트를 유지할 수 있습니다. 이런 식으로 기어를 위아래로 움직여 필요한 검색을 더 빨리 수행 할 수 있습니다. 그런 다음 성능은 O (log numberrange)가된다.
이것을 더 명확하게하기 위해, 197이라는 숫자가 있다고 상상해보십시오. '190'으로 10s 해시 테이블을 치면 가장 가까운 10으로 반올림됩니다. 아무것도? 아니요. 120이 될 때까지 10 초 안에 내려갑니다. 그러면 1s 해시 테이블에서 129에서 시작한 다음 무언가를 칠 때까지 128, 127을 시도 할 수 있습니다. 연결 목록에서 197을 삽입 할 위치를 찾았습니다. 197 해시 테이블을 197 항목으로, 10s 해시 테이블을 190으로, 100s로 100을 100으로 설정해야합니다. 숫자 범위 로그의 10 배입니다.
나는 세부 사항 중 일부가 잘못되었을 수도 있지만 이것이 프로그래머 교환이고 컨텍스트가 인터뷰이기 때문에 위의 상황이 그 상황에 대해 설득력있는 대답이기를 바랍니다.
편집 병렬 해시 테이블 체계를 설명하기 위해 여기에 약간의 세부 사항을 추가했으며 언급 한 가난한 선형 검색이 O (1) 검색으로 대체 될 수 있음을 의미합니다. 또한 가장 낮은 숫자로 해시 테이블을보고 다음 요소로 진행하여 바로 다음 단계를 검색 할 수 있기 때문에 다음으로 가장 낮은 숫자를 검색 할 필요가 없다는 것을 깨달았습니다.