주문된 컬렉션에 대한 몇 가지 생각

머리말
순서집합이라는 개념은 본질적으로 이진법적 개념 즉, 값(검색값)이 주어지면 순서집합에서 조건을 만족하는 (첫 번째) 요소(즉, 대상 요소)를 찾는다() . 그러나 세트가 순서가 지정되지 않은 경우가 많으므로 대상 요소를 찾으려면 순서가 지정된 세트를 유지해야 합니다. 예를 들어, 정렬되지 않은 배열에서 검색값과 같은 요소를 찾고 싶다면, 현재 배열을 정렬하는 것, 즉 정렬된 집합을 유지하고, ​라는 아이디어를 통해 대상 요소를 찾는 것을 생각하게 됩니다. 이때 시간복잡도는 순차 순회를 위한 O(n)에서 O(nlogn)으로 감소되는데, 이것이 우리가 Ordered Set을 도입한 이유 중 하나, 즉 시간 효율성을 향상시키는 것입니다.
주문된 컬렉션이 필요한 이유는 무엇입니까?

이제 아래 논의를 시작하기 위한 순서가 지정되지 않은 배열이 있습니다.

정확한 값을 주면 배열의 왼쪽 끝부터 순회를 시작하여 순서화된 집합을 유지할 수 있으며, 현재 순회하는 요소가 이 집합에 삽입되고 매번 순서화된 집합에서 대상 값을 검색합니다. . 서문에서 언급한 작업을 수행할 수도 있습니다. 물론 이는 불필요하며 현재 컬렉션을 유지하는 데 추가 시간을 낭비하게 됩니다. 이는 실제로 주문된 컬렉션의 사용 시나리오입니다. 위의 과정에서 Ordered Set이 왜 쓸모가 없는지 생각해 봅시다. 실제로 관찰을 통해 검색 값이 변경되지 않았음을 알 수 있지만, 검색 값이 현재 순회하는 값과 밀접하게 관련되어 있으면 모든 항목에 영향을 미치게 됩니다. 조건을 검색할 때 문제를 해결하려면 순서 집합이라는 아이디어를 사용해야 합니다.

예 1:

정수 배열이 주어지면 중복된 요소가 있는지 확인합니다.

배열의 포인터 j가 순회된다고 가정합니다. j 이전에 순회된 배열 요소가 순서 집합에 추가됩니다. 현재 a[j]가 순회된다고 가정하면 이 순서 집합에서 조건 a를 만족하는 것을 찾을 수 있습니다. ==a[j] 요소가 발견되면 배열에 중복 요소가 있음을 증명하고, 발견되지 않으면 현재 a[j]를 순서 집합에 추가하고 다음 요소 순회를 시작합니다. 이 과정에서 우리는 일반적으로 현재 요소를 검색 값으로 먼저 판단한 다음 (필요한 경우) 컬렉션에 추가한다는 점에 유의해야 합니다 .

예 2:

정수 배열과 정수 k가 주어지면 nums[i] = nums[j]이고 i와 j 사이의 차이의 절대값이 최대 k인 배열에 두 개의 서로 다른 인덱스 i와 j가 있는지 확인합니다.

주문 컬렉션 + 슬라이딩 윈도우. 즉, 이 예에서는 정렬된 집합의 크기를 k로 제한하고 이 범위를 초과할 때마다 항상 첫 번째 추가된 요소를 버립니다. 이는 슬라이딩 윈도우의 아이디어와 일치합니다. 따라서 여기서는 주문한 세트가 위의 유지 관리 규칙을 충족하는지 확인하기만 하면 됩니다.

예 3:

정수 배열 nums와 두 개의 정수 k와 t가 제공됩니다. abs(nums[i] - nums[j]) <= t이면서 동시에 abs(i - j) <= k가 되는 두 개의 서로 다른 첨자 i와 j가 있는지 확인하세요.

이 예에서는 검색 조건만 변경되었기 때문에 예 2의 두 가지 아이디어를 계속 사용합니다. 여기서 찾고 있는 요소는 [x - t, x + t] 범위 내에 있어야 합니다(x는 현재 탐색되는 요소입니다). 여기서 하한은 xt이므로 이분법(고급) 아이디어를 사용하여 현재 순서 집합에서 xt≤를 만족하는 첫 번째 요소 y를 찾을 수 있습니다. 동시에 y가 ≤x+t를 만족하면, 이는 우리가 대상 요소를 찾았다는 것을 증명합니다. y가 만족하지 않으면 순서 집합에 대상 요소가 없음을 증명합니다.

정렬된 세트 및 해시
예제 2와 3에서는 실제로 시간 복잡도를 최적화할 수 있습니다. 예제 2 순서가 지정된 집합의 각 값을 해시 값에 매핑하면 O(1) 시간 안에 결과를 찾을 수 있습니다. 예시 3에서는 버킷 정렬이라는 아이디어를 활용하여 버킷 크기를 t+1로 설정할 수 있으며, 순서가 지정된 세트는 실제로 버킷입니다. 버킷에 현재 요소가 있어야 할 다른 요소가 있는지 매번 확인합니다. be 또는 이전 버킷 버킷 또는 다음 버킷이 조건의 부등식을 만족하며, 이 세 가지 중 하나라도 발생하면 대상 요소가 존재함을 증명합니다. (이 기사와는 관련이 없지만 이 솔루션과 관련된 PS: 두 개의 요소가 있는 경우 이전에 결과가 반환되어야 하므로 여기 버킷은 매번 버킷에 하나의 요소만 있어야 합니다. 지도로 구현) 버킷 정렬은 기본적으로 해싱입니다.

요약
위에서 우리는 순서 집합이 배열이나 해시로 구현될 수 있고 순서 집합이 슬라이딩 윈도우와 함께 사용될 수 있음을 알 수 있습니다.

Supongo que te gusta

Origin blog.csdn.net/weixin_45719581/article/details/116030225
Recomendado
Clasificación