[20] Concurs - Numar prim "majoritar"

[20] Concurs - Numar prim "majoritar"

Postby nomemory » 21 Nov 2011, 22:39

Poveste:
Nineta este angajata NASA . Principala ei ocupatie este sa analizeze semnalele radio venite din spatiu .
In fiecare dimineata primeste de la sefi liste de milioane de numere aparent aleatoare iar ei ii revine sarcina sa gaseasca un "pattern" .

Nu a progresat foarte mult si nici nu crede in extraterestri, dar a gasit "o anomalie" pe care doreste sa o tina sub observatie, anume:

"Submultimea numerelor prime din multimea totala de numere are un element majoritar." Adica exista un numar prim "special" care se repeta de mai mult de P/2 ori, unde P reprezinta dimensiunea submultimii numerelor prime .

Ajut-o pe Nineta sa gaseasca acest numar prim majoritar .

Date de intrare ("bitcell20.in"):
Un fisier ce contine M linii, pe fiecare linie exista un singur numar N "aparent" aleator .
Cunoasteti (fara a fi nevoie sa validati) ca exista in mod cert un numar prim "majoritar" .

Date de iesire "bitcell20.out":
O singura linie ce contine valoarea numarului prim majoritar .

Limitari:
0 <= N <= 10 000 000 (intervalul in care se gasesc numerele "aparent" aleatoare)
10 <= M <= 5 000 000 (numarul total de numere "aparent" aleatoare)

Exemplu:
Date de intrare:

Date de iesire:


Explicatii:
Din multimea de numere "aparent" aleatoare primite de Nineta, avem o submultime de numere prime: {3, 3, 2, 5, 5, 3, 3, 3, 7} de dimensiune 9 . Observam ca numarul prim 3 se repeta de cele mai multe ori (5 ori), iar 5 > 9/2 => 3 este numarul prim majoritar.

Timp de lucru:
Data inceput : 22/11/2011
Data finalizare: 1/12/2011
Desemnare castigator: 2/11/2011

Altele:
"Problema" nu e total originala ci combina doua exercitii clasice .
"Dificultatea" consta in optimizarea solutiei pentru numerele mari .
0,0p / 0 votes
User avatar
nomemory
Bit
 
Joined: 24 Aug 2011
Location: Bucuresti
Status: 2

Re: [20] Concurs - Numar prim "majoritar"

Postby Payne » 21 Nov 2011, 23:21

O intrebare, conditia nº de aparitii > P/2 e obligatorie? De exemplu avem 50 de numere prime si numarul prim cu cele mai multe aparitii are 20 de aparitii in total.
0,0p / 0 votes
Suit up!

Image
User avatar
Payne
Byte
 
Joined: 04 Jan 2010
Location: 0x7C00
Status: 17

Re: [20] Concurs - Numar prim "majoritar"

Postby cata45 » 21 Nov 2011, 23:26

nomemory wrote:Cunoasteti (fara a fi nevoie sa validati) ca exista in mod cert un numar prim "majoritar" .
0,0p / 0 votes
The EARTH without ART is just EH.
User avatar
cata45
Byte
 
Joined: 02 Sep 2010
Status: 9

Re: [20] Concurs - Numar prim "majoritar"

Postby nomemory » 21 Nov 2011, 23:31

@Payne, da e o obligatoriu . In datele de intrare exista in mod cert un astfel de numar . Daca dimensiunea submultimii de numere prime este 50, poti sa te bazezi linistit pe faptul ca unul din elemente apare de minim 26 de ori .
0,0p / 0 votes
User avatar
nomemory
Bit
 
Joined: 24 Aug 2011
Location: Bucuresti
Status: 2

Re: [20] Concurs - Numar prim "majoritar"

Postby Payne » 22 Nov 2011, 00:14

S-ar putea sa ne pui la dispozitie un fisier cu numere mai mare?


Vin cu varianta mea in -> http://filebeam.com/9ab7308e4cd85d7eb6e0bca253198e43


L.E Codul sursa cui il trimitem?
1p / 1 votes
Last edited by Payne on 22 Nov 2011, 00:21, edited 1 time in total.
Suit up!

