nesneler ve işaretçiler
Bunlar, hammar'ın diğer yanıtta söylediği gibi temel veri yapılarıdır, Java
bunu kenarlar ve köşeler gibi sınıflarla temsil edersiniz. Örneğin, bir kenar iki köşeyi birbirine bağlar ve yönlendirilebilir veya yönsüz olabilir ve bir ağırlık içerebilir. Bir tepe noktasının kimliği, adı vb. Olabilir. Çoğunlukla her ikisinin de ek özellikleri vardır. Böylece grafiğinizi onlarla şöyle oluşturabilirsiniz:
Vertex a = new Vertex(1);
Vertex b = new Vertex(2);
Edge edge = new Edge(a,b, 30); // init an edge between ab and be with weight 30
Bu yaklaşım genellikle nesne yönelimli uygulamalar için kullanılır, çünkü nesne yönelimli kullanıcılar için daha okunabilir ve daha uygundur;).
matris
Bir matris sadece 2 boyutlu basit bir dizidir. Bunun gibi bir int dizisi olarak temsil edilebilen köşe kimlikleriniz olduğunu varsayarsak:
int[][] adjacencyMatrix = new int[SIZE][SIZE]; // SIZE is the number of vertices in our graph
adjacencyMatrix[0][1] = 30; // sets the weight of a vertex 0 that is adjacent to vertex 1
Bu, genellikle dizin erişiminin gerekli olduğu yoğun grafikler için kullanılır. Bununla yönlendirilmemiş ve ağırlıklı bir yapıyı temsil edebilirsiniz.
bitişiklik listesi
Bu sadece basit bir veri yapısı karışımı, genellikle bunu bir HashMap<Vertex, List<Vertex>>
. HashMultimap
Guava'da da benzer şekilde kullanılabilir .
Bu yaklaşım harika, çünkü O (1) (amortize edilmiş) köşe aramanız var ve bana talep ettiğim bu belirli köşeye tüm bitişik köşelerin bir listesini döndürüyor.
ArrayList<Vertex> list = new ArrayList<>();
list.add(new Vertex(2));
list.add(new Vertex(3));
map.put(new Vertex(1), list); // vertex 1 is adjacent to 2 and 3
Bu, seyrek grafikleri temsil etmek için kullanılır, Google'a başvuruyorsanız, web grafiğinin seyrek olduğunu bilmelisiniz. Bir BigTable kullanarak onlarla daha ölçeklenebilir bir şekilde başa çıkabilirsiniz .
Oh ve BTW, işte bu yazının süslü resimlerle çok iyi bir özeti;)