Pointers cho phép hiệu quả tổng hợp cấu trúc dữ liệu
Bạn có một cái gì đó như thế này (sử dụng mã giả C++):
class Node
bool visited
double key
Node* pi
vector<pair<Node*, double>> adjacent //adjacent nodes and edge weights
//and extra fields needed for PriorityQueue data structure
// - a clean way to do this is to use CRTP for defining the base
// PriorityQueue node class, then inherit your graph node from that
class Graph
vector<Node*> vertices
CRTP: http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
Hàng đợi ưu tiên Q
trong thuật toán chứa các hạng mục loại Node*
, trong đó ExtractMin
giúp bạn số Node*
với số tiền tối thiểu key
.
Lý do bạn không phải thực hiện bất kỳ tìm kiếm tuyến tính nào là vì khi bạn nhận được u = ExtractMin(Q)
, bạn có Node*
. Vì vậy, u->adjacent
mang lại cho bạn cả hai số v
trong G.Adj[u]
và w(u,v)
trong thời gian const cho mỗi nút liền kề. Vì bạn có một con trỏ v
đến nút hàng đợi ưu tiên (mà làv
), bạn có thể cập nhật vị trí của nó trong hàng đợi ưu tiên trong thời gian logarit mỗi nút liền kề (với hầu hết các trường của một hàng đợi ưu tiên).
Để đặt tên cho một số cấu trúc dữ liệu cụ thể, chức năng DecreaseKey(Q, v)
được sử dụng bên dưới có độ phức tạp logarit cho vùng Fibonnaci và đống ghép đôi (khấu hao).
More-bê tông cho thuật toán
MstPrim(Graph* G)
for each u in G->vertices
u->visited = false
u->key = infinity
u->pi = NULL
Q = PriorityQueue(G->vertices)
while Q not empty
u = ExtractMin(Q)
u->visited = true
for each (v, w) in u->adjacent
if not v->visited and w < v->key
v->pi = u
v->key = w
DecreasedKey(Q, v) //O(log n)
Nguồn
2013-06-12 22:23:55
Xem http://stackoverflow.com/questions/4825518/how-to-implement-prims-algorithm-with-a-fibonacci-heap –
Tôi không hiểu lắm. Ông đang sử dụng một băm bổ sung, mục đích của nó là gì? – SexyBeast