【问题标题】:Finding A,B and A intersection B of 2 sets in linear time without a hashtable在没有哈希表的情况下在线性时间内找到 2 个集合的 A、B 和 A 交集 B
【发布时间】:2016-10-13 20:16:49
【问题描述】:

给定两个集合 A 和 B,我如何才能找到仅存在于 A 中、同时存在于 A 和 B 中以及仅存在于 B 中的元素,在线性时间内,并且不使用哈希表。

有人告诉我做如下事情, 对于集合 B 中的每个元素,尝试将其添加到集合 A。如果可以添加,则表示该元素不存在于集合 A,因此,将其添加到集合 B 独有的 元素列表。但是,如果您无法添加它,则意味着集合 A 中已经存在这样的元素,因此,将其添加到集合 A 和集合 B 共有的 元素列表中.

但是,使用这种方法,我如何才能找到仅存在于集合 A 中的元素

PS:我在一次采访中被问到这个问题,我给了他多种解决方案,如下所示。但是,面试官想要上面的解决方案。

  1. 使用 O(n^2) 循环对
  2. 在 O(n) 中使用哈希表
  3. 对 O(n.logn) 中的集合进行排序并比较两个集合中的元素,并根据值递增。

【问题讨论】:

  • "尝试将其添加到集合 A" 是 O(n),除非该集合是哈希表或其他具有高效查找的结构;因此尝试将 B 的所有元素添加到 A 是 O(n2)。
  • @MarkoTopolnik:是的,必须使用散列或等效方法来实现集合,以便添加元素 O(1)。我想没关系,只是不允许使用额外的 hashmap。
  • 如果集合是哈希表,您只需使用contains 而不要尝试实际添加元素。那么就很简单了。
  • @MarkoTopolnik,如标题所述,我正在寻找没有哈希表的解决方案。
  • 不,作业说“给定两组……”。如果不是某种特定的数据结构,就不能“给定一个集合”。那么,它是什么?数组?一个链表?哈希表?

标签: java algorithm sorting set hashtable


【解决方案1】:

只需在 A 和 B 互换的情况下再次运行相同的程序。这仍然是 O(n)。

【讨论】:

  • 我不太明白。但是第一次这样做时,A 的内容已经改变了。所以,它会影响你第二次交换时做的事情
  • @saltandwater:你真的不需要修改集合来执行算法。或者,您可以创建集合的副本。
  • 有没有办法只检查是否可以将元素添加到集合中,而不实际添加它。我正在考虑检查 setA.add(element from setB) 的返回值,在这种情况下,元素将被添加到 setA。正如您所提到的,我如何在不实际将元素添加到 setA 并修改集合的情况下实现这一点?
  • @saltandwater:当然,正如 Marko Topolnik 已经在其中一个 cmets 中提到的那样,HashSet 具有 contains 方法,准确地说,它正好相反,
【解决方案2】:

好吧,这有点作弊,因为如果 Set 是哈希表,那么您可以使用哈希表...
例如
1.创建一个集合T
2.将A中的所有元素添加到T中,
3.将B中的所有元素添加到T,(你知道哪些常见哪些不常见)
4.清除T
5.将B中的所有元素添加到T中,
6.将A中的所有元素添加到T...

【讨论】:

    【解决方案3】:

    你的第一个猜测实际上非常接近。

    要查找集合bar 中所有不在foo 中的元素,您需要检查是否包含其中任何元素。

    for(int i : bar) {
        if (!foo.contains(i)) {
            barLessFoo.add(i);
        }
    }
    

    要查找foo 中所有不在bar 中的元素,您需要逆向操作。

    for(int i : foo) {
        if(!bar.contains(i)) {
            fooLessBar.add(i);
        }
    }
    

    这不需要循环对;你只迭代每个集合一次。

    这仍然是 O(n),尽管可以进行论证,但取决于支持 foobar 的数据结构,它可以是 O(n2),因为只有Sets 保证在 contains 上的查找时间为 O(1)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      相关资源
      最近更新 更多