【发布时间】:2020-12-01 07:51:08
【问题描述】:
假设我在页面上写下数字 1 到 n。在此之下,我在页面上以随机顺序写出 1 ... n 范围内的数字。对于每个 i,在顶行的 i 和底行的第 i 个最小数字之间画一条直线。
让我们用 C(s) 来表示随机序列(底部数字的排列)的交叉数。
其中 C(s) = 3 的示例:
1 2 3
\ | /
\ /
/ |\
/ | \
7 5 1
-
C(s) 以 n 表示的最小值和最大值是多少?解释你的答案。
-
当给定随机序列时,创建一个 O(nlgn) 算法来计算 C(s)。证明您的答案的运行时间和正确性。
我的答案
第一部分很简单,0 是最小值(没有与底部的交叉按从小到大的排序顺序),n(n-1)/2 是最大值(底部在从大到小排序)。
第二部分是我苦苦挣扎的地方,因为我们正在寻找 nlgn,这似乎是一个分而治之的算法。但是,我真的很困惑如何解决这个问题。
【问题讨论】:
-
这与编程语言完全无关,因此我删除了“java”标签。请仅使用与问题相关的标签。
-
什么叫“交叉线数”?是穿越的次数吗?还是行数?
-
问题不清楚。假设
n=3,您的图像与您的规格不符。您正在使用术语“随机序列”,但这并不是指之前规范中的任何内容。请定义“交叉线的数量”。不清楚为什么只有 n 条线时交叉线的数量可以是 O(n^2)。 -
在您的图像中,您计算的是交叉点的数量,而不是交叉线的数量。交叉的数量不是由下面的数字顺序决定的 - 它还取决于数字的确切水平位置。你确定你没有误解任务?
-
对不起!修正了措辞现在应该更清楚了。