A maneira mais fácil de encontrar a interseção de dois intervalos


8

Agora eu fiquei com um problema. Parece ser realmente trivial, mas ainda assim é difícil encontrar uma solução apropriada. O problema é: um tem dois intervalos e deve encontrar a interseção deles.

Por exemplo:

  • A interseção de [0, 3] e [2, 4] é [2, 3]
  • A interseção de [-1, 34] e [0, 4] é [0, 4]
  • A interseção de [0, 3] e [4, 4] está vazia

É bastante claro que o problema pode ser resolvido usando testes de todos os casos possíveis, mas isso levará muito tempo e é muito propenso a erros. Existe alguma maneira mais fácil de resolver o problema? Se você souber que a solução me ajuda, por favor. Ficarei muito grato.


O que há de errado com a minha pergunta? Por que foi rejeitado?
— ohidano 23/02

2
Algumas coisas .. isso parece ser uma pergunta de lição de casa, se é que você deve chamá-lo e identificá-lo como tal. O contexto do seu problema também não é claro. Pode ser interpretado como puramente um problema de matemática (nesse caso, ele pertence ao Math.SE, não aqui), ou um exercício de programação.
— Spencer Bryngelson

Caso você esteja procurando um nome para esses métodos, isso se chama Interval Aritmetic .
— André

Respostas:


17

Podemos definir uma solução para esse problema da seguinte maneira. Consideram-se os intervalos de entrada pode ser definido como e I b = [Euuma=[umas,umae] , enquanto o intervalo de saída é definido como I o = [ o s , o e ] . Podemos encontrar a interseção I o = I a ⋂ I b fazendo o seguinte:Eub=[bs,be]Euo=[os,oe]Euo=Euuma⋂Eub

se ( ou a s > b e ) { retornar ∅ }bs>umaeumas>be ∅

mais {

os=max(umas,bs)

oe=min(umae,be)

retornar [os,oe]

}


1

Suponha que temos apenas dois intervalos de entrada.

  1. Verifique se a hora de início do primeiro intervalo <a hora de início do segundo intervalo.
  2. Sobreposição significa que a hora de término de um intervalo é posterior à hora de início de outro intervalo
public int[] overlap(int[] i1, int[] i2) {
    // Make sure the start time of first interval < the start time of second interval.
    if(i1.startTime > i2.startTime) {
        return overlap(i2, i1);
    }

    // Overlap means an interval's end time is after another interval's start time
    if(i1.endTime > i2.startTime) {
        return new Interval(i2.startTime, Math.min(i1.endTime, i2.endTime));
    }
    else {
        return null;
    }
}
  • Complexidade temporal: O (1)
  • Complexidade do espaço: O (1)

0

De outra maneira simples

Dado:
2 intervalos
Intervalo 1 : (início1, fim1)
Intervalo 2 : (início2, fim2)

Necessário:
Condição booleana para verificar se os dois intervalos estão cruzados ou não

Solução: As
seguintes DUAS condições devem ser verdadeiras para considerar que dois intervalos são cruzados:
1. fim2> = início1
2. início2 <= fim1

// check 2 intervals are intersected or not
if( (end2 >= start1) && (start2 <= end1) ){
    // 2 intervals are intersected
    // ...

}else{
    // 2 intervals are NOT intersected
    // ...

}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.