data-structures

___ qstnhdr ___ Ist standardmäßig std :: vector threadsicher und gleichzeitig? Warum oder warum nicht? ___ qstntxt ___

Was bedeutet es, ein dynamisches Array threadsicher und gleichzeitig zu machen? Sagen Sie beispielsweise %code% .

  1. Zwei Threads möchten möglicherweise an der gleichen Position eingefügt werden. Es ist keine Synchronisation erforderlich, da dies gemäß der Thread-Planung durchgeführt wird.
  2. Ein Thread wird gelöscht und ein anderer greift auf dasselbe Element zu? Dies ist kein Problem mit der Datenstruktur. Ich glaube, es ist ein Nutzungsproblem.

Gibt es also etwas, das über %code% erledigt werden muss, um es threadsicher und gleichzeitig zu machen oder ist es threadsicher und gleichzeitig standardmäßig?

    
___ tag123datastrukturen ___ Eine Datenstruktur ist eine Möglichkeit, Daten so zu organisieren, dass bestimmte Eigenschaften dieser Daten effizient abgefragt und / oder aktualisiert werden können. ___ tag123concurrency ___ In der Informatik ist Nebenläufigkeit eine Eigenschaft von Systemen, in denen mehrere Berechnungen in überlappenden Zeiträumen durchgeführt werden können. Die Berechnungen können auf mehreren Kernen in demselben Chip, präemptiv zeitgeteilten Threads auf demselben Prozessor oder auf physikalisch getrennten Prozessoren ausgeführt werden. ___ tag123vector ___ Ein Vektor ist ein eindimensionales Array: Er enthält Komponenten, auf die mit einem ganzzahligen Index zugegriffen werden kann. In einigen Sprachen kann die Größe eines Vektors nach Bedarf vergrößert oder verkleinert werden, um Elemente hinzuzufügen und zu entfernen, nachdem der Vektor erstellt wurde. Verwenden Sie "Vektorgrafiken" für die grafische Darstellung. ___ answer31132250 ___

Die einzigen gleichzeitigen Operationen für ein einzelnes Objekt in der Standardbibliothek, die standardmäßig sicher sind, sind  - Nur Zugriff auf %code% -Member Funktionen  - Alle Zugriffe auf Synchronisationsprimitive (wie Mutex Lock und Unlock oder atomare Operationen) Alles andere muss extern synchronisiert werden. Insbesondere hat die Standardbibliothek noch keine threadsicheren Container (ab c ++ 14)

Die Antwort auf beide Beispiele ist also nein, beide erfordern eine Form der externen Synchronisation.

Sie können natürlich den Wert zweier verschiedener Elemente im Container ändern.

    
___ tag123lockfree ___ Ein Oberbegriff für Methoden und Algorithmen zum Synchronisieren von Multithread-Umgebungen oder anderen Formen verteilter Systeme ohne Verwendung von Sperren. ___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer31131915 ___

C ++ 11 sagt Folgendes über die Thread-Sicherheit von Containern in der Standardbibliothek:

  

23.2.2 Containerdatenrassen [container.requirements.dataraces]

     

Zum Zweck der Vermeidung von Datenrennen (17.6.5.9) müssen Implementierungen   Betrachte die folgenden Funktionen als const: %code% , %code% ,    %code% , %code% , %code% , %code% , %code% , %code% , %code% ,    %code% , %code% , %code% und, außer in assoziativen oder   ungeordnete assoziative Container, %code% .

     

Ungeachtet (17.6.5.9) sind Implementierungen erforderlich, um Daten zu vermeiden   Rennen, wenn der Inhalt des enthaltenen Objekts in verschiedenen Elementen   in der gleichen Reihenfolge, mit Ausnahme von %code% , werden geändert   gleichzeitig.

Das Lesen von einem Container aus mehreren Threads ist also in Ordnung, und das Modifizieren von Elementen, die sich bereits im Container befinden, ist in Ordnung (solange sie verschiedene Elemente sind).

Daher ist keine der beiden spezifischeren Fragen für %code% threadsicher:

1) Zwei Threads, die in den Vektor eingefügt werden, modifizieren den Vektor selbst - keine existierenden separaten Elemente.

2) Das Löschen eines Threads und anderes Gehen, um auf dasselbe Element zuzugreifen, ist nicht sicher, da das Löschen eines Elements aus dem Vektor keine Operation ist, die threadsicher ist (oder "frei von Datenrennen" wie der Standard) setzt es).

