问题陈述:-
我想在每个k个列表中搜索单个元素。
显然,我可以单独对每个数组进行二分搜索,这将得到O(k log n),其中k是排序数组的数目。
我们能在O(k+logn)中做吗,其中k是排序数组的个数?我想可能有更好的方法,因为我们现在做了k次同样的搜索-
private List<List<Integer>> dataInput;
public SearchItem(final List<List<Integer>> inputs) {
dataInput = new ArrayList<List<Integer>>();
for (List<Integer> input : inputs) {
dataInput.add(new ArrayList<Integer>(input));
}
}
public List<Integer> getItem(final Integer x) {
List<Integer> outputs = new ArrayList<Integer>();
for (List<Integer> data : dataInput) {
int i = Collections.binarySearch(data, x); // binary searching the item
if (i < 0)
i = -(i + 1);
outputs.add(i == data.size() ? null : data.get(i));
}
return outputs;
}
public static void main(String[] args) {
List<List<Integer>> lists = new ArrayList<List<Integer>>();
List<Integer> list1 = new ArrayList<Integer>(Arrays.asList(3, 4, 6));
List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(1, 2, 3));
List<Integer> list3 = new ArrayList<Integer>(Arrays.asList(2, 3, 6));
List<Integer> list4 = new ArrayList<Integer>(Arrays.asList(1, 2, 3));
List<Integer> list5 = new ArrayList<Integer>(Arrays.asList(4, 8, 13));
lists.add(list1);
lists.add(list2);
lists.add(list3);
lists.add(list4);
lists.add(list5);
SearchItem search = new SearchItem(lists);
System.out.println(dataInput);
List<Integer> dataOuput = search.getItem(5);
System.out.println(dataOuput);
}
这有可能实现吗?谁能提供一个例子,这是如何工作的基础上我的例子?
这种技术叫做分数级联,听起来很酷。您所做的是:
由此产生的交错将如下所示:
每个列表元素都有几个指针,用于快速查找某种类型的前/后继者,并查找列表中的位置i-1
。
list元素的总数只增加了一个常数,但很酷的一点是,您现在可以快速执行查询:
O(log n)
。您现在找到了原始列表k中的元素,因为您可以在O(1)中找到原始列表k中的周围元素。O(1)
中找到元素在列表k-1中的位置,因为您有指向列表k-1中后继/前置的指针。因此您可以在O(1)
each运行时总数:O(日志n+k)
要了解更多信息,你绝对应该阅读博文,它有很多可视化的插图和附加的解释。
我需要比较两个列表,以便创建在一个列表中找到的特定元素的新列表,而不是在另一个列表中。例如: 我想在列表_1中循环,并将列表_2中未在列表_1中找到的所有元素附加到主列表。 结果应该是: 用python怎么做?
我想知道的哪些元素在中。我需要输出一个有序的布尔值列表。但是我想避免循环,因为两个列表都有超过200万个元素。 这就是我所拥有的,它是有效的,但它太慢了: 我可以拆分列表并使用多线程,但如果可能的话,我更喜欢一个更简单的解决方案。我知道一些函数,比如sum()使用向量运算。我在找类似的东西。 如何让我的代码更高效?
很少的要求。 在发布你的答案之前,请!! 确保函数不会对其他数据产生错误,模拟几个类似的矩阵。(关掉种子) 确保你的功能比我的快 确保你的函数和我的完全一样,在不同的矩阵上模拟它(关闭种子) 举个例子 目前我已收到多达5个答案,但没有一个适合上述任何一点: ======================================================函数在逻辑矩阵的第一列中查找,如果
我有一个非常大(约10万)的字典列表: 给定一个ID(例如),我如何以有效的方式找到相应的?我必须为每个列表多次这样做(我有几个这样的大列表,每个列表我有几个令牌ID)。 我目前正在遍历列表中的每个词典,检查是否与我的输入ID匹配,如果匹配,我将获得
这不是经典的“合并两个排序”列表问题,这在线性时间内是相当微不足道的。 我想做的是合并两个对的列表,它们已经按排序,其中两个列表中都有具有相同的对象:这些对象应该合并(添加)它们的
问题内容: 如果我有这个: 然后在a中找到b: 有没有办法对列表做类似的事情?像这样: False的结果是可以理解的-因为它正确地寻找了一个元素’de’,而不是(我恰好想要它做的)’d’之后是’e’ 这是可行的,我知道: 我可以处理数据以获得所需的内容-但是有没有一种简短的Pythonic方式可以做到这一点? 需要说明的是:我需要在此处保留顺序(b = [‘e’,’d’],应返回False)。 如