📜  门| GATE CS Mock 2018年|套装2 |问题12(1)

📅  最后修改于: 2023-12-03 15:28:39.739000             🧑  作者: Mango

题目介绍

本题为 GATE CS Mock 2018 年套装2 中的第12道题。该题是一道编程题,要求程序员实现一个简单的数据库系统。具体要求和限制,请看下面的介绍。

问题描述

实现一个简单的数据库系统,该系统需要支持以下功能:

  1. 插入数据
  2. 查询数据
  3. 删除数据

每个数据包含两个字段,分别是 id 和 value。其中 id 是一个整数,value 是一个字符串。

系统需要实现函数 void insert(int id, string value)vector<string> search(int id),和void delete(int id)。其中 insert 和 delete 分别用于在数据库中插入和删除数据,search 用于查询具有指定 id 的数据的 value 值。如果数据库中不存在指定 id 的数据,search 函数应该返回空的 vector。

系统将调用此函数多次,每次都是对数据库的操作。你的任务是设计合适的数据结构和算法,以确保每个操作的时间复杂度都是 O(1)。

代码实现

下面是一段 C++ 代码实现,使用了哈希表的数据结构:

#include <bits/stdc++.h>
using namespace std;

struct Data {
    int id;
    string value;
};

class Database {
private:
    unordered_map<int, Data> data_map;

public:
    void insert(int id, string value) {
        data_map[id] = Data {id, value};
    }

    vector<string> search(int id) {
        auto it = data_map.find(id);
        if(it == data_map.end())
            return vector<string>();
        else
            return {it->second.value};
    }

    void delete_data(int id) {
        data_map.erase(id);
    }
};

int main() {
    Database db;
    db.insert(1, "hello");
    db.insert(2, "world");
    db.insert(3, "!");
    assert(db.search(1) == vector<string>{"hello"});
    assert(db.search(4) == vector<string>());
    db.delete_data(2);
    assert(db.search(2) == vector<string>());
    return 0;
}

代码中,我们使用了 STL 提供的 unordered_map 来存储数据,其中 int 类型的 key 代表 id,Data 类型存储了 id 和 value。实现过程非常简单:在 insert 函数中,我们直接将新的数据插入到 unordered_map 中;在 search 函数中,我们使用 find 函数查找 id 的位置,如果找到了就返回 vector 类型的 value,否则返回空的 vector;在 delete_data 函数中,我们使用 erase 函数删除指定的 id 数据。三个函数的时间复杂度都是 O(1)。

总结

本题是一道较为简单的编程题,但要求程序员有较好的数据结构和算法设计能力,才能保证实现函数的时间复杂度都是 O(1)。对于初学算法的同学来说,这道题可以锻炼自己的编程思维,让自己更好地理解哈希表的数据结构和算法原理。