假设有一个数字范围列表,例如, {0,9},{14,18},{19,30}。
我想确定数字N是否在列表中。 如果N = 15,答案将为是,因为15在{14,18}的范围内 如果N = 11,则答案为否,因为11不在列表中的那些范围内。
我的问题是: 有没有有效的方法来确定这个问题的答案?
由于
答案 0 :(得分:3)
如果您对范围列表进行排序,然后加入重叠范围,您可以使用二进制搜索来解决您的问题,即O(log(N)),其中N是列表中元素的数量。
排序并加入范围后,您可以将范围列表放在一个数组中,例如,{a,b},{c,d}将变为(a,b,c,d),然后二进制搜索你可以检查你的数字是否在具有偶数和奇数位置的元素之间,然后你的数字在这个范围内,否则它就会出来。
二进制搜索是你有一个排序数组的地方,所以你可以将数组分成两个相等的部分,并将你的键值与数组值进行比较,将数据值分开,然后选择上半部分或下部分一次又一次地划分
如果您不使用二进制搜索,并且您的列表未排序,则必须每次查看所有元素,其中O(N)被认为是非常低效的。
如果您需要更详细的解释,请发表评论。
答案 1 :(得分:2)
如果范围列表动态更改,则interval tree是您要查找的数据结构。