[C++] Ottimizzare algoritmo.

Svpam

Nuovo Utente
70
2
CPU
intel core i5-2310m
HDD
1TB Western digital 5400rpm
RAM
8gb ddr3
GPU
amd ati 7310m
Monitor
samsung E2220
OS
Windows 7; ubuntu 14.04; Kali linux; debian 7
Per esercitarci nella programmazione in universita usiamo una piattaforma di test automatica, in pratica inseriamo il codice scritto e il sito ci indica se il programma funziona o meno.
Ora, io ho questo esercizio:

Scrivere un programma C++ che, letta da input una sequenza di numeri
terminata da -1 e che può contenere al massimo 100, la memorizziopportunamente in un array,
individui tutti gli interiche compaiono più di unavolta e cancelli tutti i
duplicati(lasciando cioè solo la prima occorrenza di ogni numero); l’array dove essere inoltre compattato,
ossia devono essere eliminati i “buchi” che si creano dopo le cancellazioni,spostando a sinistra i valori
rimanenti.
Stampare poi su standard ouptut l’array così modificato.ESEMPIO: data la sequenza
2| 2| 3 |4 |5 |6| 4|-23 |8| -23| -23|-1
Il programma dovrebbe quindi stampare
2 |3 |4 |5| 6| -23| 8
.

Ho scritto questo codice:
Codice:
#include <iostream>
using namespace std;

const unsigned dim=100;

bool presente(int B[], unsigned size, int num)
{
    for(unsigned r=0; r<size; r++)
        if(B[r]==num)
            return true;
        return false;
}

void leggi (int B[], unsigned &size)
{
    int n;
    cin>>n;
    while(n!=-1 && size<dim)
    {
        if(!presente(B, size, n))
        {
            B[size]=n;
            size++;
        }
        cin>>n;
    }
}

void stampa(int B[], unsigned size)
{
    for(unsigned j=0; j<size; j++)
        cout<<B[j]<<" ";
}
int main()
{

    int A[dim];
    unsigned size=0;

    leggi(A, size);
    stampa(A, size);
    return 0;
}

Mi da questo risultato:
TIME LIMIT Il programma è stato compilato con successo ma una volta eseguito non ha completato l'elaborazione entro il tempo limite fissato.Prova a verificare che non ci siano cicli infiniti e prova ad ottimizzarel'algoritmo.

Personalmente il codice mi sembra abbastanza banale e non vedo dove/come poterlo migliorare.
Aiuti, suggerimenti?
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Il tempo che ci impiega l'algoritmo dipende da quanto tempo ci metti a scrivere la sequenza e quanto la sequenza è lunga... visto che stai acquisendo da tastiera, per cui quel vincolo temporale mi sembra del tutto fuori luogo. Eventualmente potresti provare ad acquisire i numeri da file anzichè tastiera.
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Codice:
bool presente(int B[], unsigned size, int num) {
    for(unsigned r=0; r<size; r++)
        if(B[r]==num)
            return true;
        return false;
}

Non ti controlla solo il primo valore dell'array e poi ti esce sia dal ciclo che dalla funzione?
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Codice:
bool presente(int B[], unsigned size, int num) {
    for(unsigned r=0; r<size; r++)
        if(B[r]==num)
            return true;
        return false;
}

Non ti controlla solo il primo valore dell'array e poi ti esce sia dal ciclo che dalla funzione?
L'identazione è sbagliata, ma dovrebbe funzionare, "return false" è eseguito dopo che il for è terminato.
 
  • Mi piace
Reazioni: rodhellas

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
L'identazione è sbagliata, ma dovrebbe funzionare, "return false" è eseguito dopo che il for è terminato.
Ah ecco, io sono abituato a mettere il corpo del for all'interno delle graffe, dal testo sembrava che il return false fosse fuori dall'if ma dentro al for :sisilui:
 

Svpam

Nuovo Utente
70
2
CPU
intel core i5-2310m
HDD
1TB Western digital 5400rpm
RAM
8gb ddr3
GPU
amd ati 7310m
Monitor
samsung E2220
OS
Windows 7; ubuntu 14.04; Kali linux; debian 7
L'identazione è sbagliata, ma dovrebbe funzionare, "return false" è eseguito dopo che il for è terminato.

esatto, mi è scappato un tab di troppo.
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili