I problemi con le strutture dati sono comuni per i principianti? [chiuso]


17

Sto seguendo il mio secondo corso su Java. Stiamo entrando nelle strutture di dati. Ho fatto un incarico in un elenco collegato e ora uno stack. Ho avuto difficoltà con l'elenco collegato. Lo stack mi ha dato un po 'di problemi, ma è stato molto più semplice.

Dovrei essere preoccupato di avere dei problemi con questi algoritmi e strutture dati? Sento di non averlo capito davvero.


Esempio reale della lista concatenata - stackoverflow.com/questions/644167/...
pramodc84

Risposte:


44

Penso che non devi accettare di non capire queste cose, perché sono davvero fondamentali. Detto questo, non capirli non è niente di cui sentirsi male. Puoi spiegare un elenco collegato a un bambino. Quindi, se il tuo insegnante non ti ha spiegato, è colpa loro. Quindi non dovresti passare il tempo a preoccuparti, ma piuttosto cerca di trovare persone che possano spiegartelo. Spesso un compagno di studi è un insegnante di gran lunga migliore di un accademico a tempo pieno.

Pensa ai treni

Immagina di avere una serie di vagoni ferroviari, in cui ogni carrozza ha una capacità sufficiente per contenere un dato. Ogni carrello ha una sorta di gancio all'estremità, che può essere attaccato alla parte anteriore di un altro carrello.
Questo in effetti ti dà un elenco collegato:

  • l'elenco vuoto: il treno non contiene carrozze (e quindi non trasporta dati)
  • aggiunta di un elemento: aggiungi un nuovo carrello contenente l'elemento davanti al treno e aggancialo al resto del treno
  • rimozione di un elemento: trova il carrello contenente l'elemento. Rimuovilo (potresti aver bisogno di una gru qui :)), aggancia il carrello prima con il carrello dopo.
  • sostituzione di un elemento: trova il carrello contenente il vecchio elemento. Scambia il vecchio elemento con il nuovo elemento.
  • inserendo un elemento subito dopo l'altro: trova il carrello contenente l'elemento dopo il quale vuoi inserire. Inserisci una nuova carrozza dopo di essa, che è agganciata di conseguenza (non vogliamo che il treno cada a pezzi) e inserisci il nuovo elemento al suo interno.

Al contrario, potresti pensare a un array come un treno con un determinato numero di carrozze, che non può essere riorganizzato in alcun modo. Tutto quello che puoi fare è cambiare i dati al loro interno. Questo modello spiega anche molti dei problemi che gli array hanno:

  • Se vuoi inserire un elemento prima di un altro, dovrai spostare tutti i seguenti elementi sul carrello successivo.
  • Se si desidera rimuovere un elemento, sarà necessario spostare tutti i seguenti elementi di un carrello in avanti.
  • Se hai bisogno di un treno con più carrozze, dovrai costruirne uno nuovo, perché non puoi semplicemente anteporre una carrozza. D'altra parte, trovare i carrelli in un array è molto più facile, perché puoi semplicemente numerarli permanentemente (il loro ordine non cambierà mai).

Per quanto riguarda lo stack: uno "stack" è meno una struttura di dati, che un'idea. L'idea della pila è che si comporta come una pila di libri. Puoi solo mettere i libri in cima alla pila e puoi sempre togliere il libro in cima alla pila (almeno se i libri sono sufficientemente pesanti).
Detto questo, un elenco collegato può essere utilizzato come una pila, se si considerano i dati nei carrelli come libri e il libro nel primo carrello più come la parte superiore della pila.

Quindi spero che questo ti abbia aiutato. Forse no. Forse sei più di un tipo visivo. In tal caso, ti suggerisco di trovare qualcuno che sia bravo a dare spiegazioni visive e te lo spieghi. Non ci vorrà molto, ma ne varrà assolutamente la pena.

Va bene lottare con questo ora. Ma semplicemente accettarlo, non è un'opzione a lungo termine.


2
Bella risposta! Mi ha fatto capire che si potevano insegnare ai bambini le strutture di dati di base attraverso un gioco flash / altro con una serie di obiettivi da completare. La stessa idea di treni può anche aiutare i bambini a cogliere i numeri binari, se ogni vagone è 2 volte più grande e più piccolo del suo vicino.
Lavoro

