Как подойти к решению «Вертикальные палки»


23

Эта проблема взята из интервьюstreet.com

Нам дан массив целых чисел который представляет линейных сегментов, так что конечными точками сегмента являются и . Представьте, что от вершины каждого сегмента горизонтальный луч выстреливает влево, и этот луч останавливается, когда он касается другого сегмента или достигает оси y. Мы строим массив из n целых чисел, , где равна длине луча, снятого с вершины сегмента . Определим .Y={y1,...,yn}ni(i,0)(i,yi)v1,...,vnviiV(y1,...,yn)=v1+...+vn

Например, если у нас есть , то , как показано на рисунке ниже:Y=[3,2,5,3,3,4,1,2][v1,...,v8]=[1,1,3,1,1,3,1,2]

введите описание изображения здесь

Для каждой перестановки из мы можем вычислить . Если мы выберем равномерно случайную перестановку из , каково ожидаемое значение ?[ 1 , . , , , П ] V ( у р 1 , . . . , У п п ) р [ 1 , . , , , П ] V ( у р 1 , . . . , У п п )p[1,...,n]V(yp1,...,ypn)p[1,...,n]V(yp1,...,ypn)

Если мы решим эту проблему, используя наивный подход, она не будет эффективной и будет работать практически всегда при . Я полагаю, что мы можем подойти к этой проблеме, самостоятельно рассчитав ожидаемое значение для каждой палки, но мне все еще нужно знать, есть ли другой эффективный подход к этой проблеме. На каком основании мы можем рассчитать ожидаемое значение для каждой палки независимо?v in=50vi


Вы можете использовать линейность ожидания. Этот вопрос, вероятно, более уместен в математике. SE

Ответы:


23

Представьте себе другую проблему: если вам пришлось поместить палочек одинаковой высоты в слотов, то ожидаемое расстояние между палками (и ожидаемое расстояние между первой палкой и условной щелью , а также ожидаемое расстояние между последней палкой и условной слот ) равен поскольку есть промежутков, чтобы соответствовать длине .n 0 n + 1 n + 1kn0n+1 k+1n+1n+1k+1k+1n+1

Возвращаясь к этой проблеме, конкретный джойстик интересуется, сколько стиков (включая себя) имеют высоту или выше. Если это число равно , то ожидаемый разрыв слева от него также равен .н + 1kn+1k+1

Таким образом, алгоритм состоит в том, чтобы просто найти это значение для каждой палки и сложить ожидание. Например, начиная с высоты , количество палочек с большей или равной высотой равно поэтому ожидание равно .[ 5 , 7 , 1 , 5 , 5 , 2 , 8 , 7 ] 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

Это легко программировать: например, одну строку в R

V <- function(Y){ (length(Y) + 1) * sum( 1 / (rowSums(outer(Y, Y, "<=")) + 1) ) }

дает значения в примере вывода в исходной задаче

> V(c(1,2,3))
[1] 4.333333
> V(c(3,3,3))
[1] 3
> V(c(2,2,3))
[1] 4
> V(c(10,2,4,4))
[1] 6
> V(c(10,10,10,5,10))
[1] 5.8
> V(c(1,2,3,4,5,6))
[1] 11.15

1
Очень интересно. Не могли бы вы пояснить, почему ожидаемое расстояние между палками составляет ; как не ясно (по крайней мере мне), как это было вычислено. Спасибо. (n+1)/(k+1)
М. Алагган

В моем первом случае с палками равной высоты, есть длина нужно заполнить зазорами поэтому средний зазор получается делением одной на другую. Это ожидаемый зазор (или горизонтальный луч) перед любым конкретным стержнем (и от последнего стержня до ). Он переходит к исходному вопросу, принимая во внимание палки, которые выше или выше любой конкретной палки. n + 1 k + 1 n + 1kn+1k+1n+1
Генри

Очень хорошо. Это полностью отражает мое решение; если все высоты различны, то . E[V]=k=1nn+1k+1=(n+1)(Hn+11)=(n+1)Hnn
Джефф

2
@ Генри: Для k палочек равной высоты, проблема с n слотами, как вы рассуждали о средней длине = (n + 1) / (k + 1)? Если у меня есть k палочек, и я хочу знать среднюю длину луча одной из этих палочек в каждой перестановке этих палочек в n слотах, это на самом деле равно вашему результату, но я не понимаю, почему. Есть ли логика или вы вывели это математически из того, что я описал для 1 стика и n слотов, затем 2 стиков и n, слотов, ... k стиков, n слотов, и заметив, что это равно (n + 1) / ( к + 1)? Вы упоминаете о добавлении n + 1 слота. Это кажется очень нелогичным.
Александр

3
Это вопрос, с которым я сталкивался раньше. Начните с круглого стола с местами и людьми и рассадите их наугад. Расстояния между индивидами, очевидно, соответствуют среднему значению . Теперь разбейте стол у , уберите этого человека и его место и выровняйте стол. Теперь у вас есть вопрос с местами и людьми, но с тем же свойством iid и тем же значением. (Найдите редкую рифму за месяц )k + 1 ( n + 1 ) / ( k + 1 ) n + 1- й n kn+1k+1(n+1)/(k+1)n+1thnk
Генри,

