我的算法课中的一项任务是设计一个详尽的搜索算法来解决集团问题。也就是说,给定大小为n的图,算法应该确定是否存在大小为k的完整子图。我想我已经得到了答案,但我不禁认为它可以改进。这是我所拥有的:
版本 1
输入:由数组 A[0,... n -1] 表示的图,要查找的子图的大小k。
输出:如果存在子图则为真,否则为假
算法(在类似 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
输入:大小为 n x n 的邻接矩阵,k 是要查找的子图的大小
输出:大小为 k 的 A 中的所有完整子图。
算法(这次是函数式/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
幸运的是,我在提交作业之前和我的教授谈过了。当我给他看我写的伪代码时,他笑着告诉我我做的工作太多了。其一,我不必提交伪代码;我只需要证明我理解这个问题。第二,他想要蛮力解决方案。所以我上交的东西看起来像这样:
输入:一个图 G = (V,E),找到k的 clique 的大小
输出:如果集团确实存在则为真,否则为假
算法:
- 求笛卡尔积 V k。
- 对于结果中的每个元组,测试每个顶点是否相互连接。如果全部连接,则返回 true 并退出。
- 返回 false 并退出。
更新:添加了第二个版本。我认为这正在变得更好,尽管我没有添加任何花哨的动态编程(我知道)。
更新 2:添加了更多评论和文档以使第 2 版更具可读性。这可能是我今天上交的版本。感谢大家的帮助!我希望我能接受多个答案,但我接受了对我帮助最大的人的答案。我会让你们知道我的教授的想法。