String (Informatik)

Diagram of String data in computing. Shows the sentence "This is a string!" with each letter in a separate box. The word "String" is above, referring to the entire sentence. The label "Character" is below and points to individual boxes.
Saiten bestehen oft aus Figuren. Sie sind nützlich, um menschlich-lesbare Daten wie Sätze oder Listen alphabetischer Daten zu speichern, wie die Nukleinsäuresequenzen von DNA.

Im Computerprogrammierung, a Saite ist traditionell a Reihenfolge von Figurenentweder als a wörtliche Konstante oder als eine Art von einer Art Variable. Letzteres kann zulassen, dass seine Elemente mutiert werden und die Länge geändert oder (nach der Schöpfung) festgelegt werden kann. Eine Zeichenfolge wird allgemein als als als angesehen Datentyp und wird oft als implementiert Array -Datenstruktur von Bytes (oder Wörter) Das speichert eine Abfolge von Elementen, typischerweise Zeichen, mit einigen Zeichenkodierung. Saite kann auch allgemeiner bezeichnen Arrays oder eine andere Sequenz (oder aufführen) Datentypen und Strukturen.

Abhängig von der Programmiersprache und der genauen Datentyp, die verwendet wird, a Variable Deklared als String kann entweder einen Speicher im Speicher für eine vorgegebene maximale Länge oder einsetzt dazu bringen, statisch zugewiesen zu werden dynamische Zuweisung Damit eine variable Anzahl von Elementen aufbewahrt werden kann.

Wenn eine Zeichenfolge buchstäblich in erscheint Quellcode, es ist als a bekannt Saitenliteral oder eine anonyme Zeichenfolge.[1]

Im formelle Sprachen, die verwendet werden in Mathematische Logik und Theoretische Informatik, eine Zeichenfolge ist eine endliche Folge von Symbole die aus einem ausgewählt werden einstellen genannt Alphabet.

String -Datentypen

A String -Datentyp ist ein Datentyp, der auf der Idee einer formalen Zeichenfolge modelliert wird. Saiten sind ein so wichtiger und nützlicher Datentyp, dass sie in nahezu jedem implementiert werden Programmiersprache. In einigen Sprachen sind sie als verfügbar als primitive Typen und in anderen als zusammengesetzte Typen. Das Syntax Von den meisten hochrangigen Programmiersprachen ermöglicht eine String, die normalerweise in irgendeiner Weise zitiert ist, eine Instanz eines String-Datentyps dar. Eine solche Meta-Saest wird als a genannt wörtlich oder Saitenliteral.

String-Länge

Obwohl formelle Saiten eine willkürliche endliche Länge haben können, wird die Länge der Saiten in realen Sprachen häufig auf ein künstliches Maximum beschränkt. Im Allgemeinen gibt es zwei Arten von String -Datentypen: Saiten mit fester Länge, die eine feste maximale Länge haben, die er bestimmt werden muss Zeit kompilieren und die die gleiche Menge an Speicher verwenden, unabhängig davon, ob dieses Maximum benötigt wird oder nicht, und Saiten variabler Länge, deren Länge nicht willkürlich festgelegt ist und die je nach den tatsächlichen Anforderungen zur Laufzeit unterschiedliche Speichermengen verwenden können (siehe Speicherverwaltung). Die meisten Saiten in der Moderne Programmiersprachen sind Zeichenfolgen variabler Länge. Natürlich sind auch Saiten mit variabler Länge begrenzt-nach verfügbarer Größe der verfügbaren Strings Computerspeicher. Die Saitenlänge kann als separate Ganzzahl gespeichert werden (die eine weitere künstliche Grenze für die Länge setzen kann) oder implizit durch einen Terminierungscharakter, normalerweise als Charakterwert mit allen Bits Null wie in der C -Programmiersprache. Siehe auch "Null-terminiert" unter.

Zeichenkodierung

