问题描述:

给定已排好序的n个元素组成的数组,现要利用二分搜索算法判断特定元素x是否在该有序数组中。

细节须知:

(1)由于可能需要对分治策略实现二分搜索的算法效率进行评估,故使用大量的随机数对算法进行实验(生成随机数的方法见前篇随笔)。

(2)由于二分搜索需要数据为有序的,故在进行搜索前利用函数库中sort函数对输入的数据进行排序。

(3)代码主要用到的是经典的二分查找加上递归。

(4)其中limit为所要从随机数文件中提取的数据的数量,以此为限来决定算法需要在多少个数据中进行搜索。

(5)为了使代码更人性化,加入了查找成功与失败的提醒,主要区别于Search函数中的返回值,若查找成功则返回1(满足1>0,即为查找成功),其余则返回0,即为查找失败。

(6)通过clock函数对算法运行的时间进行计算以评估算法效率。

算法原理:

假设搜索范围为数组a中的n个元素,要搜索的元素为x。

将n个元素分成个数大致相同的两半,取a[n/2]与x进行比较。如果x=a[n/2],则找到x,算法终止。如果x<a[n/2],则只要在数组a的左半部继续搜索x。如果x>a[n/2],则只要在数组a的右半部继续搜索x。以此不断地将搜索范围折半,从而实现采用分治策略进行二分搜索。

 #include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
using namespace std;
#define limit 100000 int Search(int R[],int low,int high,int k) //low表示当前查找的范围下界、high表示当前查找范围的上界,k为所要查找的内容
{
int mid; if (low<=high){ //查找区间存在一个及以上元素
mid=(low+high)/; //求中间位置
if (R[mid]==k) //查找成功返回1
return ;
if (R[mid]>k) //在R[low..mid-1]中递归查找
Search(R,low,mid-,k);
else //在R[mid+1..high]中递归查找
Search(R,mid+,high,k);
}
else
return ;
} int main(void)
{
ifstream fin;
int x;
int i;
int a[limit];
int result; fin.open("random_number.txt");
if(!fin){
cerr<<"Can not open file 'random_number.txt' "<<endl;
return -;
} time_t first, last; for(i=; i<limit; i++){
fin>>a[i];
}
fin.close(); sort(a,a+limit); cout<<"Please enter the number you want to find:";
cin>>x; first = clock(); result = Search(a,,limit-,x); if(result>)
cout<<"Search success!"<<endl;
else
cout<<"Can not find it!"<<endl; last = clock(); cout<<"Time cost: "<<last-first<<endl; return ;
}

程序设计思路:

若x等于中间项,则退出。否则,

(1)将数组划分为两个子数组,其大小大约为原数组的一半。如果x小于中间项,则选择左子数组;如果x大于中间项,则选择右子数组。

(2)确定x是否在该子数组中,以解决该子数组。如果该子数组不够小,则进行递归处理。

(3)由子数组的答案获得原数组的答案。

结果数据格式为time_t格式相减得到的长整型。

时间复杂性分析:

假设搜索范围为数组a中的n个元素,要搜索的元素为x。

将n个元素分成个数大致相同的两半,取a[n/2]与x进行比较。如果x=a[n/2],则找到x,算法终止。如果x<a[n/2],则只要在数组a的左半部继续搜索x。如果x>a[n/2],则只要在数组a的右半部继续搜索x。以此不断地将搜索范围折半,从而实现采用分治策略进行二分搜索。

其中,每执行一次算法的循环,待搜索数组的大小减少一半。在最坏情况下(即x大于所有数组项),如果n是2的幂,而且x大于所有数组项目,那每次调用生成的实例恰好为原实例的一半;若n=1,且x大于这个唯一数组项目,会将x与此项目进行比较,后面是在low>high条件下的一次递归调用。因而,确定递推关系:

W(n)=W(n/2)+1 (n>1,n为2的幂)

W(1)=1

由Master方法可以得到

W(n)=lgn+1

如果n不仅局限于2的幂,则

W(n)=⌊lgn⌋+1∈O(lgn)

其中⌊y⌋表示小于或等于y的最大整数。

