Questions tagged «sorting»

给定一系列元素,找到一个排列,使元素按一定顺序排列。

2
使用只读堆栈排序
请考虑以下设置: 我们给出一个堆栈包含ñ项目。sssnñn 我们可以使用常数的额外堆栈。O(1)Ø(1个)O(1) 我们可以在这些堆栈上应用以下操作: 检查堆栈是否为空, 比较两个堆栈的顶部项, 删除堆栈中的第一项, 打印堆栈中的顶部项目, 将堆栈的顶层项目复制到另一个堆栈中, 将一个堆栈的内容复制到另一个堆栈。 请注意,这些是唯一允许的操作。我们不能交换项目,也不允许将任何项目推入任何堆栈中,除非将最上面的项目复制到堆栈中(之后,目标堆栈的先前内容将被丢弃,并且仅包含复制的项目) 。 这是一种使用比较对堆栈进行排序的算法:O(n2)Ø(ñ2)O(n^2) last := empty for i from 1 to n min := empty w := s while w is not empty if w.top > last and w.top < min min := w.top delete w.top print min last := …

2
排序对应的复杂度等级
TCS的两个部分是算法和复杂性。我简单地说,算法是对上限的研究,它表明您可以(在给定的受限资源下)做某事,而复杂性则是在显示没有一些最小的资源就无法做。 因此,经常在决策模型中陈述算法问题,以将其置于复杂性类别中。 但是,令我一直困扰的是,某些基本算法从来没有被完全提及属于某个特定类。一个例子是(比较)排序。尽我所能尝试,一个相关的类似乎太不足了(真的,是否只是在检查日志空间中对结果进行了排序?那似乎太弱了,或者我没有正确的决策版本)。 比较排序所处的最佳/最合适/最有用的复杂性类别是什么?

2
对数字进行排序的算法
我已经在stackoverflow上问过这个问题,但也许它更适合此站点。 问题是: 我有N对无符号整数。我需要对它们进行排序。成对的结束向量应按每对中的第一个数字递增地排序,而按对中的第二个按递增顺序排序。每对可以随时交换第一和第二元素。有时没有解决方案,因此我需要抛出一个异常。 例: in pairs: 1 5 7 1 3 8 5 6 out pairs: 1 7 <-- swapped 1 5 6 5 <-- swapped 8 3 <-- swapped ^^如果不交换对,就不可能构建解决方案。因此,我们交换对(7,1),(3,8)和(5,6)并构建结果。要么 in pairs: 1 5 6 9 out: not possible 谢谢 编辑: Tom Sirgedas在SO上提出了最佳解决方案。它真的很容易实现,并且可以在O(log(n)* n)中工作。谢谢大家的回答和关注。我真的很喜欢mjqxxxx分析。

2
词典上标记的DAG的最小拓扑排序
考虑以下问题:给定输入有向无环图,从到总阶数(例如整数)的某个集合的标注函数,在哪里被问到计算字典序最小的拓扑排序的来讲。更确切地说,一个拓扑排序的是的枚举作为,使得对于所有,每当有来自路径到在λ V 大号&lt; 大号 ģ λ ģ V v = v 1,... ,v Ñ我≠ Ĵ v 我v Ĵ ģG=(V,E)G=(V,E)G = (V, E)λλ\lambdaVVVLLL&lt;L&lt;L<_LGGGλλ\lambdaGGGVVVv=v1,…,vnv=v1,…,vn\mathbf{v} = v_1, \ldots, v_ni≠ji≠ji \neq jviviv_ivjvjv_jGGG,那么我们必须有。这样的拓扑排序的标签是的元素序列,其顺序为。这些序列(都具有长度)的字典顺序被定义为如果存在某个位置使得和对于所有。请注意,可以将中的每个标签分配给多个顶点这一事实(否则问题就不那么容易了)。i&lt;ji&lt;ji < jl = λ (v 1),… ,λ (v n)| V | 升&lt; LEX 升'我升我&lt; 大号升' 我升Ĵ = 升' Ĵ Ĵ &lt; 我š …

2
什么是好的特殊情况排序算法?
我有一个数据集,该数据集是多个以2D网格排列的对象。我知道我有严格的顺序,在每一行中从左到右增加,而在每一列中从上到下增加。例如, 1 2 3 4 6 7 5 8 9 我可以改进天真的排序以对整个数据集进行线性排序(在比较中进行衡量)吗? nd数据集呢?带有比较子集的任意有限数据集?