String -Datentypen haben historisch ein Byte pro Charakter zugeteilt, und obwohl der genaue Zeichen, das nach Region variiert wurde, waren die Charaktercodierungen ähnlich, dass Programmierer häufig davon ignorieren konnten, da ein Programm ein speziell behandeltes Programm (z. B. Periode und Raum und Komma behandelt wurde ) befanden sich an der gleichen Stelle in allen Codierungen, auf die ein Programm begegnen würde. Diese Zeichensätze basierten typischerweise auf ASCII oder Ebcdic. Wenn Text in einer Codierung auf einem System mit einer anderen Codierung angezeigt wurde, war der Text häufig verstümmeltObwohl oft etwas lesbar und einige Computerbenutzer lernten, den verstümmelten Text zu lesen.

Logografisch Sprachen wie Chinesisch, japanisch, und Koreanisch (kollektiv als als bezeichnet als CJK) benötigen für eine angemessene Darstellung weit mehr als 256 Zeichen (die Grenze eines 8-Bit-Byte-pro-Charakter-Codierens). Die normalen Lösungen bestand darin Ideografien. Die Verwendung von diesen mit vorhandenem Code führte zu Problemen mit dem Matching und Schneiden von Strings, deren Schwere davon abhing, wie die Charaktercodierung entworfen wurde. Einige Codierungen wie die EUC Die Familie garantiert, dass ein Bytewert im ASCII -Bereich nur diesen ASCII -Zeichen darstellt, was die Codierung für Systeme, die diese Zeichen als Feldabscheider verwenden, sicher macht. Andere Codierungen wie z. ISO-2022 und Shift-Jis Machen Sie solche Garantien nicht und machen Sie die Übereinstimmung der Byte -Codes unsicher. Diese Codierungen waren auch nicht "selbstsynchronisiert", so dass die Lokalisierung von Charakterkontrasten bis zum Beginn einer Saite gesichert und zwei Saiten zusammenfügen können, um die zweite Zeichenfolge zu beschädigen.

Unicode hat das Bild etwas vereinfacht. Die meisten Programmiersprachen haben jetzt einen Datentyp für Unicode -Zeichenfolgen. Das bevorzugte Byte -Stream -Format von Unicode UTF-8 Es ist nicht so konzipiert, dass die oben beschriebenen Probleme für ältere Multibyte -Codierungen nicht beschrieben werden. UTF-8, UTF-16 und UTF-32 verlangt der Programmierer zu wissen, dass die Codeeinheiten mit fester Größe von den "Zeichen" unterscheiden Codepunkte Feste Größe, aber dies sind keine "Zeichen" aufgrund des komponierenden Codes).

Implementierungen

Einige Sprachen, wie z. C ++, Perl und RubinNormalerweise ermöglichen es, dass der Inhalt einer Zeichenfolge nach dem Erstellen der Erstellung geändert wird. diese werden bezeichnet veränderlich Saiten. In anderen Sprachen, wie z. Java, JavaScript, Lua, Python, und gehenDer Wert ist festgelegt und eine neue Zeichenfolge muss erstellt werden, wenn Änderungen vorgenommen werden sollen. diese werden bezeichnet unveränderlich Saiten. Einige dieser Sprachen mit unveränderlichen Saiten bieten auch einen anderen Typ, der veränderbar ist, wie Java und .NETZ's StringBuilder, der fadensichere Java StringBuffer, und die Kakao Nsmutablestring. Es gibt sowohl Vor- als auch Nachteile für die Unveränderlichkeit: Obwohl unveränderliche Zeichenfolgen ineffizient erfordern, sind viele Kopien erstellt, aber sie sind einfacher und vollständig Thread-safe.

Saiten werden normalerweise als implementiert als Arrays von Bytes, Zeichen oder Codeeinheiten, um einen schnellen Zugriff auf einzelne Einheiten oder Substrings zu ermöglichen - einschließlich Zeichen, wenn sie eine feste Länge haben. Ein paar Sprachen wie Haskell implementieren Sie sie als verlinkte Listen stattdessen.

Einige Sprachen, wie z. Prolog und ErlangVermeiden Sie es, überhaupt einen dedizierten String -Datentyp zu implementieren und stattdessen die Konvention der Darstellung von Zeichenfolgen als Listen von Zeichencodes zu übernehmen.

Darstellungen

Darstellungen von Saiten hängen stark von der Wahl des Charakterrepertoires und der Methode der Charaktercodierung ab. Ältere String -Implementierungen wurden so konzipiert, dass sie mit Repertoire und Codierung von ASCII oder neueren Erweiterungen wie dem funktionieren. ISO 8859 Serie. Moderne Implementierungen verwenden häufig das umfangreiche Repertoire, das von Unicode definiert ist, zusammen mit einer Vielzahl komplexer Codierungen wie UTF-8 und UTF-16.

