Bir grafik 3-klik sayım

1 Cevap php

Ben yaklaşık 380K kenarlara sahip (çok değil) büyük grafik üzerinde çalışan duyuyorum. Ben Grafikte 3-klikler sayısını saymak için bir program yazdı. Hızlı bir örnek:

List of edges:
A - B
B - C
C - A
C - D

List of cliques:
A - B - C

MySQL Tablo yapısı:

+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| v1    | bigint(20) | YES  | MUL | NULL    |       | 
| v2    | bigint(20) | YES  | MUL | NULL    |       | 
+-------+------------+------+-----+---------+-------+

A 3-kliğin bir grafikte bir üçgen ama bir şey değildir. Şu anda, ben bu kullanarak PHP + MySQL yapıyorum. Beklendiği gibi, o yeterince hızlı değil. Saf MySQL bunu yapmak için bir yolu var mı? (Belki de bir tabloya tüm 3-klikler eklemek için bir yol?)

1 Cevap

SELECT T1.v1, T2.v1, T3.v1 FROM TableName T1, TableName T2, TableName T3
WHERE T1.v1 < T1.v2 AND T2.v1 < T2.v2 AND T3.v1 < T3.v2
AND T1.v1 = T3.v1 AND T1.v2 = T2.v1 AND T2.v2 = T3.v2

Hile yapmak gerekir. Ne ben orada yaptık v1 sadece çiftleri kaldırmak için, değerlendirilen bütün kenarları için v2 daha az olmasını sağlamak olduğunu. Sonra onların başlangıç ​​/ bitiş noktaları ile kenarları yukarı katılma basit bir konudur. Çiftlerinin her biri ilk noktayı dönen.

Bir düğüme giden kenarları varsa geri aynı düğüme buna uygun olarak ekstra kontroller eklemek gerekebilir.

EDIT: Made değişikliği, biz T3 bulunan kenar T1 kenarına kadar maçları, bu yüzden birlikte her ilk bağlantı olduğundan emin olmak için gerekli olduğunu bana Legend.Reminded için teşekkürler! Başlangıçta nerede fıkra ilk satırında T3.v1> T3.v2 vardı ama karışıklığı azaltmak için değiştirildi olsa ikinci bölümünü değiştirmek için unuttum!