【问题标题】:Find whether an array is subset of another array hashtable way(Python)查找一个数组是否是另一个数组哈希表的子集(Python)
【发布时间】:2018-03-06 19:14:42
【问题描述】:

我想查找一个数组是否是另一个数组的子集,我能想到的方法之一是使用 Hashtable,但我想在 python 中实现它。附在线程中的是 c++ 实现。我不是在这里寻找内置函数,如 set 等。

Python 仅在哈希表方面有字典的概念,但不知道如何从这里开始。任何建议都会帮助我解决它。

以下是几个列表:

arr1[] = [11, 1, 13, 21, 3, 7]

arr2[] = [11, 3, 7, 1]

方法(c++ 使用散列)

1) 为 arr1[] 的所有元素创建一个哈希表。

2) 遍历 arr2[] 并在 Hash Table 中搜索 arr2[] 的每个元素。如果没有找到元素,则返回 0。

3) 如果找到所有元素,则返回 1。

列表也可以是数百万个数字,因此需要一个可扩展且高效的解决方案。

【问题讨论】:

  • 什么,你在找set(arr1).issuperset(arr2)
  • 不,我不是在寻找内置函数
  • Python 中的集合被实现为哈希表。
  • @codaholic 为什么不会你要寻找内置函数?
  • 没有这样的原因,但编写自己的代码让你感觉很好@juanpa.arrivillaga

标签: python arrays


【解决方案1】:

在 Python 中,您可以为此使用 set 对象:

>>> arr1 =  [11, 1, 13, 21, 3, 7]
>>> arr2 = [11, 3, 7, 1]
>>> set(arr1).issuperset(arr2)
True

或者更有效地,使用:

>>> set(arr2).issubset(arr1)
True

如果您希望 arr2 小得多...

一些快速的时间,似乎它们在 rumtime 中大致相同,但是,从 arr1 创建一个 set 将需要更多的辅助内存:

>>> import numpy as np
>>> arr1 = np.random.randint(0, 100, (1000000,)).tolist()
>>> len(arr1)
1000000
>>> from timeit import timeit
>>> arr2 = [11, 3, 7, 1]
>>> timeit('set(arr1).issuperset(arr2)', 'from __main__ import arr1, arr2', number=1000)
14.337173405918293
>>> timeit('set(arr2).issubset(arr1)', 'from __main__ import arr1, arr2', number=1000)
14.459818648989312

【讨论】:

    【解决方案2】:

    我想你想要set 例如 set(arr2).issubset(arr1)

    【讨论】:

      【解决方案3】:

      试试这个:

      i = 0
      allIn = True
      while i <= len(arr2) and allIn:
          if arr2[i] not in arr1:
              allIn = False
          i += 1
      

      allIn 会说第二个列表是否在第一个。

      注意:使用set() 的另一个解决方案同样有效。

      编辑(响应 cmets):

      我没有使用for 循环,因为我不知道如何停止循环运行一次allInFalse(我不知道使用break 是否会起作用,所以我'我保持安全)。

      我没有使用set(),因为 OP 明确表示他们不想使用内置函数。我已经发布了我的答案,作为已经提供的那些答案的替代解决方案(但也赞扬了那些,因为我认为它们更好)。

      【讨论】:

      • 我不会投反对票,但这个解决方案有一些问题。首先,OP 显然关心效率,并且正在寻找基于哈希表的解决方案。您当前的解决方案实际上是 O(N * M) 因为您在列表之间使用了非常低效的 in 操作。基于哈希的解决方案将是 O(N)。最后,当您可以在 python 中使用 while 循环时,您应该始终使用 for 循环。
      • 我不认为这会给我一个有效的解决方案,就像哈希表在 O(1) 时间内解决的情况一样
      猜你喜欢
      • 2010-09-24
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 2016-12-13
      相关资源
      最近更新 更多