我想知道如何能够比我想出的更好地解决以下问题。基本上你有n个人,你想通过让他们武装搏斗来找出那些人中最强的人。我想通过n-1决斗如何解决这个问题,但还有其他解决方案,例如log(n)og 3n / 2?
感谢。
答案 0 :(得分:1)
假设“更强”的关系是可传递的...每次决斗都会从一个人中删除一个人。因此,你找不到最强的人n-1
决斗。
答案 1 :(得分:0)
如果我们假设强度是weakly-ordered,那么它与假设&#34相同;如果A强于B,而B强于C,则C永远不会强于A& #34;对于某些A,B,C。也就是说,我们可以认为,如果" A比B&#34更强,并且" B比C&#34更强,那么" A强于C"。
因此,我们的弱序竞赛将由每个邻居将自己与邻居进行比较。这在一轮(N / 2比较)中消除了一半参赛者。我们重复这种力量测试,直到只剩下一个人:
O O O O O O
\ / \ / \ /
O O O
\ / |
\ / |
O O
\ /
\ /
\ /
O
这种算法的时间复杂度是O(N)和"轮数"是楼(log_2(N))。在我的例子中,N = 6,并且floor(log_2(6))= 2.它是O(N)因为我们遇到了N / 2形式的多个对峙,然后是N / 4,然后是N. / 8,......然后1,留下总和N / 2 + N / 4 + N / 8 + ... + 1,或N /(2 i )的总和我从0到楼(log_2(N)),并且由于我们知道楼层(log_2(N))小于无穷大,我们可以有把握地说结果小于或等于summation of the common geometric series乘以N,这是N.因此O(N)
如果我们不能假设弱排序,那么我们最终会出现A可能击败B的情况,而B可能会击败C,但C可以击败A.无法排序"排序"这样的集合按最强到最弱的顺序排列,所以我们不得不让每个人都对抗每个人,以便我们可以计算胜利/损失记录。然后我们可以通过胜利来命令我们的竞争对手。这样一种算法来计算所有对"是O(N 2 )(因为比较的数量是Triangular Numbers减去n):
所以我们得到像(n-1)+(n-2)+ ... + 1
这样的对峙的总和