计算每页的最佳项目数,使得给定范围的项目显示在最低索引的单个页面上

时间:2016-05-06 15:54:45

标签: algorithm

我有一个项目列表,编号为1到n,我在几页上显示。如果我每页显示page_size个项目,最后我会有ceiling(n/page_size)个页面。

我的问题是:给定一系列项目x to y,如何优化每页的项目数量(即page_size),以便(优先级):

  1. 该范围显示在单个页面上
  2. 每页的项目数量尽可能少。
  3. 包含该范围的网页索引尽可能小
  4. 例如,对于项目1 to 10page_size为10是最佳:所有项目都显示在第1页上。对于项目21 to 40page_size为20是最佳的,你有第2页的所有项目。

    有关如何计算每页最佳项目数的任何想法?

3 个答案:

答案 0 :(得分:3)

这是一个简单的解决方案,希望它足够了:

from math import ceil

def range_fits_in_page(x, y, page_size):
    page_num = int(ceil(x * 1.0 / page_size))
    page_start = (page_num - 1) * page_size + 1
    assert page_start <= x
    page_end = page_start + page_size - 1
    print("Trying page of size %(page_size)s at page number %(page_num)s "
          "ranging from %(page_start)s to %(page_end)s"
          % locals())
    return page_end >= y

def find_smallest_page(x, y):
    size = y - x + 1
    while not range_fits_in_page(x, y, size):
        size += 1
    return size

print find_smallest_page(20, 35)

输出:

Trying page of size 16 at page number 2 ranging from 17 to 32
Trying page of size 17 at page number 2 ranging from 18 to 34
Trying page of size 18 at page number 2 ranging from 19 to 36
18

答案 1 :(得分:2)

可能的解决方案如下:

  

计算项目数

     
    

range_size&lt; - 1 + y-x

  
     

我们将每页的商品数量初始化为该数字

     
    

page_size&lt; - range_size

  
     

通过该数字计算范围第一项的模数

     
    

mod&lt; - x-1%page_size

  
     

我们现在增加每页的项目数,直到它们都适合一页:

     
    

while(mod + range_size&gt; page_size)

         
      

page_size&lt; - page_size + 1

             

mod&lt; - x-1%page_size

    
  
     

返回page_size

执行示例:

对于范围15到19:

range_size = 5

循环1:page_size = 5,mod = 4,4 + 5&gt; 5所以我们增加page_size

循环2:page_size = 6,mod = 2,2 + 5&gt; 6所以我们增加page_size

循环3:page_size = 7,mod = 0,0 + 5&gt; 7是不正确的,所以我们已经完成

最后,使用page_size 7,第3页显示范围15到19,还有2个附加项目(我们有第15到21项)。

我没有分析运行时间。

答案 2 :(得分:1)

这不是答案,而是一些评论太长的想法:)。给定基于1的索引和丢弃余数的整数div,您需要满足类似于以下条件的最小page_size

x mod page_size < y mod page_size    (x comes before y on the page)
x div page_size == y div page_size   (they fall on the same page)

通过将modulo分解为其实现,例如i mod j = i - j*floor(i/j),可以将这些条件表示为方程式。给定xy,可以为page_size求解这些方程。