11

Решение Генри более простое и общее, чем это!


E[V] составляет примерно половину ожидаемого числа сравнений, выполненных рандомизированной быстрой сортировкой.

Предполагая, что палки имеют различную высоту , мы можем вывести решение в замкнутой форме следующим образом.E[Y]

Для любых индексов , пусть если и противном случае. (Если элементы являются не различны, то означает , что является строго больше , чем каждый элемент .)ijXij=1X i j = 0 YYj=max{Yi,...,Yj}Xij=0YY j { Y i , , Y j - 1 }Xij=1Yj{Yi,,Yj1}

Тогда для любого индекса имеем (понимаете почему?) И, следовательно, v j = j i = 1 X i j V = n j = 1jvj=i=1jXij

V=j=1nvj=j=1ni=1jXij.

Линейность ожидания сразу подразумевает, что

E[V]=E[1ijnXij]=1ijnE[Xij].

Поскольку равен или , мы имеем . 01E[ X i j ]=Pr[ X i j =1]Xij01E[Xij]=Pr[Xij=1]

Наконец-и это важно бит , поскольку значения в являются различными и переставляются равномерно, каждый элемент подмножества одинаково вероятно, будет крупнейшим элементом этого подмножества. Таким образом, . (Если элементы не различны, у нас все еще есть .)YPr [ X i j = 1 ] = 1{Yi,...,Yj} YPr[Xij=1]1Pr[Xij=1]=1ji+1YPr[Xij=1]1ji+1

А теперь у нас просто математика. где обозначает номер й гармоники . Hnn

E[V]=j=1ni=1jE[Xij][linearity]=j=1ni=1j1ji+1[uniformity]=j=1nh=1j1h[h=ji+1]=h=1nj=hn1h[1hjn]=h=1nnh+1h=((n+1)h=1n1h)(h=1n1)=(n+1)Hnn
Hnn

Теперь должно быть тривиально вычислять (с точностью до плавающей запятой) за время.O ( n )E[V]O(n)


Это предполагает, что палки имеют различную высоту?
Арьябхата

Да, он принимает разные высоты. (Очевидно, я неправильно понял вопрос.) Эквивалентность с рандомизированной быстрой сортировкой сохраняется, когда есть связи, но нет решения в замкнутой форме.
Джефф

4

Как уже упоминалось в комментариях, вы можете использовать линейность ожиданий.

Сортируйте : .y 1y 2y nyy1y2yn

Для каждого рассмотрим ожидаемое значение .yivi=E[vi]

ТогдаE[i=1nvi]=i=1nE[vi]

Одним простым и наивным способом вычисления было бы сначала исправить позицию для . Скажи .E[vi]yij

Теперь вычислите вероятность того, что в позиции вас есть значение .j1yi

Тогда вероятность того, что в вас есть значение а в вас есть значениеj1<yij2yi

и так далее, что позволит вам вычислить .E[vi]

Вы, вероятно, можете сделать это быстрее, фактически выполнив математику и получив формулу (хотя я сам не пробовал).

Надеюсь, это поможет.


3

Расширяя ответ @Aryabhata:

Зафиксируем и предположим, что элемент находится в позиции . Точное значение высоты не имеет значения, имеет значение, являются ли элементы больше или равны или нет. Поэтому рассмотрим набор элементов , где равен 1, если , и равен 0 в противном случае.y i j y i Z ( i ) z ( i ) k y kiyijyiZ(i)zk(i)ykyizk(i)

Перестановка на множестве индуцирует соответствующую перестановку на множестве . Рассмотрим, например, следующую перестановку множества : «01000 (1) ». Элемент в скобках находится в позиции , а элементы, обозначенные " ", не имеют значения. Y Z ( i )zZ(i)YZ(i)zi(i)j

Тогда значение равно 1 плюс длина серии последовательных нулей слева от . Отсюда следует, что на самом деле равно 1 плюс ожидаемая длина последовательных нулей, пока не будет встречено первое «1», если мы выберем не более бит из набора (без замены). Это напоминает геометрическое распределение, за исключением того, что оно будет без замены (и ограниченного числа розыгрышей). Ожидание должно быть принято на , а также , как равномерный выбор на множестве позиций .z ( i ) i E (vizi(i)E(vi)j1Z(i)zi(i){ 1 , , n }j {1,,n}

Как только это вычислено (по этим линиям ), мы можем следовать строкам ответа @ Aryabhata.


-2

Я не очень понимаю, что вы требуете, из тегов кажется, что вы ищете алгоритм.

если да, какова ожидаемая сложность времени? говоря: «Если мы решим эту проблему, используя наивный подход, она не будет эффективной и будет работать практически всегда для n = 50». мне кажется, что ваш наивный подход решает это в экспоненциальном времени.

Я имею в виду алгоритм O (N ^ 2), хотя.

assume int y[n], v[n] where v[i] initialized with 1; as described in the question
for (i=1;i<n;i++) 
   for ( j=i-1 ; j>=0 && y[j]<y[i] ; j--) v[i]++;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.