加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中Set union的性能问题

发布时间:2020-12-16 10:03:31 所属栏目:安全 来源:网络整理
导读:我刚刚在 Scala Set API中遇到了一个奇怪的行为.这是我的功能剥离了与项目其余部分相关的内容 def grade(...): Double = { val setA: HashSet = // get from somewhere else val setB: HashSet = // get from somewhere else if ((setA size) == 0 || (setB
我刚刚在 Scala Set API中遇到了一个奇怪的行为.这是我的功能剥离了与项目其余部分相关的内容

def grade(...): Double = {
  val setA: HashSet = // get from somewhere else
  val setB: HashSet = // get from somewhere else
  if ((setA size) == 0 || (setB size) == 0) return 0
  else return (setA & setB size) / (setA | set B size)
}

这个函数在循环内调用了很多时间,整个循环在4.5秒左右执行.但是当用大小的总和(粗略近似)替换并集的大小时,为了测试并集操作的影响,执行的时间减少到大约0.35秒……

def grade(...): Double = {
  val setA: HashSet = // get from somewhere else
  val setB: HashSet = // get from somewhere else
  if ((setA size) == 0 || (setB size) == 0) return 0
  else return (setA & setB size) / (setA size + set B size)
}

解决方法

好吧,你无法比较一个简单的操作,如2 Ints的总和与2集的并集操作.我希望这些操作的性能非常不同,特别是如果你的集合包含很多元素.

你不需要工会,因为你已经做了一个交集.请尝试以下方法:

def grade: Double = {
  val setA: HashSet = // get from somewhere else
  val setB: HashSet = // get from somewhere else
  if ((setA size) == 0 || (setB size) == 0) return 0
  else {
     val inter = setA & setB size
     return inter / ((setA size) + (setB size) - inter)
  }
}

但是,我发现你的测量有点奇怪,因为我预计两个操作(并集和交叉)需要大约相同的时间O(n).删除联合应该可以将性能提高一半(2s)……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读