二分查找

来源:互联网 发布:包装袋定制淘宝 编辑:程序博客网 时间:2024/06/06 07:09

二分查找函数:binary_search():

函数模板:binary_search(arr[],  size  ,  indx)         
 
参数说明:     arr[]: 数组首地址;
                         size:  数组元素个数;
                         indx:    需要查找的值。
lower_bound():

upper_bound():

lower_bound(val): 返回容器中第一个值【大于或等于】val的元素的iterator位置。

upper_bound(val): 返回容器中第一个值【大于】val的元素的iterator位置。
应用:
O(n*n)的求最长子序列的算法;
#include<stdio.h>
#include<string.h>
int a[1002]={0};
int b[1002]={0};
int main()
{
    int t;
    int n,i,j,m;
    int ans=0,min=0;
    while(~scanf("%d",&n))
    {
        ans=1;
        memset(b,0,sizeof(b));
        for(i=0;i<n;++i)
        {
            scanf("%d",&a[i]);
        }
        b[0]=ans;
        for(i=1;i<n;++i)
        {
            if(a[i]>a[i-1])
            {
                b[i]=++ans;
            }
            else{
                    m=1;
                for(j=i-1;j>=0;--j)
                {
                     if(a[j]<a[i])
                        m++;
                }
                b[i]=m;
                ans=m;
            }
        }
        for(i=0;i<n;++i)
        {
            if(b[i]>min)
                min=b[i];
        }
        printf("%d\n",min);
    }
    return 0;
}
a[i]:1 7 2 5 8 4 6 10

b[i]:1 2 2 3 4 3 4 5(以第i个数为子序列最后一位,得到他的长度)

O(n*logn)的算法:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int a[10000],b[10000],c[10000];
int main()
{
    int t,n,i,j;
    scanf("%d",&n);
        for(i=0;i<n;++i)
        {
            scanf("%d",&a[i]);
        }
        int cnt=0;
        b[cnt]=a[0];
        c[0]=1;
        for(i=1;i<n;++i)
        {
            if(a[i]>b[cnt])  //每一次都与前面的最长子序列的最后一个节点进行比较
            {
                b[++cnt]=a[i];
                c[i]=cnt+1;
            }
            else{
                int temp=lower_bound(b,b+cnt+1,a[i])-b;//更新前面的数,替换成较小的数
                b[temp]=a[i];
                c[i]=temp+1;
            }
        }
        printf("%d\n",cnt+1);
    return 0;
}

思路:c[i]记录以a[i]为最后一个节点的最长上升子序列长度

b[i]则是不断更新后面比较小的数以容纳更长序列

b[i]最后得到的就是最长子序列

总想法:从小到大,把一个大问题的求解变成一个小问题

0 0