Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 排序桶列表中求浮点数的最优搜索方法_Algorithm_Sorting_Search_Floating Point_Range - Fatal编程技术网

Algorithm 排序桶列表中求浮点数的最优搜索方法

Algorithm 排序桶列表中求浮点数的最优搜索方法,algorithm,sorting,search,floating-point,range,Algorithm,Sorting,Search,Floating Point,Range,我试图解决的问题是找到给定浮点数的桶数 假设有十个桶。 在bucket 0中,我将数字放在[0到1.2]的范围内 铲斗1[1.2至2.4] 铲斗2[2.4至3.6] 等等,直到 桶9[10.8至12.0] 桶被分类并具有相同的“宽度”(本例中为1.2) 使用线性搜索,计算复杂度将O(n) 使用树搜索,计算复杂度将O(logn) 是否有一种方法允许计算复杂度O(1)? 感觉应该有一些散列或数学“把戏”来提高搜索效率,但我找不到/想不出一个 从您的示例来看,这些桶的大小似乎都相同 如果是这种

我试图解决的问题是找到给定浮点数的桶数

假设有十个桶。
在bucket 0中,我将数字放在[0到1.2]的范围内

  • 铲斗1[1.2至2.4]
  • 铲斗2[2.4至3.6] 等等,直到
  • 桶9[10.8至12.0]
桶被分类并具有相同的“宽度”(本例中为1.2)

  • 使用线性搜索,计算复杂度将O(n)
  • 使用树搜索,计算复杂度将O(logn)
是否有一种方法允许计算复杂度O(1)? 感觉应该有一些散列或数学“把戏”来提高搜索效率,但我找不到/想不出一个


从您的示例来看,这些桶的大小似乎都相同

如果是这种情况,对于大小为
S
的桶,某些浮动
f
的相关桶为:

#bucket = floor(f/S)
这基本上是“规范化”将
S
指定为1,并忽略提醒


(注意,这假设间隔是单面打开的,即在您的示例中,
1.2
在bucket1中,而不是bucket0中。如果此假设不成立,则可以轻松检查和处理。)

第一步:将值除以宽度:

double width = 1.2;
assert(x >= 0 && x < 12.0);

double q = x/width;
int expected_bucket = (int) q;   
。。。这注意
]

[0.0 to 1.2)
[1.2 to 2.4)
[2.4 to 3.6)

水桶的大小总是一样的吗?如果是这样,相关的桶是
地板(f/bucket\u size)
(我想)是的,那就行了!即使bucket 0不是从0.0开始,我也可以计算f到开始值的差值,并使用该公式来查找bucket,使搜索在O(1)中运行!谢谢你的帮助!
[0.0 to 1.2)
[1.2 to 2.4)
[2.4 to 3.6)