www.wikidata.de-de.nina.az
Die Datenstruktur Menge auch Set genannt ist eine ungeordnete Sammlung von Elementen eines bestimmten Datentyps von denen jeweils maximal ein Exemplar enthalten ist Sie ist der endlichen Menge in der Mathematik nachempfunden Es ist meist aus Effizienzgrunden sinnvoll konstante Mengen anders zu reprasentieren als dynamische Mengen Zu den verfugbaren Operationen zahlen meist Erzeugen einer Menge aus den Elementen Prufung ob ein Element bereits enthalten ist Prufung ob eine Menge Untermenge einer anderen ist Bildung von Schnittmenge Vereinigung Differenzmenge usw Aufzahlen der Elemente der Menge in einer beliebigen OrdnungDynamische Mengen unterstutzen zusatzlich folgende Funktion Hinzufugen und Entfernen einzelner Elemente Je nach Anwendung konnen jeweils mehr oder weniger der genannten Operationen implementiert werden Inhaltsverzeichnis 1 Implementation 2 Programmierung 2 1 C 2 2 C 3 Siehe auch 4 Literatur 5 Weblinks 6 EinzelnachweiseImplementation BearbeitenDynamische Mengen werden ublicherweise mit Datenstrukturen wie Hashtabellen oder balancierten Suchbaumen implementiert Wenn ausschliesslich Untermengen einer bekannten Menge behandelt werden z B ein Intervall der naturlichen Zahlen ist auch eine Darstellung als Feld von Bits moglich Dabei stellt beispielsweise eine Eins an Stelle n dar dass das Element n in der Menge enthalten ist Die ublichen Mengenoperationen lassen sich dann gut als binare Operationen implementieren Inklusionstests lassen sich dann in konstanter Zeit durchfuhren Wenn eine binare Kodierung fur die Elemente einer Menge verfugbar ist konnen Mengen auch als Binares Entscheidungsdiagramm reprasentiert werden Dabei wird die Menge als Boolesche Funktion reprasentiert die fur die Kodierung ihrer Elemente Eins fur alle anderen Kodierungen Null ergibt Das kann fur bestimmte sehr grosse aber einfach strukturierte Mengen sinnvoll sein wie sie etwa beim Model Checking auftreten konnen 1 Einige Programmiersprachen wie zum Beispiel Modula 2 Oberon oder Python haben Mengen im Sprachumfang integriert wobei dieser Datentyp dann typischerweise mit SET oder BITSET deklariert wird Viele Programmiersprachen haben allerdings keinen elementaren Datentyp fur Mengen im Definitionsumfang und da in diesen Fallen oft Mengenoperationen mit ganzzahligen Datentypen zugelassen sind ist die Zuweisungskompatibilitat erheblich eingeschrankt was leicht zu Programmfehlern fuhren kann Daher ist es im Allgemeinen wesentlich besser und sicherer Bibliotheksfunktionen fur Mengenoperationen zu implementieren und zu benutzen siehe zum Beispiel in Java die Klasse Bitset Programmierung BearbeitenC Bearbeiten In der Programmiersprache C sind Mengen ein Datentyp von assoziativen Containern in denen jedes Element eindeutig sein muss weil der Wert des Elements es identifiziert Der Wert des Elements kann nicht geandert werden sobald es der Menge hinzugefugt wurde Es ist jedoch moglich den geanderten Wert dieses Elements zu entfernen und hinzuzufugen Einige grundlegende Funktionen des Datentyps Set in C sind begin Gibt einen Iterator zum ersten Element in der Menge zuruck end Gibt einen Iterator zu dem theoretischen Element zuruck das auf das letzte Element in der Menge folgt size Gibt die Anzahl der Elemente in der Menge zuruck max size Gibt die maximale Anzahl von Elementen zuruck die die Menge enthalten kann empty Gibt zuruck ob die Menge leer ist Ausserdem stellt die C Standardbibliothek Methoden fur die Verwendung eines Iterators zur Verfugung der die Elemente der Menge in einer vorgegebenen Reihenfolge durchlauft Das folgende Beispiel mit Vornamen zeigt die Verwendung der Klasse set der C Standardbibliothek siehe auch Template C Klassen Templates Bei der Ausfuhrung des Programms wird die Methode main verwendet 2 include lt set gt Bindet den Datentyp set in das Programm ein include lt iostream gt using namespace std int main set lt string gt mySet Deklariert eine Menge mit dem Elementtyp string Fugt Elemente vom Typ string in die Menge ein mySet insert Noah mySet insert Oliver mySet insert Oliver Duplikat mySet insert Isabella mySet insert Oliver Duplikat mySet insert Elijah mySet insert Emma mySet insert Isabella Duplikat mySet insert Isabella Duplikat mySet insert Elijah Duplikat cout lt lt Die Menge enthalt lt lt mySet size lt lt Elemente lt lt endl Gibt die Anzahl der Elemente aus set lt string gt iterator mySetIterator mySet begin Deklariert einen Iterator auf der Menge set lt string gt reverse iterator mySetReverseIterator mySet rbegin Deklariert einen inversen Iterator auf der Menge cout lt lt Der erste Name der Menge ist lt lt mySetIterator lt lt endl Ausgabe auf der Konsole Elijah cout lt lt Der letzte Name der Menge ist lt lt mySetReverseIterator lt lt endl Ausgabe auf der Konsole Oliver cout lt lt Elemente in normaler Reihenfolge for mySetIterator mySet begin mySetIterator mySet end mySetIterator for Schleife mit Iterator cout lt lt lt lt mySetIterator Ausgabe auf der Konsole Elijah Emma Isabella Noah Oliver cout lt lt endl cout lt lt Elemente in umgekehrter Reihenfolge for mySetReverseIterator mySet rbegin mySetReverseIterator mySet rend mySetReverseIterator for Schleife mit inversem Iterator cout lt lt lt lt mySetReverseIterator Ausgabe auf der Konsole Oliver Noah Isabella Emma Elijah cout lt lt endl Entfernt Elemente vom Typ string aus der Menge mySet erase Oliver mySet erase Noah mySet erase Otto Entfernt kein Element weil Otto nicht in der Menge vorhanden ist cout lt lt Die Menge enthalt lt lt mySet size lt lt Elemente lt lt endl Gibt die Anzahl der Elemente aus cout lt lt Elemente in normaler Reihenfolge for mySetIterator mySet begin mySetIterator mySet end mySetIterator for Schleife mit Iterator cout lt lt lt lt mySetIterator Ausgabe auf der Konsole Elijah Emma Isabella cout lt lt endl cout lt lt Elemente in umgekehrter Reihenfolge for mySetReverseIterator mySet rbegin mySetReverseIterator mySet rend mySetReverseIterator for Schleife mit inversem Iterator cout lt lt lt lt mySetReverseIterator Ausgabe auf der Konsole Isabella Emma Elijah cout lt lt endl C Bearbeiten Die Klassenbibliothek der Programmiersprache C stellt die Klasse HashSet zur Verfugung die eine Menge als generischen Typ implementiert Die Kapazitat eines Objekts vom Typ HashSet erhoht sich automatisch wenn dem Objekt Elemente hinzugefugt werden Die Klasse HashSet basiert auf dem Modell mathematischer Mengen und bietet Methoden fur Mengenoperationen an Ein HashSet ist nicht sortiert und kann keine mehrfachen Elemente Duplikate enthalten Einige grundlegende Methoden der Klasse HashSet in C sind Add x Fugt das Element x der Menge hinzu Remove x Entfernt das Element x aus der Menge Contains x Bestimmt ob die Menge das Element x enthalt Clear Entfernt alle Elemente der Menge CopyTo A Kopiert alle Elemente der Menge in das Array A IntersectWith S Bildet die Schnittmenge mit der Menge S indem alle Elemente entfernt werden die die Menge S nicht enthalt UnionWith S Bildet die Vereinigungsmenge mit der Menge S indem alle Elemente von S in die Menge kopiert werden die die Menge nicht enthalt ExceptWith S Bildet die Differenzmenge mit der Menge S indem alle Elemente entfernt werden die die Menge S enthalt SetEquals S Bestimmt ob die Menge und die Menge S dieselben Elemente enthalten IsSubsetOf S Bestimmt ob die Menge eine Teilmenge der Menge S ist IsSupersetOf S Bestimmt ob die Menge eine Obermenge der Menge S ist GetEnumerator Gibt ein Objekt der Klasse Enumerator zuruck das durch die Elemente der Menge iterieren kann Das folgende Beispiel in der Programmiersprache C mit Spielkarten zeigt die Verwendung des generischen Typs HashSet mit Typparameter string Die Bezeichnungen der Spielkarten werden der ersten Menge hinzugefugt und jeweils in Symbol und Wert zerlegt Die Symbole werden der zweiten Menge und die Werte werden der dritten Menge hinzugefugt Anschliessend werden die Symbole und Werte und ihre Anzahl auf der Konsole ausgegeben 3 public static void Main string args Deklariert drei HashSets mit dem Elementtyp string HashSet lt string gt cardSet new HashSet lt string gt HashSet lt string gt cardSymbolSet new HashSet lt string gt HashSet lt string gt cardValueSet new HashSet lt string gt Fugt der Menge cardSet 6 Elemente vom Typ string hinzu cardSet Add Herz Bube cardSet Add Herz Dame cardSet Add Karo Konig cardSet Add Kreuz Ass cardSet Add Kreuz 10 cardSet Add Karo Ass foreach string card in cardSet foreach Schleife die alle Elemente von cardSet durchlauft string tokens card Split new char StringSplitOptions None Zerlegt die Bezeichnung der Spielkarte in Worter und weist sie einem Array mit dem Elementtyp string zu string cardSymbol tokens 0 cardSymbolSet Add cardSymbol Fugt das erste Wort Symbol der Spielkarte der Menge cardSymbolSet hinzu string cardValue tokens 1 cardValueSet Add cardValue Fugt das zweite Wort Wert der Spielkarte der Menge cardValueSet hinzu int n cardSymbolSet Count Weist die Anzahl der Elemente von cardSymbolSet der Variablen n zu Console WriteLine Die Anzahl der Symbole ist n Ausgabe auf der Konsole Console WriteLine ToString cardSymbolSet Ausgabe auf der Konsole Herz Karo Kreuz n cardValueSet Count Weist die Anzahl der Elemente von cardValueSet der Variablen n zu Console WriteLine Die Anzahl der Werte ist n Ausgabe auf der Konsole Console WriteLine ToString cardValueSet Ausgabe auf der Konsole Bube Dame Konig Ass 10 Console ReadLine Fur die Ausgabe des HashSet wird folgende Methode verwendet Diese Methode gibt das HashSet in der Form A B C als Text zuruck public static string ToString HashSet lt string gt aHashSet string text foreach string element in aHashSet foreach Schleife die alle Elemente durchlauft text element text text Substring 0 text Length 2 text return text Das folgende Beispiel mit Berufen und politischen Amtern zeigt die Verwendung der Methoden IntersectWith UnionWith und ExceptWith public static void Main string args Deklariert und initialisiert vier HashSets mit dem Elementtyp string HashSet lt string gt scientificProfessions new HashSet lt string gt Informatiker Physiker Biologe Ingenieur Forschungsminister HashSet lt string gt artisticProfessions new HashSet lt string gt Musiker Autor Maler Bildhauer Kulturminister HashSet lt string gt manualOccupations new HashSet lt string gt Bauarbeiter Installateur Ingenieur Bildhauer HashSet lt string gt politicalProfessions new HashSet lt string gt Regierungschef Forschungsminister Kulturminister Abgeordneter HashSet lt string gt scientificAndPoliticalProfessions new HashSet lt string gt politicalProfessions Initialisiert das HashSets mit den Elementen von politicalProfessions scientificAndPoliticalProfessions IntersectWith scientificProfessions Bildet die Schnittmenge mit scientificProfessions Console WriteLine ToString scientificAndPoliticalProfessions Ausgabe auf der Konsole Forschungsminister HashSet lt string gt nonManualOccupations new HashSet lt string gt scientificProfessions Initialisiert das HashSets mit den Elementen von scientificProfessions nonManualOccupations UnionWith artisticProfessions Bildet die Vereinigungsmenge mit artisticProfessions nonManualOccupations UnionWith politicalProfessions Bildet die Vereinigungsmenge mit politicalProfessions nonManualOccupations ExceptWith manualOccupations Bildet die Differenzmenge mit manualOccupations Console WriteLine ToString nonManualOccupations Ausgabe auf der Konsole Informatiker Physiker Biologe Forschungsminister Musiker Autor Maler Kulturminister Regierungschef Abgeordneter HashSet lt string gt nonPoliticalProfessions new HashSet lt string gt scientificProfessions Initialisiert das HashSets mit den Elementen von scientificProfessions nonPoliticalProfessions UnionWith artisticProfessions Bildet die Vereinigungsmenge mit artisticProfessions nonPoliticalProfessions UnionWith manualOccupations Bildet die Vereinigungsmenge mit manualOccupations nonPoliticalProfessions ExceptWith politicalProfessions Bildet die Differenzmenge mit politicalProfessions Console WriteLine ToString nonPoliticalProfessions Ausgabe auf der Konsole Informatiker Physiker Biologe Ingenieur Musiker Autor Maler Bildhauer Bauarbeiter Installateur Console ReadLine Siehe auch BearbeitenFeld Datentyp Liste Datenstruktur Stapelspeicher Warteschlange Datenstruktur Deque IteratorLiteratur BearbeitenGuido van Rossum Python Library Reference 2006Weblinks Bearbeitenstd set In cplusplus com Abgerufen am 29 April 2021 englisch Set in C Standard Template Library STL Set in C Standard Template Library STL GeeksforGeeks 23 Marz 2021 abgerufen am 29 April 2021 englisch std set In cppreference com 11 August 2020 abgerufen am 29 April 2021 englisch Datentyp set in C C HashSet Class GeeksforGeeks 20 Dezember 2018 abgerufen am 27 April 2021 englisch Einzelnachweise Bearbeiten Gary D Hachtel Fabio Somenzi Logic Synthesis and Verification Algorithms Kluwer Academic Boston Mass London 1996 ISBN 0 7923 9746 0 S 219 englisch set Class In Microsoft Docs 9 September 2020 abgerufen am 29 April 2021 englisch HashSet lt T gt Class In Microsoft Docs Abgerufen am 1 Mai 2021 englisch Abgerufen von https de wikipedia org w index php title Menge Datenstruktur amp oldid 232882732