Encontre a mediana de uma lista de matrizes classificadas


8

Entrada: um conjunto deℓ matrizes Ai(de números).
Os elementos em cada matriz estão em ordem classificada, mas o conjunto de matrizes não é necessariamente classificado. As matrizes não são necessariamente do mesmo tamanho. O número total de elementos én.

Saída: Oko menor elemento dentre todos os elementos da entrada.

Qual é o algoritmo mais eficiente para esse problema?

É possível, por exemplo, obter um tempo de execução de O(ℓ+log⁡n)?


Há uma pergunta muito relacionada ao SO , com respostas insatisfatórias.
— 21413 Joe Joe

Todas as matrizes têm o mesmo comprimento?
— vonbrand

As matrizes não são necessariamente do mesmo tamanho. No entanto, também estou interessado em um caso especial em que os tamanhos são geométricos, ou seja, matrizAi tem tamanho n/2i, mas duvido que ajude no tempo de execução.
— 5303 Joe

4
Como você conseguiu O(ℓlog⁡n)? Você pode terO(ℓ(log⁡n)2)emulando o algoritmo "seleção rápida". Em cada fase, você escolhe um pivô e calcula quantos elementos estão abaixo dele, emO(ℓlog⁡n). Então você remove os elementos do lado errado e repete. O processo termina apóslog⁡niterações (na expectativa ou, na pior das hipóteses, se você escolher o pivô de maneira inteligente).
— Yuval Filmus

2
@ Joe Eu acho que você deve descrever seu algoritmo também. Seria muito interessante e pode fornecer um ponto de partida para melhores algoritmos, se correto. Se incorretas, as pessoas podem encontrar erros.
— Paresh

Respostas:


5

Você pode fazer isso em O(l+k log l) tempo e O(l) espaço extra da seguinte maneira:

  1. Crie uma pilha binária com uma entrada para cada uma das matrizes. A chave para entradai é o menor elemento da matriz Ai. Isso levaO(l) Tempo.
  2. Selecione a menor entrada da pilha e remova-a O(log l) Tempo). Adicione essa entrada de volta ao heap usando a próxima menor entrada na matriz relevante como chave (novamenteO(log l) Tempo).
  3. Faça o passo anterior kvezes. O último elemento que você remove da pilha é sua resposta.

Se você substituir a pilha binária por uma pilha de Fibonacci, acho que isso fará com que você seja amortizado O(l+k) tempo, mas, na prática, será mais lento que o monte binário, a menos que l é enorme.

Eu suspeito que o limite de heap de Fibonacci seja ideal, porque intuitivamente você precisará inspecionar pelo menos k elementos para encontrar o ko menor, e você terá que inspecionar pelo menos um elemento de cada um dos l matrizes, já que você não sabe como elas são classificadas, o que imediatamente fornece um limite inferior de Ω(max(k,l))=Ω(k+l).


3
Você não precisa inspecionar pelo menos kelementos desde que as matrizes são classificadas. Veja a solução no meu comentário, que dáO(ℓ(log⁡n)2).
— Yuval Filmus

1
Você pode melhorar o pior caso de tempo de execução no modelo de RAM, pois pode implementar sua fila de prioridade para n elementos em o(log⁡n). Neste modelo, você pode realizar operações de inserção e exclusãoO(log⁡registro⁡n) e O(1)hora da operação findMin.
— Massimo Cafaro

1
Você tem certeza de que a pilha Fibonnaci suporta a operação correta? Eu acho que você está pensando em diminuir chave em um min-heap.
— Joe

Isso é basicamente o mesmo que a resposta de vonbrand, com a observação adicional de que você não precisa mesclar nenhum elemento após o quinto.
— Joe

Eu acredito que a pilha de Fibonacci permite diminuir ou aumentar uma chave O(1)Tempo. Sim, esta é basicamente a mesma resposta, mas observando que você só precisa mesclarkelementos reduz seu tempo de execução de maneira justa.
— Matt Lewis

5

Aqui está um randomizado O(ℓregistro2⁡n)algoritmo. Provavelmente, pode ser des randomizado usando o mesmo truque usado para des randomizar a seleção rápida usual.

Emulamos o algoritmo clássico de seleção rápida. Em cada fase, você escolhe um pivô e calcula quantos elementos estão abaixo dele, emO(ℓregistro⁡n), usando a pesquisa binária em cada lista. Então você remove os elementos do lado errado e repete. O processo termina apósregistro⁡n iterações na expectativa.


1

Isso parece ter sido resolvido pelo artigo Seleção e classificação generalizada (Versão Preliminar) de Frederickson e Johnson no STOC '80.

Eles fornecem limites superior e inferior de: Θ(ℓ+∑i=1ℓlog⁡|Ai|) que acaba por ser ℓlog⁡n para a maioria das distribuições de tamanho de matriz.

O algoritmo real para atingir o limite superior é aparentemente apresentado em um artigo anterior: algoritmos ótimos para gerar informações quantílicas em X + Y e matrizes com colunas classificadas , Proc. 13ª Conferência Anual sobre Ciência da Informação e Sistemas, Universidade Johns Hopkins (1979) 47-52.


0

A ℓmesclagem leva tempo Θ(nlog⁡ℓ) (use uma maneira eficiente de representar uma fila de prioridade dos elementos principais em cada lista) e escolha a opção k-ésimo elemento em tempo constante. Acho que isso é discutido em "Classificação e pesquisa" de Knuth para classificação. Obter o menor (ou maior) leva claramenteΘ(ℓ), para uma matriz não classificada, é O(n) IIRC.

Por favor, descreva seu algoritmo.


1
É muito mais lento do que estou interessado. Você pode encontrar a mediana em O(n)tempo apenas concatenando as listas e usando o algoritmo de seleção de tempo linear.
— 5303 Joe
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.