【问题标题】:Find an algorithm to sort an array given its status after sorting给定排序后的状态,找到一种算法对数组进行排序
【发布时间】:2020-05-02 14:47:10
【问题描述】:

A 是一个包含 n 个元素的数组。 A 没有排序,但是,在对数组进行排序后,任何两个相邻元素之间的差异将是 k1,k2 或 k3.

需要注意的是k1、k2和k3没有给出,而且都是自然的!

例如,给定数组:

A = { 25, 7, 5, 9, 32, 23, 14, 21}

对数组进行排序后,我们会得到 -

A = { 5, 7, 9, 14, 21, 23, 25, 32}

第一对(5, 7)的差是2;所以k1=2,第三对(9,14)的差是5,所以k2=5,而第四对 (14, 21) 之间的差值为 7,因此 k3=7。其他相邻对之间的差值也是 2、5 和 7。

对数组排序的算法应该尽量做到最好(明显低于O(nlogn))。

我设法回答了一个类似的问题,其中任何两个相邻元素之间的差异是 k、2k 或 3k,其中 k 是真实的。但是我找不到一个合适的算法遵循类似的方法,通过找到 k,除以它并进行桶排序。

通过找到最小值和第二个最小值,我们可以找到 k 之一。但是 k 可能是 n2 - 所以找到最大值也无济于事......我真的迷路了!

免责声明:这个问题之前有人问过,但是没有给出答案,问题也不好理解。

【问题讨论】:

  • 如果输入不满足约束,即一旦对数组进行排序后有超过3个不同的差异,你想做什么。
  • 给定的数组应该总是满足上面写的特征。
  • 这里的问题是什么?您似乎没有被要求编写排序算法。
  • 找到一个对数组进行排序的算法(可能是O(n))
  • 如果我理解正确,我们不能像您的示例那样假设我们可以通过简单地获取 4 个最低元素来获得 k1、k2 和 k3

标签: arrays algorithm sorting data-structures


【解决方案1】:

这是一个O(n),只是看起来效率不高。

这个想法很简单。给定k 的最小元素和值列表,您可以使用已经找到的k 的值构造最大的排序集,找到不在集合中的最小缺失值,并找到新的@ 值987654324@。如果有K的值为k,则此操作为O((1+K) * n)

因此重复此K 次为O((1+K)^2 * n)

在我们的例子中K 是常数,所以我们得到O(n)

这里是 Python。

def special_sort (array):
    # special cases first.
    if 0 == len(array):
        return array
    elif 1 == len(array):
        return array
    elif 2 == len(array):
        return [min(array), max(array)]

    min_value = min(array)
    values_of_k = []
    leftovers = array

    while len(leftovers):
        values_of_k = sorted(values_of_k)
        values = set(array)
        sorted_array = [min_value]
        values.remove(min_value)
        found = True
        while found:
            found = False
            for k in values_of_k:
                if sorted_array[-1] + k in values:
                    found = True
                    sorted_array.append(sorted_array[-1] + k)
                    values.remove(sorted_array[-1])
                    break

        leftovers = list(values)
        if 0 == len(leftovers):
            return sorted_array
        else:
            first_missing = min(leftovers)
            # Find the first element of the array less than that.
            i = -1
            while i+1 < len(sorted_array) and sorted_array[i+1] < first_missing:
                i = i+1
            values_of_k.append(first_missing - sorted_array[i])

print(special_sort([25, 7, 5, 9, 32, 23, 14, 21]))

【讨论】:

  • 我没有学过 Python。但是根据您的解释,我看不出为什么该算法的时间复杂度与 K 的不同值的数量有关。
  • 通过扫描当前构造的数组{current min+ current k, ....., maximum}并检查每个元素是否存在于实际数组中需要O(n^2)。我是否遗漏/误解了什么?
  • @KamalKhalaily 在集合values 中存在的检查都是哈希查找,因此是O(1)。扫描当前构造的数组是O(K) 术语。不过没关系,因为这里的K永远不会超过3。
  • 嗯,显然我没有赶上 :( 我们刚刚学习了散列,问题不应该包括散列(只是排序),但可以用散列解决。请您详细说明算法,无需编写代码。:)
  • @KamalKhalaily 我已经解释过了。您要做的是获取k 的值列表,构建一个排序列表,列出您可以从具有k 值的最小元素中获得的所有内容,找到不在列表中的第一件事,找出新值k 你已经丢失了,然后再试一次。当您能够从k 的值按排序顺序生成整个列表时,您将拥有k 的所有值以及(更重要的是)排序列表。
猜你喜欢
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 2018-11-11
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
相关资源
最近更新 更多