zoukankan      html  css  js  c++  java
  • 算法学习一~分治法~二分查找,快速的找~

    现在编程也算是走上门了,但是没有把算法掌握下来只能说自己还是门外汉,所以以后我们就开始努力的学习算法,现在把自己每天的学习分享在这里希望大家能喜欢,并且我也要在这里整理我一天的学习和思路,。

    二分查找。。大家经常需要在一个数组中寻找某个值。如果是一个已经拍好序的话那么可以很快的找到。我们考虑下暴力查找,就是a【n】,中找一个m,那么最好时是o(1),最差时是0(n),最终平均情况就是长度n/2。这样的时间复杂度不算很高但是可以改进到logn的级别。

     1 #include<stdio.h>//算法二分查找
     2 int main()
     3 {
     4 int a[100000],i,x;
     5 while(~scanf("%d",&x))
     6 {
     7 for(i=0;i<100000;i++)//对数组赋值。要已经排好序的
     8     a[i]=i;
     9 int left=0,right=i-1;//左右值=i
    10 int middle=0;
    11 while(left<=right)//算法在左小于右的时候
    12 {
    13     middle=(left+right)/2;//从中间开始找
    14     if(x==a[middle])break;//结束循环已经找到
    15     if(x>a[middle])left=middle+1;//每次砍掉一半
    16     else right=middle-1;
    17 }
    18 printf("%d\n",middle);//输出
    19 }
    20 }

    这里的思路很简单就是从判断中间的元素是不是要找的元素,之后就判断大小如果x比中间值小则在左到中间值之间查找,如果比中间值大则在中间值和右边开始判断。然后就是不断的循环当然这里也可以用递归。。问题很简单我就不多说废话了。,。。

    STL里面有内置的函数库中有这个特别方便的函数

    头文件是 #include<algorithm>

    要记住:函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的!!~

    返回查找元素的第一个可安插位置,也就是“元素值>=查找值”的第一个元素的位置

    案例:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int MAX=100100;
    int num[MAX],top=0;
    int main()
    {
    int n;
    while(~scanf("%d",&n))
    {
    scanf("%d",&num[0]);
    top=1;
    for(int i=1;i!=n;i++)
    {
    scanf("%d",&num[i]);
    int * p=lower_bound(num,num+top,num[i]);
    //主要是把这个坑爹的函数用上了,
    可以返回二分查找的位置。
    if(p-num==top) ++top;
    *p=num[i];
    }
    printf("%d\n",top);
    }
    }

     补充下题目是这个

    http://acm.nyist.net/JudgeOnline/problem.php?pid=214

  • 相关阅读:
    Spring security 浅谈用户验证机制
    Spring Boot Oauth2
    解决端口被占用问题
    Intellij idea run dashboard面板
    深入了解Vue组件 — Prop(上)
    深入了解Vue组件 — 组件注册
    使用命令行工具创建Vue项目
    Vue.js — 组件基础
    Vue.js — 表单输入绑定
    Vue.js — 事件处理
  • 原文地址:https://www.cnblogs.com/luyi14/p/4098242.html
Copyright © 2011-2022 走看看