如何在LibreOffice Calc中实现二分查找?
如何在LibreOffice Calc中实现二分查找?
我太懂你的痛点了——当数据量上千行的时候,普通的查找函数要挨个遍历到目标行,效率实在太低,想靠二分查找把迭代次数从几百次压到十几次对吧?其实不用自己费劲搭二叉树,Calc本身就有现成的方案,也可以手动实现真正的二分查找逻辑,下面给你唠唠:
一、直接用Calc自带的优化函数(最省心)
你可能不知道,LibreOffice Calc里的VLOOKUP和MATCH函数,只要你的查找区域是升序排序的,它们内部默认就会用二分查找来提速!完全不用自己写复杂逻辑:
- 用
VLOOKUP找对应widget名称:
在单元格里输入=VLOOKUP(992, A1:B1600, 2, TRUE)
这里最后一个参数TRUE是关键,它告诉函数“数据是升序排列的”,此时函数就会用二分查找,而不是逐行遍历。 - 用
INDEX+MATCH组合(灵活性更高):
输入=INDEX(B1:B1600, MATCH(992, A1:A1600, 1))MATCH的第三个参数1同样表示数据升序,内部会用二分查找定位目标行,再通过INDEX取出对应列的内容。
二、关于你尝试的二叉树方案
你说的没错,Calc的单元格是独立计算的——哪怕某些单元格不在当前的查找路径上,它也会把所有单元格的公式都算一遍,所以手动搭的二叉树其实没法实现“只走搜索路径”的优化,反而会因为额外的单元格计算拖慢速度,算不上真正的二分查找。
三、手动实现二分查找逻辑(适合学习或特殊需求)
如果你就是想自己实现二分查找的逻辑,比如用来学习,可以用LibreOffice的Basic宏写一个自定义函数:
- 打开宏编辑器:点击顶部菜单栏
Tools > Macros > Organize Macros > LibreOffice Basic - 新建一个模块,粘贴下面的代码:
Function BinarySearch(searchVal As Double, rng As Range, returnCol As Integer) As String Dim low As Integer, high As Integer, mid As Integer low = 1 high = rng.Rows.Count While low <= high mid = Int((low + high) / 2) If rng.Cells(mid, 1).Value = searchVal Then BinarySearch = rng.Cells(mid, returnCol).Value Exit Function ElseIf rng.Cells(mid, 1).Value < searchVal Then low = mid + 1 Else high = mid - 1 End If Wend BinarySearch = "Not Found" End Function
- 回到Calc表格,直接在单元格里调用这个函数:
=BinarySearch(992, A1:B1600, 2)
这个函数会严格按照二分查找的逻辑执行,只会遍历必要的中间节点,不会计算多余内容,而且要求A列是升序排序的哦。
备注:内容来源于stack exchange,提问作者Mychal Simonian
相关产品推荐
相关产品推荐

