fortran 95 programmieren < Numerik < Hochschule < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 13:02 Mo 14.03.2005 | Autor: | blops |
hi,
ich hoffe ihr koennt mir helfen. ich arbeite nun schon seit laengerem an einem programm, das dateien vergleichen soll.
nun habe ich folgendes problem.
ich will herausbekommen, welche datensaetze in einer der beiden dateien fehlen.
also, ich dachte dabei an folgendes:
do a=1,b
do i=1,l
if(obj1(a).eq.obj2(i))then...
enddo
enddo
so, wenn diese bedingungen fuer ein objekt nicht ein einziges mal erfuellt wird, dann soll er mir sagen, fuer welches objekt dies der fall ist. nur weiss ich nicht genau wie man das programmiert.
mit .ne. funktioniert das gar nicht, weil ja die meiste zeit die objekte ungleich sind, sind in beiden dateien so an die 800 datensaetze.
bitte bitte helft mir, ich bin schon am verzweifeln.
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 12:59 Di 15.03.2005 | Autor: | highass |
Hi,
also wenn ich mir das so anschaue...würd ich dir Hashes empfehlen...
ohne verkettung also jedes wird echt abgebildet...Hab unter fortran noch nix gemacht aber hashes gibts da bestimmt ;):
myHash(obj1.key)=obj;
nicht mit arrays wie in dem ersten ansatz...
damit hast du O(1) zugriff...nun zu deinem Problem:
Iteration über den ersten Hash myHashA:
if (!myHashB(myHashA(key).key))
"myHash(key) nicht in myHashB enthalten"...
Entsprechend nochmal durch myHasB durchlaufen mit selbiger idee...
das sollte dein problem lösen in vernünftiger laufzeit...
du kannst das auch mit zwei verschateleten schleifen machen...
brauchst noch cotroll boolean der is halt immer true wenns verschieden sind u sobald zwei gleich sind false...ginge auch wär wahrscheins einfacher zu deinem bestehenden prog...
naja...
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 13:50 Di 15.03.2005 | Autor: | blops |
hi,
erstmal vielen dank fuer deine antwort. das mit den hashes geht in fortran leider nicht.
das mit der zusaetzlichen logischen variable hab ich schon versucht, das dumme ist halt, dass ich anfaenger bin und ziemlich wenig ahnung von dem zeug habe.
ich weiss nicht genau wie man die logischen variablen da so einbaut. was ich jetzt getan habe ist:
flag=0
do o=1,p
do a=1,b
if (obj1(o).eq.obj2(a))then
flag=flag+1
endif
enddo
enddo
jetzt habe ich ausserhalb der do loop folgendes versucht.
if(flag.eq.p)then
print*,'alles ok'
elseif(flag.ne.p)then
print*,'fehlt was'
endif
das funktioniert schon, das problem ist nur, dass er mir so nicht sagt, welches objekt fehlt, falls eins fehlt. und das ist ja letztendlich das, was ich wissen moechte.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 15:45 Di 15.03.2005 | Autor: | heinz |
> hi,
> erstmal vielen dank fuer deine antwort. das mit den hashes
> geht in fortran leider nicht.
Das geht auch in fortran ganz ganz sicher :)
> das mit der zusaetzlichen logischen variable hab ich schon
> versucht, das dumme ist halt, dass ich anfaenger bin und
> ziemlich wenig ahnung von dem zeug habe.
> ich weiss nicht genau wie man die logischen variablen da
> so einbaut.
Ok, ich werde dir jetzt mal eine Loesung fuer deinen Ansatz geben, wobei auch ich kein Fortran kann. Deshalb geb auch ich nur pseudocode an, in richtiges Fortran musst du es selbst umschreiben.
> was ich jetzt getan habe ist:
> flag=0
> do o=1,p
> do a=1,b
> if (obj1(o).eq.obj2(a))then
> flag=1
> endif
> enddo
if (flag.eq.0) then print* 'objekt o fehlt'
flag = 0
> enddo
Es wird somit fuer jedes Objekt o die innere Schleife durchlaufen. Ist das Objekt o gleich dem Objekt a, wird dies in flag gespeichert. Dann wird geschaut, ob flag == 0 ist. Wenn es 0 ist, heisst dies ja, dass Objekt o nicht in in der 2. Objektliste vorhanden ist und somit fehlt.
Das gleiche musst du jetzt auch noch umgekehrt machen, d.h. fuer jedes Objekt a schaun ob es in der Objektliste o ist und entsprechend fehlende Objekte wieder ausgeben.
Wenn ich mich jetzt nicht vertan hab, sollte das (bis auf syntax so funktionieren) wobei ich als Informatiker anmerken muss, dass dies eine sehr unsaubere Loesung ist, da du fuer jedes Objekt o jeweils alle Objekte a absuchen musst, also ein Aufwand von ungefaehr [mm] n^2 [/mm] (n ist die Anzahl der Objekte in der Liste). Dies ist schlecht.
Daher ein einfacher Verbesserungsvorschlag:
Du sotierst die Beiden Dateien/Listen zuerst. Dass dauert bei Quicksort oder Mergesort O(n*logn). Danach brauchst du nur noch eine Schleife durchlaufen und ueberpruefst welche Objekte nur in einer Liste vorhanden sind.
Die beste Loesung ist aber die von highass, da du da insgesamt nur einen Aufwand von O(n) hast ;)
Hoffe ich konnte dir damit helfen, viel Spass beim programmieren und ueberleg dir, es doch mit Hashes zu machen, die es auch in Fortran zu 100% gibt bzw implementierbar sind.
Nochmal zur Verdeutlichung: Wenn du in den beiden Listen/Dateien je 1000 Objekte hast, brauchst du mit deiner Methode 1000000 Schritte zur Berechnung, wenn du es mit Sortierung machst nur noch ca 3000, bei Hashes nur noch ca 1000. Also bei grossen Dateien merkt man schnell einen Unterschied ob man 2 Wochen oder 2 Stunden auf sein Ergebnis wartet ;)
MfG heinz
|
|
|
|