首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在M/PowerQuery中,有没有比递归更快、更有效的方法来从列表中查找最接近的匹配值?

在M/PowerQuery中,除了递归,还有其他方法可以更快、更有效地从列表中查找最接近的匹配值。

一种方法是使用内置的函数来实现。在PowerQuery中,可以使用List.Sort函数对列表进行排序,然后使用List.FirstN函数获取排序后的列表中的前几个元素。接下来,可以使用List.Min函数找到最接近的匹配值。

另一种方法是使用二分查找算法。二分查找是一种高效的查找算法,适用于有序列表。首先,需要对列表进行排序。然后,可以使用二分查找算法来查找最接近的匹配值。

以下是使用这两种方法的示例代码:

方法一:使用内置函数

代码语言:txt
复制
let
    sourceList = {1, 5, 3, 9, 7, 2, 4, 6, 8},
    targetValue = 5,
    sortedList = List.Sort(sourceList),
    closestValues = List.FirstN(sortedList, 3),
    closestMatch = List.Min(closestValues, (x) => Number.Abs(x - targetValue))
in
    closestMatch

方法二:使用二分查找算法

代码语言:txt
复制
let
    sourceList = {1, 5, 3, 9, 7, 2, 4, 6, 8},
    targetValue = 5,
    sortedList = List.Sort(sourceList),
    binarySearch = (list as list, target as number) =>
        let
            low = 0,
            high = List.Count(list) - 1,
            closestMatch = null
        in
            while low <= high do
                let
                    mid = Number.RoundDown((low + high) / 2),
                    midValue = list{mid}
                in
                    if midValue = target then midValue
                    else if midValue < target then
                        let
                            nextLow = mid + 1,
                            nextHigh = high
                        in
                            if closestMatch = null or Number.Abs(midValue - target) < Number.Abs(closestMatch - target) then
                                closestMatch = midValue,
                                low = nextLow,
                                high = nextHigh
                            else
                                high = mid - 1
                    else
                        let
                            nextLow = low,
                            nextHigh = mid - 1
                        in
                            if closestMatch = null or Number.Abs(midValue - target) < Number.Abs(closestMatch - target) then
                                closestMatch = midValue,
                                low = nextLow,
                                high = nextHigh
                            else
                                low = mid + 1,
                                high = nextHigh
        in
            closestMatch,
    closestMatch = binarySearch(sortedList, targetValue)
in
    closestMatch

这些方法都可以在PowerQuery中使用,以更快、更有效地从列表中查找最接近的匹配值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

USING INDUCTION TO DESIGN 使用归纳法设计算法【全文翻译】

这篇文章在进行组合算法设计和教学过程中展示了一种基于数学归纳法的方法,尽管这种方法并不能涵盖设计算法时的所有可能方法,但它包含了大部分已知的技术方法。同时这种方法也提供了一个极好的并且也是直观的结构,从而在解释算法设计的时候显得更有深度。这种方法的核心是通过对数学定理证明过程中和设计组合算法过程中的两种智力过程进行类比。尽管我们承认这两种过程是为不同的目的服务的并且取得的是不同类型的结果,但是这两者要比看上去的更加相似。这种说法可以通过一系列的算法例子得到验证,在这些算法中都可以采用这种方法进行设计和解释。我们相信通过学习这种方法,学生能够对算法产生更多的热情,也能更深入更好的理解算法。

02
领券