[英]C/C++: Creating simple graph library
我一直在考慮在C ++中基於圖論創建一個類。 想法是,將為一個簡單的圖(最多一對頂點之間的一個邊)保存無限數量的頂點和邊。 問題是我將如何以最有效的方式存儲無限數量的頂點/邊。
我想到了在類中將動態指針指向頂點數組的想法。 但是,這樣做效率低下,如果使用此方法,我還將遇到如何確定頂點連接的問題(我將無法確定哪些頂點與哪個頂點連接)。 另一種方法是創建一個Vertex類,該類假定包含其連通性信息。 但是,由於邊的數量不確定,除了在Vertex中使用動態變量外,我無法想到其他方法。 這種方法會使我的代碼效率更差。
那么有更好的方法嗎?
如果您不打算在集合內部頻繁添加和刪除項目,則可以使用STL vectors 。 它們的迭代速度很快,但中間的插入和刪除操作並不可怕。
如果您想經常在任何地方添加/刪除,我將使用STL列表 。 它們的迭代速度較慢,但是插入/刪除操作為O(1)。
然后,您可以將頂點和邊定義為:
class Edge;
class Vertex
{
// ...
public:
std::list<Edge> incomingEdges;
std::list<Edge> outgoingEdges;
}
class Edge
{
// ...
public:
Vertex startpoint;
Vertex endpoint;
}
您會很快發現自己同時需要Vertex和Edge類-太多的算法依賴於着色,加權或標記邊緣,並且混合有向和無向邊緣也更加容易。 您不太會真正關心動態存儲適當的引用,因為這樣可以減少為指針向量。
要考慮的另一個問題是您是否要永久存儲此內容。
建議:嘗試可能首先起作用的最簡單的方法。 假設一個Array類根據需要調整自身大小,則看起來像
class Vertex {
Array<Edge> edges ;
VertexData vd ; // define this for the task.
public:
// ctor etc; quiz: what operations?
}
class Edge {
Vertex v1, v2;
EdgeData ed;
public:
// ctor etc
}
用new
構造所有頂點和邊,不用擔心性能,並針對這些類編寫一些代碼。
然后回去,覺得你怎么會就喜歡寫代碼,並重新實現的類有該接口。
自從我曾經教書並為Marshall Cline和Mike Girou工作以來,我有些偏見,但是我認為對於真正有效使用它的人來說,最好的C ++書之一是Cline,Girou撰寫的The C ++ FAQBook,和洛莫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.