logo

Lijst overslaan in gegevensstructuur

Wat is een skiplijst?

Een skiplist is een probabilistische datastructuur. De skiplijst wordt gebruikt om een ​​gesorteerde lijst met elementen of gegevens op te slaan met een gekoppelde lijst. Het maakt het mogelijk om het proces van de elementen of gegevens efficiënt te bekijken. In één enkele stap slaat het verschillende elementen van de hele lijst over. Daarom wordt het ook wel een skip-lijst genoemd.

De skiplijst is een uitgebreide versie van de gekoppelde lijst. Hiermee kan de gebruiker het element zeer snel zoeken, verwijderen en invoegen. Het bestaat uit een basislijst die een reeks elementen bevat die de linkhiërarchie van de volgende elementen handhaaft.

Lijststructuur overslaan

Het is gebouwd in twee lagen: de onderste laag en de bovenste laag.

De onderste laag van de skip-lijst is een algemeen gesorteerde gekoppelde lijst, en de bovenste lagen van de skip-lijst zijn als een 'express-regel' waar de elementen worden overgeslagen.

Complexiteitstabel van de Skip-lijst

Ja nee Complexiteit Gemiddeld geval Het slechtste geval
1. Toegang tot complexiteit O(login) Op)
2. Zoekcomplexiteit O(login) Op)
3. Verwijder complexiteit O(login) Op)
4. Voeg complexiteit toe O(login) Op)
5. Complexiteit van de ruimte - O(nlogn)

Werking van de Skip-lijst

Laten we een voorbeeld nemen om de werking van de skiplijst te begrijpen. In dit voorbeeld hebben we 14 knooppunten, zodanig dat deze knooppunten in twee lagen zijn verdeeld, zoals weergegeven in het diagram.

De onderste laag is een gemeenschappelijke lijn die alle knooppunten met elkaar verbindt, en de bovenste laag is een uitdrukkelijke lijn die alleen de hoofdknooppunten met elkaar verbindt, zoals u in het diagram kunt zien.

Stel dat u in dit voorbeeld 47 wilt vinden. U begint met zoeken vanaf het eerste knooppunt van de expreslijn en blijft op de expreslijn lopen totdat u een knooppunt vindt dat gelijk is aan 47 of meer dan 47.

Je kunt in het voorbeeld zien dat 47 niet bestaat in de expreslijn, dus je zoekt naar een knooppunt van minder dan 47, wat 40 is. Nu ga je naar de normale lijn met behulp van 40, en zoek de 47, zoals weergegeven in het diagram.

Lijst overslaan in gegevensstructuur

Let op: Zodra je zo'n knooppunt op de 'snellijn' hebt gevonden, ga je van dit knooppunt naar een 'normale rijstrook' met behulp van een aanwijzer en zoek je naar het knooppunt in de normale lijn.

Lijst met basishandelingen overslaan

Er zijn de volgende soorten bewerkingen in de overslaanlijst.

    Inbrengoperatie:Het wordt gebruikt om in een specifieke situatie een nieuw knooppunt toe te voegen aan een bepaalde locatie.Verwijderingsbewerking:Het wordt gebruikt om een ​​knooppunt in een specifieke situatie te verwijderen.Zoekoperatie:De zoekbewerking wordt gebruikt om een ​​bepaald knooppunt in een skiplijst te doorzoeken.

Algoritme van de invoegbewerking

 Insertion (L, Key) local update [0...Max_Level + 1] a = L → header for i = L → level down to 0 do. while a → forward[i] → key forward[i] update[i] = a a = a → forward[0] lvl = random_Level() if lvl > L → level then for i = L → level + 1 to lvl do update[i] = L → header L → level = lvl a = makeNode(lvl, Key, value) for i = 0 to level do a → forward[i] = update[i] → forward[i] update[i] → forward[i] = a 

Algoritme van verwijderingsbewerking

 Deletion (L, Key) local update [0... Max_Level + 1] a = L → header for i = L → level down to 0 do. while a → forward[i] → key forward[i] update[i] = a a = a → forward[0] if a → key = Key then for i = 0 to L → level do if update[i] → forward[i] ? a then break update[i] → forward[i] = a → forward[i] free(a) while L → level > 0 and L → header → forward[L → level] = NIL do L → level = L → level - 1 

Algoritme van zoekbewerking

 Searching (L, SKey) a = L → header loop invariant: a → key level down to 0 do. while a → forward[i] → key forward[i] a = a → forward[0] if a → key = SKey then return a → value else return failure 

Voorbeeld 1: Maak een skip-lijst, we willen deze volgende sleutels in de lege skip-lijst invoegen.

  1. 6 met niveau 1.
  2. 29 met niveau 1.
  3. 22 met niveau 4.
  4. 9 met niveau 3.
  5. 17 met niveau 1.
  6. 4 met niveau 2.

Jaren:

Stap 1: Plaats 6 met niveau 1

Lijst overslaan in gegevensstructuur

Stap 2: Vul 29 in met niveau 1

Lijst overslaan in gegevensstructuur

Stap 3: Vul 22 in met niveau 4

Lijst overslaan in gegevensstructuur

Stap 4: Plaats 9 met niveau 3

Lijst overslaan in gegevensstructuur

Stap 5: Vul 17 in met niveau 1

Lijst overslaan in gegevensstructuur

Stap 6: Plaats 4 met niveau 2

Lijst overslaan in gegevensstructuur

Voorbeeld 2: Beschouw dit voorbeeld waarin we naar sleutel 17 willen zoeken.

Lijst overslaan in gegevensstructuur

Jaren:

Lijst overslaan in gegevensstructuur

Voordelen van de Skip-lijst

  1. Als u een nieuw knooppunt in de skiplijst wilt invoegen, zal het knooppunt zeer snel worden ingevoegd omdat er geen rotaties in de skiplijst voorkomen.
  2. De skiplist is eenvoudig te implementeren in vergelijking met de hashtabel en de binaire zoekboom.
  3. Het is heel eenvoudig om een ​​knooppunt in de lijst te vinden, omdat de knooppunten in gesorteerde vorm worden opgeslagen.
  4. Het skiplist-algoritme kan heel eenvoudig worden gewijzigd in een meer specifieke structuur, zoals indexeerbare skip-lijsten, bomen of prioriteitswachtrijen.
  5. De overslaanlijst is een robuuste en betrouwbare lijst.

Nadelen van de Skip-lijst

  1. Het vereist meer geheugen dan de gebalanceerde boom.
  2. Omgekeerd zoeken is niet toegestaan.
  3. De skiplijst doorzoekt het knooppunt veel langzamer dan de gekoppelde lijst.

Toepassingen van de Skip-lijst

  1. Het wordt gebruikt in gedistribueerde applicaties en vertegenwoordigt de pointers en het systeem in de gedistribueerde applicaties.
  2. Het wordt gebruikt om een ​​dynamische, elastische gelijktijdige wachtrij met weinig vergrendelingsconflicten te implementeren.
  3. Het wordt ook gebruikt met de QMap-sjabloonklasse.
  4. De indexering van de skiplijst wordt gebruikt bij het uitvoeren van mediaanproblemen.
  5. De skiplijst wordt gebruikt voor het posten van delta-codering in de Lucene-zoekopdracht.