Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako napraviti niz od 30 miliona elemenata??

[es] :: C/C++ programiranje :: Kako napraviti niz od 30 miliona elemenata??

Strane: 1 2

[ Pregleda: 6438 | Odgovora: 30 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl.

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Kako napraviti niz od 30 miliona elemenata??07.12.2004. u 13:13 - pre 235 meseci
Citat:
Dok čovek savlada sve nivoe ne bi li koliko toliko tačno mogao da aproksimira svojim modelom, velika
Prepoznao sam tek poneku skraćenicu iz tvoje poruke.

Ali svejedno, ako ne znaš šta sedi unutra u crnoj kutiji, nemaš pojma kako da rastumačiš rezultat merenja. Zamisli da dakle imaš sve te ugrađene skraćenice, napraviš merenje i dobiješ neki rezultat. Šta taj rezultat znači? Da li su to najbolje ili najgore ili usrednjene (kako usrednjene?) performanse? Ako izmerim na računaru 1, šta mi to govori o istim tim algoritmima na računaru 2? Ili svejedno, ako izmerim na računaru 1 u vreme t1, šta mi to govori o ponovljenom merenju u vremenu t2? Merenje mi ispljune nekakve brojeve, nekakva vremena. Šta sad ja da radim sa tim brojevima, šta sam iz njih naučio?

Ako čovek izmeri tih 30 miliona elemenata i dobije rezultat, šta može da kaže o rezultatu ako ne pretpostavi ništa dodatno? Recimo uporedi Quick i Merge sort i Quick ispadne brži. Da li može samo na osnovu merenja da kaže da je Quick uvek bolje koristiti? (hint: ne može, jer Quick ima kvadratnu složenost u najgorem slučaju) Ne znam odgovore, al samo kažem da merenje bez modela ne znači mnogo (ili ne znači uopšte).

f
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Kako napraviti niz od 30 miliona elemenata??07.12.2004. u 13:36 - pre 235 meseci
Šta da ti kažem, čini se da je programiranje odavno prestalo da bude nauka i postalo zanat. Kad odeš kod automehaničara, neće čovek da postavlja fizički model automobila, pa sve i da ima PhD mašinstva, nego će se prepustiti iskustvu i instinktima, modeliranje će mu nekad pomoći, nekad neće.
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl.

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Kako napraviti niz od 30 miliona elemenata??07.12.2004. u 13:53 - pre 235 meseci
Citat:
Šta da ti kažem, čini se da je programiranje odavno prestalo da bude nauka i postalo zanat.
Svejedno. Neka bude i zanat, ali opet ostaje pitanje: kad sve izmerim, šta mi znači to merenje? Opet imam gomilu brojeva ali pošto je sve zanat, opet ne znam šta sa njima da uradim.

Evo konkretnije pitanje. Izmerim Sort1, dobijem 5.4. Izmerim Sort2 i dobijem 5.3. Šta mogu da kažem o Sort1 i Sort2?
Citat:
Kad odeš kod automehaničara, neće čovek da postavlja fizički model automobila, 
Sigurno da neće, ali to ne znači da ne koristi model. Jedino što ga ne pravi kad ti dođeš, već uzima gotov model kog je dao proizvođač u obliku raznih tabela, grafikona, crteža itd, odn. ono što je naučio o automobilima uopšte.

Čak valjda kod novijih auta sve ovo je mnogo egzaktnije, pošto se automobilski računar poveže sa onim u servisu pa se podešavanja sračunaju automatski. Automatsko podešavanje je nemoguće ako ne postoji bar nekakav model.

f
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Kako napraviti niz od 30 miliona elemenata??07.12.2004. u 14:38 - pre 235 meseci
Odustajem, ova rasprava je postala suviše akademska za mene. Mogu samo da kažem šta bih ja, kao automehaničar, uradio u tvom hipotetičkom slučaju: izmerio bih sort1 i sort2 na nizu neke druge veličine. Ako bi vrednosti i dalje bile tako bliske, odabrao bih algoritam lakši za održavanje (čitaj onaj koji se jednostavnije razume).
 
Odgovor na temu

Srđan Krstić
Srđan Krstić
Princeton, NJ

Član broj: 7526
Poruke: 416
*.bankerinter.net.

Jabber: srkiboy@elitesecurity.org
ICQ: 193836365
Sajt: www.princeton.edu/~skrsti..


Profil

icon Re: Kako napraviti niz od 30 miliona elemenata??07.12.2004. u 18:27 - pre 235 meseci
Ovako:
prvo pitanje sa pocetka: Ako ti tolko nisu jasni pokazivaci, sto lepo ne alociras staticki to sto ti treba ?! Uzmi neki iole novodatumski kompajler i to ne bi trebao biti problem. A sto se tice testiranja brzina, ja sam nekad davno radio to, evo prilazem i kod, i mogu da kazem da su mi u ~20 testiranja (random brojevi) bila vrlo bliska vremena. Testirao sam Quick, Merge i Heap Sort. Evo i tog famoznog koda:
Code:

#include <stdio.h>
#include <stdlib.h>
#include <sys\timeb.h>
#include <conio.h>

#define MaxN 10000000

long a [MaxN], temp [MaxN], time1, time2, n, i, pos;
float tim;

void swap (long x, long y)
{
    long pom;
    pom = temp [x];
    temp [x] = temp [y];
    temp [y] = pom;
}

void swap1 (long x, long y)
{
    long pom;
    pom = a [x];
    a [x] = a [y];
    a [y] = pom;
}

void q_sort (long l, long r)
{
    long i = l, j = r, mid = temp [(l + r) >> 1];
    do
    {
        while (temp [i] < mid)
            i++;
        while (temp [j] > mid)
            j--;
        if (i <= j)
        {
            swap (i, j);
            i++;
            j--;
        }
    }
    while (i <= j);
    if (l < j)
        q_sort (l, j);
    if (i < r)
        q_sort (i, r);
}

void QuickSort ()
{
    q_sort (1, n);
//    for (i = 0; i < n; i++)
//        printf ("%-3d", temp [i + 1]);
//    printf ("\n");
}

void ubaci (long x)
{
    long child, parent;
    pos++;
    temp [pos] = a [x];
    child = pos;
    while (1)
    {
        parent = child >> 1;
        if (parent == 0 || temp [parent] <= temp [child])
            break;
        swap (parent, child);
        child = parent;
    }
}

void izbacimin ()
{
    long parent, child;
    temp [1] = temp [pos];
    pos--;
    parent = 1;
    if (pos > 1)
    {
        child = 2;
        while (child <= pos)
        {
            if (child != pos && temp [child] > temp [child + 1])
                child++;
            if (temp [child] < temp [parent])
            {
                swap (parent, child);
                parent = child;
                child <<= 1;
            }
            else
                child = pos + 1;
        }
    }
}

void HeapSort ()
{
    pos = 0;
    for (i = 0; i < n; i++)
        ubaci (i);
    for (i = 0; i < n; i++)
    {
//        printf ("%-3d", temp [1]);
        izbacimin ();
    }
//    printf ("\n");
}

void m_sort (long l, long r)
{
    long br1, br2, br3, i, mid;
    if (l == r)
        return;
    if (r - l == 1)
    {
        if (a [l] > a [r])
            swap1 (l, r);
        return;
    }
    mid = (l + r) >> 1;
    m_sort (l, mid);
    m_sort (mid + 1, r);
    br1 = l;
    br2 = mid + 1;
    br3 = l - 1;
    while (!(br1 > mid && br2 > r))
    {
        br3++;
        if (br1 > mid)
        {
            temp [br3] = a [br2];
            br2++;
            continue;
        }
        if (br2 > r)
        {
            temp [br3] = a [br1];
            br1++;
            continue;
        }
        if (a [br1] < a [br2])
        {
            temp [br3] = a [br1];
            br1++;
        }
        else
        {
            temp [br3] = a [br2];
            br2++;
        }
    }
    for (i = l; i <= r; i++)
        a [i] = temp [i];
}

void MergeSort ()
{
    m_sort (0, n - 1);
//    for (i = 0; i < n; i++)
//        printf ("%-3d", a [i]);
//    printf ("\n");
}

void main ()
{
    clrscr ();
    struct timeb t;
    n = MaxN - 5;
//    randomize ();
    for (i = 0; i < n; i++)
    {
        a [i] = rand ();
//        printf ("%-3d", a [i]);
    }
//    printf ("\n\n");

    for (i = 0; i < n; i++)
        temp [i + 1] = a [i];


    ftime (&t);
    time1 = (t.time % 100) * 1000 + t.millitm;

    QuickSort ();

    ftime (&t);
    time2 = (t.time % 100) * 1000 + t.millitm;
    tim = (time2 - time1);
    tim /= 1000;
    printf ("QuickSort: %.2f\n\n", tim);

    ftime (&t);
    time1 = (t.time % 100) * 1000 + t.millitm;

    HeapSort ();

    ftime (&t);
    time2 = (t.time % 100) * 1000 + t.millitm;
    tim = (time2 - time1);
    tim /= 1000;
    printf ("HeapSort: %.2f\n\n", tim);

    ftime (&t);
    time1 = (t.time % 100) * 1000 + t.millitm;

    MergeSort ();

    ftime (&t);
    time2 = (t.time % 100) * 1000 + t.millitm;
    tim = (time2 - time1);
    tim /= 1000;
    printf ("MergeSort: %.2f\n", tim);
    exit (0);
}

I HAD A NIGHTMARE
IT ALL STARTED NORMAL
10101010
10110011
THEN ALL OF A SUDDEN
1100102
GAAAAH
_____________________________
www.princeton.edu/~skrstic
www.niwifi.co.sr
 
Odgovor na temu

_Super_Ellite_Bug_
Novi Sad, konacno!!!

Član broj: 41318
Poruke: 145
*.nat-pool.nsad.sbb.co.yu.

Sajt: www.searchlores.org


Profil

icon Re: Kako napraviti niz od 30 miliona elemenata??08.12.2004. u 19:54 - pre 235 meseci
I nije bas "famozan" kod, ali je lepo zamisljeno.
Evo malko boljeg primera iz literature koji je vec toliko prozvakan da me cudi da nije primenjena neka slicna analogija. Ovde je samo stavljen QuickSort kao primer, ali lako se daju ubaciti i ostali.

//----------------------------------------------------------------------------
#include <sys/types.h>
#include <unistd.h>
#include <sys/time.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

/* timer variables for seconds and microseconds */
#define start_sec 9
#define start_usec 0
#define max_usec 1000000

/* declare variables common to the process environment */
static int signal_1_flag = 0;
static int signal_2_flag = 0;

static void signal_start_handler (int signo) {
/* function to start processing in child by setting signal 1 flag*/
if (signo == SIGUSR1) {
printf ("Starting work in child process.\n");
signal_1_flag = 1;
return;
}
else {
printf ("Error handling signal to child process.\n");
exit (1);
}
}

static void signal_compute_time (int signo) {
/* function to start computation of elapsed time by setting signal 2 flag */
if (signo == SIGUSR2) {
printf ("Starting elapsed-time computation in parent.\n");
signal_2_flag = 1;
return;
}
else {
printf ("Error handling signal to parent process.\n");
exit (1);
}
}

/* child will perform quicksort on n elements as work to be timed */
#define array_size 100000
void quicksort (int a[], int n);

int main (void) {
pid_t pid; /* variable to record process id of child */
int temp; /* temporary variable, not used for real data */
struct itimerval ival; /* variable to set timer values */
struct itimerval real_time; /* variable to retrieve times from timer */

printf ("Starting program in which parent times work in child process\n\n");

/* prepare the signal handlers for two signals */
if (signal(SIGUSR1, signal_start_handler) == SIG_ERR)
printf ("Initial setup error: unable to create handler for SIGUSR1.\n");
if (signal(SIGUSR2, signal_compute_time) == SIG_ERR)
printf ("Initial setup error: unable to create handler for SIGUSR2.\n");

/* spawn child process */
pid = fork(); /* create new process */
if (-1 == pid) /* check for error in spawning child process */
{ perror ("Error in fork");
exit (1);
}

if (0 == pid) /* check if this is the new child process */
{ /* processing for child */
printf ("Starting child process\n");
printf ("Child pid: %d; parent pid: %d\n", getpid(), getppid());

/* waste time until SIGUSR1 signal tells child to start */
while (!signal_1_flag) /* terminates when SIGUSR1 signal is received */
temp = 1;

/* meaningful work goes here */
{ /* set up array for quicksort */
int i;
int a[array_size];
for (i = 0; i < array_size; i++)
a = rand ();
quicksort (a, array_size);
}
/* signal parent process when done */
kill (getppid(), SIGUSR2);

/* end child process */
printf ("Exiting child process\n");
exit (0);
}
else
{ /* processing for parent */
printf ("Continuing processing in parent process.\n");

/* set interval timer */
ival.it_interval.tv_sec = start_sec; /* initialize second field */
ival.it_interval.tv_usec = start_usec; /* initialize microsecond field */
ival.it_value.tv_sec = start_sec; /* reset second field */
ival.it_value.tv_usec = start_usec; /* reset microsecond field */
setitimer(ITIMER_REAL, &ival, NULL);

/* signal child with SIGUSR1 */
kill (pid, SIGUSR1);

/* waste time until SIGUSR2 signal indicates child's work done */
while (!signal_2_flag) /* terminates when SIGUSR2 signal is received */
temp = 1;
/* above loop will stop only when SIGUSR2 signal is received */

getitimer(ITIMER_REAL, &real_time);
printf ("Elapsed time is %d seconds, %d microseconds\n",
start_sec - real_time.it_value.tv_sec - 1,
max_usec - real_time.it_value.tv_usec);
/* end parent process */
printf ("Exiting parent process\n");
exit (0);
}
}

/* functions for the quicksort */
void partition (int a[], int left, int right, int *middle) {
/* places a[left] in position a[*middle],
permuting a[left]..a[right] so a[left]..a[middle-1] <= a[*middle]
and a[*middle] <= a[(*middle)+1]..a[right] */
int l_spot = left+1;
int r_spot = right;
int temp;

while (l_spot <= r_spot) {
while ((l_spot <= r_spot)&&(a[left] <= a[r_spot]))
r_spot--;
while ((l_spot <= r_spot)&&(a[l_spot] <= a[left]))
l_spot++;
if (l_spot <= r_spot) {
temp = a[r_spot];
a[r_spot] = a[l_spot];
a[l_spot] = temp;
}
}
temp = a[r_spot];
a[r_spot] = a[left];
a[left] = temp;
*middle = r_spot;
}


void quicksort (int a[], int n) {
/* performs quicksort to order elements in array a */
int mid;
if (n > 1) {
partition (a, 0, n-1, &mid);
quicksort (a, mid);
quicksort (a+mid+1,n - (mid+1));
}
}
//----------------------------------------------------------------------------


ISO/IEC JTC1/SC22/WG14-ISO/IEC 9899:1999
 
Odgovor na temu

dejan_su
Dejan Balazevic
Subotica

Član broj: 9453
Poruke: 483
*.suonline.net.

ICQ: 337366387


Profil

icon Re: Kako napraviti niz od 30 miliona elemenata??09.12.2004. u 16:37 - pre 235 meseci
Evo ja sam napravio sto sam hteo, jedino je problem sto mi uradi 30 hiljada elemenata, kad unesem vise samo stoji, a zauzece procesora je 100%! Ostavio sam ga 3 sata tako i nista. Evo i fajl dole...
Prikačeni fajlovi
 
Odgovor na temu

Damjan S. Vujnovic
London, UK

Član broj: 30444
Poruke: 81
*.ceetel.co.yu.

Jabber: damjan@elitesecurity.org
ICQ: 68189289
Sajt: www.javasvet.net


Profil

icon Re: Kako napraviti niz od 30 miliona elemenata??09.12.2004. u 16:48 - pre 235 meseci
Jel' tacno 30000 magicna granica, ili mozda 32767

Pozdrav,
D.

P.S. Koliko me pamcenje sluzi, neko te je vec na samom pocetku upozorio na ovo...
I love the smell of copyright violations in the morning. Smells like... freedom!
 
Odgovor na temu

dejan_su
Dejan Balazevic
Subotica

Član broj: 9453
Poruke: 483
*.tippnet.co.yu.

ICQ: 337366387


Profil

icon Re: Kako napraviti niz od 30 miliona elemenata??09.12.2004. u 17:10 - pre 235 meseci
Ali zasto bi ti bilo ogranicenje ako radim dinamicki. Ne bi jedino memorija mogla da bude ogranicenje? Ili je to mozda jer DOS vidi samo 1 MB...
 
Odgovor na temu

Damjan S. Vujnovic
London, UK

Član broj: 30444
Poruke: 81
*.ceetel.co.yu.

Jabber: damjan@elitesecurity.org
ICQ: 68189289
Sajt: www.javasvet.net


Profil

icon Re: Kako napraviti niz od 30 miliona elemenata??09.12.2004. u 18:26 - pre 235 meseci
Pogledaj prvi trooper-ov odgovor i obrati paznju na komentar na vrhu prilozenog koda.

D

hint: 32767 + 1 = ?
I love the smell of copyright violations in the morning. Smells like... freedom!
 
Odgovor na temu

dejan_su
Dejan Balazevic
Subotica

Član broj: 9453
Poruke: 483
*.tippnet.co.yu.

ICQ: 337366387


Profil

icon Re: Kako napraviti niz od 30 miliona elemenata??09.12.2004. u 19:04 - pre 235 meseci
A sta ako recimo instaliram Visual C++.NET i tamo napravim ovaj program pod "Console Application"? Hocu li i onda imati ogranicenje?
 
Odgovor na temu

[es] :: C/C++ programiranje :: Kako napraviti niz od 30 miliona elemenata??

Strane: 1 2

[ Pregleda: 6438 | Odgovora: 30 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.