Le concept et la pratique des tableaux et des files d'attente clairsemés

1. Introduction

La structure des données comprend: une structure linéaire et une structure non linéaire.

1.1 Structure linéaire

  • La structure linéaire est la structure de données la plus courante, caractérisée par la correspondance biunivoque entre les éléments de données et les indices;
  • Il existe deux structures de stockage différentes pour les structures linéaires, à savoir les structures de stockage séquentielles (tableaux) et les structures de stockage chaînées (listes chaînées) . Table linéaire stockées dans l'ordre désigné comme table de séquence, la table de données mémorisée dans la séquence sont contiguës dans l'espace de stockage ; table de chaîne linéaire mémorisée dans la liste est appelée, la liste de données dans l'espace de stockage ne sont pas nécessairement contigus , l' élément Les nœuds stockent les informations d'adresse des éléments de données et des éléments adjacents.
  • Les structures linéaires courantes sont: les tableaux, les files d'attente, les listes liées et les piles.

1.2 Structure non linéaire

  • Les structures non linéaires comprennent: les tableaux bidimensionnels, les tableaux multidimensionnels, les tableaux généralisés, les structures graphiques et les structures arborescentes.

Deuxièmement, le concept et la pratique des tableaux clairsemés

Lorsqu'il y a beaucoup de données sans signification dans un tableau à deux dimensions, vous pouvez choisir un tableau épars pour enregistrer le tableau.

2.1 Besoins réels

Dans la réalisation du programme de backgammon, il y a des fonctions de sauvegarde et de sortie et de continuer à jouer.

Étant donné que la valeur par défaut de ce tableau bidimensionnel est 0, un grand nombre de données sans signification sont enregistrées, vous pouvez donc utiliser un tableau fragmenté pour enregistrer le tableau.

2.2 Introduction de base

2.2.1 La méthode de traitement des tableaux clairsemés est
  • Enregistrez le nombre de lignes et de colonnes dans le tableau et le nombre de valeurs différentes;
  • Enregistrez les lignes et les valeurs des éléments avec des valeurs différentes dans un tableau à petite échelle, afin de réduire la taille du tableau à deux dimensions.
2.2.2 Exemples d'application

Description du tableau converti:

  • [0] Colonne: indique que le tableau bidimensionnel d'origine a 6 lignes et 7 colonnes, dont 8 valeurs de données ne sont pas les valeurs par défaut.
  • [1] Colonne: la valeur de données indiquant la position de la ligne 0 et de la colonne 3 du tableau bidimensionnel d'origine est 22. La représentation des données ultérieure est similaire à celle-ci.
2.2.3 Implémentation du code
2.2.3.1 Analyse de la pensée

  • L'idée de convertir un tableau bidimensionnel en tableau clairsemé
  1. Parcourez le tableau bidimensionnel d'origine pour obtenir le nombre de données valides
  2. Selon sum, vous pouvez créer un tableau sparse sparseArr int [sum + 1] [3]
  3. Stockez les données effectives de la matrice bidimensionnelle dans une matrice clairsemée
  • L'idée de convertir un tableau clairsemé en tableau bidimensionnel d'origine
  1. Lisez d'abord la première ligne du tableau clairsemé et créez un tableau bidimensionnel d'origine basé sur les données de la première ligne, comme chessArr2 = int ci-dessus [11] [11]
  2. Lisez les données des dernières lignes du tableau clairsemé et affectez-le au tableau bidimensionnel d'origine.
2.2.3.2 code

Implémentation du code: https://github.com/goSilver/daydayup/blob/master/datastructure/src/hanshunping/chapter03/SparseArray.java

3. Le concept et la pratique de la file d'attente

3.1 Introduction à la file d'attente

  • La file d'attente est une liste ordonnée, qui peut être implémentée sous forme de tableau ou de liste liée;
  • Suivez le principe du premier entré, premier sorti;

3.2 Idée de file d'attente de simulation de tableau

La file d'attente est ordonnée. Lorsque vous utilisez le mécanisme de tableau pour simuler la file d'attente, l'instruction suivante doit être effectuée sur le tableau:

  • maxSize est la capacité maximale de la file d'attente;

  • Étant donné que l'entrée et la sortie de la file d'attente sont traitées respectivement à l'avant et à l'arrière, deux variables avant et arrière sont nécessaires pour enregistrer les indices avant et arrière de la file d'attente. Avant représente la tête de la file d'attente, qui change avec la sortie de données; arrière représente la fin de la file d'attente, qui change avec l'entrée de données. Comme indiqué ci-dessous:

  • Lorsque nous stockons des données dans la file d'attente, il faut deux étapes: d'abord déterminer si la file d'attente est pleine, si l'arrière du pointeur est inférieur à la capacité maximale de la file d'attente, maxSize-1, vous pouvez la stocker, sinon vous ne pouvez pas stocker de données; la deuxième étape consiste à suivre le pointeur Reculer d'un bit (arrière ++).

  • Lorsque vous récupérez des données, vous devez déterminer si la file d'attente est vide. Si avant == arrière, cela signifie que la file d'attente est vide.

3.2.1 code

Implémentation du code: https://github.com/goSilver/daydayup/blob/master/datastructure/src/hanshunping/chapter03/arrayqueue/ArrayQueueDemo.java

3.3 Utilisation de tableaux pour simuler l'optimisation de la file d'attente en anneau

Pour l'implémentation en 3.2, il y a un problème que le tableau ne peut être utilisé qu'une seule fois et ne peut pas être réutilisé. Ici, un algorithme simple peut être utilisé pour l'améliorer en un tableau circulaire. (Modulation)
Description de l'idée:

  • Ajustez la signification de la variable front: front pointe directement vers le premier élément de la file d'attente, et la valeur initiale de front devient 0;
  • Ajustez la signification de la variable arrière: arrière pointe vers la dernière position du dernier élément de la file d'attente, car un espace doit être libéré par convention, la valeur initiale de arrière est 0;
  • Lorsque la file d'attente est pleine, la condition est (arrière + 1)% maxSize = avant [plein];
  • Lorsque la file d'attente est vide, arrière == avant [vide];
  • Nombre de données valides dans la file d'attente: (arrière + maxSize-avant)% maxSize
3.3.1 code

Implémentation du code: https://github.com/goSilver/daydayup/blob/master/datastructure/src/hanshunping/chapter03/arrayqueue/CircleArrayQueueDemo.java

Je suppose que tu aimes

Origine www.cnblogs.com/csh24/p/12725551.html
conseillé
Classement