嗨,这个时间复杂度中哪一个更好。
O(n log m)
与O(n + m)
分析这两种算法,哪一种更适合大规模使用practicall?
例如)如果n和m呈指数级大,则变为
O(2e)
与O(e*(something linear to e))
示例问题:两个数组中的常见元素:
1) 2指针进近
2) 使用二进制搜索
我想您要问的是如何最好地在两个排序数组中找到公共元素。您可以选择两种算法:
- "双指针"方法,即O(m+n)
- 使用二进制搜索来确定数组N中的项是否在数组M中。这是O(N log M)
如果数组大小接近相同,那么第一个算法是严格线性的,这是优选的。
如果其中一个数组比另一个大得多,那么您可能需要考虑二进制搜索方法。您需要在较大的数组中搜索较小数组中的项目。例如,如果您有数组M和N,其中M有1000000个项目,N有100个项目,您可以选择:
- 在N中查找M(即在100的数组上进行1000000次搜索)
- 在M中查找N(即在1000000的数组上进行100次搜索)
如果你在N中寻找M,那么复杂性是O(M log N)。这里,m=1000000
和log(n)=7
(近似)
如果你在M中寻找N,那么复杂度是O(N log M)。CCD_ 7和CCD_。
在这种情况下,你想做什么很清楚。
在实践中,应该使用O(m+n)还是O(n-log-m)(其中n小于m)算法之间的界限只能根据经验来确定。这不仅仅是一个计算是否为(m + n) < (n log m)
的问题,因为二进制搜索涉及一点双指针方法没有的开销。即使(m + n)
是(n log m)
的两倍或三倍,双指针方法也很可能更快。
两者都不明显更好,因为这取决于n
和m
的相对值。
如果你假设它们相等,那么你有O(n log n)
和O(n)
,所以第二个(O(n + m)
)更快。另一方面,如果n
实际上是恒定的,而m
增长很快,那么你看到的是O(log m)
与O(m)
,所以第一个更好。
基本上,第一种方法对大的m
更好,第二种方法对它们都同样大的情况更好。(如果n
在方程中占主导地位,那么它们都只是线性的。)
总之,它是m+n与(mlogn或nlogm之一)的值,这取决于您选择的两个数组的长度。尽管Big-O复杂度分析没有考虑对数的"基数",但对于这些值决定了更好的复杂度的问题,需要注意的是,对数的基数是"2",而不是"10",其中采用了特定的示例来计算所查看的元素数或所进行的比较数。