【问题标题】:Mutually exclusive contiguous ranges from multiple bitfields来自多个位域的互斥连续范围
【发布时间】:2011-02-02 05:01:41
【问题描述】:

(这不是CS课作业,即使看起来很像)

我使用位域来表示 0 到 22 之间的范围。例如,作为输入,我有几个不同的范围(顺序无关紧要)。我使用. 表示0X 表示1 以获得更好的可读性。

.....XXXXX..............
..XXXX..................
.....XXXXXXXXXXXXXXX....
........XXXXXXX.........
XXXXXXXXXXXXXXXXXXXXXXXX

位域范围的数量通常低于 10,但可能会高达 100。根据该输入,我想计算互斥的连续范围,如下所示:

XX......................
..XXX...................
.....X..................
......XX................
........XX..............
..........XXXXX.........
...............XXXXX....
....................XXXX

(同样,输出顺序无关紧要,它们只需要互斥且连续,即它们不能有漏洞。.....XXX.......XXXXX.... 必须分成两个单独的范围)。

我尝试了几种算法,但最终都变得相当复杂和不雅。对我有极大帮助的是一种检测.....XXX.......XXXXX.... 有孔的方法以及一种确定孔中一个位的索引的方法。

编辑:位域范围代表地图上的缩放级别。它们旨在用于为 Mapnik(OpenStreetMap 使用的平铺渲染系统等)输出 XML 样式表。

【问题讨论】:

  • 您能否更具体地说明您如何尝试将位划分为范围?我很乐意提供帮助,但我不太了解您在示例中是如何提出范围的。
  • 我会投票赞成这个问题,因为你激发了我的好奇心。你愿意分享它的用途吗?
  • 我得到所需解决方案的方法大致如下:取一个垂直列并与下一个比较,如果它在所有行中都相同,它仍然在前一个列范围内。如果至少有一项不同,则开始新的范围。问题是输入可能有 100 行左右。
  • 同意 xelco52,这个问题对我来说听起来很有趣,但我无法完全理解。我看到第一个块有 5 个位域(第 5 个位域全为 1),每个宽度为 22。“互斥、连续范围”转换如何恰好到达宽度为 22 的第二个 8 个位域块?

标签: c++ range bit-fields


【解决方案1】:

我假设您在评论中提到的解决方案是这样的:

从左侧或右侧开始(因此 index = 0),并扫描设置了哪些位(最多 100 次操作)。将该集合命名为 x。还要设置一个变量block=0。

在 index=1 处,重复并存储设置 y。如果 x XOR y = 0,则两者都是相同的集合,因此继续索引 = 2。如果它 x XOR y = z != 0,则范围 [block, index) 是连续的。现在设置 x = y,block = index,然后继续。

如果你有 100 个长度为 22 的位数组,这需要大约 2200 次操作。

这是一个最佳解决方案,因为无法进一步减少操作 - 在每个阶段,如果另一个集合与您的集合不匹配,您的范围就会被破坏,因此要检查范围是否被破坏,您必须检查所有 100 位。

【讨论】:

    【解决方案2】:

    至少我会尝试解决您的子问题..

    对我有极大帮助的是一种检测方法 .....XXX.......XXXXX....有洞有确定索引的方法 洞里的一颗钻头。

    在位掩码中查找最低和最高集合(“1”)位是一件很漂亮的事情 解决的问题;例如,参见 glibc 中的 ffs(3),或参见 例如http://en.wikipedia.org/wiki/Bit_array#Find_first_one

    给定位图的第一个和最后一个索引,称它们为ij, 您可以计算在ij 之间设置所有位的位图 使用M = ((1 << i) - 1) & (~((1 << j) - 1))(对于任何 一个错误)。

    然后,您可以通过将原始位图与 M。如果不匹配,您可以输入 xor M 来查找 孔并重复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多