Image
User avatar
Payne
Byte
 
Joined: 04 Jan 2010
Location: 0x7C00
Status: 17

Re: [20] Concurs - Numar prim "majoritar"

Postby nomemory » 22 Nov 2011, 00:18

Poti sa mi-l trimiti mie daca vrei .
Fac maine niste teste mai convingatoare si urc aici fisierele .
0,0p / 0 votes
User avatar
nomemory
Bit
 
Joined: 24 Aug 2011
Location: Bucuresti
Status: 2

Re: [20] Concurs - Numar prim "majoritar"

Postby cata45 » 22 Nov 2011, 14:28

Daca faci testele ar fi bine sa specifici cam care este timpul de raspuns asteptat pentru fiecare test. :)
0,0p / 0 votes
The EARTH without ART is just EH.
User avatar
cata45
Byte
 
Joined: 02 Sep 2010
Status: 9

Re: [20] Concurs - Numar prim "majoritar"

Postby nomemory » 22 Nov 2011, 16:15

Fisierele de test:

Fisierul 0
t0_numbers_10000_primes_3000_majority_1600_answer_13.in

Fisierul1
t1_numbers_1000000_primes_100000_majority_60000_answer_5.in

Fisierul 2
t2_numbers_1000000_primes_500000_majority_250001_answer_7.in

Fisierul 3
t3_numbers_5000000_primes_2000000_majority_1000500_answer_11.in

Numele fisierului ne da informatii despre ce se gaseste in interior:
  1.  
  2. t<test>_
  3. numbers_<numarul total de numere>_
  4. primes_<numarul total de numere prime>_
  5. majority_<de cate ori apare numarul majoritar>
  6. _answer_<raspunsul corect>.in
  7.  


(Ca sa le salvati: Save Link As .
Unele sunt foarte mari)

PS:
Incercati sa scoateti timpi de sub 2 secunde (depinde mult de calculator...) pentru 5 milioane de numere .
0,0p / 0 votes
User avatar
nomemory
Bit
 
Joined: 24 Aug 2011
Location: Bucuresti
Status: 2

Re: [20] Concurs - Numar prim "majoritar"

Postby cata45 » 22 Nov 2011, 20:08

Mie pe ultimul test imi da si timpul de executie este mizerabil pe masina mea. (in jur de 4,4 sec) Acum ma pun pe optimizari insa nu prea am ce sa optimizez. <:-P [I'm gonna die.]
0,0p / 0 votes
The EARTH without ART is just EH.
User avatar
cata45
Byte
 
Joined: 02 Sep 2010
Status: 9

Re: [20] Concurs - Numar prim "majoritar"

Postby nomemory » 22 Nov 2011, 22:35

E OK sa ai 4 secunde :) .
Aici e solutia mea, cat dureaza la tine rularea ? (Trebuie sa existe un fisier bitcell20.in in acelasi folder cu executabilul) .
0,0p / 0 votes
User avatar
nomemory
Bit
 
Joined: 24 Aug 2011
Location: Bucuresti
Status: 2

Re: [20] Concurs - Numar prim "majoritar"

Postby cata45 » 22 Nov 2011, 23:10

Aici este si solutia mea. (oricine are timp si poate sa imi ataseze si mie executabilul- nu este valabil foarte mult link-ul de pe speedy share)


L.E. (-- 22 Nov 2011, 23:10 --)

^ Pana la urma la testul cu cinci milioane de numere sunt 1000500 majoritare sau 1000502? Solutia ta ruleaza la mine tot cam in 4 secunde.
3p / 1 votes
The EARTH without ART is just EH.
User avatar
cata45
Byte
 
Joined: 02 Sep 2010
Status: 9

Re: [20] Concurs - Numar prim "majoritar"

Postby nomemory » 22 Nov 2011, 23:47

^ La mine merge in doua secunde, si e mai rapida decat solutia pe care o am eu cu cateva zeci de milisecunde, so nice :).

