Solution précédente de 65 octets:
r->{for(int a,b=0,z,i=0;;b=a)if((a=b|1<<(z=r[i++]))==b)return z;}
Nouvelle solution. 19 octets sont inclus pourimport java.math.*;
-8 octets grâce à @Nevay
r->{int z,i=0;for(BigInteger c=BigInteger.ZERO;c.min(c=c.setBit(z=r[i++]))!=c;);return z;}
Essayez-le en ligne!
modifier
L'algorithme de mon programme d'origine fonctionnait bien, mais la taille statique du type de données utilisé signifiait qu'il s'était cassé assez rapidement une fois que la taille avait dépassé un certain seuil.
J'ai changé le type de données utilisé dans le calcul pour augmenter la limite de mémoire du programme afin de s'adapter à cela (en utilisant BigInteger
une précision arbitraire au lieu de int
ou long
). Cependant, cela rend discutable si cela compte ou non comme O(1)
complexité d'espace.
Je laisserai mon explication ci-dessous intacte, mais j’aimerais ajouter que j’estime maintenant qu’il est impossible de réaliser O(1)
la complexité de l’espace sans faire quelques hypothèses.
Preuve
Définir N
comme un entier tel que 2 <= N
.
Soit S
une liste représentant une série d’entiers aléatoires [x{1}, ..., x{N}]
, où x{i}
a la contrainte 1 <= x{i} <= N
.
La complexité temporelle (en notation Big-O) requise pour parcourir cette liste exactement une fois par élément est O(n)
Le défi consiste à trouver la première valeur dupliquée dans la liste. Plus précisément, nous recherchons la première valeur S
qui est un duplicata d’un élément précédent de la liste.
Laissez p
et q
soyez les positions de deux éléments dans la liste tels que p < q
et x{p} == x{q}
. Notre défi consiste à trouver le plus petit q
qui réponde à ces conditions.
L'approche évidente de ce problème est de parcourir S et de vérifier si notre x{i}
existe dans une autre liste T
: S'il x{i}
n'existe pas dans T
, nous le stockons dans T
. Si x{i}
existe dans T
, c'est la première valeur en double et donc la plus petite q
, et en tant que telle, nous la retournons. Cette efficacité spatiale est O(n)
.
Pour atteindre O(1)
la complexité de l’espace tout en maintenant la O(n)
complexité temporelle, nous devons stocker des informations uniques sur chaque objet de la liste dans un espace fini. De ce fait, la seule façon pour un algorithme de fonctionner àO(1)
la complexité de l'espace est si: 1. N se voit attribuer une limite supérieure correspondant à la mémoire nécessaire pour stocker le nombre maximal de valeurs possibles pour un type de données fini particulier. 2. La réaffectation d'une seule variable immuable ne compte pas dans la complexité, mais uniquement dans le nombre de variables (une liste étant plusieurs variables). 3. (Basé sur d'autres réponses) La liste est (ou au moins, les éléments de la liste sont) mutable, et le type de données de la liste est prédéfini comme un entier signé, ce qui permet d'apporter des modifications aux éléments plus loin dans la liste. sans utiliser de mémoire supplémentaire.
1 et 3 nécessitent à la fois des hypothèses et des spécifications sur le type de données, tandis que 2 requiert que seul le nombre de variables soit pris en compte pour le calcul de la complexité de l'espace, plutôt que la taille de ces variables. Si aucune de ces hypothèses n’est acceptée, il serait impossible d’obtenir à la O(n)
fois une complexité temporelle et une O(1)
complexité spatiale.
Explication
Whoo Boy, celui-ci a mis un temps long à imaginer un peu de puissance cérébrale.
Donc, aller au bonus est difficile. Nous avons besoin que les deux contrôlent une seule fois la totalité de la liste et identifient les valeurs sur lesquelles nous avons déjà effectué une itération sans complexité d'espace supplémentaire.
La manipulation de bits résout ces problèmes. Nous initialisons notre O(1)
«stockage», une paire d’entiers, puis nous parcourons la liste, OU le bit indiqué dans notre premier entier et le stockage du résultat dans le second.
Par exemple, si nous 1101
effectuons une opération OR avec 10
, nous obtenons 1111
. Si nous faisons un autre OU avec 10
, nous avons toujours 1101
.
Ainsi, une fois que nous avons effectué l'opération OR et que nous nous retrouvons avec le même numéro, nous avons trouvé notre duplicata. Aucun doublon dans le tableau ne provoque l'exécution du programme et une exception.