我经常看到你们在谈论N种方法和N ^ 2种方法,如果我错了,请纠正我,指出方法的速度有多快。我的问题是:你们怎么知道哪种方法是N,哪些是N ^ 2?而且:还有其他方法的速度指示,那么只有N和N ^ 2?
答案 0 :(得分:2)
这说明了算法的复杂性(这是一个多快的指标,是的)
简而言之,它表示对于大小为“N”的方法的输入将需要多少“操作”(操作是一个非常模糊和抽象的术语)。
e.g。如果您的输入是List类型对象,并且您必须遍历列表中的所有项目,则复杂性为“N”。 (通常表示为O(N))。
如果你的输入是一个列表类型的对象,你只需要查看第一个(或最后一个),并且列表保证你看这个项目是O(1);你的方法将是O(1) - 独立于输入大小。
如果您的输入是一个列表,并且您需要将每个项目与每个其他项目进行比较,那么复杂度将为O(N²)或O(N * log(n))
答案 1 :(得分:2)
如果我错了,请纠正我,说明方法有多快。
它说一个算法如何在理想的机器上扩展。它故意忽略了所涉及的因素,这可能意味着O(1)可能比O(N)慢,这可能比你的用例慢O(N ^ 2)。例如Arrays.sort()将对小集合使用插入排序O(N ^ 2)(Java 7中的长度<47),而不是快速排序O(N ln N)
一般来说,使用低阶算法是一种更安全的选择,因为它们在极端情况下不太可能中断,您可能无法彻底测试。
答案 2 :(得分:0)
猜测程序的大O复杂性的方法是基于干运行代码的经验(在您的脑海中运行它)。有些情况很明显,但最有趣的情况不是:例如,在O(n)循环中调用已知为O(n)的库方法会导致总数为O(n 2 )复杂;写入O(n)循环中的TreeMap
会导致总计O(nlogn),依此类推。