Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Dijkstra  (Citit de 5459 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
Marius
Nu mai tace
*****

Karma: 154
Deconectat Deconectat

Mesaje: 572



Vezi Profilul
« : Ianuarie 07, 2006, 18:54:31 »

Am o problema cu implementarea algoritmului lui Dijkstra cu o coada de prioritati, adica cu un heap binar, pentru ca e singurul pe care il stiu (Fibonacci nu Tongue ). Mai precis, daca in coada de prioritati am nodurile si marginea superioara a costului minim, cum il pot gasi rapid (O(1) ?) ca sa il pot "relaxa". Dupa aceea este log V, asta stiu  Very Happy.

Multumesc anticipat!
Memorat

Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
Marius
Nu mai tace
*****

Karma: 154
Deconectat Deconectat

Mesaje: 572



Vezi Profilul
« Răspunde #1 : Ianuarie 08, 2006, 22:00:22 »

Am gasit solutia !  Very Happy Initial m-am gandit la pastrarea unui vector x[], unde x[i ] este pozitia in coada de prioritati a nodului i, dar nu reuseam sa il gasesc in coada cand avea valoarea infinit, putand fi in stanga sau in dreapta. Dar acum il construiesc de la zero, adica introduc nodul sursa si apoi, pe rand, daca nu au fost introduse celelalte noduri cu "relaxarea" de rigoare. 

Oricum, daca stie cineva o tehnica mai buna il rog sa imi spuna si mie! (Cred ca va spune mai multora!)  Smile
« Ultima modificare: Martie 08, 2007, 09:28:54 de către Valentin Stanciu » Memorat

Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
filipb
Nu mai tace
*****

Karma: 232
Deconectat Deconectat

Mesaje: 929



Vezi Profilul
« Răspunde #2 : Ianuarie 09, 2006, 21:50:29 »

Mie cel mai simplu pentru Djikstra O(N log N) mi se pare cu arbore de intervale... ai un vector de lungime N in care retii distantele de la nodul sursa si un arbore de intervale: minimul pe intervalul respectiv in vector... si merge frumos... imi place mai mult decat sa fac heapurile.. bine, daca folosesti STL se merita sa faci heapuri pt. k e mult mai scurt.

Iar daca vrei cu heapuri, merge cu vectorul de pozitii care sa iti spuna pe ce pozitie in heap este nodul respectiv, iar cand faci sift sau percolate modifici si vectorul de pozitie pt. cele 2 noduri care se interschimba.
SPOR!
Memorat
Marius
Nu mai tace
*****

Karma: 154
Deconectat Deconectat

Mesaje: 572



Vezi Profilul
« Răspunde #3 : Ianuarie 13, 2006, 20:52:46 »

Am reusit sa imi rezolv problema cu arborii de intervale!  Applause  Sunt incepator in din astea asa ca iti multumesc mult mult!

SPOR si tie Filip!  Thumb up
Memorat

Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
upthewall
Vizitator
« Răspunde #4 : Aprilie 03, 2006, 14:32:21 »

Nu mi-e obiceiul ca lucrez cu C++ STL de obicei, dar m-am bagat si am implementat o sursa pt Dijkstra in pascal folosind heapuri binare (ca in STL). E cam lung dar e bun pt a intelege ideea, si pt a intelege heapurile, pentru cine nu stie deja cu ce se mananca algoritmii de baza ai grafurilor Smile
http://informatrix.ro/informatica/dijkstra.pas.php
Memorat
Marius
Nu mai tace
*****

Karma: 154
Deconectat Deconectat

Mesaje: 572



Vezi Profilul
« Răspunde #5 : Aprilie 03, 2006, 16:46:51 »

Apropo de STL in C++, am facut un program cu heap-uri care s-a dovedit de aproximativ 10 ori mai rapid decat cel cu priority queue din STL!   Eh?
Cine e vinovatul: eu sau STL ?
Memorat

Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
svalentin
Nu mai tace
*****

Karma: 88
Deconectat Deconectat

Mesaje: 704



Vezi Profilul
« Răspunde #6 : Aprilie 03, 2006, 16:59:23 »

STL este intradevar ceva mai lent.. dar nu cred ca este chiar de 10 ori..
Memorat
domino
Echipa infoarena
Nu mai tace
*****

Karma: 281
Deconectat Deconectat

Mesaje: 1.340



Vezi Profilul WWW
« Răspunde #7 : Aprilie 03, 2006, 17:00:24 »

Stiam ca nu poti Dijkstra cu heap-uri cu priority_queue (si sa pastrezi complexitatea M*lg N), eventual cu set.
Memorat
Cosmin
Echipa infoarena
Nu mai tace
*****

Karma: 351
Deconectat Deconectat

Mesaje: 1.799



Vezi Profilul
« Răspunde #8 : Aprilie 03, 2006, 17:13:03 »

Poti dijkstra cu heapuri din stl in complexitate O(m log m) cu "lazy deletion", de fiecare data cand ai micsora distanta la un nod si ai modifica in heap, acum adaugi la heap acelasi nod cu un cost mai mic ...
Memorat
domino
Echipa infoarena
Nu mai tace
*****

Karma: 281
Deconectat Deconectat

Mesaje: 1.340



Vezi Profilul WWW
« Răspunde #9 : Aprilie 03, 2006, 17:38:06 »

STL e bun in multe momente, dar nu cred ca se merita la Dijkstra.
Memorat
Cosmin
Echipa infoarena
Nu mai tace
*****

Karma: 351
Deconectat Deconectat

Mesaje: 1.799



Vezi Profilul
« Răspunde #10 : Aprilie 03, 2006, 17:41:37 »

Nu neaparat, pe topcoder foloseste lumea Dijkstra scris in felul asta destul de mult, e foarte usor de implementat si e O(m log m) in loc de O(N^2). Unde limita de timp nu e foarte stransa se poate folosi usor. Nu stiu cum a implementat Marius, dar totusi nu cred ca o implementare ok folosind STL merge de 10 ori mai incet decat una ce nu foloseste STL.
Memorat
bogdan2412
Echipa infoarena
Nu mai tace
*****

Karma: 410
Deconectat Deconectat

Mesaje: 951



Vezi Profilul
« Răspunde #11 : Aprilie 03, 2006, 17:56:18 »

Merge cam la fel de repede de fapt...  l-am implementat acum ceva timp cu Set-uri... E scurt si rapid Smile
Memorat
gogu
Client obisnuit
**

Karma: 42
Deconectat Deconectat

Mesaje: 98



Vezi Profilul
« Răspunde #12 : Aprilie 03, 2006, 18:13:20 »

E de fapt aceasi complexitate pentru ca O(logM) e echivalent cu O(logN). Doar memorie e mai multa daca inteleg eu algoritmul.
Memorat
Cosmin
Echipa infoarena
Nu mai tace
*****

Karma: 351
Deconectat Deconectat

Mesaje: 1.799



Vezi Profilul
« Răspunde #13 : Aprilie 03, 2006, 19:43:21 »

Stiu ca e aceiasi complexitate Smile, singura diferenta fata de algoritmul standard e ca in heap o sa fie cel mult M valori in loc de N valori. Nu stiu ce ziceti voi de set, eu ziceam de priority_queue.
Memorat
svalentin
Nu mai tace
*****

Karma: 88
Deconectat Deconectat

Mesaje: 704



Vezi Profilul
« Răspunde #14 : Aprilie 03, 2006, 19:51:55 »

A incercat cineva ambele implementari, si cu priority_queue si cu set? E vre-o diferenta de timp? Cu set vine logN, dar cu constanta mai mare..
« Ultima modificare: Aprilie 03, 2006, 19:53:45 de către svalentin » Memorat
nash
De-al casei
***

Karma: 0
Deconectat Deconectat

Mesaje: 109



Vezi Profilul
« Răspunde #15 : Martie 08, 2007, 02:11:31 »

Dijkstra in O(m log m) cu "lazy deletion" ... nu prea mi-a fost clara ideea .... poate sa detalieze cineva ?

Later Edit: Mi-am dat seama ... Smile ... draguta ideea ori si cum Smile

editat de moderator: nu mai posta de 2 ori consecutiv, mai ales daca este vorba despre aceeasi idee
« Ultima modificare: Martie 08, 2007, 14:33:03 de către Andrei Grigorean » Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines