analyse de code source Java Collections Framework (5.1 - Carte, TreeMap, arbre rouge-noir)

analyse de code source Java Collections Framework (5.1 - Carte, TreeMap, arbre rouge-noir)

Mapconnaissances liées Design Java Collections Framework dans plus de structures de données, que ce soit au travail ou à des entrevues seront souvent impliqués. En apprenant Maple code source, nous avons pu une connaissance approfondie et la compréhension des structures de données, une grande partie des compétences de codage. Dans les prochains articles introduiront une certaine connaissance des structures de données, j'espère que vous ne vous ennuierez pas, parce que cette partie de la capacité est utilisée comme compétences de base programmeur. À la connaissance même temps de cette partie est en fait pas si profonde, je vais essayer de vous aider avec la manière la plus simple à comprendre.

carte Interface

MapCaractéristiques de la structure de données est claire, il nous permet d'utiliser de stockage de clés et de lire des éléments, et ne permet pas de clé en double. Différentes Mapmises en œuvre pour la clé de traitement séquentiel est incompatible. Par exemple, HashMapnous ne pouvons pas garantir l'ordre de la clé et TreeMapla clé est mis en œuvre conformément à Comparatorla méthode d'interface pour déterminer l'ordre.

MapSur chacun définit également des données de valeur clé correspondante doit implémenter Entryl'interface, la méthode définie ci - dessus est également très simple, essentiellement l'opération pour la clé et la valeur.

MapLa méthode définie sur l'interface, nous devrions tous être plus familier avec, je ne suis pas ici de longue haleine. En particulier, je mentionnerai plusieurs méthodes JDK8 ajouté, plus pratiques dans leur travail quotidien. Si vous ne rencontrez pas JDK8 avant, vous pouvez trouver.

* `getOrDefalut(Object key, V defaultValue)`:当 `Map` 中有 key 对应的 value 时返回 `Map` 中的 value, 否则返回 `defaultValue` 。
* `V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction)`:将 `Map` 中的 key 和对应的 value 作为参数,调用 `remappingFunction` 方法获得 newValue,如果 newValue 不为 null,则替换原来的 value。
* `V putIfAbsent(K key, V value)`:如果当前 `Map` 中没有 key 对应的 value,则执行 put 操作。
* `V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)`:如果当前没有 key 对应的 value,则将参数 value 放入 `Map` 中,否则将原来 key 对应的 value 和新的 value 作为参数调用 `remappingFunction` ,将结果 put 入 `Map` 中。
复制代码

La mise en œuvre de ces méthodes dans Mapl'interface, JDK8 nouvelle utilisation de defaultmots - clés afin de maintenir la compatibilité ascendante, le code spécifique est très simple, il n'y a pas de longue haleine.

TreeMap

En comparaison HashMap, la TreeMapconnaissance impliquée dans certains moins appropriés comme familier avec la Mapstructure de données de la pierre à pas. Le regard de déposons sur un diagramme de classes:

On peut voir TreeMapinherits AbstractMapet met en œuvre l' NavigableMapinterface. AbstractMapLa méthode fournit une partie du modèle pour les développeurs de mettre en œuvre leur propre Mapet NavigableMapfournir les analogues mentionné précédemment NavigableSetà ces méthodes, vous pouvez retourner une gamme de clé ou une valeur. Donc , nous nous dirigeons tout droit à TreeMapdes détails de mise en œuvre de spécifiques.

Connue depuis le début d'un commentaire, TreeMapest atteint par la structure de données d'arbre rouge-noir, il est possible d'assurer containsKey, get, put, removela complexité du temps est log(n). Et même, TreeMapn'est pas thread-safe. Alors , vraiment comprendre TreeMapla clé est de comprendre et de saisir la structure de données d'arbre rouge-noir. Ainsi , la partie suivante, je vais passer un peu de longueur pour vous aider à la brosse sur les propriétés des arbres rouge-noir, ne pense pas que ce soit une tâche très difficile, je vous garantis que , après avoir lu la série d'articles sera en mesure d'arbre rouge-noir avec écriture Java.

arbre binaire équilibré

Une phrase arbre rouge-noir est un arbre binaire équilibré . Le concept d'un arbre binaire nous devrions tous savoir que chaque parent n'a pas plus de deux nœuds enfants de l'arbre. Le solde signifie que la hauteur des sous - arbres gauche et droite ne diffèrent pas de plus d'un. En même temps , la valeur de tous les sous - arbre gauche de nœuds plus petits que le courant et la valeur du nœud enfant de l'arbre à droite que le grand courant. look Let quelques exemples.

