Partage de technologie

[Structure des données] Table de séquence

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Insérer la description de l'image ici

table linéaire

nous voulons parlerTableau de séquence, nous devons d'abord parler de tableaux linéaires, car les tableaux séquentiels sont un type de tableaux linéaires.

Définition du tableau linéaire

Comme son nom l'indique, un tableau linéaire est un tableau qui organise les données sous forme de lignes.
Cela peut être compris en pensant à faire la queue dans la réalité.

Caractéristiques des tables linéaires :

  • Il existe un ordre entre les éléments de données d'un tableau linéaire.
  • À l'exception du premier élément et du dernier élément, chaque élément a un prédécesseur et un successeur.

Tableau de séquence

Le tableau de séquence est un paragrapheLes adresses physiques sont consécutivesLes unités de stockage sont comme des gens alignés les uns à côté des autres.
Une structure linéaire qui stocke les éléments de données en séquence, généralement en utilisanttableaustockage.
Terminez l'ajout, la suppression, la vérification et la modification des données sur la baie.
À quoi ressemble la table de séquence

Implémentation de l'interface de table de séquence

Implémentez vous-même une table de séquence (stockage de données de type int), utilisez la table de séquence comme classe, nous implémentons certaines interfaces, c'est-à-dire certainesméthode membreRéaliser l'ajout, la suppression, la vérification et la modification de données.

public class SeqList {
     private int[] elem;
     private int usedSize;
     // 默认构造方法
     SeqList(){   }
     // 将顺序表的底层容量设置为initcapacity
     SeqList(int initcapacity){   }
     // 新增元素,默认在数组最后新增
     public void add(int data) { }
     // 在 pos 位置新增元素
     public void add(int pos, int data) { }
     // 判定是否包含某个元素
     public boolean contains(int toFind) { return true; }
     // 查找某个元素对应的位置
     public int indexOf(int toFind) { return -1; }
     // 获取 pos 位置的元素
     public int get(int pos) { return -1; }
     // 给 pos 位置的元素设为 value
     public void set(int pos, int value) {   }
     //删除第一次出现的关键字key
     public void remove(int toRemove) {   }
     // 获取顺序表长度
     public int size() { return 0; }
     // 清空顺序表
     public void clear() {   }
     
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Constructeur par défaut

Par défaut, nous ouvrons initialement 10 espaces de données.

private static final int DEFAULT_SIZE = 10;
    public SeqList() {
        this.elem= new int[DEFAULT_SIZE];
    }
  • 1
  • 2
  • 3
  • 4

Définissez la capacité sous-jacente de la table de séquence sur initcapacity

Transmettez la longueur du tableau et utilisez la longueur du tableau pour ouvrir de l'espace.

private static final int DEFAULT_SIZE = 10;
    public SeqList(int initcapacity) {
        this.elem= new int[initcapacity];
    }
  • 1
  • 2
  • 3
  • 4

bouchon de queue

Les nouveaux éléments sont ajoutés par défaut à la fin du tableau.
Points à considérer:

