Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

tablice dynamiczne, wartosc wystepujaca najczesciej

Ostatnio zmodyfikowano 2012-07-24 10:32
Autor Wiadomość
Mufas
Temat założony przez niniejszego użytkownika
tablice dynamiczne, wartosc wystepujaca najczesciej
» 2012-07-20 17:51:01
jak w temacie,
mam tablice dynamiczna Nx6 wypelniona liczbami pseudolosowymi, jak najszybciej znalezc wartosc wystepujaca najczesciej w tej tablicy.
dajcie jakis pomysl bo juz spac nie moge :)
P-60713
ison
» 2012-07-20 18:31:38
jak N jest duże i nie boli Cię stała mapy to zrób sobie po prostu mapę indeksowaną przez N, która zawiera ilość wystąpień dla każdej liczby, wrzuć wszystkie elementy i potem przeleć po mapie i weź maxa z ilości wystąpień

jak N jest małe to możesz zrobić to samo tylko, że ze zwykłą tablicą indeksowaną przez N
P-60715
Badman
» 2012-07-23 09:10:17
C/C++
#include <stdio.h>
#include <stdlib.h>

#define N 10

int main( int argc, char * argv[] )
{
    int ** tablica, ** tab;
    int i, j, k;
    int licznik; // licznik wystąpień wartości elementu
    int wartosc; // wartość elementu bieżącego tablicy
    int liczba_wystapien; // liczba wystąpień wartości najczęstszej.
    int wartosc_najczestsza; // najczęstsza wartość elementów tablicy
   
    tablica =( int ** ) malloc( 6 * sizeof( int * ) );
   
    tab = & tablica[ 0 ];
    for( i = 0; i < 6; i++ )
    {
        tab[ i ] =( int * ) calloc( N, sizeof( int ) );
    }
   
    /* Wypełnienie tablicy wartościami pseudo losowymi */
    srand(( unsigned ) time( NULL ) );
    for( j = 0; j < 6; j++ )
    {
        for( i = 0; i < N; i++ )
             tab[ j ][ i ] = rand() % 100;
       
    }
   
    /* Wyświtla tablice */
    for( j = 0; j < 6; j++ )
    {
        for( i = 0; i < N; i++ )
        {
            printf( "%d\t", tab[ j ][ i ] );
        }
        printf( "\n" );
    }
   
    /* Wyszukanie najczęściej występującej wartości */
    liczba_wystapien = 0;
    for( j = 0; j < 6; j++ )
    {
        for( i = 0; i < N; i++ )
        {
            wartosc = tab[ j ][ i ];
            licznik = 0;
            for( k = 0; k < N; k++ )
            {
                if( tab[ j ][ k ] == wartosc )
                     licznik++;
               
            }
            if( licznik > liczba_wystapien )
            {
                liczba_wystapien = licznik; wartosc_najczestsza = wartosc;
            }
        }
    }
   
    printf( "Liczba wystapien liczby %d, to %d\n", wartosc_najczestsza, liczba_wystapien );
   
    /* Zwolnienie pamięci dla tablicy dynamicznej */
    for( i = 0; i < 6; i++ )
         free( tab[ i ] );
   
    free( tablica );
   
    system( "pause" );
   
    return 0;
}
P-60913
Mufas
Temat założony przez niniejszego użytkownika
» 2012-07-23 20:54:49
dzieki za natchnienie, pokombinowalem ale nie dokonca mi wychodzi
w tablicy lotto pierwszy wynik mam dobry a pozostale to 0, czyli np 15 0 0 0 0 0
a kodzik wyglada nastepujaco:
C/C++
#include <iostream>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
inline int losowanie()
{
    return( 1 +( rand() % 49 ) );
}

bool sprawdz( int podst[], int x, char d )
{
    for( int i = 0; i < x; i++ )
    {
        if( podst[ i ] == d )
             return true;
       
    }
    return false;
}

int wyszukaj_najczestsza( int ** a, int n )
{
    int licznik = 1;
    int t;
    int suma;
    int ilosc_wyst = 0;
    for( int i = 0; i < n; i++ )
    {
        for( int j = 0; j < 6; j++ )
        {
            int g = a[ i ][ j ];
            suma = 0;
            for( int k = 0; k < n * 6; k++ )
            {
               
                if( a[ i ][ k ] == g )
                {
                    suma++;
                }
            }
           
            if( suma > ilosc_wyst )
            {
                ilosc_wyst = suma;
                t = g;
            }
            licznik++;
           
        }
    }
   
    return t;
}
void zerowanie( int ** a, int n, int d )
{
    for( int i = 0; i < n; i++ )
    {
        for( int j = 0; j < 6; j++ )
        {
            char e = a[ i ][ j ];
            if( e == d )
                 a[ i ][ j ] = 0;
           
        }
    }
}

int main()
{
    srand( static_cast < unsigned int >( time( NULL ) ) );
    cout << "Program symuluje n losowan lotto i wybiera 6 liczb, ktore powtarzaja" << '\n';
    cout << " sie najczesciej" << '\n';
    int n;
    cout << "Ile losowan przeprowadzic" << '\n';
    cin >> n;
    cin.ignore();
    int s = 6;
    int test[ s ];
    int ** a = new int *[ n ];
    for( int i = 0; i < n; i++ )
    {
        a[ i ] = new int[ s ];
        for( int j = 0; j < s; )
        {
            int d = losowanie();
           
            if( sprawdz( test, j, d ) == false )
            {
                test[ j ] = d;
                a[ i ][ j ] = d;
                j++;
            }
            if( j == 5 )
            {
                for( int k = 1; k <= s; k++ )
                     test[ k ] = 0;
               
            }
        }
    }
   
    for( int i = 0; i < n; i++ )
    {
        for( int j = 0; j < s; j++ )
        {
            cout << a[ i ][ j ] << "  ";
        }
        cout << '\n';
    }
    int lotto[ 6 ];
    int t;
    cout << "Szukam liczb wystepujacych najczesciej" << '\n';
    for( int i = 0; i < 6; i++ )
    {
        lotto[ i ] = wyszukaj_najczestsza( a, n );
        int d = lotto[ i ];
        zerowanie( a, n, d );
    }
   
    for( int i = 0; i < 6; i++ )
         cout << lotto[ i ] << " ";
   
    getch();
    return 0;
}

