Você está na página 1de 81

Maximum subarray aplicado

ao estudo de EEGs
Guilherme Maron
Definição do problema
Definição do problema
• Temos um array de valores A (preço de um
produto, por exemplo) ao longo do tempo.
Definição do problema
• Temos um array de valores A (preço de um
produto, por exemplo) ao longo do tempo.
50 63 60 35 55 52 50 60 50 60 40
Definição do problema
• Temos um array de valores A (preço de um
produto, por exemplo) ao longo do tempo.
50 63 60 35 55 52 50 60 50 60 40

• Calculamos as diferenças entre A(i) e A(i-1)


para i ≠ 0
Definição do problema
• Temos um array de valores A (preço de um
produto, por exemplo) ao longo do tempo.
50 63 60 35 55 52 50 60 50 60 40

• Calculamos as diferenças entre A(i) e A(i-1)


para i ≠ 0
13 -3 -25 20 -3 -2 10 -10 10 -20
Definição do problema
• Precisamos encontrar o maior sub-array
contíguo, de modo que não haja nenhum
outro sub-array menor com uma soma maior
dos seus valores.
Definição do problema
• Precisamos encontrar o maior sub-array
contíguo, de modo que não haja nenhum
outro sub-array menor com uma soma maior
dos seus valores.

• Nesse exemplo: 13 -3 -25 20 -3 -2 10 -10 10 -20


Definição do problema
• Precisamos encontrar o maior sub-array
contíguo, de modo que não haja nenhum
outro sub-array menor com uma soma maior
dos seus valores.

• Nesse exemplo: 13 -3 -25 20 -3 -2 10 -10 10 -20


Definição do problema
• Precisamos encontrar o maior sub-array
contíguo, de modo que não haja nenhum
outro sub-array menor com uma soma maior
dos seus valores.

• Nesse exemplo: 13 -3 -25 20 -3 -2 10 -10 10 -20

SOMA = 25
E o que isso significa
E o que isso significa
• No exemplo do preço do produto seria a
melhor estratégia de compra / venda.
Comprando-o pelo menor preço e
revendendo-o pelo maior preço no intervalo
observado
E como calcular?
E como calcular?
• Força-bruta
E como calcular?
• Força-bruta
– Separar todos os pares venda/compra (extremos)
E como calcular?
• Força-bruta
– Separar todos os pares venda/compra (extremos)
...
13 -3 -25 20 -3 -2 10 -10 10 -20
...
E como calcular?
• Força-bruta
– Separar todos os pares venda/compra (extremos)
...
13 -3 -25 20 -3 -2 10 -10 10 -20
...
– Calcular as somas e utilizar a maior
E como calcular?
• Força-bruta
– Separar todos os pares venda/compra (extremos)
...
13 -3 -25 20 -3 -2 10 -10 10 -20
...
– Calcular as somas e utilizar a maior

• Complexidade
E como calcular?
• Força-bruta
– Separar todos os pares venda/compra (extremos)
...
13 -3 -25 20 -3 -2 10 -10 10 -20
...
– Calcular as somas e utilizar a maior

• Complexidade
– Ω (n2)
Solução
Solução
• Divide-and-Conquer
Solução
• Divide-and-Conquer
– Há 3 possibilidades de encontrarmos o subarray,
levando-se em consideração um ponto no meio
do array
Solução
• Divide-and-Conquer
– Há 3 possibilidades de encontrarmos o subarray,
levando-se em consideração um ponto no meio
do array
meio
Solução
• Divide-and-Conquer
– Há 3 possibilidades de encontrarmos o subarray,
levando-se em consideração um ponto no meio
do array
meio

Completamente à esquerda: 0 <= sa.start < as.end <= mid


Solução
• Divide-and-Conquer
– Há 3 possibilidades de encontrarmos o subarray,
levando-se em consideração um ponto no meio
do array
meio

Completamente à direita: mid <= sa.start < as.end =< end


Solução
• Divide-and-Conquer
– Há 3 possibilidades de encontrarmos o subarray,
levando-se em consideração um ponto no meio
do array
meio

Através do meio do array: mid =< sa.start < as.end =< end
Solução
• Divide-and-Conquer
– A parte principal do algoritmo endereça isso:
Solução
Solução

Caso base, se há apenas um elemento, retorne-o


