https://mp.weixin.qq.com/s/gbR5fuDbE_nUFVxw-p4rsA

 
简单介绍ReduceOthers的实现。
 
 
1. 基本介绍
 
输入一组Bool元素,把其他位置元素逐个相与的结果,作为当前位置的值输出。
 
2. helper
 
helper实现ReduceOthers的核心功能:
 
1) 输入参数
 
x是输入的一组Bool类型的元素。
 
2) 返回值
 
返回一个元组:(Seq[Bool], Bool)
a. Seq[Bool]:每个位置上返回其他位置上元素逐个相与的结果;
b. Bool:全部输入元素相与的结果;
 
3) x.size <= 1
 
 
可以分成两组情况:
a. x.size == 0:返回(true, true)
b. x.size == 1:返回(true, x(0))
 
4) x.size <= 3
 
因为元素个数有限,所以直接生成结果逻辑。
a. 返回元组的第二个元素为x里的所有元素相与的结果:x.reduce(_ && _)
b. x.take(i)取x中从0到i(不包含,exclusive)的元素:
 
 
c. x.drop(i + 1)取x中从i+1(包含,inclusive)开始的元素;
d. 这样x.take(i) ++ x.drop(i + 1)取x中除去i之外的全部元素;
e. 把这些元素逐个相与:(x.take(i) ++ x.drop(i + 1)).reduce(_ && _)
 
5) x.size > 3
 
如果x中元素过多,则需要提升效率。
 
a. x.grouped(2)把x中的元素每2个分成一个小组,若有多余的1个元素,则自成一组;
 
b. (i ^ 1) >= x.size表示自成一组的多余的1个元素
 
 
c. i/2表示当前元素所在的小组的编号;
d. half(i / 2)表示其他小组中所有元素相与的结果;
e. x(i ^ 1)表示当前小组中的另外一个元素;
f. x(i ^ 1) && half(i / 2)表示其他所有元素的相与结果;
 
3. def apply(x: Seq[Bool]): Seq[Bool]
 
使用helper实现ReduceOthers的功能,考虑输入带有常量的情况。
 
所谓常量就是输入是一个已知恒定的值(字面量,lieral),而不是可变的值(variable)。
a. 把输入分成常量和变量:val (literals, variables) = x.partition(_.isLit)
b. 找出值为假的常量:val falses = literals.count(_.litValue == 0)
c. 如果有两个及以上值为假的常量,则所有输出都为假:
 
这里有个Bug,应该是大于等于2:
 
d. 如果只有一个为假的常量
这个值为假的常量所在位置的输出由其他元素相与获得;
其他位置的输出为假;
 
e. 如果没有为假的常量
 
常量不加入相与运算,只需要求出所有变量ReduceOthers的输出。
 
常量元素对应位置的输出为所有变量相与的结果;
变量元素对应位置的输出从helper的输出中逐个取出;
 
4. def apply(x: Seq[(Bool, Bool)])
 
输入参数为:Seq[(Bool, Bool)]
其中:
a. 所有元组的第二个Bool集中在一起进行ReduceOthers运算。
b. 元组的第一个Bool,连接到第二个Bool对应位置ReduceOthers的运算结果;
 
5. 附录
 
 
 

最新文章

  1. Android开发学习之路-插件安装、检查应用是否安装解决方案
  2. 转发:Chrome 控制台console的用法
  3. 脑成像数据分析:Python工具包
  4. 《30天自制操作系统》笔记(02)——导入C语言
  5. MYSQL数据库的操作
  6. SQLServer2008R2 mdf文件还原数据库
  7. iOS 开发知识小集(1)
  8. 如何配置magento免运费商品方法
  9. 【转】C#综合揭秘——通过修改注册表建立Windows自定义协议
  10. Undefined symbols for architecture x86_64 解决之道
  11. Delphi 泛型对象类
  12. Java API —— Random类
  13. Java中的递归原理分析
  14. oracle 的服务器进程(PMON, SMON,CKPT,DBWn,LGWR,ARCn)
  15. Dubbo(五) Dubbo入门demo——helloworld
  16. [PHP] PHP服务器接口SAPI中的结构体
  17. SQL更新语句,Error Code: 1175. You are using safe update(在进行视图更新的时候遇到)
  18. Python系列:一、Python概述与环境安装--技术流ken
  19. kaggle竞赛入门整理
  20. Bash 脚本 去除注释

热门文章

  1. 斜率dp A - Print Article HDU - 3507
  2. spring mvc从后台往前台传参数的三种方式
  3. LeetCode 62,从动态规划想到更好的解法
  4. 老板:kill -9 的原理都不知道就敢去线上执行?明天不用来了!
  5. Vue3语法快速入门以及写一个倒计时组件
  6. [uva_la7146 Defeat the Enemy(2014 shanghai onsite)]贪心
  7. Apache Poi实现excel解析
  8. linux-Curl error (37): Couldn&#39;t read a file:// file for file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-x86_64 [Couldn&#39;t open file /e tc/pki/rpm-gpg/RPM-GPG-KEY-fedora-x86_64]
  9. Winform GDI+绘图二:绘制旋转太极图
  10. java web基础