Het kiezen van de juiste datastructuur kan uw programma efficiënter maken. Hier is een gids om u te helpen de juiste keuze te maken.
Het kiezen van de beste gegevensstructuur voor uw doelen kan een uitdaging zijn met meerdere beschikbare opties. Houd bij het kiezen van een gegevensstructuur rekening met de gegevens waarmee u te maken krijgt, de bewerkingen die op de gegevens moeten worden uitgevoerd en de omgeving waarin uw toepassing zal worden uitgevoerd.
Begrijp uw gegevens
Het is essentieel om de gegevens te begrijpen waarmee u te maken krijgt voordat u een gegevensstructuur selecteert. Gemeenschappelijke gegevensstructuren die met verschillende gegevenstypen werken, zijn onder meer arrays, gekoppelde lijsten, bomen, grafieken en hash-tabellen.
Als u bijvoorbeeld willekeurige elementen uit uw gegevens moet benaderen, zijn arrays wellicht de beste keuze. In het geval dat u constant elementen uit een lijst moet toevoegen of verwijderen, en de lijstgrootte ook kan veranderen, dan kunnen gekoppelde lijsten bijzonder handig zijn.
Wanneer u meerdere gegevensniveaus effectief moet opslaan, zoals recordstructuren, en bewerkingen moet uitvoeren zoals zoeken en sorteren, dan zijn bomen nuttig.
Wanneer u interacties tussen entiteiten moet beschrijven, zoals die in sociale netwerken, en bewerkingen moet uitvoeren zoals kortste pad en connectiviteit, dan hebben grafieken de voorkeur. Hash-tabellen zijn handig voor het snel opzoeken van sleutels.
Overweeg de bewerkingen die op de gegevens moeten worden uitgevoerd
Bij het kiezen van een gegevensstructuur moet u ook rekening houden met de bewerkingen die op de gegevens moeten worden uitgevoerd. Verschillende datastructuren optimaliseren tal van acties, zoals sorteren, zoeken, invoegen en verwijderen.
Gelinkte lijsten zijn bijvoorbeeld beter voor acties zoals invoegen en verwijderen, maar binaire bomen zijn het beste voor zoeken en sorteren. Een hashtabel kan de beste keuze zijn als uw toepassing gelijktijdig invoegen en zoeken vereist.
Evalueer de omgeving
Wanneer u een gegevensstructuur overweegt, moet u de omgeving evalueren waarin de toepassing zal worden uitgevoerd. De omgeving beïnvloedt hoe goed en hoe snel datastructuren toegankelijk zijn.
Houd rekening met de volgende factoren bij het evalueren van uw huidige toestand:
- Rekenkracht: Kies datastructuren voor uw applicaties die goed werken op pc's met weinig verwerkingskracht terwijl ze op het platform draaien. Eenvoudigere gegevensstructuren zoals arrays kunnen bijvoorbeeld geschikter zijn dan bomen of grafieken.
- gelijktijdigheid: U moet een thread-safe datastructuur kiezen die gelijktijdige toegang aankan zonder datacorruptie; als uw toepassing in een gelijktijdige omgeving draait, waar meerdere threads of processen tegelijkertijd toegang hebben tot de gegevensstructuur. In dit geval zijn vergrendelingsvrije datastructuren zoals ConcurrentLinkedQueue En GelijktijdigeHashMap kan geschikter zijn dan traditionele zoals ArrayListand HashMap.
- Netwerk vertraging: Als uw toepassing gegevensoverdracht via een netwerk vereist, moet u rekening houden met netwerklatentie bij het bepalen van de beste gegevensstructuur. In dergelijke situaties kan het gebruik van een gegevensstructuur die netwerkoproepen beperkt of de hoeveelheid gegevensoverdracht vermindert, de uitvoering helpen verbeteren.
Gemeenschappelijke datastructuren en hun use cases
Hier is een samenvatting van verschillende populaire datastructuren en hun gebruik.
- Arrays: Dit is een eenvoudige en efficiënte gegevensstructuur die een reeks elementen van hetzelfde gegevenstype met een vaste grootte kan bevatten. Om goed te kunnen werken, hebben ze snelle, directe toegang nodig tot specifieke objecten via een index.
- Gekoppelde lijsten: Gekoppelde lijsten zijn opgebouwd uit knooppunten, die een element en een verwijzing naar het volgende knooppunt en/of vorige knooppunt bevatten. Vanwege hun efficiënte werking zijn gekoppelde lijsten het meest geschikt in situaties waarin frequente elementen moeten worden ingevoegd of verwijderd. Toegang tot afzonderlijke elementen per index in gekoppelde lijsten is echter langzamer in vergelijking met arrays.
- Wachtrijen en stapels: Stapels houden zich aan de Last-In-First-Out (LIFO)-regel, waarbij het laatst geplaatste item het eerste verwijderde item is. Wachtrijen worden beheerst door het First-In-First-Out (FIFO) principe waarbij het eerste toegevoegde element ook het eerste is verwijderd.
- Hash-tabellen: Hash-tabellen zijn een vorm van datastructuur die sleutel-waardeparen bevat. De beste oplossing is om hashtabellen te gebruiken wanneer het aantal componenten onvoorspelbaar is en u snelle toegang tot de waarden per sleutel nodig hebt.
- Bomen: Bomen zijn hiërarchische gegevensstructuren die een groep elementen in een hiërarchie kunnen opslaan. De beste toepassingen voor binaire zoekbomen bevinden zich in hiërarchische datastructuren waar de relaties tussen de data-items een boomachtige structuur kunnen vertegenwoordigen.
De juiste gegevensstructuur kiezen
Voordat u een gegevensstructuur kiest, moet u rekening houden met de gegevens, verplichtingen en omgeving van uw toepassing. Denk bij uw keuze na over de volgende elementen:
- Tijd complexiteit: De prestaties van uw toepassing kunnen aanzienlijk worden beïnvloed door de tijdscomplexiteit van uw gegevensstructuur. Als uw toepassing frequente zoek- of ophaalbewerkingen vereist, gebruikt u een gegevensstructuur met minder tijdscomplexiteit, zoals een hashtabel.
- Ruimtelijke complexiteit: De ruimtecomplexiteit van de datastructuur is een andere belangrijke overweging. Als uw toepassing geheugenintensief is, kiest u een gegevensstructuur met minder ruimtecomplexiteit, zoals een array. Als ruimte geen probleem is, kunt u een gegevensstructuur gebruiken met een grotere ruimte-complexiteit, zoals een boom.
- Lees versus Schrijf bewerkingen: Als uw toepassing veel schrijfbewerkingen gebruikt, kiest u een gegevensstructuur met snellere invoegprestaties, zoals een hashtabel. Als uw toepassing veel leesbewerkingen vereist, kiest u een gegevensstructuur met een hogere zoeksnelheid, zoals een binaire zoekboom.
- Soort gegevens: De gegevens waarmee u te maken heeft, kunnen ook van invloed zijn op de door u gekozen gegevensstructuur. U kunt bijvoorbeeld een op bomen gebaseerde gegevensstructuur gebruiken als uw gegevens hiërarchisch zijn. Als u eenvoudige gegevens heeft die willekeurig moeten worden geopend, kan het kiezen van een op arrays gebaseerde gegevensstructuur uw beste optie zijn.
- Beschikbare bibliotheken: Overweeg de bibliotheken die gemakkelijk toegankelijk zijn voor de gegevensstructuur die u overweegt. Het kan eenvoudiger zijn om uit te voeren en te onderhouden als uw programmeertaal ingebouwde bibliotheken heeft die beschikbaar zijn voor een bepaalde gegevensstructuur.
Het volgende Python-voorbeeld laat zien hoe u de beste datastructuur voor een bepaalde use case kunt selecteren.
Overweeg het geval waarin u een bestandssysteemtoepassing ontwikkelt die bestanden in een hiërarchie moet opslaan en ophalen. U moet een gegevensstructuur kiezen die deze hiërarchische structuur efficiënt kan weergeven en snel bewerkingen zoals zoeken, invoegen en verwijderen uitvoeren.
Het kan een goed idee zijn om een boomgebaseerde gegevensstructuur te gebruiken, zoals een binaire zoekopdracht of een B-boom. Als het aantal vermeldingen in elke directory relatief klein is en de boom niet erg diep is, zou een binaire zoekboom goed werken. Een B-tree zou geschikter zijn voor grotere aantallen bestanden en diepere directorystructuren.
Hieronder is een voorbeeld van een binaire zoekboom in Python.
klasKnooppunt:
def__in het__(zelf, waarde):zelf.waarde = waarde
self.left_child = Geen
self.right_child = GeenklasBinaireZoekboom:
def__in het__(zelf):
zelf.root = Geen
definvoegen(zelf, waarde):als zelf.root isGeen:
self.root = Knooppunt (waarde)anders:
self._insert (waarde, self.root)
def_invoegen(zelf, waarde, huidige_node):als waarde < huidig_knooppunt.waarde:
als current_node.left_child isGeen:
current_node.left_child = Knooppunt (waarde)anders:
self._insert (waarde, current_node.left_child)
elif waarde > huidig_knooppunt.waarde:
als current_node.right_child isGeen:
current_node.right_child = Knooppunt (waarde)
anders:
self._insert (waarde, current_node.right_child)anders:
afdrukken("Waarde bestaat al in boom.")
defzoekopdracht(zelf, waarde):
als zelf.root isnietGeen:
opbrengst self._search (waarde, self.root)anders:
opbrengstVals
def_zoekopdracht(zelf, waarde, huidige_node):als waarde == huidige_node.waarde:
opbrengstWAARelif waarde < huidig_knooppunt.waarde En current_node.left_child isnietGeen:
opbrengst self._search (waarde, current_node.left_child)elif waarde > huidig_knooppunt.waarde En current_node.right_child isnietGeen:
opbrengst self._search (waarde, current_node.right_child)
anders:
opbrengstVals
In deze implementatie construeert u twee klassen: a BinaireZoekboom klasse die invoeg- en zoekbewerkingen beheert en a Knooppunt klasse die een knooppunt in de binaire zoekboom symboliseert.
Terwijl de invoegmethode een nieuw knooppunt invoegt op de juiste locatie in de boom, afhankelijk van de waarde, zoekt de zoekmethode naar een knooppunt met een gespecificeerde waarde. De tijdcomplexiteit van beide bewerkingen in een evenwichtige boom is dat wel O(log n).
Selecteer de optimale gegevensstructuur
De snelheid en het aanpassingsvermogen van uw applicatie kunnen aanzienlijk worden verbeterd door de gekozen datastructuur. Rekening houden met uw gegevens, uw activiteiten en uw omgeving kan u helpen bij het kiezen van de beste gegevensstructuur.
Overwegingen zoals tijdcomplexiteit, ruimtecomplexiteit, lees- versus schrijfbewerkingen, gelijktijdigheid, gegevenstype en toegankelijkheid van de bibliotheek zijn belangrijk.
Door het gewicht van elk onderdeel te beoordelen, moet u de gegevensstructuur kiezen die voldoet aan de behoeften van uw toepassing.