O título indica a pergunta.
Temos como entradas uma lista de elementos que podemos comparar (determinar qual é o melhor ). Nenhum elemento pode ser igual.
Pontos chave:
- A comparação não é transitiva (pense em uma tesoura de papel de pedra): isso pode ser verdade: A> B, B> C, C> A (observe que não é uma entrada válida, pois não há resposta válida aqui, apenas descrevo o que " comparação não transitiva "significa)
- Cada matriz de entrada é garantida para ter uma resposta
- maior significa que o elemento deve ser maior que qualquer outro elemento
- A propriedade inversa mantém ou seja, A> B implica que B <A
Exemplo:
Input: [A,B,C,D]
A > B, B > C, C > A
D > A, D > B, D > C
Output: D
Não consigo descobrir uma maneira de fazer isso em O (n) tempo, minha melhor solução é O (n ^ 2).
Fico presa em todas as abordagens devido ao fato de que, para ter certeza de uma resposta, o elemento precisa ser explicitamente comparado a qualquer outro elemento, para provar que é realmente a resposta (porque a comparação não é transitiva).
Isso exclui o uso de uma pilha, classificação etc.
algorithms
time-complexity
sets
transitivity
James Wierzba
fonte
fonte
Respostas:
O algoritmo padrão para encontrar um máximo ainda funciona. Comece com e passar por cima dos elementos, se você vê um valor maior, atualizar o máximo para ser esse valor. A razão pela qual isso funciona é que cada elemento que você pulou é menor que pelo menos um elemento e, portanto, não pode ser o máximo.a1
Para ser claro, com o "algoritmo padrão" quero dizer o seguinte:
Para ser completo, discutirei aqui as questões levantadas nos comentários. A configuração na discussão acima é encontrar um máximo em relação a uma relação anti-simétrica , em que< é um máximo se para todo j ≠ i temos um i > um j . O algoritmo acima funciona sob a suposição de que existe um máximo, no entanto, se isso não for conhecido, pode-se usá-lo para verificar a existência de um máximo (verifique se o elemento retornado é realmente maior que todos os outros elementos, isso é mencionado no comentário de Chi e na resposta de Ilmari Karonen).umaEu j ≠ i umaEu> aj
Se não for necessariamente anti-simétrico, o algoritmo acima falhará (como Emil mencionado nos comentários). Se < é uma relação arbitrária (isto é, estamos relaxando a transitividade e a antimetria), não é difícil mostrar que não é possível encontrar um máximo no tempo linear. Denote por # a i o número de vezes que um i participou de uma consulta, nós definimos uma relação adversarial de uma forma que o valor máximo não pode ser revelado sem consultas suficientes. Dada a consulta a i > ? a j , responda a i > a j se # a i< < # aEu umaEu umaEu> ? umaj umaEu> aj e a i < a j caso contrário. Se o número de consultas for o ( n 2 ) , um máximo ainda não foi visto e pode ser definido como um dos elementos do conjunto.#ai<n−1 ai<aj o(n2)
fonte
n
comparações, seu máximo atual tem que ser a respostamax
só poderia ser o máximo de um subarray. Mesmo assim, mesmo sem a suposição 2, é possível encontrar um máximo provisório e depois verificá-lo em toda a matriz usando uma segunda varredura, dentro do limite O (n).Como observa Ariel , o algoritmo padrão de localização máxima fornecido abaixo:
de fato funcionará sem modificações, desde que:
(O primeiro pressuposto acima realmente pode ser relaxada, mesmo sem ter que modificar o algoritmo, desde que assumimos que o elemento máxima é comparável com todos os outros elementos e que
x > y
é sempre false se os elementosx
ey
são incomparáveis.)Em particular, você afirma que:
não é verdade sob as premissas fornecidas acima. De fato, para provar que o algoritmo acima sempre encontrará o elemento máximo, basta observar que:
x
será o elemento máximo;m
será o elemento máximo; em
não será alterado em nenhuma das iterações subsequentes.Portanto, no final do loop,
m
sempre será o elemento máximo, se a entrada contiver um.Ps. Se a entrada nem sempre necessariamente contém um elemento máximo, a verificação desse fato exigirá um teste da resposta do candidato em relação a qualquer outro elemento para verificar se ele é realmente máximo. No entanto, ainda podemos fazer isso em O ( n ) tempo após a execução do algoritmo de localização máxima acima:
(Estou assumindo aqui que a relação
>
é irreflexiva, ou seja, nenhum elemento pode ser maior que ele próprio. Se esse não for necessariamente o caso, a comparaçãox > m
na etapa 2 deve ser substituída porx ≠ m and x > m
, onde≠
denota comparação de identidade. Ou podemos aplicar a otimização indicado abaixo.)Para provar a correção dessa variação do algoritmo, considere os dois casos possíveis:
m
. Não importa qual elemento seja, pois, em qualquer caso, não será o máximo e, portanto, a etapa 2 detectará isso e retornaráNone
.Se armazenado o índice
m
na matriz de entradaa
, poderíamos realmente passo otimizar 2 para verificar apenas aqueles elementos que vêm antesm
dea
, já que qualquer elementos posteriores já foram comparados comm
na etapa 1. Mas essa otimização não altera a complexidade de tempo assintótica do algoritmo, que ainda é O ( n ).fonte
if x > m:
é indefinida.Se você percorrer sua lista comparando elementos, qualquer elemento que "perca" uma comparação pode ser imediatamente descartado, pois, para ser o maior, ele deve ser maior que TODOS os outros elementos para que a perda única o desqualifique.
Esta solução é ativada por uma sutileza: "Nenhum elemento pode ser igual" combinado com o fato de que sempre haverá um elemento maior. Se mapearmos as relações de vitórias como um gráfico direcionado, ficará claro que podemos alcançar o maior elemento simplesmente seguindo as vitórias.
fonte
Suponho que a relação antissimétrica para pelo menos um elemento único (que garante a existência do maior elemento), caso contrário, a tarefa é impossível. Se todos os elementos no conjunto finito forem comparáveis, o procedimento usual de encontrar o máximo funcionará.
Se alguns elementos não forem comparáveis, o procedimento a seguir funcionará
fonte
else if
seja necessário. Ele não pode ser acionado semax
for o máximo, e se o máximo ainda não foi encontrado, não importa qual seja o valormax
.if
s semelse
s? É apenas um hábito: comelse
s nem sequer comparamos. :)max
qualquer elemento da lista e, dentro do loop, fazerif max and a[i] are comparable and max < a[i] then max = a[i]
(onde a primeira parte da condição poderia ser omitida se assumirmos que tentar comparar dois elementos incomparáveis sempre gera falso)?Espero que isso seja um pouco compreensível. Sinta-se livre para perguntar nos comentários ou editar.
A idéia básica é que você não pode reunir nenhuma informação sobre os elementos restantes daqueles que você já conhece se permitir uma relação completamente arbitrária.
O argumento ainda funciona se não permitirmosA<A n n2−n
fonte
A > B
fonte