Mehr

Algorithmus zum Entfernen von Loops aus einem Line-String

Algorithmus zum Entfernen von Loops aus einem Line-String


Ich verwende eine Drittanbieter-API, um eine Linienzug eine Strecke darstellen. Gelegentlich gibt diese API (die ich hier nicht benennen werde) eine Zeilenfolge zurück, die Schleifen enthält. Das macht logischerweise keinen Sinn. Der kürzeste Weg in einem Flugzeug würde niemals eine Schleife enthalten.

Per Definition muss das Vorhandensein einer Schleife in einer planaren Linienfolge implizieren, dass die Linienfolge sich selbst an einem Punkt schneidet. Ohne Beschränkung der Allgemeinheit muss es ein Segment des Pfades von der Ursprung des Pfads zu diesem Schnittpunkt, ein Segment entlang der Schleife, das zum Schnittpunkt zurückkehrt, und ein Segment von diesem Punkt zum Endpunkt des Pfads; Der Weg zum Entfernen der Schleife besteht einfach darin, das Segment zu entfernen, das am Schnittpunkt beginnt und endet. Ich könnte einen Algorithmus schreiben, um dies zu tun, es könnte ungefähr so ​​​​laufen…

für jeden Schritt, U = (a, b), entlang der Linienkette, wenn der Schritt einen vorherigen Schritt schneidet, V = (p, q) bei z einen Schritt einfügen (p, z) alle Schritte zwischen V und U entfernen, inklusive beider einen Schritt einfügen (z, b)

Meine Frage ist einfach, Gibt es veröffentlichte Algorithmen, um Schleifen aus einer Zeilenfolge zu entfernen? (angenommen, planar zu sein)?

Ich mag es nicht, meine eigenen Gekritzel zu implementieren, ohne zuerst zu lernen, was da draußen ist. Es ist einfach, einen Algorithmus zu erfinden. Es ist schwierig, einen perfekten zu erfinden.


Ich habe dieses Problem jetzt ziemlich gründlich untersucht, und ich glaube, dass der beste Weg, dies zu tun, darin besteht, einen gewichteten Graphen mit Scheitelpunkten für jeden Punkt in der Linienfolge und alle zu erstellen Überschneidung zwischen den Schritten entlang der Linienfolge und anwenden Dijkstras Algorithmus um den kürzesten Weg vom Startpunkt zum Endpunkt zu finden.

Warum mein Pseudocode nicht funktioniert

Betrachten Sie den Pfad unten, der bei A beginnt, zu B, C, D, E, F führt. Bei F kehrt der Pfad zu E, D und C zurück. Er geht dann weiter zu G und endet bei H.

P, Q, R, V, W sind Schnittpunkte, die in der ursprünglichen Linienfolge nicht existieren, aber für die Diskussion relevant sind.

Wenn der Algorithmus Schritte hinzufügt, geschieht Folgendes:

  1. während der Schritt CD hinzugefügt wird, entdeckt der Algorithmus den Schnittpunkt P und erstellt den Pfad A, P, D.
  2. Als nächstes wird beim Hinzufügen von EF Q entdeckt und A, Q, F erstellt.
  3. Auf dem Rückweg ist beim Hinzufügen von FE der sinnvolle Schnittpunkt wieder Q und das Ergebnis ist A, Q, E.
  4. Beim Addieren von DC wird R entdeckt und das Ergebnis ist A, Q, R, C. Dies ist der letzte Schnittpunkt, der das Verhalten des Algorithmus bestimmt
  5. und die endgültige Ausgabe ist A, Q, R, C, G, H.

Die menschliche Intuition legt nahe, dass Wege wie A, V, W, G, H oder sogar A, B, G, H kürzer sein werden. Sie würden von meinem Pseudocode-Algorithmus nie entdeckt.

Dies ist mindestens ein Fall, in dem der Algorithmus zu einem suboptimalen Pfad führt, daher meine Schlussfolgerung, dass die beste Lösung darin besteht, Finde alle Kreuzungen und führe den Dijkstra-Algorithmus aus.


Die Eingabepunkte für den obigen Pfad:

(-56.8217793676305, -8.88299365847671), (-113.643558735261, -17.7659873169534) (-56.6527353669234, -25.4905092205507), (-109.059870307362, -1.80265591606324) (-65.6069009172882, -39.4783992800045), (-96.4819575546674, 9.04327695318884) (-65.6069009172882, -39.4783992800045), (-109.059870307362, -1.80265591606324) (-56.6527353669234, -25.4905092205507), (-94.6466176124818, -20.3408279514859) (-151.468396980112, -29.2238216099626)

Algorithmus zum Entfernen von Schleifen aus einer Linienfolge - Geographische Informationssysteme

Beantwortet von:

Frage

Eine andere (möglicherweise Anfängerfrage) über die Art und Weise, wie Lat-Longs interpretiert werden, und eine Definition eines LineStrings.

Ich habe gerade eine lange (ish) Zeit damit verbracht, auf den Grund zu gehen, warum mein großer, aber einfacher GPS-Track explodierte, als ich versuchte, ihn in ein Geographic LineString-Objekt zu konvertieren. Ich habe es geschafft, das Problem auf einen doppelten Punkt im GPS-Track zu reduzieren.

Die Punkte kamen meiner Meinung nach von einem treibenden Boot, so dass es beim dritten Bericht wieder auf den ersten Punkt getrieben war.

Ich verstehe nicht wirklich, was hier der Fall ist, ich habe erwartet, dass die Linie gültig sein würde, aber meine Interpretation ist, dass sie entweder direkt um die Erde zu gehen scheint oder es eine Art Polygon nach links oder rechts gibt.

