问题:
要求计算直方图中最大连续矩形面级:
这也是一个算法问题,在Power Query中需要用到循环控制,来解答这个问题。
我们设数组{2,1,5,6,2,3}的长度为len,
for i=1 to len
for j=0 to len-1
从j开始截取数组长度i,然后计算截取的数组的最小值与截取的数组的元素个数的乘积。
next j
next i
最后取上面循环后结果的最大值
Power Query 中的循环用List.Transform函数来实现,除了List.Transform函数我们还会用到以下几个函数:
分别来介绍一下这几个函数的用法:
函数有两个参数,第一个参数是一个列表,第二个参数是公式,返回一个列表
List.Transform({1, 2}, each _ + 1) equals { 2, 3 }
用列表做参数,返回列表中的最大值
List.Max({1,2,3})equals 3
用列表做参数,返回列表中的最小值
List.Min({1,2,3})equals 1
共有三个参数,返回一个列表:
List.Range({1..10}, 3, 5) equals {4, 5, 6, 7, 8}
列表作为参数,返回一个列表长度的数值
List.Count({1,2,3}) equals 3
接下来我们开始来解决这个问题,首先是循环控制,list作为参数设计这个函数,那么List.Count(list)就是列表的长度,两个循环的控制:
分别对应i,j的值的变化范围,写成Power Query代码就是这样的:
接下来就是公式要怎么写的问题了:
从j开始截取数组长度i,然后计算截取的数组的最小值与截取的数组的元素个数的乘积。
就是几个List函数的组合公式:
List.Min(List.Range(list,_,x))*List.Count(List.Range(list,_,x))
这里面的x是个参数,_是循环中的j
为了方便引用,我们定义了一个参数是x的函数:
let
fx = (x as number)=>List.Max(List.Transform({0..List.Count(list)-1},each List.Min(List.Range(list,_,x))*List.Count(List.Range(list,_,x))))
in
fx(_)
这个函数的含义就是我们要根据输入的截取个数x,来计算出截取的数组的最小值与截取的数组的元素个数的乘积的最大值,可能有点绕,举个例子:
如果x=2,那么列表{2,1,5,6,2,3}截取出来的分别是:
最大值是10
接下来就是要从1到6全部计算一遍,然后取最大值:
let
max = (list) => List.Max(List.Transform({1..List.Count(list)},each
let
fx = (x as number)=>List.Max(List.Transform({0..List.Count(list)-1},each List.Min(List.Range(list,_,x))*List.Count(List.Range(list,_,x))))
in
fx(_)))
in
max
引用FX计算结果是:
在这个结果中取最大值:10
我们用这个函数来做个测试:
通过这个例子,我们要学习的主要内容是Power Query的循环控制
更多Power Query学习资料:
页面更新:2024-05-27
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号