Pseudocode für Listenüberprüfung?

FaTech  30.03.2023, 12:59

Stell uns deinen Pseudocode zur Verfügung, damit wir darauf eingehen können. Deine Hausaufgaben sind deine und nicht unsere Aufgaben

Lenzer66u 
Fragesteller
 30.03.2023, 13:01

hab keinen da ich in Pseudocode nicht gut bin. ist keine Hausaufgabe ^^

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.)

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 .

...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.

Woher ich das weiß:Recherche
Lenzer66u 
Fragesteller
 30.03.2023, 11:14

ich hätte aber gerne den Index der liste wo das Suchwort drin steht. Danke Erstmal ^^

0

Let Liste =array[wuffwuff, mize, katze];

For(i = 0, i < Array.lengh(Liste), i++ )[

If "katze" == liste[i] [

Write "i"

]

]