Esse problema foi retirado de Interviewstreet.com
É-nos dada uma matriz de números inteiros que representa segmentos de linha, de modo que os pontos finais do segmento sejam e . Imagine que, do topo de cada segmento, um raio horizontal é disparado para a esquerda, e esse raio para quando toca outro segmento ou atinge o eixo y. Construímos uma matriz de n números inteiros, , em que é igual ao comprimento do raio disparado da parte superior do segmento . Definimos .
Por exemplo, se tivermos , então , como mostra a figura abaixo:
Para cada permutação de , podemos calcular . Se escolhermos uma permutação aleatória uniformemente de , qual é o valor esperado de ?
Se resolvermos esse problema usando a abordagem ingênua, ele não será eficiente e será executado praticamente para sempre por . Acredito que podemos abordar esse problema calculando de forma independente o valor esperado de para cada stick, mas ainda preciso saber se existe outra abordagem eficiente para esse problema. Em que base podemos calcular o valor esperado para cada stick independentemente?
fonte
Respostas:
Imagine um problema diferente: se você tivesse que colocar sticks de alturas iguais em slots, a distância esperada entre os sticks (e a distância esperada entre o primeiro stick e um slot nocional e a distância esperada entre o último stick e um nocional o slot ) é pois existem intervalos para caber no comprimento .k n 0 n+1 n+1k+1 k+1 n+1
Voltando a esse problema, um determinado stick está interessado em quantos (inclusive ele) são tão altos ou mais altos. Se esse número for , o intervalo esperado à esquerda também será n + 1k .n+1k+1
Portanto, o algoritmo é simplesmente encontrar esse valor para cada stick e adicionar a expectativa. Por exemplo, começando com alturas de , o número de paus com altura maior ou igual a é [ 5 , 7 , 1 , 5 , 5 , 2 , 8 , 7 ] então a expectativa é 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
É fácil de programar: por exemplo, uma única linha em R
fornece os valores na saída de amostra no problema original
fonte
A solução de Henry é mais simples e mais geral que esta!
Então, para qualquer índice , temos (Você vê por quê?) E, portanto,j vj=∑ji=1Xij
A linearidade da expectativa implica imediatamente que
Como é ou , temos .Xij 0 1 E[Xij]=Pr[Xij=1]
Finalmente - e este é o bit importante - porque os valores em são distintos e permutados de maneira uniforme, cada elemento do subconjunto é igualmente provável que seja o maior elemento desse subconjunto. Assim, . (Se os elementos de não forem distintos, ainda temos .)Y {Yi,...,Yj} Pr[Xij=1]=1j−i+1 Y Pr[Xij=1]≤1j−i+1
E agora só temos um pouco de matemática. onde indica o th número harmónico .
Agora deve ser trivial calcular (até precisão de ponto flutuante) em tempo.E[V] O(n)
fonte
Conforme mencionado nos comentários, você pode usar a Linearidade da Expectativa.
Classifique : .y y1≤y2≤⋯≤yn
Para cada considere o valor esperado de .yi vi=E[vi]
EntãoE[∑ni=1vi]=∑ni=1E[vi]
Uma maneira direta e ingênua de calcular seria primeiro fixar uma posição para . Diga .E[vi] yi j
Agora calcule a probabilidade de que na posição você tenha um valor .j−1 ≥yi
Então a probabilidade de que em você tenha um valor e em você tenha um valorj−1 <yi j−2 ≥yi
e assim por diante, o que permitirá calcular .E[vi]
Você provavelmente pode torná-lo mais rápido, efetivamente, fazendo as contas e obtendo uma fórmula (embora eu ainda não tenha tentado).
Espero que ajude.
fonte
Expandindo a resposta de @Aryabhata:
Corrija um e assuma que o item está na posição . O valor exato da altura é imaterial, o que importa é se os itens são maiores ou iguais a ou não. Portanto, considere o conjunto de itens , onde é 1 se e é 0 caso contrário.i yi j yi Z(i) z(i)k yk≥yi z(i)k
Uma permutao no conjunto induz uma permutação correspondente sobre o conjunto de . Considere, por exemplo, a seguinte permeação do conjunto : "01000 (1) ". O item é aquele que está entre colchetes, na posição , e os itens indicados por " " não importam.Z(i) Y Z(i) … z(i)i j …
O valor de é então 1 mais o comprimento da execução dos zeros consectivos à esquerda de . Segue-se que é na verdade 1 mais o comprimento esperado de zeores consecutivos, até que o primeiro "1" seja atingido, se escolhermos no máximo bits do conjunto (sem substituição). Isso é remanescente da distribuição geométrica, exceto que ela seria sem substituição (e número limitado de empates). A expectativa é para ser tomada em assim , como uma escolha uniforme sobre o conjunto de posições .vi z(i)i E(vi) j−1 Z(i)∖z(i)i j {1,…,n}
Uma vez calculado (nesse sentido ), podemos seguir as linhas da resposta de @ Aryabhata.
fonte
Eu realmente não entendo o que você ignora, a partir de tags, parece que você está procurando um algoritmo.
Nesse caso, qual é a complexidade de tempo esperada? dizendo: "Se resolvermos esse problema usando a abordagem ingênua, ele não será eficiente e será executado praticamente para sempre por n = 50". parece-me que sua abordagem ingênua a resolve em tempo exponencial.
Eu tenho um algoritmo O (n ^ 2) em mente tho.
fonte