令 m>n>1 为正整数. 一个集合含有 m 个给定的实数. 我们从中选取任意 n 个数, 记作 a1, a2, …, an, 并提问: 是否 a1<a2<⋯<an 正确? 证明: 我们可以最多问 n!−n2+2n−2+m(n−1)(1+⌊lognm⌋)−m 个问题,将所有的 m 个数排序.
We can find the order of the first n numbers n!−1 questions,
looking at all possible orderings but one.
我们可通过查看除1以外的所有可能的顺序,找出前n个数n!−1个问题的顺序.
Suppose we have found the relative order of the first k numbers
and let us find the relative order of first k+1 numbers.
假设我们已找到前k个数的相对顺序,让我们来找出前k+1个数的相对顺序.
Suppose we have a1<a2<⋯<ak
and let us find where ak+1 fits.
假设有a1<a2<⋯<ak,让我们找出ak+1应该放在哪里.
We use the following {\it binary search}:
pick n−1 numbers among 1,2,…,k that divide the interval [1,k]
most equally.
利用下面的\textbf{二分法搜索(binary search)}:在1,2,…,k之间选取n−1个数等分区间[1,k].
(This is achieved by taking the numbers
a⌊kn⌋,a⌊2kn⌋,…,a⌊(n−1)kn⌋).
(这可通过取数字
a⌊kn⌋,a⌊2kn⌋,…,a⌊(n−1)kn⌋来实现).
We can find the relative order of ak+1 and these numbers by at most n−1 questions.
我们最多可通过n−1次提问找出ak+1和这些数的相对顺序.
Indeed, for 1⩽j⩽n−1, let qi be ``Is it true that
a⌊kn⌋<…<aa⌊ikn⌋<ak+1<a⌊(i+1)kn⌋<…<a⌊(n−1)kn⌋?''
实际上, 对于1⩽j⩽n−1, 令qi为``
a⌊kn⌋<…<aa⌊ikn⌋<ak+1<a⌊(i+1)kn⌋<…<a⌊(n−1)kn⌋成立么?''
Then we find an i such that
a⌊ikn⌋<ak+1<a⌊(i+1)kn⌋.
那么我们找到 i使得
a⌊ikn⌋<ak+1<a⌊(i+1)kn⌋.
Therefore, by at most n−1 questions we reduce the length of the interval of searching
from k to at most ⌈kn⌉, where ⌈x⌉
is the least integer number not less than x.
因此,我们最多可通过n−1个问题,使搜索的区间长度从k减小到最多是⌈kn⌉,其中⌈x⌉为不小于x的最小整数.
We repeat this binary search until we find exactly the position of ak+1
(that is, the interval of searching is 1 or 0).
我们重复这个二分法搜索,直到找出ak+1的确切位置.
(即搜索间隔为1或0).
Now if k⩽nj, then after i steps the interval will be at most nj−i,
so we need at most j=⌈lognk⌉ steps to insert ak+1 into the sequence.
现在,如果k⩽nj,那么在i步之后,间隔最多为nj−i,因此我们最多需要j=⌈lognk⌉步来将ak+1插入数列中.
Therefore, the number of questions needed is at most
n!−1+(n−1)(⌈logn(n+1)⌉+…+⌈logn(m−1)⌉).
因此,所需的提问次数最多为
n!−1+(n−1)(⌈logn(n+1)⌉+…+⌈logn(m−1)⌉).
All we need to do is to evaluate this number:
suppose that
nk⩽m<nk+1.
Then there are n2−n numbers r for which
⌈lognr⌉=2, n3−n2 numbers for which
⌈lognr⌉=3, and so on until we have m−1−nk numbers r for which
⌈lognr⌉=k+1.
我们需要做的就是计算这个数字:设
nk⩽m<nk+1.
那么有n2−n个数r满足⌈lognr⌉=2, 有n3−n2个数满足⌈lognr⌉=3等等,直到我们有m−1−nk个数r满足
⌈lognr⌉=k+1.
Therefore the sum is
n!−1+(n−1)(2(n2−n)+3(n3−n2)+⋯+k(nk−nk−1)+(k+1)(m−1−nk))=n!−1+(n−1)((k+1)(m−1)−nk−nk−1−⋯−n2−2n).
Because nk+1>m,
nk+nk−1+⋯+n2+2n=nk+1−1n−1+n−1⩾mn−1+n−1.
Hence our sum is at most
n!−1+(n−1)((k+1)(m−1)−mn−1−n+1)=n!−n2+2n−2+(n−1)(⌊lognm⌋+1)m−m,
as desired.
因此和为
n!−1+(n−1)(2(n2−n)+3(n3−n2)+⋯+k(nk−nk−1)+(k+1)(m−1−nk))=n!−1+(n−1)((k+1)(m−1)−nk−nk−1−⋯−n2−2n).
由于nk+1>m,
nk+nk−1+⋯+n2+2n=nk+1−1n−1+n−1⩾mn−1+n−1.
因此我们的和最多为
n!−1+(n−1)((k+1)(m−1)−mn−1−n+1)=n!−n2+2n−2+(n−1)(⌊lognm⌋+1)m−m,
得证.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2014-07-25 LaTeX技巧012:LaTeX 插图加载宏包