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[] ...
随机推荐
- Maven快速入门--Idea版
目录 1.web项目的基本知识 1.1 项目构建 1.1.1传统的构建过程如下: 1.1.2 mavn构建项目 1.2 maven构建项目的优点: 2. 依赖管理 2.1 传统依赖管理 2.1.1 手 ...
- Error: Opening Robot Framework log failed on mac jenkins
For resolve your problem you must : Connect on your jenkins url (http://[IP]:8080/) Click on Manage ...
- word转txt
import org.apache.poi.hwpf.extractor.WordExtractor; import java.io.IOException; import java.io.Input ...
- CHIP8模拟器的python3实现-3-指令实现
class Chip8CPU(object): def __init__(self, screen): self.registers = { 'v': [], 'index': 0, 'pc': 0, ...
- vue中nextTick的理解
A. vue 中的 nextTick 是什么? 1.首先需要清楚,nextTick是一个函数:这个函数的作用,简单理解就是下一次渲染后才执行 nextTick 函数中的操作: 2.在下一次 DOM 更 ...
- ios开发的技巧
http://www.cocoachina.com/ios/20141231/10783.html
- 【分布式搜索引擎】Elasticsearch之安装Elasticsearch可视化平台Kibana
一.Kibana简单介绍 Kibana 是为 Elasticsearch设计的开源分析和可视化平台.你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互.你 ...
- apicloud触底加载的简单实现
直接上干货 api.addEventListener({ name: 'scrolltobottom', extra: { threshold: 0 } }, function(ret, err) { ...
- Paxos算法—前世
Paxos算法是基于消息传递且具有高度容错特性的一致性算法.我们将从一个简单的问题开始,逐步的改进我们的设计方案,最终得到Paxos,一个可以在逆境下工作的协议. 一.客户端-服务器模型 我们从最小的 ...
- toString的本质 以及String.valueOf()
Object可以用toString转为字符串. Object.toString(); 但char[]不行,得用valueOf. String.valueOf(char[]); 如果用toString, ...