Solução

Defina o ponto médio (mid)


Solução

Quebra recursiva do array para encontrar o maior subarray à esquerda de mid


Solução

Quebra recursiva do array para encontrar o maior subarray à direita de mid


Solução

Quebra recursiva do array para encontrar o maior subarray que


passa através de mid (o algoritmo será visto depois)
Solução

O maior subarray encontrado pelas chamadas recursivas é a resposta


Solução (algoritmo auxiliar)
• Divide-and-Conquer
– E o algoritmo auxiliar para encontrarmos
subarrays que contêm mid:
Solução (algoritmo auxiliar)
Solução (algoritmo auxiliar)

Inicializar a soma total e a soma à esquerda de mid


Solução (algoritmo auxiliar)

Calcula a soma do subarray


entre o começo deste e mid
Solução (algoritmo auxiliar)

(Re)Inicia a soma total e a soma à direita de mid


Solução (algoritmo auxiliar)

Calcula a soma do subarray


entre mid e o fim deste
Solução (algoritmo auxiliar)

Retorna o sub-array que contém mid e sua soma


Complexidade
• Caso base (n = 1) : T(1) = Θ(1)
Complexidade
• Caso base (n = 1) : T(1) = Θ(1)
• Recursão: T(n) = custo(split)
Complexidade
• Caso base (n = 1) : T(1) = Θ(1)
• Recursão: T(n) = custo(split) +
2T(n/2)
Complexidade
• Caso base (n = 1) : T(1) = Θ(1)
• Recursão: T(n) = custo(split) +
2T(n/2) +
custo(algoritmoAuxiliar)
Complexidade
• Caso base (n = 1) : T(1) = Θ(1)
• Recursão: T(n) = custo(split) +
2T(n/2) +
custo(algoritmoAuxiliar) +
custo(comparar 3 resultados)
Complexidade
• Caso base (n = 1) : T(1) = Θ(1)
• Recursão: T(n) = custo(split) +
2T(n/2) +
custo(algoritmoAuxiliar) +
custo(comparar 3 resultados)
• T(n) =
Complexidade
• Caso base (n = 1) : T(1) = Θ(1)
• Recursão: T(n) = custo(split) +
2T(n/2) +
custo(algoritmoAuxiliar) +
custo(comparar 3 resultados)
• T(n) = Q(1)
Complexidade
• Caso base (n = 1) : T(1) = Θ(1)
• Recursão: T(n) = custo(split) +
2T(n/2) +
custo(algoritmoAuxiliar) +
custo(comparar 3 resultados)
• T(n) = Q(1) + 2T(n/2)
Complexidade
• Caso base (n = 1) : T(1) = Θ(1)
• Recursão: T(n) = custo(split) +
2T(n/2) +
custo(algoritmoAuxiliar) +
custo(comparar 3 resultados)
• T(n) = Q(1) + 2T(n/2) + Q(n)
Complexidade
• Caso base (n = 1) : T(1) = Θ(1)
• Recursão: T(n) = custo(split) +
2T(n/2) +
custo(algoritmoAuxiliar) +
custo(comparar 3 resultados)
• T(n) = Q(1) + 2T(n/2) + Q(n) + Q(1)
Complexidade
• Caso base (n = 1) : T(1) = Θ(1)
• Recursão: T(n) = custo(split) +
2T(n/2) +
custo(algoritmoAuxiliar) +
custo(comparar 3 resultados)
• T(n) = Q(1) + 2T(n/2) + Q(n) + Q(1)
• Essa recorrência é igual a do MERGESORT,
logo, a complexidade é: T(n) = Q (n log n)
Executando (média de 10 execuções)
Executando (média de 10 execuções)
• Processador: Intel Core i7(8 núcleos)
@ 2.2GHz – 3.2GHz (Turbo Boost)
Executando (média de 10 execuções)
• Processador: Intel Core i7(8 núcleos)
@ 2.2GHz – 3.2GHz (Turbo Boost)
• Memória: 8 GB Dual-channel DDR3 @ 1600MHz
Executando (média de 10 execuções)
• Processador: Intel Core i7(8 núcleos)
@ 2.2GHz – 3.2GHz (Turbo Boost)
• Memória: 8 GB Dual-channel DDR3 @ 1600MHz
• Sistema: x64, e a compliação foi feita para x64
Executando (média de 10 execuções)
• Processador: Intel Core i7(8 núcleos)
@ 2.2GHz – 3.2GHz (Turbo Boost)
• Memória: 8 GB Dual-channel DDR3 @ 1600MHz
• Sistema: x64, e a compliação foi feita para x64
• Linguagem de Programação: C++;
Executando (média de 10 execuções)
• Geração de dados
Executando (média de 10 execuções)
• Geração de dados

