Tendo a string de comprimento , encontrar a contagem de substrings distintos pode ser feito em tempo linear usando o array LCP. Em vez de solicitar substrings exclusivos, conte na cadeia inteira , a consulta contém a indexação que está solicitando a contagem de substring distintas dentro do intervalo de consulta especificado para a cadeia .
Minha abordagem é apenas aplicar a construção de tempo linear da matriz LCP para cada consulta. Dá complexidade . O número de consultas pode aumentar para a ordem de portanto, responder a todas as consultas torna .
Pode ser feito melhor do que o tempo linear para cada consulta?
Em geral, se um processo de substring de string para o qual já temos matriz de sufixos, árvore de sufixos, matriz lcp, essas estruturas não são mais relevantes e devem ser construídas do zero novamente?
fonte
Respostas:
A questão não motiva o número de consultas sendo , o que parece ser o pior caso arbitrário, pois o número de possíveis consultas únicas é o número de pares ordenados e, portanto, .O(n) O(n2)
Aqui estão duas soluções diferentes com melhor complexidade de tempo para o caso base em árvores de sufixos (implícitas) construídas de forma incremental com o algoritmo de Ukkonen . Ambas as soluções são baseadas no pré-processamento e possuem complexidade onde é o conjunto de consultas. A segunda solução é executada em se todas as consultas tiverem a mesma largura.O(n2) O(n2+|Q|) Q O(n+|Q|)
Solução 1 - Pré-processe todas as consultas exclusivas
Repetir os sufixos de . Para cada sufixo , construa a árvore de sufixos com o algoritmo de Ukkonen. Após atualizar para a árvore de sufixos atual, armazene o tamanho da árvore em uma matriz na posição . Uma consulta para o intervalo é respondida pelo elemento da matriz em .S Si=S[i..n] Si j (i,i+j−1) [x,y] (x,y)
O tamanho da árvore do sufixo pode ser armazenado junto com a árvore do sufixo e atualizado em tempo constante a cada etapa, modificando o procedimento de atualização no algoritmo de Ukkonen. Para cada atualização, o tamanho aumenta pelo número atual de folhas.
Solução 2 - Pré-processar larguras de consulta exclusivas
Essa solução é mais difícil de implementar, mas requer menos trabalho de pré-processamento se houver poucas larguras de consulta. O pré-processamento leva tempo se houver apenas uma largura de consulta.O(n)
Para cada largura de consulta , use uma janela deslizante de largura construa incrementalmente uma árvore de sufixos. Remova o sufixo iniciando um caractere à esquerda da janela e remova o sufixo mais longo da árvore. Em cada etapa, o número atual de substrings na janela deslizante é o tamanho da árvore.w w
Todas as consultas podem ser respondidas em tempo linear usando os resultados da pré-computação.
Nota: a remoção do sufixo mais longo pode ser feita removendo a folha mais antiga da árvore do sufixo. Não é fácil de implementar corretamente.
fonte
Existe uma solução offline .O(nn−−√+|Q|n−−√)
O passo 3 pega para cada bucket, porque usamos o algoritmo de Ukkonen segue em ordem crescente.O(n) j
A etapa 4 usa para cada consulta, porque remover sufixos mais longos da árvore leva . Observe que você pode usar uma camada indireta para evitar modificações na árvore de sufixos original.O(n−−√) n−−√ O(n−−√)
fonte