找到最强的人算法

时间:2017-09-06 19:30:43

标签: algorithm pseudocode array-algorithms

我想知道如何能够比我想出的更好地解决以下问题。基本上你有n个人,你想通过让他们武装搏斗来找出那些人中最强的人。我想通过n-1决斗如何解决这个问题,但还有其他解决方案,例如log(n)og 3n / 2?

感谢。

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):

  • 1面对2,3,4(3个对峙)
  • 2面对3和4(2个对峙,2个面对1)
  • 3面对4面(1面朝下,已面对1和2)

所以我们得到像(n-1)+(n-2)+ ... + 1

这样的对峙的总和