Seja uma coleção de seqüências de caracteres sobre o alfabeto que no total contêm símbolos.
Sua tarefa é classificar cada uma das cadeias internamente e, em seguida, classificar as cadeias resultantes em ordem lexicográfica. (Seu algoritmo não precisa operar dessa maneira.)
Exemplo:
Entrada: 33123 15 1 0 54215 21 12
Saída: 0 1 12 12 12333 12455 15
Eu encontrei uma maneira de fazê-lo no tempo e no espaço .
O espaço é maior que o tempo, porque eu uso uma matriz inteligente que permite criar uma matriz com tamanho e fornecer valores iniciais para todas as células em .
Usei a classificação de bucket para classificar cada sequência de caracteres ( tempo e espaço) e árvores de palavras para classificar a coleção si ( tempo e espaço). mas minha solução é muito complicada.
Alguém tem uma solução melhor, com tempo e menos espaço, ou mais rápido que ?
A solução deve ser determinística para que não haja mapas de hash ou outros algoritmos estatísticos
Minha solução: Uma matriz inteligente é uma matriz de tamanho que podemos criar e "inicializar" em :
Criamos três matrizes do tamanho de sem inicializar qualquer um deles e nós também manter uma variável inteira single chamado .
A primeira matriz contém os dados. A segunda matriz contém ponteiros para uma célula na terceira matriz. A terceira matriz contém ponteiros para uma célula na segunda matriz. contém o número de células inicializadas até o momento.
Suponha que gostaríamos de definir o valor da célula (suponha que seja a primeira vez que o fazemos nesta célula). Em seguida, iremos para a célula na primeira matriz e a definiremos para o valor desejado.
Agora vamos para a célula na segunda matriz e configuramos para apontar para a célula na terceira matriz. Defina a célula na terceira matriz para apontar para a célula na segunda matriz. Aumente em 1.
Suponha que gostaríamos de saber se a célula é uma lixeira (isso significa que ainda precisamos definir algo para ela).
Iríamos para a célula na segunda matriz e olharíamos para o número da célula (na terceira matriz) que a célula (na segunda matriz) aponta para - nós a chamaremos de .
Se então é lixo (porque só inicializamos células até agora não é uma delas).
Se , veremos para que célula (na terceira matriz) aponta. Se não for então é lixo. Caso contrário, não é lixo
Dessa forma, podemos saber em cada etapa se inicializamos esta célula e se não inicializamos. Então, criamos e "inicializamos" uma matriz de tamanho em tempo.
O principal truque não é inicializar toda a matriz no início, mas encontrar uma maneira de saber quais células inicializamos até agora e inicializar uma célula apenas quando "olhamos" para ela. No modelo de RAM, leva tempo para criar uma matriz de qualquer tamanho sem inicializá-la.
Uma árvore de palavras da ordem m é uma generalização de um TRIE. Cada nó contém uma matriz de ponteiros para seus filhos. O tamanho da matriz é . Cada nó também contém um contador para dizer quantos conjuntos existem descritos por este nó.
Como usamos matrizes inteligentes cada vez que adicionamos uma palavra (um conjunto), são necessários apenas tempo e espaço .
Time cannot be smaller than space
true. You are cheating in some way
não segue " tempo e espaço": com , - o limite no espaço parece desnecessariamente relaxado.