Technologieaustausch

[Datenstruktur] Sequenztabelle

2024-07-12

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


Fügen Sie hier eine Bildbeschreibung ein

linearer Tisch

wir wollen redenSequenztabelle, müssen wir zuerst über lineare Tabellen sprechen, da sequentielle Tabellen eine Art lineare Tabellen sind.

Definition einer linearen Tabelle

Wie der Name schon sagt, handelt es sich bei einer linearen Tabelle um eine Tabelle, die Daten wie Zeilen organisiert.
Man kann es verstehen, wenn man an das Anstehen in der Realität denkt.

Eigenschaften linearer Tische:

  • Zwischen den Datenelementen einer linearen Tabelle besteht eine Reihenfolge.
  • Bis auf das erste und das letzte Element hat jedes Element einen Vorgänger und einen Nachfolger.

Sequenztabelle

Die Sequenztabelle verwendet einen AbsatzPhysische Adressen sind fortlaufendDie Lagereinheiten sind wie Menschen, die nebeneinander aufstehen.
Eine lineare Struktur, die Datenelemente nacheinander speichert, normalerweise unter Verwendung vonArrayLagerung.
Schließen Sie das Hinzufügen, Löschen, Überprüfen und Ändern von Daten im Array ab.
Wie die Sequenztabelle aussieht

Implementierung einer Sequenztabellenschnittstelle

Implementieren Sie selbst eine Sequenztabelle (Daten vom Typ „storage int“), verwenden Sie die Sequenztabelle als Klasse, wir implementieren einige Schnittstellen, also einigeMember-MethodeUm das Hinzufügen, Löschen, Überprüfen und Ändern von Daten zu realisieren.

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

Standardkonstruktor

Standardmäßig öffnen wir zunächst 10 Datenbereiche.

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

Legen Sie die zugrunde liegende Kapazität der Sequenztabelle auf initcapacity fest

Übergeben Sie die Array-Länge und verwenden Sie die Array-Länge, um Platz zu schaffen.

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

Schwanzstecker

Neue Elemente werden standardmäßig am Ende des Arrays hinzugefügt.
Punkte, die man beachten sollte:

  • Überprüfen Sie, ob die aktuelle Sequenztabelle voll ist. Wenn sie voll ist, fügen Sie Platz hinzu.
  • Ein Element wird hinzugefügt und usedSize wird um 1 erhöht.
 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

Element an Pos-Position hinzufügen

Element am pos-Index einfügen.
Vorsichtsmaßnahmen:

  • Überprüfen Sie, ob die aktuelle Sequenztabelle voll ist. Wenn sie voll ist, fügen Sie Platz hinzu.
  • Ist die angegebene Position zulässig? Wenn nicht, wird eine Ausnahme ausgelöst.
  • Verwenden Sie eine Rückwärts-Vorwärts-Schleife, um die Elemente nach der Pos-Position nach hinten zu verschieben.
  • Ein Element wird hinzugefügt und usedSize wird um 1 erhöht.
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

Bestimmen Sie, ob ein Element enthalten ist

Überprüfen Sie, ob die angegebenen Daten in der Sequenztabelle enthalten sind.
Gehen Sie es einfach direkt durch, geben Sie „true“ zurück, wenn Sie es finden, und geben Sie „false“ zurück, wenn Sie es nicht finden.

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

Finden Sie die Position, die einem Element entspricht

Sehen Sie sich den Index der angegebenen Daten in dieser Sequenztabelle an.
Führen Sie einfach eine direkte Schleife durch und finden Sie den Rückgabeindex, ohne -1 zurückzugeben.

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

Holen Sie sich das Element an der Pos-Position

Geben Sie das Element an der Pos-Position aus.
Vorsichtsmaßnahmen:

  • Überprüfen Sie, ob pos legal ist
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

Setzen Sie das Element an der Position pos auf value

Ändern Sie das Pos-Positionselement.
Vorsichtsmaßnahmen:

  • Überprüfen Sie, ob pos legal ist.
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

Löschen Sie das erste Vorkommen des Schlüsselwortschlüssels

Löschen Sie das erste Vorkommen des Schlüssels.
Vorsichtsmaßnahmen:

  • Durchlaufen Sie die Suche.
  • Benutze die Elemente nach dem gefundenen Schlüssel, um sie nacheinander nach vorne abzudecken.
  • usedSize verringert sich um 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

Ermitteln Sie die Länge der Sequenztabelle

Das Erhalten der Länge der Sequenztabelle bezieht sich hier auf die Anzahl der Nutzdaten, also auf usedSize.

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

Übersichtliche Sequenzliste

Setzen Sie den Inhalt der Sequenztabelle auf leer.
Vorsichtsmaßnahmen:

  • Da die reale sequentielle Tabelle Generika speichert, werden die Elemente beim Durchlaufen einzeln auf leer gesetzt. Sie werden ersetzt, indem sie unten auf 0 gesetzt werden.
  • UsedSize ist ebenfalls auf 0 gesetzt.
public void clear() {
        for (int i = 0; i < usedSize; i++) {
            elem[i] = 0;
        }
        usedSize = 0;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

ArrayList in Java

Die Klasse ArrayList wird in Java zur Darstellung einer sequentiellen Liste bereitgestellt.

implementierte Schnittstelle

implementierte Schnittstelle

Schnittstellenbeschreibung:

  1. Die RandomAccess-Schnittstelle gibt Unterstützung für Direktzugriff an.
  2. Die klonbare Schnittstelle zeigt Unterstützung für das Klonen an.
  3. Die Serializable-Schnittstelle gibt Unterstützung für Serialisierung an.

Konstruktionsmethode

Java bietet drei Konstruktionsmethoden, wie in der Tabelle gezeigt:

MethodeEinführung in die Methodennutzung
Anordnungsliste()Konstruktion ohne Argumente
ArrayList(Sammlung<? extends E> C)Erstellen Sie ArrayList mit anderen Sammlungen
ArrayList(int Anfangskapazität)Geben Sie die Anfangskapazität der Sequenztabelle an

Gängige Methoden

Die bereitgestellten allgemeinen Methoden ähneln denen, die wir oben implementiert haben.
Gängige Methoden

Vor- und Nachteile von Sequenzlisten

Vorteil

Die Vorteile von Sequenztabellen sind wie folgt:

  1. Der wahlfreie Zugriff wird unterstützt.
  2. Das Abfragen eines bestimmten Indexes geht schnell.

Mangel

  1. Wenn nicht genügend Speicherplatz vorhanden ist, muss er erweitert werden, was zu einer Speicherverschwendung führt.
  2. Durch Einfügen und Löschen in der Kopfzeile und in der Mitte werden die Daten verschoben.

üben

Links zu den Übungen finden Sie unten:
Yang-Hui-Dreieck