Newsgroup: it.comp.lang.pascal
Titolo: Confronto efficiente

Ho il seguente problema:
devo confrontare un elevato numero di array per esempio cosě definiti
   TipoAlpha  : array[1..10] of 'a'..'e';
   A,B,... : TipoAlpha;
In che modo mi consigliate di procedere nel confronto per conteggiare i
caratteri in comune posti nelle medesime posizioni senza ricorrere al
classico ed esaustivo confronto di tutti i dati cioč:
............
       A:= ..... ;
       B:= ..... ;
..........
Uguali:=0;
for i:=1 to 10 do
      if A[i]=B[j] then
         inc(Uguali);
Io avrei pensato di trasformare il problema in origine in modo da avere a
che fare con una trasformazione degli  array in numeri longint univoci per
ogni combinazione,
visto che i segni sono 5 ('a'..'e') e le posizioni 10 avrň 5^10 possibili
disposizioni
univocamente determinate:
['a','a','a','a','a','a','a','a','a','a']   -->1
['a','a','a','a','a','a','a','a','a','b']   -->2
..................
['e','e','e','e','e','e','e','e','e','e']   -->9.765.625
E quindi mi troverei ora a confrontare due valori longint. Questo
permetterebbe di ricavare immediatamente l'uguaglianza di due di questi
array mediante
un confronto (uno soltanto)!!
Ma in caso di disuguaglianza in che modo risalire al numero di dati in
comune??
Cioč se per esempio
A --> #1
B --> #2
allora
Uguali=9
Altra possibilitŕ sarebbe quella di utilizzare qualche routine in assemblar
ma in questo campo lascio il posto ad altri!
Ogni consiglio č ben accetto!


Uhm... io al posto di tutto sto casino... mi stavo chiedendo... cosi come
per due variabili dello stesso tipo A, B... è possibile definire
l'operazione di uguaglianza.... per gli array non è lo stesso? :P
Esempio:
   Type  S = Array [1..10] Of Longint;
   Var A,B,C : S;
L'operazione....
    If A = B Then ..............
Non risolverebbe il problema? :P
In teoria si.... in pratica bisognerebbe sperimentare.... io sto ragionando
per induzione... e dovrebbe funzionare visto che il pascal consente il
confronto di due tipi di dato omogenei Longint, Real, Insiemi.... e quindi
anche Array.
No? :-)
Cordialmente, Cooper.

 l'operazione di uguaglianza.... per gli array non č lo stesso? :P
Mi sembra proprio di no!!!
E anche se fosse il problema č determinare oltre  all'eventuale uguaguanza
anche gli elementi uguali posti nelle medesime posizioni.
Ciao.


Se A = B allora B = A per cui è come confrontare A con se stesso, quindi non
ha senso.
Se invece, il vettore A non è uguale a B ma può contenere nella posizione k
di entrambi elementi uguali (e solo questi devono essere rilevati) allora è
sufficiente una scansione lineare del vettore mediante un ciclo FOR, con un
confronto progressivo delle rispettive celle dei due vettori di eguale
indice.
Cordialmente, Cooper.

Mi sa che si può fare... guardate qua...
Program Confronto;
Uses Crt,Dos;
Type
  Tipo = Array [1..100] Of 'a'..'e';
Var
  A,B:Tipo;
  I:Byte;
  X:Boolean;
Begin
  For I:=1 To 100 Do
  Begin
    A[I]:='b';
    B[I]:='b';
  End;
  If A=B Then
    X:=True
  Else
    X:=False;
  Write(X);
  Readln;
End.
questo funge...
ciao

 uguaguanza anche gli elementi uguali posti nelle medesime posizioni.
boh... forse non ho capito...
per uguaglianza io intendo, dati i tuoi tipi:
"per i che va' da 1 a 10, vettoreA[i] = vettoreB[i]"
quindi dato che TipoAlpha e' assimilabile ad una stringa (o per lo
meno il turbopascal la gestisce allegramente a questo modo) la
normale uguaglianza va bene anche per esso.
per sapere _quali_ elementi sono uguali e quali diversi, _devi_
controllarli uno per uno, oppure codificare in altro modo.
--
Dreadnaut
(Life would be easier if I had the source code)

Azz, mi ero scordato di verificarlo.... cmq un ringraziamento particolare a
Carletto che lo ha fatto per me... :PPP
In ogni caso, mi sembra che quanto avevo detto prima in effetti era
possibile. W LA LOGICA hehehe :-)
Cooper.
"Dreadnaut" <Drea...@liberoDALLASPAM.it> ha scritto nel messaggio
news:_m8e8.17831$fa5.5...@twister2.libero.it...



Newsgroups: it.comp.lang.pascal
Sent: Sunday, February 24, 2002 12:28 PM
Subject: Re: Confronto efficiente

Scusate ma non avevo effettuato una verifica :-( ma sono
andato ad occhio 8-).
ciao.

 "per i che va' da 1 a 10, vettoreA[i] = vettoreB[i]"
Infatti lo anche specificato:
Uguali:=0;
for i:=1 to 10 do
      if A[i]=B[j] then
         inc(Uguali);
Inoltre il problema non è tanto l'uguaglianza o meno di
due vettori ma la determinazione degli elementi in comune
posti nelle stesse posizioni.
Tanto per capirci se avessimo a che fare con una colonna totocalcio:
Colonna:array[1..13] of 0..2
dove si assume implicitamente di fare corrispondere
0-->1
1-->X
2--->2
Ci intereresserà si determinarne l'uguaglianza: 13 Punti :-)
e la disuguaglianza 0 Punti :-( ma anche il numero di punti
realizzati che risultano dall'uguaglianze dei segni posti nelle medesime
posizioni per i:=1 a 13 !
Spero di essere stato adesso, con questo esempio,. più chiaro...
Ciao.

allora o la base 5 o il ciclo... come sbattimento e sicuramente
meglio quest'ultimo... anche se magari e' poco "chic" :-)
elem_uguali := 0;
for i := 1 to 10 do
 if a[i] =b[i] then inc(elem_uguali);


Ho scaricato il pascal 7.0, ma non mi accetta gli uses.
Cosa dovrei fare? Dovrei scaricare un pascal 5.0 o un 5.5
o si può fare qualcosa?
Vi prego aiutatemi...
Ciao...
Thomas.

 wrote in message
Whfu8.31962$SR5.8...@twister1.libero.it...


 ha scritto nel messaggio
news:Whfu8.31962$SR5.8...@twister1.libero.it...