@line = 'LINESTRING (-1.6202778 49.6455574 107 0, -1.6202778 49.6452789 107 1, -1.6202778 49.6455574 106 2)'

@line = 'LINESTRING (-1.0 49,0, -1,0 50, -1,0 49,0)'

@geogOrig = Geographie :: STLineFromText ( @line , 4326 )

Der Fehler von sqlserver in diesem Fall

Nachricht 6522, Ebene 16, Status 1, Zeile 6

Bei der Ausführung der benutzerdefinierten Routine oder des Aggregats "geography" ist ein .NET Framework-Fehler aufgetreten:

System.ArgumentException: 24200: Die angegebene Eingabe stellt keine gültige Geography-Instanz dar.

bei Microsoft.SqlServer.Types.SqlGeography.ConstructGeographyFromUserInput(GeoData g, Int32 srid)

bei Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType-Typ, SqlChars taggedText, Int32 srid)

bei Microsoft.SqlServer.Types.SqlGeography.STLineFromText(SqlChars lineStringTaggedText, Int32 srid)

Kann mich jemand über die formale Definition einer Linienfolge aufklären oder die beste geografische Darstellung eines Pfads vorschlagen, bei dem das Boot/der Lieferfahrer/der Postbote zu demselben Punkt, derselben Adresse usw. zurückkehrt?

Antworten

1.) Aus genau diesem Grund kann es ein Problem sein, Linienfolgen mit GPS-Daten zu verwenden - Ihre GPS-Daten zeichnen eine Reihe von diskreten Punkten auf, die in bestimmten Zeitintervallen abgetastet werden. Es ist durchaus akzeptabel, dass GPS-Daten denselben Punkt zweimal aufzeichnen, aber wie oben erläutert, verletzt dies die OGC-Definition, was eine gültige Linienfolge ausmacht. Daher ist eine Mehrpunktgeometrie wohl ein besseres Modell für GPS-Daten. Leider verlieren Sie dann die Möglichkeit, nützliche Methoden wie STLength() für die Daten auszuführen. Daher müssen Sie möglicherweise Ihre Daten manuell korrigieren (suchen Sie nach sich wiederholenden Koordinatenwerten und verschieben Sie sie einfach ein wenig, um stattdessen gültige Linienfolgen zu erstellen).

2.) Sie können die M-Koordinate verwenden, um die Zeit aufzuzeichnen, zu der sich jeder Punkt im Multipoint bezieht - ich glaube nicht, dass Sie sich darauf verlassen können, dass die Reihenfolge eingehalten wird.

3.) Reduce() hat keine Auswirkung auf Multipoint-Instanzen. Von http://msdn.microsoft.com/en-us/library/cc627410.aspx:

"Bei Sammlungstypen arbeitet dieser Algorithmus unabhängig für jede in der Instanz enthaltene Geografie. Dieser Algorithmus modifiziert keine Punktinstanzen."


Wie können Sie eine Zeilenfolge und eine Ganzzahleingabe in C lesen?

Nehmen wir an, ich habe dieses Programm, das "a" ausführt, wenn ich "a" eingebe, und "b", wenn ich "b" eingebe. Aber sie brauchen verschiedene Dinge, um fortzufahren, wie zum Beispiel "a" 2 Eingabe-Integer benötigt und "b" nur 1 Eingabe-Integer benötigt. Die Eingabe sieht also so aus:

Wie kann ich ein Programm programmieren, das sich so liest? Wie wenn "a" 2 ganze Zahlen scannt, wenn "b" 1 ganze Zahl scannt. Das habe ich gerade:

Aber das wird nicht funktionieren, das Programm liest tatsächlich a 2 8 b 6 als i-Schleifen. Bitte hilf mir.


Welche Algorithmen sollte ich verwenden, um die Jobklassifizierung basierend auf Lebenslaufdaten durchzuführen?

Grundsätzlich habe ich eine Liste von Lebensläufen (CVs). Einige Kandidaten haben bereits Berufserfahrung, andere nicht. Das Ziel hier ist: Anhand des Textes in ihren Lebensläufen möchte ich sie in verschiedene Berufsfelder einordnen. Ich bin besonders in den Fällen, in denen der Kandidat keine Erfahrung hat / Student ist, und möchte eine Vorhersage treffen, um zu klassifizieren, zu welchen Berufsbereichen dieser Kandidat nach dem Abschluss am wahrscheinlichsten gehören wird.

Frage 1: Ich kenne maschinelle Lernalgorithmen. Allerdings habe ich noch nie NLP gemacht. Im Internet bin ich auf die latente Dirichlet-Zuordnung gestoßen. Ich bin mir jedoch nicht sicher, ob dies der beste Ansatz ist, um mein Problem zu lösen.

Meine ursprüngliche Idee: Machen Sie dies zu einem überwachten Lernproblem. Angenommen, wir haben bereits eine große Menge an gekennzeichneten Daten, was bedeutet, dass wir die Stellensektoren für eine Kandidatenliste korrekt gekennzeichnet haben. Wir trainieren das Modell mit ML-Algorithmen (d. h. nächster Nachbar. ) und füttern diese ein unbeschriftete Daten, das sind Kandidaten ohne Berufserfahrung / Studenten, und versuchen vorherzusagen, zu welchem ​​Berufssektor sie gehören werden.

