C# 我预计这个算法检查元音的速度会很慢
下列算术运算的速度将由句子中的单词数和每个单词中的字符数决定。我相信这是在^2上?或者更糟C# 我预计这个算法检查元音的速度会很慢,c#,algorithm,string,search,C#,Algorithm,String,Search,下列算术运算的速度将由句子中的单词数和每个单词中的字符数决定。我相信这是在^2上?或者更糟 private bool CheckForNoVowels(string sentence) { foreach (string word in sentence.Split(' ')) foreach (char c in word) if (!vowels.Contains(c)) return true; } 有什么秘
private bool CheckForNoVowels(string sentence)
{
foreach (string word in sentence.Split(' '))
foreach (char c in word)
if (!vowels.Contains(c))
return true;
}
有什么秘密吗?比尔·盖茨对我隐瞒了吗?有没有更好、更有效的方法来搜索这个。多谢各位
意图
我试图确定字符串是一个公司还是一个名字,我假设有一个没有元音的单词,它是一个缩写词或首字母缩略词,它是一个公司。不,它非常好。它将被视为输入中字符总数的一部分。我无法想象这会成为你应用程序的性能瓶颈,但你应该使用评测来确定。不,这非常好。它将被视为输入中字符总数的一部分。我无法想象这会成为你的应用程序的性能瓶颈,但你应该使用评测来确定。我不确定它的内部实现是什么,它用[MethodImplMethodImplOptions.InternalCall标记,并且它的算法似乎没有被记录
Regex.IsMatch(sentence, "[aoeui]");
,但我会尝试这种方法
报告第一组的索引
在这种情况下发生任何
字符的指定数组中的字符
Unicode字符。返回值:
从零开始的第一个索引位置
在这种情况下发生的任何
在任意一个中找到字符;如果没有,则为-1
在其中任何一个中都找到了字符
请注意:
对其中任何一个的搜索都是错误的
区分大小写。此方法执行以下操作:
顺序文化
搜索,其中一个字符是
被认为等同于另一个
仅当其Unicode标量为
值相同。要执行
区域性敏感搜索,请使用
CompareInfo.IndexOf方法
例如:
char[] vowels = { 'a', 'e', 'i', 'o', 'u' };
bool hasVowel = word.IndexOfAny(vowels) != -1;
离题,我不明白为什么你的代码将句子拆分成单词,然后查看每个单词中的每个字符以查找元音。这种拆分似乎并没有真正起到任何作用。我不确定它的内部实现是什么,它标记了什么[MethodImplOptions.InternalCall及其算法似乎没有文档记录 ,但我会尝试这种方法 报告第一组的索引 在这种情况下发生任何 字符的指定数组中的字符 Unicode字符。返回值: 从零开始的第一个索引位置 在这种情况下发生的任何 在任意一个中找到字符;如果没有,则为-1 在其中任何一个中都找到了字符 请注意: 对其中任何一个的搜索都是错误的 区分大小写。此方法执行以下操作: 顺序文化 搜索,其中一个字符是 被认为等同于另一个 仅当其Unicode标量为 值相同。要执行 区域性敏感搜索,请使用 CompareInfo.IndexOf方法 例如:
char[] vowels = { 'a', 'e', 'i', 'o', 'u' };
bool hasVowel = word.IndexOfAny(vowels) != -1;
离题,我不明白为什么你的代码将句子拆分成单词,然后查看每个单词中的每个字符以查找一个元音。拆分似乎并没有真正起到任何作用。为什么不删除外部foreach?这里最昂贵的东西似乎是句子。拆分“”,删除它只会导致要检查元音成员资格的空格。否则,这看起来像是一段ON代码。为什么不删除外部foreach?这里最昂贵的东西似乎是句子。拆分“”,删除它只会导致检查元音成员资格的空格。否则,这看起来像是一段ON代码。^2来自哪里
Split正在播放
foreachword…foreach c-为两个foreach一起准确地遍历每个角色一次
元音。如果元音的数量不变或元音的个数不变,则Contains为常量
作为*元音数的结果。^2来自哪里
Split正在播放
foreachword…foreach c-为两个foreach一起准确地遍历每个角色一次
元音。如果元音的数量不变或元音的个数不变,则Contains为常量
结果是*元音数。您可以展平循环以避免不必要的拆分及其字符串分配,但在一天结束时,您仍然需要检查每个字符是否为元音:
private static readonly char[] _vowels = "AEIOUaeiou".ToCharArray();
private bool CheckForVowels(string sentence)
{
return sentence.IndexOfAny(_vowels) != -1;
}
我不知道IndexOfAny的内部实现。我可以想象它必须执行这样一个循环,但很可能它会使用非托管和/或不安全的代码来完成,所以至少会和您自己编写的任何代码一样快。您可以展平循环,以避免不必要的拆分及其字符串分配,但最后如果有一天你仍然需要检查每个字符是否是元音:
private static readonly char[] _vowels = "AEIOUaeiou".ToCharArray();
private bool CheckForVowels(string sentence)
{
return sentence.IndexOfAny(_vowels) != -1;
}
我不知道IndexOfAny的内部实现。我可以想象它必须执行这样一个循环,但很可能它会使用非托管和/或不安全的代码来完成,所以在l
如果你想根据句子中的单词数和每个单词中的字符数来确定时间复杂度,那么你需要两个变量:单词数和每个单词中的字符数。如果你说W是字数,N是最长单词中的字符数,那么你的算法是OW*N,而不是^2。如果你想根据句子中的字数和每个单词中的字符数来确定时间复杂度,那么你需要两个变量:字数,以及每个单词中的字符数。如果你说W是字数,N是最长单词中的字符数,那么你的算法是OW*N,而不是^2。它是O5*2n,是ON。它是用于复制+O5*n进行检查的,5表示元音的数量。但是因为5是一个常数,它会掉,所以它是开的。FWIW,我看不出在你的例子中拆分的意义。也可以立即循环。除非你真的关心哪个单词有元音,否则不要麻烦先拆分成单词。单词“try”不包含元音,但它不是公司名称。查一下命名实体识别,你会发现这不是一个容易的问题。单词CIA包含两个元音…它是O5*2n,这是开着的。它是用于复制+O5*n进行检查的,5表示元音的数量。但是因为5是一个常数,它会掉,所以它是开的。FWIW,我看不出在你的例子中拆分的意义。也可以立即循环。除非你真的关心哪个单词有元音,否则不要麻烦先拆分成单词。单词“try”不包含元音,但它不是公司名称。查一下命名实体识别,你会发现这不是一个容易的问题。CIA这个词包含两个元音…非常好???当然,代码将文本拆分为单词的步骤是不必要的……这是不必要的,但不会影响运行时间。我同意,如果唯一的问题是检查元音,应该改为检查句子中的每个字符。非常好???当然,代码将文本拆分为单词的步骤是不必要的……这是不必要的,但不会影响运行时间。我同意,如果唯一的问题是检查元音,应该改为检查句子中的foreach char。对不起,让我更具体一点。如果字符串是Discount Water LLC,我希望返回true。如果字符串是折扣水,我想返回false。我已经用我的意图更新了这篇文章。@Tom Fobear:现在你也会明白了,因为这篇文章中没有任何内容Discount@Tom:而且,一旦你有了正确的算法,如果你关心这样一件事,你就会在Jr、Sr、Dr.等的名字上打一个假阳性。@indiv:说得好,我有一个前缀和后缀的列表,所以我会确保它们不相等。对不起,让我更具体一些。如果字符串是Discount Water LLC,我希望返回true。如果字符串是折扣水,我想返回false。我已经用我的意图更新了这篇文章。@Tom Fobear:现在你也会明白了,因为这篇文章中没有任何内容Discount@Tom:而且,一旦你有了正确的算法,如果你关心这样一件事,你就会在Jr、Sr、Dr.等的名字上打一个假阳性。@indiv:说得好,我有一个前缀和后缀的列表,所以我会确保它们不相等。