C++ 提出了链表的简单公式

C++ 提出了链表的简单公式,c++,algorithm,linked-list,C++,Algorithm,Linked List,老实说,我已经干了好几天了。我已经实现了这个函数的困难部分,但现在只有一件小事。我想写的方法是删除链表中每N个blockSize块。因此,如果我有一个大小为7的链表,{1,2,3,4,5,6,7},N=2,blockSize=2,我想删除大小为blockSize(2)的第N(2)个块,所以删除3,4,7。现在为了让for循环工作,我需要为我创建的名为numBlocksRemoved的int值编写一个表达式。它计算要删除的块的总数。在这种情况下,它将是2。以下是我所拥有的: numBlockRem

老实说,我已经干了好几天了。我已经实现了这个函数的困难部分,但现在只有一件小事。我想写的方法是删除链表中每N个blockSize块。因此,如果我有一个大小为7的链表,
{1,2,3,4,5,6,7}
N=2
blockSize=2
,我想删除大小为blockSize(2)的第N(2)个块,所以删除3,4,7。现在为了让for循环工作,我需要为我创建的名为numBlocksRemoved的int值编写一个表达式。它计算要删除的块的总数。在这种情况下,它将是2。以下是我所拥有的:

numBlockRemoved=(size/blockSize)/N;

然而,这只是在数字看起来不错的时候才起作用。如果我有
size=8,N=2,blockSize=2
,那么我得到
numBlockRemoved=2
,这是正确的。然而,对于上面的例子,我得到了int值1,这是不正确的。我想要两个。我想这件事已经很久了,太可笑了。我就是想不出一个适合我的公式。有什么想法吗?

当计算块数时,舍入应该向上,因为不完整的块仍然是块(但在计算移除块数时,舍入不应该向上):

试一试

您拥有的块数:

blocks = ceil(size/blockSize)
ceil
,因为您不介意块未满

然后每N跳过一次,因此:

floor(blocks/N)

floor
因为你要么数一个块,要么不数。

(大小+(块大小-1))/(块大小*N)
只要系统地考虑一下——如果你每N个块大小的块大小,你就有效地移除了大小(N*blockSize)的“超级块”。所以在一级近似下,你有

nBlocks = floor [size / (N * blockSize)]
现在,从您的示例来看,即使最后没有得到完整的块,您仍然希望删除它。如果删除最后一个完整块后的剩余部分超过(N-1)个完整块,则会发生这种情况。所以算法是

superblock = N * blockSize
nBlocks = floor (size / superblock)
remainder = size - (nBlocks * superblock)
if remainder > (N - 1) * blockSize {
  nBlocks += 1
}
您可以将末尾的+1调整折叠到公式中,方法是添加一个量,当一个完整的超级块距离小于一个块时,该量将使该大小倾斜到该超级块上(类似于通过添加.5四舍五入,然后选择地板)。因为如果我们在超级块的最后一个块中有一个偶数,就会发生这种情况,所以我们必须添加(blockSize-1),这会给我们

(size + (blockSize - 1)) / (blockSize * N)

这是上面aaz的公式。所以你可以继续,把他的答案标记为被接受;我只是想解释一下他是如何得出这个公式的。

对于一个链表,你不应该提前计算。事实上,链表通常不知道它们的大小。相反,循环应该在到达列表末尾时完成。这是一个自定义的链表类。每个链表都有一个成员变量大小。不,这是不正确的。考虑大小=7,n=3,块大小=2:您得到NUBCONDATION=2,但应该是1。OK,只需要为ButhSige分区进行向上舍入。我会修正我的答案,这也不行。对于size=7,N=2,blockSize=2,得到1,但应该是2。不,这仍然不起作用。Try size=7,N=3,blockSize=2。应该是1,但是你的Y2IDS不,考虑大小=3,n=2,块大小=1i混合<代码>块大小< /COD>和<代码> N< /代码> -现在检查它。
superblock = N * blockSize
nBlocks = floor (size / superblock)
remainder = size - (nBlocks * superblock)
if remainder > (N - 1) * blockSize {
  nBlocks += 1
}
(size + (blockSize - 1)) / (blockSize * N)