Le titre pose la question.
Nous avons en entrée une liste d'éléments que nous pouvons comparer (déterminer lequel est le plus grand ). Aucun élément ne peut être égal.
Points clés:
- La comparaison n'est pas transitive (pensez aux ciseaux de papier de roche): cela peut être vrai: A> B, B> C, C> A (notez que ce n'est pas une entrée valide car il n'y a pas de réponse valide ici, je ne fais que décrire ce que " comparaison non transitive "signifie)
- Chaque tableau d'entrée sera garanti d'avoir une réponse
- le plus grand signifie que l'élément doit être supérieur à tout autre élément
- La propriété inverse tient à dire A> B implique que B <A
Exemple:
Input: [A,B,C,D]
A > B, B > C, C > A
D > A, D > B, D > C
Output: D
Je ne peux pas trouver un moyen de le faire en temps O (n), ma meilleure solution est O (n ^ 2).
Je suis bloqué sur chaque approche car pour être sûr d'une réponse, l'élément doit être explicitement comparé à tous les autres éléments, pour prouver qu'il s'agit bien de la réponse (car la comparaison n'est pas transitive).
Cela exclut l'utilisation d'un tas, le tri, etc.
algorithms
time-complexity
sets
transitivity
James Wierzba
la source
la source
Réponses:
L'algorithme standard pour trouver un maximum fonctionne toujours. Commencez par et passez en revue les éléments, si vous voyez une valeur plus grande, mettez à jour le maximum pour être cette valeur. La raison pour laquelle cela fonctionne est que chaque élément que vous avez ignoré est plus petit qu'au moins un élément et ne peut donc pas être le maximum.une1
Pour être clair, par «algorithme standard», je veux dire ce qui suit:
Pour être complet, je vais discuter ici des questions soulevées dans les commentaires. Le paramètre de la discussion ci-dessus consiste à trouver un maximum par rapport à une relation antisymétrique , où a i est un maximum si pour tout j ≠ i nous avons a i > a j . L'algorithme ci-dessus fonctionne en supposant qu'un maximum existe, mais si cela n'est pas connu, on peut l'utiliser pour vérifier l'existence d'un maximum (vérifier si l'élément retourné est en effet supérieur à tous les autres éléments, cela est mentionné dans le commentaire de Chi et dans la réponse d'Ilmari Karonen).< uneje j ≠ i uneje> unj
Si n'est pas nécessairement anti symétrique, alors l'algorithme ci-dessus échoue (comme Emil l'a mentionné dans les commentaires). Si < est une relation arbitraire (c'est-à-dire que nous assouplissons à la fois la transitivité et l'anti-symétrie), il n'est pas difficile de montrer qu'il n'est pas possible de trouver un maximum en temps linéaire. On note # un i le nombre de fois un i participé à une requête, nous définissons une relation contradictoire d'une manière que le maximum ne peut être révélé sans suffisamment de requêtes. Étant donné la requête a i > ? a j , répondez a i > a j si # a i< < # aje uneje uneje> ? unej uneje> unj et a i < a j sinon. Si le nombre de requêtes est o ( n 2 ) , alors un maximum n'a pas encore été vu, et il peut être défini pour être l'un des éléments de l'ensemble.# aje< n - 1 uneje< aj o(n2)
la source
n
comparaisons, votre max actuel doit être la réponsemax
ne pourrait être que le maximum d'un sous-tableau. Pourtant, même sans l'hypothèse 2, on peut trouver un maximum provisoire, puis le vérifier sur l'ensemble du tableau à l'aide d'un deuxième balayage, dans la limite O (n).Comme le note Ariel , l'algorithme de recherche de maximum standard donné ci-dessous:
fonctionnera en fait sans modification tant que:
(La première hypothèse ci-dessus peut en fait être assouplie, même sans avoir à modifier l'algorithme, tant que nous supposons que l'élément maximal est comparable à tous les autres éléments et cela
x > y
est toujours faux si les élémentsx
ety
sont incomparables.)En particulier, vous affirmez que:
n'est pas vrai dans les hypothèses données ci-dessus. En fait, pour prouver que l'algorithme ci-dessus trouvera toujours l'élément maximal, il suffit de constater que:
x
sera l'élément maximal;m
il sera l'élément maximal; etm
cela ne changera sur aucune des itérations suivantes.Par conséquent, à la fin de la boucle,
m
sera toujours l'élément maximal, si l'entrée en contient un.Ps. Si l'entrée ne contient pas nécessairement toujours un élément maximal, la vérification de ce fait nécessitera en effet de tester la réponse candidate par rapport à tous les autres éléments pour vérifier qu'elle est vraiment maximale. Cependant, nous pouvons toujours le faire en temps O ( n ) après avoir exécuté l'algorithme de recherche de maximum ci-dessus:
(Je suppose ici que la relation
>
est irréflexive, c'est-à-dire qu'aucun élément ne peut être supérieur à lui-même. Si ce n'est pas nécessairement le cas, la comparaisonx > m
de l'étape 2 devrait être remplacée parx ≠ m and x > m
, où≠
dénote une comparaison d'identité. Ou nous pourrions simplement appliquer l'optimisation noté ci-dessous.)Pour prouver l'exactitude de cette variation de l'algorithme, considérons les deux cas possibles:
m
. Peu importe de quel élément il s'agit, car il sera en tout cas non maximal, et donc l'étape 2 le détectera et le retourneraNone
.Si nous stockons l'indice
m
dans le tableau d'entréea
, on pourrait en fait pas optimize 2 pour vérifier que les éléments qui viennent avantm
dansa
, puisque les éléments ultérieurs ont déjà été comparé à l'm
étape 1. Mais cette optimisation ne change pas la complexité du temps asymptotique de l'algorithme, qui est toujours O ( n ).la source
if x > m:
définie.«le plus grand signifie que l'élément doit être plus grand que tous les autres éléments» est une énorme indication sur la façon de procéder dans .O(n)
Si vous parcourez votre liste en comparant des éléments, tout élément qui "perd" une comparaison peut être immédiatement éliminé car, pour être le plus grand, il doit être supérieur à TOUS les autres éléments afin que la perte unique le disqualifie.
Cette solution est rendue possible par une subtilité: "Aucun élément ne peut être égal" combiné avec le fait qu'il y aura toujours un plus grand élément. Si nous cartographions les relations de victoires sous forme de graphique dirigé, il est clair que nous pouvons atteindre le plus grand élément simplement en suivant les victoires.
la source
Je suppose que la relation antisymétrique pour au moins un élément unique (qui garantit l'existence du plus grand élément), sinon la tâche est impossible. Si tous les éléments de l'ensemble fini sont comparables, la procédure de recherche de maximum habituelle fonctionne.
Si certains éléments ne sont pas comparables, la procédure suivante fonctionnera
la source
else if
soit nécessaire. Il ne peut pas être déclenché simax
est le maximum, et si le maximum n'a pas encore été atteint, peu importe la valeur demax
.if
s sanselse
s? C'est juste une habitude: avecelse
s on ne compare même pas. :)max
à n'importe quel élément de la liste et, à l'intérieur de la boucle, de le faireif max and a[i] are comparable and max < a[i] then max = a[i]
(où la première partie de la condition pourrait être omise si nous supposons qu'essayer de comparer deux éléments incomparables donne toujours faux)?En complément deA<B B<A
Pour la plupart de l'algorithme, l'adversaire s'assurera de toujours retourner vrai pourAi<Aj j
J'espère que c'est quelque peu compréhensible. N'hésitez pas à demander dans les commentaires ou à modifier.
L'idée de base est que vous ne pouvez pas collecter d'informations sur les éléments restants à partir de ceux que vous connaissez déjà si vous autorisez une relation complètement arbitraire.
la source
A > B
la source