kleinster wert

Diskutiere kleinster wert im Developer Network Forum im Bereich Hardware & Software Forum; Hallo ich beschäftige mich gerade mit ner netten aufgabe. und zwar ich hab z.b. mehrere variablen bzw. ein array A(1-n). nun will ich den...
  • kleinster wert Beitrag #1
A

axel_foley

Bekanntes Mitglied
Dabei seit
02.05.2007
Beiträge
130
Reaktionspunkte
0
Hallo

ich beschäftige mich gerade mit ner netten aufgabe.
und zwar ich hab z.b. mehrere variablen bzw. ein array A(1-n).
nun will ich den kleinsten wert ermitteln.

dabei muss ich alle vergleichen und mir dann die kleinste merken.

das ist eigentlich kein problem, nur mal zur ersten frage gibt es da irgend eine möglichkeit, damit ich das so ressourcensparend wie möglich arbeitet.
weil immer wenn ich einer variable einen wert zuweise bzw. einen vergleich durchführe kostet das zeit. und diese habe ich nicht :ja:

also, die werte sind immer größer 0 und kleiner gleich 1.
die anzahl der werte weis ich im vorhinein nicht.

mein vorschlag wäre

Code:
private double minwert(double[] a)
{
  double tmp = 1;
  foreach (double i in a)
  {
     if (i < tmp)
     {
        tmp = i;
     }
  }
  return tmp;
}

wird er schneller wenn ich statt double single nehme?

achja, ich weis, das er im prinzip kaum zeit bracuht, aber das problem ist die menge. er rennt wahscheinlich paar millionen bis milliarden mal diese funktion durch und dann kommt noch dazu, das es jeweils bis 50 zahlen sein können.

habs zwar unter C# noch nicht getestet aber unter VBa ist es extrem lahm die komplette berechnung.

cu
axel
 
  • kleinster wert Beitrag #2
fox99

fox99

Bekanntes Mitglied
Dabei seit
27.11.1999
Beiträge
3.948
Reaktionspunkte
27
Ort
Omicron Persei 8
wird er schneller wenn ich statt double single nehme?
vielleicht, aber wenn, dann sicher nicht in dem maße, wie du es benötigst. du hast nur eine chance, wenn du die schleife verschwinden lassen kannst.

du könntest z.b. den min-wert für ein array an einer extra stelle speichern und beim hinzufügen von werten ihn dann updaten. oder vielleicht kannst du dafür sorgen das die arrays immer sortiert sind, so das der 1. wert im array immer der min-wert ist.

da wir leider dein genaues problem nicht kennen, können wir dir schlecht optimierungsmöglichkeiten zeigen. es läuft aber darauf hinaus, eine stelle zu finden, an der ein mehraufwand zum pflegen des min-wertes nicht weh tut.
 
  • kleinster wert Beitrag #3
A

axel_foley

Bekanntes Mitglied
Dabei seit
02.05.2007
Beiträge
130
Reaktionspunkte
0
vielleicht, aber wenn, dann sicher nicht in dem maße, wie du es benötigst. du hast nur eine chance, wenn du die schleife verschwinden lassen kannst.

du könntest z.b. den min-wert für ein array an einer extra stelle speichern und beim hinzufügen von werten ihn dann updaten. oder vielleicht kannst du dafür sorgen das die arrays immer sortiert sind, so das der 1. wert im array immer der min-wert ist.

da wir leider dein genaues problem nicht kennen, können wir dir schlecht optimierungsmöglichkeiten zeigen. es läuft aber darauf hinaus, eine stelle zu finden, an der ein mehraufwand zum pflegen des min-wertes nicht weh tut.


herzlichen dank für diese idee.

also habe es gerade getestet.

und zwar bei 5 Werten und 1mio durchläufen ist er bei single gegenüber double um 100ms schneller :D
werde nun mal die berechnung nicht auf double aufbauen sondern auf single.