Aktualisieren Frage 2: Wäre es eine gute Idee, eine Textdatei zu erstellen, indem Sie alles in einem Lebenslauf extrahieren und diese Daten in der Textdatei ausdrucken, damit jeder Lebenslauf mit einer Textdatei verknüpft ist, die unstrukturierte Zeichenfolgen enthält, und dann haben wir uns beworben Text-Mining-Techniken in die Textdateien einbinden und die Daten strukturieren oder gar eine Häufigkeitsmatrix der verwendeten Begriffe aus den Textdateien erstellen? Die Textdatei kann beispielsweise so aussehen:

Ich habe in diesem Projekt den ML-Algorithmus eingesetzt und. Kenntnisse: Java, Python, c++ .

Das meinte ich mit 'unstrukturiert', d.h. alles zu einer einzigen Zeilenfolge zusammenfassen.

Ist dieser Ansatz falsch? Bitte korrigieren Sie mich, wenn Sie meinen, dass mein Ansatz falsch ist.

Frage 3: Der knifflige Teil ist: Wie geht's? Identifizieren und extrahieren Sie die Schlüsselwörter ? Verwenden des tm-Pakets in R ? Auf welchem ​​Algorithmus basiert das tm-Paket? Sollte ich NLP-Algorithmen verwenden? Wenn ja, welche Algorithmen sollte ich mir anschauen? Bitte weisen Sie mich auch auf einige gute Ressourcen hin.


Wenn Sie alle Zeilen löschen möchten, die mit % put beginnen, wobei die ersten beiden Eingabezeilen erhalten bleiben, können Sie Folgendes tun:

Obwohl das gleiche mit awk besser lesbar wäre:

Oder, wenn Sie nach Leistung suchen:

Wenn Sie die ersten beiden Zeilen beibehalten möchten, die dem Muster entsprechen, obwohl sie möglicherweise nicht die ersten der Eingabe sind, wäre awk sicherlich eine bessere Option:

Mit sed können Sie Tricks anwenden wie:

Das heißt, verwenden Sie den Halteraum, um die Anzahl der Vorkommen der bisher übereinstimmenden Muster zu zählen. Nicht besonders effizient oder lesbar.

Ich fürchte, sed allein ist dafür etwas zu einfach (nicht, dass es unmöglich wäre, eher kompliziert - siehe z.B. sed sokoban für was getan werden kann).

Wenn Sie sich darauf verlassen können, dass Sie BASH aktuell genug verwenden (das reguläre Ausdrücke unterstützt), kann das obige awk übersetzt werden in:

Sie können anstelle des = . auch sed oder grep verwenden, um den Mustervergleich durchzuführen

Ich habe neue Zeilenzeichen durch '' ersetzt, um eine einzeilige Zeichenfolge zu erhalten, und dann alle bis auf die ersten beiden Vorkommen von Muster in ##-Markierung mit sed 's/pattern/##/3g' umgewandelt (ersetzen Sie vom dritten zum letzten Vorkommen des Musters in Zeile ), wieder '' in ' ' geändert und schließlich markierte Zeilen entfernt.

Eine Möglichkeit, die zusätzlichen Zeilen zu entfernen.

Bearbeiten: Meine Antwort funktioniert unter der gleichen Bedingung wie die von Stephane Chazelas, wenn die % Zeilen nicht zuerst auftreten, funktioniert sie nicht.

Funktioniert unabhängig davon, wo sich die %-Zahlenzeichenfolge im Stream befindet. Jede Zeile, die mit % beginnt und mit einer beliebigen Anzahl von Zeichen außer 1 oder 2 endet, die wir negieren. Diese Adresse stimmt mit allem überein, außer /% [A-Za-z3-9]*/ und hinterlässt einen blinden Fleck. Zahlen zwischen 10-29 werden noch gedruckt. Also verschachteln wir eine zweite Adresse, die diesem Bereich entspricht, und überspringen die Zeile.


Parallele Optimierung des String-Mode-Matching-Algorithmus basierend auf Multi-Core Computing

String Mode Matching ist eine klassische Computerforschungsfrage und eine von vielen Schlüsseltechnologien im Netzwerksicherheitssystem. Mit der Hardware- und Netzwerktechnologieentwicklung im Informationszeitalter. Big-Data-Verarbeitung und Anwendungsanforderungen für neue String-Matching-Technologie stellen neue Herausforderungen. Das Suffix-Array ist eine String-Übereinstimmung und eine effiziente Datenstruktur. Es löst viele komplexe Abfragen in Textdatenbankanwendungen. Diese Studie konzentriert sich auf die Systemarchitektur einer Multi-Core-Rechenumgebung charakterisiert, Optimierung und verbesserter Suffix-Array-Algorithmus, Verbesserung der Ausführungsleistung des Algorithmus, Verbesserung der Effizienz des parallelen Algorithmus. Schließlich verglichen mit dem BF-Algorithmus und dem seriellen Algorithmus des Suffix-Arrays. Schlussfolgerungen gezogener paralleler String-Mustervergleichsalgorithmus zur Verbesserung der Anwendungsleistungsoptimierung und Einsparung von Hardwarekosten von großer Bedeutung.

Zhanlong Chen, Liang Wu, Jiongyu Ma und Kuo Zheng, 2015. Parallele Optimierung des String-Mode-Matching-Algorithmus basierend auf Multi-Core Computing. Zeitschrift für Softwaretechnik, 9: 383-391.

