使用线性时间算法对仅包含 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 个字母字符串进行排序的主要内容,如果未能解决你的问题,请参考以下文章