在o(nlogn)中对数组A进行排序

时间:2018-12-27 06:40:36

标签: algorithm sorting time-complexity

给出长度为n的整数的数组A。在排序数组A中,在(小o)o(nlogn)中对A进行排序,每两个连续的元素相差k1,k2,k3,其中k1,k2,k3

是不同的自然数。

我在解决此问题时遇到问题,我尝试在A上找到最小值 然后制作三个新数组,每个数组均以长度为n的min {A}开头,从而在每个数组中使用k1,k2,k3形成算术序列。合并结果并删除每个元素的重复副本,最后在长度为3n的新排序数组中的max {A}之后剪切所有元素。所有操作都是O(n)

问题是当max {A} -min {A}之间的差值不起作用时 不能被任何k1,k2,k3整除

任何帮助或见识将不胜感激。

2 个答案:

答案 0 :(得分:4)

使用数组中的数字作为节点创建有向图。对于每个数字x,如果存在x + k1,k2,k3中的任何一个,则添加有向边。 现在进行简单的拓扑排序。

拓扑排序需要O(V + E)时间。在这里,V = nE <= 3 * n。因此,拓扑排序的时间为O(n)。也可以使用哈希表在线性时间内检查x+k1,k2,k3是否存在。

总体时间复杂度:O(n)

另一种解决问题的方法:

找到数组中的最小数字。设数字为x。这是排序数组的第一个元素。现在,检查数组中是否存在x+k1x+k2x+k3。然后,根据给定条件,数组中必须至少存在一个。其中最小的是排序数组的第二个元素。重复这些步骤,直到没有元素为止。

每个步骤都需要3个存在查询,并且有n个步骤。有了哈希表,该算法将是线性的。

答案 1 :(得分:0)

这个问题对我来说并不明确,由于我无法发表澄清的意见,我假设有两种情况,并回答了两种情况。

场景1:在您的问题中,排序表示我们理解的排序是(升序还是降序):

在这种情况下,您无需检查连续元素是否具有k1,k2或k3之差就可以了。

场景2:在您的问题中,已排序是指以某种方式重新排列给定的数组元素,以使连续元素之间的差异为k1,k2或k3。

示例: 输入:[1、2、4、5、10],k1:1,k2:3,k3:6

输出:[1、2、5、4、10]

在那种情况下,这是一个哈密顿路径查找问题,可以使用DFS解决此问题。首先,从给定的数组构造一个图。图的构建逻辑如下:

  1. 每个索引都是一个节点
  2. 如果abs(A [i] -A [j])是k1,k2或k3,则连接两个索引(i,j)。

下一步是找出图中所有N个节点的长度为N的路径。

场景2的复杂性

这是一个NP完全问题。