co to jest nie tak :(
P-60941
ison
» 2012-07-23 22:57:41
@Badman
a spróbuj tego
#define N 1000000
 i zobacz po jakim czasie się skończy ;>

porównaj z tym
C/C++
#include <cstdio>
#include <ctime>
#include <cstdlib>

#define N 1000000
#define MAX_VAL 10000

int main()
{
    srand( time( 0 ) );
    int * tab[ 6 ];
    for( int i = 0; i < 6; ++i ) {
        tab[ i ] = new int[ N ];
    }
    for( int i = 0; i < 6; ++i ) {
        for( int j = 0; j < N; ++j ) {
            tab[ i ][ j ] = rand() % MAX_VAL;
        }
    }
    int * tmp = new int[ MAX_VAL ];
    for( int i = 0; i < MAX_VAL; ++i ) {
        tmp[ i ] = 0;
    }
    for( int i = 0; i < 6; ++i ) {
        for( int j = 0; j < N; ++j ) {
            ++tmp[ tab[ i ][ j ] ];
        }
    }
    int maxIndex = - 1;
    for( int i = 0; i < MAX_VAL; ++i ) {
        if( maxIndex < 0 || tmp[ i ] > tmp[ maxIndex ] ) {
            maxIndex = i;
        }
    }
    printf( "Wartosc %d. Ilosc wystapien: %d.\n", maxIndex, tmp[ maxIndex ] );
}
P-60948
diego997
» 2012-07-23 23:47:23
Ale rzeźnik @ison,mój trochę przydługi, ale spędziłem nad tym godzinę więc też wstawię ;p

C/C++
#include <conio.h>
#include <iostream>
#include <time.h>
#include <vector>

using namespace std;

int main()
{
    srand( int( time( NULL ) ) );
    const int rozmiar_x = 6;
   
    vector < int > counter; //Zmienna która zliczać będzie liczby zapisane w zmiennej checked
    vector < int > checked; //Tutaj wpisywane będą wszystkie liczby bez powtórzeń
   
   
    int ** tab;
    tab = new int *[ rozmiar_x ];
   
    int rozmiar_y;
   
    cout << "Podaj rozmiar tablicy w pionie: ";
    cin >> rozmiar_y;
   
    for( int i = 0; i < rozmiar_x; i++ )
         tab[ i ] = new int[ rozmiar_y ];
   
    cout << "Utworzono macierz [" << rozmiar_x << "][" << rozmiar_y << "]" << endl;
    cout << "Nacisnij dowolny klawisz aby wypelnic liczbami" << endl;
    getch();
   
    for( int x = 0; x < rozmiar_x; x++ )
    for( int y = 0; y < rozmiar_y; y++ )
    {
        tab[ x ][ y ] = rand() % 11;
    }
   
   
   
    cout << "Wypelenianie zakonczone, nacisnij dowolny klawisz aby wypisac liczbe\n"
    "ktora wystepowala najczesciej\n" << endl;
    getch();
   
   
    for( int x = 0; x < rozmiar_x; x++ ) //Wypełnianie counter i checked
    {
        for( int y = 0; y < rozmiar_y; y++ )
        {
            int good = 1;
           
            for( int k = 0; k < counter.size(); k++ )
            {
                if( tab[ x ][ y ] == checked[ k ] ) //Gdy liczba się powtózy zostaje zwiększona o 1
                {
                    counter[ k ] += 1;
                    good = 0;
                }
            }
            if( good ) //Liczby się nie powtórzyły
            {
                checked.push_back( tab[ x ][ y ] );
                counter.push_back( 1 );
            }
           
           
        }
    }
   
   
    int temp = counter[ 0 ];
   
    for( int i = 0; i < counter.size(); i++ ) //Szukanie największej wartosci counter
    {
        if( i == counter.size() - 1 )
             break;
       
        if( temp < counter[ i + 1 ] )
             temp = counter[ i + 1 ];
       
    }
   
    for( int i = 0; i < checked.size(); i++ ) //Szukanie liczby ktora się się najwiecej razy powtórzyla
    {
        if( counter[ i ] == temp )
             cout << checked[ i ] << endl;
       
    }
   
   
    getch();
}




EDIT:: @LOL Ison twoje się kompiluje zaledwie jedną sekundę moje 30 sek ;p
EDIT:: JEDNAK 5 sekund ale to i tak słabo ;p

P-60951
ison
» 2012-07-24 00:07:20
@diego Twoje rozwiązanie jest dobre dla bardzo małych liczb wylosowanych
tab[ x ][ y ] = rand() % 11;
 zamień na
tab[ x ][ y ] = rand() % 10000;
to będzie się 'trochę' dłużej wykonywać ;)
u mnie nie muszę sprawdzać czy jakaś liczba już wystąpiła czy nie, po prostu tab[x] to ilość wystąpień liczby x
P-60953
diego997
» 2012-07-24 00:13:31
Faktycznie masakra ;p Jutro sobie twój przeanalizuje
P-60954
« 1 » 2
  Strona 1 z 2 Następna strona