乔山办公网我们一直在努力
您的位置:乔山办公网 > excel表格制作 > excel直方图-Power Query 循环控制解决直方图最大连续矩形面级问题

excel直方图-Power Query 循环控制解决直方图最大连续矩形面级问题

作者:乔山办公网日期:

返回目录:excel表格制作

问题:


要求计算直方图中最大连续矩形面级:


这也是一个算法问题,在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.Max
  • List.Min
  • List.Range
  • List.Count

分别来介绍一下这几个函数的用法:


List.Transform(list as list, transform as function) as list

函数有两个参数,第一个参数是一个列表,第二个参数是公式,返回一个列表


List.Transform({1, 2}, each _ + 1) equals { 2, 3 }


List.Max

用列表做参数,返回列表中的最大值


List.Max({1,2,3})equals 3


List.Min

用列表做参数,返回列表中的最小值


List.Min({1,2,3})equals 1


List.Range(list as list, offset as number, optional count as number) as list

共有三个参数,返回一个列表:


  • 第一参数:列表
  • 第二参数:截取位置
  • 第三参数:截取长度

List.Range({1..10}, 3, 5) equals {4, 5, 6, 7, 8}


List.Count(list as list) as number

列表作为参数,返回一个列表长度的数值


List.Count({1,2,3}) equals 3



接下来我们开始来解决这个问题,首先是循环控制,list作为参数设计这个函数,那么List.Count(list)就是列表的长度,两个循环的控制:


  • 1..List.Count(list)}
  • {0..List.Count(list)-1}

分别对应i,j的值的变化范围,写成Power Query代码就是这样的:


  • List.Transform({1..List.Count(list)},each 公式)
  • List.Transform({0..List.Count(list)-1},each 公式)

接下来就是公式要怎么写的问题了:


从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}截取出来的分别是:


  • {2,1} 最小值 1,长度2,乘积 2
  • {1,5} 最小值 1,长度2,乘积 2
  • {5,6} 最小值 5,长度2,乘积10
  • {6,2} 最小值 2,长度2,乘积 4
  • {2,3} 最小值 2,长度2,乘积 4
  • {3} 最小值 3,长度1,乘积 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学习资料:


本文标签:excel直方图(46)

相关阅读

关键词不能为空
极力推荐

ppt怎么做_excel表格制作_office365_word文档_365办公网