Sorting 一种排序算法

Sorting 一种排序算法,sorting,Sorting,假设给您一个由n个元素组成的排序序列。输入序列 由n=k个子序列组成,每个子序列包含k个元素 子序列都小于后续子序列中的元素,并且 大于前面子序列中的元素 那么,有没有一种O(nlogk)方法可以将无序数组放到上述数组中呢?谢谢 问题的不同表述 这个问题可以这样想。你有n个不同大小的球。您希望将这些球组织成n/k个桶,以便每个桶正好包含k个球。此外,这些铲斗被放置在一条直线上,其中最左侧的铲斗包含k个最小的球。从左边开始的第二个桶包含下一个k个球,如果我们移除最左边的桶,这些球将是最小的。最右边

假设给您一个由n个元素组成的排序序列。输入序列 由n=k个子序列组成,每个子序列包含k个元素 子序列都小于后续子序列中的元素,并且 大于前面子序列中的元素


那么,有没有一种O(nlogk)方法可以将无序数组放到上述数组中呢?谢谢

问题的不同表述

这个问题可以这样想。你有n个不同大小的球。您希望将这些球组织成n/k个桶,以便每个桶正好包含k个球。此外,这些铲斗被放置在一条直线上,其中最左侧的铲斗包含k个最小的球。从左边开始的第二个桶包含下一个k个球,如果我们移除最左边的桶,这些球将是最小的。最右边的桶包含k个最大的球

但在每个桶里你都没有秩序。如果你想要最大的球,你知道你必须开始在哪个桶里搜索,但你仍然需要在里面搜索

我将使用术语bucket而不是subsequence,因为subsequence让我考虑排序,排序并不重要,重要的是归属感,所以bucket对我来说更容易

具有设想解决方案的拟议复杂性的问题

你是说k是每个桶的长度(或大小)。因此,它自然可以介于1和n之间

然后询问是否存在可以以这种方式组织元素的O(n logk)解决方案。当我们考虑两个极值k=1和k= n</p>时,很容易看出你提出的复杂性。 k=n。这意味着我们只有一个大水桶。这是微不足道的,因为不需要采取任何行动。但当k=n时,您提出的复杂度是O(nlogk)=O(nlogn)

让我们考虑k=1,因为它有一个相似但又相反的问题。

k=1。每个桶包含一个球,我们需要n个桶。这与要求我们对整个序列进行完全排序是一样的,它最多只能是O(n logn)。但您提出的复杂性是O(nlogk)=O(nlog1)=O(n*0)=0。记住日志1=0。看来你提出的复杂性根本不适合这个问题

我们可以在这里停下来说。不,您不能在O(n log k)上做您希望做的事情,因为当您减少存储桶的数量时,问题会变得更难是没有意义的。更重要的是,随着桶数的增加,这不会变得更容易

如果我的任务是手动进行排序,我会说排序到一个桶是微不足道的。两个很容易。三个比两个难。如果你有n个桶,那就很难了

对复杂度改变的回答 然而,如果我们要修正你提出的复杂度,那么我们应该考虑一下会发生什么,这样我们就会问下面的问题。有没有办法在O(n log b)中对这些桶进行排序,其中b是桶的数量(b=n/k)

这里的极端情况似乎是有道理的

b=1。一桶。不需要排序。O(n对数b)=O(n对数1)=O(0)。(从技术上讲,这可能仍然是O(1))

b=n。n个桶。需要完整的排序。O(n对数b)=O(n对数n)


因此,一个解决方案似乎是可能的。但现在这已经超出了问题的范围。然而,我怀疑这是一条前进的道路。

嗨,欢迎来到SO a008!有趣的问题!这是家庭作业吗?不是。。。我刚在《算法导论》中解出一道题。它是关于对上面提到的数组进行排序的,“假设给你一个由n个元素组成的序列进行排序,…”,它可以用O(nlogk)来表示。。所以我想知道是否有一种方法可以将无序数组放到像O(nlogk)中那样的数组中!那不是家庭作业问题。我可以看到你在谈论8.1-4,你现在想知道是否可以通过将任何未排序的数组置于该状态来实现一些巧妙的技巧,我们知道从8.1-4中可以用Ω(n log k)来求解。我认为在你的问题中应该说n/k而不是n=k?@AlexTelon你有这本书吗?这能解释更多吗?什么是“后续”/“先前”子序列?如果n=k=2,且整个序列为[1,3,4,2],且有两个子序列[1,2]和[3,4],则子序列[1,2]在另一个子序列[1,2]之前,因为它的第一个元素在前面?前面您说过“n/k个桶”(每个桶有k个元素)。这里使用k作为桶的数量,而不是桶的大小。这似乎是错误的。还有,不清楚什么是“桶”,你是对的。每次我用上面的k,我都应该说n/k,我还需要翻一些其他的东西。谢谢,我会更新的。我使用bucket而不是subsequence,因为它向我传达了这样一个事实,即子序列不需要排序。就像在bucket sort中一样,我们只是将元素扔到正确的bucket中,但不关心在bucket中组织任何内容。啊,谢谢。是的,最后一句话听起来似乎不仅仅是指任何子序列,而是指连续的子序列。他们应该马上说。我很确定,如果你查阅他们对“子序列”的定义,他们使用的是标准定义。假设你可以通过在O(n logk)中对部分进行排序来对整体进行排序,很明显,在O(n logk)中也不能创建这种状态,因为你可以在2*O(n logk)=O(n logk)中对一个完全无序的序列进行排序。但正如你所说,O(n log n/k)可以工作,从那时起这两部分。。。。。。将是O(n logn/k)和O(n logk),它们加起来就是O(n logn)。我同意线性时间选择算法确实是可能的。啊!是的,快选。他们都用“支点”,所以我犯了一个错误,其实他们很不一样,哈哈