  • Vérifiez si la table de séquence actuelle est pleine. Si elle est pleine, ajoutez de l'espace.
  • Un élément est ajouté et usedSize est augmenté de 1.
 public void add(int data) {
        if(isFull()){
            elem = Arrays.copyOf(elem,elem.length * 2);
        }
        elem[usedSize++] = data;
    }
     /**
     * 判断当前的顺序表是不是满的!
     *
     * @return true:满   false代表空
     */
    private boolean isFull() {
        return usedSize == elem.length;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

Ajouter un élément à la position pos

Insérer un élément à l'indice pos.
Précautions:

  • Vérifiez si la table de séquence actuelle est pleine. Si elle est pleine, ajoutez de l'espace.
  • Vérifiez si la position pos donnée est légale. Si elle ne l'est pas, une exception sera levée.
  • Utilisez une boucle arrière-avant pour déplacer les éléments après la position pos vers l'arrière.
  • Un élément est ajouté et usedSize est augmenté de 1.
private boolean checkPosInAdd(int pos) throws PosIllegalException{

        if(pos < 0 || pos > usedSize){
            throw new PosIllegalException("位置不合法");
        }
        return true;
    }

    // 在 pos 位置新增元素
    public void add(int pos, int data) {
        try{
            if(checkPosInAdd(pos)){
                if(isFull()){
                    elem = Arrays.copyOf(elem,elem.length * 2);
                }
                for (int i = usedSize; i > pos ; i--) {
                    elem[i] = elem[i-1];
                }
                elem[pos] = data;
                usedSize++;
            }
        }catch(PosIllegalException e){
            e.printStackTrace();
        }

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

Déterminer si un élément est contenu

Vérifiez si les données fournies sont incluses dans le tableau de séquence.
Parcourez-le simplement directement, renvoyez true si vous le trouvez et renvoyez false si vous ne le trouvez pas.

public boolean contains(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == toFind){
                return true;
            }
        }
        return false;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Trouver la position correspondant à un élément

Regardez l'index des données données dans cette table de séquence.
Parcourez simplement directement et recherchez l'indice de retour sans renvoyer -1.

public int indexOf(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Obtenez l'élément en position pos

Sortez l’élément en position pos.
Précautions:

  • Vérifiez si la pos est légale
public int get(int pos) {
        try{
            if(checkPosInAdd(pos)){
                return elem[pos];
            }
        }catch(PosIllegalException e){
            e.printStackTrace();
        }
        return 0;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Définir l'élément en position pos sur la valeur

Modifiez l'élément de position pos.
Précautions:

  • Vérifiez si la pos est légale.
public void set(int pos, int value) {
        try{
            if(checkPosInAdd(pos)){
                elem[pos] = value;
            }
        }catch(PosIllegalException e){
            e.printStackTrace();
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Supprimer la première occurrence du mot-clé clé

Supprimez la première occurrence de la clé.
Précautions:

  • Parcourez la recherche.
  • Utilisez les éléments après la clé trouvée pour les recouvrir un à un vers l'avant.
  • usedSize diminue de 1.
public void remove(int key) {
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == key){
                for (int j = i; j < usedSize - 1; j++) {
                    elem[j] = elem[j + 1];
                }
                usedSize--;
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Obtenir la longueur de la table de séquence

L'obtention de la longueur de la table de séquence fait ici référence au nombre de données utiles, c'est-à-dire usedSize.

public int size() {
        return usedSize;
    }
  • 1
  • 2
  • 3

Effacer la liste des séquences

Définissez le contenu de la table de séquence sur vide.
Précautions:

  • Étant donné que la vraie table séquentielle stocke les génériques, les éléments sont définis comme vides lorsqu'ils sont parcourus un par un et sont remplacés en les définissant à 0 ci-dessous.
  • UsedSize est également défini sur 0.
public void clear() {
        for (int i = 0; i < usedSize; i++) {
            elem[i] = 0;
        }
        usedSize = 0;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Liste de tableaux en Java

La classe ArrayList est fournie en Java pour représenter une liste séquentielle.

interface implémentée

interface implémentée

Description des interfaces :

  1. L'interface RandomAccess indique la prise en charge de l'accès aléatoire.
  2. L'interface Cloneable indique la prise en charge du clonage.
  3. L'interface Serialisable indique la prise en charge de la sérialisation.

Méthode de construction

Java propose 3 méthodes de construction, comme indiqué dans le tableau :

méthodeIntroduction à l'utilisation de la méthode
Liste des tableaux()Construction sans argument
ArrayList(Collection<? extends E> c)Construire ArrayList en utilisant d'autres collections
ArrayList(int initialCapacity)Spécifier la capacité initiale de la table de séquence

Méthodes courantes

Les méthodes courantes fournies sont similaires à celles que nous avons implémentées ci-dessus.
Méthodes courantes

Avantages et inconvénients des listes de séquences

avantage

Les avantages des tableaux de séquences sont les suivants :

  1. L'accès aléatoire est pris en charge.
  2. L'interrogation d'un indice donné est rapide.

défaut

  1. S'il n'y a pas assez d'espace, il doit être étendu et il y aura un gaspillage de mémoire.
  2. L'insertion et la suppression dans l'en-tête et au milieu déplaceront les données.

pratique

Les liens vers les exercices sont ci-dessous :
Triangle Yang Hui