我有一个项目列表,编号为1到n,我在几页上显示。如果我每页显示page_size
个项目,最后我会有ceiling(n/page_size)
个页面。
我的问题是:给定一系列项目x to y
,如何优化每页的项目数量(即page_size
),以便(优先级):
例如,对于项目1 to 10
,page_size
为10是最佳:所有项目都显示在第1页上。对于项目21 to 40
,page_size
为20是最佳的,你有第2页的所有项目。
有关如何计算每页最佳项目数的任何想法?
答案 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)
,可以将这些条件表示为方程式。给定x
和y
,可以为page_size
求解这些方程。