C语言中合并多个整数区间的数据结构和算法

C语言中合并多个整数区间的数据结构和算法,c,algorithm,merge,data-structures,C,Algorithm,Merge,Data Structures,我正在研究一个计算机视觉问题,在这个问题上我必须合并图像的区域。区域(或blob)由其线条定义,即O的以下区域: 0123456789 0 XXXXOXXXXX 1 XXXOOOXXXX 2 XXXOOXXXXX 3 XXXOXXXXXX 4 XXXXXXXXXX 定义如下: row: 0, cols: 4-4 row: 1, cols: 3-5 row: 2, cols: 3-4 row: 3, cols: 3-3 我之所以选择这种数据结构,是因为我需要能够快速找到一个区域的邻域,即“

我正在研究一个计算机视觉问题,在这个问题上我必须合并图像的区域。区域(或blob)由其线条定义,即
O
的以下区域:

  0123456789
0 XXXXOXXXXX
1 XXXOOOXXXX
2 XXXOOXXXXX
3 XXXOXXXXXX
4 XXXXXXXXXX
定义如下:

row: 0, cols: 4-4
row: 1, cols: 3-5
row: 2, cols: 3-4
row: 3, cols: 3-3
我之所以选择这种数据结构,是因为我需要能够快速找到一个区域的邻域,即“接触”它的所有像素

现在,我的问题是我想合并两个区域,即计算它们的并集。这意味着,在上面所示的数据结构中,可能会有多个列范围

使用此设置,我有两个问题:

  • C
    中,此数据的最佳数据结构是什么?典型的图像是16x16,这意味着没有那么多行/列。我会做很多合并(目标是从每像素一个区域开始,最后是一个大区域,即16x16-1合并)。例如,我可以使用指针来分配/释放这些内容,或者使用char*来存储col,然后解析它

  • 如何有效地合并两个区域?我需要找到与合并它们相邻的潜在列(例如,
    3-5
    6-9
    成为
    3-9
    ),最好不要总是重新分配和复制内容


  • 因为您说过您有少量的行和列,所以最好的结构可能只是一个简单的多维数组。对于这些小维度,由于能够在固定时间内找到邻居而获得的任何速度提升都可能会被内存访问延迟和执行合并操作所需的时间所掩盖


    Billy3

    你愿意用空间换取速度吗?在这种情况下,您可以静态分配整个16x16结构

    struct Image {
        struct Range ranges[16*16];
    };
    
    每一行([0..15]、[16..31]…)最多包含16个不同的范围(假设您没有仅包含二进制数据,在这种情况下,8就可以),最后一个范围将由一些哨兵值表示,如“-1”或“0”或其他值

    根据操作的不同,最好将结构范围定义为:

    struct Range {
        int startpos;
        int count; /* or int endpos - depending on your preference */
    };
    
    通过创建一个新图像进行合并很容易-您可以模拟地从左侧遍历两个“输入”图像中的每一行,并输出具有较小“起始点”的一行,如果相邻区域合并,则更新最后写入的区域


    就地合并也没那么难,有了一些缓冲区,它也可以一次运行完成。

    如果您的数据是双色图像…黑白,为什么不使用16个元素长的无符号短片数组呢

    unsigned short image[16]
    

    合并可以通过按位逻辑完成,这种逻辑在16个元素的数组中非常有效。

    如果内存不是问题,则可以通过存储指向相邻像素的指针来提高查找速度。例如,创建一个“像素”结构,该结构将存储其值和指向相邻像素的指针列表。如上所述,创建一个16x16多维“像素”阵列。设置好内存后,遍历阵列并设置相邻像素列表以指向相邻像素。在一切都设置好之后,找到像素及其邻域应该非常快。

    他有理由使用“范围”方法。然而,如果使用某些按位逻辑实际上不能使此解决方案更好,则有点令人怀疑。使用范围的原因是能够轻松获得区域的“邻居”。使用简短的方法,我必须迭代位才能做到这一点,但这并没有那么昂贵,而且由于位运算符的存在,可以轻松地进行编码,从而得到补偿!事实上,我在发布这个问题并出去吃午饭后就想到了这个确切的解决方案,但无论如何,谢谢你的回答!