Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
Pensato per il professionista sempre in movimento, HP Elitebook Ultra G1i 14 abbina una piattaforma Intel Core Ultra 7 ad una costruzione robusta, riuscendo a mantenere un peso contenuto e una facile trasportabilità. Ottime prestazioni per gli ambiti di produttività personale con un'autonomia lontano dalla presa di corrente che permette di lavorare per tutta la giornata
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Basato su piattaforma Qualcomm Snapdragon X Plus a 8 core, il nuovo Microsoft Surface Pro 12 è un notebook 2 in 1 molto compatto che punta sulla facilità di trasporto, sulla flessibilità d'uso nelle differenti configurazioni, sul funzionamento senza ventola e sull'ampia autonomia lontano dalla presa di corrente
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Il REDMAGIC Astra Gaming Tablet rappresenta una rivoluzione nel gaming portatile, combinando un display OLED da 9,06 pollici a 165Hz con il potente Snapdragon 8 Elite e un innovativo sistema di raffreddamento Liquid Metal 2.0 in un form factor compatto da 370 grammi. Si posiziona come il tablet gaming più completo della categoria, offrendo un'esperienza di gioco senza compromessi in mobilità.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-08-2008, 10:19   #21
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da Vincenzo1968 Guarda i messaggi
E il bello è che utilizzando un automa a stati finiti, al posto della scanf, si scende sotto il decimo di secondo anche per leggere la matrice dal file.

Cioè circa 3 volte più veloce? Cavoli, non pensavo che la scanf() avesse un tale impatto.

Come no, posta pure che è interessante.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!

Ultima modifica di DanieleC88 : 16-08-2008 alle 10:26.
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 13:00   #22
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Tra l'altro ho appena escogitato una possibile soluzione al secondo punto del problema, ma ho ancora un po' di dubbi sulla sua efficienza. Appena posso butto giù del codice e incrocio le dita.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 15:48   #23
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi

Cioè circa 3 volte più veloce? Cavoli, non pensavo che la scanf() avesse un tale impatto.
Mi sembra normale: scanf è una soluzione "generica", mentre l'automa a stati finiti è una soluzione "custom".
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 18:31   #24
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
In ritardo(causa condivisione dell'unico portatile tra parenti e amici ) ma ecco il codice.

Nella macchina menzionata nel post precedente, impiega 0.02400 secondi.

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <time.h>

#define BUFFER_SIZE 4096

typedef enum tagStati
{
	S_ERROR = -1, S0, S1
} Stati;

int GetArraySize(const char *szFileName)
{
	int array_size;
	FILE *fp;
	char buffer[BUFFER_SIZE + 1];
	int numread;
	int k;
	char c;

	fp = fopen(szFileName, "rb");
	if ( fp == NULL )
	{
		printf("Errore nell'apertura del file %s\n", szFileName);
		return S_ERROR;
	}

	numread = fread(buffer, 1, BUFFER_SIZE, fp);
	if (numread == 0)
	{
		fclose(fp);
		printf("Errore 4 nella lettura del file %s\n", szFileName);
		return S_ERROR;
	}
	*(buffer + numread + 1) = '\0';

	k = 0;
	c = *(buffer + k);
	array_size = 0;
	while ( c != '\n' )
	{
		if ( c >= '0' && c <= '9' )
		{
			array_size = array_size * 10 + c - '0';

		}
		c = *(buffer + k++);
	}

	fclose(fp);

	return array_size;
}

Stati DFA(const char *szFileName, int **a, int array_size)
{
	Stati stato = S0;
	FILE *fp;
	unsigned char buffer[BUFFER_SIZE + 1];
	int numblocks;
	int numread;
	char c;
	int k, x;
	int riga, colonna;
	int num;

	fp = fopen(szFileName, "rb");
	if ( fp == NULL )
	{
		printf("Errore nell'apertura del file %s\n", szFileName);
		return S_ERROR;
	}

	if ( fseek(fp, 0, SEEK_END) )
		return 0;

	numblocks = ftell(fp)/BUFFER_SIZE;
	if ( numblocks == 0 )
	{
		numblocks = 1;
	}
	else
	{
		if ( ftell(fp) % BUFFER_SIZE != 0 )
			numblocks++;
	}

	fseek(fp, 0, SEEK_SET);
	numread = fread(buffer, 1, BUFFER_SIZE, fp);
	if (numread == 0)
	{
		fclose(fp);
		printf("Errore 1 nella lettura del file %s\n", szFileName);
		return S_ERROR;
	}

	k = 0;
	c = *(buffer + k++);
	while ( c != '\n' )
	{
		if (c == '\0')
		{
			printf("Errore 2 nella lettura del file.\n");
			fclose(fp);
			return S_ERROR;
		}
		c = *(buffer + k++);
	}

	riga = colonna = 0;
	num = 0;
	x = 0;
	while ( x < numblocks )
	{
		c = *(buffer + k++);

		switch ( stato )
		{
		case S0:
			num = 0;
			if ( c >= '0' && c <= '9' )
			{
				num = c - '0';
				stato = S1;
			}
			else if ( c == '-' )
			{
				c = *(buffer + k++);
				if ( k >= BUFFER_SIZE )
				{
					numread = fread(buffer, 1, BUFFER_SIZE, fp);
					if (numread == 0)
					{
						fclose(fp);
						printf("Errore 3 nella lettura del file %s\n", szFileName);
						return S_ERROR;
					}
					k = 0;
					c = *(buffer + k++);
					x++;
				}
				else if ( c < '0' || c > '9' )
				{
					printf("Automa: Stato S0 errore sul carattere -> '%c'\n", c);
					return S_ERROR;
				}
				num = (c - '0') * -1;
				stato = S1;
			}
			else if ( c == '\r' )
			{
			}
			else if ( c == '\n' )
			{
				colonna = 0;
				riga++;
				if (riga >= array_size)
					return stato;
			}
			else
			{
				printf("Automa: Stato S0 errore sul carattere -> '%c' k -> %d\n", c, k);
				return S_ERROR;
			}
			break;
		case S1:
			if ( c >= '0' && c <= '9' )
			{
				num = num * 10 + c - '0';
			}
			else if ( c == ' ' )
			{
				a[riga][colonna] = num;
				num = 0;
				colonna++;
				stato = S0;
			}
			else if ( c == '-' )
			{
				k--;
				stato = S0;
			}
			else 
			{
				printf("Automa: Stato S1 errore sul carattere -> '%c'\n", c);
				return S_ERROR;
			}
			break;
		}

		if ( k >= BUFFER_SIZE )
		{
			numread = fread(buffer, 1, BUFFER_SIZE, fp);
			if (numread == 0)
			{
				fclose(fp);
				printf("Errore 3 nella lettura del file %s\n", szFileName);
				return S_ERROR;
			}
			k = 0;
			x++;
		}
	}

	fclose(fp);

	return stato;
}

int main()
{
	clock_t c_start, c_end;

	int x;
	int **m;
	int array_size;
	Stati stato;

	c_start = clock();

	array_size = GetArraySize("matrix1.txt");
	if ( array_size <= 0 )
		return;

	m = (int**)malloc(sizeof(int*)*array_size);
	if ( m != NULL )
	{
		for ( x = 0; x < array_size; x++ )
		{
			m[x] = (int*)malloc(sizeof(int)*array_size);
			if ( m[x] == NULL )
			{
				printf("Memoria insufficiente.\n");
				return S_ERROR;
			}
		}
	}
	else
	{
		printf("Memoria insufficiente.\n");
		return S_ERROR;
	}

	stato = DFA("matrix1.txt", m, array_size);
	if ( stato == S_ERROR )
	{
		printf("L'automa ha restituito un errore.\n");
		return -1;
	}

	c_end = clock();
	printf("\nTempo impiegato per la lettura del file -> %5.5f secondi\n", (double)(c_end - c_start) / CLOCKS_PER_SEC);

	printf("\ngli ultimi dieci elementi  della matrice:\n");
	for ( x = 989; x < 1000; x++ )
		printf("m[999][%d] -> %d\n", x, m[999][x]);
	printf("\n");

	for ( x = 0; x < array_size; x++ )
		free(m[x]);
	free(m);

	return 0;
}

Ultima modifica di Vincenzo1968 : 16-08-2008 alle 18:57.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 18:38   #25
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Tra l'altro ho appena escogitato una possibile soluzione al secondo punto del problema, ma ho ancora un po' di dubbi sulla sua efficienza. Appena posso butto giù del codice e incrocio le dita.
E io, non avendo intenzione di passare il resto delle ferie a programmare, vi leggo e faccio il tifo per te(e per il linguaggio C ).
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 18:59   #26
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Tra l'altro ho appena escogitato una possibile soluzione al secondo punto del problema, ma ho ancora un po' di dubbi sulla sua efficienza. Appena posso butto giù del codice e incrocio le dita.
Puoi sempre modellare velocemente la soluzione, testarne la consistenza, e poi pensare a velocizzarla.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 19:11   #27
ercand
Member
 
Iscritto dal: Sep 2004
Messaggi: 216
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Mi sembra normale: scanf è una soluzione "generica", mentre l'automa a stati finiti è una soluzione "custom".
Salve a tutti, volevo partecipare ( o almeno provare ) ma vedo che voi siete anni luce avanti a me, ad esempio questo "automa a stati finiti" in cosa consiste?

Grazie.
ercand è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 19:12   #28
ndakota
Senior Member
 
L'Avatar di ndakota
 
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
Quote:
Originariamente inviato da ercand Guarda i messaggi
Salve a tutti, volevo partecipare ( o almeno provare ) ma vedo che voi siete anni luce avanti a me, ad esempio questo "automa a stati finiti" in cosa consiste?

Grazie.
lo stesso per me.. io in java mi sono bloccato al caricamento della matrice da file
ndakota è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 19:27   #29
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Mi sembra normale: scanf è una soluzione "generica", mentre l'automa a stati finiti è una soluzione "custom".
Questo lo so, e infatti mi aspettavo che la lettura "manuale" fosse più rapida, però la scanf(), a parte l'interpretazione della stringa di formato, un cast e poco altro, cosa fa in più oltre a leggere il numero? Non mi aspettavo che ci impiegasse 3 volte (anzi, anche di più a vedere dal risultato che ha postato ora Vincenzo ) il tempo normalmente necessario.
Quote:
Originariamente inviato da Vincenzo1968 Guarda i messaggi
In ritardo(causa condivisione dell'unico portatile tra parenti e amici ) ma ecco il codice.

Nella macchina menzionata nel post precedente, impiega 0.02400 secondi.

[...]

Mamma mia, sia per il risultato che per la quantità di codice: gugoXX ha ragione, devi essere un amanuense.
Quote:
Originariamente inviato da Vincenzo1968 Guarda i messaggi
E io, non avendo intenzione di passare il resto delle ferie a programmare, vi leggo e faccio il tifo per te(e per il linguaggio C ).
Grazie, proverò a fare del mio meglio
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Puoi sempre modellare velocemente la soluzione, testarne la consistenza, e poi pensare a velocizzarla.
Ovvero... provarla in Python?
Be' sì, perché no?
Quote:
Originariamente inviato da ercand Guarda i messaggi
Salve a tutti, volevo partecipare ( o almeno provare ) ma vedo che voi siete anni luce avanti a me, ad esempio questo "automa a stati finiti" in cosa consiste?

Grazie.
Tranquillo, posta la soluzione senza problemi (l'ultima soluzione che ho postato io ci metteva 13 minuti ).

Un automa a stati finiti è un modello di macchina che reagisce a degli input portandosi da uno stato iniziale ad uno stato finale e dando determinati output (diversi a seconda degli stati di destinazione o delle transizioni effettuate). Almeno io è così che la conosco per quel poco che ho fatto, se vuoi maggiori dettagli su come implementarle in C rivolgiti a Vincenzo che saprà consigliarti letture utili.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 19:38   #30
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da ercand Guarda i messaggi
Salve a tutti, volevo partecipare ( o almeno provare ) ma vedo che voi siete anni luce avanti a me, ad esempio questo "automa a stati finiti" in cosa consiste?

Grazie.
Ciao ercand,

come prima cosa volevo incoraggiarti(anzi, incoraggiarvi; l'invito è rivolto anche a ndakota) a partecipare ugualmente. L'accento è posto sugli algoritmi e non sulla velocità di esecuzione; non è detto quindi che il tuo algoritmo non possa risultare interessante.

Per quanto riguarda gli automi a stati finiti puoi vedere questo mio articolo e, se sei particolarmente interessato, ti consiglio caldamente questo libro:

Codice:
John E. Hopcroft, Rajeev Motwani, Jeffrey D. Ullman
Automi, linguaggi e calcolabilità
ADDISON-WESLEY
Non lasciarti impressionare dalle definizioni matematiche. È più facile a farsi che a dirsi. Nel senso che, anche non possedendo elevate nozioni matematiche, l'implementazione di un automa a stati finiti è davvero molto semplice(se ci sono riuscito io col mio misero diploma di ragioniere...).

P.S.
ndakota, c,è un accenno agli automi a stati finiti anche sul Cormen(capitolo 32, 'string matching')

Ultima modifica di Vincenzo1968 : 16-08-2008 alle 20:00.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 20:08   #31
grigor91
Senior Member
 
L'Avatar di grigor91
 
Iscritto dal: Dec 2007
Città: brianza
Messaggi: 717
[OT]
E' interessante notare come il mio futuro libro di sistemi riesca a trattare la macchina di Touring senza citare gli automi a stati finiti
[/OT]
__________________
AMD Ryzen 9700X MSI RX 480 Gaming X 8G ASRock B850 Pro-A Windows 11 Pro RAM DDR5 16GBx2 TEAMGROUP T-Create Expert 6000 MHz CL30 SSD Crucial T500 4TB case Corsair Carbide 200R
grigor91 è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 21:52   #32
NickerX
Member
 
Iscritto dal: Aug 2006
Messaggi: 135
La prima riga di ogni file indica la dimensione della matrice giusto??
Quindi per il primo esercizio la matrice è 1000 * 1000 vero??

Scusate le domande banali!!
__________________

E6600 @ 3330 Dissy Stock
NickerX è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 22:59   #33
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da NickerX Guarda i messaggi
La prima riga di ogni file indica la dimensione della matrice giusto??
Quindi per il primo esercizio la matrice è 1000 * 1000 vero??
...
Ciao Nicher,

giusto, si. Si tratta di una matrice 1000x1000.

Quote:
Originariamente inviato da grigor91 Guarda i messaggi
E' interessante notare come il mio futuro libro di sistemi riesca a trattare la macchina di Touring senza citare gli automi a stati finiti
Ciao Grigor,
si, è decisamente interessante!
Fammi sapere il titolo del libro quando esce(che evito di comprarlo).
Ho postato quel codice non perché voglia dimostrare chissà cosa, ma perché lo ritengo interessante. Anche se l'esercizio specifica che i tempi di lettura dal file non debbono rientrare nel computo, nella vita reale uno non si può presentare dal cliente e dirgli: "l'algoritmo di ricerca è velocissimo; tuttavia, il programma impiega mezz'ora di tempo a causa della lettura del file".
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 23:13   #34
ercand
Member
 
Iscritto dal: Sep 2004
Messaggi: 216
Per ho scritto il codice per memorizzare la matrice, questo è il codice

Codice:
// Contest5.cpp : Defines the entry point for the console application.
//

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <ctime>



#define SRCFILE "Matrix1.txt"
#define FILEBUFER 4096

int matrixSize = 1000;
char matrix[1000][1000];

bool OpenContestFile(char* pFileName)
{
	char buffer[FILEBUFER + 1];

	std::ifstream inputFile;
	inputFile.open(pFileName);

	if (inputFile.fail())
	{
		printf("Impossibile aprire il file %s", pFileName);
		return false;
	}

	
	inputFile.getline(buffer, FILEBUFER, '\n');

/*	int lenghtFirstLine = inputFile.tellg();
	
	std::string textRecord;
	textRecord.insert(0, buffer + 2, lenghtFirstLine - 4);
	matrixSize = atoi(textRecord.c_str());*/
	matrixSize = atoi(buffer+1);


	// Legge tutti i valori della matrice
	int Row = 0;
	char* tempBuffer;
	
	while (inputFile.eof() == false)
	{
		inputFile.getline(buffer, FILEBUFER, '\n');
		tempBuffer = buffer;


		for (int i = 0; i < matrixSize; i++)
		{
			matrix[Row][i] = atoi(tempBuffer);

			while ((*tempBuffer >= '0' && *tempBuffer <= '9') || *tempBuffer == '-')
			{
				++tempBuffer;
			}
		//	if (*tempBuffer == ' ' && *tempBuffer != '\n' && *tempBuffer != '\r')
			{
				++tempBuffer;
			}
		}
		++Row;
	}

	inputFile.clear();
	inputFile.close();

	return true;
}
int main()
{
	clock_t t1;
	clock_t t2;

	// Lettura file
	t1 = clock();
	bool staus = OpenContestFile(SRCFILE);
	t2 = clock();

	char text[512];
	sprintf(text, "Lettura file completata in %5.5f secondi", float(t2-t1) / CLOCKS_PER_SEC);
	OutputDebugStr(text);

	return 0;
}
E' scritto con visual studio 2008, compilato in modalità release impiega tra i 0.04300 e i 0.05200 secondi a caricare la matrice.
Pensavo peggio , son soddisfatto.
ercand è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 23:36   #35
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3691
Provo a gettare una prima soluzione per il punto 2.
Completamente funzionale

Quote:
Coordinate: 94,60 - Dimensione 55 - Somma 3185
Time: 8529ms
Test: 3185
Ho evidenziato in BLU il cuore, l'algoritmo di ricerca vero e proprio.

Codice:
class Program
{
    static void Main(string[] args)
    {            
        Matrix mat = new Matrix("Matrix2.txt");
        Stopwatch sw = new Stopwatch();
        sw.Start();
        var toprint = mat.Ex2();
        sw.Stop();
        Console.WriteLine("Coordinate: {0},{1}   - Dimensione {2}   - Somma {3}", toprint.Coords.x, toprint.Coords.y, toprint.Coords.z, toprint.val);
        Console.WriteLine("Time: {0}ms", sw.ElapsedMilliseconds);

        int x=toprint.Coords.x;
        int y=toprint.Coords.y;
        int z=toprint.Coords.z;

        int test = (from yy in Enumerable.Range(y, z+1)
                    from xx in Enumerable.Range(x, z+1)
                    select mat.Mat[xx, yy]).Sum();
        Console.WriteLine("Test: {0}", test);

        Console.ReadKey();
    }
}

public class Matrix
{
    public int Dim;
    public int[,] Mat;

    public void Save(string fname)
    {
        StreamWriter sw = new StreamWriter(@"C:\temp\" + fname);            
        sw.WriteLine("--{0}--", Dim);
        for (int y = 0; y < Dim; y++)
        {
            for (int x = 0; x < Dim; x++)
            {
                sw.Write("{0} ", Mat[x, y].ToString());
            }
            sw.WriteLine();
        }
        sw.Close();
    }

    public Matrix(string fname)
    {
        Load(fname);
    }

    public Matrix(int[,] vals)
    {
        Mat = vals;
        Dim = vals.GetLength(0);
    }

    public void Load(string fname)
    {
        StreamReader sr = new StreamReader(@"C:\temp\" + fname);
        string fline = sr.ReadLine();
        string mds = fline.Substring(2, fline.Length - 4);
        Dim = int.Parse(mds);
        Mat = new int[Dim, Dim];
        for (int y = 0; y < Dim; y++)
        {
            string line = sr.ReadLine();
            string[] valss = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            var valis = valss.Select(t => int.Parse(t)).ToArray();
            Enumerable.Range(0, Dim).ForAll(x => Mat[x, y] = valis[x]);
        }
        sr.Close();            
    }        

    public struct CoordsStruct
    {
        public int x;
        public int y;
        public int z;
        public CoordsStruct(int ix, int iy, int iz)
        {
            x = ix;
            y = iy;
            z = iz;
        }
    }

    public struct Ex2Result
    {                        
        public CoordsStruct Coords;
        public int val;

        public Ex2Result(CoordsStruct ics,int ival)
        {
            Coords = ics;
            val = ival;
        }
    }

    public Ex2Result Ex2()
    {            
        int parsum = 0;
        var domgrp =  from y in Enumerable.Range(0, Dim)
                      from x in Enumerable.Range(0, Dim)
                      let min = Math.Min(Dim - y, Dim - x)                          
                      from z in Enumerable.Range(1, min - 1)
                      select new Ex2Result(
                             new CoordsStruct(x,y,z),
                             parsum = (z == 1 ? Mat[x, y] : parsum) + Mat[x + z, y + z] +
                                    (from t in Enumerable.Range(0, z)
                                     select Mat[x+t,y+z]+Mat[x+z,y+t]).Sum()
                      );
              
        var orig = from y in Enumerable.Range(0, Dim)
                   from x in Enumerable.Range(0, Dim)
                   select new Ex2Result(new CoordsStruct(x, y, 0), Mat[x, y]);

        var complete = domgrp.Concat(orig);
                                                                  
        Ex2Result res = complete.Max(t => t.val);
        return res;
    }
}

public static class Extensor
{
    public static void ForAll<T>(this IEnumerable<T> domain,Action<T> act)
    {
        foreach (T t in domain) act(t);
    }

    public static T Max<T, U>(this IEnumerable<T> domain, Func<T, U> elem) where U:IComparable<U>
    {
        T CurmaxRow = default(T);
        U CurMax=default(U);
        foreach (T t in domain)
        {
            U CurVal=elem(t);
            if (CurVal.CompareTo(CurMax) > 0)
            {
                CurmaxRow = t;
                CurMax = CurVal;
            }
        }
        return CurmaxRow;
    }
}
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.

Ultima modifica di gugoXX : 16-08-2008 alle 23:41.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2008, 23:50   #36
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Questo lo so, e infatti mi aspettavo che la lettura "manuale" fosse più rapida, però la scanf(), a parte l'interpretazione della stringa di formato, un cast e poco altro, cosa fa in più oltre a leggere il numero? Non mi aspettavo che ci impiegasse 3 volte (anzi, anche di più a vedere dal risultato che ha postato ora Vincenzo ) il tempo normalmente necessario.
Io sì e, anzi, pensavo si guadagnasse qualcosa di più.

Considera che un automa a stati finiti fa veramente "il minimo indispensabile", mentre la scanf ha numerosi controlli in più che esegue sempre.
Quote:
Ovvero... provarla in Python?
Matteo 26,25

"Tu l'hai detto."


Quote:
Be' sì, perché no?
"Make it work, make it right, make it fast" - Kent Beck

__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2008, 02:25   #37
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Ho snellito un po' il codice dell'automa con l'aggiunta di uno stato che rende più agevole la gestione dei numeri negativi:

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <time.h>

#define BUFFER_SIZE 4096

typedef enum tagStati
{
	S_ERROR = -1, S0, S1, S2
} Stati;

int GetArraySize(const char *szFileName)
{
	int array_size;
	FILE *fp;
	char buffer[BUFFER_SIZE + 1];
	int numread;
	int k;
	char c;

	fp = fopen(szFileName, "rb");
	if ( fp == NULL )
	{
		printf("Errore nell'apertura del file %s\n", szFileName);
		return S_ERROR;
	}

	numread = fread(buffer, 1, BUFFER_SIZE, fp);
	if (numread == 0)
	{
		fclose(fp);
		printf("Errore 4 nella lettura del file %s\n", szFileName);
		return S_ERROR;
	}
	*(buffer + numread + 1) = '\0';

	k = 0;
	c = *(buffer + k);
	array_size = 0;
	while ( c != '\n' )
	{
		if ( c >= '0' && c <= '9' )
		{
			array_size = array_size * 10 + c - '0';

		}
		c = *(buffer + k++);
	}

	fclose(fp);

	return array_size;
}

Stati DFA(const char *szFileName, int **a, int array_size)
{
	Stati stato = S0;
	FILE *fp;
	unsigned char buffer[BUFFER_SIZE + 1];
	int numblocks;
	int numread;
	char c;
	int k, x;
	int riga, colonna;
	int num;
	int segno;

	fp = fopen(szFileName, "rb");
	if ( fp == NULL )
	{
		printf("Errore nell'apertura del file %s\n", szFileName);
		return S_ERROR;
	}

	if ( fseek(fp, 0, SEEK_END) )
		return 0;

	numblocks = ftell(fp)/BUFFER_SIZE;
	if ( numblocks == 0 )
	{
		numblocks = 1;
	}
	else
	{
		if ( ftell(fp) % BUFFER_SIZE != 0 )
			numblocks++;
	}

	fseek(fp, 0, SEEK_SET);
	numread = fread(buffer, 1, BUFFER_SIZE, fp);
	if (numread == 0)
	{
		fclose(fp);
		printf("Errore 1 nella lettura del file %s\n", szFileName);
		return S_ERROR;
	}

	k = 0;
	c = *(buffer + k++);
	while ( c != '\n' )
	{
		if (c == '\0')
		{
			printf("Errore 2 nella lettura del file.\n");
			fclose(fp);
			return S_ERROR;
		}
		c = *(buffer + k++);
	}

	riga = colonna = 0;
	num = 0;
	x = 0;
	while ( x < numblocks )
	{
		c = *(buffer + k++);

		switch ( stato )
		{
		case S0:
			segno = 1;
			if ( c >= '0' && c <= '9' )
			{
				num = c - '0';
				stato = S1;
			}
			else if ( c == '-' )
			{
				num = 0;
				stato = S2;
			}
			else if ( c == '\r' )
			{
			}
			else if ( c == '\n' )
			{
				colonna = 0;
				riga++;
				if (riga >= array_size)
					return stato;
			}
			else
			{
				printf("Automa: Stato S0 errore sul carattere -> '%c' k -> %d\n", c, k);
				return S_ERROR;
			}
			break;
		case S1:
			if ( c >= '0' && c <= '9' )
			{
				num = num * 10 + c - '0';
			}
			else if ( c == ' ' )
			{
				a[riga][colonna] = num * segno;
				num = 0;
				colonna++;
				stato = S0;
			}
			else 
			{
				printf("Automa: Stato S1 errore sul carattere -> '%c'\n", c);
				return S_ERROR;
			}
			break;
		case S2:
			if ( c >= '0' && c <= '9' )
			{
				num = c - '0';
				segno = -1;
				stato = S1;
			}
			else 
			{
				printf("Automa: Stato S2 errore sul carattere -> '%c'\n", c);
				return S_ERROR;
			}
			break;
		}

		if ( k >= BUFFER_SIZE )
		{
			numread = fread(buffer, 1, BUFFER_SIZE, fp);
			if (numread == 0)
			{
				fclose(fp);
				printf("Errore 3 nella lettura del file %s\n", szFileName);
				return S_ERROR;
			}
			k = 0;
			x++;
		}
	}

	fclose(fp);

	return stato;
}

int main()
{
	clock_t c_start, c_end;

	int x;
	int **m;
	int array_size;
	Stati stato;
	char *szFileName = "matrix1.txt";

	c_start = clock();

	array_size = GetArraySize(szFileName);
	if ( array_size <= 0 )
		return;

	m = (int**)malloc(sizeof(int*)*array_size);
	if ( m != NULL )
	{
		for ( x = 0; x < array_size; x++ )
		{
			m[x] = (int*)malloc(sizeof(int)*array_size);
			if ( m[x] == NULL )
			{
				printf("Memoria insufficiente.\n");
				return S_ERROR;
			}
		}
	}
	else
	{
		printf("Memoria insufficiente.\n");
		return S_ERROR;
	}

	//c_start = clock();

	stato = DFA(szFileName, m, array_size);
	if ( stato == S_ERROR )
	{
		printf("L'automa ha restituito un errore.\n");
		return;
	}

	c_end = clock();
	printf("\nTempo impiegato per la lettura del file -> %5.5f secondi\n", (double)(c_end - c_start) / CLOCKS_PER_SEC);

	printf("\ngli ultimi dieci elementi  della matrice:\n");
	for ( x = array_size - 10; x < array_size; x++ )
		printf("m[%d][%d] -> %d\n", array_size - 1, x, m[array_size - 1][x]);
	printf("\n");

	for ( x = 0; x < array_size; x++ )
		free(m[x]);
	free(m);

	return 0;
}
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2008, 07:17   #38
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da grigor91 Guarda i messaggi
[OT]
E' interessante notare come il mio futuro libro di sistemi riesca a trattare la macchina di Touring senza citare gli automi a stati finiti
[/OT]
Turing!
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2008, 09:47   #39
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Comunque alla fine ho tradotto in Python l'idea che avevo, ma sembra dannatamente lenta...
In fondo era solo un metodo "velocizzato" per analizzare tutti i possibili sottoquadrati, ma l'ho lanciato oltre venti minuti fa ed è ancora lì che gira, quindi non so se vale la pena di tradurlo anche in C: dubito di riuscire anche lontanamente a raggiungere gugoXX, pure su un computer serio.
Magari dopo provo a farlo lo stesso e vediamo che schifezza ne esce fuori.

ciao

EDIT: come non detto, ha appena finito...
Ci ha messo appena 35 minuti.
Codice:
Lettura completata in 2500.54476273 millisecondi.
Caricata una matrice 200x200.
Inizio la ricerca... completata in 2115368.25458 millisecondi.

Risultato: posizione (94, 60) larghezza 56 somma 3185
Il codice è il seguente:
Codice:
from time import clock

def read(filename):
	f = open(filename)

	list = []
	first = f.readline()
	side = int(first[2 : len(first)-3])
	for line in f:
		tmp = []
		for w in line.split():
			tmp.append(int(w))
		list.append(tmp)
	f.close()
	return side, list

def sumrange(a, x1, y1, x2, y2):
	s = 0
	for y in xrange(y1, y2):
		for x in xrange(x1, x2):
			s += a[y][x]
	return s

def contest5b(w, a):
	max_side = 1
	max_coord = (0, 0)
	max_sum = 0

	side = 1
	while side <= w:
		x = 0
		while (x + side) <= w:
			tmp = sumrange(a, x, 0, x + side, side)

			if (tmp > max_sum):
				max_coord = (x, 0)
				max_side = side
				max_sum = tmp

			y = 0
			while (y + side) < w:
				for i in xrange(side):
					tmp += (a[y+side][x+i] - a[y][x+i])

				if (tmp > max_sum):
					max_coord = (x, y+1)
					max_side = side
					max_sum = tmp
				y += 1
			x += 1
		side += 1
	return max_coord, max_side, max_sum

t1 = clock()
w, a = read("Matrix2.txt")
t2 = clock()
print "Lettura completata in", (t2-t1)*1000.0, "millisecondi."

print "Caricata una matrice %dx%d." % (w, w)
print "Inizio la ricerca...",
t1 = clock()
coord, side, sum = contest5b(w, a)
t2 = clock()
print "completata in", (t2-t1)*1000.0, "millisecondi."
print
print "Risultato: posizione", coord, "larghezza", side, "somma", sum
Considerando che il mio Contest 4 in Python ci ha messo 13 minuti sulla mia macchina e 38 secondi su quella di grigor91, questo mio Contest 5B dovrebbe impiegare sulla sua macchina la bellezza di 1 minuto e 42 secondi. Considerando anche che il Contest 4 tradotto in C sono riuscito a farlo scendere a 4 minuti su questo catorcio, sul PC di grigor91 il Contest 5B dovrebbe arrivare intorno a... 30 secondi.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!

Ultima modifica di DanieleC88 : 17-08-2008 alle 14:03.
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2008, 11:50   #40
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Daniele, perché non provi Psyco?

Installalo, e all'inizio del tuo programma Python scrivi le seguenti 2 righe:
Codice:
import psyco
psyco.full()
Eventualmente puoi anche disabilitare il garbage collector. In questo caso il codice di cui sopra diventa così:
Codice:
import psyco, gc
psyco.full()
gc.disable()
Vedrai che con queste tre righe otterrai un buon miglioramento delle prestazioni.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto HP Elitebook Ultra G1i 14 è il notebook c...
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2 Dopo un mese, e 50 foto, cosa abbiamo capito del...
Gigabyte Aero X16 Copilot+ PC: tanta potenza non solo per l'IA Gigabyte Aero X16 Copilot+ PC: tanta potenza non...
L'Italia sfida i giganti tech sui dati: ...
Ora è possibile generare immagini...
Carplay permetterà di visualizzar...
C'è il primo caso mondiale di pat...
TIM offre gratis l'IA di Perplexity Pro ...
Roblox è una miniera d'oro: sedic...
Windows 11, addio difficili backup manua...
Il Regno Unito esclude la auto cinesi da...
PS5 Digital Edition con Fortnite e 1 TB ...
Microsoft Francia ammette di non poter p...
Apple Watch SE arriva al minimo storico ...
Hai sbagliato se hai dato lo smartphone ...
X sotto accusa in Francia: 'Ci trattano ...
CMF Watch 3 Pro: lo smartwatch con AI ch...
ASUS: la potenza dei supercomputer NVIDI...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:15.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v