Um diese Operationen sicher ausführen zu können, muss das Programm eine externe Synchronisation selbst vornehmen.

    
___
1
Antwort

KDTree für Längen- / Breitengrad

Gibt es Pakete in Python, mit denen man kdtree-ähnliche Operationen für Längen- und Breitengrade auf der Oberfläche einer Kugel durchführen kann? (Dies müsste die sphärischen Abstände ebenso berücksichtigen wie den Umlauf in der Länge).     
11.05.2012, 10:08
1
Antwort

Datenstrukturelle Bootstrapping-Beispiele?

Ich habe kürzlich Okasaki und Brodals Artikel "Optimal Rein funktionale Warteschlangen ", die eine schnelle Prioritätswarteschlange basierend auf dem datenstrukturellen Bootstrapping beschreiben, bei der eine einfache und ineffiziente Datenstru...
23.03.2011, 05:44
6
Antworten

Hinzufügen von Haltbarkeit für In-Memory-Datenstrukturen

Was sind einige der beliebten Techniken, die Sie anwenden können, um Ihre In-Memory-Datenstrukturen zu verbessern? Wenn der Prozess abstürzt, können Sie alle zuvor ausgeführten Operationen für diese Datenstruktur beibehalten? Wenn meine Dat...
03.10.2008, 14:11
1
Antwort

Wo ist die "* einfachere * Echtzeit-Verkettungsarbeit" von Tarjan und Mihaescu?

Ich habe nach der Arbeit an dauerhaften catenable Deques in Echtzeit gesucht. Es gibt verschiedene Ansätze, die logarithmische Komplexitäten für die Verkettung von Deques haben, und einige, die sich bei der Konstantzeitenimplementierung amortisi...
07.05.2013, 15:22
2
Antworten

Welche Datenstruktur oder Mischung von Datenstrukturen würde ich für eine gleichzeitige Warteschlange verwenden, die Massen- und spezifische Löschungen zulässt?

