【发布时间】:2021-10-30 01:26:21
【问题描述】:
假设我有两个数组。一组整数的一个数组 A - 全部不同。整数列表的另一个数组 B,都出现在数组 A 中,但不一定不同。例如:
A 可以是 Array(123, 456, 789) B 可以是 Array(123, 123, 456, 123, 789, 456)
我想创建一个数组 C,它告诉我们每个元素(来自数组 A)出现在数组 B 中的频率。在这种情况下,C 将是 Array(3,2,1),因为 123 出现了 3 次, 456出现2次,789出现1次。
在 Scala 中执行此操作的有效方法是什么?
我的尝试是
val C: Array[Int] = Array.fill(3)(0)
var idx = 0
for(i <- A){for(j <- B){if(j == i){C(idx) += 1}}
idx += 1}
for(i <- C){println(i)}
但我知道这可能效率低下,并且如果我要处理更大的数组 A 和数组 B 会花费很长时间。但我仅限于 for 循环和 if 语句,因为我只是 Scala 的初学者.有没有更有效的方法来做到这一点?
【问题讨论】:
-
为什么你认为这是低效的?问题在于定义O(n),您的解决方案实际上是最有效的方法(好吧,您可以将
foreach替换为while) - 但是,您的解决方案不是惯用的,有更多装饰性的方法来解决问题,尽管它们不会那么有效。 -
其实解决方案有
O(A.length * B.length)复杂度 -
This 将是解决问题的惯用方式,没有可变性,不使用普通的
Arrays,而是使用像List或ÀrraySeq这样的真实集合,并尝试声明性.此外,我不会返回另一个包含计数的ArraySeq,但我只会返回Map[A, Int]本身。 -- 再想一想,我相信这个解决方案比你的更快,因为它避免了嵌套循环。