Ten problem pochodzi z wywiadstreet.com
Dane są wartości całkowitych który reprezentuje segmentów linii, tak że punktami końcowymi segmentu są i . Wyobraź sobie, że od góry każdego segmentu promień poziomy jest wystrzeliwany w lewo, a promień ten zatrzymuje się, gdy dotyka innego segmentu lub uderza w oś y. Skonstruować tablicę liczb całkowitych n, , gdzie jest równe długości promienia wystrzelonego z góry segmentu . Zdefiniować .
Na przykład, jeśli mamy , a następnie , jak pokazano na poniższym obrazku:
Dla każdego permutacji o [ 1 , . . . , N ] , można obliczyć V ( y p 1 , . . . , Y p n ) . Jeśli zdecydujemy się równomiernie losowej permutacji p z [ 1 , . . . , N ] , jaka jest oczekiwana wartość V ( y p 1 , . . . , Y s?
Jeśli rozwiążemy ten problem, stosując podejście naiwne, nie będzie ono wydajne i będzie działać praktycznie wiecznie dla . Wierzę, że możemy podejść do tego problemu, obliczając niezależnie wartość oczekiwaną v i dla każdego drążka, ale wciąż muszę wiedzieć, czy istnieje inne skuteczne podejście do tego problemu. Na jakiej podstawie możemy obliczyć oczekiwaną wartość dla każdego drążka niezależnie?
źródło
Odpowiedzi:
Wyobraź sobie inny problem: gdybyś musiał umieścić drążków o jednakowej wysokości w n szczelinach, to oczekiwana odległość między drążkami (i oczekiwana odległość między pierwszym drążkiem a hipotetyczną szczeliną 0 oraz oczekiwana odległość między ostatnim drążkiem a hipotetyczną gniazdo n + 1 ) to n + 1k n 0 n+1 ponieważ istniejek+1szczelin pasujących do długościn+1.n+1k+1 k+1 n+1
Wracając do tego problemu, konkretny drążek jest zainteresowany liczbą drążków (w tym siebie), które są tak wysokie lub wyższe. Jeśli liczba ta wynosi , to oczekiwana przerwa po jej lewej stronie również wynosi n + 1k .n+1k+1
Algorytm polega więc na znalezieniu tej wartości dla każdego drążka i zsumowaniu oczekiwań. Na przykład, zaczynając od wysokości , liczba drążków o większej lub równej wysokości wynosi [ 5 , 7 , 1 , 5 , 5 , 2 , 8 , 7 ], więc oczekiwane jest 9[3,2,5,3,3,4,1,2] [5,7,1,5,5,2,8,7] .96+98+92+96+96+93+99+98=15.25
Jest to łatwe do zaprogramowania: na przykład pojedyncza linia w R.
podaje wartości w danych wyjściowych próbki w pierwotnym problemie
źródło
Rozwiązanie Henry'ego jest zarówno prostsze, jak i bardziej ogólne niż to!
to w przybliżeniu połowa oczekiwanej liczby porównań przeprowadzonych przez losowy Quicksort.mi[ V]
Zakładając, że drążki mają różne wysokości , możemy uzyskać rozwiązanie dla w formie zamkniętej w następujący sposób.mi[ Y]
Do ewentualnych wskaźników , niech x i j = 1 jeśli Y J = max { T i , . . . , Y j } i X i j = 0 w przeciwnym razie. (Jeśli elementy Y nie są różne, to X i j = 1 oznacza, że Y j jest ściśle większy niż każdy element { Y ii ≤ j XI j= 1 Yjot= max { Yja, . . . , Yjot} XI j= 0 Y XI j= 1 Yjot .){ Yja, … , Yj - 1}
Następnie dla dowolnego indeksu mamy v j = ∑ j i = 1 X i j (Czy widzisz dlaczego?), A zatem V = n ∑ j = 1 v j = n ∑ j = 1 j ∑ i = 1 X i j .jot vjot= ∑joti = 1XI j
Liniowość oczekiwań natychmiast implikuje, że
Ponieważ wynosi 0 lub 1 , mamy E [ X i j ] = Pr [ X i j = 1 ] .XI j 0 1 mi[ XI j] = Pr [ XI j= 1 ]
W końcu, i to jest ważne, ponieważ bit wartości w są różne i permutowane równomiernie każdy element podzbioru { Y i , . . . , Y j } jest również może być największy element tego podzespołu. Zatem Pr [ X i j = 1 ] = 1Y { Yja, . . . , Yjot} . (Jeśli elementyYnie są odrębne, nadal mamyPr[Xij=1]≤1Pr [ XI j= 1 ] = 1j - i + 1 Y ).Pr [ XI j= 1 ] ≤ 1j - i + 1
A teraz mamy trochę matematyki. gdzieHnoznaczan-tąliczbę harmonicznych.
Teraz obliczenie (do precyzji zmiennoprzecinkowej) w czasie O ( n ) powinno być banalne .mi[ V] O ( n )
źródło
Jak wspomniano w komentarzach, możesz użyć liniowości oczekiwania.
Prawdopodobnie możesz to przyspieszyć, wykonując matematykę i zdobywając formułę (chociaż sam tego nie próbowałem).
Mam nadzieję, że to pomaga.
źródło
Rozwijając odpowiedź @Aryabhata:
Po obliczeniu (zgodnie z tymi liniami ) możemy postępować zgodnie z odpowiedzią @ Aryabhata.
źródło
Naprawdę nie rozumiem, czego żądasz, na podstawie tagów wydaje się, że szukasz algorytmu.
jeśli tak, jaka jest przewidywana złożoność czasu? mówiąc: „Jeśli rozwiążemy ten problem, stosując podejście naiwne, nie będzie ono wydajne i będzie działać praktycznie wiecznie dla n = 50”. wydaje mi się, że twoje naiwne podejście rozwiązuje je w wykładniczym czasie.
Mam na myśli algorytm O (n ^ 2).
źródło