1
Ok, ora che ce l'hai, passiamo alle strutture dati con più collegamenti. Quindi il treno ha un intoppo sul lato, che può agganciarsi a un altro set di automobili. Ma il binario di quelle macchine scivola vicino al primo binario ...
Philip

12

Non direi che "dovresti essere preoccupato" per questo, ma il semplice fatto che riconosci i tuoi punti deboli dimostra che sai esattamente dove studiare di più. Penso che sarai ben servito da quell'atteggiamento e starai bene a lungo termine.


6

Per citare il mio insegnante CSCI preferito:

"Panic, but panic early."

Data Structures sembra difficile, vero? Per me lo fa, sembra astratto e un po 'complesso e soprattutto ... importante!

Strutture dati è un corso vitale. Ed è comune lottare, ma continua! Finché mangerai i tuoi Wheaties e continuerai a farlo, raggiungerai l'arcobaleno con un bagpieno di generic items sotto.


Il panico precoce implicherebbe l'abbandono? Dopo le strutture dei dati ci sono anche requisiti matematici, algoritmi, sistema operativo, intelligenza artificiale, compilatori, teoria del calcolo ... non c'è niente di più facile da fare con la madre, ma forse il fatto che uno non sia più una matricola o un secondo anno aiuta persino sebbene le cose stiano diventando più difficili.
Lavoro


3

Data Structures è stata la prima classe "difficile" che ho preso; abbiamo usato Fortran 77 invece di Java, ma i concetti sono sostanzialmente gli stessi.

Mi ci è voluto una settimana in più rispetto ai miei compagni di classe per elaborare il concetto di un elenco collegato; Ho infastidito l'incarico, ma dopo un paio di sessioni un po 'frustranti con il mio professore, alla fine ha fatto clic (letteralmente; ho sentito un "clic" nella mia testa quando ho finalmente capito).

Ognuno ha problemi da qualche parte nel proprio curriculum CS (a meno che non siano dei mostri). Se capisci dove sono i tuoi punti deboli e come affrontarli, non hai davvero nulla di cui preoccuparti.


1
Non fatevi prendere dal panico, continuate a lavorare e aspettate il clic ...
NWS

2

Hai riscontrato problemi con la comprensione dell'elenco collegato o semplicemente problemi con l'implementazione?

Non è insolito per un nuovo programmatore avere difficoltà lì, perché potrebbe essere la prima volta che devi pensare a cosa significa realmente quando scrivi:

list.head = null;
Element e = new Element(...);
e.next = list.head;
list.head = e;

Sono stato contorto in ALGOL / W nello stesso esercizio, perché non capivo bene la semantica della lingua. Un anno dopo, riuscivo a malapena a ricordare perché avevo difficoltà.


1

Ci sono sicuramente alcune aree di sviluppo software che trovi più difficili di altre. Che si tratti di determinati algoritmi, determinati modelli di progettazione o determinate procedure varieranno da persona a persona. Trovo che devo usare qualcosa su un vero programma prima di capirlo appieno.

Sarei più preoccupato se qualcuno affermasse di sapere tutto e non avessi mai avuto problemi ad imparare qualcosa.

Personalmente non ho mai avuto problemi con gli elenchi collegati, ma poi ho lavorato su un programma per 8 anni che li ha usati ovunque, quindi ho lavorato con loro su base giornaliera. Finché sai dove trovare le informazioni necessarie per aggiornare la memoria e conoscere le aree in cui hai "problemi", dovresti essere OK.


Penso anche che sarebbe utile se potessi interagire con un programma che utilizza anche queste strutture di dati. Sono sul palco dove mi chiedo, perché dovrebbero essere utili?
Brock,

0

Ho avuto problemi con il calcolo e ho dovuto prenderlo una seconda volta. La seconda volta ho scoperto di essere intelligente ma il primo insegnante di matematica era praticamente inutile :)

Troverai molte persone nell'IT che non sono in grado di comunicare bene, nemmeno gli insegnanti. D'altra parte, alcune persone dell'IT sono davvero grandi scrittori e maestri comunicatori.

A volte la lettura esterna può davvero aiutare. I libri di computer variano enormemente in termini di qualità. Entra su Amazon e scopri quale libro piace alla gente.

In bocca al lupo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.