Одним из заданий в моем классе алгоритмов является разработка исчерпывающего алгоритма поиска для решения проблемы клика. То есть, учитывая график размера n , алгоритм должен определить, существует ли полный подграф размера k . Я думаю, что получил ответ, но я не могу не думать, что он может быть улучшен. Вот что у меня есть:
Версия 1
input : График, представленный массивом A [0, ... n -1], размер k подграфа для поиска.
output : True, если существует подграф, False в противном случае
Алгоритм (в псевдокоде, подобном Python):
def clique(A, k):
P = A x A x A //Cartesian product
for tuple in P:
if connected(tuple):
return true
return false
def connected(tuple):
unconnected = tuple
for vertex in tuple:
for test_vertex in unconnected:
if vertex is linked to test_vertex:
remove test_vertex from unconnected
if unconnected is empty:
return true
else:
return false
Версия 2
input : Матрица смежности размером n на n и k размера подграфа для поиска
вывод : все полные подграфы в A размером k.
Алгоритм (на этот раз в функционале / псевдокод Python):
//Base case: return all vertices in a list since each
//one is a 1-clique
def clique(A, 1):
S = new list
for i in range(0 to n-1):
add i to S
return S
//Get a tuple representing all the cliques where
//k = k - 1, then find any cliques for k
def clique(A,k):
C = clique(A, k-1)
S = new list
for tuple in C:
for i in range(0 to n-1):
//make sure the ith vertex is linked to each
//vertex in tuple
for j in tuple:
if A[i,j] != 1:
break
//This means that vertex i makes a clique
if j is the last element:
newtuple = (i | tuple) //make a new tuple with i added
add newtuple to S
//Return the list of k-cliques
return S
У кого-нибудь есть мысли, комментарии или предложения? Это включает в себя ошибки, которые я мог пропустить, а также способы сделать это более читабельным (я не привык использовать много псевдокодов).
Версия 3
К счастью, я поговорил со своим профессором, прежде чем отправлять задание. Когда я показал ему псевдокод, который я написал, он улыбнулся и сказал мне, что я выполнил way слишком много работы. Во-первых, мне не нужно было отправлять псевдокод; Я просто должен был продемонстрировать, что понял проблему. И во-вторых, он хотел , чтобы получить решение о грубой силе. То, что я сдал, выглядело примерно так:
вход : график G = (V, E), размер клики для поиска k
output : True, если клика существует, иначе false
Алгоритм
- Найдите декартово произведение V k .
- Для каждого кортежа в результате проверьте, связана ли каждая вершина с любой другой. Если все подключены, верните true и выйдите.
- Вернуть false и выйти.
ОБНОВЛЕНИЕ : Добавлена вторая версия. Я думаю, что это становится лучше, хотя я не добавлял никакого необычного динамического программирования (о котором я знаю).
ОБНОВЛЕНИЕ 2 : Добавлено еще несколько комментариев и документации, чтобы сделать версию 2 более читабельной. Это, вероятно, будет той версией, которую я представляю сегодня. Спасибо всем за помощь! Я хотел бы принять более одного ответа, но я принял ответ человека, который помог мне больше всего. Я дам вам, ребята, знать, что думает мой профессор.