Der Begriff Byte -Zeichenfolge Normalerweise weist eine allgemeine Reihe von Bytes an und nicht eine Saiten von nur (lesbaren) Zeichen, Bits oder dergleichen. Byte-Zeichenfolgen implizieren oft, dass Bytes einen Wert nehmen und alle Daten als IS gespeichert werden können, was bedeutet, dass kein Wert als Beendigungswert interpretiert werden sollte.

Die meisten String-Implementierungen sind der variablen Länge sehr ähnlich Arrays mit den Einträgen, die die speichern Zeichencodes von entsprechenden Zeichen. Der Hauptunterschied besteht darin, dass ein einzelner logischer Charakter bei bestimmten Codierungen mehr als einen Eintrag in das Array aufnehmen kann. Dies geschieht zum Beispiel bei UTF-8, wo einzelne Codes (UCS Codepunkte) können zwischen einem und vier Bytes dauern, und einzelne Zeichen können eine willkürliche Anzahl von Codes annehmen. In diesen Fällen unterscheidet sich die logische Länge der Zeichenfolge (Anzahl der Zeichen) von der physischen Länge des Arrays (Anzahl der verwendeten Bytes). UTF-32 Vermeidet den ersten Teil des Problems.

Null-terminiert

Die Länge einer Saite kann implizit unter Verwendung eines speziellen terminierenden Charakters gespeichert werden. Oft ist das das Nullcharakter (NUL), das alle Bits Null hat, eine Konvention, die vom Volk verwendet wird C Programmiersprache.[2] Daher wird diese Darstellung allgemein als als bezeichnet C String. Diese Darstellung von einem n-Character String nimmt n + 1 Raum (1 für den Terminator) und ist somit ein implizite Datenstruktur.

In beendeten Zeichenfolgen ist der Kündigungscode in keiner Zeichenfolge ein zulässiges Zeichen. Saiten mit Länge Feld hat diese Einschränkung nicht und kann auch willkürlich speichern Binärdaten.

Ein Beispiel für a NULL-terminierte Zeichenfolge in einem 10-Byte gespeichert Pufferzusammen mit seinem ASCII (oder moderner UTF-8) Darstellung als 8-Bit Hexadezimalzahlen ist:

F R A N K Nul k e f w
4616 5216 4116 4e16 4b16 0016 6b16 6516 6616 7716

Die Länge der Zeichenfolge im obigen Beispiel ","FRANK", IS 5 Zeichen, aber es nimmt 6 Bytes ein. Zeichen, nachdem der Terminator nicht Teil der Darstellung ist; sie können entweder Teil anderer Daten oder nur Müll sein (Zeichenfolgen dieser Form werden manchmal genannt Asciz Saitennach dem Original Montagesprache Richtlinie, die sie deklariert haben.)

Byte- und Bitterminierter

Die Verwendung eines anderen Bytes als Null zur Beendigung von Zeichenfolgen ist in der Vergangenheit sowohl in Hardware als auch in der Software aufgetreten, obwohl manchmal auch ein Wert war, der auch ein Druckcharakter war. $ wurde von vielen Assembler -Systemen verwendet, : benutzt von CDC Systeme (dieser Charakter hatte einen Wert von Null) und die ZX80 Gebraucht "[3] Da war dies der String -Trennzeichen in seiner grundlegenden Sprache.

Etwas ähnlich, "Datenverarbeitung" -Maschinen wie die IBM 1401 benutzte ein besonderes Wortmarke Bit to Grenz -Saiten auf der linken Seite, wo der Betrieb rechts beginnen würde. Dieses Stück musste in allen anderen Teilen der Saite klar sein. Dies bedeutete, dass der IBM 1401 zwar ein sieben-Bit-Wort hatte, fast niemand, der jemals als Merkmal verwendet wurde, und die Zuordnung des siebten Bits (zum Beispiel) ASCII-Codes überschreiben.