– Tipo: int
Executando (média de 10 execuções)
• Geração de dados

– Tipo: int
– Aleatórios: rand () % 100
Executando (média de 10 execuções)
• Geração de dados

– Tipo: int
– Aleatórios: rand () % 100
– Calculadas as diferenças entre A(i) e A(i – 1)
Executando (média de 10 execuções)
itens mean size min size max size time (ms) memory (MB)
1 1 1 1 <1 1.804
1*102 36 8 90 <1 1.800
1*103 235 28 435 <1 1.812
5*103 161 71 407 <1 1.824
1*104 220 57 561 <1 1.847
5*104 189 60 406 2 1.996
1*105 213 30 426 5 2.187
5*105 261 87 649 26 3.714
1*106 159 27 293 54 5.628
5*106 151 53 412 287 20.917
1*107 126 70 247 578 40.026
5*107 95 24 186 297 192.909
1*108 261 11 675 6093 384.019
5*108 234 93 685 32651 1912.894
Executando (1 execução apenas)
itens mean size min size max size time (ms) memory (MB)
1*109 89 89 89 67125 3823.902
2*109 win32: Erro de compilação
total size of array must not exceed 0x7fffffff bytes

x64: Erro de alocação durante a execução


(não foi possível debuggar, creio que seja o limite de memória
para um processo da máquina de teste)
5*109 Erro de compilação:
total size of array must not exceed 0x7fffffff bytes
Executando (média de 10 execuções)
minSize
100

90

80

70

60

50
minSize

40

30

20

10

0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Executando (média de 10 execuções)
size
300

250

200

150
size

100

50

0
1 2 3 4 5 6 7 8 9 10 11 12 13 14
Executando (média de 10 execuções)
maxSize
800

700

600

500

400
maxSize

300

200

100

0
1 2 3 4 5 6 7 8 9 10 11 12 13 14
Aplicação: EEGs
Aplicação: EEGs
• Altera-se o tipo dos dados para double
Aplicação: EEGs
• Altera-se o tipo dos dados para double
• Os dados são lidos de arquivos de EEGs
Aplicação: EEGs
• Exemplo:
Aplicação: EEGs
• Exemplo:
Aplicação: EEGs
• Calcula-se a diferença entre A(i) e A(i-1), a variação
de potencial nesse tempo
Aplicação: EEGs
• Calcula-se a diferença entre A(i) e A(i-1), a variação
de potencial nesse tempo
Aplicação: EEGs
• Aplica-se a busca do maximum subarray
Aplicação: EEGs
• Aplica-se a busca do maximum subarray
Aplicação: EEGs
• Volta-se ao EEG tendo os índices do maximum
subarray
Aplicação: EEGs
• Volta-se ao EEG tendo os índices do maximum
subarray
Aplicação: EEGs
• Esse, por exemplo, é um EEG do eletrodo F3, que
participa do processamento visual
Aplicação: EEGs
• Esse, por exemplo, é um EEG do eletrodo F3, que
participa do processamento visual
• Um dos componentes mais importantes do
processamento visual é o P3, ou P300
Aplicação: EEGs
• Esse, por exemplo, é um EEG do eletrodo F3, que
participa do processamento visual
• Um dos componentes mais importantes do
processamento visual é o P3, ou P300
• Ele está no maximum subarray encontrado, que
denota um intervalo de máximo estado excitatório
Aplicação: EEGs
• Esse, por exemplo, é um EEG do eletrodo F3, que
participa do processamento visual
• Um dos componentes mais importantes do
processamento visual é o P3, ou P300
• Ele está no maximum subarray encontrado, que
denota um intervalo de máximo estado excitatório
• Se a busca fosse pela menor soma entre os maiores
subarrays teríamos então um intervalo de máximo
estado inibitório

Você também pode gostar