Constant Time (O (1))에서 추가 및 무작위 제거를 허용하는 RandomQueue를 작성해야합니다.
내 첫 번째 생각은 배열이 인덱스를 통해 지속적으로 액세스하기 때문에 일종의 Array (ArrayList를 선택)로 백업하는 것이 었습니다.
문서를 살펴보면 ArrayLists의 추가가 Amortized Constant Time으로 간주된다는 것을 알았습니다. 추가에는 기본 배열의 재 할당이 필요하기 때문에 O (n)입니다.
Amortized Constant Time과 Constant Time은 실질적으로 동일합니까, 아니면 추가 할 때마다 완전히 재 할당 할 필요가없는 일부 구조를 살펴 봐야합니까?
배열 기반 구조는 제쳐두고 (항상 Amortized Constant Time 추가가있을 것입니다) 요구 사항을 충족시키는 것은 생각할 수 없기 때문에 이것을 묻습니다.
- 모든 트리 기반은 최상의 O (log n) 액세스 권한을 갖습니다.
- 연결된 목록에는 잠재적으로 O (1) 추가 (꼬리에 대한 참조가 유지되는 경우)가있을 수 있지만 무작위 제거는 최대 O (n)이어야합니다.
전체 질문은 다음과 같습니다. 중요한 세부 사항을 살펴본 경우
RandomQueue를 설계하고 구현하십시오. 이것은 remove () 오퍼레이션이 현재 큐에있는 모든 요소 중에서 무작위로 균일하게 선택된 요소를 제거하는 큐 인터페이스의 구현입니다. (RandomQueue를 백으로 간주하여 요소를 추가하거나 임의의 요소에 도달하여 맹목적으로 제거 할 수 있습니다.) RandomQueue의 add (x) 및 remove () 작업은 작업마다 일정한 시간에 실행되어야합니다.
1/a
O (n) 연산 a > 1
의 (1/a)^n
기회 가 있습니다). (n) 연산이지만 large의 경우 확률은 0에 가까워 n
집니다.