IntroConception de petits objets comparables
Considérez-vous une liste de paires clé/valeur:
(0,a) (1,b) (2,c)
Vous avez une fonction, qui insère une nouvelle valeur entre deux paires de courant, et vous avez besoin pour lui donner une clé qui maintient l'ordre:
(0,a) (0.5,z) (1,b) (2,c)
Voici la nouvelle clé a été choisie comme la moyenne entre la moyenne des clés des paires de délimitation.
Le problème est que votre liste peut contenir plusieurs millions d'insertions. Si ces inserts sont tous placés près les uns des autres, vous pouvez vous retrouver avec des clés telles que 2^(-1000000)
, qui ne sont pas facilement stockables dans une classe de numéros standard ou spéciale.
Le problème
Comment pouvez-vous concevoir un système de génération de clés qui:
- donne quand par rapport à tout le reste des clés du résultat correct (plus/plus petit que).
- Récupère uniquement la mémoire
O(logn)
(où n correspond au nombre d'éléments de la liste).
Mes essais
- D'abord j'ai essayé différentes classes de nombre. Comme les fractions et même le polynome, mais je pourrais toujours trouver des exemples où la taille de la clé deviendrait linéaire avec le nombre d'insertions.
- Ensuite, j'ai pensé à enregistrer des pointeurs sur un certain nombre d'autres clés, et d'enregistrer la relation inférieure/supérieure, mais cela nécessiterait toujours au moins
O(sqrt)
mémoire et le temps pour la comparaison.
Extra info: Idéalement, l'algorithme ne doit pas se casser lorsque les paires sont supprimés de la liste.
Peut-être devriez-vous utiliser un arbre à la place? –
Que pensez-vous de prendre la mémoire O (log n) - chaque valeur de clé ou l'ensemble des valeurs de clé? –
@snowlord En fait, les paires clé/valeur sont stockées dans un arbre. Mais pour la tâche Im résolution, je dois être en mesure d'insérer à des endroits spécifiques dans l'arbre. @HPM Chaque touche –