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 :) |
|
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 |
|
Badman |
» 2012-07-23 09:10:17 #include <stdio.h> #include <stdlib.h>
#define N 10
int main( int argc, char * argv[] ) { int ** tablica, ** tab; int i, j, k; int licznik; int wartosc; int liczba_wystapien; int wartosc_najczestsza; tablica =( int ** ) malloc( 6 * sizeof( int * ) ); tab = & tablica[ 0 ]; for( i = 0; i < 6; i++ ) { tab[ i ] =( int * ) calloc( N, sizeof( int ) ); } srand(( unsigned ) time( NULL ) ); for( j = 0; j < 6; j++ ) { for( i = 0; i < N; i++ ) tab[ j ][ i ] = rand() % 100; } for( j = 0; j < 6; j++ ) { for( i = 0; i < N; i++ ) { printf( "%d\t", tab[ j ][ i ] ); } printf( "\n" ); } 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 ); for( i = 0; i < 6; i++ ) free( tab[ i ] ); free( tablica ); system( "pause" ); return 0; }
|
|
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: #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 :( |
|
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 #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 ] ); }
|
|
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 #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; vector < int > checked; 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++ ) { 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 ] ) { counter[ k ] += 1; good = 0; } } if( good ) { checked.push_back( tab[ x ][ y ] ); counter.push_back( 1 ); } } } int temp = counter[ 0 ]; for( int i = 0; i < counter.size(); i++ ) { if( i == counter.size() - 1 ) break; if( temp < counter[ i + 1 ] ) temp = counter[ i + 1 ]; } for( int i = 0; i < checked.size(); i++ ) { 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 |
|
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 |
|
diego997 |
» 2012-07-24 00:13:31 Faktycznie masakra ;p Jutro sobie twój przeanalizuje |
|
« 1 » 2 |