zur aussage:
"da wir leider dein genaues problem nicht kennen, können wir dir schlecht optimierungsmöglichkeiten zeigen. "
da ich gerade das komplette system neu aufbaue versuce ich mal auf allen ecken was rauszuhohlen die idee mit dem sortieren, wäre der hammer.
nur das problem von anfang ist mal, dass die daten in einer matrix gespeichert sind, und ich habe je zeile bzw. spalte einen bestimmten wert den ich betrachten muss.

aber vorerst danke für die hilfe, sollte ich bei nem anderen problem stecken melde ich mich

axel
 
  • kleinster wert Beitrag #4
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Je nach geforderter Genauigkeit und Wertebereich könnte man auch überlegen, die Zahlen mit einem Faktor zu multiplizieren und auf int oder long überzugehen.
Nur zur Illustration; wenn du z.B. schon weißt, dass deine (Mess)werte nur auf drei Nachkommastellen genau sind, könnte man einfach vorher die Werte mal 1000 nehmen und auf Ganzzahlen konvertieren. Das muss natürlich schon an der Stelle geschehen, wo die Zahlen berechnet werden; sonst musst du ja trotzdem das ganze Array durchgehen. ;)

Geschwindigkeitsgewinne würden sicher auch Sprachen wie C bringen. Ohne VBa so genau zu kennen (dafür aber VB), würde ich vermuten, dass da locker ein Faktor 10 oder mehr drin ist. Auch zwischen Ausführung in z.B. VB und der kompilierten exe sind gewaltige Unterschiede. Ebenso wie zwischen einer Debug- und einer Release-Build in C noch Faktor 5-10 rauszuholen ist.
 
  • kleinster wert Beitrag #5
A

axel_foley

Bekanntes Mitglied
Dabei seit
02.05.2007
Beiträge
130
Reaktionspunkte
0
Je nach geforderter Genauigkeit und Wertebereich könnte man auch überlegen, die Zahlen mit einem Faktor zu multiplizieren und auf int oder long überzugehen.
Nur zur Illustration; wenn du z.B. schon weißt, dass deine (Mess)werte nur auf drei Nachkommastellen genau sind, könnte man einfach vorher die Werte mal 1000 nehmen und auf Ganzzahlen konvertieren. Das muss natürlich schon an der Stelle geschehen, wo die Zahlen berechnet werden; sonst musst du ja trotzdem das ganze Array durchgehen. ;)

Geschwindigkeitsgewinne würden sicher auch Sprachen wie C bringen. Ohne VBa so genau zu kennen (dafür aber VB), würde ich vermuten, dass da locker ein Faktor 10 oder mehr drin ist. Auch zwischen Ausführung in z.B. VB und der kompilierten exe sind gewaltige Unterschiede. Ebenso wie zwischen einer Debug- und einer Release-Build in C noch Faktor 5-10 rauszuholen ist.

boa,

das war jetzt echt hilfreich.
also wenn das dann eine fertige exe ist und noch schneller wäre , dann ist das ein hammer. also C# ist wesentlich schneller als VBA, das konnte ich schon testen.

nun zum lezten punkt ich werde probieren statt 32bit gleitkomma eine 16bit ganzzahl zu verwenden :D
4 nachkommastellen müssten reichen :victory:

axel
 
  • kleinster wert Beitrag #6
N

nic_power

Senior Moderator
Dabei seit
27.12.2000
Beiträge
7.838
Reaktionspunkte
2
Hallo,

bevor Du jetzt anfängst die Routine zum Ermitteln des Minimums zu optimieren, solltest Du dir das Gesamtproblem genauer anschauen:

1) Wie lange läuft Dein Programm insgesamt? Macht es überhaupt Sinn, an irgendeiner Stelle 100ms herauszuholen?

2) Immer berücksichtigen, dass heutzutage eine Integer-Berechnung nicht notwendigerweise schneller ist als Fließkommaarithmetik. Im Zweifelsfall bringt daher ein Umschwenken nichts, da die notwendigen Konvertierungen die gewonnene Zeit wieder auffressen!

