【发布时间】:2014-03-31 11:08:51
【问题描述】:
我正在尝试将多个排序列表合并到一个 TreeSet 中。然后我正在考虑在该 TreeSet 上应用二分搜索算法来检索 O(log n) 时间复杂度的元素。
下面是我的代码,其中我在其中一种方法中传递列表列表并将它们组合到TreeSet 以避免重复...inputs 中的所有列表都已排序 -
private TreeSet<Integer> tree = new TreeSet<Integer>();
public void mergeMultipleLists(final List<List<Integer>> inputs) {
tree = new TreeSet<Integer>();
for (List<Integer> input : inputs) {
for(Integer ii : input) {
tree.add(ii);
}
}
}
public List<Integer> getItem(final Integer x) {
// extract elements from TreeSet in O(log n)
}
- 首先,这是将多个排序列表合并到 TreeSet 中的正确方法吗?有没有直接的方法可以有效地合并 TreeSet 中的多个排序列表?
- 其次,如何以 O(log n) 的时间复杂度从 TreeSet 中提取元素?我想在那个
TreeSet中找到一个元素x,如果存在则返回它,如果不存在则从TreeSet返回下一个最大值。
或者与我目前使用的数据结构相比,我是否更适合使用另一种数据结构?
更新代码:-
私有 TreeSet 树 = new TreeSet();
public SearchItem(final List<List<Integer>> inputs) {
tree = new TreeSet<Integer>();
for (List<Integer> input : inputs) {
tree.addAll(input);
}
}
public Integer getItem(final Integer x) {
if(tree.contains(x)) {
return x;
} else {
// now how do I extract next largest
// element from it if x is not present
}
}
【问题讨论】:
-
您可以使用
TreeSet.addAll()而不是单独添加每个元素。它会节省一些 LOC,但我不知道它是否更有性能。 -
@MikeB:感谢
addAll的提示。我完全忘记了。现在关于我的第二个问题。有什么想法吗? -
看起来这里的讨论是相关的:stackoverflow.com/questions/3390449/…
-
“提取元素”是什么意思?你想得到
xth 最大的元素吗?您要测试x是否在TreeSet中吗?你想得到等于x的元素吗(在这种情况下......你只需要返回x?) -
我想在那个
TreeSet中找到一个元素x,如果存在则返回它,如果不存在则返回TreeSet中的下一个最大值。