二分法检索(binary search)(又名二进制搜索)
定义:
二分法检索的基本思想是设字典中的元素从小到大有序地存放在数组(array)中。首先将给定值key与字典中间位置上元素的关键码(key)比较,如果相等,则检索成功;否则,若key小,则在字典前半部分中继续进行二分法检索;若key大,则在字典后半部分中继续进行二分法检索。这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。偶数个取中间2个其中任何一个作为中间元素。二分法检索是一种效率较高的检索方法,要求字典在顺序表中按关键码排序。
例题:

大意为:
给定一个双调数组(数组中数字先递增后递减),例如1,3,5,7,6,4,2,0,-2,-4,-6,-10。另外给定一个数字X。
设计一个算法,找出X是否在数组中。当此数组的数字总量n为很大的一个数值时,寻找X时,程序最多运行大约2lgN次。lg为底数为2的对数,lg4=2;lg8=3。
解答:
解题思路:首先,直接遍历是肯定不行的,因为当n很大时,如果X是数组的最后一个数字,则程序要运行N次才能找到。例如:
int x;
//如果x==RawArray[RawArray.Num()-1],则这个要遍历所有数字,运行了N次
for (int i=;i<RawArray.Num();++i)
{
if (RawArray[i] == x) return;
}
然后,解题方法为:利用二分法检索来检索。先用二分法检索找到递增区域和递减区域的共同数字(上述例子中的7);然后分别在递增区域和递减区域中用二分法检索来寻找X。
具体实现:
.h: UCLASS()
class ALGORITHM_API AAnalysisExerciseOne : public AActor
{
GENERATED_BODY() public:
// Sets default values for this actor's properties
AAnalysisExerciseOne(); //在数组中寻找X,如果找到,返回True;反之,返回false;
bool FindIntX(TArray<int> TargetArray, int X);
//二叉法找Int
bool XInArray(TArray<int> TargetArray, int LeftIndex, int RightIndex, int X, bool IncreaseSide); protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override; public:
// Called every frame
virtual void Tick(float DeltaTime) override; private: TArray<int> RawArray; }; .cpp: // Sets default values
AAnalysisExerciseOne::AAnalysisExerciseOne()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
} //在数组中寻找X,如果找到,返回True;反之,返回false;
bool AAnalysisExerciseOne::FindIntX(TArray<int> TargetArray, int X)
{
//利用二叉法,寻找递增数组和递减数组的共用元素
//左右两个点
int Left();
int Right(TargetArray.Num());
//这个是要找的元素的index
int TargetInt();
//开始寻找
while (Left <= Right)
{
//找中间点,如果有小数点,舍弃,取整
int Mid = Left + (Right - Left) / ;
if (TargetArray[Mid - ] < TargetArray[Mid] && TargetArray[Mid]>TargetArray[Mid + ])
{
//找到了,结束While
TargetInt = Mid;
break;
}
else if (TargetArray[Mid - ] < TargetArray[Mid]) { Left = Mid + ; }
else if (TargetArray[Mid] > TargetArray[Mid + ]) { Right = Mid - ; }
//在双调数组中,TargetArray[Mid - 1] > TargetArray[Mid] && TargetArray[Mid] < TargetArray[Mid + 1]的情况不存在
else break;
}
//等于0说明没找到,出问题了,返回
if (TargetInt == ) return false;
//X比数组中所有数字都大,X不在数组中
if (X > TargetArray[TargetInt]) return false;
if (X == TargetArray[TargetInt]) return true;
//先在增长数组中找
if (XInArray(TargetArray, , TargetInt - , X, true))
{
UKismetSystemLibrary::PrintString(this, "Find in increase side!");
return true;
}
//如果在增长数组中找不到,则去减少数组中找
else
{
if (XInArray(TargetArray, TargetInt + , TargetArray.Num() - , X, false))
{
UKismetSystemLibrary::PrintString(this, "Find in Decrease side!");
return true;
}
//都找不到,说明没有
else
{
UKismetSystemLibrary::PrintString(this, "Don't Find it!");
return false;
}
}
} bool AAnalysisExerciseOne::XInArray(TArray<int> TargetArray, int LeftIndex, int RightIndex, int X, bool IncreaseSide)
{
int Left(LeftIndex);
int Right(RightIndex);
//开始寻找
if (IncreaseSide)
{
//在递增区域中寻找
while (Left <= Right)
{
//找中间点,如果有小数点,舍弃,取整
int Mid = Left + (Right - Left) / ;
if (X < TargetArray[Mid]) { Right = Mid - ; }
else if (X > TargetArray[Mid]) { Left = Mid + ; }
else return true;
}
return false;
}
//在递减区域中寻找
else
{
while (Left <= Right)
{
//找中间点,如果有小数点,舍弃,取整
int Mid = Left + (Right - Left) / ;
if (X > TargetArray[Mid]) { Right = Mid - ; }
else if (X < TargetArray[Mid]) { Left = Mid + ; }
else return true;
}
return false;
}
} // Called when the game starts or when spawned
void AAnalysisExerciseOne::BeginPlay()
{
Super::BeginPlay();
//测试
//给定一个初始数组
RawArray.Add();
RawArray.Add();
RawArray.Add();
RawArray.Add();
RawArray.Add();
RawArray.Add();
RawArray.Add();
RawArray.Add();
RawArray.Add(-);
RawArray.Add(-);
RawArray.Add(-);
RawArray.Add(-);
if (FindIntX(RawArray, -))
{
UKismetSystemLibrary::PrintString(this, "Find it!");
}
else
{
UKismetSystemLibrary::PrintString(this, "Don't Find it!");
} } // Called every frame
void AAnalysisExerciseOne::Tick(float DeltaTime)
{
Super::Tick(DeltaTime); }
二分法检索(binary search)(又名二进制搜索)的更多相关文章
- 二分法查找(Binary Search)
--摘要:二分法的介绍已经很多了,但并不直观,因此此文诞生,希望批评指正. 二分查找是在有序数组中查找一个元素的算法,通过比较目标元素与数组中间元素来查找,如果目标值是中间元素则将返回中间元素位置. ...
- Leetcode之二分法专题-704. 二分查找(Binary Search)
Leetcode之二分法专题-704. 二分查找(Binary Search) 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 t ...
- Binary Search 的递归与迭代实现及STL中的搜索相关内容
与排序算法不同,搜索算法是比较统一的,常用的搜索除hash外仅有两种,包括不需要排序的线性搜索和需要排序的binary search. 首先介绍一下binary search,其原理很直接,不断地选取 ...
- [Swift]LeetCode701. 二叉搜索树中的插入操作 | Insert into a Binary Search Tree
Given the root node of a binary search tree (BST) and a value to be inserted into the tree, insert t ...
- [LeetCode] Insert into a Binary Search Tree 二叉搜索树中插入结点
Given the root node of a binary search tree (BST) and a value to be inserted into the tree, insert t ...
- [LeetCode] Search in a Binary Search Tree 二叉搜索树中搜索
Given the root node of a binary search tree (BST) and a value. You need to find the node in the BST ...
- Binary Search 二分法方法总结
Binary Search 二分法方法总结 code教你做人:二分法核心思想是把一个大的问题拆成若干个小问题,最重要的是去掉一半或者选择一半. 二分法模板: public int BinarySear ...
- 270. Closest Binary Search Tree Value 二叉搜索树中,距离目标值最近的节点
[抄题]: Given a non-empty binary search tree and a target value, find the value in the BST that is clo ...
- [Swift]LeetCode501. 二叉搜索树中的众数 | Find Mode in Binary Search Tree
Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred ...
随机推荐
- 运行B/s项目时,出现尝试访问类型与数组不兼容元素问题?
1.问题描述 运行B/s项目时,浏览器出现应用程序中服务器错误(尝试访问类型与数组不兼容的元素) 2.问题原因 本人是项目引用的dll版本不一致问题,引用的System.Web.Mvc版本是4.0.0 ...
- laravel创建资源路由控制器
php artisan make:controller PhotoController --resource
- day05_python_1124
---恢复内容开始--- 改l1[1:4:2]=[1:32] 对于增加个数 列表按切片取就是列表 ---恢复内容结束--- 01 昨日内容回顾 list: 增: append insert(ind ...
- [Codeforces797F]Mice and Holes
Problem n个老鼠,m个洞,告诉你他们的一维坐标和m个洞的容量限制,问最小总距离. Solution 用dp[i][j]表示前i个洞,进了前j个老鼠的最小代价 dp[i][j]=min(dp[i ...
- zookeeper:shell操作以及可视化工具的使用
1.zkcli.sh基本使用 1-1 查看节点 进入zk的bin目录下执行./zkCli.sh ls命令可以查看节点,/zookeeper/quota是默认的节点 1-2新增节点 create key ...
- ppt点击文字出现图片,再次点击消失
实现效果:在PPT一个页面的任意位置,单击左键,出现图片:在图片上,单击左键,图片消失 实现思路:给图片做两个动画,一个进入,文字作触发器,另一个退出,图片本身为触发器. 实现方法: 1.选中图片…… ...
- (C/C++学习笔记) 二十一. 异常处理
二十一. 异常处理 ● 异常的概念 程序的错误通常包括:语法错误.逻辑错误.运行异常. 语法错误指书写的程序语句不合乎编译器的语法规则,这种错误在编译.连接时由编译器指出. 逻辑错误是指程序能顺利运行 ...
- Ionic2开发环境搭建、项目创建调试与Android应用的打包、优化
Ionic2开发环境搭建.项目创建调试与Android应用的打包.优化. windows下ionic2开发环境配置步骤如下: 下载node.js环境,稳定版本:v6.9.5 下载android stu ...
- 实力封装:Unity打包AssetBundle(四)
→→前情提要:窗口初现←← 让用户选择要打包的文件 时至今日,我们选择打包文件的方式依然是在Project面板或Hierarchy面板中用鼠标点选.现在既然有了窗口,我们自然希望可以将所有文件罗列在窗 ...
- TensorFlow函数:tf.zeros_like
tf.zeros_like函数 tf.zeros_like( tensor, dtype=None, name=None, optimize=True ) 定义在:tensorflow/python/ ...