查找学习笔记

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;
}

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

相关推荐
dal118网工任子仪18 分钟前
66,【6】buuctf web [HarekazeCTF2019]Avatar Uploader 1
笔记·学习
02苏_23 分钟前
2025/1/21 学习Vue的第四天
学习
羊小猪~~1 小时前
MYSQL学习笔记(四):多表关系、多表查询(交叉连接、内连接、外连接、自连接)、七种JSONS、集合
数据库·笔记·后端·sql·学习·mysql·考研
约定Da于配置1 小时前
uniapp封装websocket
前端·javascript·vue.js·websocket·网络协议·学习·uni-app
小孟Java攻城狮1 小时前
leetcode-不同路径问题
算法·leetcode·职场和发展
查理零世1 小时前
算法竞赛之差分进阶——等差数列差分 python
python·算法·差分
milk_yan2 小时前
Docker集成onlyoffice实现预览功能
前端·笔记·docker
东京老树根2 小时前
Excel 技巧15 - 在Excel中抠图头像,换背景色(★★)
笔记·学习·excel
Ronin-Lotus4 小时前
嵌入式硬件篇---ADC模拟-数字转换
笔记·stm32·单片机·嵌入式硬件·学习·低代码·模块测试
编程小猹4 小时前
学习golang语言时遇到的难点语法
学习·golang·xcode