C++分治策略实现二分搜索的更多相关文章

  1. 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第4章 分治策略

    分治策略有一种“大事化小,小事化了”的境界,它的思想是将原问题分解成两个子问题,两个子问题的性质和原问题相同,因此这两个子问题可以再用分治策略求解,最终将两个子问题的解合并成原问题的解.有时,我们会有 ...

  2. 【从零学习经典算法系列】分治策略实例——高速排序(QuickSort)

    在前面的博文(http://blog.csdn.net/jasonding1354/article/details/37736555)中介绍了作为分治策略的经典实例,即归并排序.并给出了递归形式和循环 ...

  3. 递归与分治策略之循环赛日程表Java实现

    递归与分治策略之循环赛日程表 一.问题描述 设有n=2^k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能参赛一 ...

  4. 递归与分治策略之棋盘覆盖Java实现

    递归与分治策略之棋盘覆盖 一.问题描述 二.过程详解 1.棋盘如下图,其中有一特殊方格:16*16 . 2.第一个分割结果:8*8 3.第二次分割结果:4*4 4.第三次分割结果:2*2 5.第四次分 ...

  5. 小旭讲解 LeetCode 53. Maximum Subarray 动态规划 分治策略

    原题 Given an integer array nums, find the contiguous subarray (containing at least one number) which ...

  6. [图解算法] 归并排序MergeSort——<递归与分治策略>

    #include"iostream.h" void Merge(int c[],int d[],int l,int m,int r){ ,k=l; while((i<=m)& ...

  7. 动态规划VS分治策略

    •在用分治法解决问题时,由于子问题的数目往往是问题规模的指数函数,因此对时间的消耗太大. •动态规划的思想在于,如果各个子问题不是独立的,不同的子问题的个数只是多项式量级,而我们能够保存已经解决的子问 ...

  8. 第四章 分治策略 4.2 矩阵乘法的Strassen算法

    package chap04_Divide_And_Conquer; import static org.junit.Assert.*; import java.util.Arrays; import ...

  9. [原]C语言实现的快速排序,采用分治策略,递归实现

    #include<stdio.h> #define LEN 8 int a[LEN] = { 5, 2, 4, 7, 1, 3, 2, 6 }; int Partition(int a[] ...

随机推荐

  1. UML与设计模式

    这个在大中华区不知道是否重视,反正我是接触的人中谈的少,除了想起大学有个博士级别的老师,给我们上课天天老拿着一本外文翻译的UML书外,可真要重视起来的. 加深一个单词,模式pattern,patter ...

  2. 模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

  3. iOS中Category和Extension 原理详解

    (一)Category .什么是Category? category是Objective-C .0之后添加的语言特性,别人口中的分类.类别其实都是指的category.category的主要作用是为已 ...

  4. Mysql中的sql是如何执行的 --- 极客时间学习笔记

    MySQL中的SQL是如何执行的 MySQL是典型的C/S架构,也就是Client/Server架构,服务器端程序使用的mysqld.整体的MySQL流程如下图所示: MySQL是有三层组成: 连接层 ...

  5. jdbc、Mybatis、Hibernate介绍(非原创)

    文章大纲 一.jdbc介绍二.Mybatis介绍三.Hibernate介绍四.jdbc.Mybatis.Hibernate比较五.参考文章   一.jdbc介绍 1. jdbc编程步骤 (1)加载数据 ...

  6. GCN实现3

    参考 : 首先看两篇论文,大概了解一下原理性的东西: GRAPH CONVOLUTIONAL NETWORKS THOMAS KIPF, 30 SEPTEMBER 2016 http://tkipf. ...

  7. Mysql 数据库部署(解压免安装)

    下载压缩包,解压. 在根目录下添加my.ini, 复制一下内容,保存. [mysqld] skip-grant-tables #绑定IPv4和3306端口 bind-address = 0.0.0.0 ...

  8. MongoDB 之pymongodb

    import pymongo import json from bson import ObjectId mongoclient = pymongo.MongoClient(host="12 ...

  9. c# 第四节 Net Framework编写应用程序的过程

    本节 1:创建.net应用程序所经历的步骤 2:cli是什么 3:程序集是什么 4:jit编辑器 5:托管代码 1:创建.net应用程序所经历的步骤 2:cli是什么 3:程序集是什么 4:jit编辑 ...

  10. 201971010110-李华《面向对象程序设计(java)》第七周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...