我一直在为一些采访做一些练习问题,我对某些事感到好奇。比方说,例如,在以下算法中
foreach(User friend in friends)
{
foreach(Purchase purchase in friend.Purchases)
{
allFriendsPurchases.Add(purchase);
}
}
所以,通过每个朋友是O(n),因为我们正在遍历所有的朋友。但是子循环怎么样?有些朋友可能没有购买任何东西,有些朋友已经购买了很多东西。您如何描述Big O Notation中的运行时间?
由于
答案 0 :(得分:6)
这是指定n
是什么非常重要的案例之一。此算法可以定义为O(n),其中n
表示购买总数,而不是朋友总数。
如果您想将n
定义为朋友数量,那么n
单独的变量就不够了。迭代次数不仅取决于有多少朋友。您可以通过不同的方式描述迭代次数;一种方法是说这个算法是O(n * m),其中n
是朋友的数量,m
是每个朋友的平均购买数量。 (如果已知m
很小,比如说小于某个固定值,那么你可以将其转换为O(n),声称m
是常数,但这不是真的一般情况。)