我有一个名为get_chapter的函数,它将页码作为参数,并返回表示页面所属章节的唯一字符串,例如“The Story Continues”。如果我在书外输入页码,我会返回一个空字符串。
第一页是第0页。章节是一组连续的页面,给定的页面只属于一章。
您建议使用哪种算法来识别每章的页面范围?有关我需要多少次调用get_chapter的估计?
我需要尽可能地限制对get_chapter的调用。章节平均50000页。书中大约有30000页!不确定有多少章节。
答案 0 :(得分:2)
使用第一页填写章节边界列表。
将low
设置为第一页,将high
设置为最后一页。
如果get_chapter(low) == get_chapter(high)
,那么您知道该范围内的所有内容都在同一章中,并且您不需要进一步划分它。
如果get_chapter(low) != get_chapter(high)
和low + 1 == high
,则您在不同的章节中有相邻的页面。这意味着新篇章将从高处开始。
如果get_chapter(low) != get_chapter(high)
和low + 1 < high
,则范围内至少有一个章节边界。通过选择中间的页面和递归下降两个新范围(低:中间和中间:高)来拆分范围。
如果您在找到它们时将边界添加到列表中,并且您始终首先递归较低的子范围,那么您就完成了。否则,请对边界列表进行排序。
我认为运行时复杂度大约是O(number_of_chapters * log_2(average_chapter_size)),但这是一个直觉检查,而不是彻底的分析。
答案 1 :(得分:0)
一些想法:
在最后一页调用get_chapter以了解有多少章节。
计算一章的平均大小,并在每章的估计中间调用get_chapter。
在相邻章节之间使用二进制搜索来查找边界。
修改大型或小型章节,其中第2步的初始估算值跨越两章或属于同一大章。
平均调用次数类似于n + log2(s),其中n是章节数,s是页面中章节的平均大小。