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