Эта проблема взята из интервьюstreet.com
Нам дан массив целых чисел который представляет линейных сегментов, так что конечными точками сегмента являются и . Представьте, что от вершины каждого сегмента горизонтальный луч выстреливает влево, и этот луч останавливается, когда он касается другого сегмента или достигает оси y. Мы строим массив из n целых чисел, , где равна длине луча, снятого с вершины сегмента . Определим .
Например, если у нас есть , то , как показано на рисунке ниже:
Для каждой перестановки из мы можем вычислить . Если мы выберем равномерно случайную перестановку из , каково ожидаемое значение ?[ 1 , . , , , П ] V ( у р 1 , . . . , У п п ) р [ 1 , . , , , П ] V ( у р 1 , . . . , У п п )
Если мы решим эту проблему, используя наивный подход, она не будет эффективной и будет работать практически всегда при . Я полагаю, что мы можем подойти к этой проблеме, самостоятельно рассчитав ожидаемое значение для каждой палки, но мне все еще нужно знать, есть ли другой эффективный подход к этой проблеме. На каком основании мы можем рассчитать ожидаемое значение для каждой палки независимо?v i
источник
Ответы:
Представьте себе другую проблему: если вам пришлось поместить палочек одинаковой высоты в слотов, то ожидаемое расстояние между палками (и ожидаемое расстояние между первой палкой и условной щелью , а также ожидаемое расстояние между последней палкой и условной слот ) равен поскольку есть промежутков, чтобы соответствовать длине .n 0 n + 1 n + 1k n 0 n+1 k+1n+1n+1k+1 k+1 n+1
Возвращаясь к этой проблеме, конкретный джойстик интересуется, сколько стиков (включая себя) имеют высоту или выше. Если это число равно , то ожидаемый разрыв слева от него также равен .н + 1k n+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
дает значения в примере вывода в исходной задаче
источник
Решение Генри более простое и общее, чем это!
Предполагая, что палки имеют различную высоту , мы можем вывести решение в замкнутой форме следующим образом.E[Y]
Для любых индексов , пусть если и противном случае. (Если элементы являются не различны, то означает , что является строго больше , чем каждый элемент .)i≤j Xij=1 X i j = 0 YYj=max{Yi,...,Yj} Xij=0 Y Y j { Y i , … , Y j - 1 }Xij=1 Yj {Yi,…,Yj−1}
Тогда для любого индекса имеем (понимаете почему?) И, следовательно, v j = ∑ j i = 1 X i j V = n ∑ j = 1j vj=∑ji=1Xij
Линейность ожидания сразу подразумевает, что
Поскольку равен или , мы имеем . 01E[ X i j ]=Pr[ X i j =1]Xij 0 1 E[Xij]=Pr[Xij=1]
Наконец-и это важно бит , поскольку значения в являются различными и переставляются равномерно, каждый элемент подмножества одинаково вероятно, будет крупнейшим элементом этого подмножества. Таким образом, . (Если элементы не различны, у нас все еще есть .)Y Pr [ X i j = 1 ] = 1{Yi,...,Yj} YPr[Xij=1]≤1Pr[Xij=1]=1j−i+1 Y Pr[Xij=1]≤1j−i+1
А теперь у нас просто математика. где обозначает номер й гармоники . Hnn
Теперь должно быть тривиально вычислять (с точностью до плавающей запятой) за время.O ( n )E[V] O(n)
источник
Как уже упоминалось в комментариях, вы можете использовать линейность ожиданий.
Сортируйте : .y 1 ≤ y 2 ≤ ⋯ ≤ y ny y1≤y2≤⋯≤yn
Для каждого рассмотрим ожидаемое значение .yi vi=E[vi]
ТогдаE[∑ni=1vi]=∑ni=1E[vi]
Одним простым и наивным способом вычисления было бы сначала исправить позицию для . Скажи .E[vi] yi j
Теперь вычислите вероятность того, что в позиции вас есть значение .j−1 ≥yi
Тогда вероятность того, что в вас есть значение а в вас есть значениеj−1 <yi j−2 ≥yi
и так далее, что позволит вам вычислить .E[vi]
Вы, вероятно, можете сделать это быстрее, фактически выполнив математику и получив формулу (хотя я сам не пробовал).
Надеюсь, это поможет.
источник
Расширяя ответ @Aryabhata:
Зафиксируем и предположим, что элемент находится в позиции . Точное значение высоты не имеет значения, имеет значение, являются ли элементы больше или равны или нет. Поэтому рассмотрим набор элементов , где равен 1, если , и равен 0 в противном случае.y i j y i Z ( i ) z ( i ) k y k ≥i yi j yi Z(i) z(i)k yk≥yi z(i)k
Перестановка на множестве индуцирует соответствующую перестановку на множестве . Рассмотрим, например, следующую перестановку множества : «01000 (1) ». Элемент в скобках находится в позиции , а элементы, обозначенные " ", не имеют значения. Y Z ( i ) … zZ(i) Y Z(i) … z(i)i j …
Тогда значение равно 1 плюс длина серии последовательных нулей слева от . Отсюда следует, что на самом деле равно 1 плюс ожидаемая длина последовательных нулей, пока не будет встречено первое «1», если мы выберем не более бит из набора (без замены). Это напоминает геометрическое распределение, за исключением того, что оно будет без замены (и ограниченного числа розыгрышей). Ожидание должно быть принято на , а также , как равномерный выбор на множестве позиций .z ( i ) i E (vi z(i)i E(vi) j−1 Z(i)∖z(i)i { 1 , … , n }j {1,…,n}
Как только это вычислено (по этим линиям ), мы можем следовать строкам ответа @ Aryabhata.
источник
Я не очень понимаю, что вы требуете, из тегов кажется, что вы ищете алгоритм.
если да, какова ожидаемая сложность времени? говоря: «Если мы решим эту проблему, используя наивный подход, она не будет эффективной и будет работать практически всегда для n = 50». мне кажется, что ваш наивный подход решает это в экспоненциальном времени.
Я имею в виду алгоритм O (N ^ 2), хотя.
источник