Я пытаюсь написать алгоритм, который найдет все Cliques (complete subgraphs) на графике. Каждая входная вершина должна быть только в одной результирующей клике. Алгоритм должен иметь временную сложность O(N^2)
. Каждая клика в результате должна быть как можно больше.найти клики в графике с помощью golang
package main
import (
"fmt"
)
type Vertex struct {
Value int
}
type CompleteSubGraph struct {
vertecies []Vertex
}
func areConnected(vertex1, vertex2 Vertex) bool {
// 2 verteces are connected if their value sum is even
return (vertex1.Value+vertex2.Value)%2 == 0
}
func (vertex1 Vertex) getConnectedVertices(vertices []Vertex, maxVertices int) (verticesConnectedWithVertex1 []Vertex) {
for _, vertex2 := range vertices {
if areConnected(vertex1, vertex2) {
verticesConnectedWithVertex1 = append(verticesConnectedWithVertex1, vertex2)
}
if len(verticesConnectedWithVertex1) >= maxVertices {
break
}
}
return
}
func findAllCompleteSubGraphs(
vertices []Vertex,
maximumNumberOfVerticesForSubGraph int,
) (allCompleteSubgraphs []*CompleteSubGraph) {
/*
every vertex from input vertices
must be only in one CompleteSubGraph
the Algorithm must work not slower than O(N^2)
where N is len(vertices)
each vertex from input vertices must be only in one
resulting CompleteSubGraph
each CompleteSubGraph must be as big as possible
*/
for _, vertex1 := range vertices {
connectedToVertex1 := vertex1.getConnectedVertices(vertices,
maximumNumberOfVerticesForSubGraph)
fmt.Println("vertex", vertex1)
fmt.Println("is connected to", connectedToVertex1)
}
return
}
func main() {
vertices := []Vertex{
Vertex{Value: 1}, Vertex{Value: 2}, Vertex{Value: 3},
Vertex{Value: 4}, Vertex{Value: 5}, Vertex{Value: 6},
Vertex{Value: 7}, Vertex{Value: 8}, Vertex{Value: 9},
Vertex{Value: 10}, Vertex{Value: 11}, Vertex{Value: 12},
}
fmt.Println("result", findAllCompleteSubGraphs(vertices, 3))
}
Я проверяю, если 2 vertecies соединены ребром, используя areConnected
функцию. Это просто, например, но будет сложнее в реальной жизни.
Я должен использовать func (vertex1 Vertex) getConnectedVertices
, как он определен сейчас. я застрял на цикле
for _, vertex1 := range vertices {
connectedToVertex1 := vertex1.getConnectedVertices(vertices,
maximumNumberOfVerticesForSubGraph)
fmt.Println("vertex", vertex1)
fmt.Println("is connected to", connectedToVertex1)
}
Едва ли можно представить себе, как закончить алгоритм. Будет ли указывать какие-либо рекомендации.
Update
Исходная задача, которую я пытаюсь решить: найти группы людей, которые подходят друг к другу по некоторым характеристикам. AreConnected
действительно, когда person1
понравилось person2
и person2
понравилось person1
. Задача состоит в том, чтобы создать группы людей с максимальным размером по списку людей. Считается, что большие группы лучше, чем небольшие группы.
Ваше определение для 'areConnected', возможно, изменится каждый раз, когда вы его вызываете. Как вы можете определить клики графа, если ребра вашего графа случайно появляются и исчезают каждый раз, когда вы пытаетесь проверить, существует ли край? Вы должны использовать случайность для создания графика перед вашим тестовым примером, но тогда ваш алгоритм и определение того, связаны ли две вершины, должны быть детерминированными. –
@AmitKumarGupta Я исправил функцию 'areConnected' выше, спасибо –
Что такое аргумент' maximumNumberOfVerticesForSubGraph'? В описании проблемы вы ничего не говорите об этом, вы просто говорите: «Каждая клика в результате должна быть как можно больше». –