Mit der zunehmenden Ausweitung der Informationsressourcen sowie der Netzwerkbandbreite muss der Text dem wachsenden Umfang gerecht werden. Der String-Matching ist sehr wichtig und ist eine der am häufigsten verwendeten Operationen von string. Forschung auf diesem Gebiet von Genetik, Bioinformatik und Computermusik bis hin zur Stichwortsuche auf Milliarden von Webseiten, Bildverarbeitung und Mustererkennung von Cyberspionage, Virus Intrusion Detection-Technologie, Network Distance Learning bis hin zu Textkompression, Datenverschlüsselung, Data-Mining-Technologie. Diese schweren Rechenaufgaben führen dazu, dass Computer und Server viel Zeit verbringen, String-Matching ist zu einem Schlüsselfaktor geworden, der die Leistung von Anwendungen beeinflusst (Mei et al., 2013). Das Entwicklungstempo der existierenden sequentiellen String-Matching-Algorithmen liegt jedoch weit hinter der Entwicklung von Computerhardware zurück, das Aufkommen der Multi-Core-Technologie macht die schnelle Entwicklung der Mikroprozessor-Parallelverarbeitungstechnologie für die parallele Verarbeitung von String-Matching zu einer wichtigen Referenz.

Diese Studie beschreibt die aktuelle Situation der Computerentwicklung von Multi-Core-Rechenumgebungen und beschreibt dann den in dieser Studie verwendeten String-Matching-Algorithmus, die Idee von Suffix-Arrays, gefolgt von Studien der Multi-Core-Parallel-Rechenumgebung, die für das String-Matching-Verfahren optimiert ist, und schließlich die experimentelle Daten analysiert und zusammengefasst (Huang, 2010).

Multicore-Computing-Umgebung: In der frühen Ära der Single-Core-CPU simulieren einige Mikroprozessoren mehrere logische CPU-Kerne, um Multi-Thread-Computing zu erreichen. Die Art und Weise, wie diese Multi-Thread-Verarbeitungstechnologie verwendet wird, um Multipal-Threads auf einer einzelnen CPU auszuführen, ist das Thread-Switching. Für den Programmierer besteht der Vorteil dieser Technik darin, dass die Programmiersprache um die parallele Ausführung von Befehlen ermöglicht. Der Grad an Parallelität und Pipelining der Funktionseinheiten ist jedoch begrenzt und der Overhead des häufigen Threadwechsels wird einen ernsthaften Einfluss auf die Systemleistung haben.

In den letzten Jahren, mit der kontinuierlichen Entwicklung der Halbleiterprozesstechnologie und -architektur, kann die Weiterentwicklung der modernen Halbleiterprozesstechnologie, in der VLSI typisch ist, den Bedarf an Mikroprozessorleistungsentwicklung nicht decken.

Seit 2005 werden die mehreren Mikroprozessorkerne auf einem Chip als Single-Chip-Multiprozessoren integriert, wobei jeder Ausführungskern seine eigene Sammlung sowie die strukturellen Ressourcen besitzt (Hager und Wellein, 2010). Mit diesen Multicore-Chips kann der Speicher in Seiten mit variabler Größe unterteilt werden, jeder Kern verfügt über einen L1-Cache mit einigen KB, wie in Abb. 1 gezeigt L1-Cache, 256K L2-Cache und 20M gemeinsamer Cache.

Multi-Core-Prozessoren verbessern die Rechenleistung und Parallelität des Programms, erreichen wirklich einen Multi-Threaded-Parallellauf, geben uns eine höhere Effizienz und eine leistungsstarke Parallelverarbeitungsfähigkeit und reduzieren zwischenzeitlich auch den Stromverbrauch und die Schwierigkeit der Wärmeableitung. Diese Struktur eines Prozessorsystems ist zu einem unvermeidlichen Entwicklungstrend geworden (Hennessy und Patterson, 2007, Patterson und Hennessy, 2008). Um die von der Multi-Core-Architektur bereitgestellten parallelen Rechenressourcen voll auszuschöpfen, ist es notwendig, das ursprüngliche serielle Programm in ein paralleles Multi-Core-Programm umzuwandeln. Es gibt fünf existierende parallele Programmiermodi (Bai et al., 2006): Stealth-Modus, Datenparallelmodus, Messaging-Muster und Share-Variablen-Modus. (1) Der Stealth-Modus verwendet einen Compiler und eine Laufzeitumgebung, um ein Programm zu unterstützen und die parallele Verarbeitung von seriellen Programmen zu erkennen, (2) Eine Datenparallel erfordert nicht zusammenhängende Datensätze, Parallelisierungsprogramme können durch eine Datenpartitionierung implementiert werden, (3) Messaging durch MPI repräsentierte Muster, PVM ist eine Variante des Message-Passing-Modells und (4) Das Shared-Adressraum-Modell: OpenMP (OpenMP, 2011) als typisches Modell, der Hauptvorteil des Hinzufügens von Parallelisierungsdirektiven zum seriellen Programm, das automatisch von Compiler zu parallelisieren.

Suffix-Array: Mit eingehender Untersuchung des String-Matching-Problems, insbesondere in der schnell wachsenden Masse von Informationsrückgewinnung , Computerbiologie und Netzwerksicherheit, ist das Problem heute eines der Probleme in der Informatik, das umfassend untersucht wurde. Das String-Matching-Problem ist ein Suchproblem, um unter bestimmten Bedingungen eine Symbolsequenz (genannt Modell) in einigen der größeren MAmatching-Symbolsequenzen (genannt Text) zu finden.