1
是否可以在时间和线性空间中排序
在最近的预印本https://arxiv.org/abs/1801.00776中,声称可以按时间 和线性空间实数进行排序 。尽管我不是排序算法方面的专家,但本文似乎很合理。ø (Ñ √ñnnØ (ñ 日志ñ----√),O(nlog⁡n),O(n \sqrt{\log n}), 我认为,至少从理论上讲,如果正确,那将是重要的。 然而,主要论点的表达有些非正式和非传统。 有人注意到/评论过本文吗?似乎同一位作者韩一杰(Yijie Han)发表了有关整数排序的相关结果,如Han's时间,线性空间,整数排序算法中所述Ø (ñ 日志日志n )O(nlog⁡log⁡n)O(n \log\log n)

1
最佳随机比较排序
所以,大家都知道比较树下界关于(确定性)比较排序算法进行的最坏情况下的比较。它不适用于随机比较排序(如果我们测量最坏情况输入的预期比较)。例如,对于n = 4,确定性下限是5个比较,但是随机算法(随机置换输入,然后应用合并排序)效果更好,具有4 2⌈log2n!⌉⌈log2⁡n!⌉\lceil\log_2 n!\rceiln=4n=4n=4所有输入的期望值进行 3个比较。4234234\frac{2}{3} 该根据信息理论,无上限的约束仍然适用于随机情况,并且可以将其稍微拧紧到 k + 2 (n !− 2 k)log2n!log2⁡n!\log_2 n! 这是因为存在一种最优算法,该算法会随机排列输入,然后应用(确定性)决策树,而最佳决策树(如果存在)是其中所有叶子都处于两个连续级别中的最优决策树。k+2(n!−2k)n!, where k=⌊log2n!⌋.k+2(n!−2k)n!, where k=⌊log2⁡n!⌋.k+\frac{2(n!-2^k)}{n!} \text{, where } k=\lfloor\log_2 n!\rfloor. 如果知道此问题的上限怎么办?对于所有,比较的随机数(期望,对于最坏情况的输入,对于最佳可能的算法)始终严格比最佳确定性算法好(本质上,因为n !永远不是2的幂)。 。但是好多少呢?n&gt;2n&gt;2n>2n!n!n!

