查找学习笔记

1、静态查找表

以下查找的索引均从1开始

(1)顺序查找(带哨兵)

cpp 复制代码
#include<iostream>
#include<vector>

using namespace std;

int search(vector<int> arr, int key) {
    arr[0] = key;
    int i;
    for (i = arr.size() - 1; arr[i] != key; i--);
    return i;
}

int main()
{
    int n;
    cin >> n;
    vector<int> list(n+1);
    for (auto i = list.begin() + 1; i != list.end(); i++) {
        cin >> *i;
    }
    int t;
    cin >> t;
    while (t--) {
        int key;
        cin >> key;
        int check = search(list, key);
        if (check != 0) {
            cout << check << endl;
        }
        else {
            cout << "error" << endl;
        }
    }
    return 0;
}

(2)折半查找(二分查找)

cpp 复制代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int search(vector<int> arr, int key) {
    int beg = 1, end = arr.size() - 1;
    int mid;
    while (beg <= end) {
        mid = (end + beg) / 2 ;
        if (arr[mid] == key) break;
        else if (arr[mid] < key) {
            beg = mid + 1;
        }
        else end = mid - 1;
    }
    if (arr[mid] == key)return mid;
    else return 0;
}

int main()
{
    int n;
    cin >> n;
    vector<int> list(n+1);
    for (auto i = list.begin() + 1; i != list.end(); i++) {
        cin >> *i;
    }
    int t;
    cin >> t;
    while (t--) {
        int key;
        cin >> key;
        int check = search(list, key);
        if (check != 0) {
            cout << check << endl;
        }
        else {
            cout << "error" << endl;
        }
    }
    return 0;
}

扩展:次优查找树

考虑每个元素被查询的概率不同,概率高的元素应尽早被查询

转载: 查找算法 | 静态树表(次优查找树)详细分析-CSDN博客

(3)索引顺序查找(分块查找)

cpp 复制代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

struct Ind {
    int maxnum;
    int start;
};

int search(vector<int> list, vector<Ind> ind, int key, int &time){ 
    int i;
    for (i = 0; i != ind.size(); i++) {
        time++;
        if (key <= ind[i].maxnum) break;
    }
    if (i == ind.size()) return -1;
    int j = ind[i].start;
    for (; j <= list.size() - 1 && list[j] <= ind[i].maxnum; j++) {
        time++;
        if (list[j] == key)break;
    }
    if (j > list.size() - 1 || list[j] != key) return -1;
    else return j;
}

int main()
{
    int n;
    cin >> n;
    vector<int> list(n + 1);
    for (auto i = list.begin() + 1; i != list.end(); i++) {
        cin >> *i;
    }

    // 构建索引表
    int m;
    cin >>  m;
    vector<Ind> ind(m);
    int tmp = 1;
    for (auto& i : ind) {
        cin >> i.maxnum;
        i.start = tmp;
        tmp += n / m;
    }

    int t;
    cin >> t;
    while (t--) {
        int key;
        cin >> key;
        int time = 0; // time记录查询次数
        int check = search(list, ind, key, time);
        if (check == -1) {
            cout << "error" << endl;
        }
        else {
            cout << check << "-" << time << endl;
        }
    }
    return 0;
}

应用:美团外卖订单中,按同一时刻来对订单分块,但同一时刻中的订单间是无序的。

相关推荐
yong99901 分钟前
图像融合与拼接:完整MATLAB工具箱
算法·计算机视觉·matlab
春风不语5053 分钟前
深入理解主成分分析(PCA)
算法
apollowing5 分钟前
启发式算法WebApp实验室:从搜索策略到群体智能的能力进阶(二十二)
算法·启发式算法·web app
晚枫歌F9 分钟前
最小堆定时器
数据结构·算法
xinhuanjieyi15 分钟前
极语言让ai学习的方法
开发语言·学习
云原生指北31 分钟前
你的数据正在喂养 AI:从 Atlassian 公告,看科技平台的数据训练默认政策
笔记
念恒1230638 分钟前
Python(复杂判断)
python·学习
happymaker062640 分钟前
MyBatis学习日记——DAY03(手写MyBatis框架实现简单功能)
学习
Lumos_77744 分钟前
Linux -- 线程
java·jvm·算法
山楂树の1 小时前
原生 WebGL + Canvas 实现鱼眼图像去畸变(Shader逐像素计算)
图像处理·数码相机·学习·程序人生