Hier ist mein Problem, ich brauche eine Datenstruktur, die sich wie ein queue verhält, aber einige andere Eigenschaften hat: Ich sollte in der Lage sein, Elemente mit tag einfach zu löschen (jedes Element in dieser Warteschlange hat ei...
28.08.2012, 20:54
3
Antworten

Welche Java-Datenstruktur eignet sich am besten für das Zwei-Wege-Multi-Value-Mapping?

Ich bin relativ neu in Java und habe eine Frage, welche Art von Datenstruktur für meinen Fall am besten ist. Ich habe eine Menge von Daten, die im wesentlichen Schlüssel-Wert-Paare sind, jedoch kann jeder Wert mehreren Schlüsseln entsprechen und...
20.02.2015, 17:52
6
Antworten

mmap-ladbare Datenstrukturbibliothek für C ++ (oder C)

Ich habe eine große Datenstruktur (N & gt; 10.000), die normalerweise nur einmal (zur Laufzeit) erstellt werden muss und danach viele Male wiederverwendet werden kann, aber sie muss sehr schnell geladen werden. (Es wird für die Verarbeitung von...
20.02.2010, 09:28
2
Antworten

Graph - Quadrat eines gerichteten Graphen

Ja, das wird eine Heimarbeit sein (ich bin selbst lernend, nicht für die Universität), aber ich frage nicht nach einer Lösung. Stattdessen hoffe ich, die Frage selbst zu klären. In CLRS 3. Ausgabe , Seite 593, Akzise 22.1-5,    Das Quadra...
11.03.2012, 18:37
3
Antworten

Wie werden Vektoren, Matrizen und Datenrahmen in R implementiert? ___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ qstntxt ___

Ich habe versucht, über die verschiedenen Datenstrukturen zu lernen, die in populären Sprachen verwendet werden, wie Listen und Wörterbücher in Python, assoziative Arrays in PHP (im Wesentlichen Hash-Tabellen), Vektoren in C ++, usw.

Ich habe eine Menge Kollegen, die R religiös verwenden, und ich habe mich gefragt, wie Vektoren, Matrizen und Datenrahmen in R implementiert werden. Was sind ihre Stärken und Schwächen? Ich habe den Quellcode durchgesehen, aber ich konnte die Datenstrukturen nicht selbst finden. Wo befinden sich diese Definitionen im Quellcode?

    
___ tag123r ___ R ist eine freie, quelloffene Programmiersprache und Softwareumgebung für statistische Berechnungen, Bioinformatik, Visualisierung und allgemeine Datenverarbeitung. Stellen Sie minimale, reproduzierbare, repräsentative Beispiele für Ihre Fragen bereit. Verwenden Sie dput () für Daten und geben Sie alle Nicht-Basis-Pakete mit Bibliotheksaufrufen an. Bilder für Daten oder Code nicht einbetten, eingerückte Codeblöcke verwenden. Verwenden Sie für statistische Fragen http://stats.stackexchange.com. ___ tag123datastrukturen ___ Eine Datenstruktur ist eine Möglichkeit, Daten so zu organisieren, dass bestimmte Eigenschaften dieser Daten effizient abgefragt und / oder aktualisiert werden können. ___ answer13957361 ___

Wie bereits erwähnt, schauen Sie sich auch das Handbuch "R internals" an als diesen Teil von "Writing R extensions" .

    
___ answer41975423 ___

Ein bisschen spät, aber wollte einen Fehler mit einer der anderen Antworten aufzeigen und eine explizite Antwort geben. Sehen Sie sich das Handbuch für Internes an:

Ссылка

Lesen Sie den Anfang dieses Abschnitts und den Eintrag für 'INTSXP'. Es scheint, dass ganzzahlige Vektoren als ein Array von C int implementiert sind. Ähnlich für 'REALSXP' und 'CHARSXP'.

Die Implementierung als verknüpfte Listen wäre zu langsam gewesen.

    
___ answer13978972 ___

Von R Internals, 1.1 SEXPs:

  

... die Grundbausteine ​​von R-Objekten werden oft Knoten genannt ... Beide Typen von Knotenstrukturen haben als ihre ersten drei Felder einen 32-Bit-spxinfo-Header und dann drei Zeiger (zu den Attributen und dem vorherigen und nächsten Knoten in einer doppelt verknüpften Liste)

Daher sind Vektoren in R als doppelt verknüpfte Liste implementiert. Und es scheint sogar, dass es keine Datenstruktur gibt, die kleiner als eine verknüpfte Liste mit einem einzigen Knoten ist. Dies wird offensichtlich durch:

%Vor%

Wie von anderen erwähnt: %code% hat %code% und %code% und %code% hat die Quelle für %code% . Zusätzlich enthält %code% die Quelle für %code% und %code% enthält die Quelle für %code% .

Während viele Dinge, die sich abspielten, über meinem Kopf lagen, scheint es offensichtlich, dass eine Matrix einfach eine doppelt verknüpfte Liste doppelt verknüpfter Listen ist. Ich glaube (obwohl ich nicht sicher bin), dass Zeilen- und Spaltennamen (wie die in einem Datenrahmen gespeicherten) in den 'Attributen' jeder Liste gespeichert sind.

Die Antwort auf die "Was die Stärken und Schwächen" der Implementierung der Datenstrukturen wäre, dass (aus meinem begrenzten Wissen) doppelt verknüpfte Listen eine Stärke darin haben, dass die dynamische Speicherzuweisung einfacher ist und keinen Overhead erfordert Kopieren und Neuzuweisen eines gesamten Arrays, und die Schwäche ist, dass (abhängig davon, wie viele Zeiger auf die Liste sind: Kopf, Schwanz, Mitte, Viertel usw.) der Zugriff auf einen zufälligen Wert %code% den Overhead des Iterierens in Anspruch nehmen kann mehrere Elemente vor dem gewünschten gefunden.

Stimmt das?

    
___

Ich habe versucht, über die verschiedenen Datenstrukturen zu lernen, die in populären Sprachen verwendet werden, wie Listen und Wörterbücher in Python, assoziative Arrays in PHP (im Wesentlichen Hash-Tabellen), Vektoren in C ++, usw. Ich habe...
18.12.2012, 21:37
3
Antworten

Implementierung verschiedener, aber ähnlicher Struktur / Funktionssätze ohne Copy-Paste

Ich implementiere eine Reihe von gemeinsamen, aber nicht so trivialen (oder fehleranfälligen) Datenstrukturen für C ( hier ) und kam nur mit einer Idee, die mich zum Nachdenken brachte. Die Frage ist, wie lassen sich am besten zwei Strukture...
14.06.2012, 13:56