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(+logn)?

Joe
fonte
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(logn)? Você pode terO((logn)2)emulando o algoritmo "seleção rápida". Em cada fase, você escolhe um pivô e calcula quantos elementos estão abaixo dele, emO(logn). Então você remove os elementos do lado errado e repete. O processo termina apóslogniteraçõ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).

Matt Lewis
fonte
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((logn)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(logn). Neste modelo, você pode realizar operações de inserção e exclusãoO(logregistron) 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(registro2n)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(registron), usando a pesquisa binária em cada lista. Então você remove os elementos do lado errado e repete. O processo termina apósregistron iterações na expectativa.

Yuval Filmus
fonte
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=1log|Ai|) que acaba por ser logn 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.

Joe
fonte
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.

vonbrand
fonte
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