我想我可以先对数组进行排序然后再使用二进制搜索。 所以O(n ^ 2)。 这是对的吗?
答案 0 :(得分:5)
我想我可以先对数组进行排序然后再使用二进制搜索。所以O(n ^ 2)。这是对的吗?
该方法的复杂性为O(nlogn)用于排序,O(logn)用于二进制搜索以进行查找。整体O(nlogn)。
替代方案是简单的线性搜索查找(例如,使用contains
或循环),其为O(n)。
如果您可以通过大量查询分摊(整个列表)排序成本,那么排序和使用二进制搜索只会为您提供更好的性能。即排序一次,多次搜索。
如果你想要比线性搜索更好,你需要使用一个数据结构,它允许你用优于O(nlogn)更新排序结构 1 并用优于O(n)的搜索。
最后......如果你这样做:
最终将进行O(n)更新操作(分摊O(nlogn)排序步骤)和O(logn)查找
简而言之,它是一组复杂的替代方案,最好的方案取决于应用程序的预期行为。
1 - TreeSet
会这样做(模数消除重复)。它使用引擎盖下的红黑二叉树。如果您的数据实际上是一个集合,那么您应该考虑HashSet
,它会为您提供O(1)
个操作(除非哈希码函数是病态的)。