Die frühe Mikrocomputer-Software stützte sich auf die Tatsache, dass ASCII-Codes das Bit hoher Ordnung nicht verwenden und das Ende einer Zeichenfolge angeben. Es muss vor Ausgang auf 0 zurückgesetzt werden.[4]

Länge vorgefertigt

Die Länge einer Zeichenfolge kann auch explizit gespeichert werden, beispielsweise durch Präfix der Zeichenfolge mit der Länge als Byte -Wert. Diese Konvention wird in vielen verwendet Pascal Dialekte; Infolgedessen nennen einige Leute eine solche Zeichenfolge a Pascal String oder P-String. Speichern Sie die Saitenlänge als Byte die maximale Zeichenfolgelänge auf 255. Um solche Einschränkungen zu vermeiden Wörter So speichern Sie die Saitenlänge. Wenn der Länge Feld deckt die Adressraum, Strings sind nur durch die begrenzt verfügbare Erinnerung.

Wenn die Länge begrenzt ist, kann sie im konstanten Raum kodiert werden, typischerweise ein maschinelles Wort, was zu einer führt implizite Datenstruktur, nehmen n + k Raum, wo k ist die Anzahl der Zeichen in einem Wort (8 für 8-Bit-ASCII auf einer 64-Bit-Maschine, 1 für 32-Bit-UTF-32/UCS-4 auf einer 32-Bit-Maschine usw.). Wenn die Länge nicht begrenzt ist, codieren Sie eine Länge n Nimmt Protokoll (n) Raum (siehe Code mit fester Länge), also sind längenspezifische Saiten a Prägnante Datenstruktur, codieren eine Längefolge n im log (log (n) + n Platz.

Im letzteren Fall hat das Feld Länge-Prefix selbst keine feste Länge, daher müssen die tatsächlichen String-Daten bewegt werden, wenn die Zeichenfolge so wächst, dass das Längenfeld erhöht werden muss.

Hier ist eine Pascal-Saite, die zusammen mit seiner ASCII / UTF-8-Darstellung in einem 10-Byte-Puffer gespeichert ist:

Länge F R A N K k e f w
0516 4616 5216 4116 4e16 4b16 6b16 6516 6616 7716

Saiten als Aufzeichnungen

Viele Sprachen, einschließlich objektorientierter, implementieren Strings als Aufzeichnungen mit einer internen Struktur wie:

Klasse Saite {   size_t Länge;   verkohlen *Text; }; 

Da die Implementierung jedoch normalerweise ist versteckt, auf die Zeichenfolge muss durch Mitgliedsfunktionen zugegriffen und geändert werden. Text ist ein Zeiger auf einen dynamisch zugewiesenen Speicherbereich, der bei Bedarf erweitert werden kann. Siehe auch String (C ++).

Andere Darstellungen

Sowohl Charakterabschlüsse als auch Längencodes beschränken Zeichenfolgen: Beispielsweise können C -Zeichen -Arrays, die NULL (NUL) -Scharnien enthalten C String Bibliotheksfunktionen: Zeichenfolgen mit einem Längencode sind auf den Maximalwert des Längencodes beschränkt.

Beide Einschränkungen können durch clevere Programmierung überwunden werden.

Es ist möglich, Datenstrukturen und -funktionen zu erstellen, die sie manipulieren, die nicht über die Probleme im Zusammenhang mit der Charakter -Beendigung verbunden sind und im Prinzip Längencodegrenzen überwinden können. Es ist auch möglich, die anhand von Techniken dargestellte Zeichenfolge zu optimieren Kodierung der Länge (Wiederholte Zeichen durch den Zeichenwert und eine Länge ersetzen) und Hamming -Codierung[Klarstellung erforderlich].

Während diese Darstellungen häufig sind, sind andere möglich. Verwendung Seile Erstellt bestimmte String -Operationen wie Insertionen, Löschungen und Verkettungen effizienter.

Die Kerndatenstruktur in a Texteditor ist diejenige, die die Zeichenfolge (Abfolge von Zeichen) verwaltet, die den aktuellen Status der zu bearbeitenden Datei darstellt. Während dieser Zustand in einer einzigen langen aneinanderfolgenden Array von Zeichen gespeichert werden könnte, verwendet ein typischer Texteditor stattdessen eine alternative Darstellung als Sequenzdatenstruktur - a Gap Puffer, a verlinkte Liste von Linien, a Stücktisch, oder ein Seil- Dadurch werden bestimmte String -Operationen wie Insertionen, Löschungen und rückgängigere Vorgänge effizienter gestellt.[5]

Sicherheitsbedenken

Die unterschiedlichen Speicherlayout- und Speicheranforderungen von Zeichenfolgen können die Sicherheit des Programms beeinflussen, der auf die Zeichenfolgendaten zugreift. String -Darstellungen, die ein terminierendes Zeichen erfordern, sind häufig anfällig für Pufferüberlauf Probleme, wenn das terminierende Zeichen nicht vorhanden ist, verursacht durch einen Codierungsfehler oder ein Angreifer Absichtlich ändern die Daten. String -Darstellungen, die ein separates Längenfeld annehmen, sind ebenfalls anfällig, wenn die Länge manipuliert werden kann. In solchen Fällen erfordert der Zugriff auf die String -Daten für Programmcode Grenzenprüfung Um sicherzustellen, dass es nicht versehentlich auf Daten außerhalb der String -Speichergrenzwerte zugreifen oder sie ändern.

String -Daten werden häufig von der Benutzereingabe in ein Programm erhalten. Daher liegt es in der Verantwortung des Programms, die Zeichenfolge zu validieren, um sicherzustellen, dass es das erwartete Format darstellt. Leistung Begrenzte oder keine Validierung von Benutzereingaben kann dazu führen, dass ein Programm anfällig ist Codeinjektion Anschläge.

Wörtliche Saiten

Manchmal müssen Saiten in eine Textdatei eingebettet werden, die sowohl von Menschen lesbar als auch für den Konsum von einer Maschine vorgesehen ist. Dies ist beispielsweise in Quellcode von Programmiersprachen oder in Konfigurationsdateien erforderlich. In diesem Fall funktioniert der NUL-Charakter nicht gut als Terminator, da er normalerweise unsichtbar (nicht printbar) ist und über eine Tastatur schwer einzugeben ist. Das Speichern der Saitenlänge wäre auch unpraktisch, da die manuelle Berechnung und Verfolgung der Länge mühsam und fehleranfällig ist.

Zwei gemeinsame Darstellungen sind:

  • Umgeben von Anführungszeichen (ASCII 0x22 Doppelzitat "Str" oder ASCII 0x27 einzelnes Zitat 'Str'), verwendet von den meisten Programmiersprachen. Sonderzeichen wie die Zitatmarke selbst, Newline-Charaktere oder nicht printable Zeichen einbeziehen können. Fluchtsequenzen sind oft erhältlich, normalerweise vorangestellt mit dem Backslash Zeichen (ASCII 0x5c).
  • Beendet von a Neue Zeile Sequenz, zum Beispiel in Windows INI -Dateien.

Nicht-Text-Saiten

Während Charakterzeichenfolgen sehr häufige Verwendungen von Zeichenfolgen sind, kann sich eine Zeichenfolge in der Informatik allgemein auf jede Sequenz homogen getippter Daten beziehen. EIN Bit String oder Byte -Zeichenfolgekann zum Beispiel verwendet werden, um nicht-textuelle darzustellen Binärdaten Aus einem Kommunikationsmedium abgerufen. Diese Daten können je nach den Anforderungen der Anwendung, dem Wunsch des Programmierers und den Funktionen der verwendeten Programmiersprache durch einen String-spezifischen Datentyp dargestellt werden oder nicht. Wenn die String -Implementierung der Programmiersprache nicht ist 8-Bit sauberEs kann eine Datenversorgung erfolgen.

C -Programmierer zeichnen eine scharfe Unterscheidung zwischen einer "String", auch bekannt als "Zeichenfolge", die per Definition immer null beendet ist, im Vergleich zu einer "Byte -String" oder "Pseudo String", die möglicherweise im selben Array gespeichert werden kann, aber ist Oft nicht null gekündigt. Verwendung C -Stringhandhabung Funktionen zu einer solchen "Byte -String" scheint oft zu funktionieren, führt aber später zu Sicherheitsprobleme.[6][7][8]

String -Verarbeitungsalgorithmen

Es gibt viele Algorithmen Für die Verarbeitung von Zeichenfolgen, jeweils mit verschiedenen Kompromissen. Konkurrierende Algorithmen können sein analysiert in Bezug auf die Laufzeit, Speicheranforderungen usw.

Einige Kategorien von Algorithmen umfassen:

Erweiterte String -Algorithmen verwenden häufig komplexe Mechanismen und Datenstrukturen, darunter Suffixbäume und Finite-State-Maschinen.

Der Name Stringologie wurde 1984 vom Informatiker geprägt ZVI Galil Für das Thema Algorithmen und Datenstrukturen, die für die String -Verarbeitung verwendet werden.[9]

Zeichenfolge-orientierte Sprachen und Dienstprogramme

Charakterzeichenfolgen sind ein so nützlicher Datentyp, dass mehrere Sprachen entwickelt wurden, um die Verarbeitungsanwendungen für String -Verarbeitungen einfach zu schreiben. Beispiele umfassen die folgenden Sprachen:

Viele Unix Dienstprogramme führen einfache String -Manipulationen durch und können verwendet werden, um einige leistungsstarke String -Verarbeitungsalgorithmen problemlos zu programmieren. Dateien und endliche Streams können als Zeichenfolgen angesehen werden.

Etwas Apis wie Multimedia -Steuerschnittstelle, eingebettete SQL oder printf Verwenden Sie Zeichenfolgen, um Befehle zu halten, die interpretiert werden.

Jüngste Scripting -Programmiersprachen, einschließlich Perl, Python, Ruby und TCL beschäftigen Reguläre Ausdrücke Erleichterung von Textvorgängen. Perl ist besonders für den regelmäßigen Ausdrucksgebrauch bekannt,[10] und viele andere Sprachen und Anwendungen implementieren Perl kompatible reguläre Ausdrücke.

Einige Sprachen wie Perl und Rubinstütze String -Interpolation, was es beliebige Ausdrücke ermöglichen, bewertet und in String -Literale aufzunehmen.

Zeichenzeichenfunktionen

String -Funktionen werden verwendet, um Zeichenfolgen zu erstellen oder den Inhalt einer veränderlichen Zeichenfolge zu ändern. Sie werden auch verwendet, um Informationen über eine Zeichenfolge abzufragen. Der Satz von Funktionen und ihre Namen variiert je nach der Computerprogrammiersprache.

Das grundlegendste Beispiel einer String -Funktion ist die String-Länge Funktion - Die Funktion, die die Länge einer Zeichenfolge zurückgibt (ohne Terminator -Zeichen oder der internen strukturellen Informationen der Zeichenfolge) und die Zeichenfolge nicht ändert. Diese Funktion wird oft benannt Länge oder Len. Zum Beispiel, Länge ("Hallo Welt") würde zurückkehren 11. Eine weitere häufige Funktion ist Verkettung, wo eine neue Zeichenfolge erstellt wird, indem zwei Zeichenfolgen angehängt werden, ist dies häufig der + Addition -Operator.

Etwas Mikroprozessor's Anweisungsset Architekturen enthalten direkte Unterstützung für String -Operationen wie Blockkopie (z. B. in Intel x86m Repnz movsb).[11]

Formale Theorie

Sei σ a endliche Menge von Symbolen (alternativ als Zeichen bezeichnet), die genannt Alphabet. Über die Art der Symbole wird keine Annahme getroffen. EIN Saite (oder Wort) über σ ist endlich endlich Reihenfolge von Symbolen aus σ.[12] Zum Beispiel, wenn σ = {0, 1}, dann dann 01011 ist eine Zeichenfolge über σ.

Das Länge einer Saite s ist die Anzahl der Symbole in s (die Länge der Sequenz) und kann jeder sein Nicht negative Ganzzahl; Es wird oft als | bezeichnets|. Das leerer String ist die eindeutige Zeichenfolge über σ der Länge 0 und wird bezeichnet ε oder λ.[12][13]

Der Satz aller Strings über σ der Länge n wird σ bezeichnetn. Zum Beispiel, wenn σ = {0, 1}, dann σ2 = {00, 01, 10, 11}. Beachten Sie, dass σ0 = {ε} für jedes Alphabet σ.

Der Satz aller Zeichenfolgen über σ einer beliebigen Länge ist die Kleene -Schließung von σ und wird σ bezeichnet*. In Bezug auf σnAnwesend

Zum Beispiel, wenn σ = {0, 1}, dann σ* = {ε, 0, 1, 00, 01, 10, 11, 000, 001, 010, 011, ...}. Obwohl der Satz σ* selbst ist Zähler Unendlich unendlich, jedes Element von σ* ist eine Reihe von endlicher Länge.

Eine Reihe von Strings über σ (d. H. Any Teilmenge von σ*) wird a genannt formelle Sprache über σ. Zum Beispiel, wenn σ = {0, 1}, der Satz von Zeichenfolgen mit einer geraden Anzahl von Nullen, {ε, 1, 00, 11, 001, 010, 100, 111, 0000, 0011, 0101, 0110, 1001,, 1010, 1100, 1111, ...} ist eine formale Sprache über σ.

Verkettung und Substrings

Verkettung ist ein wichtiges Binäroperation auf σ*. Für zwei beliebige Saiten s und t in σ*ihre Verkettung ist definiert als die Abfolge von Symbolen in s gefolgt von der Abfolge von Zeichen in t, und wird bezeichnet st. Zum Beispiel, wenn σ = {a, b, ..., z}, s=bear, und t=hug, dann st=bearhug und ts=hugbear.

String -Verkettung ist eine assoziativ, aber nichtkommutativ Betrieb. Die leere Zeichenfolge ε dient als die als die Identitätselement; für jede Zeichenfolge s, εs = sε = s. Daher der Satz σ* und die Verkettungsoperation Form a Monoid, das Freies Monoid erzeugt durch σ. Darüber hinaus definiert die Längenfunktion a Monoid -Homomorphismus Aus σ* zu den nicht negativen Ganzzahlen (dh eine Funktion , so dass ).

Ein Faden s soll ein sein Substring oder Faktor von t Wenn es (möglicherweise leere) Saiten gibt u und v so dass t = USV. Das Beziehung "ist ein Substring von" definiert a Teilreihenfolge auf σ*, das kleinstes Element davon ist die leere Saite.

Präfixe und Suffixe

Ein Faden s soll ein sein Präfix von t Wenn es eine Zeichenfolge gibt u so dass t = su. Wenn u ist nicht leer, s soll ein sein richtig Präfix von t. Symmetrisch eine Schnur s soll ein sein Suffix von t Wenn es eine Zeichenfolge gibt u so dass t = uns. Wenn u ist nicht leer, s soll ein sein richtig Suffix von t. Suffixe und Präfixe sind Unterstrings von t. Beide Beziehungen "sind ein Präfix von" und "ist ein Suffix von" sind " Präfixbestellungen.

Umkehrung

Die Rückseite einer Zeichenfolge ist eine Zeichenfolge mit denselben Symbolen, jedoch in umgekehrter Reihenfolge. Zum Beispiel wenn s = ABC (wobei a, b und c Symbole des Alphabets sind), dann umgekehrt von s ist CBA. Eine Zeichenfolge, die sich umgekehrt ist (z. B.,,, s = Madam) wird a genannt Palindrom, die auch die leere Saite und alle Zeichenfolgen der Länge 1 enthält.

Rotationen

Ein Faden s = UV soll eine Rotation von sein t wenn t = Vu. Zum Beispiel, wenn σ = {0, 1} die Zeichenfolge 0011001 ist eine Rotation von 0100110, wo u = 00110 und v = 01. Als ein weiteres Beispiel hat der String ABC drei verschiedene Rotationen, nämlich. ABC selbst (mit u= ABC, v= ε), BCA (mit u= BC, v= a) und CAB (mit u= C, v= ab).

Lexikografische Ordnung

Es ist oft nützlich, eine zu definieren Bestellung auf einer Reihe von Saiten. Wenn das Alphabet σ a hat Gesamtbestellung (vgl. alphabetischer Reihenfolge) Man kann eine Gesamtreihenfolge auf σ definieren* genannt Lexikografische Ordnung. Wenn beispielsweise σ = {0, 1} und 0 <1, dann die lexikografische Reihenfolge auf σ* Enthält die Beziehungen ε <0 <00 <000 <... <0001 <001 <01 <010 <011 <0110 <01111 <1 <10 <100 <101 <111 <1111 <11111 ... Die lexikografische Reihenfolge ist gesamt Wenn die alphabetische Ordnung ist, aber nicht ist nicht begründet Für kein nicht triviales Alphabet, auch wenn die alphabetische Reihenfolge ist.

Sehen Shortlex für eine alternative Saitenordnung, die die Wohlbefinden bewahrt.

String -Operationen

In der formalen Theorie treten häufig eine Reihe zusätzlicher Operationen auf Zeichenfolgen auf. Diese sind in dem Artikel auf angegeben String -Operationen.

Topologie

(Hyper) Würfel von Binärsträngen der Länge 3

Saiten geben die folgende Interpretation als Knoten in einer Grafik zu, wo k ist die Anzahl der Symbole in σ:

  • Länge mit fester Länge n kann als ganzzahlige Standorte in einem angesehen werden n-Dimensional Hypercube mit Seiten der Länge k-1.
  • Zeichenfolgen variabler Länge (von endlicher Länge) können als Knoten auf a betrachtet werden perfekt k-ary Baum.
  • Unendliche Saiten (Ansonsten hier nicht berücksichtigt) kann als unendliche Wege auf a angesehen werden k-Knoten Komplette Graph.

Die natürliche Topologie auf dem Satz von Strings mit fester Länge oder Zeichenfolgen variabler Länge ist die diskrete Topologie, aber die natürliche Topologie auf dem Satz unendlicher Strings ist die Topologie begrenzenAnsicht der unendlichen Saiten als die umgekehrte Grenze der Sätze endlicher Saiten. Dies ist die Konstruktion für die p-Adische Zahlen und einige Konstruktionen der Cantor -Setund liefert die gleiche Topologie.

Isomorphismen Zwischen String -Darstellungen von Topologien kann durch Normalisieren nach dem gefunden werden Lexikografisch minimale Schnurrotation.

Siehe auch

Verweise

  1. ^ "Einführung in Java - MFC 158 g". Archiviert vom Original am 2016-03-03. String -Literale (oder Konstanten) werden als "anonyme Zeichenfolgen" bezeichnet.
  2. ^ Bryant, Randal E.; David, O'Hallaron (2003), Computersysteme: Perspektive eines Programmierers (2003 ed.), Upper Saddle River, NJ: Pearson Education, p. 40, ISBN 0-13-034074-x, archiviert vom Original am 2007-08-06
  3. ^ Wearmouth, Geoff. "Eine Versammlungsliste des ROM des Sinclair ZX80". Archiviert vom Original am 15. August 2015.{{}}: CS1 Wartung: Ungeeignete URL (Link)
  4. ^ Allison, Dennis. "Designnotizen für winzige Basis". Archiviert vom Original am 2017-04-10.
  5. ^ Charles Crowley."Datenstrukturen für Textsequenzen" Archiviert 2016-03-04 bei der Wayback -Maschine. Abschnitt"Einführung" Archiviert 2016-04-04 bei der Wayback -Maschine.
  6. ^ "STRLCPY und STRLCAT - Konsistent, sicher, Stringkopie und Verkettung." Archiviert 2016-03-13 bei der Wayback -Maschine
  7. ^ "Ein Scherz über Strcpy, Strncpy und Strlcpy." Archiviert 2016-02-29 bei der Wayback -Maschine
  8. ^ Keith Thompson. "Nein, strncpy () ist kein" sicherer "Strcpy ()". 2012.
  9. ^ "The Prag Stringology Club". Stringology.org. Archiviert Aus dem Original am 1. Juni 2015. Abgerufen 23. Mai 2015.
  10. ^ "Essential Perl". Archiviert vom Original am 2012-04-21. Perls berühmteste Stärke ist in einer String -Manipulation mit regelmäßigen Ausdrücken.
  11. ^ "x86 String -Anweisungen". Archiviert vom Original am 2015-03-27.
  12. ^ a b Barbara H. Partee; Alice Ter Meulen; Robert E. Wall (1990). Mathematische Methoden in der Linguistik. Kluwer.
  13. ^ John E. Hopcroft, Jeffrey D. Ullman (1979). Einführung in die Automatentheorie, Sprachen und Berechnung. Addison-Wesley. ISBN 0-201-02988-x. Hier: Sekte.1.1, S.1