【问题标题】:Algorithm Complexity: Time and Space算法复杂度:时间和空间
【发布时间】: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


【解决方案1】:

ALG1= 时间是 O(n)* O(awl log(awl)) 和空间 O(n)*O(awl) 但要小心,因为这看起来不错,但你需要考虑如果 awl 小得多比 n 你得到一个 ~O(n) 时间,而如果你的锥子更大你得到一个 O(awl log(awl)) 同时最坏的情况是如果 n=awl – ALG2=时间 O(n)*O(awl),其中 O(n) 用于迭代给定的字符串,O(awl) 用于计算每个单词的素数因子(即我取一个单词,为每个字符找到一个素数在列表中的单词中,将它们相乘)和空间 O(n) n 和 awl 的考虑与之前的算法相同

所以,如果我是正确的,你在 WC 中的第二个算法的复杂度为 n²,比在太空中的另一个算法好!

只是回顾一下:)

【讨论】:

  • 感谢您的重述,真的很有帮助。不过,我有 2 个问题: 1. 第二个算法的空间复杂度是 O(n),对吧?我猜“n 和 awl 的考虑与前一个算法相同”是指第二个算法的运行时间而不是空间,对吧? 2. 抱歉,我还是听不懂:“你在 WC 中的第二个算法在空间中的复杂度比另一个算法好 n²!”我可以理解第二个算法在空间上更好,但是如果在 WC 中它是 n^2,它怎么能在时间上更好呢?
  • 顺便说一句,在问题中有一个关于空间复杂度的先决条件:“假设 x >> y 其中 x 是给定字符串中的单词数,y 是字符数最长的词”。是不是改变了上面的分析?
  • 是的,如果 x>> y 那么两个时间复杂度都是 O(n) bc 你可以考虑 awl 常数,所以 O(n)*O(1)。 WC 是 awl=n 所以你用 n O(n)*O(n)=O(n^2) 代替 awl,如果你对第一个 alg 做同样的事情 WC 是 awl=n 所以 O(n^2logn)
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 2020-04-02
相关资源
最近更新 更多