Time complexity 一个优化的字谜函数的时间复杂度

Time complexity 一个优化的字谜函数的时间复杂度,time-complexity,big-o,complexity-theory,Time Complexity,Big O,Complexity Theory,这不是家庭作业问题。我正在准备一个采访,并且已经做了很多关于这个链接的研究。我根据一个建议编写了一个解决方案,但我不同意提出的时间复杂性。我想知道我的断言是否正确 下面是一个吐出一组字谜的函数。它对每个输入单词进行排序,并将排序后的输入单词放入字典中。我自己根据帖子中的提示编写了代码,提示: 使用排序:我们可以对字符串数组进行排序,以便 走到一起。然后通过线性遍历 排序数组。该解的时间复杂度为O(mnLogn)(We) 将在排序中进行O(nLogn)比较,比较将 花点时间)。其中n是字符串的数量

这不是家庭作业问题。我正在准备一个采访,并且已经做了很多关于这个链接的研究。我根据一个建议编写了一个解决方案,但我不同意提出的时间复杂性。我想知道我的断言是否正确

下面是一个吐出一组字谜的函数。它对每个输入单词进行排序,并将排序后的输入单词放入字典中。我自己根据帖子中的提示编写了代码,提示:

使用排序:我们可以对字符串数组进行排序,以便 走到一起。然后通过线性遍历 排序数组。该解的时间复杂度为O(mnLogn)(We) 将在排序中进行O(nLogn)比较,比较将 花点时间)。其中n是字符串的数量,m是字符串的最大长度

我不同意上面提到的时间复杂性

我认为下面代码的时间复杂度是n(m logm)。 空间复杂度为:O(2n)=O(n),用于结果和排序的_dict变量

n=字数,m=一个单词中的字符数

def groupAnagrams(strs):
  sorted_dict ={}
  results=[]
  for each in strs:#loop: O(n)
     #time complexity for sort: O(m log m). 
     sorted_str = "".join(sorted(each.lower())) #O(m) 
     if  not sorted_dict.get(sorted_str):  #0(1)
         sorted_dict[sorted_str] = []
     sorted_dict[sorted_str].append(each) #0(1)

  for k,v in sorted_dict.items(): #0(n)
     results.append(v)
  return results

算法的时间复杂度为O(mn log m),主要取决于对数组中的每个字符串进行排序所需的时间;所以你的分析是正确的。但是,您的结果与您引用的结果不同,不是因为引用错误,而是因为您的算法与引用中分析的算法不同。请注意,引文中说:

我们可以对字符串数组进行排序,这样所有的字谜就可以组合在一起了

你的算法没有做到这一点;它根本不会对字符串数组进行排序,而是单独对每个字符串中的字符进行排序。下面是本文引用的算法的Python实现:

从itertools导入groupby
无字符数=256
def字符频率(字):
计数=[0]*无字符数
对于word中的c:
计数[ord(c)]+=1
返回计数
def一起打印字符(文字):
单词=已排序(单词,关键字=字符频率)
对于_,分组方式为groupby(单词,key=char\u freqs):
打印(*组,sep=',')
时间复杂度可确定如下:

  • char\u freqs
    由于迭代长度为m的字符串,因此需要O(m)时间
  • 排序需要O(mn+n logn)时间,因为键函数需要O(m)时间,并且为n个字符串调用,然后字符串在O(n logn)时间内排序。排序中的比较是在长度
    无字符的列表上进行的(一个常量),因此比较所用的时间是常量
  • 将单词组合在一起需要O(mn)时间,因为它主要是通过调用
    char\u freqs
    再次调用n次;通过重用排序中已经计算的键,这可以改进为O(n),但这部分仍然由排序控制
这给出了O(mn+n log n)的总体时间复杂度,这与引用的时间复杂度不同,但是如果每次比较都调用键函数
char\u freqs
,而不是每个元素调用一次并缓存,则会得到O(mn log n)。例如,如果您在Java中使用以下方法进行排序:

//假设charFreqs返回可比较的值
Collections.sort(words、Comparator.comparing(Solution::charFreqs));
然后比较将花费O(m)时间而不是O(1)时间,并且总体时间复杂度将是O(mn logn)。所以这句话并没有错,它只是说了一个与你所想的不同的算法,它假设了一个次优的实现