Heutzutage ist ein Großteil der Indexstruktur darauf ausgelegt, den Textindex zu optimieren (Stoye, 2008). Unter ihnen hat das Suffix-Array eine 20-jährige Geschichte (Manber und Myers, 1993), wurde tendenziell durch ein komprimiertes Suffix-Array und eine Burrows-Wheeler-Konvertierung (Adjeroh et al., 2008) ersetzt. Die Betriebseffizienz dieser neuen Indexstrukturen ist jedoch langsamer und beanspruchen mehr Speicherplatz. Suffix-Arrays sind Datenstrukturen, die in einer Textdatenbank verwendet werden, um schnell nach Schlüsselwörtern zu suchen. Tatsächlich ist das Suffix-Array eine Folge aller Suffixe, die nach einem bestimmten Wort sortiert wurden. Definieren Sie zunächst die Textzeichenfolge T [1 . ..n], Länge n, das zugehörige Suffix-Array SA [1 . ..n] speichern Textsuffix-Anfangspositionszeiger, Arrays lexikographisch sortiert Suffix. Abbildung 2 ist ein Beispiel für den Text “Suffixarray #148, $ als Suffix, markiert das Ende eines Arrays.

Das Suffix-Array speichert die Suffix-Informationen der Wörterbuchsequenz von Text T, anstatt die Textinformationen selbst zu speichern. Wenn wir nach einem Muster X[1 . .m], zuerst werden die Suffix-Arrays und die Länge des Textes T besucht, die Länge des Textes T wird mit |T| = n bezeichnet.

Wenn wir daher alle Suffix-Texte finden möchten, die mit X beginnen, einem Array aus sortierten Wörterbüchern, verwenden wir die binäre Suche als unseren Suchmodus, um Suffix-Arrays zu durchsuchen: Einer ist der direkte Pionier von X und der andere ist der direkte X-Nachfolger. Auf diese Weise erhalten wir das Suffix-Array-Intervall-Übereinstimmungsmuster. Abbildung 3 zeigt die Suche.

Abbildung 4 veranschaulicht den Ablauf des NQ-Suchmodus. Schließlich werden alle Muster der Länge L in den Hauptspeicher geladen, um eine Störung der Plattenzugriffskosten zu vermeiden. Dieser Algorithmus verwendet ein kontinuierliches Array-Durchquerungsmuster, die nächste ( )-Funktion wird ausgeführt, wobei jeder der Modusausführungs-SA-Abfrage-Teilstring-Suchalgorithmus ausgeführt wird.

Parallele Optimierung unter Multicore-Computing-Umgebungen: Die Multicore-Technologie integriert mehrere Prozessorkerne in einen einzigen Chip, ohne die bestehende Struktur der Prämisse zu ändern, sodass die Rechenressourcen des gesamten Systems deutlich erhöht werden (Yuan et al., 2011). Dadurch sind alle Prozessoren mit einer gemeinsamen Speichereinheit verbunden, wobei die Prozessoren beim Zugriff auf den Speicher denselben Speicheradressraum verwenden. Da der Speicher gemeinsam genutzt wird, können die Daten, die ein Prozessor in den Speicher schreibt, sofort von anderen Prozessoren abgerufen werden, alle Prozessoren teilen sich das Speichersubsystem und die Busarchitektur. Aufgrund der Shared-Memory-Parallelisierung können alle Tasks asynchrone Lese- und Schreib-Adressräume sein, und wir können Sperren oder Semaphoren verwenden, um den Zugriff von Tasks auf den Shared-Memory zu steuern (Tinetti und Martin, 2012).

Dabei muss weder die Identität der Daten unterschieden werden, noch muss man sich um die Kommunikationsdaten zwischen den Tasks kümmern, so dass die Komplexität der parallelen Programmierung stark vereinfacht und auch der Programmierer entlastet wird.

In dieser Studie verwenden wir den OpenMP-Standard, ein Multi-Threaded-Betriebsmodell, um eine Shared-Memory-Parallelität innerhalb der Knoten zu erreichen. Der OpenMP-Compiler verwendet den Prozess, um den OpenMP-Parallelthread zu erreichen (Abb. 5), das Programm läuft gemäß der benutzerdefinierten maximalen Anzahl von Threads, um die Kosten zu vermeiden, die durch das häufige Erstellen und Widerrufen von Prozessen verursacht werden.

Alle Threads, die beim Laden von OpenMP-Jobs erstellt wurden. Wählen Sie nach der Initialisierung einen Thread als Hauptthread und alle anderen Threads im wartenden Threadpool aus. Wenn der Haupt-Thread in die parallele Region läuft, weckt er die anderen Threads auf, indem er die OpenMP-Laufzeitbibliotheksfunktion comp parallel verwendet. Mit dieser Methode erreichen Multicore- und Multithread-Prozessoren eine hohe Ausführungsleistung, reduzieren die Systemkosten wirklich und nutzen den Speicher viel besser. Diese Methode macht es einfach, inkrementelle Parallelität zu implementieren. Außerdem hat es ein hohes Maß an Abstraktion und Portabilität und ist ein hochleistungsfähiges und relativ einfaches paralleles Programmiermodell auf SMP-Systemen und tatsächlich ist es der Standard für die parallele Programmierung mit gemeinsam genutzten Speicher-Multiprozessoren geworden.

Wir untersuchen die Parallelisierung eines Suffix-Arrays in Multi-Core-Computerumgebungen für parallele Computersysteme mit P Prozessorkernen. Der Text T [1. n] in n Suffixsegmente unterteilt ist, die NT-Threads zugewiesen sind, das ist die Art und Weise, das Suffixarray SA aufzubauen, NTi ist verantwortlich für die Anpassungsoperation zwischen SA und Mustersegmentmuster [1. n], um Lesekonflikte zwischen jedem zu vermeiden, hat jeder Thread eine lokale Variable buff, um die Länge des Suffixes zu speichern, und verwendet die Variablen left, right und cmp, um den Ort zu speichern, von dem aus das Suffix-Array SA zu suchen beginnt. Um eine Verzögerung der Ausführungszeit durch den kritischen Bereich zu vermeiden, verwenden Sie das Ergebnis [1. NQ], um die Ausführungsergebnisse aller Threads zu speichern. Im Compile Guidance Statement number pragma omp lässt der Befehl “for” zu, dass eine for-Schleife von mehreren Threads ausgeführt wird (Abb. 6).

