【问题标题】:Finding the crosses between two arrays, one sorted, one unsorted查找两个数组之间的交叉点,一个已排序,一个未排序
【发布时间】:2020-12-01 07:51:08
【问题描述】:

假设我在页面上写下数字 1 到 n。在此之下,我在页面上以随机顺序写出 1 ... n 范围内的数字。对于每个 i,在顶行的 i 和底行的第 i 个最小数字之间画一条直线。

让我们用 C(s) 来表示随机序列(底部数字的排列)的交叉数。

其中 C(s) = 3 的示例:

1    2   3
  \  |  /
    \ /
   / |\
 /   |  \
7    5   1

Linked Image Example

  1. C(s) 以 n 表示的最小值和最大值是多少?解释你的答案。

  2. 当给定随机序列时,创建一个 O(nlgn) 算法来计算 C(s)。证明您的答案的运行时间和正确性。

我的答案

第一部分很简单,0 是最小值(没有与底部的交叉按从小到大的排序顺序),n(n-1)/2 是最大值(底部在从大到小排序)。

第二部分是我苦苦挣扎的地方,因为我们正在寻找 nlgn,这似乎是一个分而治之的算法。但是,我真的很困惑如何解决这个问题。

【问题讨论】:

  • 这与编程语言完全无关,因此我删除了“java”标签。请仅使用与问题相关的标签。
  • 什么叫“交叉线数”?是穿越的次数吗?还是行数?
  • 问题不清楚。假设n=3,您的图像与您的规格不符。您正在使用术语“随机序列”,但这并不是指之前规范中的任何内容。请定义“交叉线的数量”。不清楚为什么只有 n 条线时交叉线的数量可以是 O(n^2)。
  • 在您的图像中,您计算​​的是交叉点的数量,而不是交叉线的数量。交叉的数量不是由下面的数字顺序决定的 - 它还取决于数字的确切水平位置。你确定你没有误解任务?
  • 对不起!修正了措辞现在应该更清楚了。

标签: sorting big-o


【解决方案1】:

基本想法如下所示:

ALGORITHM(Start, End)
   Mid = (Start+End)/2
   If Start <= End-1 : //if number Start and number End are consecutive
      Return (Number of line crossings between Start and End)
   Else
      Find number of line crossings between number Mid and Mid+1 and store in N
   Return( N + ALGORITHM(Start, Mid) + ALGORITHM(Mid+1, End)) //recursive call

【讨论】:

    猜你喜欢
    • 2019-05-07
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2011-06-27
    • 1970-01-01
    相关资源
    最近更新 更多