Encontrar o número de elementos menores para cada elemento em uma matriz de forma eficiente


9

Estou preso neste problema:

Dada uma matriz dos primeiros números naturais permutados aleatoriamente, uma matriz é construída, de modo que é o número de elementos de a que são menores que . AnBB(k)A(1)A(k1)A(k)

i) Dado você pode encontrar em tempo? ii) Dado você pode encontrar em tempo?ABO(n)
BAO(n)

Aqui, . Para um exemplo concreto: B(1)=0

|A843172965B000031644|

Alguém pode me ajudar? Obrigado.


Eu descobri o seguinte: Computando codificações de permutação que fornecem algoritmos para esses problemas. Pelo menos eu acho que eles são os mesmos problemas. O(nlogn)
Realz Slaw

@ Merbs, essa dica que você deu significa que você tem uma solução?
AJed

11
@AJed, significa que tenho um algoritmo, embora seja necessário para o algoritmo simples sem espaço e se tivermos espaço permitido. No momento, estou inclinado a não ser possível em e os dois serem o mesmo algoritmo. O(n2)O(nlogn)O(n)
Merbs

@Merbs. Eu sinto que sua dica pode levar ao caminho certo. Estou tendo uma solução também (seguindo sua dica). Acho que há um truque na análise que o leva a . Acho que o truque é o conhecimento de que passa apenas de 1: . O(n)An
AJed

2
Este artigo também fornece um algoritmo . Você tem certeza de que existe um algoritmo para isso? O(nlogn)O(n)
Realz Slaw

Respostas:


1

BA

k=1,,nB(k)A(i)A(k)i=1,,kA(i)<A(k)

A(1)n1A(2)n2(n1)(n2)2B(n)B(n)=A(n)1 nn1B(n1)A(1)A(n2)A(n)

k=1,,n2k=n2,,nB(k)A(n)11A(i)i=k+1,,nA(k)

Isso levaria etapas, que ainda é . Observe também que, ao construir partir de , se então .2×(n21)(n22)2=(n2)(n4)4O(n2)ABB(n)=A(n)1A(n)=B(n)+1

Mas agora para mais requinte. Se for permitido um espaço adicional ou uma classificação no local, podemos classificar os números à medida que os comparamos. Por exemplo:

|A843172965S987432165B0000316|

Em vez de verificar todas elas (ou verificá-las em ordem), poderíamos usar a pesquisa binária para determinar cada . No entanto, a classificação ainda leva tempo .B(k)O(nlogn)


Esta foi apenas a minha primeira ideia; embora perceba que o problema é mais interessante do que eu originalmente acreditava. E ainda não tive a oportunidade de ler as descobertas de Realz Slaw, portanto o algoritmo pode estar desativado.
Merbs

0

B(k)A n

|A123456789B800000000104000011112030001222230101123333407011233345320123444561901234445666012344567450123456784|

8(n)(n+2)2


0

I e II são solucionáveis ​​usando #next_gength_element que expliquei aqui . mas é um pouco mais difícil do que apenas o problema, mas antes da solução, você precisa aprender o próximo elemento:

  1. ASiiiASiiB[i]=j=0x(Si[j]+1)xSiΘ(n)Θ(n)Θ(n)

O(1)o(n)

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.