如果m个出价可以共享n个项目的子集,我想找到在出价之间存储冲突的最佳方式,并检查两个出价是否相互冲突(即,它们共享至少一个项目)。到目前为止,我已经尝试了一个尺寸为m x m的矩阵,这不是最优的。我的问题可能有数以千计的出价,因此当我使用方矩阵实现时,我经常会收到错误“Java内存空间不足”。然后,我尝试使用三角矩阵(因为原始冲突矩阵是对称的)但没有摆脱内存问题!
有更好的主意吗?
最好的代码方式?
感谢。
答案 0 :(得分:0)
一种解决方案是使用番石榴Table
并将其与包含所有出价的List<Bid>
结合使用。注意:下面的代码使用了很多番石榴的好处:
final List<Bid> allBids = Lists.newArrayList();
final Table<Bid, Bid, Void> conflicts = HashBasedTable.create();
当您存储新的出价时,您会这样做(这假设bid
有.items()
方法返回Set<Item>
):
for (final Bid bid: allBids)
if (!Sets.intersection(newBid.items(), bid.items()).isEmpty())
conflicts.put(newBid, bid, null);
allBids.add(newBid);
然后,当您想要检测两个出价之间的冲突时:
return table.contains(bid1, bid2) || table.contains(bid2, bid1);
您甚至可以通过将Void
值替换为Set<Item>
来存储有冲突的项目,并将Sets.intersection()
的结果放入其中:
// Table becomes Table<Bid, Bid, Set<Item>>
Sets.SetView<Item> set;
for (final Bid bid: allBids) {
set = Sets.intersection(newBid.items(), bid.items())
if (!set.isEmpty())
conflicts.put(newBid, bid, set.immutableCopy());
}
allBids.add(newBid);