当前位置:网站首页>Écrivez une liste de sauts
Écrivez une liste de sauts
2022-07-07 20:24:00 【Kyhoon】
class Skiplist {
// 1.Définir les noeuds dans la table Hop
class Node{
// Valeur
int val;
// Noeud droit et noeud inférieur du noeud
Node right, down;
public Node(int val, Node right, Node down){
this.val = val;
this.right = right;
this.down = down;
}
public Node(int val){
this(val, null, null);
}
}
//2. Définir les attributs liés à la table Hop
// Définir les valeurs par défaut du noeud d'en - tête
final int DEFAULT_VALUE = -1;
// Définir le noeud d'en - tête par défaut
final Node HEAD = new Node(DEFAULT_VALUE);
// Niveau correspondant à la table de saut
int levels;
// Nombre de noeuds dans la liste de liens originale dans la table de saut
int length;
Node head;
// 3.Initialisation,Le niveau par défaut est1,La longueur est1,, Noeud d'en - tête par défaut
public Skiplist() {
this.levels = 1;
this.length = 1;
this.head = HEAD;
}
// 4. Définir le noeud précédent qui obtient le noeud correspondant à la valeur de la cible de recherche à partir d'un noeud ( Parce qu'il n'y a pas d'attribut entre les noeuds qui se réfère au noeud avant , Et le noeud dans la table de saut d'opération
// Il est nécessaire de commencer par le noeud précédent du noeud cible , Donc nous prenons le noeud avant du noeud cible )
private Node get(int num, Node from){
// 1. À partir de quel noeud commencer la recherche
Node node = from;
// 2. La logique de la boucle est d'abord de gauche à droite , Et ensuite chercher de haut en bas
while(node!=null){
// 2.1 Si le noeud droit du noeud courant n'est pas vide et que la valeur du noeud droit est inférieure à la valeur cible , Continuez à chercher à droite.
while(node.right!=null && node.right.val<num){
node = node.right;
}
// 2.2 Sortir de la boucle lorsque le noeud droit n'est pas vide , Alors seulement si la valeur du noeud droit est supérieure ou égale à la valeur cible
// Si égal à, Alors on a trouvé , Renvoie directement le noeud avant du noeud cible
Node right = node.right;
if(right!=null && right.val == num){
return node;
}
// 2.3 Si ce n'est pas l'égalité , Alors continuez à chercher vers le bas
node = node.down;
}
return null;
}
// 5.Demande s'il existe
public boolean search(int target) {
// Appelez directement la méthode de requête ci - dessus , Commencez par l'en - tête ,Si le retour n'est pas vide,Représentant trouvé
Node node = get(target, head);
return node != null;
}
// 6.Insérer un noeud, L'idée générale est de trouver l'emplacement du noeud d'insertion dans la liste de liens d'origine et de l'insérer ,
// Ensuite, en lançant des pièces, vous décidez si vous voulez construire un noeud d'index
public void add(int num) {
// 6.1 Définissez le noeud avant que le tableau temporaire soit utilisé pour stocker le noeud inséré à l'endroit où chaque couche doit être insérée
Node[] nodes = new Node[this.levels];
// 6.2 Définir la variable d'indice du tableau temporaire
int i = 0;
// 6.3 Définir le noeud de démarrage de la recherche
Node node = head;
// 6.4 Etget La méthode fonctionne de la même façon
while(node!=null){
// 6.4.1 D'abord de gauche à droite
while(node.right!=null &&node.right.val < num){
node = node.right;
}
// 6.4.2 Sortir de la boucle, Quoi qu'il en soit,( Que le noeud droit soit vide , Ou la valeur du noeud droit est déjà supérieure ou égale à la valeur cible ),
// Ce noeud de la couche courante est le noeud avant d'insérer le noeud , Alors, on enregistre
nodes[i++] = node;
//6.4.3 Continuer à chercher vers le bas
node = node.down;
}
// 6.5 Cycle terminé, Le dernier noeud du tableau temporaire est le noeud avant du noeud cible dans la liste originale
Node pre = nodes[--i];
// 6.6 Noeud qui définit la valeur cible
Node newNode =new Node(num, pre.right, null);
// 6.7 Insérer
pre.right = newNode;
// 6.8 Longueur plus un
this.length++;
// 6.9 Lancer une pièce détermine si un noeud d'index doit être construit
coinsFlip(nodes, newNode, i);
}
// La logique générale pour lancer une pièce pour décider s'il faut construire un noeud d'index est :Adoption 0,1 La question de savoir si le nombre aléatoire et la série de niveaux sont inférieurs à la valeur de référence détermine si l'indice doit être établi
// Si vous construisez , Il faut d'abord voir si le niveau actuel à indexer est dans le niveau original ,
// Si oui,Insérer, Et continuer à lancer des pièces pour décider si la couche supérieure doit être construite
// Sinon, Nouveau noeud d'en - tête , Accédez au nouveau noeud d'index pour créer un nouveau niveau
private void coinsFlip(Node[] nodes, Node newNode, int i) {
// 1.Définition0,1Génération de nombres aléatoires pour
Random random = new Random();
int coins = random.nextInt(2);
// 2. Définir le noeud inférieur du noeud index
Node downNode = newNode;
// 3. Lancer des pièces pour déterminer si l'index est construit ou non
while(coins == 1 && this.levels<(this.length>>6)) {
// 3.1 Quand la pièce est lancée 1 Et lorsque la série actuelle de couches est inférieure à la valeur de référence , Créer un noeud d'index
if (i > 0) {
//3.2 Si vous avez actuellement besoin d'insérer un noeud d'index dans le niveau actuel ,Je l'ai.
// Insérer le noeud avant du noeud index
Node pre = nodes[--i];
// Définir un nouveau noeud d'index
Node newIndex = new Node(newNode.val, pre.right, downNode);
// Définir le noeud droit du noeud avant comme nouveau noeud index
pre.right = newIndex;
// Définissez le nouveau noeud d'index au noeud inférieur du nouveau noeud d'index à construire au niveau supérieur suivant
downNode = newIndex;
// Continue à jouer des pièces
coins = random.nextInt(2);
} else {
// Si vous avez dépassé le niveau actuel , Nouveau noeud d'index
Node newIndex = new Node(newNode.val, null, downNode);
// Créer un nouveau noeud d'en - tête et définir le noeud droit comme nouveau noeud d'index
Node newHead = new Node(DEFAULT_VALUE, newIndex, head);
// Pointez le noeud d'en - tête de la table Hop vers le nouveau noeud d'en - tête
this.head = newHead;
// Nombre de niveaux plus un
this.levels++;
}
}
}
// 7.Supprimer le noeud, L'idée générale est de trouver le noeud cible de chaque couche pour supprimer le noeud avant , Et supprimer
public boolean erase(int num) {
// 7.1 Définir les variables de résultat,Par défautfalse Aucun noeud à supprimer n'a été trouvé
boolean result = false;
// 7.2 Trouver le noeud avant du noeud cible inférieur à partir du noeud de départ
Node node = get(num, head);
// 7.3 S'il y a,Supprimer, Et supprimer le noeud de la couche suivante
while(node != null){
// 7.3.1 Obtenir supprimer le noeud
Node right = node.right;
// 7.3.2 Pointez le noeud droit du noeud avant de supprimer le noeud vers le noeud droit du noeud à supprimer
node.right = right.right;
// 7.3.3 Pointez le noeud droit du noeud supprimé vers NULL ,Déclencheurgc
right.right = null;
// 7.3.4 Assigner la valeur résultante à true
result = true;
// 7.3.5 Continuer à rechercher le noeud avant du noeud cible à supprimer au niveau suivant
node = get(num, node.down);
}
// 7.4 Si la suppression réussit , La longueur est réduite d'un
if(result){
this.length--;
}
return result;
}
}
边栏推荐
- 恢复持久卷上的备份数据
- You want to kill a port process, but you can't find it in the service list. You can find this process and kill it through the command line to reduce restarting the computer and find the root cause of
- 如何满足医疗设备对安全性和保密性的双重需求?
- Implement secondary index with Gaussian redis
- guava多线程,futurecallback线程调用不平均
- OneSpin | 解决IC设计中的硬件木马和安全信任问题
- 静态测试工具
- Machine learning notes - explore object detection datasets using streamlit
- Creation of kubernetes mysql8
- 【解决】package ‘xxxx‘ is not in GOROOT
猜你喜欢
Tensorflow2.x下如何运行1.x的代码
Yolov6:yolov6+win10--- train your own dataset
CodeSonar通过创新型静态分析增强软件可靠性
Airiot helps the urban pipe gallery project, and smart IOT guards the lifeline of the city
Chapter 9 Yunji datacanvas company won the highest honor of the "fifth digital finance innovation competition"!
Mongodb由浅入深学习
How to test CIS chip?
PHP method of obtaining image information
上海交大最新《标签高效深度分割》研究进展综述,全面阐述无监督、粗监督、不完全监督和噪声监督的深度分割方法
软件缺陷静态分析 CodeSonar 5.2 新版发布
随机推荐
使用camunda做工作流设计,驳回操作
Micro service remote debug, nocalhost + rainbow micro service development second bullet
You want to kill a port process, but you can't find it in the service list. You can find this process and kill it through the command line to reduce restarting the computer and find the root cause of
Oracle 存儲過程之遍曆
一键部署Redis任意版本
网络原理(1)——基础原理概述
CodeSonar如何帮助无人机查找软件缺陷?
写了个 Markdown 命令行小工具,希望能提高园友们发文的效率!
Force buckle 1037 Effective boomerang
Force buckle 599 Minimum index sum of two lists
Force buckle 1790 Can two strings be equal by performing string exchange only once
Prometheus remote_write InfluxDB,unable to parse authentication credentials,authorization failed
EasyGBS级联时,上级平台重启导致推流失败、画面卡住该如何解决?
Force buckle 674 Longest continuous increasing sequence
【论文阅读】MAPS: Multi-agent Reinforcement Learning-based Portfolio Management System
[award publicity] issue 22 publicity of the award list in June 2022: Community star selection | Newcomer Award | blog synchronization | recommendation Award
Implement secondary index with Gaussian redis
c语言如何判定是32位系统还是64位系统
Deep learning model compression and acceleration technology (VII): mixed mode
Chapter 9 Yunji datacanvas company won the highest honor of the "fifth digital finance innovation competition"!