Am einfachsten wäre es, bereits beim Erstellen der Arrays das Minimum zu ermitteln (und das Array - sofern möglich - zu sortieren).

Ansonstwn rüde ich auf eine entsprechende Bibliothek zurückgreifen, die MMX/SSE unterstützt, da diese Erweiterungen bereits Instruktionen für das Ermitteln eines Minimums bereitstellen (MINSS/MINPS/PMIN*). Alternativ kannst Du das natürlich selbst kodieren, die Frage ist nur, ob sich der Aufwand lohnt.

Nic
 
  • kleinster wert Beitrag #7
A

axel_foley

Bekanntes Mitglied
Dabei seit
02.05.2007
Beiträge
130
Reaktionspunkte
0
Hallo,

bevor Du jetzt anfängst die Routine zum Ermitteln des Minimums zu optimieren, solltest Du dir das Gesamtproblem genauer anschauen:

1) Wie lange läuft Dein Programm insgesamt? Macht es überhaupt Sinn, an irgendeiner Stelle 100ms herauszuholen?

2) Immer berücksichtigen, dass heutzutage eine Integer-Berechnung nicht notwendigerweise schneller ist als Fließkommaarithmetik. Im Zweifelsfall bringt daher ein Umschwenken nichts, da die notwendigen Konvertierungen die gewonnene Zeit wieder auffressen!

Am einfachsten wäre es, bereits beim Erstellen der Arrays das Minimum zu ermitteln (und das Array - sofern möglich - zu sortieren).

Ansonstwn rüde ich auf eine entsprechende Bibliothek zurückgreifen, die MMX/SSE unterstützt, da diese Erweiterungen bereits Instruktionen für das Ermitteln eines Minimums bereitstellen (MINSS/MINPS/PMIN*). Alternativ kannst Du das natürlich selbst kodieren, die Frage ist nur, ob sich der Aufwand lohnt.

Nic

Öhm, zu dem Thema.
dadurch das ganze System neu geschrieben wird, gibt es im prinzip keine konvertierungen, da ich statt komma einfach ganzzahl rechne.
bis ich die daten habe, welche ich für diese Berechnung brauche, läufen die Daten schon durch zig berechnungen.

ich habe eine perfekte lösung schon gefunden, da wird nicht immer neu berechnet sondern ich bekomme im vorhinein immer das minimum in die rekursive funktion übergeben, so erspare ich mir pausenlos ein neues berechnen des minimums(Da sich einzelne elemte im Array austauschen) und dadurch schaffe ich noch einige viele vorteile für mich.

ich habe nun aber ein weiteres Problem.
ich habe schnell ein Beispiel erstellt, kann sein, das es etwas sehr schlecht ist, aber hoffentlich verständlich.

Code:
using System;
using System.Text;
using System.Windows.Forms;

namespace Progie
{
    class Person
    {
        private Int32 VarSVNR;
        private Byte VarAnzahlTelefonNummer;
        private String[] VarTelefonNummer = new String[2];

        public Int32 SVNR
        {
            get { return VarSVNR; }
            set { VarSVNR = value; }
        }
        public Byte AnzahlTelefonNummer
        {
            get { return VarAnzahlTelefonNummer; }
            set { VarAnzahlTelefonNummer = value; }
        }
        public String this[Byte Index]
        {
            get
            {
                return VarTelefonNummer[Index];
            }
            set
            {
                VarTelefonNummer[Index] = value;
            }
        }
    }
    class Programm
    {
        public void Main()
        {
            Person[] test = new Person[2];
            test[1][1] = 2;
            MessageBox.Show(test[1][1].ToString());
            MessageBox.Show(test[1][2].ToString());
        }
    }
}

(Redimensionieren der Telefonnummern ahbe ich erstmal nciht eingebaut)

mein Problem ist, wie komme ich auf die 2 Telefonnummern, wenn ich den Benutzerdefinierten Datentypen als Array verwende?

axel
 
Thema:

kleinster wert

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.172
Mitglieder
55.878
Neuestes Mitglied
Satan666
Oben