La première partie de votre algorithme consiste à compter les caractères. Il s'agit simplement de générer des clés à trier. Si vous savez que vous n'utilisez que des caractères alphabétiques [A-Za-z] *, vous pouvez optimiser votre algorithme en réduisant le nombre de compartiments utilisés, mais ce n'est qu'un petit ajustement.
La deuxième partie est juste une sorte stable - il y a beaucoup de façons de le faire - le wikipedia page on sorting donne un bon résumé.Si vous êtes seulement intéressé par le personnage qui se produit le moins, alors la méthode ("Phase 2") que vous décrivez est probablement aussi efficace que possible. La seule autre façon que je peux penser d'améliorer ceci est si vous pouvez diviser vos lettres dans un nombre fixe de compartiments (disons, 16) uniformément dans la gamme de caractères, puis récursif sur chaque compartiment. Tous les compartiments sans caractères peuvent être jetés, ce qui économise du temps dans la phase de numérisation/tri. De même, si un seau a un caractère, alors c'est fait. Vous voulez également vous assurer que vous ne divisez un seau en 16 autres que lorsque vous savez qu'il y a plus d'un caractère différent.
En utilisant le test de mot comme un exemple (en supposant 4 seaux et caractères seulement des minuscules:
- génèrent 4 seaux (AG, HM, NT, UZ)
- diviser le mot test:
- récursion aux autres seaux - (AG a un caractère - ce doit être le moins que nous puissions arrêter
- Si cela n'a pas été le cas (En ce qui concerne le mot « testicules »), nous pouvons voir HM et UZ sont vides, donc nous aurions seulement besoin de vérifier NT (qui contiendrait tsts).
- Nous créons 4 godets (N-O, P-Q, R-S et T).
- Scinder les lettres
- etc.
L'avantage de cette méthode est que nous n'avons pas eu de scanner chaque lettre. Si la gamme de caractères est de la même taille, alors ces deux méthodes sont au mieux O (n) où n est la longueur de la chaîne (ceci est inévitable puisque nous devons toujours regarder chaque caractère), bien que construisant les listes de caractères dans mon exemple peut rendre l'algorithme aussi mauvais que O (n^2). Cependant, à mesure que la gamme de caractères augmente, en particulier pour les chaînes courtes, l'utilisation de sous-ensembles augmentera considérablement les performances. Pour une chaîne unicode, vous pouvez utiliser une approche hybride - par exemple, séparer tous les caractères non-ascii dans la première phase, et utiliser votre méthode plus simple pour la partie ascii.
Essayez-vous de trouver combien de fois chaque caractère se trouve dans une chaîne? Ou obtenir une liste complète des caractères (a-zA-Z) et combien de fois chacun d'entre eux se produit dans une chaîne? Ou autre chose? –
compte les occurrences totales de chaque caractère dans certains textes. donc "texte" serait t = 2, e = 1, x = 1. –
ted, vous devriez éditer cette clarification essentielle dans votre question en cliquant sur "modifier" ci-dessus –