【问题标题】:Fastest way to check C# BitArray for non-zero value检查 C# BitArray 非零值的最快方法
【发布时间】:2016-05-24 19:45:36
【问题描述】:

我正在尝试快速检测 C# 中 BitArrays 之间的冲突(使用 AND 布尔运算),这会产生一个表示重叠区域的 BitArray。

显然,如果结果数组仅包含零,则不会发生冲突。检查这个的最快方法是什么?简单的迭代太慢了。我不在乎冲突在哪里,或者有多少——只是在数组中的某个地方有一个非零值。

似乎应该有某种快速的情况,类似于“将整个位数组转换为一个 int 值”(这特别不起作用,因为 BitArrays 是可变大小的),但我想不出一个出去。

【问题讨论】:

  • 你有没有考虑过不使用 BitArrays 而只使用 int?
  • 如果你自己实现这个,也可以避免在发生碰撞的情况下计算整个交叉点,并且不需要空间来存储交叉点。 BitArray 无论如何是一个相当缓慢的实现。
  • 大家的好主意。感谢您的帮助!

标签: c# arrays algorithm collision bitarray


【解决方案1】:

你需要 And() 方法的结果 BitArray 吗?如果没有,您可以循环输入数组并在第一次碰撞时返回 true。

bool collision(BitArray a1, BitArray a2) {
   if (a1 == null || a2 == null) throw new ArgumentException("arguments cannot be null");
   if (a1.Count != a2.Count) throw new ArgumentException("arrays don't have same length");
   for (int i = 0; i < a1.Count; i++)
       if (a1[i] && a2[i]) return true;

   return false;
}

这样你可以防止两次循环数组 - 即。一次用于 And(),一次用于检查。平均而言,您将只遍历数组的一半,从而将速度提高到 4 倍。

另一种方法是。像 @itsme86 建议使用整数而不是 BitArrays

int a1, a2;
bool collision = (a1 & a2) > 0;

【讨论】:

  • 我建议 (a1 &amp; a2) != 0,给你 32 个可用位而不是只有 31 个。
  • @Aron 上帝没有。这个问题的重点是效率。
  • @Aron 你的 sn-p 有一些问题: 1. BitArray 没有实现System.Collections.Generic.IEnumerable 因此不能与Enumerable.Zip 一起使用 2. BitArrays 的项目是布尔值,因此All(x =&gt; x&gt;0)不编译
  • @Aron 当然,你可以慢慢来,然后让它平行——但你也可以快速,仍然让它平行。刻意做慢是没有意义的。
  • @Aron 因为它是 JITed 以降低代码速度。 LINQ 就是这样做的。写单行代码很好,不利于性能。
猜你喜欢
  • 2012-02-10
  • 1970-01-01
  • 2011-12-15
  • 2010-12-02
  • 2014-01-02
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多