【发布时间】:2021-01-23 23:10:12
【问题描述】:
对于一个编码问题,我有两种解决方案。两种解决方案都可以正常工作。我只需要找到它们的时间/空间复杂度。
问题:给定一个或多个字符串,返回给定字符串中最大的一组唯一单词,它们是彼此的字谜。
Example:
Input: 'I am bored and robed, nad derob'
Correct output: {bored, robed, derob}
Wrong output: {and, nad}
解决方案 1: 在第一个解决方案中,我遍历给定的单词字符串,获取每个单词,对其中的字符进行排序,将其作为键添加到字典中。并且原始单词(未排序)被添加到一组单词中作为该键的值。排序有助于找出互为字谜的单词。在每次迭代中,我还跟踪以最长单词集作为其值的键。最后,我返回具有最长集合的键。
解决方案 2: 在第二个解决方案中,我做的几乎一样。唯一的区别是我为每个单词计算了一个主要因素,以将其用作字典中的键。也就是说,我不对单词的字符进行排序。
def solution_two(string):
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,
53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101]
d = defaultdict(set)
longest_set = ''
for word in string.replace(",", "").replace(".", "").split():
key = 1
for ch in word:
key *= primes[ord(ch.lower()) - 97]
d[key].add(word)
if len(d[key]) > len(d[longest_set ]):
longest_set = key
return d[longest_set]
我的想法:
我认为第一个解决方案的运行时间是 O(n),其中 n 是字符串中的单词数。 但是如果我对字符串的每个单词进行排序,它不会使运行时 O(n) * O(n log n) 吗?
至于第二个,我认为它也具有线性运行时。 但是我在第一个循环内有第二个循环,我遍历单词的每个字符...
我也对这两种解决方案的空间复杂度感到困惑。
任何指导将不胜感激。谢谢。
【问题讨论】:
-
所以在第一种情况下,我相信你是正确的,它是 O(n),如果我们使用计数排序,对单个单词进行排序应该占用 O(avgwordlengt) 和空间 O(avgwordlenght),所以我们有O(n)*O(avgwlenght) 时间和 O(avgwordlenght)*O(n) 空间但是如果我们使用另一种排序方法,那么时间是 O(n)*O(avgwlenght*log(awl)) 但节省空间 O( n)在第二种情况下,我认为您正在做大致相同的事情,但使用您自己的代码
-
我认为,Python 使用 Tim 排序,在最坏的情况下它具有 O(n log n) 运行时间和 O(n) 空间。在这种情况下,第一个解决方案的运行时间是否应该是:O(n)*O(avgwlength*log(awl)) 和空间 O(n)(用于保留字典中的所有单词)+ O(awl)(用于对每个单词进行排序)?
-
所以时间是 O(n)* O(awl log(awl)) 和空间 O(n)*O(awl) 但要小心,因为这看起来不错,但你需要考虑如果awl 比 n 小得多,你会得到 ~O(n) 时间,而如果你的 awl 更大,你会得到 O(awl log(awl)) 同时最坏的情况是如果 n=awl
-
你能解释一下为什么空间是 O(n)*O(awl) 吗?我们对字典使用 O(n),而且每次对一个单词进行排序时,我们都会使用 O(awl)。不应该是 O(n) + O(awl) 吗?我们一次排序一个单词。
-
正如你所说,每次我们对一个单词进行排序时,我们使用 O(awl) 所以 O(n)*O(awl) + O(n) 我只是省略了次要 O(n)跨度>
标签: algorithm time-complexity runtime space-complexity