2
我们可以排序而不排序吗?
这是公知的是通过转置排序排列是在,作为换位的最小数量需要进行排序π ∈ 小号Ñ正是我Ñ v (π )= { (我,Ĵ )∈ [ Ñ ] × [ Ñ ] :i &lt; j 和 π (i )&gt; π (j )}PP\sf{P}π∈ 小号ñπ∈Sn\pi \in S_ni n v (π)= { (i ,j )∈ [ n ] × [ n ] :i &lt; j 和 π(i )&gt; π(j …
12 sorting 

4
在O(k)中找到数组中最小的k个元素
我在网上发现了一个有趣的问题。给定一个包含n个数字的数组(不包含有关它们的信息),我们应该在线性时间内对该数组进行预处理,以便在给定一个数字1 &lt;= k时,可以返回O(k)时间中的k个最小元素。 &lt;= n 我一直在和一些朋友讨论这个问题,但没人能找到解决方案。任何帮助,将不胜感激! 快速说明:-k个最小元素的顺序并不重要-数组中的元素是number,可能是整数,可能不是(所以没有基数排序)-在预处理阶段不知道数字k。预处理是O(n)时间。在O(k)时间上的函数(找到k个最小元素)。
12 sorting 

3
排序“ k-tonic”序列
我希望有人对此有所了解,所以我不必阅读文献... 考虑数字的序列。考虑序列为n − 1间隔[ x 1,x 2 ] ,[ x 2,x 3 ] ,… ,[ x n - 1,x n ]。显然,如果实线上的任何点最多以2个间隔刺穿,则原始序列是双子序列的。我们将点最多以k个间隔刺入的序列称为kX1个,… ,xñx1,…,xnx_1, \ldots, x_nn − 1n−1n-1[ x1个,X2] ,[ x2,X3] ,… ,[ xn − 1,Xñ][x1,x2],[x2,x3],…,[xn−1,xn][x_1, x_2], [x_2, x_3], \ldots, [x_{n-1},x_n]ķkkķkk-idiotic。视觉上,如果绘制序列图(即按顺序连接点),则以上内容对应于以下条件:没有水平线与图相交超过k次。p一世= (i ,x一世)pi=(i,xi)p_i =(i,x_i)ķkk 看到可以在O (n log k )时间内对惯用序列进行排序并不难(但也不是太容易),这显然是最佳的。ķkkØ (ñ 日志ķ )O(nlog⁡k)O( …

2
使用两个队列反转列表
这个问题的灵感来自于一个现有的问题,即是否可以在每个堆栈操作的摊销时间中使用两个队列来模拟堆栈。答案似乎是未知的。这是一个更具体的问题,与特殊情况相对应,在特殊情况下,首先执行所有PUSH操作,然后执行所有POP操作。使用两个最初为空的队列如何有效地反转N个元素的列表?合法操作是:O (1 )O(1)O(1)ñNN 使输入列表中的下一个元素入队(到任一队列的尾部)。 将元素从任一队列的开头出队,然后再次入队(到任一队列的尾部)。 使任一队列开头的元素出队,并将其添加到输出列表。 如果输入列表包括元素,生成反向输出列表[ N ,N - 1 ,...所需的最小操作数是多少?。。,2 ,1 ]的行为?证明它比O (N )增长快的证据将特别有趣,因为它将解决否定的原始问题。[ 1 ,2 ,。。。,N− 1 ,N][1,2,...,N−1,N][1,2,...,N-1,N][ N,N- 1 ,。。。,2 ,1 ][N,N−1,...,2,1][N,N-1,...,2,1]ø (Ñ)O(N)O(N) 更新(2011年1月15日):问题可以在,如提交的答案和他们的评论中所示;Ω (N )的下限很小。这些界限能否改善?ø (Ñ日志ñ)O(Nlog⁡N)O(N \log N)Ω (N)Ω(N)\Omega(N)

1
枚举顶点标记DAG的拓扑种类
令是有向无环图,令是将每个顶点映射到某个有限字母的标签的标记函数。写中,拓扑排序的是一个双射从至(即,的排序中的序列),以使得无论何时然后(即,如果存在从到的边G=(V,E)G=(V,E)G = (V, E)λλ\lambdav∈Vv∈Vv \in Vλ(v)λ(v)\lambda(v)LLLn:=|V|n:=|V|n := |V|GGGσσ\sigma{1,…,n}{1,…,n}\{1, \ldots, n\}VVVVVV(v,v′)∈E(v,v′)∈E(v, v') \in Eσ−1(v)&lt;σ−1(v′)σ−1(v)&lt;σ−1(v′)\sigma^{-1}(v) < \sigma^{-1}(v')vvvv′v′v'然后出现在序列中的之前)。所述标签的是单词在。vvvv′v′v'σσ\sigmaσ(1)⋯σ(n)σ(1)⋯σ(n)\sigma(1) \cdots \sigma(n)LnLnL^n 给定,我想高效地枚举的拓扑类型的标签。枚举拓扑类别的标签的复杂性是什么?当然,由于可能有成倍的指数增长,我想研究复杂度与输出大小或延迟的关系。特别是,可以使用多项式延迟执行枚举吗?(甚至是持续的延迟?)(G,λ)(G,λ)(G, \lambda)GGG 在所有顶点都带有不同标签的情况下(或者,等价地,顶点被自己标记为),我知道标签可以在固定的摊销时间内枚举,其结果是枚举位姿的线性扩展(与枚举DAG的拓扑种类相同)。但是,当任意标注顶点时,可能会出现大量拓扑类别具有相同标签的情况,因此,您不能仅枚举拓扑类别并计算其标签以获得一种枚举标签的有效方法。用poset术语,标记的DAG可以看作是标记的GGG{1,…,n}{1,…,n}\{1, \ldots, n\}GGG(G,λ)(G,λ)(G, \lambda) 姿态,而我找不到这些的枚举结果。 由于这里有其他问题的答案,我已经知道一些相关问题的难度。特别是,我知道在字典上找到最小的标签是NP-hard。我也知道,确定给定的标签是否可以通过某种拓扑排序实现是NP难的(从这个问题的难度:给定候选标签序列,求出的拓扑排序,其中每个顶点必须出现在某个位置正确的标签出现在sssGGGsss)。但是,我不认为这会暗示枚举的难度,因为您可以按自己喜欢的任何顺序枚举(不一定是字典顺序),并且枚举算法无法有效地确定标签是否可以实现,甚至具有恒定的延迟(因为可能首先要成指数地列举许多序列)。 请注意,枚举第一个标签显然很容易(只要进行任何拓扑排序即可)。要列举的另一个标签比,您可以通过施加一些元素进行的得到一些位置列举其中尝试每个:和,并检查是否具有处于位置的拓扑排序,这可以在PTIME中清楚地完成。但是随着您输出越来越多的标签,我不确定如何概括这种方法。ssssssvvvVVVi∈{1,…,n}i∈{1,…,n}i \in \{1, \ldots, n\}si≠λ(v)si≠λ(v)s_i \neq \lambda(v)vvvģ v 我iiiGGGvvviii

2
确定可以通过非交换组元素的置换来实现
固定有限群。我对以下决策问题感兴趣:输入是某些元素,它们具有部分顺序,而问题是,是否存在满足该顺序的元素的排列,并且该排列是否满足order产生组的中性元素。摹èGGGGGGËËe 形式上,检验问题如下,其中组是固定的:GGGGGG 输入:有限的部分有序集,具有从到的标记函数。μ P ģ(P,&lt; )(P,&lt;)(P, <)μμ\muPPPGGG 输出:是否存在的线性扩展(即,总阶使得对于所有,表示),从而写出的元素遵循总顺序为,我们有。(P ,&lt; ')X ,ÿ ∈ P X &lt; ý X &lt; ' ý P &lt; ' X 1,... ,X Ñ μ (X 1)&CenterDot;&⋯ &CenterDot;&μ (X Ñ)= ÈPPP(P,&lt;′)(P,&lt;′)(P, <')X ,ÿ∈ PX,ÿ∈Px, y \in Px &lt; yX&lt;ÿx < yx &lt;′ÿX&lt;′ÿx <' yPPP&lt;′&lt;′<'X1个,… ,xñX1个,…,Xñx_1, \ldots, x_nμ …

2
寻找位移最大值的线性时间算法
假设给定一个数组其中包含非负整数(不一定是唯一的)。A[1..n]A[1..n]A[1..n] 令为升序排列。我们要计算 BBBAAAm=maxi∈[n]B[i]+i.m=maxi∈[n]B[i]+i.m = \max_{i\in [n]} B[i]+i. 显而易见的解决方案是对A进行排序AAA,然后计算mmm。这给出了在最坏情况下在时间O(n \ lg n)上运行的算法O(nlgn)O(nlg⁡n)O(n \lg n)。 有可能做得更好吗?我们可以计算mmm的线性时间? 我的主要问题是上述问题。但是,了解该问题的以下概括将很有趣。 令BBB为AAA根据oracle \ leq的比较排序≤≤\leq ,fff为oracle提供的函数。给定\ leq和f的AAA和oracles,对于计算m = \ max_ {i \ in [n]} f(B [i],i)所需的时间,我们能说什么?≤≤\leqfffm=maxi∈[n]f(B[i],i)m=maxi∈[n]f(B[i],i)m = \max_{i \in [n]} f(B[i],i) 我们仍然可以在O(n \ lg n)时间中计算m。但是我们可以证明这种广义情况下的超线性下界吗?mmmO(nlgn)O(nlg⁡n)O(n \lg n) 如果答案是肯定的,那么如果我们假设≤≤\leq是整数的通常顺序并且fff是“ nice”函数(单调,多项式,线性等),那么下界是否成立?

1
按平均
是否存在基于比较的排序算法,该算法平均使用了lg(n!)+o(n)lg(n!)+o(n)\mathrm{lg}(n!)+o(n)比较? 最坏情况的lg(n!)+o(n)lg(n!)+o(n)\mathrm{lg}(n!)+o(n)比较算法的存在是一个开放问题,但是平均情况足以满足对每个输入具有预期的lg(n!)+o(n)lg(n!)+o(n)\mathrm{lg}(n!)+o(n)比较的随机算法。。的意义lg(n!)+o(n)lg(n!)+o(n)\mathrm{lg}(n!)+o(n)是它是o(n)o(n)o(n)从最佳比较,浪费平均只有o(1)o(1)o(1)每个元素的比较。 由于我已经有了这样的算法,因此我将其作为答案(使用Q / A格式),但是我欢迎其他答案,包括其他算法,无论这种算法是否已知,都可以改善o(n)o(n)o(n)以及情况lg(n!)+o(n)lg(n!)+o(n)\mathrm{lg}(n!)+o(n)。 先前的工作: 合并排序使用比较(即使在最坏的情况下)。 合并插入排序(也称为福特约翰逊排序)也使用比较,但常数要小得多。改进了基于比较的排序的平均复杂度(由岩和一雄和Teruyama Junichi联合提出),他们的(1,2)Insertion算法类似于下面我的部分回答。l g(n !)+ Θ(n )Θ(n )lg(n!)+Θ(n)lg(n!)+Θ(n)\mathrm{lg}(n!)+ Θ(n)lg(n!)+Θ(n)lg(n!)+Θ(n)\mathrm{lg}(n!)+ Θ(n)Θ(n)Θ(n)Θ(n)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.