Je travaille sur le problème ci-dessous et j'ai posté mon code. Ma question est la suivante : mon implémentation actuelle utilise un tri en Python - sorted(sorted_freq, reverse=True)
. Je me suis référé à une autre mise en œuvre qui utilise un tas maximum ( http://www.geeksforgeeks.org/rearrange-a-string-so-that-all-same-characters-become-at-least-d-distance-away/ ). Je pense qu'ils ont la même complexité temporelle qui est O(n*log n)
(si je calcule mal, n'hésitez pas à corriger). Je me demande donc s'il y a un avantage en termes de performance à utiliser le tas autre que le tri ?
Mon code est écrit en Python 2.7.
Problème :
Étant donné une chaîne de caractères et un nombre entier positif d . Certains caractères peuvent être répétés dans la chaîne donnée. Réorganisez les caractères de la chaîne donnée de sorte que les mêmes caractères deviennent d distance les uns des autres. Notez qu'il peut y avoir plusieurs réarrangements possibles, la sortie devrait être l'un des réarrangements possibles. Si aucun arrangement n'est possible, cela doit également être signalé. La complexité temporelle attendue est O(n) où n est la longueur de la chaîne d'entrée.
Exemples :
Input: "abb", d = 2
Output: "bab"
Input: "aacbbc", d = 3
Output: "abcabc"
Input: "geeksforgeeks", d = 3
Output: egkegkesfesor
Input: "aaa", d = 2
Output: Cannot be rearranged
Code source :
from collections import defaultdict
def rearrange(source, distance):
freq = defaultdict(int)
for c in source:
freq[c] += 1
sorted_freq = []
for k,v in freq.items():
sorted_freq.append((v,k))
sorted_freq = sorted(sorted_freq, reverse=True)
result = [0] * len(source)
for i, (v,k) in enumerate(sorted_freq):
index = i
while index < len(result) and result[index] != 0:
index += 1
if index == len(result):
return None
count = v
while count > 0:
result[index] = k
index += distance
count -= 1
if index >= len(source) and count > 0:
return None
return result
if __name__ == "__main__":
print rearrange('abb', 2)
print rearrange('aacbbc', 3)
print rearrange('geeksforgeeks', 3)
print rearrange('aaa', 2)