Die Eigenschaften des Suffix-Array-Suchalgorithmus zeigen, dass er für Mehrkernprozessoren geeigneter ist, um die Effizienz zu verbessern, insbesondere der von uns vorgeschlagene binäre Suchalgorithmus, besser geeignet als die anderen Algorithmen, um auf die Elemente des Suffix-Arrays zuzugreifen. Um die Effizienz weiter zu verbessern, haben wir eine zusätzliche in der Datenstruktur gespeicherte Suffix-Array-Elemente eingeführt, auf die häufig zugegriffen wird, wie in Fig. 7 gezeigt.

Diese neue Datenstruktur nimmt nur sehr wenig Platz ein, so dass sie sogar im Cache-Speicher der unteren Ebene gespeichert werden kann, der verwendet werden kann, um die Anzahl der Besuche des Strings zu reduzieren, um schnell nach einem Teilstring zu suchen.

Abbildung 8 zeigt einen detaillierten Algorithmus: Wenn wir mit der Suche nach einem neuen Teilstring (iter = 1) beginnen, greifen wir zuerst auf das zweite Element von AUX zu und dann auf das Element auf der linken Seite von AUX [1], wenn wir die Suche fortsetzen müssen. Setze iter = 2 und vergleiche das erste Element von AUX mit Teilzeichenfolge X, andernfalls vergleiche das dritte Element AUX mit Teilzeichenfolge X. Diese Verbesserung findet die gewünschte Teilzeichenfolge schnell, erhöht die Anzahl der Cache-Treffer, verbessert die Betriebseffizienz des Zeichenfolgenabgleichs und Cache-Optimierung auch erreichen.

In dieser Studie handelt es sich bei der CPU um den Intel (R) Pentium (R) CPU G860 Dual-Core-Prozessor, getaktet mit 3 GHZ. Das Betriebssystem ist Windows 7. Der Compiler ist VS2005 C++ Compiler, im Test sind alle Algorithmen und Testprozeduren in C++ geschrieben. Wir lesen den gesamten Testtext auf einmal in den Speicher und rufen dann den Suchalgorithmus zum Suchmuster auf strings’ alle im Text vorkommen, am Anfang und am Ende der Suchfunktion rufen wir clock-t auf, um die Laufzeit in Millisekunden zu berechnen.

Wenn aktuelle Studien die Suchleistung zeigen, werden BF-Algorithmen verglichen (Huang, 2010). Daher ist diese Studie keine Ausnahme. Der implementierte BF-Algorithmus und der Suffix-Array-Algorithmus verwenden dieselbe experimentelle Umgebung und denselben Compiler, um die Auswirkungen der Umgebung zu reduzieren. Wir haben durch Experimente gezeigt, dass der vorgeschlagene parallele String-Matching von String-Musteralgorithmen effizienter ist als die anderen und Vorteile in Bezug auf die Berechnung hat.

Abbildung 9 zeigt im Fall der gleichen Musterfolge getestet mit unterschiedlichen Textdatenmengen, BF-Algorithmen, Suffix-Arrays serielle und parallele Algorithmen zum zeitaufwendigen Vergleich.

Wie aus Abb. 9 ersichtlich: Bei gleicher Musterfolge steigt die Ausführungszeit der drei Algorithmen mit der Textdatenmenge. Unter diesen verbessert der serielle Algorithmus des Suffix-Arrays die Effizienz des BF-Algorithmus um das Dreifache. So hat der Suffix-Array-Matching-Algorithmus im Vergleich zum traditionellen BF-Algorithmus die Leistung und Effizienz erheblich verbessert. Dann untersuchen wir viel tiefer und machen den Suffix-Array-Algorithmus Parallelisierung, experimentelle Ergebnisse zeigen: Die parallele Effizienz, die durch den Suffix-Array-Suchalgorithmus verbessert wird, ist 1,22 mal höher als der serielle, die Leistung hat sich exponentiell verbessert.

Experimentelle Untersuchungen zum Beschleunigungsverhältnis des Algorithmus bei unterschiedlicher Anzahl von Threads (beschleunigtes Ausführungszeitverhältnis = serielle/parallele Ausführungszeit) (Abb. 10).

Die zu testende Datenmenge hat zwei verschiedene Größen, eine ist 10 kb, die andere 40 kb. Es wurde festgestellt, dass: Mit zunehmender Anzahl von Threads beschleunigt sich der Algorithmus als verbessert, aber nach Erreichen einer bestimmten Anzahl von Threads stabilisiert sich die Beschleunigung, selbst bei der großen Datenmenge, mit der Erhöhung der Anzahl der Threads nimmt die Beschleunigung ab. Dies ist auf die Anzahl der CPU-Kern-Computerhardwarebeschränkungen und die lokalen Bedingungen zurückzuführen, die Gesamtkurve ist relativ flach, ohne signifikante Verbesserung.