Later Edit:
Am mers putin mai extrem si am ajuns la solutia asta. E putin mai rapida :) .
0,0p / 0 votes
User avatar
nomemory
Bit
 
Joined: 24 Aug 2011
Location: Bucuresti
Status: 2

Re: [20] Concurs - Numar prim "majoritar"

Postby Payne » 23 Nov 2011, 10:21

^La cat e de mare fisierul, am o mica mare impresie ca ai bagat in el destule valori pre-calculate.
0,0p / 0 votes
Suit up!

Image
User avatar
Payne
Byte
 
Joined: 04 Jan 2010
Location: 0x7C00
Status: 17

Re: [20] Concurs - Numar prim "majoritar"

Postby nomemory » 23 Nov 2011, 11:16

^ :"> Am incercat .
0,0p / 0 votes
User avatar
nomemory
Bit
 
Joined: 24 Aug 2011
Location: Bucuresti
Status: 2

Re: [20] Concurs - Numar prim "majoritar"

Postby nomemory » 30 Nov 2011, 12:09

Am sa plec zilele urmatoare din oras si cel mai probabil nu o sa am acces la internet pana pe 4 Decembrie .
Probabil aceea va fi data cand va fi desemnat si castigatorul .
0,0p / 0 votes
User avatar
nomemory
Bit
 
Joined: 24 Aug 2011
Location: Bucuresti
Status: 2

Re: [20] Concurs - Numar prim "majoritar"

Postby nomemory » 06 Dec 2011, 22:37

Le multumesc celor doi participanti ca au ajutat-o pe Nineta . :)

Rezultatele pe baza sursele compilate local pe calculatorul meu folosind acelasi compilator (pentru o departajare mai exacta):
Testul 1 (10 000 de numere)
cata - 0.445 s - corect
payne - 0.034 s - corect

Testul 2 (100 000 de numere)
cata - 0.898 s - corect
payne - 0.547 s - corect

Testul 3 (500 000)
cata - 0.569 s - corect
payne - 1.618 s - corect

Testul 4 (5 000 000)
cata - 1.934 s - corect
payne - 7.254 s - corect

Surse:
payne
  1.  
  2. #include <iostream>
  3. #include <fstream>
  4. #include <cmath>
  5. #include <vector>
  6. #include <map>
  7. #include <cstring>
  8. #include <cstdlib>
  9.  
  10. #define MAX_VALUE 10000000
  11. #define MAX_NUMBERS 5000000
  12. #define MAX_PRIME 3163
  13.  
  14. using namespace std;
  15.  
  16. vector<int> primes;
  17. map<int,int> prime_list;
  18.  
  19. void LoadPrimes(){
  20.     primes.clear();
  21.     primes.push_back(2);
  22.     for(int x=3;x<MAX_PRIME;x++){
  23.         bool good = true;
  24.         for(unsigned int y=0;y<primes.size() && good;y++)
  25.         {
  26.             if(x%primes[y] == 0)
  27.                 good = false;
  28.         }
  29.         if(good)
  30.             primes.push_back(x);
  31.     }
  32. }
  33. bool IsPrime(const int &value){
  34.     int max = (int)ceil(sqrt((double)value));
  35.     for(unsigned int x=0;x<primes.size();x++)
  36.     {
  37.         if(value%primes[x] == 0)
  38.             return false;
  39.         if(primes[x] >= max)
  40.             break;
  41.     }
  42.     return true;
  43. }
  44. int main()
  45. {
  46.     LoadPrimes();
  47.     fstream in("bitcell20.in",fstream::in);
  48.     fstream out("bitcell20.out",fstream::out);
  49.  
  50.     if(in.is_open() && out.is_open()){
  51.         string line;
  52.         int aux = 0;
  53.         while(getline(in,line)){
  54.             aux++;
  55.             int val = atoi(line.c_str());
  56.             if(val < MAX_VALUE && IsPrime(val)){
  57.                 prime_list[val] = prime_list[val]+1;
  58.             }
  59.             if(aux == MAX_NUMBERS)
  60.                 break;
  61.         }
  62.         int pmax = 0;
  63.         int plastmax = 0;
  64.         map<int,int>::iterator p;
  65.         for(p = prime_list.begin();p != prime_list.end();p++){
  66.             if(p->second > plastmax)
  67.             {
  68.                 pmax = p->first;
  69.                 plastmax = p->second;
  70.             }
  71.         }
  72.         out << pmax;
  73.         out.close();
  74.         in.close();
  75.     }
  76.     else
  77.         cout << "Nu am putut deschide/gasi fisierul bitcell20.in sau nu am putut crea fisierul bitcell20.out" << endl;
  78.     return 0;
  79. }
  80.  


