Tas de Fibonacci
Dans le de l'informatique, un tas de Fibonacci de est une structure de données de tas se composant d'une forêt d'arbres. Il fait amortir un meilleur temps de fonctionnement de qu'un tas binomial . Des tas de Fibonacci ont été développés par Michael L. Fredman et le Robert E. Tarjan en 1984 et le premier a publié à un journal scientifique en 1987. Le nom du tas de Fibonacci vient des nombres de Fibonacci qui sont employés dans l'analyse de temps de fonctionnement.
Les opérations s'insèrent, trouvent le minimum, diminuent la clef, et le travail de fusion (union) dans le temps amorti constant. Les opérations suppriment et suppriment le travail minimum dans le temps amorti du O ( n de notation). Ceci signifie que, à partir d'une structure de données vide, n'importe quel ordre de des opérations d'un des premières opérations de groupe et de b du deuxième groupe prendrait le O ( un   de ; +  ;   du b ; log  ; temps du n ). Dans un tas binomial un tel ordre des opérations prendrait le O (( un   de ; +  ; notation du b ) ( n )) temps. Un tas de Fibonacci est ainsi meilleur qu'un tas binomial quand le b est le asymptotiquement plus petit que le par .
L'utilisation des tas de Fibonacci améliore le temps de fonctionnement asymptotique de l'algorithme de Dijkstra de pour les chemins les plus courts de calcul dans un graphique et de l'algorithme tiré à quatre épingles pour calculer un enjambement de minimum de - l'arbre d'un graphique.
Structure d'un tas de Fibonacci
Un tas de Fibonacci est une collection d'arbres satisfaisant la propriété de Minimum-tas de , c., la clef d'un enfant est toujours supérieur ou égal à la clef du parent. Ceci implique que la clef minimum est toujours à la racine d'un des arbres. Comparé aux tas binomiaux, la structure d'un tas de Fibonacci est plus flexible. Les arbres n'ont pas une forme prescribed et dans le cas extrême le tas peut avoir chaque élément dans un arbre séparé ou un arbre simple du n de profondeur. Cette flexibilité permet à quelques opérations d'être exécutées dans un " ; lazy" ; façon, remettant le travail pour des opérations postérieures. Par exemple le fusionnement des tas est fait simplement en enchaînant les deux listes d'arbres, et la clef de diminution de d'opération parfois coupe un noeud de son parent et forme un nouvel arbre. Cependant à certains diriger un certain ordre doit être présenté au tas pour réaliser le temps de fonctionnement désiré. En particulier, des degrés de noeuds (ici le degré signifie le nombre d'enfants) sont maintenus assez bas : chaque noeud a le O (le n de degré tout au plus de notation) et la taille d'un sous-arbre enraciné dans un noeud du k de degré est au moins   du k de du F ; +  ; 2, où le k de du F est nombre de Fibonacci de Th du k . Ceci est réalisé par la règle que nous pouvons couper tout au plus un enfant de chaque noeud non-root. Quand un deuxième enfant est coupé, le noeud lui-même doit être coupé de son parent et devient une racine d'un nouvel arbre. Le nombre d'arbres est diminué dans le minimum de suppression de d'opération, où des arbres sont liés ensemble. En raison d'une structure relaxed, quelques opérations peuvent prendre un bon moment tandis que d'autres sont faites très rapidement. Dans le analyse amortie du temps de fonctionnement nous feignons que les opérations très rapides prennent un peu plus longtemps qu'elles faisons réellement. Ce temps additionnel est alors plus tardif soustrait du temps de fonctionnement réel des opérations lentes. Le nombre de heures épargné pour l'usage postérieur est mesuré à n'importe quel moment indiqué par une fonction potentielle. Le potentiel d'un tas de Fibonacci est donné près potentiel de = t + 2 m là où le t est le nombre d'arbres dans le tas de Fibonacci, et le m est le nombre de noeuds marqués. Un noeud est marqué si au moins un de ses enfants était coupé puisque ce noeud a été fait à un enfant d'un autre noeud (toutes les racines sont non marquées). Ainsi, la racine de chaque arbre dans un tas a une unité de temps stockée. Cette unité de temps peut être employée plus tard pour lier cet arbre avec un autre arbre au temps amorti 0. En outre, chaque noeud marqué a deux unités de temps stockées. Un peut être employé pour couper le noeud de son parent. Si ceci se produit, le noeud devient une racine et la deuxième unité du temps demeurera entreposée dans elle comme dans n'importe quelle autre racine. Le minimum de trouvaille de d'opération est maintenant insignifiant parce que nous gardons l'indicateur au noeud le contenant. Il ne change pas le potentiel du tas, donc la valeur comptable nette de titres réelle et est constante. Comme mentionné ci-dessus, la fusion est mise en application simplement en enchaînant les listes de racines d'arbre des deux tas. Ceci peut être fait dans le temps constant et le potentiel ne change pas, menant encore au temps amorti constant. Travaux de l'insertion d'opération à côté de créer un nouveau tas avec un élément et de faire la fusion. Ceci prend le temps constant, et les augmentations potentielles par une, parce que le nombre d'arbres augmente. La valeur comptable nette de titres est ainsi toujours constante. Le minimum (mêmes d'extrait de d'opération que minimum de suppression de ) procède par trois étapes. D'abord nous prenons la racine contenant l'élément minimum et l'enlevons. Ses enfants deviendront des racines de nouveaux arbres. Si le nombre d'enfants était le d , il prend le O ( d ) de temps pour traiter toutes les nouvelles racines et le potentiel augmente par le d -1. Par conséquent le temps de fonctionnement amorti de cette phase est le O ( d ) = le O ( n de notation). Toutefois pour accomplir l'opération minimum d'extrait, nous devons mettre à jour l'indicateur à la racine avec la clef minimum. Malheureusement il peut y avoir jusqu'aux racines du n que nous devons vérifier. Dans la deuxième phase où nous diminuons donc le nombre de racines en liant successivement ensemble s'enracine du même degré. Quand le u de deux racines et le v ont le même degré, nous faisons à l'un d'entre eux un enfant de l'autre de sorte que celui avec une plus petite clef reste la racine. Son degré augmentera d'un. Ceci est répété jusqu'à ce que chaque racine ait un degré différent. Pour trouver des arbres du même degré efficacement nous employons un choix de O ( n de longueur de notation) dans lequel nous maintenons un indicateur à une racine de chaque degré. Quand une deuxième racine est trouvée du même degré, les deux sont liés et la rangée est mise à jour. Le temps de fonctionnement réel est le O ( n de notation + m ) où le m est le nombre de racines au début de la deuxième phase. À l'extrémité nous aurons tout au plus des racines du O ( n de notation) (parce que chacun a un degré différent). Par conséquent le potentiel diminue par au moins le m - le O ( n de notation) et le temps de fonctionnement amorti est le O ( n de notation). Dans la troisième phase nous vérifions chacune des racines restantes et trouvons le minimum. Ceci prend du temps du O ( n de notation) et le potentiel ne change pas. Le temps de fonctionnement amorti global du minimum d'extrait est donc le O ( n de notation). La clef de diminution de d'opération prendra le noeud, diminuent la clef et si la propriété de tas devient violée (la nouvelle clef est plus petite que la clef du parent), le noeud est coupé de son parent. Si le parent n'est pas une racine, elle est marquée. Si elle a été déjà marquée, elle est aussi bien coupée et son parent est marqué. Nous continuons vers le haut jusqu'à nous atteignons la racine ou le sommet non marqué. Dans le processus que nous créons un certain nombre, dire le k , nouveaux arbres. Chacun de ces nouveaux arbres à moins que probablement le premier ait été marqué à l'origine mais comme racine il deviendra non marqué. Un noeud peut devenir marqué. Par conséquent le potentiel diminue par au moins le   du k ; &minus ;   ; 2. L'heure réelle d'exécuter le découpage était le O ( k ), donc le temps de fonctionnement amorti est constant. En conclusion, la suppression d'opération peut être mise en application simplement en diminuant la clef de l'élément à supprimer à l'infini moindre, de ce fait le transformant en minimum du tas entier. Alors nous appelons le minimum d'extrait pour l'enlever. Le temps de fonctionnement amorti de cette opération est le O ( n de notation). .
Exécution des opérations
Pour permettre la suppression et la concaténation rapides, les racines de tous les arbres sont liées using une circulaire, doublement la liste chaînée . Les enfants de chaque noeud sont également liés using une telle liste. Pour chaque noeud, nous maintenons son nombre d'enfants et si le noeud est marqué. D'ailleurs nous maintenons un indicateur à la racine contenant la clef minimum. Pire cas
Bien que tout le temps de fonctionnement d'un ordre des opérations commençant avec une structure vide soit lié par les limites indiquées ci-dessus, quelques (très opérations de peu) dans l'ordre peuvent prendre très longtemps pour accomplir (en particulier la clef de diminution, supprimer et minimum de suppression ont le temps de fonctionnement linéaire dans le pire des cas). Pour cette raison les tas de Fibonacci et d'autres structures de données amorties ne peut pas être approprié pour les systèmes en temps réel . Résumé des temps de fonctionnement
Random links: Tuttle, l'Oklahoma | SUFFISANT | Moïse E. Clapp | Ligne directe | Raie Meyer | Montón_de_Fibonacci