如何解决如何构造订单?如何对元组进行排序?
这个问题要求我设计一种确定性算法,该算法将在theta(n log n)时间内运行以执行以下操作:
有一场比赛,赛车手的完成顺序将由以下信息决定:每个跑步者将报告自己的号码,a,紧随其后的跑步者b。 对。获胜者将报告b为空。 如果算法的输入是n个这样的对,那么我们如何设计一种算法来确定跑步者完成比赛的顺序? 提示说要使用排序,但是如果我基于第一个值进行排序,那么找到第二个值仍然会使算法O(n ^ 2)成为可能。如果我基于b进行排序,那么搜索a将导致算法为O(n ^ 2)。 如何在theta(n log n)中执行此操作? 谢谢!
解决方法
假设从集合{1,...,n}
中选择了赛车手的编号(其中n
是赛车手的总数)
- 实例化一个大小为
arr
的基于0的数组n + 1
。 - 对于每对
(a,b)
,执行arr[b] := a
,将null
解释为0
。 - 从
i := 0
开始,进行n
次:i := arr[i]
。i
的分配值恰好是赛车手的编号,正确的顺序。
这显然具有时间复杂度O(n)
。因此,为了获取Θ(n log n)
( Theta ,而不是 O ),只需执行与步骤4无关的Θ(n log n)
,就像对{使用堆排序并忽略结果的{1}}个数字。
如果不能假设从n
中选择了竞赛者的数字,则首先创建一个从竞赛者的数字到{1,n}
的关联数组(以及另一个方向的常规数组),然后如前所述,使用关联数组将赛车手的编号转换为数组索引。哈希表无法完成任务,因为它具有{1,n}
(未摊销的)查找时间,这将导致Θ(n)
。请改用自平衡二进制搜索树作为关联数组,其查找时间为Θ(n^2)
。树的创建也需要Θ(log n)
,因此,即使没有上面的虚拟步骤4,您也可以总共获得Θ(n log n)
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。