algorithm - 如何实现飞镖二进制搜索算法?
问题描述
如何在 dart 主函数中使用这种二进制搜索算法?
int binarySearch<T>(List<T> sortedList, T value,{int Function(T, T)? compare}) {
compare ??= defaultCompare(); // I do not understand this line code
var min = 0;
var max = sortedList.length;
while (min < max) {
var mid = min + ((max - min) >> 1);
var element = sortedList[mid];
var comp = compare(element, value); // I do not understand this line code
if (comp == 0) return mid;
if (comp < 0) {
min = mid + 1;
} else {
max = mid;
}
}
return -1;
}
为什么要使用这行代码?
{int Function(T, T)? compare}
compare ??= defaultCompare();
var comp = compare(element, value);
解决方案
??=
是一个 null 感知赋值运算符。https://dart.dev/guides/language/language-tour#assignment-operators
代码应该读取compare ??= defaultCompare;
这意味着,如果变量compare
是null
,“撕下”函数defaultCompare
并将其分配给变量compare
。
在 dart 中,函数是一个对象,可以存储在一个变量中。https://dart.dev/guides/language/language-tour#functions-as-first-class-objects
var comp = compare(element, value);
正在调用变量中保存的函数compare
并将结果分配给新变量comp
。
推荐阅读
- matlab - 有没有办法在 3D 数组中的元素上优化/矢量化这些循环,而不需要更多的内存?
- java - 如何在没有maven的情况下获取svn修订信息
- postgresql - 我想使用 postgresql 从我们的 postgresql 数据库中的数据库列中提取查询参数,但没有成功
- reactjs - 仅当 axios 响应与先前响应不同时如何设置状态值
- java - 尝试在 Java 类中计算 CKJM 时出错
- pointers - 我正在尝试从链接列表中删除一个节点,但存在一些运行时错误
- opengl - OpenGL 字体渲染和纹理打包:如果空间不足怎么办?
- vuejs3 - Vue 3 onMounted in prod 不更新反应数据(在开发中工作)
- r - 如何编写一个循环,通过其中一列中的唯一值对数据集进行切片并遍历脚本?
- sql - 基于表 A 值循环遍历表 B 行