一个php的索引数组,数组里面的值为从1到100之间的整数(不重复),并且数值可能是断续,也就是可能有就7,9但是没有8。并且顺序是打乱的,也就是,不是从1排到100这样的
现在假设$a=50, 怎样最快的取出==$a或者是跟$a最相邻的两个数值呢?
对了其中数组中的值不一定有等于$a的
一个php的索引数组,数组里面的值为从1到100之间的整数(不重复),并且数值可能是断续,也就是可能有就7,9但是没有8。并且顺序是打乱的,也就是,不是从1排到100这样的
现在假设$a=50, 怎样最快的取出==$a或者是跟$a最相邻的两个数值呢?
对了其中数组中的值不一定有等于$a的
楼上的已经非常简单了,不过需要是如果没有找到这个数,就找最接近的,而原数组顺序是打乱的,所以上下两个并不一定就是最接近的,当然,二分查找也是一种思路,我提供一下自己用算法的思路,我的想法是先用木桶排序(我目前所了解的在正整数中的排序的最快方式)
//这个是要求的数组
$arr = [1,2,3...];
//填充一个1-100范围的数组
$search_arr = array_fill(0 , 99 , 0);
//遍历数组
foreach($search_arr as $k=>$v){
if(in_array($k , $arr)){
++ $v;
}
}
//此时search_arr数组里面值是1的就是要找的,同时已经排序好了
foreach($search_arr as $k=>$v){
if($v >= 1){
$new_arr[] = $k;
}
}
//此时的new_arr就是一个键从0自增,同时值是排序的数组,然后再结合楼上的写法,便可求出。
不知道这样效率怎么样
$arr = range(1, 100); // 要求的数组
$target = 10; // 目标值
shuffle($arr); // 打乱顺序
$val_key = array_search($target, $arr);
// 测试 $target 不存在的情况去掉以下注释
// array_splice($arr, $val_key, 1);
// $val_key = '';
if ($val_key) {
echo "这个值是:{$arr[$val_key]}";
} else {
sort($arr);
foreach ($arr as $key => $value) {
if (($value < $target) && ($arr[$key+1] > $target)) {
echo "左边:{$value} <br/>";
echo "右边:{$arr[$key+1]}";
exit;
}
}
}
1 回答3.4k 阅读✓ 已解决
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.3k 阅读✓ 已解决
2 回答808 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答2.3k 阅读
不带修改的静态查询
将它排序(升序),复杂度nlogn(一次排序)
然后二分快速定位,复杂度logn(一次查询)
仅带添加操作的动态查询,不改变顺序
1-100有100个数,且其值也为1-100,若询问69所在位置下标,可以以69为中心,二分查找到它附近的点的下标,若某个位置存在数,则标为1,否则标为0,那么以69为中心,往左边二分找最长的区间和为0,往右边二分找最长的区间和为0,快速求区间和可以用了树状数组,更新查询复杂度为logn,添加数的复杂度为logn。
要求和目的:
树状数组保存区间标志和(某个区间的值是否出现),更新和查询复杂度logn
以某值为中心查找离它最近的值,然后返回其下标,二分查,复杂度logn
以空间换时间,保存值->下标的映射。
可以在数组末尾添加数,不要求按顺序添加
以下代码解决以下问题
带添加删除操作(较大数)的动态查询
需要额外维护一个下标占用的区间值,然后套一个平衡二叉树,查询复杂度logn,添加删除复杂度logn。