搜索无序列表而不将其转换为数组

时间:2010-02-02 05:11:47

标签: java search list sorting

有没有办法首先排序然后搜索链接的对象列表中的对象。 我认为你的排序方式和二进制搜索之一你觉得怎么样? 感谢

3 个答案:

答案 0 :(得分:5)

这不是一个好方法,IMO。如果您使用Collections.sort(list)listLinkedList,则会将list复制到临时数组,对其进行排序,然后将其复制回列表'ie { {1}}排序加O(NlogN)份副本。但是当你尝试进行二分搜索时(例如使用2 * O(N),每次搜索都会进行Collections.binarySearch(list)列表遍历操作。所以你也可以不打扰排序列表!

另一种方法是将列表转换为数组或ArrayList,然后对该数组/ ArrayList进行排序和搜索。这样就可以设置一个副本加一种设置,并为每次搜索提供O(N)

但这些都不是最好的方法。这取决于您需要执行搜索操作的次数。

  • 如果你只想在列表上进行一次搜索,那么调用O(logN)就是list.contains(...) ......这比涉及排序和二进制搜索的任何内容都要好。

  • 如果要对永不更改的列表执行多次搜索,最好将列表条目放入HashSet中。构造HashSet是O(N),搜索是O(N)。 (这假设您不需要自己的比较器。)

  • 如果要对不断更改订单不重要的列表执行多次搜索,请将列表替换为HashSet。每次添加/删除时,更新HashSet的增量成本为O(1),每次搜索都会O(1)

  • 如果要对不断更改且订单有效的列表执行多次搜索,请将列表替换为插入顺序的LinkedHashMap。每次添加/删除都会O(1),每次搜索都会O(1) ...但是比例性的大常数比HashSet大。

答案 1 :(得分:3)

  • java.util.Collections中#排序()
  • java.util.Collections中#的binarySearch()

Collections类有许多其他令人惊奇的方法可以让程序员的生活更轻松。

请注意,sort方法的实现确实会将列表转换为数组,但是在调用方法之前,您无需显式地将列表转换为数组:)

答案 2 :(得分:1)

您可能想要质疑搜索排序列表是否是您的用例的最佳选项,因为这不是很好。列表排序为O(NlogN),二进制搜索为O(logN)。您可以考虑从列表元素中创建一个Set,然后通过contains方法(即O(1))进行搜索,如果您只想查看元素是否存在。如果您可以解释有关用例的更多信息,那么就您可能会考虑哪些集合提供一些建议会更容易。

编辑:如果您打算为大型列表执行此操作,请考虑performance issues of List sorting