我有2个名单 -
List<String> RecordIdByPriority
和List<String> RecordId
。顾名思义 - 第一个列表包含优先级插入顺序的记录 我们的想法是从第二个列表中找到最高优先级记录的存在。
如果优先级列表包含<A,D,E>
,第二个包含<B,E,M>
- 预期输出为&#39; E&#39;。
鉴于第二个列表可能很大 - 以最有效的方式实现此目的的数据结构/例程是什么
答案 0 :(得分:2)
您可以执行一些一次性预处理,将9092
转换为List<String> RecordIdByPriority
,将列表中的每个项目映射到列表中的位置。在您的示例中{A - &gt; 0,D - &gt; 1,E - > 2}。然后单次通过HashMap<String, Integer>
列表,根据哈希映射查找最小元素。地图中未找到的元素具有隐式优先级+ infinity。
这意味着您可以在O(n)中找到元素,其中n是记录ID列表的长度。
答案 1 :(得分:0)
我认为经典循环应该仍然有效。
public String getHighestPriorityRecord(List<String> recordIdByPriority, List<String> recordId) {
for (String record : recordIdByPriority) {
if (recordId.contains(record)) {
return record;
}
}
// Not found
return null;
}
O(1)
O(n log n)
?O(n^2)
如果您想加快速度,那么您可以recordId
成HashSet
(通过创建HashSet
的新实例),以便contains()
成为O(1)
O(n)
,有效地将此算法的最坏情况转变为{{1}}。