Gegenwärtig sieht sich die Welt mit der “Informationsexplosion”, dem Aufkommen des Big Data-Zeitalters und den immer höheren Leistungsanforderungen von Matching-Strings konfrontiert. Andererseits stellt die schnelle Entwicklung von Computerhardware einen leistungsstarken gemeinsam genutzten Speicher bereit, und parallele Ressourcen bieten eine leistungsstarke Unterstützung für String-Matching-Studien. In der Studie analysieren wir die Suffix-Array-String-Matching-Algorithmen und die Parallelisierungsmethode in einer Multicore-Computing-Umgebung und schlagen ein Optimierungsprogramm vor, um die Anzahl der Cache-Treffer zu erhöhen. Experiment verwenden Sie eine Probe, um zu analysieren und mit dem traditionellen BF-Algorithmus zu vergleichen. Die experimentellen Ergebnisse bewiesen auch, dass sich das Suffix-Array der parallelen Matching-Algorithmen in Bezug auf Leistung und Effizienz stark verbessert hat. Aufgrund von Hardware-Beschränkungen der Laborbedingungen wird die vorhandene Parallelisierung jedoch nicht maximiert. In einer zukünftigen Studie werden wir eine exzellentere experimentelle Hardware auswählen, eine optimalere Lösung vorschlagen und die Paralleltechnologie in einer Multi-Core-Umgebung zu anderen String-Matching-Algorithmen verwenden, um ihre Leistungsfähigkeit voll auszuschöpfen.

Wir würdigen das “Fünf-Sekunden-Programm zur Unterstützung von Wissenschaft und Technologie für “Die Erforschung der Netzwerkdienstplattform für das Werkzeugset für geografische Geoinformationen” (2011BAH06B04) und die Fonds für Grundlagenforschung für die zentralen Universitäten (CUGL090251) und Geographic Information Engineering und National Key Laboratory Fund (Nr. SKLGIE2013-Z-4-1) und InformationEngineering in Surveying, State Key Laboratory finanzierte Projekte (Nr. 13I02) und Central Universities Fundamental Research Special Projects (CUGL130260), Forschungsprogramme Nationale Naturwissenschaftliche Stiftung Chinas (41401443).

2: Hager, G. und G. Wellein, 2010. Einführung in das Hochleistungsrechnen für Wissenschaftler und Ingenieure. CRC Press, Boca Raton, ISBN-13: 9781439811931, Seiten: 356.

3: Hennessy, J. L. und D. A. Patterson, 2007. Computerarchitektur: Ein quantitativer Ansatz. 4. Aufl., Morgan Kaufmann, San Francisco, CA, USA., ISBN-13: 9780080475028, S.: 198-214.

4: Patterson, D. A. und J. L. Hennessy, 2008. Computerorganisation und -design: Die Hardware/Software-Schnittstelle. 4. Aufl., Morgan Kaufmann Publishers Inc., San Francisco, CA., USA., ISBN-13: 978-0123744937, Seiten: 912.

5: Bai, Z. Y., X. Yang und J. Kuang, 2006. Parallel Computer Architecture. Science Press, Peking, China, S.: 19-20.

6: OpenMP, 2011. OpenMP-Anwendungsprogrammschnittstelle. Version 3.1, Juli 2011. http://www.openmp.org/mp-documents/OpenMP3.1.pdf.

7: Stoye, J., 2008. Su-x-Baumkonstruktion in Ram. In: Encyclopedia of Algorithms, Kao, M.Y. (Hrsg.). Springer Wissenschafts- und Wirtschaftsmedien, New York, USA.

8: Manber, U. und G. Myers, 1993. Suffix-Arrays: Eine neue Methode für Online-String-Suchen. SIAM J. Comput., 22: 935-948.
CrossRef | Direktlink |

9: Adjeroh, D., T. Bell und A. Mukherjee, 2008. Die Burrows-Wheeler-Transformation: Datenkomprimierung, Suffix-Arrays und Musterabgleich. Springer Science and Business Media, New York, USA., ISBN-13: 9780387789095, Seiten: 364.

10: Yuan, Q., J. Zhao, M. Chen und N. Sun, 2011. Performance-Engpassanalyse und Lösung eines Shared-Memory-Betriebssystems auf einer Multi-Core-Plattform. J. Computer. Res. Dev., 12: 2268-2276.
Direktlink |

11: Tinetti, F. G. und S. M. Martin, 2012. Sequentielle Optimierung und Parallelisierung von gemeinsam genutztem und verteiltem Speicher in Clustern: N-Körper/Partikel-Simulation. Proceedings of the 24th IASTED International Conference on Parallel and Distributed Computing and Systems, 12.-14. November 2012, Las Vegas, USA -.

12: Huang, H., 2010. Studien zur allgemeinen parallelen Methode zur Verbesserung der Leistung des String-Matching-Algorithmus. Masterarbeit, Xi'an University of Architecture and Technology.


3 Antworten 3

Probieren Sie Klavierdraht oder Maurerschnur (Saite) in einer sägenden Bewegung aus. (Der Partner hilft dabei. Ebenso das Binden einer Schlaufe und das Anfassen eines Griffs, da der Druck, den Sie benötigen, normalerweise mit bloßen Händen wehtut.)

Leider müssen Sie am Ende die Trockenbauwand flicken. vielleicht auch etwas weniger, wenn du glück hast.

Große Kleckse von gummiartigem / biegsamem Klebstoff lassen mich an "Silikon" denken, da andere Arten von Klebstoffen im Allgemeinen aushärten / trocknen und hart werden.

Leider kann die Verbindung nur durch Durchschneiden oder mechanisches Aufreißen gelöst werden.

