我正在寻找一个很好的最佳策略来编写以下问题的代码。
我有一个对象列表。
我在想的一个策略:
继续。
程序循环了数百万次或更多次迭代,因此优化比较和运行已经成为一个问题。
有关在Java域中解决此问题的良好策略的任何指导。哪些列表最有效,例如LinkedList或ArrayLists或Sets等哪种排序/插入(标准包)最有效?
答案 0 :(得分:1)
考虑这个基于TreeSet的示例,并比较一个String for Results。如您所见,经过足够的迭代后,只有具有非常大键的元素才会保留在List中。在我相当旧的笔记本电脑上,我在不到50毫秒的时间内就拥有了10,000件物品 - 因此每百万个列表操作的响应数为5个。
<!-- //////////////////////////////////////////////////////////////////////////////// -->
<!-- // BEGIN Filters -->
<!-- Spring Security -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/**</url-pattern>
</filter-mapping>
<!-- // END FILTERS -->
<!-- //////////////////////////////////////////////////////////////////////////////// -->
答案 1 :(得分:0)
有关在Java域中解决此问题的良好策略的任何指导。
我的建议是 - 没有必要进行任何排序。在向集合中添加更多对象时,可以通过二进制插入来确保对数据进行排序。
这样,当你添加更多项时,集合本身已经是一个排序状态。
在第500项之后,如果要添加另一项,我们只需执行另一次二进制插入。插入性能始终保持在O(log(n)),并且不需要执行任何排序。
与您的算法比较
您的算法在1 - 4之间正常工作。但步骤5可能是您算法的瓶颈:
5.重新排序列表 - 如果成功
这是因为即使您的列表最多只有500个项目,但在添加第500个项目后,可以在此列表中执行无限次插入。
想象一下,再增加100万次插入和(在更糟糕的情况下),所有100万个项目“成功”并且可以插入到列表中,这意味着您的算法需要执行100万次排序!
这将是1 million * n(log(n))
进行排序。
与二进制插入比较,在更糟糕的情况下,插入1 million * log(n)
(无排序)。
哪些列表最有效,例如LinkedList或ArrayLists或Sets等。
如果使用ArrayList,则插入与链表相比效率不高,因为ArrayList由数组支持。但是,与链接列表(即O(n))相比,对于arrayList,元素的访问仅为O(1)。因此,没有一种对所有场景都有效的数据结构。您必须首先规划算法,看看哪种算法最适合您的策略。
哪种排序/插入(标准包装)最有效?
据我所知,有Arrays.sort()
和Collections.sort()
可用,这将为您提供良好的O(n log(n))性能,因为它们使用的是双枢轴排序比自己创建的简单插入/冒泡/选择排序更有效。