Data structures 用于搜索的数据结构&;插入位字符串,其中只有“0”;1“;这些都很重要

Data structures 用于搜索的数据结构&;插入位字符串,其中只有“0”;1“;这些都很重要,data-structures,Data Structures,很难用纯粹的语言来解释这个问题,所以这里有一个我需要解决的抽象问题的例子: 在本例中,有键“1111”、“1010”、“1011”、“1000”、“0001”已插入数据结构的条目 我使用查询“1001”进行搜索 该查询应该返回数据结构中的所有条目,其中该查询在条目的键中的所有“1”都有一个匹配的“1”,但该查询可能比比较的条目有更多的1。对于本例,应返回键“1000”和“0001”,因为查询匹配这些键中的1。您可以说数据结构中的条目“不关心”查询中的其他位,“1000”键的条目只关心查询的第一

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

  • 在本例中,有键“1111”、“1010”、“1011”、“1000”、“0001”已插入数据结构的条目
  • 我使用查询“1001”进行搜索
  • 该查询应该返回数据结构中的所有条目,其中该查询在条目的键中的所有“1”都有一个匹配的“1”,但该查询可能比比较的条目有更多的1。对于本例,应返回键“1000”和“0001”,因为查询匹配这些键中的1。您可以说数据结构中的条目“不关心”查询中的其他位,“1000”键的条目只关心查询的第一位是1,“0001”键只关心最后一位是1
一些附带信息/限制:

  • 这是对实时应用程序的优化,分析表明这方面的改进是值得欢迎的
  • 条目数量将为“小”(最有可能首先,我假设您已经优化了查询/键比较代码。通过按位and加上对键和查询的每个字进行比较,您应该能够高效地实现这一点。如果您使用的是带有SIMD指令的体系结构,那么这些可以并行完成

    您还没有提到位的含义,或者您希望它们如何分布在键和查询中

    如果您希望频繁地重复查询,那么您可以做的一件非常简单的事情就是简单地使用线性搜索,缓存n个最常用的查询


    如果大多数密钥中不会出现密钥的大多数位,则可以对密钥中的位进行重新排序,以使最不频繁出现的位具有最低的值索引(即,位0具有设置该位的最少密钥数,位1具有下一个最少密钥数,依此类推)。然后创建一个按位索引索引的数组,其条目包含包含该位的键列表。解析查询时,选择查询中的最低设置位(有位黑客可以有效地执行此操作),查找相应的匹配项列表并线性搜索。只要密钥没有过密的位模式,这将提供显著的加速。

    a
    *
    替换一位?您也有包含此内容的密钥不在乎?您的密钥域很大(>128位)但是你需要一个只有500个条目的查找表?你的查询总是命中还是没有结果的查询?多个结果呢?不是big-O,那么你需要更具体地描述编程环境。我们是说Java还是汇编程序?@Harald谢谢你的提问。*正好替换了一位,是的,所以*并不意味着“这里有一个或多个我不关心的位”。是的,我也有包含该位的键。是的,键域相对较大,但表较小。查询可能没有结果,例如,我期望“0000”"多个结果,是的,如果一个带有通配符的查询与数据结构中的多个密钥匹配,我希望它们全部返回。编程环境是C++。我会更新答案。你是否已经为带有通配符的密钥演示了?或者这也是设计的吗?@哈拉尔德,这完全是为了设计。现在我我甚至不知道查询如何指定通配符。实际上,我在应用程序中有一些系统只关心标志的特定组合,例如,系统a希望查找第一位和第三位已激活的所有条目,因此“1*1*”将是查询。在查询的128位或更多位中,通配符通常会比实际位多,还是相反?键呢?