Maintenant, mon algorithme est O(n) en temps et O(Dn) de l'espace où Dn est le nombre total de imblance dans la liste.
Cette solution ne doit pas modifier la liste.
soit D la différence de 1s et 0s trouvé dans la liste.
Tout d'abord, revenons en linearily par le biais de la liste et de calculer D, juste pour voir comment il fonctionne:
Je vais utiliser cette liste comme un exemple : l=1100111100001110
Element D
null 0
1 1
1 2 <-
0 1
0 0
1 1
1 2
1 3
1 4
0 3
0 2
0 1
0 0
1 1
1 2
1 3
0 2 <-
Trouver le plus long équilibrée subarray est équivalent à trouver 2 éléments égaux en D qui sont le plus loin de l'appart. (dans cet exemple, les 2 2s marqué avec des flèches.)
La plus longue équilibré subarray est entre la première occurence de l'élément +1 et la dernière occurence de l'élément. (première flèche +1 et la dernière flèche : 00111100001110)
Remarque:
La plus longue subarray sera toujours entre 2 éléments de D qui sont
entre [0,Dn] où Dn est le dernier élément de D. (Dn = 2 dans le
exemple précédent) Dn est le total déséquilibre entre 1s et 0s dans les
liste. (ou [Dn,0] si Dn est négatif)
Dans cet exemple, cela signifie que je n'ai pas besoin de "regarder" 3s ou 4s
La preuve:
Laissez-Dn > 0 .
Si il y a un subarray délimité par P (P > Dn). Puisque 0 < Dn < P,
avant d'atteindre le premier élément de D, qui est égal à P, nous atteignons un
élément égal à Dn. Ainsi, depuis le dernier élément de la liste est égal à Dn, il y a une plus longue subarray délimité par le Dns que celui délimité par le Ps.Et donc nous n'avons pas besoin de regarder Ps
P ne peut pas être inférieure à 0 pour les mêmes raisons
la preuve est la même pour Dn <0
Maintenant, nous allons travailler sur D, D n'est pas aléatoire, la différence entre les 2 éléments consécutifs est toujours 1 ou -1. Sna il est facile de bijection entre le D et la liste initiale. Donc j'ai 2 solutions à ce problème:
- la première est de garder une trace de la première et de la dernière apparition de chaque
élément D qui sont entre 0 et Dn (cf la remarque).
- la deuxième est la transformation de la liste en D, et ensuite travailler sur D.
PREMIÈRE SOLUTION
Pour le moment je ne peut pas trouver une meilleure approche que la première:
Tout d'abord calculer Dn (en O(n)) . Dn=2
Deuxième au lieu de créer D, créer un dictionnaire dont les clés sont la valeur de D (entre [0 et Dn]) et la valeur de chacune de ces touches est un couple (a,b) où a est la première occurence de la clé et b le dernier.
Element D DICTIONNARY
null 0 {0:(0,0)}
1 1 {0:(0,0) 1:(1,1)}
1 2 {0:(0,0) 1:(1,1) 2:(2,2)}
0 1 {0:(0,0) 1:(1,3) 2:(2,2)}
0 0 {0:(0,4) 1:(1,3) 2:(2,2)}
1 1 {0:(0,4) 1:(1,5) 2:(2,2)}
1 2 {0:(0,4) 1:(1,5) 2:(2,6)}
1 3 { 0:(0,4) 1:(1,5) 2:(2,6)}
1 4 {0:(0,4) 1:(1,5) 2:(2,6)}
0 3{0:(0,4) 1:(1,5) 2:(2,6) }
0 2 {0:(0,4) 1:(1,5) 2:(2,9) }
0 1 {0:(0,4) 1:(1,10) 2:(2,9) }
0 0 {0:(0,11) 1:(1,10) 2:(2,9) }
1 1 {0:(0,11) 1:(1,12) 2:(2,9) }
1 2 {0:(0,11) 1:(1,12) 2:(2,13)}
1 3 {0:(0,11) 1:(1,12) 2:(2,13)}
0 2 {0:(0,11) 1:(1,12) 2:(2,15)}
et vous avez choisi l'élément ayant la plus grande différence : 2:(2,15) et est l[3:15]=00111100001110 (avec l=1100111100001110).
Le temps de la complexité :
2 passes, la première à caclulate Dn, le second pour construire le
dictionnaire.
trouver le max dans le dictionnaire.
Total est O(n)
L'espace de la complexité:
l'élément en cours dans D : O(1) le dictionnaire O(Dn)
Je ne prends pas 3 et 4 dans le dictionnaire en raison de la remarque
La complexité est O(n) en temps et O(Dn) de l'espace (dans la moyenne des cas Dn <<
n).
Je suppose qu'il est peut-être une meilleure manière d'un dictionnaire de cette approche.
Toute suggestion est la bienvenue.
J'espère que ça aide
DEUXIÈME SOLUTION (JUSTE UNE IDÉE PAS LA VRAIE SOLUTION)
La deuxième façon de procéder serait de transformer votre liste dans D. (car il est facile de revenir en arrière à partir D pour la liste c'est ok). (O(n) en temps et O(1) de l'espace, depuis que je transforme la liste en place, même si il pourrait ne pas être un "valide" O(1) )
Puis, à partir de D, vous devez trouver les 2 égal élément qui sont le plus loin de l'appart.
il ressemble à trouver le cycle le plus long dans une liste liée, d'Une modification de Richard Brent algorithme peut retourner le cycle le plus long, mais je ne sais pas comment le faire, et il faudrait de O(n) en temps et O(1) de l'espace.
Une fois que vous trouver le plus long cycle, retour à la première de la liste et de l'imprimer.
Cet algorithme permettrait de prendre en O(n) en temps et O(1) l'espace de la complexité.