C# 嵌套循环,提高性能
我有一个字符串列表,以便将编号为“1”的字符串分组,比如string=“00000”属于第一组,string=“00001”属于第二组。所有的字符串长度相等。现在我比较第一组和第二组,第二组和第三组,很快…就像图中一样。将第一组中的第一个元素与第二组中的所有元素进行比较。直到每个字符串都被比较。有没有办法提高我的程序的性能?因此,我可以实现32000字符串与15长度 编辑 对过去的帖子感到抱歉。读完后我意识到我这样问是愚蠢的。 该计划的目标是简化程序。基于Quine–McCluskey算法 考虑C# 嵌套循环,提高性能,c#,algorithm,C#,Algorithm,我有一个字符串列表,以便将编号为“1”的字符串分组,比如string=“00000”属于第一组,string=“00001”属于第二组。所有的字符串长度相等。现在我比较第一组和第二组,第二组和第三组,很快…就像图中一样。将第一组中的第一个元素与第二组中的所有元素进行比较。直到每个字符串都被比较。有没有办法提高我的程序的性能?因此,我可以实现32000字符串与15长度 编辑 对过去的帖子感到抱歉。读完后我意识到我这样问是愚蠢的。 该计划的目标是简化程序。基于Quine–McCluskey算法 考虑
000
001
010
011
100
101
110
111
我把它们按1的数目分组
000
001
010
100
011
101
110
111
然后我将组中的每个字符串与下一组进行比较
group 1
000
group 2
001
010
100
group 3
011
101
110
group1 -> group2
------------------
000 -> 001 = 00-
000 -> 010 = 0-0
000 -> 100 = -00
------------------
group2 ->group3
--------------------
001 -> 011 = 0-1
001 -> 101 = -01
001 -> 110 = no output
010 -> 011 = 01-
010 -> 101 = no output
010 -> 110 = -10
100 -> 011 = no output
100 -> 101 = 10-
100 -> 110 = 1-0
---------------------
etc.
然后按数字1再次对输出进行分组,并再次进行比较,直到无法比较任何字符串
我需要实现一个15的变量,但它需要永远为程序完成。任何想法如何加快它。我在线程上测试它,但只是有一点改进
字符串数:2048变量长度:11时间:10分钟
需要实现
字符串数:32767变量长度:15时间:无法实现
输出隐含最终结果老实说,您想要实现的目标并不明确。。。您的描述与代码不匹配。(例如,您的代码从未提到字符“1”。您从未使用调用
CompareString
的结果这一事实也令人怀疑。)LINQ应该使实现您对“将字符串与数字“1”分组”的描述变得简单有效:
var grouped = strings.GroupBy(x => x.Count(c => c == '1'));
这将只对每个字符串中的“1”个字符计数一次。您永远不需要将任何字符串与另一个字符串进行比较
如果这不是你真正想要做的,你需要澄清你的实际目标是什么。我不知道如何写C#,但我想帮你。因此,我的代码是用Java编写的。
1.我认为
=
是一个O(n)
操作,您的比较可能是O(nlgn)
其中n=str1.Length
。使用更简单、更快的O(n)
方法,查看时间是否减少:
private String CompareString(String str1, String str2) {
StringBuilder sb = new StringBuilder(str1.length());
for (int i = 0; i < str1.length(); i++) {
if (str1.charAt(i) == str2.charAt(i))
sb.append(str1.charAt(i));
else
sb.append('-');
}
return sb.toString();
}
我闻到一个XY问题。你真正想要完成的任务是什么?为什么你用C++和C标记这一点?你为什么要把c#和c#-4.0以及c#-3.0都包括进来?我喜欢这张图片,当我想说明一个问题不清楚的时候,这可能是我最喜欢的。返回的CompareString()
没有用吗?我已经编辑了我的帖子。希望我已经解释过了well@Snippet:不,仍然不清楚“按组比较字符串”是什么意思。@Snippet:老实说,我仍然不太清楚-但我还是建议使用LINQ来表达它。它可能会以更清晰的代码结束。感谢@Jon Skeet。我会接受你的建议,开始学习LINQThnx以获得帮助。我已经使用了它,并从我的新版本中测试了可能的循环。对于长度为8的字符串,循环比较8次,在新字符串中比较4次。我知道“我的代码”最糟糕的情况是,如果有太多不同的字符,但我使用esum捕捉到的字符串将只有一个唯一的字符。@Snippet In(一个长度为8的字符串)==(一个长度为8的字符串)
,虽然看起来只有1个比较,但实际上有8个。
MintermsByOne = Loaded with string 000 001 and so on
CombineAndGroup(MintermsByOne);
ImplicantsByOneFinal = TermsByOne;
while (CombineAndGroup(TermsByOne))
{
ImplicantsByOneFinal = TermsByOne;
}
var grouped = strings.GroupBy(x => x.Count(c => c == '1'));
private String CompareString(String str1, String str2) {
StringBuilder sb = new StringBuilder(str1.length());
for (int i = 0; i < str1.length(); i++) {
if (str1.charAt(i) == str2.charAt(i))
sb.append(str1.charAt(i));
else
sb.append('-');
}
return sb.toString();
}
private boolean isPowerOfTwo(int x) {
return (x > 0 && (x & (x - 1)) == 0);
}