当前位置: 首页 > 知识库问答 >
问题:

高效地在多个排序列表中查找一个元素?

於彬
2023-03-14

问题陈述:-

我想在每个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);
}

这有可能实现吗?谁能提供一个例子,这是如何工作的基础上我的例子?

共有1个答案

柯波娃
2023-03-14

这种技术叫做分数级联,听起来很酷。您所做的是:

  1. 接受列表%1。取其中的每一个元素并将其合并到列表2中。现在“新的”列表2包含了它的所有元素和列表1中的一半元素。您记住哪些是来自列表1的,然后指针返回到列表1,然后从前面到后面穿过新创建的列表2,为每个元素添加一个指针,指向您看到的列表1中的最后一个元素和您看到的列表2中的最后一个元素。从后到前执行相同操作。
  2. 使用嵌入列表1元素一半的“新建”列表2,并将其与列表3等合并

由此产生的交错将如下所示:

每个列表元素都有几个指针,用于快速查找某种类型的前/后继者,并查找列表中的位置i-1

list元素的总数只增加了一个常数,但很酷的一点是,您现在可以快速执行查询:

  1. 在“新建”列表k中进行二分搜索以找到您的搜索元素。复杂性:O(log n)。您现在找到了原始列表k中的元素,因为您可以在O(1)中找到原始列表k中的周围元素。
  2. 您还可以在O(1)中找到元素在列表k-1中的位置,因为您有指向列表k-1中后继/前置的指针。因此您可以在O(1)each
  3. 中报告所有其他列表的结果

运行时总数: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)。 如