C++分治策略实现二分搜索
问题描述:
给定已排好序的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++分治策略实现二分搜索的更多相关文章
- 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第4章 分治策略
分治策略有一种“大事化小,小事化了”的境界,它的思想是将原问题分解成两个子问题,两个子问题的性质和原问题相同,因此这两个子问题可以再用分治策略求解,最终将两个子问题的解合并成原问题的解.有时,我们会有 ...
- 【从零学习经典算法系列】分治策略实例——高速排序(QuickSort)
在前面的博文(http://blog.csdn.net/jasonding1354/article/details/37736555)中介绍了作为分治策略的经典实例,即归并排序.并给出了递归形式和循环 ...
- 递归与分治策略之循环赛日程表Java实现
递归与分治策略之循环赛日程表 一.问题描述 设有n=2^k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能参赛一 ...
- 递归与分治策略之棋盘覆盖Java实现
递归与分治策略之棋盘覆盖 一.问题描述 二.过程详解 1.棋盘如下图,其中有一特殊方格:16*16 . 2.第一个分割结果:8*8 3.第二次分割结果:4*4 4.第三次分割结果:2*2 5.第四次分 ...
- 小旭讲解 LeetCode 53. Maximum Subarray 动态规划 分治策略
原题 Given an integer array nums, find the contiguous subarray (containing at least one number) which ...
- [图解算法] 归并排序MergeSort——<递归与分治策略>
#include"iostream.h" void Merge(int c[],int d[],int l,int m,int r){ ,k=l; while((i<=m)& ...
- 动态规划VS分治策略
•在用分治法解决问题时,由于子问题的数目往往是问题规模的指数函数,因此对时间的消耗太大. •动态规划的思想在于,如果各个子问题不是独立的,不同的子问题的个数只是多项式量级,而我们能够保存已经解决的子问 ...
- 第四章 分治策略 4.2 矩阵乘法的Strassen算法
package chap04_Divide_And_Conquer; import static org.junit.Assert.*; import java.util.Arrays; import ...
- [原]C语言实现的快速排序,采用分治策略,递归实现
#include<stdio.h> #define LEN 8 int a[LEN] = { 5, 2, 4, 7, 1, 3, 2, 6 }; int Partition(int a[] ...
随机推荐
- jenkins+robotframework邮件发送报告模板
1.Jenkins中配置系统邮件系统管理–系统设置,配置Extended E-mail Notification 2.jenkins 创建一个新项目,项目创建成功,配置邮件
- mvc 返回json格式时间格式化
protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEnco ...
- linux用户和权限 setuid
uid_t getuid(void); uid_t geteuid(void); int setuid(uid_t uid); int seteuid(uid_t euid); int setegid ...
- Facebook发布全新JavaScript引擎:Hermes
摘要: JS引擎开始升级了... 原文:技术栈中的爱马仕?Facebook发布全新JavaScript引擎:Hermes 作者:Carson_Ho Fundebug经授权转载,版权归原作者所有. 前言 ...
- RIP路由协议:基础设置/通信练习/兼容问题
RIP工作原理 首先路由器学习到直连网段 路由器开始运行RIP,当路由器的更新周期30秒到了的时候,会向邻居发送路由表 Metric:度量值,衡量一条路由好坏的值.发送路由表时Metric值会加1 学 ...
- 【分布式搜索引擎】Elasticsearch之如何安装Elasticsearch
在Macos上安装 一.下载安装过程 最新版本下载地址: https://www.elastic.co/cn/downloads/elasticsearch 历史版本下载地址: https://www ...
- 4-1 Matplotlib 概述
Matplotlib概述 In [1]: import numpy as np import matplotlib.pyplot as plt #pyplot是matplotlib的画图的接口 ...
- toString的本质 以及String.valueOf()
Object可以用toString转为字符串. Object.toString(); 但char[]不行,得用valueOf. String.valueOf(char[]); 如果用toString, ...
- vue如何解析xml文件 x2js
好久没来写东西了,主要是一直在加班,哼哼,不开心 项目中会用到将xml文件解析成json文件在页面中显示出来,以前jq的时候用到的方法行不通了,故在这边介绍一种我觉得还不错的插件 1. npm安装 n ...
- Rust中的迭代器
和闭包一样,练代码 struct Counter { count: u32, } impl Counter { fn new() -> Counter { Counter {count: } } ...