繁体   English   中英

合并和排序O(n)中的n个字符串

[英]Merging and sorting n strings in O(n)

最近,我在编码挑战中遇到一个问题,我必须合并n个字母数字字符的字符串,然后对新的合并字符串进行排序,而只允许在排序的字符串中使用字母字符。 现在,这将是相当简单的,除了增加的警告是算法必须为O(n)(它没有指定这是时间还是空间复杂性,还是两者都没有)。

我最初的方法是将字符串连接成一个新字符串,只添加字母字符,然后在末尾排序。 我想提出一个更有效的解决方案,但是给我的时间少于最初告诉我的时间。 (我所知道的)没有在O(n)时间内运行的排序算法,所以我唯一能想到的是我可以增加空间复杂度并使用排序的哈希表(例如C ++映射)进行存储每个字符的计数,然后按排序顺序打印哈希表。 但这可能需要n次打印n个字符,因此我认为它仍将以二次时间运行。 另外,我使用的是python,但我认为它没有办法使字典保持排序(也许可以)。

无论如何,是否可以在O(n)时间和/或空间复杂度中解决此问题?

您的计数排序要走的路:建立了26个字母的简单计数表中的顺序。 遍历两个字符串,计算字母,忽略非字母。 这是O(n)的一遍。 现在,只需遍历表格,按指示的次数打印每个字母。 这也是O(n),因为计数的总和不能超过n 您不会每次打印n字母n总共要打印n字母。

  1. 连接您的字符串(不是真正需要的,您也可以在单个字符串中计算字符)
  2. 创建一个长度等于字符代码总和的数组
  3. 通读您的串联字符串,并计算在步骤2中创建的数组中的出现次数
  4. 通过读取char freq数组,使用每个char的正确nr个重复构建输出数组。

因为每个步骤都是O(n),所以整个事情都是O(n)

[@patatahooligan:在我看到您的评论之前进行了此编辑,不小心重复了答案]

如果我正确理解了要求,那么您只是在对字符串中的字符进行排序?

ADFSACVB变为AABCDFSV

如果是这样,那么诀窍就是不要真正“排序”。 您有固定数量的值。 因此,您只需对每个值进行计数并从中生成结果。

例如,鉴于ABACBA

在第一遍中,在由字符索引的数组中增加一个计数器。 这将产生:

[A] == 3
[B] == 2
[C] == 1

在第二遍输出中,计数器指示的每个字符的编号。 AAABBC

总而言之,系统会告诉您进行排序 ,但要跳出框框思考,您确实需要计数算法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM