Java Trees Θελω να φτιαξω ενα DFS tree,(αλλα χωρις αναδρομη)
- Spy
- Kilobyte level
- Posts: 443
- Joined: Mon Dec 12, 2005 9:40 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Ε-75, Ε-65, Ε-90
- Contact:
Java Trees Θελω να φτιαξω ενα DFS tree,(αλλα χωρις αναδρομη)
Ρε παιδια επειδη μου εχει βγαλει τον ερωτα η Java με τα δεντρα της.... και επειδη με αναδρομη μου μπερδευεται η Java με = και τα new... μηπως ξερει κανενας πως να κανω με DFS δεντρο με 5 κλαδια σε καθε κομβο;
Με loop! Οχι αναδρομικα!
Με loop! Οχι αναδρομικα!
Χρησιμοποίησε queue και bfs algorithm. Θα προσθέσεις 5 κόμβους στη ρίζα και μετά, επαναληπτικά, θα "ανοίγεις" κάθε παιδί, θα προσθέτεις τα 5 παιδιά του σε αυτό και θα προσθέτεις κάθε παιδί σε μια queue(ουρά) με τη σειρά. Αφού τελειώσεις με κάθε παιδί, θα αρχίσεις να βγάζεις από την ουρά τα παιδιά(των παιδιών) και θα επαναλάβεις το παραπάνω.
Άρα :
1.Προσθέτω ρίζα στην ουρά.
2.Βγάζω έναν κόμβο από την ουρά.
3.Για κάθε παιδί του κόμβου:
3α.Ο κόμβος δείχνει στο παιδί
3β.Το παιδί προστίθεται στο τέλος της ουράς.
4.Επιστρέφω στο 2, μέχρι να αδειάσει η ουρά.
Ελπίζω να το έπιασες. Κάνε και ένα search στην wikipedia για bfs algorithm και queue.
Άρα :
1.Προσθέτω ρίζα στην ουρά.
2.Βγάζω έναν κόμβο από την ουρά.
3.Για κάθε παιδί του κόμβου:
3α.Ο κόμβος δείχνει στο παιδί
3β.Το παιδί προστίθεται στο τέλος της ουράς.
4.Επιστρέφω στο 2, μέχρι να αδειάσει η ουρά.
Ελπίζω να το έπιασες. Κάνε και ένα search στην wikipedia για bfs algorithm και queue.
"Must float like lotus on river... and kill old lady!"
-
- Venus Former Team Member
- Posts: 7561
- Joined: Thu Oct 27, 2005 1:43 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Boston, MA
-
- Venus Former Team Member
- Posts: 7561
- Joined: Thu Oct 27, 2005 1:43 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Boston, MA
-
- Venus Former Team Member
- Posts: 7561
- Joined: Thu Oct 27, 2005 1:43 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Boston, MA
- Spy
- Kilobyte level
- Posts: 443
- Joined: Mon Dec 12, 2005 9:40 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Ε-75, Ε-65, Ε-90
- Contact:
Συμβαινει κατι πολυ παραξενο... και αναφερομαι στην εργασια της Τεχνιτης Νοημοσυνης (αν θελει καποιος mod να μεταφερει το thread ας το κανει).The Punisher wrote:εδώ αναφερόμουνΧρησιμοποίησε queue και bfs algorithm
Το stackOverflow σημαίνει ότι ξεμένεις από μνήμη. Μπορείς να πειράξεις το μέγεθος της Stack που προσφέρει το jVM με κάποιο ειδικό flag (google it)
Στην αρχη εκανα την εργασια με παραγωμενο δεντρο με αναδρομη... και εβλεπα οτι σε καθε κομβο που εκανα ενα νεο αντικειμενο της σκακιερας, new, μου πετουσε την παραπανω Exception! και συγκεκριμενα στο σημειο που διαγραφω τις παλιες κινησεις και περναω νεες... Η δομες ολες ειναι δικες μου!Καμια δεν ειναι ετοιμη
-
- Venus Former Team Member
- Posts: 7561
- Joined: Thu Oct 27, 2005 1:43 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Boston, MA
Ρε συ σόρρυ, δεν είδα το DFS στον τίτλο και σου έδωσα το άλλο...
Λοιπον, ας τα πάρουμε από την αρχή :
1.Θα βάζεις τα παιδιά σε στοίβα αντί σε ουρά.
2.ΔΕΝ είναι αναδρομή (ούτε ήταν το 1ο που σου πρότεινα αναδρομή), επανάληψη είναι !
3.Ο αλγόριθμός σου είναι:
Α.Βάζω ρίζα στην στοίβα.
Β.Βγάζω τον κόμβο από την στοίβα
Γ.Συνδέω το δέντρο με τον κόμβο.
Δ.Βάζω με την ανάποδη σειρά(προσοχή) τα παιδιά
του κόμβου στην στοίβα. (Εναλλακτικά, βάζω το 1ο παιδί μόνο στη στοίβα μου, αλλά όταν επιστρέφω εδώ βάζω το αμέσως 2ο κλπ.)
Ε.Πάω στο "Β" αν δεν έχει αδειάσει η στοίβα μου.
4.Η στοίβα που θα χρησιμοποιήσεις (αυτή που λέει ο Punisher) είναι έτοιμη από τη Java, μην φτιάχνεις πράγματα αν δεν είσαι σίγουρος...
Η τάξη είναι : java.util.Stack
Μπες στο java api (εκείνο το html εγχειρίδιο) και ψάξε να την βρεις και να δεις ποιες μεθόδους θες να κάνεις την δουλειά σου.
Ελπίζω αυτή την φορά να κατάλαβες.
Λοιπον, ας τα πάρουμε από την αρχή :
1.Θα βάζεις τα παιδιά σε στοίβα αντί σε ουρά.
2.ΔΕΝ είναι αναδρομή (ούτε ήταν το 1ο που σου πρότεινα αναδρομή), επανάληψη είναι !
3.Ο αλγόριθμός σου είναι:
Α.Βάζω ρίζα στην στοίβα.
Β.Βγάζω τον κόμβο από την στοίβα
Γ.Συνδέω το δέντρο με τον κόμβο.
Δ.Βάζω με την ανάποδη σειρά(προσοχή) τα παιδιά
του κόμβου στην στοίβα. (Εναλλακτικά, βάζω το 1ο παιδί μόνο στη στοίβα μου, αλλά όταν επιστρέφω εδώ βάζω το αμέσως 2ο κλπ.)
Ε.Πάω στο "Β" αν δεν έχει αδειάσει η στοίβα μου.
4.Η στοίβα που θα χρησιμοποιήσεις (αυτή που λέει ο Punisher) είναι έτοιμη από τη Java, μην φτιάχνεις πράγματα αν δεν είσαι σίγουρος...
Η τάξη είναι : java.util.Stack
Μπες στο java api (εκείνο το html εγχειρίδιο) και ψάξε να την βρεις και να δεις ποιες μεθόδους θες να κάνεις την δουλειά σου.
Ελπίζω αυτή την φορά να κατάλαβες.
"Must float like lotus on river... and kill old lady!"
- HdkiLLeR
- Venus Project Founder
- Posts: 4356
- Joined: Tue Jan 27, 2004 4:41 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: New York, NY
- Contact:
Η Java δεν είναι native γλώσσα, κοινώς δεν σου παράγει κάποιο executable, αλλά σου παράγει κάποια μαγικά πραγματάκια που ονομάζονται .class files. Αυτά για να εκτελεστούν στο PC σου πρέπει κάποιος να κάνει την βρωμοδουλειά ώστε να πάρει τον κώδικα που είναι μέσα σε ένα .class file και να παράγει τις αντίστοιχες εντολές σε x86 assembly*. Δηλαδή πιο απλά, ο compiler της java παράγει κώδικα για μια υποθετική μηχανή που δεν υπάρχει (για το JVM - Java Virtual Machine), ενώ εσύ θέλεις κώδικα για μια υπαρκτή μηχανή, για το pc σου που φαντάζομαι τρέχει κάποιον x86 επεξεργαστή. Ε αυτό το κάνει η java virtual machine. Πολύ απλά γι' αυτό καλείς java <progname> μετά το compilation και δεν καλείς κατευθείαν το <progname> να τρέξει.Spy wrote:Κατσε...περιμενε. Επειδη δεν ειμαι και τοσο μπροστα οσο εσυ, για πες μου πρωτα τι ειναι το Java virtual machine....The Punisher wrote:Ναι. Εγώ μιλάω για το Stack του jVM, που βάζει τα όρια για το πόσα αντικείμενα (σκακιέρες) θα έχεις ταυτόχρονα στη μνήμη σου
Απο το google δεν καταλαβα και πολλα
Τώρα σχετικά με το πρόβλημα σου, η αναδρομή είναι μνημοβόρα όσον αφορά το stack. Οι παράμετροι που περνάς στις αναδρομικές συναρτήσεις σου τοποθετούνται στην στοίβα και κάνοντας συνεχώς αναδρομή η στοίβα μεγαλώνει. Οπότε κάποια στιγμή δεν έχει άλλο χώρο και σου πετάει το exception αυτό. Μπορείς να δοκιμάσεις να αυξήσεις το μέγεθος της στοίβας της JVM με την εντολή -Xss100m. Δηλαδή όταν τρέχεις το πρόγραμμα σου ή το .jar file σου θα βάζεις σαν παράμετρο στην java το παραπάνω (εάν το πρόγραμμα σου λέγεται foo ):
Code: Select all
java -Xss100m foo
*: To απλοποίησα εδώ λίγο αλλά σε γενικές γραμμές έτσι είναι.
Last edited by HdkiLLeR on Thu Nov 29, 2007 1:45 pm, edited 1 time in total.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie