Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-02-2008, 09:15   #1
diego86
Senior Member
 
L'Avatar di diego86
 
Iscritto dal: Mar 2004
Città: Milano
Messaggi: 415
[C] che struttura uso?

Buongiorno a tutti... dovrei implementare una struttura dati che mi permetta di ottenere una scacchiera rettangolare di dimensioni r × c dentro la quale posizionare delle pedine colorate numerate. Le operazioni che poi posso fare saranno di inserire nuove pedine o di eliminarne e di verificare se esiste un gruppo di pedine dello stesso colore che sono adiacenti.
A questo punto io utilizzerei una lista che permette di salvare dentro ogni oggetto la sua posizione, il colore e il suo valore.
Il problema è che poi devo riuscire a risalire a queste pedine in base alla colonna in cui sono inserite, perchè devo poterle spostare da una colonna all'altra ed eliminarle solo se appartengono a una determinata colonna.
Questo sarebbe ancora fattibile con una lista, ma dovendola scorrere tutta ogni volta, mi sembra poco efficace come metodo..
Voi cosa consigliate? Mi conviene usare più matrici? Grazie..
__________________
Ho concluso con Worp, -V3G3TA-, Marco911, TheDragon81, ciociola
------------------------------------------------
Diego
diego86 è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2008, 09:42   #2
amedeoviscido
Senior Member
 
Iscritto dal: May 2005
Città: Napoli - Fuorigrotta
Messaggi: 471
In C puro io farei una matrice di puntatori a struttura, secondo me è la cosa più naturale che si possa fare!

PS Modifica il titolo della discussione, c dev'essere scritto fra parentesi quadre [C]
__________________
Acquisti sul mercatino: grabrihc, LucaXbox360, Yarsha,micanto1,American horizo,Fnac,schumyFast,STECCO,Ezechiele25,17
Vendite sul mercatino: musodatopo,alexbands,mspr,anto.wajo
amedeoviscido è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2008, 10:38   #3
diego86
Senior Member
 
L'Avatar di diego86
 
Iscritto dal: Mar 2004
Città: Milano
Messaggi: 415
come faccio a editare il titolo?

poi la matrice di puntatori dovrebbe puntare alle singole pedine?
perchè la dimensione della scacchiera non è nota a priori ma solo run-time.. inoltre se l'utente vuole inserire una pedina in una qualsiasi posizione deve poterlo fare
__________________
Ho concluso con Worp, -V3G3TA-, Marco911, TheDragon81, ciociola
------------------------------------------------
Diego
diego86 è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2008, 10:46   #4
ramarromarrone
Senior Member
 
Iscritto dal: Jun 2007
Messaggi: 497
io ti consiglio una lista di liste..

struct pedina {
char *colore;
};
typedef struct pedina pedina;

struct asse_x {
int x;
pedina *p;
struct asse_x *next;
};
typedef struct asse_x asse_x;

struct asse_y {
int y;
asse_x *a;
struct asse_y *next;
};
typedef struct asse_y asse_y;

è meglio di una matrice perchè è una struttura dinamica e cresce al crescere dei dati in input senza spreco di memoria (al contrario della matrice)...per cercare una pedina in una coordinata (x1,y1) dovrai prima scorrere l'asse_y finchè y == y1 e poi scorrere l'asse_x relativo finchè x == x1.
ramarromarrone è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2008, 10:52   #5
ramarromarrone
Senior Member
 
Iscritto dal: Jun 2007
Messaggi: 497
la tua richiesta è molto simile al progetto di algoritmi e strutture dati dell'università di milano...

a seconda poi di quello ce effettivamente queste pedine colorate dovranno fare invece potresti optare per strutture dati più complesse.
per esempio se ti servirà trovare pedine di ugual colore vicine potresti decidere di creare diversi grafi, che contengono pedine dello stesso colore (è abbastanza semplice, ogni vlta che devi inserire una nuova pedina colorata selezioni tutti i grafi di quel colore e vedi se in uno di questi c'è una casella "vicina" a quella che devi inserire, se non c'è crei un altro grafo con la pedina)

