【问题标题】:Efficient ways to lookup values by 3 int通过 3 int 查找值的有效方法
【发布时间】:2012-08-08 07:32:25
【问题描述】:

我有一些需要有效存储和查找的数据。最好使用 C. 数据文件的每一行格式如下:

key1 key2 key3 data  

其中key1key2key3 是整数,datafloat 的数组。

我正在考虑将key1,2,3转换成字符串,然后使用C++std::map将字符串映射为浮点指针:

std::map<string, float*>

有没有更好的方法?

注意:整数 key1,2,3 的范围为 0-4000,但非常稀疏。换句话说,如果您遍历 key1 中的所有值,您会发现在 0-4000 范围内的唯一 int

【问题讨论】:

  • 你打算用C还是C++?
  • 可用于 C 的解决方案和可用于 C++ 的解决方案非常不同。您说“最好使用 C”,但继续建议使用 std::map 的 C++ 实现。你真正想要哪种语言?
  • 如果你要 c++ 一个包含所有三个键的类和一个比较运算符,其中包含正确比较键的最不常见顺序的逻辑会很好
  • 能否提供 C 和 C++ 的解决方案,仅供学习之用,谢谢
  • 你可以 - 但你不能在 C 答案中使用 std::map - 这会大大增加答案的复杂性,因为你必须编写容器

标签: c++ c dictionary map lookup


【解决方案1】:

散列提供了对数据的快速访问,因此您可能希望使用散列从三个整数中的每一个中查找值。这种方法可以在 c 或 c++ 中使用。

对于每一行数据: 1. 为浮点数组分配空间 2. 将指向浮点数组的指针存储在指针数组中 3. 将指针数组的索引存储在基于int1的hash中 4. 将指针数组的索引存储在基于int2的hash中 5. 将指针数组的索引存储在基于int3的hash中

这样,给定 int1、int2 或 int3,可以查找指针数组索引,检索指针,然后跟随指针指向浮点数组。这种方法使用了一些内存,但不会太多,因为问题是 int1、int2 和 int3 中的每一个都有

【讨论】:

    【解决方案2】:

    分层地图可以做到这一点:

    map<int, map<int , map<int, list<float> > > > records;
    

    并且访问时间会很好(对数)。 如果范围很广,这种方式会很有效。否则,对于 4000,先前答案中给出的建议班次更快、更有效。

    【讨论】:

      【解决方案3】:

      您可以使用std::tuple 将三个值合二为一:

      std::map<std::tuple<int, int, int>, float *>
      

      【讨论】:

      • 我认为使用手卷类作为键可以帮助优化比较顺序,如果它有已知的限制。目前还不仅仅是(实际上)元组提升吗?不再了解基于 Windows 的编译器了
      【解决方案4】:

      如果每个键的数据限制为 0 到 4000,则不必使用字符串

      首先生成组合密钥如下:

      unsigned long ulCombinedKey = key1 + key2<<12 + key3 <<24;
      

      之后,您可以按照问题中所述使用地图。

      【讨论】:

      • 不幸的是,在 32 位机器上没有相当足够的位来执行此操作,但它可以在 64 位数据类型上正常工作。
      • @GregHewgill:请注意,他使用的是+ 而不是|,所以虽然它不一定(非常)独特,但他所做的基本上是一个哈希码,应该仍然几乎是唯一的(即,很少发生碰撞)。同时,为确保唯一性,您仍需要与原始密钥进行比较。
      • 谢谢大家,看来他有更好的解决方案,但我打算提出一个 C 解决方案而不是 C++,但他似乎也可以使用 C++。
      • 感谢@MahmoudFayez 的解决方案。是否也有 C 解决方案?我想我可以使用相同的唯一键概念并构建二叉树进行查找?
      • 我认为 B-Tree 更好。请检查这个问题stackoverflow.com/questions/32376/…
      猜你喜欢
      • 2012-01-22
      • 1970-01-01
      • 2015-07-08
      • 2017-07-10
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多