Peut voir la figure 1 est un arbre binaire équilibré, conformément aux conditions dont nous avons parlé avant, mais non conforme à la figure 2, parce que les sous-arbres gauche et à droite diffèrent de plus que la hauteur d'un.

arbre binaire équilibré

arbre binaire non équilibré

Le but est de ne pas maintenir un dégénérés d'arbres binaires équilibrés dans une liste chaînée, de sorte que vous pouvez effectuer une recherche binaire pour trouver le temps de garder la complexité log(n). Mais cela signifie aussi une augmentation ou les noeuds supprimés lorsque la nécessité de faire une opération spéciale pour maintenir l'équilibre de l'ensemble arbre binaire, ce qui est une structure de données arbre rouge-noir.

arbre rouge-noir

Comme mentionné précédemment, l'arbre rouge-noir est un arbre binaire équilibré lui-même, il a toutes les caractéristiques d'un arbre binaire équilibré. Sur cette base, il a des contraintes avec leurs caractéristiques propres.

Chaque nœud supplémentaire arbre rouge-noir ajoute une couleur caractéristique, à savoir rouge, ou noir, une seule de ces deux dans, qui est aussi l'origine de son nom dans l' arbre rouge-noir. Nous regardons la TreeMapsource du nœud de l' arbre rouge-noir:

static final class Entry<K,V> implements Map.Entry<K,V> {
    K key;
    V value;
    Entry<K,V> left;
    Entry<K,V> right;
    Entry<K,V> parent;
    boolean color = BLACK;
}
复制代码

TreeMapChaque nœud met en œuvre Maples interfaces d' entrée, en plus des nœuds enfants gauche et à droite sous le nœud représentant la clé actuelle, la valeur deux éléments de données, ainsi que le code lui - même nœuds leftet right, ainsi que leur nœud parent parent. Le dernier est de représenter la couleur du nœud courant color, où les mêmes définitions figurant dans TreeMaple code source:

private static final boolean RED   = false;
private static final boolean BLACK = true;
复制代码

Ensuite, nous examinons les caractéristiques de l'arbre rouge-noir:

* 根节点(root node) 的颜色始终为黑色
* 两个相邻的节点(即连接在一起的节点)不能同为红色
* 从根节点出发,到某个子节点的每条路径上的黑色节点数量都相同
复制代码

Que diriez-vous? Assez simple! Alors regardons un exemple.

D'après le tableau de vue ci-dessus avant de rencontrer les trois caractéristiques énumérées, assurez-vous de vérifier la bonne compréhension du concept d'arbre rouge-noir.

Le fonctionnement de base des trois arbres rouge-noir

Grâce à la description ci-dessus, vous devriez avoir maîtrisé le concept d'arbre rouge-noir, vous savez ce qui est un arbre rouge-noir. Avant l'introduction de l'insert d'arbre rouge-noir et les opérations de suppression, nous avons appris trois opérations de base qui changent de couleur (flip couleur), rotation gauche (rotation gauche) et rotation droite (rotation à droite).

changement de couleur

Très simple, la couleur actuelle du noeud rouge, la couleur des nœuds enfants gauche et à droite sont changées en noir. Dans la figure.

Rotation à gauche et à droite

Il peut y avoir quelques mots pour décrire l'abstrait, nous regardons l'image par exemple, l'image de wikipedia.

S'il vous plaît Duokanjibian cette image, assurez-vous de comprendre la rotation gauche dans le sens horaire et sens anti-horaire, parce que ces trois opérations de base est la base de l'insert après arbre rouge-noir et les opérations de suppression.

épilogue

Le principal introduit Mapet TreeMapquelques fonctions de base et TreeMaples concepts de base qui sous - tendent l' arbre rouge-noir. arbre rouge-noir est une structure de données de niveau plus importants pour les développeurs devraient connaître, ce qui introduit la base de concepts de base et des opérations. Et insérer l'algorithme spécifique Ensuite , nous allons être impliqués dans les opérations de suppression d' arbres rouge-noir, avant d' entrer dans cette partie, je souligne encore une fois de vous familiariser avec le contenu de cet article, car il est la base de cette fondation.

Dans le prochain article , je vais contrôler TreeMaple code source algorithme arbre rouge-noir introduction, j'espère que vous ne manquez pas!

Je me félicite de l'attention sur le micro-signal « et le lys du peuple » pour des articles de qualité plus élevés

Je suppose que tu aimes

Origine juejin.im/post/5e6ae265518825491949814f
conseillé
Classement