배열의 각 요소에 대해 더 작은 요소 수를 효율적으로 찾기


9

이 문제에 갇혀 있습니다.

주어진 배열 A 첫 번째 n 무작위로 순열 된 자연수, 배열 B 다음과 같이 구성됩니다 B(k) 요소의 개수입니다 A(1)A(k1) 보다 작은 A(k).

i) 주어진 A 당신은 찾을 수 있나요 BO(n)시각?
ii) 주어진B 당신은 찾을 수 있나요 AO(n) 시각?

여기, B(1)=0. 구체적인 예를 들면 다음과 같습니다.

|A843172965B000031644|

누구든지 나를 도울 수 있습니까? 감사.


:이 발견 컴퓨팅 순열 인코딩 제공O(nlogn)이러한 문제에 대한 알고리즘. 적어도 나는 그들이 같은 문제라고 생각합니다.
Realz Slaw

@Merbs 당신이 준 힌트는 당신이 해결책을 가지고 있다는 것을 의미합니까?
AJed

1
@AJed, 알고리즘이 있음을 의미하지만 O(n2) 공간이없는 간단한 알고리즘 O(nlogn)공간이 있다면 현재 나는 불가능한쪽으로 기울고 있습니다O(n)둘 다 같은 알고리즘입니다.
Merbs

@ 머 브스. 힌트가 올바른 길로 이어질 수 있다고 생각합니다. 하나의 솔루션도 가지고 있습니다 (힌트를 따르십시오). 분석에 트릭이 있다고 생각합니다.O(n).. 속임수는 A 1에서 간다 :n뿐.
AJed

2
이 논문은 또한 O(nlogn)연산. 당신은 확실히 존재합니까O(n)이것에 대한 알고리즘?
Realz Slaw

답변:


1

결정을위한 순진한 알고리즘 B ...에서 A:

에 대한 k=1,,n의 가치를 결정 B(k) 각각을 비교함으로써 A(i)A(k) ...에 대한 i=1,,k 만족하는 사람들을 세고 A(i)<A(k).

이 알고리즘은 A(1) 다른 사람들에게n1 타임스), A(2)n2 다른 것, 등 총 비교 횟수는 (n1)(n2)2. 그러나 그것은 우리가 할 수있는 최선이 아닙니다. 예를 들어B(n)비교할 필요가 없습니다. B(n)=A(n)1처음 이기 때문에 n 자연수이며 (순열에 관계없이) n1낮은 자연수가있을 것입니다. 이건 어떤가요B(n1)? 확인하는 대신A(1) ...을 통하여 A(n2), 우리는 단지 확인할 수 있었다 A(n). 그건:

에 대한 k=1,,n2위의 알고리즘을 사용하십시오. ...에 대한 k=n2,,n 역 알고리즘을 사용하십시오 : 결정 B(k) 처음에 설정하여 A(n)1 그런 다음 빼기 1 for each entry A(i) for i=k+1,,n that is less than A(k).

This would take 2×(n21)(n22)2=(n2)(n4)4 steps, which is still O(n2). Note also that in constructing A from B, if B(n)=A(n)1 then A(n)=B(n)+1.

But now for more finesse. If we’re allowed some additional space or sort in-place, we can sort the numbers as we’re comparing them. For example:

|A843172965S987432165B0000316|

Instead of checking all of them (or checking them in order), we could use binary search to determine each B(k). However, the sorting still takes time O(nlogn).


This was just my first idea; though I realize the problem is more interesting than I originally gave it credit. And I haven't had an opportunity yet to read Realz Slaw's findings, so the algorithm may be off.
Merbs

0

Rather than determining each B(k) one at a time, we can be forward looking and only go through each number in A once! But we'll use n space:

|A123456789B800000000104000011112030001222230101123333407011233345320123444561901234445666012344567450123456784|

We could save even more time by not updating those that have already been determined (that is, there is no point in updating 8 after the first step), but in the worst case, we still have to update (n)(n+2)2 times


0

both I and II are solvable using #next_greater_element that i explained here. but its a little harder than just the problem but before solution you need to learn next greater element:

  1. consider we have a vector for every element of A name it Si for element i. now once run the next greater algorithm starting from right to left but except setting element i in A its next greater element index , push in Si the elements that i is their next greater element.then iterate over the array left to right and then B[i]=j=0x(Si[j]+1) where x is the size of vector Si.and its Θ(n) because each the next greater algorithm is Θ(n) and also iterating is Θ(n)

second part is also similar noting that we can get the value of the rightest element in O(1) EDIT:my solution is wrong it seems that it dont have anyo(n) solution

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.