Algorithm 开卷考试群体座位安排的算法

Algorithm 开卷考试群体座位安排的算法,algorithm,Algorithm,您计划为开卷考试安排集体座位,并提供一份学生名单,其中包括来自不同学校的学生。假设事实上,与坐在一起的陌生人相比,彼此直接或间接认识的学生可能会作弊更多。 假设您还得到了一个查找表T,其中T[u]代表u?V是你知道的学生名单。如果你知道v,那么v就知道你。你需要安排座位,这样坐在桌子上的任何学生都不知道坐在同一张桌子上的任何其他学生,无论是直接还是通过坐在同一张桌子上的其他学生。例如,如果x知道y,y知道z,那么x,y,z可以坐在同一张桌子上。描述一种高效算法,在给定V和T的情况下,该算法返回实

您计划为开卷考试安排集体座位,并提供一份学生名单,其中包括来自不同学校的学生。假设事实上,与坐在一起的陌生人相比,彼此直接或间接认识的学生可能会作弊更多。
假设您还得到了一个查找表T,其中T[u]代表u?V是你知道的学生名单。如果你知道v,那么v就知道你。你需要安排座位,这样坐在桌子上的任何学生都不知道坐在同一张桌子上的任何其他学生,无论是直接还是通过坐在同一张桌子上的其他学生。例如,如果x知道y,y知道z,那么x,y,z可以坐在同一张桌子上。描述一种高效算法,在给定V和T的情况下,该算法返回实现此要求所需的最小表数。分析算法的运行时间。

将学生关系延伸到两条边,得到一个图表:

a - e - j
      \ q

b - d
  \ t

r - w - x - y - z
同一子图中的所有学生都必须分开,因此最大组中的每个学生最少有一个表-在本例中,最大的子图是
r-w-x-y-z
,因此有5个表

未经测试的Python伪代码:

# Given a student list
# a b c d e f j q r t w x y z

# start a chain at a
# a b c d e f j q r t w x y z
# .

# visit friends of a
# a b c d e f j q r t w x y z
# .       .

# visit friends of a's friends
# a b c d e f j q r t w x y z
# .       .   . .

# if e and j are friends, don't double-count

# Get a count of 4 starting at person a
# Repeat for all students
# Report the longest chain.

friendCounts = {}

def countFriendsOf(T, student, friendTracker, moreSteps=2):
    friendTracker[student] = True #quicker to set it regardless,
                                  #than to check if it's set
    if not moreSteps:
        return

    for friend in T[student]:
        countFriendsOf(T, friend, friendTracker, moreSteps - 1)

    return friendTracker


for u in V:
    friends = countFriendsOf(T, u, friendTracker={})
    friendCounts[u] = (len(friends), friends)

results = sorted(friendCounts.items(), key=lambda x: x[1][0], reverse=True)
(student, (friendCount, friends)) = results[0]

print "The smallest number of tables is:", friendCount
print "Mandated by the friend group of:", student
print

from pprint import pprint
pprint(friends)
分析算法的运行时间

分析:在任何比雪球更强大的电脑上都可以

不确定。最佳案例:学生没有朋友——与学生人数成线性关系。O(n)。最坏的情况是:每个学生都是其他学生的朋友,然后它会为每个学生查找每个学生,所以O(n^3)。嗯

它运行起来更像O(n^2),直到我意识到这个版本肯定是错的

这个版本不仅不是绝对错误,也不是绝对正确


我甚至没有把它作为一个递归解决方案开始,它只是以这种方式结束。friendTracker的使用是一个令人讨厌的副作用,递归调用不是尾部递归优化。Python并没有做到这一点,

很好地开始输入家庭作业问题。输入答案的下一步:-)这是一个叫做学习的过程,而问题很有趣-我们不喜欢被命令。你描述了你的任务。现在告诉我们你尝试了什么,你问的问题到底是什么。我投票结束这个问题,因为OP没有显示任何研究成果。