Performance 在数字范围列表中搜索数字

Performance 在数字范围列表中搜索数字,performance,algorithm,search,range,Performance,Algorithm,Search,Range,假设有一个数字范围列表,例如, {0,9},{14,18},{19,30} 我想确定一个数字N是否在列表中。 如果N=15,答案将是肯定的,因为15在{14,18}范围内 如果N=11,答案将是否定的,因为11不在列表中的范围内 我的问题是: 有没有什么有效的方法来确定这样一个问题的答案 谢谢如果您对范围列表进行排序,然后加入重叠的范围,您可以使用二进制搜索解决问题,即O(log(N)),其中N是列表中的元素数 排序并加入范围后,可以将范围列表放入数组中,例如,{a,b},{c,d}将变为(a,

假设有一个数字范围列表,例如, {0,9},{14,18},{19,30}

我想确定一个数字N是否在列表中。 如果N=15,答案将是肯定的,因为15在{14,18}范围内 如果N=11,答案将是否定的,因为11不在列表中的范围内

我的问题是: 有没有什么有效的方法来确定这样一个问题的答案


谢谢

如果您对范围列表进行排序,然后加入重叠的范围,您可以使用二进制搜索解决问题,即O(log(N)),其中N是列表中的元素数

排序并加入范围后,可以将范围列表放入数组中,例如,{a,b},{c,d}将变为(a,b,c,d),在二进制搜索后,可以检查数字是否位于奇偶位置的元素之间,然后数字在范围内,否则它将被删除

二进制搜索是一个排序的数组,因此可以将数组分成两个相等的部分,并将键值与数组值进行比较,数组值将这些部分分开,然后选择上半部分或下半部分进行反复分割

如果您不使用二进制搜索,并且您的列表未排序,那么每次都必须查看所有元素,这是O(N),并且被认为是非常低效的


如果您需要更详细的解释,请留下注释。

如果您对范围列表进行排序,然后加入重叠的范围,您可以使用二进制搜索解决问题,即O(log(N)),其中N是列表中的元素数

排序并加入范围后,可以将范围列表放入数组中,例如,{a,b},{c,d}将变为(a,b,c,d),在二进制搜索后,可以检查数字是否位于奇偶位置的元素之间,然后数字在范围内,否则它将被删除

二进制搜索是一个排序的数组,因此可以将数组分成两个相等的部分,并将键值与数组值进行比较,数组值将这些部分分开,然后选择上半部分或下半部分进行反复分割

如果您不使用二进制搜索,并且您的列表未排序,那么每次都必须查看所有元素,这是O(N),并且被认为是非常低效的



如果需要更详细的解释,请留下注释。

如果范围列表动态更改,则是您要查找的数据结构。

如果范围列表动态更改,然后是您要查找的数据结构。

数字范围是否已排序?每个范围仅包含最小和最大的数字。例如,范围{2,5}实际上不包含2,3,4,5,而只包含2和5。不,我的问题是这种类型的范围是否可能:{14,18}{0,9}{19,30},即输入范围是未排序的。是的,这样的排序是可能的。数字范围是否已排序?每个范围只包含最小和最大的数字。例如,范围{2,5}实际上不包含2,3,4,5,而只包含2和5。不,我的问题是这种类型的范围是否可能:{14,18}{0,9}{19,30},即输入范围是未排序的。是的,这样的排序是可能的。实际上,范围彼此不重叠,这意味着它们彼此不相交。但我也在考虑在可能的情况下合并相邻的范围,以减少列表中范围的数量。当执行此任务的处理器将从其他处理器接收数字范围时,列表将动态更改,允许范围以任意顺序出现。我仍然不理解你提到的使用二进制搜索进行检查的部分。你能再解释一下吗?二进制搜索是O(log(N)),当然是O(sqrt(N))的子集,但是O(log(N))渐近类在这里更精确。如果没有对范围进行排序,那么我们将执行O(N log N)操作来对范围进行排序,其中N是范围的数量。这难道不会使这种方法比简单的方法更糟糕吗?简单的方法是检查每个范围,看看数字是否在范围内,即O(n)?@Kaushik:这取决于范围变化的频率,以及你必须根据这些范围检查数字的频率。例如,如果平均有5个变化和1个检查,朴素的方法是最好的。@Kaushik:如果有人问在字典中查找一个单词,通常会假设,(s)他想在或多或少固定的字典中搜索几个不同的单词,但不是在一百个不同的字典中搜索同一个单词。去享受生活吧,伙计,不要无谓的吹毛求疵。事实上,范围之间并不重叠,这意味着它们彼此不相交。但我也在考虑在可能的情况下合并相邻的范围,以减少列表中范围的数量。当执行此任务的处理器将从其他处理器接收数字范围时,列表将动态更改,允许范围以任意顺序出现。我仍然不理解你提到的使用二进制搜索进行检查的部分。你能再解释一下吗?二进制搜索是O(log(N)),当然是O(sqrt(N))的子集,但是O(log(N))渐近类在这里更精确。如果没有对范围进行排序,那么我们将执行O(N log N)操作来对范围进行排序,其中N是范围的数量。这难道不会使这种方法比简单的方法更糟糕吗?简单的方法是检查每个范围,看看数字是否在范围内,即O(n)?@Kaushik:这取决于范围变化的频率,以及你必须根据这些范围检查数字的频率。例如,如果平均有5个变化和1个检查,朴素的方法是最好的。@Kaushik:如果有人问在字典中查找一个单词,通常会假设,(s)他想在一个或多或少固定的字典中搜索几个不同的单词,但在一个字典中不搜索同一个单词