【发布时间】:2014-03-30 21:30:37
【问题描述】:
给定一个数组:
$foo = Array(
99=>'Lowest Numbers',
123=>'Low Numbers',
456=>'High Numbers',
777=>'Highest Numbers',
);
...和值'144',我想返回最近的低值和最近的高值,而不必循环遍历数组中的每个元素,因为实际数组非常大。
'144' 的预期结果是 123=>'Low Numbers'
我目前有以下代码:
function name($color,$fuzzy=false) {
global $resene;
$long = 0;
if(is_array($color)) {
$long = Color::hex2lng(Color::rgb2hex($color));
} else {
$long = Color::hex2lng($color);
}
if(isset($resene[$long])) {
echo $resene[$long];
} else {
if($fuzzy) {
$resene[$long] = '';
ksort($resene);
// This is where I am having problems
// The array is sorted, so it should be a simple
// matter of getting the previous and next value
// somehow since we know the position we want to
// start at exists because it has been added.
echo 'No color name found';
}
}
}
基本上,这个概念非常简单,因为我们将未找到的值注入到数组中,我们知道它存在。按键排序,现在确保两个最接近的键是与正在搜索的数字最接近的匹配项。
上述函数实际上是一个基于Hex或RGB颜色的搜索,转换为base 10(long值)。
数组中的键是非增量的,这意味着它不是 0,1,2,3,即使我“翻转”了数组,键也会是字符串,同样,没有增量可获取最接近的。
我正在考虑拆分或其他什么,但是这似乎是根据元素的数量来拆分数组——而不是基于键。
这实际上是完成这项工作的最后一步——无需遍历每个元素。
任何帮助将不胜感激。
这是我编写的静态函数的 Pastbin,它使用颜色的 Long 值作为键返回颜色的 Array(),值是颜色的字符串名称。
【问题讨论】:
-
如果不使用某种循环,我不确定这是否可行,无论您以何种方式看待它,都需要遍历值
-
要在没有循环的情况下执行此操作,您必须预先计算所有可能的结果并存储在一个索引中,该索引会在数组更改时更新。如果您已经有一个单独的数组,其中包含从 0 到最大值的所有数字(假设此处为无符号),以及每个数字的最接近答案的数组位置,那么您可以进行查找,它的顺序为 1。否则它的顺序为 n,您需要一个循环。
-
也许阅读一下en.wikipedia.org/wiki/Divide_and_conquer_algorithm 并考虑使用递归
-
不管怎样,你对这个东西进行了基准测试吗?这个数组有多大?遍历数组一次通常没什么大不了的,它是线性的。当事情变得 O(n^2) 或更糟时,性能确实往往难以扩展。也正如 Chitowns 所说,您可以将其设为 O(log n) 而不是 O(n)。
-
如果数组键实际存在,那么“最近”的低/高值是多少(例如,您的示例中的
456)?
标签: php arrays sorting random numbers