cata
  1.  
  2. #include<fstream>
  3. using namespace std;
  4. #define IN "bitcell20.in"
  5. #define OUT "bitcell20.out"
  6. #define MaxN 10000005
  7. FILE *f, *g;
  8. long i, j, n, x, maxim, maxim1, nr;
  9. struct prime{
  10.     bool a;
  11.     int b;
  12. }A[MaxN];
  13. int main()
  14. {
  15.     f=fopen(IN, "r");
  16.     g=fopen(OUT, "w");
  17.  
  18.     while(fscanf(f, "%ld", &x)==1)
  19.     {
  20.         if(maxim<x)
  21.             maxim=x;
  22.         A[x].b++;
  23.         n++;
  24.     }
  25.     //ciur si determinare frecventa maxima prim
  26.     A[0].a=1; A[1].a=1;
  27.     maxim1=0;
  28.     for(i=2; i<=maxim/2; i++)
  29.     {
  30.         if(A[i].a==0)
  31.         {
  32.             if(A[i].b>maxim1)
  33.             {
  34.                 maxim1=A[i].b;
  35.                 nr=i;
  36.             }
  37.             for(j=i*2; j<=maxim; j+=i)
  38.                 A[j].a=1;
  39.         }
  40.     }
  41.  
  42.     fprintf(g, "%ld\n", nr);
  43.    
  44.     fclose(f);
  45.     fclose(g);
  46.     return 0;
  47. }
  48.  


Ideea principala a problemei era sa combinam unul dintre algoritmi de tip sita (Atkin sau Eratostene) cu un algoritm de determinare a majoritatii (ex.: aici) .

Daca voiati sa trisati, puteati sa folositi un truc vechi (aplicabil in C/C++): - se precalcula o lista de numere prime si se includea in sursa cu #include in felul urmator:
  1. int primes[] =
  2. {
  3.     #include "primes.txt"
  4. };


(Executabilul rezultat era insa cam mare, in plus pe windows s-ar putea sa fi fost probleme cu dimensiunea stack-ului - poate da stack overflow) .

Ambele solutii au fost foarte interesante (solutia mea initiala era mai infecienta decat ale voastre simtitor), dar pentru ca rezolvarea lui cata45 se descurca mai bine atunci cand limitele intervalelor cresc, il declar pe cata45 castigator .

PS: Imi cer scuze de intarziere ...
0,0p / 0 votes
User avatar
nomemory
Bit
 
Joined: 24 Aug 2011
Location: Bucuresti
Status: 2

Re: [20] Concurs - Numar prim "majoritar"

Postby cata45 » 06 Dec 2011, 23:06

Foarte interesant algoritmul lui Atkin. Nu stiam de el. Deci am invatat ceva nou .
Multumim pentru problema nomemory. Ne bucuram ca am putut sa o ajutam pe Nineta. :)
0,0p / 0 votes
The EARTH without ART is just EH.
User avatar
cata45
Byte
 
Joined: 02 Sep 2010
Status: 9

Re: [20] Concurs - Numar prim "majoritar"

Postby Payne » 06 Dec 2011, 23:41

Frumos concurs si felicitari cata45. Astept urmatorul cu nerabdare.
0,0p / 0 votes
Suit up!

Image
User avatar
Payne
Byte
 
Joined: 04 Jan 2010
Location: 0x7C00
Status: 17


Return to Concursuri de programare desktop

Who is online

Users browsing this forum: No registered users and 0 guests

cron