我有一个排序的双精度数组(实际上是纬度),相对均匀地分布在-10到-43的范围内。现在,如果我在该列表上进行二进制搜索,我得到O(log N)。
但是,我可以通过搜索进一步优化搜索表,其中我有34个键(-10到-43),然后可以直接跳到该数字的起始点。
例如:-23.123424首先查找键23并知道所有-23值的起始范围。然后我可以从中间进行二分搜索。
我的Big-O会是什么样子?
答案 0 :(得分:3)
它仍然是O(log n)。考虑:在整数查找表中查找起始索引需要花费一些时间,因此该部分不会添加任何内容。然后是O(log n)进行二分查找。实际上它需要大约log n / 34,因为你希望搜索一个平均小34倍的数组(这些值分布在34个不同的区间,边界从-43到-10),但是常数乘数不算大-O表示法。
答案 1 :(得分:1)
它仍然是O(log N)
,但对于缩小的数据集(想想N的较小值)。
由于查找表提供了ca.在二进制搜索中接近1/32或5步的1/34,您可能需要进行基准测试,如果这确实有帮助的话:具有大量缓存未命中的额外代码路径以及一个或另一个错误的分支预测/管道清除可能比直接二进制搜索慢。
此外,如果内存表的查找时间是瓶颈,您可能需要考虑将您的符号表示为Int32
值 - 确切地说足够精确,但搜索速度要快得多。
答案 2 :(得分:0)
听起来你的优化会有所帮助,但我认为它仍然被认为是O(log N),因为你仍然需要搜索确切的值。如果它直接将你带到了值O(1)
这是Big-Oh分析的限制。它不会考虑您减少了必须搜索的值的数量。
答案 3 :(得分:0)
你的概念接近interpolation search的概念,除了在键的整数部分只进行一次“插值”,它递归地使用插值来智能地驱动二进制搜索。由于您的域名相对统一,因此预期的运行时间为O(log log n)
。