【问题标题】:Algorithm to convert offset pagination to page number pagination将偏移分页转换为页码分页的算法
【发布时间】:2021-12-20 03:31:49
【问题描述】:

我有一个服务必须接收偏移格式的分页查询,接收offsetlimit 参数。例如,如果我收到offset=5&limit=10,我希望收到第 5-14 件商品。我可以对这些参数进行一些验证,例如为限制设置最大值。

我的数据源必须接收页码格式的分页请求,接收page_numberpage_size参数。例如,如果我发送 page_number=0&page_size=20,我会收到 0-19 项。数据源的最大 page_size 为 100。

我需要能够获取我收到的偏移分页参数并使用它们来确定 page_numberpage_size 参数的适当值,以便从包含所有项目的数据源返回一个范围我需要。可能会返回其他项目以填充范围的开始和/或结束,然后可以将其过滤掉以生成请求的范围。

如果可能,我应该只向数据源发出一个请求。或者,可以通过最小化从数据源请求的范围的大小来提高性能(即,获取 10 个项目来满足对 8 个项目的请求比请求 100 个项目更有效)。

这感觉实现起来应该相对简单,但我对简单数学解决方案的尝试并没有解决所有边缘情况,我对更强大解决方案的尝试已经开始进入更复杂的计算和计算领域迭代因素等。

有没有简单的方法来计算合适的值?

I've put together a test harness REPL with a set of example test cases that makes it easy to trial different implementations here.

【问题讨论】:

    标签: algorithm pagination


    【解决方案1】:

    一个适当的实现是从page_size=limit 开始,然后递增page_size,直到有一个页面包含从offsetoffset+limit 的整个范围。

    如果您认为您不想浪费时间进行迭代,那么请考虑此方法所花费的时间最多与结果集的大小成正比,并且完全无关紧要 与您自己阅读、编组、解组和处理结果的时间相比。

    我已经用offset+limit <= 100000 测试了所有组合。在所有情况下,page_size <= 2*limit+20。对于较大的限制,最坏情况的开销总是发生在limit=offset+1 时。在某些时候,发出 2 个请求会变得更有效率。你应该检查一下。

    【讨论】:

    • 谢谢!正如您所说,我没有遇到迭代问题,与对数据源的额外请求相比,开销可以忽略不计 - 我只是想确保我没有错过更直接的方法。我已经用这个解决方案为未来的读者更新了上面的 REPL。
    【解决方案2】:

    这个怎么样?

    if (limit > 100) { 
    // return error for exceeding limit...
    }
    
    mod_offset = (offset % limit)
    page_number = (offset / limit) ;
    page_size = limit;
    
    // Sample test cases ..
    
    // offset=25, limit=20 .. mod_offset = 5
    
    (a) page_number = 1, page_size = 20  // skip first 'n' values equal to 'mod_offset'
    (b) page_number = 1+1 = 2, page_size = 20 // include only first 'n' values equal to 'mod_offset'
    
    
    // offset=50, limit=25 .. mod_offset = 0
    (a) page_number = 2, page_size = 25  // if offset is multiple of limit, no need to fetch twice...
    
    // offset=125, limit=20  .. mod_offset = 5
    
    (a) page_number = 6, page_size = 20  // skip first 'n' values equal to 'mod_offset'
    (b) page_number = 6+1 = 7, page_size = 20 // include only first 'n' values equal to 'mod_offset'
    

    【讨论】:

      猜你喜欢
      • 2018-10-06
      • 2019-09-08
      • 2018-01-16
      • 2021-10-14
      • 2011-04-01
      • 2015-03-15
      • 2013-08-24
      • 2021-02-27
      • 2016-03-16
      相关资源
      最近更新 更多