• Rocket


    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. 附录
     
     
     
  • 相关阅读:
    梅小雨 20180912-3 词频统计
    梅小雨20190912-2 命令行
    梅小雨20190905-1 每周例行报告
    梅小雨20190905-2 博客作业
    梅小雨20190905-3 命令行和控制台编程
    20190919-4 单元测试 结对
    20190919-2 功能测试
    20190919-1 每周例行报告
    20190919-6 四则运算试题生成
    20190919-5 代码规范
  • 原文地址:https://www.cnblogs.com/wjcdx/p/10992217.html
Copyright © 2020-2023  润新知