Próbuję zaimplementować algorytm Dijkstry w Haskell. Zaimplementowałem już binarną stertę przy użyciu drzewa. W sąsiedzie algorytmu klucze bieżącego wierzchołka powinny zostać zaktualizowane w stercie. Jak mogę emulować wskaźnik do wartości w stercie w Haskell? Jak mogę uzyskać szybki dostęp do elementów w stercie, podczas gdy sterta zmienia się po każdej operacji?Jak mogę emulować wskaźniki w Haskell?
Odpowiedz
Sprawdź pakiety Data.IORef i Data.STRef, które dają dostęp do zmiennych referencji. Użyj IORefs, jeśli musisz wykonać IO, a także STRefs, jeśli tego nie zrobisz.
Podejrzewam jednak, że prawdopodobnie robisz to źle. Całkiem możliwe jest zaimplementowanie algorytmu Dijkstry bez stanu zmiennego (chociaż musisz być trochę ostrożny, ponieważ możesz łatwo spowodować wzrost asymptotycznego czasu działania, jeśli ciągle przeliczasz oceny funkcji, które mogą być buforowane).
Prawdopodobnie szukasz Data.Vector.Mutable z paczki vector, którą możesz połączyć z ST lub Monadą IO.
Możesz użyć Data.FingerTree.PSQueue, który obsługuje operację adjust, aby zaktualizować stertę. W tym przypadku nie potrzebujesz wskaźników do wartości w stercie, ponieważ aktualizujesz je za pomocą kluczy.
- 1. Jak mogę emulować destructuring w C++?
- 2. Jak mogę przechowywać wskaźniki funkcji w tablicy?
- 3. Jak emulować zamknięcia w c
- 4. Jak emulować Event.timeStamp
- 5. Czy mogę emulować svn: externals using mercurial?
- 6. Jak mogę emulować moduły/instalatory/rejestry za pomocą prostego wtryskiwacza
- 7. Jak mogę emulować PUT/DELETE dla Railsów i GWT?
- 8. Android, jak emulować gesty przesuwania w AVD?
- 9. Jak mogę wykonać żądanie HTTPS w Haskell?
- 10. Jak mogę wdrożyć HATEOAS w Haskell?
- 11. Jak mogę przerwać pętlę w Haskell?
- 12. Jak emulować min-szerokość w IE8
- 13. Jak można emulować przestrzeń nazw w C?
- 14. Jak emulować tabelę z divs & css?
- 15. Jak emulować ruch myszy za pomocą Capybara
- 16. Jak mogę zaimportować moduł Haskell do GHCi?
- 17. Jak przedłużyć, naśladować lub emulować funkcję zakresu?
- 18. Inteligentne wskaźniki w Qt
- 19. Jak mogę wyłączyć OpenGL na platformie Haskell?
- 20. Jak uzyskać wskaźniki pracy iskrzenia?
- 21. Jak mogę wykorzystać zarówno stan, jak i pisarz w haskell?
- 22. Jak uzyskać dostęp/zapisać/emulować/0/
- 23. JavaScript: Jak emulować implementację cookie-przeglądarki?
- 24. Przyrostowe wskaźniki
- 25. Jak serializować współdzielone/słabe wskaźniki?
- 26. Kiedy mogę porównać wskaźniki do tego samego obiektu w C++?
- 27. Android Jak emulować zachowanie @android: id/empty w GridView?
- 28. Dlaczego wskaźniki zakresu w zwiększeniu
- 29. Jak mogę emulować funkcję Solver programu Microsoft Excel (GRG Nonlinear) w języku C#?
- 30. Jak mogę emulować "klasy" w JavaScript? (z biblioteką innej firmy lub bez niej)
FWIW, istnieją doskonałe kolejki priorytetowe w hakowaniu, a stosy parowania są łatwiejsze do wdrożenia niż stosy dwupoziomowe, ale mimo to spakowują cios. Jeśli chodzi o mutację: Nie rób tego. Prawdopodobnie istnieje sposób obejścia go i nawet jeśli istnieje zmienna pamięć, używając go wyjątkowo brzydko, aby przypomnieć ci, że nie powinieneś tego robić;) – delnan
Prawdopodobnie uzyskasz lepsze odpowiedzi, jeśli zapytasz jak zrobić szybki Dijkstra w Haskell (który wydaje się być twoim faktycznym problemem) zamiast jednego możliwego rozwiązania. – Pubby
@ElectricHedgehog, jest mnóstwo asymptotycznie optymalnych kolejek priorytetowych, które można zaimplementować funkcjonalnie, w szczególności dwumianowe kolejki. Sprawdź pakiety, takie jak [pqueue] (http://hackage.haskell.org/package/pqueue). –