C# #是的!这使速度提高了80倍。请看这一行: Enumerable.Range(char.MinValue, char.MaxValue - char.MinValue)
char.MaxValue是65536。因此,如果N=181,则循环为181x181x65536!我刚刚运行了探查器来确认:98.4%的CPU时间花在wordSplit中的ToArray()调用上。请参阅最后的更新: 这里有一些“低挂果实”,可以在不改变算法本身的情况下大大加快速度:C# #是的!这使速度提高了80倍。请看这一行: Enumerable.Range(char.MinValue, char.MaxValue - char.MinValue),c#,arrays,performance,loops,jagged-arrays,C#,Arrays,Performance,Loops,Jagged Arrays,char.MaxValue是65536。因此,如果N=181,则循环为181x181x65536!我刚刚运行了探查器来确认:98.4%的CPU时间花在wordSplit中的ToArray()调用上。请参阅最后的更新: 这里有一些“低挂果实”,可以在不改变算法本身的情况下大大加快速度: wordSplit()每次调用时都会重新计算“标点符号”。在前面做一次 您正在为同一个句子调用wordSplit()N^2次,而不是N次,因为它同时位于外部(x1,x2)循环和内部(y1,y2)循环中。你只需要拆分
Enumerable.Range(char.MinValue, char.MaxValue - char.MinValue)
char.MaxValue是65536。因此,如果N=181,则循环为181x181x65536!我刚刚运行了探查器来确认这一点:98.4%的CPU时间花在wordSplit中的ToArray()调用上。您基本上是将一个文档中的X个句子与另一个文档中的Y个句子进行比较,这将进行X*Y比较,而且由于每个比较本身都有点昂贵,是的,这需要时间。因为你在做普通单词,你有没有可能把一个文档预处理到一个由单词输入的字典中,然后再把同一个文档中的句子相互比较,然后每个句子都会得到一个分数,代表它对其他句子的公平程度。不知道我是否解释得很好。我觉得压缩数组的问题在于,即使将数组与字典进行比较,分数也需要基于句子之间的比较,这将丢失。我投票将这个问题作为离题题结束,因为它更适合codereview.stackexchange.comSo,基于70句话的基线,181句话所需的时间应该和你预期的一样。在70句的情况下,您正在进行70*70比较(4900)。在181案件中,你做的是32761。32761 / 4900 ~= 6.7. 因此,在最坏的情况下,181个判决的案件应该需要6.7倍的时间。很明显,启动时间和其他固定时间成本不应该包括在内。我同意Lasse V.Karlsen的观点。转换为HashSet,并通过一个简单的枚举和另一个的.Contains()来比较它们。我知道段落有点复杂,但我相信你能做到。你基本上是在比较一个文档中的X个句子和另一个文档中的Y个句子,这将进行X*Y比较,而且由于每个比较本身都有点昂贵,是的,这需要时间。因为你在做普通单词,你有没有可能把一个文档预处理到一个由单词输入的字典中,然后再把同一个文档中的句子相互比较,然后每个句子都会得到一个分数,代表它对其他句子的公平程度。不知道我是否解释得很好。我觉得压缩数组的问题在于,即使将数组与字典进行比较,分数也需要基于句子之间的比较,这将丢失。我投票将这个问题作为离题题结束,因为它更适合codereview.stackexchange.comSo,基于70句话的基线,181句话所需的时间应该和你预期的一样。在70句的情况下,您正在进行70*70比较(4900)。在181案件中,你做的是32761。32761 / 4900 ~= 6.7. 因此,在最坏的情况下,181个判决的案件应该需要6.7倍的时间。很明显,启动时间和其他固定时间成本不应该包括在内。我同意Lasse V.Karlsen的观点。转换为HashSet,并通过一个简单的枚举和另一个的.Contains()来比较它们。我意识到段落有点复杂,但我相信你能做到更新让我大吃一惊我正试着了解一下Coord变量和intersectionArray,这是一个2D数组,它保存着句子编号^2,这样我就可以看到任何句子的交叉值,可视化它就像一张时间表卡片,你可以沿着它往下走到3x5等等。我需要所有这些值,因为它允许我进行分析,比如在一个段落或某物中的常用词。我试图理解你添加的eureka更新,尽管关于我放置/替换的位置,我不会假装我理解“enumerable.range”行的含义,但我实现了你的所有建议,而且现在是即时的。我已经更新了我的问题,以显示我现在如何拥有它,谢谢!你更新让我大吃一惊我正试着了解一下Coord变量和intersectionArray,这是一个2D数组,它保存着句子编号^2,这样我就可以看到任何句子的交叉值,可视化它就像一张时间表卡片,你可以沿着它往下走到3x5等等。我需要所有这些值,因为它允许我进行分析,比如在一个段落或某物中的常用词。我试图理解你添加的eureka更新,尽管关于我放置/替换的位置,我不会假装我理解“enumerable.range”行的含义,但我实现了你的所有建议,而且现在是即时的。我已经更新了我的问题,以显示我现在如何拥有它,谢谢!
public List<List<string>> createWordList()
{
List<List<string>> wordList = new List<List<string>>();
var symbols = "£$€#&%+-.";
var punctuationsChars = Enumerable.Range(char.MinValue, char.MaxValue - char.MinValue)
.Select(i => (char)i)
.Where(c => char.IsPunctuation(c))
.Except(symbols)
.ToArray();
for (int x1 = 0; x1 < results.Length; x1++)
{
for (int x2 = 0; x2 < results[x1].Length; x2++)
{
var words = results[x1][x2].Split(punctuationsChars)
.SelectMany(x => x.Split())
.Where(x => !(x.Length == 1 && symbols.Contains(x[0])))
.Distinct()
.ToList();
wordList.Add(words);
}
}
return wordList;
}
protected void intersectionMatrix()
{
List<List<string>> wordList = createWordList();
mainSentenceCoord = -1;
for (var x = 0; x < wordList.Count; x++)
{
secondarySentenceCoord = -1;
mainSentenceCoord++;
for (var y = 0; y < wordList.Count; y++)
{
secondarySentenceCoord++;
intersectionArray[mainSentenceCoord, secondarySentenceCoord] = wordList[x].Intersect(wordList[y]).Count();
}
}
}
Enumerable.Range(char.MinValue, char.MaxValue - char.MinValue)