- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
问题:有人知 Prop 有以下特征的集合的 Java 实现(我现在没有时间/知识来开发自己的)吗?
用例的精简(过度简化)版本是:
TimeClass
TimeClass
TimeClass
TimeClass
在事件开始时将事件的开始时间添加到集合*(快速添加)TimeClass
在事件结束时从该集合*中删除事件的开始时间(快速随机访问删除)TimeClass
能够报告最低未完成开始时间(快速最小值)* 将集合 视为:Collection<Time> implements Comparable<Time>
因为我不确定我的系统(TimeClass
所在的系统)的运行时行为是什么,所以我使用这些集合快速对以下场景进行了基准测试:TreeMultiSet
( Guava ),MinMaxPriorityQueue
( Guava ),ArrayList
.
请注意,根据所使用的集合,最小值 以不同的方式实现(记住元素是按递增顺序添加的):TreeMultiSet.firstEntry().getElement()
, MinMaxPriorityQueue.peekFirst()
, ArrayList.get(0)
.
添加 1,000,000:
TreeMultiSet
: 00:00.897 (m:s.ms)List
: 00:00.068 (m:s.ms)MinMaxPriorityQueue
: 00:00.658 (m:s.ms)添加 1,删除 1,重复 1,000,000 次:
TreeMultiSet
: 00:00.673 (m:s.ms)List
: 00:00.416 (m:s.ms)MinMaxPriorityQueue
: 00:00.469 (m:s.ms)按顺序添加 10,000,按顺序删除所有:
TreeMultiSet
: 00:00.068 (m:s.ms)List
: 00:00.031 (m:s.ms)MinMaxPriorityQueue
: 00:00.048 (m:s.ms)按顺序添加 10,000 个,按随机顺序删除所有:
TreeMultiSet
: 00:00.046 (m:s.ms)List
: 00:00.352 (m:s.ms)MinMaxPriorityQueue
: 00:00.888 (m:s.ms)目前的想法:
我倾向于使用 TreeMultiSet
因为它具有最稳定的性能并且似乎最优雅地降级。 我希望得到更多建议
谢谢
--编辑--
按顺序添加所有内容,按随机顺序删除所有内容的示例伪代码:
benchmark(){
int benchmarkSize = 1000000;
int benchmarkRepetitions = 100;
Duration totalDuration = Duration.fromMilli(0);
TimeClass timeClass = new TimeClassImplementation();
for (int i = 0; i < benchmarkRepetitions; i++)
totalDuration += benchmarkRun(timeClass,benchmarkSize);
System.out.println(totalDuration);
}
Duration benchmarkRun(TimeClass timeClass, int count){
List<Time> times = createMonotonicallyIncreasingTimes(count)
// monotonically increasing times to add from
List<Time> timesToAddFrom = copy(times)
// random times to remove from
List<Time> timesToRemoveFrom = shuffleUniformly(copy(times))
Time startTime = now()
// add all times
for(Time time: timesToAddFrom) {
Time min = timeClass.addTimeAndGetMinimumValue(time);
// don't use min value
}
// remove all times
for(Time time: timesToRemoveFrom) {
Time min = timeClass.removeTimeAndGetMinimumValue(time);
// don't use min value
}
Time finishTime = now()
return finishTime - startTime;
}
最佳答案
最好的选择是 TreeMap :
http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html
O(log n) 几乎适用于所有操作。您可以让您的 key 恢复排序。
Google (guava) 还有一个 MinMaxPriorityQueue
尽管移除是 O(n),所有其他操作都是 O(log n)
关于支持 : duplicate values, 快速添加、快速删除、快速最小值的 Java 集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25077543/
我有一个内部表,里面有 108 个条目。从 9 到 9 个条目重复条目,我想删除这些重复项。由于它们完全相同,我使用了 delete adjacent duplicates from itab com
在 Team Foundation Server (TFS) 中链接两个工作项 (WI) 时,在什么情况下将“Duplicate”和“Duplicate Of”区分为“链接类型”是有意义的? 如何处理
ld: duplicate symbol _velocityX in \ /Users/Student/Library/Developer/Xcode/DerivedData/finalproject
我使用 PHP 和 Mysql。 此 SQL 有效: INSERT INTO products (id, title, description) VALUES (10, 'va
我有一个大数据框 (120000x40),我尝试在每一行中找到重复项并显示它们。这就是我的尝试: 创建数据框 import pandas as pd df = pd.DataFrame({'col1'
我是 mySQL 和 PHP 的新手,请多多包涵。 如果我的查询有重复字段,我该如何做到这一点,检索到的数据将具有重复查询字段的重复数据。 一个例子是这样的: 查询 id = 34, 54, 21,
我一直遇到这个错误,但我无法理解它,因为它提示一个值恰好出现一次。 Exception in thread "main" java.lang.IllegalStateException: Duplic
我有一个带有 Vuejs 和 Laravel 的 Web 应用程序 我想使用 CKEditor 5 我安装了依赖项 npm install --save @ckeditor/ckeditor5-vue
我有一个包含以下数据的 csv 文件: Id,Name,Type,date 1,name1,employee,25/04/2017 2,name2,contrator,26/04/2017 3,nam
import CKEditor from '@ckeditor/ckeditor5-react'; import ClassicEditor from '@ckeditor/ckeditor5-bui
表定义: CREATE TABLE PositionalDataNGS ( Date DATE, Time TIME(3) , X FLOAT(5), Y FLOAT(5), D FLOAT(5) ,
我目前正在做一个项目,我要处理数以千计的数据包。现在,我记录每个数据包的 IP 和 MAC 地址以及一些其他信息。为了存储所有这些,我使用 MySQL 并且我的脚本是用 Node.js 编写的。目前我
I am using MySQL 5.1.56, MyISAM. My table looks like this:我使用的是MySQL 5.1.56,MyISAM。我的桌子是这样的: CR
我是新来的,对 SQL 比较陌生。我有一个类似这样的表: [Pk], [Case_No], [Status], [Open_Date], [Close_Date], [Case_Age], [Repo
为什么会收到此警告? warning No duplicate props allowed react/jsx-no-duplicate-props# 它显示的是第28行,但没有使用 Prop 。 最
是否有任何函数或方法可以在 python 2.7 中递归实现此目的? Input : ['and', ['or', 'P', '-R', 'P'], ['or', '-Q', '-R', 'P']]
我正在分析 hadoop 中的数据。有一些重复条目,其中 A、B 列重复,而 C 列不同。我想要做的是仅识别 A、B 重复项,然后为每个重复项打印出 C 列的不同值。 示例数据: row, data
您好,感谢阅读并可能对我有所帮助 我的问题的简要说明: 我正在将数据从一个 Firebird 数据库复制到另一个(称为 V14),并且我正在使用 IBExpert 来执行此操作。这些表的名称相同并且具
我想制作一张很像下面的图片: 我想使用 seaborn 使图表看起来漂亮,并让我自己以后更容易使用 facetgrids(我有十个不同的数据集,我想在同一个图表中显示。) 我在 seaborn 中找到
我在两列“user_id”和“project_id”上有一个复合唯一键。 当我尝试对单行或多行运行 DELETE 查询时,出现错误。 ERROR 1062: 1062: Duplicate entry
我是一名优秀的程序员,十分优秀!