Encontre todos os intervalos que se sobrepõem a um determinado intervalo

7

Nota: movi esta pergunta de stackoverflow.com

Eu tenho um problema algorítmico no qual gostaria de ver se ele pode ser resolvido melhor do que O(n):

Eu dei uma mesa T do n elementos em que cada elemento é uma tupla (si,ei)com e , ou seja, cada tupla é uma espécie de intervalo. Eu tenho que encontrar todos os intervalos que se sobrepõem a um determinado intervalo com e . Além disso, tenho duas disponíveis classificados listas e , que contém as valores, ou valores, respectivamente, em conjunto com o índice apontando para a respectiva entrada em . As listas são classificadas pelos valores de ou valores de respectivamente. (Vamos assumir que, esi,eiNsi<ei[t0,t1]t0,t1Nt0<t1SEseiTsese valores, são únicos.)

Problema:

Temos que encontrar cada intervalo / tupla onde e .(si,ei)Tsit1eit0

Meus pensamentos até agora:

Podemos excluir alguns elementos por qualquer aplicação de um dos limites do intervalo, ou seja, busca em ou em . Isso nos dá uma lista de elementos restantes: No entanto , não há limite inferior para o número de elementos em , independentemente da pesquisa que realizamos. Além disso, temos que verificar todos os elementos em se ou respectivamente, dependendo da pesquisa que fizemos anteriormente.t1St0EL

L{eEet0} or L{sSst1}
LLst1et0

A complexidade desta solução é .O(n)

No entanto, digamos que é o número máximo de elementos que se sobrepõem ao intervalo . Se assumirmos , em seguida, a complexidade é , uma vez que pode excluir, pelo menos elementos, escolhendo a busca apropriado para . Ainda está em .k[t0,t1]knO(n/2)n/2LO(n/2)O(n)

Você consegue pensar em uma abordagem melhor para resolver esse problema?

Para gravar:

A complexidade para encontrar todos os intervalos sobrepostos a um determinado intervalo usando uma árvore de intervalos é que é o número de intervalos sobrepostos. No entanto, no meu caso prático, estou usando um banco de dados MySQL que fornece árvores de índice para cada valor, ou seja, e , separadamente. Dessa forma, não consigo encontrar intervalos sobrepostos em menos de . Eu precisaria criar uma árvore de intervalo, que é uma árvore de pesquisa que armazena os dois limites de intervalo, ou seja, e , em uma única estrutura de dados. A complexidade para construir a árvore do intervalo é . [O(logn+k)kseO(n)seO(nlogn)http://www.dgp.utoronto.ca/people/JamesStewart/378notes/22intervals/]

sema
fonte
2
E se kn, Acho que existe um pré-cálculo deO(nk) espaço, resultando em O(k2+logn)pesquisas de tempo. Eu me pergunto se está tudo bem.
usar o seguinte código

Respostas:

6

Acredito que as árvores de intervalo oferecem uma solução para o seu problema. Basicamente, você armazena seus intervalos na estrutura de dados da árvore de intervalos; então, para encontrar todos os intervalos que se sobrepõem[t0,t1], você faz uma consulta na árvore do intervalo. Isso deve resolver seu problema e executar mais rapidamente do queO(n) Tempo.

DW
fonte
Obrigado pela referência. No entanto, para o problema inicial, acho que não há solução melhor do queO(n). Somente se eu puder assumir quekn, podemos ser mais rápidos, no entanto, infelizmente, essa suposição não é válida no meu caso. Obrigado.
sema 15/09/13
11
@ Sema, estou confuso. Se houverk=Θ(n) sobreposição de intervalos, é claro que você não pode fazer melhor do que O(n)tempo e, nesse caso, é melhor verificar cada um dos intervalos do conjunto - portanto, não tenho certeza de qual é a sua pergunta ou por que está perguntando (você já tem uma prova de que ninguém pode fazer melhor que o algoritmo ingênuo). Por outro lado, sek=o(n), as árvores de intervalo se saem melhor do que apenas verificar cada intervalo possível. Em geral, o tempo de execução das árvores de intervalo é baseado no número de correspondências, portanto, o tempo de execução é próximo do melhor que se poderia esperar.
DW
Desculpe pela confusão. Eu apenas concordo com você e resumi por mim mesmo que seria desejável encontrar um limite superiork de tal modo que kn. Com o problema geral, estamos presos aO(n)onde não podemos fazer melhor. Obrigado pela sua resposta e pela referência às árvores de intervalo.
sema
Você provavelmente deve incluir o tempo gasto na criação da árvore do intervalo em sua resposta.
Raphael
@sema A notação knnão faz muito sentido em termos assintóticos. Você quer usarko(n).
Raphael