1 c# algorithm performance foreach
描述
此程序的目标是从用户订单和这些订单的productList foreach填充orderList.(请忽略此伪C#代码可能出现的语法错误)
数据结构
class User {
List<Order> orders;
}
class Order {
List<Product> products;
}
class Product {
int price;
}
List<User> userList = GetUsersFromDB();
List<Order> orderList = new List<Order>();
List<Product> productList = new List<Product>();
Run Code Online (Sandbox Code Playgroud)
第一版
foreach(User u in userList) {
foreach(Order o in u.orders) {
orderList.Add(o);
foreach(Product p in o.products) {
productList.Add(p);
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二版
foreach(User u in userList) {
foreach(Order o in u.orders) {
orderList.Add(o);
}
}
foreach(Order o in orderList) {
foreach(Product p in o.products) {
productList.Add(p);
}
}
Run Code Online (Sandbox Code Playgroud)
我的想法
因此第二个程序更快,更正确?
概观
你对第二种情况的分析是错误的.由于第一个循环的每个内部事物的orderlist中都有一个条目,因此foreach(Order o in orderList)循环遍历n ^ 2个项目.说过这里有一个免责声明,因为它代表了很多东西,所以n在这里不是很有意义.
更好的方法是使用u,o和p来查看它.
情况1
第一个显然是O(uop).
案例2
这种情况有两组循环.第一对循环O(uo)正如您所期望的那样.
然后第二对循环以uo项目循环开始,然后是O(p)的内循环,所以第二对循环开始O(uop).总的来说,这使得O(uo)+O(uop)这相当于O(uop),同为1的情况下.
基本上第二种情况只是稍微移动一下,它实际上根本没有改变基本算法.
真实世界
一如既往,如果您实际关注的是真实世界的性能,而不仅仅是理论上的算法复杂性(在查看特定情况时并不总是有用),那么就可以对两种技术的性能进行基准测试.