Usuwanie duplikatów z tablicy

O jezykach programowania w platformach i nie tylko.
MkubuxK
Pasjonat
Pasjonat
Posty: 1051
Rejestracja: 20 maja 2009, 18:27

Usuwanie duplikatów z tablicy

Nieprzeczytany post autor: MkubuxK »

Wklejam poniżej kod. Być może komuś się przyda.

shiftArray - pierwotna tablica z danymi
corShiftArray - tablica bez duplikatow

Kod: Zaznacz cały

//sortujemy
ArraySort(shiftArray);

// zamiast duplikatu umieszczamy "0" w nowej tablicy
for(int a=0;a<ArraySize(shiftArray);a++){
    
    
         if(shiftArray[a]!=shiftArray[a+1]){
               
               corShiftArray[a]=shiftArray[a];
                     
         }
    
    }
    
    ArraySort(corShiftArray);
    
    int b=0;
    int counter=0;

      //liczymi ile "0" znajduje sie w naszej tablicy
    while(corShiftArray[b]==0){
         b++;
         counter++;
    }   

// sortujemy by byly na koncu
    ArraySort(corShiftArray,WHOLE_ARRAY,0,MODE_DESCEND);

// zmniejszamy rozmiar tablicy o zera na koncu
    ArrayResize(corShiftArray,(ArraySize(corShiftArray)-counter));
    
    
Czy zna ktoś rozwiązanie do usunięcia duplikatów bez sortowania ?
fx-forum

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

hmmmm ... tak sie patre na Twoj kod i mam wrazenie ze nie dziala tak jak chcesz ;) np to ponizej :

Kod: Zaznacz cały

//liczymi ile "0" znajduje sie w naszej tablicy 
    while(corShiftArray[b]==0){ 
         b++; 
         counter++; 

dodadkowo komentujesz ze zamiast duplikatu wpisujesz zero a tego w kodzie nie robi ;)

....

a nielepiej byloby tablice corShiftArray zainicjowac jako bezwymiarowa i w kodzie dopisywac do niej ??

Kod: Zaznacz cały

if(shiftArray[a]!=shiftArray[a+1]){ 
                ArrayResize(corShiftArray,ArrayRange(corShiftArray,0)+1);// lub Size jak wolisz 
               corShiftArray[a]=shiftArray[a]; 
                      
         } 
wtedy to ponizej juz Ci nie jest potrzebne :)

Kod: Zaznacz cały

int b=0; 
    int counter=0; 

      //liczymi ile "0" znajduje sie w naszej tablicy 
    while(corShiftArray[b]==0){ 
         b++; 
         counter++;     }    

// sortujemy by byly na koncu 
    ArraySort(corShiftArray,WHOLE_ARRAY,0,MODE_DESCEND); 

// zmniejszamy rozmiar tablicy o zera na koncu 
    ArrayResize(corShiftArray,(ArraySize(corShiftArray)-counter)); 


Dodano po 9 minutach:

wtedy kod by wygladal tak:

Kod: Zaznacz cały

ArraySort(shiftArray); 
int b = 0;
for(int a=0;a<ArraySize(shiftArray);a++)
{ 
   if(shiftArray[a]!=shiftArray[a+1])
   { 
      ArrayResize(corShiftArray,ArrayRange(corShiftArray,0)+1);// lub Size jak wolisz 
      corShiftArray[b]=shiftArray[a]; 
      b++;
   } 
} 
pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

MkubuxK
Pasjonat
Pasjonat
Posty: 1051
Rejestracja: 20 maja 2009, 18:27

Nieprzeczytany post autor: MkubuxK »

Pierz Andrzej pisze:hmmmm ... tak sie patre na Twoj kod i mam wrazenie ze nie dziala tak jak chcesz ;) np to ponizej :

Kod: Zaznacz cały

//liczymi ile "0" znajduje sie w naszej tablicy 
    while(corShiftArray[b]==0){ 
         b++; 
         counter++; 

dodadkowo komentujesz ze zamiast duplikatu wpisujesz zero a tego w kodzie nie robi ;)
Jeśli array jest posortowane, zera są na początku i wrzucimy to w pętle z której wyrzuca po napotkaniu innej liczby aniżeli 0 a dodaje do licznika po napotkaniu zera to powinno dobrze zliczyć.


