用于搜索的数据结构;插入位串只有" 1" s很重要

时间:2014-04-30 15:49:52

标签: data-structures

用纯粹的词语来解释这个问题很难,所以这里是我需要解决的抽象问题的一个例子:

  • 在此示例中,存在已将“1111”,“1010”,“1011”,“1000”,“0001”键插入数据结构中的条目
  • 我使用查询“1001”
  • 进行搜索
  • 该查询应该返回数据结构中的所有条目,其中查询对于条目的键中的所有“1”具有匹配的“1”,但是查询可以具有比比较的条目多得多的1。对于此示例,应返回键“1000”和“0001”,因为查询与这些键的1匹配。你可以说数据结构中的条目“不关心”查询中的其他位,带有“1000”键的条目只关心查询的第一位是1,而只关注“0001”键关心他们最后一点是1。

一些辅助信息/约束:

  • 这是对实时应用程序的优化,其中分析表明该领域的改进将受到欢迎。
  • 条目数将是“小”(很可能<500)。这意味着我不一定在寻找最佳的“大O”性能,而是在现代PC和移动CPU和内存上寻求实用性能。尽可能小的内存占用是一个巨大的好处,但我强烈怀疑这将与一个性能良好的解决方案齐头并进。
  • 插入数据结构的次数很少。大多数在应用程序的启动时,因此不必为其优化结构。但搜索会很频繁。
  • 我具体问题中的条目(键/值对)的值将是指针数组。
  • 数字中的位数是任意的,但结构和查询中的所有键都具有相同的长度。我只是提到这个,以防有些算法依赖CPU硬件指令来高效运行,这可能只适用于32位/ 64位类型。我的钥匙会更长,但不会很大(~128-256位)。
  • 我想再次特别提到,这是针对比特串,没有别的。
  • 查询也没有结果。例如,在我的应用程序中,“0000”将永远不会返回结果,因为没有“1”需要关注。
  • 使用的编程语言是C ++,编译器是“各种编译器”,因为它将在多个平台和操作系统上运行

如何有效解决这个问题?此外,是否有实际的实现来看待?

1 个答案:

答案 0 :(得分:1)

首先,我假设您已经优化了查询/密钥比较代码。您应该能够通过按位进行有效的操作,并对键和查询的每个单词进行比较。如果您使用的是具有SIMD指令的体系结构,那么这些指令可以并行完成。

您还没有说过这些位的含义或者您希望它们如何在键和查询之间分配。

如果您希望经常重复查询,您可以做的一件非常简单的事情就是使用带有n个最常用查询的缓存的线性搜索。

如果大多数键中的大多数键都不存在,那么您可以对键中的位重新排序,使得最不频繁出现的位具有最低值索引(即,位0具有最少数量的键使用该位设置,位1具有下一个最少,依此类推)。然后创建一个由位索引索引的数组,其索引包含包含该位的键列表。在解析查询时,选择查询中的最低设置位(有效地执行此操作),查找相应的匹配列表并线性搜索。只要密钥没有过于密集的位模式,就可以提供显着的加速。