se hai bisogno chiedi pure
ramarromarrone è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2008, 11:20   #6
diego86
Senior Member
 
L'Avatar di diego86
 
Iscritto dal: Mar 2004
Città: Milano
Messaggi: 415
ok...grazie mille...intanto mi installo il mio caro vecchio borland c che pensavo non mi sarebbe più servito....e invece...
poi ramarro posso contattarti se ho bisogno? da quanto ho capito sei un mio predecessore nella carriera scolastica
__________________
Ho concluso con Worp, -V3G3TA-, Marco911, TheDragon81, ciociola
------------------------------------------------
Diego
diego86 è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2008, 11:24   #7
ramarromarrone
Senior Member
 
Iscritto dal: Jun 2007
Messaggi: 497
Quote:
Originariamente inviato da diego86 Guarda i messaggi
ok...grazie mille...intanto mi installo il mio caro vecchio borland c che pensavo non mi sarebbe più servito....e invece...
poi ramarro posso contattarti se ho bisogno? da quanto ho capito sei un mio predecessore nella carriera scolastica

contattami pure quando vuoi
oggi pomeriggio non sarò connesso fino alle 17.30-18 circa quindi se lasci messaggi o post non ti potrò rispondere fino a quell'ora
ciao

PS:come compiler ti consiglio gcc e come editor ccy
ramarromarrone è offline   Rispondi citando il messaggio o parte di esso
Old 21-02-2008, 12:31   #8
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Ciao.
Se la dimensione della scacchiera fosse fissa, e se non fosse sparsa, allora io userei il matricione, che ti permetterebbe di inserire, cancellare e calcolare
le adiacenze in poco piu' di O(1).
Se invece la dimensione fosse variabile e se il contenuto fosse sparso, al posto che una soluzione a liste io preferirei una soluzione ad hastable.
Una Hahtable di.. Hashtable.
Anche questo caso gli inserimenti, cancellazioni e calcolo delle adiacenze sarebbero in poco piu' di O(1).
Tale soluzione e' molto simile alla lista di liste, che se ordinata darebbe O(log N)*O(log N), e se invece non ordinata sarebbe O(N 2)

Ladifferenza tra le 2, a parte la complessita' realizzativa, sta appunto nella memoria occupata. Si puo' sicuramente calcolare un rapporto "CelleOccupate"/"CelleDellaScacchiera" oltre il quale conviene la prima al posto della seconda.

Ovviamente se e' un esercizio la prima soluzione e' troppo banale e verrebbe rifiutata se non debitamente argomentata (appunto la % di spazio occupato).
Per quanto riguarda la seconda che ritengo comunque elegante, se non devi/puoi farlo in C# posso postarti le 10 righe di codice che servirebbero.
__________________
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 : 21-02-2008 alle 12:37.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 22-02-2008, 17:31   #9
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7263
se la grandezza è nota e di dimensioni ragionevoli senza dubbio userei una matrice (o semplicemente un array lungo r*c) di puntatori a pedine.
a meno che non stiamo parlando di una scacchiera 1000*1000.. in quel caso prenderei in considerazione una struttura più dinamica.
ad esempio se si utilizza una struttura dati come quella proposta da ramarromarrone è vero che si occupa memoria solo quando è necessario (ottimo nel caso di matrici sparse), ma è anche vero che se ne occupa il triplo per ogni cella (in pratica nel caso in cui più di 1/3 delle celle contiene una pedina è sconveniente), e che tutte le operazioni sulla scacchiera sono più complesse.

ps. per denotare il colore userei delle costanti

Ultima modifica di k0nt3 : 22-02-2008 alle 17:33.
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 24-02-2008, 08:31   #10
diego86
Senior Member
 
L'Avatar di diego86
 
