算法复杂度:时间和空间

问题描述

我对一个编码问题有两种解决方案。两种解决方案都可以正常工作。我只需要找到它们的时间/空间复杂度。

问题:给定一个字符串或单词,返回给定字符串中最大的一组唯一单词,它们彼此之间是字谜。

Example:
Input: 'I am bored and robed,nad derob'
Correct output: {bored,robed,derob}
Wrong output: {and,nad}
@H_502_10@

解决方案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]
@H_502_10@

我的想法:

我认为第一个解决方案的运行时间为O(n),其中n是字符串中的单词数。 但是,如果我对字符串的每个单词进行排序,会不会使运行时变为O(n)* O(n log n)?

对于第二个,我认为它也具有线性运行时。 但是我在第一个循环中有第二个循环,在其中循环遍历单词的每个字符...

对于这两种解决方案的空间复杂性,我也感到困惑。

任何指导将不胜感激。谢谢。

解决方法

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

因此,如果我是对的,那么您在WC中使用的第二种算法的复杂度为n²,而在太空中也要优于另一种算法!

回顾一下:)