该算法的空间复杂度如何为O(1)

时间:2019-05-21 19:47:08

标签: c# arrays space-complexity

我发现了一种算法here,该算法可以从具有O(1)空间复杂度(SC)的字符串中删除重复的字符。在这里,我们看到算法将字符串转换为非恒定的字符数组,它将根据输入大小而变化。他们声称它将在O(1)的SC中运行。怎么样?

// Function to remove duplicates 
static string removeDuplicatesFromString(string string1) 
{ 

    // keeps track of visited characters 
    int counter = 0; 
    char[] str = string1.ToCharArray(); 
    int i = 0; 
    int size = str.Length; 

    // gets character value 
    int x; 

    // keeps track of length of resultant String 
    int length = 0; 

    while (i < size) { 
        x = str[i] - 97; 

        // check if Xth bit of counter is unset 
        if ((counter & (1 << x)) == 0) { 

            str[length] = (char)('a' + x); 

            // mark current character as visited 
            counter = counter | (1 << x); 

            length++; 
        } 
        i++; 
    } 

    return (new string(str)).Substring(0, length); 
} 

看来我不了解太空复杂性。

1 个答案:

答案 0 :(得分:3)

  

我在这里找到了一种算法,该算法可以从具有O(1)空间复杂度(SC)的字符串中删除重复的字符。在这里,我们看到算法将字符串转换为非恒定的字符数组,它将根据输入大小而变化。他们声称它将在O(1)的SC中运行。怎么样?

不是。

该算法将仅包含26个字符的任意大小的字符串作为输入,因此输出只能是26个字符或更少,因此输出数组不必具有输入的大小。

您正确地指出,站点上给出的实现不必要地为char数组分配了O(n)额外的空间。

锻炼:您可以解决字符数组问题吗?

Harder练习:您能否描述并实现一个字符串数据结构,该结构可以有效地实现字符串的协定,但实际上可以仅对任意字符串使用O(1)额外空间来实现该算法?

更好的练习:事实上,我们只能使用26个字符的字母,这是俗气的“让我们只将int用作标志集”解决方案。与其说n是输入字符串的大小,不如让我们允许具有相等关系的任意值的任意序列;您能否提出一个解决方案,即输出序列的大小为O(n),而不是输入序列的大小?

也就是说,您是否可以使用O(n)存储(其中n是输出序列的大小)来实现public static IEnumerable<T> Distinct<T>(this IEnumerable<T> t)以便对输出进行重复数据删除,但是输出与输入的顺序相同?

这是一个更好的练习,因为此函数实际上是在基类库中实现的。与玩具问题不同,它很有用。

我还注意到问题陈述假设只有一个相关的字母带有小写字母,并且有26个。这个假设是错误的。