【问题标题】:Count fragments or sequence of contiguous numbers in an array计算数组中的片段或连续数字序列
【发布时间】:2014-02-14 19:37:03
【问题描述】:

假设您有一个整数数组,例如:[0,1,2, 5,6,7, 9,10,11]。在理想情况下,它们会被排序,但如果算法可以在未排序的情况下工作,那就更好了。

我需要知道这个组中有多少“片段”。想象一下这个数组组成了一个文件的字节数组;这个文件有多碎片化?

在上面的例子中,我计算了 3 个组/片段。

我的目标是将磁盘上的“文件”总数相加,然后是“碎片”的总数,然后计算碎片(1 - (files / fragments),我认为。10 个文件,10 个碎片 = 0% 碎片- 但是,如果每个文件被分成两个组成 20 个片段,那将产生 50% 的碎片)。

所以我正在寻找的算法需要查看一个整数数组并计算出有多少连续的数字组。

有什么想法吗?

【问题讨论】:

  • range treeinterval tree 浮现在脑海中。 GIYF
  • Wildplasser - 谢谢,我会看看那些。我已经用谷歌搜索并进行了相当广泛的搜索。我发现了类似的问题,但没有一个完全符合我的要求。
  • 可以通过哈希表加速(同时查找 L 和 R 邻居)
  • 预期碎片(给定随机碎片)的分布与“停车问题”有关。 Knuth 有一篇很好的论文(灵感来自哈希表中的线性链接)。

标签: arrays algorithm continuous contiguous


【解决方案1】:

我想出了这个算法(ObjectiveC)...

-(NSInteger) numberOfFragments {
    NSInteger fragments = 1;

    NSArray *sortedBytes = [_bytes sortedArrayUsingComparator:^NSComparisonResult(GameFileByte *a, GameFileByte *b) {
        return ([a bytePosition] < [b bytePosition]) ? NSOrderedAscending : ([a bytePosition] > [b bytePosition]) ? NSOrderedDescending : NSOrderedSame;
    }];


    NSInteger lastBytePosition = -1;
    for (GameFileByte *byte in sortedBytes) {
        if (lastBytePosition > 0 && ((byte.bytePosition - lastBytePosition) > 1)) {
            fragments++;
        }
        lastBytePosition = byte.bytePosition;
    }


    return fragments;
}

这似乎对我有用...它确保字节的顺序正确,然后循环遍历它们,每次当前字节与其前一个字节相差超过 1 时,都会增加一个计数器。

【讨论】:

    猜你喜欢
    • 2019-05-05
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多