J'ai ce tableau
var arr = ["s00","s01","s02","s03","s04","s05","s07","s08","s09","s10","s11","s12","s13","s14","s17","s19","s20","s21","s22","s24","s25","s26","s27","s28","s30","s32","s33","s34","s36","s38","s39","s41","s43","s44","s45","s46","s47","s48","s49","s50","s51","s52","s53","s54","s55","s56","s58","s60","s61","s62","s63","s64","s65","s67","s69","s70"];
J'ai essayé de trouver un algorithme qui me dira quelle s
sont absents. Comme vous pouvez le voir, la liste se compose de consécutifs s
s ( s1
, s2
etc.).
Au début, j'ai opté pour cette solution :
var arr = ["s00","s01","s02","s03","s04","s05","s07","s08","s09","s10","s11","s12","s13","s14","s17","s19","s20","s21","s22","s24","s25","s26","s27","s28","s30","s32","s33","s34","s36","s38","s39","s41","s43","s44","s45","s46","s47","s48","s49","s50","s51","s52","s53","s54","s55","s56","s58","s60","s61","s62","s63","s64","s65","s67","s69","s70"];
for (var i=1;i<arr.length;i++){
var thisI = parseInt(arr[i].toLowerCase().split("s")[1]);
var prevI = parseInt(arr[i-1].toLowerCase().split("s")[1]);
if (thisI != prevI+1)
console.log(`Seems like ${prevI+1} is missing. thisI is ${thisI} and prevI is ${prevI}`)
}
Mais cette méthode échoue pour plus d'un numéro consécutif manquant ( s15
, s16
). J'ai donc ajouté un while
boucle qui fonctionne.
var arr = ["s00","s01","s02","s03","s04","s05","s07","s08","s09","s10","s11","s12","s13","s14","s17","s19","s20","s21","s22","s24","s25","s26","s27","s28","s30","s32","s33","s34","s36","s38","s39","s41","s43","s44","s45","s46","s47","s48","s49","s50","s51","s52","s53","s54","s55","s56","s58","s60","s61","s62","s63","s64","s65","s67","s69","s70"];
for (var i=1;i<arr.length;i++){
var thisI = parseInt(arr[i].toLowerCase().split("s")[1]);
var prevI = parseInt(arr[i-1].toLowerCase().split("s")[1]);
if (thisI != prevI+1) {
while(thisI-1 !== prevI++){
console.log(`Seems like ${prevI} is missing. thisI is ${thisI} and prevI is ${prevI}`)
}
}
}
Cependant, j'ai l'impression de compliquer excessivement les choses. J'ai pensé à créer un tableau idéal :
var idealArray = [];
for (var i =0; i<200;i++) {
idealArray.push(i)
}
Et ensuite, pendant la vérification, trafiquer mon tableau ( arr
) afin que la boucle vérifie deux tableaux de même longueur. Autrement dit, utilisez cette solution :
var idealArray = [];
for (var i =0; i<200;i++) {
idealArray.push(i)
}
var arr = ["s00","s01","s02","s03","s04","s05","s07","s08","s09","s10","s11","s12","s13","s14","s17","s19","s20","s21","s22","s24","s25","s26","s27","s28","s30","s32","s33","s34","s36","s38","s39","s41","s43","s44","s45","s46","s47","s48","s49","s50","s51","s52","s53","s54","s55","s56","s58","s60","s61","s62","s63","s64","s65","s67","s69","s70"];
for (let i = 0; i<idealArray.length;i++){
if (parseInt(arr[i].toLowerCase().split("s")[1]) != idealArray[i]) {
console.log(`Seems like ${idealArray[i]}is missing`);
arr.splice(i,0,"dummyel")
}
}
Mais, encore une fois, j'ai l'impression que la création de ce deuxième tableau n'est pas non plus très efficace (en pensant à une grande liste, je gaspillerais de l'espace inutile).
Alors... comment puis-je réaliser efficacement cette tâche en JavaScript ? (Efficace signifie aussi proche de O(1) que possible à la fois pour la complexité temporelle et pour la complexité spatiale).
9 votes
Hmm, ma première idée serait de faire une recherche linéaire naïve. En gros, on démarre un compteur avec le premier nombre du tableau, puis on parcourt le tableau en incrémentant le compteur et en le comparant à l'élément actuel. Évidemment, c'est O(n), cependant. Pour une solution plus efficace, je suppose que l'on peut faire quelque chose de binaire - prendre le premier nombre, le dernier nombre et la longueur du tableau - est-ce qu'ils correspondent ? Si ce n'est pas le cas, prenez la moitié du tableau et procédez de la même manière. Répétez l'opération jusqu'à ce que vous trouviez l'élément manquant. Cela nécessite un peu de travail pour de multiples éléments manquants, mais c'est O(log n) en exécution mais pas en espace.
2 votes
@TanDuong J'avais l'impression que la révision du code ne consistait pas à trouver un meilleur algorithme, mais à peaufiner la solution existante. À moins que vous n'ayez essayé de réinventer la roue au lieu d'utiliser une fonctionnalité intégrée ou autre.
0 votes
Pouvez-vous supposer que le nombre
k
d'éléments manquants croît strictement plus lentement queO(N)
, dondeN
est la taille de la gamme ? Si vous pouvez donner une limite supérieure plus forte pourk
(par exemple, quelque chose commelog(N)
osqrt(N)
oN^\alpha
pour certains\alpha < 1.0
), alors les algorithmes dont le comportement dans le pire des cas est supérieur àO(N)
pourrait être possible.0 votes
Devez-vous également vérifier les chevauchements, par exemple
["s00", "s01", "s01", "s03"]
?0 votes
@SalmanA Non, il n'est pas nécessaire de vérifier les chevauchements. L'entrée est garantie de contenir des nombres consécutifs distincts dans l'ordre croissant ; pnuts tu as raison... Je voulais dire quels ss manquent en effet