我在考虑排序然后进行二分搜索。这是最好的方法吗?如何从n个数组中找到公共元素
回答
我在这种情况下主张散列:您将有时间与两个数组的常见大小成比例。
由于大多数主要语言都在其标准库中提供散列表,我几乎不需要展示如何实现这样的解决方案。
定义“最佳”。
如果你想快速做到这一点,你可以通过遍历每个数组并保持每个唯一元素的计数来完成O(n)操作。如何计算独特元素的细节取决于数组中可能存在的事物的字母表,例如它是稀疏还是密集的?
注意,这是在阵列的数目为O(n),但O(纳米)为长度米)的阵列。
遍历每一个并使用散列表来存储计数。关键是整数值,值是出现次数。
这取决于。如果一个集合比另一个要小得多,或者由于某种其他原因,你期望交集非常稀疏,那么二分查找可能是合理的。否则,可能最容易一次完成两个步骤。如果一个中的当前元素小于另一个中的元素,则前进到该数组中的下一个项目。当/如果得到相同的元素,则将其作为输出发送,然后前进到两个数组中的下一个项目。 (这个假设,就像你所倡导的那样,当然你已经对这两者进行了排序)。
这是一个O(N + M)操作,其中N是一个数组的大小,M是另一个的大小。使用二进制搜索,您可以获得O(N lg M),如果一个数组比另一个数组小,可能会降低复杂性,但如果它们接近相同大小,则可能会造成净损失。
根据您需要/想要的版本,试图计算出现次数的版本可能会导致相当大的问题:如果在一个数组中出现多次单个项目,它们仍会将此次数计为两次项目,表明一个并不存在的交集。您可以防止这种情况,但这样做会使作业稍微不重要 - 您将一个数组中的项插入到散列表中,但始终将计数设置为1.完成后,通过将计数设置为2来处理第二个数组当且仅当该项目已经存在于该表格中时。
最好的方法是哈希所有的值并保持发生次数,剔除所有没有发生的事情i
次当您检查数组i
其中i = {1, 2, ..., n}
。不幸的是,没有确定性算法可以让你的运行时间小于O(n*m)
,因为如果不排除所有数组中的所有值,就不可能做到这一点。
一个更快的算法需要有一个可接受的概率水平(蒙特卡洛),或者依靠一些已知的列表条件来检查只有一部分元素(即你只关心所有发生在i-1
以前的列表在考虑i
列表时,但在未排序的列表中,搜索元素并不重要。
- 1. PHP - 如何从多维数组中找到公共元素?
- 2. 在两个整数数组中找到公共元素java
- 3. 如何在jQuery中找到仅在2个数组之间的公共元素
- 4. 查找数组之间的公共元素(匹配元素)
- 5. 找到一组n个数组中存在哪些公共元素的干净方法是什么?
- 6. 从数组中选择n个元素
- 7. 如何找到第n个p元素?
- 8. 我如何计算元素直到找到N个好元素?
- 9. 如何从n个元素中找到k-置换的索引?
- 10. 如何在列表中找到公共元素
- 11. 在N个排序数组中找到没有额外空间的公共元素
- 12. 查找二维数组中的公共元素
- 13. 如何在php中获取数组中的公共元素
- 14. 如何从多个向量中找到共同元素?
- 15. 输出公共数组元素
- 16. 如何从mongodb数组中删除前n个元素?
- 17. 如何从Perl数组中随机取n个元素?
- 18. 从元素数组中选择第n个元素jquery
- 19. 从android中的3个公共元素中删除元素
- 20. 从N元素的元组到N/2对的元组
- 21. 如何找到数组中第n个元素的索引以匹配条件?
- 22. 如何从Haskell的10元组中获得第n个元素?
- 23. 如何从numpy数组中找到连续元素的组?
- 24. 如何从两个列表中删除公共元素?
- 25. 从c中的给定整数数组中获取第k个公共元素
- 26. 找到第n个素数
- 27. 从2元组中提取公共元素python
- 28. 如何生成数组中所有n个元素的组合?
- 29. 如何迭代n个元素的重叠组中的数组?
- 30. 查找具有公共元素的元组