Pokud chci u té první reprezentace získat seznam všech vrcholů, musím je nejenom všechny postupně projít (složitost n), ale navíc musím ještě kontrolovat, které už jsem navštívil (protože cykly).
Nerozumíme si. Mluvil jsem o reprezentaci spojovými seznamy v FP jazyku. V pythonovském listu by šlo vynechat ty odkazy na předchůdce, ale hlavně v pythonu je podobná reprezentace nesmysl.
v1 = ('id1', None, None)
v2 = ('id2', v1 ,(v1, 2, None))
v3 = ('id3', v2, (v1, 1, (v2, 3, None)))
odkazy na předchůdce jsou odkazy v listu, ne v grafu. Dá se takto reprezentovat jen DAG (acyklický, orientovaný graf).
Při procházení vrcholů prostě nebudete odbočovat na seznamy hran. Projdete jen list vrcholů.
https://en.wikipedia.org/wiki/Adjacency_listNeplést prosím střední a maximální časovou složitost. Vyhledávání s maximální složitostí (o té jsem psal) O(1) neexistuje. Optimální složitost pro nejhorší případ je O(log n).
viz http://stackoverflow.com/a/9214594/3150343
neúmyslně se vám nepovede vložit několik kolidujících klíčů.
opravdovou hashmapu byste musel kopírovat při každé změně, pokud má být immutable. Právě proto se v FP jazycích používají stromy.
Nemusí. Runtime ví, jestli se do mapy zapisuje, a může klidně použít jakoukoli implementaci.
to je možné, stále zde zůstává problém s neměnností.