查找学习笔记

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

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

相关推荐
y = xⁿ11 小时前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习
顶点多余12 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
罗西的思考13 小时前
【Agentic RL / 强化学习框架】Molt 设计解读
人工智能·算法·机器学习
hahaha601614 小时前
HLS高层次综合设计技巧--C++类和模板
图像处理·人工智能·算法·计算机视觉
HugoStudio_SWAN14 小时前
【擦除重绘】C++ 控制台动画:弹跳 Logo DVD 屏保效果
开发语言·c++·学习·程序人生
多弗朗皮卡丘15 小时前
算法详解4:买卖股票的最佳时机系列(上)
算法
sakiko_15 小时前
Swift学习笔记42-SwiftUI的属性包装器(讲解+面试)
笔记·学习·ios·swiftui·swift
自小吃多16 小时前
器件移动、旋转、镜像、对齐、等间距操作笔记
笔记·嵌入式硬件
存在morning17 小时前
【Paimon 学习笔记 三】工作流程:Paimon 的批写、流写、批读与流读
笔记·学习
维克兜率天17 小时前
【维克】动量指标家族:RSI、ROC、CCI、Momentum全面解析
python·算法