如何在C中随机找到具有一些连续元素的子数组?

时间:2018-06-22 05:57:01

标签: c opnet

我有一个包含100个元素的数组。数组元素是一组1和0。例如:

Array[100] = {0,0,1,0,1,0,1,1,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,....,1}

我需要找到所有零个窗口(间隙)并随机选择其中一个。间隙的大小(需要)是根据1到20之间的均匀分布选择的。

 needed = op_dist_load ("uniform_int", 1, 20);

例如,如果我们假设Array [100]中元素的其余部分等于1,如您所见,我有8个零窗口(窗口的大小= 2)。我需要找到它们。

find_gap_randomly函数选择2个连续的零元素(具有2个零元素的子数组意味着我的程序中存在间隙)。您有没有建议在不使用随机库的情况下(最好是在OPNET仿真器中)使用C语言编写find_gap_randomly(int needed)函数的代码?

static void find_gap_randomly(int needed)
{
    //The macros “FIN” and “FOUT” are used in OPNET functions to enable the OPNET 
    //debugging kernel to print out function information. 
    FIN(find_rr_gap());
    /* ... */
    FOUT;
}

1 个答案:

答案 0 :(得分:2)

如果您仍在寻找setdiff(colnames(total4), colnames(dataset1)) 中的差距,((差距定义为至少{{1 }}长度),那么找到所有间隙的一种简单明了的方法是将Array长度的“滑动窗口” 沿数组向下移动,检查窗口中是否所有值为零。如果它们全为零,则说明存在间隙,否则,请移至needed中的下一个索引并重复。

这个概念虽然相当简单,但是图片可能会有所帮助(或尝试图片)

needed

如上图所示,您的Array的前九个元素以及下面每个元素的对应索引。由于您的 +-------+ | | <= window to slide over array | | +---+---+---+---+---+---+---+---+... | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | <= array values +---+---+---+---+---+---+---+---+... 0 1 2 3 4 5 6 7 8 <= array indexes | | +-------+ Array,因此有一个跨needed的窗口,您将从2的开头到结尾检查其中的值。这可以简单地通过两个嵌套循环来完成:外部循环在2-elements时循环,然后内部循环从Array进行迭代。

要捕获i = needed; i < num_elements; i++中的间隙在哪里,请使用第二个数组(我称为j = i - needed; j < i; j++),该数组包含与Array相同数量的元素。初始化为全零。当您在gaps中找到一个数量为Array的连续元素的区域时,只需增加Array即可将needed的值从gaps[j]++;设置为{ {1}}。 (取决于gaps[j]范围,如果0超出范围,则可能需要增加1

完成滑动窗口从头到尾的移动后,jgaps[i-needed]++;中间隙起点所在的每个索引处的值为j。 / p>

实现滑动窗口的简单函数可以写为:

gaps

注意:可以将内部循环替换为1,以检查是否有一个值将所有字节都设置为零以找到间隙)

使用图表作为指导,完成上面Array的操作,并确保您完全了解发生了什么。如果没有,让我知道。

在一个简短的示例中将其完全放在一个以/** find_gaps locates each sequence of all zero within 'array' of * at least 'needed' length, the corresponding index within 'gaps' * is incremented to identify the start of each gap, returns the * number of gaps of 'needed' length in 'array'. */ int find_gaps (int *gaps, int *arr, int nelem, int needed) { int ngaps = 0; /* count of gaps found */ /* add code to validate parameters here */ memset (gaps, 0, nelem * sizeof *gaps); /* zero gaps array */ for (int i = needed; i < nelem; i++) { /* loop needed to end */ for (int j = i - needed; j < i; j++) { /* loop previous needed */ if (arr[j] != 0) /* if non-zero value, get next in array */ goto next; /* lowly 'goto' works fine here */ } gaps[i-needed]++; /* increment index in gaps */ ngaps++; /* increment no. of gaps found */ next:; } return ngaps; /* return no. of gaps found */ } 作为程序的第一个参数的情况下(或者如果没有给出参数,则默认使用memcmp),您可以执行以下操作:< / p>

find_gaps

注意:,您应该添加检查以确认needed小于2,但是还有其他验证方法供您练习)

使用/输出示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

/** find_gaps locates each sequence of all zero within 'array' of
 *  at least 'needed' length, the corresponding index within 'gaps'
 *  is incremented to identify the start of each gap, returns the
 *  number of gaps of 'needed' length in 'array'.
 */
int find_gaps (int *gaps, int *arr, int nelem, int needed)
{
    int ngaps = 0;  /* count of gaps found */
    /* add code to validate parameters here */

    memset (gaps, 0, nelem * sizeof *gaps);     /* zero gaps array */
    for (int i = needed; i < nelem; i++) {      /* loop needed to end */
        for (int j = i - needed; j < i; j++) {  /* loop previous needed */
            if (arr[j] != 0)    /* if non-zero value, get next in array */
                goto next;      /* lowly 'goto' works fine here */
        }
        gaps[i-needed]++;   /* increment index in gaps */
        ngaps++;            /* increment no. of gaps found */
      next:;
    }

    return ngaps;   /* return no. of gaps found */
}

int main (int argc, char **argv) {

    int array[] = { 0,0,1,0,1,0,1,1,1,0,0,0,0,0,1,1,0,1,0,0,
                    0,1,1,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,0,1 },
        nelem = sizeof array / sizeof *array,   /* number of elements */
        gaps[nelem],    /* a VLA is fine here C99+, otherwise allocate */
        ngaps = 0,      /* no. of gaps found */
        needed = argc > 1 ? strtol (argv[1], NULL, 0) : 2;  /* (default: 2) */

    if (errno) {    /* validate strtol conversion succeeded */
        perror ("strtol-argv[1]");
        return 1;
    }
    /* find the number of gaps, storing beginning index in 'gaps' array */
    ngaps = find_gaps (gaps, array, nelem, needed);

    printf ("gaps found: %d\n", ngaps);         /* output number of gaps */
    for (int i = 0; ngaps && i < nelem; i++)    /* output index of gaps */
        if (gaps[i])
            printf (" gap at array[%2d]\n", i);

    return 0;
}

检查至少3个零的间隙:

needed

有多种方法可以解决此问题,但是滑动窗口可能是最简单的一种,并且滑动窗口在C中具有许多其他应用程序,因此值得将其添加到工具箱中。如果您还有其他问题,请告诉我。