Pseudocode für Listenüberprüfung?
Hallo, ich brauche einen Pseudocode für folgendes Szenario:
Ich habe eine liste mit N Elementen und jetzt soll diese Liste nach beispielsweise dem Wort "Katze" durchsucht werden. Aber es soll nicht alles nacheinander passieren sondern jedes Element soll synchron abgefragt werden.
Ob das schlau ist oder nicht ist erstmal egal.
Kann mir da wer weiterhelfen?
LG
3 Antworten
Aber es soll nicht alles nacheinander passieren sondern jedes Element soll synchron abgefragt werden.
Du hast nur eine begrenzte Anzahl von Prozessorkernen /Threads!
Du kannst nicht alle Elemente eines Arrays/Liste gleichzeitig abfragen! (selbst dann nicht wenn du mehrere Tasks/Threads/Jobs/Worker auf das Array zugreifen lässt.)
- https://www.geeksforgeeks.org/reading-and-writing-in-the-array-using-threads/
- https://codereview.stackexchange.com/a/178910
- http://web.mit.edu/6.031/www/sp19/classes/20-thread-safety/
Die Parallelität des Vergleichs einzelner Listenelemente in verschiedenen Threads/etc bezöge sich lediglich auf "übergebene (Einzel)Elemente" .
Das Problem bei derartigen Sachen , eine sequenzielle Routine muss erstmal die einzelnen Threads einrichten und diesen die jeweiligen Elemente zuweisen .
- https://subscription.packtpub.com/book/programming/9781800208117/9/ch09lvl1sec60/the-thread-safe-list
- https://learn.microsoft.com/en-us/dotnet/standard/collections/thread-safe/
- https://dotnettutorials.net/lesson/concurrent-collection-in-csharp/
...und das sind schon (gegenüber einem Array) hochentwickelte Listenpobjekte!
In vielen Fällen (mit kleinen Datenmengen per Listenelement) ist der Overhead für letztere Maßnahmen größer als die direkte Verarbeitung in einem Thread.
PseudoCode:
create threadsafe ReturnQueue
define threadsafe function Foo (Index,String1, String2) {
if (String1 equal String2){
add Index to ReturnQueue
}
}
Liste= Hund,Schwein,Katze //...und Millonen andere Tiere
For (i = 0, i < Liste.lengh, i++) {
start Foo (i, Liste[i],Katze) as New Tread
if (maxThreads){Wait for next Thread is possible}
)
if (all threads ready) {
forach Index in Queue {
print Liste[Index]
}
}
...ganz beachtlicher Aufwand um eine Katze zu finden... In Frameworks wie .Net bekommt man nicht viel von den ganzen Brimborium mit, weil die für Threads verantwortlichen Objekte bereits die nötigen Methoden implementiert haben.
Ansonsten einfach eine schleife ähnlich der von alexthenr14
Da Du schon Powershell-Luft geschnuppert hast eine Reale Demo zu den Tücken von alles Gleichzeitig:
Auch wenn die Job-Verarbeitung nicht wirklich mit Multithreading von .Net vergleichbar ist, so zeigt es deutlich den Overhead, welchen das einrichten einer Parallelisierung allgemein erzeugen kann. Parallel bedeutet nicht zwangsläufig schneller. Je billiger die Einzelaufgabe um so weniger Lohnt sich der Aufwand.
Das folgende Beispiel "rechnet" sich erst beim Berechnen von 1,5Mio Zufallszahlen (abhängig vom Rechner)
CountRandomNumbers= 100
#Was die Jobs tun sollen
#berechne eine Menge Zufallszahlen und ermittle die dafür benötigte Zeit
$JobAction = {
Param([int]$count)
return (Measure-Command -Expression {Get-Random (0..$count)}).TotalSeconds
}
#Teilt eine Zahl in möglichst gleiche Teile
function Split-SimilarParts{
param (
[int64]$Number=0,
[uint32]$Parts=2
)
if ($Parts){
$Rest=$Number%$Parts;
$Part=($Number-$Rest)/$Parts;
}
for ($i=1; $i -le $Parts; $i++) {
$Part+[math]::ceiling($Rest-- /$Parts);
}
}
# jetzt gehts los
#erstmal alles in einem Tread
$SingelTreadTime=&$JobAction $CountRandomNumbers
Write-Host Die singlethreaded Rechenzeit fuer $($CountRandomNumbers) Zufallszahlen = $SingelTreadTime Sekunden -fo Green
# Zeit der Jobs messen
$Startzeit = Get-Date
$AnzCores = (Get-CimInstance -ClassName Win32_Processor ).NumberOfCores #Anzahl der Prozessorkerne
#Aufgaben verteilen und starten
$MyJobs=Split-SimilarParts $CountRandomNumbers $AnzCores|
%{
Write-Host "Starte Job mit $_ Zufallszahlen" -fo darkcyan
Start-Job -ScriptBlock $JobAction -ArgumentList $_
}
#warte bis die Jobs fertig sind und hole die Ergebnisse (Zeiten, welcher Job benötigte) ab
$JobResults=@($MyJobs|Wait-Job|Receive-Job)
#Zeit fertig
$elapsedTime = ((Get-Date) - $Startzeit).TotalSeconds
$JobsTime = ($JobResults | Measure-Object -Sum).sum
$ParallSpeedPct = ($elapsedTime/$SingelTreadTime).toString('P') -replace '\.',''
Write-Host Liste der EinzelZeiten der Jobs
$JobResults
Write-Host "Die Summe der Rechenzeiten ist : $JobsTime Sekunden" -ForegroundColor Green
Write-Host "Nochmal sie Singltread Rechenzeit : $SingelTreadTime Sekunden" -fo cyan
Write-Host "Benoetigte reale Zeit fuer die Jobs war : $elapsedTime Sekunden" -ForegroundColor yellow
Write-Host "Die die komplette parralele Verarbeitungzeit : $ParallSpeedPct" gegenueber singleThraeded -ForegroundColor Cyan
pause
setze gefunden = false
starte für jedes element in der liste
wenn das element gleich "Katze" ist
setze gefunden = true
stoppe die Suche
ende wenn
ende für
wenn gefunden
gib "Katze gefunden" aus
sonst
gib "Katze nicht gefunden" aus
ende wenn
Dieser Pseudocode durchsucht die Liste synchron, d.h. jedes Element wird nacheinander abgefragt, bis das gesuchte Element gefunden wird oder bis alle Elemente durchsucht wurden. Sobald das gesuchte Element gefunden wird, wird die Suche gestoppt und das Programm gibt aus, dass die "Katze gefunden" wurde. Wenn das gesuchte Element nicht gefunden wird, gibt das Programm aus, dass die "Katze nicht gefunden" wurde.
ich hätte aber gerne den Index der liste wo das Suchwort drin steht. Danke Erstmal ^^
Let Liste =array[wuffwuff, mize, katze];
For(i = 0, i < Array.lengh(Liste), i++ )[
If "katze" == liste[i] [
Write "i"
]
]