Iscritto dal: Mar 2004
Città: Milano
Messaggi: 415
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Ciao.
Se la dimensione della scacchiera fosse fissa, e se non fosse sparsa, allora io userei il matricione, che ti permetterebbe di inserire, cancellare e calcolare
le adiacenze in poco piu' di O(1).
Se invece la dimensione fosse variabile e se il contenuto fosse sparso, al posto che una soluzione a liste io preferirei una soluzione ad hastable.
Una Hahtable di.. Hashtable.
Anche questo caso gli inserimenti, cancellazioni e calcolo delle adiacenze sarebbero in poco piu' di O(1).
Tale soluzione e' molto simile alla lista di liste, che se ordinata darebbe O(log N)*O(log N), e se invece non ordinata sarebbe O(N 2)

Ladifferenza tra le 2, a parte la complessita' realizzativa, sta appunto nella memoria occupata. Si puo' sicuramente calcolare un rapporto "CelleOccupate"/"CelleDellaScacchiera" oltre il quale conviene la prima al posto della seconda.

Ovviamente se e' un esercizio la prima soluzione e' troppo banale e verrebbe rifiutata se non debitamente argomentata (appunto la % di spazio occupato).
Per quanto riguarda la seconda che ritengo comunque elegante, se non devi/puoi farlo in C# posso postarti le 10 righe di codice che servirebbero.
Potrebbe essere un'ottima idea...se mi posti il codice mi faresti un grandissimo favore
__________________
Ho concluso con Worp, -V3G3TA-, Marco911, TheDragon81, ciociola
------------------------------------------------
Diego
diego86 è offline   Rispondi citando il messaggio o parte di esso
Old 24-02-2008, 10:19   #11
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7263
una soluzione con la tabella di hash può essere la seguente (nella fattispecie si tratta di double hashing):
Codice:
#include <stdio.h>
#include <stdlib.h>

#define MAX_PEDINE 20
#define NUM_ROWS 15
#define NUM_COLS 15

//#define DEBUG

typedef struct Pedina {
  int colore;
  int x, y;
} Pedina;

int hashFunction(int x, int y);
int probeFunction(int x, int y, int i);
int insertPedina(int x, int y, Pedina* ht[]);
void printScacchiera(Pedina* ht[]);

int main(int argc, char* argv[])
{
  Pedina* hashTable[MAX_PEDINE];

  int i=0;
  for(i; i<MAX_PEDINE; ++i)
    hashTable[i] = NULL;

  insertPedina(1, 1, hashTable);
  insertPedina(2, 2, hashTable);
  insertPedina(4, 4, hashTable);
  printScacchiera(hashTable);
  return EXIT_SUCCESS;
}

int hashFunction(int x, int y)
{
  return (x*NUM_ROWS + y*NUM_COLS)%MAX_PEDINE;
}

int probeFunction(int x, int y, int i)
{
  return (i*(2*x-y))%MAX_PEDINE;
}

int insertPedina(int x, int y, Pedina* ht[])
{
  Pedina* p = (Pedina*)malloc(sizeof(Pedina));
  p->x = x;
  p->y = y;
  int h = hashFunction(x, y);
  #ifdef DEBUG
    printf("hash: %d\n", h);
  #endif
  if(ht[h] == NULL)
  {
    ht[h] = p;
    return 0;
  }
  else
  {
    int i = 1;
    int j = 0;
    h = probeFunction(x, y, i);
    #ifdef DEBUG
      printf("probe(%d): %d\n", i, h);
    #endif
    while(ht[h] != NULL && j++ < MAX_PEDINE)
    {
      h = probeFunction(x, y, ++i);
      #ifdef DEBUG
	printf("probe(%d): %d\n", i, h);
      #endif
    }

    if(j > MAX_PEDINE)
      return -1;

    ht[h] = p;
    return i;
  }
}

void printScacchiera(Pedina* ht[])
{
  int i=0;
  for(i; i<MAX_PEDINE; ++i)
  {
    if(ht[i] != NULL)
      printf("pedina in (%d, %d)\n", ht[i]->x, ht[i]->y);
  }
}
ma secondo me ti complichi la vita e basta. IMHO la matrice rimane la scelta migliore se non stiamo parlando di una scacchiera immensa con pochissime pedine.
tra l'altro non c'è motivo di ottimizzare prima di aver riscontrato un qualsiasi problema prestazionale
un tale di nome Donald diceva: "Early optimisation is the root of all evil"
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2008, 10:58   #12
diego86
Senior Member
 
