如果我想在arraylist中搜索一个元素,那么Big-Theta是什么?

时间:2016-04-16 02:09:44

标签: java database algorithm

我想我可以先对数组进行排序然后再使用二进制搜索。 所以O(n ^ 2)。 这是对的吗?

1 个答案:

答案 0 :(得分:5)

  

我想我可以先对数组进行排序然后再使用二进制搜索。所以O(n ^ 2)。这是对的吗?

该方法的复杂性为O(nlogn)用于排序,O(logn)用于二进制搜索以进行查找。整体O(nlogn)。

替代方案是简单的线性搜索查找(例如,使用contains或循环),其为O(n)。

如果您可以通过大量查询分摊(整个列表)排序成本,那么排序和使用二进制搜索只会为您提供更好的性能。即排序一次,多次搜索。

如果你想要比线性搜索更好,你需要使用一个数据结构,它允许你用优于O(nlogn)更新排序结构 1 并用优于O(n)的搜索。
最后......如果你这样做:

  • 对初始arraylist进行排序。
  • 使用二进制搜索更新已排序的arraylist,以找到插入/删除的正确位置。
  • 使用二进制搜索进行查找。

最终将进行O(n)更新操作(分摊O(nlogn)排序步骤)和O(logn)查找

简而言之,它是一组复杂的替代方案,最好的方案取决于应用程序的预期行为。

1 - TreeSet会这样做(模数消除重复)。它使用引擎盖下的红黑二叉树。如果您的数据实际上是一个集合,那么您应该考虑HashSet,它会为您提供O(1)个操作(除非哈希码函数是病态的)。