Um es zu schneiden, wäre eine lange gerade dünne Klinge erforderlich, wie ein langes Filetmesser oder eine scharfe Machete. Dann müssten Sie es immer noch von der Wandplatte abkratzen, was wahrscheinlich zu Schäden führen würde, die Sie reparieren müssen.

Das Abreißen würde wahrscheinlich das Wallboard beschädigen, wie Sie es befürchten.

Wenn ich es wäre, würde ich wahrscheinlich oben anfangen und versuchen, durch den Kleber zu schneiden, während ich die Murmel vorsichtig nach außen ziehe / heble, mich nach unten arbeite und den Kleber so gut wie möglich aufschneide, ihn an Stellen wegreiße, die ich nicht erreichen konnte schneiden.

Wie auch immer, ich denke, Sie sollten sich auf die unvermeidliche Wandreparatur vorbereiten.


3 Antworten 3

Die Möglichkeit, Teile von Zeilen zu löschen, ist schwer fassbar und ein besserer Vimmer, als ich das erklären muss. Wenn jemand eine Erklärung spenden möchte, füge ich sie gerne dieser Antwort hinzu.

Es ist jedoch durchaus möglich, Gruppen von Zeilen zu löschen, die einem Anfangsmuster und einem Endmuster entsprechen. Der offensichtlichste Weg, denke ich, besteht darin, die Befehle :global und :delete wie folgt zu kombinieren:

die jede Zeile im Puffer nach dem Muster <body durchsucht. Wenn es eine Übereinstimmung findet, konstruiert es den Bereich .,/body>/ , d. h. von der Zeile, die übereinstimmt, bis zur nächsten Zeile, die mit body> übereinstimmt, und ruft den Befehl :delete für diesen Bereich auf.

Es ist der gleiche Befehl, der die current-line weglässt. .

Außerdem gibt es natürlich die dat-Operation, aber da Sie diese nicht verwendet haben, gehe ich davon aus, dass sie irgendwie unzureichend ist. Nun gibt es normalerweise nur ein "body"-Element in einem html-ähnlichen Dokument, aber wenn man alle "foo"-Elemente löschen wollte, könnte man diesen Befehl verwenden:

Das heißt, suchen Sie global nach dem Muster <foo , rufen Sie bei jedem Auftreten den Befehl im Normalmodus auf ( ! Zuordnungen hier nicht zulassen) löschen v (zeichenweise erzwingen, weglassen oder durch V ersetzen, wenn zeilenweise bevorzugt wird) a round t ag und x entfernen übrig gebliebenes ">".

Wie sie sagen, befindet sich jeder, der sgml/html/xml mit regulären Ausdrücken verarbeitet, natürlich in einem Zustand der Sünde. Zu stark vereinfachte Schemata wie diese werden von Zeit zu Zeit explodieren. The only way to be sure is to invoke a filter that runs a dom processor.

  • :g : Search-and-apply :help :g
  • :d : Delete :help :d
  • [range] : Range specification :help [range]
  • :norm : Apply normal-mode :help :norm
  • d : Delete :help d
  • v : Force character-wise :help o_v
  • V : Force line-wise :help o_v
  • a : Around selection :help text-objects
  • t : tag selection :help text-objects

You can use a filter. I would probably use sed for arbitrary multi-line matching.

There is a drawback in that there is no way in sed to do non-greedy matching, but in certain cases you can work around that. (For example, add only one line at a time until you get a match, then do the substitute, as below.) Your examples aren't using non-greedy matching in the first place, so:

Here's an example command. This will filter lines from the current line through the end of the file. Until it finds the match <body it will output each line exactly as it inputs. When it hits <body it enters a loop (conveniently labeled with :loop . The label itself does nothing but can be branched to later.) sed runs a substitute command, greedily matching <body.*/body> and deleting it if found (using @ as delimiter to avoid needing to escape the / .) Ob the substitute command actually did something, t exits the loop and sed outputs the text as it was changed by the substitute command, and then proceeds to the next line. Otherwise, sed continues: the $b command is ignored unless sed is on the last line to be filtered. N adds in the next line to what is being considered, with a newline in between, and the b ranch command branches to the label loop . Then the substitute command is run again, now on two lines, and if no match then it is run on drei lines, until it either finds a match (at which point the t command breaks the loop) or until the end of the lines to be filtered, at which point $b causes a b ranch and exits the loop, outputting the lines without filtering.

( sed is a whole language in itself. It's not very complicated—actually if you're familiar with Ex commands you will recognize a lot of vim 's heritage in sed 's syntax—but it is very concise. I've heard it called the "assembly language of text editing" and it is a very apt description.)

Hope this is helpful. I'm happy to clarify anything more you'd like on this, or tailor the example better for your needs. :)


  • Ctrl + H
  • Find what: (?<=d.dd)d+ OR d.ddKd+
  • Replace with: LEAVE EMPTY
  • Replace all

Erläuterung:

Result for given example:

I want to remove excess decimals from a string using find/replace with regex.

Menu "Search" > "Replace" (or Ctrl + H )

Enable "Regular expression" and "matches newline"

Weiterlesen


Delete a line in a txt file based on a set of strings in a loop

I have gone through this site and Stack Overflow trying to find a combination that will work. I am unsure if its the versions of PowerShell or what. But I cannot get this script to work like I want it to. I couldn't get the other scripts to work either. I would like the for the script to find a string in a file and delete that line without leaving a empty line. Currently this works but it leaves whatever text is not in the string and it will also leave the carriage return.

I am unsure why the variables are not working. I keep getting errors that an argument is expected or path is not found. I would like for it to look like this and understand my mistakes as I am trying to base my scripts off the same principles


Schau das Video: endless loop string building part #3 end loops