要實現一個圖形我們可以使用列表向量std::vector<std::list<vertex>>
但是我已經在某處看到了如果使用像這樣的地圖std::map<vertex, std::set<vertex>>
那麼我們可以做得更好。任何人都可以從內存或速度的角度弄清楚這是比第一種更好的選擇,哪種更好?在C++中使用stl實現圖形的比較
1
A
回答
0
這裏有兩點不同之處。
std::vector<std::list<vertex>>
是所謂作爲「鄰接表」,並且std::map<vertex, std::set<vertex>>
被稱爲一個「鄰接組」,與添加的不同之處在於有使用map
代替vector
散列頂點數組的索引。我會先討論第一個區別(即list<vertex>
vs set<vertex>
)。
第一個實現基本上是一個鏈接列表數組,其中每個鏈表都給出了與頂點相鄰的所有頂點。第二種實現是將每個頂點映射到一組相鄰頂點的有序映射。
鄰接表的比較VS生長的鄰接設置順序:
空間:(E + V)VS(E + V)
添加邊緣:1對日誌V
檢查鄰接: (頂點度檢查)對日誌V
迭代通過一個頂點的鄰居:(頂點度檢查)與(日誌V +檢查頂點的程度)
...其中E是邊的數量,V是頂點的數量,頂點的度數是連接到它的邊的數量。 (我正在使用無向圖的語言,但對於有向圖,您可以進行類似的推理)。所以如果你有一個非常密集的圖(每個頂點有很多的邊,即高度),那麼你想使用鄰接集。
關於地圖vs矢量的使用:插入和擦除對於矢量是O(N),對於地圖是O(log N)。然而,查找對於矢量是O(1),對於地圖是O(log N)。根據你的目的,你可能會使用一個。雖然你應該注意到,當你使用一個連續的內存空間時(如向量那樣)有緩存優化等。但是我不太瞭解這個,但是還有其他答案提到它:vector or map, which one to use?
相關問題
- 1. 如何在C++中實現STL priority_queue中的這種比較類
- 2. C++/STL默認比較器
- 3. 在STL Heap和std :: find中比較std :: shared_ptr的值。 (試圖實現A *)
- 4. 使用STL在C++中實現圖和BFS
- 5. C++中的圖形實現
- 6. STL中的比較器
- 7. C++ STL priority_queue,比較對象的方式
- 8. C++:實現圖形
- 9. 實現在C++圖形類
- 10. 使用類的值在C++中實現stl map
- 11. 在STL中的浮點比較,BOOST
- 12. 如何在C#中實現一個簡單的通用比較#
- 13. 對STL使用比較設置
- 14. 容器訪問比較器(C++/STL)
- 15. 比較C++ STL列表迭代器
- 16. 比較器實現
- 17. C++中STL :: MAP的內部實現
- 18. 用於C++ STL中的SORT的自定義比較函數?
- 19. 實現圖形ADT在C++中
- 20. 比較與STL的sort()
- 21. 什麼是在C++中使用STL實現圖和樹的好方法?
- 22. 在C++中使用CLRS實現廣度優先搜索STL
- 23. 我可以使用比較器而不實現可比較嗎?
- 24. objective-c singleton dispatch_once實現比較好?
- 25. c#中比較位圖(簽名)比較#
- 26. STL地圖自定義比較器
- 27. 實現可比較的java
- 28. 在java中實現比較器
- 29. 在java中實現比較器
- 30. 在postgresql中實現自定義比較
看看這篇不錯的博客帖子,它說如何使用STL創建一個C++圖形: http:// theunixshell .blogspot.in/2014/02 /創建-圖的使用-搶斷合c.html – Vijay