Étant donné deux chaînes, comment pouvez-vous vérifier si elles sont une permutation l'une de l'autre en utilisant l'espace O (1)? La modification des chaînes n'est en aucun cas autorisée.
Remarque: espace O (1) par rapport à la longueur de la chaîne ET à la taille de l'alphabet.
algorithms
strings
space-complexity
Anonyme
la source
la source
O(log n)
des chaînes de longueur n qui ne sont ni constantes par la longueur ni par la taille de l'alphabet. Lorsque les chaînes peuvent être temporairement modifiées, je pense qu'il existe une solution avec un alphabet accru qui est linéaire dans la taille de l'alphabet mais constant dans la longueur des chaînes dans un modèle logarithmique.Réponses:
L'approche naïve consisterait à créer des histogrammes des deux chaînes et à vérifier si elles sont identiques. Comme nous ne sommes pas autorisés à stocker une telle structure de données (dont la taille serait linéaire à la taille de l'alphabet) qui pourrait être calculée en une seule passe, nous devons compter les occurrences de chaque symbole possible après l'autre:
Cela suppose bien sûr que les nombres et les indices d'itérateur sont des entiers de taille constante, au lieu de dépendre de la longueur des chaînes.
la source
O(n * min(n, |Σ|))
. Hm, maintenant que j'y pense, cela ressemble beaucoup à la solution "autorisé à répéter" de votre réponse, n'est-ce pas?count
n'est pasO(1)
(c'est-à-dire qu'il peut déborder)count
c'était unint
:-) Oui, ça ne marcherait pas, mais en Java ça ne peut pas arriver de toute façonNotons les tableaux par et supposons qu'ils sont de longueur n .A , B n
Supposons d'abord que les valeurs de chaque tableau soient distinctes. Voici un algorithme qui utilise l' espace :O ( 1 )
Calculez les valeurs minimales des deux tableaux et vérifiez qu'elles sont identiques.
Calculez les deuxièmes valeurs minimales des deux tableaux et vérifiez qu'elles sont identiques.
Etc.
Le calcul de la valeur minimale d'un tableau utilise clairement l' espace . Étant donné le k ème plus petit élément, nous pouvons trouver le ( k + 1 ) st le plus petit élément en trouvant la valeur minimale plus grande que le kO ( 1 ) k ( k + 1 ) k ème plus petit élément (ici, nous utilisons le fait que tous les éléments sont distincts).
Lorsque les éléments sont autorisés à se répéter, nous modifions l'algorithme comme suit:
Calculez les valeurs minimales des deux tableaux, comptez combien de fois chacun apparaît et vérifiez les m A , 1 = m B , 1mA,1,mB,1 mA,1=mB,1 et que les comptes sont identiques.
Calculez les valeurs minimales supérieures à m A , 1 , m B , 1 dans les deux tableaux (respectivement) et comptez combien de fois chacune apparaît. Vérifiez que m A , 2 = m B , 2 et que les nombres sont identiques.mA , 2, mB , 2 mA , 1, mB , 1 mA , 2= mB , 2
Etc.
la source
Définissez une fonction f (c) qui mappe un caractère c à un nombre premier unique (a = 2, b = 3, c = 5, etc.).
Le simple fait de déclarer que vous pouvez utiliser une fonction de mappage de nombres premiers est un peu vague, et très probablement où un problème surviendrait en gardant l' espace .O (1)
la source
Vous pouvez le faire estO(nlogn)
. Triez les deux chaînes et comparez-les index par index. S'ils diffèrent quelque part, ce ne sont pas des permutations les uns des autres.Pour une
O(n)
solution, le hachage pourrait être utilisé. Cette fonction de hachage fonctionnerait, ete
pour toute lettre serait sa valeur ascii. Si les deux hachages des chaînes diffèrent, ce ne sont pas des permutations l'une de l'autre.La fonction de hachage dans le lien:
L'utilisation du double hachage (ou pour une surpuissance encore plus) en modifiant la valeur de R les identifierait avec succès comme des permutations avec une très forte probabilité.
la source
Disons que vous avez deux chaînes appelées s et t.
Vous pouvez utiliser des heuristiques pour vous assurer qu'elles ne sont pas inégales.
Après cela, vous pouvez facilement exécuter un algorithme pour prouver que la chaîne est égale.
Bien sûr, vous ne pouvez pas trier aussi rapidement si vous n'êtes pas autorisé à utiliser de l'espace supplémentaire. Donc, peu importe l'algorithme que vous choisissez - chaque algorithme devra fonctionner en temps O (n ^ 2) lorsqu'il n'y a que de l'espace O (1) et si l'heuristique n'a pas pu prouver qu'ils ne peuvent pas être égaux.
la source
En code de style C pour toute la routine:
Ou en pseudo code très verbeux (en utilisant une indexation basée sur 1)
où la fonction checkLetters (A, B, i) vérifie que s'il y a M copies de A [i] dans A [1] .. A [i], alors il y a au moins M copies de A [i] dans B:
et la fonction findNextValue recherche dans B une valeur à partir d'un index et retourne l'index où il a été trouvé (ou n + 1 s'il n'est pas trouvé).
la source
Je pense que c'est l'algorithme le plus simple (avecO ( n3 ) temps, n longueur des cordes)
Parcourez
string1
etstring2
, pour chaque personnage, vérifiez la fréquence à laquelle il peut être trouvé dansstring1
etstring2
. Si un personnage est plus souvent dans une chaîne que dans l'autre, ce n'est pas une permutation. Si les fréquences de tous les caractères sont égales, les chaînes sont des permutations les unes des autres.Voici un morceau de python pour rendre cela précis
Le programme a besoin de quelques pointeurs vers des chaînes (O ( logn ) pour compter (
string
,string1
,string2
,char
,char1
,char2
) et les variables de taillecount1
,count2
). Il doit vérifier si les caractères sont égaux ou non, mais il n'a besoin d'aucun ordre sur ces caractères. Peut-être qu'il a besoin de certaines variables pour les petits entiers (par exemple pour contenir des valeurs booléennes ou pour représenter la position destring
in[string1, string2]
.Bien sûr, vous n'avez même pas besoin des variables de comptage, mais vous pouvez utiliser des pointeurs.
Ce deuxième programme a besoin de variables similaires à la première, sauf qu'il n'a pas besoin duO ( log( n ) ) -taille variables pour conserver les valeurs de comptage.
Donc, cela ne dépend pasn ou la taille de l'alphabet.
la source