检索算法

时间:2020-03-16
本文章向大家介绍检索算法,主要包括检索算法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1. 问题

  写出两种检索算法:在一个排好序的数组T[1..n]中查找x,如果xT中,输出x

  T的下标j;如果x不在T中,输出j=0.

2. 解析

  1、最暴力的方法就是,循环一遍整个数组,如果找到x,则输出下标,如果未找到就输出0.

  2、注意到此为有序数组,所以可以用二分法查找,时间复杂度比暴力快。

3. 设计

1、暴力

For(int i=1;i<=n;i++){
    If(T[i]==x)cout<<i<<”\n”;
}
if(未找到)cout<<0<<”\n”;

2、二分

int l=1,r=n;
while(l<=r){
    int mid=(l+r)>>1;
    if(T[mid]==x){
    cout<<mid<<"\n";
    return;//找到x,输出下标mid 
    }
    if(T[mid]<x)l=mid+1;//不断二分,逼近x 
    else r=mid-1;
}

4. 分析

  1、暴力算法,遍历整个数组,时间复杂度为O(n).

  2、二分法,时间复杂度为O(logn).

5. 分析

  1、暴力算法

/*
author: keke
project name:暴力查找算法
Time Complexity: O(n)
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
int T[maxn],n,x;
void solve(int x){
    for(int i=1;i<=n;i++){
        if(T[i]==x){
            cout<<i<<"\n";
            return;//找到x,输出下标i 
        }
    }
    cout<<0<<"\n";//未找到,输出0 
}
int main(){
    cin>>n;//数组长度为n 
    for(int i=1;i<=n;i++)cin>>T[i];
    cin>>x;//查找x的下标 
    solve(x);
    return 0;
}

2、二分查找

/*
author: keke
project name:二分查找算法
Time Complexity: O(log(n))
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
int T[maxn],n,x;
void solve(int x){
    int l=1,r=n;
    while(l<=r){
        int mid=(l+r)>>1;
        if(T[mid]==x){
            cout<<mid<<"\n";
            return;//找到x,输出下标mid 
        }
        if(T[mid]<x)l=mid+1;//不断二分,逼近x 
        else r=mid-1;
    }
    cout<<0<<"\n";//未找到x,输出0 
}
int main(){
    cin>>n;//数组长度为n 
    for(int i=1;i<=n;i++)cin>>T[i];
    cin>>x;//查找x的下标 
    solve(x);
    return 0;
}

原文地址:https://www.cnblogs.com/powerkeke/p/12503374.html