查找学习笔记

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

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

相关推荐
陈卫军老师2 分钟前
陈卫军语录全集总结:12句话,一条主线
经验分享·笔记
无线通信科研笔记14 分钟前
IEEE TVT 2026 论文精读与完整复现|相位误差如何重塑近场 RIS 的幅相响应
论文阅读·人工智能·python·算法·论文笔记
mmmmath_31 小时前
二叉树の递归遍历
算法
All for pursuit.1 小时前
【位运算-1】338.比特位计数
数据结构·c++·算法·leetcode
小师兄吃牛肉2 小时前
C语言中的nullptr有必要吗
c语言·c++·算法
mlidongfeng2 小时前
【学习】mKernel 分析
学习
一只小小的芙厨4 小时前
【线性DP】
学习·算法·动态规划
2501_926978334 小时前
给自指系统接一个外部锚 —— 一个关于「用 AI 观察自己」的方法
人工智能·经验分享·笔记·机器学习·ai写作
奋发向前wcx4 小时前
CSP-J复赛模拟赛5 王晨旭补题 2026.10.5
算法
li星野4 小时前
DO — Auxiliary Verb (One-Page Notes)
学习