주어진 숫자 n 및 크기가 m 인 배열은 m < n입니다. 배열의 각 숫자가 0과 n-1 (포함) 사이에 있으면 배열에없는 0에서 n-1까지의 n-m 숫자 목록을 최대한 효율적으로 가져 오려고합니다.나머지 숫자 목록 생성
int[] remaining (int[] assigned) {
Set<int> s
int[n-m] remaining
add each int in assigned to s
for(i = 0 to n-1)
if(not s.contains(i)) remaining.add(i);
}
이 특정 컴퓨터 언어가 아니라 그것을해야한다 : 나는 (의사 코드)를하고 있어요,하지만 오히려 비효율적 인 느낌과 더 나은 방법이 있는지 궁금 해요 방법
낫다. 우리는 배열에 접근하는 것은 당연히 O (1)이고, AVL 세트가 될 때 세트를 추가/체크하는 것은 O (log (n))라고 가정합니다. 그래서 기본적으로 지금처럼 O (n • logn) 대신에 선형 시간에 이것을 얻으려고합니다.하지만 초기 배열이 정렬되어 있지 않다면 어떻게 할 것인지, 아니면 가능할 지 모르겠습니다. .
크기 n의 비트의 배열은 선형 시간의 문제를 해결하기 위해 사용될 수있다. (알고리즘은 분명합니다.) – ooga
나는 명백한 알고리즘을 따르지 않습니다. 설명해 주시겠습니까? 편집 : 오, 잠깐, 당신은 부울을 의미합니까? – Setzer22
오, 미안 해요! 나는 비트 배열을 모두 0으로 초기화하고, 해당 비트를 1로 설정하는 숫자 목록을 살펴본 다음 비트 배열을 통과하고 여전히 0 인 모든 비트의 위치를 인쇄한다고 생각했습니다. – ooga