Algorithm 如何构建订单?如何对元组排序?

Algorithm 如何构建订单?如何对元组排序?,algorithm,big-o,Algorithm,Big O,这个问题要求我设计一个确定性算法,在θ(n log n)时间内运行,以执行以下操作: 有一场比赛,参赛者完成比赛的顺序将由以下信息决定:每位参赛者将报告自己的号码a,紧随其后的参赛者b。对。获胜者将报告b为空。 如果算法的输入是n对这样的s,我们如何设计算法来决定赛跑者完成比赛的顺序? 提示说使用排序,但如果我根据第一个值a进行排序,那么找出第二个值仍然会使算法为O(n^2)。如果我根据b排序,那么搜索a将导致算法为O(n^2)。 如何在θ(n log n)中执行此操作? 谢谢 假设参赛者的号码

这个问题要求我设计一个确定性算法,在θ(n log n)时间内运行,以执行以下操作:

有一场比赛,参赛者完成比赛的顺序将由以下信息决定:每位参赛者将报告自己的号码a,紧随其后的参赛者b。对。获胜者将报告b为空。 如果算法的输入是n对这样的s,我们如何设计算法来决定赛跑者完成比赛的顺序? 提示说使用排序,但如果我根据第一个值a进行排序,那么找出第二个值仍然会使算法为O(n^2)。如果我根据b排序,那么搜索a将导致算法为O(n^2)。 如何在θ(n log n)中执行此操作?
谢谢

假设参赛者的号码是从集合
{1,…,n}
中选择的(其中
n
是参赛者的总数):

  • 实例化大小为
    n+1
    的基于0的数组
    arr
  • 对于每对
    (a,b)
    ,执行
    arr[b]:=a
    ,将
    null
    解释为
    0
  • i:=0
    开始,执行
    n
    次:
    i:=arr[i]
    i
    的赋值正是正确顺序的参赛者编号
  • 这显然具有时间复杂性
    O(n)
    。因此,为了获得
    Θ(n log n)
    (θ,而不是O),只需执行步骤4中不相关的任务,该任务将
    Θ(n log n)
    ,例如使用堆排序对
    n
    数字进行排序并忽略结果



    如果您不能假设参赛者的号码是从
    {1,…,n}
    中选择的,则首先从参赛者号码到
    {1,…,n}
    创建一个关联数组(另一个方向是一个普通数组),然后像前面一样使用关联数组将参赛者号码转换为数组索引。哈希表不会执行此任务,因为它有
    Θ(n)
    (非摊销)查找时间,这将导致
    Θ(n^2)
    。使用自平衡二叉搜索树作为关联数组,它具有
    Θ(logn)
    查找时间。树的创建也需要
    Θ(n log n)
    ,因此即使没有上面的虚拟步骤4,您也可以得到您的
    Θ(n log n)

    到目前为止您尝试了什么?你被困在哪里了?我试着根据第二个值排序。例如,如果输入为(9,null),(6,7),(2,9),(5,10),(7,5),(10,2)。排序后,它将如下所示:(9,null)(10,2)、(7,5)、(6,7)、(2,9)、(5,10)。将以第二个值为null的tuple开始:9是第一位。现在我需要找出谁的b值是9?在这一点上,提前排序对我没有任何帮助。我将在每个元组中遇到相同的问题,并在元组数组中来回移动。因此,时间复杂度要求将无法满足。或者仅基于第一个值或第二个值进行排序对我没有帮助。请通过编辑在
    0
    n-1
    之间唯一选择的参赛者人数来为您的问题添加所有尝试(如果
    n
    是参赛者总数)?请在你的问题中澄清这一点。