让我们做实验,好吗?
1.示例
让我们看看{A,B,C,D}并对其进行排序。
解决方案 1:按组
-
{A,B,C,D} 中的较大者 -> B(因此为 B>A、B>C 和 B>D)
-
{A,C,D} 中的较大者 -> D(因此是 D>A 和 D>C)
-
{A,C} 中的较大者 -> A(因此为 A>C)
总订单[B,D,A,C]
解决方案 2:成对
-
A 和 C 之间更大 -> A(因此为A>C)
-
B 和 D 之间更大 -> B(因此 B>D)
-
D 和 A 之间的较大值 -> D
总订单[B,D,A,C]
有什么收获?显然成对比较困难,这里我选择了它们以便合并容易(无)。
2。备注
a) 总排序
> 仅适用于总排序:即对于集合中的两个给定元素 A 和 B,A>B 或 B>A。如果这两个关系都不成立,那么A 和B 是等价的。
解决方案 1 方法的问题在于,如果您向用户展示 {A,B,C,D} 和 A 和 B 等价且大于 C 和 D.. . 答案应该是什么?
b) 传递性
> 关系是可传递的,这意味着如果A>B 和B>C 然后A>C。使用这一事实很重要,因为您可以推断两个元素之间的关系,而无需询问用户。
c) 目标是什么?
目标是应该尽量减少向用户提出的问题,还是应该尽量减少用户的工作?因为显然用户更难回答第一个解决方案中的问题......
3.建模
可以将问题建模为“图”问题。
您从一组节点 {A,B,C,D} 开始,它们代表您要测试的值。
对集合进行排序相当于计算连接这些节点的最小定向边集,以便给定任意两个节点,一条路径从一个节点通向另一个节点。我确实坚持最低限度。
例如,如果我有 2 条边:B>A 和 B>C,那么如果我发现不是 A>C,我将删除 B>C,因为我可以通过传递性推断它。重要的属性是,如果没有两个节点是等价的,则生成的边集的基数是节点集的基数减去 1。在我的示例中(给定 4 个节点),它将是 3。
一个预言机(或一个非常幸运的人)因此只能提出 3 个问题,但要构建这个图表......这就是我们应该努力的目标。
4.如何解决这个问题?
好的,假设我们没有 2 个等效元素。这意味着如果A>B 为假,那么我可以推断出B>A...
为了表示我们的小图,我们用一个数组:
A B C D
D . > . # . represent the unknown
C . >
B > # < and > have their usual meaning...
A
由于对称性,我们只需要一个三角形。
通过计算. 的数量,我们可以看到未知关系的数量,理想的解决方案是摆脱所有.,同时向用户提出尽可能少的问题。
因此,一个好的问题是一次性删除尽可能多的.。
5.我的问题
因此,我有另一种类型的问题:
Select the elements lower than "D" in the following {A,B,C}: _
这个问题比 What is the great... 感觉更好,因为我明确地针对那些我想知道的关系(D?A、D?B 和 D?C)而 greater 保证我将获得尽可能多的关系,但我无法提前知道哪个。
我试图最大化问题的有用性
当然,懒惰是没有余地的:在利用问题的结果时考虑传递性仍然很重要。
6.探索更大的集合
对于较大的集合,您可以对元素进行分组,然后稍后将它们合并,但合并总是一个混乱的操作:您可能会得到您已经知道的答案。但是,对于我的小问题,这是一个很好的做法:
给定 2 个有序(不相交)集合:[A,B,C,D,...] 和 [R,S,T,U,...],让我们看看工具箱的 3 个问题:
- 哪个更大:
A 或 R? _
-
{A,B,R,S} 的最大元素是什么? _
{R,S,T} 中哪些元素大于A? _
提供 1 个关系
- 提供 2 种关系:其中 3 种是已知的
- 提供 3 个关系
第三个问题要求更详细的答案,但它更适合合并情况。在合并的情况下,它与要求对元素进行排序一样有效,因为它精确地要求我们在董事会中不知道的仅有的 3 个关系。
7.结论
现在您的框中有 4 个问题:
-
排序:将下列元素从大到小排序 {A,B,C,D} ? _
-
Pivot:在这个集合 {B,C,D} 中哪些元素大于 A? _
-
更大:在这个集合 {A,B,C,D} 中哪个元素更大? _
-
Pair:A 和 B 中哪个元素更大? _
(Pair可以看作是Greater或Pivot的退化情况)
鉴于每个问题都为n 节点提供n-1 关系,您可以尝试衡量用户回答问题T(n) 所需的时间,然后找到最大化T(n)/n 的n ;)