C# 该算法的空间复杂度是O(1)
我发现了一种算法,可以从具有O(1)空间复杂度(SC)的字符串中删除重复字符。这里我们看到,该算法将字符串转换为非常量的字符数组,它将根据输入大小而变化。他们声称它将在O(1)的SC中运行。怎么做C# 该算法的空间复杂度是O(1),c#,arrays,space-complexity,C#,Arrays,Space Complexity,我发现了一种算法,可以从具有O(1)空间复杂度(SC)的字符串中删除重复字符。这里我们看到,该算法将字符串转换为非常量的字符数组,它将根据输入大小而变化。他们声称它将在O(1)的SC中运行。怎么做 //删除重复项的函数 从字符串(字符串string1)移除的静态字符串复制 { //跟踪访问过的角色 int计数器=0; char[]str=string1.ToCharArray(); int i=0; int size=str.长度; //获取字符值 int x; //跟踪结果字符串的长度 整数
//删除重复项的函数
从字符串(字符串string1)移除的静态字符串复制
{
//跟踪访问过的角色
int计数器=0;
char[]str=string1.ToCharArray();
int i=0;
int size=str.长度;
//获取字符值
int x;
//跟踪结果字符串的长度
整数长度=0;
而(i
事实并非如此
该算法将一个仅由26个字符组成的任意大小的字符串作为其输入,因此输出仅为26个字符或更少,因此输出数组不必具有输入的大小
您正确地指出,站点上给出的实现为char数组不必要地分配了O(n)个额外空间
练习:您能解决字符数组问题吗
更难的练习:您能否描述并实现一个字符串数据结构,该结构可以有效地实现字符串的收缩,但实际上只允许对任意字符串使用O(1)个额外空间来实现该算法
更好的练习:我们被限制在一个26个字符的字母表中,这一事实使得俗气的“让我们只使用int作为一组标志”成为可能解决方案。不要说n是输入字符串的大小,如果我们允许具有相等关系的任意值的任意序列,会怎么样?你能想出一个解决方案,即输出序列的大小是O(n),而不是输入序列吗
也就是说,您能否实现公共静态IEnumerable Distinct(此IEnumerable t)
,以便使用O(n)存储(其中n是输出序列的大小)对输出进行重复数据消除,但顺序与输入相同
这是一个更好的练习,因为这个函数实际上是在基类库中实现的。它很有用,不像玩具问题
我还注意到,问题陈述假设只有一个带有小写字符的相关字母表,其中有26个。这种假设是错误的。这是Java?C#?请使用适当的语言标记。关于算法,字符数组在算法运行期间没有增长,因此需要con静态空间。因此,O(1)。你不清楚什么部分?你可能把空间和时间复杂度混淆了吗?@CodyGray实际上语言在这里不重要。它重要;你在问题中发布了大量代码。现有的String
数据类型可以在O(1)中实现算法空间,如果它包括一个通用静态方法,该方法接受整数n
和一个约束到IEnumerator
或类似接口的参数,并将枚举器返回的第一个n
值存储到长度n
的新字符串中。因为对新字符串的引用永远不会暴露于在暴露后可以修改它的外部代码中,所有不变性保证将保持不变。练习:你能解决字符数组问题吗?
特别是对于这个算法,这里不需要声明该字符串的字符数组。如果我们假设只有256个字符,那么我们可以声明fixedchar[256]数组
并执行该操作。需要对算法进行一些小的更改。@Moshii:这里的概念可能是输入字符串只包含26个字符,因此输出永远不会超过26个字符。您的评论中的256号来自哪里?@Moshii:您是上世纪70年代的时间旅行者吗?:)C#char是16位的,共有65536位。我们在现代代码中使用Unicode,而不是ASCII。@TheodorZoulias:如果你是负责实现Distinct
的人,那该怎么办?必须有人来编写代码;它不仅仅是自己产生的。你将如何编写它?这是一个挑战。
// 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);
}