De questiti sugil insiemi e sulle date!

mercoledì 11 marzo 2009 - 18.29

Andrl Profilo | Junior Member

Ciao Ragazzi! avrei due quesiti da porvi!


Mi sapete dire come fare .. es. ho due insiemi A e B contenenti ognuno n elementi a=(1,2,3,4) B=(2,3)
in questo caso B è contenuto in A ... oviamente per insiemi cosi piccoli è facilissio con degli if! se pero' devo verificare insiemi con 1000 o 2000 elementi diventa un po lento esiste qualcosa per velocizzare???


Come faccio a sapere se un'interveallo di date è compreso o a cavallo di un'altro intervallo??

AB e CD = A CD B oppure C A D B spero di essere stato chiaro Ciao a tutti!!!

angelotv Profilo | Guru

Ciao Ragazzi! avrei due quesiti da porvi!

1° devi fare un ciclo nel secondo insieme e cercare tramite un altro ciclo l'esistenza di ogni elemento nel primo insieme, (uscendo ovviamente quanto viene trovato); il primo ciclo termina quando l'elemento non viene trovato o quando, alla fine dello stesso, tutti gli elementi vengono trovati.

2° bastano due if...

by Angelo

Andrl Profilo | Junior Member

Grazie per la risposta oviamente con questa soluzione sapevo già farlo! cercavo qualcosa di un po' piu' veloce in quanto su 3000 elementi ci mette un po! grazie comunque per l'interessamento! P.s stesso discorso per le date!!! Ciao grazie!

aiedail92 Profilo | Expert

Ciao

L'idea di fondo da cui partire è quella dell'utilizzo di due cicli, poi si possono applicare delle ottimizzazioni per evitare lavori inutili o ripetuti.

Ad esempio potresti inizialmente ordinare i due array in ordine ascendente, quindi utilizzare i due cicli come nella funzione che ti ho scritto:

private static bool IsSubSet(int[] super, int[] array) { //Ordina gli array Array.Sort(super); Array.Sort(array); //Questo è l'indice da cui iniziare a cercare l'elemento nell'array maggiore int index = 0; //Cicla sugli elementi dell'array più piccolo for (int i = 0; i < array.Length; i++) { //Salta tutti gli elementi dell'array maggiore non contenuti nel minore while (super[index] < array[i]) { //Se non ci sono più elementi nell'array maggiore, ritorna false if (++index == super.Length) return false; } //Se il valore a cui siamo arrivati è maggiore di quello che cercavamo, //l'elemento non è contenuto nell'array maggiore, quindi ritorna false if (super[index] > array[i]) return false; //Ora passa all'elemento successivo } //Abbiamo verificato che tutti gli elementi sono inclusi, possiamo ritornare true return true; }

In questo modo eviti di eseguire continui cicli sullo stesso array passando in rassegna gli stessi oggetti migliaia di volte, cosa che rende l'algoritmo molto veloce.

Per quanto riguarda il secondo problema invece, l'unico modo è proprio quello di usare degli if; se vuoi evitare di riscriverli ogni volta puoi scrivere una funzione che esegua il compito:

private static bool DateRangeOvelap(DateTime A, DateTime B, DateTime C, DateTime D) { if (B < A || D < C) throw new ArgumentException("Intervalli non validi."); if ((A < C && B < C) || (A > D && B > D)) return false; return true; }

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5