在二进制搜索期间如何处理空值? - c#

在通过null进行二进制搜索期间处理List<string>的最佳方法是什么(如果我可以事先读取所有值,那将是List<string>)?

int previous = 0;
int direction = -1;
if (itemToCompare == null) {
    previous = mid;

    for (int tries = 0; tries < 2; tries++) {
        mid += direction;
        itemToCompare = GetItem(mid);
        while (itemToCompare == null && insideInclusiveRange(min, max, mid)) {
            mid += direction;
            itemToCompare = GetItem(mid);
        }
        if (!insideInclusiveRange(min, max, mid)) {
            /* Reached an endpoint without finding anything,
                try the other direction. */
            mid = previous;
            direction = -direction;
        } else if (itemToCompare != null) {
            break;
        }
    }
}

我目前正在执行类似上述的操作-如果遇到null,则在一个方向上线性搜索,直到遇到非null或超出端点为止,如果没有成功,则在另一个方向上重复。在实际的代码中,我从先前的比较结果中获取了direction,并且GetItem()缓存了它获取的值。有没有一种更简单的方法,而无需列出非空值的中间列表(因为上面的GetItem()函数很慢,所以花了我很长时间)?

我想我想问的是,有没有比降级为线性搜索更智能的方法来处理空值。极有可能只有一小部分的空值(1-5%),但是有可能存在100个空值序列。

编辑-数据看起来像这样

aa aaa
b bb bbb
抄送
d ddd

其中的每一行都是一个单独的对象,并非所有单元格都可以保证被填充。用户需要能够搜索整个行(以便“ bb”和“ bbb”都将与整个第二行匹配)。查询每个对象的速度非常慢,以至于线性搜索将无法进行。出于同样的原因,创建没有空值的新列表实际上是不可行的。

参考方案

除非有实际选择/查找null值的理由(不确定null是单例并且通常对唯一值使用二进制搜索是最理想的),否则请考虑完全不允许它们在列表中。

[先前的答案:在进一步思考问题后,我决定null在问题空间中可能没有位置-适当地使用点点滴滴。]

如果需要使用null,则只需对列表进行排序,以使null值位于第一个(或最后一个)并正确更新逻辑-然后确保不要在任何null值上调用方法;​​-)

因为已经需要某种排序,所以这对整体影响不大。如果将项目更改为null-听起来像是个讨厌的副作用! -然后仅“压缩”列表(例如“删除”空项目)。但是,除非有充分的理由,否则我不会修改排序列表。

二进制搜索仅是真正设计/适用于(全部)排序的数据。没有意义将其转换为二进制或线性搜索。

快乐的编码。

LeetCode题解96.unique-binary-search-trees

题目地址(96. 不同的二叉搜索树) https://leetcode-cn.com/problems/unique-binary-search-trees-ii/description/ 题目描述 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二…

LeetCode题解95.unique-binary-search-trees-ii

题目地址(95. 不同的二叉搜索树 II) https://leetcode-cn.com/problems/unique-binary-search-trees-ii/description/ 题目描述 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。 示例: 输入: 3 输出: [   [1,null,3,2],   [3,2,n…

在二进制搜索中,计算机如何选择中点以及何时仅剩两个元素 - python

我已经阅读了一些关于此问题的stackoverflow问题和其他博客。他们中的大多数人解释使用以下方法来选择中点:1. low + (high - low)/2 2. (low + high)/2, round down to integer. 来自Deciding mid in binary search和https://www.khanacademy.o…

LeetCode题解212.word-search-ii

题目地址(212. 单词搜索 II) https://leetcode-cn.com/problems/word-search-ii/description/ 题目描述 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平…

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制