To samo tyczy się następnego. Jeśli porównujemy dwa kolejne elementy w tablicy i tablica jest posortowana i jeśli będą się ze sobą równały to wrzucamy 0 do tego pierwszego i tak w kółko to również powinno być ok. Sprawdzałem kod i dobre dane wyprowadzał.


Nie zmienia to faktu że Twój kod jest lepszy i bardzo dziękuję za poprawkę. Należy pisać kod zwięzły i szybki także wymienię swoją funkcję na Twoją.
fx-forum

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

MkubuxK pisze:Jeśli array jest posortowane, zera są na początku i wrzucimy to w pętle z której wyrzuca po napotkaniu innej liczby aniżeli 0 a dodaje do licznika po napotkaniu zera to powinno dobrze zliczyć.
no fakt nie zobaczylem sortowania wczesniej :) ... zwracam honor .... zmeczenie daje znac o sobie :)

pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

Nieprzeczytany post autor: crn »

Wiecie moze jakim algorytmem funkcja mql sortuje talbice ?

Awatar użytkownika
gieroj
Stały bywalec
Stały bywalec
Posty: 33
Rejestracja: 25 lut 2010, 16:11

Nieprzeczytany post autor: gieroj »

int ArraySort( double&array[], int count=WHOLE_ARRAY, int start=0, int sort_dir=MODE_ASCEND)
Sorts numeric arrays by first dimension. Series arrays cannot be sorted by ArraySort().
"Dzień dobry, mam na imię Paweł i jestem przegrywającym."

MkubuxK
Pasjonat
Pasjonat
Posty: 1051
Rejestracja: 20 maja 2009, 18:27

Nieprzeczytany post autor: MkubuxK »

crn pisze:Wiecie moze jakim algorytmem funkcja mql sortuje talbice ?
Może tak jak w Javie dobiera optymalny algorytm dla wielkości tablicy ?

Poniżej znalazłem algorytm QuickSort dla mql wraz z funkcją mierzącą czas sortowania.


Można zmierzyć jak szybko posortuje jakąś tablicę a następnie zaimplementować to samo dla funkcji ArraySort()

int begin=GetTickCount();
ArraySort(Tablica);
int end=GetTickCount();

Print("Czas realizacji zlecenia wyniósł: "+(end-begin)+" ms");

Przynajmniej sprawdzi czy algorytm sortowania jest porównywalnie wydajny do QuickSorta.

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                               BehchQuickSort.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
//+------------------------------------------------------------------+
//| быстрая сортировка double                                        |
//+------------------------------------------------------------------+
void QuickSort(double& item[],int left,int right)
  {
   int    i, j;
   int    center;
   double x;
//----
   i=left;
   j=right;   
   center=item[(left+right)/2];
   while(i<=j)
     {
      while(item[i]<center && i<right) i++;
      while(item[j]>center && j>left)  j--;
      if(i<=j)
        {
         x=item[i];
         item[i]=item[j];
         item[j]=x;
         i++; j--;
        }
     } 
   if(left<j)  QuickSort(item, left, j);
   if(right>i) QuickSort(item, i, right);
  }
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
   int    file;
   double data[];
   int    length=0;
   int    start,total;
   int    min,sec,hsec,t=0;
//----
   Print("QuickSort test.\nLoading data...!");
   file=FileOpen("array_int.dat",FILE_BIN|FILE_READ);
   if(file<0)
     {
      Print("file array_int.dat not found.\n");
      return(-1);
     }
//----
   length=FileSize(file)/8;
   ArrayResize(data,length);
   FileReadArray(file,data,0,length);
   FileClose(file);
//---- start sorting
   start=GetTickCount();
//   qsort(data, length,sizeof(int),cmp);
//   QuickSort<int>(data,0,length-1);
//   ArraySort(data);
   QuickSort(data,0,length-1);
   total=GetTickCount()-start;
//---- human presentation
   min=total/60000;
   t=total%60000;
   sec=t/1000;
   hsec=t%1000;
//---- outpit results
   Print("Sorting int array[",length,"] time is ",min," min ",sec," sec ",hsec," msec");
//----
   return(0);
  }
//+------------------------------------------------------------------+
fx-forum

ODPOWIEDZ