最长公共前缀-比较两种算法的时间复杂度

时间:2020-10-22 23:27:36

标签: string algorithm time-complexity big-o longest-substring

如果比较这两个解决方案,则第一个解决方案的时间复杂度为O(array-len*sortest-string-len),因此您可以将其缩短为O(n*m)甚至是O(n^2)。第二个似乎是O(n * log n),因为它有一个排序方法,然后比较第一个和最后一个项目,这样它就变成了O(n)并且对O没有任何影响。 / p>

但是,比较列表中的字符串项目会发生什么。对整数值列表进行排序是O(n * log n),但是我们是否需要比较字符串中的字符才能对其进行排序?因此,如果我说第二个解决方案的时间复杂度是O(n * log n * longest-string-len),我错了吗?

此外,由于它在排序时不检查前缀,因此无论如何都会进行排序(大多数情况下),因此其最佳情况远比其他选项差吗?另外,在最坏的情况下,如果考虑到我提到的观点,它仍然会比第一种解决方案更糟糕?

public string longestCommonPrefix(List<string> input) {
        if(input.Count == 0) return "";
        if(input.Count == 1) return input[0];
        
        var sb = new System.Text.StringBuilder();
        
        for(var charIndex = 0; charIndex < input[0].Length; charIndex++)
        {
            for(var itemIndex = 1; itemIndex < input.Count; itemIndex++)
            {
                if(input[itemIndex].Length > charIndex)
                    return sb.ToString();
                
                if(input[0][charIndex] != input[itemIndex][charIndex])
                    return sb.ToString();
            }
            
            sb.Append(input[0][charIndex]);
        }
        
        return sb.ToString();
    }
static string longestCommonPrefix(String[] a) 
    { 
        int size = a.Length; 
  
        /* if size is 0, return empty string */
        if (size == 0) 
            return ""; 
  
        if (size == 1) 
            return a[0]; 
  
        /* sort the array of strings */
        Array.Sort(a); 
  
        /* find the minimum length from first 
        and last string */
        int end = Math.Min(a[0].Length, 
                            a[size-1].Length); 
  
        /* find the common prefix between the  
        first and last string */
        int i = 0; 
        while (i < end && a[0][i] == a[size-1][i] ) 
            i++; 
  
        string pre = a[0].Substring(0, i); 
        return pre; 
    } 

1 个答案:

答案 0 :(得分:1)

首先,除非我遗漏了一些明显的内容,否则第一个方法在O(N * shortest-string-length)中运行; 最短,而不是最长

第二,您不能将O(n*m)减少为O(n^2):字符串的数目和长度无关。

最后,您绝对正确。排序确实需要O(n*log(n)*m),因此在任何情况下都不会提高性能。

请注意,预先找到最短的字符串可能有益。这将不需要input[itemIndex].Length > charIndex