使用线性时间算法对仅包含 3 个字母的数组中的 2 个字母字符串进行排序

Posted

技术标签:

【中文标题】使用线性时间算法对仅包含 3 个字母的数组中的 2 个字母字符串进行排序【英文标题】:Sorting 2 letter strings in array that contains only 3 letters with linear time algorithm 【发布时间】:2022-01-02 23:34:17 【问题描述】:

我有 2 个只能包含 3 个字符的字母字符串:X,Y,Z 我必须对它们进行线性时间排序,有什么建议吗?

例如:

string[] arr = new string[]  "XY", "XX", "ZY", "ZX" ;

我必须使用线性时间算法对这个数组进行排序。

【问题讨论】:

你可以试试radix sort en.wikipedia.org/wiki/Radix_sort, bucket sort en.wikipedia.org/wiki/Bucket_sort 是否可以重复? 但是有没有比基数排序更快的方法? 这里只有 9 个可能的值吗? 9 个计数器(或一个数组)可以存储您见过的每个计数器的数量,然后您只需按固定顺序枚举这些计数器。 @Inf:你不可能有比O(n)更快的方法——你必须至少阅读每个项目一次,基数排序是O(n) 【参考方案1】:

只有 3^2=9 个可能的字符串,因此您可以使用一个 int[9] 数组来计算每个字符串出现的频率。 (需要 O(n) 时间)

比 int-array 交互并输出排序列表(需要 O(n) 时间)


要将 Sting 映射到其数组索引,请将其视为以 3 为底的数字

X=0  
Y=1
Z=2

示例:

"XY" -> 01(base3) = 0*3 + 1*1 = 1 => index= 1
"ZX" -> 21(base3) = 2*3 + 1*1 = 7 => index= 7

【讨论】:

以上是关于使用线性时间算法对仅包含 3 个字母的数组中的 2 个字母字符串进行排序的主要内容,如果未能解决你的问题,请参考以下文章

【比较难写的算法】最坏情况线性时间的选择

数组---缺失数组

C中的自然排序 - “字符串数组,包含数字和字母”

数组算法 电话号码组合

最坏情况为线性时间的选择算法

算法字符串数组的排序时间复杂度问题