c# - O(n^2) 比 O(n) 快吗?
问题描述
我写了一个小程序来测试我创建的两个单独的扩展方法的速度,在下面的截图中详细说明:
public static class Extensions
{
public static List<string> ParseEmails(this string[] emails, char[] charsToSplitOn)
{
List<string> list = new List<string>();
foreach (string email in emails)
{
string[] splitArr = email.Replace(" ", "").Split(charsToSplitOn, StringSplitOptions.RemoveEmptyEntries);
foreach (string item in splitArr)
{
list.Add(item);
}
}
return list;
}
public static string[] ParseEmails2(this string[] emails, char[] charsToSplitOn)
{
string str = string.Empty;
foreach (string item in emails)
{
str += item + ';';
}
return str.Replace(" ", "").Split(charsToSplitOn, StringSplitOptions.RemoveEmptyEntries);
}
}
Main 方法初始化一个Stopwatch
类以跟踪每个方法执行iterations
的时间量。
第一种方法在另一个循环中ParseEmails
有一个循环,而第二种方法“ParseEmails2”只有一个循环。for
for
for
我希望第二种方法 ,ParseEmails2
会更快,因为据我了解,这是在 O(n) 时间内完成的,而我的第一种方法 ,ParseEmails
是在 O(n^2) 时间内完成的。
如果这是真的,那么我的结果不应该指向ParseEmails2
两种方法中的更快吗?
解决方案
您必须准确说明您的意思O(n^2)
。是什么n
?如果 n 对应于电子邮件的数量(在emails
数组中),则第一个方法在 的规模上运行O(n)
,因为您对所有电子邮件进行了一次迭代。
在第二种方法中,您使用字符串连接,这意味着您每次循环运行都会创建一个新字符串,从而导致复杂度为O(n^2)
.
更喜欢StringBuilder
在循环中使用或列表而不是连接字符串。
推荐阅读
- c++ - 使用 Rcpp 糖就地修改 SEXP
- c# - 如何使用相同的HelixViewport3D屏幕两种不同的形式c#
- javascript - 使用本机 javascript 将事件添加到我的日历
- javascript - 使用按钮更改我的软件语言。所有键都被翻译,除了两个键共享相同的按钮页面
- python-3.x - 为什么这个函数使用 str 文件路径比使用 PosixPath 快得多?
- jquery - 在 Ajax 调用中更改 DIV 自动刷新的参数
- python - 启动时带有 QTablewidget 信号的 rowCount
- javascript - TypeScript 属性中 readonly 与 get 有什么区别?
- reactjs - Reactjs - 编写一个函数以启用输入文本验证按钮
- react-native - React-Native 应用程序中的网络问题