在函数get_chapter(page_number)中建立书中的章节

时间:2013-02-14 14:40:13

标签: algorithm search

我有一个名为get_chapter的函数,它将页码作为参数,并返回表示页面所属章节的唯一字符串,例如“The Story Continues”。如果我在书外输入页码,我会返回一个空字符串。

第一页是第0页。章节是一组连续的页面,给定的页面只属于一章。

您建议使用哪种算法来识别每章的页面范围?有关我需要多少次调用get_chapter的估计?

我需要尽可能地限制对get_chapter的调用。章节平均50000页。书中大约有30000页!不确定有多少章节。

2 个答案:

答案 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)

一些想法:

  1. 在最后一页调用get_chapter以了解有多少章节。

  2. 计算一章的平均大小,并在每章的估计中间调用get_chapter。

  3. 在相邻章节之间使用二进制搜索来查找边界。

  4. 修改大型或小型章节,其中第2步的初始估算值跨越两章或属于同一大章。

  5. 平均调用次数类似于n + log2(s),其中n是章节数,s是页面中章节的平均大小。