有没有办法首先排序然后搜索链接的对象列表中的对象。 我认为你的排序方式和二进制搜索之一你觉得怎么样? 感谢
答案 0 :(得分:5)
这不是一个好方法,IMO。如果您使用Collections.sort(list)
,list
是LinkedList
,则会将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)
Collections类有许多其他令人惊奇的方法可以让程序员的生活更轻松。
请注意,sort方法的实现确实会将列表转换为数组,但是在调用方法之前,您无需显式地将列表转换为数组:)
答案 2 :(得分:1)
您可能想要质疑搜索排序列表是否是您的用例的最佳选项,因为这不是很好。列表排序为O(NlogN),二进制搜索为O(logN)。您可以考虑从列表元素中创建一个Set,然后通过contains
方法(即O(1))进行搜索,如果您只想查看元素是否存在。如果您可以解释有关用例的更多信息,那么就您可能会考虑哪些集合提供一些建议会更容易。
编辑:如果您打算为大型列表执行此操作,请考虑performance issues of List sorting。