算法复杂性与现实生活情况?
Algorithmic complexity vs real life situations?
我的问题是关于理论与实践的问题。
例如,我想对数字列表进行排序。归并排序的复杂度为 O(n*logn),而冒泡排序的复杂度为 O(n^2)。
这意味着合并排序更快。但是复杂性并没有考虑到计算机上发生的整个事情。我的意思是,例如,mergesort 是一种分而治之的算法,它比 bubblesort 需要更多 space。
因此,与不使用任何额外space ?
对于特定长度的输入(可能很小),使用复杂度比另一个算法更差(“更大”)的算法会不会更有效?
答案是肯定的。
一个经典的例子就是插入排序O(n^2)
。然而,高效的排序实现通常会在剩下大约 100 个元素时切换到插入排序,因为插入排序确实很好地利用了缓存,并且避免了 CPU 中的管道停顿。不,插入排序不会扩展,但它的性能更好。
我的意思是可扩展性就像一辆麦克卡车。你想要它来承受大负荷,但它可能不是去当地杂货店购物的最佳选择。
算法复杂度仅告诉您两种算法在输入变大(即接近无穷大)时将如何进行比较。它没有告诉您他们将如何比较较小的输入。确定这一点的唯一方法是对代表典型情况的数据和设备进行基准测试。
我的问题是关于理论与实践的问题。
例如,我想对数字列表进行排序。归并排序的复杂度为 O(n*logn),而冒泡排序的复杂度为 O(n^2)。
这意味着合并排序更快。但是复杂性并没有考虑到计算机上发生的整个事情。我的意思是,例如,mergesort 是一种分而治之的算法,它比 bubblesort 需要更多 space。
因此,与不使用任何额外space ?
对于特定长度的输入(可能很小),使用复杂度比另一个算法更差(“更大”)的算法会不会更有效?
答案是肯定的。
一个经典的例子就是插入排序O(n^2)
。然而,高效的排序实现通常会在剩下大约 100 个元素时切换到插入排序,因为插入排序确实很好地利用了缓存,并且避免了 CPU 中的管道停顿。不,插入排序不会扩展,但它的性能更好。
我的意思是可扩展性就像一辆麦克卡车。你想要它来承受大负荷,但它可能不是去当地杂货店购物的最佳选择。
算法复杂度仅告诉您两种算法在输入变大(即接近无穷大)时将如何进行比较。它没有告诉您他们将如何比较较小的输入。确定这一点的唯一方法是对代表典型情况的数据和设备进行基准测试。