我有一个4D数组,其中值是单调的。如何有效地搜索价值。
答案 0 :(得分:1)
如果N不超过10,000,那就不明白为什么你不能使用unordered_set。然后执行单个查找。如果每个维度都有重复的值,那么您需要以某种方式跟踪它。但是,我不知道任何为C实现unordered_set的代码。所以,你可能不得不使用C ++。
如果您不能使用unordered_set,那么由于数据按每个维度的排序顺序排列,您还可以对每个维度使用二进制搜索。这意味着平均每个维度查找不超过15个值 - 假设每个维度中的元素总数小于16K。 15次查找* 4次维度= 60次查找。这太慢了吗?
另一项改进可能是从4个维度创建一个大型排序且唯一的数组,然后搜索该数组。这将产生总共约17次查找(假设< = 64K元素).vs。 60,这是3.5倍的速度。但是,它还取决于在维度中添加或删除值的频率,以确定它是否真的更快或更快 - 因为您还必须在单个表中添加和删除它们。另外,请勿忘记使用表格来跟踪重复值 - 如果适用的话。
如果值是相对较小的整数 - 比如十亿或更少,那么您可以使用位图方案。位图方案比为每个维使用unordered_set要快。字节数组可用作位图。位图中设置的值表示该值存在。例如,如果该值为零,则将设置位0。如果值为3,则将设置位2。如果值为5,则将设置第4位等。因此,需要使用100MB来映射10亿(2 ^ 30)的所有值。如果每个维度中都存在重复值,那么您需要跟踪它,以便在从维度中删除值时 - 除非在任何其他维度中不存在,否则不会从位图中删除该值。如果您的值是浮点数,那么如果有效位的总数是< = 9,您可以将它们转换为整数。如果值是字符串或结构,那么如果您能找到方法,则位图方案可能仍然有效把它翻译成一个唯一的整数。