分治算法
- 分治算法是什么?
- 分治算法的要素
- 二分法搜索
- 问题:
- 问题分析:
- 代码实现
分治算法是什么?
- 如同在古代,将帅管理军队的时候,或是,近日内的公司管理制度等
- 在以上等情况下,都有一个共同的特点 —— >(上级管理下级,并非上级管理所有人)。
- 这与分治算法很相同。
- 分治算法的本质
- 将一个大规模的问题化解为若干规模较小的子问题,分而治之。
分治算法的要素
- 什么的问题才能使用分治算法呢?
- 原问题可分解为若干规模较小的相同子问题。
- 子问题相互独立。
- 子问题的解可以合并为原文的解。
二分法搜索
问题:
有一个有序的数组,a[n] , 在数组中查照元素 x , 如何尽可能高效的查出元素x呢?
问题分析:
如果是n个数,最坏的打算的是,一个一个的进行查照,查照n次。
其实不然,我们还有一种思路:
数组是有序的 , 所以我们可以 截取a[n] 中间的元素与x相比。
如果大于:则在数组a[n]的后半部分查找。
如果小于:则在数组a[n]的前半部分查找。
代码实现
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int x; //要查询的元素
int low,high; //查找数组的两个范围
int size = 0; //数组的大小
cout<<"输入数组大小"<<endl;
cin>>size;
int a[size]; //要被查询的数组a
for(int i = 0;i<size;i++) //给数组a赋值
{
cout<<"输入第"<<i<<"个元素"<<endl;
cin>>a[i];
}
cout<<"输入要查询的元素"<<endl<<"x = ";
cin>>x;
//对数组进行排序(默认升序)
sort(a,a+size);
cout<<"排序后的数组:"<<endl;
for(int i =0;i<size;i++)
cout<<i<<":"<<a[i]<<endl;
cout<<endl<<endl;
//查找:
low = 0; //查询范围的上界.数组的第一个元素
high = size-1; //查询范围的下界,数组的最后一个元素
int index = -1; //元素x所在的索引
while(low <= high)
{
int middle = (low+high)/2; //找出中间元素
if(x == a[middle])
{
index = middle; //只有找了才进行赋值
break;
}
else if(x < a[middle]) //如果x小于中间元素 , 则下界范围缩小
high = middle-1;
else
low = middle +1; //如果x大于中间元素,则上页范围缩小.
}
if(index == -1)
cout<<"未找到x"<<endl;
else
cout<<"x所在位置:"<<index<<endl;
return 0;
}
如果元素不存在呢?