按字符串和范围编号作为键查找数据

Look up data by string and range number as keys

提问人:holmessh 提问时间:11/17/2023 最后编辑:Konrad Rudolphholmessh 更新时间:11/17/2023 访问量:80

问:

我正在寻找一种 C++ 中的数据结构或实现一个数据结构,以具有不同的表,其中包含字符串列表作为名称,并且每个表都使用数字范围作为键。

需要最高性能的主要操作是两个查找操作:

  1. 按列表中的名称获取表。
  2. 在每个表中,通过特定范围内的数字获取字符串值。

例如,假设以下地图

Table1 name = ["One", "Two"]
    [ 5, 20] -> "Apple"
    [25, 50] -> "Boat"
    [60, 100] -> "Cow"

Table2 name = ["Three"]
    [ 5, 20] -> "Air"
    [25, 50] -> "Bard"
    [60, 100] -> "Camera"

当给定如下操作时:query("Two", 15)

"Two" -> Table1
15 -> "Apple"

有没有办法解决?任何评论都是值得赞赏的。

C++ 数据结构 范围 查找

评论

0赞 Shreeyash Shrestha 11/17/2023
我从未见过这种 c++ 函数。这是一个新的更新吗?或者这只是一个伪代码?请澄清
0赞 MSalters 11/17/2023
S@ShreeyashShrestha:伪代码,因为作者不知道如何用C++表达它。正如第一个答案所示,您需要一个外部库(如 Boost)来表示间隔。

答:

2赞 Sash Sinha 11/17/2023 #1

您可以将哈希图(例如 std::unordered_mapabsl::flat_hash_map)与间隔树(例如 boost::icl::interval_map)组合在一起:

#include <iostream>
#include <unordered_map>
#include <boost/icl/interval_map.hpp>

using boost::icl::interval;
using Table = boost::icl::interval_map<int, std::string>;
using Database = std::unordered_map<std::string, Table>;

std::string Query(Database& db, const std::string& table_name, int number) {
  auto table_it = db.find(table_name);
  if (table_it != db.end()) {
    auto& table = table_it->second;
    auto range_it = table.find(number);
    if (range_it != table.end()) {
      return range_it->second;
    }
  }
  return "Not Found";
}

int main() {
  Database db;
  db["One"].insert(std::make_pair(interval<int>::closed(5, 20), "Apple"));
  db["One"].insert(std::make_pair(interval<int>::closed(25, 50), "Boat"));
  db["One"].insert(std::make_pair(interval<int>::closed(60, 100), "Cow"));
  db["Two"] = db["One"];
  db["Three"].insert(std::make_pair(interval<int>::closed(5, 20), "Air"));
  db["Three"].insert(std::make_pair(interval<int>::closed(25, 50), "Bard"));
  db["Three"].insert(std::make_pair(interval<int>::closed(60, 100), "Camera"));
  std::cout << "Query(Two, 15): " << Query(db, "Two", 15) << '\n';
  std::cout << "Query(Three, 30): " << Query(db, "Three", 30) << '\n';
  std::cout << "Query(One, 65): " << Query(db, "One", 65) << '\n';
  return 0;
}

输出:

Query(Two, 15): Apple
Query(Three, 30): Bard
Query(One, 65): Cow

评论

0赞 holmessh 11/17/2023
谢谢,我可以知道插入/查找interval_map的时间复杂度吗?一般如何实施?
0赞 Sash Sinha 11/17/2023
en.wikipedia.org/wiki/Interval_tree(在答案中也添加了链接) 此外,如果您单击 boost::icl::interval_map您可以看到源代码仅供参考。