L'Avatar di diego86
 
Iscritto dal: Mar 2004
Città: Milano
Messaggi: 415
ho optato per la lista di liste...la hash table è troppo incasinata
mentre per quanto riguarda i grafi? come potrei fare?
__________________
Ho concluso con Worp, -V3G3TA-, Marco911, TheDragon81, ciociola
------------------------------------------------
Diego
diego86 è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2008, 11:07   #13
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Scusami, mi ero perso.

Come promesso, ecco un codice della Hashtable di Hashtable in C#.
So che devi farlo in C, e come avrai capito in C e' decisamente piu' complesso.

Codice:
public class Scacchiera
    {
        private Dictionary<int, Dictionary<int, Color>> Matrix = null;
        public Scacchiera()
        {
            Matrix = new Dictionary<int, Dictionary<int, Color>>();
        }

        public Color GetColor(int x, int y)
        {
            Color ret=Color.Empty;
            if (Matrix.ContainsKey(y))
            {
                if (Matrix[y].ContainsKey(x))
                {
                    ret = Matrix[y][x];
                }
            }
            return ret;
        }

        public void SetColor(int x, int y, Color col)
        {
            Dictionary<int,Color> riga=null;
            if (!Matrix.ContainsKey(y))
            {
                Matrix[y] = riga = new Dictionary<int, Color>();
            }
            riga[x] = col;
        }
    }
Il codice non e' ottimizzato, ma apposta per lasciarlo leggibile
In pratica, una volta instanziata la matrice, puoi accedervi con i semplici metodi GetColor e SetColor.
Da li' in poi, se devi cercare le adiacenze dirette sono 4 (o 8) ricerche.
se devi cercare le adiacenze estese dovrebbe essere possibile con una semplice funzione ricorsiva.
Come detto, sia la get che la set di questa classe sono risolte in poco piu' di O(1)
__________________
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 : 26-02-2008 alle 11:10.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 27-02-2008, 10:31   #14
diego86
Senior Member
 
L'Avatar di diego86
 
Iscritto dal: Mar 2004
Città: Milano
Messaggi: 415
ho usato questa struttura...

typedef struct scacchiera{
int x;
int y;
int valore biglia;
char * colore biglia;
struct scacchiera *prossx;
struct scacchiera *prossy;
}

l'idea era di ottenere una specie di matrice dinamica, in modo da saltare le caselle vuote e di occupare solo lo spazio dove sono presenti delle pedine. Però mi sto accorgendo che già l'inserimento delle pedine è complicatissimo, bisogna fare un mucchio di controlli e se vado a inserire una nuova pedina è difficilissimo andare a collegarla al resto delle altre pedine (collegandola ovviamente alle pedine della stessa riga e della stessa colonna). Allora poichè questa struttura è anche visibile come un albero (puntatore sinistro figlio sinistro con x maggiore del padre) (puntatore destro figlio destro con y maggiore del padre) è possibile sfruttare questa visione per ottenere un inserimento più efficace?
__________________
Ho concluso con Worp, -V3G3TA-, Marco911, TheDragon81, ciociola
------------------------------------------------
Diego
diego86 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Microsoft Defender: falso allarme sull'a...
Aerei in volo e truppe pronte all'assalt...
Usano Claude per hackerare OpenAI: ricer...
RatHat: il nuovo malware Android usa il ...
Domanda di petrolio in calo di 2,5 milio...
Il meglio delle offerte weekend Amazon a...
Dopo oltre 100 anni di tentativi, l'IA d...
Speciale robot aspirapolvere in offerta ...
L'IA sta cancellando i lavori junior? Il...
Debutta Chery Italia: non più sol...
Addio ai dischi? Xbox ci aveva già...
Speciale TV Amazon: 4 modelli, da 139€ f...
Il nuovo iPhone 18 Pro Max ha una ricari...
Speciale smartphone Android: 7 modelli i...
La Camera USA presenta il conto: i data ...
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: 07:10.


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